Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Dein Letzter Punkt ist eigentlich etwas, was man häufiger antrifft.
Ohne jetzt deinen Code im Detail zu kennen: Wieso kannst du das nicht mit einem Interface machen? Dann verwendest du nur noch Interfaces, und was unten drunter dann wirklich steht wird bei der Erstellung entschieden.
Hoffe das war jetzt nicht zu kryptisch.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das wäre ein großer Aufwand mit nicht allzu tollem nutzen. Erstens sehe ich ein Problem mit direkten Vergleichen. Wenn ich mich recht erinnere, wird der eigentliche Speicherbereich einer Interfacereferenz, also das, wo letzendlich die Methodenpointer usw drinne stehen, für jedes QueryInterface neu erzeugt.
Zweitens betrachte ich Interfaces eher als "notmittel". Ich benutze sie nicht sonderlich gerne, auch wegen der Referenzzählung. Eine Abstrakte Basisklasse ist mir da lieber. Drittens kommt das Problem rein, dass ich in den Methodendeklarationen der mindestens einer Betroffenen Klasse auch wieder Referenzen auf "hohe" Typen habe, also müsste ich den Großteil in Interfaces verpacken. Aufwand >>> Nutzen imo.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Diese Casts der Lesbarkeit wegen in Methoden oder Funktionen auslagern, will ich vermeiden. Erstens produziert es mehr Code. Zweitens ist es langsamer. Man kann natürlich inline verwenden, aber ob das immer zu 100% optimal läuft, ist auch nicht sicher. Zumal ein Cast sich ja nicht mal auf Instruktionsebene, sondern allein auf der Compilerebene abspielt. Einsparung gäbe es dabei garnicht. Nur die Möglichkeit, auszulagern.
So mal ganz generell: Code nicht lesbar zu schreiben mit der Ausrede, dass man sich nicht sicher ist, ob der Compiler da wieder die ursprüngliche Performance rausholen kann, ist... einfach nur doof Vertrau dem Compiler. Wenn da inline dran steht, wird er auch inline machen. Alles andere wäre ein Bug im Compiler. Und das heißt, es nicht nicht deine Baustelle, sondern die der Compiler-Entwickler.
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Lord Horazont hat geschrieben:
@Lossy: Funktionieren die Coderegions unter Delphi eigentlich? Also ein-/ausklappbar?
Da muss ich dich bitter enttäuschen. Mit Delphi funktioniert deine Bibliothek gar nicht. Die Regionen heißen in delphi {$region} und diverse direktiven heißen anders bzw gibt es nicht. zum Beispiel. {$mode} gibts nicht. {$IF ...} erwartet {$ifend}. {$PACKENUM} und {$PACKRECORDS} gibts nicht.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm, der Fehler kommt mir bekannt vor, aber ich kann dir gerade keinen genauen Tipp für die Ursachensuche geben. Welche FPC-Version verwendest du? Benutzt du das passende Thorium-Paket? Ansonsten versuch mal, alle ppu-Dateien von Thorium zu löschen und dann das Package clean zu kompilieren. Das könnte helfen.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
FPC Version war irrtümlicherweise doch 2.2.4, hatte Lazarus auf dem PC erst vor nen paar Tagen runtergeladen und dachte da wäre die 2.4.0 dabei.. Ok das geht jetzt schonmal =)
So aber dann gehts weiter...
Also erstmal in jedem Beispiel bekomme ich ne Exception bei TThorium.Create... Wobei ich mir nicht sicher bin wie aussagekräftig das ist, könnte auch von Lazarus selbst kommen weil das beim Aufruf in der Konsole nicht auftritt.
Beim rttisample bekomme ich aber sowohl in Lazarus als auch in der Konsole eine SIGSEV... Vielleicht deshalb, weil ich
Code:
Result.DisableHostControl;
Auskommentiert hatte (nicht definierter Ausdruck).
Mit etwas Recherche bin ich dann hierauf gekommen:
Code:
Result.ThoriumReference.DisableHostControl;
Was allerdings auch nicht funktioniert, weil wahrscheinlich die Referenz garnicht existiert. Bin aber auch auf der Arbeit und daher sind meine Möglichkeiten, hier was zu debuggen oder sonstiges nicht grade überragend
Also wenns alles ordentlich funktioniert würde ich Thorium gerne in meinem Partikeleditor verwenden, hatte zwar auch mal kurz den Gedanken FBScript soweit wie nötig aufzupeppen aber warum sollte ich das tun wenns hier schon was gutes "ernsthaftes" gibt =)
Bis dahin ist es aber noch etwas hin... Aber dann könnte ich vielleicht deine Hilfe bei der Implementierung gebrauchen.
MFG
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich freue mich rieeesig, dass du Thorium in einer Produktivumgebung einsetzen willst .
Zum Fehler: Ich würde mich über eine genauere Beschreibung freuen. Eventuell gibts nen Stacktrace, wenn dus in der Konsole ausführst? Oder kannst du einen aus Lazarus (Ansicht -> Debuggerfenster -> Aufrufstack) besorgen?
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Hab ich mir gedacht Ich kenn das ja bei mir auch ich würde mich auch mal freuen wenn FB in nem größeren Projekt eingesetzt würde xD Mache mir ja immernoch ein paar Hoffnungen mit Gael... =)
Den Stacktrace hatte ich ganz vergessen! Das einzige, was ich dir geben kann, ist etwas, dass du glaub ich schon weißt.
Hier die Daten:
Code:
\examples\customlib\lib\i386-win32>rttisample
Welcome to FUMS (Fake User Management System)
New user.
Enter user name: ddd
Verifying user name ... valid.
Real name: sksd
An unhandled exception occurred at $0040241C :
EAccessViolation : Access violation
$0040241C
$0042F1D0 TTHORIUMREFERENCEIMPLEMENTATION__FREEREFERENCE, line 5799 of thorium.pas
$0048CEA0 TTHORIUMSTACK__CLEARSTACK, line 15295 of thorium.pas
line 15295 of thorium.pas: Hier steht extra was von Exception und unbeabsichtigtem Aufruf der Routine falls ich das noch richtig in Erinnerung hab, und in 5799 wird eben dieses FHostControlled Feld abgefragt.. Daher meine Vermutung, dass es mit meiner auskommentierten Zeile zusammenhängt.
Einen genaueren Stacktrace kann ich dir evtl. heute Abend irgendwann mal geben, oder morgen. Aber ich gehe mal davon aus, dass du das so schon nachvollziehen kannst.
MFG
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm … Bei mir crasht es sowohl mit i386-linux als auch mit i386-win32 an dieser Stelle nicht. Das Programm läuft ohne Probleme durch. Allerdings habe ich auch einige Dinge in der Datei fixen müssen, bis es lief, von daher lade ich jetzt 1.5.0.2 hoch. Ich hab allerdings einen Crash, wenn ich das Sample als 64-Bit Anwendung teste, den werde ich aber selber noch verfolgen müssen …
Schau mal, ob es jetzt bei dir läuft.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ja mit deinem Code gehts bei mir auch.. Hatte die Referenz oben auch noch anders... wahrscheinlich lags daran.
Den Crash beim Start kann ich leider garnicht nachvollziehen. Tritt wie gesagt nur in Lazarus auf und dass scheinbar auch nur, wenn man nicht debugt werd das heute auch mal zu Hause am 64bit-Linux probieren können.
Ist es möglich, einfache Methoden und globale Variablen vom Host aus zu setzen?
MFG
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Meinst du, globale Variablen die vom Skript deklariert wurden oder willst du Variablen aus dem Host heraus deklarieren? Letzteres ist unter dem Stichwort Property bei eigenen Libraries zu finden. In der InitializeLibrary-Methode rufst du dann eine der RegisterProperty-Methoden für jede Property ( = globale Variable, die dann zugreifbar ist, wenn die Library eingebunden wurde) auf. Callbackbasierte Properties sind eine Art virtuelle Property, die nur über Callbacks funktionieren. Die Direct-Property erlaubt keine Kontrolle über den Zugriff, außer, dass Schreibzugriff aus dem Skript heraus generell verboten werden kann. Dafür ist dieser Typ auch am einfachsten zu handhaben. Aus dem Host heraus wird der Wert über die public-Property Value gesetzt. Wenn Value Werte zugewiesen werden, die nicht mit der TypeSpec übereinstimmen, die der Register-Methode übergeben wurde, kommt es zu … interessanten … Fehlern. Die DirectSetCallback-Property funktioniert genauso wie die Direct-Property, nur, dass man hier ein Callback angeben muss, welches aufgerufen wird, wenn der Property aus dem Skript heraus ein neuer Wert zugewiesen wird.
Für Funktionen und Methoden sind die RegisterNativeCall-Methoden interessant. Für Beispiele empfehle ich, einen Blick in die Units des thoriumlibpkg zu werfen. Dort gibts zusätzlich zum example customlib noch weitere (einsatzbereite) Bibliotheken, die das ganze etwas veranschaulichen.
Noch Fragen?
greetings //Edit: nicht vergessen, die 1.5.0.3 runterzuladen
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ja zwei hätte ich da im Moment tatsächlich noch... =) wie siehts denn mit records/struct von der Hostanwendung aus aus? Hab nur was mit Objekten gefunden auf die schnelle... Werden typisierte Pointer unterstützt? Also sowas wie PMeinRecord = ^TMeinRecord... und die dann natürlich entsprechent dereferenziert mittels -> wie das bei C++ ist...
Und noch ne eher allgemeine Frage zu Lazarus... Kann mich mit dem Ding irgendwie nicht anfreunden! Hab die FPC-Quellen drauf und den Pfad dazu auch angegeben. Der beschwert sich auch nicht, dass der Pfad falsch ist (sonst bringt der ja diese Meldung, dass das Sourcen-Verzeichnis den und den Ordner enthalten müsste etc.). Trotzdem kann ich nichts kompilieren, weil der die Units nicht findet (md5, contnrs, evtl. noch weitere). Die findet der selbst dann nicht, wenn ich den Suchpfad direkt mit angebe... Woran könnte das liegen? Ist auch nur bei mir zu Hause auf 64bit Linux so...
MFG
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, Records sind generell eher nicht unterstützt. Aber den Support für Pointer auf Records kann man mit einer Ableitung von TThoriumHostObjectType nachrüsten.
Was die Lazarus-Sache betrifft: Versuch mal, das Paket fcl über den Projektinspektor (Projekt -> Projekt-Inspektor) zu den Abhängigkeiten hinzuzufügen, wenn es nicht schon drin ist. Ansonsten … Keine Ahnung, ich habe hier keine Probleme (mehr). Unter Windows lief es damals auch reibungslos … Gegebenenfalls mal im lazarus-forum.de nachfragen.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Hm also das wäre wichtig. Pointer auf records würden mir schon reichen bzw. wären tatsächlich auch das, was ich brauche. Ist auf jeden Fall unersetzlich, da den Events ja immer ein Pointer auf die Partikeldaten mitgegeben wird und das ist nunmal ein record... Aber Pointer auf Variablen/Feldern gehen oder?
_________________ I'm not the signature, I'm just cleaning the floor...
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.