![]() |
Original einer Matrix wird mit Kopie überschrieben..?!
Hallo Leidensgenossen!
Ich hab mal wieder ein mir unerklärliches Problem! Ich habe folgendes in der Hauptform deklariert:
Delphi-Quellcode:
Später initialisiere ich die SMatrix folgendermaßen:
type MyMatrix = array of array of integer;
. . . var SMatrix : MyMatrix;
Delphi-Quellcode:
In einer zweiten Form (unit) habe ich folgendes definiert:
SetLength(SMatrix, n, n);
Delphi-Quellcode:
Jetzt mache ich in einer Prozedur folgendes:
unit Tourenberechnung;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Buttons, Start; type TSortArr = record X : integer; Y : integer; end; type TTouren = class(TForm) GB_Touren: TGroupBox; G_Tour: TStringGrid; GB_Infos: TGroupBox; L_Summe: TLabel; L_Menge: TLabel; L_Laenge: TLabel; L_Kapazitaet: TLabel; L_MaxLaenge: TLabel; L_MaxLaenge2: TLabel; L_Kapazitaet2: TLabel; L_Summe2: TLabel; L_Menge2: TLabel; L_Laenge2: TLabel; L_Depot: TLabel; L_Depot2: TLabel; BB_Berechnung: TBitBtn; GB_Ablauf: TGroupBox; M_Ablauf: TMemo; procedure FormShow(Sender: TObject); procedure Touren_Ausgangsloesung_erstellen; procedure Grid_Index; procedure Saving_Algorithmus; procedure BB_BerechnungClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Touren : TTouren; StartT : TTourDef; EndeT : TTourDef; SortArr : TSortArr; procedure get_TopValue (MM : MyMatrix); implementation . . .
Delphi-Quellcode:
...d.h., SMatrix2 wird eine exakte Kopie von SMatrix (die ja global definiert ist). Dann führe ich die Prozedur "get_TopValue" aus und übergebe die KOPIE dieser Prozedur.
procedure TTouren.Saving_Algorithmus;
var SMatrix2 : MyMatrix; i : integer; E : integer; y,z : TTourDef; w,x : TKnotenDef; Kap : integer; begin SetLength(SMatrix2, n, n); SMatrix2 := SMatrix; get_TopValue(SMatrix2); . . . Diese Prozedur sucht dann das grösste Element in der Matrix, speichert die Koordinaten des grössten Elements in der globalen Variable "SortArr.X" und "SortArr.Y", und überschreibt den gefundenen Wert mit "- unendlich", was eine globale Konstante ist (-32000).
Delphi-Quellcode:
So. Nun mein Problem:
procedure get_TopValue ( MM : MyMatrix);
var i,j,k : integer; begin SortArr.X := 0; SortArr.Y := 0; k := -unendlich; for i := 0 to n-2 do begin for j := i+1 to n-2 do begin if MM[i,j] > k then // höherer Wert gefunden begin SortArr.X := i+1; SortArr.Y := j+1; k := MM[i,j]; end; end; end; MM[SortArr.X-1,SortArr.Y-1] := -unendlich; end; Sobald dies alles geschehen ist, verlasse ich die Form (also auch die Unit). Wenn ich jetzt erneut in diese Unit springe (wird vom Benutzer ausgelöst), dann ist meine SMatrix gleich der Kopie "SMatrix2", obwohl ich das nirgends so gemacht habe. Eigentlich wird ja nur die SMatrix2, die ich der Prozedur "get_TopValue" übergebe, verändert und nicht die globale Variable SMatrix! Wieso ist das so? Ich hoffe, ich konnte das Problem halbwegs schildern...sonst fragt mich doch bitte, falls ihr noch mehr wissen wollt... Danke im Voraus und Gruß, Björn :coder: |
Hallo nochmals!
Habe gerade ![]()
Delphi-Quellcode:
das wird dann auch mein Fehler sein, oder?
type TMyArray = Array of Integer;
{...} VAR array1, array2 : TMyArray; BEGIN {...} array1:=array2; {...} END; Wie kann ich also in meinem Sourcecode (siehe Beitrag 1) eine exakte Kopie SMatrix2 := SMatrix machen? Danke! Björn :coder: |
...hat sich erledigt!
Habe gerade das gelesen
Code:
Also komme ich wohl nicht darum, es so zu machen, oder?
dynamisches Array:
Elemente primitive Datentypen: Copy-Befehl Elemente Referenzdatentypen: Elemente einzeln kopieren statisches Array: Elemente primitive Datentypen: einfache Zuweisuung des einen Arrays zum anderen Elemente Referenzdatentypen: Elemente einzeln kopieren
Delphi-Quellcode:
Manchmal findet man doch plötzlich von selber mal den richtigen Tipp im Netz!
procedure TTouren.Saving_Algorithmus;
var SMatrix2 : MyMatrix; SortArr : TSortArr; i,j : integer; E : integer; y,z : TTourDef; w,x : TKnotenDef; Kap : integer; begin SetLength(SMatrix2,n ,n ); for i := 0 to high(SMatrix) do begin for j := i+1 to high(SMatrix) do begin SMatrix2[i,j] := SMatrix[i,j]; end; end; SortArr := get_TopValue(SMatrix2); end; Gruß, Björn :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz