DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > GCC+Reaction | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2004-06-16, 12:44 h Kaesebroetchen Posts: 643 User |
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 ! [ - Answer - Quote - Direct link - ] |
2004-06-16, 13:10 h thomas Posts: 7718 User |
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/ [ - Answer - Quote - Direct link - ] |
2004-06-16, 13:10 h Inferno Posts: 157 User |
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) [ - Answer - Quote - Direct link - ] |
2004-06-16, 13:11 h gni Posts: 1106 User |
Zitat: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. [ - Answer - Quote - Direct link - ] |
2004-06-16, 14:06 h Kaesebroetchen Posts: 643 User |
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 ); } [ - Answer - Quote - Direct link - ] |
2004-06-16, 14:29 h gni Posts: 1106 User |
Zitat:Wenn Du proto/ verwendest, _müssen_ die Librarybasen korrekt sein. "struct Library *" != "struct was auch immer*" Zitat:Vermutlich war die Argumentreihenfolge vorher doch richtig ;-) [ - Answer - Quote - Direct link - ] |
2004-06-16, 14:30 h gni Posts: 1106 User |
Zitat:Weil für die Reactionklassen in libamiga.a keine Stubs drin sind. [ - Answer - Quote - Direct link - ] |
2004-06-16, 18:13 h Kaesebroetchen Posts: 643 User |
@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 ? [ - Answer - Quote - Direct link - ] |
2004-06-16, 22:32 h Kaesebroetchen Posts: 643 User |
Doppelpost, sorry [ Dieser Beitrag wurde von Kaesebroetchen am 16.06.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-06-17, 08:54 h thomas Posts: 7718 User |
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/ [ - Answer - Quote - Direct link - ] |
2004-06-17, 09:49 h gni Posts: 1106 User |
Zitat:Warum schaust Du nicht nach!? GetAttr ist eine Funktion der intuition.library! Zitat:Man kann. [ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-06-17, 09:55 h gni Posts: 1106 User |
Zitat: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:Netter Versuch, aber leicht daneben. Schau einfach mal in intuition.doc nach. BTW, grep ist eine feine Sache. [ - Answer - Quote - Direct link - ] |
2004-06-17, 11:50 h thomas Posts: 7718 User |
Zitat: 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/ [ - Answer - Quote - Direct link - ] |
2004-06-17, 12:15 h Kaesebroetchen Posts: 643 User |
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 ? [ - Answer - Quote - Direct link - ] |
2004-06-17, 12:35 h ZeroG Posts: 1487 User |
Zitat: BTW: By the Way - Übrigens Grep ist ein Debugger für GCC, wenn ich mich nicht malwieder irre. [ - Answer - Quote - Direct link - ] |
2004-06-17, 12:56 h gni Posts: 1106 User |
Zitat:Richtig. Zitat:Du irrst. Mit grep sucht man [in Textdokumenten]. Es steht für "global regular expression print" [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:00 h gni Posts: 1106 User |
Zitat: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. ] [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:03 h gni Posts: 1106 User |
Zitat:Dann solltest Du etwas vorsichtiger agieren. Da Du sonst immer so versiert bist, war ich von den GettAttr() Aussagen doch etwas überrascht. [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:26 h ZeroG Posts: 1487 User |
Zitat: Ups... [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:39 h Kaesebroetchen Posts: 643 User |
[/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! [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:41 h Kaesebroetchen Posts: 643 User |
[quote] Original von gni: Zitat:Richtig. [quote] Wie ging doch gleich diese Lied ? mfg mit freundlichen . . . [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:55 h gni Posts: 1106 User |
[gelöscht, Browser-History] [ Dieser Beitrag wurde von gni am 17.06.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-06-17, 13:56 h gni Posts: 1106 User |
Zitat: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 [ - Answer - Quote - Direct link - ] |
2004-06-17, 14:52 h Kaesebroetchen Posts: 643 User |
@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. ] [ - Answer - Quote - Direct link - ] |
2004-06-17, 15:58 h gni Posts: 1106 User |
Zitat:Gut. Läufts auch? ;-) Zitat: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. [ - Answer - Quote - Direct link - ] |
2004-06-17, 16:44 h Kaesebroetchen Posts: 643 User |
Zitat: Dann ist das wohl so eine Art doppelte Typumwandlung, OK ich glaube jetzt habe ich es verstanden. Danke. [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > GCC+Reaction | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |