#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()]
имеет неопределенное поведение, поскольку оно выходит за рамки вектора