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); });
    }


Само собой, индексы должны быть корректные, дабл не должен переполнять флоат. Если не так, то это исключение.
Сергей
Копировать массивы разных типов
От: 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);
Сергей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.