| Autor |
Beitrag |
thebug
      
Beiträge: 49
|
Verfasst: 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.
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..100] of 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..3] of 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 Peter Lustig: Topic verschoben
_________________ Einsicht ist der beste Weg zur Besserung
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 49
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 49
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
thebug 
      
Beiträge: 49
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 49
|
Verfasst: Fr 02.04.04 20:13
_________________ Einsicht ist der beste Weg zur Besserung
|
|
|