Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rückgabewerte in einer C-funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.10.2003, 15:17 Uhr
~Stefan
Gast


Hallo Leute,

ich hab gerade angefangen ANSI C zu programmieren.
Vielleicht ne simple Frage, aber ist es in C möglich das
eine Funktion mit "return" mehrere Werte zurückliefert?

Danke, Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.10.2003, 15:22 Uhr
Pablo
Supertux
(Operator)


return liefert den Datentyp der Funktion zurück. Wenn du mehrer Werte zurückgeben willst, dann kannst du einen Pointer auf ein Array zurückgeben oder ein struct machen, und die Funktion liefert ein struct, oder so. Aber int foo() { return 1; return 2;}
liefert immer nur 1. 1 und 2 gleichzeitg wird nie zurückgegeben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.10.2003, 15:23 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein. Du hast eigentlich nur zwei alternativen:
1. Die Rückgabewerte in eine Struktur verpacken, also etwa so:

C++:
struct return_wert
{
     char* x;
     int y;
};

struct return_wert tolle_function()
{
    static char* h = "Hallo";
    struct return_wert r;
    r.x = h;
    r.y = strlen(h);
    return r;
}


2. VErwenden der Parameterliste

C++:
void tolle_function(char** x, int*y)
{
    static char* h = "Hallo";
    *x = h;
    *y = strlen(h);
}
/* natürlich kann man hier auch was anderes als void zurückgeben, aber eben nur eine Sache auf einmal */


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.10.2003, 16:00 Uhr
~Stefan
Gast


struct is super,
genau das hab ich gebraucht!

Gruss Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.10.2003, 20:38 Uhr
~Stefan
Gast


Hab jetzt versucht ein Programm zu schreiben
das structs zurückliefert. Allerdings bringt mir
der Compiler Fehlermeldungen aus denen ich
nicht schlau werde. Vielleicht hat jemand einen
Tip was ich vergessen hab!

Danke Stefan


C++:
#include <avr/io.h>

struct Byte_eins_werte
{
  unsigned char Slave_Adresse;
  unsigned char R_W;
  unsigned char Ident;
};

struct split(char Byte_eins)                    
// ????? split.c:10: error: parse error before "char"

{
struct Byte_eins_werte byte_daten;

// Ausmaskieren
byte_daten.Slave_Adresse = ((0x70) & Byte_eins);
byte_daten.Slave_Adresse = (Slave_Adresse >> 4);

byte_daten.R_W = ((0x08) & Byte_eins);
byte_daten.R_W = (R_W >> 3);

byte_daten.Ident = ((0x07) & Byte_eins);

return byte_daten;
}



int main(void)
{

struct Byte_eins_werte byte_werte;

while(1)
  {
  byte_werte = split(0xFF);          
  //split.c: In function `main':
  // ????? split.c:35: warning: implicit declaration of function `split'
  // ????? split.c:35: error: incompatible types in assignment
  }
return(0);
}



--edit: cpp-tags gesetzt. Nächstes mal machs bitte selbst.

Dieser Post wurde am 30.10.2003 um 20:43 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.10.2003, 20:44 Uhr
0xdeadbeef
Gott
(Operator)


Dein Problem liegt in der Zeile

C++:
struct split(char Byte_eins)  


Das muss so aussehen:

C++:
struct Byte_eins_werte split(char Byte_eins)


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.10.2003, 20:52 Uhr
Pablo
Supertux
(Operator)


Vergleiche deine

C++:
struct Byte_eins_werte
{
  unsigned char Slave_Adresse;
  unsigned char R_W;
  unsigned char Ident;
};

struct split(char Byte_eins)


Du deklarierst die Funktion spilt genauso wie eine struct, und ( ist nicht in der Deklaration einer Strukt erlaubt, deshalb der parse error before char.

-- mist: @beefy war wohl schneller --
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.10.2003 um 20:52 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.10.2003, 23:13 Uhr
~Stefan
Gast


Super, das mit dem "parse error before char"
hat sich jetzt erledigt. Aber der Compiler meckert
weiter rum!

Er schreibt die Variablen Slave_Adresse & R_W
sind nicht deklariert. Was will er von mir, ich hab das
doch schon im struct deklariert?

Was hat es bei den structs mit diesem "->" Operator
auf sich, muß ich den verwenden?

Danke für die Hilfe!

Stefan


C++:
#include <avr/io.h>

struct Byte_eins_werte
{
  unsigned char Slave_Adresse;
  unsigned char R_W;
  unsigned char Ident;
};

struct Byte_eins_werte split(char Byte_eins)
{
struct Byte_eins_werte byte_daten;

// Ausmaskieren
byte_daten.Slave_Adresse = ((0x70) & Byte_eins);
byte_daten.Slave_Adresse = (Slave_Adresse >> 4);
// split.c:16: error: `Slave_Adresse' undeclared (first use in this function)
// split.c:16: error: (Each undeclared identifier is reported only once
// split.c:16: error: for each function it appears in.)

byte_daten.R_W = ((0x08) & Byte_eins);
byte_daten.R_W = (R_W >> 3);
// split.c:22: error: `R_W' undeclared (first use in this function)

byte_daten.Ident = ((0x07) & Byte_eins);

return byte_daten;
}



int main(void)
{

struct Byte_eins_werte byte_werte;

while(1)
  {
  byte_werte = split(0xFF);      
  }
return(0);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.10.2003, 08:32 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
#include <avr/io.h>

struct Byte_eins_werte
{
  unsigned char Slave_Adresse;
  unsigned char R_W;
  unsigned char Ident;
};

struct Byte_eins_werte split(char Byte_eins)
{
struct Byte_eins_werte byte_daten;

// Ausmaskieren
byte_daten.Slave_Adresse = ((0x70) & Byte_eins);
byte_daten.Slave_Adresse = ([b]byte_daten.[/b]Slave_Adresse >> 4);
// split.c:16: error: `Slave_Adresse' undeclared (first use in this function)
// split.c:16: error: (Each undeclared identifier is reported only once
// split.c:16: error: for each function it appears in.)

byte_daten.R_W = ((0x08) & Byte_eins);
byte_daten.R_W = ([b]byte_daten.[/b]R_W >> 3);
// split.c:22: error: `R_W' undeclared (first use in this function)

byte_daten.Ident = ((0x07) & Byte_eins);

return byte_daten;
}



int main(void)
{

struct Byte_eins_werte byte_werte;

while(1)
  {
  byte_werte = split(0xFF);      
  }
return(0);
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 31.10.2003 um 08:33 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: