Habe ein kleines Problem



  • Hallo, ich habe immernoch ein Problem mit meiner Funktion die auch schon in meinem letzten Beitrag gezeigt habe. Ich habe sie Modifiziert zbd sie funtioniert nicht.

    for(pos1 = 0 ; pos1 <= 1000 ; pos1++)
    {
       text[pos1] = text[pos1] + ((code[pos2][pos_fest]) + vergroesserungswert);                          
    
       if(pos2 == 0)
            pos2 = 25;
    
       pos2--;
     }
    

    Das Programm soll den text[pos1] um eine bestimmte zahl erhöhen (code[][])
    Mein Problem ist nur das wenn der Code hinterher mit printf ausgegeben wird
    das programm ganz of piept (!) und dann Abstürtzt. Was ich beobachtet habe ist das das programm nur absürtzt wenn vergroesserungswert != 0 ist, sonst funtioniert es immer, aber sobalt es 1 oder 2 ist gibts einen Absturtz.

    Ich habs auch schon so probiert :

    for(pos1 = 0 ; pos1 <= 1000 ; pos1++)
    {
       code_operation = code[pos2][pos_fest];
       code_operation = code_operation + vergroesserungswert;
       text[pos1] = text[pos1] + code_operation;
    
       if(pos2 == 24)
             pos2 = -1;
    
     pos2++;
    }
    

    Aber das hat auch nichts gebracht... Bin echt Ratlos...

    EDIT : vergroesserungswert , code_operation und text[1001] = char , anderes = short



  • Wie ist denn die Fehlermeldung? Und in welcher Zeile passiert der Fehler? Bist du schon mal schrittweise mit dem Debugger durchgesteppt? Der Debugger sollte das Mittel deiner Wahl sein, um den Fehler zu finden, aber ich vermute mal, dass du ihn bislang gar nicht benutzt hast, oder?

    Wieviele Elemente hat "text" denn? Vielleicht 1000? Dein Code verlangt jedenfalls, dass es 1001 Elemente sind. Wenn du dies nicht willst, verwende in der Abbruchbedingung der for-Schleife "<" statt "<=".



  • Nun, die Variable char text[1001] hab ich so geschrieben. Die Fehlermeldung kommt wenn ich den text dann mit printf ausgeben will. Dann stehen da komische Zeichen (soll ja auch so sein) Aber das programm hängt sich auf nach ner Zeit (5 - 15) kommt das ein Problem festgestellt wurde und das Programm beendet werden muss. Typisches Windows fehlerfenster



  • NoName57253 schrieb:

    Nun, die Variable char text[1001] hab ich so geschrieben. Die Fehlermeldung kommt wenn ich den text dann mit printf ausgeben will. Dann stehen da komische Zeichen (soll ja auch so sein) Aber das programm hängt sich auf nach ner Zeit (5 - 15) kommt das ein Problem festgestellt wurde und das Programm beendet werden muss. Typisches Windows fehlerfenster

    Du hast dein Programmm nicht als Debug-Version, sondern als Release-Version erstellt! Mach mal einen Debug-Build und starte das Programmm aus der Entwicklungsumgebung heraus, dann bekommst du auch eine vernünftige Fehlermeldung und siehst die genaue Stelle, an der es kracht.

    Du musst dich wirklich mal mit dem Thema Debugger auseinandersetzen. Dann fängst du nämlich an, gezielt und mit vertretbarem Zeitaufwand zu debuggen. Der Debugger ermöglicht dir z.B., Haltepunkte im Code zu setzen, das Programm schrittweise (Zeile für Zeile) auszuführen und Variableninhalte zu überprüfen. Was du im Moment machst, ist eher raten. 😉

    Btw, wenn es an irgendeiner bestimmten Stelle kracht, wieso postest du diese Stelle dann nicht?



  • Beschäftige dich mal mit ASCII: http://de.wikipedia.org/wiki/ASCII

    Es gibt druckbare und nichtdruckbare Zeichen und '\0'.

    Nebenbei wäre es auch wichtig zu wissen wie groß code[][] ist.



  • Ich glaube mit nicht druckbaren und druckbaren Zeichen hat das nichts zu tun, denn es stürtzt nur ab wenn vergroesserungswert != 0 ist, der eingegene Text ist dabei egal. Die Variable code hat [25][25] elemente

    const short engine_1 = 1;
    
        while(unendlich == 0)  // Erste Schleife                                                                                              1
        {
                        system("cls");
                        printf("Bitte waehlen sie aus, ob sie einen Text eingeben\noder einen Text aus einer Datei Laden wollen.\n\n1 = Laden\n2 = Eingabe\n3 = Zurueck\n0 = Beenden\n\nIhre Wahl : ");
                        scanf("%ld", &eingabe);
    
                        if(eingabe == 1)
                                   laden();              // Wenn eigabe = 1 , dann gehe zu einer Funktion fuer noch nicht geschiebene Programmteile
                        else if(eingabe == 2)
                                   texteingabe();        // gehe Zur Funktion zur Texteingabe
                        else if(eingabe == 3)
                                   return(0);            // gehe zu main
                        else if(eingabe == 0)                 
                                   ende(0);              // beende das Programm
                        else 
                             continue;
    
                        engine(engine_1);   // Hier wird die verschlüsselung aufgerufen ( Rückkehr durch return(0); )
    
                        while(unendlich == 0)
                        {
                                        system("cls");
                                        printf("%s", &text[0]);// Abesturtz nach Ausgabe
                                        printf("\n\nWollen sie diesen Code Exportiren ?\n\n1 = Exportieren\n2 = Text neu eingeben\n3 = Zurueck zur Auswahl\n0 = Beenden\n\nIhre Wahl : ");
                                        scanf("%ld", &eingabe);  
    
                                        if(eingabe == 1)
                                                   speichern();
                                        else if(eingabe == 2)
                                                   {
                                                   system("cls");     
                                                   texteingabe();
                                                   engine(engine_1);
                                                   continue;
                                                   }
                                        else if(eingabe == 3)
                                                   return(0);
                                        else if(eingabe == 0)
                                                   ende();
                                        else
                                                   ;
                        }
        }
    }
    


  • Aufgrund des %s im Format-String erwartet printf(), dass text ein char-Array ist, welches einen String enthält. Strings werden mit einem NULL-Character ('\0') abgeschlossen.

    Für mich sieht es so aus, als würde deine Kodierungsfunktion den abschließenden NULL-Character mit verändern. Das solltest du mal überprüfen. Wenn dem so ist, dann kann printf() das Ende des Strings eventuell nicht mehr erkennen und es kommt irgendwann unweigerlich zu einem Speicherzugriffsfehler, wenn nicht irgendwo zufällig eine Null in deinem text-Array steht.



  • sgriege schrieb:

    Aufgrund des %s im Format-String erwartet printf(), dass text ein char-Array ist, welches einen String enthält. Strings werden mit einem NULL-Character ('\0') abgeschlossen.

    Für mich sieht es so aus, als würde deine Kodierungsfunktion den abschließenden NULL-Character mit verändern. Das solltest du mal überprüfen. Wenn dem so ist, dann kann printf() das Ende des Strings eventuell nicht mehr erkennen und es kommt irgendwann unweigerlich zu einem Speicherzugriffsfehler, wenn nicht irgendwo zufällig eine Null in deinem text-Array steht.

    Danke, werd mir ma ne Lösung ausdenken und Ausprobieren 🙂



  • NoName57253 schrieb:

    Ich glaube mit nicht druckbaren und druckbaren Zeichen hat das nichts zu tun, denn es stürtzt nur ab wenn vergroesserungswert != 0 ist, der eingegene Text ist dabei egal. Die Variable code hat [25][25] elemente

    Aber mit '\0'. 🙂

    NoName57253 schrieb:

    text[pos1] = text[pos1] + ((code[pos2][pos_fest]) + vergroesserungswert);                          
       if(pos2 == 0)
            pos2 = 25;
    

    pos2 darf nur von 0 bis 24 laufen (bzw. von 24 bis 0) oder du brauchst code[26[26]

    Sollen wirklich alle Zeichen verändert werden oder nur Buchstaben?



  • DirkB schrieb:

    pos2 darf nur von 0 bis 24 laufen (bzw. von 24 bis 0) oder du brauchst code[26[26]

    Das tut es auch, pos2 wird direkt nach der Zuweisung (pos2 = 25) dekrementiert.



  • Habe es jetzt geschafft. Ich kontrolliere erst wo das Null_byte zeichen (oder wie das heißt) nach der eingabe ist und setze es nach der Kodierung an die gleiche stelle. Alles Funktioniert. Danke für die Hilfe! 🙂


Anmelden zum Antworten