Forum: Mikrocontroller und Digitale Elektronik Zeiger statt glob. variable


von Querdenker (Gast)


Lesenswert?

Moin,
wie kann man globale Variablen durch Zeiger ersetzen?
Ich arbeite seit einiger Zeit mit Pointern, Call by reference ist mir 
auch ein Begriff, zugriff auf Arrayelemente auch via pointer, etc.
Doch habe ich nun ein Programm geschrieben, in dem ziemlich viele 
globale Variable vorkommen.
Ich möchte meinen Stack einfach nicht so zuknallen.
Könnte mir jemand einen Tip geben, wie man am besten an das ersetzten 
ran geht?
Die globalen Variablen können von einigen Methoden verändert werden und 
da geht das kreuz & qer!

Tankeschön!

von Karl H. (kbuchegg)


Lesenswert?

Ich denke du verwechselst da etwas.
Warum sollte man globale Variablen durch Pointer ersetzen wollen?
Das eine hat mit dem anderen nichts zu tun.

von Peter II (Gast)


Lesenswert?

auserdem sind es gerade die globalen Variabeln die Stack sparen.

von Querdenker (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das eine hat mit dem anderen nichts zu tun.

Also z.B:
1
void foo1(void);
2
void foo2(short x);
3
//Globvar
4
short a=0,b=1,c=2;
5
6
7
void foo1(void)
8
{
9
short z=0;
10
.do sth...
11
a=b*b;
12
z=b*c;
13
foo2(z);
14
b=b*4;
15
.do sth...
16
}
17
18
void foo2(short x)
19
{
20
.do sth...
21
c=2*x;
22
.do sth...
23
}

Also wäre es jetzt sinnlos bei dieser Konstellation pointer einzusetzen?

von Peter II (Gast)


Lesenswert?

Querdenker schrieb:
> Also wäre es jetzt sinnlos bei dieser Konstellation pointer einzusetzen?

irgenwie versteht ich was du uns bei dem Beispiel sagen willst.

Sinnvoll könnte z.b. sein das foo2 c nicht direkt ändert sonder es es 
return zurückliefert.

von Karl H. (kbuchegg)


Lesenswert?

Querdenker schrieb:

> Also wäre es jetzt sinnlos bei dieser Konstellation pointer einzusetzen?


Wie genau willst du da jetzt Pointer einsetzen?
Und vor allen Dingen: Warum?
Was erhoffst du dir davon?

von Querdenker (Gast)


Lesenswert?

Aaaaaalso...
In den "normalen" C Büchern die ich gelesen habe steht, dass man nur 
soviel globale Variablen benutzen sollte, wie nötig. Also quasi sparsam 
mit ihnen umgehen.
Nun habe ich ein Buch für die hardwarenahe Programmierung gelesen und 
komischerweise stand da davon nichts mehr und dann bin ich davon 
ausgegangen, das es wie bei der normalen C-Programmierung ist.

Peter II schrieb:
> Sinnvoll könnte z.b. sein das foo2 c nicht direkt ändert sonder es es
> return zurückliefert.


Und was wäre der Vorteil? grübel

von Peter II (Gast)


Lesenswert?

Querdenker schrieb:
> Und was wäre der Vorteil? grübel

das foo2 ein wenig universellen ist und nichts von globalen variabeln 
wissen muss. Was ist wenn mal nicht c sonder d geändert werden soll?

> In den "normalen" C Büchern die ich gelesen habe steht, dass man nur
> soviel globale Variablen benutzen sollte, wie nötig. Also quasi sparsam
> mit ihnen umgehen.
ja weil man oft nicht mehr weiss wer wo auf die variabeln zugreift. Bei 
einem µC geht es aber um begrenzte resourcen, aus dem grund ist es hier 
sinnvoller weil es insgesammt weniger speicher braucht.

von Karl H. (kbuchegg)


Lesenswert?

Querdenker schrieb:
> Aaaaaalso...
> In den "normalen" C Büchern die ich gelesen habe steht, dass man nur
> soviel globale Variablen benutzen sollte, wie nötig. Also quasi sparsam
> mit ihnen umgehen.

Das ist auch richtig.
Allerdings gelten auf einem µC durch die knappen Resourcen eigene 
Regeln.
EIgentlich möchte man keine globalen Variablen, auf der anderen Seite 
hat man das Problem dass insbesondere globale Variablen es einem 
erlauben die zur Laufzeit notwendigen Resourcen besser einzuschätzen.

> Und was wäre der Vorteil? *grübel*

Du willst nach Möglichkeit globale Variablen vermeiden, weil dann 
Funktionen universeller benutzbar werden. Wenn es nur darum geht, eine 
Variable neu zu beschreiben, dann ist

  void foo()
  {
    c = ... irgendwas;
  }

schlechter als


  int foo()
  {
    return ... irgendwas;
  }

  int main()
  {
   ....


   c = foo();
  }


weil ich dann dieselbe Funktion foo auch mit

  e = foo();
  f = foo();

benutzen kann (wenn die Funktion etwas allgemein Sinnvolles macht, was 
man auch woanders brauchen kann).

Genausogut kann ich auch in die Funktion hinein Werte übergeben wenn ich 
das will und wenn ich das Gefühl habe, dass es sich hier um eine 
Funktion handelt, die sinnvoll wiederverwendet werden kann.

Funktionen die sich an globalen Variablen vergreifen sind immer an diese 
Variablen gebunden und nicht leicht auf andere Situationen anpassbar. In 
der normalen Programmierung ist das wesentlich häufiger der Fall als in 
der µC-Programmierung, sodass man hier schon auch mal zu globalen 
Variablen greift, wenn man das in der Desktop Programmierung nicht tun 
würde.

Aber: Wie kommen da jetzt Pointer ins Spiel?

von Querdenker (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Allerdings gelten auf einem µC durch die knappen Resourcen eigene
> Regeln.

Das wird mir gerade auch immer klarer.
Ich weis momentan auch nicht so wirklich wo das Problem liegt.

Karl Heinz Buchegger schrieb:
> Aber: Wie kommen da jetzt Pointer ins Spiel?

Ich muss das mal noch die Nacht über wirken lassen um die Frage zu 
konkretisieren.
Weis auch gerade nicht mehr warum ich die ersetzten wollte.
Bin nun seit 16 Stunden am Programmieren. :)
Besten Dank!

von Loonix (Gast)


Lesenswert?

Querdenker schrieb:
> Ich weis momentan auch nicht so wirklich wo das Problem liegt.

Querdenker schrieb:
> Bin nun seit 16 Stunden am Programmieren. :)

Hehe! Geh ins Bett! ;)

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.