AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Original einer Matrix wird mit Kopie überschrieben..?!
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von lurchlarve · begonnen am 20. Jun 2003 · letzter Beitrag vom 20. Jun 2003
Antwort Antwort
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, 15: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
lurchlarve

Registriert seit: 17. Jun 2003
Ort: Flensburg
6 Beiträge
 
Delphi 5 Enterprise
 
#2
  Alt 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
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
lurchlarve

Registriert seit: 17. Jun 2003
Ort: Flensburg
6 Beiträge
 
Delphi 5 Enterprise
 
#3
  Alt 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
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz