mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Grundlagen übersicht


Autor: Miriam (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Miriam (Gast)
Datum:

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

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Marius Wensing (mw1987)
Datum:

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

Autor: Autonomer Alkoholiker (Gast)
Datum:

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

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

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

Autor: Autonomer Alkoholiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön! ;)

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

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.