_fcloseall() bei .NET ?



  • Das geht schon, weil alle geöffneten ( includierte ) Dateien in einem Stack eingetragen sind, den muss man nur durchlaufen und jeweils Close() aufrufen. Eigentlich nur eine Frage des Interesses. Gehört vielleicht nicht hierher.



  • Da reden wir wohl aneinander vorbei. Die beschriebenen Fehler macht nicht mein Programm ( der lexikalische Analysator ) selber, sondern im zu analysierenden Text können Fehler enthalten sein. Dann muss mein Programm darauf hinweisen, eventuell noch den Fehler anzeigen. Wenn du mit VS Code schreibst, und begehst einen Syntaxfehler, dann muss der Compiler darauf hinweisen, und nicht auf einen Fehler im Compiler.


  • Administrator

    Eine Exception ist genau das richtige dafür. Eine Exception weisst auf einen Fehler im Programmablauf hin. Der Input hatte einen Fehler drin. Im UI fängst du die Exception ab und zeigst dem Benutzer eine entsprechende Fehlermeldung an.

    Abgesehen davon kannst du IDisposable und co auch ohne Exceptions verwenden. Wenn du aus einem using-Statement rauskommst, wird Dispose aufgerufen.



  • @biter sagte in _fcloseall() bei .NET ?:

    C++ MFC

    Wenn du nochmal "C++ MFC" schreibst bekomm ich 'nen Schreikrampf!



  • Selbst wenn ich eine Exception verwende, müssen die Dateien im Include-Stack gelöscht werden ( close() ), meiner Meinung nach. Wenn mehrere Includes verschachtelt sind, und im Text vom untersten ein Fehler erkannt wird, eine Exception ausgelöst wird, dann müssen die Dateien im Include-Stack gelöscht werden, um einen sauberen Zustand zu hinterlassen. Eigentlich war meine Frage nur, ob es bei C# .NET eine Entsprechung zur _fcloseall() in der stdio gibt.



  • Statt gelöscht meine ich geschlossen, Sorry. Bei Google habe ich nichts gefunden, auch nicht bei der Windows API. Ich glaube, dass es das bei C# .NET gar nicht gibt. Muss man den Vorteil der bessern Kapselung bei .NET mit der grösseren Mächtigkeit ( Meiner Meinung nach ) von MFC wieder verrechnen ?



  • @biter Ich weiß nicht genau, was du mit "include stack" meinst, aber wenn du using-statements mit Exceptions kombinierst dann funktioniert alles richtig. Um den notwendigen Stack kümmert sich dann C# bzw. die Runtime.

    MfG SideWinder



  • Dann versuche ich das eben zu erklären, obwohl es nicht hierher gehört. Ihr wisst ja, dass es bei manchen Programmiersprachen die Möglichkeit gibt andere Texte miteinzubinden. zB: #include <Dateiname>. Diese Includes können verschachtelt sein. Natürlich geht das nicht ins Unendliche, normalerweise ist die Verschachtelungstiefe kleiner zehn. Der Übersetzer der den Text übersetzt, und auf eine Include-Anweisung stösst, legt die Daten die er braucht auf einen Stack ( Hier Include-Stack genannt ) wenn er auf das Ende einer includierten Text-Datei stösst muss er zurückgehen und bei der vorigen Datei weitermachen, an der Stelle hinter der Include-Anweisung ( Die Datei, die die Include-Anweisung enthält). Also im Stack nach oben gehen und wieder zurück. Diese Arbeit übernimmt der lexikalische Analysator. Dann gibt es beim Compilerbau noch die Syntax-Analyse, Codeerzeugung, Optimierung.Die Syntaxanalyse, bestimmt die syntaktische Struktur und erzeugt einen Syntaxbaum. Dabei nimmt sie vom lexikalischen Analysator die Lexeme, also die Textschnippsel, die zusammen gehöhren. zB: die beiden Buchstaben i und f zu if. Also wenn das reicht, bedanke ich mich für die Beiträge, und die Lesezeit. Tschüsss ....



  • Pseudocode:

    text preprocess(filename) {
        open file
        while read line from file
            if line begins with "#include"
                 --> append preprocess(included_filename)
            else --> append line
        close file
        return text
    }
    

    Entweder geht's so oder ich versteh' das Problem nicht.



  • Gute Idee Swordfish, so kann man es machen !



  • Besser noch:

    text preprocess(filename) {
       try
       {
            open file
            while read line from file
            if line begins with "#include"
                 --> append preprocess(included_filename)
            else --> append line
       }
       finally
       {
            close file
       }
       return text
    }
    

    so daß auch bei Exceptions die Datei geschlossen wird - geht sogar eleganter noch mit der using (var file = new XXX(...))-Anweisung (Dispose() schließt automatisch die Datei bzw. den Stream).



  • Die Ideen sind gut, denke meine auch. Die Dateien zu schliessen geht bei mir, indem ich meinen Include-Stack durchlaufe, und jeweils Close() aufrufe.



  • Wobei bei preprocess aus verschachtelten Dateien eine einzige gemacht wird. Der einzige Fehler der da auftreten kann, ist dass open file scheitert. Man erspart sich hier nur die include-Geschichte. Da habe ich noch eine Frage: Wenn preprocess beim dritten Aufruf scheitert ( bei open file ), eine Exception ausgelöst wird, werden dann bei den zwei ersten Aufrufen auch der finally-Teil ausgeführt ? Bin da etwas perplex ...



  • Sorry, dass ich nochmals nerve, mein Programm prüft bei den Include-Dateien auf Zyklizität. Das dürfte bei preprocess nicht gehen, ohne Umwege.



  • @biter sagte in _fcloseall() bei .NET ?:

    Sorry, dass ich nochmals nerve, mein Programm prüft bei den Include-Dateien auf Zyklizität. Das dürfte bei preprocess nicht gehen, ohne Umwege.

    Doch, klar. Wieso nicht?
    Du musst doch bloss irgendwo "mitschreiben" welche Pfade gerade rekursiv bearbeitet werden. Z.B. einfach in einem Member Dictionary<string, object> processingPaths o.ä.



  • @biter Das alles hört sich an, als ob du ein ziemlicher Anfänger in Sachen Programmieren bist. Bist du sicher, daß Compilerbau das richtigetm Thema für deinen Erfahrungsstand ist?



  • Ja ja, Anfänger in manchen Dingen, in manchen nicht. Compiler habe ich schon drei geschrieben, die laufen alle fehlerlos. Selbst Professoren fragen mal etwas einfaches, ohne dass man deren Fähigkeit in Frage stellt. Bei Exceptions habe ich mich erst gestern informiert. Bisher habe ich im Fehlerfall, die Methode mit false verlassen, und FehlerVorhanden auf true gesetzt, und einen Eintrag in FehlerArt gemacht. Freilich, wenn die C# Sprache Exceptions anbietet, sollte man sie auch verwenden, das ist bestimmt guter Programmierstil. Ich behaupte nicht, dass ich einen guten Programmierstil hätte, meine Programme laufen jedenfalls alle. Und wenn man bei preprocess mitschreiben muss, in einer Stack-ähnlichen Datenstruktur, dann ist man von meiner Lösung nicht mehr weit weg.



  • Ok Dictionary geht auch.



  • Und im übrigen, macht meine Lösung mit dem Include-Stack dasselbe wie preprocess, nur dass preprocess rekursiv arbeitet, und mein Programm iterativ. Und ausserdem ist bei mir die "Include-Verarbeitung" mit der "Lexem-Erkennung" verzahnt. Lexeme ? zB: der Text:

    double d1 = 4.56e+10; ergibt

    Bezeichner double
    Bezeichner d1
    Gleichheitszeichen =
    Fliesskommazahl 4.56e+10
    Semikolon ;

    Trenner werden überlesen.

    Aber wozu das alles ? Eigentlich wollte ich nur wissen, was bei .NET der Funktion _fcloseall() entspricht. Einfache Frage, und so eine Lawine ....



  • @biter sagte in _fcloseall() bei .NET ?:

    Eigentlich wollte ich nur wissen, was bei .NET der Funktion _fcloseall() entspricht.

    Es gibt keine Entsprechung.

    Aber wozu das alles ?

    Weil man dir trotzdem helfen wollte?

    Einfache Frage, und so eine Lawine ....

    Vermutlich u.A. deswegen weil _fcloseall() ein garstiger Hack ist. Und ob du's glaubst oder nicht, es gibt einige Mitglieder hier die immer wieder versuchen anderen beizubringen wie man sauber programmiert.


Anmelden zum Antworten