mikrocontroller.net

Forum: Compiler & IDEs Sub-Routinen in andere Datei


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal!

Hab gerade im falschen Forum gepostet. Sorry...
Ich hake im Moment etwas an der Variablenübergabe. Ich möchte folgendes
tun: in meiner Hauptdatei habe ich einige Funktionen. Diese verwenden
die Variablen „istwert“ und „spannung“. Diese habe ich vorher als
unsigned char definiert.
Nun soll mit diesen Variablen wieder was in „Unterfunktionen" gemacht
werden. Das wollte ich aber nicht alles ein eine Riesendatei packen und
hab darum gedacht es diese Funktionen in einer anderen Datei aus zu
lagern. Nun zur „Frage“: kann ich den Zugriff wie folgt stattwinden
lassen?!

In hauptprog.c:

#include "messungen.c"

unsigned char spannung;
unsigned char istwert;

int main(void){

(ganz viel Code…)

spannung_messen(spannung);
strom_messen(istwert);
vergleich();
}

int vergleich(void){
(Code, der „spannung“ und „istwert“ verwenden soll)
}

in der messung.c steht dann:

#include "messungen.h"

void strom_messen(unsigned char istwert){
(Code)
}

void spannung_messen(unsigned char spannung){
(Code)
}

in der messung.h steht:

void spannung_messen(unsigned char spannung);
void strom_messen(unsigned char istwert);

ist das so richtig, wenn ich in der Hauptdatei dann weiter mit den
Variablen arbeiten will? Vielleicht könnte jemand einen Überblick geben
wie man was wohin übergibt. Ich hab schon recht viel Literatur dazu
gewälzt, aber da stand immer das gleiche und immer so, dass ich es nicht
verstanden hab…  Beim Compilieren gibt es keine Fehlermeldungen. Hab
versucht mich an der Struktur der LCD-Ansteuerung von dieser Seite zu
orientieren...
Also, wäre toll, wenn einer Zeit hätte zu Antworten.

Danke schon mal!
Andi

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#include "messungen.c"

.c-Dateien werden niemals includiert. Die soll der Linker zusammenbauen, 
dafür ist der schließlich da.

Eine Möglichkeit:

In hauptprog.c:
#include "main.h"
#include "messungen.h"

unsigned char spannung;
unsigned char istwert;

int main(void){

(ganz viel Code)

spannung_messen(spannung);
strom_messen(istwert);
vergleich();

int vergleich(void){
(Code, der spannung und istwert verwenden soll)
}

}

in main.h
extern unsigned char spannung;
extern unsigned char istwert;
in messungen.c
#include "main.h"
#include "messungen.h"

void strom_messen(unsigned char istwert){
(Code)
}

void spannung_messen(unsigned char spannung){
(Code)
}
in der messung.h steht:
void spannung_messen(unsigned char spannung);
void strom_messen(unsigned char istwert);

Im makefile müssen dann hauptprog.c und messungen.c als sourcefiles 
angegeben werden.

Oliver

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Oliver!
Danke für die Antwort!
Das mit der includiererei von c-dateien wußte ich nicht. Ich habe mich 
hierdran orientiert: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

da wurde das auch so gemacht. Ich verwende AVR-Studio. bindet das die 
verwendeten dateien nicht automatisch ein? Mit Avr-Studio mußte ich mich 
zumindest nie mit den make-files befassen...

VG!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Wenn du istwert und spannung den Funktionen, wie von dir gezeigt, in 
messungen.c als Parameter übergibst (und innerhalb von Code kein 
Zufgriff auf das den jeweils anderen Parameter erfolgt, und du die Werte 
auch nicht verändert in hauptprog weiterverwenden möchtest), kannst du 
main.h weglassen. Die Parameter sind durch durch die 
Funktionsdefinitionen eindeutig definiert, und wie die in den einzelnen 
.c-Dateien genannt werden, ist dem Linker herzlich egal.

Dann reicht es, in der ersten Zeile deines Programms
#include "messungen.h"
an Stelle von "messungen.c" zu schreiben, der Rest kann bleiben, wie er 
ist.

Oliver

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
> Ich habe mich hierdran orientiert:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
> da wurde das auch so gemacht.

Tatsächlich? Wo genau?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollt ich auch grade fragen...

>Ich verwende AVR-Studio. bindet das die verwendeten dateien nicht
>automatisch ein?

Tut es, wenn du die .c-files im source-Ordner liegen hast. Das Studio 
bastelt sich dann selber ein passendes makefile.

Oliver

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, ich finds grad auch nicht. komisch... sollte ich mich so sehr 
verguckt haben?! wahrscheinlich...

hab es bei mir entsprechend geändert und die .c-dateinen in den 
source-ordner geschubst - läuft.

kann mir denn noch jemand "schnell" erläutern wie das mit der 
variablenübergabe von wo nach wo und so ist? ich versuch mir immer nen 
bild im kopf zurecht zu stricken, krieg es aber nicht auf die reihe. 
stelle mir immer leute (routinen) vor, die alle irgendwas machen. dann 
kann einer nem anderen ein päckchen (variablen) geben (oder auch nicht). 
dann kann der andere da was rein tun (oder auch nicht) und es zurück 
geben. aber ich check nicht wann. und dann ist da mal void und mal nicht 
und dann mal in klammern und mal nicht... ich weiß, das sind irgendwie 
die grundlagen. aber ich frag ja hier, weil ich es bisher einfach nicht 
verstanden habe. trotz nachlesen... :(

Danke nochmal!
VG!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ganz einfach:

z.B.:
int eineFunktion(int EingabeParameter)
{
   int eineVariable;
   Eingabeparameter = 2* Eingabeparameter;
   eineVariable = 3*EingabeParameter;

   return eineVariable;
}

Das "int" vor dem Funktionsnamen definiert den Typ des 
Rückgabeparameters, in dem Beispiel eben ein int. Über den 
"return"-Befehl sagts du der Funktion, welchen Wert sie zurückgeben 
soll. Aufgerufen wird das dann z.B. so:
int einWert = 9;
int Ergebnis = eineFunktion(einWert); // Ergebnis bekommt 54 zugewiesen

Auf diese Art und Weise lässt sich ein veränderter Wert an den Aufrufer 
zurückgeben, aber eben auch nur einer. Gibt die Funktion gar keine Wert 
zurück, bekommt sie den Typ "void" (bedeutet in etwa: "nix" :-)

Der Wert des Funktionsparameters "EingabeParameter" aus dem Beispiel 
kann durch die Funktion im aufrufenden Programm NICHT verändert werden. 
Die Funktion bekommt nur eine Kopie der Variable aus dem aufrufendem 
Programm übergeben. Du kannst den Wert zwar intern in der Funktion 
verändern, da sich damit aber nur die Kopie ändert, bekommt das 
aufrufende Programm davon nichts mit. Auch nach dem Aufruf der Funktion 
ist im Hauptprogramm die Variable "einWert" immer noch 9.

Um einen Eingabewert über die Parameterliste verändert zurückzugeben, 
muß man daher nicht die Variable selber, sondern eine Pointer darauf 
übergeben, und den in der Funktion dereferenzieren.

Das sähe dann so aus:
int eineFunktion(int* EingabeParameter)
{
   int eineVariable;
   *Eingabeparameter = 2* (*Eingabeparameter);
   eineVariable = 3* (*EingabeParameter);

   return eineVariable;
}

und der Aufruf:
int einWert = 9;
int Ergebnis = eineFunktion(&einWert); // Ergebnis bekommt 54 zugewiesen

Danach enthält einWert den Wert 18.

Oliver

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey Oliver!
danke nochmal, daß du dir zeit für die erläuterung genommen hast. ich 
glaube so langsam sitzt es :) !

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.