Durchlaufen int array unbekannter Länge
Ich versuche zu iterieren durch ein array enthalten wird bis zu maximal 4 Elemente - keine anderen Erkenntnisse der array-Länge vorhanden ist.
Pseudo-Code
void insert_vals(uint8_t num, uint8_t *match_num, uint8_t *value)
{
uint8_t i;
while(data_exists) //how do I determine if data exists in 'value'?
{
switch(num)
{
case 0:
{
switch(match_num[i])
{
case 0:
hw0reg0 = value[i];
case 1:
hw0reg1 = value[i];
case 2:
hw0reg2 = value[i];
case 3:
hw0reg3 = value[i];
}
}
case 1:
{
switch(match_num[i])
{
case 0:
hw1reg0 = value[i];
case 1:
hw1reg1 = value[i];
case 2:
hw1reg2 = value[i];
case 3:
hw1reg3 = value[i];
}
}
//etc. 2 other cases
}
i++;
}
}
Aufrufen Beispiel (Pseudo-Code)
/*
* num: hardware device select from 1 - 4
* match_num: 4 possible matches for each hardware device
* value: 32-bit values to be assigned to 4 possible matches
* NOTE: This function assumes hardware devices are selected
* in a consecutive order; I will change this later.
*/
//example calling code - we could have configured 4 hardware devices
insert_vals(0, [0, 1], [0x00000001, 0x000000FF]); //arg2 and arg3 equal in length
Wie kann ich dies erreichen?
In ein Zeichen-array, C werden automatisch hinzufügen '\0'
an das Ende des Arrays, aber dies scheint nicht der Fall zu sein für ein integer-array. Wenn ich irgendwie in der Lage, um zu bestimmen, die Länge der match_num
und value
(siehe if
- Anweisung) zur Laufzeit ursprünglich, dann, dass es mir erlauben würde, zu erstellen for
Schleife.
Bearbeiten
Da ich weiß, dass es maximal 4 Elemente, könnte ich nicht etwas tun, die der folgenden ähnelt?
void insert_vals(uint8_t num, uint8_t *match_num, uint32_t *value)
{
int i;
for(i = 0; i < 4; i++)
{
if(value[i] == -1)
break;
else
{
//Assign data
}
}
}
.........Magie?
Bitte zeigen Sie den aufrufenden code.
Sorry, Jungs - da haben Sie es.
Dieser Aufruf-code kompiliert für Sie?
Nein, das ist nur pseudo-code. Ich hätte wahrscheinlich zum deklarieren des Arrays außerhalb dem Aufruf der Funktion, richtig?
Bitte zeigen Sie den aufrufenden code.
Sorry, Jungs - da haben Sie es.
Dieser Aufruf-code kompiliert für Sie?
Nein, das ist nur pseudo-code. Ich hätte wahrscheinlich zum deklarieren des Arrays außerhalb dem Aufruf der Funktion, richtig?
InformationsquelleAutor Biff | 2013-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht die Länge eines Arrays wird darauf hingewiesen, nur die Zeiger. Entweder übergibt man die Länge, oder es muss konstant sein (immer 4) mit einigen sentinel-Wert in den ungenutzten Elemente -- ein Wert, der ist irgendwie ungültig für Ihre Berechnungen (wie NUL ist für strings).
sizeof(my_array)/sizeof(int)
würde die Arbeit zur compile-Zeit wenn außerhalb der Funktion, wie Sie sagen?das würde die Arbeit der division durchgeführt, an irgendeinem Ort, wo
my_array
ist eigentlich ein array (keine Zeiger).Das würde bedeuten, dass die änderung meiner Argumente als
match_num[]
undvalue[]
bzw. Richtig?Nein, das würde nicht ändern, was, wie es nur syntaktischer Zucker für Zeiger-Argumenten.
Sie können nicht übergeben von arrays an Funktionen oder Rückgabe von Funktionen, so einfach ist das. Dies ist nicht wirklich ein neues problem; Sie müssen übergeben Sie die Länge zusammen mit dem Zeiger (oder eine Ende-Markierung).
InformationsquelleAutor Fred Foo
Gibt es einen Wert, den Sie garantieren können, die es nicht in die "nutzbare" Daten? (z.B. 0 ist kein gültiges Zeichen für Zeichenketten, also Mr. Kernighan und Mr. Ritchie beschloss, es als ein "Ende array" marker. Sie könnte das gleiche tun mit einem Wert.
Sagen, Sie wissen, dass Ihr integer-Werte sind zwischen 0 bis 512, also könnte man initialisiert das gesamte array z.B. auf 1024, dann füllen Sie es aus und Durchlaufen Sie ihn, bis eine Zahl >512 tritt (was Ihr am Ende von array-marker).
Andere Möglichkeit ist die übergabe der Anzahl der Elemente im array zusammen mit dem array.
InformationsquelleAutor junix