Undeclared Variablen obwohl deklariert?



  • 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