| |
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute! Ich fang mal nen neuen Thread an...
Ich hätte da nämlich auch noch einen Wunsch, der die Verwendung von Header-Dateien betrifft... Zur Erläuterung hier der IST-Zustand:
Angenommen, ich habe zwei Header Test1.ph und Test2.ph In beiden ist eine Konstante Demo definiert; in der ersten ph wird ihr der Wert 123 zugeordnet, in der zweiten der Wert 789. Nun führe ich dies aus: KompilierenMarkierenSeparieren Es wird in beiden Fällen 123 angezeigt.
Folgerung: Profan beginnt am Anfang des Quelltextes mit der Suche nach der $H-Direktive und durchsucht dann die gefundenen Header. Wird die Konstante gefunden, ist die Suche beendet. Wird bis zur Position der Anforderung der Konstante im Quelltext keine ph-Datei gefunden, in der die Konstante definiert ist, gibt es eine Fehlermeldung. (@ RGH: Ist das soweit korrekt?)
Mein Wunsch wäre nun, die Richtung, in der die PHs gesucht werden, irgendwie umkehren zu können, also vom Auftreten der Tilde (~) aufwärts bis zum Beginn des Quelltextes. Dann könnte man eine Konstante mehrmals definieren; welche Definition gültig ist, hinge davon ab, welche Header-Datei zuletzt eingebunden wurde. (Es spricht ja nichts dagegen, eine PH mehrmals einzubinden)
Hintergrund: Ich arbeite oft mit COM-Interfaces. Deren Funktionen (Methoden) können unter Profan nur über ihre Position in einer Funktionstabelle aufgerufen werden. Um die Sache übersichtlicher zu machen, hinterlege ich diese Positionen in PH-Dateien und weise sie den Namen der Methoden zu, etwa so: KompilierenMarkierenSeparieren Bei Verwendung mehrerer Interfaces/Header kommt es zwangsläufig zu Überschneidungen bei den Namen. In Einzelfällen kann man das manuell korrigieren, aber bei komplexeren Projekten hat das seine Grenzen. Zur Manipulation von HTML gibt es z.B. über 100 Interfaces... Auch das Zusammenfügen von Interface- und Methodenname ist keine gute Lösung; dabei entstehen Begriffe wie IHTMLElement_insertAdjacentHTML oder IHTMLEmbedElement_get_pluginspage (da tippt man sich dumm und dämlich).
Ich weiss, dass diese COM-Geschichten nicht sehr verbreitet sind, aber da Profan Com & OLE bisher überhaupt nicht unterstützt, wäre ein bisschen indirekte Unterstützung ganz schön...
Vielleicht hat aber auch jemand eine andere Idee, wie man das lösen könnte?
SeeYou Pascal |
|
|
| |
|
|
|
| Aha, Du möchtest quasi in einem Rutsch die Befehlssätze wechseln ja? hmmm.
Nur Konstanten oder auch Funktionen?
Sowas hier vielleicht? KompilierenMarkierenSeparieren |
|
|
| |
|
|
|
| Nein, er möchte den Interface-Methoden nur einen Index in form einer Konstante zuordnen. Da die Namen in den verschiedenen Interfaces sich öfters wiederholen, ständiges neue Namen erfinden mühsam ist, möchte er also nach ein oder mehreren Interfaces eine neue .PH Datei einfügen um den Index anzupassen. Weil, auch wenn die Namen oft gleich sind, so ist es aber nicht die Reihenfolge in den verschiedenen Interfaces. |
|
|
| |
|
|
|
Michael Wodrich | Hilft da nicht der Workaroud, die neue Headerdatei ganz nach oben zu setzen???
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 16.05.2006 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute!
Ich möchte einfach, dass hier KompilierenMarkierenSeparieren beim ersten Print der Wert von Demo aus der Test1. ph verwendet wird, beim zweiten der Wert aus der Test2.ph und beim dritten wieder der aus Test1.ph Damit wären Mehrfach-Definitionen einer Konstanten möglich und nutzbar. Kann ja auch noch für andere Gelegenheiten brauchbar sein...
SeeYou Pascal |
|
|
| |
|
|
|
RGH | Also zunächst einmal zur Technik, wie XProfan mit Headerdateien umgeht:
Headerdateien sind - wie etwa in C - reine Übersetzungsdateien: Der Text der vor dem Gleichheitszeichen steht (ich nenne es Symbol) wird durch den Text zwischen Gleichheitszeichen und Semikolon ersetzt. Der Text zwischen Gleichheitszeichen und Semikolon kann allerdings selbst wieder mit einem ~ eingeleitete Symbole enthalten, die zu übersetzen sind. Mehr geschieht nicht. (Und damit läßt sich eine ganze Menge machen.)
XProfan liest alle Headerdateien während des Einlesens des Quelltextes und macht daraus einen langen String, der etwa so aufgebaut ist: ;symbol1=text1;symbol2=text2;symbol3=text3;........;symboln=textn Trifft XProfan während des Einlesens des Codes nun auf ein ~ wird das darauffolgende Symbol gelesen und der String ;symbol= in der Headerdatei mit der Funktion pos (entspricht der XProfan-Funktion instr ) gesucht und ersetzt. Wenn Interpreter und Compiler ihre eigentliche Arbeit aufnehmen, sind alle Symbole bereits ersetzt.
Da all dies während des Einlesens des Quelltextes (sowohl in Interpreter als auch Compiler) geschieht, müß die Headerdatei vor dem ersten Auftreten des Symbols im Quelltext gelesen werden. Und da die Delphi-Funktion Pos vom Stringanfang an sucht, finde ich bei doppeltem Vorkommen immer nur das erste Vorkommen.
Ich könnte natürlich mal schauen, ob ich die Suchrichtung ändern kann ...
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 | 16.05.2006 ▲ |
|
|
|
|
Michael Wodrich | Auch eine Änderung der Suchrichtung wird da nichts bringen.
So wie Pascal das will müßte der Endlos-Header-Suchstring jedesmal umgeschaltet werden, wenn eine Headerdatei erkannt wird (wenn das nicht jedesmal neu eingelesen werden soll).
Diese Bequemlichkeit wird der Compiliergeschwindigkeit aber zu schaffen machen.
Wenn ~Demo mal diese und mal jene Konstante aufnehmen soll, dann ist es einfach keine Konstante mehr.
Dann definiert man sich das als Variable und nutzt statt Test1.ph und Test2.ph eben eine InitProc1 und eine InitProc2, die die Variablen mit den richtigen Werten versorgen.
Schöne Grüße Michael Wodrich (der sich schüttelt wenn er daran denkt, sich durch solch einen Code kämpfen zu müssen. Die Seiteneffekte von C lassen grüßen.) |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 16.05.2006 ▲ |
|
|
|
|
RGH | [quote:a2ce474376=Uwe Pascal Niemeier]Bei Verwendung mehrerer Interfaces/Header kommt es zwangsläufig zu Überschneidungen bei den Namen. In Einzelfällen kann man das manuell korrigieren, aber bei komplexeren Projekten hat das seine Grenzen. Zur Manipulation von HTML gibt es z.B. über 100 Interfaces... Auch das Zusammenfügen von Interface- und Methodenname ist keine gute Lösung; dabei entstehen Begriffe wie IHTMLElement_insertAdjacentHTML oder IHTMLEmbedElement_get_pluginspage (da tippt man sich dumm und dämlich).
Ich weiss, dass diese COM-Geschichten nicht sehr verbreitet sind, aber da Profan Com & OLE bisher überhaupt nicht unterstützt, wäre ein bisschen indirekte Unterstützung ganz schön...
Vielleicht hat aber auch jemand eine andere Idee, wie man das lösen könnte? [/quote:a2ce474376] Hallo Pascal, wie wäre es, wenn Du für jedes COM-Interface eine Struktur bzw. Klasse definierst? So löst es z.B. Delphi. Und wenn dann in mehreren Strukturen bzw. Klassen gleiche Eigenschaften/Methoden vorkomnmen, ist das kein Problem mehr.
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.05.2006 ▲ |
|
|
|
|
GDL | Hallo Roland,
habe selten Wünsche, aber wenn, dann ausgefallene.
Könntest du vielleicht noch den LOC Befehl aus anderen Basicversionen in Bezug auf die RS232 Schnittstelle übernehmen.
LOC: Gibt die Position des letzten Byte bei einem Lese oder Schreibzugriff auf die RS232 zurück.
Mein Workaround ist zeitlich zum Reagieren auf das Steuergeschehen zu langsam.
Servus Georg |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute!
Nochmal was zum Thema Header & COM
Nach Rolands Erläuterung ist mein ursprünglicher Vorschlag natürlich vom Tisch, aber...
Der Vorteil von Headern ist ja, dass sie Im Programm eingendlich nicht auftauchen, sondern nur als Quelle für eine Search & Replace-Aktion dienen. Man kann also so viele und so grosse PHs einbinden, wie man will.
Bei den vorgeschlagenen Workarounds von Michael (normale Variablen statt Konstanten) und Roland (Com-Methoden als Profan-Objekt-Methoden) wäre das anders. Immerhin gibt es Hunderte (Tausende?) von Interfaces, von denen etliche wiederum über 100 Methoden haben. Da läppert sich ganz schön was zusammen. Und damit meine ich nicht die nötige Schreibarbeit; dass liese sich über einen Parser erreichen (als Quelle verwende ich Auszüge aus Visual-C-Headern). Aber ich möchte vermeiden, hunderte von Variablen oder Methoden einzubinden, wenn ich vielleicht nur eine oder zwei davon wirklich brauche. Andererseits sollen aber alle Methoden zur Verfügung stehen, damit man sich auf das eigendliche Programm konzentrieren kann und nicht dauernd irgendwas nachdefinieren/ergänzen/nachschlagen muss.
Also hier nochmal ein etwas abgewandelter Wunsch dazu:
Es sollte möglich sein, zu bestimmen, woher die Werte für bestimmte Konstanten geholt werden. Eine Möglichkeit wären eine neue Direktive (nennen wir sie mal $X) und ein neues Präfix, z.B. das Grad-Zeichen °. Wird während der Ausführung/Kompilierung (nicht vorab, wie normal!) ein $X Datei.ph gefunden, sucht Profan alle folgenden mit ° gekennzeichneten Quasi-Konstanten exclusiv in der angegebenen PH, wobei jedes weitere $X den vorher eingebundenen Header überschreibt/ersetzt (es wird also immer die zuletzt eingebundene PH verwendet)
BTW: Das ist IMHO keine Frage der Bequemlichkeit, sondern eine Erweiterung der Möglichkeiten und sinnvoller als selbstentwickelte Insellösungen, die von Aussenstehenden kaum nachvollzogen werden können.
Ist allerdings fraglich, ob das vom Aufwand tragbar und technisch überhaut machbar ist... Vielleicht für XProfan 11 oder 12...
SeeYou Pascal |
|
|
| |
|
|
|
Jac de Lad | Ähhm, ich finde grad den Thread mit Wünschen für XProfan 10 nicht, also poste ich das schnell mal hier.
Ich hab mich in letzter Zeit mal in die Funktion Format$() reingefitzt und festgestellt, dass sie sehr nützlich ist. Nur ist mir eins dabei aufgefallen: Die Dezimalpunkte werden immer als Kommata übersetzt, sodass ich noch ein Translate$() einbauen muss, um einen mit Format$() formatierten Floatwert wieder in ein Float zurückzukonvertieren. Besteht vielleicht die Möglichkeit, was einzubauen, damit man die Zahl auch mit Dezimalpunkt anstatt nur mit Dezimalkomma umwandeln kann???
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 17.06.2006 ▲ |
|
|
|