错误消息"预期'float ***'但参数类型为'float *'

时间:2018-05-30 11:17:44

标签: c pointers

我有这段代码:

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){

有什么想法吗?

3 个答案:

答案 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