Programm



  • Nukularfüsiker schrieb:

    Hihi.

    int main()
    {
        // switch-schleife
        label: switch(false) { default: goto label; }
        
        // hallo-schleife
        label: "hallo"; goto label;
    
        // baadf00d-schleife
        label: 0xbaadf00d; goto label;
    }
    

    Denen bin ich so noch nicht begegnet, aber die "if-Schleifen" habe ich schon oft gesehen. Aber ich nenne sie umständlich "if-goto-Schleifen", unter anderem damit ich nicht mit oben genannter Webseite kollidiere.



  • volkard schrieb:

    Aber ich nenne sie umständlich "if-goto-Schleifen"

    Ist doch fein, da kommt wenigstens das Schleifenkonstrukt drin vor.

    Ansonsten ist mir noch die else-Schleife eingefallen:

    label: if(false); else goto label;
    


  • Nukularfüsiker schrieb:

    Ansonsten ist mir noch die else-Schleife eingefallen:

    label: if(false); else goto label;
    

    Das erste ; gehört da nicht hin.
    EDIT: Natürlich gehört es da doch hin.

    Zusammengefasst: Es gibt keine if -Schleifen, weil man alles zwischen label: und goto label; tun kann.



  • TyRoXx schrieb:

    Zusammengefasst: Es gibt keine if -Schleifen, weil man alles zwischen label: und goto label; tun kann.

    Manche Schleifen haben mehr oder weniger gebräuchliche Namen, die Zeitschleife (eher DOS), die Idiotenschleife (eher 64-er), die Menuschleife (eher DOS), ... und auch eben die If-Schleife (eher C/Basic).



  • Gibt es auch die Exception-Schleife? Also sowas wie das hier?

    label:try{throw 0;}catch(int i){goto label;}
    

    @TyRoXx: Das Semikolon bei der "else-Schleife" ist richtig. Bei Pascal wäre es falsch, nicht aber in C/C++.



  • _matze schrieb:

    Skym0sh0 schrieb:

    und zwar werden solche konstruktionen if schleifen genannt:

    Gib mal 'ne Quelle. :p

    siehe volkard weiter unten xD



  • volkard schrieb:

    Manche Schleifen haben mehr oder weniger gebräuchliche Namen, die Zeitschleife (eher DOS), die Idiotenschleife (eher 64-er), die Menuschleife (eher DOS), ... und auch eben die If-Schleife (eher C/Basic).

    Aber warum etwas völlig Sinnfreies benennen? Ist das hier etwa eine Kommentarschleife:

    label: /*hier gehts ab*/ goto label;
    

    Was hat man denn davon, einen konstanten Ausdruck wie 0 == 0 als Bedingung für einen Sprung zu nehmen? Oder meinst du richtige Bedingungen?

    int again = 1;
    loop:
    	//..
    	again = 0;
    	//..
    	if (again)
    		goto loop;
    

    Warum dann nicht einfach so:

    int again = 1;
    do
    {
    	//...
    	again = 0;
    	//oder
    	break;
    	//...
    }
    while (again);
    


  • Ich ging davon aus, daß er richtige Bedingungen meint.



  • hi Leute!
    Habe das gleiche programm wie das vorhinbeschriebene.Ich habe das problem wenn ich es über MS Visual C++ ausführe klappt es super.Ohne Fehler!! Wenn ich die Exe im Debug ordner ausführe, passiert garnix. es öffnet sich lediglich der kleine schwarze bildschirm. Der cursor blinkt, man kann aber nichts eingeben geschweige den überhaupt irgendwas machen.
    Was is da los?



  • Hallo,

    Schau mal im Taskmanager nach, wie hoch die CPU- Auslastung ist. Sollte diese hoch sein, hängt das Programm eventuell in einer Endlosschleife fest. Du kannst ja vor jedem kritischen Codeabschnitt (schleifen, etc.) eine Nummer ausgeben lassen:

    cout << "1" << endl;
    
    while(!dat_ein.eof()){/*...*/}
    
    cout << "2" << endl;
    

    Dann siehst du, wo der Fehler verursacht wird.

    Außerdem habe ich auch in dem Beispielquelltext auf Fehlerbehandlung verzichtet. Du solltest also auf jeden Fall sicherstellen, dass das Programm auch die Datei "Datei.txt" findet.
    Also nach dem Öffnen der Datei sowas schreiben:

    if(!dat_ein){cout << "Datei konnte nicht geöffnet werden." << endl;}
    

    Und achte darauf, dass die Datei nicht etwa Datei.txt.txt heißt, was vorkommen kann, wenn du unter Ordneroptionen die Option Dateiendungen ausblenden aktiviert hast.

    MfG, Jochen



  • die datei.txt wird meines erachtens ohne probleme eingelesen. Wenn das nicht der fall der wäre, dann würde ja schon beim ausführvorgang im visual ein fehler zu erkennen sein oder? Habe die Datei im Projektordner stehen. Soweit richtig???
    Das komische ist. Als ich das ganze gestern ausprobiert habe, meine ich es hat funktioniert. Bin mir jedoch nichtmehr sicher.......



  • elvis911 schrieb:

    die datei.txt wird meines erachtens ohne probleme eingelesen. Wenn das nicht der fall der wäre, dann würde ja schon beim ausführvorgang im visual ein fehler zu erkennen sein oder?

    Trotzdem kann es nicht schaden, das auch zu überprüfen, wie von Jochen S. vorgeschlagen wurde.

    Vielleicht hat es ja auch mit dem Ausführungsverzeichnis zu tun. Hast du mal probiert, deine Textdatei mit 'nem absoluten Pfad ("C:\...") zu öffnen?



  • Ich habs glaub ich herausgefuden. Du musst die Anhangdatei beim ausführen der .exe auch im Debugordner speichern. Denn wenn due die .exe ausführst dann sucht er ja nur nach "datei.exe". Also sprich im gleichen ordner wie die .exe.
    Hört sich auch iregndwo logisch an. Bitte korrigiert micht wenns nicht stimmt.

    Dennoch frage ich mich, wie ich einen Pfad angebe, der auserhalb diese Ordners liegt.
    Habe zb. meine Datei einfach auf C: gelegt. Da müsste ich doch folgenden Pfad bekommen? ("C:\\datei.txt",ios_base::in)
    Sobald ich den angebe funktioniert nichts mehr.

    Gruss



  • Der Dateipfad im Program ist immer relativ zum working directory (Arbeitsverzeichnis). Wenn man das Programm aus Visual Studio heraus startet, so ist das Working-Directory das Projektverzeichnis. Startet man das Programm jedoch aus dem Explorer, so ist das Verzeichnis in dem sich das Program befindet das Working-Directory.

    Außerdemm muss man natürlich immer die Zugriffsrechte beachten.



  • Ich sage jetzt ich möchte meine datei (abweichend von dem projektornder) die auf folgendem Pfad liegt einlesen
    C:\Dokumente und Einstellungen\Kuse\Desktop\datei.txt

    wie schreibe ich diesen Pfad richtig in mein programm, damit er mir auch die datei wirklich an dieser stelle herholt???

    Meine idee liegt darin, dass ich mein programm auf mehreren pcs ausführen möchte, aber nur eine Bezugsdatei vorhanden ist.die zb. auf einem anderen netzlaufwerk liegt.
    das würde mir den vorteil bieten, dass nur ich die Datei abändern kann und das nur EINMAL.



  • Wenn du einen Absoluten Pfad angaben willst, musst du diesen bei dem Öffnen der Datei angeben:

    ifstream dat_ein;
    dat_ein.open("C:\\Dokumente und Einstellungen\\Kuse\\Desktop\\datei.txt",ios_base::in);
    

    MfG, Jochen



  • ahh verstehe danke Jochen.!!!
    Habe nun hoffentlich eine letzte Frage.

    meine Infoliste. Also die "datei.txt"
    schaut nun folgendermaßen aus:

    111-11-1111.1 1111 5 test
    222-22-2222.2 6556 6 test test
    148-04-0094.0 2568 1 Rolle 1
    148-04-0094.0 2587 3 Rolle 2

    Habe jetzt einige Artikelnummern, die öffter in meinem Lager vorkommen. Sprich mehrere Lagerplätze habe. Wie ist das in meinem Programm umzusetzten, damit praktisch 2 oder mehere male die vollständigen Daten von meinem Artikel ausgespuckt werden.
    Momentan ist es ja so. wenn ich zb. 148-04-0094.0 eingebe, wird ja nur die erste info der liste angezeigt. Also:

    Lagernummer: 2568
    Anzahl: 1
    Beschreibung: Rolle 1.

    ich will das bei eingeben der der zahl. auch die zweite info mitkommt. sollte dann so aussehen:

    Lagernummer: 2568
    Anzahl: 1
    Beschreibung: Rolle 1.

    Lagernummer: 2587
    Anzahl: 3
    Beschreibung: Rolle 2

    ....

    ggf. vielleicht auch eine dritte, vierte oder sogar fünfte info für den Lagerplatz

    Gruss



  • Hallo, Du musst einfach nur das break in der Schleife mit den Ausgaben wegmachen.

    Die Schleife sollte dann so aussehen:

    for(int loop1=0;loop1<Anzahl;loop1++)
    {
        if(Elemente[loop1].Artikelnummer==ArtNum)
        {
        cout << "Lagernummer\t: " << Elemente[loop1].Lagernummer << endl;
        cout << "Anzahl\t\t: "    << Elemente[loop1].Anzahl << endl;
        cout << "Beschreibung\t:" << Elemente[loop1].Beschreibung << endl;
        found = true;
        }
    }
    

    Als das break noch in der if-Bedingung stand, hat das Programm bei der ersten gefundenen Artikelnummer die Daten ausgegeben und daraufhin die Schleife verlassen, also nicht mehr nach weiteren Übereinstimmungen gesucht.

    MfG, Jochen


Anmelden zum Antworten