Hallo, ich habe ein kleines Problem mit dem angehängten code.
Ich möchte mithilfe der Funktion void displayDefRestTime() die
rstTimeXxx variablen anzeigen, nachdem diese von der funktion restTime
bearbeitet wurden.
Mein Problem ist, das mir der Compiler (AVR GCC) singemäß folgende
Fehlermeldung ausgibt:
"variablen restTimeXxx in void restTime() nich declariert"
Welche möglichkeiten habe ich dies zu tun ohne globale oder statische
Variablen einzusetzen? Eigendlich müssten doch meine variablen während
des aufrufes von restTime() noch gültig sein, da die aufrufende Funktion
nicht beendet wurde?
Gibt es auf uc eine möglichkeit mehrere variablen per return zurück zu
geben?
Wie siehts mit Arrys oder pointern aus ?
Josh schrieb:
> Mein Problem ist, das mir der Compiler (AVR GCC) singemäß folgende> Fehlermeldung ausgibt:> "variablen restTimeXxx in void restTime() nich declariert">
und recht hat er
> Welche möglichkeiten habe ich dies zu tun ohne globale oder statische> Variablen einzusetzen?
keine
> Eigendlich müssten doch meine variablen während> des aufrufes von restTime() noch gültig sein, da die aufrufende Funktion> nicht beendet wurde?
nope.
In C wird der Scope von Variablen statisch zur Compiletime festgelegt.
Wenn du dynamische Bindung willst, musst du dir einen LISP Dialekt
suchen, der dynamische Bindung unterstützt.
> Gibt es auf uc eine möglichkeit mehrere variablen per return zurück zu> geben?> Wie siehts mit Arrys oder pointern aus ?
Wie wäre es, wenn du dir ein Einführungsbuch zu C zu Gemüte führen
würdest? Dort erfährst du dann auch, dass man Funktionen Argumente
mitgeben kann ....
1
intfoo(inta,intb)
2
{
3
returna+b;
4
}
5
6
intbar1()
7
{
8
inth=5,j=8,m;
9
intx=10,y=12,z;
10
11
m=foo(h,j);
12
z=foo(x,y);
13
}
... und das das der C-übliche Weg ist, wie die aufrufende Funktion der
aufgerufenen Funktion einen Teil ihrer Variablen zur freundlichen
Bearbeitung zur Verfügung stellt. Aber: Die aufrufende Funktion stellt
der aufgerufenen Funktion Variablen zur Verfügung und nicht "die
aufgerufene Funktion greift einfach auf Variablen des Aufrufers zu wie
sie lustig ist"
Hallo,
vielen dank für die Antwort.
Ein solches buch habe ich mir zu gemüte geführt, und die funktionen
deines Bsp sind mir bekannt.
ich hatte gehofft eine möglichkeit zu finden 3 variable zurück zu geben
um die Funktion nicht 3fach ausführen zu müssen.
Aber wenn das nicht klappt werde ich diese eben umbauen müssen
mfg
josh
kannste ja referenzen in der Funktion übergeben, dann können die
Parameter von der Funktion verändert werden.
void Increment(int &a)
{
a++;
}
... //irgendwo im code
int i = 0;
increment(i);
//i ist jetzt 1
> Eigendlich müssten doch meine variablen während des aufrufes von> restTime() noch gültig sein, da die aufrufende Funktion> nicht beendet wurde?
Die Funktion restTime kann ja auch von anderer Stelle aufgerufen werden.
Z.b. von einer Funktion, in der es die entsprechenden Variablen nicht
gibt.
> Gibt es auf uc eine möglichkeit mehrere variablen per return zurück zu> geben?
Bei Arrays kannst du z.B. die Adresse übergeben. Ist ein wenig
umständlich hier, vor allem wenn Du dich damit noch nicht so gut
auskennst.
Nimm lieber Strukturen, dann hast du eine Variable mit mehrern Werten:
typedef struct
{
int sek;
int min;
int hr;
} TIME;
TIME restTime (TIME rstTime)
{
rstTime.sek = 1;
rstTime.min = 2;
rstTime.hr = 3;
return rstTime;
}
Hallo,
vielen dank für die reichlichen Antworten.
>Bei Arrays kannst du z.B. die Adresse übergeben. Ist ein wenig>umständlich hier, vor allem wenn Du dich damit noch nicht so gut>auskennst.
Ich dachte zeiger sind aufgrund des adressbereiches bei AVRs 16 Bit
lang, weswegen man vor der verwendung absehen sollte?
>Nimm lieber Strukturen, dann hast du eine Variable mit mehrern Werten:
Das kling gut, und werde ich in Zukunft wohl so machen.
Flo schrieb:
> void Increment(int &a)> {> a++;> }>> int i = 0;> increment(i);>> //i ist jetzt 1
Nicht ganz. Erst mal müssen die Fehler beseitigt werden ;-)
1:
> void Increment(int &a)> {> a++;> }
a ist eine Adresse und kein Wert. Der Inkrement wirkt aber auf die
Adresse. Korrekt wäre:
(*a)++;
2:
Der Compiler kennt nun die Funktion "Increment", aufgerufen wird aber
"increment" (case-sensitive).
3,
Die Funktion erwartet einen Pointer auf int, bekommt aber ein int.
Korrekt wäre:
"Increment(&a);"
Gruß,
Bernd
Bernd O. schrieb:
> 1:>> void Increment(int &a)>> {>> a++;>> }> a ist eine Adresse und kein Wert.
Hier wird eine Referenz erwartet, kein Zeiger. Das ist so richtig.
> Die Funktion erwartet einen Pointer auf int, bekommt aber ein int.> Korrekt wäre:> "Increment(&a);"
Nein, siehe oben.
> Ich dachte zeiger sind aufgrund des adressbereiches bei AVRs 16 Bit> lang, weswegen man vor der verwendung absehen sollte?
Und wie lang sind drei int? Die werden bei meiner Variante nämlich
lustig auf dem Stack herumkopiert. Diese Variante ist auch nicht auf
Effizienz ausgelegt.
Wenn ich mich recht erinnere, ist ein int auch 16 Bit lang. int8_t oder
uint8_t reichen hier aber evtl. auch.
Peter Stegemann schrieb:
> Bernd O. schrieb:>>> 1:>>> void Increment(int &a)>>> {>>> a++;>>> }>> a ist eine Adresse und kein Wert.>> Hier wird eine Referenz erwartet, kein Zeiger. Das ist so richtig.
Moment, reden wir hier von C oder von C++?
Es gibt einen Weg, die ursprüngliche Absicht umzusetzen, aber nur mit
gcc. gcc kann nested functions (eine Funktionsdefinition innerhalb
einer anderen). Diese innerhalb definierte Funktion kann auf die
lokalen Variablen der Funktion(en), in denen sie steht, zugreifen.
Also genau das, was der TE ursprünglich wollte. Man muss sich nur klar
sein, dass das kompatibel zu nix außer der gcc-Familie ist.
Also ich hab den Code vor dem Posten kurz im devcpp ausprobiert
(natürlich mit nem großen 'I' beim Aufruf) und es funktioniert so.
Das ganze nennt sich Referenz und so könnte der TE einige Werte, die er
als Parameter verwendet, durch die Funktion verändern lassen.
So hab ich die Frage wenigstens verstanden.
:-)
Flo schrieb:
> Also ich hab den Code vor dem Posten kurz im devcpp ausprobiert> (natürlich mit nem großen 'I' beim Aufruf) und es funktioniert so.
Du hast einen C++ Compiler benutzt.
In C gibt es keine Referenzen.