Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Original einer Matrix wird mit Kopie überschrieben..?! (https://www.delphipraxis.net/5836-original-einer-matrix-wird-mit-kopie-ueberschrieben.html)

lurchlarve 20. Jun 2003 15:57


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:
type MyMatrix = array of array of integer;
.
.
.
var SMatrix : MyMatrix;
Später initialisiere ich die SMatrix folgendermaßen:

Delphi-Quellcode:
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 :coder:

lurchlarve 20. Jun 2003 16:26

Hallo nochmals!

Habe gerade hier gelesen, dass man dynamische Arrays nicht so kopieren kann:

Delphi-Quellcode:
type TMyArray = Array of Integer;
{...} 
VAR array1, array2 : TMyArray;
BEGIN
  {...} 
  array1:=array2;
  {...} 
END;
das wird dann auch mein Fehler sein, oder?
Wie kann ich also in meinem Sourcecode (siehe Beitrag 1) eine exakte Kopie SMatrix2 := SMatrix machen?

Danke!

Björn :coder:

lurchlarve 20. Jun 2003 16:59

...hat sich erledigt!

Habe gerade das gelesen

Code:
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
Also komme ich wohl nicht darum, es so zu machen, oder?

Delphi-Quellcode:
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;
Manchmal findet man doch plötzlich von selber mal den richtigen Tipp im Netz!

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