Undeclared Variablen obwohl deklariert?



  • mein größtes problem ist das ich ja einen Variablen datei namen mit fopen öfnnen möchte und das das ja anscheinend nicht klappt.
    ich habs schon versucht mitm pointer zu lösen aber irgendwie funktioniert das nicht.
    Man muss dazu sagen das ich noch nicht so erfahren bin.
    MfG hellomelon



  • Der Fehler mit der nicht deklarierten Variable ist leicht zu erklären: du hast die Variable nicht deklariert! Du benutzt eine Variable 'Day', die es in deinem Code aber gar nicht gibt. Ein "char Day[1024]" am Anfang des Programms könnte zumindest bei der Fehlermeldung Abhilfe schaffen. Damit wird dein Programm aber noch nicht machen, was du willst.

    Und dann schlummern noch einige weitere Fehler in deinem Progrämmchen. Da fehlt's ziemlich an Grundlagen, ehrlich gesagt. Zunächst solltest du dir in dem Buch/Tutorial deiner Wahl mal bitte durchlesen, was der Unterschied zwischen einem Zeichen (char) und einer Zeichenkette (char*) ist. Das scheint noch nicht ganz klar zu sein.

    Und im Anschluss ließ bitte noch mal das Kapitel zum Thema Pointer durch. Du veranstaltest da wilde Zuweisungen von Zeigern und Adressen, die sich meiner Logik entziehen. 😉

    Bis dir hier einer diese sämtlichen Grundlagen so erklärt hat, dass du sie auch verstanden hast, hast du dreimal ein gutes Buch zu dem Thema gelesen.



  • So jetzt hab ich das ganze mal kritisch überarbeitet und kriege lediglich warnings.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int buffer[5];
      int i = 0;
      fpos_t pos;
      int DayNumber;
      getweekday( &DayNumber);
        if ( argc == 1)
         {
         char const *dateiname = argv[1];
         FILE *pf;
         pf = fopen( dateiname, "r+");
              if( !pf )
                        {
                        printf( "Fehler beim Öffnen der Datei\n");
                        exit(0);
                        }
                 while(1)
                         {
                         fgetpos( pf, &pos);
                         buffer[i] = fgetc( pf);
                         i++;
                         while( feof(pf))
                                break;
                         while ( i == 5)
                               {
                                   if( buffer[i] == "{" && buffer[i-1] == "" && buffer[i-2] == "y" && buffer[i-3] ==  "d" && buffer[i-4] == "o" && buffer[i-5] == "b")
                                       {
                                       fsetpos( pf, &pos);
                                       while(1)
                                               {
                                                switch( DayNumber)
                                                        {
                                                        case 1:
                                                               fputs("body { background-color:##DC143C;", pf);
                                                        case 2:
                                                               fputs("body { background-color:##4169e1;", pf);
                                                        case 3:
                                                               fputs("body { background-color:##00ff7F;", pf);
                                                        case 4:
                                                               fputs("body { background-color:##F0e68c;", pf);
                                                        case 5:
                                                               fputs("body { background-color:##a9a9a9;", pf);
                                                        }
                                               }
                                       break;
                                      }
                                   else
                                      {
                                      i = 0;
                                      continue;
                                      }                         
                           }
                           } 
             }
    	}
    

    aber so wirklich tun was ich möchte tuts immernoch nicht.

    achja hier zusaätzlihc noch die gettime.c

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    void getweekday (int *DayNumber)
    {
        time_t rawtime;
        struct tm * timeinfo;
        char Day [10];
    
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
    
        strftime (Day,9,"%A",timeinfo);
        if ( Day[0] == "M" && Day[1] == "o")
           *DayNumber = 1;
        if ( Day[0] == "T" && Day[1] == "u")
           *DayNumber = 2;
        if ( Day[0] == "W" && Day[1] == "e")
           *DayNumber = 3;
        if ( Day[0] == "T" && Day[1] == "h")
           *DayNumber = 4;
        if ( Day[0] == "F" && Day[1] == "r")
           *DayNumber = 5;
    }
    

    und wenn du mir jetzt sagen könntest wo genau ich lieber nochmal nachlernen sollte dann wär ich dir ziemlich dankbar 🙂
    ich hab nämlihc mich schon damit beschäftigt. ist nur ein bisschen her seit dem letzten mal programmieren.

    MfG hellomelon



  • hellomelon schrieb:

    So jetzt hab ich das ganze mal kritisch überarbeitet und kriege lediglich warnings.

    Super Idee. Wenn auch immer noch überwiegend falsch.
    Der Compiler hat immer Recht, auch wenn es nur Warnungen sind.
    Du weisst nicht, wie man chars vergleicht.
    Du weisst nicht, wie man Strings vergleicht.
    Für dich ist int gleich char.
    Du hast argc nicht verstanden.
    ...
    Du hast doch schon mal ganz gut mit einer Funktion angefangen. Das hast du offensichtlich verstanden. Dann nutze weitere Funktionen zur Kapselung deines Anwendungsfalls, innerhalb einer vernünftig und sinnvoll gestalteten Dateileseschleife.



  • Funktionen haben den Vorteil, dass sie einen Rückgabewert haben können. Dann kannst du schon mal auf die Zeiger verzichten.

    Zudem ist in der struct tm ein Eintrag Namens tm_wday. Der enthält die Nummer des Wochentags So = 0 ... Sa = 6.
    http://www.cplusplus.com/reference/clibrary/ctime/tm/

    #include <time.h>
    
    int getweekday ()
    {
        time_t rawtime;
        struct tm * timeinfo;
        char Day [10];
    
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
    
        return timeinfo->tm_wday
    }
    

    Aufruf dann mit

    DayNumber = getweekday();
    


  • Tut mir leid aberi ch hattein letzter Zeit viel um die Ohren. Hab mich allerdings nochmal mit dem ganzem C Buch auseinander gesetzt und hoffe das es jetzt wenigstens so einergermaßen stimmt.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      char buffer[4];
      int i = 0;
      fpos_t pos;
      int DayNumber= getweekday();
      char match[]={"body"};
      ;
        if ( argc == 1)
         {
         char const *dateiname = argv[1];
         FILE *pf;
         pf = fopen( dateiname, "r+");
              if( !pf )
                        {
                        printf( "Fehler beim Öffnen der Datei\n");
                        exit(0);
                        }
                 while(1)
                         {
                         fgetpos( pf, &pos);
                         buffer[i] = fgetc( pf);
                         i++;
                         while( feof(pf))
                                printf("Keine gültige Datei erkannt");
                                exit( 0);
                         while ( i == 4)
                               {
                                   if( match[0]==buffer[0] )
                                       if( match[1]==buffer[1] )
                                           if( match[2]==buffer[2] )
                                               if( match[3]==buffer[3])
                                                   {     
                                                   fsetpos( pf, &pos);
                                                   while(1)
                                                   {
                                                   switch( DayNumber)
                                                           {
                                                           case 1:
                                                               fputs("body { background-color:##DC143C;", pf);
                                                               exit( 1);
                                                           case 2:
                                                                fputs("body { background-color:##4169e1;", pf);
                                                                exit( 1);
                                                           case 3:
                                                               fputs("body { background-color:##00ff7F;", pf);
                                                               exit( 1);
                                                           case 4:
                                                               fputs("body { background-color:##F0e68c;", pf);
                                                               exit( 1);
                                                           case 5:
                                                               fputs("body { background-color:##a9a9a9;", pf);
                                                               exit( 1);
                                                           default:
                                                               printf("Kein gültiger Wochentag erkannt");
                                                               exit(0);
                                                        }
                                               }
                                      }
                                   else
                                      {
                                      i = 0;
                                      continue;
                                      }                         
                           }
                           } 
             }
    	}
    
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int getweekday ()
    {
        time_t rawtime;
        struct tm * timeinfo;
        char Day [10];
    
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
    
        return timeinfo->tm_wday;	
    }
    

    wäre wieder einmal sehr froh über eure hilfe 🙂
    MfG hellomelon



  • int main(int argc, char *argv[])
    {
      char z[1000];
      fpos_t pos;
    
      if( argc > 1 )
      {
        FILE *f = fopen( argv[1], "r+");
        if( !f )
        {
          perror(argv[1]);
          exit(1);
        }
        while( fgetpos( f, &pos), fgets(z,1000,f) )
          if( strstr(z,"body { background-color:")==z )
            switch( fsetpos( f, &pos), getweekday() ) {
              case 1:
                      fputs("body { background-color:#DC143C;", f);
                      fclose(f);exit( 1);
              case 2:
                      fputs("body { background-color:#4169e1;", f);
                      fclose(f);exit( 1);
              case 3:
                      fputs("body { background-color:#00ff7F;", f);
                      fclose(f);exit( 1);
              case 4:
                      fputs("body { background-color:#F0e68c;", f);
                      fclose(f);exit( 1);
              case 5:
                      fputs("body { background-color:#a9a9a9;", f);
                      fclose(f);exit( 1);
              default:
                      printf("Kein gültiger Wochentag erkannt");
                      fclose(f);exit( 0);
            }
    
      }
      return 0;
    }
    


  • Vielen Dank!
    das ist echt nett von dir 🙂
    Ich hab gemerkt das mir häufig so wichtige Befehle besonders im Umgang mit Strings und auch die bedeutungen von int char usw fehlen. Da werd ich mich wohl nochmal mit auseinander setzen.
    Also in dem sinne.
    Bis zum nächsten mal 😉
    MfG hellomelon



  • Also ich würde folgendes schreiben:

    if(FILE* f = fopen(...))
    {
         ...
    }
    

    Verstehe nicht, warum das niemand so macht.



  • Also eigentlich bin ich ja wirklich kein Unschuldslamm, wenn's um unsaubereren Stil geht, aber selbst ich deklariere alle lokalen Variablen am Beginn der Funktion und nicht irgendwann zwischendrin...
    Stichwort Wartung und so. Niemand hat Lust, Tausende Zeilen Quellcode nach Variablendeklarationen zu durchsuchen, wenn sich mal die Anforderungen ändern...



  • Diese Variante ist doch sauber. Sie ist so lokal wie möglich und kurz sowie verständlich, jeder weiß, was hier passiert. Variablen gehören dann definiert, wenn sie verwendet werden.



  • 314159265358979 schrieb:

    Diese Variante ist doch sauber. Sie ist so lokal wie möglich und kurz sowie verständlich, jeder weiß, was hier passiert.

    so unrecht hast du ja nicht, nur dass eben die Variable f dann halt nur innerhalb
    der geschweiften Klammern des ifs gültig ist... nach dem if existiert diese
    variable sozusagen nicht mehr, das gleiche wie bei:

    for(int i=0; i<MAX_VALUE_PER_LINE; i++){
    // befehlsblock
    }
    


  • Das ist ja auch das Ziel.



  • ChrisIT schrieb:

    Also eigentlich bin ich ja wirklich kein Unschuldslamm, wenn's um unsaubereren Stil geht, aber selbst ich deklariere alle lokalen Variablen am Beginn der Funktion und nicht irgendwann zwischendrin...
    Stichwort Wartung und so. Niemand hat Lust, Tausende Zeilen Quellcode nach Variablendeklarationen zu durchsuchen, wenn sich mal die Anforderungen ändern...

    Wieso tausende Zeilen? Schreibst du etwa Funktionen, die tausende Zeilen enthalten? Wenn du sinnvoll programmierst, sind deine Funktionen nur ein paar Zeilen groß, und dann entfällt das erwähnte Suchen, weil eine Funktion meist auf eine Seite passt. Und dann zieht dein Argument halt nicht mehr.

    Btw, es wird sicher einen Grund gehabt haben, warum ANSI-C in der Hinsicht geändert (bzw. imho verbessert) wurde, so dass - anders als noch bei C89 - Variablendeklarationen überall im Code und nicht nur am Scope-Anfang erlaubt sind.



  • itedvo schrieb:

    314159265358979 schrieb:

    Diese Variante ist doch sauber. Sie ist so lokal wie möglich und kurz sowie verständlich, jeder weiß, was hier passiert.

    so unrecht hast du ja nicht, nur dass eben die Variable f dann halt nur innerhalb
    der geschweiften Klammern des ifs gültig ist... nach dem if existiert diese
    variable sozusagen nicht mehr

    Ja, und? Was machst du denn bitteschön noch mit der Variable f, wenn sie 0 ist?



  • naja, wenn sie NULL ist, so soll sie zum beispiel erstellt werden...

    zum beispiel so:

    int main(void){
    
      FILE* dat;
      char file_dat[MAX_CHAR];
    
      if(dat=fopen("text.txt","r"))
         fscanf(dat,"%s", file_dat); 
      else
         dat=fopen("text.txt", "w");
    
      fclose(dat);
    
      return 0;
    }
    


  • _matze schrieb:

    itedvo schrieb:

    314159265358979 schrieb:

    Diese Variante ist doch sauber. Sie ist so lokal wie möglich und kurz sowie verständlich, jeder weiß, was hier passiert.

    so unrecht hast du ja nicht, nur dass eben die Variable f dann halt nur innerhalb
    der geschweiften Klammern des ifs gültig ist... nach dem if existiert diese
    variable sozusagen nicht mehr

    Ja, und? Was machst du denn bitteschön noch mit der Variable f, wenn sie 0 ist?

    Nichts.



  • Ich hab tatsächlich manchmal mit monströsen Funktionen von mehreren hundert Zeilen zu tun (ich glaub der Rekord liegt bei um die 700). Meistens kann man da irgendeine Struktur drin erkennen und die Funktion etwas besser gliedern, aber wenn die Variablen alle vorneweg deklariert sind, weiß man erstmal gar nicht, ob die überhaupt und wenn ja wo die überall -- und hoffentlich nicht in mehr als einer Bedeutung! -- verwendet werden. Der erste Schritt um das Chaos zu reduzieren besteht darin, die Variablen lokaler zu machen. Die Empfehlung, gerade bei solchen Abscheulichkeiten die Variablen am Anfang zu deklarieren, ist grotesk.



  • Bashar schrieb:

    Ich hab tatsächlich manchmal mit monströsen Funktionen von mehreren hundert Zeilen zu tun (ich glaub der Rekord liegt bei um die 700).

    Zu tun? Ha! Ich habe solche Monster geschrieben! 😃 Aber das war in meiner Ausbildung, vor zehn Jahren oder so. Mein Rekord liegt allerdings bei gut 1000 Zeilen. Und auch hier waren alle Deklarationen am Funktionsanfang. Mein Chef sagte, dass so die Übersicht über alle Variablen gewährleistet wird. 🙄 Ich weiß gar nicht mehr sicher, ob der Clipper-Compiler auch Deklarationen mittendrin zugelassen hätte, ich glaube aber schon. Wie auch immer, man lernt ja dazu.



  • Ich hab da einen heißen Trick für alte C-Compiler:

    void foo() {
      {
        int i;
        /* ... */
      }
    
      {
        int i;
        /* ... */
      }
    }
    

    Ansonsten kann ich Bashar nur zustimmen. Allerdings wäre die sinnvolle Handhabung von Variablendeklarationen in solchen Monstern in gewisser Weise ein Stilbruch. 😉


Anmelden zum Antworten