Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

11

18.08.2010, 21:38

Zitat

Ist das denn so jetzt richtig:

Eine Variable, die in einer Funktion geschrieben wurde wurde in der Funktion InitialisiereTestVariable, in der die Variable "Test" geschrieben wurde, ein Wert zugewiesen. Dieser Wert ist privat deklariert und mit Rückgabewert kann ich die Variable für andere Funktionen zugänglich machen. Stimmt so oder???

Nein.
Wenn du eine Variable innerhalb des Gültigkeitsbereiches einer Funktion (also zwischen den geschweiften Klammern { } ) und ohne "static" definierst, dann wird diese Variable wieder gelöscht, sobald der Gültigkeitsbereich der Funktion verlassen wurde (also nach dem return). Wenn du sowas wie "return eine_variable;" schreibst, dann wird der Wert dieser Variable kopiert. Bei jedem erneuten Aufruf dieser Funktion wird die Variable neu erstellt und initialisiert.

Also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int EineFunktion()
{
    int a; // a wird deklariert und definiert (der Wert ist undefiniert)

    a = 5; // jetzt ist a 5

    return a; // der Wert von a wird für den Aufrufer kopiert
}

int main()
{
    /* Die Funktion wird aufgerufen, der Rückgabewert wird nicht gespeichert, geht also nach dem Funktionsaufruf verloren. (genauer: er wird in einer temporären Variable gespeichert, so kann man Rückgabewerte 
    von Funktionen direkt einer anderen Funktion als Parameter übergeben.*/
    EineFunktion();

    // v ist danach 5 (weil "EineFunktion" 5 (den Wert von a) zurückliefert)
    int v = EineFunktion();

    // verändert den Wert von v, dies beeinflusst natürlich NICHT den Wert vom a in der Funktion "EineFunktion" da v nur eine Kopie davon ist
    v = 20;
}

Bei diesem Code wird a 2 mal erstellt (bei jedem Funktionsaufruf), ebenso wird a 2 mal der Wert 5 zugewiesen. a wird auch 2 mal, nämlich bei jedem return, kopiert (einmal in eine temporäre Variable und einmal in die Variable v)
Anders sieht es aus, wenn du vor das "int a;" ein "static" schreibst, dann wird a nämlich nur einmal (beim ersten Funktionsaufruf) erstellt, aber trotzdem wird 2 mal der Wert 5 zugewiesen und 2 mal a kopiert.

Du hast scheinbar ein paar Probleme mit Begriffen wie deklarieren, definieren und initialisieren, deshalb hier eine kurze Zusammenfassung dazu:

C-/C++-Quelltext

1
2
3
4
int a = 5; // a wird deklariert (mittgeteilt das es a gibt), definiert (mit zugehörigem Speicherbereich "verknüpft") und mit dem Wert 5 initialisiert
int b; // b wird deklariert und definiert (und mit einem undefinierten, compilerabhängigen Wert initialisiert)
extern int c; // c wird nur deklariert und muss (durch "int c;") definiert werden, um verwendet werden zu können
int d = a; // d wird deklariert, definiert und mit dem Wert von a (hier: 5) initialisiert. Änderungen an d beeinflussen natürlich NICHT a und umgekehrt


Und statt "privat" hast du wohl eher lokal gemeint... (als Gegenteil von global)

Hab versucht das so vereinfacht wie möglich zu erklären :)
Ich hoffe ich hab dich nicht allzusehr verwirrt und konnte dir wenigstens ein bischen helfen ;)

Mit ein wenig Zeit, viel Erfahrung und den richtigen Büchern wirst du das schon noch irgendwann vollständig verstehen. Lass dich dadurch nicht zu sehr verwirren, finde dich lieber mit Halbwissen ab und baue das dann später aus. (aber vergiss nicht das "später ausbauen" ;) )
Signaturen werden überbewertet

12

19.08.2010, 08:07

Da habe ich auch gleich mal ein Frage.
Wozu wird das "extern int c;" verwendet?
Also wozu braucht man das?

Gruß DerJogge

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

13

19.08.2010, 10:25

Nehmen wir an, du hast viele Units in deinem Projekt. Jetzt benötigst du eine globale Variable, die du aber in der .cpp-Datei einer Unit definierst. Die anderen Units können logischerweise nicht auf diese globale Variable zugreifen. Wenn du ihnen den Zugriff gewähren willst, so dass die Variable auch in den anderen Units sichtbar sind, müsstest du die Variable entweder in der Headerdatei definieren, oder du schreibst extern Typ Variable; in die Headerdatei und deklarierst die Variable hier. Definiert wird sie dann ganz normal in der .cpp-Datei der entsprechenden Unit.

LuGo

Frischling

  • »LuGo« ist der Autor dieses Themas

Beiträge: 54

Wohnort: Attendorn im schönen Sauerland

Beruf: Schüler

  • Private Nachricht senden

14

19.08.2010, 11:29

Nur noch mal zum verständnis:

die variable a wird in der funktion "einefunktion" definiert mit dem wert 5, jetzt kann dieser wert kopiert und z.b. in der main-funktion als variable b eingefügt werden, das mit der zuweisung b = einefunktion geschieht oder.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

15

19.08.2010, 11:31

Genau ;)

im Prinzip wird der Ausdruck EineFunktion() einfach durch den return-Wert ersetzt.
Was du dann damit machst, ist egal ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

16

19.08.2010, 17:13

Da habe ich auch gleich mal ein Frage.
Wozu wird das "extern int c;" verwendet?
Also wozu braucht man das?
Als moderner C++-Programmierer sollte man extern eigentlich nicht mehr benötigen.
Extern erlaubt den Zugriff und die Benutzung einer globalen Variable, die in einer anderen Compile-Unit deklariert/definiert wurde.

Es ist Aufgabe des Linkers die extern-Variablen richtig zu verknüpfen.

Werbeanzeige