amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Frage zu Schleife [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2002-09-06, 21:10 h

Emufreak
Posts: 74
User
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: %un", 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?

[ - Answer - Quote - Direct link - ]

2002-09-06, 21:12 h

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

[ - Answer - Quote - Direct link - ]

2002-09-06, 21:38 h

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

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

[ - Answer - Quote - Direct link - ]

2002-09-07, 09:42 h

thomas
Posts: 7717
User

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/


[ - Answer - Quote - Direct link - ]

2002-09-08, 10:02 h

Emufreak
Posts: 74
User
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.

[ - Answer - Quote - Direct link - ]

2002-09-09, 20:13 h

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

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Frage zu Schleife [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.