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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> вопрос по 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
aaarrr
сообщение Dec 2 2015, 07:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Стандартно - нельзя
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 08:50
Сообщение #3


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

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



Цитата(aaarrr @ Dec 2 2015, 13:17) *
Стандартно - нельзя

то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали?
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 08:58
Сообщение #4


Местный
***

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



Цитата(Jenya7 @ Dec 2 2015, 08:50) *
то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали?


А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ?
Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 4 элемента по байту каждый, учесть влияние кэша процессора итп.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 09:01
Сообщение #5


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

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



Цитата(CrimsonPig @ Dec 2 2015, 14:58) *
А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ?
Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 4 элемента по байту каждый, учесть влияние кэша процессора итп.

тоже вариант
нет. функция посылки тоже начинает с младшего байта. лучше сразу перевернуть, быстрее будет.
Код
void ReverseArray(uint8_t *dest, uint8_t *src, uint32_t size)
{
    int i,j;
    for (i = (size - 1), j = 0; i >= 0; i--, j++)
          dest[j] = src[i];
}


Сообщение отредактировал Jenya7 - Dec 2 2015, 09:05
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 09:17
Сообщение #6


Местный
***

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



Цитата(Jenya7 @ Dec 2 2015, 09:01) *
Код
void ReverseArray(uint8_t *dest, uint8_t *src, uint32_t size)
{
    int i,j;
    for (i = (size - 1), j = 0; i >= 0; i--, j++)
          dest[j] = src[i];
}


За такой код на code review коллеги сходу бьют ссаными тряпками sm.gif
- что будет, если аргумент size по какой-либо причине будет 0 ?
- аргумент src должен быть const uint8_t*
- аргумент dest желательно объявлять как void*

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 09:32
Сообщение #7


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

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



Цитата(CrimsonPig @ Dec 2 2015, 15:17) *
За такой код на code review коллеги сходу бьют ссаными тряпками sm.gif
- что будет, если аргумент size по какой-либо причине будет 0 ?

я не имею такой роскоши обложить асертами все аргументы sm.gif

Цитата(CrimsonPig @ Dec 2 2015, 15:17) *
- аргумент src должен быть const uint8_t*

ну затрут его, не жалко sm.gif

Цитата(CrimsonPig @ Dec 2 2015, 15:17) *
- аргумент dest желательно объявлять как void*

я за строгую типизацию, сэйф код sm.gif

Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 09:35
Сообщение #8


Местный
***

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



Цитата(Jenya7 @ Dec 2 2015, 09:32) *
я не имею такой роскоши обложить асертами все аргументы sm.gif

ну затрут его, не жалко sm.gif

я за строгую типизацию, сэйф код sm.gif


Стандартные отмазки говнокодера.

код:
if(!aSize)
{
assert(0);
return;
}

не стоит практически ничего.
остальное даже комментировать не имеет смысла.

Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2015, 10:13
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Dec 2 2015, 11:35) *
Стандартные отмазки говнокодера.

Не меньшим говнокодированием является и декларируемый Вами подход, когда куски кода для ВНУТРЕННЕГО употребления обвешиваются всякими узорами. Получается этакая борьба говнокодера с говнокодом за право говнокодировать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 10:26
Сообщение #10


Местный
***

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



Цитата(zltigo @ Dec 2 2015, 10:13) *
Не меньшим говнокодированием является и декларируемый Вами подход, когда куски кода для ВНУТРЕННЕГО употребления обвешиваются всякими узорами. Получается этакая борьба говнокодера с говнокодом за право говнокодировать.


когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память (ну, тестирование это же для ламеров) и производить занятные эффекты разной степени, вот тогда и поговорим sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2015, 10:31
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Dec 2 2015, 12:26) *
когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память...

Это если их будет вызывать говнокодер. Ну и никакие assert и иже с ними не позволят вдруг сделать написанный говнокодером код рабочим. Как он НЕ работал правильно, допустим, затирая, кусок памяти, так он не будет работать ничего не делая или вылетая на assert. И не надо мне тут про тысячи, например, выпущенных в продажу кофемолок - ну не поможет никакой assert разобраться с говнокодом на кухне у конечного потребителя.
По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 10:42
Сообщение #12


Местный
***

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



Цитата(zltigo @ Dec 2 2015, 10:31) *
Это если их будет вызывать говнокодер. По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать".


В моем случае ассерты призваны срабатывать при проведении тестирования разных видов, вообще-то. Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий, при которых говноданные таки попадают в низкоуровневые функции для "внутреннего употребления". Таких случаев выявляется ну сильно больше, чем гениальные программисты, никогда не делающие ошибок, могут себе представить.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 2 2015, 10:45
Сообщение #13


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

Группа: Свой
Сообщений: 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
zltigo
сообщение Dec 2 2015, 10:51
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Dec 2 2015, 12:42) *
Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий..

Вот и занимайтесь ВДУМЧИВО проблемой в месте ее возникновения - при обработке входных воздействий а не в конце алгоритма. И не надо валить на "говноданные" - они имеют полное право быть ЛЮБЫМИ. Вот исходя из этого факта и следует СРАЗУ начинать строить их разборку. Тогда никаких проблем не возникает. Ежели-же начинают строить изначально паркетную разборку а потом ЛАТАТЬ и пенять на "говноданные", то тогда и появляется "необходимость" добовления всяких assert-ов в говнокод...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 10:55
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 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

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 11:34
Рейтинг@Mail.ru


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