Forum: Mikrocontroller und Digitale Elektronik WinAVR: Kann Funktion auch Array zurückliefern?


von Bernd (Gast)


Lesenswert?

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)
{
//...
}

von Benedikt (Gast)


Lesenswert?

unsigned char *berechnung (unsigned int wert, unsigned char n)

von Bernd (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Ü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;
}

von Frank E. (erdi-soft)


Lesenswert?

@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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Lupin (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.