Forum: Mikrocontroller und Digitale Elektronik C-Grundlagen übersicht


von Miriam (Gast)


Lesenswert?

Hi,

hat von euch jemand eine liste mit den Grundlagen zu C (Hardware nah).

sitz gerade vor nem problem. Wie kann ich ein Array aus ner Funktion 
zurück geben lassen? (Datentyp ist BYTE).

Damit ich an solchen dingen nicht allzu lang hängen bleibe, würde ich 
mir so eine liste wünschen, kennt von euch jemand eine im netz?

gruß
miri

von Peter (Gast)


Lesenswert?

Miriam schrieb:
> Wie kann ich ein Array aus ner Funktion
> zurück geben lassen? (Datentyp ist BYTE).

das hat erstmal nicht mit Hardware zu tun.

Wer legt den Speicher für das Array an? In C kann man nur zeiger 
zurückgeben du darst aber auf keinen fall ein zeiger auf ein lokales 
array zurückgeben!

von Miriam (Gast)


Lesenswert?

das bedeutet, dass ich gar kein array in einer funktion erzeugen kann 
und dann durch aufruf der funktion den wert einer anderen funktion 
übergeben kann?

beispiel:

BYTE * meineFunktion()
{
    BYTE meinArray[8] = {1,2,3,4,5,6,7,8};
    return meinArray;
}

void andereFunktion()
{
     BYTE Array[8] = meineFunktion();
}

das funktioniert dann wohl nicht, oder? wie löse ich dann dieses 
problem?

v.g. miri

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Hallo miri,
Variablen, die Du in einer Funktion anlegst, werden im allgemeinen auf 
dem Stack angelegt.
Der Stackpointer wird nach Verlassen der Funktion wieder zurückgesetzt.
Der Speicher kann dann wieder für etwas anderes verwendet werden.
Lebensgefährlich für die Daten in deinem Array.

von Peter (Gast)


Lesenswert?

es kommt darauf an wo man programmiert. Auf einem PC würde man es soch 
machen

BYTE * meineFunktion()
{
    BYTE* meinArray = (BYTE*)malloc( sizeof(BYTE)*8 );
    return meinArray;
}
Aber jetzt muss auch noch jemand den Speicher mit free freigeben!!!!

Willkommen bei C


auf einem µC könnte man es so machen


void meineFunktion(BYTE* a)
{
    a[1] = 42;
}


BYTE meinArray[8];
meineFunktion( meineFunktion );

von Marius W. (mw1987)


Lesenswert?

Das Stichwort ist hier sowas wie "Call by reference". Du übergibst also 
der Funktion meineFunktion einen Pointer auf das zu füllende Array.

MfG
Marius

von Autonomer Alkoholiker (Gast)


Lesenswert?

@ Peter:

Funktioniert die PC Version nicht auch auf einem µC?


2. Bist du Sicher, dass der Speicherplatz auch nach dem Verlassen der 
Funktion noch für diesen Speicherbereich reserviert ist? Wenn ja, kann 
man ihn außerhalb der Funktion wieder freigeben? Z.B.:

temp = meineFunktion();
free(temp);

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Autonomer Alkoholiker schrieb:
> @ Peter:
>
> Funktioniert die PC Version nicht auch auf einem µC?
>
Für malloc() brauchst Du ein Betriebssytem (oder Du musst Dir die 
malloc-Funktion selbst schreiben).
Dann geht's auch auf einem uC.

von Autonomer Alkoholiker (Gast)


Lesenswert?

Dankeschön! ;)

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Wolfgang Bengfort schrieb:
> Autonomer Alkoholiker schrieb:
>> @ Peter:
>>
>> Funktioniert die PC Version nicht auch auf einem µC?
>>
> Für malloc() brauchst Du ein Betriebssytem (oder Du musst Dir die
> malloc-Funktion selbst schreiben).
> Dann geht's auch auf einem uC.

Naja ganz so ist dem nicht, malloc kann man mit z.B. der avr-libc 
verwenden, das ist eine Library-Implementierung, die auf dem Heap 
arbeitet. Bei einem AVR macht das aber nur Sinn, wenn entsprechend viel 
Speicher vorhanden ist, also typischerweise externer Speicher.

Gruss,
Michael

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.