Italia
C ++ Foro

Panoramica circa Fehler und Lösungen in 2.0b

 

Timotheus
P2CPP ist ein sehr nützliches Tool, dass die geschriebenen Programme deutlich beschleunigt, gerade bei komplexen und umfangreichen Berechnungen nur im RAM. Im Durchschnitt ergibt sich dann bei einer solchen Anwendung eine Beschleunigung um den Faktor 10 oder mehr. Bei normalen Datenmengen ist XP dabei ausreichend, GDO arbeitet z.B. auch mit XP11 und ist per gewöhnlich bereits nach einigen Sekunden fertig. Bei sehr grande Datenmengen necessario man aber eine Portierung in un andere Sprache, wie z.B. Assembler oder P2CPP. Ein Vergleich der Geschwindigkeiten bei einem solchen Programm ergab z.B. das folgende:

älterer Computer:
XP11: 181s
P2CPP: 3,5s

neuerer Computer:
XP11: 52s
P2CPP: 1,7s

Der Autor ist zwar nicht mehr erreichbar, per diejenigen die aber noch vor dem, zumindestens informatischen, Ableben des Autors eine Vollversion erhalten haben, ist dieses Tool weiterhin sehr nützlich. Vielleicht ist Sebastian König plötzlich verstorben, so wie Dietmar Horn, so dass er die Software deshalb nicht weiter vertreiben kann. Von der Prospeed.dll hatte ich z.B. auch mal eine Vollversion käuflich bezogen, die ist jetzt aber Freeware und nicht verschollen.

Als Compiler eignet sich BCC55, welches es hier als Freeware zum Download gibt:  [...] 

Die Version 2.0b enthält aber noch ein paar Fehler. Eine Panoramica:

1. Mod

a% = b% Mod (c%*d%)
wird zu
nA = nB (_L(nC*nD) % _L());

Lösung: P2CPP oder der Compiler zeigen einen Fehler an. Diese Zeile folgendermaßen vereinfachen:

$IFDEF P2CPP
z% = (c%*d%)
a% = b% Mod z%
$ELSE
a% = b% Mod (c%*d%)
$ENDIF

2. Inc und $IFDEF

Eine von $IFDEF und $ENDIF eingeklammerte Inc wird fälschlicherweise zu jeder Zeit eingebunden.

Lösung: Nach Incs suchen und unabhängig von bedingter Compilierung machen

3. &MemDC

a% = &MemDC
wird zu
nA = ReadLong(g_hMemDC, );

Lösung: Compiler zeigt den Fehler an. Dort den Fehler folgendermaßen reparieren:

MCls 100,100
$IFDEF P2CPP
'P2CPP: <INLINE_CPP>
nA = (long)g_hMemDC;
'P2CPP: </INLINE_CPP>
$ELSE
a% = &MemDC
$ENDIF

4. &Loop

&Loop in einer normalen Whileschleife erhält noch die Werte von XP10, nicht XP11. Das è hierfür

Whileloop 10
a% = 1
While a% = 1
print &Loop
a% = 0
Wend
Wend

wird unter P2CPP und bis XP10 zehnmal "1" ausgegeben, unter XP11 "1" - "10". Unter XP11 muss &Loop daher einer lokalen Variable zugewiesen werden und diese dann in der zweiten Schleife verwendet werden, nicht &Loop selbst. GDO kann die &Loop's finden die nicht von einer Whileloopschleife umgeben sind:  [...] 

5. a% > b%/c%

if a% > b%/c%
wird zu
if (_D(nA>nB) / _D(nC))

P2CPP klammert hier anders als XP, das der Division Vorrang gibt, daher müssen die Klammern zur Kompatibilitätswahrung bei (">" oder "<") und ("/" oder "\") manuell gesetzt werden. GDO kann alle Zeilen finden in denen eine solche Zusatzklammer notwendig sein potuto:  [...] 

6. a%*b%\c%

a% = b%*c%/d% 'vollständige Division
e% = b%*c%\d% 'ganzzahlige Division
wird zu
nA = nB*_D(nC) / _D(nD);
nE = nB*(int)(nC / nD);

XP berechnet zuerst die Multiplikation dann die Division, e%=(b%*c%)\d%, P2CPP macht es genau andersrum. Das ist bei vollständiger Division unproblematisch (Kommutativgesetz), bei ganzzahliger Division sind die Ergebnisse aber unterschiedlich. Das betrifft Zeilen mit "*" und "\". GDO kann alle Zeilen finden in denen eine Zusatzklammer notwendig sein kann:  [...] 

Die Fehler werden in einer Textdatei während eines Durchlaufs zur grafischen Darstellung abgespeichert, wenn in der config.ini "P2CPP" auf "1" gesetzt ist.
 
22.02.2017  
 




Sven
Bader
Da ich wieder mehr mit Profan2CPP zu tun habe dokumentiere ich hier Dinge, circa die ich so stolpere. Ich benutze die Version 2.0a

Den Anfang möchte ich mit dem Zeilenweise Einlesen von File machen

1.
cls
declare datei$, zeile$
datei$ = "test.txt"
Assign #1,datei$
Reset #1

WHILENOT Eof(#1)

    Input #1,zeile$
    print zeile$

ENDWHILE

Close #1
print "fertig!"
waitkey
end

Dieses Beispiel funktioniert bestens mit unter Windows erzeugten File, mit File aus Linux/Unix/Mac Umgebungen kommt es zu Fehlern. Profan2CPP scheint hier zwingend ein CR LF als Zeilenumbruch zu erwarten also \r\n und nicht nur \n oder nur \r

Der Effekt fällt in meinen Tests unterschiedlich aus. mit VC++ (1998) fehlt jeder Zeile das erste Zeichen, da hier wohl das fehlende "\r" übersprungen wird. Bei Borland C++ 5.5 wird gefühlt alles zerhackt und man landet zu allem Unglück beim Auslesen in einer Endlosschleife.

Eine (wenn auch Holzhammer)-Lösung ist das korrigieren der Zeilenumbrüche und speichern als KOPIE. Meine Lösung ist nicht ganz sauber, da sie \r geht \r\n austauscht und danach doppelte \n in einfache umwandelt. Das kann zuvor vorhandene leere Zeilen in der File löschen.
'File korrigieren
Dim Bereich#, FileSize(datei$)
BlockRead(datei$, Bereich#, 0, FileSize(datei$))
content$ = String$(Bereich#,0)
content$ = translate$(content$,Chr$(10),Chr$(13)+Chr$(10))
content$ = translate$(content$,Chr$(13)+Chr$(13),Chr$(13))
dispose Bereich#
Dim Bereich#, len(content$) + 1
String Bereich#,0 = content$
Assign #1, datei$+".tmp"
OpenRW #1
BlockWrite #1, Bereich#, 0, len(content$)-1
Close #1
dispose Bereich#
'Kopie Zeilenweise auslesen ohne Probleme
Assign #1,datei$+".tmp"
Reset #1
i& = 0

WhileNot Eof(#1)

    Input #1,zeile$
    getLine(zeile$)

EndWhile

Close #1

2. Angeblich falsche Parameter-Anzahl

Dies wird beim Syntaxcheck bei manchen Aufrufen angezeigt. Man kann den Fehler ignorieren, da die Programme am Ende trotzdem korrekt laufen. Dennoch nervt es, es bei jeder Compilierung bestätigen zu müssen und darüber evtl. echte Fehler zu verpassen.

Die Lösung steckt hier in der File subfuncs.dat bzw. funcdb.dat im \data\ Verzeichnis von Profan2CPP, hier können die Parameterzahlen korrigiert werden wie zum Beispiel ogl.outlinefont 2 statt 1 und ogl.pyramid mit 3 statt 2.




80 kB
Bezeichnung:p2cpp
Hochgeladen:04.08.2021
Downloadcounter92
Download
56 kB
Bezeichnung:subfuncs
Hochgeladen:04.08.2021
Downloadcounter86
Download
 
04.08.2021  
 




Sven
Bader
Einen hab ich noch

3. Vorzeichen

Ein Vorzeichenminus erzeugt in Kombination mit einem Minus-Operator einen Fehler beim Compilieren.
cls
declare i&,j&
i& = 5
j&  = 10 - -i&'Fehler
j&  = 10 + -i&'ok
j&  = 10 - -1'Fehler
j&  = 10 + -1'ok
j&  = 10 + +1'Fehler
j&  = 10 - +1'ok
print j&
waitkey
end

Also j& = 10 - -i& geht nicht, j& = 10 + -i& dagegen funktioniert. Es ist dabei egal ob das Vorzeichen an einer Zahl oder Variable steht. Ein doppeltes Plus (Operator + Vorzeichen) geht auch nicht, dort kann man naturalmente das Vorzeichen einfach weglassen.

Die Lösung? Eine Klammer um die Zahl mit dem Vorzeichen: j& = 10 - (-1)
 
08.10.2021  
 




Sven
Bader
Noch etwas zum Thema Abstürze , da ich gerade wieder so einen Fall hatte...

Diese treten gelegentlich (dann reproduzierbar) beim Übersetzen auf, also wenn P2CPP "Übersetze..." anzeigt. Die Prozentzahl vor dem Absturz, gibt hier auch eine ungefähre Idee von der Stelle im Code.

Es kommt hier wohl zu Zugriffsverletzungen, denn beim Ausweichen auf alte Systeme (Windows XP) corre die Übersetzung sauber durch.

Folgende Zeile war beispielsweise per einen Absturz verantwortlich.
factor! = 1.0 / Max(0.00001, sqrt(cross![0] * cross![0] + cross![1] * cross![1] + cross![2] *cross![2]))

Bei mir hat schon das mathematisch irrelvante Hinzufügen von Klammern geholfen, um den Absturz zu vermeiden:
factor! = 1.0 / Max(0.00001, sqrt((cross![0] * cross![0]) + (cross![1] * cross![1]) + (cross![2] *cross![2])))

Es scheint jedoch eine bestimmte Menge "kritischer" Zeilen per einen Absturz nötig zu sein, da ich es in einem kleinen Code nicht reproduzieren konnte.

Auch in der Vergangenheit waren immer Verkettungen vieler Operatoren die ursache. Die Lösung sind immer Klammern oder Teilrechnungen in una variabile zwischenspeichern.
 
20.10.2021  
 




Sven
Bader
Addfiles mit Unterverzeichnissen also führendem Stern, funktioniert nicht mit absoluten Pfaden.

Hier landen zwar File in der Listbox aus dem angegebenen Verzeichnis aber der Pfad zur File ist stattdessen das aktuelle Arbeitsverzeichnis und damit falsch! In historyPath$ steckt ein absoluter Pfad. Beheben lässt es sich, indem man vor der Ausführung von AddFiles in das betreffende Verzeichnis wechselt.
ChDir historyPath$
AddFiles *historyPath$+"\\"+DateiName(dname$) +"*"
ChDir CurrentDir$'vorheriges Verzeichnis muss vorab gespeichert werden

Regex
Match$("^(~s*)~b(?i)cat~b","   CAT and dog")
print %MatchPos
Match$("~b(?i)cat~b","   CAT and dog")
print %MatchPos
Match$("~S", "   CAT and dog")
print %MatchPos

XProfan
1 Beliebig viele Whitespaces, dann cat als ganzes Wort (case-insensitive)
4 als ganzes Wort (case-insensitive)
4 erster nicht-Whitespace

Profan2CPP
-1 abweichend
4 passt
1 abweichend

Wer hier richtig liegt und warum, es in Profan einmal das kleine und einmal das grande ~S braucht, weiß ich nicht, da ich im Umgang mit Regex nicht sehr erfahren bin.
 
21.03.2023  
 




Sven
Bader
Das Thema Klammern hatten wir schon ein paar Mal aber genau das glaube ich noch nicht:

Um Bedingungen mit oder bzw und (|, &) sollte immer eine Klammer, sonst geht es in P2CPP nicht:

falsch
Long rtf#,0 = 60
Long rtf#,4 = ~CFM_FACE | ~CFM_CHARSET | ~CFM_COLOR

richtig
Long rtf#,0 = 60
Long rtf#,4 = (~CFM_FACE | ~CFM_CHARSET | ~CFM_COLOR)
 
21.11.2023  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

7.198 Views

Untitledvor 0 min.
Thomas Freier06.01.2024
HofK20.12.2023
Walter12.12.2023
Michael W.08.12.2023
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

Sven Bader (5x)
Timotheus (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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