jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба функция копирует с младшего байта в младший байт. а нельзя как нибудь начиная со старшего байта в младший байт? то есть сейчас dest[] = {0} src[] = {1,2,3,4,5} memcpy(dest,src,5); и после выполнения dest = {1,2,3,4,5} а я хочу dest = {5,4,3,2,1} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Стандартно - нельзя Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Стандартно - нельзя то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба то есть надо переворачивать исходный массив? а есть какой нибудь быстрый алгоритм перевернуть или ничего нового не придумали? А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ? Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 4 элемента по байту каждый, учесть влияние кэша процессора итп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 (изменено) · Жалоба А обязательно гонять данные по массиву туда-сюда ? Можно ли просто обращаться к его этементам в обратном порядке ? Быстрый алгоритм можно придумать для каких-нибудь частных случаев, типа только 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]; } Изменено 2 декабря, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба 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* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба За такой код на code review коллеги сходу бьют ссаными тряпками :) - что будет, если аргумент size по какой-либо причине будет 0 ? я не имею такой роскоши обложить асертами все аргументы :) - аргумент src должен быть const uint8_t* ну затрут его, не жалко :) - аргумент dest желательно объявлять как void* я за строгую типизацию, сэйф код :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба я не имею такой роскоши обложить асертами все аргументы :) ну затрут его, не жалко :) я за строгую типизацию, сэйф код :) Стандартные отмазки говнокодера. код: if(!aSize) { assert(0); return; } не стоит практически ничего. остальное даже комментировать не имеет смысла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Стандартные отмазки говнокодера. Не меньшим говнокодированием является и декларируемый Вами подход, когда куски кода для ВНУТРЕННЕГО употребления обвешиваются всякими узорами. Получается этакая борьба говнокодера с говнокодом за право говнокодировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Не меньшим говнокодированием является и декларируемый Вами подход, когда куски кода для ВНУТРЕННЕГО употребления обвешиваются всякими узорами. Получается этакая борьба говнокодера с говнокодом за право говнокодировать. когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память (ну, тестирование это же для ламеров) и производить занятные эффекты разной степени, вот тогда и поговорим :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба когда в паре тысяч выпущенных в продажу девайсов такие куски кода для внутреннего употребления начнут затирать чужую память... Это если их будет вызывать говнокодер. Ну и никакие assert и иже с ними не позволят вдруг сделать написанный говнокодером код рабочим. Как он НЕ работал правильно, допустим, затирая, кусок памяти, так он не будет работать ничего не делая или вылетая на assert. И не надо мне тут про тысячи, например, выпущенных в продажу кофемолок - ну не поможет никакой assert разобраться с говнокодом на кухне у конечного потребителя. По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Это если их будет вызывать говнокодер. По этой причине я и написал - "борьба говнокодера с говнокодом за право говнокодировать". В моем случае ассерты призваны срабатывать при проведении тестирования разных видов, вообще-то. Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий, при которых говноданные таки попадают в низкоуровневые функции для "внутреннего употребления". Таких случаев выявляется ну сильно больше, чем гениальные программисты, никогда не делающие ошибок, могут себе представить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Этим выявляется тьма абсолютно невероятных комбинаций входных воздействий.. Вот и занимайтесь ВДУМЧИВО проблемой в месте ее возникновения - при обработке входных воздействий а не в конце алгоритма. И не надо валить на "говноданные" - они имеют полное право быть ЛЮБЫМИ. Вот исходя из этого факта и следует СРАЗУ начинать строить их разборку. Тогда никаких проблем не возникает. Ежели-же начинают строить изначально паркетную разборку а потом ЛАТАТЬ и пенять на "говноданные", то тогда и появляется "необходимость" добовления всяких assert-ов в говнокод... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Да, осталось pDestArr сделать void const *, а pSrcArr сделать void *. Чтобы этой функцией можно было переворачивать любые данные, в том числе лежащие во флеше. И do { } while(--pSize) заменить на while(pSize--) {} выкинув еще одно условие и упростив исходник. После чего перейти на Си с плюсами, написав шаблон-обертку, следящую за тем, чтобы pDestArr и pSrcArr указывали на одинаковый тип. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться