警告:ISO C ++禁止变长数组[-Wvla]

时间:2018-06-06 19:20:30

标签: c++ arrays multidimensional-array casting

#include <iostream>

using namespace std;

int main()
{

    float q[10]={1,2,3,4,5,6,7,8,9,10};
    int numrows=2, numcols=5;
    float (*p)[numcols]=(float(*)[numcols])q;
    for(int i=0;i<numrows;i++)
        for(int j=0;j<numcols;j++)
            printf("p[%d][%d]=%f \n", i, j, p[i][j]);


    return 0;
}

问题报复:

g++ -pedantic problem1.cpp 

问题:

对于上面的代码,我们可以看到警告警告:ISO C ++禁止变长数组。我们知道这是预期的警告。我的目的是使用指针重定向并且没有任何循环将1D缓冲区p更改为2D缓冲区q。我是通过使用

完成的
float (*p)[numcols]=(float(*)[numcols])q;

但它会发出警告。是否对同一操作有任何建议,或者我们可以使用相同的线来获取动态值?

1 个答案:

答案 0 :(得分:1)

您不需要更改有关1D阵列的任何信息,但您只需要以不同方式访问它。这就是我能想出的最接近你似乎要求的东西:

#include <iostream>
using namespace std;

template <typename T> struct twoD_access {
    T* first_elem;
    size_t col_count;
    T* operator[](size_t row){ return first_elem + (row*col_count);}
};
template <typename T> twoD_access<T> get_2D_access(T* ptr,size_t col_count){
    return { ptr,col_count};
}


int main() {
    float q[10]={1,2,3,4,5,6,7,8,9,10};
    auto x = get_2D_access(q,3);
    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
            std::cout << x[i][j];
        }
    }
    return 0;
}

打印

123456789

PS:只是现在我读到你正在做这个以进行优化。我的建议:就是不要这样做。实际上我真的不明白你为什么期望通过神奇地将一维阵列变成二维阵列来获得更好的性能。在优化时,编译器通常比人类好得多。特别是当涉及到有效访问数组这样的基本内容时,编译器有几个世纪的经验,很难赶上。你可能应该看看std::vector并忘记所有指针怀旧。