Seite 1 von 1

Compiler Fehler ?

Verfasst: 30. November 2016, 15:34
von BerndG
nProglänge is 4-byte unsigned int
progsize is 4-byte unsigned int

nProglänge = 100766

progsize = (( nProglänge / 128 ) + 1 ) * 128
// progsize = 100894 !!! falsch

progsize = nProglänge / 128
progsize += 1
progsize = progsize * 128

// progsize 100864 !! richtig

In dem ersten Beispiel wird das Ergebnis der Division offensichtlich nach REAL gewandelt, was weder
erwünscht noch nachvollziehbar ist.
Was kann der Grund dafür sein ?

Re: Compiler Fehler ?

Verfasst: 1. Dezember 2016, 19:14
von Lewi
Die nachfolgende Hilfeseite für WinDev führt die Grundlagen für die unterschiedlichen Integers auf: http://help.windev.com/en-US/?1514049&n ... f_integers

Re: Compiler Fehler ?

Verfasst: 1. Dezember 2016, 20:13
von satmax
Ich konnte es gar nicht glauben, ist bei mir genau so...

Re: Compiler Fehler ?

Verfasst: 1. Dezember 2016, 22:53
von satmax
Lewi hat geschrieben:Die nachfolgende Hilfeseite für WinDev führt die Grundlagen für die unterschiedlichen Integers auf: http://help.windev.com/en-US/?1514049&n ... f_integers
Aber eine Erklärung dafür finde ich da nicht.

Re: Compiler Fehler ?

Verfasst: 2. Dezember 2016, 15:31
von Herbert
Ehh?? Was wird denn da gerechnet???

100766/128=787.234375
+1 = 788.234375
788.234375*128=100894

Du rechnest 100766/128 und packst das in eine Integer. Abrunden! Da ist also eine mathematische Ungenauigkeit vorgegeben.

100766/128 muss als Ergenis real sein, wo wäre sonst die Genauigkeit? Umwandeln in Integer erwzingt ein Runden und provoziert ein vermeintlich falsches Ergebnis.
Du rundest ab auf 787. "Vergisst" also die Ungenauigkeit von 0.234375. Das Ganze * 128 ergibt die Differenz von genau 30. Die verschenkst einfach so und wirfst dem Compiler (eh der Mathematik) einen Fehler vor.

Deine Ueberlegungen sind falsch, der Compiler hat recht.

Wenn du es "falsch" willst, musst so rechnen:

Code: Alles auswählen

nProglänge is 4-byte unsigned int
nZiff,progsize are 4-byte unsigned int
rProgsize,rZiff are reals
nProglänge = 100766
rZiff=nProglänge / 128
nZiff=IntegerPart(rZiff)
Progsize = (nZiff + 1 ) * 128		//=100864
So nebenbei würde ich nie Umlaute in Variablen verwenden. Gib mal den Code einem Engländer, der hat die Zeichen nicht auf der Tastatur.