amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Frage zu Schleife [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

06.09.2002, 21:10 Uhr

Emufreak
Posts: 74
Nutzer
Hi! Ich habe eine paar Fragen zu einem Beispielprogramm aus meinem C-Buch. Ich kann dieses Programm zwar Compilieren aber beim starten stürzt immer der Amiga ab? Wo liegt der Fehler?

#include <exec/types.h>
#include <intuition/intuition.h>

struct IntuitionBase *IntuitionBase;
struct Screen *FirstScreen;
struct Window *FirstWindow;
struct IntuiMessage *message;
struct RastPort *MeinesWindowsRastPort;

/*------------------------------------Definition Screen-----------*/

struct NewScreen FirstNewScreen =
{
0, 0, /* Left Edge, Top Edge */
640, 256, /* Width, Height */
2, /* Depth */
0, 1, /* DetailPen, BlockPen */
HIRES, /* ViewModes */
CUSTOMSCREEN, /* Type */
NULL, /* Font */
(UBYTE *)"Screen Test",
NULL, /* Gadgets */
NULL, /* CustomBitmap */
};

/*--------------------------Definition Gadgets---------------------*/

struct PropInfo BeispielProp =
{
AUTOKNOB | FREEVERT, /* Flags */
8000, /* HorizPot */
8000, /* VertPot */
800, /* HorizBody */
800, /* VertBody */
0, /* CWidth */
0, /* CHeight */
0, /* HPotRes */
0, /* VPotRes */
0, /* LeftBorder */
0 /* TopBorder */
};

struct Gadget PropGadget =
{
NULL, /* NextGadget */
100, 40, /* LeftEdge, TopEdge */
20, 80, /* Width, Height */
GADGHCOMP, /* Flags */
RELVERIFY, /* Activation */
PROPGADGET, /* Gadget Type */
NULL, /* Gadget Render */
NULL, /* Select Render */
NULL, /* Gadget Text */
NULL, /* Mutual Exclude */
&BeispielProp, /* Special Info */
2, /* Gadget ID */
NULL /* User Data */
};


SHORT GadgetPairs[] =

{
0, 0, 61, 0, 61, 21, 0, 21, 0, 0
};

struct Border GadgetBorder =

{
-1, -1, /* Leftedge, Topedge */
1, 0, /* FrontPen, BackPen */
JAM1, /* DrawMode */
5, /* Count */
GadgetPairs, /* Punktetabelle */
NULL /* NULL */
};

struct IntuiText GadgetText =
{
2, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
4, 7, /* LeftEdge, TopEdge */
NULL, /* Font */
(UBYTE *) "Gadget",
NULL /* NextText */
};

struct Gadget BoolGadget =
{
&PropGadget, /* NextGadget */
10, 40, /* LeftEdge, TopEdge */
60, 20, /* Width, Height */
GADGHBOX, /* Flags */
RELVERIFY, /* Activation */
BOOLGADGET, /* Gadget Type */
(APTR)&GadgetBorder, /* Gadget Render */
NULL, /* Select Render */
&GadgetText, /* Gadget Text */
NULL, /* Mutual Exclude */
NULL, /* Special Info */
1, /* Gadget ID */
NULL /* User Data */
};

/*-------------------Definition Windows----------------------------*/

struct NewWindow FirstNewWindow =
{
160, 50, /* Left Edge, Top Edge */
320, 200, /* Width, Height */
0, 1, /* DetailPen, BlockPen */
CLOSEWINDOW | /* IDCMP Flags */
GADGETDOWN |
GADGETUP,
WINDOWDEPTH | /* Flags */
WINDOWSIZING |
WINDOWDRAG |
WINDOWCLOSE |
SMART_REFRESH,
&BoolGadget, /* First Gadget */
NULL, /* Checkmark */
(UBYTE *)"Gadget Programmierung im Test",
NULL, /* SCREEN */
NULL, /* BitMap */
100, 100, /* Min Width, Height */
640, 256, /* Max Width, Height */
CUSTOMSCREEN /* Type */
};


main()
{
ULONG MessageClass;
USHORT code;
int nr = 0;


Open_All();

FOREVER
{
if ((message = (struct IntuiMessage *)
GetMsg(FirstWindow->UserPort)) == NULL)
{
WaitPort(FirstWindow->UserPort);
continue;
}

MessageClass = message->Class;
code = message->Code;
ReplyMsg(message);

switch(MessageClass)
{
case GADGETDOWN : nr += 1;
printf("Gadget zum %d. Mal aktiviert!\n", nr);
break;

case GADGETUP : printf("Position: %u\n", BeispielProp.VertPot);

case CLOSEWINDOW : Close_All();
exit(TRUE);
break;
}
}
}
Open_All()
{
if(!(IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", NULL)))
{
printf("Keine Intuition Library gefunden!\n");
Close_All();
exit(FALSE);
}

if(!(FirstScreen = (struct Screen *)
OpenScreen(&FirstNewScreen)))
{
printf("Screen hat keine Zeit!\n");
Close_All();
exit(FALSE);
}

FirstNewWindow.Screen = FirstScreen;


if(!(FirstWindow = (struct Window *)
OpenWindow(&FirstNewWindow)))
{
printf("Window will nicht aufgehen!\n");
Close_All();
exit(FALSE);
}

MeinesWindowsRastPort = FirstWindow->RPort;
}

Close_All()
{
if (FirstWindow) CloseWindow(FirstWindow);
if (FirstScreen) CloseScreen(FirstScreen);
if (IntuitionBase) CloseLibrary(IntuitionBase);
}

Eine weiter Frage habe ich zu dem Teil in der FOREVER-Schleife. Die Schleife habe ich schon mal in einem ähnlichen Beispielprogramm verwendet. Zuerst habe ich das continue weggelassen. Beim schliessen des Programmes kam es dann Aber zu einem Absturz. Wieso ist dieses continue so wichtig?

[ - Antworten - Zitieren - Direktlink - ]

06.09.2002, 21:12 Uhr

Emufreak
Posts: 74
Nutzer
Sorry wegen der Darstellung! Das war nicht so gedacht. Irgendwie wurde es aber so übernommen.

[ - Antworten - Zitieren - Direktlink - ]

06.09.2002, 21:38 Uhr

DirkSalzsieder
Posts: 149
Nutzer
jo, wo bist du dan hier gelandet ?

Das ist mit abstand die kurriosest Frage die ich hier zu lesen bekommen habe.

[ - Antworten - Zitieren - Direktlink - ]

07.09.2002, 09:42 Uhr

thomas
Posts: 7716
Nutzer

Was ist denn das für ein Buch ? Der Autor scheint seine eigenen Programme nicht ausprobiert zu haben.

Zum Absturz: Wenn man ein Proportional-Gadget mit AUTOKNOB programmiert, muß man im Feld GadgetRender einen Pointer auf 4 Langwörter angeben. Wenn man dort NULL reinschreibt, wird die ExecBase überschrieben und der Rechner stürzt ab.

Außerdem sollten die Felder FirstWindow, FirstScreen und IntuitionBase mit NULL initialisiert werden. Wenn nämlich tatsächlich mal eins der drei nicht geöffnet werden kann, wird die Routine Close_All versuchen, die uninitialisierten Felder zu schließen, was auch zu einem Absturz führt.

Frage: kannst du C, oder versuchst du hier zwei Fliegen mit einer Klappe zu schlagen und alles auf einmal zu lernen ?

Vielleicht sollte dir mal jemand eine kurze Einführung in Softwareengineering geben, denn das, was dein Buchautor hier verzapft ist der letzte Spaghetti-Code und wird sehr leicht unübersichtlich.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

08.09.2002, 10:02 Uhr

Emufreak
Posts: 74
Nutzer
Danke für die Tips. Ich werde das gleich ausprobieren. Beim Buch handelt es sich um das "Grosse C Buch". Das Buch ist von 1988. Ein neueres habe ich leider nicht. Vielleicht kann mir ja jemand eins empfehlen. Ist es unter umständen möglich, dass die Beispiele die der Author beschreibt damals so funktioniert haben?

Ich kenne die Grundlagen von C. Auch der Umgang mit Pointern ist mir bekannt. Ich versuche jetzt einen Schritt weiter zu gehen und etwas mehr als nur Textbasierte Anwendungen zu schreiben.

Gegen ein Einführung in Softwareenginering habe ich nichts einzuwenden. Nur kenne ich niemanden der mir das geben könnte.

[ - Antworten - Zitieren - Direktlink - ]

09.09.2002, 20:13 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Emufreak:
Danke für die Tips. Ich werde das gleich ausprobieren. Beim Buch handelt es sich um das "Grosse C Buch". Das Buch ist von 1988.

Ja, das Alter merkt man dem Buch auch an. So programmiert man eigentlich ueberhaupt nicht mehr. Ein Printmedium kann ich Dir leider nicht empfehlen, aber auf den AmigaDeveloperCDs befinden sich auch diverse Code-Beispiele, neben der (nahezu) vollstaendigen Dokumentation der AmigaOS-Funktionen.
Zitat:
Gegen ein Einführung in Softwareenginering habe ich nichts einzuwenden. Nur kenne ich niemanden der mir das geben könnte.
Na ja, ich glaube nicht dass es notwendig ist, Dir gleich so etwas ueberzuhelfen, nur weil der Buchauthor so einen Mist verzapft hat.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Frage zu Schleife [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.