【问题标题】:How to statically inialize an array of structures?如何静态初始化结构数组?
【发布时间】:2014-02-05 11:29:49
【问题描述】:
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;

我想用 a 的副本初始化 b。但是,我不能用memcpy() 触摸static const 的东西。我需要b 成为static const,因为这样它会被放入闪存而不是内存中。

我该如何进行这项工作。我想编译器是arm-none-eabi-gcc-std=c89

【问题讨论】:

  • .a1 = 1 :未知字段。而不是 c89。
  • 检查链接描述文件中放入闪存的部分,并添加section attribute 将其放入该部分。
  • 所以你想要同一对数据的 666*510 个副本?你希望它是常量吗?我只是好奇这会有什么用。
  • @BLUEPIXY,这是 ansi c 和 gnu 扩展的一些奇怪组合。例如for(int i = 0;i < 5; i++) 不会编译。

标签: c struct


【解决方案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}};

【讨论】:

  • 有点乱,但要走的路。他们说宏是语言的拐杖。非常感谢!
【解决方案2】:

我建议您将这些数组放在一个单独的模块中,以实现封装。然后在该模块中,您不需要将 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 &gt BA_SIZE) { return; }
    b.stuff[i].a = element.a;
    b.stuff[i].b = element.b;
}


main.c:
#include &ltstdio.h&gt
#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);
}


【讨论】:

  • 制作数据static const 允许链接器将其放入闪存,而不是宝贵的内存。我可以这样做,因为我只需要读取这些数据。另一方面,对于更改数据,您的示例看起来很棒。
【解决方案3】:

在 linux 上,这符合 gcc -std=c89(不了解 arm 交叉编译器)

typedef 结构 A{ 诠释一个;诠释 b; } 助教; typedef 结构 ARR3 { TA一[3]; } 焦油3; typedef 结构 ARR33 { 焦油3 b[3]; } 焦油33; 静态常量 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} } }; 主要的() { 返回0; }

【讨论】:

  • 嗯,是的,你仍然需要输入所有的数字。在我的情况下,数组比 3x3 大得多。看来this 是唯一的答案。但是实在是太丑了!
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 2014-10-07
  • 2013-09-22
  • 1970-01-01
  • 2014-08-05
  • 2023-04-05
  • 2011-02-08
  • 2011-08-08
相关资源
最近更新 更多