2014-02-05 81 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; 

我想初始化b的副本。但是,我不能觸及static const東西memcpy()。我需要bstatic const,因爲這樣它就會被放入閃存而不是內存。如何靜態地初始化一個結構數組?

我該如何做這項工作。編譯器是arm-none-eabi-gcc-std=c89,我想。

+0

請參閱http://stackoverflow.com/questions/21528288/c-structure-array-initializing/ –

+4

'.a1 = 1'的答案:未知字段。而不是c89。 – BLUEPIXY

+1

檢查鏈接描述文件以獲取放入Flash的部分,並添加一個'section' [屬性](http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes)來放置它在那一節。 –

回答

1

你可以試試這個,但它的工作原理專爲您指定的尺寸(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

有點混亂,但要走的路。他們說宏是語言的柺杖。非常感謝! – Vorac

+0

不客氣:) –

0

在Linux上這符合GCC -std = C89(不知道手臂交叉編譯器)

 
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

嗯,是啊,堅果你仍然需要輸入所有的數字。在我的情況下,陣列比3x3大得多。它認爲[this](http://stackoverflow.com/a/21530246/1145760)是唯一的答案。但它太可惡了! – Vorac

+0

用C89標準?沒有任何錯誤? – Jack

1

我建議你把這些陣列在一個單獨的模塊,以實現封裝。然後在模塊內部,你不需要使B成爲const,而是使其成爲靜態的。 這個數據的任何訪問都必須通過getter和setter就像這樣:


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

使數據「靜態常量」允許鏈接器將其放入閃存中,而不是珍貴的內存。我可以做到這一點,因爲我只需要閱讀這些數據。另一方面,爲了改變數據,你的例子看起來很棒。 – Vorac