Toon posts:

[Delphi] Dynamic array declareren in class

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met het gebruik van dynamische array's in een class.

Compilen gaat perfect maar bij het afsluiten van het programma krijg ik een foutmelding. Ik hoop dat iemand een oplossing heeft.


foutmelding: Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped.


De class declaratie

code:
1
2
3
4
5
6
7
  TTest = class
  public
    TestArray : array of integer;

    constructor Create();
    destructor Destroy();
  end;


constructor en destructor

code:
1
2
3
4
5
6
7
8
9
10
11
constructor TTest.create();
begin
  inherited create();
  setLength(TestArray,6);
end;

destructor TTest.Destroy();
begin
  TestArray := nil;
  inherited destroy();
end;



test code(draait goed)

code:
1
2
3
4
5
6
7
8
9
  var 
    TestClass : TTest;
  begin
    TestClass.Create();
    TestClass.TestArray[1]:= 10;
    TestClass.TestArray[2]:= 10;
    TestClass.TestArray[3]:= 10;
    TestClass.Destroy();
  end;

  • Monga
  • Registratie: Mei 2002
  • Laatst online: 22:43
Ik ken heb het probleem ook gehad. Bij mij was de oplossing:
code:
1
 Pointer(TestArray) := nil;

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17:27

Hu9o

Schokkend

Ik probeer het ff snel naar te maken. Maar het lukt niet om de constructor te compilen
code:
1
2
3
4
5
6
7
  TTest = class
  public
    TestArray : array of integer;

    constructor Create();   //<== Fout
    destructor Destroy();
  end;

Ik krijg de fout:
Unsatisfied forward of external declaration: TTest.Create
Unsatisfied forward of external declaration: TTest.Destroy


maar over jou fout:
Heeft het te maken dat je het record nog moet aanmaken? new(testarray[1])); :?

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • Monga
  • Registratie: Mei 2002
  • Laatst online: 22:43
Hu9o schreef op 17 september 2002 @ 21:37:
Ik probeer het ff snel naar te maken. Maar het lukt niet om de constructor te compilen
code:
1
2
3
4
5
6
7
  TTest = class
  public
    TestArray : array of integer;

    constructor Create();   //<== Fout
    destructor Destroy();
  end;

Ik krijg de fout:
Unsatisfied forward of external declaration: TTest.Create
Unsatisfied forward of external declaration: TTest.Destroy


maar over jou fout:
Heeft het te maken dat je het record nog moet aanmaken? new(testarray[1])); :?
euh....
- Dit is Delphi (new gebruik je zeeeer zelden...)
- Wel alle code copy/pasten... Implementatie van constructor etc stond ook in zn post

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je hoeft een dynamisch array niet vrij te geven, dat gaat vanzelf. Geen := nil doen.

En je hoort geen Destroy aan te roepen. Roep Free aan. Die roept Destroy voor jouw aan.

We adore chaos because we like to restore order - M.C. Escher


  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17:27

Hu9o

Schokkend

Dat dit delphi is dat weet ik... Staat in subject namelijk en ik herken de syntax ook wel.

Ik zelf gebruik nooit zelfgemaakte types (lees snap het niet)
maar ik heb de volgende code dus ff gemaakt

En als ik op de knop druk, dan verdwijnt deze. Waarom is dit? Want ik zou toch zeggen dat TestClass vrijgegeven zou moeten worden :? Maar ik krijg geen error tijdens het afsluiten. en zonder de .FREE wel.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTest = class
  public
    TestArray : array of integer;
    constructor Create();
    destructor Destroy();
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TTest.create();
begin
  inherited create();
  setLength(TestArray,6);
end;

destructor TTest.Destroy();
begin
  TestArray := nil;
  inherited destroy();
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  TestClass : TTest;
begin
  TestClass.Create;
    TestClass.TestArray[1]:= 10;
    TestClass.TestArray[2]:= 10;
    TestClass.TestArray[3]:= 10;
    TestClass.Free;
end;


end.

[ Voor 0% gewijzigd door Hu9o op 17-09-2002 21:53 . Reden: typo ]

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17:27

Hu9o

Schokkend

zo werkt het dus ewl

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var
  TestClass : TTest;
begin
  TestClass := TTest.Create;
  try
    TestClass.TestArray[1]:= 10;
    TestClass.TestArray[2]:= 10;
    TestClass.TestArray[3]:= 10;
  finally
    TestClass.Free;
  end;
end;

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

juist, je was net optijd met jezelf te verbeteren :)

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

hehe, en ik had nog niet eens gezien dat de topic starten dezelfde fout was begaan.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Ha bedankt TestClass.Create(); moest dus TestClass := TTest.Create() zijn.

En ik moet free gebruiken in plaats van destroy gelijk aan te roepen :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

en je hoeft niet je dynamish array vrij te maken dmv nil

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1