Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何声明指向二维浮点矩阵的指针?_C++_Pointers - Fatal编程技术网

C++ 如何声明指向二维浮点矩阵的指针?

C++ 如何声明指向二维浮点矩阵的指针?,c++,pointers,C++,Pointers,我试图声明一个指向2d浮点矩阵的指针,以便图像数据具有动态行为,但我有一个编译错误C2057:预期的常量表达式。我原以为指针必须用那种方式浇铸,但显然不是。。请问有人能帮我吗?谢谢 //Image size input int imheight; int imwidth; cout << "Please, enter image height: \n>"; scanf ("%d",&imheight); cout << "Please, ente

我试图声明一个指向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);
}


它不会生成常量表达式。不能创建具有此类边界的数组。您应该使用动态分配或向量。

问题是您正在声明2个常量int变量,但没有为它们分配常量值。imheight和imwidth不是常数

如果您对STL满意:

std::vector<std::valarray<float> > floatMatrix;

编辑:仅供参考,我在上面代码行的>之间放置的空格与我的编码风格无关。编译器可能会假定>>是右移位运算符,而不是2个模板参数列表终止符。Angew下面的评论总结了这一点。

您不能使用具有动态大小的数组。您的宽度和高度变量不是编译时常量

您可以使用malloc或new运算符以动态方式分配内存。

float*pMatrix=new float[imheight2*imwidth2]

然后访问这样的元素

浮动f=pMatrix[x+imwidth2*y]

代替float*zArray[imheight2][imwidth2]; 应该是:

float **zArray = new float*[imheight2];

for(int i=0; i<imheight2; i++)
{
    zArray[i] = new float[imwidth2];
}

试试这个动态分配

//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;
希望这有助于:

另外,正如@FrankH所说,这会调用太多的新闻和删除,浪费了很多时间。更好的办法是将imwidth*imheight空间分配在一起。

如果必须这样做,那么至少将其编码为:

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;
您仍然无法将此实例分配给浮点**。它仍然在堆上分配,普通的常量维度数组可以在堆栈上。浮点**的额外分配的唯一优点是,您不必使用乘法运算,而是使用单独的内存访问;这种类型的行为可以模板化/跟踪到包装器类中


一般来说,我更倾向于see ALLOW,或者说口味各异……

除了答案所说的以外,这种类型是一个2D指针数组,而不是指向2D数组的指针。您可能需要float*zArray[imheight2][imwidth2];。这个问题被标记为C和C++,但是答案是不同的。C支持可变长度数组已经有一段时间了,所以小的可变长度数组可以而且应该用float foo[r][C]定义;。其中一个标签应该被删除。对>>的旧解释不是一个bug,C++03就是这样定义的,尽管许多编译器支持将>>视为>>的扩展。第一个C++ 11使这个解析合法,所以现在编译器对于编译器的理解是强制的,因为模板应该是一个矩阵,所以我认为它应该是一个矩阵,我会考虑STD::ValSalm而不是STD::vector。我想我可以把最后一个语句改为更一般,这样我就可以避免误报。anyone@EricPostpischil:的确,但是在C++中,它们还不能用来指定数组的大小,这是个问题。问题是变量是常量,但它们的值不是常量表达式,因此不能用于声明数组。这正是第一句话所说的。我想你的意思是y*宽度+ x-你是正确的,但是我认为Nicolai很可能使用C++,因为可变长度数组不会导致C中的编译器错误C2057。因此,这个问题的答案是正确的。即使是代码示例也有缺陷,FreeDynamicArray泄漏了nRows-1*nCols T单位。在C/C++中使用“动态多维数组”是不对的。坚持使用std::vector和/或使用/实现一个适当的矩阵类-使用运算符int,而不是[][]。关于该网站,您确实是对的。我将删除此链接,因为此功能可能会使人困惑。但是:没有人应该再学习如何使用动态内存了,因为我们有了STLX使用C++的人,尤其是当使用C时,当然应该知道处理一个或多个数组!你迟早会被要求知道这些东西,即使你试图避免在自己的代码中使用它;您需要了解C/C++N-D数组既不是数组也不是矩阵,尽管其语法具有欺骗性。此外,在C/C++中,动态N-D数组和静态定义的N-D数组即使具有相同的维度,也无法生成兼容的类型。推论:如果你需要N-D数组,你真的需要一个矩阵/张量类,否则涉及的多个new/delete使得处理错误非常困难。。。许多人尝试{}捕获{}块。推测STL为什么不提供任何可能是另一个问题的好话题-我是科伦
在一个项目中,我们存储N,其中N在大小为M的执行向量期间发生变化,该向量不会发生变化,以防止系统在优化过程中返回到已访问的状态。这实际上是一个NxM值矩阵,其中行数不断变化,在执行过程中添加和删除向量。连续存储可能需要在每次大小更改时移动/复制所有值,也可能需要预分配非常大的内存块。我们使用向量向量,但这只是一个包装的动态2D数组。非常好,谢谢!顺便问一下,如何从另一个函数访问双指针浮点**的值?是的crashing@Nicolai你是说访问2d数组中的值?仅仅使用zArray[i][j]就可以了。我想知道整个代码,你能编辑问题并粘贴你的“另一个函数”代码吗?嗨,洪涛,刚刚在问题中粘贴了一个函数。我现在没有崩溃,但我无法正确读取文件并将其加载到我的zArrayouch中。imheight+1调用new,没有比使用array[x][y]语法更好的理由了。容易出错的删除循环您没有将“2D数组”的大小存储在它旁边,因此需要一个全局变量。。。。并不是所有技术上可行的都是答案。至少,只使用两个new/delete[]调用,float*tmp=newfloat[imwidth*imheight];fori=0;我
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;
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; }
}