我有这段代码:
void checkmat(float *** mat,float * max,float * min){
float sum=0,sum2=0,flag=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum+=(*mat[i][j]);
sum2+=(*mat[j][i]);
}
if(sum>(*max))
(*max)=sum;
if(flag){
(*min)=sum;
flag=0;
}
if(sum2<(*min))
(*min)=sum2;
sum=0;
sum2=0;
}
}
int main(){
float mat[n][n]={{1,2,3,4},{5,6,7.6,8},{9,1,2.9,3},{4,5,6,7}};
float min=0,max=0;
checkmat(&mat,&max,&min);
printf("%f is max %f is min \n",max,min);
}
目前,代码的作用并不重要。我对为什么从编译器收到此错误消息感兴趣:
test3.c: In function ‘main’:
test3.c:38:10: warning: passing argument 1 of ‘checkmat’ from incompatible pointer type [-Wincompatible-pointer-types]
checkmat(&mat,&max,&min);
^
test3.c:8:6: note: expected ‘float ***’ but argument is of type ‘float (*)[4][4]’
void checkmat(float *** mat,float * max,float * min){
有什么想法吗?
答案 0 :(得分:1)
正如@Quentin所提到的,两个变量之间存在差异。
float ***
这是指向指针的指针。我假设您使用了这个,因为您认为这是存储数组的方式。一个常见的误解是2D数组总是指向数组的指针数组。
而是指向2D数组的指针应写为:
float (*)[][height]
在这些情况下,2D数组存储在列后列存储器中(当处于列主模式时)。因此,如果您声明了一个2D数组:
float arr[5][10];
然后以下将是真的
arr == arr[0]
因为变量'arr'指向2D数组的第一个元素,它也是第一列的开头。
此外,您不需要创建指向数组的指针,因为数组变量本身已经是指针。因此,要回答您的问题,您的函数参数声明不正确。它应该是:
void checkmat(float mat[M][N],float * max,float * min){...}
注意:您需要在函数中指定数组大小。
答案 1 :(得分:0)
您不需要任何***指针
#include <stdio.h>
#include <float.h>
void checkmat(float * mat,float * max,float * min, size_t cols, size_t rows){
float sum=0,sum2=0,flag=1;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
sum+=(mat[i * cols + j]);
sum2+=(mat[i * cols + j]);
}
if(sum > *max)
*max=sum;
if(flag){
*min=sum;
flag=0;
}
if(sum2< *min)
*min =sum2;
}
}
int main()
{
float mat[4][4]={{1,2,3,4},{5,6,7.6,8},{9,1,2.9,3},{4,5,6,7}};
float min=FLT_MAX,max=-FLT_MAX;
checkmat((&mat[0][0],&max,&min, sizeof(mat) / sizeof(mat[0]), sizeof(mat[0]) / sizeof(mat[0][0]));
printf("Size of the matrix is %zu x %zu. %f is max %f is min \n", max, min, sizeof(mat) / sizeof(mat[0]), sizeof(mat[0]) / sizeof(mat[0][0]));
}
答案 2 :(得分:0)
经常错误地说指针和数组在C中是等价的。你的代码就是这种情况的一个例子。
在大多数情况下,数组会衰减为指向其第一个成员的指针。这仅适用于最外面的数组维度。例如,df.pivot_table('value', ['date', 'datetime', 'year', 'month', 'date.1'], 'name').reset_index()
name date datetime year month date.1 A1 B1 C1
0 20170430 2017-04-30 18:30:00 2017 4 30 NaN NaN 32.1
1 20170430 2018-02-07 18:30:00 2018 2 7 NaN 1.23 NaN
2 20170501 2017-05-01 18:30:00 2017 5 1 121.2 NaN NaN
3 20170501 2017-07-10 18:30:00 2017 7 10 NaN NaN 42.2
(float [4]
的数组将衰减为float
。但float *
是一个float [4][4]
数组衰变为float [4]
(即指向float (*)[4]
数组的指针),不 a float [4]
。
在您的情况下,您将float **
(类型为&mat
)传递给期望float (*)[4][4]
的函数。这些类型不兼容,因此错误。
定义函数的正确方法是:
float ***
这样您就可以将2D数组与每个维度的大小一起传递给函数。
然后在函数中使用void checkmat(int rows, int cols, float mat[rows][cols] ,float * max,float * min)
,如下所示:
mat
你调用这样的函数,直接传递 sum += mat[i][j];
sum2 += mat[j][i];
而不是它的地址及其尺寸:
mat