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

Gast #6941271
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;
#6941275
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
(Firma: O.D.I.S.) #6941286
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
(Firma: O.D.I.S.) #6941294
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
(Firma: O.D.I.S.) #6941301
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
Gast #6941464
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?)
(Firma: O.D.I.S.) #6941576
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
Gast #6941666
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.