Run-Time Check failure #2



  • Oh sorry aber trotzdem vielen Dank.
    Das mit den Tags hab ich davor nicht gecheckt. 🙄
    Ich hab die AäÜüÖö - s weggelassen und durch klammer´n ersetzt, um den Platz zu füllen.

    # include <SDKDDKVer.h>
    # include <stdio.h>
    # include <tchar.h>
    # include <iostream>
    # include <string>
    # include <fstream>
    # include <windows.h>
    #define add(x, y)  (x * 100 + y)
    
    using namespace std;
    short resetoutput(string file){
    	ofstream hallo;
    	hallo.open(file.c_str(), ios_base::out);
    	if(!hallo){
    	cerr << "error" << endl;
    	return 2;
    	}
    	hallo.close();
    	return 0;
    }
    
    long code(){
    
    	char text[20000]; // char array erstellen (pro buchstabe ein text[])
    
    		// code definieren
    		char code[1000];
    			code['a'] = 10;
    			code['b'] = 11;
    			code['c'] = 12;
    			code['d'] = 13;
    			code['e'] = 14;
    			code['f'] = 15;
    			code['g'] = 16;
    			code['h'] = 17;
    			code['i'] = 18;
    			code['j'] = 19;
    			code['k'] = 20;
    			code['l'] = 21;
    			code['m'] = 22;
    			code['n'] = 23;
    			code['o'] = 24;
    			code['p'] = 25;
    			code['q'] = 26;
    			code['r'] = 27;
    			code['s'] = 28;
    			code['t'] = 29;
    			code['u'] = 30;
    			code['v'] = 31;
    			code['w'] = 32;
    			code['x'] = 33;
    			code['y'] = 34;
    			code['z'] = 35;
    			code[' '] = 36;
    			code['!'] = 37;
    			code['?'] = 38;
    			code['A'] = 39;
    			code['B'] = 40;
    			code['C'] = 41;
    			code['D'] = 42;
    			code['E'] = 43;
    			code['F'] = 44;
    			code['G'] = 45;
    			code['H'] = 46;
    			code['L'] = 47;
    			code['I'] = 48;
    			code['K'] = 49;
    			code['L'] = 50;
    			code['M'] = 51;
    			code['N'] = 52;
    			code['O'] = 53;
    			code['P'] = 54;
    			code['Q'] = 55;
    			code['R'] = 56;
    			code['S'] = 57;
    			code['T'] = 58;
    			code['U'] = 59;
    			code['V'] = 60;
    			code['W'] = 61;
    			code['X'] = 62;
    			code['Y'] = 63;
    			code['Z'] = 64;
    			code[']'] = 65;
    			code['['] = 66;
    			code['}'] = 67;
    			code['{'] = 68;
    			code['('] = 69;
    			code[')'] = 70;
    			code[','] = 71;
    			code[';'] = 72;
    			code['"'] = 73;
    			code['.'] = 74;
    			code[':'] = 75;
    			code['_'] = 76;
    			code['-'] = 77;
    			code['#'] = 78;
    			code['+'] = 79;
    			code['~'] = 80;
    			code['*'] = 81;
    			code['/'] = 82;
    			code['\\'] = 83;
    			code['ß'] = 84;
    			code['&'] = 85;
    			code['%'] = 86;
    			code['$'] = 87;
    			code['§'] = 88;
    			code['='] = 89;
    			code['°'] = 90;
    			code['^'] = 91;
    			code['<'] = 92;
    			code['>'] = 93;
    			code['0'] = 90;
    			code['1'] = 91;
    			code['2'] = 92;
    			code['3'] = 93;
    			code['4'] = 94;
    			code['5'] = 95;
    			code['6'] = 96;
    			code['7'] = 97;
    			code['8'] = 98;
    			code['7'] = 99;
    
    		// code definieren ende
    
    			cout << "Text:" << endl; // Nutzer auffordern, etwas einzugeben 
    	cin.getline(text, strlen(text));// text einlesen und in char text[] speichern
    
    	unsigned int tmp; // temp - variable
    	unsigned int tmpc = 0;
    	unsigned int i; // variable zum speichern der char array länge des eingegebenen textes
    	unsigned int c = 0; // counter für buchstabe
    
    	resetoutput("output.txt"); // output.txt zurücksetzen
    	i = strlen(text);
    	tmp = 0;
    	cout << "Code:" << endl;
    		while(c != i){
    			tmp = tmp * 100 + code[text[c]];
    			cout << tmp;
    			tmp = 0;
    			c++;
    		}
    		cout << endl;
    	return 0;
    }
    short decode(){
    	return 0;
    }
    short menu(){
     int eingabe;
     cout << "exit                 <1>" << endl;
     cout << "Datei codieren       <2>" << endl;
     cout << "Datei decodieren     <3>" << endl;
    cin >> eingabe;
     getchar();
    	 switch (eingabe){
    	 case 1:
    		 return 1;
    		 return 0;
    		 break;
    	 case 2:
    		 code();
    		 return 0;
    		 break;
    	 case 3:
    		 decode();
    		 return 0;
    		 break;
    	 default:
    		 return 0;
    		 break;
    	 }
    	 return 0;
    }
    int main(int argc, char *argv){
    	while(true){
    		if(menu() == 1){
    			cout << "exiting...\a\a\a" << endl;
    			Sleep(500);
    			return 0;
    		} else {
    			menu();
    		}
    	}
    	return 0;
    }
    

    Aber das mit den falschen headern hab ich immer noch nich verstanden



  • diese header kannst du weglassen, die brauchst du nicht:

    # include <SDKDDKVer.h>
    # include <stdio.h>
    # include <tchar.h>
    # include <windows.h>
    

    die einzigen die du brauchst sind:

    #include <iostream>
    #include <fstream>
    #include <string>
    // und eventuell noch
    #include <vector>
    

    dein Macro "add" brauchst du auch nicht, und wenn doch, dann schreib dir dazu eine funktion


  • Mod

    # include <SDKDDKVer.h> // benutzt du nichts draus
    # include <stdio.h>     // heißt in C++ cstdio, benutzt du nichts draus
    # include <tchar.h>     // benutzt du nichts draus
    # include <iostream>
    # include <string>
    # include <fstream>
    # include <windows.h> 
    # include <cstring>     // Fehlt für strlen. Du hättest vermutlich string.h geschrieben, aber in C++ heißt es cstring. Und du solltest std::string benutzen, keine char-Arrays.
    

    P.S.: Und ich würde #include , statt # include schreiben. Ist zwar technisch egal, aber der übliche Stil.



  • //#include <SDKDDKVer.h>
    //#include <stdio.h>
    //#include <tchar.h>
    //#include <windows.h>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <map>
    
    //#define add(x, y) (x * 100 + y)
    
    using namespace std;
    
    long resetoutput(string const& file) // ist schneller als referenz übergeben
    {
        ofstream hallo(file.c_str());
    	// hallo.open(file.c_str(), ios_base::out); // kannst du weglassen, stichwort RAII
        if ( !hallo )
        {
            cerr << "error" << endl;
            return 2;
        }
    
        //hallo.close(); // close wird im destruktor automatisch aufgerufen
        return 0;
    }
    
    long code()
    {
        //char text[20000]; // char array erstellen (pro buchstabe ein text[]) // wir nehmen std::string
    
        // code definieren
        //unsigned char code[200];
    	std::map<char, int> code; // so kannst du gar nicht mehr ausserhalb der grenzen gehen
        code['a'] = 10;
        code['b'] = 11;
        code['c'] = 12;
        code['d'] = 13;
        code['e'] = 14;
        code['f'] = 15;
        code['g'] = 16;
        code['h'] = 17;
        code['i'] = 18;
        code['j'] = 19;
        code['k'] = 20;
        code['l'] = 21;
        code['m'] = 22;
        code['n'] = 23;
        code['o'] = 24;
        code['p'] = 25;
        code['q'] = 26;
        code['r'] = 27;
        code['s'] = 28;
        code['t'] = 29;
        code['u'] = 30;
        code['v'] = 31;
        code['w'] = 32;
        code['x'] = 33;
        code['y'] = 34;
        code['z'] = 35;
        code[' '] = 36;
        code['!'] = 37;
        code['?'] = 38;
        code['A'] = 39;
        code['B'] = 40;
        code['C'] = 41;
        code['D'] = 42;
        code['E'] = 43;
        code['F'] = 44;
        code['G'] = 45;
        code['H'] = 46;
        code['L'] = 47;
        code['I'] = 48;
        code['K'] = 49;
        code['L'] = 50;
        code['M'] = 51;
        code['N'] = 52;
        code['O'] = 53;
        code['P'] = 54;
        code['Q'] = 55;
        code['R'] = 56;
        code['S'] = 57;
        code['T'] = 58;
        code['U'] = 59;
        code['V'] = 60;
        code['W'] = 61;
        code['X'] = 62;
        code['Y'] = 63;
        code['Z'] = 64;
        code['Ü'] = 65;
        code['Ä'] = 66;
        code['Ö'] = 67;
        code['ü'] = 68;
        code['ä'] = 69;
        code['ö'] = 70;
        code[','] = 71;
        code[';'] = 72;
        code['"'] = 73;
        code['.'] = 74;
        code[':'] = 75;
        code['_'] = 76;
        code['-'] = 77;
        code['#'] = 78;
        code['+'] = 79;
        code['~'] = 80;
        code['*'] = 81;
        code['/'] = 82;
        code['\\'] = 83;
        code['ß'] = 84;
        code['&'] = 85;
        code['%'] = 86;
        code['$'] = 87;
        code['§'] = 88;
        code['='] = 89;
        code['°'] = 90;
        code['^'] = 91;
        // code definieren ende
    
    	std::string text; // variablen erst da definieren wo du sie brauchst
        cout << "Text: " << endl; // Nutzer auffordern, etwas einzugeben
        //cin.getline(text, strlen(text));// text einlesen und in char text[] speicher
    	getline(cin, text);
    
        unsigned int tmp; // temp - variable
        unsigned int tmpc = 0;
        unsigned int strLength; // variable zum speichern der char array länge des eingegebenen textes // besserer name
    
        resetoutput("output.txt"); // output.txt zurücksetzen
        i = text.size();
        tmp = 0;
        cout << "Code:" << endl;
    
        for(unsigned int i = 0; i < strLength; ++i) // besser als zähl schleife geschrieben, intuitiver
        {
            //tmp = tmp * 100 + code[text[i]]; // die formel macht keinen sinn, da tmp vorher 0 ist und am ende der schleife für den nächsten durchlauf wieder auf 0 gesetzt wird, kommt immer nur der code aus dem 'array' raus
    		tmp = code[text[i]];
            cout << tmp;
            tmp = 0;
        }
    	// alternativ auch mit iteratoren schreibbar
    	/*for(auto it = text.begin(); it != text.end(); ++it)
    		cout << code[*it];*/
    
        cout << endl;
        return 0; // wenn du eh 0 zurückgibst, wieso machst du die funktion nicht void?
    }
    
    long decode()
    {
        return 0; // macht nichts, aber müsstest du glaube ich noch implementieren
    }
    
    long menu()
    {
        int eingabe;
    
        cout << "exit <1>" << endl;
        cout << "Datei codieren <2>" << endl;
        cout << "Datei decodieren <3>" << endl;
    
        cin >> eingabe;
        //getchar(); wofür? um etwaige fehler aus dem stream zu löschen? das geht anders
    
        switch (eingabe)
        {
        case 1:
            return 1; // doppelt und dreifach gemoppelt
            //return 0;
            //break;
        case 2:
            code();
            //return 0;
            break;
        case 3:
            decode();
            //return 0;
            break;
        default:
            //return 0;
            break;
        }
    
    	// ein return verhindert ein nachfolgendes return oder break, es verhindert alle nachfolgenden anweisung in dieser funktion
        return 0;
    }
    
    int main(){
        while(true)
        {
            if(menu() == 1)
            {
                cout << "exiting...\a\a\a" << endl;
                Sleep(500);
                return 0;
            }
            else
            {
                menu(); // wenn man hier nicht 1 eingibt, muss man erstmal noch eine eingabe bevor was passiert. du musst doch auch nicht 2mal a drücken damit ein a auf dem bildschirm erscheint?!
            }
        }
        return 0;
    }
    

    mir war langweilig, hier haste dein programm soweit verbessert, wenn du was nicht weist/verstehst, erstmal google (z.B. was eine map ist) und dann kannste fragen.

    kommentare stehen soweit dran

    aber ich erhebe keinen anspruch auf die richtigkeit des programms, sowohl syntaktisch als auch semantisch nicht



  • std::map<char, int> code;
    	for (char c = 'a'; c <= 'z'; ++c)
    		code[c] = static_cast<int>(c) - 87;
    	for (char c = 'A'; c < 'Z'; ++c)
    		code[c] = static_cast<int>(c) - 26;
    	char temp[27] = {'Ü', 'Ä', 'Ö', 'ü', 'ä', 'ö', ',', ';', '"', '.', ':', '_', '-', '#', '+', '~', '*', '/', '\\', 'ß', '&', '%', '$', '§', '=', '°', '^'};
    	for (int n = 0; n < 27; ++n)
    		code[temp[n]] = n + 65;
    	code[' '] = 36;
        code['!'] = 37;
    

  • Mod

    SeppJ schrieb:

    Das geht allein deswegen schon schief, weil 'Ä' bei dir vermutlich eine "multi-character character constant" ist und das gehörig kracht, wenn du das als Arrayindex benutzt, da helfen weder char[200] noch char[1000].

    Das ist so nicht ganz korrekt. Ein multicharacter literal ist ein Zeichen-Literal mit mehreren Zeichen. Zum Problem wird hier eher, dass char auch schon mal Vorzeichenbehaftet sein kann, und das verursacht schon mal Probleme, wenn es dann als Index in ein Array verwendet wird.



  • Wenn ich aber die ganzen header weglasse, dann steht da, dass "Sleep();" dicht definiert ist.

    Sorry, dass ich euch nerve aber ich bin leider ein totaler Anfänger 😕

    TheScripti


  • Mod

    Das war Skym0sh0 zu übereifrig, das Sleep kommt aus windows.h. Wobei ich inh gut verstehen kann: Wozu soll das sleep da gut sein und wieso ist es das Wert, sich an Windows zu ketten, wenn man ansonsten ziemlich portables Programm hat?



  • Stimmt...



  • Aber noch eine Sache.
    Wenn ich es ausführe, dann
    steht folgendes da:
    exit <1>
    Datei codieren <2>
    Datei decodieren <3>

    [wenn ich 2 eingebe und enter drücke:]
    Text:
    Code:

    exit <1>
    Datei codieren <2>
    Datei decodieren <3>

    Ich hab also keine Möglichkeit mehr den Text einzugeben

    Wieso nicht?

    Danke im voraus...
    TheScripti


Anmelden zum Antworten