Einzelnen Beitrag anzeigen

lurchlarve

Registriert seit: 17. Jun 2003
Ort: Flensburg
6 Beiträge
 
Delphi 5 Enterprise
 
#1

Original einer Matrix wird mit Kopie überschrieben..?!

  Alt 20. Jun 2003, 16:57
Hallo Leidensgenossen!

Ich hab mal wieder ein mir unerklärliches Problem!

Ich habe folgendes in der Hauptform deklariert:
Delphi-Quellcode:
type MyMatrix = array of array of integer;
.
.
.
var SMatrix : MyMatrix;
Später initialisiere ich die SMatrix folgendermaßen:

SetLength(SMatrix, n, n); In einer zweiten Form (unit) habe ich folgendes definiert:

Delphi-Quellcode:
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
.
.
.
Jetzt mache ich in einer Prozedur folgendes:

Delphi-Quellcode:
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);
.
.
.
...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.

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:
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;
So. Nun mein Problem:
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
Eine Katze fällt immer auf ihre Pfoten, ein Butterbrot immer auf die Butterseite. Was passiert, wenn man einer Katze ein Butterbrot auf den Rücken bindet?
  Mit Zitat antworten Zitat