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: %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? [ - 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: 7718 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: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: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. |