Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!



  • Hi(gh)!

    Ich verstehe nicht, was da los ist - mit einem Mal schreibt mein Klimaprogramm statt der eingegebenen Jahreszahlen für Beginn und Ende der zugrundeliegenden Klimaperiode (Eintrag.cperiod_first, Eintrag.cperiod_last) grundsätzlich "0" in die Datei! Ich verstehe das nicht!

    Hier ist der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define DIM 12
    #define bool char
    #define true 1
    #define false 0
    
    typedef struct 
    {
      char station[30];
      char land[30];
      char region[30];
      char latitude[11];
      char longitude[12];
      short int hoehe;
      short int cperiod_first;
      short int cperiod_last;
      float temperatur[DIM];
      float niederschlag[DIM];
      float tempmittel;
      float niedsumme;
      char formula[4];
      char quelle[60];
    } Klimadatensatz;
    
    
    void input(float* daten, const char* typ, char mon[][10])
    {
      unsigned short i;
      for (i=0; i<DIM; i++)
      {  
        printf("\n%s für %s: ", typ, mon[i]);
        scanf("%f", daten++);
        getchar();
      }
    }
    
    void display(Klimadatensatz *Eintrag, char mon[][10])
    {
      unsigned char i;
      
      printf("\nStation: %s", Eintrag->station);
      printf("\nLand: %s", Eintrag->land);
      printf("\nRegion: %s", Eintrag->region);
      printf("\nBreite: %s", Eintrag->latitude);
      printf("\nLänge: %s", Eintrag->longitude);
      printf("\nHöhe: %d", Eintrag->hoehe);
      printf("\nKlimaperiode: ");
      if (Eintrag->cperiod_first == 0 || Eintrag->cperiod_last == 0)
        printf("unbekannt\n");
      else
        printf("%d-%d\n", Eintrag->cperiod_first, Eintrag->cperiod_last);
      for (i=0; i<DIM; i++)
        printf("\nTemperaturmittel für %s: %2.1f", mon[i], Eintrag->temperatur[i]);
      printf("\n");
      for (i=0; i<DIM; i++)
        printf("\nNiederschlagsmittel für %s: %2.1f", mon[i], Eintrag->niederschlag[i]);
      printf("\n");
      printf("\nJahres-Temperaturmittel: %2.1f", Eintrag->tempmittel);
      printf("\nJahres-Niederschlagssumme: %2.1f\n", Eintrag->niedsumme);
      printf("\nKlimaformel nach Köppen und Geiger: %s\n", Eintrag->formula);
      printf("\nQuelle: %s\n", Eintrag->quelle);
      
    }
    
    
    
    void displayaslist(Klimadatensatz*);
    char* koeppen_geiger(Klimadatensatz*);
    bool schreibe(Klimadatensatz*);
    bool lese(char*, Klimadatensatz*);
    unsigned char checkentry(char*, char*, short int, short int, Klimadatensatz*);
    bool showall(Klimadatensatz*);
    
    int main(void)
    {
      
      Klimadatensatz Eintrag, Eingabe;
    
      char f, r;
      char monate[DIM][10]={ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };  
      
      do
      {
        // system("clear");
        printf("              -----------------------------------------\n");
        printf("              | 1 - Datensatz laden und anzeigen      |\n");
        printf("              | 2 - Datensatz eingeben und speichern  |\n");
        printf("              | 5 - Alle Datensätze anzeigen          |\n");    
        printf("              | x - Programm beenden                  |\n");
        printf("              -----------------------------------------\n\n");
        printf("Funktion: ");
        f=getchar();
        getchar();
        switch(f)
        {
          case '1':
    	printf("\nName der Wetterstation: ");
            fgets(Eingabe.station,30,stdin);
    	Eingabe.station[strlen(Eingabe.station)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben	
            if (lese(Eingabe.station, &Eintrag) == true)
    	  display(&Eintrag, monate);
    	printf("\nMit <Return> zurück zum Menü\n");
    	getchar();
          break;
          case '2':
            printf("\nName der Wetterstation: ");
    	fgets(Eingabe.station,30,stdin);
    	Eingabe.station[strlen(Eingabe.station)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	printf("\nLand: ");
    	fgets(Eingabe.land,30,stdin);
    	Eingabe.land[strlen(Eingabe.land)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	printf("\nRegion: ");
    	fgets(Eingabe.region,30,stdin);
    	Eingabe.region[strlen(Eingabe.region)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	printf("\nKlimaperiode Beginn (unbekannt = 0): ");
            scanf("%d",&Eingabe.cperiod_first);
            printf("\n%d", Eingabe.cperiod_first);
    	printf("\nKlimaperiode Ende (unbekannt = 0): ");
            scanf("%d",&Eingabe.cperiod_last);
    	printf("\n%d", Eingabe.cperiod_last);
    	if (checkentry(Eingabe.station, Eingabe.land, Eingabe.cperiod_first, Eingabe.cperiod_last, &Eintrag) < 2)
    	  return 1;
    	printf("\nGeographische Breite (Grad°Minuten'Sekunden\"; Süd = negativ): ");
            scanf("%s", Eingabe.latitude);
    	printf("\nGeographische Länge (Grad°Minuten'Sekunden\"; West = negativ): ");
            scanf("%s", Eingabe.longitude);
    	printf("\nHöhe über dem Meeresspiegel (Meter): ");
            scanf("%d", &Eingabe.hoehe);
            input(Eingabe.temperatur, "Temperatur", monate);
            input(Eingabe.niederschlag, "Niederschlag", monate);
    	printf("\nQuelle: ");
    	fgets(Eingabe.quelle,60,stdin);
    	Eingabe.quelle[strlen(Eingabe.quelle)-1]='\0';
            strcpy(Eingabe.formula, koeppen_geiger(&Eingabe));
            printf("\n\nKlimaformel nach Köppen und Geiger: %s\n", Eingabe.formula);
    	schreibe(&Eingabe);
    	printf("\nDaten wurden gespeichert - mit <Return> zurück zum Menü\n");
    	getchar();
          break;
          case '5':
    	showall(&Eintrag);
          break;
          case 'x':
            return 0;
          break;
        }
      }   
      while(1);
    }
    
    
    
    char* koeppen_geiger(Klimadatensatz* Eingabe)
    {
      char winter[3];
      char summer[3];
      char warmhalf[6];
      float highest_temp=Eingabe->temperatur[0];
      float lowest_temp=Eingabe->temperatur[0];
      float avg_temp;
      float temp_sum=0;
      float avg_prec;
      float prec_sum=0;
      float warmhalf_prec_sum=0;
      float highest_prec_summer;
      float highest_prec_winter;
      float lowest_prec_winter;
      float lowest_prec_summer;
      float lowest_prec=Eingabe->niederschlag[0];
      float prec_ratio, prec_ratio2;
      float arid_threshold;
      unsigned short arid_add;
      char above10=0;
      unsigned char i;
      
      if (Eingabe->latitude[0]=='-')
      {
        winter[0]=5;
        winter[1]=6;
        winter[2]=7;
        summer[0]=11;
        summer[1]=0;
        summer[2]=1;
        warmhalf[0]=9;
        warmhalf[1]=10;
        warmhalf[2]=11;
        warmhalf[3]=0;
        warmhalf[4]=1;
        warmhalf[5]=2;
      }
      else
      {
        winter[0]=11;
        winter[1]=0;
        winter[2]=1;
        summer[0]=5;
        summer[1]=6;
        summer[2]=7;
        warmhalf[0]=3;
        warmhalf[1]=4;
        warmhalf[2]=5;
        warmhalf[3]=6;
        warmhalf[4]=7;
        warmhalf[5]=8;
      }
      
      
      for (i=0; i<DIM; i++)
      {
        temp_sum += Eingabe->temperatur[i];  
        prec_sum += Eingabe->niederschlag[i];
        if (Eingabe->temperatur[i] > highest_temp)
          highest_temp = Eingabe->temperatur[i];
        if (Eingabe->temperatur[i] < lowest_temp)
          lowest_temp = Eingabe->temperatur[i];
        if (Eingabe->niederschlag[i] < lowest_prec)
          lowest_prec = Eingabe->niederschlag[i];
        if (Eingabe->temperatur[i] > 10)
          above10++;  
      }
        
      avg_temp = temp_sum/DIM;
      avg_prec = prec_sum/DIM;
      
      Eingabe->tempmittel = avg_temp;
      Eingabe->niedsumme = prec_sum;
      
      if (highest_temp < 10)  // Tundren- und Eisklimate (E)
      {
         Eingabe->formula[0]='E';
         if (highest_temp > 0)
           Eingabe->formula[1]='T';
         else
           Eingabe->formula[1]='F';
         Eingabe->formula[2]='\0'; // Stringende-NULL
      }
      else // A-, B-, C- und D-Klimate
      {
        for (i=0; i<6; i++) // Berechnung der Ariditätsschwelle
          warmhalf_prec_sum += Eingabe->niederschlag[warmhalf[i]];
        prec_ratio = warmhalf_prec_sum/prec_sum;
        if (prec_ratio >= 0.7)
          arid_add = 280;
        else if (prec_ratio >= 0.3)
          arid_add = 140;
        else
          arid_add = 0;
        arid_threshold = avg_temp * 20 + arid_add;
        if (arid_threshold <= 0)
          prec_ratio = 1; // trockene subarktische und polare Klimate gelten nicht als B-Klimate!
        else  
          prec_ratio = prec_sum/arid_threshold;
        if (prec_ratio < 1) // Trockenklimate (B)
        {
          Eingabe->formula[0]='B';
          if (avg_temp >= 18)
            Eingabe->formula[2]='h';
          else
            Eingabe->formula[2]='k';
          if (prec_ratio < 0.5)
            Eingabe->formula[1]='W';
          else
            Eingabe->formula[1]='S';
          Eingabe->formula[3]='\0'; // Stringende-NULL 
        }
        else // A-, C- und D-Klimate
        {
          if (lowest_temp >= 18) // Tropische Klimate (A)
          {
    	Eingabe->formula[0]='A';
    	if (lowest_prec >= 60) 
    	  Eingabe->formula[1]='f'; // Tropisches Regenwaldklima (Af)
    	else
    	{
    	  prec_ratio = lowest_prec / prec_sum;
    	  if (prec_ratio >= 0.04)
    	    Eingabe->formula[1]='m'; // Monsunklima (Am) 
    	  else
    	    Eingabe->formula[1]='w'; // Savannenklima (Aw)
    	}
    	Eingabe->formula[2]='\0'; // Stringende-NULL
          }
          else // C- und D-Klimate
          {
    	lowest_prec_winter = Eingabe->niederschlag[winter[0]];
    	highest_prec_winter = Eingabe->niederschlag[winter[0]];
    	lowest_prec_summer = Eingabe->niederschlag[summer[0]];
    	highest_prec_summer = Eingabe->niederschlag[summer[0]];
    	
    	for (i=1; i<3; i++)
    	{
    	  if (Eingabe->niederschlag[winter[i]] < lowest_prec_winter)
    	    lowest_prec_winter = Eingabe->niederschlag[winter[i]];
    	  if (Eingabe->niederschlag[winter[i]] > highest_prec_winter)
    	    highest_prec_winter = Eingabe->niederschlag[winter[i]];
    	  if (Eingabe->niederschlag[summer[i]] < lowest_prec_summer)
    	    lowest_prec_summer = Eingabe->niederschlag[summer[i]];
    	  if (Eingabe->niederschlag[summer[i]] > highest_prec_summer)
    	    highest_prec_summer = Eingabe->niederschlag[summer[i]];
    	}  
    	
    	prec_ratio = highest_prec_summer / lowest_prec_winter;
    	prec_ratio2 = highest_prec_winter / lowest_prec_summer;
    	if (prec_ratio >= 10)
    	  Eingabe->formula[1]='w'; // wintertrockene gemäßigte oder kontinentale Klimate
    	else if (prec_ratio2 >= 3 && lowest_prec_summer < 30)    
    	  Eingabe->formula[1]='s'; // sommertrockene gemäßigte oder kontinentale Klimate
    	else
    	  Eingabe->formula[1]='f'; // feuchte gemäßigte oder kontinentale Klimate
    	  
    	if (highest_temp >= 22)
    	  Eingabe->formula[2]='a'; // heiße Sommer
    	else if (above10 >= 4)
    	{  
    	  Eingabe->formula[2]='b'; // warme Sommer
    	  if (lowest_temp >= 10) // hochozeanisch, sehr milde Winter (z. B. Tristan da Cunha, Neu-Amsterdam)
    	  {
    	    Eingabe->formula[2]='l';
    	  }
    	}
    	else
    	  Eingabe->formula[2]='c'; // kühle Sommer
    	
    	if (lowest_temp <= -3) // kontinentale Klimate (D)
    	{
    	  Eingabe->formula[0]='D';
    	  if (lowest_temp <= -38)
    	    Eingabe->formula[2]='d';
    	}
    	else
    	  Eingabe->formula[0]='C'; // gemäßigte Klimate (C)
           
           	Eingabe->formula[3]='\0'; // Stringende-NULL
          } 	
        }
      }  
      printf("\nTemperatur:\n");
      printf("\nNiedrigstes Monatsmittel: %2.1f°C", lowest_temp);
      printf("\nHöchstes Monatsmittel:    %2.1f°C", highest_temp);
      printf("\nJahresmittel:             %2.1f°C", avg_temp);
      printf("\n\n");
      printf("\nNiederschlag:\n");
      printf("\nNiedrigstes Monatsmittel: %2.1f mm", lowest_prec);
      printf("\nJahressumme:              %2.1f mm", prec_sum);
      printf("\nAriditätsschwelle:        %2.1f mm", arid_threshold);
      if (Eingabe->formula[0]=='A')
        printf("\nVerhältnis Niederschlag\nSommerhalbjahr/Gesamt:    %2.2f", prec_ratio);
      else if (Eingabe->formula[0]=='B')
        printf("\nVerhältnis Niederschlag/Ariditätsschwelle:    %2.2f", prec_ratio);
      else if (Eingabe->formula[0]=='C' || Eingabe->formula[0]=='D')
      {
        printf("\nVerhältnis feuchtester Sommermonat/trockenster Wintermonat:    %2.2f", prec_ratio);
        printf("\nVerhältnis feuchtester Wintermonat/trockenster Sommermonat:    %2.2f", prec_ratio2);
      }
      
      return Eingabe->formula;
    }
    
    // int write(float* temp, float* prec, char* stat, char* period, const char* lat, char* formula)
    bool schreibe(Klimadatensatz* Eingabe)
    {
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "ab+"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {  
        printf("\nDatei kann nicht geschrieben werden!");
        return false;
      }
      
      if (fwrite(Eingabe, sizeof(*Eingabe), 1, fp) < 1)
      {
        printf("Datensatz kann nicht geschrieben werden!\n");
        return false;
      }
     
      if (fclose(fp) == EOF)
      {  
        printf("\nDatei kann nicht geschlossen werden!");
        return false;
      }
    }    
    
    bool lese(char* station, Klimadatensatz* Eintrag)
    {
      bool found=false;
     
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {  
        printf("\nDatei kann nicht geöffnet werden!");
        return false;
      }
      
      printf("\nStation: %s\n", station);
      
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1)
      {
        if (strcmp(Eintrag->station, station) == 0)
        {  
          found = true;
          break;
        }
      }
       
      if (found == false)
      {
        printf("\nZu dieser Station existiert kein Eintrag!\n");
        return false;
      }
      
      return true;
    }
    
    bool showall(Klimadatensatz* Eintrag)
    {
      char i; // Zählvariable
      
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {  
        printf("\nDatei kann nicht geöffnet werden!");
        return false;
      }
    
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1 && fp)
      {
        displayaslist(Eintrag);
      }
      printf("\n");
      
      return true;
    }
    
    void displayaslist(Klimadatensatz* Eintrag)
    {
      printf("%s|%s|%s|%s|%s|%d m|",Eintrag->station, Eintrag->land, Eintrag->region, Eintrag->latitude, Eintrag->longitude, Eintrag->hoehe);
      if (Eintrag->cperiod_first == 0 || Eintrag->cperiod_last == 0)
        printf("unbekannt");
      else
        printf("%d-%d", Eintrag->cperiod_first, Eintrag->cperiod_last);
      printf("|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f°C|%2.1f mm|%s|%s\n", Eintrag->temperatur[0], Eintrag->temperatur[1], Eintrag->temperatur[2], Eintrag->temperatur[3], Eintrag->temperatur[4], Eintrag->temperatur[5], Eintrag->temperatur[6], Eintrag->temperatur[7], Eintrag->temperatur[8], Eintrag->temperatur[9], Eintrag->temperatur[10], Eintrag->temperatur[11], Eintrag->niederschlag[0], Eintrag->niederschlag[1], Eintrag->niederschlag[2], Eintrag->niederschlag[3], Eintrag->niederschlag[4], Eintrag->niederschlag[5], Eintrag->niederschlag[6], Eintrag->niederschlag[7], Eintrag->niederschlag[8], Eintrag->niederschlag[9], Eintrag->niederschlag[10], Eintrag->niederschlag[11], Eintrag->tempmittel, Eintrag->niedsumme, Eintrag->formula, Eintrag->quelle);
    }
    
    unsigned char checkentry(char* station, char* country, short int kp_anfang, short int kp_ende, Klimadatensatz* Eintrag)
    {
      /* Rückgabewerte:
       * 0: Lesevorgang fehlgeschlagen
       * 1: Eintrag existiert bereits
       * 2: Eintrag ist neu */
      
      unsigned char match=2;
      
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {  
        printf("\nDatei kann nicht geöffnet werden!");
        return 0;
      }
      
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1 && fp)
      {
        if (strcmp(Eintrag->station, station) == 0 && strcmp(Eintrag->land, country) == 0 && kp_anfang == Eintrag->cperiod_first && kp_ende == Eintrag->cperiod_last)    
        {  
          match = 1;
          printf("\nEin Eintrag für diese Station und Klimaperiode existiert bereits!\n");
          break;
        }
      }
      
      return match;
    }
    
    

    Bis bald im Khyberspace!

    Yadgar



  • @yadgar

    mit einem Mal

    Wird wohl eher die letzte Änderung gewesen sein. Guter Kandidat für so etwas: du schreibst über das Ende eines Strings.



  • @manni66 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @yadgar

    mit einem Mal

    Wird wohl eher die letzte Änderung gewesen sein. Guter Kandidat für so etwas: du schreibst über das Ende eines Strings.

    Aber wo? Ich protokolliere auch normalerweise meine Änderungen nicht - denn dann käme ich vor lauter Protokollieren nicht mehr zum Programmieren und Testen!



  • @yadgar

    Der Fehler trat auf, nachdem ich in der Eingaberoutine (innerhalb von main(), keine eigene Funktion) die Eingaben von Beginn und Ende der Klimaperiode (jeweils unsigned short, fehlende Daten werden mit numerisch 0 kodiert) vor die beiden Eingaben für geographische Länge und Breite, aber nach den Eingaben für Land und Region (diese beiden mit fgets(), da Whitespaces enthalten sein können) platzierte. Ursprünglich erfolgten die Eingaben von Beginn und Ende der Klimaperiode erst nach den geographischen Koordinaten; da ich inzwischen eine Funktion zur Erkennung von doppelt eingegebenen Datensätzen programmiert hatte (Kriterium: gleicher Stationsname, gleiches Land und gleicher Beginn und Ende der Klimaperiode) wollte ich aus Gründen der Benutzerfreundlichkeit die für diese Dubletten-Erkennung relevanten Daten möglichst am Anfang der Eingaberoutine eingeben... inzwischen habe ich die Eingaben für die Klimaperiode wieder an ihren ursprünglichen Platz gesetzt, und jetzt werden die Jahreszahlen auch wieder korrekt geschrieben... merkwürdig!



  • Debugger benutzen

    PS:
    Funktionen dürfen auch kürzer als 100 Zeilen sein. Macht die Fehlersuche auch einfacher.



  • @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Ich protokolliere auch normalerweise meine Änderungen nicht

    Vllt. solltest du dir mal ein Version Control System, wie z.B. git anschauen und benutzen?!

    Und wenn ich mir deine anderen Beiträge so anschaue, scheint C nicht die richtige Sprache für dich zu sein.
    Für so (kleine) Programme könntest du evtl. leichtgewichtigere Sprachen wie C#, Java oder Python benutzen (da brauchst du dich i.d.R. nicht mit Speicherverwaltung auseinander zu setzen und kannst dich ganz auf den logischen Teil des Programms konzentrieren).



  • Achte doch endlich mal auf Warnungen.
    Schalte auch den Warnlevel auf Maximum.

    @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    die Eingaben von Beginn und Ende der Klimaperiode (jeweils unsigned short, fehlende Daten werden mit numerisch 0 kodiert)
    short int cperiod_first;
    short int cperiod_last;

    Ja was denn nun? signed oder unsigned

    scanf("%d",&Eingabe.cperiod_last);

    Der Formatspecifier %d ist für ein signed int gedacht (kein short).
    Auf modernen Systemen ist sizeof(int) meist 4 und sizeof(short) ist 2.
    Daher sind die Formate nicht kompatibel.
    %d überschreibt daher 4 Byte, obwohl nur 2 Byte Platz sind. D.h. es werden irgendwelche Daten überschrieben.
    Der Compiler erkennt das und macht daher eine Warnung.



  • @th69 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Für so (kleine) Programme könntest du evtl. leichtgewichtigere Sprachen wie C#, Java oder Python benutzen

    Er kam doch mit C++ nicht klar und dachte jetzt, C wäre einfacher.

    C ist eine einfache Sprache (vom Umfang), aber nicht einfacher in der Anwendung.



  • @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @th69 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Für so (kleine) Programme könntest du evtl. leichtgewichtigere Sprachen wie C#, Java oder Python benutzen

    Er kam doch mit C++ nicht klar und dachte jetzt, C wäre einfacher.

    C ist eine einfache Sprache (vom Umfang), aber nicht einfacher in der Anwendung.

    ...aber zumindest normalerweise schneller als C++! Und darauf kommt es mir bei yip schon an...

    Wenn Programmiersprachen Autos wären...



  • @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Achte doch endlich mal auf Warnungen.
    Schalte auch den Warnlevel auf Maximum.

    Wie mache ich das denn beim gcc (nein, eine Manpage gibt es bei mir nicht)?

    Der Formatspecifier %d ist für ein signed int gedacht (kein short).
    Auf modernen Systemen ist sizeof(int) meist 4 und sizeof(short) ist 2.
    Daher sind die Formate nicht kompatibel.
    %d überschreibt daher 4 Byte, obwohl nur 2 Byte Platz sind. D.h. es werden irgendwelche Daten überschrieben.
    Der Compiler erkennt das und macht daher eine Warnung.

    Okay, ich habe jetzt %d durch %dh ersetzt!



  • @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Achte doch endlich mal auf Warnungen.
    Schalte auch den Warnlevel auf Maximum.

    Wie mache ich das denn beim gcc (nein, eine Manpage gibt es bei mir nicht)?

    Der gcc hat auch keine Homepage mit Documentation. 🙄

    @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Okay, ich habe jetzt %d durch %dh ersetzt!

    Immer noch falsch.
    War das für signed oder unsigned gedacht?
    http://www.cplusplus.com/reference/cstdio/scanf/

    Das mit der gcc-Hompage war Sarkasmus.



  • @yadgar

    aber zumindest normalerweise schneller als C++!

    Das ist ein Märchen.



  • @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @th69 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Für so (kleine) Programme könntest du evtl. leichtgewichtigere Sprachen wie C#, Java oder Python benutzen

    Er kam doch mit C++ nicht klar und dachte jetzt, C wäre einfacher.

    C ist eine einfache Sprache (vom Umfang), aber nicht einfacher in der Anwendung.

    ...aber zumindest normalerweise schneller als C++! Und darauf kommt es mir bei yip schon an...

    Wenn Programmiersprachen Autos wären...

    LOL

    Du hast echt keinen Plan und wenn ich deinen Programmcode so sehe, kann von Effizienz (geschweige denn Performance) überhaupt keine Rede sein!



  • Hi(gh)!

    @th69 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    LOL

    Du hast echt keinen Plan und wenn ich deinen Programmcode so sehe, kann von Effizienz (geschweige denn Performance) überhaupt keine Rede sein!

    Lacht ihr nur... irgendwann werdet ihr nicht mehr lachen! (nein, das ist keine Drohung)

    Bis bald im Khyberspace!

    Yadgar



  • Hi(gh)!

    @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Okay, ich habe jetzt %d durch %dh ersetzt!

    Immer noch falsch.

    Wieso? Wenn es signed short int sein soll?

    Bis bald im Khyberspace!

    Yadgar



  • @yadgar sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Wieso? Wenn es signed short int sein soll?

    Eben.
    Teste doch damit mal die Warnungen vom Compiler.

    %d ist für signed int (in Dezimaldarstellung). Das danach dann noch ein h im Eingabestrom kommt, bezweifele ich auch.


  • Gesperrt

    @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Der gcc hat auch keine Homepage mit Documentation.

    https://gcc.gnu.org/
    Rechts auf der Seite, zweiter Abschnitt von oben.



  • @rbs2 sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    @dirkb sagte in Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Der gcc hat auch keine Homepage mit Documentation.

    @dirkb sagte aber auch in demselben Post Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!:

    Das mit der gcc-Hompage war Sarkasmus.



  • Hallo Yadgar

    Es war wie es die anderen gesagt haben die Formatangabe!
    Zumindest bei mir hat es nach der Änderung geklappt. der Compiler
    hat auch sofort gemeckert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define DIM 12
    #define bool char
    #define true 1
    #define false 0
    
    typedef struct
    {
      char station[30];
      char land[30];
      char region[30];
      char latitude[11];
      char longitude[12];
      short int hoehe;
      short int cperiod_first;
      short int cperiod_last;
      float temperatur[DIM];
      float niederschlag[DIM];
      float tempmittel;
      float niedsumme;
      char formula[4];
      char quelle[60];
    } Klimadatensatz;
    
    
    void input(float* daten, const char* typ, char mon[][10])
    {
      unsigned short i;
      for (i=0; i<DIM; i++)
      {
        printf("\n%s für %s: ", typ, mon[i]);
        scanf("%f", daten++);
        getchar();
      }
    }
    
    void display(Klimadatensatz *Eintrag, char mon[][10])
    {
      unsigned char i;
    
      printf("\nStation: %s", Eintrag->station);
      printf("\nLand: %s", Eintrag->land);
      printf("\nRegion: %s", Eintrag->region);
      printf("\nBreite: %s", Eintrag->latitude);
      printf("\nLänge: %s", Eintrag->longitude);
      printf("\nHöhe: %d", Eintrag->hoehe);
      printf("\nKlimaperiode: ");
    
      if (Eintrag->cperiod_first == 0 || Eintrag->cperiod_last == 0)
        printf("unbekannt\n");
      else
        printf("%d-%d\n", Eintrag->cperiod_first, Eintrag->cperiod_last);
      for (i=0; i<DIM; i++)
        printf("\nTemperaturmittel für %s: %2.1f", mon[i], Eintrag->temperatur[i]);
      printf("\n");
      for (i=0; i<DIM; i++)
        printf("\nNiederschlagsmittel für %s: %2.1f", mon[i], Eintrag->niederschlag[i]);
      printf("\n");
      printf("\nJahres-Temperaturmittel: %2.1f", Eintrag->tempmittel);
      printf("\nJahres-Niederschlagssumme: %2.1f\n", Eintrag->niedsumme);
      printf("\nKlimaformel nach Köppen und Geiger: %s\n", Eintrag->formula);
      printf("\nQuelle: %s\n", Eintrag->quelle);
    
    }
    
    
    
    void displayaslist(Klimadatensatz*);
    char* koeppen_geiger(Klimadatensatz*);
    bool schreibe(Klimadatensatz*);
    bool lese(char*, Klimadatensatz*);
    unsigned char checkentry(char*, char*, short int, short int, Klimadatensatz*);
    bool showall(Klimadatensatz*);
    
    int main(void)
    {
    
      Klimadatensatz Eintrag, Eingabe;
    
      char f, r;
      char monate[DIM][10]={ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };
    
      do
      {
        // system("clear");
        printf("              -----------------------------------------\n");
        printf("              | 1 - Datensatz laden und anzeigen      |\n");
        printf("              | 2 - Datensatz eingeben und speichern  |\n");
        printf("              | 5 - Alle Datensätze anzeigen          |\n");
        printf("              | x - Programm beenden                  |\n");
        printf("              -----------------------------------------\n\n");
        printf("Funktion: ");
        f=getchar();
        getchar();
    
      switch(f)
        {
        case '1':
    	   printf("\nName der Wetterstation: ");
           fgets(Eingabe.station,30,stdin);
    	   Eingabe.station[strlen(Eingabe.station)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    
           if (lese(Eingabe.station, &Eintrag) == true)
    	    display(&Eintrag, monate);
    	   printf("\nMit <Return> zurück zum Menü\n");
    	   getchar();
         break;
    
       case '2':
           printf("\nName der Wetterstation: ");
    	   fgets(Eingabe.station,30,stdin);
    	   Eingabe.station[strlen(Eingabe.station)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	   printf("\nLand: ");
    	   fgets(Eingabe.land,30,stdin);
    	   Eingabe.land[strlen(Eingabe.land)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	   printf("\nRegion: ");
    	   fgets(Eingabe.region,30,stdin);
    	   Eingabe.region[strlen(Eingabe.region)-1]='\0'; // Zeilenumbruch wird mit Stringende-Null überschrieben
    	   printf("\nKlimaperiode Beginn (unbekannt = 0): ");
           scanf("%hd",&Eingabe.cperiod_first);
           printf("\n%hd", Eingabe.cperiod_first);
    	   printf("\nKlimaperiode Ende (unbekannt = 0): ");
           scanf("%hd",&Eingabe.cperiod_last);
    	   printf("\n%hd", Eingabe.cperiod_last);
    
    	   if (checkentry(Eingabe.station, Eingabe.land, Eingabe.cperiod_first, Eingabe.cperiod_last, &Eintrag) < 2)
    	    return 1;
    
    	   printf("\nGeographische Breite (Grad°Minuten'Sekunden\"; Süd = negativ): ");
           scanf("%s", Eingabe.latitude);
    	   printf("\nGeographische Länge (Grad°Minuten'Sekunden\"; West = negativ): ");
           scanf("%s", Eingabe.longitude);
    	   printf("\nHöhe über dem Meeresspiegel (Meter): ");
           scanf("%hd", &Eingabe.hoehe);
           input(Eingabe.temperatur, "Temperatur", monate);
           input(Eingabe.niederschlag, "Niederschlag", monate);
    	   printf("\nQuelle: ");
    	   fgets(Eingabe.quelle,60,stdin);
    	   Eingabe.quelle[strlen(Eingabe.quelle)-1]='\0';
           strcpy(Eingabe.formula, koeppen_geiger(&Eingabe));
           printf("\n\nKlimaformel nach Köppen und Geiger: %s\n", Eingabe.formula);
    	   schreibe(&Eingabe);
    	   printf("\nDaten wurden gespeichert - mit <Return> zurück zum Menü\n");
    	   getchar();
         break;
    
       case '5':
    	 showall(&Eintrag);
       break;
    
       case 'x':
         return 0;
        break;
        }
      }
      while(1);
    }
    
    
    
    char* koeppen_geiger(Klimadatensatz* Eingabe)
    {
      char winter[3];
      char summer[3];
      char warmhalf[6];
      float highest_temp=Eingabe->temperatur[0];
      float lowest_temp=Eingabe->temperatur[0];
      float avg_temp;
      float temp_sum=0;
      float avg_prec;
      float prec_sum=0;
      float warmhalf_prec_sum=0;
      float highest_prec_summer;
      float highest_prec_winter;
      float lowest_prec_winter;
      float lowest_prec_summer;
      float lowest_prec=Eingabe->niederschlag[0];
      float prec_ratio, prec_ratio2;
      float arid_threshold;
      unsigned short arid_add;
      char above10=0;
      unsigned char i;
    
      if (Eingabe->latitude[0]=='-')
      {
        winter[0]=5;
        winter[1]=6;
        winter[2]=7;
        summer[0]=11;
        summer[1]=0;
        summer[2]=1;
        warmhalf[0]=9;
        warmhalf[1]=10;
        warmhalf[2]=11;
        warmhalf[3]=0;
        warmhalf[4]=1;
        warmhalf[5]=2;
      }
      else
      {
        winter[0]=11;
        winter[1]=0;
        winter[2]=1;
        summer[0]=5;
        summer[1]=6;
        summer[2]=7;
        warmhalf[0]=3;
        warmhalf[1]=4;
        warmhalf[2]=5;
        warmhalf[3]=6;
        warmhalf[4]=7;
        warmhalf[5]=8;
      }
    
    
      for (i=0; i<DIM; i++)
      {
        temp_sum += Eingabe->temperatur[i];
        prec_sum += Eingabe->niederschlag[i];
        if (Eingabe->temperatur[i] > highest_temp)
          highest_temp = Eingabe->temperatur[i];
        if (Eingabe->temperatur[i] < lowest_temp)
          lowest_temp = Eingabe->temperatur[i];
        if (Eingabe->niederschlag[i] < lowest_prec)
          lowest_prec = Eingabe->niederschlag[i];
        if (Eingabe->temperatur[i] > 10)
          above10++;
      }
    
      avg_temp = temp_sum/DIM;
      avg_prec = prec_sum/DIM;
    
      Eingabe->tempmittel = avg_temp;
      Eingabe->niedsumme = prec_sum;
    
      if (highest_temp < 10)  // Tundren- und Eisklimate (E)
      {
         Eingabe->formula[0]='E';
         if (highest_temp > 0)
           Eingabe->formula[1]='T';
         else
           Eingabe->formula[1]='F';
         Eingabe->formula[2]='\0'; // Stringende-NULL
      }
      else // A-, B-, C- und D-Klimate
      {
        for (i=0; i<6; i++) // Berechnung der Ariditätsschwelle
          warmhalf_prec_sum += Eingabe->niederschlag[warmhalf[i]];
        prec_ratio = warmhalf_prec_sum/prec_sum;
        if (prec_ratio >= 0.7)
          arid_add = 280;
        else if (prec_ratio >= 0.3)
          arid_add = 140;
        else
          arid_add = 0;
        arid_threshold = avg_temp * 20 + arid_add;
        if (arid_threshold <= 0)
          prec_ratio = 1; // trockene subarktische und polare Klimate gelten nicht als B-Klimate!
        else
          prec_ratio = prec_sum/arid_threshold;
        if (prec_ratio < 1) // Trockenklimate (B)
        {
          Eingabe->formula[0]='B';
          if (avg_temp >= 18)
            Eingabe->formula[2]='h';
          else
            Eingabe->formula[2]='k';
          if (prec_ratio < 0.5)
            Eingabe->formula[1]='W';
          else
            Eingabe->formula[1]='S';
          Eingabe->formula[3]='\0'; // Stringende-NULL
        }
        else // A-, C- und D-Klimate
        {
          if (lowest_temp >= 18) // Tropische Klimate (A)
          {
    	Eingabe->formula[0]='A';
    	if (lowest_prec >= 60)
    	  Eingabe->formula[1]='f'; // Tropisches Regenwaldklima (Af)
    	else
    	{
    	  prec_ratio = lowest_prec / prec_sum;
    	  if (prec_ratio >= 0.04)
    	    Eingabe->formula[1]='m'; // Monsunklima (Am)
    	  else
    	    Eingabe->formula[1]='w'; // Savannenklima (Aw)
    	}
    	Eingabe->formula[2]='\0'; // Stringende-NULL
          }
          else // C- und D-Klimate
          {
    	lowest_prec_winter = Eingabe->niederschlag[winter[0]];
    	highest_prec_winter = Eingabe->niederschlag[winter[0]];
    	lowest_prec_summer = Eingabe->niederschlag[summer[0]];
    	highest_prec_summer = Eingabe->niederschlag[summer[0]];
    
    	for (i=1; i<3; i++)
    	 {
    	  if (Eingabe->niederschlag[winter[i]] < lowest_prec_winter)
    	    lowest_prec_winter = Eingabe->niederschlag[winter[i]];
    	  if (Eingabe->niederschlag[winter[i]] > highest_prec_winter)
    	    highest_prec_winter = Eingabe->niederschlag[winter[i]];
    	  if (Eingabe->niederschlag[summer[i]] < lowest_prec_summer)
    	    lowest_prec_summer = Eingabe->niederschlag[summer[i]];
    	  if (Eingabe->niederschlag[summer[i]] > highest_prec_summer)
    	    highest_prec_summer = Eingabe->niederschlag[summer[i]];
    	 }
    
    	prec_ratio = highest_prec_summer / lowest_prec_winter;
    	prec_ratio2 = highest_prec_winter / lowest_prec_summer;
    	if (prec_ratio >= 10)
    	  Eingabe->formula[1]='w'; // wintertrockene gemäßigte oder kontinentale Klimate
    	else if (prec_ratio2 >= 3 && lowest_prec_summer < 30)
    	  Eingabe->formula[1]='s'; // sommertrockene gemäßigte oder kontinentale Klimate
    	else
    	  Eingabe->formula[1]='f'; // feuchte gemäßigte oder kontinentale Klimate
    
    	if (highest_temp >= 22)
    	  Eingabe->formula[2]='a'; // heiße Sommer
    	else if (above10 >= 4)
    	{
    	  Eingabe->formula[2]='b'; // warme Sommer
    	  if (lowest_temp >= 10) // hochozeanisch, sehr milde Winter (z. B. Tristan da Cunha, Neu-Amsterdam)
    	  {
    	    Eingabe->formula[2]='l';
    	  }
    	}
    	else
    	  Eingabe->formula[2]='c'; // kühle Sommer
    
    	if (lowest_temp <= -3) // kontinentale Klimate (D)
    	{
    	  Eingabe->formula[0]='D';
    	  if (lowest_temp <= -38)
    	    Eingabe->formula[2]='d';
    	}
    	else
    	  Eingabe->formula[0]='C'; // gemäßigte Klimate (C)
    
           	Eingabe->formula[3]='\0'; // Stringende-NULL
          }
        }
      }
      printf("\nTemperatur:\n");
      printf("\nNiedrigstes Monatsmittel: %2.1f°C", lowest_temp);
      printf("\nHöchstes Monatsmittel:    %2.1f°C", highest_temp);
      printf("\nJahresmittel:             %2.1f°C", avg_temp);
      printf("\n\n");
      printf("\nNiederschlag:\n");
      printf("\nNiedrigstes Monatsmittel: %2.1f mm", lowest_prec);
      printf("\nJahressumme:              %2.1f mm", prec_sum);
      printf("\nAriditätsschwelle:        %2.1f mm", arid_threshold);
      if (Eingabe->formula[0]=='A')
        printf("\nVerhältnis Niederschlag\nSommerhalbjahr/Gesamt:    %2.2f", prec_ratio);
      else if (Eingabe->formula[0]=='B')
        printf("\nVerhältnis Niederschlag/Ariditätsschwelle:    %2.2f", prec_ratio);
      else if (Eingabe->formula[0]=='C' || Eingabe->formula[0]=='D')
      {
        printf("\nVerhältnis feuchtester Sommermonat/trockenster Wintermonat:    %2.2f", prec_ratio);
        printf("\nVerhältnis feuchtester Wintermonat/trockenster Sommermonat:    %2.2f", prec_ratio2);
      }
    
      return Eingabe->formula;
    }
    
    // int write(float* temp, float* prec, char* stat, char* period, const char* lat, char* formula)
    bool schreibe(Klimadatensatz* Eingabe)
    {
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "ab+"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {
        printf("\nDatei kann nicht geschrieben werden!");
        return false;
      }
    
      if (fwrite(Eingabe, sizeof(*Eingabe), 1, fp) < 1)
      {
        printf("Datensatz kann nicht geschrieben werden!\n");
        return false;
      }
    
      if (fclose(fp) == EOF)
      {
        printf("\nDatei kann nicht geschlossen werden!");
        return false;
      }
    }
    
    bool lese(char* station, Klimadatensatz* Eintrag)
    {
      bool found=false;
    
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {
        printf("\nDatei kann nicht geöffnet werden!");
        return false;
      }
    
      printf("\nStation: %s\n", station);
    
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1)
      {
        if (strcmp(Eintrag->station, station) == 0)
        {
          found = true;
          break;
        }
      }
    
      if (found == false)
      {
        printf("\nZu dieser Station existiert kein Eintrag!\n");
        return false;
      }
    
      return true;
    }
    
    bool showall(Klimadatensatz* Eintrag)
    {
      char i; // Zählvariable
    
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {
        printf("\nDatei kann nicht geöffnet werden!");
        return false;
      }
    
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1 && fp)
      {
        displayaslist(Eintrag);
      }
      printf("\n");
    
      return true;
    }
    
    void displayaslist(Klimadatensatz* Eintrag)
    {
      printf("%s|%s|%s|%s|%s|%d m|",Eintrag->station, Eintrag->land, Eintrag->region, Eintrag->latitude, Eintrag->longitude, Eintrag->hoehe);
      if (Eintrag->cperiod_first == 0 || Eintrag->cperiod_last == 0)
        printf("unbekannt");
      else
        printf("%d-%d", Eintrag->cperiod_first, Eintrag->cperiod_last);
      printf("|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f°C|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f mm|%2.1f°C|%2.1f mm|%s|%s\n", Eintrag->temperatur[0], Eintrag->temperatur[1], Eintrag->temperatur[2], Eintrag->temperatur[3], Eintrag->temperatur[4], Eintrag->temperatur[5], Eintrag->temperatur[6], Eintrag->temperatur[7], Eintrag->temperatur[8], Eintrag->temperatur[9], Eintrag->temperatur[10], Eintrag->temperatur[11], Eintrag->niederschlag[0], Eintrag->niederschlag[1], Eintrag->niederschlag[2], Eintrag->niederschlag[3], Eintrag->niederschlag[4], Eintrag->niederschlag[5], Eintrag->niederschlag[6], Eintrag->niederschlag[7], Eintrag->niederschlag[8], Eintrag->niederschlag[9], Eintrag->niederschlag[10], Eintrag->niederschlag[11], Eintrag->tempmittel, Eintrag->niedsumme, Eintrag->formula, Eintrag->quelle);
    }
    
    unsigned char checkentry(char* station, char* country, short int kp_anfang, short int kp_ende, Klimadatensatz* Eintrag)
    {
      /* Rückgabewerte:
       * 0: Lesevorgang fehlgeschlagen
       * 1: Eintrag existiert bereits
       * 2: Eintrag ist neu */
    
      unsigned char match=2;
    
      FILE* fp;
      fp = fopen("wikipedia_klimadaten.dat", "rb"); // Datei wird als Binärdatei geöffnet!
    
      if (!fp)
      {
        printf("\nDatei kann nicht geöffnet werden!");
        return 0;
      }
    
      while (fread(Eintrag, sizeof(*Eintrag), 1, fp) == 1 && fp)
      {
        if (strcmp(Eintrag->station, station) == 0 && strcmp(Eintrag->land, country) == 0 && kp_anfang == Eintrag->cperiod_first && kp_ende == Eintrag->cperiod_last)
        {
          match = 1;
          printf("\nEin Eintrag für diese Station und Klimaperiode existiert bereits!\n");
          break;
        }
      }
    
      return match;
    }


  • Nachtrag:

    Typkonvertierungist hier besser:

    lowest_prec_winter = Eingabe->niederschlag[(short)winter[0]];
    	highest_prec_winter = Eingabe->niederschlag[(short)winter[0]];
    	lowest_prec_summer = Eingabe->niederschlag[(short)summer[0]];
    	highest_prec_summer = Eingabe->niederschlag[(short)summer[0]];
    
    	for (i=1; i<3; i++)
    	 {
    	  if (Eingabe->niederschlag[(short)winter[i]] < lowest_prec_winter)
    	    lowest_prec_winter = Eingabe->niederschlag[(short)winter[i]];
    	  if (Eingabe->niederschlag[(short)winter[i]] > highest_prec_winter)
    	    highest_prec_winter = Eingabe->niederschlag[(short)winter[i]];
    	  if (Eingabe->niederschlag[(short)summer[i]] < lowest_prec_summer)
    	    lowest_prec_summer = Eingabe->niederschlag[(short)summer[i]];
    	  if (Eingabe->niederschlag[(short)summer[i]] > highest_prec_summer)
    	    highest_prec_summer = Eingabe->niederschlag[(short)summer[i]];
    	 }

Anmelden zum Antworten