我有一个巨大的2d数组,我试图传递给一个函数。这是阵列:
int image[13][13] =
{
{ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72 },
{ 72, 72, 71, 70, 70, 70, 70, 70, 70, 70, 70, 72, 72 },
{ 72, 107, 116, 145, 137, 130, 154, 118, 165, 111, 173, 116, 72 },
{ 72, 126, 150, 178, 158, 175, 163, 169, 170, 160, 176, 163, 70 },
{ 72, 130, 192, 195, 197, 186, 129, 185, 196, 196, 193, 195, 70 },
{ 72, 126, 187, 166, 85, 75, 106, 185, 191, 191, 189, 188, 69 },
{ 72, 121, 183, 111, 100, 51, 137, 188, 187, 186, 184, 180, 69 },
{ 72, 117, 177, 143, 58, 77, 137, 180, 171, 183, 178, 173, 69 },
{ 72, 111, 172, 108, 101, 110, 115, 67, 49, 120, 175, 165, 68 },
{ 72, 107, 145, 105, 145, 120, 85, 51, 51, 56, 138, 157, 68 },
{ 72, 103, 147, 158, 155, 131, 115, 114, 114, 115, 121, 152, 68 },
{ 72, 79, 146, 161, 163, 165, 168, 167, 164, 162, 158, 114, 70 },
{ 72, 69, 53, 49, 49, 49, 49, 49, 49, 49, 50, 61, 72 }
};
我将此函数声明为:
int max_2d(int p_valeurs[13][13]);
int max_2d(int p_valeurs[13][13])
{
int valeur_max;
for (int i = 0; i < 13; i++)
{
int max_local = max(p_valeurs[i], LARGEUR);
if (valeur_max < max_local)
{
valeur_max = max_local;
}
}
return valeur_max;
}
int max(int p_valeurs[]);
int max(int p_valeurs[], int p_taille)
{
int valeur_max;
for (int i = 0; i < p_taille; i++)
{
if (valeur_max > p_valeurs[i])
{
valeur_max = p_valeurs[i];
}
}
return valeur_max;
}
我的问题是,当我在image
函数中传递max_2d
2d数组时,数组变为int(*)[13]。我不明白发生了什么,有什么不对。任何人都可以帮助我吗?
修改
请记住,这是学生的工作。我需要了解什么是错的,我该如何解决这个问题。谢谢!
答案 0 :(得分:2)
我在代码中看到了几个逻辑错误:
valeur_max
未在这些函数中初始化:这是不允许的(您无法与未初始化的值进行比较)。
在第二个函数中,变量名为valeur_max
,但比较保持最小值(如果它变大则更新valeur_max
。
对于C ++中的问题标题,数组在传递给函数时会隐式转换为指向第一个元素的指针。 如果你真的想按值传递数组,你需要将它包装在一个结构中(注意,通过复制只是为了找到最大值似乎是一个废话)。
2D数组在C ++中只是一个数组数组,因此当传递给函数时,传递的值变为指向数组(行)的指针。那是int(*)[13]
的意思......指向13个整数数组的指针。
对于C ++编译器来说,这两个声明
void foo(int x[30]);
和
void foo(int *x);
完全相同(是的,数字完全被忽略)。
请注意,这种隐式转换(或者#34; decay&#34;正如标准所描述的那样)并不会影响元素访问,而只会影响数组的复制;例如,只在一个函数中执行2d处理的版本可以是:
int max_2d(int p[13][13]) {
int max_val = INT_MIN;
for (int i=0; i<13; i++) {
for (int j=0; j<13; j++) {
if (max_val < p[i][j]) {
max_val = p[i][j];
}
}
}
return max_val;
}
答案 1 :(得分:1)
这是C和C ++中的经典问题,其中数组不能通过值传递。但是,它们可以通过C ++中的引用传递:
int max_2d(int (&p_valeurs)[13][13]);
p_valuers
的类型正确。但请记住,这是参考。您所做的任何更改(例如p_valuers[3][7]++;
)都会反映在呼叫网站上。
(在C中,我会向类型安全解决方案传入指向数组int max_2d(int (*p_valeurs)[13][13]);
的指针。)
但这对您来说不是问题,因为您没有在p_valuers
函数中修改max_2d
。实际上,为清晰起见,您应明确将其标记为const
。
int max_2d(const int (&p_valeurs)[13][13]);
最后,我说数组不能通过C或C ++中的值传递。当您尝试按值传递数组时,它将传递指向数组的第一个元素的指针。此外,当编译器在函数的参数列表中看到数组时,它会自动转换&#34;顶层&#34;数组到指针int x[13][13]
到int (*x)[13]
。这意味着出现的函数来获取数组实际上需要一个指针。但我们可以通过多种方式阻止此行为,例如在C ++中使用引用。