Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlermeldung bei der Ausgabe eines Char array (https://www.delphipraxis.net/88461-fehlermeldung-bei-der-ausgabe-eines-char-array.html)

Chaosente 15. Mär 2007 18:10


Fehlermeldung bei der Ausgabe eines Char array
 
Bin grad dabei ein Hangman spiel zu Programmieren... hab dafür ne eigene klasse geschrieben. Wenn ich im FormCreate nun per for schleife mein char array ausgeben lasse, dann funktionierts perfekt ohne Fehlermeldung... aber wenn ich etwas in meinem array verändere und dann das selbe noch mal versuche kriege ich folgenden Fehler:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt HangMan.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 004527AF in Modul 'HangMan.exe'. Schreiben von Adresse FFFFFFFF' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Hier noch mein Code der Klasse:
Delphi-Quellcode:
unit HangManClasses;

interface

uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs ;

type
  THangManWord = class
  private
    FWord: string;
    FCharWord: array of char;
    FWordLength: integer;
    function ClearWord: boolean;
    function GetCharWord(index: integer): char;
    procedure SetCharWord(index: integer; a: char);
  public
    property Word: string read FWord write FWord;
    property CharWord[index: integer]: char read GetCharWord write SetCharWord;
    property WordLength: integer read FWordLength write FWordLength;
    procedure NewWord(a: string);
    procedure TestLetter(a: Char);
  end;

implementation

function THangManWord.ClearWord: boolean;
begin
  try
    FWord:='';
    FWordLength:=0;
    result:=true;
  except
    result:=false;
  end;
end;

function THangManWord.GetCharWord(index: integer): char;
begin
  result:=FCharWord[index];
end;

procedure THangManWord.SetCharWord(index: integer; a: char);
begin
  FCharWord[index]:=a;
end;

procedure THangManWord.NewWord(a: string);
var i:integer;
begin
if ClearWord = true then
  begin
     Word:= a;
     WordLength:= Length(a);
     SetLength(FCharWord, WordLength);
     for i:=0 to WordLength do
      begin
        FCharWord[i]:='_';
      end;
  end;
end;

procedure THangManWord.TestLetter(a: Char);
var i:integer;
begin
  for i:=0 to WordLength do
    begin
      if Word[i] = a then
        begin
          SetCharWord(i,a);
        end;
    end;
end;

end.
Und hier mein Formular: (beim Button1OnClick passiert der fehler);
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, HangManClasses, StdCtrls;

type
  TFormMain = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormMain: TFormMain;
  HangManWord: THangManWord;

implementation

{$R *.dfm}

procedure TFormMain.FormCreate(Sender: TObject);
var i:integer; output:string;
begin
HangManWord:=THangManWord.Create;
HangManWord.NewWord('heiko');
SetLength(output,hangmanword.WordLength);
for i:=0 to HangManWord.WordLength do
  begin
    output[i]:=HangManWord.CharWord[i];
  end;
edit1.Text:=output;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
HangManWord.Free;
end;

procedure TFormMain.Button1Click(Sender: TObject);
var a:char; output: string; i:integer;
begin
a:=edit2.text[1];
Hangmanword.TestLetter(a);
for i:=0 to HangManWord.WordLength do
  begin
    output[i]:=HangManWord.CharWord[i];
  end;
edit1.Text:=output;
end;

end.

Christian Seehase 15. Mär 2007 18:18

Re: Fehlermeldung bei der Ausgabe eines Char array
 
Moin Chaosente,

ich denke mal, dass der Fehler darin besteht, dass Du immer bis WordLength durch die Schleifen gehst.
Da aber der Index bei 0 anfängt, ist die Obergrenze WordLength-1.

Du könntest es natürlich auch mal mit high(output) bzw. den anderen Arraybezeichnern für die Obergrenze versuchen.

Luckie 15. Mär 2007 18:19

Re: Fehlermeldung bei der Ausgabe eines Char array
 
Dynamische Arrays laufen von 0 bis Länge - 1. Strinsg von 1 bis Länge.

Chaosente 15. Mär 2007 18:43

Re: Fehlermeldung bei der Ausgabe eines Char array
 
Muss euch enttäuschen, lag daran, das ich beim zweiten mal vorher nciht die länge des strings festgelegt hatte in dem ausgegeben wird, aber trotzdem danke.

Luckie 15. Mär 2007 18:46

Re: Fehlermeldung bei der Ausgabe eines Char array
 
Hier muss es krachen:
Delphi-Quellcode:
procedure THangManWord.NewWord(a: string);
var i:integer;
begin
if ClearWord = true then
  begin
     Word:= a;
     WordLength:= Length(a);
     SetLength(FCharWord, WordLength);
     for i:=0 to WordLength do
      begin
        FCharWord[i]:='_';
      end;
  end;
end;
Wenn FCharWord das dynamische Char-Array ist. Begründung siehe oben.

Und diese Schleife:
Delphi-Quellcode:
procedure THangManWord.TestLetter(a: Char);
var i:integer;
begin
  for i:=0 to WordLength do
    begin
      if Word[i] = a then
        begin
          SetCharWord(i,a);
        end;
    end;
end;
muss von ein bis WordLength laufen, Word ein String ist.

Auch hier sollte es krachen:
Delphi-Quellcode:
procedure TFormMain.Button1Click(Sender: TObject);
var a:char; output: string; i:integer;
begin
a:=edit2.text[1];
Hangmanword.TestLetter(a);
for i:=0 to HangManWord.WordLength do
  begin
    output[i]:=HangManWord.CharWord[i];
  end;
edit1.Text:=output;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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-2025 by Thomas Breitkreuz