Forum: Compiler & IDEs mehrere Rückgabewerte in C Funktionen


von Tishima (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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);

von Jens C. (jcarstens)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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.

von Micha (Gast)


Lesenswert?

>Mein vorliegendes C Buch hilft mir auch nicht weiter.
Wirf es weg...

von Tishima (Gast)


Lesenswert?

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

von Jens C. (jcarstens)


Lesenswert?

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

von Tishima (Gast)


Lesenswert?

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

von Tishima (Gast)


Lesenswert?

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
}

von Stefan E. (sternst)


Lesenswert?

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.

von Cyrill (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Cyrill (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

> 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.

von Cyrill (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.