Forum: Compiler & IDEs Variablen für Hauptprogramm und Funktionen


von Balou B. (baloubaer)


Lesenswert?

Hallo alle zusammen,

ich habe wahrscheinlich wieder eine einfahce Frage.

Wenn ich eine z.B. eine uint8_t variable vor meinem Hauptprogramm ( void 
main (void)) deklariere, ist diese doch Global in meinem Programm 
verfügbar, oder?

Also ich habe Variable x als uint8_t und möchte diese Variable sowohl im 
Hauptprogramm wie auchin meinen Funktionen benutzen. Soll heißen ich 
möchte sie nicht separat übergeben sonder direkt auslesen und schreiben 
in den Funktionen.
1
....
2
void dumm(void);
3
....
4
uint8_t x=0;
5
....
6
void main (void)
7
{....
8
x=5;
9
....
10
dumm();
11
....
12
x=??????????? //x=2 oder X=5??????
13
}
14
15
void dumm (void)
16
{
17
.....
18
x=2;
19
.....
20
return (void)
21
}

Funktioniert das so, oder habe ich da zu einfach gedacht?

Ich bedanke mich für eure Hilfe und verbleibe

Mit freundlichen Grüßen
Balou Baer

von Falk B. (falk)


Lesenswert?

@ Balou Baer (baloubaer)

>Wenn ich eine z.B. eine uint8_t variable vor meinem Hauptprogramm ( void
>main (void)) deklariere, ist diese doch Global in meinem Programm
>verfügbar, oder?

Ja.

>Also ich habe Variable x als uint8_t und möchte diese Variable sowohl im
>Hauptprogramm wie auchin meinen Funktionen benutzen. Soll heißen ich
>möchte sie nicht separat übergeben sonder direkt auslesen und schreiben
>in den Funktionen.

Dann tu das.

>Funktioniert das so,

Ja.

von Tom (Gast)


Lesenswert?

Balou Baer schrieb:
> Funktioniert das so,

Theoretisch ja, in der Praxis ist das der sicherste Weg zu verbuggten 
und unlesbaren Programmen. Gar nicht erst damit anfangen. Wenn das 
Gefummel in globalen Variablen sinnvoll scheint, ist die Struktur des 
Programms sehr wahrscheinlich verbesserungswürdig.

Wenn dumm den Wert von x wissen muss, bekommt es x als Parameter 
übergeben¹, wenn dumm einen Wert liefert, tut es das als return-Wert² 
(oder bekommt einen Zeiger auf x als Parameter³, den es lesen und ändern 
kann).
1
¹ void set7SegDisplay(uint8_t x);
2
² uint8_t readTemperature(void);
3
¹+² uint8_t readADC(uint8_t adc_channel);
4
³ void halbiere(uint8_t* x);
Alles andere sollte man nur aus sehr guten Gründen tun, eingebildeter 
Speichermangel und unnötige Optimierungen an falscher Stelle gehören 
nicht zu diesen.

von Sven B. (scummos)


Lesenswert?

Jup, globale Variablen sind nur ganz selten der richtige Weg ein Problem 
zu lösen. I.d.R. sollten Parameter und Rückgabewerte verwendet werden. 
Ich persönlich mag auch diesen "output parameter"-Pattern nicht, da 
mache ich mir lieber eine struct als Rückgabewert.

von Balou B. (baloubaer)


Lesenswert?

Hallo,

danke euch für euere Antworten.

Das es gefährlich ist globale Variablen zu nutzen ist mir klar, jedoch 
die Variablen die ich nutze sind einmalig und werden nur einmal nach 
Spannungsanlegung zur einmessung benötigt. Verbessungsvorschläge sind 
aber gern genommen.

uint8_t vorher_endschalter_links_x-achse = 0, 
vorher_endschalter_rechts_x-achse = 0 ;
  uint8_t vorher_endschalter_oben_y-achse = 0, 
vorher_endschalter_unten_y-achse = 0;
uint8_t endschalter_links_x-achse = 0, endschalter_rechts_x-achse = 0, 
endschalter_oben_y-achse = 0;
  uint8_t  endschalter_unten_y-achse = 0;

1
int main (void)
2
{
3
//  DDRA = ;
4
  
5
//  DDRB = ;
6
  
7
//  DDRC = ;
8
  
9
  DDRD = _BV ( PD4 ) | _BV ( PD5 ) | _BV ( PD6 ) | _BV ( PD7 ); 
10
  //PD4 links X-Achse; PD5 rechts X-Achse; PD6 oben Y-Achse; PD7 unten Y-ACHSE
11
12
13
//Interrupts einstellen
14
/*
15
  //Timer:
16
17
    TCCR1B = _BV ( WGM12 ) | _BV ( CS12 ) | _BV ( CS10 ); //Timer1 konfiguriert
18
    OCR1A = 15624 //Vergleichsregister setzen, bei Prescaler 1024 und 16 MHz steht die 15624 für eine Sekunde
19
    TIMSK = _BV ( OCIE1A ) //Timer 1 Interrupt aktiviert
20
*/
21
22
  //Externe Interrupts
23
24
    MCUCR |= _BV ( ISC11 ) | _BV ( ISC00 );  
25
    /*INT1 reagiert auf fallende Flanke
26
      INT0 reagiert bei jeder änderung
27
    */
28
//    MCUCSR |= _BV ( ISC2 );
29
    /* ISC2 = 0 im MCUCSR Register, reagiert INT2 auf fallende Flanke.
30
       ISC2 = 1 im MCUCSR Register, reagiert INT2 auf steigende Flanke */
31
    GICR |= _BV ( INT1 ) | _BV ( INT0 ) | _BV ( INT2);  //INT0, INT1 und INT2 aktiviert
32
    
33
34
  //POWER Managment:
35
36
    MCUCR |= _BV ( SE ) | _BV ( SM2 ) | _BV ( SM1 ) | _BV ( SM0 );  
37
    /* SE = 1 Sleep Aktiviert, 
38
       SM0, SM1 und SM2 = 1   Extended Standby 
39
    */
40
41
    sei();
42
43
  
44
  //ADC Initialisieren
45
    
46
    ADC_Init ();
47
48
  //Definition der ersten Zustände für Flankenerkennung (positive Flanke)
49
  
50
    vorher_entschalter_links_x-achse = ( PINX & _BV ( PXX ) );
51
    vorher_entschalter_rechts_x-achse = ( PINX & _BV ( PXX ) );
52
    vorher_entschalter_oben_y-achse = (PINX & _BV ( PXX ) );
53
    vorher_entschalter_unten_y-achse = ( PINX & _BV ( PXX ) );
54
    vorher_zaehltaster_x-achse = ( PINX & _BV ( PXX ) );
55
    vorher_zaehltaster_y-achse = ( PINX & _BV ( PXX ) );
56
      
57
  //Einmessen der X-Achse:
58
59
    einmessen_x-achse();
60
    einmessen_y-achse();
61
......
62
while (1)
63
{
64
......
65
}
66
}
67
68
uint8_t einmessen_x-achse (void)
69
  {
70
    PORTD |= _BV ( PD4 );  //Motor X-Achse links fahren bis Sicherheitsendabschaltung
71
72
    endschalter_links_x-achse = ( PINX & _BV ( PXX ) );  //Abfrage ob Endschalter betätigt wurde
73
74
    if (endschalter_links_x-achse != vorher_endschalter_links_x-achse )
75
    {
76
      vorher_endschalter_links_x-achse = entschalter_links_x-achse;
77
78
      PORTD &= ~_BV ( PD4 );  //Ausgang PD4 abschalten
79
      
80
      zaehler_x-achse = 0;
81
    }
82
    return;
83
  }

von Sven B. (scummos)


Lesenswert?

Ich schätze mal für so einen Zweck ist das tragbar.
(Funktionsnamen dürfen übrigens keine "-"-Zeichen enthalten)

von Balou B. (baloubaer)


Lesenswert?

UPS.... Danke!!!!

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.