AGB  ·  Datenschutz  ·  Impressum  







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

Eine Variable "umziehen"

Ein Thema von LDericher · begonnen am 14. Okt 2009 · letzter Beitrag vom 15. Okt 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Re: Eine Variable "umziehen"

  Alt 14. Okt 2009, 20:04
Delphi-Quellcode:
SetLength(AusgabeArray, 2);
S:='TestEins';
AusgabeArray[0]:=@Test;
S:='Blah';
AusgabeArray[1]:=@Test;
also hier kann aus zwei Gründen nicht draus werden
1.) AusgabeArray[0] und AusgabeArray[1] zeigen auf die selbe Variable und haben immer den selben Inhalt
2.) S ist eine lokale Variable und würde nach ablauf der Prozedur gelöscht, also damit auch der String

was geht, ist aber das:
ein String ist ja intern ein Zeiger und ließe sich daher leicht in einen Pointer,
Delphi-Quellcode:
SetLength(AusgabeArray, 2);
S:='TestEins';
AusgabeArray[0] := Pointer(Test); // bzw. := PChar(Test);
S:='Blah';
AusgabeArray[1] := Pointer(Test);
aber hier macht einem die Referenzzählung einen Strich durch die Rechnung, da sie durch soeinen Cast nicht verändert wird und demnach der String dann wiederum freigegeben wird

also muß man den Cast so anlegen, daß er die Referenzzählung beachtet und das ginge z.B. so
Delphi-Quellcode:
SetLength(AusgabeArray, 2);
S:='TestEins';
String(AusgabeArray[0]) := Test;
S:='Blah';
String(AusgabeArray[1]) := Test;
Delphi-Quellcode:
SetLength(AusgabeArray, 2);
String(AusgabeArray[0]) := 'TestEins';
String(AusgabeArray[1]) := 'Blah';
PS: irgendwan mußt du den String/Speicher auch wieder freigeben und das ginge dann so
String(AusgabeArray[1]) := '';

PS2: du hast dir aber auch einen Shared-MemoryManager besorgt?
denn du willst hier ja anscheinend Speicher über die Programmgrenzen hinweg verwalten/bearbeiten
und das geht nur im SELBEN speichermanager ... hier hat aber standardmäßig die EXE und die DLL jeder ihren eigenen Manager.

Es sei denn du verwendest einen WideString, welcher nicht über den Delphi-MemoryManager läuft, sondern über den vom OLE32-System.
Ein Therapeut entspricht 1024 Gigapeut.
  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 05:15 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 by Thomas Breitkreuz