www.mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char *berechnung (unsigned int wert, unsigned char n)

Autor: Bernd (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Frank Erdrich (erdi-soft)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Lupin (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

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.