Perché TRACE () genera un’eccezione di underflow in virgola mobile?

Perché ottengo un underflow in virgola mobile (parametri: 0x00000000) in TRACE? Quale specificatore di formato ho bisogno qui?

// show load progress by callback-Funktion (on Statusbar) ULONGLONG len = 1000; // ar.GetFile()->GetLength(); ULONGLONG pos = 800; // ar.GetFile()->GetPosition(); double perc = (double)pos/(double)len*100; TRACE("load from %X, Position: %ld, Length: %ld, Perc: %lf \n", this, pos, len, perc ); 

Aggiornare

Il len e pos non interessa, TRACE genera sempre un errore in modalità debug . Compilato con Usa set di caratteri Multi-Byte . Aggiornato il codice da VS9 a VS14. In Release-Mode sembra funzionare tutto bene.

L’output di debug è:

 Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\windows.media.natvis. Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\windows.natvis. Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\winrt.natvis. Natvis: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\atlmfc.natvis(9,28): Successfully parsed expression 'm_hWnd' in type context 'CWnd'. Exception thrown at 0x5B4EE469 (ucrtbased.dll) in TestProgD.exe: 0xC0000093: Floating-point underflow (parameters: 0x00000000). Unhandled exception at 0x5B4EE469 (ucrtbased.dll) TestProgD.exe: 0xC0000093: Floating-point underflow (parameters: 0x00000000). 

Gli specificatori di formato non corrispondono ai tipi di argomento, quindi hai un comportamento indefinito.

  • %X ( unsigned int ) dovrebbe essere %p (puntatore).
  • %ld ( long int ) dovrebbe essere %llu ( unsigned long long ). Sulla piattaforma Windows long int è uguale a int , quindi è sempre a 32 bit, indipendentemente dal fatto che il codice sia stato creato per 32-bit o 64-bit. Solo long long è sempre a 64 bit. Ovviamente vuoi anche abbinare la firma, ecco perché è necessario utilizzare lo specificatore u .

Riferimento