CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Да, осталось pDestArr сделать void const *, а pSrcArr сделать void *. Чтобы этой функцией можно было переворачивать любые данные, в том числе лежащие во флеше. И do { } while(--pSize) заменить на while(pSize--) {} выкинув еще одно условие и упростив исходник. После чего перейти на Си с плюсами, написав шаблон-обертку, следящую за тем, чтобы pDestArr и pSrcArr указывали на одинаковый тип. Щаз вам очередной великий кодер скажет, что использовать void* некошерно, потому что правильные программисты (они не пишут ассертов, да) должны заранее знать тип передаваемого значения в функцию memcpy :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба должны заранее знать тип передаваемого значения в функцию memcpy :)memcopy как раз имеет аргументы void const * и void *. Некторые знают, что это сделано специально для использования неявного приведения типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 (изменено) · Жалоба ok...надо подумать... Изменено 2 декабря, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба спасибо. сравню в листинге :) size_t не может быть меньше нуля. Это беззнаковый тип. Нормальный компилятор должен жутко материться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба memcopy как раз имеет аргументы void const * и void *. Некторые знают, что это сделано специально для использования неявного приведения типов. вылетает ошибка invalid use of void expression Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба вылетает ошибка 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("Слава мне, победителю драконов!")); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба должны заранее знать тип передаваемого значения в функцию memcpy :) Вообще-то здесь речь уже идет далеко не о библиотечной функции memcpy() которая по определению должна обладать универсальностью, ну или по крайней мере сбалансированностью между универсальностью и безошибочностью в использовании. Так что для некой внутренней функции работающей с конкретными типами данных все эти неявные приведения типов скопипащенные с memcpy() В ТОПКУ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам: 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам: 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("Слава мне, победителю драконов!")); } я понял. но аргумент можно привести к нужному типу и вне функции. если понадобиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба do { } while(--pSize) заменить на while(pSize--) {} идите в отдел кадров. скажите, что вы уже некомпетентны. Щаз вам очередной великий кодер скажет uint8_t - "простейшее". С ним удобна математика указателей. Можно использовать void*, но в теле тогда уже, либо использовать сумбурную запись с приведением типов, либо локально объявить нужные указатели. Вы определитесь уже в своей толпе. Ато один размер сокращает, второй умничает... Хотите напыщенно позвенеть яйцами - вперёд в онлайн тесты по C/C++. Хоть больше "удовлетворительно" наберите. size_t не может быть меньше нуля это знаковый тип, т.к. используется и для возвращения кода ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба это знаковый тип, т.к. используется и для возвращения кода ошибки. Так может благородному дону пойти и погуглить "size_t ssize_t" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба Так может благородному дону пойти и погуглить "size_t ssize_t" ? Очевидно, что есть необходимость в этом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба я понял. но аргумент можно привести к нужному типу и вне функции. если понадобится.В почти каждой точке вызова? Вы правда считаете, что засорение исходников такими приведениями типа лучше, чем одно приведение, спрятанное в теле функции? Ваше право. Успехов в сопровождении таких исходников! идите в отдел кадров. скажите, что вы уже некомпетентны.А теперь посмотрите на исходник, к котрому это относилось или прочитайте до конца: "выкинув еще одно условие и упростив исходник". Условие, которое было перед циклом. Если вы докажете, что результат работы изначального исходника и моего кода с while(pSize--) {} отличается - схожу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mahagam 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться? для всех остальных, умеющих программировать, кроме memcpy есть и memmove. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 декабря, 2015 Опубликовано 2 декабря, 2015 · Жалоба а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться? для всех остальных, умеющих программировать, кроме memcpy есть и memmove. Хе, я хотел написать, что я бы еще проверял, что src & dest не равны и не перекрываются, но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют. а в чем проблемы-то ? адреса известны, размер буфера тоже. Массивы по определению непрерывны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться