amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > HTMLView, gcc und fread, komische Dinge passieren [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

05.02.2012, 18:05 Uhr

ciVic
Posts: 131
Nutzer
Hi allerseits,

ich arbeite grad an einem Programm, dass MUI und HTMLView einsetzt. Da ich ein Fan von C++ bin, und einiges an fertigem Code schon in C++ war, ist auch die Datei, die mit MUI arbeitet, C++. Das ist an sich zunächst kein Problem (ok, nachdem ich so manches anpasste). Aber ich stelle z.B. fest, dass ich in Callback-Funktionen kein fread einsetzen kann. Ein Beispiel, HTMLviewer_LoadFunc(), welche vom HTMLViewer aufgerufen wird. Außerhalb der Callback funktionieren die gleichen aufrufe sehr gut. Außerdem mußte ich in einem anderen Codebereich fstream-Funktionen gegen fread u.ä. ersetzen. Ich bin mir schon nicht mehr sicher, ob es nicht doch noch irgendwo einen Teil in meinem Programm gibt, der die Fehler auslöst. Ich muß auch dazu sagen, dass das Programm auch die ixemul braucht. Ist es vielleicht ein bekanntes Problem, dass die Sachen nicht zusammen arbeiten?

[ - Antworten - Zitieren - Direktlink - ]

05.02.2012, 23:12 Uhr

jolo
Posts: 108
Nutzer
Verwendest Du OS3.x?
Wenn ja, hast Du das Problem, dass für Callback-Hooks die Parameter in den Prozessor-Registern übergeben werden müssen, was unter g++ 3.x nicht funktioniert. Hier musst Du auf C ausweichen um die Parameter aus den Registern zu lesen. Zudem werden Callback-Hooks u.U. nicht von Deinem Programm aufgerufen sondern von der Klasse selber. Somit solltest Du Dein Programm fürs große Datenmodell kompilieren oder aber mindestens das Attribut "__saveds" für solche Funktionen verwenden.

[ - Antworten - Zitieren - Direktlink - ]

06.02.2012, 08:45 Uhr

ciVic
Posts: 131
Nutzer
@jolo:

Genau das verwende ich. Die Übergabe habe ich gelöst wie in MuiPlusPlus, also:

ULONG HTMLviewer_LoadFunc()
{
register struct HTMLview_LoadMsg *_lmsg asm("a1"); struct HTMLview_LoadMsg *lmsg = _lmsg;
register Object *_obj asm("a2"); Object *obj = _obj;
register struct Hook *_h asm("a0"); struct Hook *h = _h;

...

}

Den g++ 3.x zu verwenden habe ich auch schon aufgegeben. Nutze den 2.95.

Dieses __saveds wird beim gcc per Makro, so wie ich das in den Beispielen gesehen habe, einfach wegdefiniert. Ich hatte das auch mal damit probiert, aber keinen echten Effekt feststellen können. Wird das vom gcc wirklich verwendet?

Das große Datenmodell habe ich noch nicht probiert. Wie macht man das beim gcc?

Danke für Hilfe schonmal...

[ - Antworten - Zitieren - Direktlink - ]

06.02.2012, 09:21 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ciVic:
ULONG HTMLviewer_LoadFunc()
{
register struct HTMLview_LoadMsg *_lmsg asm("a1"); struct HTMLview_LoadMsg *lmsg = _lmsg;
register Object *_obj asm("a2"); Object *obj = _obj;
register struct Hook *_h asm("a0"); struct Hook *h = _h;
...
}

Wenn das mit C++ übersetzt werden soll, dann ist "extended asm" eine Möglichkeit. Für C++ sollte man jedoch auch über die Verwendung von HookEntry() aus der amiga.lib nachdenken.

Zitat:
Den g++ 3.x zu verwenden habe ich auch schon aufgegeben. Nutze den 2.95.
Warum nicht was neueres als 2.95?

Zitat:
Dieses __saveds wird beim gcc per Makro, so wie ich das in den Beispielen gesehen habe, einfach wegdefiniert.
Die SAS/C-Schlüsselworte werden von GCC Versionen (die diese auch unterstützen) nicht wegdefiniert, sondern in die entsprechenden GCC-Attribute umgesetzt. So braucht man den Code halt nicht speziell an den GCC anpassen.

Zitat:
Ich hatte das auch mal damit probiert, aber keinen echten Effekt feststellen können. Wird das vom gcc wirklich verwendet?
Ja, wenn man mit den entsprechenden Optionen übersetzt, dann haben diese Schlüsselwörter auch einen Effekt. Die Option für small-data lautet -fbaserel. Das muß sowohl beim Übersetzen als auch beim Linken angegeben werden.

Zitat:
Das große Datenmodell habe ich noch nicht probiert. Wie macht man das beim gcc?
GCC verwendet standardmäßig das große Datenmodell. SAS/C verwendet standardmäßig "small-data".

[ - Antworten - Zitieren - Direktlink - ]

06.02.2012, 14:58 Uhr

akl
Posts: 265
Nutzer
@ciVic:
Passiert der Callback von einem anderen Prozess aus? Nutzt Du also ein Datei(handle), das von einem Prozess geöffnet wurde, in einem anderen?

[ - Antworten - Zitieren - Direktlink - ]

06.02.2012, 15:43 Uhr

ciVic
Posts: 131
Nutzer
Zitat:
Original von gni:

Wenn das mit C++ übersetzt werden soll, dann ist "extended asm" eine Möglichkeit. Für C++ sollte man jedoch auch über die Verwendung von HookEntry() aus der amiga.lib nachdenken.


HookEntry() klingt super. Das scheint eine saubere Lösung zu sein.

Zitat:
Warum nicht was neueres als 2.95?

Mit einem 3.x wollten die MUI-Header wegen einiger Assembler-Geschichten nicht kompilieren, und bevor ich die alle anpasse habe ich lieber einen älteren verwendet. Oder gibt es da was neueres?

Zitat:
GCC verwendet standardmäßig das große Datenmodell. SAS/C verwendet standardmäßig "small-data".

Dann ist das wohl schon richtig, so wie ich es habe. Aber so wie ich das verstanden habe, würde HookEntry() eh alles lösen. Sieht nach einem guten Tip aus.




@akl:

Das ist eine gute Frage. Ich habe mich auch schon erinnert, dass man AmigaDOS-Zugriffe nur aus einem Thread gleichzeitig machen darf. Da der Callback von HTMLView aufgerufen wird, was schon beim Aufbau der HTML-Seite asynchron aussieht, könnte das durchaus sein. Mich wundert nur, dass ich das alles aus dem Beispielcode habe, es also gehen sollte. Vielleicht muß ich da mehr aufpassen, wenn ich den Code einfach übernehme.

[ - Antworten - Zitieren - Direktlink - ]

06.02.2012, 16:14 Uhr

Holger
Posts: 8050
Nutzer
Zitat:
Original von ciVic:
Ich habe mich auch schon erinnert, dass man AmigaDOS-Zugriffe nur aus einem Thread gleichzeitig machen darf.

AmigaDOS-Aufrufe kann man durchaus auch von anderen Threads aus machen. Das gilt aber nicht für fread. Das ist keine Funktion der dos.library, sondern aus der Standard-Bibliothek des jeweiligen Compilers. Im Falle von gcc/ixemul kannst Du davon ausgehen, dass diese Funktion nicht von verschiedenen Tasks aus aufgerufen werden darf.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

07.02.2012, 09:35 Uhr

ciVic
Posts: 131
Nutzer
Ich habe es jetzt mal mit HookEntry() versucht, und stelle fest, das ist wohl nicht so einfach, wie ich dachte. Wenn ich mir den Aufruf zum Erstellen des HTMLViewers ansehe:

CL_HTMLviewer = MUI_CreateCustomClass(NULL,MUIC_HTMLview,NULL,sizeof(struct HTMLviewer_Data),HTMLviewer_Dispatcher);

so stelle ich fest, dass man auf jedenfall eine Funktion angeben muß. Sehe ich das richtig, dass ich selbst eine schreiben muß, die CallHook() der amiga.lib aufruft, welches dann erst den eigentlichen Dispatcher aufruft? Oder gibt es ein CreateCustomClass, wo ich direkt die Hook Struktur angeben kann?

Und die Merkwürdigkeiten gehen auch weiter. Ich starte das Programm derzeit aus einer Shell. Das geht allerdings exakt 5 mal. Dann muß ich die Shell schliessen, neu öffnen, dann geht es wieder 5 mal, sonst lädt erst HTMLView keiner Bilder, und nach ein paar weiteren Aufrufen die ganze GUI nicht mehr. Ich vermute mal, dass ich etwas nicht richtig aufräume beim Beenden. Aber mehr als

MUI_DisposeObject((Object *)app);
MUI_DeleteCustomClass(CL_HTMLviewer);
Close_Libs();

fällt mir auch nicht ein (bis auf den Callback, der den HTMLView selbst aufräumt, der ist aber wie im Beispielcode).

[ - Antworten - Zitieren - Direktlink - ]

07.02.2012, 11:12 Uhr

thomas
Posts: 7660
Nutzer

Ich habe mich noch nicht so intensiv mit MUI beschäftigt, aber ich denke mal dass bei MUI_CreateCustomClass eine normale BOOPSI-Klasse herauskommt, also im Prinzip ein Hook mit was dahinter. Dementsprechend würde ich mal sowas ausprobieren:

code:
CL_HTMLviewer = MUI_CreateCustomClass(NULL,MUIC_HTMLview,NULL,sizeof(struct HTMLviewer_Data),HookEntry);
CL_HTMLviewer->cl_Dispatcher.h_SubEntry = HTMLviewer_Dispatcher;



--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

07.02.2012, 11:40 Uhr

Holger
Posts: 8050
Nutzer
@ciVic:
Ich versteh nicht so recht, was Du da eigentlich tust. Laut ersten Beitrag schreibst Du ein Programm, dass HTMLView benutzt. Warum öffnest Du dann nicht einfach die HTMLView-Klasse, sondern hantierst mit Funktionen rum, die man nur braucht, wenn man eine eigene Klasse implementiert?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

07.02.2012, 12:22 Uhr

ciVic
Posts: 131
Nutzer
Zitat:
Original von Holger:
@ciVic:
Ich versteh nicht so recht, was Du da eigentlich tust. Laut ersten Beitrag schreibst Du ein Programm, dass HTMLView benutzt. Warum öffnest Du dann nicht einfach die HTMLView-Klasse, sondern hantierst mit Funktionen rum, die man nur braucht, wenn man eine eigene Klasse implementiert?


Das stimmt auch, ich benutze die HTMLView nur. Allerdings muß man den Dispatcher schreiben, wenn z.B. Bilder geladen werden sollen, oder damit man auf Link-Klicks reagieren kann. Ich muß auch die Ladefunktion für Bilder überschreiben, weil die bei HTMLView integrierte irgendwie nicht so funktioniert, wie ich das brauche. Die kann, soweit ich das weiß, z.B. nicht über TCP/IP laden.

@thomas Ah ja danke, das werde ich mal probieren.

[ - Antworten - Zitieren - Direktlink - ]

08.02.2012, 09:42 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ciVic:
Zitat:
Warum nicht was neueres als 2.95?

Mit einem 3.x wollten die MUI-Header wegen einiger Assembler-Geschichten nicht kompilieren, und bevor ich die alle anpasse habe ich lieber einen älteren verwendet. Oder gibt es da was neueres?


Hast Du mal ein kleines (aber vollständiges!) Beispiel mit dem sich das Problem nachvollziehen läßt?

Ich baue zwar auch immer den C++ Compiler, nur verwende ich den so gut wie nie. Der Compiler wird meist nur benutzt um die libstdc++ des GCC zu bauen.

[ - Antworten - Zitieren - Direktlink - ]

08.02.2012, 13:24 Uhr

ciVic
Posts: 131
Nutzer
Zitat:
Original von gni:

Hast Du mal ein kleines (aber vollständiges!) Beispiel mit dem sich das Problem nachvollziehen läßt?


Ohne es jetzt selbst probiert zu haben würde ich das Beispiel empfehlen, dass man zusammen mit HTMLView aus dem Aminet laden kann. Die Header sollten mit gcc 3.3 bei dem Beispiel die gleichen Probleme machen wie in meinem Fall.


[ - Antworten - Zitieren - Direktlink - ]

10.02.2012, 08:36 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ciVic:
Zitat:
gni:
Hast Du mal ein kleines (aber vollständiges!) Beispiel mit dem sich das Problem nachvollziehen läßt?

Ohne es jetzt selbst probiert zu haben würde ich das Beispiel empfehlen, dass man zusammen mit HTMLView aus dem Aminet laden kann. Die Header sollten mit gcc 3.3 bei dem Beispiel die gleichen Probleme machen wie in meinem Fall.
Das Beispiel aus den AmiNet-Archiven läßt sich ohne Anpassung an den GCC nicht übersetzen, da es für StormC geschrieben worden ist. Für C++ müßte es auch angepaßt werden. Von daher noch mal die Frage, ob Du ein kleines vollständiges Beispiel hast. Am besten wäre der Quellcode und das Präprozessorfile (.i für C bzw. .ii für C++, das erhält man mittels -save-temps). Damit könnte ich Dein Problem analysieren und mit verschiedensten GCC Versionen testen.

Benutzt Du -DNO_INLINE_STDARG?

[ - Antworten - Zitieren - Direktlink - ]

11.02.2012, 11:52 Uhr

jolo
Posts: 108
Nutzer
@gni:

Meine Erfahrung bezüglich verschiedener g++ Versionen ist, dass der Präprozessor von g++ 2.9.x toleranter arbeitet als der, der in den 3.x Versionen Verwendung findet. Z.B. erlaubt der alte Präprozessor das Einfügen von zwei aufeinanderfolgenden Doppelpunkten in Makro-Definitionen (z.B. um Klassenfunktionen zu spezifizieren), was unter 3.x Versionen nicht mehr funktioniert.
Zum anderen scheinen alle 3.x Versionen sich eher am ISO/ANSI C++ zu orientieren als die alten g++ 2.9.x Versionen, was dazu führt, dass man alte Quelltexte überarbeiten muss, sollen sie denn unter g++ 3.x kompiliert werden.

Ich selber habe im Dezember letzten Jahres die MuiPlusPlus Version von MorphOS (aber nicht die beigefügten Beispiele) auf OS3 für einen befreundeten Programmierer rückportiert, und zwar unter Verwendung des g++ 3.x, aber auch unter Beibehaltung der Kompatibilität zu MorphOS, was nach einiger Arbeit verlangte. Das initiale MuiPlusPlus wurde mittels g++ 2.9.x verfasst und wirft daher beim Kompilieren unter g++ 3.x massig Fehlermeldungen.

Das, was mich unter g++ 3.x nervt, ist eigentlich nur, dass dieser keine m68k-Register Bezeichner direkt in den Parameterlisten unterstützt, was eigentlich für das m68k-Amiga-API zwingend ist. Demnach kann man leider auch nicht auf "SDI_compiler.h" rückgreifen, um z.B. den Quellcode weitestgehend zu SAS/C kompatibel zu halten.

Bezüglich "extended assembler".
Ich spreche zwar verschiedene Assembler-Dialekte, aber diese eigenwillige GNU-Assembler Syntax in Verbindung mit dem Compiler ist nicht mein Ding, da weiche ich lieber auf "plain C" aus. :)

[ - Antworten - Zitieren - Direktlink - ]

15.02.2012, 09:31 Uhr

ciVic
Posts: 131
Nutzer
Übrigens habe ich grad herausgefunden, dass Tasks (sorry, ich nannte das zuvor Threads) tatsächlich keine DOS-Aufrufe machen können:

http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node032D.html
--
ciVic

A4000D - CSPPC 060/50 604e/200 - Piccolo SD 64 - 40 GB IDE - CD-ROM - 146 MB RAM - X-Surf 2 - A2320

[ - Antworten - Zitieren - Direktlink - ]

15.02.2012, 10:44 Uhr

Holger
Posts: 8050
Nutzer
Zitat:
Original von ciVic:
Übrigens habe ich grad herausgefunden, dass Tasks (sorry, ich nannte das zuvor Threads) tatsächlich keine DOS-Aufrufe machen können:

Das ist eine völlig andere Aussage als die Behauptung, man könne nur aus einem Thread (aka Task) gleichzeitig DOS-Aufrufe machen.

Da also das Thema vorher die Gleichzeitigkeit war, hat niemand darauf geachtet, ob Du mit Thread nun Task oder Process meinst.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > HTMLView, gcc und fread, komische Dinge passieren [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1997-2019 by amiga-news.de - alle Rechte vorbehalten.
.