Rückgabewert einer Funktion

#5781983
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
}
Persönliche Seite #5781999
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.
Beitrag #5782005 wurde von einem Moderator gelöscht.
#5782021
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
Gast #5782041
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...
Persönliche Seite #5782049
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.
#5782050
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!
Gast #5782053
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.
#5782065
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
#5782068
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
Gast #5782081
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.
Moderator #5782200
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.
Beitrag #5782475 wurde von einem Moderator gelöscht.
Beitrag #5782495 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren