2013-10-24 2 views
0
#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 

#define MAX 100 

void calc(float**, int, float*, float*); 

int main(int argc, char* argv[]) 
{ 
    float *array[MAX]; 
    float *MEAN; 
    float *SD; 
    int array_size, i; 

    array_size = argc; 

    for(i = 0; i < argc ; ++i) 
     { 
     *array = (float *) malloc(argc*(sizeof(float))); 
      *array[i] = atof(argv[i]); 
     } 

    calc(array, array_size, MEAN, SD); 
    return 0; 
} 

void calc(float* arr[] , int arr_size, float* mean, float* stdev) 
{ 
    int sum, i; 

    for (i = 0; i < arr_size ; ++i) 
     { 
      sum += *arr[i]; 
     } 

    *mean = sum/arr_size; 

    printf("%.2f", *mean); 

     for (i = 0; i < arr_size ; ++i) 
     { 
     sum += pow((*arr[i]-*mean), 2); 
     } 

    *stdev = sqrt((sum/arr_size)); 

    printf("%.2f", *stdev); 

} 

Код должен определять среднее и стандартное отклонение числа поплавков, введенных пользователем. При попытке скомпилировать его я получаю ошибку сегментации. Я попытался освободить malloc, но у него появилось больше проблем для кода, поэтому я просто оставил его как есть - хотя это, вероятно, проблема с распределением памяти.C программа для stddev/mean

Спасибо

+9

Если у вас возникла ошибка сегментации при попытке ее компиляции, ваш компилятор сломался. – Oswald

+0

Почему у вас есть 'float * array [MAX];'? Что не так с 'float array [MAX];'? – Ryan

+0

Является ли Array значительным массивом плавающих указателей? –

ответ

1

Есть несколько проблем:

  • float *array[MAX]; является указателем на массив поплавки. Вы должны использовать либо массив поплавков, либо указатель. Так как вы используете malloc, вы можете использовать указатель, как это: float *array;
  • Не называть таНос для каждого поплавка, но называть его один раз для всего массива
  • Если вы определяете MEAN и SD как указатели, вы будете иметь для использования malloc на них. Лучше объявить их только как float и использовать их адреса (через &MEAN и &SD).
  • Вы должны указать float, а вы должны инициализировать его до 0 Вы также должны установить его на 0 перед вычислением stdev.
  • Помните, что argv[0] содержит название вашей программы, поэтому следует игнорировать его.
  • Также не забудьте позвонить free на все, что вы выделите malloc , когда вы закончите с этим.

Модифицированная версия кода:

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 

void calc(float*, int, float*, float*); 

int main(int argc, char* argv[]) { 
    float *array; 
    float MEAN; 
    float SD; 
    int array_size, i; 
    array_size = argc-1; 
    array = (float *) malloc(array_size*sizeof(float)); 
    for(i = 0; i < array_size ; ++i) { 
     array[i] = atof(argv[i+1]); 
    } 
    calc(array, array_size, &MEAN, &SD); 
    free (array); 
    return 0; 
} 

void calc(float* arr , int arr_size, float* mean, float* stdev) { 
    float sum=0; 
    int i; 
    for (i = 0; i < arr_size ; ++i) { 
     sum += arr[i]; 
    } 
    *mean = sum/arr_size; 
    printf("%.2f ", *mean); 
    sum=0; 
    for (i = 0; i < arr_size ; ++i) { 
     sum += pow((arr[i]-*mean), 2); 
    } 
    *stdev = sqrt((sum/arr_size)); 
    printf("%.2f", *stdev); 
} 
0

Вы выделения и доступа к array неправильно. Должно быть так:

for(i = 0; i < argc ; ++i) 
{ 
    array = malloc(argc * sizeof(*array)); 
    array[i] = atof(argv[i]); 
} 

Также внутри calc() изменение функции *arr[i]arr[i] к везде.

0

Это, безусловно, не так:

*array = (float *) malloc(argc*(sizeof(float))); 

Вы выделяете массив поплавков после объявления массива. Это не имеет смысла. Затем вы неправильно определяете значения. Кроме того, в вашем коде вы пытаетесь преобразовать имя программы (argv[0]) в тип int.

Это может быть то, что вы хотите сделать:

float * array = NULL; 

array = malloc((argc-1)*(sizeof(float))); 

for (i=1; i<argc; ++i) 
    array[i]=atof(argv[i]); 

Этот код оставляет место памяти в куче размера (argc-1)*float, и инициализирует его со значениями, указанными в качестве параметров командной строки. Проверка должна быть вставлена, если argc равен 1.

0

У вас есть несколько проблем,

  • проверьте, что у вас есть по крайней мере один аргумент
  • вы объявили массив как массив указателей плавать, либо использовать array[], либо *array
  • ваш массив должен быть выделен только се
  • выделить массив числа samples*sizeof(float), один раз, перед тем цикла
  • хранения значений считываются в array[ndx] местах (atof штраф)
  • ARGV начинается с имени программы, хранить в array[n] значение, преобразованное из argv[n+1]
  • MEAN и SD нужно пространство, вы объявили указатели, изменение значения, и передать адрес (&)

Вот пересмотренная основной(),

int main(int argc, char* argv[]) 
{ 
    //float array[MAX]; 
    float *array; 
    float MEAN; 
    float SD; 
    int array_size, ndx; 

    if(!(argc>0)) { printf("please give 1 or more arguments\n"); exit(1); } 

    array_size = argc-1; //don't count the program name 
    array = (float*) malloc(array_size*(sizeof(float))); 
    for(ndx = 1; ndx<argc ; ++ndx) 
    { 
     array[ndx-1] = atof(argv[ndx]); 
     printf("[%d] %f\n",ndx-1,array[ndx-1]); 
    } 

    calc(array, array_size, &MEAN, &SD); 
    free(array); array=NULL; //always clean up after yourself 
    return 0; 
} 

Ваши расчеты статистики нужно работать, но это по крайней мере, компилируется и работает,

  • вам необходимо связать с libmath (смотри ниже),
  • ваша сумма не была инициализирована перед каждой петлей,
  • пау и SQRT вернуться дважды - читать о функциях математики C и проходя дважды,
  • ваш ARRAY_SIZE должен быть установлен тщательно

Здесь

void calc(float arr[] , int arr_size, float* _mean, float* _stdev) 
{ 
    double sum, mean, stddev; 
    int i; 

    sum=0.0; 
    for (i = 0; i < arr_size ; ++i) 
    { 
     sum += arr[i]; 
     //printf("[%d] %f\n",i,arr[i]); 
    } 
    printf("sum %f\n",sum); 
    *_mean = mean = sum/arr_size; 
    printf("mean %f\n",mean); 
    printf("%.2f\n", *_mean); 

    sum=0.0; 
    for (i = 0; i < arr_size ; ++i) 
    { 
     sum += pow((arr[i]-mean), 2); 
     //printf("[%d] %f\n",i,arr[i]); 
    } 
    printf("sum^2 %f\n",sum); 
    *_stdev = stddev = sqrt((sum/arr_size)); 
    printf("stddev %f\n",stddev); 
    printf("%.2f\n", *_stdev); 
} 

Ах, вы хотите связать с libmath,

cc stddev.c -lm -o stddev 

И при его запуске,

$ ./stddev 1 2 3 4 5 
[0] 1.000000 
[1] 2.000000 
[2] 3.000000 
[3] 4.000000 
[4] 5.000000 
sum 15.000000 
mean 3.000000 
3.00 
sum^2 10.000000 
stddev 1.414214 
1.41 

Кроме того, вы должны освободить память, вы таНос 'ed (массив). Это хорошая привычка, хотя и не нужна для этой крошечной программы.

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