2015-06-14 3 views
0

Я только что сделал этот код для вычисления дисперсии и среднего числа чисел, но я не могу найти способ вернуть массив указателей.Как вернуть массив указателей?

Это моя функция:

float* statistics(int numbers[], int numbers_len, float * ptr_mean, 
float * ptr_variance, float * ptr_stdev, int * ptr_median){ 

    float*mean; float*variance; float stat[4]; float*array_stat; 
    int i=0; 

    mean=calculate_mean(numbers, numbers_len); 
    variance=calculate_variance(numbers, numbers_len, mean); 
    stat[0]=*mean; 
    free(mean); 
    mean=NULL; 

    stat[1]=*variance; 
    free(variance); 
    variance=NULL; 

    for(i=0;i<2;i++){ 
    array_stat=(float*)calloc(2, sizeof(float)); 
    array_stat[i]=stat[i]; 
    } 

    return array_stat; 
} 

Мне нужно array_stat быть массивом указателей. В ИНТ основной() я называю функцией * статистика() таким образом:

int main(){ 
    int array_numbers[MAX_ITEMS]; 
    int n_numbers, i=0; 
    float *calculate_statistics; 

    calculate_statistics = statistics(array_numbers, n_numbers, ptr_mean, 
    ptr_variance, ptr_stdev, ptr_median); 
    for(i=0;i<2;i++){ 
    printf("\n[%d] ITEM > %0.2f\n", i+1, *calculate_statistics); 
    } 
    free(calculate_statistics); 
    calculate_statistics=NULL; 
} 

Кто-то может мне помочь, пожалуйста?

+0

В настоящий момент 'array_stat' является указателем на массив поплавков. Массив имеет 100 элементов, но вы, кажется, используете только 2 из них. Зачем? И что в этом плохого? – SzG

+0

@SzG Я редактировал свой код. Теперь массив имеет 2 элемента (среднее значение и дисперсия). Как я могу вернуть его из функции *** statistics() **? –

+0

выглядит ОК, за исключением цикла 'main', который вы хотите' calculate_statistics [i] 'вместо' * calculate_statistics' –

ответ

0

В статистике()

array_stat=(float*)calloc(2, sizeof(float)); 
    for(i=0;i<2;i++){ 
    array_stat[i]=stat[i]; 
    } 

В основной()

for(i=0;i<2;i++){ 
    printf("\n[%d] ITEM > %0.2f\n", i+1, calculate_statistics[i]); 
    } 

ли вы только когда-либо хотите массив из двух поплавков? Возможно, вам лучше использовать структуру.

0

В C и таких языках «массивы» (а не аббревиатурные указатели указателей) представляют собой полувыпеченные типы данных, которые препятствуют их легкому возвращению в виде единого объекта, как вам хотелось бы.

Вы не можете иметь их как результат, возвращаемый fonction

int[4] foo(..parameters...) // no 
{ 
     int tmp[4]; 
     .... 
     return tmp;    // no 
} 

распространенный способ делать это, чтобы сделать fonction выделить некоторое пространство, и возвращает указатель

int* foo(...parameters...) 
{ 
    int *tmp = malloc(4 *sizeof(int)); 
    .... 
    return tmp; 
} 

в таким образом, абоненту придется иметь дело с указателем. Выглядит в основном как массив (вы можете использовать нотацию [] для индексов), но будьте осторожны с утечками памяти: вам придется управлять освобождением.

Другой подход заключается в вызове функции с дополнительным параметром: адресом, где функция будет выставлять результат.

void foo(...parameters..., int results[4]) 
{ 
     // do some stuff 
     // put the results in, hum, results 
} 

Вызов последовательности:

int results[4]; 
... 
foo(12, 345, 6789, results); 
// here we are 

Таким образом, вы не должны управлять распределением/открепление, так как массив является автоматическая переменная (живет в стеке) и, кроме того, вы не будете необходимо скопировать данные из массива в массив.

Смежные вопросы