amiga-news 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...


--
:boing: Micha :boing:

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

--
:boing: Micha :boing:

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?
--
:boing: Micha :boing:

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

aber reichen tut das auch nicht, denn ein AllocVec() statt des malloc() im obigen Beispiel schmiert trotzdem ab...



--
:boing: Micha :boing:

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:
Original von Micha1701:
code:
#if defined(BASE_REDEFINE)
      #define SysBase           blademp3Base->exb_SysBase
      #define DOSBase           blademp3Base->exb_DOSBase
      #define UtilityBase       blademp3Base->exb_UtilityBase
#endif


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:
Original von thomas:
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.


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:
#if defined(BASE_REDEFINE)
#define SysBase blademp3Base->exb_SysBase
#define DOSBase blademp3Base->exb_DOSBase
#define UtilityBase blademp3Base->exb_UtilityBase
#endif


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




--
:boing: Micha :boing:

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

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