AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehlermeldung bei der Ausgabe eines Char array
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung bei der Ausgabe eines Char array

Ein Thema von Chaosente · begonnen am 15. Mär 2007 · letzter Beitrag vom 15. Mär 2007
Antwort Antwort
Chaosente

Registriert seit: 20. Aug 2006
80 Beiträge
 
#1

Fehlermeldung bei der Ausgabe eines Char array

  Alt 15. Mär 2007, 19:10
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Fehlermeldung bei der Ausgabe eines Char array

  Alt 15. Mär 2007, 19:18
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Fehlermeldung bei der Ausgabe eines Char array

  Alt 15. Mär 2007, 19:19
Dynamische Arrays laufen von 0 bis Länge - 1. Strinsg von 1 bis Länge.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chaosente

Registriert seit: 20. Aug 2006
80 Beiträge
 
#4

Re: Fehlermeldung bei der Ausgabe eines Char array

  Alt 15. Mär 2007, 19:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Fehlermeldung bei der Ausgabe eines Char array

  Alt 15. Mär 2007, 19:46
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz