任务是用用户输入的数字填充数组,然后使用stats()函数计算该数组每行的平均值等。stats()函数的头如下所示:
int stats(int (*ptr)[5], int width, int height, int row_id, int* max, int* min, float *avg)
其中PTR是指向矩阵的指针,width和height是矩阵的大小,row_id是分析行的索引,max, min和avg是指向存储每个统计数据的变量的指针。
当调用这样的函数时:
stats(*ptr, 5,5,2, *max = NULL, *min = NULL, *avg=NULL);
出现以下错误:
error: invalid type argument of unary '*' (have 'int')
我尝试了不同的方法,但总是有一个错误,我怎么能解决这个问题?谢谢你的提示。
编辑:下面是完整的代码:
#include <stdio.h>
int stats(int (*ptr)[5], int width, int height, int row_id, int* max, int* min, float *avg)
{
int j, vmax,vmin;
int max = &vmax;
int min = &vmin;
int i = row_id;
int m = *ptr;
for(j = 0; j<5; j++){
if(m[i][j]>max)
{
max = m[i][j] ;
j++;
else
j++;
}
}
printf("%d", max);
return 0;
}
int main(void){
int n, i, j, vmin, vmax; // vmax - value of the maximum
int min = &vmin; // min - pointer to the minimum
int max = &vmax;
float vavg;
int avg = &vavg;
int m[5][5];
for(i = 0; i<5; i++)
{
for(j = 0; j<5; j++)
{
printf("ENTER A NUMBER: ");
scanf("%d", &n);
m[i][j] = n;
}
}
int ptr = &m;
stats(*ptr, 5,5,2, *max = NULL, *min = NULL, *avg=NULL);
return 0;
}
你的代码漏洞百出
例如,min
和max
没有被声明为指针
int min = &vmin; // min - pointer to the minimum
int max = &vmax;
也不清楚为什么变量avg
具有int
类型,并且由float *
类型的指针表达式初始化。
float vavg;
int avg = &vavg;
或者int
类型的变量ptr
由二维数组的地址初始化。
int ptr = &m;
对于函数来说,如果函数只操作一行,那么将整个二维数组传递给函数就没有任何意义了。
函数的返回类型和返回值也没有意义。
该函数不输出任何消息。决定是否输出消息的是函数的调用者。
这个函数也有bug你需要重新声明它的参数比如
int max = &vmax;
还是没有意义。
使用您的方法,可以按照以下方式声明和定义函数
#include <assert.h>
//...
void stats( const int *a, size_t n, int *max, int *min, float *avg )
{
assert( n != 0 );
*max = a[0];
*min = a[0];
float sum = a[0];
for( size_t i = 1; i < n; i++ )
{
sum += a[i];
if ( *max < a[i] )
{
*max = a[i];
}
else if ( a[i] < *min )
{
*min = a[i];
}
}
*avg = sum / n;
}
并命名为
int min = 0;
int max = 0;
float avg = 0.0f;;
//...
stats( m[2], 5, &max, &min, &avg );
printf( "max = %dn", max );
printf( "min = %dn", min );
printf( "average = %fn", avg );
使用指针作为函数参数时要小心。如果你有这样的内容:
int func(int *max){
}
这里的max是一个需要保存地址的指针。所以在这个函数内部,当你需要使用它时,你需要通过使用*
来解引用它。例如:
int func(int *max){
*max = $someAddress
}