Forum: PC-Programmierung Wie bekomme ich die globale Variable weg ( Beispiel)


von Sam (Gast)


Lesenswert?

Hi,

eine Frage:


Beispiel:



int konto;
main{
     konto+1;
     konto+1;
    }


wie geht das jetzt wenn ich die Funktion in einem anderen Sourcefile 
habe - wie kann ich erreichen, dass auch das die Variable Konto 
"überlebt".

also so von der Idee:

#include konto.h

main{
     konto();
     konto();
    }


die Funktion ist in konto.h deklariert  - aber wie erreiche ich, dass da 
die Variable auch quasi  "global" liegt ?

Gruß

Sam

: Verschoben durch Admin
von Nils S. (tcatm)


Lesenswert?

Ist das keyword "extern" das, was du suchst? Beispiel: extern int konto;

von Klaus W. (mfgkw)


Lesenswert?

Jedenfalls kann man nicht eine globale Variable konto und eine Funktion 
gleichen Namens nutzen.

-> C-Grundlagen!

von Klaus W. (mfgkw)


Lesenswert?

Vielleicht hast du so etwas vor:
1
// hauptprogramm.c
2
#include "konto.h"
3
4
main()
5
{
6
  loesche_konto();
7
  // ...
8
}

1
// konto.h
2
extern int konto; // Deklaration
3
4
void erhoehe_Konto( int differenz );
5
int kontostand();
6
void loesche_konto();

1
// konto.c
2
3
#include "konto.h"
4
5
int konto = 0; // Definition
6
7
void erhoehe_Konto( int differenz )
8
{
9
  konto += differenz;
10
}
11
12
int kontostand()
13
{
14
  return konto;
15
}
16
17
void loesche_konto()
18
{
19
  konto = 0;
20
}

Damit könnte man in hauptprogramm.c auch direkt auf die Variable 
zugreifen.

Das ist aber i.d.R. gar nicht sinnvoll.
Besser wäre es meistens, das extern int konto aus konto.h zu entfernen
und nur über die Funktionen indirekt auf den Wert zuzugreifen.
Das erspart in größeren Programmen viel Ärger.

von Sam .. (sam1994)


Lesenswert?

Wie wär es denn mal mit OOP anzufangen?

class konto
{
    int konto;
    public:
    void erhoehen(int add);
    ...
};

von Sam (Gast)


Lesenswert?

Hey,

danke für die Antworten:

@Klaus,
ok nur damit sicher bin das ich das richtig verstanden habe:

--> ohne "extern" wird die lokale Variable konto beim Aufruf einer 
Funktion in konto.c angelegt und am Ende wieder freigegeben; wie geht 
das konkret jetzt beim linken mit "extern", wird die gleiche Funktion 
aufgerufen oder wird die auch in anderem Prozesskontext aufgerufen und 
die Variable als "global" deklariert ?

"Das erspart in größeren Programmen viel Ärger"  warum ?  Ich mag die 
globalen Variablen bei main halt einfach  nicht  -  daher habe ich 
gedacht, dass ich dadurch Übersichtlichkeit gewinne...


@Samuel,
 ja daher komme ich ja  - will meine AVR - Programme übersichtlicher 
machen ;)

Gruß

Sam

von Grrrr (Gast)


Lesenswert?

Das sind nun wirklich etwas komplexere Fragen über die man sich erstmal 
bei einem guten Glas Wasser und einem mindestens ebenso guten C-Buch 
Klarheit verschaffen sollte.

Du bringst da einiges durcheinander: Was sind Deklarationen und 
Definition und wie unterscheiden sie sich? Was bewirkt im Detail das 
Schlüsselwort "extern" (was "static")? Was ist Scope (Sichtbarkarkeit) 
und wie wird das durch Deklaration resp. Definition beeinflusst? Was 
macht der Linker?

Deine Frage und deren Formulierung vermittelt mir den Eindruck das Du 
wirklich nur eine sehr oberflächliche Idee von diesen Dingen hast, so 
das nicht einfach nur eine Unklarheit zu beseitigen ist, sondern eine 
komplette Einführung in das Thema nötig ist. Das aber solltest Du bitte 
selbst leisten.

von Klaus W. (mfgkw)


Lesenswert?

Sam schrieb:
> Hey,
>
> danke für die Antworten:
>
> @Klaus,
> ok nur damit sicher bin das ich das richtig verstanden habe:
>
> --> ohne "extern" wird die lokale Variable konto beim Aufruf einer
> Funktion in konto.c angelegt und am Ende wieder freigegeben; wie geht
> das konkret jetzt beim linken mit "extern", wird die gleiche Funktion
> aufgerufen oder wird die auch in anderem Prozesskontext aufgerufen und
> die Variable als "global" deklariert ?

Ohne extern, also mit einem "int konto;" außerhalb aller Funktionen
wird eine globale Variable angelegt (das ist die Definition einer
Variablen).
Mit extern dagegen wird nur gesagt, daß sie in irgendeiner
Übersetzungseinheit (also in irgendeinem der kompilierten
C-Quelltexte) zu finden, aber nicht unbedingt in diesem.
Das ist also die Deklaration einer Variablen.

Stünde in der Headerdatei die Definition ohne extern, dann würde
in jeder Übersetzungseinheit eine globale Variable angelegt werden
(vom Compiler) und der Linker müsste sich dann aufregen, weil
es mehrere globale Objekte mit demselben Namen gibt.

Deshalb steht es mit extern in der .h und ohne in einer .c.

Ähnlich ist es mit Funktionen:
1
int fkt( int i );   // Deklaration, kann beliebig oft auftauchen
2
                    // geeignet für Headerdateien
3
4
int fkt( int i )    // Definition, darf nur einmal vorkommen
5
{                   // also in genau einer *.c einmal
6
  // ...
7
}

>
> "Das erspart in größeren Programmen viel Ärger"  warum ?  Ich mag die
> globalen Variablen bei main halt einfach  nicht  -  daher habe ich
> gedacht, dass ich dadurch Übersichtlichkeit gewinne...
>
> ...

Ist ja auch richtig; dann brauchst du aber eben kein extern.

Mach einfach alle Zugriffe über Funktionen in deiner konto.c
(dort die Definitionen aller nötigen Funktionen und die Definition
einer globalen Variablen).
Die Deklarationen der Funktionen und ggf. der extern-Variablen
kommen in die konto.h.
Wenn du die globale Variable nicht brauchst (was ich empfehle),
dann lass in der konto.h die Deklaration der Variablen weg.
Zudem empfiehlt es sich dann, vor die Definition noch ein
static zu schreiben, dann kann auch niemand mehr von einem anderen
Quelltext aus darauf direkt zugreifen (ohne die Funktionen),
weil die Variable dann nur noch in konto.c sichtbar ist.

-> C-Grundlagen

von Sam (Gast)


Lesenswert?

.. mit C-Buch habt ihr ja alle Recht  - aber bei mir ist eben die uC 
programmierung ein kleines Hobby, bei dem ich kleine Graben buddle ;-)
Ich lesen 50% und rede die anderen 50% meiner Arbeitszeit in der Woche 
Zeug, dass ich in der Freizeit einfach mal was "machen" will  :-))))

von Klaus W. (mfgkw)


Lesenswert?

Wenn man sich nicht damit beschäftigen will, ist C die falsche
Wahl.
Wir haben auch noch etwas besseres zu tun, als jedem wieder
neu die Grundlagen vorzukauen, nur damit keiner die Bücher
lesen muss - die mal geschrieben wurden, um nicht jedem einzeln
alles vorkauen zu müssen.

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.