Deutsch
C ++ Forum

Unterschied INI-Dateien zwischen XP-11 und P2CPP2.0

 

KHR
Hallo miteinander,

als stolzer neuer Anwender von P2CPP bin ich gerade dabei einige Programme auf P2CPP "umzustricken"

Dabei hat mich das Verhalten von P2CPP bei schreiben von INI-Dateien einige Zeit gekostet.
Erst nach längerem Suchen habe ich dann den Unterschied entdeckt.

Xprofan wandelt Variablenwert (integer und float) automatisch richtig um, P2CPP macht das nur bei integer richtig, floats wandelt es in integer um.

Natürlich kann man das leicht mit @str$(float) umgehen, aber man muß erst mal drauf kommen, was und wieso da nun anders läuft. Vielleicht nutze ich da ja auch nur was, das eher ungewollt in Xprofan funktioniert und so nicht zur Verwendung gedacht ist.

Hier mein Beispiel-Programm und die Ergebnisse:
KompilierenMarkierenSeparieren
declare INI_Datei$
declare temp1%
declare temp2!
 $IFDEF P2CPP
INI_Datei$ ="D:\TMP\P2CPPTEST.INI"
 $ENDIF
 $IFDEF COMPILER
INI_Datei$ ="D:\TMP\XP11TEST.INI"
 $ENDIF

whileloop 8

    temp1% = @rnd(500)
    temp2! = @rnd()*500
    WriteIni INI_Datei$,"Integer","Parameter-"+@trim$(@str$(&loop)) = temp1%
    WriteIni INI_Datei$,"Float","Parameter-"+@trim$(@str$(&loop)) = temp2!

endwhile


Als Ergebnis erhalte ich bei P2CPP:

[Integer]
Parameter-1=405
Parameter-2=373
Parameter-3=29
Parameter-4=183
Parameter-5=160
Parameter-6=119
Parameter-7=146
Parameter-8=200
[Float]
Parameter-1=0
Parameter-2=281
Parameter-3=96
Parameter-4=404
Parameter-5=292
Parameter-6=239
Parameter-7=175
Parameter-8=447

und bei Xprofan:

[Integer]
Parameter-1=0
Parameter-2=430
Parameter-3=136
Parameter-4=159
Parameter-5=186
Parameter-6=41
Parameter-7=35
Parameter-8=29
[Float]
Parameter-1=15.689970
Parameter-2=101.290483
Parameter-3=335.827209
Parameter-4=80.897733
Parameter-5=212.836884
Parameter-6=237.397032
Parameter-7=420.427217
Parameter-8=146.648286

Egal ob nun Bug oder feature - man sucht ne weile bis man die Ursache findet
 
Gruß
Karl-Heinz
WIN XP home/Pro / XPROFAN 11 / P2CPP
ATMEL + BASCOM Fan
17.12.2008  
 




RGH
KHR
Egal ob nun Bug oder feature - man sucht ne weile bis man die Ursache findet


Weder Bug noch Feature, sondern falscher Parametertyp: Laut Hilfe ist der letzte Parameter bei WriteIni ein String, also wäre man mit @Str$() auf der sicheren Seite.
Lässt man dieses weg, greift bei XProfan die automatische Typumwandlung (siehe Hilfe, Abschnitt 7.8 ), die den numerischen Wert in einen Sttring umwandelt, wobei die Einstellungen durch @Set("Decimals",...) und @Set("NumWidth",...) berücksichtigt werden.
XProfan benutzt für WriteIni mit Ini-Dateien ausschließlich die API-Funktion WritePrivateProfileString.
Möglicherweise nutzt P2CPP bei numerischen Werten die API WritePrivateProfileInt, was erklären würde, dass hier die Umwandlung in einen Integer erfolgt.

Wenn man auf der sicheren Seite sein möchte, sollte man nichts dem Zufall und die Typumwandlung nicht der Programmiersprache überlassen. ;)

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
17.12.2008  
 




Sebastian
König
Hallo,

auch in Profan2Cpp findet eine automatische Typenumwandlung statt (es gibt mehrere Versionen für WriteIni() und je nach Typ des letzten Parameters wird die passende aufgerufen). Das Problem ist, dass Fließkommazahlen dabei bisher nicht explizit berücksichtigt werden und C++ offenbar in diesem Fall lieber die Integer- als die String-Version benutzt. Ich werde das in der nächsten Version ändern, damit das Verhalten in Profan2Cpp und XProfan gleich ist. Abgsehen davon hat Roland natürlich recht damit, dass die Verwendung von str$() in jedem Fall die sicherste Variante ist ;).

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
17.12.2008  
 



RGH
Wenn man auf der sicheren Seite sein möchte, sollte man nichts dem Zufall und die Typumwandlung nicht der Programmiersprache überlassen. ;)

Gruß
Roland


Jau!

Die automatische Typumwandlung gestaltet das Fehlerfinden manchmal ziemlich langwierig.

Es gibt aber eine undokumentierte Schreibweise (xpse) welche die Voraussetzungen erfüllt, dass Funktionen auch nur den definierten Typ zurückgeben (können).

Normales XProfan:
KompilierenMarkierenSeparieren
Kleines XPSE 1: (keine Parameters Zeile)
KompilierenMarkierenSeparieren
proc meineProc(a%,b%,c%)

    return a%+b%+c%

endproc


Kleines XPSE 2: (kein PROC und ENDPROC, statt dessen wie z.B. in c#, php und js geschweifte Klammer für Block.)
KompilierenMarkierenSeparieren
meineProc(a%,b%,c%){

    return a%+b%+c%

}


Kleines XPSE 3: (Wegfall der Variablensuffixe, statt dessen wie z.B. in c#, php, js und pascal/delphi)
KompilierenMarkierenSeparieren
Kleines XPSE 4: (Funktion "meineProc" zum Typ "int" deklarieren um z.B. sicher zu stellen, dass z.B. kein String zurückgegeben wird)
KompilierenMarkierenSeparieren
setzt man den Typ vor dem Namen einer Funktion, wird der Funktionswert auch nur von diesem Typ zurückgegeben. Folgende Varianten sind seither vorhanden:
KompilierenMarkierenSeparieren
(natürlich muss man dann die Funktionen nicht (wie hier im Beispiel) in eine einzige Zeile "ziehen")

Wenn es mal interessant wird, dann könnte xpse also auch die Rückgabewerte von Funktionen bei Zuweisungen auf Typengleichheit überprüfen - wo er doch eh als Überbringer unangenehmer Botschaften gefeiert wird.

@KHR: XPSE war damals auch wegen Profan2CPP entstanden, funktioniert {$cpp} bei Dir oder nutzt XPSE nicht?
 
17.12.2008  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.345 Betrachtungen

Unbenanntvor 0 min.
rquindt31.05.2020
funkheld16.12.2013
H.Hackl05.03.2012

Themeninformationen

Dieses Thema hat 4 Teilnehmer:

iF (1x)
Sebastian König (1x)
RGH (1x)
KHR (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie