dynamisches Array in einer struct

Gast #1179117
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
#1179141
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.