繁体   English   中英

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};

我已经宣布了 function:

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);
                     ^

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

由于这个 typedef 声明

typedef float mat[4][4];

arrays 声明喜欢

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};

在这种情况下,function 应该声明为

void get_input( float ( ** matrices)[4] );

并称呼

get_input( matrices );

或者喜欢

mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };

在最后一种情况下,function 被称为

get_input( matrices );

还有 function get_input声明为

void() get_input(mat** matrices);

实际上相当于

void() get_input( float ( ** matrices )[4][4]);

但在 function 的这个电话中

get_input(&matrices);

参数具有类型

float( * ( * ) [3])[4][4]

改变

mat *matrices[3] = {MAT_A, MAT_B, MAT_C};

mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM