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

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

 

Щаз вам очередной великий кодер скажет, что использовать void* некошерно, потому что правильные программисты (они не пишут ассертов, да) должны заранее знать тип передаваемого значения в функцию memcpy :)

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


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

должны заранее знать тип передаваемого значения в функцию memcpy :)
memcopy как раз имеет аргументы void const * и void *.

Некторые знают, что это сделано специально для использования неявного приведения типов.

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


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

спасибо. сравню в листинге :)

 

size_t не может быть меньше нуля. Это беззнаковый тип. Нормальный компилятор должен жутко материться.

 

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


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

memcopy как раз имеет аргументы void const * и void *.

Некторые знают, что это сделано специально для использования неявного приведения типов.

вылетает ошибка invalid use of void expression

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


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

вылетает ошибка 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("Слава мне, победителю драконов!"));
}

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


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

должны заранее знать тип передаваемого значения в функцию memcpy :)

Вообще-то здесь речь уже идет далеко не о библиотечной функции memcpy() которая по определению должна обладать универсальностью, ну или по крайней мере сбалансированностью между универсальностью и безошибочностью в использовании. Так что для некой внутренней функции работающей с конкретными типами данных все эти неявные приведения типов скопипащенные с memcpy() В ТОПКУ.

 

 

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


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

Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам:

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

 

 

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


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

Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам:

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("Слава мне, победителю драконов!"));
}

я понял. но аргумент можно привести к нужному типу и вне функции. если понадобиться.

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


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

do { } while(--pSize) заменить на while(pSize--) {}

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

 

Щаз вам очередной великий кодер скажет

uint8_t - "простейшее". С ним удобна математика указателей. Можно использовать void*, но в теле тогда уже, либо использовать сумбурную запись с приведением типов, либо локально объявить нужные указатели.

Вы определитесь уже в своей толпе. Ато один размер сокращает, второй умничает... Хотите напыщенно позвенеть яйцами - вперёд в онлайн тесты по C/C++. Хоть больше "удовлетворительно" наберите.

 

size_t не может быть меньше нуля

это знаковый тип, т.к. используется и для возвращения кода ошибки.

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


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

это знаковый тип, т.к. используется и для возвращения кода ошибки.

 

Так может благородному дону пойти и погуглить "size_t ssize_t" ?

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


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

Так может благородному дону пойти и погуглить "size_t ssize_t" ?

Очевидно, что есть необходимость в этом :biggrin:

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


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

я понял. но аргумент можно привести к нужному типу и вне функции. если понадобится.
В почти каждой точке вызова? Вы правда считаете, что засорение исходников такими приведениями типа лучше, чем одно приведение, спрятанное в теле функции? Ваше право. Успехов в сопровождении таких исходников!

 

идите в отдел кадров. скажите, что вы уже некомпетентны.
А теперь посмотрите на исходник, к котрому это относилось или прочитайте до конца: "выкинув еще одно условие и упростив исходник". Условие, которое было перед циклом. Если вы докажете, что результат работы изначального исходника и моего кода с while(pSize--) {} отличается - схожу.

 

 

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


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

а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться?

для всех остальных, умеющих программировать, кроме memcpy есть и memmove.

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


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

а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться?

для всех остальных, умеющих программировать, кроме memcpy есть и memmove.

 

Хе, я хотел написать, что я бы еще проверял, что src & dest не равны и не перекрываются, но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют.

а в чем проблемы-то ? адреса известны, размер буфера тоже. Массивы по определению непрерывны.

 

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


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

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

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

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

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

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

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

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

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

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