реклама на сайте
подробности

 
 
> вопрос по memcpy
Jenya7
сообщение Dec 2 2015, 07:16
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



функция копирует с младшего байта в младший байт. а нельзя как нибудь начиная со старшего байта в младший байт?
то есть сейчас
Код
dest[] = {0}
src[] = {1,2,3,4,5}
memcpy(dest,src,5);

и после выполнения
Код
dest = {1,2,3,4,5}

а я хочу
Код
dest = {5,4,3,2,1}



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smalcom
сообщение Dec 2 2015, 10:45
Сообщение #2


Профессионал
*****

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



Код
void ReverseArray(uint8_t* pDestArr, uint8_t* pSrcArr, size_t pSize)
{
    if(pSize <= 0) return;

    pDestArr += (pSize - 1);// или "pDestArr += pSize, pDestArr--;"
    do
    {
        *pDestArr-- = *pSrcArr++;
    } while(--pSize);
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 10:55
Сообщение #3


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 11:12
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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 sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 11:18
Сообщение #5


Гуру
******

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



Цитата(CrimsonPig @ Dec 2 2015, 14:12) *
должны заранее знать тип передаваемого значения в функцию memcpy sm.gif
memcopy как раз имеет аргументы void const * и void *.
Некторые знают, что это сделано специально для использования неявного приведения типов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 11:46
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Dec 2 2015, 17:18) *
memcopy как раз имеет аргументы void const * и void *.
Некторые знают, что это сделано специально для использования неявного приведения типов.

вылетает ошибка invalid use of void expression
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 11:55
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 12:37
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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);

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   вопрос по memcpy   Dec 2 2015, 07:16
- - aaarrr   Стандартно - нельзя   Dec 2 2015, 07:17
|- - Jenya7   Цитата(aaarrr @ Dec 2 2015, 13:17) Станда...   Dec 2 2015, 08:50
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 08:50) то ест...   Dec 2 2015, 08:58
|- - Jenya7   Цитата(CrimsonPig @ Dec 2 2015, 14:58) А ...   Dec 2 2015, 09:01
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 09:01) Кодvoi...   Dec 2 2015, 09:17
|- - Jenya7   Цитата(CrimsonPig @ Dec 2 2015, 15:17) За...   Dec 2 2015, 09:32
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 09:32) я не и...   Dec 2 2015, 09:35
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 11:35) Ст...   Dec 2 2015, 10:13
|- - CrimsonPig   Цитата(zltigo @ Dec 2 2015, 10:13) Не мен...   Dec 2 2015, 10:26
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 12:26) ко...   Dec 2 2015, 10:31
|- - CrimsonPig   Цитата(zltigo @ Dec 2 2015, 10:31) Это ес...   Dec 2 2015, 10:42
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 12:42) Эт...   Dec 2 2015, 10:51
|||- - Jenya7   Цитата(Сергей Борщ @ Dec 2 2015, 17:55) Г...   Dec 2 2015, 13:02
||- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 13:12) до...   Dec 2 2015, 12:22
|- - Jenya7   ok...надо подумать...   Dec 2 2015, 11:35
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 11:35) спасиб...   Dec 2 2015, 11:40
- - smalcom   Цитатаdo { } while(--pSize) заменить на while(pSiz...   Dec 2 2015, 13:07
|- - CrimsonPig   Цитата(smalcom @ Dec 2 2015, 13:07) это з...   Dec 2 2015, 13:39
||- - smalcom   Цитата(CrimsonPig @ Dec 2 2015, 15:39) Та...   Dec 2 2015, 14:28
|- - Сергей Борщ   Цитата(Jenya7 @ Dec 2 2015, 16:02) я поня...   Dec 2 2015, 14:59
- - Mahagam   а как любители ассертов ассертят то, что src и dst...   Dec 2 2015, 15:20
|- - CrimsonPig   Цитата(Mahagam @ Dec 2 2015, 15:20) а как...   Dec 2 2015, 16:06
- - smalcom   Исходник Кодint main() { volatile int ps1 ...   Dec 3 2015, 00:24
|- - jcxz   Цитата(smalcom @ Dec 3 2015, 06:24) прогр...   Dec 3 2015, 03:58
|- - Сергей Борщ   Цитата(smalcom @ Dec 3 2015, 03:24) Исход...   Dec 3 2015, 13:25
- - smalcom   ЦитатаВы предлагаете не использовать assert-ы и ту...   Dec 3 2015, 10:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 07:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016