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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren