Копировать массивы разных типов
От: Sergey_BG Россия  
Дата: 04.01.20 12:57
Оценка:
Здравствуйте.

Подскажите пожалуйста. Надо скопировать из массива заданного указателем на 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);
Сергей
Re: Копировать массивы разных типов
От: rg45 СССР  
Дата: 04.01.20 13:07
Оценка: 2 (1)
Здравствуйте, Sergey_BG, Вы писали:

S_B>Подскажите пожалуйста. Надо скопировать из массива заданного указателем на double данные в массив фиксированной длины float.

S_B>Я пытаюсь использовать stl std::copy. Но появляются предупреждения. Достаточно массивные. И они практически полностью заполняют лог. Вдобавок нет никаких проверок длины массива и т.п.

Ну, причина появления предупреждений понятна — это потенциальное переполнение при конвертации double во float. Корректнее в этом случае было бы использовать transform. Деградации производительности, я полагаю, не будет, при включенных оптимизациях. Но, если ты уверен, что переполнения не возникнет, то можно оставить и copy, просто задавить локально сответствующие предупреждения при помощи #pragma warning push/disable/pop.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Копировать массивы разных типов
От: Sergey_BG Россия  
Дата: 04.01.20 20:35
Оценка: +1
Здравствуйте, 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); });
    }


Само собой, индексы должны быть корректные, дабл не должен переполнять флоат. Если не так, то это исключение.
Сергей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.