我正在编写一个程序,该程序的逻辑流由于结构类型的自由使用而大大简化。现在,我需要用一个函数来扩充程序,该函数将所有相关参数(格式为doubles数组(如double *
))作为其参数之一。不幸的是,我缺乏经验的自己正在为此而挣扎。
目前,结构类型parameters
定义为
typedef struct parameters {
double u1;
double u2;
double u3;
model1 x[MAX_XMODELS];
model2 y[MAX_YMODELS];
model3 z[MAX_ZMODELS];
} parameters;
类型model1
、model2
和model3
本身就是结构类型,也包含双打和双打的结构。然而,无论结构层如何下降,最终总是达到double
类型的变量。
我试过
parameters current;
/* Stuff that partially fills the model arrays in
current, depending on the situation of interest */
double checkem[MAX_PARS];
memcpy(checkem,¤t,sizeof(current));
其中,MAX_PARS
是类型为parameters
的结构中的二重数,假设模拟中使用的最大模型数(MAX_XMODELS
等)。而且,除了编译器警告外,这也适用于。。。但是现在数组中通常存在很多垃圾值,因为如果使用的模型比程序能够处理的模型少,就不会对模型数组进行赋值。
因此,我喜欢将struct重新定义为
typedef struct parameters {
double u1;
double u2;
double u3;
model1 *x;
model2 *y;
model3 *z;
} parameters;
然后根据程序在初始化过程中被告知要使用的模型数量,使用类似的东西来动态分配内存
parameters current;
current.x = malloc(numx*sizeof(struct model1));
current.y = malloc(numy*sizeof(struct model2));
current.z = malloc(numz*sizeof(struct model3));
然而,以前的memcpy
策略似乎不起作用,因为复制的是指针,而不是分配的内容。那么,在我的情况下,什么会起作用呢?没有简单的方法可以做到这一点吗?
是的,您拥有的代码将复制指针,而不是double
s。您需要复制每个子数组的内容,以及它们的子数组(model1
、model2
、model3
,您没有提供它们的定义。所以类似于(如果model1
等只是双[])。。。
parameters current;
double checkem[MAX_PARS];
double *p = &checkem[0];
// copy X into checkem
memcpy(p, ¤t.x, numx * sizeof(struct model1));
p += (numx * sizeof(struct model1)) / sizeof(double);
// copy Y into checkem after X
memcpy(p, ¤t.y, numy * sizeof(struct model2));
p += (numy * sizeof(struct model2)) / sizeof(double);
// copy Z into checkem after Y
memcpy(p, ¤t.z, numz * sizeof(struct model3));
如果model1
、model2
和model3
比双打数组更复杂,则需要分别复制双打。
请注意,该代码未经测试,但应该会为您提供指导。
实际上一个简单的强制转换就可以了。我在标准中没有看到任何禁止强制转换的内容。具体来说,目标类型所需的对齐是匹配的(也是双精度的),像填充这样的内存布局可以防止元素在内存中连续,这不应该是双精度的问题。除非必要,否则我不会随意复制大数据。
最后同样重要的是,它非常简单,而且很难出错。
void f(double *argArray);
typedef struct parameters {
double u1;
double u2;
double u3;
model1 x[MAX_XMODELS];
model2 y[MAX_YMODELS];
model3 z[MAX_ZMODELS];
} parameters;
parameters pObj;
void g()
{
f((double *)&pObj);
}