我试图声明一个指向2d浮点矩阵的指针,以便获得我的图像数据的动态行为,但我有一个编译错误C2057:期望的常量表达式。我认为指针必须以这种方式进行,但显然不是..请有人帮我吗?谢谢!
//Image size input
int imheight;
int imwidth;
cout << "Please, enter image height: \n>";
scanf ("%d",&imheight);
cout << "Please, enter image width: \n>";
scanf ("%d",&imheight);
const int imheight2 = imheight;
const int imwidth2 = imwidth;
float *zArray[imheight2][imwidth2];
这是我尝试访问zArray的其他功能之一。我没有正确阅读数据:
void LoadRIS( char* inputFileName , float** zArray, int imageHeight , int imageWidth){
// Load input RIS file
FILE* lRis = fopen ( inputFileName, "rb" );
// Jump to data position
for (int i = 0; i < 88; i++){
uchar a = getc (lRis);
}
// Read z array
size_t counter = fread ( *zArray , 1 , imageHeight * imageWidth * sizeof(zArray) , lRis );
//Get max value of RIS
float RISmax = zArray [0][0];
float RISmin = zArray [0][0];
for (int i=0; i<imageHeight; i++)
{
for (int j=0; j<imageWidth; j++)
{
if (zArray[i][j] > RISmax)
RISmax = zArray [i][j];
if (zArray[i][j] < RISmin)
RISmin = zArray [i][j];
}
}
std::cout<<"The max value of the RIS file is: "<<RISmax<<"\n";
std::cout<<"The min value of the RIS file is: "<<RISmin<<"\n";
Beep(0,5000);
// Close input file
fclose (lRis);
}
答案 0 :(得分:2)
const int imheight2 = imheight;
const int imwidth2 = imwidth;
它不会产生常量表达式。您无法创建具有此类边界的数组。您应该使用dynamic-allocation
或vector
。
答案 1 :(得分:2)
问题在于您宣布了2个const int
个变量,但是您没有为它们分配const
个值。 imheight
和imwidth
不是一成不变的。
如果你对STL很好:
std::vector<std::valarray<float> > floatMatrix;
编辑:仅为了您的信息,我在上面一行代码中的>
之间放置的空间与我的编码风格无关。您的编译器可能会认为>>
是右移位运算符而不是2个模板参数列表终止符。 Angew的评论总结如下。
答案 2 :(得分:2)
而不是float *zArray[imheight2][imwidth2];
它应该是:
float **zArray = new float*[imheight2];
for(int i=0; i<imheight2; i++)
{
zArray[i] = new float[imwidth2];
}
答案 3 :(得分:1)
如果 要执行此操作,请至少将其编码为:
float **zArray = new float*[imheight];
float *tmp = new float[imheight*imwidth];
for(int i=0; i<imheight; i++, tmp += imwidth)
zArray[i] = tmp;
...
delete[] *zArray;
delete[] zArray;
这至少可以避免执行两次new
/ delete[]
次呼叫。如果内存不连续,它会保留fread(*zArray, ...)
中断的功能(如果通过许多new
调用初始化它,通常不会这样)。
一个正确的包装器类只会执行一个new
/ malloc
,例如:
template <class T> class Array2D {
private:
size_t m_x;
T* val;
public:
Array2D(size_t x, size_t y) :
m_x(x)),
val(new T[x*y]) {}
~Array2D() { delete[] val; }
T* operator[](size_t y) { return val + y*m_x; }
}
您仍然无法将此实例分配给float**
。它仍然在堆上分配,其中普通的常量维数组可以在堆栈上。 float**
附加分配的唯一优点是你不必使用乘法运算 - 而是使用单独的内存访问;这种行为可以模板化/追踪到包装类中。
一般来说,我更偏向于multidimensional arrays are evil(另请参阅https://stackoverflow.com/a/14276070/512360或C++ FAQ, 16.16),但口味各不相同......
答案 4 :(得分:0)
您不能使用动态大小的数组(您的宽度和高度变量不是编译时间常量)。
您可以使用malloc()或new Operator以动态方式分配Memory。
答案 5 :(得分:0)
试试这个(动态分配)
//Image size input
int imheight;
int imwidth;
cout << "Please, enter image height: \n>";
scanf ("%d",&imheight);
cout << "Please, enter image width: \n>";
scanf ("%d",&imwidth);
float** zArray = new float*[imheight];
for(int i=0;i<imheight;i++){
zArray[i] = new float[imwidth];
}
当然,您需要通过以下方式释放分配:
for(int i=0;i<imheight;i++){
delete[] zArray[i];
}
delete[] zArray;
希望这会有所帮助:)
P.S。正如@FrankH所说,这会占用太多new
和delete
s,浪费了大量时间。更好的想法应该是将imwidth * imheight space分配到一起。
答案 6 :(得分:-1)
float *pMatrix = new float[imheight2*imwidth2];
然后访问这样的元素
float f = pMatrix[x*y];