mikrocontroller.net

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


Autor: uzti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die vernünftigste Lösung besteht darin, dass du den Wert an die 
aufgerufene Funktion einfach als Argument übergibst

/* Funktionsprototyp, damit in main auch bekannt ist, welche
   Signatur, die aufgerufene Funktion foo besitzt
*/
void foo( int arg );


int main()
{
  int i = 2 * 20;

  foo( i );
}

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


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'

Autor: uzti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
int twice( int Wert )
{
  return 2 * Wert;
}

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.

int twice( int Wert );  /* Prototyp */

int main()
{
  int i, j;

  i = 5;

  j = twice( i );       // j wird 10, weil i den Wert 5 enthält
  j = twice( 5 );       // j wird ebenfalls 10, weil das doppelte von 5 -> 10
  j = twice( 3 * i );   // 3 * i ergibt 15, das doppelte von 15 -> 30
  j = twice( 3 * ( i + 2 ) );   // 5 + 2 -> 7, 3 * 7 -> 21, das doppelte davon -> 42
  ...
}

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.