AGB  ·  Datenschutz  ·  Impressum  







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

MMF und dynamische Arrays?

Ein Thema von mumu · begonnen am 4. Mai 2006 · letzter Beitrag vom 5. Mai 2006
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

MMF und dynamische Arrays?

  Alt 4. Mai 2006, 19:40
ich benutze MMF zur Interprozesskommunikation.

Jetzt habe ich folgendes Problem:
Wenn mein MMF-Data Record ein dynamisches Array of string beinhaltet, dann funktioniert das ganze nicht.

array[1..10] of String[255]; // funktioniert
array of String[255]; // funktioniert nicht

ist das Normal? Wie kann ich das ggfs. irgendwie hinbekommen? Muss ich dann mein Array immer entsprechend groß wählen und somit eventuell sehr viel speicherplatz verschwenden.

gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: MMF und dynamische Arrays?

  Alt 4. Mai 2006, 20:05
Das ist normal, denn Arrays und auch die Strings(intern auch Arrays) sind nur Pointer auf die entsprechenden Daten ... du müßtest also auch noch die Strngs und arrays mit in die MMF reinkopieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: MMF und dynamische Arrays?

  Alt 4. Mai 2006, 20:20
hmm und wie mach ich sowas?

also wenn ich das richtig verstanden hab, dann passiert folgendes:
array[1..10] of String[255]; erzeugt wahrscheinlich 10 hintereinanderliegende strings der länge 255
array of String[255]; erzeugt im endeffekt ein array of pointer auf strings der länge 255 und diese pointer sind im anderen prozess ungültig
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: MMF und dynamische Arrays?

  Alt 5. Mai 2006, 11:43
fast richtig ^^

Zitat:
array[1..10] of String[255]; erzeugt wahrscheinlich 10 hintereinanderliegende strings der länge 255
inclusive einem Längenbyte (da ja nicht unbedingt alle 255 Chars belegt sein müssen)

es entsteht also ein Record wie dieser:
länge1, char1.1, char1.2 ... char1.255, länge2, char2.1, char2.2 ... char2.255 ... char10.255

Zitat:
array of String[255]; erzeugt im endeffekt ein array of pointer auf strings der länge 255 und diese pointer sind im anderen prozess ungültig
erzeugbt 'nen Pointer mit einem array von x-aufeinanderfolgenden String[255]


und array of String erzeigt einen pointer auf ein Array mit x-aufeinanderfolgenden Pointer, welche auf Strings zeigen


Das Array[1..10] of String[255] kannst du also ohne Problem in die MMF kopieren und da wieder rauskolen
CopyMem(@MyArray, MMF, SizeOf(MyArray)); CopyMem(MMF, @MyArray, SizeOf(MyArray)); Beim Array of String[255] mußt du den Inhalt (nicht den Pointer auf den Inhalt, darum die Referenz auf das erste Arrayelement - MyArray[0]) und die Länge des Arrays kopieren
Delphi-Quellcode:
i := Length(MyArray);
CopyMem(@i, MMF, 4);
CopyMem(@MyArray[0], MMF + 4, i * SizeOf(MyArray[0]));
Delphi-Quellcode:
CopyMem(MMF, @i, 4);
SetLength(MyArray, i);
CopyMem(MMF + 4, @MyArray[0], i * SizeOf(MyArray[0]));
PS: SizeOf(MyArray[0]) ist die größe eines Arrayelements ... entspricht also SizeOf(Typ) von Array of Typ

Beim Array of String könntest zu zwar auch das Array mit seiner Länge und jeden String speichern,
aber da das Array eh nur mit Pointer gefüllt ist, welche drüben geändert werden müßten,
macht es sich einfacher, wenn man nur die Stringinhalte mit ihrer Länge und deren Anzahl speichert,
also
anzahl(integer), Len(integer), Stringinhalt..., Len(integer), Stringinhalt..., Len(integer), ...

Delphi-Quellcode:
i := Length(MyArray);
CopyMem(@i, MMF, 4);
i3 := 4;
For i2 := 0 to i - 1 do Begin
  i4 := Length(MyArray[i2]);
  CopyMem(@i4, MMF + i3, 4);
  Inc(i3, 4);
  CopyMem(@MyArray[i2][1], MMF + i3, Length(MyArray[i2]));
  Inc(i3, Length(MyArray[i2]));
End;
und raus natürlich andersrum ^^

Die Beispiele ... erst in die MMF (was hier einfach mal als Pointer auf das erste Byte der MMF verwendet wurde) und dann wieder raus

[edit]
jupp, massig Fehler ._.


PS: so ein statisches Array[1..10] of String[255]; hat aber auch noch den Vorteil, daß man es auch die ganze Zeit in der MMF lassen kann.
Delphi-Quellcode:
Type TMyArray = Array[1..10] of String[255];
  PMyArray = ^TMyArray;

// und zum lesen/schreuben einfach
PMyArray(MMF)^[x]

// also z.B.
PMyArray(MMF)^[3] := S;
If PMyArray(MMF)^[4] = '123Then
  S := PMyArray(MMF)^[5];
...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#5

Re: MMF und dynamische Arrays?

  Alt 5. Mai 2006, 11:53
vielen vielen Dank himitsu !!!

perfekt!
  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 04:45 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