我希望有如下结构:
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中实现这种结构?
答案 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},
};