![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Prob bei Library Programmierung | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2006-06-26, 14:47 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-26, 14:59 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-26, 15:20 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-26, 15:33 h thomas Posts: 7721 User |
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/ [ - Answer - Quote - Direct link - ] |
2006-06-26, 15:40 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-26, 15:54 h thomas Posts: 7721 User |
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/ [ - Answer - Quote - Direct link - ] |
2006-06-26, 17:03 h Holger Posts: 8116 User |
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. ] [ - Answer - Quote - Direct link - ] |
2006-06-26, 17:06 h Holger Posts: 8116 User |
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. [ - Answer - Quote - Direct link - ] |
2006-06-26, 17:28 h thomas Posts: 7721 User |
@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/ [ - Answer - Quote - Direct link - ] |
2006-06-26, 18:04 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-27, 09:03 h Micha1701 Posts: 938 User |
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 [ - Answer - Quote - Direct link - ] |
2006-06-27, 09:23 h thomas Posts: 7721 User |
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/ [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Prob bei Library Programmierung | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |