www.mikrocontroller.net

Forum: PC-Programmierung Funktion mit mehreren Rückgabewerten


Autor: Martin M. (martin69)
Datum:

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

Autor: *.* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rueckgabewert = testfunktion(Array1, Array2, &Integerzahl);

...

*IntegerZ = 0xfe33;

Autor: Martin M. (martin69)
Datum:

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

Autor: *.* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist korrekt. Es wird ein Zeiger auf ein int übergeben.

Autor: Martin M. (martin69)
Datum:

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

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal genau sizeof was du machst.
Hier wohl ein Zeiger.

Autor: *.* (Gast)
Datum:

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

Autor: Martin M. (martin69)
Datum:

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

Autor: Bartli (Gast)
Datum:

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

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

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bartli:

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

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.