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


von Peter (Gast)


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

von Moe s (Gast)


Lesenswert?

Schon mal was von Zeigern gehört?

von Moe s (Gast)


Lesenswert?

zb arr[i] ist gleichbedeutent mit  *(arr + i) somit

von Peter (Gast)


Lesenswert?

Ja, schon...

hast Du ein kleines Beispiel?
Danke.

von Michael G. (linuxgeek) Benutzerseite


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

von Peter (Gast)


Lesenswert?

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

von Moe s (Gast)


Lesenswert?

static und Zeiger ist das Zauberwort

von Sven P. (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


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.

von Moe s (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

@Michael

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

von Sven P. (Gast)


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.
1
void meine_funktion(char *a) {
2
  for (int i = 0; i < 10; i++) {
3
    a[i] = i;
4
  }
5
}
6
7
8
char mein_array[10];
9
meine_funktion(mein_array);

von Peter (Gast)


Lesenswert?

Vielen Dank. Ich glaube ich verstehe es sogar :-)))

von 12er Dude (Gast)


Lesenswert?

Hallo,

zur Anregung der Diskussion hier ein Beispiel aus einer Compiler-Hilfe:
1
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

von Michael G. (linuxgeek) Benutzerseite


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

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.