Hallo, ich programmiere zur Zeit in WinAVR und möchte bei einer Funktion ein Array als Ergebniss zurückliefern. Kann mir jemand sagen, wie ich dann die Funktion deklarieren muss? Im Moment geb ich nur einen char-Wert zurück (s.u.). Ich möchte aber ein Array aus 3 char-Werten zurückliefern. unsigned char berechnung (unsigned int wert, unsigned char n) { //... }
unsigned char *berechnung (unsigned int wert, unsigned char n)
Ok. Das funktioniert schonmal. So wie das jetzt aussieht, liefert mir die Funktion allerdings nicht das Array, sondern einen Zeiger auf das Array zeigt. Oder teusche ich mich da? Ich möchte nun das Ergebnis der Funktion in ein bestehendes Array kopieren. Wie geht das dann? Ich kann ja nicht einfach schreiben: unsigned char test [3]; test = berechnung (a, b); Da bringt er mir die Fehlermeldung: error: incompatible types in assignment
Du übergibst an die Funktion zusätzlich einen Pointer auf das Array. In deiner Funktion schreibst du dann das Ergebnis per Pointer in das Array.
Übrigens : char = unsigned char void berechnung (unsigned int wert, unsigned char n, char *test) { *test[0]=n+1; *test[1]=n+(wert & 0x0f); *test[2]=n+10; }
@Benedikt: Dir ist aber schon klar, dass das eine sehr heikle Methode ist? Man gibt normalerweise keine Zeiger aus einer Funktion zurück. Sobald die Funktion beendet ist, werden die Variablen aus dem Stack gelöscht. D.h. sie werden nicht wirklich gelöscht, aber der Stackpointer wird versetzt. Wenn du jetzt die Werte nicht direkt ausliest und dafür sorgst, dass nichts mehr auf den Stack gelangt, bis du die Werte hast, dann sind die Werte weg und du hast Datenschrott. Besser ist oben genannte Lösung, ein Array zu übergeben, wobei man keinen Pointer übergeben muss, da Arrays immer per Referenz übergeben werden (man kann auch sagen, das Array ist ein Pointer (so in etwa)). @Gast: Das wird so nicht funktionieren. Du schreibst mit *test[x] in das Array. Somit hast du nen Zeiger auf nen Zeiger, übergibst aber nur nen einfachen Zeiger. Entweder man schreibt so rein: test[0] = 10; oder man übergibt an die Funktion nen Zeiger auf nen Zeiger, also entweder char **test oder char *test[]. Dann funktioniert das auch.
> man kann auch sagen, das Array ist ein Pointer (so in etwa)
Sag sowas nicht. Auch nicht 'in etwa'. Ein Array ist kein
Pointer. An manchen Stellen wird ein Array in einer Form
benutzt als ob der Array-Name ein Pointer waere. Das macht
aber aus einem Array noch lange keinen Pointer und ist
ein ewiger Stolperstein aller C-Anfaenger.
wenn du unbedingt ein array zurück geben willst, das vorher noch nicht existiert dann benutze in der funktion malloc um das array zu erstellen, geb dann den pointer auf das array zurück und später gibst du den speicher mit free wieder frei.
Also erstmal danke für die Unterstützung. Ich hab es jetzt wie folgt gemacht: char test [3]; ... berechnung (x,y test); ... void berechnung (unsigned int wert, unsigned char n, char rueck[]) { rueck[0]=n+1; rueck[1]=n+(wert & 0x0f); rueck[2]=n+10; } Es scheint so zu funktionieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.