Die Ausgabe sieht wie folgt aus:
00 11 12
length1: 4
length2: 4
00 10 00 00
00 11 12 00
warum ist length2 = 4?
Bevor ich das array der FUnktion übergeben habe, war es ja auch 3.
jan schrieb:> static void add(char* summe, const char* sum1, const char* sum2)> {> const uint32_t length_1 = sizeof(sum1)/sizeof(sum1[0]);> const uint32_t length_2 = sizeof(sum2)/sizeof(sum2[0]);
Das funktioniert nicht. Innerhalb der Funktion ist nicht bekannt, wie
groß die Arrays sind.
Das ist eine elementare Eigenschaft von Arrays in C; wenn man die Dinger
einer Funktion übergibt, zerfallen sie zu einem Pointer auf das erste
Element. Die Größe muss man der Funktion als separaten Parameter
übergeben.
> warum ist length2 = 4?
Weil dein Rechner 32-bit-Pointer hat: sum2 ist ein char* kein char[3].
Arrays werden zu Pointern reduziert, die Länge des Arrays geht dabei
verloren und muß ggf extra übergeben werden.
Rufus Τ. F. schrieb:> Das ist eine elementare Eigenschaft von Arrays in C; wenn man die Dinger> einer Funktion übergibt, zerfallen sie zu einem Pointer auf das erste> Element. Die Größe muss man der Funktion als separaten Parameter> übergeben.
Man kann auch die Adresse eines Arrays übergeben (in C++ als Alternative
eine Referenz) und damit ist die Größe des Arrays in der Funktion
bekannt.
Beispiel (C):
Rufus Τ. F. schrieb:> jan schrieb:>> static void add(char* summe, const char* sum1, const char* sum2)>> {>> const uint32_t length_1 = sizeof(sum1)/sizeof(sum1[0]);>> const uint32_t length_2 = sizeof(sum2)/sizeof(sum2[0]);>> Das funktioniert nicht. Innerhalb der Funktion ist nicht bekannt, wie> groß die Arrays sind.
Die Größe ist zwar nicht bekannt, aber das ist nicht der Grund, warum
das falsche rauskommt. Das liegt eher daran, dass es ein ganz anderer
Typ ist.
> Das ist eine elementare Eigenschaft von Arrays in C; wenn man die Dinger> einer Funktion übergibt, zerfallen sie zu einem Pointer auf das erste> Element. Die Größe muss man der Funktion als separaten Parameter> übergeben.
Anders gesagt: Der Parameter ist kein Array, sondern ein Zeiger. Steht
ja auch so da: "const char* sum1" ist ein Zeiger auf einen const char.
Damit gibt sizeof auch die Größe eines Zeigers auf const char zurück.
Dass dieser auf den Anfang eines Arrays zeigt, spielt da gar keine
Rolle.
loeti2 schrieb:> Man kann auch die Adresse eines Arrays übergeben (in C++ als Alternative> eine Referenz) und damit ist die Größe des Arrays in der Funktion> bekannt.
Die Größe ist dann bekannt, aber nur weil sie explizit Teil des
Parametertyps ist. Damit ist sie auch von der Funktion fest vorgegeben.
Wenn man ein Array einer anderen Größe übergeben will, muss man erst die
Funktion ändern.
loeti2 schrieb:> Man kann auch die Adresse eines Arrays übergeben (in C++ als Alternative> eine Referenz) und damit ist die Größe des Arrays in der Funktion> bekannt.
Nicht wirklich, denn Du definierst die Funktion so, daß sie einen
Pointer auf ein Array dieser Größe erwartet.
Das ist was anderes als einer Funktion ein Array beliebiger Größe so
übergeben zu können, so daß die Funktion herausfinden kann, wie groß
das Array jeweils ist.
Generell: sizeof wird vom Compiler während der Compilierung zu einer
Konstanten und kann daher nie eine dynamische (d.h. zur Runtime
berechnete) Größe liefern.
foobar schrieb:> Generell: sizeof wird vom Compiler während der Compilierung zu einer> Konstanten und kann daher nie eine dynamische (d.h. zur Runtime> berechnete) Größe liefern.
Stimmt auch nicht ganz. Es gibt eine Ausnahme, nämlich VLAs:
Hallo,
dass die länge in der Funktion nicht bekannt ist, habe ich verstanden.
Übergebe jetzt auch die länge mit. Allerdings habe ich ein seltsames
auftreten, welches ich wieder nicht verstehe
Was ich nicht verstehe, ist die zweite Ausgabe. Die absolute Ausgabe
sieht wie folgt aus
sum2[2] = 0011
sum2[1] = 0011
sum2[0] = 0011
0040 0011 0000
0030 0051 0000
0020 ff81 00ff
Im ersten Block lasse ich mir den Inhalt von sum2 ausgeben. Das passt.
Im zweiten lasse ihc mir den Inhalt von sum1 und sum2 ausgeben. Warum
passen die Werte von sum2 hier nicht mehr? (also warum 0051 und ff81?)
Das verstehe ich nicht.
Ich ändere den Wert doch gar nicht und bei der ersten Ausgabe wird es
auch richtig gegeben.
Ziel ist es zum schluss den array summe als Ergebnis mit
summe[] = {0x00, 0x10, 0x31,0x41, 0x51}; zu bekommen
> Ich ändere den Wert doch gar nicht [..]
Doch. Wo kommt der Speicher für
char* summe
her?
> for(uint8_t x=0; x<length2; x++)
[..]
> summe[5-x] = (uint8_t)temp;
Und wie weisst Du dass length2 immer kleiner oder gleich 5 ist?
> sum2[length2-1-x]
..und Du wirst Dich wesentlich leichter tun wenn Du die (vermutlich
arbitrary-length-)Zahlen-Arrays als little endian interpretierst, also
LSB auf Index 0.
g457 schrieb:> Und wie weisst Du dass length2 immer kleiner oder gleich 5 ist?
Das weiß ich noch nicht. Das käme im nächsten schritt. Zunächst weiß ich
es nur, da ich es so definiert habe. Eigentlich wäre summe eins größer,
als sum_1 oder sum_2 (je nachdem welcher größer ist).