![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Во-первых, вводить дополнительную переменную нужно только тогда, когда имеется rvalue, к которому нельзя применить операцию взятия адреса. Во-вторых, объекты целочисленного типа предназначены для хранения целых чисел или наборов флагов, а запихивание в них значений объектов произвольных типов - это использование средств языка не по назначению (точно так же, как забивание шурупов кувалдой - использование кувалды не по назначению). От такого использования страдает как минимум самодокументирумость кода. Этот способ плохо масштабируется. Представим, что спустя некоторое время понадобилось добавить возможность передачи в функцию не только double-значений, но и long double-значений, не вмещающихся в 64 бита. Что делать в таком случае? Придётся передавать значение другим способом. Теряем единообразие. В-третьих при использовании void * пользователю функции не нужно захламлять код reinterpret_cast-ами для передаваемых аргументов. Это сообщение отредактировал(а) UnrealMan - 23.12.2008, 20:41 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
не выходите из контекста задачи Есть функция которая принимает восемь байт (qwоrd он же int64) мы в эти 8 байт можем запихнуть *чтоугодно* что влезет в 8 байт, а в тех редких случаях когда не влезет, мы передаем указатель на это значение, 8 байт хватит практически на любой указатель. Так или иначе, вне зависимости от вашего желания такие функции существуют - GetMessage, CreateThread, и т.п. То что в С++ для такого надо городить reinterpret_cast'ы и другие многобуквенные операторы - это проблема языка С++ которая никак не связана с задачей. Код куда надо передавать эти 8 байт может быть написан на любом ЯП, причем разработчик этого кода мог и не задумываться что ктото будет вызывать этот код в модуле на С++ Это сообщение отредактировал(а) GoldFinch - 23.12.2008, 21:08 |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
это проблема интерфейса, сделаного кривыми руками ![]() а как вы будете этот код вызывать? наверное создадите интерфейс? так вот интерфейс надо делать прямыми руками ![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
ну и как сделать интерфейс к такой функции?
|
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А не проще ли всегда передавать указатель и не парить пользователю мозги магическим ограничением в 8 байт?
Можно подумать, в других строготипизированных языках подобные преобразования не нужны. |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
включаю телепатию и определяю, что это за "такая" функция
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А что там не так с этими функциями?
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
если в 95% случаев хватает 8 байт то не проще более того, не всегда есть возможность передать указатель на переменную вместо значения переменной например в thread указатель на локальную переменную можно передать только если эа локальная переменная будет существовать, в sendmessage можно передать указатель только если это сообщение отправляется своему окну, и т.д. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Спорно. Увеличение способов передачи значений предрасполагает к совершению ошибок. Что-то я вообще не понял, где тут проблемы с передачей указателя. Кроме того, если сильно не нравится заводить переменные для сохранения значений rvalue-выражений, то можно воспользоваться шаблоном
Это сообщение отредактировал(а) UnrealMan - 24.12.2008, 00:02 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
UnrealMan, шаблон или прочие ухищрения - это если ты сам проектируешь интерфейс. Тогда да, не надо никаких вывертов и параметры нужны ровно такие, какие нужны.
А вот если ты используешь чужой интерфейс (операционной системы, библиотеки, etc), и он говорит: "только DWORD" или "LPVOID". А тебе нужно float... Можно и указатель. Если, конечно, мы остаемся в рамках процесса. И при этом нужно гарантировать существование этого объекта (переменной), когда сообщение будет обрабатываться. А оно вовсе не обязано быть синхронным. И т.д. Короче, ситуаций, когда проще использовать имеющиеся биты и не разводить лишний геморрой ради 4-8 байтов - предостаточно. И никакой это не изврат: ты скажи об этом C-программистам. Просто нужно "уметь их готовить". -------------------- ... |
|||
|
||||
UnrealMan |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
По этому поводу я уже высказался:
Что мешает сохранить значение объекта, на который указывает переданный указатель, до возврата управления функцией?
Я не знаю ни одной. Изврат. По причинам, изложенным выше. Кто сказал, что из подвальных крыс нельзя приготовить замечательный ужин? Просто нужно "уметь их готовить". Приятного аппетита ![]() |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() http://www.privatwein.de/ebay/Set_Turm_02_...0x464dpi144.jpg перевод слов на обложках : филе из крыс, мясо медведя, лягушачьи лапки ![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Earnest, +1
UnrealMan, кроме С++ есть много других языков программирования, с точки зрения которых ваш код на С++ может показаться написанным "через ж." если вы чегото не знаете это значит что вы это не знаете, а не то что это не существует >Что мешает сохранить значение объекта, на который указывает переданный указатель, до возврата управления функцией? - то что его надо хранить неопределенно долго - то что значение надо передать в адресное пространство другого процесса - ... |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да вы, батенька, идеалист... Знаешь, сколько код живет? И не надо так высокомерно "через ж.": концепции в программировании меняются быстрее, чем ты можешь себе представить: "кошерное" поведение вчера и сегодня - две большие разницы. Это связано как с развитием над-языковых метафор, так и, не в последнюю очередь, с ростом производительности машин: сейчас можно себе позволить то, на чем вчера приходжилось экономить.
Какого возврата? Есть асинхронная передача, есть другие процессы... впрочем, уже говорили... Я могу придумать массу способов как организовать такое безопасное хранение\передачу, если по-другому никак. Но если достаточно запихать float в 4-байтовый int - неужели я буду городить этот огород? Время можно потратить более интересно. Ты на чистом C не программировал никогда? Можно упираться до посинения: это говорит только о недостатке опыта. Реальный программист работает в реальной ситуации, а не в идеальной. Насчет крыс тоже пример так себе. Читаем Фарли Моуэта - ему понравилось. Правда там крысы были не подвальные, а полевые, но с моей точки зрения разница не велика. ![]() -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |