Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mit mehreren Arrays


thebug - Mo 29.03.04 11:06
Titel: Probleme mit mehreren Arrays
Ich habe folgendes Problem:
Ich habe 3 Arrays[1..100], bei denen die ersten 3 Werte definiert sind. Der Rest ist 0. Diese Arrays übergebe ich einem constructor. Jetzt passiert folgendes: die im constructor initialisierten Arrays sollten über eine Schleife die Werte der ursprünglichen Arrays übergeben bekommen, das ist aber nicht so. Das erste Array hat als Werte den 2., den 3. des richtigen Arrays, aber als dritten Wert den ersten Wert des zwiten Arrays usw. Wie kann das sein? Die Arrays haben nichts miteinander zu tun.


Delphi-Quelltext
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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
 type
  ThreeD_Object = class (TObject)
        private
          points:integer;
          color:Tcolor;
          fixedpoint_x,fixedpoint_y,fixedpoint_z:integer;
          x,y,z:array [1..100of integer;
          function x2Dto3D(b,n,m:real):integer;
          function y2Dto3D(b,n,m:real):integer;
        public
          constructor Createn(xcoor,ycoor,zcoor:array of  integer; number_points:integer; fixpoint_x,fixpoint_y,fixpoint_z:integer; ObjectColor:Tcolor; canvas:Tcanvas);
        end;

  var
  Form1: TForm1;
  j,k,l:array [1..3of integer;
  Polygon:ThreeD_Object;



implementation

{$R *.dfm}

constructor ThreeD_Object.Createn;
var i:integer;
begin
points:=number_points;
color:=ObjectColor;
fixedpoint_x:=fixpoint_x;
fixedpoint_y:=fixpoint_y;
fixedpoint_z:=fixpoint_z;
for i:=1 to points do
  begin
  x[i]:=xcoor[i];
  y[i]:=ycoor[i];
  z[i]:=zcoor[i];
  end;
    canvas.Pen.Color:=color;
  canvas.MoveTo(x2Dto3D(x[1],y[1],z[1]),y2Dto3D(x[1],y[1],z[1]));
  for i:=1 to points do
    begin

    if i=points then
      begin
      canvas.lineto(x2Dto3D(x[1],y[1],z[1]),y2Dto3D(x[1],y[1],z[1]));
      end
    else
      canvas.lineto(x2Dto3D(x[i],y[i],z[i]),y2Dto3D(x[i],y[i],z[i]));
      end;
end;

function ThreeD_Object.x2Dto3D;
begin
if m=0 then
result:=round(b)
else
result:=round(b+(fixedpoint_x-b)*(m/fixedpoint_z));
end;

function ThreeD_Object.y2Dto3D;
begin
if m=0 then
result:=round(n)
else
result:=round(n-(fixedpoint_y-n)*(m/fixedpoint_z));
end;

procedure TForm1.Button1Click(Sender: TObject);
var d:integer;
begin
paintbox1.Refresh;
for d:=0 to 100 do
begin
j[d]:=0;
k[d]:=0;
l[d]:=0;
end;
j[1]:=10;
j[2]:=10;
j[3]:=20;
k[1]:=10;
k[2]:=20;
k[3]:=20;
l[1]:=0;
l[2]:=0;
l[3]:=0;
Polygon:=ThreeD_Object.Createn(j,k,l,3,100,100,100,clblack,paintbox1.canvas);
end;


Moderiert von user profile iconPeter Lustig: Topic verschoben


Christian S. - Mo 29.03.04 11:16

Zitat:
Das erste Array hat als Werte den 2., den 3. des richtigen Arrays, aber als dritten Wert den ersten Wert des zwiten Arrays usw.
HÄ? :-)


thebug - Mo 29.03.04 20:52

Also z.B.:
array x=[1,2,3]
array y=[4,5,6]
array z=[7,8,9]

nach dem ganzen Zeug:

array kopie von x=[2,3,4]
array kopie von y=[5,6,7]
array kopie von z=[8,9,7823486]

kapiert?


Christian S. - Mo 29.03.04 20:59

Ah! Es wird wohl daran liegen, dass Du die Arrays mit niedrigstem Index 1 definiert hast. Übergibst Du nun Array als "Array of Integer", so ist der niedrigste Index in der entsprechenden Prozedur aber Null! Die Elemente verschieben sich entsprechend alle um Eins.


thebug - Di 30.03.04 16:23

Dann gibt es ein problem:
der constructor kann weder ein statisches noch ein dynamisches array erstellen, also z.B.
constructor create(x:array [1..100] of integer) geht nicht und constructor create(x:array of integer) ist kein dynamisches array.

übrigens mal: wieso werden die werte in den verschiedenen arrays vertauscht? hat das damit zu tun, dass die werte noch im speicher sind?


Christian S. - Di 30.03.04 16:28

Mach es doch so, dass Du die Parameterübergabe so lässt wie bisher, aber die Werte so überträgst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i:=1 to points do
  begin
  x[i]:=xcoor[i-1];
  y[i]:=ycoor[i-1];
  z[i]:=zcoor[i-1];
  end;


Und danach kann es so weitergehen wie bisher.

Zitat:
übrigens mal: wieso werden die werte in den verschiedenen arrays vertauscht? hat das damit zu tun, dass die werte noch im speicher sind?
Da wird ja nichts vertauscht. Du kannst Dir das so vorstellen, dass die Werte so übergeben werden:

1,2,3,4,5,6,7,8,9 (das sind die Werte von allen drei Arrays)

So. Und dadurch, dass sich die Array-Grenzen um eines verschieben, bekommst Du auch einen um eine Position verschobenen Array-Inhalt. Nur das nach der "9" nur noch Unsinn da steht.


MfG
Peter


thebug - Do 01.04.04 10:03

Okay danke, das geht jetzt, aber es wäre natürlich eleganter wenn ich das kommplette array dem constructor übergebe. gibt es da nicht eine möglichkeit?


Christian S. - Do 01.04.04 10:13

Verstehe ich nicht. Es sind doch drei Arrays, oder? :?


thebug - Fr 02.04.04 20:13

also so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var x:array of [1..100] integer;
      objekt:tolles_objekt;
  .
  .
  .

procedure button1.click(...);
var i:integer;
begin

for i:=1 to 100 do
x[i]:=0;

objekt:=tolles_objekt.create(x);

end;

constructor create (xcopy:array [1..100of integer);
begin
  .
  .
  .
end;


oder:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var x:array of integer;
      objekt:tolles_objekt;
  .
  .
  .

procedure button1.click(...);
var i:integer;
begin

objekt:=tolles_objekt.create(x);

end;

constructor create (xcopy:array of integer);
begin
  .
  .
  .
end;


Moderiert von user profile iconPeter Lustig: Delphi-Tags repariert