Forum: PC-Programmierung uint8_t* als Rückgabewert als Adresse


von Chandler B. (chandler)


Lesenswert?

Hallo,
ich habe hier im Code eine Funktion, wo ich den Rückgabewert nicht ganz 
verstehe.
1
uint8_t* getTxBufferAdress(uint16_t id);

Das ganze läuft auf einem 32-bit system.
in der Beschreibung steht:
"return Trasnmit Buffer message pointer related to the index"
Es gibt also die Adresse von id zurück. Aber sollte die Adresse nicht 
32-bit sein? Also uint32_t* ?
Wie sieht der Rückgabewert aus?

von Thomas F. (tommf)


Lesenswert?

Der Zeiger zeigt auf einen uint8_t. Die Representation des Zeigers ist 
davon unabhängig, der dürfte 32bit breit sein.

von Simon (Gast)


Lesenswert?

Chandler B. schrieb:
> Hallo,
> ich habe hier im Code eine Funktion, wo ich den Rückgabewert nicht ganz
> verstehe.uint8_t* getTxBufferAdress(uint16_t id);
>
> Das ganze läuft auf einem 32-bit system.
> in der Beschreibung steht:
> "return Trasnmit Buffer message pointer related to the index"
> Es gibt also die Adresse von id zurück. Aber sollte die Adresse nicht
> 32-bit sein? Also uint32_t* ?
> Wie sieht der Rückgabewert aus?

der zurück gegebene Pointer zeigt auf einen 8-Bit Wert.

von MaNi (Gast)


Lesenswert?

Höchst wahrscheinlich wird der TX Buffer von Datentyp uint8_t sein. Also 
ein Array von uint8_t.
Wenn deine Beschreibung stimmt, gibst du über id den Index innerhalb des 
Arrays an und bekommst die Adresse des gewünschten Elements zurück. 
Quasi das selbe wie wenn du das hier schreibst:
1
uint8_t u8Buffer[65535];
2
...
3
uint8_t* pu8Return = &u8Buffer[id];

id ist deshalb ein uint16_t da du ja mehr als 256 Elemente haben kannst 
(siehe mein Beispiel). Es könnte genau so gut ein uint32_t sein.

Warum also die Funktion verwendet wird kann mehrere Gründe haben.
Vielleicht wird in ihr eine Bereichsprüfung durchgeführt um ein Out of 
Bound Zugriff abzufangen.
Vielleicht wird auch ein großer Buffer für unterschiedliche 
Applikationsteile oder Instanzen fragmentiert und deshalb intern mit 
Ofsets gearbeitet.
Das kann keiner sagen.
Du kannst ja Mal den Code innerhalb der Funktion getTxBufferAdress 
posten.

von Chandler B. (chandler)


Lesenswert?

Den Inhalt der Funktion habe ich leider nicht.
Die Variable (uint8_t* var), mit der ich diese Funktion aufrufe bekommt 
die Adresse und somit beinhaltet es den zugehörigen Wert?

von Adam P. (adamap)


Lesenswert?

Chandler B. schrieb:
> Die Variable (uint8_t* var), mit der ich diese Funktion aufrufe

Du hast keine (uint8_t* var) Variable mit der du die Funktion aufrufst, 
zumindest nicht im o.g. Code Schnippsel.

Aber ja. Zur Veranschaulichung:
1
uint8_t buf[1024] = "Hallo";
2
uint8_t *var;
3
4
var = getTxBufferAdress(1);
5
6
// var zeigt auf die Adresse buf[1] und somit auf 'a'.

Falls die Funktion wirklich das tut wie sie heißt,
weiß hier leider niemand.

Probier es doch einfach aus und schau dir an was passiert, evtl. im 
Debug Mode.

Und natürlich ist der Zeiger auf einem 32-Bit System, auch 32-Bit groß, 
er muss ja 32-Bit Adressen aufnehmen können.
Er zeigt halt nur auf Byte-Elemente. (Interpretation der Werte die an 
dieser Adresse liegen)

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Chandler B. schrieb:
> "return Trasnmit Buffer message pointer related to the index"
> Es gibt also die Adresse von id zurück. Aber sollte die Adresse nicht
> 32-bit sein? Also uint32_t* ?

wenn du ein 32bit system hat dann:

sizeof(uint8_t) == 1
aber
sizeof(uint8_t*) == 4

uint8_t-Zeiger bedeutet das bei dir ein 32bit Zeiger auf einen uint8_t 
Wert zeigt - mehr nicht

sizeof(void*) == 4
sizeof(irgendein_struct*) == 4
sizeof(irgendein_typ*) == 4

der Typ vor dem Stern sagt nur aus was für ein Typ das Ziel des Zeigers 
hat

von Einer (Gast)


Lesenswert?

Chandler B. schrieb:
> "return Trasnmit Buffer message pointer related to the index"

Gib das in einen Übersetzer ein:

  https://www.deepl.com/translator#en/de/return%20Transmit%20Buffer%20message%20pointer%20related%20to%20the%20index


> Es gibt also die Adresse von id zurück.

Nein. Es gibt eine Adresse auf einen Buffer zurück. Dieser Buffer wird 
anhand einer ID "ausgewählt".

D.h., es gibt eine Zuordnung der Form

   id --> Buffer

Und wenn Du nun die ID hast, kannst Du mit dieser Funktion die Adresse 
des Buffers bekommen.

Die "ID" ist nur ein Handle, ein Deskriptor, ein Verweis.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.