| |
|
|
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. |
|
|
| |
|
|
|
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.
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.
|
|
|
| |
|
|
|
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) |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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
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. |
|
|
| |
|
|
|
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
richtig
|
|
|
| |
|
|