ANSI C GCC C90 中矩阵数组指针的警告
Warnings of Pointer to array of matrices In ANSI C GCC C90
我在 Linux 中收到奇怪的警告。
在 Windows 上的 Visual Studio 中,代码编译并运行良好,但我需要使用 GCC c90 编译它,我收到这些警告:
我已经像这样初始化了矩阵:
typedef float mat[4][4];
现在我想创建一个矩阵数组:
mat MAT_A = { 0 };
mat MAT_B = { 0 };
mat MAT_C = { 0 };
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
我已经声明了函数:
void get_input(mat** matrices);
并使用它:
get_input(&matrices);
代码运行良好,但我需要用 gcc c90 编译它。
我收到此警告:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
mat *(*matrices)[3] = {MAT_A, MAT_B, MAT_C};
^~~~~
和
warning: passing argument 1 of ‘get_input’ from incompatible pointer type [-Wincompatible-pointer-types]
flag = get_input(&matrices);
^
由于这个 typedef 声明
typedef float mat[4][4];
数组声明为
mat MAT_A = { 0 };
被隐式转换为其声明中的第一个元素
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
类型 float( * )[4]
。但是变量矩阵被声明为具有元素类型float ( * )[4][4]
。这些类型不兼容。
那实际上你有下面的声明
float ( *matrices[3] )[4][4] = {MAT_A, MAT_B, MAT_C};
你应该像
那样声明数组
float ( *matrices[3] )[4] = {MAT_A, MAT_B, MAT_C};
在这种情况下,函数应该声明为
void get_input( float ( ** matrices)[4] );
并称赞
get_input( matrices );
或喜欢
mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };
在最后一种情况下函数被调用为
get_input( matrices );
还有函数get_input
声明为
void() get_input(mat** matrices);
实际上相当于
void() get_input( float ( ** matrices )[4][4]);
但是在这个函数的调用中
get_input(&matrices);
参数的类型为
float( * ( * ) [3])[4][4]
mat *matrices[3]
是一个包含 3 个指向 mat
的指针的数组。所以需要用 指向 mat.
的指针来初始化它
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
此外,当调用get_input(&matrices);
时,&matrices
是一个指向数组的指针,其中包含3个指向mat
的指针。这不是get_input()
所期望的,什么是指向mat
的指针。只需使用:
get_input(matrices);
表达式 matrices
被转换为指向其第一个元素的指针,该元素是指向 mat
的指针。结果,表达式的类型是指向 mat
的指针,这正是 get_input
所期望的。
现在代码编译时没有警告。参见 https://godbolt.org/z/84qd4rrnx
改变
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
至
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
我在 Linux 中收到奇怪的警告。 在 Windows 上的 Visual Studio 中,代码编译并运行良好,但我需要使用 GCC c90 编译它,我收到这些警告:
我已经像这样初始化了矩阵:
typedef float mat[4][4];
现在我想创建一个矩阵数组:
mat MAT_A = { 0 };
mat MAT_B = { 0 };
mat MAT_C = { 0 };
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
我已经声明了函数:
void get_input(mat** matrices);
并使用它:
get_input(&matrices);
代码运行良好,但我需要用 gcc c90 编译它。 我收到此警告:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
mat *(*matrices)[3] = {MAT_A, MAT_B, MAT_C};
^~~~~
和
warning: passing argument 1 of ‘get_input’ from incompatible pointer type [-Wincompatible-pointer-types]
flag = get_input(&matrices);
^
由于这个 typedef 声明
typedef float mat[4][4];
数组声明为
mat MAT_A = { 0 };
被隐式转换为其声明中的第一个元素
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
类型 float( * )[4]
。但是变量矩阵被声明为具有元素类型float ( * )[4][4]
。这些类型不兼容。
那实际上你有下面的声明
float ( *matrices[3] )[4][4] = {MAT_A, MAT_B, MAT_C};
你应该像
那样声明数组float ( *matrices[3] )[4] = {MAT_A, MAT_B, MAT_C};
在这种情况下,函数应该声明为
void get_input( float ( ** matrices)[4] );
并称赞
get_input( matrices );
或喜欢
mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };
在最后一种情况下函数被调用为
get_input( matrices );
还有函数get_input
声明为
void() get_input(mat** matrices);
实际上相当于
void() get_input( float ( ** matrices )[4][4]);
但是在这个函数的调用中
get_input(&matrices);
参数的类型为
float( * ( * ) [3])[4][4]
mat *matrices[3]
是一个包含 3 个指向 mat
的指针的数组。所以需要用 指向 mat.
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
此外,当调用get_input(&matrices);
时,&matrices
是一个指向数组的指针,其中包含3个指向mat
的指针。这不是get_input()
所期望的,什么是指向mat
的指针。只需使用:
get_input(matrices);
表达式 matrices
被转换为指向其第一个元素的指针,该元素是指向 mat
的指针。结果,表达式的类型是指向 mat
的指针,这正是 get_input
所期望的。
现在代码编译时没有警告。参见 https://godbolt.org/z/84qd4rrnx
改变
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
至
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};