Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование double в __int64 
:(
    Опции темы
UnrealMan
Дата 23.12.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(GoldFinch @  23.12.2008,  19:07 Найти цитируемый пост)
а нафига создавать переменную в которой будет храниться это значение, вычислять указатель на это значение, если можно просто передать его по значению? 

Во-первых, вводить дополнительную переменную нужно только тогда, когда имеется rvalue, к которому нельзя применить операцию взятия адреса.

Во-вторых, объекты целочисленного типа предназначены для хранения целых чисел или наборов флагов, а запихивание в них значений объектов произвольных типов - это использование средств языка не по назначению (точно так же, как забивание шурупов кувалдой - использование кувалды не по назначению). От такого использования страдает как минимум самодокументирумость кода. Этот способ плохо масштабируется. Представим, что спустя некоторое время понадобилось добавить возможность передачи в функцию не только double-значений, но и long double-значений, не вмещающихся в 64 бита. Что делать в таком случае? Придётся передавать значение другим способом. Теряем единообразие.

В-третьих при использовании void * пользователю функции не нужно захламлять код reinterpret_cast-ами для передаваемых аргументов.

Это сообщение отредактировал(а) UnrealMan - 23.12.2008, 20:41
PM MAIL   Вверх
GoldFinch
Дата 23.12.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(UnrealMan @  23.12.2008,  20:30 Найти цитируемый пост)
Представим, что спустя некоторое время понадобилось добавить возможность передачи в функцию не только double-значений, но и long double-значений, не вмещающихся в 64 бита. Что делать в таком случае? Придётся передавать значение другим способом. Теряем единообразие.

не выходите из контекста задачи
Есть функция которая принимает восемь байт (qwоrd он же int64) мы в эти 8 байт можем запихнуть *чтоугодно* что влезет в 8 байт, а в тех редких случаях когда не влезет, мы передаем указатель на это значение, 8 байт хватит практически на любой указатель.
Так или иначе, вне зависимости от вашего желания такие функции существуют - GetMessage, CreateThread, и т.п.

То что в С++ для такого надо городить reinterpret_cast'ы и другие многобуквенные операторы - это проблема языка С++ которая никак не связана с задачей. Код куда надо передавать эти 8 байт может быть написан на любом ЯП, причем разработчик этого кода мог и не задумываться что ктото будет вызывать этот код в модуле на С++

Это сообщение отредактировал(а) GoldFinch - 23.12.2008, 21:08
PM MAIL ICQ   Вверх
J0ker
Дата 23.12.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(GoldFinch @  23.12.2008,  21:00 Найти цитируемый пост)
То что в С++ для такого надо городить reinterpret_cast'ы и другие многобуквенные операторы - это проблема языка С++ которая никак не связана с задачей.

это проблема интерфейса, сделаного кривыми руками  smile 

Цитата(GoldFinch @  23.12.2008,  21:00 Найти цитируемый пост)
Код куда надо передавать эти 8 байт может быть написан на любом ЯП, причем разработчик этого кода мог и не задумываться что ктото будет вызывать этот код в модуле на С++

а как вы будете этот код вызывать? наверное создадите интерфейс? так вот интерфейс надо делать прямыми руками  smile 


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 23.12.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ну и как сделать интерфейс к такой функции?
PM MAIL ICQ   Вверх
UnrealMan
Дата 23.12.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(GoldFinch @  23.12.2008,  21:00 Найти цитируемый пост)
Есть функция которая принимает восемь байт (qwоrd он же int64) мы в эти 8 байт можем запихнуть *чтоугодно* что влезет в 8 байт, а в тех редких случаях когда не влезет, мы передаем указатель на это значение, 8 байт хватит практически на любой указатель.

А не проще ли всегда передавать указатель и не парить пользователю мозги магическим ограничением в 8 байт?

Цитата(GoldFinch @  23.12.2008,  21:00 Найти цитируемый пост)
То что в С++ для такого надо городить reinterpret_cast'ы и другие многобуквенные операторы - это проблема языка С++ 

Можно подумать, в других строготипизированных языках подобные преобразования не нужны.
PM MAIL   Вверх
J0ker
Дата 23.12.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



включаю телепатию и определяю, что это за "такая" функция


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 23.12.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(J0ker @  23.12.2008,  22:34 Найти цитируемый пост)
включаю телепатию и определяю, что это за "такая" функция 

 smile 
Цитата(GoldFinch @  23.12.2008,  21:00 Найти цитируемый пост)
Так или иначе, вне зависимости от вашего желания такие функции существуют - GetMessage, CreateThread, и т.п.

 smile 



--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 23.12.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



А что там не так с этими функциями?
PM MAIL   Вверх
GoldFinch
Дата 23.12.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(UnrealMan @  23.12.2008,  22:30 Найти цитируемый пост)
А не проще ли всегда передавать указатель и не парить пользователю мозги магическим ограничением в 8 байт?

если в 95% случаев хватает 8 байт то не проще
более того, не всегда есть возможность передать указатель на переменную вместо значения переменной
например в thread указатель на локальную переменную можно передать только если эа локальная переменная будет существовать,
в sendmessage можно передать указатель только если это сообщение отправляется своему окну, и т.д.

PM MAIL ICQ   Вверх
UnrealMan
Дата 23.12.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(GoldFinch @  23.12.2008,  23:11 Найти цитируемый пост)
если в 95% случаев хватает 8 байт то не проще

Спорно. Увеличение способов передачи значений предрасполагает к совершению ошибок.

Цитата(GoldFinch @  23.12.2008,  23:11 Найти цитируемый пост)
более того, не всегда есть возможность передать указатель на переменную вместо значения переменной
например в thread указатель на локальную переменную можно передать только если эа локальная переменная будет существовать,
в sendmessage можно передать указатель только если это сообщение отправляется своему окну, и т.д.

Что-то я вообще не понял, где тут проблемы с передачей указателя. Кроме того, если сильно не нравится заводить переменные для сохранения значений rvalue-выражений, то можно воспользоваться шаблоном

Код
#include <iostream>

template <class T>
    class Lvalue
{
public:
    Lvalue(const T &t) : m_t(t) {}
    T *operator &() { return &m_t; }
private:
    T m_t;
};
template <class T>
    Lvalue<T> lvalue(const T &t)
        { return Lvalue<T>(t); }

enum FArg { f_arg_pchar, f_arg_double };

void f(const void *p, FArg arg_type)
{
    switch (arg_type)
    {
        case f_arg_pchar:
            std::cout << static_cast<const char *>(p) << std::endl;
            break;
        case f_arg_double:
            std::cout << *static_cast<const double *>(p) << std::endl;
            break;
        default:
            std::cout << "invalid type" << std::endl;
    }
}

int main()
{
    f("some string", f_arg_pchar);
    f(&lvalue(2.7), f_arg_double);
}


Это сообщение отредактировал(а) UnrealMan - 24.12.2008, 00:02
PM MAIL   Вверх
Earnest
Дата 24.12.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



UnrealMan, шаблон или прочие ухищрения - это если ты сам проектируешь интерфейс. Тогда да, не надо никаких вывертов и параметры нужны ровно такие, какие нужны.
А вот если ты используешь чужой интерфейс (операционной системы, библиотеки, etc), и он говорит: "только DWORD" или "LPVOID". А тебе нужно float...
Можно и указатель. Если, конечно, мы остаемся в рамках процесса. И при этом нужно гарантировать существование этого объекта (переменной), когда сообщение будет обрабатываться.  А оно вовсе не обязано быть синхронным. И т.д. Короче, ситуаций, когда проще использовать имеющиеся биты и не разводить лишний геморрой ради 4-8 байтов - предостаточно. И никакой это не изврат: ты скажи об этом C-программистам. Просто нужно "уметь их готовить".


--------------------
...
PM   Вверх
UnrealMan
Дата 24.12.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Earnest @  24.12.2008,  16:39 Найти цитируемый пост)
шаблон или прочие ухищрения - это если ты сам проектируешь интерфейс

По этому поводу я уже высказался:

Цитата(UnrealMan @  23.12.2008,  17:09 Найти цитируемый пост)
если процедура изначально написана через ж., и альтернативы её использованию нет, то тут всё понятно


Цитата(Earnest @  24.12.2008,  16:39 Найти цитируемый пост)
И при этом нужно гарантировать существование этого объекта (переменной), когда сообщение будет обрабатываться.  А оно вовсе не обязано быть синхронным.

Что мешает сохранить значение объекта, на который указывает переданный указатель, до возврата управления функцией?

Цитата(Earnest @  24.12.2008,  16:39 Найти цитируемый пост)
И т.д. Короче, ситуаций, когда проще использовать имеющиеся биты и не разводить лишний геморрой ради 4-8 байтов - предостаточно.

Я не знаю ни одной.

Цитата(Earnest @  24.12.2008,  16:39 Найти цитируемый пост)
И никакой это не изврат

Изврат. По причинам, изложенным выше.

Цитата(Earnest @  24.12.2008,  16:39 Найти цитируемый пост)
Просто нужно "уметь их готовить". 

Кто сказал, что из подвальных крыс нельзя приготовить замечательный ужин? Просто нужно "уметь их готовить". Приятного аппетита smile 
PM MAIL   Вверх
mes
Дата 24.12.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(UnrealMan @  24.12.2008,  17:26 Найти цитируемый пост)
то из подвальных крыс нельзя приготовить замечательный ужин? 

 smile типа такого ?
http://www.privatwein.de/ebay/Set_Turm_02_...0x464dpi144.jpg
перевод слов на обложках : филе из крыс, мясо медведя, лягушачьи лапки  smile 


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 24.12.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Earnest, +1
 
UnrealMan, кроме С++ есть много других языков программирования, с точки зрения которых ваш код на С++ может показаться написанным "через ж."
если вы чегото не знаете это значит что вы это не знаете, а не то что это не существует

>Что мешает сохранить значение объекта, на который указывает переданный указатель, до возврата управления функцией?
- то что его надо хранить неопределенно долго
- то что значение надо передать в адресное пространство другого процесса
- ...
PM MAIL ICQ   Вверх
Earnest
Дата 24.12.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(UnrealMan @  24.12.2008,  18:26 Найти цитируемый пост)
если процедура изначально написана через ж., 

Да вы, батенька, идеалист... Знаешь, сколько код живет? И не надо так высокомерно "через ж.": концепции в программировании меняются быстрее, чем ты можешь себе представить: "кошерное" поведение вчера и сегодня - две большие разницы. Это связано как с развитием над-языковых метафор, так и, не в последнюю очередь, с ростом производительности машин: сейчас можно себе позволить то, на чем вчера приходжилось экономить. 

Цитата(UnrealMan @  24.12.2008,  18:26 Найти цитируемый пост)
Что мешает сохранить значение объекта, на который указывает переданный указатель, до возврата управления функцией?

Какого возврата? Есть асинхронная передача, есть другие процессы... впрочем, уже говорили...
Я могу придумать массу способов как организовать такое безопасное хранение\передачу, если по-другому никак. Но если достаточно запихать float в 4-байтовый int - неужели я буду городить этот огород? Время можно потратить более интересно.

Цитата(UnrealMan @  24.12.2008,  18:26 Найти цитируемый пост)
Я не знаю ни одной.

Цитата(UnrealMan @  24.12.2008,  18:26 Найти цитируемый пост)
Изврат. По причинам, изложенным выше.

Ты на чистом C не программировал никогда?
Можно упираться до посинения: это говорит только о недостатке опыта. Реальный программист работает в реальной ситуации, а не в идеальной. 

Насчет крыс тоже пример так себе. Читаем Фарли Моуэта - ему понравилось. Правда там крысы были не подвальные, а полевые, но с моей точки зрения разница не велика. smile 



--------------------
...
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1059 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.