Forum: PC-Programmierung Funktion mit mehreren Rückgabewerten


von Martin M. (martin69)


Lesenswert?

Hallo,

ich habe eine Funktion, die mehrere Rückgabewerte hat. Bei "return" 
eine, die anderen werden der Funktion übergeben:

Hauptfunktion:
unsigned char Array1[12];
unsigned char Array2[10];
unsigned char Rueckgabewert;

rueckgabewert = testfunktion(Array1, Array2);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Unterfunktion:
unsigned char testfunktion(unsigned char * ArrayX, unsigned char * 
ArrayY)
{
strcpy(ArrayX, "xxx");
strcpy(ArrayY, "yyy");

return (123);
}



Das Zugreifen auf die 2 Arrays in der Unterfunktion funktioniert 
problemlos. Nun möchte ich noch eine weitere Variable (Integer-Zahl, 
kein Array) der Unterfunktion übergeben und dort zugreifen. Im Prinzip 
ist es mir klar, daß ich die Adresse der Integerzahl übergeben muß. Die 
Unterfunktion muß dann denn Wert in die Speichestelle der übergebenen 
Adresse zuweisen. Aber wie muß ich die Sache nun bei Integer definieren? 
Ich habs leider nicht so mit Zeigern...

So in der Art müßte es aussehen:


Hauptfunktion:
unsigned char Array1[12];
unsigned char Array2[10];
unsigned char Rueckgabewert;
int Integerzahl;

rueckgabewert = testfunktion(Array1, Array2, Integerzahl);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Unterfunktion:
unsigned char testfunktion(unsigned char * ArrayX, unsigned char * 
ArrayY, int* IntegerZ)
{
strcpy(ArrayX, "xxx");
strcpy(ArrayY, "yyy");
IntegerZ = 0xfe33;

return (123);
}


Aber wie muß ich das mit dem Integer korrekt definieren???

von *.* (Gast)


Lesenswert?

rueckgabewert = testfunktion(Array1, Array2, &Integerzahl);

...

*IntegerZ = 0xfe33;

von Martin M. (martin69)


Lesenswert?

@ *.*:
Danke für die schnelle Antwort.
Ist die von mir angegeben Deklaration der Unterfunktion korrekt:

unsigned char testfunktion(unsigned char * ArrayX, unsigned char *
ArrayY, int* IntegerZ)

Oder muß man hier auch noch was ändern? (ich kann es gerade nicht 
testen, da ich nicht mehr in meinem Hobbyraum bin und der PC im 
Wohnzimmer hat keinen Compiler drauf).

von *.* (Gast)


Lesenswert?

Ist korrekt. Es wird ein Zeiger auf ein int übergeben.

von Martin M. (martin69)


Lesenswert?

OK. Danke für die Antwort. Wenn ich da schon einen Fachmann habe ... ich 
habe da noch ein anderes Problem:

Hauptfunktion:
unsigned char Array1[12];

testfunktion(Array1);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Unterfunktion:
testfunktion(unsigned char * ArrayX)
{
int Integerzahl;

Integerzahl = sizeof(ArrayX);

return;
}


Warum kommt bei Sizeof immer nur "2" als Ergebnis in der Unterfunktion 
raus, egal wie groß das Array in der Hauptfunktion ist? Hat sicherlich 
mit dem "Zeiger-Zeugs" zu tun. Ich bin nicht drauf gekommen, warum das 
so ist. Nun habe ich der Funktion noch einen Integerwert übergeben, der 
die Länge liefert:

testfunktion(Array1, sizeof(Array1));

anders wußte ich mir nicht zu helfen. Kann man die Arraylänge innnerhalb 
der Funktion nicht irgend wie abfragen?

von icke (Gast)


Lesenswert?

Schau mal genau sizeof was du machst.
Hier wohl ein Zeiger.

von *.* (Gast)


Lesenswert?

ArrayX steht hier für einen Zeiger auf ein Array, der auf deiner 
Platform wohl 2 byte lang ist. Information über Länge (die hat eh nur 
der Compiler) ist hier nicht mehr vorhanden.

Die Länge des Arrays extra zu übergeben ist gängige Praxis. Anders geht 
es nicht, wenn man keine weiteren Informationen über den Inhalt des 
Arrays zulässt. Z.B. wenn man immer eine mit \0 terminierte Zeichenfolge 
darin stehen hat könnte man strlen(...) verwenden.

Oder man kann einen Zeiger auf ein struct übergeben das aus der Länge 
und dem Zeiger auf das Array besteht, aber das wird dann schon 
aufwändiger als den Längenwert extra zu übergeben.

von Martin M. (martin69)


Lesenswert?

@ icke:
daß es wohl die Länge eines Zeigers und nicht die Länge des Arrays ist, 
hab ich mir schon gedacht. Aber wie kann ich in der Unterfunktion die 
Länge des Arrays abfragen?

@*.*
Ich glaube dann lasse ich es so mit dem zusätzlich übergebenen 
Parameter.... Das mit der mit \0 terminierte Zeichenfolge ist zwar ne 
sehr gute Idee, aber dann muß man aufpassen, daß man beim 
Funktionsaufruf das Array immer entsprechend "modifiziert" hat. Das ist 
mir doch etwas zu gefährlich. Nochmals Danke für Deine Antworten!

von Bartli (Gast)


Lesenswert?

> Aber wie kann ich in der Unterfunktion die Länge des Arrays abfragen?

Gar nicht. Muss der Aufrufer als weiteren Parameter übergeben.

von Martin M. (martin69)


Lesenswert?

@Bartli:

OK, wurde ja schon hier geklärt, daß dies die sinnvollste Variante ist.

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.