Absurde Fehlfunktion: alle eingegebenen Werte werden zu 0!



  • @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