Marcel L. schrieb:
> Tom schrieb:
>> Und diese Variable cmdValue ist ein uint8_t*, also ein Pointer auf ein
>> uint8_t.
>
> Aber ich Übergebe ja auch:
1 | SendRemoteCommand(&WERT[0])
|
Ja.
Und was macht der kleine & da?
Er sorgt dafür, dass die Adresse von dem Teil rechts von ihm genommen
und übergeben wird.
D.h. hier wird eine Speicheradresse an die Funktion übergeben. Die
Funktion kriegt diese Adresse und speichert sie in ihrer lokalen
Variablen, die dann eine Pointervariable sein muss. Denn genau darum
geht es ja: Pointervariablen sind Variablen, in denen Adressen
gespeichert werden.
> Das ist doch äquivalent zu
1 | SendRemoteCommand(WERT)
|
Yep. Weil bei Arrays automatisch und immer der Name des Arrays für die
Adresse zum ersten Element des Arrays steht.
> wenn ich die
> Funktion
1 | void SendRemoteCommand(uint8_t cmdValue[])
|
so
> definiere oder nicht?
Nö.
HIer definierst du was anderes.
Hier definierst du, dass die Funktion EINEN uint8_t bekommt. Also 1
Zahenwert. Zb 25 oder 8 oder auch die 0x05, die du in deinem Array
gespeichert hast. Der FUnktion ist es ja wurscht, wo dieser WErt
herkommt, sie will nur den Wert haben.
1 | int i = 8;
|
2 | uint8_t Value[] = { 0x05 );
|
3 |
|
4 | SendRemoteCommand( 25 );
|
5 | SendRemoteCommand( i );
|
6 | SendRemoteCommand( 8 * i );
|
7 | SendRemoteCommand( Value[0] );
|
Im letzten Fall wurde beim Aufruf explizit gesagt, dass der Wert, der an
die FUnktion zu übergeben ist, so bestimmt werden soll, indem im Array
'Value' der Wert des Elements mit dem Index 0 bestimmt werden soll.
Dieser dort abgespeicherte Wert ist 0x05 und genau der wird dann auch an
die Funktion übereben.
Aber: Dazu musste die Funktion auch so definiert sein, dass sie einen
derartigen Wert (einen uint8_t) übernimmt.
In diesem Beispiel ist das gut so.
Aber hier, in deinem Eröffnungsposting, war das ja eine ganz andere
Funktion. Die sah so aus
1 | void SendRemoteCommand(uint8_t * cmdValue)
|
diese Funktion übernimmt nicht einen uint8_t Wert.
Diese Funktion (beachte den *) übernimmt die Speicheradresse, an der der
uint8_t zu finden ist.
D.h. du sagst beim Aufruf dann nicht mehr: Liebe Funktion, der Wert mit
dem du arbeiten sollst ist 28.
Sondern du musst beim Aufruf sagen: Liebe Funktion, den uint8_t mit dem
du arbeiten sollst, der findet sich im SPeicher dort und dort.
1 | int i = 28;
|
2 |
|
3 | SendRemoteCommand( &i );
|
und das ist aber was ganz anderes. Die Funktion kriegt nicht mehr die 28
direkt in der Argumentschnittstelle. Sondern sie kriegt einen Verweis
(die Adresse) in den Speicher, an der sie die 28 finden kann.
> Wenn ich ein Array Übergebe habe ich ja automatisch call-by-reference
> und übergebe die Anfangsadresse des ersten Elementes.
Technisch gesehen gibt es in C kein Call-By-Reference. Alle Argumente
werden immer so übergeben, dass die Funktion eine Kopie des übergebenen
Wertes bekommt. Man kann das natürlich benutzen um der FUnktion eine
Speicheradresse zu übergeben, mit der sie arbeiten kann. Das simuliert
in einem gewissen Sinne einen Call-By-Reference, aber im eigentlichen
Sinne ist es keiner.