![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Programmierung > Prob bei Library Programmierung | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
26.06.2006, 14:47 Uhr Micha1701 Posts: 938 Nutzer |
Hi! Ich versuche mich gerade an einer eigenen Library. In dieser möchte ich unter anderem auch mal Speicher anfordern - ganz einfach mit malloc(). Aber leider gibt das einen Guru 80000002. Auch ein AllocVec() funktioniert nicht. Was könnte ich denn da vergessen haben? Ich verwende das Beispiel von Dirk Stöcker (CLib-SDI.lha) aus dem AmiNet. Wenn ich da in die exampleFunktionen ein malloc() setze schmiert mir die Library ab... -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 14:59 Uhr Micha1701 Posts: 938 Nutzer |
hat sich glaub ich erledigt... in den exampleFunktionen klappts doch, nur in meinen eigenen nicht. Die sind in einer anderen Sourcedatei. Mal sehen, was ich da vergessen habe... sehr seltsam... -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 15:20 Uhr Micha1701 Posts: 938 Nutzer |
oder auch nicht... vorhin hats noch funktioniert - dachte ich zumindest, aber jetzt gehts da auch nicht mehr... Hier mal der Sourcecode: code:#ifndef BLADEMP3_EXAMPLEFUNCS_C #define BLADEMP3_EXAMPLEFUNCS_C //#include <proto/blademp3.h> #include <proto/intuition.h> #include <proto/utility.h> #include <SDI_compiler.h> #define BASE_REDEFINE #include "libinfo.h" ASM(int) LIBBLADE_rechnen(REG(d0, int zahl1), REG(d1, int zahl2), REG(a6, struct blademp3BaseP *blademp3Base)) { malloc(400); return zahl1 + zahl2; } #endif /* BLADEMP3_EXAMPLEFUNCS_C */ Wie gesagt schmiert die Lib ab, wenn malloc aufgerufen wird... In einer anderen Funktion arbeit GetTagData() ohne abstürze... Was kann ich da machen? -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 15:33 Uhr thomas Posts: 7721 Nutzer |
Da eine Library den ANSI-Init-Code nicht durchläuft, darfst du keine ANSI-Funktionen benutzen. Darüber hinaus mußt du dafür sorgen, daß evtl. vom Compiler benutzte Basis-Register (üblicherweise A4) korrekt gesetzt sind, sonst kannst du nicht auf globale Variablen (in deinem Fall SysBase für AllocVec) zugreifen. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 15:40 Uhr Micha1701 Posts: 938 Nutzer |
Ach so - also keine ANSI Funktionen, ok Bezüglich der Base Pointers gibts in einer der Headerdateien folgendes: code:aber reichen tut das auch nicht, denn ein AllocVec() statt des malloc() im obigen Beispiel schmiert trotzdem ab...struct blademp3BaseP { struct Library exb_LibNode; UWORD exb_Unused; /* better alignment */ ULONG exb_NumCalls; ULONG exb_NumHookCalls; struct ExecBase * exb_SysBase; struct DOSBase * exb_DOSBase; struct UtilityBase * exb_UtilityBase; SEGLISTPTR exb_SegList; }; #if defined(BASE_REDEFINE) #define SysBase blademp3Base->exb_SysBase #define DOSBase blademp3Base->exb_DOSBase #define UtilityBase blademp3Base->exb_UtilityBase #endif -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 15:54 Uhr thomas Posts: 7721 Nutzer |
Mit Basisregister meinte ich auch nicht den Library-Base-Pointer. Je nach verwendetem Compiler und jenachdem, ob Small oder Large Data Model benutzt wird, setzt der Compiler das Register A4 ein, um Register-relativ auf globale Variablen zuzugreifen. Dazu wird A4 am Anfang des Programms auf den Anfang des globalen Variablenspeichers gesetzt und anschließend nicht mehr verändert. In Libraries funktioniert das natürlich nicht, weil die Funktionen nicht Teil eines Programms sind, sondern von den unterschiedlichsten Tasks aufgerufen werden, die alle unterschiedliche Registerstände haben. Außerdem wird ja, wie im Falle der ANSI-Funktionen, der Init-Code gar nicht aufgerufen, der das Register A4 setzt. Deshalb mußt du dem Compiler sagen, daß er in jeder Funktion das Register A4 neu laden muß. Das wird je nach Compiler mit den Attributen __saveds oder __geta4 oder durch die Funktion geta4() gemacht. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 17:03 Uhr Holger Posts: 8116 Nutzer |
Zitat:Hast Du diesen Code auch wirklich VOR den inline-Definitionen der libraries zu stehen? Sonst ist er unwirksam. mfg Nachtrag: vielleicht auch nicht, ich weiß nicht mehr genau, wie die Header strukturiert waren. Kann sein, daß es für die Redefinition der Lib-Pointer nochmal ne ganz andere Konstruktion gab... [ Dieser Beitrag wurde von Holger am 26.06.2006 um 17:08 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 17:06 Uhr Holger Posts: 8116 Nutzer |
Zitat: So weit ich den Code sehen konnte, sind da aber gar keine globalen Variablen. Vorausgesetzt die Header verklickern dem Compiler, daß diese struct im Register a6 übergeben wurde, kommt man ja auch komplett ohne globale Variablen aus. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 17:28 Uhr thomas Posts: 7721 Nutzer |
@Holger:Zitat: Zum einen muß man BASE_REDEFINE definieren, damit das überhaupt eingebunden wird und zum anderen ist es auch noch abhängig vom Compiler, ob ein #define der Library-Base überhaupt im Zusammenhang mit pragmas oder inlines funktioniert. Und wenn man gar ohne pragmas/inlines, sondern mit Library-Stubs arbeitet, braucht man unbedingt globale Library-Base-Pointer. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
26.06.2006, 18:04 Uhr Micha1701 Posts: 938 Nutzer |
Also ich verwende den vbcc0.8i Compiler. Die Redefines der LibBase's liegt in libinfo.h und somit wird BASE_REDEFINE auch vorher gesetzt. Das sollte also funktionieren. Wie gesagt kann ich GetTagItem() aufrufen (da gabs auch zu Anfangs Fehlermeldungen wegen der fehlenden UtilityBase die ich dann in die Redefines aufgenommen hab - natürlich öffne ich die Lib auch vorher brav). Das mit Globalen Variabeln funktioniert ebenfalls. hatte mal testhalber zwei Funktionen die eine solche Variable setzen und wieder zurückgeben. Kein Problem... -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
27.06.2006, 09:03 Uhr Micha1701 Posts: 938 Nutzer |
argh... hat sich erledigt. Ich hatte vergessen <proto/exec.h> zu includen. Und da hat er wohl die Funktion aus der amiga.lib benutzt, die ja sicherlich genausowenig initialisiert ist... -- ![]() ![]() http://www.Silicon-Wizards.com [ - Antworten - Zitieren - Direktlink - ] |
27.06.2006, 09:23 Uhr thomas Posts: 7721 Nutzer |
Du solltest dem Compiler sagen, daß er einen Error ausgibt, wenn eine Funktion keinen Prototyp hat. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Prob bei Library Programmierung | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |