|
вопрос по memcpy |
|
|
|
Dec 2 2015, 07:16
|
Профессионал
    
Группа: Участник
Сообщений: 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}
|
|
|
|
|
Dec 2 2015, 08:58
|

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

|
Цитата(Jenya7 @ Dec 2 2015, 08:50)  то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали? А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ? Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 4 элемента по байту каждый, учесть влияние кэша процессора итп.
|
|
|
|
|
Dec 2 2015, 09:01
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 2 2015, 09:17
|

Местный
  
Группа: Участник
Сообщений: 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 коллеги сходу бьют ссаными тряпками  - что будет, если аргумент size по какой-либо причине будет 0 ? - аргумент src должен быть const uint8_t* - аргумент dest желательно объявлять как void*
|
|
|
|
|
Dec 2 2015, 09:32
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ Dec 2 2015, 15:17)  За такой код на code review коллеги сходу бьют ссаными тряпками  - что будет, если аргумент size по какой-либо причине будет 0 ? я не имею такой роскоши обложить асертами все аргументы  Цитата(CrimsonPig @ Dec 2 2015, 15:17)  - аргумент src должен быть const uint8_t* ну затрут его, не жалко  Цитата(CrimsonPig @ Dec 2 2015, 15:17)  - аргумент dest желательно объявлять как void* я за строгую типизацию, сэйф код
|
|
|
|
|
Dec 2 2015, 09:35
|

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

|
Цитата(Jenya7 @ Dec 2 2015, 09:32)  я не имею такой роскоши обложить асертами все аргументы  ну затрут его, не жалко  я за строгую типизацию, сэйф код  Стандартные отмазки говнокодера. код: if(!aSize) { assert(0); return; } не стоит практически ничего. остальное даже комментировать не имеет смысла.
|
|
|
|
|
Dec 2 2015, 10:31
|

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|