mikrocontroller.net

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


Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Nils S. (tcatm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das keyword "extern" das, was du suchst? Beispiel: extern int konto;

Autor: Klaus Wachtler (mfgkw)
Datum:

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

-> C-Grundlagen!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hast du so etwas vor:
// hauptprogramm.c
#include "konto.h"

main()
{
  loesche_konto();
  // ...
}

// konto.h
extern int konto; // Deklaration

void erhoehe_Konto( int differenz );
int kontostand();
void loesche_konto();

// konto.c

#include "konto.h"

int konto = 0; // Definition

void erhoehe_Konto( int differenz )
{
  konto += differenz;
}

int kontostand()
{
  return konto;
}

void loesche_konto()
{
  konto = 0;
}

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.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär es denn mal mit OOP anzufangen?

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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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:
int fkt( int i );   // Deklaration, kann beliebig oft auftauchen
                    // geeignet für Headerdateien

int fkt( int i )    // Definition, darf nur einmal vorkommen
{                   // also in genau einer *.c einmal
  // ...
}

>
> "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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  :-))))

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.