crossplatform.ru

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


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

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

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


Последние 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 Текстовая версия Сейчас: 29.4.2024, 17:59