将具有可变维度的二维数组作为函数参数传递

5
我刚在codechef的成功提交中看到了以下代码。 http://www.codechef.com/viewplaintext/1595846 我曾经认为:
float max(int n,int arr[n][n])
{....}

在C ++中不允许使用变量作为数组的长度(因为“n”是一个变量)。我的CodeBlocks(在Windows上)与MinGW [gcc 4.4]编译时会出现错误,即“错误:数组边界不是整数常量。”那么,CodeChef的评判者如何接受这样的解决方案呢?在C ++中是否有任何特殊的标志可以允许我们这样做?编辑:显示AC(已接受)状态的链接:http://www.codechef.com/viewsolution/1595846

这对我来说看起来像是非法的C++。 - goji
1
请参考下面的Abhishek Thakur的答案。这个提交被标记为C,而不是C++,在C中这是合法的(尽管在标准C++中不是)。 - Gorpik
2个回答

5

确实,提交的内容表明它是用C实现的,而不是C++。因此,根据C标准,代码是正确的。 - Gorpik
谢谢。我在C语言中尝试了相同的代码,它可以工作。但是C++呢?它会出现错误。 - TheCrazyProgrammer
@TheCrazyProgrammer,你出现了错误,因为这是合法的C语言,但不是合法的C++语言。C++98几乎是C90的严格超集,但之后出现了C99,并引入了一些额外的功能。C++标准的后续版本并没有把保持与C兼容作为优先事项。 - Gorpik
1
请注意,使用C2011标准后,变长数组现在是可选的;实现决定是否支持它们。GCC可能会继续支持它们,但目前不支持的编译器可能选择不支持。是的,C和C++是不同的语言,具有不同的语义,并且随着时间的推移,它们可能会进一步分化。不要假设任何任意的C代码都可以编译为C ++。 - John Bode

4

我需要更正一下:C99标准允许这样做,不过很多编译器尚未实现,有些可能永远也不会实现(例如Microsoft)。

之前的回答

要么将arr作为int**传递,要么使用类似以下的方法:

template< int N >
float max(const int (&arr)[N][N])
{ ... }

这当然需要N在编译时是一个常量。最安全的解决方案是使用std::vector或其他一些具有大小知识的容器。

总体来说,这段代码对我而言似乎非常脆弱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接