www.mikrocontroller.net

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


Autor: Tishima (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

void meine_funktion(int a, int b, int c, int *x, int *y, int *z) {
  *x =
  *y =
  *z =
}


int x, y, z;
meine_funktion(1, 2, 3, &x, &y, &z);


Autor: Jens Carstens (jcarstens)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Micha (Gast)
Datum:

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

Autor: Tishima (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Carstens (jcarstens)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tishima (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tishima (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal die komplette Routine

//-------------------------------------------------------------------------------
//HSV nach RGB konvertieren
//-------------------------------------------------------------------------------

void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, unsigned char *r, unsigned char *g, unsigned char *b)
{
  unsigned char r1=0,g1=0,b1=0, i, f;
  unsigned int p, q, t;

  if( s == 0 ) 
   {  r1 = g1 = b1 = v;
  }
  else
  {  i=h/43;
    f=h%43;
    p = (v * (255 - s))/256;
    q = (v * ((10710 - (s * f))/42))/256;
    t = (v * ((10710 - (s * (42 - f)))/42))/256;

    switch( i )
    {  case 0:
        r1 = v; g1 = t; b1 = p; break;
      case 1:
        r1 = q; g1 = v; b1 = p; break;
      case 2:
        r1 = p; g1 = v; b1 = t; break;
      case 3:
        r1 = p; g1 = q; b1 = v; break;      
      case 4:
        r1 = t; g1 = p; b1 = v; break;        
      case 5:
         r1 = v; g1 = p; b1 = q; break;
    }
  }

  //cli();                                              // Kein Interrupt beim übernehmen der neuen Werte!
  r=r1, g=g1, b=b1;      
  //sei();
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
r=r1, g=g1, b=b1;
Das ist falsch. Da muss jeweils noch ein '*' davor.

Autor: Cyrill (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
Kap. 14.6.1

Viel Erfolg

Cyrill

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyrill schrieb:

> vgl.
> 
http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c...
> Kap. 14.6.1

Da stehen aber teilweise auch hanebüchene Sachen drin:
char *eingabe(char *str) {
   char input[MAX];
   printf("Bitte \"%s\" eingeben: ",str);
   fgets(input, MAX, stdin);
   return strtok(input, "\n");
}

...
Das Newline-Zeichen wird mit strtok() entfernt, und die Funktion liefert
auch gleich die Anfangsadresse des Strings input als Rückgabewert zurück,
welchen Sie gleich mit return weiterverwenden. Doch Vorsicht, Folgendes
funktioniert nicht:

char *eingabe(char *str) {
   char input[MAX];
   printf("Bitte \"%s\" eingeben: ", str);
   fgets(input, MAX, stdin);
   return input;
}

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.

Autor: Cyrill (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cyrill (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.