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

amiga-news.de Forum > Programmierung > GCC+Reaction [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

16.06.2004, 12:44 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hallo,
ich hab noch mal ein paar Anfängerfragen bezüglich einiger Fehlermeldungen vom gcc (2.95) in zusammenhang mit reaction.
Ich habe versucht den Beispielcode aus dem Workshop von Martin Elsner mit dem gcc zu kompilieren und erhielt dabei folgende Fehlermeldungen:

Neuer Shell-Prozeß 3
3.Amigadev:> cd cpp
3.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:75: 'Gadget' undeclared (first use in this function)
react.c:75: (Each undeclared identifier is reported only once
react.c:75: for each function it appears in.)
react.c:75: parse error before ')'
react.c:106: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
react.c:113: parse error before ')'
3.Amigadev:cpp>


Hier der Quellcode aus dem Workshop:

/* Prototypen einbinden : */
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/intuition_protos.h>
#include <clib/dos_protos.h>
#include <clib/window_protos.h>
#include <clib/layout_protos.h>
#include <clib/button_protos.h>

/* Typen und Konstanten einbinden : */
#include <intuition/classusr.h>
#include <classes/window.h>
#include <gadgets/layout.h>
#include <gadgets/button.h>

/* Die Dateien können natürlich bei anderen Compilern anders */
/* heißen und an anderen Stellen stehen. Zur Not muss man die */
/* Verzeichnisse nach den benötigten Konstanten etc. durchsuchen.*/

struct Library *IntuitionBase,*DosBase,*WindowBase,*LayoutBase,*ButtonBase;

int main(){

Object *window,*layout,*button;

/* wie gesagt, man kann auch einen anderen Typ benutzen, */
/* z.B. ULONG window oder APTR window, es müssen nur 4 Byte sein */

struct Window *intuiwin; /* das brauchen wir noch */

/* So, den nächsten Teil kennen wir schon: */

IntuitionBase = OpenLibrary( "intuition.library", 39 );
DosBase = OpenLibrary( "dos.library", 39 );
WindowBase = OpenLibrary( "window.class", 44 );
LayoutBase = OpenLibrary( "gadgets/layout.gadget", 44 );
ButtonBase = OpenLibrary( "gadgets/button.gadget", 44 );
if( (!IntuitionBase) || (!WindowBase) || (!LayoutBase) || (!ButtonBase) ){
CloseLibrary( ButtonBase );
CloseLibrary( WindowBase );
CloseLibrary( LayoutBase );
CloseLibrary( DosBase );
CloseLibrary( IntuitionBase );
return( 20 );
}

/* Jetzt wird's interessant : */

layout = (Object*)NewObject( LAYOUT_GetClass(),NULL,
LAYOUT_Orientation,LAYOUT_VERTICAL,
LAYOUT_DeferLayout,TRUE,
LAYOUT_SpaceInner,TRUE,
LAYOUT_SpaceOuter,TRUE,
TAG_END );

/* da haben wir's: LAYOUT_GetClass() kommt aus layout.gadget */
/* und liefert uns den benötigten Zeiger, wir brauchen also */
/* keinen Klassennamen. Dann folgen einige Eigenschaften, mit */
/* denen wir uns noch genauer beschäftigen werden. Sie */
/* betreffen jedenfalls das Aussehen und die Funktionsweise des */
/* Layout. Übrigens gibt es auch Reaction-Makros, die diese */
/* Erzeugung etwas angenehmer machen (in */
/* reaction/reaction_macros.h). */

button = (Object*)NewObject( BUTTON_GetClass(),NULL,
GA_Text,"Mein erster Reaction-Button ...",
TAG_END );

/* Man gewöhnt sich dran, oder? */
/* Schön ist, dass man wirklich nur das angeben muss, was man */
/* benötigt; man muss nicht wie früher erst viele Parameter */
/* festlegen, sondern ist mit ein paar Zeilen fertig. Zudem */
/* sieht es auch noch übersichtlicher aus.*/

SetGadgetAttrs( (Gadget*)layout,NULL,NULL,LAYOUT_AddChild,button,TAG_END
);

/* Hier ordnen wir den Button unserem Layout unter. Dazu müssen */
/* wir nur die Eigenschaft LAYOUT_AddChild setzen. Übrigens */
/* hätten wir auch SetAttrs benutzen können, wenn wir sowieso */
/* weder Fenster noch Requester angeben. Aber wir sollten uns */
/* daran gewöhnen, mit SetGadgetAttrs zu arbeiten, denn wenn das */
/* Fenster offen ist, geht's nicht anders. */

window = (Object*)NewObject( WINDOW_GetClass(),NULL,
WINDOW_Layout,layout,
WINDOW_Position,WPOS_CENTERMOUSE,
WA_Activate,TRUE,
WA_Title,"Ein Fenster !!",
WA_DragBar,TRUE,
TAG_END );

/* Hier übergeben wir dem Fenster direkt sein "Kind", nämlich */
/* unser Layout. Dann folgen einige Eigenschaften, mit denen */
/* wir uns nächstes Mal genauer beschäftigen. Sie betreffen */
/* jedenfalls das Aussehen und die Funktionsweise des Fensters. */
/* Offen ist es aber noch nicht, also: */

DoMethod( window,WM_OPEN );

/* So einfach ist das. Wer sich mal die AutoDocs anschaut, wird */
/* feststellen dass man aber bei der Angabe eines Fensters immer */
/* einen Zeiger auf eine Window-Struktur benötigt und kein */
/* Objekt. Kein Problem, holen wir ihn uns: */

GetAttr( WINDOW_Window, window, &intuiwin );

/* Immer aufpassen, dass man einen ZEIGER auf die Variable */
/* übergibt, sonst kommt der Guru ... */

Delay( 500 ); /* wir warten erst mal ca. 10 Sekunden ... */

SetGadgetAttrs( (Gadget*)button,intuiwin,NULL,
GA_Text,"... ist immer noch da!",TAG_END );

/* Hier ist endlich unser intuiwin im Einsatz! Hat auch einen */
/* Sinn, denn das Fenster muss direkt aktualisiert werden. */
/* Übrigens ist es mir schon des öfteren passiert, dass ich */
/* TAG_END vergessen habe - gerade wenn ich zuvor GetAttr */
/* benutzt habe. Das macht sich dann meist durch seltsame */
/* Ergebnisse oder sogar einen Absturz bemerkbar. Sobald man */
/* mal das Programm debuggt und Enforcer oder ein ähnliches */
/* Tool startet, findet man meist den Fehler. */

Delay( 500 ); /* weil's so schön ist ... */

DoMethod( window,WM_CLOSE ); /* klar, oder ? */

DisposeObject( window );

/* So, das war's. Wie gesagt, das Layout und der Button werden vom */
/* Window freigegeben. Natürlich müssen jetzt noch die Libraries */
/* geschlossen werden. Und wenn das Programm noch weiter geht, */
/* sollte man nicht vergessen, alle Zeiger auf NULL zu setzen: */

window = NULL;
layout = NULL;
button = NULL;
intuiwin = NULL;

CloseLibrary( ButtonBase );
CloseLibrary( WindowBase );
CloseLibrary( LayoutBase );
CloseLibrary( DosBase );
CloseLibrary( IntuitionBase );
return( 0 );
}



Hier meine Fragen:

steht "Gadget" als Platzhalter für etwas anderes, oder liegt der "Fehler" im GCC ?

was hat es mit dem inkompatiblen Zeigertyp von GetAttr auf sich ?

Was mus ich allgemein beachten, wenn ich Code der für StormC vorgesehen ist mit dem GCC kompilieren möchte ?

Vielen Dank im voraus !

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 13:10 Uhr

thomas
Posts: 7716
Nutzer

Erstmal solltest du bei GCC (und eigentlich bei allen anderen Compilern auch) immer proto/xy.h einbinden und nicht clib/xy_protos.h.

Außerdem muß die Zeile

SetGadgetAttrs( (Gadget*)layout, ...

so lauten:

SetGadgetAttrs( (struct Gadget*)layout, ...

Bei GetAttr sind die Parameter vertauscht. Das muß

GetAttr( window, WINDOW_Window, &intuiwin );

heißen.

Vielleicht solltest du auch versuchen, den Code zu verstehen, anstatt ihn nur abzutippen. Dann kommst du vielleicht alleine drauf.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 13:10 Uhr

Inferno
Posts: 157
Nutzer
Das könnte an den diversen #include<clib/xxx_protos.h> liegen.

Ersetze die mal durch

#include <proto/exec.h>
#include <proto/dos.h>
etc. (ausser alib.h, die braucht's (und gibts) i.d.R. nicht)

Ich habe für die diversen XXX_GetClass - funktionen auch die inline-headers genommen, z.b.
#include <inline/button.h>

sonst hat es bei mir mit gcc nicht funktioniert.

Gruß,

Inf.

(PS: Alles aus dem Kopf, können also Fehler drin sein)

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 13:11 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Kaesebroetchen:
3.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:75: 'Gadget' undeclared (first use in this function)
react.c:75: (Each undeclared identifier is reported only once
react.c:75: for each function it appears in.)
react.c:75: parse error before ')'
react.c:106: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
react.c:113: parse error before ')'
3.Amigadev:cpp>

Der CAST in beiden SetGadgetAttrs() ist falsch. Den Typ Gadget gibt es nicht, es muß "struct Gadget*" heissen. Die Warnung für GetAttr ist korrekt. Da müßte auf ein CAST auf ULONG* rein, aber selbst dann wird GCC 3.3+ das beanstanden, da solche CAST ALIAS-Fehler möglich machen. Nach den Änderungen kann man den Code übersetzen. Ein lauffähiges Programm wirst Du dennoch nicht bekommen, da WINDOW_GetClass, BUTTON_GetClass und LAYOUT_GetClass fehlen. Die sind in einer GCC reaction.lib zu finden.

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 14:06 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Danke für die sauschnellen! Antworten !

@thomas, ich habe die Änderungsvorschläge mal eingebaut, aber die Einbindung den <proto/xyz.h> machte teilweise Probleme. Ich habe das Programm ans laufen bekommen, aber erst nachdem ich die Änderung an der Einbindung von intuition.h wieder rückgänging gemacht habe.

Trotzdem bleiben noch einige Warnungen:

3.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:114: warning: passing arg 1 of 'GetAttr' makes integer from pointer without a cast
react.c:114: warning: passing arg 2 of 'GetAttr' makes pointer from integer without a cast
react.c:114: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
3.Amigadev:cpp> dir

Was bedeuten diese Meldungen ?

______________________________________________________________________
thomas:
Vielleicht solltest du auch versuchen, den Code zu verstehen, anstatt ihn nur abzutippen. Dann kommst du vielleicht alleine drauf.
______________________________________________________________________

Das versuche ich ja gerade !

Durch das testen und ständige erweitern von Codebeispielen lernt man doch am besten wie der Code funktioniert. Dummerweise ist der meiste Code den ich bisher so gefunden habe halt mit diversen Fehlern durchsetzt die man als Anfänger nur schwer nachvollziehen kann. Umso wichtiger ist da ein Forum wie dieses mit hilfsbereiten Profis die bereit sind ihr Wissen an Anfänger weiterzugeben.

Deshalb an diese Stelle nochmal vielen Dank !

Für diejenigen die es auch mal versuchen möchten, hier das überarbeitete Beispiel aus dem Workshop das sich jetzt mit dem GCC kompilieren lässt:

/* Prototypen einbinden : */
//#include <clib/exec_protos.h>
#include <proto/exec.h>
#include <clib/alib_protos.h>
//#include <proto/alib.h> //Gibt es nicht
#include <clib/intuition_protos.h>
//#include <proto/intuition.h>
//#include <clib/dos_protos.h>
#include <proto/dos.h>
//#include <clib/window_protos.h>
#include <proto/window.h>
//#include <clib/layout_protos.h>
#include <proto/layout.h>
//#include <clib/button_protos.h>
#include <proto/button.h>

/* Typen und Konstanten einbinden : */
#include <intuition/classusr.h>
#include <classes/window.h>
#include <gadgets/layout.h>
#include <gadgets/button.h>

/* Die Dateien können natürlich bei anderen Compilern anders */
/* heißen und an anderen Stellen stehen. Zur Not muss man die */
/* Verzeichnisse nach den benötigten Konstanten etc. durchsuchen.*/

struct Library *IntuitionBase,*DosBase,*WindowBase,*LayoutBase,*ButtonBase;

int main(){

Object *window,*layout,*button;

/* wie gesagt, man kann auch einen anderen Typ benutzen, */
/* z.B. ULONG window oder APTR window, es müssen nur 4 Byte sein */

struct Window *intuiwin; /* das brauchen wir noch */

/* So, den nächsten Teil kennen wir schon: */

IntuitionBase = OpenLibrary( "intuition.library", 39 );
DosBase = OpenLibrary( "dos.library", 39 );
WindowBase = OpenLibrary( "window.class", 44 );
LayoutBase = OpenLibrary( "gadgets/layout.gadget", 44 );
ButtonBase = OpenLibrary( "gadgets/button.gadget", 44 );
if( (!IntuitionBase) || (!WindowBase) || (!LayoutBase) || (!ButtonBase) ){
CloseLibrary( ButtonBase );
CloseLibrary( WindowBase );
CloseLibrary( LayoutBase );
CloseLibrary( DosBase );
CloseLibrary( IntuitionBase );
return( 20 );
}

/* Jetzt wird's interessant : */

layout = (Object*)NewObject( LAYOUT_GetClass(),NULL,
LAYOUT_Orientation,LAYOUT_VERTICAL,
LAYOUT_DeferLayout,TRUE,
LAYOUT_SpaceInner,TRUE,
LAYOUT_SpaceOuter,TRUE,
TAG_END );

/* da haben wir's: LAYOUT_GetClass() kommt aus layout.gadget */
/* und liefert uns den benötigten Zeiger, wir brauchen also */
/* keinen Klassennamen. Dann folgen einige Eigenschaften, mit */
/* denen wir uns noch genauer beschäftigen werden. Sie */
/* betreffen jedenfalls das Aussehen und die Funktionsweise des */
/* Layout. Übrigens gibt es auch Reaction-Makros, die diese */
/* Erzeugung etwas angenehmer machen (in */
/* reaction/reaction_macros.h). */

button = (Object*)NewObject( BUTTON_GetClass(),NULL,
GA_Text,"Mein erster Reaction-Button ...",
TAG_END );

/* Man gewöhnt sich dran, oder? */
/* Schön ist, dass man wirklich nur das angeben muss, was man */
/* benötigt; man muss nicht wie früher erst viele Parameter */
/* festlegen, sondern ist mit ein paar Zeilen fertig. Zudem */
/* sieht es auch noch übersichtlicher aus.*/

SetGadgetAttrs( (struct Gadget*)layout,NULL,NULL,LAYOUT_AddChild,button,TAG_END
);

/* Hier ordnen wir den Button unserem Layout unter. Dazu müssen */
/* wir nur die Eigenschaft LAYOUT_AddChild setzen. Übrigens */
/* hätten wir auch SetAttrs benutzen können, wenn wir sowieso */
/* weder Fenster noch Requester angeben. Aber wir sollten uns */
/* daran gewöhnen, mit SetGadgetAttrs zu arbeiten, denn wenn das */
/* Fenster offen ist, geht's nicht anders. */

window = (Object*)NewObject( WINDOW_GetClass(),NULL,
WINDOW_Layout,layout,
WINDOW_Position,WPOS_CENTERMOUSE,
WA_Activate,TRUE,
WA_Title,"Ein Fenster !!",
WA_DragBar,TRUE,
TAG_END );

/* Hier übergeben wir dem Fenster direkt sein "Kind", nämlich */
/* unser Layout. Dann folgen einige Eigenschaften, mit denen */
/* wir uns nächstes Mal genauer beschäftigen. Sie betreffen */
/* jedenfalls das Aussehen und die Funktionsweise des Fensters. */
/* Offen ist es aber noch nicht, also: */

DoMethod( window,WM_OPEN );

/* So einfach ist das. Wer sich mal die AutoDocs anschaut, wird */
/* feststellen dass man aber bei der Angabe eines Fensters immer */
/* einen Zeiger auf eine Window-Struktur benötigt und kein */
/* Objekt. Kein Problem, holen wir ihn uns: */

//GetAttr( WINDOW_Window, window, &intuiwin );
GetAttr( window, WINDOW_Window, &intuiwin );
/* Immer aufpassen, dass man einen ZEIGER auf die Variable */
/* übergibt, sonst kommt der Guru ... */

Delay( 500 ); /* wir warten erst mal ca. 10 Sekunden ... */

SetGadgetAttrs( (struct Gadget*)button,intuiwin,NULL,
GA_Text,"... ist immer noch da!",TAG_END );

/* Hier ist endlich unser intuiwin im Einsatz! Hat auch einen */
/* Sinn, denn das Fenster muss direkt aktualisiert werden. */
/* Übrigens ist es mir schon des öfteren passiert, dass ich */
/* TAG_END vergessen habe - gerade wenn ich zuvor GetAttr */
/* benutzt habe. Das macht sich dann meist durch seltsame */
/* Ergebnisse oder sogar einen Absturz bemerkbar. Sobald man */
/* mal das Programm debuggt und Enforcer oder ein ähnliches */
/* Tool startet, findet man meist den Fehler. */

Delay( 500 ); /* weil's so schön ist ... */

DoMethod( window,WM_CLOSE ); /* klar, oder ? */

DisposeObject( window );

/* So, das war's. Wie gesagt, das Layout und der Button werden vom */
/* Window freigegeben. Natürlich müssen jetzt noch die Libraries */
/* geschlossen werden. Und wenn das Programm noch weiter geht, */
/* sollte man nicht vergessen, alle Zeiger auf NULL zu setzen: */

window = NULL;
layout = NULL;
button = NULL;
intuiwin = NULL;

CloseLibrary( ButtonBase );
CloseLibrary( WindowBase );
CloseLibrary( LayoutBase );
CloseLibrary( DosBase );
CloseLibrary( IntuitionBase );
return( 0 );
}

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 14:29 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Kaesebroetchen:
@thomas, ich habe die Änderungsvorschläge mal eingebaut, aber die Einbindung den <proto/xyz.h> machte teilweise Probleme. Ich habe das Programm ans laufen bekommen, aber erst nachdem ich die Änderung an der Einbindung von intuition.h wieder rückgänging gemacht habe.

Wenn Du proto/ verwendest, _müssen_ die Librarybasen korrekt sein.
"struct Library *" != "struct was auch immer*"
Zitat:
Trotzdem bleiben noch einige Warnungen:

3.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:114: warning: passing arg 1 of 'GetAttr' makes integer from pointer without a cast
react.c:114: warning: passing arg 2 of 'GetAttr' makes pointer from integer without a cast
react.c:114: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
3.Amigadev:cpp>

Vermutlich war die Argumentreihenfolge vorher doch richtig ;-)

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 14:30 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Inferno:
Ich habe für die diversen XXX_GetClass - funktionen auch die inline-headers genommen, z.b.
#include <inline/button.h>

sonst hat es bei mir mit gcc nicht funktioniert.

Weil für die Reactionklassen in libamiga.a keine Stubs drin sind.

[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 18:13 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@gni:

Das mit der Reihenfolge der Argumente stimmt wohl, aber die originale Reihenfolge ist auch nicht ganz korrekt:

4.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:113: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
4.Amigadev:cpp>

Ich hab mal in den AutoDocs nachgesehen und nur das gefunden:

reaction.lib/GetAttrs reaction.lib/GetAttrs

NAME
GetAttrsA -- Get multiple object attributes
GetAttrs -- Varargs stub to GetAttrsA

SYNOPSIS
count = GetAttrsA( object, taglist )

count = GetAttrs( object, tag, address, ... )

ULONG GetAttrsA( Object *, struct TagItem * )

ULONG GetAttrs( Object *, Tag, ... )

FUNCTION
Gets multiple attributes of an object iin a single call.
Remember that while the function returns the number of
attributes that were getable, it can not inform WHICH
attributes, if any, were not. Thus, you shouldn't use this
function when you are not sure that an attribute is getable.

INPUTS
object - pointer to the object that should be queried
taglist - a list of tag and ULONG address pairs to fill

RESULTS
The number of attributes that succeeded.


Aber GetAttrs() ist ja wohl auch nicht ganz dasselbe wie GetAttr() ?

Und so richtig ausführlich scheint mir das ganze auch nicht zu sein.
Gibts denn vielleicht noch eine andere Informationsquelle wo man so etwas nachlesen kann ?




[ - Antworten - Zitieren - Direktlink - ]

16.06.2004, 22:32 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Doppelpost, sorry

[ Dieser Beitrag wurde von Kaesebroetchen am 16.06.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 08:54 Uhr

thomas
Posts: 7716
Nutzer

Vermutlich gibt es die Funktion GetAttr gar nicht, das ganze Konstrukt kam mir gleich so komisch vor. Kann man beim GCC nicht erzwingen, daß nur Funktionen mit vorhandenen Prototypen zugelassen sind ? Dann würde das sofort erkannt.


Schreib mal folgendes:

GetAttrs( window, WINDOW_Window, &intuiwin, TAG_END );

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 09:49 Uhr

gni
Posts: 1106
Nutzer
Zitat:
thomas:
Vermutlich gibt es die Funktion GetAttr gar nicht, das ganze Konstrukt kam mir gleich so komisch vor.

Warum schaust Du nicht nach!? GetAttr ist eine Funktion der intuition.library!
Zitat:
Kann man beim GCC nicht erzwingen, daß nur Funktionen mit vorhandenen Prototypen zugelassen sind ?
Man kann.

[ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 09:55 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Kaesebroetchen:
@gni:
Das mit der Reihenfolge der Argumente stimmt wohl, aber die originale Reihenfolge ist auch nicht ganz korrekt:

4.Amigadev:cpp> gcc react.c -o react
react.c: In function 'main':
react.c:113: warning: passing arg 3 of 'GetAttr' from incompatible pointer type
4.Amigadev:cpp>

Die originale Reihenfolge _ist_ korrekt. GCC warnt, weil statt eines ULONG* Zeigers ein Object* Zeiger übergeben wird. Die kann man _nicht_ ohne weiteres in einander umwandeln. Damit es auch mit GCC3 funktioniert muß Du so casten: (ULONG *)(APTR).
Zitat:
Ich hab mal in den AutoDocs nachgesehen und nur das gefunden:

reaction.lib/GetAttrs reaction.lib/GetAttrs

Netter Versuch, aber leicht daneben. Schau einfach mal in intuition.doc nach.
BTW, grep ist eine feine Sache.

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 11:50 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Warum schaust Du nicht nach!? GetAttr ist eine Funktion der intuition.library!

Weil ich nicht an jedem Platz, immer, überall einen Amiga/UAE/DevCD o.ä. dabeihabe.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 12:15 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Getting an Object’s Attributes
The Intuition function GetAttr() asks an object what the value of a specific attribute is:

ULONG GetAttr(ULONG attrID, APTR myobject, ULONG *mydata);

where attrID is the attribute’s ID number, myobject is the object to get the attribute from, and mydata points to a
data area that will hold the attribute value. This function returns a 0L if the object doesn’t recognize the attribute,
otherwise it returns some non-zero value, the meaning of which depends on the class. In most cases, GetAttr()
returns a 1 when it is successful.

Das habe ich zu GetAttr() gefunden, danach müsste folgender Code doch eigentlich funktionieren ?

ULONG *window,*layout,*button;
/* wie gesagt, man kann auch einen anderen Typ benutzen, */
/* z.B. ULONG window oder APTR window, es müssen nur 4 Byte sein */

struct Window *intuiwin; /* das brauchen wir noch */

kommt aber die gleiche Fehlermeldung.

______________________________________________________________________ __
gni:
Netter Versuch, aber leicht daneben. Schau einfach mal in intuition.doc nach.
BTW, grep ist eine feine Sache.
______________________________________________________________________ __

Was heisst BTW, Grep ?

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 12:35 Uhr

ZeroG
Posts: 1487
Nutzer
Zitat:
Original von Kaesebroetchen:
Was heisst BTW, Grep ?


BTW: By the Way - Übrigens

Grep ist ein Debugger für GCC, wenn ich mich nicht malwieder irre.

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 12:56 Uhr

gni
Posts: 1106
Nutzer
Zitat:
ZeroG:
Zitat:
Kaesebroetchen:
Was heisst BTW, Grep ?

BTW: By the Way - Übrigens
Richtig.
Zitat:
Grep ist ein Debugger für GCC, wenn ich mich nicht malwieder irre.
Du irrst. Mit grep sucht man [in Textdokumenten]. Es steht für "global regular expression print"

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:00 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Kaesebroetchen:
ULONG GetAttr(ULONG attrID, APTR myobject, ULONG *mydata);
[snip]
Das habe ich zu GetAttr() gefunden, danach müsste folgender Code doch eigentlich funktionieren ?

ULONG *window,*layout,*button;
/* wie gesagt, man kann auch einen anderen Typ benutzen, */
/* z.B. ULONG window oder APTR window, es müssen nur 4 Byte sein */

struct Window *intuiwin; /* das brauchen wir noch */

kommt aber die gleiche Fehlermeldung.

Welche Variable soll ducrh GetAttr() gefüllt werden? Welche Typ hat sie? Welchen erwartet GetAttr()? Wie Du casten mußt/solltest, damit die Warnung verschwindet (auch mit GCC3) habe ich bereits gepostet.

[ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:03 Uhr

gni
Posts: 1106
Nutzer
Zitat:
thomas:
Zitat:
Warum schaust Du nicht nach!? GetAttr ist eine Funktion der intuition.library!
Weil ich nicht an jedem Platz, immer, überall einen Amiga/UAE/DevCD o.ä. dabeihabe.
Dann solltest Du etwas vorsichtiger agieren. Da Du sonst immer so versiert bist, war ich von den GettAttr() Aussagen doch etwas überrascht.

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:26 Uhr

ZeroG
Posts: 1487
Nutzer
Zitat:
Du irrst. Mit grep sucht man [in Textdokumenten]. Es steht für "global regular expression print"

:glow: Ups...

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:39 Uhr

Kaesebroetchen
Posts: 643
Nutzer

[/quote]
Welche Variable soll ducrh GetAttr() gefüllt werden? Welche Typ hat sie? Welchen erwartet GetAttr()? Wie Du casten mußt/solltest, damit die Warnung verschwindet (auch mit GCC3) habe ich bereits gepostet.

[ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ]
[/quote]

Jo hast du, ich habe ich nur immer noch nicht verstanden wie ich das in meinen code einbauen soll. Ich bin halt nur ein Amateur!

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:41 Uhr

Kaesebroetchen
Posts: 643
Nutzer
[quote]
Original von gni:
Zitat:
ZeroG:
Zitat:
Kaesebroetchen:
Was heisst BTW, Grep ?

BTW: By the Way - Übrigens
Richtig.
[quote]


I-) Wie ging doch gleich diese Lied ? mfg mit freundlichen . . .

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:55 Uhr

gni
Posts: 1106
Nutzer
[gelöscht, Browser-History]

[ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 13:56 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Original von gni:
Zitat:
Kaesebroetchen:
Welche Variable soll ducrh GetAttr() gefüllt werden? Welche Typ hat sie? Welchen erwartet GetAttr()? Wie Du casten mußt/solltest, damit die Warnung verschwindet (auch mit GCC3) habe ich bereits gepostet.

Jo hast du, ich habe ich nur immer noch nicht verstanden wie ich das in meinen code einbauen soll. Ich bin halt nur ein Amateur!
Dann probier halt etwas rum. ;-)
Es sind nur drei Arguemnte und nur bei einem wird gewarnt. Das sieht da so aus:
GetAttr( WINDOW_Window, window, (ULONG*)(APTR)&intuiwin );

MFG

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 14:52 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@gni

Damit kompiliert das ganze fehlerfrei, danke.

So einen wilden Code habe ich aber bisher noch nie gesehen (ich bin mehr so ein Windows C++ Hobbyprogrammierer) deshalb wäre ich dir doch sehr dankbar wenn du mir mit einfachen Worten erklären könntest was
(ULONG*)(APTR)&intuiwin );
eigentlich macht ?


[ Dieser Beitrag wurde von Kaesebroetchen am 17.06.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 15:58 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Kaesebroetchen:
@gni
Damit kompiliert das ganze fehlerfrei, danke.

Gut. Läufts auch? ;-)
Zitat:
So einen wilden Code habe ich aber bisher noch nie gesehen (ich bin mehr so ein Windows C++ Hobbyprogrammierer) deshalb wäre ich dir doch sehr dankbar wenn du mir mit einfachen Worten erklären könntest was
(ULONG*)(APTR)&intuiwin );
eigentlich macht ?

Mit anderen Compilern und GCC < 3.x reicht der (ULONG*) Cast. GCC3 würde dennoch meckern, da bei Casts der Compiler annimmt das ein und derselbe Speicher über _verschiedene_ Zeiger geändert werden kann, ohne das der Compiler das mitbekommt. Das würde dann zu Fehlern führen, da der Compiler den Wert einer Speicherstelle nur einmal lesen könnte und dann eine Änderung dieses Speichers nicht bemerken würde. GCC3 hat solche Optimierungen und warnt deshalb bei "verdächtigen" Casts. Manchmal weiss der Programmierer aber mehr als der Compiler und dann will man solche Warnungen vermeiden. Genau das wird gemacht. Erst wird der Zeiger zu einem VOID* Zeiger gemacht (APTR == VOID*) und danach wird der VOID* Zeiger in den "richtigen" Zeiger umgewandelt (hier ULONG*). Auf diese Weise bleibt GCC3 still.

[ - Antworten - Zitieren - Direktlink - ]

17.06.2004, 16:44 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Zitat:
Original von gni:
Zitat:
Kaesebroetchen:
@gni
Damit kompiliert das ganze fehlerfrei, danke.

Gut. Läufts auch? ;-)
Zitat:
Ja, kompiliert und läuft tadellos ! Ist zwar nur ein Fenster mit einem Button aber immerhin.

So einen wilden Code habe ich aber bisher noch nie gesehen (ich bin mehr so ein Windows C++ Hobbyprogrammierer) deshalb wäre ich dir doch sehr dankbar wenn du mir mit einfachen Worten erklären könntest was
(ULONG*)(APTR)&intuiwin );
eigentlich macht ?

Mit anderen Compilern und GCC < 3.x reicht der (ULONG*) Cast. GCC3 würde dennoch meckern, da bei Casts der Compiler annimmt das ein und derselbe Speicher über _verschiedene_ Zeiger geändert werden kann, ohne das der Compiler das mitbekommt. Das würde dann zu Fehlern führen, da der Compiler den Wert einer Speicherstelle nur einmal lesen könnte und dann eine Änderung dieses Speichers nicht bemerken würde. GCC3 hat solche Optimierungen und warnt deshalb bei "verdächtigen" Casts. Manchmal weiss der Programmierer aber mehr als der Compiler und dann will man solche Warnungen vermeiden. Genau das wird gemacht. Erst wird der Zeiger zu einem VOID* Zeiger gemacht (APTR == VOID*) und danach wird der VOID* Zeiger in den "richtigen" Zeiger umgewandelt (hier ULONG*). Auf diese Weise bleibt GCC3 still.


Dann ist das wohl so eine Art doppelte Typumwandlung, OK ich glaube jetzt habe ich es verstanden. Danke.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > GCC+Reaction [ - Suche - Neue Beiträge - Registrieren - Login - ]


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