Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    ValidolX

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    надо еще вызывать обработчик сообщений, чтобы он выполнил обновление интерфейса.

     
    уже указано, см. пред. пост как ето сделать в VCL

    Всего записей: 1710 | Зарегистр. 22-07-2001 | Отправлено: 00:15 07-08-2011
    c0ep

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ищу статьи, заметки, книги, листинги кодов, исходники и все подобное про внедрение в другие процессы в windows желательно на C++.  
    Вот хороший пример подобной статьи:  
    http://habrahabr.ru/blogs/cpp/95305/  
    Бросаем ссылки, советуем книги, заранее спасибо.
     
    Добавлено:
    Ищу статьи, заметки, книги, листинги кодов, исходники и все подобное про внедрение в другие процессы в windows желательно на C++.  
    Вот хороший пример подобной статьи:  
    http://habrahabr.ru/blogs/cpp/95305/  
    Бросаем ссылки, советуем книги, заранее спасибо.

    Всего записей: 6 | Зарегистр. 29-01-2011 | Отправлено: 15:53 07-08-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    c0ep
    ты б лучше в API запостил...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 17:36 07-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    загоняю биты из перемнной float в переменную int

    Код:
    float f = ...;
    int i;
    i = *(int*)&f;

    правильно? упростить можно?

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 00:16 09-08-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    загоняю биты из перемнной float в переменную int

    что ты здесь имеешь в виду?
     
    i = (int)f;
    а этого не достаточно?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 00:24 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    i = (int)f;
    а этого не достаточно?

    Тут получим целую часть от f. А мне нужно все 32 бита из float положить в int.

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 00:34 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt
    достаточно, можно еще и union заюзать.
     

    Код:
     
    union xx
    {
      flot f;
      int i;
    }
    xx.f = 1.0
    cout << xx.i;
     

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 00:35 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KF121

    Цитата:
    достаточно

    не понял ответа
     

    Цитата:
    можно еще и union заюзать.

    неа, слишком громоздко.

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 01:02 09-08-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt
    ну если тебе нужны просто биты (представление) float, а не само значение, тогда ты можешь воспользоваться след. куском:
    Код:
      float f;
      unsigned long i;
     
      f = 3.14;
      i = (int)f;
      printf("%lu\n", i);
      _asm {
        mov eax, dword ptr f
        mov dword ptr i, eax
      }

      printf("%lu\n", i);
    короче (и быстрее) вряд ли получится...
    кстати, зачем это тебе?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 02:35 09-08-2011 | Исправлено: akaGM, 02:42 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    не понял ответа  

    время позднее было, тупанул

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 08:45 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Спасибо, работает. Мой пример тоже самое делает.

    Цитата:
    int i = *(int*)&f;

     

    Цитата:
    кстати, зачем это тебе?

    Ну например, для того, чтобы получить достоверное значение, которое можно сравнивать обычным "==". А то студия мало знаков после запятой показывает и мне еще семь цифр пришлось дописать чтобы угадать, что там на самом деле. Хорошо, что додумался в double перевести и узнал чуть больше
     
    До этого я с массивами так поступал, чтобы байты переставлять (big to little endian).

    Код:
    unsigned int* i = (unsigned int*)f;

    Но ту знаков поменьше
     

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 09:02 09-08-2011 | Исправлено: V0lt, 09:03 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt
    Флоаты нельзя сравнивать на равенство ни при каких обстоятельствах, это ошибка, даже с вида совсем одинаковых числа будут разными
    к примеру  
     
    а = 5 + 5
    if (a == 10)
      good
    else
      bad
     
    то в этом случае получите всегда bad. сравнивать можно только с погрешностью, ну а погрешность выбирать вам самим.

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 09:07 09-08-2011
    Molniev

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt
    float это аккурат 4 байта. Причем если процессор эти 4 байта с умом - не все биты (в зависимости от мантисы нижние могут содержать мусор), то вы пытаетесь сравнить все, что еу совсем не правильно.
    Если хотите сравнивать с погрешностью пишите:
    if (a - delta >= b && a + delta <= b) где a, b - сравниваемые числа, delta - нужная вам погрешность.
    Или сделайте себе отдельную функцию или макрос.

    Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 09:57 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KF121

    Цитата:
    Флоаты нельзя сравнивать на равенство ни при каких обстоятельствах, это ошибка

    Реальная ситуация. То ли драйвер, то ли DirectX выдает нижний предел одного параметра равный ~0.10. Но после доскональной проверки оказалось, что в реале там ~0,11. На других системах говорят такого бага нет (amd/ati). Поэтому я написал такую хрень.

    Код:
    //fix nvidia bug
    if(m_VMR9ColorControl[1].MinValue == 0.0999908447265625) m_VMR9ColorControl[1].MinValue = 0.11;
    Код работает правильно.
    Можно переделать ее в такое

    Код:
    //fix nvidia bug
    if(*(int*)&m_VMR9ColorControl[1].MinValue == 1036830720) m_VMR9ColorControl[1].MinValue = 0.11;

    И не зависеть от точности перевода теста во float для конкретного компилятора.
     
    Микрософт вообще довольно часто тупит. Для нового видеорендерера EVR придумали мудреный тип DXVA2_Fixed32. Запрашиваю минимальное значение получаю {Value=0, Fraction=6553}. Ок, отсылаю это значение - ошибка. При этом для других лимитов где числа целые проблем нет. Подгоняю до {Value=0, Fraction=6554} - нормально. Трындец, считать разучились

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 10:03 09-08-2011 | Исправлено: V0lt, 10:42 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    то что это используют, это еще не означает что правильно.
    вот вам наглядный привер того что не любой флоат/дабл может быть представлен в виде целого числа однозначно.
     

    Код:
    float to int
    0.0999908447265625   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625
    0.0999908447265624   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625
    0.0999908447265626   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625
     
    int to float  
    1036830720   ->   0.0999908447265625   ->   0 123 5031936
    1036830721   ->   0.0999908521771431   ->   0 123 5031937
    1036830719   ->   0.0999908372759819   ->   0 123 5031935

     
    0 123 5031936
    S Exp Mantissa
     
    Добавлено:
    почитайте мат часть про флоаты/даблы как представлются в памяти и т.п. потом лишние вопросы отпадут, и вам не захочится поступать так как вы сейчас делаете.

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 10:09 09-08-2011 | Исправлено: KF121, 10:12 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KF121

    Цитата:
    0.0999908447265625   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625
    0.0999908447265624   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625
    0.0999908447265626   ->   1036830720   ->   0 123 5031936   ->   0.0999908447265625

    Тут слева три одинаковых float на самом деле, сам ведь расписал как оно изнутри выглядит

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 10:19 09-08-2011 | Исправлено: V0lt, 10:22 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    если вы присмотритесь внимательней то слева 3 разных числа. в конце 25-24-26, но как видите они представлены все как 25, за счет своей разрядной сетки.
     
    Добавлено:
    это и есть погрешность, и она составляет 0.0000000074505806

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 10:21 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    если вы присмотритесь внимательней то слева 3 разных числа. в конце 25-24-26, но как видите они представлены все как 25, за счет своей разрядной сетки.  

    Эти три числа будут одинаковыми, если их записать как float, тупо не хватает битов.
     

    Цитата:
    почитайте мат часть про флоаты/даблы как представлются в памяти и т.п. потом лишние вопросы отпадут, и вам не захочится поступать так как вы сейчас делаете.

    Мне нужно поймать конкретный float. В памяти он лежит в 32 битах всегда в одном виде. Я копирую эти 32 бита в int и анализирую. Все логично имхо.
     
    Я не произвожу никаких вычислений. Я сравниваю число с шаблоном (который постоянен) и детектирую баг.

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 10:32 09-08-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    у вас шаблон омжет изменитсья, при следующей сборке и т.п.  
    как это вы ничего не вычисляте, как получается значение m_VMR9ColorControl[1].MinValue. оно константно?

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 10:34 09-08-2011
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KF121

    Цитата:
    как это вы ничего не вычисляте, как получается значение m_VMR9ColorControl[1].MinValue. оно константно?

    У системы запрашиваю. Такая хрень только для nvidia для конкретного параметра. Для amd/ati другие лимиты и они корректны. Если баг пофиксят, то мой "патч", скорее всего, тупо не сработает, что есть правильно.

    Всего записей: 10457 | Зарегистр. 05-02-2003 | Отправлено: 10:41 09-08-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru