gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:00 24 4
gpt4 key购买 nike

我正在开发一个程序,其逻辑流程已因结构类型的自由使用而大大简化。我现在需要用一个函数来扩充程序,该函数采用所有相关参数,格式为 double 组(如 double *),作为其参数之一。不幸的是,我相当缺乏经验的自己正在为此苦苦挣扎。

目前,结构类型参数定义为

typedef struct parameters {

double u1;
double u2;
double u3;

model1 x[MAX_XMODELS];
model2 y[MAX_YMODELS];
model3 z[MAX_ZMODELS];

} parameters;

类型 model1model2model3 本身是结构类型,包含 double 和 double 结构.但是,无论结构层如何下降,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_PARSparameters 类型结构中的 double ,假设模拟中使用的模型的最大数量(MAX_XMODELS, ETC。)。而且,除了编译器警告之外,这还有效……除了现在数组中通常存在很多垃圾值,因为如果使用的模型少于程序能够处理的模型,则不会对模型数组进行分配。

因此,我喜欢将结构重新定义为

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。您需要复制每个子数组的内容,以及它们的子数组(model1model2model3,您没有提供它们的定义。所以像(如果 model1 等只是 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));

如果 model1model2model3 比 double 组更复杂,您需要单独复制 double 。

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

关于c - 如何将动态分配的结构和 double 子结构的内容传输到数组? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com