Forum: Compiler & IDEs unterschiedliche Buffergrößen in Strukturen reservieren?


von mikes (Gast)


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;

von Klaus W. (mfgkw)


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 );

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.