ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Startup Code in C | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
03.05.2003, 00:06 Uhr Saint Posts: 68 Nutzer |
Hi! Ich hoffe ihr könnt mir wieder einmal weiterhelfen :-) Ich arbeite momentan an einem kleinen Programm, und wollte nun probieren einen anderen Startup Code als den von GCC zu linken, einfach um mal zu sehen, was man da an Platz sparen kann. Leider habe ich von Startup Code keine besonders große Ahnung, deswegen war Krashan so freundlich mir seinen zu schicken. Aber leider stürzt ein damit erzeugtes Programm sofort mit einer Exception ab. Unten ist der Code wie er ihn mir geschickt hat. Meine Frage nun: Was muß im Startup Code alles geschehen? Wo liegt in diesem der Fehler? Als Compiler benutze ich GCC 2.95.3. Ich hoffe ihr könnt mir helfen, und bitte keine Sprüche wie "lern das erstmal genau" oder rtfm, das hilft mir nämlich nicht weiter beim lernen. Thx. /* $Id: startup.c 1.11 1999/05/09 19:36:21 Krashan Exp Krashan $*/ #define __NOLIBBASE__ #include <proto/dos.h> #include <proto/exec.h> long Main(long); struct Library *SysBase, *DOSBase; __saveds long _main (void) { long ret_value, wb; struct Process *process; struct Message *wbmessage = NULL; SysBase = *(struct Library**)4; if (DOSBase = (struct Library*)OpenLibrary ("dos.library", 37)) { process = (struct Process*)FindTask (NULL); if (process->pr_CLI) wb = FALSE; else { WaitPort (&process->pr_MsgPort); wbmessage = GetMsg (&process->pr_MsgPort); wb = TRUE; } ret_value = Main (wb); CloseLibrary (DOSBase); if (wbmessage) { Forbid (); ReplyMsg (wbmessage); } return (ret_value); } return (10); } [ - Antworten - Zitieren - Direktlink - ] |
03.05.2003, 12:26 Uhr SRuppert Posts: 7 Nutzer |
Hi, also der startup code sieht ganz gut aus. Die Frage ist wie du das Programm übersetzt ixemul? libnix? Ausserdem kommt es drauf an was in deinem Programm noch benutzt wird: Intution, Gfx...? Wenn du einen eigenen startup code verwendest dann musst du auch alle benötigten libraries selbst öffnen und schliessen... Hope this helps a little bit! Ciao, Stefan [ - Antworten - Zitieren - Direktlink - ] |
03.05.2003, 12:59 Uhr Saint Posts: 68 Nutzer |
Mein programm übersetze ich mit -nostartfiles -noixemul, aber dieser Startup Code stürzt auch ab wenn Main() noch gar nicht aufgerufen ist (z.b. wenn ich den Aufruf ret_value = Main (wb); einfach durch ret_value = 0; ersetze. Der Fehler muß also irgendwo vorher liegen. Das ich in meinem Programm alles selbst öffne und schließe ist schon klar, ich bin zwar Anfänger aber ein bißchen kann ich auch schon ;-) [ - Antworten - Zitieren - Direktlink - ] |
03.05.2003, 13:53 Uhr SRuppert Posts: 7 Nutzer |
Ist schon länger her, dass ich mich mit startup code rumgeschagen habe auf dem Amiga. Also noch zwei Dinge. 1. Wie sieht genau dein Linker aufruf aus? startup.o muss als aller erstes eingebunden werden! Also etwa : gcc -nostartupfiles -noixemul startup.o app.o -o app Wenn das nicht hilft, dann noch evtl: 2. Die Variablen "struct Library *SysBase, *DOSBase;" unterhalb der _main() Funktion definieren. Also: extern struct Library *SysBase, *DOSBase; long _main() { } struct Library *SysBase, *DOSBase; Ciao, Stefan [ - Antworten - Zitieren - Direktlink - ] |
03.05.2003, 14:10 Uhr Saint Posts: 68 Nutzer |
Ok, jetzt wirds noch seltsamer: Der selbe startup Code läuft absolut problemlos, wenn ich ihn für MorphOS compilliere. Läuft mein Programm halt ppc-nativ, ist eh für Ambient gedacht gewesen ;-) [ - Antworten - Zitieren - Direktlink - ] |
03.05.2003, 16:07 Uhr tokai Posts: 1071 Nutzer |
Irgendwie schaut der Startup-Code seltsam aus. Probier mal dieses Code-Schnippsel (funktioniert ohne Probleme unter 68k/SASc und MOS) code:/* * Copyright ©2002 Christian Rosentreter <karibu@gmx.net> * All rights reserved. * * module: startup.c * description: initializes libraries and get arguments * * :ts=4 */ extern LONG __saveds initapp(void); static BOOL InitLibraries(void); static void CloseLibraries(void); struct ExecBase *SysBase = NULL; struct DosLibrary *DOSBase = NULL; struct IntuitionBase *IntuitionBase = NULL; struct GfxBase *GfxBase = NULL; #define AUTOCON "CON:0/25/640/150/Output/auto/close/wait" LONG __saveds initapp(void) { struct Process *proc; struct WBStartup *WBMsg = NULL; BOOL prCLI; LONG rc; SysBase = *(struct ExecBase **)4; proc = (struct Process *)FindTask(NULL); if ( !(prCLI = proc->pr_CLI ? TRUE : FALSE) ) { WaitPort(&proc->pr_MsgPort); WBMsg = (struct WBStartup *)GetMsg(&proc->pr_MsgPort); } if ( DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",0L) ) { BPTR CLIout; if ( CLIout = ( prCLI ? Output() : Open(AUTOCON,MODE_OLDFILE) ) ) { SelectOutput(CLIout); if ( InitLibraries() ) { rc = Main(); } else { rc = RETURN_FAIL; } /* InitLibraries() */ CloseLibraries(); if (!prCLI) { Close(CLIout); } } else { rc = RETURN_FAIL; } /* CLIout */ CloseLibrary((struct Library*)DOSBase); } else { proc->pr_Result2 = ERROR_INVALID_RESIDENT_LIBRARY; rc = RETURN_FAIL; } /* DOSBase */ if (WBMsg) { Forbid(); ReplyMsg(&WBMsg->sm_Message); } return rc; } static BOOL InitLibraries(void) { if ( !( IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",OSLIBVERSION) )) { /* error output here... */ return FALSE; } if ( !( GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",OSLIBVERSION) )) { /* ...and here. e.g. a localized message */ return FALSE; } return TRUE; } static void CloseLibraries(void) { if (GfxBase) { CloseLibrary((struct Library *)GfxBase); } if (IntuitionBase) { CloseLibrary((struct Library *)IntuitionBase); } } Wenn du den kompletten Code brauchst, kann ich dir den per mail zumailen. Das hier ist nur das Allernötigste. btw: die dos.library mit Version 0 oeffnen. Wenn dein Programm eine höhere OS-Version benötigt, kann das z.B.: beim Öffnen der Intuilib abgefangen werden. -- years flow as water, lake reflects flowers and moon [ - Antworten - Zitieren - Direktlink - ] |
04.05.2003, 06:08 Uhr Uri]CoM[ Posts: [Ex-Mitglied] |
Wenn du nur zum Spaß am Startupcode herumfummelst ist das in Ordnung. Ansonsten Zeitverschwendung. Lies dir mal die Anleitung für Libnix durch, da steht beschrieben wie Mann schlanke Programme compiliert. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Startup Code in C | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |