Max Wert als Referenzparameter



  • Hallo, vllt kann mir jemand helfen und zwar will ich ein Programm schreiben, das den maximalen Wert aus einer bestimmten Anzahl an Zahlen ausgibt. Und das will ich mit einer Funktion machen, die den Referenzparameter zurückgibt. Bis jetzt habe ich das:
    (Was habe ich falsch gemacht? Iwie spuckt er mir nichts aus.)

    void *funktionmaximum(float *werte[], int *Anzahlelemente, float *maximum)
    {
    int i;

    for(i=0; i < *Anzahlelemente; i++)
    {
    printf("Wert:");
    scanf("%f", &werte[i]);

    if(*werte[i] > *maximum)
    {
    *maximum=*werte[i];
    }
    }

    }

    int main()
    {

    float wert[100];
    int anzahl;
    float maximumwert;

    printf("Anzahl der Messwerte: ");
    scanf("%d",& anzahl);
    funktionmaximum(&wert, &anzahl, &maximumwert);

    printf("maximum: %f\n", maximumwert);

    return 0;


  • Mod

    Irgendetwas sollte es schon ausgeben, sofern man die offensichtlichen Fehler, wie die fehlenden Klammern und Includes etc. korrigiert. Oder habe ich damit bereits voll ins Schwarze getroffen? Ist halt schwer zu sagen, ob solche Fehler original sind oder aufgrund der schlechten Formatierung deines Beitrags entstanden sind.

    Jedenfalls wäre folgendes Programm wenigstens compilierbar (was aber noch nicht viel heißt, siehe unten):

    #include <stdio.h>
    
    void *funktionmaximum(float *werte[], int *Anzahlelemente, float *maximum)
    {
      int i;
    
      for(i=0; i < *Anzahlelemente; i++)
        {
          printf("Wert:");
          scanf("%f", &werte);
    
          if(*werte[i] > *maximum)
            {
              *maximum=*werte[i];
            }
        }
    
    }
    
    int main()
    {
    
      float wert[100];
      int anzahl;
      float maximumwert;
    
      printf("Anzahl der Messwerte: ");
      scanf("%d",& anzahl);
      funktionmaximum(&wert, &anzahl, &maximumwert);
    
      printf("maximum: %f\n", maximumwert);
    
      return 0;
    }
    

    *Das sollte wenigstens bis zur Frage nach der Zahl der Messwerte kommen. Danach kann alles mögliche passieren, am wahrscheinlichsten so etwas wie "Segmentation Fault", "Dieses Programm funktioniert nicht mehr", etc.

    Woran liegt das? Der Compiler gibt auch schon eine Menge Hinweise, sofern man Warnungen anmacht (was man sollte):

    test.c: In function ‘funktionmaximum’:
    test.c:11:13: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘float **’ 
           scanf("%f", &werte[i]);
                 ^
    test.c: In function ‘main’:
    test.c:31:19: warning: passing argument 1 of ‘funktionmaximum’ from incompatible pointer type 
       funktionmaximum(&wert, &anzahl, &maximumwert);
                       ^
    test.c:3:7: note: expected ‘float **’ but argument is of type ‘float (*)[100]’
     void *funktionmaximum(float *werte[], int *Anzahlelemente, float *maximum)
           ^
    test.c: In function ‘funktionmaximum’:
    test.c:19:1: warning: control reaches end of non-void function 
     }
     ^
    

    Die einzelnen Meldungen sind allesamt wohl recht eindeutig. Was der Compiler nicht diagnostizieren kann (was aber auch ein Problem sein wird), ist, dass du auch fröhlich auf das uninitialisierte maximumwert zugreifst.

    Die allgemeine Schwäche deines Programms ist zweierlei:
    1. Deine Funktion macht zu viel und alles davon schlecht. Normalerweise sollte es genau umgekehrt sein. Eine Funktion hat genau eine Aufgabe, und die macht sie auch richtig. Warum sind bei dir Eingabe, Ausgabe und Maximumsuche in einer Funktion vereint? Das gehört getrennt!
    2. Du hast Pointer nicht im geringsten verstanden, siehe die vielen Warnungen oben. Der Sinn der Aufgabenstellung ist es nicht, wahllos * und & im Programm zu verteilen, bis es irgendwie compiliert. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst [i]genau* wissen, warum du wo und welches Zeichen setzt. Warum gibt deine Funktion ein void* zurück? Das ist etwas anderes als void ! Warum erwartet deine Funktion float * werte[] ? Das ist etwas anderes als float * werte oder float werte[] ! (Die beiden, die ich nannte, sind aber das gleiche). So könnte ich mit jeder Variable in deinem Programm weiter machen, ich spare es mir. Denk genau darüber nach, wo du warum welchen Datentyp brauchst und wie jeweils die Syntax dafür lautet!

    Wenn du diese beiden Dinge bedenkst, ganz besonders den ersten Punkt, dann erledigen sich die oben bemängelten Warnungen und Fehler ganz von alleine. Ich würde daher dazu raten, die Punkte 1 und 2 zu beachten und damit noch einmal neu zu beginnen, anstatt zu versuchen, Stück für Stück die Fehler im jetzigen Programm zu reparieren. Das jetzige Programm ist einfach strukturell kaputt, das Beheben einzelner Fehler bringt da nichts. Es sind nur 40 Zeilen, es ist nicht schade, diese weg zu werfen. Du wirst im Leben noch sehr viel längere Programme/Texte komplett über den Haufen werfen.

    PS: Und falls du die Compilerwarnung bezüglich inkompatibler Pointer nicht verstehst: Ein Array ist kein Zeiger und ein Zeiger ist kein Array! Und deswegen ist ein Zeiger auf ein Array (z.B. dein &wert ) erst recht etwas ganz anderes als ein Zeiger auf einen Zeiger (z.B. dein float *werte[] )!
    PPS: Du merkst hoffentlich selber, wie doof "wert" als Bezeichner für ein Feld von werten ist.



  • becki345 schrieb:

    vllt kann mir jemand helfen

    Das bezweifele ich, du könntest dir nur selbst helfen in dem du dir erst mal die Grundlagen erarbeitest, sprich Sytnax, Datentypen, Pointer etc.

    becki345 schrieb:

    Was habe ich falsch gemacht?

    So ziemlich alles, weil es dir so ziemlich an allem fehlt. Deine nicht vorhandene Formatierung macht es dann nochmal schlechter.

    Nur mal ein Beispiel:

    void *funktionmaximum(float *werte[], int *Anzahlelemente, float *maximum
    

    Was um Himmels Willen soll das denn bitte?!


  • Mod

    Donald_Pfund schrieb:

    becki345 schrieb:

    vllt kann mir jemand helfen

    Das bezweifele ich, du könntest dir nur selbst helfen in dem du dir erst mal die Grundlagen erarbeitest, sprich Sytnax, Datentypen, Pointer etc.

    becki345 schrieb:

    Was habe ich falsch gemacht?

    So ziemlich alles, weil es dir so ziemlich an allem fehlt. Deine nicht vorhandene Formatierung macht es dann nochmal schlechter.

    Nur mal ein Beispiel:

    void *funktionmaximum(float *werte[], int *Anzahlelemente, float *maximum
    

    Was um Himmels Willen soll das denn bitte?!

    https://xkcd.com/1053/


Anmelden zum Antworten