Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Klasse und EInvalidPointer (https://www.delphipraxis.net/35844-problem-mit-klasse-und-einvalidpointer.html)

apoc 12. Dez 2004 15:14


Problem mit Klasse und EInvalidPointer
 
Also ich habe eine Klasse in einer Unit, mein Problem ist das ich einen EInvalidPointer-Fehler bekomme ohne ersichtlichen Grund. In meiner Hauptunit tue ich nicht viel ich lege ein neues Objekt der Klasse an und führe eine Funktion der Klasse aus. Ich bekomme auch eine Warnung das das Objekt möglicherweise nicht Initialisiert wurde, aber ich möchte/brauche und habe keinen Konstruktor/Dekonstruktor ?!

Diese Funktion legt die größe eines Dynamischen Arrays von einem Record fest. Das Funktioniert nur wenn ich das Array in "public" anlege, warum ? wenn ich es als private anlege funktioniert es nicht. Dabei sollte es eigendlich private sein und das die Funktion als public definiert ist sollte doch wohl auch keine Probleme machen. Ich frage mich weshalb da Object Pascal einen unterschied macht.

So, also wenn ich es als public definiere komme ich wenigstens ans ende der Funktion erst wenn ich aus der Funktion wieder zurück zur Hauptunit springe kommt der Fehler und das Programm bricht ab. Also eigendlich ist es eine procedure und sie scheint auch zu funktionieren.

jim_raynor 12. Dez 2004 15:29

Re: Problem mit Klasse und EInvalidPointer
 
Du musst keinen eigenen Constructor definieren. Allerdings musst du ein Objekt ganz normal mit Variable:=TKlasse.Create erstellen. Wenn du nur eine Variable hast, wird das Objekt selber noch nicht angelegt.

Delphi-Quellcode:
var
  myObj: TMyClass;
begin
  myObj:=TMyClass.Create;
  // Mache was mit myObj

  // Speicher wieder freigeben.
  myObj.Free;
[edit]Zumindestens Warnungen sollte man ernst nehmen. Es sind nicht umsonst Warnungen ;)

apoc 12. Dez 2004 15:37

Re: Problem mit Klasse und EInvalidPointer
 
danke schonmal für die schnelle Antwort
also ich hab das jetzt eingebunden was du gesagt hast aber der fehler kommt leider immernoch.

jim_raynor 12. Dez 2004 15:40

Re: Problem mit Klasse und EInvalidPointer
 
Tja, dann. Quellcode her. Wahrsagen können wir nicht ;)

fkerber 12. Dez 2004 15:41

Re: Problem mit Klasse und EInvalidPointer
 
HI!

Herzlich Willkommen in der DP.

Wie sieht denn dein Quellcode im Moment aus? Poste ihn am besten mal hier.


Ciao Frederic

apoc 12. Dez 2004 15:52

Re: Problem mit Klasse und EInvalidPointer
 
ok also hier die Klasse (auszugsweise)

Delphi-Quellcode:
unit Bricks;

interface

uses
  SysUtils,
  IniFiles;

type
brick = record
   x, y   : Integer;         // x, y Position des Bricks (auf dem Bildschirm)
  world_y : Integer;       // die y Welt koordinate
  w, h   : Integer;         // die Breite und Höhe, Breite muss durch 16 teilbar sein
 (...)
end;

{* Diese Klasse ist für das Anlegen, Zeichnen und Bewegen der
 * Bricks zuständig.
 *}
TBricks = class

   private
      {* zugriff auf die Brick INI Datei
       *}
    iniFile : TIniFile;

  public

     {* In diesem dynamischen Array von Bricks sind alle Bricks gespeichert
       *}
      bricks : Array of brick;

    {* läd die INI Datei im Filename, legt entsprächend viele bricks an und
     * speichert die Daten in dem bricks Array
       *}
     procedure CreateFromINI(Filename : String);


end;

implementation

{* läd die INI Datei im Filename, legt entsprächend viele bricks an und
 * speichert die Daten in dem bricks Array
 *}
procedure TBricks.CreateFromINI(Filename : String);
var i,i2 : Integer;
    i2str : String;
begin
  iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0))+Filename);

  Write('Suche Bricks in '+Filename+'...');

  // suche nach Bricks in Datei und speichere die Anzahl in i
  i := 1;
  while iniFile.ReadString('brick'+IntToStr(i), 'x', 'NULL') <> 'NULL' do
    Inc(i);
  Dec(i);

  Writeln(IntToStr(i)+' Brick gefunden');

  // um Speicherleaks zu vermeiden wird setLength nur einmal aufgerufen
  setLength(bricks,i);

  Write('Speichere Bricks in dynamisches Array...');

  for i2 := 1 to i do
  begin
    i2str := IntToStr(i2);

    bricks[i2].x           := StrToInt(iniFile.ReadString('brick'+i2str, 'x', '0'));
    bricks[i2].world_y := StrToInt(iniFile.ReadString('brick'+i2str, 'world_y', '0'));
    bricks[i2].w           := StrToInt(iniFile.ReadString('brick'+i2str, 'w', '0'));
    bricks[i2].h           := StrToInt(iniFile.ReadString('brick'+i2str, 'h', '0'));
 (...)
  end;

  Writeln('done');

  iniFile.Free;
end;


end.
so und hier die unit die die klasse aufruft

Delphi-Quellcode:
program main;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Bricks in 'Bricks.pas';

var
  OBricks : TBricks;

begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }

  OBricks:=TBricks.Create;

  OBricks.CreateFromINI('bricks.ini');

  OBricks.Free;
end.

jim_raynor 12. Dez 2004 16:00

Re: Problem mit Klasse und EInvalidPointer
 
dynamische Arrays in Delphi beginnen bei 0. Du musst also deine Schleife ändern:

for i2 := 0 to i-1 do

apoc 12. Dez 2004 16:13

Re: Problem mit Klasse und EInvalidPointer
 
das wars dann wohl jetzt funktionierts ! also big thx !
Irgendwie ist das mit den Arrays in Delphi ziemlich verwirrend. Normalerweise programmiere ich in C/C++ nur jetzt halt weil ich das in meiner Ausbildung lerne und da haben sie uns erzählt das Delphi bei Arrays mit 1 anfängt zu zählen. Naja wie auch immer jetzt funzt es ja.

Das ging ja echt mal schnell mit der Lösung meines Problems. Tolle Community ich hoffe das ich auch irgendwann mal was dazu beitragen kann :)

jim_raynor 12. Dez 2004 17:20

Re: Problem mit Klasse und EInvalidPointer
 
Zitat:

Zitat von apoc
dda haben sie uns erzählt das Delphi bei Arrays mit 1 anfängt zu zählen.

Glaube nicht alles was du hörst :)

Bei statischen Arrays mag das stimmen, da man dort den Index selber festlegen kann.

z.B.:
Delphi-Quellcode:
type
  TTestArray = Array[1..10] of Integer
Dann würde der Index auch tatsächlich erst bei eins anfangen. Aber in allen anderen Fällen mit 0.
Nicht das da jemand Delphi mit VB verwechselt hat :roll2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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