www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rückgabe einer Funktion


Autor: Andreas I2C-Team (Gast)
Datum:

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

Autor: Khani (Gast)
Datum:

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

Autor: Andreas I2C-Team (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deine lösung, hat wunderbar geklappt!!
thxs

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du dich über komisches Verhalten wunderst:

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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem arbeitet die Funktion nunmehr erfolgreich mit Pointern. :-)

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Mike (Gast)
Datum:

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

thx mike..

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Anhang


Peter

Autor: Khani (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin genausowenig ein "Pointerverzichter" wie ein "Warmduscher"
:-)

Autor: Khani (Gast)
Datum:

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

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.