#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,但它为代码产生了更多问题,所以我只是保留原样 - 尽管它可能是内存分发的问题。
谢谢
答案 0 :(得分:1)
有几个问题:
float *array[MAX];
是指向浮点数组的指针。你应该
使用浮点数组或指针。因为你正在使用
malloc
,你可以使用这样的指针:float *array;
MEAN
和SD
定义为指针,则必须使用
他们malloc
。最好将它们声明为仅浮动并使用
他们的地址(通过&MEAN
和&SD
)。sum
变量应该是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);
}
答案 1 :(得分:0)
您正在错误地分配和访问array
。应该是这样的:
for( i = 0; i < argc ; ++i )
{
array = malloc( argc * sizeof(*array));
array[i] = atof(argv[i]);
}
同样在calc()
内部功能将*arr[i]
更改为arr[i]
无处不在。
答案 2 :(得分: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时应插入支票。
答案 3 :(得分:0)
你有几个问题,
array[]
或*array
samples*sizeof(float)
的数组,一次,在循环之前array[ndx]
个位置(atof很好)array[n]
从argv[n+1]
转换的值这是修订后的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;
}
您的统计计算需要有效,但这至少可以编译并运行,
下面,
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
此外,你需要释放malloc'ed(数组)的内存。这是一个好习惯,虽然这个小程序不需要。