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
voidmain(){// main-Funktion
8
9
uint8_ti=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
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
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
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
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
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.
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
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.
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.