Forum: Compiler & IDEs AVR-Studio/C: Wie überträgt man Variablen von einer Funktion in die andere?


von Fabian H. (Gast)


Lesenswert?

Hallo,
ich experimentiere mit dem AVR-Studio und will dabei meine sehr 
rudimentären C-Kenntnisse etwas aufpeppeln.
Dazu folgende Frage, wie überträgt man Variablen von einer Funktion in 
die andere?

Es gibt ja folgende Arten von Variablen:
lokal   - gilt nur in der jeweiligen Funktion
global  - gilt funktionsübergreifend (also in allen Funktionen)
volatil - gilt funktionsübergreifend und in allen Interrupt-Routinen

Wenn man jetzt eine lokale Variable in eine andere Funktion übertragen 
möchte, wie geht man am besten vor?

Nebenbei gefragt, wann muss man void verwenden und wann nicht?
(void bedeutet ja so etwas wie leer, wird es immer benutzt, wenn keine 
Werte zwischen den jeweiligen Funktionen übertragen werden?)
1
i_verdoppeln (b = i) { // i_verdoppeln-Funktion, Wert von i auf b übertragen
2
    b = b * 2; // ??? b ist allerdings noch gar nicht deklariert
3
    
4
    // ??? wie jetzt weiter, der Wert von b muss ja in i in der main-Funktion gelangen
5
}
6
7
void main () { // main-Funktion
8
9
    uint8_t i = 2;
10
11
    i_verdoppeln (i);  // Aufruf der i_verdoppeln-Funktion
12
13
    PORTC = i; // den Wert von i auf Port C ausgeben, hier i = 4
14
15
}
16
return 0;

von Oliver S. (oliverso)


Lesenswert?

Bei dem Kenntnisstand nimm dir doch einfach am nächsten Wochenende ein 
paar Stündchen Zeit, und arbeite ein beliebiges 
C-Tutorial/Buch/Lernvideo über die den allerersten Grundlagen durch.

So ganz ohne jedes Verständnis für die Grundkonzepte einer 
Programmiersprache wird das nichts.

Und mach das bitte am PC mit einem C-Compiler für den PC.

Oliver

: Bearbeitet durch User
von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Fabian,

> lokal   - gilt nur in der jeweiligen Funktion
Die lokal angelegte Variable ist nur hier sichtbar, der Speicher dafür 
wird beim Verlassen der Funktion freigegeben. Er befindet sich typischer 
Weise auf dem Stack.

> global  - gilt funktionsübergreifend (also in allen Funktionen)
Diese Variablen liegen in einem eigenen Speichersegment und sind auch in 
Interrupts nutzbar. Vorsicht bei konkurrierenden Zugriffen!!!

> volatil - gilt funktionsübergreifend und in allen Interrupt-Routinen
volatile sagt nur, das der Compiler bei Benutzung der Variablen den 
Inhalt immer aus dem Speicher / Register neu einlesen muss, weil der 
Inhalt von anderer Stelle aus verändert werden kann (von der HW oder von 
einem anderen Thread / Interrupt).

Gruß
Olaf

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Fabian H. schrieb:
> void main () { // main-Funktion

"void" bedeutet "nichts" oder "undefiniert".
Für einen C-Compiler ist x() nicht gleich x(void)!
Für einen C++-Compiler aber.

Übrigens, die Funktion muss heißen       int main(int argc, char ** 
argv)
Das ist die Signatur der Funktion.
Diese Variante wird vom Betriebssystem erwartet.

Gruß
Olaf

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Fabian H. schrieb:
> i_verdoppeln (i);  // Aufruf der i_verdoppeln-Funktion

Das geht so in C nicht.

Also entweder in C:

void i_verdoppeln(int * i);

i_verdoppeln(&i);

Oder ebenfalls C:

int i_verdoppeln(int i);

i = i_verdoppeln(i);

Oder in C++ (zusätzlich zu den 2 o. g. Varianten):

void i_verdoppeln(int & i);

i_verdoppeln(i);


Also deine Variante würde nur mit C++ und Referenzen funktionieren.

Gruß
Olaf

von MaWin O. (mawin_original)


Lesenswert?

Olaf D. schrieb:
> Übrigens, die Funktion muss heißen       int main(int argc, char **
> argv)
> Das ist die Signatur der Funktion.
> Diese Variante wird vom Betriebssystem erwartet.

nein, wird sie nicht.
int main(void)
ist völlig in Ordnung.

von mike_ (Gast)


Lesenswert?

in der Art könnte es gehen ->
1
 i_verdoppeln (uint8_t b = i) { // i_verdoppeln-Funktion, b declarieren, Wert von i auf b übertragen
2
     b = b * 2;
3
 
4
     // ??? wie jetzt weiter, der Wert von b muss ja in i in der main-Funktion gelangen
5
    
6
    return (???); /// das weiß ich auch nicht, vermutlich über einen ausdruck mit return irgendwas
7
 }
8
 void main () { // main-Funktion
9
     uint8_t i = 2;
10
     i_verdoppeln (i);  // Aufruf der i_verdoppeln-Funktion
11
     PORTC = i; // den Wert von i auf Port C ausgeben, hier i = 4
12
 }
13
return 0;

Das AVR-Studio (GCC) kann, glaube ich, C, C++ und irgendwelche 
Sondersachen.
(ist C nicht sowieso Teilmenge von Cpp?)

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

MaWin O. schrieb:
>> Übrigens, die Funktion muss heißen       int main(int argc, char **
>> argv)
>> Das ist die Signatur der Funktion.
>> Diese Variante wird vom Betriebssystem erwartet.
>
> nein, wird sie nicht.
> int main(void)
> ist völlig in Ordnung.

OK. Aber nicht main() wie im Eingangsposting geschrieben.
Einigen wir uns auf unentschieden?

https://en.cppreference.com/w/c/language/main_function

Gruß
Olaf

von kai (Gast)


Lesenswert?

Dann sagt doch mal lieber an, wie man im AVR-Studio konkret Variablen 
von einer Funktion in eine andere überträgt und zurück, dann haben wir 
alle was davon. Anstatt hier schlau rumzulabern.

von Dumpfbacke (Gast)


Lesenswert?

kai schrieb:
> wie man im AVR-Studio konkret Variablen
> von einer Funktion in eine andere überträgt

In AVR-Studio kann man keine Variablen übertragen.

In AVR-Studio kann man Quelltexte editieren, erzeugen, sichern,
Projekte anlegen und speichern, Compiler starten, Debugger
starten, Programmcode laufen lassen und solche Sachen.

Aber Variablen übertragen, das geht nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.