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???
Gast
#1093580
rueckgabewert = testfunktion(Array1, Array2, &Integerzahl); ... *IntegerZ = 0xfe33;
@ *.*: 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).
Gast
#1093597
Ist korrekt. Es wird ein Zeiger auf ein int übergeben.
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?
Gast
#1093617
Schau mal genau sizeof was du machst. Hier wohl ein Zeiger.
Gast
#1093625
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.
@ 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!
Gast
#1093813
> Aber wie kann ich in der Unterfunktion die Länge des Arrays abfragen?
Gar nicht. Muss der Aufrufer als weiteren Parameter übergeben.
@Bartli: OK, wurde ja schon hier geklärt, daß dies die sinnvollste Variante ist.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.