Преобразование указателя в многомерный массив в стиле C в C ++ 11 - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть функция, которая получает указатель на массив в стиле C.Когда я явно устанавливаю тип переменной twoDArray и затем компилирую код с помощью Clang, я получаю следующую ошибку:

main.cpp:8: error: variable-sized object may not be initialized
const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};

Когда я закомментирую строку и использую закомментированную часть, код скомпилируетсяправильно.Когда я использую g ++ для компиляции кода, будут приняты оба варианта.

Это ошибка в компиляторе Clang, или g ++ принимает некоторый код в этом случае, который является нестандартным?

#include <iostream>

using namespace std;

void printVector(const double *cVector, const size_t dim1, const size_t dim2)
{
    const double (&threeDArray)[dim1][dim2]{*reinterpret_cast<const double (*)[dim1][dim2]>(cVector)};
//    auto threeDArray{*reinterpret_cast<const double (*)[dim1][dim2]>(cVector)};
}

int main()
{
    const size_t VEC_SIZE{2};
    double cVector[VEC_SIZE][VEC_SIZE]{{1.1, 2.2}, {3.3, 4.4}};
    size_t vecSize{VEC_SIZE};
    printVector(&cVector[0][0], vecSize, vecSize);
    return 0;
}

1 Ответ

0 голосов
/ 04 декабря 2018

Это нестандартное расширение g ++, позволяющее g ++ принимать код.g ++ позволяет вам объявить VLA (массив переменной длины), который не является частью стандарта C ++.Чтобы сделать этот код совместимым со стандартом, вы можете переместить dim1 и dim2 в параметры шаблона и передать их как константы времени компиляции, такие как:

template<size_t dim1, size_t dim2, typename T>
void printVector(const T *cVector)
{
    const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};
//    auto twoDArray{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};

    std::cout << "Printing 2D array:  " << std::endl;
    for(int i = 0; i < dim1; i++) {
        for (int j = 0; j < dim2; j++) {
            std::cout << twoDArray[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main()
{
    const size_t VEC_SIZE_CONST{2};
    double cVector[VEC_SIZE_CONST][VEC_SIZE_CONST]{{1.1, 2.2}, {3.3, 4.4}};
    printVector<VEC_SIZE_CONST, VEC_SIZE_CONST>(&cVector[0][0] );
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...