AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Datenkopie vom einen Record in ein anderes
Thema durchsuchen
Ansicht
Themen-Optionen

Datenkopie vom einen Record in ein anderes

Ein Thema von p80286 · begonnen am 12. Jan 2015 · letzter Beitrag vom 12. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.115 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 12:01
Eben. Da wir hier AnsiStrings haben geht es wohl um Windows. Strings sind Copy on Write. Wenn sich ein String ändert, ändert er nur den Pointer und lässt diesen nun auf einen neuen Speicherbereich zeigen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 12:26
Eben. Da wir hier AnsiStrings haben geht es wohl um Windows. Strings sind Copy on Write. Wenn sich ein String ändert, ändert er nur den Pointer und lässt diesen nun auf einen neuen Speicherbereich zeigen.
D.h. mit "meinen move" liege ich auf der sicheren Seite?
Nicht daß wir uns falsch verstehen, eigentlich bevorzuge ich Pointer (da weiß man was man hat) aber wenn nur Werte vorhanden sínd/übergeben werden ist eine narrensichere allgemeingültige Verfahrennsweise ganz angenehm.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.115 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 12:29
Ich finde, bei reinen Pointern weiß man eigentlich nicht im geringsten mehr was man hat. Wenn die Motivation ist, einen Record zu kopieren reicht meineKopie := einAndererRecord; Narrensicherer geht es doch nicht

Auch:
Ich habe in meinem Leben noch nie Move(..) benutzt- String ist doch schon ein "managed" Type: Er hat einen Referenzzähler. Allein den machst du dir mit einer reinen Byte-Kopie schon kaputt: Er ist um eins zu niedrig.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 12:37
NEIN!

Der Move von Records mit dynamischen Elementen ist i.d.R. falsch, da wie due geschrieben hast nur die Pointer kopiert werden.

Ein

SecondRecord := FirstRecord; Macht intern eigentlich ein

SecondRecord.Feld := FirstRecord.Feld; // Natürlich für alle Elemente Bei einer Zuweisung eines Records auf einen anderen, will man doch den Inhalt kopieren und nicht die Referenz...

Daher ist ein Assign nicht nötig...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 12:43
Um es nochmal klar zu erwähnen:

Ich rate grundsätzlich von Move und Co. ab (außer wenn es wirklich nicht anders geht, aber wenn, dann muß man ganz genau aufpassen was man da für Mist verzapft)

Und für die Zuweisung zweier Records, von gleichem/kompatiblem Typ, ist das garnicht nötig, da die Zuweisung via := alles Wichtige erledigt.
Vorallem bezüglich der Referenzzählung von LongStrings, dynamischen Arrays, Interfaces, Variants usw.

Ein ShortString (z.B. string[255] ) ist wie ein Record, statisches Array oder einfach gesagt wie ein Integer anzusehn und bereitet die wenigsten Probleme, unter den Strings.

Zitat:
dann sollte doch mit einem move(record2,record1,sizeof(tMyrecord)); nur die Stringadresse kopiert werden und Änderungen in
record2.feld hätten gleichzeitig Änderungen in record1.feld zur Folge?
Oder liege ich da falsch?
Ja, aber vorallem schrottest du damit die automatische Speicherverwaltung (des String ) und alles ist im Arsch.


Wer unbedingt einen "Move"-Befehl verwenden will, der hat dafür New/Initialize/InitializeRecord/InitializeArray, Dispose/Finalize/FinalizeRecord/FinalizeArray und Copy/CopyArray/CopyRecord aus der System-Unit verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Jan 2015 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 13:03
Und für die Zuweisung zweier Records, von gleichem/kompatiblem Typ, ist das garnicht nötig, da die Zuweisung via := alles Wichtige erledigt.
Vorallem bezüglich der Referenzzählung von LongStrings, dynamischen Arrays, Interfaces, Variants usw.
Hey, das war's. Aus irgendwelchen Gründen hatte ich im Kopf, daß das := mit Records nicht funktioniert

und natürlich an alle anderen auch vielen Dank!

Irgendwann werd' auch ich die Stringmagie verstehen, und nichts ist besser als Pointer! (wenn man weiß was man tut)

Vielen Dank nochmals
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 13:09
In aktuelleren Delphis wurde die OH überarbeitet. (k.A. wann genau)
Und man kann da ganz genau nachlesen wie die Strings intern Funktionieren. (falls man das nicht persönlich in der System.pas erkunden will)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 13:44
Daher ist ein Assign nicht nötig...
Richtig. Aber vorausschauend schon. Sollte der Record aus irgend einem Grunde (Mit einem Object o.ä. erweitert werden, dann muss ich mich um die Zuweisung nicht mehr kümmern. Nur noch im Assign.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 13:51
Daher ist ein Assign nicht nötig...
Richtig. Aber vorausschauend schon. Sollte der Record aus irgend einem Grunde (Mit einem Object o.ä. erweitert werden, dann muss ich mich um die Zuweisung nicht mehr kümmern. Nur noch im Assign.
Und was willst du im Assign anders machen als die Objekt-Referenz kopieren (was die normale Zuweisung eben auch macht)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Datenkopie vom einen Record in ein anderes

  Alt 12. Jan 2015, 15:16
Und was willst du im Assign anders machen als die Objekt-Referenz kopieren (was die normale Zuweisung eben auch macht)
Evtl. Schauen, ob beim Zielrecord schon ein initialisiertes Objekt im Feld vorhanden ist und dann nicht einfach den Pointer überschreiben.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:04 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