我只是搞得一团糟。我有一个函数应该采用一维数组,用其值进行一些计算,然后返回一个类似的数组与计算结果。我不一定关心它是否返回相同的数组(使用新值),或者它是否在不同的内存位置创建一个新数组并返回它。这就是我现在所拥有的。这一切都有错误,但我不知道我做错了什么。有人可以帮忙吗?
double s = 10;
double b = 2.6666;
double r = 28;
double (*newVertex(double vtx[3] )) [] {
static double newVtx[3];
/* Coordinates */
double x = vtx[0];
double y = vtx[1];
double z = vtx[2];
double dt = 0.001;
double dx = s*(y-x);
double dy = x*(r-z)-y;
double dz = x*y - b*z;
newVtx[0] = x + dt*dx;
newVtx[1] = y + dt*dy;
newVtx[2] = z + dt*dz;
return &newVtx;
}
int main(int argc, char *argv[]) {
int i;
/* Arrays to hold the coordinates */
double thisPt[3] = {1, 1, 1};
double nextPt[3];
for (i=0;i<1000;i++) {
printf("%5d %8.3f %8.3f %8.3f\n", i, thisPt[0], thisPt[1], thisPt[2]);
nextPt = newVertex(&thisPt);
thisPt = nextPt;
}
return 0;
}
答案 0 :(得分:2)
首先,你的函数声明对我来说看起来不太复杂。
如果你不打算创建一个新数组,那么应该是这样的:
void function_name(double *parameter) {
// code to change the parameter in place here
}
或者,如果你想明确数组的长度(参见注释以获取更多信息):
#define ARRAY_SIZE 3
void function_name(double parameter[ARRAY_SIZE]) {
// code to change the parameter in place here
}
如果您打算创建一个新阵列,那么您可以执行以下操作:
double * function_name(double *parameter) {
double *result = (double *)malloc(sizeof(double * number_of_elements));
// read parameter, write into result
return result;
}
以上代码段假定number_of_elements
已修复且已知。如果不是,则需要将它们作为附加参数处理。
接下来,这有几个原因:
double (*newVertex(double vtx[3] )) [] {
static double newVtx[3];
// update newVtx
return &newVtx;
}
return语句返回局部变量的地址。在这种特殊情况下,变量是静态的,因此一旦函数退出,变量就不会被覆盖。但它首先真的需要保持静态吗?它是静态的足够吗?想想这样的代码:
double *v1 = newVertex(old_vertex);
double *v2 = newVertex(old_vertex);
你可能会想到你可以单独处理这两个顶点,但它们指向内存中完全相同的位置:静态变量的位置。更常见的做法是动态地为数组分配空间(malloc,calloc)并返回指向已分配内存的指针。
答案 1 :(得分:0)
此处nextPt = newVertex(&thisPt);
只传递数组名称
newVertex(thisPt); //array name thispt==&thispt[0]
thisPt = nextPt; //illegal and remove this line
你的功能
void newVertex(double *); //declaration
void newVertex(double *vtx) //defination
{
//donot return array
}
在函数调用后打印
newVertex(thisPt);
printf("%5d %8.3f %8.3f %8.3f\n", i, thisPt[0], thisPt[1], thisPt[2]);