реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
CrimsonPig
сообщение Dec 2 2015, 11:12
Сообщение #16


Местный
***

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



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


Щаз вам очередной великий кодер скажет, что использовать void* некошерно, потому что правильные программисты (они не пишут ассертов, да) должны заранее знать тип передаваемого значения в функцию memcpy sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 11:18
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(CrimsonPig @ Dec 2 2015, 14:12) *
должны заранее знать тип передаваемого значения в функцию memcpy sm.gif
memcopy как раз имеет аргументы void const * и void *.
Некторые знают, что это сделано специально для использования неявного приведения типов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 11:35
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075




ok...надо подумать...

Сообщение отредактировал Jenya7 - Dec 2 2015, 11:41
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 11:40
Сообщение #19


Местный
***

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



Цитата(Jenya7 @ Dec 2 2015, 11:35) *
спасибо. сравню в листинге sm.gif


size_t не может быть меньше нуля. Это беззнаковый тип. Нормальный компилятор должен жутко материться.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 11:46
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Dec 2 2015, 17:18) *
memcopy как раз имеет аргументы void const * и void *.
Некторые знают, что это сделано специально для использования неявного приведения типов.

вылетает ошибка invalid use of void expression
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 11:55
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jenya7 @ Dec 2 2015, 14:46) *
вылетает ошибка 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("Слава мне, победителю драконов!"));
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2015, 12:22
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Dec 2 2015, 13:12) *
должны заранее знать тип передаваемого значения в функцию memcpy sm.gif

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 12:37
Сообщение #23


Местный
***

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



Цитата(Сергей Борщ @ Dec 2 2015, 11:55) *
Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам:
[code]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);

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 2 2015, 13:02
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Dec 2 2015, 17:55) *
Где вылетает? Телепатирую: внутри функции. Я писал "что" надо сделать, а не "как". Ладно, читайте по губам:
Код
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("Слава мне, победителю драконов!"));
}

я понял. но аргумент можно привести к нужному типу и вне функции. если понадобиться.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 2 2015, 13:07
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



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

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

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

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

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

это знаковый тип, т.к. используется и для возвращения кода ошибки.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 13:39
Сообщение #26


Местный
***

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



Цитата(smalcom @ Dec 2 2015, 13:07) *
это знаковый тип, т.к. используется и для возвращения кода ошибки.


Так может благородному дону пойти и погуглить "size_t ssize_t" ?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 2 2015, 14:28
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата(CrimsonPig @ Dec 2 2015, 15:39) *
Так может благородному дону пойти и погуглить "size_t ssize_t" ?

Очевидно, что есть необходимость в этом biggrin.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 2 2015, 14:59
Сообщение #28


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jenya7 @ Dec 2 2015, 16:02) *
я понял. но аргумент можно привести к нужному типу и вне функции. если понадобится.
В почти каждой точке вызова? Вы правда считаете, что засорение исходников такими приведениями типа лучше, чем одно приведение, спрятанное в теле функции? Ваше право. Успехов в сопровождении таких исходников!

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



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Dec 2 2015, 15:20
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться?
для всех остальных, умеющих программировать, кроме memcpy есть и memmove.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 2 2015, 16:06
Сообщение #30


Местный
***

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



Цитата(Mahagam @ Dec 2 2015, 15:20) *
а как любители ассертов ассертят то, что src и dst могут в памяти перекрываться?
для всех остальных, умеющих программировать, кроме memcpy есть и memmove.


Хе, я хотел написать, что я бы еще проверял, что src & dest не равны и не перекрываются, но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют.
а в чем проблемы-то ? адреса известны, размер буфера тоже. Массивы по определению непрерывны.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 11:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016