1

我正在开发一个程序,其逻辑流程已通过自由使用结构类型而大大简化。我现在需要使用一个函数来扩充程序,该函数将所有相关参数格式化为双精度数组(如 中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,model2model3本身是结构类型,包含双精度和双精度结构。但是,无论结构层如何下降,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不会起作用,因为复制的是指针,而不是已分配的内容。那么,在我的情况下什么起作用?没有简单的方法可以做到这一点吗?

4

2 回答 2

0

是的,您拥有的代码将复制指针,而不是doubles。您需要复制每个子数组的内容,以及它们的子数组 ( model1, model2model3您没有提供其定义。所以像 (if model1etc is just double[]) ...

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

如果model1,model2model3比双精度数组更复杂,则需要单独复制双精度。

请注意,代码未经测试,但应该给你一个指导。

于 2013-07-24T13:18:56.430 回答
0

实际上应该做一个简单的演员表。我在禁止演员的标准中看不到任何东西。具体来说,目标类型所需的对齐方式是匹配的(它也是双精度),并且像填充这样的内存布局会阻止元素在内存中连续,这不应该是双精度的问题。除非有必要,否则我不会到处复制大量数据。

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

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);
}
于 2015-06-04T17:20:26.860 回答