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

amiga-news.de Forum > Programmierung > Probleme mit Beispielprogramm für Rastport [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

29.08.2002, 09:43 Uhr

Emufreak
Posts: 74
Nutzer
Ein kleines Beispielprogramm, dass ich aus dem grossen C-Buch abgetippt habe funktioniert nicht. Das Programm sollte einen String in einem Window ausgeben. Das Programm lässt sich Problemlos Compilieren. Wenn ich das Programm dann aber starte, ist kein String zu sehen sondern nur ein kleiner Blinkender Punkt im Windowrand. Wenn ich die Werte für die Position des Strings verändere, verschiebt sich der blinkende Punkt im Fenster Vertikal. Horizontal tut sich gar nichts. Der blinkende Punkt bleibt immer im Windowrand. Ähnliche Probleme habe ich bei allen Programmmen mit Rastport.

Hier das ganze Beispielprogramm:

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

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

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

struct IntuiText ErsterText =
{
3, 0, /* FrontPen, BackPen */
JAM2, /* DrawMode */
50, 50, /* LeftEdge, TopEdge */
NULL, /* Font */
(UBYTE *) "Systemprogrammierung auf dem Amiga!",
NULL /* NextText */
};

main()
{
ULONG MessageClass;
USHORT code;

Open_All();

PrintIText(MeinesWindowsRastPort, ErsterText, 10L, 10L);

FOREVER
{
if (message = (struct IntuiMessage *)
GetMsg(FirstWindow->UserPort))
{
MessageClass = message->Class;
code = message->Code;
ReplyMsg(message);
switch(MessageClass)
{
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(!(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 (IntuitionBase) CloseLibrary(IntuitionBase);
}





[ - Antworten - Zitieren - Direktlink - ]

29.08.2002, 10:04 Uhr

thomas
Posts: 7716
Nutzer

Dummer Tippfehler, vermute ich. PrintIText benötigt einen Pointer auf IntuiText, nicht die Struktur selber, also

PrintIText(MeinesWindowsRastPort, &ErsterText, 10L, 10L);

Das wäre nicht passiert, wenn du die Prototypes mit einbinden würdest:

unter OS1.3:
#include <functions.h>

unter OS2.0 oder besser:
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>

Außerdem, wenn du Dice C benutzt (was ich Anfängern dringend empfehle), solltest du die Option -proto einschalten, die prüft nämlich, ob für alle aufgerufenen Funktionen ein Prototyp vorhanden ist.

Gruß Thomas


--
Email: thomas-rapp@web.de

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


[ - Antworten - Zitieren - Direktlink - ]

30.08.2002, 20:06 Uhr

Emufreak
Posts: 74
Nutzer
Zitat:
Original von thomas:

>Dummer Tippfehler, vermute ich. PrintIText benötigt einen Pointer >auf IntuiText, nicht die Struktur selber, also

>PrintIText(MeinesWindowsRastPort, &ErsterText, 10L, 10L);

Danke für den Tip. Jetzt Funktionierts. Übrigens war das ganze auch im Buch falsch angegeben. Und zwar konsequent das ganze Buch hindurch. Irgendwo steht sogar, dass der Compiler sich selbst darum kümmert. Vielleicht macht das der Compiler des Autors tatsächlich meiner tuts jedenfalls nicht. Ist aber eigentlich auch logischer so.

>Das wäre nicht passiert, wenn du die Prototypes mit einbinden >würdest:

>unter OS1.3:
>#include <functions.h>

>unter OS2.0 oder besser:
>#include <clib/exec_protos.h>
>#include <clib/intuition_protos.h>

Was meinst du mit Prototypes?

>Außerdem, wenn du Dice C benutzt (was ich Anfängern dringend >empfehle), solltest du die Option -proto einschalten, die prüft >nämlich, ob für alle aufgerufenen Funktionen ein Prototyp vorhanden >ist.

Was bringt mir Dice-C denn für Vorteile?




[ - Antworten - Zitieren - Direktlink - ]

31.08.2002, 09:56 Uhr

Kronos
Posts: 1168
Nutzer
Prototypes sind die Definition einer Funktion, ohne den Inhalt der selben, also etwa so

struct Window *OpenWindowTagList( CONST struct NewWindow *newWindow, CONST struct TagItem *tagList );

oder auch für eigene Funktionen:

int foo(int foofoo, float fusch);

Dadurch wird festgelegt welche Argumente die Funktion erwartet, und was sie zurückgibt.
Der Quelltext für foo() kann dabei in einem anderen C-Quelltext enthalten sein, der
seperat übersetzt wird. Beim Linken werden diese Teile dann automatisch zusammengesetzt.

Im Falle von OpenWindowTagList() wird dann gegen die amiga.lib gelinkt, oder wenn du
noch die (Compiler-spezifischen) pragmas eingebunden hast direkt durch einen Aufruf
mit Register-Variablen ersetzt (das sollte dich aber voresrt nicht stören).

DICE ? Darüber kann man ja jetzt denken wie man will, aber ich würde für den Anfänger
dann doch schon eher StormC3 von der Dev_CD_2.1 (die Pflicht ist) empfehlen.


MfG
Kronos
--

Only the good die young all the evil seem to live forever

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Probleme mit Beispielprogramm für Rastport [ - Suche - Neue Beiträge - Registrieren - Login - ]


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