ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > GCC und Hooks? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
04.01.2005, 22:24 Uhr Reth Posts: 1858 Nutzer |
Hallo allerseits, eine Suche nach diesem Thema hier und in Google brachte noch kein Ergebnis. Ich portiere gerade meine Sourcen zum GCC (G++) und habe eine Klasse, die einen Screenmoderequester liefert, welcher nur 8Bit Modi zulässt. Den Filter habe ich mittels einer Hookfunktion realisiert, welche in eine Hook-Struktur eingetragen wird. Nun hat diese Methode bei meinem bisherigen Compiler ihre Parameter mit folgender Syntax: register __a0 struct *Hook etc. G++ jammert nun, dass er einen Parseerror an oder vor * bekommt!? Wie ist denn die Syntax beim GCC (G++)? Gibt es noch andere Dinge, die beim Portieren beachtet werden müssen (evtl. irgendwo dokumentiert)? Denn der G++ mag auch nicht, wie ich die Filterfunktion in die Hookstruktur eintrage!? Danke schon mal! Ciao [ - Antworten - Zitieren - Direktlink - ] |
05.01.2005, 00:05 Uhr whose Posts: 2156 Nutzer |
Zitat: Hallo Reth, schau doch nochmal in unseren Mailverkehr von letztens, da hatte ich Dir die GCC-Syntax aufgeführt. Soweit ich weiß, sollte die Syntax auch beim G++ ihren Dienst tun. Ich schau aber nachher nochmal nach, wie das da ausschaut und geb Dir Bescheid. Frohes neues Jahr übrigens Grüße [ - Antworten - Zitieren - Direktlink - ] |
05.01.2005, 08:28 Uhr gni Posts: 1106 Nutzer |
Zitat:Da hast Du Pech: Der C++ Compiler unterstützt keine Registerargumente! Entweder Du implementierst das mit C oder Du benutzt HookEntry() und eine statische Klassenfunktion. Zitat:Beim C (!) Compiler sieht es so aus: <argument> __asm("<register>") Zitat:Typ und Parameter Deiner eigenen Funktion müssen exakt dem entsprechen was die Hookstruktur erwartet. Du mußt entweder einen C oder besser einen der C++ casts verwenden, damit es "passt". [ - Antworten - Zitieren - Direktlink - ] |
05.01.2005, 12:50 Uhr Reth Posts: 1858 Nutzer |
Zitat: Danke, werd uch machen! Dir und allen anderen auch ein frohes neues Jahr! Ciao [ - Antworten - Zitieren - Direktlink - ] |
05.01.2005, 21:14 Uhr Reth Posts: 1858 Nutzer |
Zitat: Hast Du da zufällig ein Codebeispiel für? Zitat: Wie sieht denn ein C++ cast aus (sorry für die dumme Frage)? Danke Ciao [ Dieser Beitrag wurde von Reth am 05.01.2005 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
06.01.2005, 10:15 Uhr gni Posts: 1106 Nutzer |
Zitat:Zufällig nicht. Wenn Du es mit C machen kannst, dann mach es besser so. Ansonsten: HookEntry ist eine Funktion in amiga.lib (also extern "C" wenn es nicht in clib/alib_protos.h definiert ist). HookEntry geht nach h_Entry, die statische Klassenfunktion nach h_SubEntry und this nach h_Data (wenn Du eine "normale" Klassenfunktion aufrufen willst). In der statischen Funktion mußt Du dann h_Data auf den Typ von this casten und dann deine Klassenfunktion aufrufen. Falls Du mehr Paramter brauchst, mußt Du in h_Data ein Struktur übergeben die alle Parameter inklusive this enthält. Zitat:Ich meine entweder static_cast<> oder reinterpret_cast<>. Schau halt in einem C++ Buch nach. Alternativ kannst Du natürlich auch die C casts verwenden. [ Dieser Beitrag wurde von gni am 06.01.2005 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 12:11 Uhr Reth Posts: 1858 Nutzer |
Hallo nochmals, also ich steig da noch nicht so durch, der GCC/G++ scheint ein schwieriger Fall zu sein, aber im positiven Sinne, wenn man folgendes Problem betrachtet: Nach dem inkludieren der clib/alib_protos.h wie gni vorschlug, konnte ich die HookEntry-Funktion der Hook-Struktur bei h_entry zuweisen. In h_subEntry habe ich wie immer meine Filtermethode eingetragen. In meinem bisherigen C++ Compiler (ohne HookEntry-Funktion, sondern mit Registerparametern) sah die folgendermaßen aus: ULONG ScreenModeHookC::SMFilterFunc(Hook *hook, ULONG p, ScreenModeRequester *scrMd) Das klappte immer. In allen Beispielen der RKRMs, Autodocs, Internet etc. hatten die Funktionen immer Rückgabewert ULONG! Nun meldet der G++ aber folgenden Fehler: ScreenModeHookC.cc: In method 'ScreenModeHookC::ScreenModeHookC(void *)': ScreenModeHookC.cc:16: assignment to 'ULONG (*)()' from 'ULONG (*)(Hook *, Object *, void *)' ScreenModeHookC.cc:17: no matches converting function 'SMFilterFunc' to type 'ULONG (*)()' ScreenModeHookC.h:18: candidates are: ULONG ScreenModeHookC::SMFilterFunc(Hook *, long unsigned int, ScreenModeRequester *) make: *** [ScreenModeHookC.o] Error 1 Was will er damit sagen? Die Filtermethode gibt bisher immer nen Integerwert (ULONG) zurück, muss ich die nun auf ULONG * umstellen? Dann muss ich wohl die Adresse des Rückgabewertes ermitteln und zurückgeben!? Oder wie? Habe meine Filtermethode mit cast auf HOOKFUNC und ohne in h-SubEntry probiert einzutragen, immer das gleiche Ergebnis. Wo liegt denn hier das Typproblem? Kann mir das einer sagen? Danke schon mal! Ciao [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 12:19 Uhr Holger Posts: 8116 Nutzer |
Zitat:Es geht nicht um den Rückgabewert, sondern um die Parameter. Du versuchst einer Variable vom Typ "Funktion ohne Parameter" eine Funktion mit den Parametern "Hook*,Object*,void*" zuzuweisen. Da muss ein kritischer Compiler was gegen sagen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 12:32 Uhr Reth Posts: 1858 Nutzer |
[quote] Original von Holger: Zitat: Das stimmt! Aber wie solls denn dann funktionieren? In allen Beispielen zu HookEntry sind die in h_subEntry eingetragenen Funktionen mit diesen 3 Parametern ausgerüstet. HookEntry dient ja nur dazu selbige Parameter auf den Stack zu legen - ohne diese Parameter machen die eigenen Hookfunktionen nicht viel Sinn! Schafft ein cast der HookMethode auf ULONG (*)() da Abhilfe? (Würde mir als nächstes einfallen.) [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 12:47 Uhr Holger Posts: 8116 Nutzer |
Zitat:Könnte klappen. Habe selber so gut wie nie mit Funktionspointern rumhantiert. Müsste ein reinterpret_cast<> sein. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 17:10 Uhr gni Posts: 1106 Nutzer |
Zitat:Die Filterfunktion _muß_ eine statische Methode sein! Dann kannst Du auch anstandslos mit HOOKFUNC casten oder besser noch mit reinterpret_cast<>. [ - Antworten - Zitieren - Direktlink - ] |
17.01.2005, 21:20 Uhr Reth Posts: 1858 Nutzer |
Zitat: Danke für die Tips. Alles umgesetzt, vielen Dank euch! Was ich nicht wusste war, dass ich h_Entry=HookEntry; ebenfalls so angeben muss, damit kein Compilerfehler kommt: reinterpret_cast<ULONG (*)()>(HookEntry); Ich dachte HookEntry ist bereits vom richtigen Typ!? BTW: Wo gibts denn eine Beschreibung der GCC/G++ Fehlermeldungen? War bei Google nicht erfolgreich und bei der GG Installation sind nur make Fehler beschrieben! Danke nochmals Ciao [ Dieser Beitrag wurde von Reth am 17.01.2005 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
18.01.2005, 11:19 Uhr gni Posts: 1106 Nutzer |
Zitat:Das schon, aber nicht h_[Sub]Entry in der Hook-Struktur. Dort sind keine Argumente angegeben, da die Argumente nicht immer gleich sind. Deswegen gibt es ja HOOKFUNC zum casten: reinterpret_cast<HOOKFUNC>(HookEntry); C++ nimmt es mit Types sehr genau. Zitat:Die sind doch selbst erklärend oder nicht? AFAIK, es gibt keine weiterführende Beschreibung der Fehlermeldungen bzw. der Warnungen. [ - Antworten - Zitieren - Direktlink - ] |
24.03.2005, 19:38 Uhr MarkusPohlmann Posts: 164 Nutzer |
Kann mir auch jemand helfen? Ich habe ebenfalls ein Problem mit den Hooks... Anbei meine Codeschnippsel: Ich möchte in AHI diesen PlayerFunc-Hook für Timingzwecke (Nachladen Soundbuffer) nutzen und habe nach durchsicht vieler FAQs, diesem Forum und einigen anderen folgende Codefragmente zusammengeschustert, welche nur zeigen sollen, dass PlayerFunc gerufen wird. Compilerfehler oder Warnings bringt dieser Code nicht: static void PlayerFunc(struct Hook *hook, struct AHIAudioCtrl *actrl, APTR ignored) { printf("Hook called!n"); return; } struct Hook PlayerHook = { 0,0, (ULONG (* )()) PlayerFunc, NULL, NULL, }; BOOL AllocAudio(void) { // struct AHIAudioModeRequester *req; BOOL rc = FALSE; /* req = AHI_AllocAudioRequest( AHIR_PubScreenName, NULL, AHIR_TitleText, "Select a mode and rate", AHIR_DoMixFreq, TRUE, TAG_DONE); */ //if(req) { //if(AHI_AudioRequest(req, TAG_DONE)) { struct Hook PlayerHook; PlayerHook.h_Entry = (HOOKFUNC)HookEntry; PlayerHook.h_SubEntry = (HOOKFUNC)PlayerFunc; if (actrl = AHI_AllocAudio( AHIA_AudioID, AHI_DEFAULT_UNIT, AHIA_MixFreq, 22050, AHIA_Channels, CHANNELS, AHIA_Sounds, MAXSAMPLES, AHIA_PlayerFunc, &PlayerHook, AHIA_PlayerFreq, INT_FREQ<<16, AHIA_MinPlayerFreq, INT_FREQ<<16, AHIA_MaxPlayerFreq, INT_FREQ<<16, TAG_DONE)) rc=TRUE; //} //AHI_FreeAudioRequest(req); //} return rc; } ---- Also, wenn ich jetzt AllocAudio aufrufe höre ich meine Lautsprecher kurz knacken und dann resettet mein Amiga. Was mache ich falsch? [ - Antworten - Zitieren - Direktlink - ] |
24.03.2005, 21:13 Uhr thomas Posts: 7718 Nutzer |
Nun, die Funktion wird ja wohl von AHI aus aufgerufen und nicht aus deinem Prgoramm. Somit läuft, schreibt und greift printf total ins Nirvana. Zum einen ist printf (mit kleinem p) absolut ungeignet für Multitasking. Wenn du stattdessen Printf (mit großem P) benutzt, sieht's schon besser aus. Aber selbst das dürfte dir hier nicht helfen, dann AHI hat ja wohl kein eigenes Ausgabefenster, in dem die Ausgae erscheinen könnte. Außerdem ist AHI vermutlich nur eine Task und kein Process, sodaß man DOS-Funktionen dort ohnehin nicht benutzen kann. Und zu guter Letzt, da du ja vermutlich das Small-Data-Model benutzt, solltest du die Funktion mit __saveds deklarieren, sonst kannst du nicht auf globale Variablen zugreifen (Library-Bases sind auch globale Variablen, die werden benutzt, ohne aß man es sieht). Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
24.03.2005, 22:54 Uhr MarkusPohlmann Posts: 164 Nutzer |
Zitat:Ja, ja, war vielleicht nicht der beste Befehl. Der Absturz tritt aber auch dann auf, wenn ich printf auskommentiere und was weiss ich, Beispielsweise zwei Variablen addiere... Zitat:Kann ich im Programm ja recht schnell mittel Replace korrigieren. Zitat:Hier muss ich passen, ich kenne AHI selber nicht so gut. Sind meine ersten Gehversuche mit AHI und von Hooks habe ich bis dato auch noch nichts gehört. Zitat:Hab' ich wieder was dazu gelernt... Aber so oder so steckt da immer noch ein Fehler drinn was einen Absturz ohne Fehlermeldung verursacht. Wo liegt also mein weiterer Denkfehler/Programmierfehler? [ - Antworten - Zitieren - Direktlink - ] |
25.03.2005, 22:44 Uhr MarkusPohlmann Posts: 164 Nutzer |
Danke, Thema erledigt. Hab'den SoundFunc Hook jetzt am laufen, PlayerFunc will zwar immer noch nicht, der SoundFunc-Hook von AHI reicht aber für meine Zwecke. Übrigens kann die SoundFunc auch ohne __saveds auf globale Variablen zugreifen... Verwirrt mich nach dem Hinweis zwar, aber wenns klappt - egal. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > GCC und Hooks? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |