crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в double и его hex представление
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 24.2.2012, 8:36
 
Цитата(novichkov @ 22.2.2012, 22:42) *
после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать.

не освобождаются хендлы контекста устройства (по-дельфийски контекст обозван "канвой") , шрифтов, битмапов и т.д. Это надо перетряхнуть код рисования и расставить вызовы освобождения сооттветствующих ресурсов там, где это не сделано. Как выцепить?

1) для начала запускаешь программу в обычном режиме. Открываешь диспетчер задач, показываешь там в процессах колонку "дескрипторы" и "объекты GDI". При перерисовках графики эти числа будут расти для процесса программы (и это есть неправильно)
2) комментируешь весь код отрисовки. Запускаешь. В диспетчере счётчики должны остановиться на определённом среднем значении (если проблема именно в коде отрисовки, возможно не только там. По интенсивности изменения счётчиков это можно определить)
3) потихоньку открывать графику и вносить исправления

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

Влад, ну, начнём с того, что проще было в бинарник писать, а не ascii ) Раз уж такая пьянка. Ну а рубить - это да. Сначала рубить, потом научить правильно )))
Влад Дата 23.2.2012, 11:00
 
Цитата(Алексей1153 @ 22.2.2012, 20:34) *
.... я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!

Я думаю, рубить сплеча не следует - мы же не знаем, какие основания были у программиста сохранять именно так, а не иначе.... А вот тот факт, что эти самые основания никак не отражены в проектной документации (а есть ли вообще проектная документация?) - это явный косяк, за который нужно как минимум завоспитывать до слез. Причем скорее всего не программиста-кодера, а архитекта, который либо придумал эту "фичу" и никак не описал, почему, либо допустил в этом отношении самодеятельность программиста без всяких видимых оснований.
Ну и если заканчиваются дескрипторы - это тоже косяк, причем тут воспитывать нужно уже QA, тестеров и менеджера проекта....
novichkov Дата 22.2.2012, 19:42
 
Цитата(Алексей1153 @ 22.2.2012, 20:34) *
novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!


А еще в этой программе, написанной, кстати, в Delphi, после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать.
Алексей1153 Дата 22.2.2012, 19:34
  novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!
novichkov Дата 22.2.2012, 17:46
  Да, так значительно проще :)

Сделал так:

QString hex=..... 
long long x=hex.toLongLong(0,16);
double d = reinterpret_cast<double&>(x);
Влад Дата 22.2.2012, 16:52
  Тебе нужно просто интерпретировать последовательность байтов как значение другого типа.
    long long x = 0x3ff0000000000000;
    double d = reinterpret_cast<double&>(x);
    std::cout << d << std::endl;
novichkov Дата 22.2.2012, 14:59
  Сейчас сделал такую версию:

double hextodouble(const QString &hex)
{
double result=0.0l;

QByteArray ba;
QDataStream stream(&ba, QIODevice::WriteOnly);
for (int i=0; i<16; i+=2) {
quint8 c = hex.mid(i,2).toUInt(0,16);
stream<<c;
}

QDataStream stream1(&ba, QIODevice::ReadOnly);
stream1 >> result;

return result;
}

Но она слишком тяжеловесна.
novichkov Дата 22.2.2012, 14:00
  Знатоки низкоуровневых функций C/C++! Помогите, пожалуйста, решить проблему.

В одной не очень хорошо написанной программе в файлы описаний данных, которые представляют собой простые ini файлы, разработчик программы пишет действительные параметры в виде
AmplLevel=(0BC0000000000000) <- строковое представление числа в формате double
XStep=(00000000) <- строковое представление числа в формате float

Мне нужно декодировать эти строки, то есть получить соответствующие значения параметров.
Для float решение простое:

char *hex_string = ....
float f;
sscanf(hex_string,"%x",&f);

А вот для double это не работает. Подскажите, как можно переконвертировать строку, чтобы получить нужный результат?

Для справки:
0x 3ff0 0000 0000 0000 = 1
0x 3ff0 0000 0000 0001 ≈ 1.0000000000000002, the next higher number > 1
0x 3ff0 0000 0000 0002 ≈ 1.0000000000000004
0x 4000 0000 0000 0000 = 2
0x c000 0000 0000 0000 = –2
0x3fd5 5555 5555 5555 = 0.333333333333333314829616256247390992939472198486328125
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.7.2025, 3:13