amiga-news 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:
Original von Reth:

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


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 :D

Grüße

[ - Antworten - Zitieren - Direktlink - ]

05.01.2005, 08:28 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Reth:
register __a0 struct *Hook

etc.

G++ jammert nun, dass er einen Parseerror an oder vor * bekommt!?

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:
Wie ist denn die Syntax beim GCC (G++)?
Beim C (!) Compiler sieht es so aus: <argument> __asm("<register>")
Zitat:
Denn der G++ mag auch nicht, wie ich die Filterfunktion in die Hookstruktur eintrage!?
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:
Original von whose:

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 :D

Grüße


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:
Original von gni:

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.


Hast Du da zufällig ein Codebeispiel für?

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".

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:
Reth:
Zitat:
gni:
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.

Hast Du da zufällig ein Codebeispiel für?
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:
Wie sieht denn ein C++ cast aus (sorry für die dumme Frage)?
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:
Original von Reth:
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 *)'

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:
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.


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:
Original von Reth:
Schafft ein cast der HookMethode auf ULONG (*)() da Abhilfe? (Würde mir als nächstes einfallen.)

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:
Reth:
Habe meine Filtermethode mit cast auf HOOKFUNC und ohne in h-SubEntry probiert einzutragen, immer das gleiche Ergebnis.

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:
Original von gni:
Die Filterfunktion _muß_ eine statische Methode sein! Dann kannst Du auch anstandslos mit HOOKFUNC casten oder besser noch mit reinterpret_cast<>.


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:
Reth:
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!?

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:
BTW: Wo gibts denn eine Beschreibung der GCC/G++ Fehlermeldungen?
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: 7716
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:
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.
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:
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.
Kann ich im Programm ja recht schnell mittel Replace korrigieren.

Zitat:
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.
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:
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).
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.
.