unterschiedliche Buffergrößen in Strukturen reservieren?

Gast #1341882
Lesenswert?
• ▲
▼
Ich habe folgendes Problem:

ich möchte mit folgender Struktur mehrere SPI mit unterschiedlichen 
Buffergrößen ausstatten. Leider kann ich SPI_BUFFER_size nur als 
Konstante definieren. Gibt es da eine Möglichkeit, oder geht dies nur 
mit einer "neuen" Struktur?
1
typedef struct SPI_attrib
2
{
3
    PORT_t* SPI_port;
4
    SPI_t*  SPI;
5
    unsigned char SPI_buff[SPI_BUFFER_size];
6
    unsigned char * buff_ptr;
7
    unsigned int  data_length;
8
    unsigned char SPI_state;
9
} SPI_attrib_t;
#1341895
Lesenswert?
• ▲
▼
Kann man so pauschal nicht sagen; es kommt drauf, wie du das
alles verwenden kannst/willst/musst.

Variante 1:
Den eigentlichen Puffer getrennt beschaffen (wie auch immer) und
in der struct nur einen Zeiger drauf:
1
typedef struct SPI_attrib
2
{
3
    PORT_t* SPI_port;
4
    SPI_t*  SPI;
5
    unsigned char *SPI_buff;
6
    unsigned char * buff_ptr;
7
    unsigned int  data_length;
8
    unsigned char SPI_state;
9
} SPI_attrib_t;
10

11
...
12
unsigned char SPI_buff1[SPI_BUFFER_size_1];
13
unsigned char SPI_buff2[SPI_BUFFER_size_2];
14
SPI_attrib_t a;
15
SPI_attrib_t b;
16

17
a.SPI_buff = SPI_buff1;
18
b.SPI_buff = SPI_buff2;

Muß natürlich entsprechend initialisiert werden.

Variante 2:
Falls der Speicher mit malloc() o.ä. reserviert wird oder mit union
getrickst wird, geht beim gcc (auch wenn sich die Gelehrten streiten,
wie weit das portabel ist) auch die Variante, das Feld ans Ende der
struct zu packen, mit der Länge 0 zu vereinbaren und jeweils
reichlich zu allokieren:
1
typedef struct SPI_attrib
2
{
3
    PORT_t* SPI_port;
4
    SPI_t*  SPI;
5
    unsigned char * buff_ptr;
6
    unsigned int  data_length;
7
    unsigned char SPI_state;
8
    unsigned char SPI_buff[0];
9
} SPI_attrib_t;
10

11
// Platz für struct mit 100 Byte Puffer:
12
SPI_attrib_t  *p_attrib = (SPI_attrib_t*)malloc( sizeof(SPI_attrib_t)+100 );

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.