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,但它给代码带来了更多问题,所以我就让它保持原样——尽管它可能是内存分配的问题。

谢谢

4

4 回答 4

0

您分配和访问array错误。应该是这样的:

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

内部calc()功能也更改*arr[i]arr[i]无处不在。

于 2013-10-24T20:13:07.600 回答
0

你有几个问题,

  • 检查你是否有至少一个论点
  • 您将数组声明为指向浮点的指针数组,要么使用array[],要么*array
  • 你的数组只需要分配一次
  • samples*sizeof(float)在循环之前分配一个数量为 , 一次,的数组
  • 存储读入array[ndx]位置的值(atof 很好)
  • argv 从程序名开始,存入转换array[n]后的值argv[n+1]
  • MEAN 和 SD 需要空间,您声明了指针,更改为值,并传递地址 (&)

这是修改后的 main(),

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(见下文),
  • 在任一循环之前,您的总和未初始化,
  • pow 和 sqrt return double - 阅读有关 C 数学函数和传递 double 的信息,
  • 您的 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

此外,您需要释放您分配的内存(数组)。这是一个好习惯,虽然这个小程序不需要。

于 2013-10-24T20:39:51.203 回答
0

有几个问题:

  • float *array[MAX];是指向浮点数组的指针。您应该使用浮点数组或指针。由于您使用 的是malloc,您可以使用这样的指针:float *array;
  • 不要为每个浮点数调用 malloc,而是为整个数组调用一次
  • 如果将MEANand定义SD为指针,则必须 malloc在它们上使用。最好将它们声明为仅浮点数并使用它们的地址(通过&MEAN&SD)。
  • sum的变量应该是 a 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);
}
于 2013-10-24T20:30:19.843 回答
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]); 

此代码在 size 堆中保留一个内存位置(argc-1)*float,并使用指定为命令行参数的值对其进行初始化。为 1时应插入支票argc

于 2013-10-24T20:13:38.567 回答