我有以下c
函数声明:
float Sum2d( const unsigned int nRows, const unsigned int mCols, float arr[nRows][mCols] )
{
float sumAll = 0;
// I would like to make this change illegal!
arr[0][0] = 15;
for (int i = 0; i < nRows; i++)
for (int j = 0; j < mCols; j++)
sumAll += arr[i][j];
return sumAll;
}
使用代码:
int main()
{
// define a 2d float array
float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};
// calculate the sum
float sum = Sum2d(3, 2, myArr2d);
// print the sum
printf("%f\n", myOpResult);
// return 1
return 1;
}
此功能运行良好,但存在一个问题:arr
功能中可以更改Sum2d()
的元素。
如何更改Sum2d()
的原型以防止对arr's
元素进行任何更改?
答案 0 :(得分:3)
具有const
限定条件的多维数组很难处理。基本上你可以选择在每个调用端转换非const数组,以完全避免这些const
数组作为参数,或者通过使用一些复杂的宏来偏离。这是一个较长的故事,您可以阅读here。
答案 1 :(得分:1)
我不知道你正在使用什么编译器,但这不能编译为C或C ++。
但无论如何,只要制作arr const就足够了。
答案 2 :(得分:-2)
将函数的原型更改为使用const with float
你也在数组参数中指定了nRows / nCols,这在C中是不允许的。如果你不知道数组的边界,请使用双指针。
此方法不会阻止函数中的类型转换。
#include <stdio.h>
float Sum2d( const unsigned int nRows, const unsigned int mCols, const float arr[][2] )
{
float sumAll = 0;
// I would like to make this change illegal!
//arr[0][0] = 15;
for (int i = 0; i < nRows; i++)
for (int j = 0; j < mCols; j++)
sumAll += arr[i][j];
return sumAll;
}
int main()
{
// define a 2d float array
float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};
// calculate the sum
float sum = Sum2d(3, 2, (const float (*)[2])myArr2d);
// print the sum
printf("%f\n", sum);
// return 1
return 1;
}
由于您使用以下命令行,我想:
gcc <file.c> -o out -std=c99
Running on Debian Squeeze
$ gcc array.c -o array -std=c99
$ gcc --version
gcc (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.