AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
Thema durchsuchen
Ansicht
Themen-Optionen

Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

Ein Thema von kaju74 · begonnen am 11. Dez 2009 · letzter Beitrag vom 11. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#1

Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 12:19
Hallo.

Ich hätte nochmal eine Frage bzgl. Strings in Record-Stukturen und den Unterschieden zwischen Delphi7 und BDS 2009/2010 (bezogen auf Unicode).

Nehmen wir mal folgende Struktur an, die so unter Delphi7 implementiert ist:

Delphi-Quellcode:
type
  TMyStructure = record
    LastName: string[32];
    FirstName: string[32];
  end;
  PMyStructure = ^TMyStructure;
Nehmen wir weiter an, eine Record-Instanz wird wie folgt erzeugt:

Delphi-Quellcode:
var
  MyStructure: PMyStructure;
begin
  New(MyStructure);
  MyStructure^.LastName := 'Mustermann';
  MyStructure^.FirstName := 'Max';
  ...
end;
Das Ganze unter Delphi7 kompiliert und funzt. Jetzt portieren wir das mal auf BDS 2009 und machen folgendes:

Delphi-Quellcode:
type
  TMyStructure = record
    LastName: string;
    FirstName: string;
  end;
  PMyStructure = ^TMyStructure;
Wie machen aus den ShortStrings/AnsiStrings nun UnicodeStrings. Was passiert nun bei "New(MyStructure)" und
beim Zuweisen der Record-Variablen, wenn diese statt mit einer Konstante mit einem übergebenen String (z.B. innerhalb
einer Methode) gefüllt werden?

Interessant finde ich, das ich dieses Konstrukt zwischen einer DLL und einer Host-Applikation einsetze, und ich beliebig
lange Unicode-Strings übergeben kann (SimpleShareMem/FastMM4)....hin und zurück. Dabei müsste doch nun der Speichermanager
von Delphi zunächst die Länge des Strings ermitteln und entsprechen Platz reservieren, oder?

Wie gesagt, eigentlich funktioniert das zwischen diversen Host-Applikationen und jeder Menger DLL's (PlugIns). Jetzt habe
ich aber an drei Stellen einer ziemlich großen Anwendung ein für mich nicht erklärbares Phänomen, bei dem z. B. übergebene
Strings an eine Methode plötzlich weg sind oder in einer anderen seltsamer Speichercode steht.

Ich werde also das Gefühl nicht los, das hier manchmal was nicht sooo richtig funktioniert und überlege, ob das mit diesen
Record-Strukturen zusammenhängt.

Wenn ich jetzt wieder die ShortStrings einführe [], dann muss ich halt an tausenden Codestellen einen Typcast machen (String->
AnsiString)....und daher die Frage, ob es hieran überhaupt liegen kann....!?!

Vielen Dank & Gruß,
kaju
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 12:33
Da hat sich überhaupt nichts geändert.
Delphi-Quellcode:
type
  TMyStructure = record
    LastName: string[32];
    FirstName: string[32];
  end;
  PMyStructure = ^TMyStructure;
String[x] ist undbleibt ein ShortString mit begrenzter Länge,
also ein "Record" aus einem LängenByte, direkt gefolgt von X AnsiChars
und ein ShortString ist nunmal nur "ANSI".
( String[255] = ShortString )


Delphi-Quellcode:
type
  TMyStructure = record
    LastName: string;
    FirstName: string;
  end;
  PMyStructure = ^TMyStructure;
Hier ist String ein LongString,
also ein Pointer auf die String-Daten

Der Einzige unterschied ist, das
<= D2007: String = AnsiString
>= D2009: String = UnicodeString
Aber dieses ändert nichts an der Speicherverwaltung.

[add]
http://www.delphipraxis.net/internal...light=widechar
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 12:33
Diese beiden Deklarationen sind auch unabhängig von der Delphi-Version verschieden. ShortStrings sind auch bei >= D2009 AnsiStrings
Markus Kinzler
  Mit Zitat antworten Zitat
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#4

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 12:53
Hallo.

Das string[xx] unter Delphi auch ein Shortstring mit max. 255 Zeichen ist, ist mir klar. Nur ist die Frage, wie der Speicher von Delphi allociert wird:

Gebe ich die max. Länge in Klammern an, weiß der Compiler ja, wieviel Zeichen zu reservieren sind. Nutze ich stattdessen einen String (ohne Klammern!) und weiße ihm einen in einer Methode als Parameter übergebenen String zu, weiß der Compiler die Länge ja nicht, da es erst zur Laufzeit passiert.

Wird nun der Speicher dynamisch erweitert? Macht dass der Memory-Manager alleine? Kann ich mich ohne Zutun darauf verlassen, oder könnte da evtl. andere Speicher überschrieben werden?

Gruß,
kaju
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:12
Das wurde doch erklärt?

Ein String[x] und ShortString (aka String[255]) entspricht dieser Struktur:
Delphi-Quellcode:
type
  MyShortString = packed record
    Len: Byte; // entspricht Data[0]
    Data: array[1..x] of AnsiChar;
  end;
Ein String/AnsiString/WideString/UnicodeString ist ein Zeiger auf seine Daten,
also im Record steht dort nur der Pointer (mit seinen aktuell 4 Byte) und der Rest (der Stringinhalt) liegt irgendwo anders.
Und der Speicher, auf welchen der Pointer zeigt, wird von Delphi (der CompilerMagic) automatisch verwaltet.

Das ist in allen Delphiversionen gleich. (natürlich solange sie den entsprechenden String-Typen kennen)
$2B or not $2B
  Mit Zitat antworten Zitat
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#6

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:25
Hallo.

Okay..sorry...das ich hatte ich so nicht verstanden - nu' isses klar Ich hätt's eigentlich wissen müssen...also liegt hier nicht mein Problem...mysteriös. Oder fällt Euch nochwas ein, warum ein an eine Methode übergebener String dort nicht ankommt?

Danke & lieben Gruß,
kaju
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:28
Also nochmal um das klarzustellen: Du darfst an diesem Rekord NICHTS verändern. Es muss auch in D2009 so aussehen:

Delphi-Quellcode:
type
  TMyStructure = record
    LastName: string[32];
    FirstName: string[32];
  end;
  PMyStructure = ^TMyStructure;
Das einzige was irgendwie zu Problemen führen könnte ist, dass man halt beachten muss, dass LastName und FirstName jetzt AnsiStrings sind und keine UnicodeStrings wie "String".
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#8

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:32
Wieso....????

Ich habe bereits alle Strukturen umgestellt, und rein durch "String" ersetzt...wieso ist das jetzt doch ein Problem? Wenn doch statt z.B. vorher bei String[32] eben 32 Bytes reserviert wurden und jetzt bei "String" nur 4 Bytes für den Pointer (oder so), und über "CompilerMagic" der benötigte Platz für den String reserviert ist, müsste doch alles okay sein, oder etwas doch nicht..??!?!?

Lieben Gruß,
kaju
  Mit Zitat antworten Zitat
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#9

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:35
Nachtrag:

Das war ja eben der Grund, warum ich alle Strukturen von AnsiString auf String/Unicode umgestellt habe. Ich hätte tausende Stellen Typecasten müssen, weil der Compiler da natürlich gemeckert hat, das evtl. Inhalt verlorengeht, wenn man einen String in AnsiString umwandeln möchte. Da die Stringlänge jetzt aber beliebig lang sein kann, war damit auch das Problem beseitigt...hoffe ich zumindest, da ich halt jetzt komischer Speicherüberlappungen habe. Umgestellt wurde von Delphi7/WindowsXP auf BDS 2009/Windows7 + Updates aller Komponenten. Jetzt muss ich halt nach für nach ausschließen, woher das Problem kommt.

Gruß,
kaju
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 13:37
Zitat von kaju74:
Oder fällt Euch nochwas ein, warum ein an eine Methode übergebener String dort nicht ankommt?
Da Deine Shortstrings 33 (nicht 32) Bytes belegen, wird mit ziemlicher Sicherheit die Speicherausrichtung {$a} bzw {$align} eine Rolle spielen. Sicher war man eigentlich nur, wenn man mit packed records arbeitet.
  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 00:34 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