Hallo! ICh möchte eine Funktion schreiben die mir mehr als einen Rückgabewert liefert. z.B. ich übergebe variable a,b,c und erhalte x y z als berechneten wert zurück, wie laesst sich das in C relalisieren. Mein vorliegendes C Buch hilft mir auch nicht weiter. mfg, Bjoern
1 | void meine_funktion(int a, int b, int c, int *x, int *y, int *z) { |
2 | *x = |
3 | *y = |
4 | *z = |
5 | }
|
6 | |
7 | |
8 | int x, y, z; |
9 | meine_funktion(1, 2, 3, &x, &y, &z); |
Moin! Sven P. schrieb: > [c] > > void meine_funktion(int a, int b, int c, int *x, int *y, int *z) { > *x = > *y = > *z = > } Das ist böse. Solange man nicht die Zeiger selbst ändern will, verwendet man 'Referenzen', die extra zu diesem Zweck irgendwann erfunden worden sind: void meine_funktion(int a, int b, int c, int &x, int &y, int &z) { x = y = z = } Der Compiler macht daraus zwar so ziemlich das gleiche, aber er verhindert, daß man die Zeiger evtl. aus versehen verbiegt und Unfug damit anstellt. HTH Jens
Jens Carstens schrieb: > Das ist böse. > Solange man nicht die Zeiger selbst ändern will, verwendet man > 'Referenzen', die extra zu diesem Zweck irgendwann erfunden worden sind: Da bin ich aber gespannt, wie du das in C machst.
>Mein vorliegendes C Buch hilft mir auch nicht weiter.
Wirf es weg...
Hallo! Sven, Jens danke für den Hinweis. Werd das ganze mal ausprobieren, steh aber grade vor dem problem das mein Controller voll ist, muß sehen wo ich noch einsparpotentail habe. mfg, Bjoern
Sven P. schrieb: > Jens Carstens schrieb: >> Das ist böse. >> Solange man nicht die Zeiger selbst ändern will, verwendet man >> 'Referenzen', die extra zu diesem Zweck irgendwann erfunden worden sind: > Da bin ich aber gespannt, wie du das in C machst. Ahemm... Jo. Ich bin im Geiste überwiegend bei C++... Da ist das böse, in C darf man natürlich alles :-) Merke: niemals vor dem Früstück posten! IdS, Jens 'vergiss einfach, was ich gesagt habe' Carstens
Hallo! So ich probiere grade aus. Sven's variante liefert keinen fehler im Compiler. Die Variante von Jens liefert eine Warnung ../USI-TWI-Slave-Test.c:90: warning: assignment makes pointer from integer without a cast fuer die 3 Rückgabe variablen, was ist nun richtiger oder wie umschiff ich das Warning. Sorry, hab lange nichts mehr in C gemacht. mfg, Bjoern
Hier nochmal die komplette Routine
1 | //-------------------------------------------------------------------------------
|
2 | //HSV nach RGB konvertieren
|
3 | //-------------------------------------------------------------------------------
|
4 | |
5 | void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, unsigned char *r, unsigned char *g, unsigned char *b) |
6 | {
|
7 | unsigned char r1=0,g1=0,b1=0, i, f; |
8 | unsigned int p, q, t; |
9 | |
10 | if( s == 0 ) |
11 | { r1 = g1 = b1 = v; |
12 | }
|
13 | else
|
14 | { i=h/43; |
15 | f=h%43; |
16 | p = (v * (255 - s))/256; |
17 | q = (v * ((10710 - (s * f))/42))/256; |
18 | t = (v * ((10710 - (s * (42 - f)))/42))/256; |
19 | |
20 | switch( i ) |
21 | { case 0: |
22 | r1 = v; g1 = t; b1 = p; break; |
23 | case 1: |
24 | r1 = q; g1 = v; b1 = p; break; |
25 | case 2: |
26 | r1 = p; g1 = v; b1 = t; break; |
27 | case 3: |
28 | r1 = p; g1 = q; b1 = v; break; |
29 | case 4: |
30 | r1 = t; g1 = p; b1 = v; break; |
31 | case 5: |
32 | r1 = v; g1 = p; b1 = q; break; |
33 | }
|
34 | }
|
35 | |
36 | //cli(); // Kein Interrupt beim übernehmen der neuen Werte!
|
37 | r=r1, g=g1, b=b1; |
38 | //sei();
|
39 | }
|
Tishima schrieb:
> Die Variante von Jens liefert eine Warnung
Die Variante von Jens ist C++, kein C.
Sofern du nicht vor hast, auf C++ umzusteigen, vergiss seine Variante
ganz schnell wieder.
Zu deinem Code:
1 | r=r1, g=g1, b=b1; |
Das ist falsch. Da muss jeweils noch ein '*' davor.
hmm, kannst du nicht einfach einen Zeiger als Rückgabewert verwenden, der auf ein Array zeigt, der alle drei Parameter enthält ? Oder bin ich jetzt komplett woanders mit den Gedanken ? vgl. http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_014_005.htm#RxxobKap014005040028BF1F0331A3 Kap. 14.6.1 Viel Erfolg Cyrill
Cyrill schrieb: > vgl. > http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_014_005.htm#RxxobKap014005040028BF1F0331A3 > Kap. 14.6.1 Da stehen aber teilweise auch hanebüchene Sachen drin:
1 | char *eingabe(char *str) { |
2 | char input[MAX]; |
3 | printf("Bitte \"%s\" eingeben: ",str); |
4 | fgets(input, MAX, stdin); |
5 | return strtok(input, "\n"); |
6 | } |
7 | |
8 | ... |
9 | Das Newline-Zeichen wird mit strtok() entfernt, und die Funktion liefert |
10 | auch gleich die Anfangsadresse des Strings input als Rückgabewert zurück, |
11 | welchen Sie gleich mit return weiterverwenden. Doch Vorsicht, Folgendes |
12 | funktioniert nicht: |
13 | |
14 | char *eingabe(char *str) { |
15 | char input[MAX]; |
16 | printf("Bitte \"%s\" eingeben: ", str); |
17 | fgets(input, MAX, stdin); |
18 | return input; |
19 | } |
Beides ist gleichermaßen falsch. Mir ist schleierhaft, wie der Autor auf die Idee kommt, dass die erste Funktion im Gegensatz zur zweiten einen gültigen Pointer zurückgeben würde. Er sagt doch schließlich auch selber, dass strtok die Adresse von input zurück liefert.
Hallo Stefan, hmm, genau an das 2te Beispiel, welches du nennst, hab ich gedacht. Aber dass es nicht funktionieren soll ? Habe es noch nicht ausprobiert, aber gut zu wissen. Ich dachte, mit return input liefere er mir die Anfangsadresse des Arrays, auf den ich dann über die Adresse (Dereferenzierungsoperator) drauf zugreifen kann. Schöne Grüße Cyrill
> Ich dachte, mit return input liefere er mir die Anfangsadresse des > Arrays, auf den ich dann über die Adresse (Dereferenzierungsoperator) > drauf zugreifen kann. Aber input ist eine lokale Variable, die nach dem return nicht mehr existiert. Du musst einfach weiter lesen. Es steht dort mit drin, was das Problem ist und wie man es umgeht.
hmm, das ist klar, Tschuldige, dann habe ich dich mißverstanden, nämlich, dass das überhaupt nicht geht! Dann ist alles klar :) Schönen Sonntag
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.