Forum: Mikrocontroller und Digitale Elektronik Array übergabe an Funktion


von Elisa W. (Gast)


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)


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)


Lesenswert?

Okay. Danke für die ausführliche Antwort!

von Elisa W. (Gast)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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.

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.