Forum: Compiler & IDEs berechnete variable aus main.c nach httpd.c übergeben


von uzti (Gast)


Lesenswert?

Hy Leute.
Häng total fest.
Vermute eine einfache Lösung.
Ich habe ein Programm für meinen ATmega644 geschrieben wo in einer 
main.c eine Variable berechnet wird.
Dieses Ergebniss bzw. genau diese Variable mit dem berecneten Wert 
müsste ich an eine httpd.c übergeben und dort weiter verarbeiten.
Da hab ich jetzt das Problem. Ich bekomm einfach nicht die Werte aus der 
einen C-Datei in die andere.
Bitte helft.
gruß

von Karl H. (kbuchegg)


Lesenswert?

die vernünftigste Lösung besteht darin, dass du den Wert an die 
aufgerufene Funktion einfach als Argument übergibst
1
/* Funktionsprototyp, damit in main auch bekannt ist, welche
2
   Signatur, die aufgerufene Funktion foo besitzt
3
*/
4
void foo( int arg );
5
6
7
int main()
8
{
9
  int i = 2 * 20;
10
11
  foo( i );
12
}

in http.c:
1
void foo( int arg )
2
{
3
  /* mach was mit dem übergebenen Wert in arg */
4
}


Die andere Lösung wäre der Einsatz einer globalen Variablen. Kann 
insbesondere auf einem µC sinnvoll sein, sollte jedoch immer mit 
Vorsicht benutzt werden. Globale Variablen gehören mit zu den 'Wurzeln 
allen Übels'

von uzti (Gast)


Lesenswert?

Danke für deine Antwort.
Hab da gleich mehrere Fragen.
1. Wiso deklarierst du denn Prototyyp als void?

2. Beim Aufruf der Funktion wird i dann der Rückgabewert? In der 
Funktion steht ja garnix drin?
  foo( i );
3. In der httpd.c muss ich dann mit arg arbeiten oder? Weil i vorher 
übergeben wurde?

Vielen Dank.

von Karl H. (kbuchegg)


Lesenswert?

uzti wrote:
> Danke für deine Antwort.
> Hab da gleich mehrere Fragen.
> 1. Wiso deklarierst du denn Prototyyp als void?

Weil die Funktion, so wie sie jetzt ist, keinen Rückgabewert hat, also 
eine void Funktion ist. Und Prototyp und tatsächliche Funktion müssen 
übereinstimmen.

> 2. Beim Aufruf der Funktion wird i dann der Rückgabewert?

Nein.
Der momentane Wert von i wird in die Funktion hinein übergeben und wird 
zum Inhalt der Variablen arg innerhalb der Funktion.

> In der
> Funktion steht ja garnix drin?
>   foo( i );

Das ist ja auch der Aufruf der Funktion.

> 3. In der httpd.c muss ich dann mit arg arbeiten oder? Weil i vorher
> übergeben wurde?

Der Wert wird aus i entnommen und an die Funktion übergeben. Übergeben 
wird er, in dem innerhalb der Funktion eine neue Variable 'arg' erzeugt 
wird, die diesen Wert beim Funktionsaufruf zugewiesen bekommt. 'arg' 
existiert nur, solange die Funktion läuft. Sobald die Funktion fertig 
ist und der Rücksprung zum Aufrufer erfolgt, verschwindet 'arg' wieder.

i und arg haben absolut nichts miteinander zu tun, ausser das beim 
Aufruf der Funktion der momentane Wert von i genommen wird und als 
Initialwert von arg benutzt wird. Das ist auch gut so, denn damit wird 
die Funktion unabhängig von den Variablen des Aufrufers.
Stell dir einfach mal vor, du brauchst eine Funktion, die immer das 
doppelte eines Wertes liefert.
1
int twice( int Wert )
2
{
3
  return 2 * Wert;
4
}

Da 'twice' nichts über die Variablen des Aufrufers wissen muss, kannst 
du die Funktion jetzt mit allem Möglichen aufrufen, solange es nur ein 
int ist.
1
int twice( int Wert );  /* Prototyp */
2
3
int main()
4
{
5
  int i, j;
6
7
  i = 5;
8
9
  j = twice( i );       // j wird 10, weil i den Wert 5 enthält
10
  j = twice( 5 );       // j wird ebenfalls 10, weil das doppelte von 5 -> 10
11
  j = twice( 3 * i );   // 3 * i ergibt 15, das doppelte von 15 -> 30
12
  j = twice( 3 * ( i + 2 ) );   // 5 + 2 -> 7, 3 * 7 -> 21, das doppelte davon -> 42
13
  ...
14
}

(Hier wurde der Returntyp der Funktion auf int gesetzt, eben weil die 
Funktion einen int returniert)

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.