Forum: Mikrocontroller und Digitale Elektronik Rückgabe einer Funktion


von Andreas I2C-Team (Gast)


Lesenswert?

Hallo, ich habe folgendes Problem beim programmieren, Programm sieht so
aus:

int empfang[4], empfuhr[4];
empfang[4]=uhr();

int uhr (void)
{
...
empfuhr[0]=0x00;
empfuhr[1]=0xf0;
empfuhr[2]=0x22;
empfuhr[3]=0x40;
empfuhr[4]=0xff;
..
return empfuhr[4];
}
Mein Problem ist es, dass nicht das komplette Feld von empfuhr
zurückgegeben wird, sondern nur der Inhalt von einem. wer kann mir
helfen???

von Khani (Gast)


Lesenswert?

Hallo Andreas,

Funktion Uhr einfach so umschreiben

void uhr(int empfuhr[])
{
empfuhr[x] = y; ...
}

Aufruf :
int empfang[4];
uhr(empfang);

Voila, die Daten sind in Empfang. Man könnte auch mit Pointern
arbeiten, das wäre aber mit Spatzen auf Kanonen geschossen ;-)

MfG, Khani

von Andreas I2C-Team (Gast)


Lesenswert?

danke für deine lösung, hat wunderbar geklappt!!
thxs

von Fritz Ganter (Gast)


Lesenswert?

Falls du dich über komisches Verhalten wunderst:

int empfang[4] ist falsch, es muss empfang[5] heissen.

von Jörg Wunsch (Gast)


Lesenswert?

Außerdem arbeitet die Funktion nunmehr erfolgreich mit Pointern. :-)

von Peter D. (peda)


Lesenswert?

Man sollte sich entscheiden, entweder man nimmt globale Variablen oder
man gibt was zurück.

Beides gleichzeitig kostet nur unnütz RAM und Flash.

Will man nehrere Variablen zurückgeben, die funktional zusammenhängen,
kann man das sehr gut über ein struct machen.


Peter

von Mike (Gast)


Lesenswert?

könntet ihr Eure Erläuterungen (@peter dannegger & @Jörg Wunsch) mit
einem kleinen Programmbeispiel erklären??

thx mike..

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Siehe Anhang


Peter

von Khani (Gast)


Lesenswert?

Mein Senf :

@ Jörg : Das tut sie eh immer (wir wollen ja relozierbare Programme in
C - festnageln tut sie in diesem Falle erst der Compiler). Ich habe nur
das explizite Nennen von Pointern vermieden, um die Pferde nicht scheu
zu machen ;-)

Zu Peters Vorschlag : Du hast völlig Recht - das ist auf jeden Fall
besserer Stil - speichermäßig aber in diesem Fall wahrscheinlich total
egal. (Du hast eben immer die Königslösung;-) )

von OldBug (Gast)


Lesenswert?

Ich denke, Jörg spielt auf die explizite Übergabe eines Pointers an die
Funktion an.

>void uhr(int empfuhr[])

Genauer: int empfuhr[] ist ein Pointer auf ein Array von int. Da Fritz
Ganter aber schrob, daß er auf Pointer verzichten möchte, stimmt diese
Aussage nicht :-)

...just my 2 cent...

von OldBug (Gast)


Lesenswert?

Oh, stimmt nicht, Khani hat das ja geschrieben, sorry Fritz :-)

von Fritz Ganter (Gast)


Lesenswert?

Ich bin genausowenig ein "Pointerverzichter" wie ein "Warmduscher"
:-)

von Khani (Gast)


Lesenswert?

Kleiner Tip aus dem Nähkästchen des Programmierers :

Die Typen int a[3] sind nicht unbedingt gleich int *a = new int[3].
Insbesondere gilt, dass die Typen

int a[3][3];

nicht gleich der folgenden Konvention

int** a = new int* [3];
for (unsigned int it=0; it<3; it++)
  a[i] = new int[3];

und schon garnicht gleich

int* a = new int [3 * 3];

sind.

Zum Thema Pointer möchte ich folegndes sagen : Es gibt jede Menge
Leute, die neutzen den lsutigen C - Stern (*) erfolgreich und nennen
ihn Pointer. Das ist auch gut so. Die meisten Leute, die im
Programmieren nicht so fit sind, tun sich bei der Array-Übergabe in
Funktionen viel einfacher und sind erschrocken, wenn ihnen ein Pointer
in Gestalt des Sterns begegnet.

Ich selbst finde man muss die explizite Benutzung von Pointern nicht
zwanghaft durch Sternchen schreiben durchführen, denn wofür hat man
denn eine höhere Programmiersprache, wenn man sie nicht benutzen mag.
In der Theorie ist jede fast jede Adressierung eine Pointer-Aktion. Die
wird einem zum Glück aber maskiert.

MfG, Khani

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.