Hallo
Ich versuche gerade meine C-Kenntnisse wiederzubeleben und komme bei einem der Standardbeispiele nicht weiter. Thema ist Übergabe von Parametern an Funktionen per Referenz.
Das Beispiel :
void swap( int &i1, int &i2) { int t; t = i1; i1 = i2; i2 = t; }
main() { int a , b ; swap (a,b); }
Mein Compiler (gcc 2.95) meldet sich mit :
test01.c:1: parse error before `&'
und danach noch Fehlermeldungen wegen nicht deklarierter Variablen i1 und i2.
Hab ich ein altes Buch erwischt oder ist das nicht Standard ? Ich bin perplex.
Hat jemand eine Erklärung dafür oder einen Hinweis wo ich nachsehen kann ?
Gruss
Peter
Hallo
Hi
Ich versuche gerade meine C-Kenntnisse wiederzubeleben
Das ist gut :-).
und komme bei einem der Standardbeispiele nicht weiter. Thema ist Übergabe von Parametern an Funktionen per Referenz.
Das Beispiel :
void swap( int &i1, int &i2) { int t; t = i1; i1 = i2; i2 = t; }
void swap( int *i1, int *i2) { int t; t = i1; i1 = i2; i2 = t; }
main() { int a , b ; swap (&a,&b); }
So musste es funktionieren ,wenn ich mich recht entsinne.
Cu Nando -- Mails mit Hinweisen auf mein *Quoting* usw. werden als Junkfood behandelt.
Hallo Nando,
On Sat, Apr 05, 2003 at 01:07:14PM +0200, Nando Körner wrote:
Hallo
void swap( int *i1, int *i2) { int t; t = i1; i1 = i2; i2 = t; }
Die Compiler-Warnung sollte dich zum Grübeln bringen:
gcc swap.c
swap.c: In function `swap': swap.c:5: warning: assignment makes integer from pointer without a cast swap.c:5: warning: assignment makes pointer from integer without a cast
i1 ist bei dir ein Pointer. Es wäre besser es pi1 zu nennen.
./a.out
vorher 1 2 danach 1 2
Gruß, thomas
Das Beispiel :
void swap( int &i1, int &i2) { int t; t = i1; i1 = i2; i2 = t; }
void swap( int *i1, int *i2) { int t; t = i1; i1 = i2; i2 = t; } main() { int a , b ; swap (&a,&b); }
So musste es funktionieren ,wenn ich mich recht entsinne.
Cu Nando
Das compiliert auch nicht. Gehen tut folgendes, das wollte ich aber vermeiden wegen exzessivem Gebrauch von *.
void swap( int *i1, int *i2) { int *t; *t = *i1; *i1 = *i2; *i2 = *t; }
main() { int a , b ; a=1 ; b=2 ; printf("\n"); printf("vorher %u %u \n",a,b) ; swap (&a,&b); printf("nachher %u %u \n",a,b) ; }
Danke
Peter
On Sat, Apr 05, 2003 at 01:37:09PM +0200, Peter Sattler wrote:
Das compiliert auch nicht. Gehen tut folgendes, das wollte ich aber vermeiden wegen exzessivem Gebrauch von *.
void swap( int *i1, int *i2) { int *t; *t = *i1; *i1 = *i2; *i2 = *t; }
Was ist am '*' so schlimm? Die Exzessivität ist Deine Idee und funktioniert nicht gut:
Du versuchst, an einen Int-Pointer (t) einen derefenzierten Int-Pointer (also einen Int daselbst) zuzuweisen. Das ist nicht das, was Du wolltest. [Auch wenn's technisch geht.]
Siehe meine andere Mail.
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann
On Sat, Apr 05, 2003 at 12:53:14PM +0200, Peter Sattler wrote:
Hallo
Ich versuche gerade meine C-Kenntnisse wiederzubeleben ...
Versuche es mal damit:
#include <stdio.h> void swap(int* pi1, int* pi2){ // pi1 ist pointer auf interger // *pi1 ist der Integer-Wert int t; t=*pi1; *pi1=*pi2; *pi2=t; }
int main(){ int a, b; a=1; b=2; printf("vorher %i %i\n", a, b); swap(&a, &b); // pointer von a und b uebergeben printf("danach %i %i\n", a, b); return 0; } thomas
On Sat, Apr 05, 2003 at 12:53:14PM +0200, Peter Sattler wrote:
Hallo
Ich versuche gerade meine C-Kenntnisse wiederzubeleben und komme bei einem der Standardbeispiele nicht weiter. Thema ist Übergabe von Parametern an Funktionen per Referenz.
Referenzen gibt's in C nicht.
void swap( int &i1, int &i2) { int t; t = i1; i1 = i2; i2 = t; }
main() { int a , b ; swap (a,b); }
Mein Compiler (gcc 2.95) meldet sich mit :
test01.c:1: parse error before `&'
Vielleicht nennst Du die Quelle einfach mal test01.cc und versuchst es dann nochmal. Oder schaffst es auf andere Weise, g++ (c++) zu nutzen.
und danach noch Fehlermeldungen wegen nicht deklarierter Variablen i1 und i2. Hab ich ein altes Buch erwischt oder ist das nicht Standard ? Ich bin perplex.
Du wirst ein C++-Buch erwischt haben. In C wäre obiges so realisiert:
void swap(int *i1, int *i2) { int t; t = *i1; *i1 = *i1, *i2 = t; }
int main() { int a, b; swap(&a, &b); }
Was auch viel durchsichtiger ist. Denn Referenzen als Pointerersatz zu nutzen ist nicht immer sehr weise. (Mag aber auch wieder Ansichtssache sein. - Im obigen Beispiel ist am Funktionsnamen ja gerade noch zu erkennen, was vielleicht passiert. Aber wenn Du folgenden Aufruf hast:
checkInt(a);
Kannst Du dann sagen, ob der für a gefährlich oder ungefährlich ist (will sagen, kann Deinem a etwas passieren? Das kannst Du erst etwas besser beurteilen, wenn Du den Prototyp geshen hast, und siehst, ob a als Refernz oder als Kopie übergeben wird.))
[Aber die letzten Sätze waren etwas OT, gebe ich zu.]
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann
lug-dd@mailman.schlittermann.de