0

我只是把这件事弄得一团糟。我有一个函数,它应该采用一维数组,用它的值做一些计算,然后返回一个带有计算结果的类似数组。我不一定关心它是否返回相同的数组(带有新值),或者它是否在不同的内存位置创建一个新数组并返回它。这是我目前所拥有的。这一切都有错误,但我不知道我做错了什么。任何人都可以帮忙吗?

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

2 回答 2

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)并返回指向已分配内存的指针是更为常见的做法。

于 2013-09-16T05:22:14.450 回答
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]);
于 2013-09-16T05:42:13.557 回答