Forum: Mikrocontroller und Digitale Elektronik Array übergabe an Funktion


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Elisa W. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Moin,

wodrin besteht der Unterschied ob Ich jetzt die Variable innerhalb der 
Funktion
an einer anderen Funktion übergebe via. Adresse oder ob Ich die Variable 
("b")
außerhalb deklariere und diese dann an die Funktion übergebe?

Wenn Ich es innerhalb der Funktion mache, kommt nur Blödsinn bei raus.
Stimmt da was mit der Adressübergabe nicht?
1
void bearbeite(uint8_t *in)
2
{
3
  ..
4
}
5
6
// So funktioniert das nicht..
7
void varinFunc()
8
{
9
  uint8_t b[10][10]; 
10
  
11
  bearbeite(&b[0][0]);
12
}
13
14
// So funktioniert es..
15
uint8_t b[10][10];
16
void varinFunc()
17
{  
18
  bearbeite(&b[0][0]);
19
}

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bei jedem Funktiosnaufruf von varinFunc() steht im Array "b" nur 
Zufallswerte drin, weil "b" bei jedem Aufruf neu angelegt wird.

Wenn du "b" ausserhalb von varinFunc anlegst, ist dies eine globale 
Variable und behält seine Gültigkeit dauerhaft.

Wenn "b" innerhalb von varinFunc seine Werte behalten soll, nachdem die 
Funktion zu Ende ist, muss "b" mit "static" versehen werden.

von Elisa W. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Okay. Danke für die ausführliche Antwort!

von Elisa W. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Elisa W. schrieb:
> // So funktioniert das nicht..
> void varinFunc()
> {
>   uint8_t b[10][10];
>
>   bearbeite(&b[0][0]);
> }
Wenn Ich jetzt in der Funktion das Array initalisiere und damit 
definierte Werte an den Positionen schreibe, ist es nach wie vor noch so 
das die Übergabe nicht korrekt funktioniert.

von Walter S. (avatar)


Bewertung
0 lesenswert
nicht lesenswert
Elisa W. schrieb:
spezifiziere:
> das die Übergabe nicht korrekt funktioniert.

ich vermute dass du das Array in der übergeordneten Funktion brauchst?

von Elisa W. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Walter S. schrieb:
> Elisa W. schrieb:
> spezifiziere:
>> das die Übergabe nicht korrekt funktioniert.
>
> ich vermute dass du das Array in der übergeordneten Funktion brauchst?
Genau

von Christian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und damit ist das array nur in der Funktion varinFunc() und bearbeite() 
vorhanden.
Beim Verlassen von varinFunc() wird das Array freigegeben.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit static bleibt dein Array für immer und ewig erhalten (theoretisch).
1
void varinFunc()
2
{
3
  static uint8_t b[10][10]; 
4
  
5
  bearbeite(&b[0][0]);
6
}

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Nils N. schrieb:
> Mit static bleibt dein Array für immer und ewig erhalten (theoretisch).

Soo würde ich das jetzt nicht sagen. Hier ist eine bessere Erklärung 
dazu: https://de.wikibooks.org/wiki/C-Programmierung:_static_%26_Co.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Doch, sofern er es nicht durch fehlerhaften Code zerstört, wird das 
Array nur in der Funktion auf einer festen Speicheradresse genutzt, also 
nach Ablauf der Funktion nicht wieder zum Fraß vorgeworfen und bleibt 
bestehen.

Er kann die Speicheradresse natürlich nach aussen weitergeben. Dann 
liegt es aber an ihm, wenn Murks reingeschrieben wird.

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Nils N. schrieb:
> Doch, sofern er es nicht durch fehlerhaften Code zerstört, wird das
> Array nur in der Funktion auf einer festen Speicheradresse genutzt

Dagegen sage ich ja nichts aber ich könnte extern z.B. einen Zeiger 
haben, der auf den Speicherbereich des Arrays zeigt, und damit alle 
Werte dort ändern/löschen. Das muss kein fehlerhafter Code sein.
Zudem hat das Wörtchen static auch noch eine andere Bedeutung wie man im 
Link nachlesen kann ;)

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Dagegen sage ich ja nichts aber ich könnte extern z.B. einen Zeiger
> haben, der auf den Speicherbereich des Arrays zeigt, und damit alle
> Werte dort ändern/löschen. Das muss kein fehlerhafter Code sein.

Das sind zwei Paar Schuhe, ihr redet aneinander vorbei!

von Code Mitleser (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Elisa W. schrieb:
> void varinFunc()
> {
>   uint8_t b[10][10];
>
>   bearbeite(&b[0][0]);
> }

Bei einem "kleinem" Controller (mit ebensolchen Stack-Design)
könnte es schon mal vorkommen dass bei einem funktions-
lokalem Array dieser Grösse der Stack überläuft.

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Code Mitleser schrieb:
> ei einem "kleinem" Controller (mit ebensolchen Stack-Design)
> könnte es schon mal vorkommen dass bei einem funktions-
> lokalem Array dieser Grösse der Stack überläuft.

Das muss aber ein wirklich kleiner Controller sein, wie man ihn 
heutzutage nicht mal mehr für eine Ampelsteuerung einsetzt.

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]
  • [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.