Forum: Mikrocontroller und Digitale Elektronik dynamisches Array in einer struct


von xyz (Gast)


Lesenswert?

Hallo,
ich möchte einen Datensatz über die Serielle schicken.
In diesem Datensatz soll das Datenarray variable Größe haben.
Bzw am Anfang einer Funktion mit der richtigen Größe initialisiert 
werden.

die Sendefunktion sendet immer alle bytes der struct mit einem Zeiger.
Die Anzahl der zu sendenden bytes wird mit sizeof ermittelt.
1
typedef struct{
2
    uchar header;
3
    uchar command;
4
    uchar daten[?];
5
    uint crc;
6
}
Kann man das irgendwie machen?

Wenn ja wie Innitialisiert man solch einen Datensatz während der 
laufzeit für verschiedene Datenarraygrößen?

danke für Hilfe

von Benedikt K. (benedikt)


Lesenswert?

Ersetz das Array in der struct durch einen Pointer auf ein externes, 
dynamisches Array, dann funktioniert das.

von Uhu U. (uhu)


Lesenswert?

Dynamische Puffergrößen zu verwalten ist sehr aufwendig und man bekommt 
leicht Probleme mit Speicherverschnitt. Die daraus resultierenden Fehler 
sind auf Systemen mit kleinem Arbeitsspeicher kaum zu beheben und haben 
zudem die Eigenart, sporadisch aufzutreten und schwer reproduzierbar zu 
sein.

Deswegen ist die bessere Lösung, die maximal notwendige Pufferlänge zu 
bestimmen und einen Struct zu definieren, der als letztes Element diesen 
Puffer enthält.

Das CRC-Feld würde ich entweder vor den Puffer legen, oder dynamisch 
nach dem Füllen des Puffers hinter das Ende der Daten schreiben.

Zudem funktioniert die Abfrage der Länge auf keinen Fall mit sizeof. Das 
Resultat für sizeof muß dem Compiler bekannt sein sein - was es per 
definition bei einem dynamischen Puffer nicht sein kann.

Deswegen muß in den struct auch noch ein Längenfeld, also etwa so:
1
typedef struct{
2
    uchar header;
3
    uchar command;
4
    uchar length;
5
    uint crc;
6
    uchar daten[MAX_BUFLEN];
7
}

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.