2014-02-05 15 views
9
struct A{ 
    int a; int b; 
}; 
static const struct A a = {.a1 = 1, .a2 = 42}; 

struct B{ 
    struct A[666][510] 
}; 
static const struct B b; 

Ich möchte b mit Kopien von a initialisieren. Ich kann jedoch static const Dinge mit memcpy() nicht berühren. Und ich brauche b zu sein static const, weil auf diese Weise wird es in Flash und nicht RAM-Speicher gesetzt.Wie man ein Array von Strukturen statisch initialisiert?

Wie mache ich das funktioniert. Der Compiler ist arm-none-eabi-gcc mit -std=c89, denke ich.

+0

Siehe die Antwort zu http://stackoverflow.com/questions/21528288/c-structure-array-initializing/ –

+4

'.a1 = 1': unbekanntes Feld. und nicht c89. – BLUEPIXY

+1

Überprüfen Sie das Linker-Skript für Abschnitte, die in Flash eingefügt werden, und fügen Sie ein Attribut [section] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes) hinzu, um es zu platzieren in diesem Abschnitt. –

Antwort

1

du versuchen können, obwohl es speziell für die Dimensionen arbeitet, die Sie angeben (666 x 510):

#define X001 {1,42} 
#define X002 X001,X001 
#define X004 X002,X002 
#define X008 X004,X004 
#define X016 X008,X008 
#define X032 X016,X016 
#define X064 X032,X032 
#define X128 X064,X064 
#define X256 X128,X128 

#define Y001 {X256,X128,X064,X032,X016,X008,X004,X002} 
#define Y002 Y001,Y001 
#define Y004 Y002,Y002 
#define Y008 Y004,Y004 
#define Y016 Y008,Y008 
#define Y032 Y016,Y016 
#define Y064 Y032,Y032 
#define Y128 Y064,Y064 
#define Y256 Y128,Y128 
#define Y512 Y256,Y256 

static const struct A a = X001; 
static const struct B b = {{Y512,Y128,Y016,Y008,Y002}}; 
+0

Ein wenig chaotisch, aber der Weg zu gehen. Sie sagen, Makros sind die Krücke der Sprache. Danke vielmals! – Vorac

+0

Gern geschehen :) –

0

Unter Linux dies entspricht gcc -std = c89 (weiß nicht, über Arm Cross-Compiler)

 
typedef struct A{ 
    int a; int b; 
} TA; 

typedef struct ARR3 { 
    TA a[3]; 
} TARR3; 


typedef struct ARR33 { 
TARR3 b[3]; 
} TARR33; 

static const TA a = {.a = 1, .b = 42}; 

TARR33 aa = { 
    .b[0] = { .a[0] = {.a = 1, .b = 1}, .a[1] = {.a = 2, .b = 2}, .a[2] = {.a = 3, .b = 3} }, 
    .b[1] = { .a[0] = {.a = 4, .b = 4}, .a[1] = {.a = 5, .b = 5}, .a[2] = {.a = 1, .b = 2} }, 
    .b[2] = { .a[0] = {.a = 1, .b = 1}, .a[1] = {.a = 1, .b = 2}, .a[2] = {.a = 1, .b = 2} } 
      }; 

main() 
{ 
    return 0; 
} 
+0

Nun, ja, du musst noch alle Zahlen eingeben. In meinem Fall ist das Array viel größer als 3x3. Es scheint, dass [dies] (http://stackoverflow.com/a/21530246/1145760) die einzige Antwort ist. Aber es ist so verdammt hässlich! – Vorac

+0

Mit C89 Standard? ohne Fehler? – Jack

1

ich empfehlen, diese Arrays in einem separaten Modul, um Verkapselung zu erreichen setzen. In diesem Modul müssen Sie B nicht zu const machen, sondern es stattdessen statisch machen. Jeder Zugriff auf diese Daten müssen über Getter und Setter wie folgt geschehen:


mydata.h 

#define BA_SIZE 666 

struct A{ 
    int a; int b; 
}; 

struct B{ 
    struct A stuff[BA_SIZE]; 
}; 

void init(void); 
struct A * getB(unsigned int i); 
void setB(unsigned int i, struct A element); 

mydata.c: 

#include "mydata.h" 

static const struct A a = {.a = 1, .b = 42}; 
static struct B b; 

void init(void) 
{ 
    int i; 
    for(i=0; i&ltBA_SIZE; i++) { 
     b.stuff[i] = a; 
    } 
} 

struct A * getB(unsigned int i) 
{ 
    return(&b.stuff[i]); 
} 

void setB(unsigned int i, struct A element) 
{ 
    if (i > BA_SIZE) { return; } 
    b.stuff[i].a = element.a; 
    b.stuff[i].b = element.b; 
} 


main.c: 
#include &ltstdio.h> 
#include "mydata.h" 

int main(void) 
{ 
    init(); 
    unsigned int num=1; 
    struct A * something = getB(num); 
    printf("element [%u] a=%i b=%i \n", num, something-&gta, something-&gtb); 

    return(0); 
} 


+0

Wenn Sie die Daten statisch const machen, kann der Linker sie in den Flash-Speicher und nicht den wertvollen RAM-Speicher einfügen. Und ich kann das, weil ich nur diese Daten lesen muss. Auf der anderen Seite, um Daten zu ändern, sieht Ihr Beispiel gut aus. – Vorac

Verwandte Themen