![]() |
String ersetzen/ Zugriffsverletzung
Morgen liebe Community,
tut mir leid falls ich eine ungeschickte Anfängerfrage stelle, allerdings habe ich neulich angefangen in Delphi zu programmieren und wolle mit einem kleinen Programm starten, in diesem Fall: Hangman. Dabei habe ich in einem Edit-Feld die Länge des gesuchten Wortes in _ Zeichen Ein Buchstabe wird eingegeben und das Zeichen soll durch den Buchstaben ersetzt werden. Das Kompilieren ist kein Problem, doch wenn ich auf den Button klicke der die Funktion ausführen soll bekomme ich folgende Fehlermeldung: "Zugriffsverletzung bei Adresse 005115DE in Modul 'ProjectHangman.exe'. Schreiben von Adresse 00000000." Die Variablen habe ich folgender Maßen deklariert:
Delphi-Quellcode:
WortLaenge ist eine globale Variable
var buchstabenLaenge : integer;
var buchstabe : string; var I : integer; var count : integer; var lösung : string Der Fehler findet in dieser Schleife statt:
Delphi-Quellcode:
Konnte mit Google den Fehler nicht finden^^
for I := 1 to wortLaenge do
begin if eingabe1[count]=buchstabe[1] then begin lösung[count]:=buchstabe[1]; end; count := count +1; end; Wenn ich den Debugger benutze, werde ich an folgende Stelle gebracht
Delphi-Quellcode:
Thread-Start: Thread-ID: 1728. Prozess ProjectHangman.exe (1284)
begin
Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end. Kann damit nichts anfangen :( Wärt ihr so nett mich aufzuklären?^^ |
AW: String ersetzen/ Zugriffsverletzung
Delphi-Quellcode:
Deine Schleifevariable heißt I
for I := 1 to wortLaenge do
begin if eingabe1[count]=buchstabe[1] then begin lösung[count]:=buchstabe[1]; end; count := count +1; end; Du nutzt aber das nicht initialisiert count um auf einzelne Zeichen Deines Strings zuzugreifen. Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
meinst du ich sollte count durch I ersetzen?
in dem fall bekomme ich allerdings die gleiche fehlermeldung |
AW: String ersetzen/ Zugriffsverletzung
Zeig doch mal die ganze Methode. Ist Buchstabe initialisiert, und wieso ist das ein String, würde Char nicht genügen?
|
AW: String ersetzen/ Zugriffsverletzung
Delphi-Quellcode:
Welche Delphi-Version nutzt Du >= 2009 dann hat Dein String pro Buchstaben zwei 2Byte.for i := 1 to length(eingabe1) do begin if eingabe1[i]=buchstabe[1] then begin lösung[i]:=buchstabe[1]; end; end; Dann könntest Du auf AnsiString ausweichen. Eingabe1 ist ein String - oder ist es eine Edit-Componente? Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
Hast du Count initialisiert?
Setz mal vor der Schleife Count auf 1! |
AW: String ersetzen/ Zugriffsverletzung
Zitat:
|
AW: String ersetzen/ Zugriffsverletzung
was noch fehlt ist die Länge von Lösung zu setzen.
Delphi-Quellcode:
@DeddyH: Ja, da hast Du Recht.
setLength(Lösung,length(Eingabe1));
Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
anscheinend hab ich noch viel zu lernen ;)
setLength(Lösung,length(Eingabe1)); wo soll ich das einsetzen? in der schleife? |
AW: String ersetzen/ Zugriffsverletzung
Wie ich schon sagte:
Zitat:
|
AW: String ersetzen/ Zugriffsverletzung
Zitat:
Zitat:
Am besten nachdem Eingabe1 gefüllt wurde. Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
Delphi-Quellcode:
var
Form1: TForm1; var eingabe1 : string; var wortLaenge : integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var I : integer; begin eingabe1 := edit1.text; wortLaenge := length(eingabe1); for I := 1 to wortLaenge do begin edit3.Text:=edit3.Text+'_'; end; end; procedure TForm1.Button2Click(Sender: TObject); var buchstabenLaenge : integer; var buchstabe : char; var I : integer; var lösung : string; begin buchstabe := edit2.Text[1]; buchstabenLaenge := length(buchstabe); if buchstabenLaenge>=2 then begin label2.Caption:= 'Bitte geben sie nur einen Buchstaben ein!'; end else begin for I := 1 to wortLaenge do begin if eingabe1[I]=buchstabe then begin lösung[I]:=buchstabe; end; end; end; end; |
AW: String ersetzen/ Zugriffsverletzung
Zitat:
Du mußt den Debugger auch mal richtig benutzen. Haltepunkte da setzen, wo der eigentliche Fehler vermutet wird und dann im Einzellschritt weiter. Notfalls direkt in der DPR mit Debuggen anfangen. - mit F8 so lange weiter, bis es knallt 1: - immer den letzen Befehl merken - dort einen Haltepunkt drauf - neu anfangen im debuggen (Strg+F2 und dann F9) - mit F7 ein Stück rein - und dann eventuell wieder mit F8 weiter, bis es knallt ... neuen Haltepunkt setzen (Alten löschen) - wenn dort ein Funktionsaufruf ist und darin wieder eigener Code steckt, dann zurück zu 1 - hier hast du ja nun schon einen Haltepunkt, also kann man notfalls auch mehrmals diese Stelle untersuchen (neu Anfangen mit Debuggen, bzw. Ereignis neu ausläösen, welches diesen Code aufruft) - diese Stelle untersuchen, also Variablen ansehn und prüfen ob auch das drin ist, was drin sein sollte - usw. PS: Warum sind eingabe1 und wortLaenge globale Variablen? (es gehört ja wohl eher zur Form, bzw. zu Methoden die in TForm1 stecken, also gehört es auch in diese Klasse/TForm1 rein ... z.B. ins "Private") |
AW: String ersetzen/ Zugriffsverletzung
buchstabenLaenge ist garantiert immer 1, da ein Char per Definitionem genau einem Zeichen entspricht. Und vor der Schleife
Delphi-Quellcode:
musst Du lösung noch auf die Länge wortLaenge setzen.
for I := 1 to wortLaenge do
Delphi-Quellcode:
SetLength(lösung, wortLaenge);
|
AW: String ersetzen/ Zugriffsverletzung
.. wird dasn eine Art von Hangman Spiel?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var I : integer; begin eingabe1 := edit1.text; setLength(lösung, length(eingabe1)); wortLaenge := length(eingabe1); for I := 1 to wortLaenge do begin edit3.Text:=edit3.Text+'_'; end; end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var buchstabenLaenge : integer; var buchstabe : char; var I : integer; //var lösung : string; begin Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
ich bekomme zwar keine fehlermeldungen mehr, aber der buchstabe wird auch nicht ersetzt
wenn ich button2 klicke passiert gar nichts |
AW: String ersetzen/ Zugriffsverletzung
Zitat:
Grüße Klaus |
AW: String ersetzen/ Zugriffsverletzung
oh mann was für ein blöder fehler^^
vielen dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz