Autor Beitrag
thebug
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49



BeitragVerfasst: Mo 29.03.04 11:06 
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.

ausblenden volle Höhe 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

_________________
Einsicht ist der beste Weg zur Besserung
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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Ä? :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
thebug Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49



BeitragVerfasst: 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?

_________________
Einsicht ist der beste Weg zur Besserung
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
thebug Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49



BeitragVerfasst: 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?

_________________
Einsicht ist der beste Weg zur Besserung
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
thebug Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49



BeitragVerfasst: 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?

_________________
Einsicht ist der beste Weg zur Besserung
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 01.04.04 10:13 
Verstehe ich nicht. Es sind doch drei Arrays, oder? :?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
thebug Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49



BeitragVerfasst: Fr 02.04.04 20:13 
also so:
ausblenden 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:

ausblenden 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

_________________
Einsicht ist der beste Weg zur Besserung