Compiler Fehler ?

Alle Themen rund um die Erstellung von Programmen
Antworten
BerndG
Junior Member
Beiträge: 2
Registriert: 30. November 2016, 14:52

Compiler Fehler ?

Beitrag 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 ?

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Compiler Fehler ?

Beitrag 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

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Compiler Fehler ?

Beitrag von satmax »

Ich konnte es gar nicht glauben, ist bei mir genau so...

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Compiler Fehler ?

Beitrag 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.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Compiler Fehler ?

Beitrag 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.

Antworten