用前一个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实现这种结构?
在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
一个标签,使它有一个名称。)
这使用一个联合来使命名成员与数组元素相同(不仅仅是初始化为相同,而是实际使用相同的成员),并使用匿名struct
和union
来生成内部成员的名称可用作外部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变量[关闭]的主要内容,如果未能解决你的问题,请参考以下文章