[Delphi] Array of array of integer

Pagina: 1
Acties:
  • 200 views sinds 30-01-2008
  • Reageer

  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Ik zit met een probleempje met een array of array, als ik namelijk deze code aangeroepen heb en vervolgens mijn programma of het form wil afsluiten krijg ik allerlei Einvalid Pointer errors en Access violations. In onderstaande code werkt bijvoorbeeld de laatste regel niet. Ik denk zelf dat het programma probeert het geheugen op te schonen bij het afsluiten en daarbij een access violation geeft

Hoe moet ik na deze code te hebben uitgevoerd de boel opschonen? (nogmaals.. unassigned werkt niet) en als ik 2x achter elkaar op de button click en dan afsluit komen er ook allerlei errors.

Het is geschreven in Delphi 5

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
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

var selections: array of array of Integer;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var teller:integer;
begin

setlength(selections,3);
teller:=0;

while teller < 3 do
    begin
    setlength(selections[teller],2);
    selections[teller,1]:=30;
    selections[teller,2]:=40;
    teller:=teller+1;
    end;

selections:=unassigned;    

end;

end.

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


Verwijderd

In jouw geval ben je zelf niet actief bezig met het alloceren van geheugen d.m.v. voorbeeld 'new'. Al was dat het geval dan zou je zelf moeten zorgen dat dit geheugen weer wordt vrijgegeven d.m.v. 'dispose'.
Hier hoeft dat dus niet..

[ Voor 68% gewijzigd door Verwijderd op 09-12-2002 11:26 ]


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

unassigned gebruik je toch alleen voor variants?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
In Delphi begint men met tellen vanaf 0. Dit houdt in dat een lengte van 3 een bereik heeft van 0 tot en met 2.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-08 22:41

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 09 December 2002 @ 11:23:
In jouw geval ben je zelf niet actief bezig met het alloceren van geheugen d.m.v. voorbeeld 'new'. Al was dat het geval dan zou je zelf moeten zorgen dat dit geheugen weer wordt vrijgegeven d.m.v. 'dispose'.
Hier hoeft dat dus niet..
Setlenght zet dynamisch de lengte van een array. Deze array opschonen kan met array:=nil; (en dus niet met unassigned). Delphi neemt dan zelf het geheugenbeher van de array voor zijn rekening.

[ Voor 9% gewijzigd door Creepy op 09-12-2002 11:45 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-08 22:41

Creepy

Tactical Espionage Splatterer

Elissen schreef op 09 december 2002 @ 11:42:
In Delphi begint men met tellen vanaf 0. Dit houdt in dat een lengte van 3 een bereik heeft van 0 tot en met 2.
Dit geld alleen voor array's die met setlenght worden geinitialiseerd.

Delphi:
1
var blaat: array[99..123,5..10] of integer;

Bovenstaande code is geen probleem.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Volgens je while-loopje stel je van selections[teller] de indexen 1 en 2 in op een bepaalde waarde, terwijl de lengte 2 is. Dat gaat natuurlijk niet, omdat de index bij 0 begint. 0 en 1 instellen kan dus wel.

Ik denk dat dat weleens je probleem kan oplossen.

Tip: gebruik altijd Low(array) en High(array), dan zit je altijd safe.

edit: Elissen: hij telt ook van 0 t/m 2, kijk maar es goed naar de while-loop ;)

[ Voor 12% gewijzigd door _Thanatos_ op 09-12-2002 13:47 . Reden: toevoeginkje ]

日本!🎌


Verwijderd

Je moet ook maar eens even rangechecks aanzetten..
De SetLength(Selections,3) gaat nog goed omdat teller kleiner blijft dan 3
Maar de setlength(selections[teller],2); is niet goed als je later met de opdracht
selections[teller,2]:=40;
een waarde toekent aan een niet bestaand element van je array (alleen 0 en 1 bestaan).

Verder geldt natuurlijk bovenstaande opmerkingen van creepy en delphi.

Je zou ook de variabele definitie van Selections binnen de procedure kunnen doen. De compiler ruimt het gebruikte geheugen dan zelf op bij het verlaten van de procedure.
Pagina: 1