AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Kopieren von dyn. Arrays

Ein Thema von Stefan Hueg · begonnen am 23. Jun 2006 · letzter Beitrag vom 23. Jun 2006
Antwort Antwort
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#1

Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 03:31
Ich habe hier nun ein Problem wo ich echt nicht weiterkomme.

Ich habe folgende Situation:

-Unit des Hauptformulars hat folgendes im Interface-Teil deklariert

Delphi-Quellcode:
type
  TZeitserver = record
    IP: String;
    LastPing: String;
    LastCheck: String;
  end;

var
  Zeitserver: array of TZeitserver;
Soweit sogut. Ein dynamisches Array, in welches dann weiter in der Unit Daten auch eingelesen werden. Das funktioniert auch.
Nun habe ich eine zweite Unit in welcher ich eine Kopie des Arrays aus der ersten Unit benötige.

Erstes Problem:
-Wie kriege ich die Typendefinition aus Unit1 in Unit2?

Meine Lösung:
-Einfach das gleiche nochmal in den Interface-Teil aus der ersten in die Zweite Unit kopieren (type TZeitserver = record etc...)

Das Problem
-Er meldet incompatible types. Kopiert wird das ganze mit

    TempZeitserver := Copy(frmMain.Zeitserver, 0, Length(frmMain.Zeitserver)); Wie geht das?
Stefan Hueg
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 05:37
Also einbinden kannst du die unit1, indem du einfach in unit2 diese in die uses-Liste schreibst (im Implementation-Teil).
Delphi-Quellcode:
implementation

uses unit1;

{$R *.dfm}
Zum kopieren von diesem Array kann ich nix sagen, da ich das selber noch nie gemacht habe.


Flare
Willy Scheibel
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#3

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 08:42
Zitat von Stefan Hueg:
    TempZeitserver := Copy(frmMain.Zeitserver, 0, Length(frmMain.Zeitserver));
Wenn TempZeitServer vom Typ TZeitServer ist, kann diese Zuweisung auch nicht funktionieren. Du weist einem TZeitServer einen String zu... du kannst höchstens einem der Felder des Zeitservers einen String zuweisen.

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 08:49
Ich weiß jetzt nicht, ob es extra einen Befehlt dafür gibt, aber ansonsten mach es doch ganz einfach mit einer Schleife

Du ermittelst die Länge des 1. Arrays und setzt diese für den 2. Array. Über eine Schleife setzt du dann die Werte des 1. Arrays für den 2. Array.

Delphi-Quellcode:
SetLength(Array2,Length(Array1));

for i:=0 to Length(Array2)-1 do begin
  Array2[i].IP := Array1[i].IP;
  Array2[i].LastPing := Array1[i].LastPing;
 {...}
end;
Sascha
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 09:35
Hallo Stefan,

die vom Compiler gelieferte Fehlermeldung ist verständlich, da du durch das Kopieren der Typdefinition einen neuen Typen erzeugst. Obwohl beide Typen den gleichen Aufbau besitzen, sieht der Compiler sie als unterschiedlich an. Gib deinem dynamischen Array einen Namen und lagere die Typdefinition in eine weitere Unit aus, die du dann in deinen beiden Units in die USES-Anweisung aufnimmst:

Delphi-Quellcode:
unit Typen;

interface

type
  TZeitserver = record
    IP: String;
    LastPing: String;
    LastCheck: String;
  end;

  TDynZeitserverArray = array of TZeitserver;
  
implementation

end.
Das Kopieren von Arrays kannst du - wie von Dust Signs beschrieben - mit dem Copy-Befehl durchführen. Start und Länge mußt du dabei nicht angeben:

Delphi-Quellcode:
var
  Original, Kopie : TDynZeitserverArray;
begin
  Kopie := Copy(Original);
end;
Eine einfache Zuweisung der Zeiger würde lediglich den Referenzzähler des Original-Arrays erhöhen. Danach wäre jede Änderung, die du mit einem der beiden Arrrays durchführst, auch im jeweils anderen sichtbar.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 12:47
Achso alles klar, werde ich mal ausprobieren. Die Länge und den Index beim Copy Befehl hatte ich eingegeben da ich durch die Suche einen ähnlichen Beitrag gefunden hatte in dem gesagt wurde dass Länge und Index angegeben werden müssten
Stefan Hueg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#7

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 12:57
Zitat von Hawkeye219:
Eine einfache Zuweisung der Zeiger würde lediglich den Referenzzähler des Original-Arrays erhöhen. Danach wäre jede Änderung, die du mit einem der beiden Arrrays durchführst, auch im jeweils anderen sichtbar.
Das ist schon richtig (dat mit dem Referenzzähler), aber sobald man was ändert, wird dennoch eine eigene Kopie angelegt (beim ändern wird der Refferenzzähler halt immer erst auf 1 gesetzt, also notfalls eine eigene Kopie angelegt), so daß Änderungen nicht in jeder Refferenz sichtbar sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 13:06
@himitsu
Hast du es schon einmal ausprobiert?

Zitat von Delphi-Hilfe:
Wenn X und Y Variablen desselben dynamischen Array-Typs sind, führt die Anweisung X := Y dazu, daß X auf dasselbe Array wie Y zeigt (es ist nicht erforderlich, vor dieser Operation Speicher für X zu reservieren). Im Gegensatz zu Strings und statischen Arrays werden dynamische Arrays nämlich nicht automatisch kopiert, bevor einem ihrer Elemente ein Wert zugewiesen wird. Beispielsweise hat A[0] nach der Ausführung des folgenden Quelltextes den Wert 2:

Code:
var
  A, B: array of Integer;
begin
  SetLength(A, 1);
  A[0] := 1;
  B := A;
  B[0] := 2;
end;
Wenn A und B statische Arrays wären, hätte A[0] immer noch den Wert 1.
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#9

Re: Problem beim Kopieren von dyn. Arrays

  Alt 23. Jun 2006, 13:21
Strings (AnsiStrings) sind auch "nur" dynamische Arrays und im Gegensatz zu dem, was laut dem in der OH stehen soll, werden Strings auch kopiert, wenn man sie ändert, obwohl sie intern ebenfalls dynamische Arrays sind.

Und laut der offiziellen Definition dieser dynamsichen Typen mit Refferenzzählung sollte es jedenfalls so sein (wie ich geschrieben hab)?


Nein, getestet hatte ich es noch nicht, aber ich konnte bisher auch noch keinen Fehler entdecken, welcher darauf zu führen war, daß nicht kopiert wurde ... obwohl ich schon ein paar dynamische Arrays verwendet hab.


wie gesadt, Strings sind intern eigentlich genauso wie dynamische Arrays definiert (abgesehn, daß sie bei 1 beginnen und noch ein "unsichtbares", zusätzliches Feld mit dem Wert #0 am Ende haben) und dort funktioniert es doch aus o.O
Delphi-Quellcode:
var A, B: String;
begin
  SetLength(A, 1);
  A[1] := '1';
  B := A;
  B[1] := '2';
  // A[1] ist immernoch '1'
end;
Also wenn das Fettgedruckte stimmt, dann würde ich das als einen GROOOOOßEN, absichtlichen Delphi-Bug ansehen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 03:59 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