Pages: [1] 2   Go Down
Author Topic: Variablendeklaration in Unterprogrammen  (Read 1192 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
ist wohl wieder eine Anfängerfrage, aber ich zähl mich immer noch dazu. smiley-roll-blue

wenn ein Sketch aus mehreren Unterprogrammen (*.ino's) besteht, wie sieht es dann mit der Variablendeklaration aus?

Ich habs bisher nur geschafft, eine Variable in zwei Unterprogrammen zu verwenden, wenn ich diese im Hauptprogramm definiert habe.
Wenn ich eine Variable in einem Unterprogramm definiert habe, und diese dann in einem anderen Unterprogramm verwenden will, dann hat der Compiler immer gemault, daß er sie nicht kennt.
Mit Unterprogramm meine ich eine zweite *.ino, die mit dem rechten Pfeil als "neuer Tab" erzeugt werden kann.
Gibts da so was wie eine public oder private Deklaration?

Gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
ja wir Anfänger haben es nicht leicht. Aber wenn du eine Variable global definierst, kann diese von jeder Funktion genutzt werden.

Code:
int x = 0;

setup{}
loop
{
Serial.println(x);
extra_funktion();
Serial.println(x);
extra_funktion_klappe_die_zweite();
Serial.println(x);
}
void extra_funktion
{
x++;
}
void extra_funktion_klappe_die_zweite
{
x=2*x;
}

so kannst du die Variable in jeder Funktion anfassen.
mfg
Balli
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist richtig, mit Globalen variablen muss/sollte man allerdings aufpassen, schnell ist diese überschrieben ohne das du das wolltest da sie ja global ist und damit überall gültig ist.
Definierst du in Funktionen neue Variablen brauchst du dir keine Sorgen zu machen da sie nur in ihrem Gültigkeitsbereich gültig ist .

Code:
void machewas()
{
/* Das hier ist der Gültigkeitsbereich*/
}
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du in Unterprogrammen eine variablen verwenden willst, di nicht global definiert sind musst du die entsprechend übergeben. Ließ dir mal das durch:

http://arduino.cc/en/Reference/FunctionDeclaration

Prinzipiel läuft das so:

Hauptprogramm:
int x;
int y;
int z;
x =2;
y=x+3;

z = Unterprogramm(x, y);

int Unterprogramm(int a, int b):
int c
a=a+3;  
c = a*b;
return c;


Bei der Deklaration deines Unterprogramms musst du also festlegen welche Werte es beim Aufruf erwartet. Diese sind dann Lokal deklariert und können verwendet werden. Beim Aufruf im Hauptprogramm übergibst du die entsprechenden Werte. Veränderungen im Unterprogramm haben dann keinen Einfluss auf die Variable im Hauptprogramm.
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das eine hat doch mit dem anderen nicht zu tun.  Du sprichst von Subroutinen, hk007 von der Unterteilung des Programms in mehrere Dateien, die anschließend beim compilieren wieder zusammengefasst werden.
Logged


Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Das eine hat doch mit dem anderen nicht zu tun.  Du sprichst von Subroutinen, hk007 von der Unterteilung des Programms in mehrere Dateien, die anschließend beim compilieren wieder zusammengefasst werden.
Genau, du hast es erfasst, was ich meine. Subroutinen, oder nennen wir es einfach Tabs? Glaub das trifft es am ehesten.

Mal ein Beispiel:
Mein Programm (und auch der erste Tab) heisst "Main". Dann erstelle ich noch 2 Tabs mit den Namen "Sub1" und "Sub2".
Wenn ich jetzt eine Variable in Main definiere, dann kann ich sie auch in Sub1 und Sub2 verwenden.
Wenn ich eine Variable in Sub1 definiere, dann kann ich sie in Sub2 nicht verwenden.
-->Fehlermeldung beim kompilieren: ... was not declared in this scope.
Wundert mich etwas, weil ich dachte, daß die Tabs beim compilieren in ein scope zusammengezogen werden.

gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nein nein, es wird nur zu einer Datei zusammengefasst, der scope ist der Gültigkeitsbereich den ich angesprochen habe. Entweder die variable ist Global und somit überall gültig, oder du musst die explizit deklarieren.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Entweder die variable ist Global und somit überall gültig, oder du musst die explizit deklarieren.
Kann ich das so verstehen:
Global definiert ist die Variable, wenn sie in "Main" definiert wird?
Gibts dann auch ne Möglichkeit die Variable in einem der Subs so zu definieren, daß sie global ist?

Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Global ist eine Variable dann wenn die vor der setup() funktion deklariert wird.
Da die verschiedenen Tabs, also deine main und deine sub1 und sub2 ja eh zu einer Datei werden sollten globale variablen auch dort gültig sein.Variablen die du Global haben willst also vor die setup() funktion packen, und dann sollte das gehen.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK,

aber die Frage ist jetzt, kann ich die Variable auch in einer der Subs global definieren?
Ich kann in den Subs keine void setup() verwenden, damit ich die Variable davor definieren kann. Das nimmt mir der Compiler krumm.
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja richtig, es wird ja 1 Datei, und damit wäre void setup() ja doppelt vorhanden. Wenn du in deiner main deine variablen vor die setup() packst dann sind sie ja "überall Global", da es später 1 datei wird... für den compiler keinen unterschied ob es 1 tab ist oder 10  es wird zu einer Datei ;-)
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, das ist jetzt klar.
Aber ich finde es in meinem Fall etwas unübersichtlich alle Variablen in die Main zu werfen.
Da dachte ich, daß ich die Variable in einer Sub definiere, wo sie logisch dazu gehört.
Wenn das nicht geht, dann muss halt alles in die Main vor void setup()
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich verstehe genau was Du meinst. Das nützt Dir aber nichts da ich es jetzt auch nicht weiß.  smiley
Was ich aber weiß ist das ich auch Variablen in einem zweiten Tab deklariere ausserhalb von Funktionen.
Allerdings nutze ich diese dann auch nur in diesem Tab.

Ps: Habs gerade mal ausprobiert. Scheint aber zu gehen. Wenn du die Variablen im zweiten Tab ausserhalb einer Funktion deklarierst scheint sie global zu sein.
Darf halt nicht in einer Funktion passieren.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wenn du die Variablen im zweiten Tab ausserhalb einer Funktion deklarierst scheint sie global zu sein.

ja, kann ich jetzt nach einigen Versuchen und auch mit der Hilfe von Shufty bestätigen.
Allerdings muss man da etwas aufpassen.
Die Neben-Tabs werden in der IDE in alphabetischer Reihenfolge angezeigt. Und so werden sie auch beim compilieren abgearbeitet.
Also muss der Tab, in dem die Variable definiert wird, alphabetisch vor den Tabs stehen, in denen die Variable verwendet wird.
Und wie MueThoS geschrieben hat, muss die Variable in dem Nebentab vor der Funktion definiert werden.
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, das Thema ist zwar schon etwas älter, aber ich habe das gleiche Problem.
Ich wollte alle meine globalen Variablen in einem Tab ablegen, weil ich das übersichtlicher finde.
Leider haben alle vorangegangenen Tipps nicht geholfen.
Ich habe als test das Blink.ino - Beispiel genommen und die Deklaration int led = 13; in einen neuen Tab AA_Globale_Variablen.ino verschoben und der Compiler meckert, dass er led jetzt nicht mehr kennt.
Kann das jemand nachvollziehen, bzw. kennt jemand Abhilfe für dieses Problem?
Achso, Arduino IDE: 1.0.5
Danke
Sascha
Logged

Pages: [1] 2   Go Up
Jump to: