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


--
:boing: Micha :boing:

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

--
:boing: Micha :boing:

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

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

26.06.2006, 15:33 Uhr

thomas
Posts: 7717
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:
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

[ - Antworten - Zitieren - Direktlink - ]

26.06.2006, 15:54 Uhr

thomas
Posts: 7717
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:
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. ]

[ - Antworten - Zitieren - Direktlink - ]

26.06.2006, 17:06 Uhr

Holger
Posts: 8116
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

26.06.2006, 17:28 Uhr

thomas
Posts: 7717
Nutzer
@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/

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




--
:boing: Micha :boing:

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

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 09:23 Uhr

thomas
Posts: 7717
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-2024 by amiga-news.de - alle Rechte vorbehalten.
.