如何将动态分配的结构和二重结构的子结构的内容传输到数组?(C)



我正在编写一个程序,该程序的逻辑流由于结构类型的自由使用而大大简化。现在,我需要用一个函数来扩充程序,该函数将所有相关参数(格式为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;

类型model1model2model3本身就是结构类型,包含双打和双打的结构。然而,无论结构层如何下降,最终总是达到double类型的变量。

我试过

parameters current;
/* Stuff that partially fills the model arrays in
   current, depending on the situation of interest */
double checkem[MAX_PARS];
memcpy(checkem,&current,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策略似乎不起作用,因为复制的是指针,而不是分配的内容。那么,在我的情况下,什么会起作用呢?没有简单的方法可以做到这一点吗?

是的,您拥有的代码将复制指针,而不是doubles。您需要复制每个子数组的内容,以及它们的子数组(model1model2model3,您没有提供它们的定义。所以类似于(如果model1等只是双[])。。。

parameters current;
double checkem[MAX_PARS];
double *p = &checkem[0];
// copy X into checkem
memcpy(p, &current.x, numx * sizeof(struct model1));
p += (numx * sizeof(struct model1)) / sizeof(double);
// copy Y into checkem after X
memcpy(p, &current.y, numy * sizeof(struct model2));
p += (numy * sizeof(struct model2)) / sizeof(double);
// copy Z into checkem after Y
memcpy(p, &current.z, numz * sizeof(struct model3));

如果model1model2model3比双打数组更复杂,则需要分别复制双打。

请注意,该代码未经测试,但应该会为您提供指导。

实际上一个简单的强制转换就可以了。我在标准中没有看到任何禁止强制转换的内容。具体来说,目标类型所需的对齐是匹配的(也是双精度的),像填充这样的内存布局可以防止元素在内存中连续,这不应该是双精度的问题。除非必要,否则我不会随意复制大数据。

最后同样重要的是,它非常简单,而且很难出错。

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

最新更新