www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dynamisches Array in einer struct


Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
typedef struct{
    uchar header;
    uchar command;
    uchar daten[?];
    uint crc;
}
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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct{
    uchar header;
    uchar command;
    uchar length;
    uint crc;
    uchar daten[MAX_BUFLEN];
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.