Перейти к содержанию
    

функция копирует с младшего байта в младший байт. а нельзя как нибудь начиная со старшего байта в младший байт?

то есть сейчас

dest[] = {0}
src[] = {1,2,3,4,5}
memcpy(dest,src,5);

и после выполнения

dest = {1,2,3,4,5}

а я хочу

dest = {5,4,3,2,1}

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стандартно - нельзя

то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали?

 

А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ?

Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 4 элемента по байту каждый, учесть влияние кэша процессора итп.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ?

Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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*

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За такой код на code review коллеги сходу бьют ссаными тряпками :)

- что будет, если аргумент size по какой-либо причине будет 0 ?

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

 

- аргумент src должен быть const uint8_t*

ну затрут его, не жалко :)

 

- аргумент dest желательно объявлять как void*

я за строгую типизацию, сэйф код :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

ну затрут его, не жалко :)

 

я за строгую типизацию, сэйф код :)

 

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

 

код:

if(!aSize)

{

assert(0);

return;

}

 

не стоит практически ничего.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память (ну, тестирование это же для ламеров) и производить занятные эффекты разной степени, вот тогда и поговорим :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память...

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

По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это если их будет вызывать говнокодер. По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать".

 

В моем случае ассерты призваны срабатывать при проведении тестирования разных видов, вообще-то. Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий, при которых говноданные таки попадают в низкоуровневые функции для "внутреннего употребления". Таких случаев выявляется ну сильно больше, чем гениальные программисты, никогда не делающие ошибок, могут себе представить.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий..

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...