Toon posts:

[Delphi] 2dim array meegeven aan een functie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een 2 dimensionale array meegeven aan een functie met behulp van een pointer.

Dit heb ik al gebeurd maar dat werkt niet.
code:
1
Procedure Test(pMap:array of array of integer);

Ik krijg dan deze foutmelding:
[Error] OpenglTiles.pas(20): Identifier expected but 'ARRAY' found

Verwijderd

Gebruik typen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  PMap = ^TMap;
  TMap = array[0..10, 0..10] of Integer;

procedure FillMap(AMap: PMap);
var
  I, J: Integer;
begin
  for I := 0 to 10 do
    for J := 0 to 10 do
    AMap^[I, J] := 1;
end;

var
  MyMap: TMap;
begin
  FillMap(@MyMap);
end;

Dit werkt ook:
code:
1
2
3
4
5
6
7
8
procedure FillMap(AMap: PMap);
var
  I, J: Integer;
begin
  for I := Low(AMap^) to High(AMap^) do
    for J := Low(AMap^[I]) to High(AMap^[I]) do
    AMap^[I, J] := 1;
end;

Multidimensional open arrays:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{ Definieer weer eerst het type }
type
  TNewMap = array of array of Integer;

{ Let op de var }
procedure FillMap2(var AMap: TNewMap);
var
  I, J: Integer;
begin
  for I := Low(AMap) to High(AMap) do
    for J := Low(AMap[I]) to High(AMap[I]) do
    AMap[I, J] := 2;
end;

var
  MyMap: TNewMap;
begin
  { Compiler magic :) }
  SetLength(MyMap, 2, 4);
  { Of SetLength(MyMap, 2) en dan SetLength(MyMap[I], 4)
    voor i = 0..1 }
  FillMap2(MyMap);
end;

Verwijderd

Topicstarter
Thanx

Dit werkt, maar nu zit ik weer met een ander probleem.
Ik heb een programma met twee aparte componenten. De componenten hebben allebei een procedure die een 2 dim array mee krijgt als parameter. De 2 dim array wordt aangemaakt in de applicatie en roept de twee functie's aan in de componenten, maar dan komt het probleem. Ik kan niet allebei de procedures gebruiken, omdat de types niet gelijk zijn.

component 1:
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
unit Comptest1;
interface

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

type
  TMap = array of array of integer;

  TComptest1 = class(TComponent)
  public
    Procedure Test(var Map:TMap);
  end;

procedure Register;

implementation

procedure TComptest1.Test(var Map:TMap);
var i,i1:integer;
begin
  for i:=1 to 100 do
    for i1:=1 to 100 do
    Map[i,i1]:=6;
end;

procedure Register;
begin
  RegisterComponents('Opengl', [TComptest1]);
end;

end.

component 2:
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
unit Comptest2;
interface

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

type
  TMap = array of array of integer;

  TComptest2 = class(TComponent)
  public
    Procedure Test(var Map:TMap);
  end;

procedure Register;

implementation

procedure TComptest2.Test(var Map:TMap);
var i,i1:integer;
begin
  for i:=1 to 100 do
    for i1:=1 to 100 do
    Map[i,i1]:=6;
end;

procedure Register;
begin
  RegisterComponents('Opengl', [TComptest1]);
end;

end.

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Comptest1,Comptest2;

type
  TMap = array of array of integer;
  TForm1 = class(TForm)
  private
    Map: TMap;
  public
    Comptest11:Comptest1;
    Comptest21:Comptest2;
    procedure test();

  end;

var
  Form1: TForm1;

implementation

procedure TForm1.test();
begin
  setlength(Map,100,100);
  Comptest11.test(@Map);
  Comptest21.test(@Map);
end;

{$R *.DFM}

end.

Foutmelding:
[Error] Unit1.pas(30): Types of actual and formal var parameters must be identical

Verwijderd

Definieer TMap op 1 plaats en niet op 3 plaatsen zoals je nu doet.

Verwijderd

Topicstarter
dus moet ik een hele unit aanmaken om de type in aan te maken, omdat ik hem in die twee componenten wil gebruiken.
Kan dat niet op een nettere manier?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Lees even het gedeelte over eigen typen in de help file van delphi door zou ik zeggen. Daar staat je antwoord in.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Ik las net in de quickstart dat je de oplossingen moest posten dus doe ik dat maar even.

Oplossing:

Nieuwe unit gemaakt daar het type in geplaatst en deze gebruikt in de componenten.

Source code unit:
code:
1
2
3
4
5
6
7
8
9
10
unit SmartlifeTypes;

interface

type TMap = ^PMap;
     PMap = array of array of integer;

implementation

end.

source code array gebruik:
code:
1
2
3
4
5
  //procedure declaration
  Procedure DrawOpenglScene(var pMap1:TMap;  PosX,PosY,Grootte:integer; Selection:boolean);

  //Gebruik van de array 
  pMap1^[Posx+x,Posy+y]

Zal vast wel beter kunnen, maar zo heb ik het gedaan. :)
Pagina: 1