PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rückgabe von variablen aus funktionen



upaucc
02.04.2007, 10:33
Hi, leider bin ich kein c-profi, demenstsprechend habe ich folgendes problem:

ich möchte einige funktionen für asuro in asuro.c implementieren, in denen bestimmte variablen benutzt werden, auf die jedoch auch das hauptprogramm sowie weitere funktionen in asuro.c zugreifen müssen. wie geht das?

ich weiss dass es den return befehl gibt, aber ich bin mir nicht sicher ob ich das richtig verstanden habe...

Bsp:

folgende funktion wird in asuro.c gespeichert

float linie(void){ //deklaration von funktion linie

float filter[2];
int aR=1, aL=2;

//hier kommt die funktion hin...

return filter[1], aR, aL;

das hauptprogramm ruft nun die funktion linie auf, und soll nach aufrufen der funktion die werte filter[1], aR, aL überliefert bekommen da diese auch im hauptprogramm, sowie in weiteren funktionen in asuro.c benötigt werden...kann mir jemand ein paar tipps geben??

vielen dank im vorraus

AlKI
02.04.2007, 10:45
Hi
ich bin mir da nicht so sicher, aber wenn du eine Variable als Globale variable deklarierst und dieser dann in der Funktion nen Wert zuordnest, dann kann dein Hauptprogramm diese nach dem ausführen des Unterprogramms benutzen.

EDIT: du bäuchtest dann halt mehrere globale Variablen.

Vielleicht hilft dir das weiter:

http://www.user.tu-berlin.de/looprjbb/it/C_Kurs/funktion/Html/lektion_5/lektion_5.html


Ich weis bloß nicht, ob das bei Microcontrolllern so geht.

ogni42
02.04.2007, 10:49
Nein, das geht so nicht.

Wenn Du mehr als einen Wert zurückgeben möchtest, muss Du das in den Übergabeparametern machen, oder das Ganze - sofern es logisch zusammen gehört - in eine Struktur packen.

Google mal nach C-Tutorials, da steht das meist sehr gut beschrieben drin.

_HP_
02.04.2007, 11:01
Hi upaucc,

es gibt für dieses Probem, wie so oft im Leben, mehrer Ansätze:

1.) Globale Variablen
Dies ist sicher dei einfachste Möglichkeit. Du definierst die Variablen, auf die Du in Deiner line-Funktion und in main() zugreifen möchtest außerhalb dieser Funktionen. Nachteilig an der Methode ist, dass Du höllisch aufpassen musst, was Deine Funktionen mit solchen Variablen anstellen - denn wenn sie in einer Funktion geänder werden, gilt das auch außerhalb.

2.) return

Eine Funktion kann einen Rückgabewert haben. Dabei liegt die Betonung auf EINEN. Natürlich kann das ein Array sein - aber dann gibst Du eingentlich keinen Wert zurück, sondern eine Zeiger.

und damit sind wir bei
3.) Du kannst bei den Parametern einer Funktion diese als Wert oder Referenz (einen Zeiger auf die Speicherstelle, in der sich der Wert befindet) übergeben. Mit der zweiten Methode ist es möglich Werte innerhalb der Funktion zu ändern und diese Änderungen nach außen zu geben.

Dies nur als kleine Anregung. Du wirst aber an einem Programmierkurs in C nicht vorbeikommen. Schau doch mal hier:
http://www.pronix.de/pronix-608.html

Gruß,

_HP_

damaltor
02.04.2007, 21:38
also globale variablen sind die einfachste variante, brauchen allerdings recht viel ram und sind ansonsten absolut verpöhnt.
anwendung: direkt unter #include... die variable wie üblich deklarieren.

direkte rückgabe ist dein beispiel schon ganz gut, allerding kann man wie gesagt nur einen wert zurückgeben. zu funktioniert zB PollSwitch(). Funktioniert, geht schnell, ist zwarnicht höchster programmierstil aber wird ganz gern benutzt wenns nur funktionieren soll.

die hohe kunst in c sind die zeiger (pointer). eigentlich eine variable, in der die adresse einer anderen variable steht. dazu musst du allerdings von vorn nach hinten lesen, die seite vn oben ist nicht schlecht und gut zum verständnis. meld dich wenn du fragen hast.

SprinterSB
03.04.2007, 08:19
Am besten geht das, indem du deine Daten in einer Struktur zusammenfasst. Falls sich die Daten konzeptionell nicht in einer einzigen Struktur wohlfohlen, kannst du auch mit Pointern arbeiten.


typedef struct
{
float filter;
int aR;
int aL;
} linedata_t;

linedata_t data;

#define FILTER1 12.0

void setLineData (linetata_t * d)
{
d->filter = FILTER1;
d->aR = 1;
d->aR = 2;
}

// aufruf
void foo (void)
{
setLineData (& data);

if (data.aR == data.aL)
...
}


data sollte hier eine globale oder statische (evtl.) lokale Variable sein. data als lokale auto-Variable anzulegen ist nicht so toll auf AVR.