|
|
  |
вопрос по memcpy |
|
|
|
Dec 2 2015, 11:12
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Сергей Борщ @ Dec 2 2015, 10:55)  Да, осталось pDestArr сделать void const *, а pSrcArr сделать void *. Чтобы этой функцией можно было переворачивать любые данные, в том числе лежащие во флеше. И do { } while(--pSize) заменить на while(pSize--) {} выкинув еще одно условие и упростив исходник. После чего перейти на Си с плюсами, написав шаблон-обертку, следящую за тем, чтобы pDestArr и pSrcArr указывали на одинаковый тип. Щаз вам очередной великий кодер скажет, что использовать void* некошерно, потому что правильные программисты (они не пишут ассертов, да) должны заранее знать тип передаваемого значения в функцию memcpy
|
|
|
|
|
Dec 2 2015, 11:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(CrimsonPig @ Dec 2 2015, 14:12)  должны заранее знать тип передаваемого значения в функцию memcpy  memcopy как раз имеет аргументы void const * и void *. Некторые знают, что это сделано специально для использования неявного приведения типов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 2 2015, 11:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jenya7 @ Dec 2 2015, 14:46)  вылетает ошибка invalid use of void expression Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам: Код void ReverseArray(void * pDestArr, void const * pSrcArr, size_t size) { uint8_t const * from = (uint8_t const *)pSrcArr; uint8_t * to = (uint8_t *)pDstArr + size - 1;
while(size --) *to-- = *from++; }
void test() { char Result[50]; ReverseArray(Result, "Слава мне, победителю драконов!", sizeof("Слава мне, победителю драконов!")); }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 2 2015, 12:37
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Сергей Борщ @ Dec 2 2015, 11:55)  Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам: [code]void ReverseArray(void * pDestArr, void const * pSrcArr, size_t size) Кстати, я бы смотрел на мир ширше. Тут IMHO либо надо явно указать, что функция реверсирует _байты_ в массиве (и тогда использовать явный тип указателей, void* в этом случае, наверное не имеет смысла), либо передавать void* и размер элемента массива заодно.. А то получается некая неопределенность. E.g. void CopyArray_ReverseBytes(uint8_t* apDest, const uint8_t* apSrc, size_t aNumBytes); void CopyArray_Reverse(void* apDest, const void* apSrc, size_t aElemSize, size_t aNumElements);
|
|
|
|
|
Dec 2 2015, 13:02
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Сергей Борщ @ Dec 2 2015, 17:55)  Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам: Код void ReverseArray(void * pDestArr, void const * pSrcArr, size_t size) { uint8_t const * from = (uint8_t const *)pSrcArr; uint8_t * to = (uint8_t *)pDstArr + size - 1;
while(size --) *to-- = *from++; }
void test() { char Result[50]; ReverseArray(Result, "Слава мне, победителю драконов!", sizeof("Слава мне, победителю драконов!")); } я понял. но аргумент можно привести к нужному типу и вне функции. если понадобиться.
|
|
|
|
|
Dec 2 2015, 13:07
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
Цитата do { } while(--pSize) заменить на while(pSize--) {} идите в отдел кадров. скажите, что вы уже некомпетентны. Цитата Щаз вам очередной великий кодер скажет uint8_t - "простейшее". С ним удобна математика указателей. Можно использовать void*, но в теле тогда уже, либо использовать сумбурную запись с приведением типов, либо локально объявить нужные указатели. Вы определитесь уже в своей толпе. Ато один размер сокращает, второй умничает... Хотите напыщенно позвенеть яйцами - вперёд в онлайн тесты по C/C++. Хоть больше "удовлетворительно" наберите. Цитата size_t не может быть меньше нуля это знаковый тип, т.к. используется и для возвращения кода ошибки.
|
|
|
|
|
Dec 2 2015, 14:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jenya7 @ Dec 2 2015, 16:02)  я понял. но аргумент можно привести к нужному типу и вне функции. если понадобится. В почти каждой точке вызова? Вы правда считаете, что засорение исходников такими приведениями типа лучше, чем одно приведение, спрятанное в теле функции? Ваше право. Успехов в сопровождении таких исходников! Цитата(smalcom @ Dec 2 2015, 16:07)  идите в отдел кадров. скажите, что вы уже некомпетентны. А теперь посмотрите на исходник, к котрому это относилось или прочитайте до конца: "выкинув еще одно условие и упростив исходник". Условие, которое было перед циклом. Если вы докажете, что результат работы изначального исходника и моего кода с while(pSize--) {} отличается - схожу.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 2 2015, 16:06
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Mahagam @ Dec 2 2015, 15:20)  а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться? для всех остальных, умеющих программировать, кроме memcpy есть и memmove. Хе, я хотел написать, что я бы еще проверял, что src & dest не равны и не перекрываются, но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют. а в чем проблемы-то ? адреса известны, размер буфера тоже. Массивы по определению непрерывны.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|