Здравствуйте.
Подскажите пожалуйста. Надо скопировать из массива заданного указателем на double данные в массив фиксированной длины float.
Я пытаюсь использовать stl std::copy. Но появляются предупреждения. Достаточно массивные. И они практически полностью заполняют лог. Вдобавок нет никаких проверок длины массива и т.п.
Используя VS2013 и ранее я использовал специальные классы для проверки длины. Правда оставались предупреждения о приведении типа. Но VS2015 на этом поставила крест.
Искал в инете, перечитал MSDN но пока ответа не нашёл.
Как сейчас принято копировать массивы разного типа заданные указателем на первый элемент?
double *P0 = …;
float vector[14] = {0};
//auto itBegin = stdext::make_checked_array_iterator((double*)P0, 3);
//auto itEnd = stdext::make_checked_array_iterator((double*)P0, 3, 3);
//auto itOut = stdext::make_checked_array_iterator(vector, _countof(vector), 4);
std::copy(P0, P0 + 3, vector + 4); // std::copy(stdext::checked_array_iterator<double*>(P0, 3), stdext::checked_array_iterator<double*>(P0, 3)+3, vector + 4);
Здравствуйте, Sergey_BG, Вы писали:
S_B>Подскажите пожалуйста. Надо скопировать из массива заданного указателем на double данные в массив фиксированной длины float.
S_B>Я пытаюсь использовать stl std::copy. Но появляются предупреждения. Достаточно массивные. И они практически полностью заполняют лог. Вдобавок нет никаких проверок длины массива и т.п.
Ну, причина появления предупреждений понятна — это потенциальное переполнение при конвертации double во float. Корректнее в этом случае было бы использовать
transform. Деградации производительности, я полагаю, не будет, при включенных оптимизациях. Но, если ты уверен, что переполнения не возникнет, то можно оставить и copy, просто задавить локально сответствующие предупреждения при помощи #pragma warning push/disable/pop.
Здравствуйте, rg45, Вы писали:
R>Корректнее в этом случае было бы использовать transform.
Спасибо. Думал об этом, но как то не решался попробовать. Инерция мышления. Копи, значит, копи.
Написал, компилируется:
template<class InType, class OutType, size_t Size>
void copyPointerToArray(InType *inIt, size_t count, OutType (&outIt)[Size], size_t insertPos)
{
auto itBegin = stdext::make_checked_array_iterator(inIt, count);
auto itEnd = stdext::make_checked_array_iterator(inIt, 3, count);
auto itOut = stdext::make_checked_array_iterator(outIt, Size, insertPos);
std::transform(itBegin, itEnd, itOut, [](InType x) -> OutType { return static_cast<OutType>(x); });
}
Само собой, индексы должны быть корректные, дабл не должен переполнять флоат. Если не так, то это исключение.