Unerlaubter Speicherzugriff unter C++

lBr1anl

New member
Hi,

folgendes Problem: Es geht um ein C++-Programm, welches eine Datei auslesen und jedes Wort einzeln mit seiner Länge als Schlüssel im Cäsarchiffre verschlüsseln soll.
Um das zu realisieren habe ich eine Klasse definiert, die als Variablen einmal den zu ver- oder entschlüsselnden String selbst (phrase) sowie die Länge des Strings (length) besitzt.
Die Methoden sind die Folgenden:

getstring() - Gibt den aktuellen String zurück
setstring(string newphrase) - Setzt einen neuen String, berechnet dessen Länge und schreibt diese in length
encode() - Kodiert den aktuell in phrase abgespeicherten String
decode() - Dekodiert den aktuell in phrase abgespeicherten String

Wenn ich das ganze jetzt allerdings kompiliere und ausführen will, so wird mir als Fehlermeldung folgendes angezeigt:
"Anweisung in 0x00430fe6 verweist auf Speicher in 0x0000006f. Anweisung "read" kann nicht auf dem Speicher durchgeführt werden"

Wo liegt mein Fehler? Ich habe das Problem schon so weit eingekreist, dass es irgendwo in word.encode() liegt. Wird diese Zeile auskommentiert, so tritt der Fehler nicht auf (das Programm macht allerdings auch nichts sinnvolles mehr).

Hier noch die beiden Dateien:
main.cpp
Code:
#include <cstdlib>
#include <iostream>
#include "words.h"
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    word bla;
    bla.setphrase("hallo");
    bla.encode();
    cout<<bla.getphrase()<<endl;
    cin.get();
    return 0;
}
words.h
Code:
#include <string>

using namespace std;

class word
{

private:
        string phrase;
        int length;
        
public:
       void setphrase(string newphrase)
       {
            phrase = newphrase;
            length = (int)phrase.length();
       }
       
       string getphrase()
       {
              return phrase;
       }
       
       void encode()
       {
          int ASCII[255];
          int newASCII;
          for (int recentLetter=1; recentLetter<=length; recentLetter++)
          {
              // Array mit ASCII-Werten der Zeichen füllen
              ASCII[recentLetter-1]=(int)phrase[recentLetter-1];
          }
          for (int recentLetter=1; recentLetter<=length; recentLetter++)
          {
              newASCII = ASCII[recentLetter-1]+length;
              if(newASCII>122) 
                               newASCII=newASCII-26;
              phrase[recentLetter-1]=(char)newASCII;
          }  
       }
       
       void decode()
       {
            int ASCII[255];
            int newASCII;
          for (int recentLetter=1; recentLetter<=length; recentLetter++)
          {
              // Array mit ASCII-Werten der Zeichen füllen
              ASCII[recentLetter-1]=(int)phrase[recentLetter-1];
          }
          for (int recentLetter=1; recentLetter<=length; recentLetter++)
          {
              newASCII = ASCII[recentLetter-1]-length;
              if(newASCII<97) 
                               newASCII=newASCII+26;
              phrase[recentLetter-1]=(char)newASCII;
          }
       }
};
EDIT: For-Schleifen korrigiert
 

lBr1anl

New member
Verdammt... das kommt davon, wenn man denkt, die Syntax nach 'ner langen Pause noch zu können :D

Ändert aber leider nichts am Problem des Laufzeitfehlers :(
 

Harry Boeck

New member
Also, wenn die Plätze von Bedingungstest und Inkrement korrigiert sind und Du garantierst, daß Deine Strings nie länger als 254 Byte Nutzlast sind, sollte es funktionieren. Falls es immer noch nicht funktioniert: Poste mal den jetzt aktuellen Code...
 

lBr1anl

New member
Ich hab' den Code schon im Ausgangsposting korrigiert, damit das hier nicht zu unübersichtlich wird, mit seitenweise Code. Aktualisierte Quelldateien hängen auch an.
 

naluwana

New member
Bei mir kompiliert das so gar nicht erst: Weil words.h eine Quelltext-Header-Datei ist, habe ich die spitzen Klammern in Zeile 3 durch Anführungszeichen ersetzt:
#include "words.h"
Dann funktioniert es problemlos (mit g++ 4.1.3). Aber wenn sich Dein Compiler nicht darüber beschwert, kann es daran ja wohl nicht liegen. Welchen Compiler benutzt Du?
 

lBr1anl

New member
Ich benutze Bloodshed Dev-C++ und hab' ihm auch schon in den Projektoptionen gesagt, dass er den Projektordner beim kompilieren nach Header-Dateien durchsuchen soll. Beim posten hab' ich da dann gar nicht mehr drauf geachtet, ich werd' den Code und die angehängten Dateien sofort updaten. Danke für den Tipp.

Das Problem ist halt wirklich ein Laufzeitfehler, der wohl was mit der Speicherverwaltung zu tun hat. Ich werd' über Nacht, bzw. Morgen früh mal einen RAM-Test laufen lassen, um ein Hardware-Problem auszuschließen.

EDIT: Der Speichertest zeigt keine Probleme, es muss also irgendwo am Programm liegen.
 

Extinction

New member
?( ?( ?(
Ich hab den Anhang aus dem ersten Post entpackt und ausprobiert. Funktioniert einwandfrei.
Siehe Screen im Anhang.
 

lBr1anl

New member
Ich hab' Dev-C++ inklusive Compiler mal neu installiert, das Projekt geladen und neu kompiliert und auf einmal funktioniert's... verrückte Welt...

Wie auch immer, das Thema kann von mir aus zu. Danke an alle, die geholfen haben :)
 

CDW

Moderator
Mitarbeiter
Original von lBr1anl
Ich hab' Dev-C++ inklusive Compiler mal neu installiert, das Projekt geladen und neu kompiliert und auf einmal funktioniert's... verrückte Welt...

Wie auch immer, das Thema kann von mir aus zu. Danke an alle, die geholfen haben :)
Wahrscheinlich wurde das Modul nicht neukompiliert. Kenne solche Macken eigentlich nur von NetBeans (ok, in C &Co mache ich auch nichts ;) ). Abhilfe schafft hier ein "Clean Project" oder "Rebuild All" (wie es auch immer in Dev heißen mag) - damit erzwingt man eine vollständige rekompilierung.
 

lBr1anl

New member
Ich hab' so eine ähnliche Funktion gefunden: "Alles erneuern". Die werd' ich dann mal ausprobieren, wenn sowas das nächste Mal auftritt. Ich dachte eigentlich, dass mit einem neuen Kompilieren alle wichtigen Dateien neu geschrieben worden wären.
Danke für den Tipp :)
 
Oben