用前一个C初始化struct变量[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用前一个C初始化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}填充。

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

答案

在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 );
另一答案

如果你的意图是拥有相同结构成员的两个不同视图,一个是名字,一个是索引,那么这可以在大多数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一个标签,使它有一个名称。)

这使用一个联合来使命名成员与数组元素相同(不仅仅是初始化为相同,而是实际使用相同的成员),并使用匿名structunion来生成内部成员的名称可用作外部struct.成员名称的聚合

另一答案

可以使用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值将始终与数组中的值相同

另一答案

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

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

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

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

此外,如果要保持两组变量使用相同的值进行初始化,则可以按照上面显示的相同方法进行操作。但它确实没有意义,因为没有其他两个不同的变量具有相同的值。

另一答案

您可以在struct中定义一个函数,该函数将params数组初始化/设置为所需的值,该函数包含一个自引用(self)到其包含的结构。但是params数组中的值只有在调用此函数时才会“同步”...

这个方法的一个例子是在"this" pointer in C (not C++)

#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;
    }

然而要'同步'你必须打电话给setParams()

另一答案

假设您想要相同数据的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},
};

以上是关于用前一个C初始化struct变量[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

结构体struct零基础搞定C语言——12

c复习过程随笔九

C 语言:使用计算初始化浮点变量

C语言提高:结构体嵌套一级指针

C语言提高:结构体嵌套一级指针

带有红宝石集合/可枚举的酷技巧和富有表现力的片段[关闭]