www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie schreibt ma eine Funktion die ein Array zurück gibt?


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin Anfänger im Bereich Mikrocontroler und C Programmierung.
Ich arbeite mit AVR Studio und möchte in C eine Funktion schreiben die 
ein Array zurück liefert:


char foo[10];

foo = myFunction();


char[] myFunction()
{
 char bar[10];
 for (int i = 0; i < 10; i++)
 {
  bar[i] = i;
 }
}
error: incompatible types in assignment

Gruß
Peter

Autor: Moe s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal was von Zeigern gehört?

Autor: Moe s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zb arr[i] ist gleichbedeutent mit  *(arr + i) somit

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schon...

hast Du ein kleines Beispiel?
Danke.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist gleich mehrfach falsch, alleine weil in der Funktion nichts 
zurueckgegeben wird. Du musst einen Zeiger zurueckgeben und nicht den 
Fehler machen, diesen auf lokale Variablen zeigen zu lassen.

Michael

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, verstehe ich immer noch nicht. Kannst Du es evtl. auf das 
Beispiel oben anwenden?

Autor: Moe s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static und Zeiger ist das Zauberwort

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moe s wrote:
> static und Zeiger ist das Zauberwort
Man kann auch Klimmzüge machen, wie ein Blöder.

Ein 'Array' in C zurückgeben ist in 99% der Fälle Blödsinn, liegt in der 
Natur der Zeiger. Zurückgeben macht effektiv nur dann Sinn, wenn die 
Funktion das Dingen auch in einem mit malloc() herleitet.
Sonst ist meistens immer ein Parameter die richtige Wahl, in den der 
Aufrufer einen Vektor legt.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> Sorry, verstehe ich immer noch nicht. Kannst Du es evtl. auf das
> Beispiel oben anwenden?

Was hilft Dir das dann? Du musst das schon auch verstanden haben. Ich 
wuerde Dir vorschlagen, erst mal C zu lernen, auf einem PC. Denn wenn Du 
solche Fehler machst erleichtert Dir der AVR das debugging nicht 
wirklich.

Autor: Moe s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sven
und dein geschwafel hat er jetzt mit sicherheit verstanden.
und was das mit malloc zu tun hat ist mir auch nicht klar.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael

Das Beispiel ist recht klein und zu lernen doch nicht schlecht geeignet. 
Dachte ich.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber deines, gell?

Mit malloc() hat das zu tun, dass das der einzige Weg ist, ein echtes 
Datenfeld beliebiger Größe dynamisch zurückzugeben. Das geht anders 
nicht.

void meine_funktion(char *a) {
  for (int i = 0; i < 10; i++) {
    a[i] = i;
  }
}


char mein_array[10];
meine_funktion(mein_array);

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank. Ich glaube ich verstehe es sogar :-)))

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

zur Anregung der Diskussion hier ein Beispiel aus einer Compiler-Hilfe:
char * strncpy ( char * destination, const char * source, size_t num );

Copy characters from string
Copies the first num characters of source to destination.

Parameters

destination
    Pointer to the destination array where the content is to be copied.
source
    C string to be copied.
num
    Maximum number of characters to be copied from source.

Return Value
destination is returned.

Da hat man alles in einem Paket: array-Parameter veränderlich u. const, 
variable array-Länge, und sinnvoller array-Rückgabewert.

tschü Dude

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> Vielen Dank. Ich glaube ich verstehe es sogar :-)))

Das ist aber jetzt was ganz anderes, als Du urspruenglich wolltest, das 
modifiziert Dir naemlich das uebrgebene Array (call by reference).

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.