Forum: Mikrocontroller und Digitale Elektronik Rückgabewert einer Funktion


von Schraubt G. (g-schraubt)


Lesenswert?

Hallo Freunde!
Ich bin gerade etwas am Verzweifeln.
Mein Ziel ist es ein Array zu sortieren (funktioniert bereits und lässt 
sich auch sortiert über ein LCD anzeigen) und dann aus diesem sortiertem 
Array den größten Wert anzeigen. jedoch klappt das nicht wie gewünscht.
Kann mir jemand sagen, was ich hierbei falsch mache?
Schöne Grüße!

hier mein bereits gekürztes Projekt:
1
#include <avr/io.h>
2
#include <stdio.h>
3
4
//aufsteigend sortieren (funktioniert wie gewollt)
5
char sortiere (char zahlen[], uint8_t anzahl)
6
{
7
  uint8_t i = 0, j = 0, tmp;
8
  
9
  for (i = 0; i < anzahl; i++) {
10
    for (j = 0; j < anzahl - i -1; j++) {
11
      if (zahlen[j] > zahlen[j + 1]) {
12
        tmp = zahlen[j];
13
        zahlen[j] = zahlen[j + 1];
14
        zahlen[j + 1] = tmp;
15
      }
16
    }
17
  }
18
}
19
20
//den letzten wert vom array auf max_wert schreiben
21
uint8_t finde_max_wert (char zahlen[], uint8_t max_wert)
22
{
23
  max_wert = zahlen[4];
24
  return max_wert;
25
}
26
27
28
29
int main(void)
30
{
31
    uint8_t anzahl = 5;
32
  uint8_t max_wert = 0;
33
  
34
  char zahlen[]= {1, 12, 23, 12, 4};
35
36
  sortiere(zahlen,anzahl);
37
  
38
  finde_max_wert (zahlen,max_wert);
39
40
41
//xxxxxx__Ausgabe am LCD__xxxxxx
42
char erstezeile[16];
43
sprintf(erstezeile, "%d",max_wert);
44
LCDTEXT(erstezeile, 1, 1);
45
46
    while (1) 
47
    {
48
    }
49
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Schraubt G. schrieb:
> //aufsteigend sortieren (funktioniert wie gewollt)
> char sortiere (char zahlen[], uint8_t anzahl)

Diese Funktion ist zwar so deklariert, als würde sie etwas vom Typ 
"char" zurückgeben, sie tut es aber nicht -- nirgendwo in ihr taucht das 
Schlüsselwort "return" auf.

Dein Compiler sollte deswegen mindestens eine Warnung ausgeben.

> uint8_t finde_max_wert (char zahlen[], uint8_t max_wert)

Diese Funktion gibt zwar einen Wert zurück, den aber wirfst Du beim 
Aufruf der Funktion unbesehen weg. Obendrein verwirrst Du Dich selbst, 
indem Du ein und den selben Variablennamen innerhalb und außerhalb der 
Funktion verwendest.

von Dirk B. (dirkb2)


Lesenswert?

Der Rückgabewert einer Funktion wird mit return zurück gegeben.

Dieser muss allerdings auch verarbeitet (Zuweisung) werden.

C kennt bei Funktionsaufrufen nur call -by-value

Beitrag #5782005 wurde von einem Moderator gelöscht.
von Mick (Gast)


Lesenswert?

Dein Sortieralgorithmus funktioniert so nicht. Der gibt nämlich 
folgendes zurück:
1
0
2
1
3
4
4
12
5
12

von Schraubt G. (g-schraubt)


Lesenswert?

Hallo Rufus, Danke für deine Antwort.

wenn ich jetzt das sortierte Array "zahlen" in meiner Funktion mittels 
"return zahlen;" zurückgebe ist es jetzt auch außerhalb der Funktion 
sortiert gespeichert. -richtig?
denn wenn ich es am LCD ausgebe, wird es auch sortiert ausgegeben.

woran liegt es, dass der return-Wert weggeworfen wird?
diesen Teil verstehe ich nicht. Der Inhalt des 4. Feldes vom Array 
"zahlen" sollte jetzt doch der Variable max_wert zugewiesen sein oder 
irre ich mich?

Schöne Grüße und schonmal Danke für die Antwort

von zitter_ned_aso (Gast)


Lesenswert?

warum nicht einfach beim gleichen Datentyp bleiben? (statt char und 
uint... zu mischen)

von c-hater (Gast)


Lesenswert?

Schraubt G. schrieb:

> Mein Ziel ist es ein Array zu sortieren (funktioniert bereits

Nicht wirklich. Das ist ein FALSCH implementiertes Bubble-Sort. Nur 
unter gewissen günstigen Umständen liefert es das gewünschte Resultat.

->Lerne Programmieren. Ja, man darf dazu auch fremde Quelltexte lesen. 
Ich würde mal grob schätzen, dass es 10^4..10^5 Quelltexte im Internet 
gibt, die ein Bubble-Sort korrekt umsetzen. Allerdings wohl auch kaum 
eine Größenordnung weniger, die es falsch umsetzen.

Damit du unterscheiden kannst, was richtig und was falsch ist, musst du 
wohl am Ende doch verstehen lernen, wie der (korrekte) Algorithmus 
funktioniert...

von zitter_ned_aso (Gast)


Lesenswert?

Bei Funktion "sortieren" kannst du ruhig "void" als Rückgabetyp nehmen.


Dein Originalarray wird ja in der Runktion verändert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Schraubt G. schrieb:
> wenn ich jetzt das sortierte Array "zahlen" in meiner Funktion mittels
> "return zahlen;" zurückgebe ist es jetzt auch außerhalb der Funktion
> sortiert gespeichert. -richtig?

Das Array existiert nur einmal, außerhalb Deiner Sortierfunktion. Der 
wird nur ein Pointer auf das Array übergeben, auch wenn Du dort die 
Array-Notation verwendet hast.

Es ist also überflüssig, hier das Array zurückzugeben.

Dein Sortierfunktion muss vielleicht einfach --- gar nichts zurückgeben?

Dann solltest Du sie so deklarieren, daß sie "void", also nichts, 
zurückgibt.

Schraubt G. schrieb:
> woran liegt es, dass der return-Wert weggeworfen wird?

Eine Funktion gibt einen Wert zurück, der an der Stelle des Aufrufers 
verarbeitet werden muss, z.B. mit einer Zuweisung. Das aber machst Du 
nicht.

Ein Beispiel:
1
int funktion(void)
2
{
3
  return 37;
4
}
5
6
void main(void)
7
{
8
  funktion();
9
}

Mit der von der Funktion zurückgebenen 37 passiert nichts.

Und genauso sieht Dein Aufruf von "finde_max_wert" aus.

Damit mein Beispiel etwas weniger sinnlos ist, kann es so abgeändert 
werden:
1
void main(void)
2
{
3
  int ergebnis;
4
5
  ergebnis = funktion();
6
}

Und schon steht in "ergebnis" das drin, was die Funktion zurückgegeben 
hat.


--

All' das ist elementares C und steht in den ersten Kapiteln jedes 
ernstzunehmenden Buches über die Sprache drin, es wird auch in den 
ersten paar Lehrveranstaltungen in egal welchen Lehreinrichtungen 
vermittelt.

von Schraubt G. (g-schraubt)


Lesenswert?

c-hater schrieb:
> Schraubt G. schrieb:
>
>> Mein Ziel ist es ein Array zu sortieren (funktioniert bereits
>
> Nicht wirklich. Das ist ein FALSCH implementiertes Bubble-Sort. Nur
> unter gewissen günstigen Umständen liefert es das gewünschte Resultat.
>
> ->Lerne Programmieren. Ja, man darf dazu auch fremde Quelltexte lesen.
> Ich würde mal grob schätzen, dass es 10^4..10^5 Quelltexte im Internet
> gibt, die ein Bubble-Sort korrekt umsetzen. Allerdings wohl auch kaum
> eine Größenordnung weniger, die es falsch umsetzen.
>
> Damit du unterscheiden kannst, was richtig und was falsch ist, musst du
> wohl am Ende doch verstehen lernen, wie der (korrekte) Algorithmus
> funktioniert...

Danke dir! Ich werde mir diesen Teil nochmal genauer ansehen. Ich habe 
ihn aus einem anderen Projekt von mir, welches funktionierte -Machte bis 
heute keine Probleme. Aber ich sehe es mir an. Danke!

von zitter_ned_aso (Gast)


Lesenswert?

Schraubt G. schrieb:
> uint8_t finde_max_wert (char zahlen[], uint8_t max_wert)
> {
>   max_wert = zahlen[4];
>   return max_wert;
> }



Was machst du da mit dem zweiten Parameter? Im Prinzip würde auch
1
return zahlen[4];
reichen. Aber wozu?

Wenn Array (aufsteigend) sortiert ist und du die Länge des Array kennst, 
dann brauchst du keine solche Funktion.

Außerdem ist der Name der Funktion irritierend. Da wird kein max. Wert 
gesucht, sondert das 4. Arrayelement zurückgegeben.

von Schraubt G. (g-schraubt)


Lesenswert?

Besser hätte man es nicht erklären können! Danke!
Ich hatte da wohl eine dummen Verständnisfehler.

von Dirk B. (dirkb2)


Lesenswert?

Für den Maximalwert muss man das Array nicht sortieren.

Einmal durchsuchen reicht aus.

von Schraubt G. (g-schraubt)


Lesenswert?

zitter_ned_aso schrieb:
> Schraubt G. schrieb:
>> uint8_t finde_max_wert (char zahlen[], uint8_t max_wert)
>> {
>>   max_wert = zahlen[4];
>>   return max_wert;
>> }
>
>
>
> Was machst du da mit dem zweiten Parameter? Im Prinzip würde auch
>
1
> return zahlen[4];
2
>
> reichen. Aber wozu?
>
> Wenn Array (aufsteigend) sortiert ist und du die Länge des Array kennst,
> dann brauchst du keine solche Funktion.
>
> Außerdem ist der Name der Funktion irritierend. Da wird kein max. Wert
> gesucht, sondert das 4. Arrayelement zurückgegeben.


Da hast du vollkommen recht. Ich hätte mich besser ausdrücken müssen. 
Das hier ist nur ein kleiner Teil von meinem Projekt. in der Funktion 
finde_max_wert wird im "richtigen" Projekt sehrwohl der Maximalwert 
ermittelt. Dieser muss jedoch bestimte Bedingungn erfüllen um als 
Maximalwert gültig gemacht zu werden.  das
1
return zahlen[4];
sollte natürlich auch nur als Beispiel dienen.

Schöne Grüße

von Schraubt G. (g-schraubt)


Lesenswert?

Dirk B. schrieb:
> Für den Maximalwert muss man das Array nicht sortieren.
>
> Einmal durchsuchen reicht aus.

Hallo Dirk,
habe vergessen zu erwähnen dass dies nur eine kleiner Teil eines anderen 
Projektes ist. Im "richtigen" Projekt wird unteranderem noch ermittelt 
wie oft Welche Zahl vorkommt usw. Das hier diente nur als Beispiel.

LG

von Yalu X. (yalu) (Moderator)


Lesenswert?

c-hater schrieb:
> Nicht wirklich. Das ist ein FALSCH implementiertes Bubble-Sort. Nur
> unter gewissen günstigen Umständen liefert es das gewünschte Resultat.

Dann nenne doch mal ein Beispiel für einen ungünstigen Umstand.

von c-hater (Gast)


Lesenswert?

Schraubt G. schrieb:

> Danke dir! Ich werde mir diesen Teil nochmal genauer ansehen. Ich habe
> ihn aus einem anderen Projekt von mir, welches funktionierte

...welches bestenfalls scheinbar funktionierte. Wenn überhaupt, dann 
weil halt dort wohl die besonderen Umstände gegeben waren, unter denen 
es das gewünschte Resultat liefern konnte...

Sehr viel wahrscheinlicher ist aber: Niemand hat je bemerkt, dass da 
Müll rauskommt, weil es niemals systematisch getestet wurde...

Beitrag #5782085 wurde von einem Moderator gelöscht.
von Schraubt G. (g-schraubt)


Lesenswert?

Kai k. schrieb im Beitrag #5782085:
> oje...der Fehler ist offensichtlich..schau mal
> #include <avr/io.h>
> #include <stdio.h>
>
> das klingt mega nach C..
> Der Fehler: falsche Programmiersprache..damit passiert sowas sehr
> schnell

Hallo Kai,
was stimmt deiner Meinung nach hierbei nicht bzw. was ist das Problem?
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kai k. schrieb im Beitrag #5782085:
> Der Fehler: falsche Programmiersprache..

Der eine Programmiersprachentroll in diesem Thread reicht.

von Skeptiker (Gast)


Lesenswert?

Der Bubble-Sort ist korrekt programmiert. Wo soll das Problem sein?

von Stefan F. (Gast)


Lesenswert?

Quick Sort ist bei größeren Arrays viel schneller und nicht viel 
komplizierter. Schau dir den Algorithmus mal an, nachden dein aktuelles 
Problen gelöst ist.

von Schraubt G. (g-schraubt)


Lesenswert?

Stefanus F. schrieb:
> Quick Sort ist bei größeren Arrays viel schneller und nicht viel
> komplizierter. Schau dir den Algorithmus mal an, nachden dein aktuelles
> Problen gelöst ist.

Das aktuelle Problem ist gelöst!
Danke für deinen Tip. Von Quick Sort habe ich noch nichts gehört. Werde 
mich mal schlau machen (:

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
> Quick Sort ist bei größeren Arrays viel schneller und nicht viel
> komplizierter. Schau dir den Algorithmus mal an, nachden dein aktuelles
> Problen gelöst ist.

Und auf Systemen mit kleinem Stack nicht unbedingt die cleverste Idee.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Schraubt G. schrieb:
> Danke für deinen Tip. Von Quick Sort habe ich noch nichts gehört.

Die gibt es bereits fix und fertig in der C-Standardbibliothek:

  https://linux.die.net/man/3/qsort

Skeptiker schrieb:
> Der Bubble-Sort ist korrekt programmiert. Wo soll das Problem sein?

Ich glaube, das Hauptproblem ist, dass einer, der C abgrundtief hasst,
es unmöglich beherrschen kann :)

Auf meine Aufforderung weiter oben kam (evtl. genau aus diesem Grund)
noch keine Antwort:

Yalu X. schrieb:
> c-hater schrieb:
>> Nicht wirklich. Das ist ein FALSCH implementiertes Bubble-Sort. Nur
>> unter gewissen günstigen Umständen liefert es das gewünschte Resultat.
>
> Dann nenne doch mal ein Beispiel für einen ungünstigen Umstand.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Naja, ich würde i nur bis kleiner Anzahl - 1 laufen lassen...

Beitrag #5782475 wurde von einem Moderator gelöscht.
Beitrag #5782495 wurde von einem Moderator gelöscht.
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.