| |
|
|
Daniel Hoffmann | Hi Leute Ich schreibe gerade an einer kleinen, aber feinen DLL und will die Profan-kompatibel machen. Weiß jemand, was ich da für Aufruf- und Namenskonventionen einhalten muss? Reicht es, alle Funktionen als __stdcall mit undekorierten Namen zu exportieren? Das wäre ned schlecht So, mal schnell eine kurze Zusammenfassung zu SPIT3: Es ist eine Art Taschenrechner, ähnlich der bekannten DLL Parcival von Jacob Liebeck. Ich bin einen anderen Weg bei der Auswertung gegangen als er, und nun hat er einen sehr vielseitigen Parser. Im Gegensatz dazu bin ich auf Geschwindigkeit gegangen. Das führte dazu, dass SPIT3 in seinem aktuellen Stand die Funktion cos(sqrt(x^2+y^2)) mit einer Auflösung von 401*401 Punkten auf meinem Centrino 1.3GHz-Notebook innerhalb von etwa 1.2s berechnet. Parcival benötigt für dieselbe Funktion auf dem Heimrechner von Jac bei 40*40 Punkten etwa 300ms. Dafür kann Parcival mehr Ich werde versuchen, möglichst bald eine (hoffentlich) Profan-kompatible Version hier hochzuladen, das ist ja schließlich das Ziel dieses Threads
das.dan |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 21.09.2007 ▲ |
|
|
|
|
| stdcall reicht, cdecl hingegen wäre komplizierter. |
|
|
| |
|
|
|
Daniel Hoffmann | ok, ich danke dir wie verrückt dann werde ich mal auf meinem Zweitnotebook ne frühe Beta kompilieren und hier hochladen... allerdings mit vielen Hinweisen versehen, da ich mich in Profan nur ganz wenig auskenne, besonders was zweidimensionale Arrays angeht. In einer Funktion muss z.b. das aufrufende Programm einen Zeiger auf ein zweidimensionales Array übergeben. Dann reserviert SPIT3 Speicher, damit das aufrufende Programm mit seinem Pointer darauf zugreifen kann. Wie kann man in Profan dann die einzelnen Unterarrays freigeben? Ansonsten baue ich noch ne CleanUp-Funktion ein... *grübel* |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 21.09.2007 ▲ |
|
|
|
|
Daniel Hoffmann | Ok, hier kommt die Beta... Bitte wirklich vorsichtig damit sein, möglichst die Kurzanleitung vorher lesen, und ein bisschen testen Ich würde mich über Kommentare freuen, solange sie konstruktiv sind. Leider konnte ich in der Kurzanleitung nur in C-Syntax über die Zeiger schreiben, ich hoffe, ihr versteht es trotzdem gut Vielleicht hilft mir der Jac bei Gelegenheit auch dabei, das richtig für Profan zu testen, weil das für mich noch relatives Neuland ist. |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 21.09.2007 ▲ |
|
|
|
|
| Funktioniert bei mir noch nicht...
DLL wird korrekt geladen, Funktionsadresse wird korrekt bezogen, ein Call auf evalia_interpreter gibt jedoch lediglich den Wert 1 zurück und ich erhalte einen Absturz mit anschließendem Dr.Watson.
Nach Deiner Anleitung sollte folgendes in XProfan ausreichen:
hat jedoch selbes Result wie oder einfacher
Gibt immer 1 zurück und Absturz. |
|
|
| |
|
|
|
| Nachtrag: Zum für Dich Selbertesten folgender Source anhängig als Exe:
|
|
|
| |
|
|
|
Daniel Hoffmann | Danke fürs Testen und die ausführliche Antwort. Vielleicht sollte ich die Rückgabe auch einfach nur als float machen... Gut, oder ich gebe eben einen String mit dem Ergebnis zurück |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 21.09.2007 ▲ |
|
|
|
|
Daniel Hoffmann | So, jetzt gibt es in SPIT3 zumindest eine Funktion, die von Profan aufgerufen das macht, was sie soll. Hier das Wichtigste in Kürze: Die Funktion heißt evalia_wb und erwartet zwei Parameter. Der erste zeigt auf den auszurechnenden String. Der zweite ist die Adresse des double-Wertes, in den das Ergebnis geschrieben werden soll. Jac de Lad hat mal eine INC dazu geschrieben, die ich mit in das ZIP-Archiv gepackt habe. Bitte vermeidet es erstmal, mehr geschlosssene als öffnende Klammern zu schreiben, das kann zu unerwarteten Ergebnissen führen. Ebenfalls ist es zwar jetzt möglich, auch -4*3 zuschreiben (Vorzeichen), aber das funktioniert noch nicht problemlos. In der Hoffnung, dass es nun bei jedem läuft, wünsche ich viel Spaß beim Probieren |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 23.09.2007 ▲ |
|
|
|
|
Daniel Hoffmann | So, seit meinem letzten Posting hat sich einiges getan. SPIT3 hat einen neuen Parser bekommen und erkennt jetzt auch folgende Kurzschreibweisen: 2(3+5x^2sin(xy)) als 2*(3+5*x^2*sin(x*y)), wobei die Variablen derzeit alle noch mit 0 belegt sind. Eine entsprechende Funktion wird bald eingebaut. Ebenfalls fehlen noch die Funktionen zum Berechnen eines Terms mit unterschiedlichen Werten der Variablen, ist aber keine große Sache. Syntaxfehler werden noch nicht als solche erkannt, sondern dürften vielmehr Exceptions in Form von Access Violations auftauchen *schäm*, kommt auch in den nächsten alpha-Releases. Alle Funktions- und Variablennamen müssen klein geschrieben sein, Leerzeichen sollten vermieden werden. Ich bitte euch, das Ding einfach mal zu testen, es ist wahnsinnig langsam momentan, weil der Parser mehr Durchläufe macht als in der vorigen Version. Dies macht die Auswertung eines einzelnen Terms langsamer, aber bei vielen aufeinanderfolgenden Berechnungen desselben Terms mit unterschiedlichen Variablenwerten geht alles noch etwas schneller Prinzipiel werden jetzt auch Funktionen mehrerer Parameter unterstützt, aber es gibt noch keine Ich würde mich über kleine Bug-Reports und Anregungen/Wünsche eurerseits freuen. Wenn SPIT3 fehlerarm läuft, werde ich die Entwicklung an SPIT3 Ultra fortsetzen, welches dann auch mit Vektoren und Matrizen rechnen können soll. Größenmäßig hat SPIT3 ziemlich zugelegt, 35kB ist zwar nicht die Welt, aber naja... Ach so, fast vergessen: Die Funktion heißt weiterhin evalia_wb und erwartet als ersten Parameter den auszuwertenden String, als zweiten einen Zeiger auf den double-Wert, wo das Ergebnis hin soll. Beispiel:
declare x! evalia_wb(2sin(6/5^2), addr(x!)) |
|
|
| Athlon 550 / 768 MB / 8+10 GB / Radeon 9250 64 MB / Windows 2000 Professional / TFT 20" 1680x1050 Athlon XP 2000+ / 1.5 GB / 120+250 GB / GeForce 6800 XT 256 MB / Windows XP Professional Athlon 64 3200+ / 512 MB / 60 GB / Radeon XPress 200M 64 MB / Windows XP Home / TFT 15.4" 1280x800 Intel Centrino 1.3 GHz / 512 MB / 40 GB / Radeon 9700 mobile / Windows XP Professional / TFT 15" 1400x1050 | 05.10.2007 ▲ |
|
|
|