Ich hatte vor ein paar Tagen schon einmal eine ähnliche Frage gestellt.
Für mich als C++ Anfänger nicht so leicht zu bewerkstelligen.
Szenario:
Ich verarbeite in einer Funktion1 eine bestimmte Variable und weise ihr
einen Wert zu. Genau diese Variabe möchte ich mit dem in Funktion1 zu
gewiesenen Wert in einer Funktion2 wieder nutzen. Ich habe jetzt einiges
bzgl. globaler Variablen und call by Reference durchgelesen un einiges
ausprobiert. Es hat jedoch nie richtig kompiliert. Vermutlich weil ich
mit der richtigen Syntax nicht vertraut bin. Über ein richtiges Beispiel
wäre ich dankbar.
Minimalbeispiel_
1
voidfunktion1()
2
{
3
intx;
4
x=21;
5
}
6
7
voidfunktion2()
8
{
9
inty;
10
y=2*x;// <- hier soll x automatisch gleich 21 sein,
11
// d.h.funktion1()muss natürlich vor funktion2() aufgerufen werden
Anfänger C++ schrieb:> Minimalbeispiel_> void funktion1()> {> int x;> x = 21;> }>> void funktion2()> {> int y;> y = 2*x; // <- hier soll x automatisch gleich 21 sein,> // d.h.funktion1()muss natürlich vor funktion2() aufgerufen werden> }
Nicht VOR sondern VON.
Ich würde gerne mehrere Variablen in Funktion1() nutzen. DIe Möglichkeit
mit die Variable als Rückgabewert wiederzuverwenden liegt also auf Hand,
fällt bei mir jedoch aus.
Wie genau funktioniert dies mit en globalen Variablen?
In etwa so?
C++ und globale Variablen machen keinen Sinn. Ein wichtiger Bestandteil
von OOP ist die Datenkapselung. Man sollte daher nicht von Variablen
sprechen, sondern von Objekten und Eigenschaften. Eigneschaften erreicht
man nicht direkt.
Man muss hier die Kirche im Dorf lassen. Auch bei objektorientierter
Programmierung wird man um globale Variablen nicht immer herumkommen. Da
heißen sie dann "ganz wichtigtuerisch" Singletons, sind aber im Prinzip
nichts anderes als stinknormale globale Variablen.
Je nach Anwendung also absolut vertretbar.
Cube_S schrieb:> lass das "extern" weg und packe das>> int x, y, z;>> in "unter.c"
Das habe ich so versucht. Leider haben die Variablen in Funktion2 nicht
den Wert, den ich Ihnen in Funktion1() zugewiesen habe.
Hab es debuggt.
Alternativen?
Deine C (und nicht C++) Frage wurde bereits beantwortet.
Entweder nimmst du die schlechte Lösung mit globalen Variablen oder
nutzt Parameter und Rückgabe werte von Funktionen.
> Ich verarbeite in einer Funktion1 eine bestimmte Variable und weise ihr> einen Wert zu. Genau diese Variabe möchte ich mit dem in Funktion1 zu> gewiesenen Wert in einer Funktion2 wieder nutzen.
Entscheide dich erstmal, ob du C oder C++ programmieren möchtest !
Lösung in C:
f1() erzeugt ein Datum, gibt Datum via return zurück
f2() nimmt Datum von f1() als Parameter auf, führt Berechnung aus und
gibt seinerseits Datum zur Ausgabe an ein printf zurück
Lösung in C++:
Baue dir eine Klasse K1, die ein Datum (eine private Membervariable) m1
und zwei öffentlichen Methoden f1(), f2() besitzt.
Instanziere ein Objekt dieser Klasse, dass nacheinander die Methoden
f1() und f2() aufruft
f1() wirkt auf m1 ein
f2() wirkt auf m1 ein
Dann baust du dir noch eine Methode zur Ausgabe(), die als drittes
aufgerufen wird.
Wenn es so nicht funktioniert, hat dein Compiler ein Problem. Das
"static" ist nicht zwingend, macht die Variablen aber für andere
c-Quelldateien beim linken "unsichtbar".
Für diejenigen, die es unbedingt "objektorientiert" sehen wollen:
1
classA
2
{
3
private:
4
intx,y,z;
5
6
public:
7
voidfunktion1();
8
voidfunktion2();
9
};
10
11
voidA::funktion1()
12
{
13
x=21;
14
y=13;
15
z=33;
16
}
17
18
voidA::funktion2()
19
{
20
inta,b,c;
21
a=2*x;
22
b=a+2*y;
23
c=z;
24
}
25
26
intmain()
27
{
28
Aa;
29
a.funktion1();
30
a.funktion2();
31
return0;
32
}
Wobei ich die Kapselung alleine noch nicht als Objektorientierung
bezeichnen würde. Dieser Begriff ist meiner Meinung nach erst dann
wirklich gerechtfertigt wenn die "späte Bindung" ins Spiel kommt. Also
mindestens zwei Klassen die von einander erben vorhanden sind und die
Basisklasse eine virtuelle Funktion hat, die in der abgeleiteten Klasse
überschrieben wird.
Anfänger C++ schrieb:> Cube_S schrieb:>> lass das "extern" weg und packe das>>>> int x, y, z;>>>> in "unter.c">> Das habe ich so versucht. Leider haben die Variablen in Funktion2 nicht> den Wert, den ich Ihnen in Funktion1() zugewiesen habe.>> Hab es debuggt.>> Alternativen?
Dir ist aber schon klar, daß Funktion1 erst mal gerufen werden muß,
damit sie irgend einen Einfluß auf x,y,z haben kann, oder?
Hi Leute, ich habe ne frage zu dem letzten Beispiel (call by reference).
Warum sollte man das so machen? Sehen und verändern können ja eh beide
Funktionen die variablen. Auch ohne call by reference... Macht man das
dann rein zu Übersichtzwecken?
Ich frage, weil ich ganz konkret vor einer Implementierung stehe, bei
der ein Modul (eine C datei) über ziemlich viele "lokale" (static)
variablen verfügt. Wäre schön ein ziemlicher Aufwand, die immer zu
übergeben. Dafür sieht man, was in welcher Funktion benötigt wird.
Oder ist es eh ratsam, ein neues typedef für das Modul zu machen, das
eine struct ist, die alle lokalen Variablen enthält und dann in "c++ in
c" Art, sprich manuelle Übergabe des "objektes" an die öffentlichen
Funktionen zu machen?
Danke und schöne Grüße,
Jan
Jan K. schrieb:> Sehen und verändern können ja eh beide> Funktionen die variablen. Auch ohne call by reference
Verändern kann in diesem Beispiel nur "funktion1". Ob man das so machen
sollte ist eine andere Frage. Sobald die Parameterlisten ausarten ist
schon zu überlegen ob diese Parameter von der Sache her nicht ein Objekt
darstellen und die von Dir vorgeschlagene Lösung mit dem "struct" oder
in C++ dann "class" nicht die bessere Variante ist.
Jan K. schrieb:> Hi Leute, ich habe ne frage zu dem letzten Beispiel (call by reference).> Warum sollte man das so machen?
Weil man im allgemeinen möglichstr wenig globale Variablen haben will.
Bei kleinen µC muss bzw. wird man da ein wenig Abstriche machen, weil es
da ein anderes Problem gibt. Auf den kleinen µC muss man den
Speicherverbrauch in Summe im Auge behalten und das geht mit globalen
Variablen am einfachsten.
Aber ansonsten will man zb für einfache und simple Standardaufgaben
keine globalen Variablen haben, weil das Buchführen welcher Wert jetzt
gerade in der globalen 'Interface' Variablen sitzt mühsam und
fehleranfällig ist.
> Funktionen die variablen. Auch ohne call by reference... Macht man das> dann rein zu Übersichtzwecken?
Du kriegst dann eine Funktion die auch wirklich in sich abgeschlossen
ist und keine Nebeneffekte an irgendwelchen globalen Variablen hat. Die
Funktion kann dann von jeder Stelle aus bedenkenlos aufgerufen werden.
Sie macht ihr Ding, liefert ihre Werte und das wars.
> Ich frage, weil ich ganz konkret vor einer Implementierung stehe, bei> der ein Modul (eine C datei) über ziemlich viele "lokale" (static)> variablen verfügt.
Welches Modul?
> Dafür sieht man, was in welcher Funktion benötigt wird.> Oder ist es eh ratsam, ein neues typedef für das Modul zu machen, das> eine struct ist, die alle lokalen Variablen enthält und dann in "c++ in> c" Art, sprich manuelle Übergabe des "objektes" an die öffentlichen> Funktionen zu machen?
Das kommt drauf an.
Wenn du das Gefühl hast, das es sich dabei um ein tatsächliches 'Objekt'
handelt ... ja dann würde man das genau so machen.
Ein Stack beispielsweise, oder eine FIFO ist für sich genommen ein
'Objekt' mit einer für sich alle vernünftigen Funktionalität. Zudem ist
das etwas, das man immer wieder mal gebrauchen kann. D.h. in dem Fall
würde man sehr wahrscheinlich die ganze Sache sauber machen und alle
Variablen, die du jetzt als (static) modul-lokale globale Variablen
eingeführt hast, in einer struct organisieren. Im Endeffekft ist das ja
nichts anderes als eine andere Origanistation, in der um die (stativ)
modul-lokalen Variablen eine Hülle gelegt wird und ihnen ein Name
gegeben wird.
Das 'löst' dann gleich auch deine Bedenken wegen der langen
Argumentlisten. Anstelle alle 'Variablen' einzeln zu übergeben, stellst
du den Funktionen einen Pointer auf das Objekt zur Verfügung, mit denen
sie arbeiten sollen. Und plötzlich ist es dann auch überhaupt kein
Problem mehr, mit ein und demselben Satz von Funktionen nicht nur 1,
sondern auch schon mal 4 derartige FIFO Objekte in einem Programm zu
haben.