用前一个C初始化struct变量

时间:2018-01-22 12:14:11

标签: c arrays struct

我希望有如下结构:

typedef struct Mystruct
{
    double  p;
    double  x_min;
    double  x_max;
    double y_min;
    double y_max;
    double params[] = {x_min, x_max, y_min, y_max};
 };

我的目标是数组params的元素应填充{ x_min, x_max, y_min, y_max}

无论如何在中实现这种结构?

6 个答案:

答案 0 :(得分:1)

在C中,你不能这样做,而是你可以编写一个为结构实例进行初始化的函数。

typedef struct Mystruct
{
        double  p;
        double  x_min;
        double  x_max;
        double y_min;
        double y_max;
        double params[4];
}Mystruct;


Mystruct GetMystruct( double p, 
                      double x_min, 
                      double x_max, 
                      double y_min, 
                      double y_max)
{
    Mystruct my = { p, x_min,x_max,y_min,y_max, {x_min,x_max,y_min,y_max} } ;

    return my;
}

然后,例如:

Mystruct m = GetMystruct( 0.0, 42.1, 42.2, 42.3,42.4 );

答案 1 :(得分:1)

如果你的意图是对同一个结构成员有两个不同的视图,一个是名字,另一个是索引,那么这可以通过以下方式在大多数C实现中实现:

#include <stdio.h>


typedef struct foo
{
    double p;
    union
    {
        struct { double x_min, x_max, y_min, y_max; };
        double params[4];
    };
} foo;


int main(void)
{
    foo x = { 1, 2, 3, 4, 5 };
    for (size_t i = 0; i < 4; ++i)
        printf("%g\n", x.params[i]);
}

这有一些理论上的危害(特别是确保内部struct没有填充),但它可以在正常的C实现中工作,并且可以防止危害。 (检查内部struct的大小是否等于数组的大小将防止填充。为了检查大小,您需要给struct一个标记,使其具有名称。 )

这使用union来使命名成员与数组元素相同(不仅仅是初始化为相同,而是实际使用相同的成员),它使用匿名struct和{{1}使内部聚合中成员的名称可用作外部union成员的名称

答案 2 :(得分:0)

不,你不能那样做。您无法在结构声明中初始化成员。 因为结构声明定义的类型不是变量 。你展示它的方式。保留一组依赖于它们的变量。即使你可以为什么这样做呢?只需一个阵列。

typedef struct Mystruct
{
        double  p;
        double params[4];
};

现在,您可以自己完成初始化部分。或者,如果你需要两者,那么你可以保留两者。我的意思是你可以保留这4个变量并保留一个数组,然后在初始化时你可以自己明确地设置内容。无法像你一样包装它。然后你像这样初始化

struct MyStruct mystruct = {
   10.0, 
   { 5, 6, 7, 8 }
};

同样如果你想保持两组变量用相同的值初始化,你可以按照上面显示的相同方法。但它确实没有意义,因为没有其他两个不同的变量具有相同的值。

答案 3 :(得分:0)

可以使用union在XY参数和数组中的条目之间共享内存:

typedef struct Mystruct
{
   double  p;
   union {
      struct {
         double  x_min;
         double  x_max;
         double y_min;
         double y_max;
      };
      double params[] = {x_min, x_max, y_min, y_max};
};

这意味着xy值将始终与数组中的值相同

答案 4 :(得分:0)

您可以在struct内定义一个函数,该函数将params数组初始化/设置为所需的值,该函数包含自引用({{1 }}包含其结构。但是self数组中的值只能同步“#39;如果调用此函数...

此方法的示例位于"this" pointer in C (not C++)

params

然而要&#39;同步&#39; 您必须致电#include <stdio.h> #include <stdlib.h> typedef struct MyStruct { double p; double x_min; double x_max; double y_min; double y_max; double params[4] ; void (*setParams)(); }MyStruct; void setParams(MyStruct* self) { self->params[0]= self->x_min; self->params[1]= self->x_max; self->params[2]= self->y_min; self->params[3]= self->y_max; } int main (int argc, char * argv[]) { MyStruct myStruct = {1.24, 2.0, 4.0, 2.0, 4.0, {0,0,0,0}, NULL }; printf("%f, %f, %f, %f \n", myStruct.params[0], myStruct.params[1], myStruct.params[2], myStruct.params[3] ); setParams(&myStruct); printf("%f, %f, %f, %f \n", myStruct.params[0], myStruct.params[1], myStruct.params[2], myStruct.params[3] ); return 0; }

答案 5 :(得分:0)

假设您想要相同数据的2个不同副本,只需使用常识:

typedef struct 
{
  double x_min;
  double x_max;
  double y_min;
  double y_max;
} xy_stuff;

typedef struct 
{
    double   p;
    xy_stuff xy;
    xy_stuff params;
} Mystruct;

...

Mystruct ms = 
{ 
  .p      = 1.0,
  .xy     = {1.0, 2.0, 3.0, 4.0},
  .params = {1.0, 2.0, 3.0, 4.0},
};