вектор вне диапазона при преобразовании в короткий

#c #vector #reinterpret-cast

Вопрос:

У меня есть этот код:

 int main()
{
    std::vector<unsigned char> cVec{ 'a','r','t','u' };
    std::vector<unsigned short>sVec;

    sVec = { reinterpret_cast<unsigned short*>(amp;cVec[0]), reinterpret_cast<unsigned short*>(amp;cVec[cVec.size()-1]) };
    for (auto i : sVec)
        std::cout << i << 'n';
    return 0;
}
 

но когда я запускаю его, у меня возникает эта ошибка:

 vector out of range
 

как я могу решить эту проблему?

Спасибо

Комментарии:

1. Это одно огромное Неопределенное Поведение. Что именно вы пытаетесь сделать? sVec должно быть 1, 2 или 4 элемента?

2. 2 элемента. Естественно, он должен взять a и r и преобразовать их в короткое то же самое для 2 других

3. Символ-1 байт, короткий-2 байта. Вы берете адрес первого элемента и переосмысливаете указатель на символ как указатель на короткий, и делаете то же самое с последним элементом? Таким образом, вместо того, чтобы иметь по одному элементу на каждом новом адресе, вы ожидаете по одному на каждом другом адресе памяти, но все равно ожидаете найти 4 элемента? Векторы не являются ковариантными. Вы не можете преобразовать вектор<символ> в вектор<символ><короткий> таким образом.

4. @Бесполезно to see shorts containing two consecutive chars

5. @MariusBancila какой способ я могу использовать для ее решения?

Ответ №1:

вы передаете конструктору указатели на первый и последний символ std::vector . Указатели должны быть на первый и один после последнего символа. Поскольку расстояние между двумя указателями, которые вы передаете, не равно целому числу short s, код имеет неопределенное поведение. Следующий код должен устранить проблему:

 #include <vector>
#include <iostream>

int main()
{
    std::vector<unsigned char> cVec{ 'a','r','t','u' };
    std::vector<unsigned short>sVec;

    sVec = { reinterpret_cast<unsigned short*>(cVec.data()), reinterpret_cast<unsigned short*>(cVec.data()   cVec.size()) };
    for (auto i : sVec)
        std::cout << i << 'n';
    return 0;
}
 

Обратите внимание, что вы не можете использовать amp;cVec[cVec.size()] , так как это тоже имеет неопределенное поведение.

Комментарии:

1. Спасибо за этот ответ

2. если я буду работать с поплавками, это будет то же самое? std::vector<float>sVec; sVec = { reinterpret_cast<float*>(cVec.data()), reinterpret_cast<float*>(cVec.data() cVec.size()) };

3. да с обычными оговорками о неопределенном поведении от reinterpret_cast

Ответ №2:

То, что вы пытаетесь сделать, вероятно, заключается в следующем:

 int main()
{
   std::vector<unsigned char> cVec{ 'a','r','t','u' };

   unsigned short* ptr = reinterpret_cast<unsigned short*>(amp;cVec[0]);
   std::vector<unsigned short> sVec{ ptr, ptr   cVec.size() / sizeof(unsigned short) };
   for (auto i : sVec)
      std::cout << i << 'n';
}
 

Комментарии:

1.почему я не могу сделать следующее: unsigned short* ptr1 = reinterpret_cast<unsigned short*>(amp;cVec[cVec.size()]); std::vector<unsigned short> sVec{ ptr, ptr ptr1 };

2. @Gigo cVec[cVec.size()] имеет неопределенное поведение, поскольку оно выходит за рамки вектора