gpt4 book ai didi

C-将矩阵传递给没有非常量列值的函数

转载 作者:行者123 更新时间:2023-11-30 14:44:55 24 4
gpt4 key购买 nike

我想将矩阵传递给C中的函数。如果我想让矩阵的维度变得非常量(例如,让用户通过键盘插入NxM维度),我对此没有任何问题。但是,当我尝试将其传递给函数时,我遇到了一些问题:

- 必须在以矩阵作为参数的函数的标题中指定列数。如果我省略这个值,我会得到:

error: array type has incomplete element type ‘int[]’ void trasposeMatrix(int M[][],int n,int m) esercizi.c:282:25: note: declaration of ‘M’ as multidimensional array must have bounds for all dimensions except the first

使用此功能:

void trasposeMatrix(int M[][],int n,int m)
{
int temp=0;
int M2[n][m];

printf("La matrice prima della trasposizione è: \n");
printMatrix(M,3,3);

for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
M2[i][j]=M[j][i];
}
}

printf("La matrice dopo la trasposizione è: \n");
printMatrix(M2,3,3);
}

通过此调用:

trasposeMatrix(M,3,3);

-这个值必须是常量,否则如果我将参数作为值放在这些括号中,我会收到此错误:

esercizi.c: At top level: esercizi.c:282:29: error: ‘m’ undeclared here (not in a function) void trasposeMatrix(int M[][m],int n,int m)

使用相同的调用和此代码:

void trasposeMatrix(int M[][m],int n,int m)
{
int temp=0;
int M2[n][m];

printf("La matrice prima della trasposizione è: \n");
printMatrix(M,3,3);

for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
M2[i][j]=M[j][i];
}
}

printf("La matrice dopo la trasposizione è: \n");
printMatrix(M2,3,3);
}

使用常量指定矩阵维度可以“避免”这种情况。但我不喜欢这种“约束”。最后,如果我通过函数打印矩阵怎么办:如果尺寸可变,我应该在函数头中写什么?我编写的用于打印矩阵的函数对于 3x3 矩阵效果很好,但对于 2x2 矩阵和 3x4 矩阵该怎么办。也许你明白了

注意:这种情况不会发生在我只写一个标题的数组中,例如:void printArray(int a[], intDimension){} 这有效。我不知道为什么。也许是由他的发明者决定的 C 设计行为,但我希望不是因为太乏味了

注2::)我使用带有gcc的linux mint (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0但是使用 VS for Win10 我什至无法将变量作为数组的维度:(

对于这么长的消息,我深表歉意,但我希望能得到答复。感谢您的阅读

最佳答案

在函数调用中在数组之前传递数组维度。此功能已添加到 C99(因此也在 C11 和 C18 中);它不是标准 C++ 的一部分。这意味着“那里”有一些编译器仍然不支持该表示法。

你有:

void trasposeMatrix(int M[][m],int n,int m)
{

您需要:

void trasposeMatrix(int n, int m, int M[n][m])
{

或者也许:

void trasposeMatrix(int n, int m, int M[][m])
{

但我认为指定两个维度的先前版本更清楚地表达了意图。

在函数声明中(例如,在 header 中),您可以使用定义符号(其中 extern 是可选的,并且偶尔会引起争议 - 有些人不喜欢它,并且那些这样做的人,比如我):

extern void trasposeMatrix(int n, int m, int M[n][m]);

或者你可以古怪地使用:

extern void trasposeMatrix(int n, int m, int M[*][*]);

这告诉编译器矩阵的维度将在运行时确定,但并不表明它们来自哪里。我更喜欢“定义的副本”版本,因为意图更清晰。您不能在函数定义中使用 * 表示法。

如果你想了解“全部内容”,你可以去阅读标准 - C11 §6.7.6.2 Array declarators§6.7.6.2 Function declarators (including prototypes) ——但是这种语言很难解析。

关于C-将矩阵传递给没有非常量列值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53346059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com