Forum: PC-Programmierung ANSI C: uint8_t* Länge der gespeicherten Daten bestimmen


von toto (Gast)


Lesenswert?

Hallo,

bin aktuell dabei die Länge von einem uint8_t Array zu bestimmen.
Dieses Array wird als Pointer einer funktion übergeben. In dieser 
Funktion soll dann die Länge des Arrays ermittelt werden.
1
uint8_t data[50];
2
3
typedef struct
4
  {
5
    uint16_t id;  
6
    uint16_t length;
7
    uint8_t* payload;
8
  }st_Data;
9
10
bool CheckData(st_Data checkData);
11
12
st_Data data1{ 0, 0, data };
13
CheckData(data1);

von DerEgon (Gast)


Lesenswert?

Geht nicht, es sei denn, die in dem Array gespeicherten Daten lassen 
einen Rückschluss auf ihr Ende zu, wie es bei nullterminierten Strings 
der Fall ist.

von Homer (Gast)


Lesenswert?

Hi,

leider so nicht. Du müsstest schon z.B.

st_Data data1 = {0, sizeof(data), data};

initialisieren, um eine Längeninfo zu haben.

Grüsse

von (prx) A. K. (prx)


Lesenswert?

Wer so etwas benötigt, der sollte andersrum arbeiten: Nicht erst das 
Array anlegen und dann längen, sondern zusammen mit der Länge als 
Einheit behandeln und dynamisch allozieren (oder statisch per Template, 
wenn C++ eine Option ist).

Man könnte das auch in C direkt und statisch machen, aber das ist dann 
was für Fans von Präprozessor-Orgien.

von toto (Gast)


Lesenswert?

Ok ich übergebe noch die Länge.

von Wilhelm M. (wimalopaan)


Lesenswert?

Wie sagte schon Bjarne: C-Arrays sind so dumm, sie kennen noch nicht 
einmal ihre Länge.

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> Wie sagte schon Bjarne: C-Arrays sind so dumm, sie kennen noch nicht
> einmal ihre Länge.

Naja, ein Array kennt eigentlich schon seine Länge:
1
#include <stdio.h>
2
3
int main()
4
{
5
    char c[500];
6
    printf("%zu\n", sizeof c);
7
    return 0;
8
}

Die Array-Länge ist allerdings nicht Teil des einzelnen Arrays, sondern 
seines Typs. Die Probleme fangen dann bei Zeigern an, weil ein:

toto schrieb:
> uint8_t* payload;

ein Zeiger auf einen uint8_t ist, nicht mehr und nicht weniger. Dieser 
uint8_t kann zwar das erste Element eines Arrays sein und ist es per 
Konvention auch oft, aber dem Zeiger ist das egal. Für den ist das 
Zeigerziel nur ein einzelner uint8_t, daher weiß er auch nichts von 
Array-Größen.
Es gibt auch Zeiger auf Arrays. Die kennen dann die Array-Größe wieder, 
aber auch nur über den Typ.
1
   char (*ptr)[500] = &c;

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Rolf M. schrieb:
> Wilhelm M. schrieb:
>> Wie sagte schon Bjarne: C-Arrays sind so dumm, sie kennen noch nicht
>> einmal ihre Länge.
>
> Naja, ein Array kennt eigentlich schon seine Länge:
>
>
1
> #include <stdio.h>
2
> 
3
> int main()
4
> {
5
>     char c[500];
6
>     printf("%zu\n", sizeof c);
7
>     return 0;
8
> }
9
>
>
> Die Array-Länge ist allerdings nicht Teil des einzelnen Arrays, sondern
> seines Typs.

Natürlich ist das Bestandteil des Typs. Alles andere wäre auch wenig 
sinnvoll, da es sich ja um ein statisch dimensioniertes Array handelt.

Was er (Bjarne) damit ja, dass ein Array-Bezeichner in fast allen 
Anwendungsfällen zu einem Zeiger zerfällt (decay). Damit ist die 
Längeninformation weg. Etwa wenn ein Array-Bezeichner als 
Funktionisargument benutzt wird.

Dies kann man allerdings mit C++-templates wieder elegant vermeiden, 
weil man dann die Länge als NTTP vom Compiler abgeleitet bekommt.

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.