Forum: Mikrocontroller und Digitale Elektronik Variablenverbreitung im Projekt


von perterog (Gast)


Lesenswert?

Hallo zusammen.
Ich habe in einer include datei eine funktion geschrieben. Diese 
arbeitet mit einer variable. (key)
1
void sensekey(void){
2
  if ( (get_key_press(1<<S1)) ) {
3
    key = key+1;
4
    if (key>9){
5
      key = 1;
6
    }
7
  }
8
  if ( (get_key_press(1<<S2)) ) {
9
    key = key-1;
10
    if (key == 0){
11
      key = 9;
12
    }
13
  }
14
}
in meiner main will ich die variable aber auch aufrufen.
1
while(1){      
2
  sensekey();  
3
  char puffer[16];
4
  itoa(key,puffer,10);
5
  lcd_set_cursor(0,LINE0);
6
  lcd_puts(small_font,puffer);    
7
}
welche art von variable muss ich nehmen und wo kommt diese zuweisung 
genau hin.?

vielen dank schon mal.

von Karl H. (kbuchegg)


Lesenswert?

Da gibt es mehrere Möglichkeiten.

Die erste Frage lautet:
Warum ist der Code überhaupt in einem Header Include File? Eigentlich 
gehört er da gar nicht hin.

Die zweite Frage lautet:
Was macht denn eigentlich ein #include?
Er ersetzt die Zeile mit dem #include durch den Inhalt der Datei.
Wenn du also keinen include hättest und du Variablen quer über mehrere 
Funtkionen benutzen willst, wie sieht das dann aus. Angenommen du 
hättest
1
void foo()
2
{
3
  key = 5;
4
}
5
6
int main()
7
{
8
  key = 8;
9
  foo();
10
}
und in beiden Funktionen soll das immer die gleiche Variable 'key' sein. 
Wo muss die dann logischerweise stehen?
Mit dem Include machst du nichts anders, als Teile des Textes in eine 
andere Datei 'auszulagern'. Aber vor dem Compilieren werden diese 
Einzelteile wieder zum kompletten Programmtext zusamenngesetzt, ehe den 
dann der Compiler zu sehen kriegt.

Und die dritte Frage lautet: Warum eigentlich eine globale Variable?
Warum übergibt main nicht einfach den Wert einer ihm genehmen Variablen 
und kriegt den modifizierten Wert zurück? Genau zu diesem Zweck gibt es 
Funktionsargumente und Return-Werte.
1
uint8_t sensekey( uint8_t value ){
2
  if ( (get_key_press(1<<S1)) ) {
3
    value = value+1;
4
    if (value>9){
5
      value = 1;
6
    }
7
  }
8
  if ( (get_key_press(1<<S2)) ) {
9
    value = value-1;
10
    if (value == 0){
11
      value = 9;
12
    }
13
  }
14
15
  return value;
16
}

1
void lcd_puti( uint8_t value )
2
{
3
  char puffer[16];
4
5
  itoa( value, puffer, 10);
6
  lcd_set_cursor(0, LINE0);
7
  lcd_puts(small_font, puffer);
8
}
9
10
....
11
12
int main()
13
{
14
  uint8_t Auswahl = 1;
15
16
...
17
18
  while(1){      
19
    Auswahl = sensekey( Auswahl );  
20
21
    lcd_puti( Auswahl );
22
  }
23
}


Du veschenkst ja 80% deiner Möglichkeiten, wenn du deine 
Programmiersprache nicht zumindest in den Grundzügen und wesentlichen 
Möglichkeiten kennst.

von Hmm (Gast)


Lesenswert?

>Ich habe in einer include datei eine funktion geschrieben.

In eine include Datei gehört keine Funktion.
Verschiebe Sie in eine C-Datei.

>welche art von variable muss ich nehmen und wo kommt diese zuweisung
>genau hin.?

Nun, es gibt Programm-globale, modul-globale (static) und lokale 
Variablen. Welche Art könnte es denn sein?

Und was für eine Zuweisung meinst Du? Oder redest Du von der 
Deklaration?

Und was ist "meine main". "main" ist gewöhnlich der Name einer Funktion. 
Meinst Du "meine main-Funktion"?

Ich empfehle Dir die Lektüre eine C-Buches.

von perterog (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die erste Frage lautet:
> Warum ist der Code überhaupt in einem Header Include File? Eigentlich
> gehört er da gar nicht hin.

um platz zu sparen und alles ein wenig zu ordnen.

Karl Heinz Buchegger schrieb:
> Die zweite Frage lautet: Warum eigentlich eine globale Variable?
> Warum übergibt main nicht einfach den Wert einer ihm genehmen Variablen
> und kriegt den modifizierten Wert zurück? Genau zu diesem Zweck gibt es
> Funktionsargumente und Return-Werte.

das ist eigentlich schon die antwort auf meine frage. :) danke auch für 
die genannten beispiele

von Karl H. (kbuchegg)


Lesenswert?

perterog schrieb:
> Karl Heinz Buchegger schrieb:
>> Die erste Frage lautet:
>> Warum ist der Code überhaupt in einem Header Include File? Eigentlich
>> gehört er da gar nicht hin.
>
> um platz zu sparen und alles ein wenig zu ordnen.

Nochmal: Da gehört er nicht hin! (Es sei denn, es ist eine inline 
Funktion. Aber auch dann ist es besser, wenn man sie als solche 
kennzeichnet).

Code gehört in C-Files und wird als solcher getrennt compiliert. Ins 
Header File, welches includiert wird, kommt die 
Schnittstellenbeschreibung der Funktion.

> das ist eigentlich schon die antwort auf meine frage. :)
Die in jedem noch so grindigem C-Buch im 4-ten oder 5-ten Kapitel 
begonnen wird und dich danach nie mehr wieder loslässt. Es ist eine 
Basistechnik. Wie das kleine EinmalEins beim Rechnen.

von Hmm (Gast)


Lesenswert?

>um platz zu sparen und alles ein wenig zu ordnen.

Na gut. Warten wir auf die nächste Frage nach "duplicate definition". 
;-)

von Hmm (Gast)


Lesenswert?

So langsam wird mir MaWin sympathisch. Meine Güte.

von perterog (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Nochmal: Da gehört er nicht hin! (Es sei denn, es ist eine inline
> Funktion. Aber auch dann ist es besser, wenn man sie als solche
> kennzeichnet).

ich meinte ja eine c datei

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.