2013-09-16 3 views
0

Я просто делаю беспорядок из этого. У меня есть функция, которая должна принимать одномерный массив, выполнять некоторые вычисления с его значениями, а затем возвращать аналогичный массив с результатами вычисления. Мне не обязательно, возвращает ли тот же массив (с новыми значениями) или создает новый массив в другом месте памяти и возвращает это. Вот что я получил сейчас. Во всем этом есть ошибки, но я не знаю, что я делаю неправильно. Может ли кто-нибудь помочь?Возвращение массива из функции в C

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

ответ

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

Ответный оператор возвращает адрес локальной переменной. В этом конкретном случае переменная является статической, поэтому переменная не будет перезаписана после выхода функции. Но действительно ли это должно быть статичным в первую очередь? И достаточно ли для него статичности? Подумайте о том, кода:

double *v1 = newVertex(old_vertex); 
double *v2 = newVertex(old_vertex); 

Вы можете быть склонны думать, что вы можете справиться две вершины по отдельности, но они указывают на том же месте в памяти: место статической переменной. Гораздо более распространенная практика - распределить пространство для массива динамически (malloc, calloc) и вернуть указатель на выделенную память.

+0

Спасибо. аннулированию? Мне нужно вернуть массив (или хотя бы указатель на один) – Alex

+1

Если вы меняете массив на месте, вам не нужно ничего возвращать - как только функция вернется, результат будет внутри параметра массив. – misha

+0

Да, вы правы. Я изменил некоторые вещи вокруг, так что я переключился на простое изменение массива на месте и пропущенное возвращаемое значение. Теперь он компилируется. Благодаря! – Alex

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]); 
Смежные вопросы