C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht



  • Hallo zusammen,
    bin absoluter C++ bzw. Programmier Anfänger.
    Mache hier gerade ein Buch und komme nicht weiter. Suche seit mehrern Tagen nach der Lösung, werde leider nicht fündig. Ich versuche alles so gut wie möglich zu beschreiben, falls Ihr mehr Infos braucht Antworte ich natürlich gerne.
    Ich habe eine MFC-APP gemacht bei dem nach dem Dialog "Hauptmenü" ein neuer geöffnet werden soll. Dieser Dialog soll aus einer txt Datei lesen und in einer Edit Control ausgeben. Ich habe den Code genau so kopiert wie er im Buch ist und auch alle anderen Schritte so durchgeführt. (Klasse, Membervariable usw.)
    Jedes mal wenn ich den Code kompiliere und auf den Button für das öffnen des Dialogs klicke hängt sich das Programm auf. Leider kenne ich mich auch im Debuggen nicht gut aus.
    Anbei der Code für die Funktion "InhaltAuslesen" die als Header Datei angelegt ist.

    **#include <string>
    #include <fstream>

    using namespace std;

    string inhaltAuslesen()
    {
    string str = "", rueckgabe = "";
    int i = 0;

    fstream f;
    f.open("bestand.txt", ios::in);
    
    /*Diese Schleife liest die Datei Zeile für Zeile
    ein und stellt dem Inhalt einen passenden Bezeichner voran.*/
    while (!f.eof())
    {
    	i++;
    	if (i == 1)
    	{
    		rueckgabe += "Artikelnummer:          ";
    	}
    	if (i == 2)
    	{
    		rueckgabe += "Bezeichnung:             ";
    	}
    	if (i == 3)
    	{
    		rueckgabe += "Preis:                         ";
    	}
    	if (i == 4)
    	{
    		rueckgabe += "Bestand:                    ";
    	}
    	if (i == 5)
    	{
    		i = 0;
    	}
    	getline(f, str);
    	rueckgabe += str + "\r\n";
    }
    f.close();
    return rueckgabe;
    

    }**

    Anschließend wird diese in der BestandAnzeigen.cpp verwendet die als MFC-Klasse im Dialog angelegt wurde.

    ** // BestandAnzeigen.cpp: Implementierungsdatei
    //

    #include "pch.h"
    #include "Lagerverwaltung.h"
    #include "afxdialogex.h"
    #include "BestandAnzeigen.h"
    #include <string>
    #include "funktionen.h"
    using namespace std;

    // BestandAnzeigen-Dialog

    IMPLEMENT_DYNAMIC(BestandAnzeigen, CDialog)

    BestandAnzeigen::BestandAnzeigen(CWnd* pParent /=nullptr/)
    : CDialog(IDD_Bestand, pParent)
    , ausgabeDialog1(_T(""))
    {
    string str = inhaltAuslesen();
    CString cstr(str.c_str());
    ausgabeDialog1 = cstr;
    }

    BestandAnzeigen::~BestandAnzeigen()
    {
    }

    void BestandAnzeigen::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    // DDX_Text(pDX, IDC_EDIT1, ausgabeDialog1);
    DDX_Text(pDX, IDC_EDIT1, ausgabeDialog1);
    }

    BEGIN_MESSAGE_MAP(BestandAnzeigen, CDialog)
    // ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP() **

    Nun noch der Abschnitt des "Hauptmenü" DIalogs.

    void CLagerverwaltungDlg::OnClickedButton1()
    {
    BestandAnzeigen bestand;
    bestand.DoModal();
    }

    In der Membervariablen "ausgabeDialog1" wurde IDC_Edit1 als Steuerelement genommen.
    Die txt Datei wo die daten rausgelesen werden sollten ist im gleichen Ordner wie die Quelldatei.
    Falls Ihr weitere Daten oder Informationen benötigt Antworte ich gerne.

    Viele Grüße


  • Mod

    Der Code ist absoluter Müll. Wenn das so aus einem Buch stammt, ist das gemeingefährlich. Was soll das für ein Buch sein? Es gehört (ernsthaft!) sofort in den Mülleimer. Siehe hier für bessere Buchtipps. Falsches zu Lernen ist jedenfalls schlimmer noch als Nichts zu lernen, denn Falsches wieder zu verlernen kann schwer und mühsam sein. Aus diesem Buch lernst du nur Falsches, deswegen musst du sofort gegensteuern.

    Diesen speziellen Code lohnt es sich nicht zu retten. Jede einzelne Zeile ist schon schlimm, aber das Gesamtkunstwerk toppt dann noch einmal alles. Die Funktion inhaltAuslesen könnte ohne Übertreibung die schlimmste Funktion der letzten Jahre sein, die hier gezeigt wurde (und ganz sicher in diesem Jahr :-D) . Da kann man keine Einzelkritik oder Korrektur machen, ohne einen halben Roman zu schreiben, daher empfiehlt sich Neuschreiben mit dem richtigen Wissen aus einem guten Buch. Hier gibt es nichts, dem man nachtrauern müsste, wenn man es wegwirft. Einem absoluten Anfänger könnte man solche Code noch verzeihen und korrigierend eingreifen, aber als Beispiel in einem Lehrbuch ist das eine Gefahr für alle Leser. Ich bin mir nicht sicher ob das nicht sogar eine Parodie ist und du uns einen Bären aufbinden möchtest; oder ob du dich nur sehr ungeschickt ausgedrückt hast, und der Code doch von dir als absolutem Anfänger stammt (wo man - wie gesagt - noch korrigieren könnte); aber wenn das aus einem Buch ist, dann ist da nicht zu helfen.



  • @reavz21: Das ist u.a. das sog. Loop-switch sequence Antipattern!
    Außerdem ist die Leseschleife bzgl. Benutzung von f.eof() falsch - sie sollte so aussehen:

    while (getline(f, str))
    {
      // ...
    }
    

    Zuerst muß gelesen werden, erst danach kann abgefragt werden, ob die Datei zu Ende ist (bzw. ein anderer Lese-Fehler aufgetreten ist). Dies ist dann implizit im Rückgabewert der Funktion std::getline enthalten, nämlich der Status des fstream-Objekts.

    Leider kenne ich mich auch im Debuggen nicht gut aus.

    Dann solltest du es lernen: Ein erster Blick auf den Visual Studio-Debugger

    Außerdem ist die MFC nicht mehr "state of the art", da sie veraltete C++ Paradigmen verwendet.

    PS: Und deinen Code hier im Forum solltest du formatieren (mit dem "</>" Button neben der ComboBox im Editor) - kannst du auch noch nachträglich mit dem 3-Punkte Menü und dort dann "Bearbeiten" auswählen.



  • @SeppJ
    Reagierst du da nicht ein wenig über? So schlecht finde ich den Code nicht.

    Gewiss, der Code hat ein paar Macken und nutzt die MFC, einen Aufsatz der WinAPI, welche nicht gerade Einstiegs- bzw. Benutzerfreundlich ist. Aber ich kenne da eine ganze Reihe von Stilblüten welche deutlich schlimmer sind.

    Ich habe da immer noch meine Projektarbeit in Erinnerung, wo ich eine kleine Biliothek benutzte, welche aus 500 Klassen bestand. Jede Klasse sah z.B. folgendermaßen aus:

    class TranslationPxyzKphiz
    {
      // ....
      double GetWert() {   
        return Wert[WertIndizes[1]]+cos(Wert[WertIndizes[3]])-sin(Wert[WertIndizes[2]])...  
      }
    };
    

    Die Funktion GetWert() war in allen Klassen vorhanden und zwischen 2-100 Zeilen groß. Doku gab es keine. Das Ergebnis der Projektarbeit: Die Bibliothek war suboptimal, nicht wartbar und sollte in Zukunft neu geschrieben werden.

    Und es wurde im Laufe der Zeit leider nicht besser.

    Meine neuste Stilblüte betrifft ein SDK zur Entwicklung von Nordic Funkchips. Das SDK wird mittels der Datei sdk_config.h "konfiguriert". DIese sieht z.B. folgendermaßen aus:

    https://github.com/NordicPlayground/nRF52-ble-long-range-demo/blob/master/peripheral_long_range_demo_kit/pca10056/s140/config/sdk_config.h

    Und falls du wissen möchtest, was "konfiguriert" in diesem Fall bedeutet, der folgender Link. EIn Beruhigungstee vorher ist aber empfehlenswert.

    https://devzone.nordicsemi.com/f/nordic-q-a/39503/undefined-reference-on-the-linker-level



  • @Th69 sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    @reavz21: Das ist u.a. das sog. Loop-switch sequence Antipattern!

    Ich find ja interessant, das es dafür einen Begriff gibt. Ich dachte erst, die Konstruktion wäre mehr oder weniger zufällig durch Flickerei entstanden. Aber wenn das auch aus dem Buch kommt, wird das wohl wirklich benutzt.


  • Mod

    @Quiche-Lorraine sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    @SeppJ
    Reagierst du da nicht ein wenig über? So schlecht finde ich den Code nicht.

    Wir haben Code, der es schafft, einen for-switch-Loop mit einer not-eof Schleife zu kombinieren, und das sogar ohne for oder switch zu nutzen. Desweiteren haben wir ein Best-of aller anderen bekannten Antipatterns: Non-Inline-Code in Headern, using namespace in Headern, sämtliche Dependencies hardcoded, fstream wo ifstream hingehört, Variablendeklaration im C-Stil, deutsche Bezeichner, '\r\n', close, vier verschiedene Stile für Dateinamen, leerer Destruktor. In dem zweiten Code ist bestimmt noch mehr, aber da unformatiert, mag ich das nicht lesen. Jeder einzelne dieser Mängel wäre ein absoluter Indikator, dass ein Buch nicht zu gebrauchen ist, aber das hier soll angeblich alles so aus einem einzigen Buch stammen!? Zusammen mit dem unformatierten Code und den Weihnachtsferien habe ich eher die Vermutung, jemandem ist langweilig und man möchte uns verarschen. Alleine das for-switch-not-eof ist so kreativ, das muss sich doch jemand mit Erfahrung absichtlich ausgedacht haben.



  • @reavz21 sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    bin absoluter C++ bzw. Programmier Anfänger.
    Mache hier gerade ein Buch und komme nicht weiter.

    Ist das so zu verstehen, dass Du ein Buch schreiben willst, das dem Leser erklären will, wie man c++ Programme schreibt ?



  • @SeppJ
    Ok, verstehe ich.

    Meine Schmerzgrenze ist aber in den letzten Jahren erheblich gesunken. Einerseits durch die Zusammenarbeit mit einem indischen outgesourcten Entwicklungsteam, endlosen fruchtlosen Diskussionen mit Dos und Don'ts oder Premature Optimizations und so manchem Code, welcher vermutlich von Fachfremden bzw. Laien geschrieben wurde.

    Gerade das oben gezeigte SDK mit nicht erkennbarem Schnittstellen-Design, mit seinen mehreren tausend #define Anweisungen, ebensovielen möglichen "undefined reference" Fehlern und stellenweise überdimensioniertem Code, ist ein Beispiel hierfür. So manch einer könnte da schon ausrasten bzw. sich verarscht fühlen.

    Aber es bringt nichts. Ich lernte die Jahre, dass je emotionaler eine Reaktion ist, desto weniger hören die Leute zu, sofern sie überhaupt zuhören. Meine Leidenschaft zur Software-Entwicklung wird nicht (immer) von anderen geteilt.

    Deswegen verfolge ich da eine Art Matrix Philosophie: "Ich kann dir den Weg zeigen, gehen musst du diesen ganz allein". Diese Philosophie schützt mich auch vor Leuten mit zweifelhafter Motivation.

    Aber manchmal gelingt es mir bei anderen Leuten einen Aha Effekt zu erzeugen. So z.B. warum Copy-Paste-Modifiy nicht gut ist. Oder warum ein std::vector besser ist als ein C Array. Dafür muss aber manchmal erst das Kind in den Brunnen fallen.

    PS:
    Nur weil meine Schmerzgrenze erheblich gesunken ist, heißt das nicht, dass mein Code dementsprechend aussieht.


  • Mod

    Mit meiner Schmerzgrenze sieht es ähnlich aus. In vielen Fällen, spare ich mir heute sogar einen Kommentar. Einzig bei dem Code, der aus meiner Abteilung rausgeht erwarte ich das bestimmte Standards eingehalten werden...
    Aber selbst hier bekomme ich von manchem Azubi, dann eine Rückfrage: "Wieso ist das falsch? Es steht doch auf der Seite x im Internet..."

    Heute ist es 90% aller Entwicklern egal, wie gut/sinnvoll Code aussieht.
    Ihre Bosse zwingen sie schnell Code zu liefern. Keinen guten Code.
    90% des Codes im Internet ist mit Vorsicht zu genießen und wird dennoch kommentarlos/gedankenlos kopiert.

    Ich habe es aufgegeben zu bloggen, ich habe es aufgegeben mich in Communities zu engagieren weil sich schlechter Code per Copy & Paste schneller verbreitet als guter Code und man auch noch angemacht wird, wenn man sachlich auf bestimmte "Probleme" hinweist...



  • @Quiche-Lorraine @Martin-Richter Ich kann eure Frustration verstehen. Aber, ich finde das Schade. Um guten Code schreiben zu können, muss man auch mal guten Code gesehen haben. Und, wenn die Leute, die guten Code zeigen könnten, da keine Lust zu haben, dann lernen die Leute auch nie, guten Code zu schreiben.



  • @Schlangenmensch sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    @Quiche-Lorraine @Martin-Richter Ich kann eure Frustration verstehen. Aber, ich finde das Schade. Um guten Code schreiben zu können, muss man auch mal guten Code gesehen haben. Und, wenn die Leute, die guten Code zeigen könnten, da keine Lust zu haben, dann lernen die Leute auch nie, guten Code zu schreiben.

    Dazu gehört aber auch Lernbereitschaft und der Wille, Neues zu akzeptieren. Es gibt Menschen, die die Auffassung vertreten, dass das, was 1995 gut war, auch heute noch gut ist. Wenn sie dann anderen Code sehen sagen sie dann: "Jaaaa, kann man auch so machen.". Das war's dann aber auch. Ich habe meinen Idealismus aufgegeben und kämpfe nicht mehr gegen Windmühlen. Hab genug damit zu tun, meine eigenen Fähigkeiten zu verbessern.
    In unserem Team hat es 12 Jahre gebraucht, bis einer std::vector benutzt hat. Bei allen anderen ist er verpönt, weil er zu langsam sei. Smart Pointer sind Werk des Teufels, da hat man ja keine Kontrolle, wann was zerstört wird. Bei new/delete und malloc/free kann man das genau sehen und weiß sofort Bescheid.



  • @DocShoe Ja, es gibt viele "alte Hasen" die nicht bereit sind, neues zu lernen. Und manche haben auch schon von 25 Jahren kein gutes C++ geschrieben, selbst für damalige Verhältnisse. Ich durfte mich mit solchem Code und Entwicklern auch schon auseinandersetzen.

    Aber, es gibt auch einige junge motivierte Leute, die gerne lernen würden. Und denen wird es manchmal schwer gemacht.
    Ich versuche einmal im Jahr zumindest eine kleine C++ Konferenz zu besuchen, die Schnittmenge da ist zwar sicher nicht Ausschlaggebend, denn da findet man nur die motivierten Leute, aber das zeigt mir auch jedes mal, dass es sie gibt.

    P.S. Ich selbst habe ja hier häufig keine Lust mehr, unformatierten Code zu lesen und zu erraten, was vlt gewollt sein könnte, aber trotz allem würde ich mich freuen, wenn, gerade Anfängern, häufiger mal gezeigt würde, wie es ordentlich geht.


  • Mod

    @DocShoe sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    Dazu gehört aber auch Lernbereitschaft und der Wille, Neues zu akzeptieren. Es gibt Menschen, die die Auffassung vertreten, dass das, was 1995 gut war, auch heute noch gut ist. Wenn sie dann anderen Code sehen sagen sie dann: "Jaaaa, kann man auch so machen.". Das war's dann aber auch. Ich habe meinen Idealismus aufgegeben und kämpfe nicht mehr gegen Windmühlen. Hab genug damit zu tun, meine eigenen Fähigkeiten zu verbessern.

    1995? Lehrfilm von 1975, der schon damals seit 20 Jahren altbekannte Weisheiten zeigt. Könntest du 1995 oder auch heute noch so als Lehrfilm nutzen, es hat sich nichts wesentliches verändert. Code ist ein Dokument für andere Menschen. So zu schreiben, dass andere (und meistens auch derjenige selbst) es nicht lesen können, war noch nie in der Menschheitsgeschichte akzeptabel, lange bevor es Computercode gab, und wie man gute Dokumente schreibt ist auch bekannt so lange es Dokumente gibt.



  • @Schlangenmensch sagte in C++ MFC-APP hängt sich nach drücken des Button auf. Öffnet txt Datei nicht:

    Ich kann eure Frustration verstehen.

    Mich frustieren hauptsächlich die vielen endlosen Diskussionen. Diese beginnen meistens mit einer steilen These, gefolgt von viel Halbwissen, welche öfters mal in Aufregung / Empörung mündet und Teilnehmer schnell beleidigt sind. Forscht man dann nach und möchte die Situation am nächsten Tag klären, so interresiert dies keinen mehr und die nächste Diskussion beginnt.

    Ich lernte: Nicht Argumente geben einem Recht, sondern Erfolge.

    Und ich zweifele im zunehmenden Maße an den Diskussionsgründen bzw. Motivation. Eine steile These ist meistens eine gute Grundlage für hitzige Diskussion s.d. man seinen Emotionen freien Lauf lassen kann. Und nachdem sich die Situation beruhigt, ist mindestens eine Stunde Arbeitszeit flöten gegangen.



  • Hallo Liebe Leute

    Bin ganz neu hier und das Thema ist schon alt aber der Text scheint wohl
    aus dem Buch "C++ Programmieren für Einsteiger" zu sein.
    Habe mir das Buch selber gerade gekauft und arbeite das gerade als blutiger Anfänger durch..
    Bis zu dem Code von oben (letzter Artikel) bin ich noch nicht gekommen aber der Text ist mir bekannt vorgekommen 😉

    l.G. Robert


Anmelden zum Antworten