使用另一个数组在结构内初始化数组

时间:2017-02-02 22:21:03

标签: c struct initialization

我在C中编写代码,使用其他结构的部分初始化一堆结构。例如:

//Original structure
struct
{
    int foo1;
    int foo2[50];
    int foo3;
} orig_struct = {1,{2,3,etc},52}; //<--replace "etc" with 48 more int values

//New structure
struct
{
    int bar1;
    int bar2[50];
} new_struct = {orig_struct.foo1, XXX};

我必须为 lot 结构执行此操作,上面的初始化方法使代码看起来非常干净和可读。要清楚,我对原始结构没有任何控制权。我只是创建新结构来捕获它们的数据。

当其中一个结构有一个大数组时,我遇到了一个问题:

...
} new_struct = {orig_struct.foo1, {orig_struct.foo2[0],orig_struct.foo2[1],orig_struct.foo2[2],orig_struct.foo2[3],etc}

有没有什么我可以用新的结构中的数组用原始结构的数组中的值初始化XXX来替换XXX?同样,我想对我的代码保持干净,一致的外观,因此将其保持在大括号内是理想的。我知道我可以在自己的花括号中手动输出数组的每个元素:

var long;
var lat;
lat = position.coords.latitude;
long = position.coords.longitude;

var api = "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + long + "&appid=79b001616877b59c717616181ee219ec";

$.getJSON(api, function(info) {
    var weatherIcon = info.weather[0].icon;
    $('#weatherIcon').html(weatherIcon);

但很明显,为什么会很快变得站不住脚。

2 个答案:

答案 0 :(得分:1)

在c中,我认为在初始化器中无法做到这一点,因为不支持分配数组,并且表达式必须是常量表达式;因此在初始化期间无法循环或memcpy(参见array initialization reference):

  

与所有其他初始化一样,初始化程序中的每个表达式   初始化静态数组时,list必须是常量表达式   或线程本地存储持续时间:

当然,稍后您可以编写memcpy(new_struct.bar2, orig_struct.foo2, sizeof(new_struct.bar2)),但此代码将与struct / variable声明分开。

答案 1 :(得分:1)

请注意,如果new_struct具有new_struct存储持续时间,则初始化static的语法不起作用,因为在这种情况下需要使用常量表达式。

实际上没有办法直接将数组分配给另一个数组。仅当数组本身由结构封装并且您正在使用结构赋值时,才允许这样做。由于您的原始结构和新结构共享一个公共的初始前缀,您可以尝试通过union来利用它:

struct orig_struct_type orig_struct = {1,{2,3},52};

void some_function ()
{
    union {
        struct orig_struct_type o;
        struct new_struct_type n;
    } *u = (void *)&orig_struct;
    struct new_struct_type new_struct = u->n;
    /* ... */
}

如果您只是想减少代码重复,可以将数组初始化列表放入宏中。

#define VALUES {2,3,etc} //<--replace "etc" with 48 more int

//Original structure
struct
{
    int foo1;
    int foo2[50];
    int foo3;
} orig_struct = {1,VALUES,52};

void some_function ()
{
    struct
    {
        int bar1;
        int bar2[50];
    } new_struct = {orig_struct.foo1, VALUES};
    /* ... */
}