AGB  ·  Datenschutz  ·  Impressum  







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

StrAlloc verstehen

Ein Thema von Neutral General · begonnen am 1. Aug 2007 · letzter Beitrag vom 1. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

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

StrAlloc verstehen

  Alt 1. Aug 2007, 15:29
Hi,

Habe mir gerade angeguckt wie man per Drag&Drop Dateien aus dem Explorer öffnet.. Habe soweit alles verstanden aaaber..

Delphi-Quellcode:
size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
Filename:= StrAlloc(size);
Man holt sich hier die größe des FilenameStrings... Wie das funktioniert habe ich mithilfe der Hilfe verstanden. Aber wie man nun nur durch die Größe an den eigentlichen String kommt nicht so ganz...
Ich kommentier mal soweit ich das nachvollziehen kann..


Delphi-Quellcode:
function StrAlloc(Size: Cardinal): PChar;
begin
  Inc(Size, SizeOf(Cardinal)); //warum?
  GetMem(Result, Size); // Speicher reservieren .. soviel wie der String lang ist
  Cardinal(Pointer(Result)^) := Size; // Size stellt die Adresse des Strings dar?
                                      // Hiermit wird doch der Pointer von Result auf die Adresse
                                      // die Size darstellt (mir fällt keine bessere Beschreibung ein)
                                      // "umgelenkt"
  Inc(Result, SizeOf(Cardinal)); // warum?
end;
Was ich daran nicht verstehe ist das Size sowohl die Länge als auch gleichzeitig die Speicheradresse des Strings darstellt.. Wenn der String 2 Zeichen lang ist.. dann müsste der String doch beim Offset 02 anfangen oder verstehe ich da was falsch?

Gruß
Neutral General
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:36
Delphi-Quellcode:
function StrAlloc(Size: Cardinal): PChar;
begin
  Inc(Size, SizeOf(Cardinal)); //Die Größe des zu reservierenden Platzes um 4 Bytes erhöhen
  GetMem(Result, Size); // Speicher reservieren .. soviel wie der String lang ist + 4 Bytes um die Länges des Strings zu speichern
  Cardinal(Pointer(Result)^) := Size; //die Größe des Speicherplatzes am Anfang des reservierten Platzes speichern
  Inc(Result, SizeOf(Cardinal)); // Den Pointer (PChar) hinter die Größenangabe verschieben
end;
Ein PChar sieht bei Delphi so aus, dass immer vor dem PChar 4 Bytes mit reserviert werden, welche die Länge des Strings beinhalten (+4)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:40
Moin Michael,

der Inhalt eines "normalen" Strings in Delphi beginnt bei der Adresse, die die Funktion zurückliefert.
Davor liegen dann noch 4 Byte (als Cardinal) Länge (und davor noch 4 Byte Referenzcount. Wo sind die eigentlich )

Delphi-Quellcode:
  // Platz schaffen für die Länge des zu reservierenden Strings
  Inc(Size, SizeOf(Cardinal));
  // Speicher reservieren für Länge und Inhalt
  // Result enthält jetzt die Adresse des reservierten Speichers
  GetMem(Result, Size);
  // An dieser Stelle wird jetzt die Länge gespeichert
  // Durch das ^ wird dereferenziert, also an die Adresse geschrieben, auf die Result zeigt.
  // Durch Cardinal() wird dann ein Type-Cast durchgeführt, damit man auch Size dorthin schreiben kann,
  // was der Compiler sonst unterbinden würde
  Cardinal(Pointer(Result)^) := Size;
  // Jetzt wird Result auf den Anfang des Inhaltes gesetzt
  // Die Länge steht also auf Result - 4
  Inc(Result, SizeOf(Cardinal));
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#4

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:42
Hi,

warum so kompliziert ?

Delphi-Quellcode:
...
var
  Filename: string;
...

   size := DragQueryFile(Msg.WParam, i , nil, 0);
   SetLength(Filename,size);
   size := DragQueryFile(Msg.WParam, i, pChar(Filename), 0);

...
ungetestet, müsste aber stimmen.

Gruss
[Edit thkerkmann] Mist, Thema verfehlt.... 6 setzen [/Edit]
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  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
 
#5

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:42
Ja gut was passiert hab ich jetzt verstanden aber der String könnte doch überall im Speicher sein.. Wieso zeigt Result standardmäßig schon am Anfang der Procedure (oder spätestens nach GetMem) auf das erste Zeichen des Strings ? (Müsste ja nach meinem Verständnis).

Wisst ihr was ich meine?
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:45
Zitat von Christian Seehase:
(und davor noch 4 Byte Referenzcount. Wo sind die eigentlich )
Ist ja kein String sondern ein PChar. Der hat keinen Referenzzähler .
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:45
Moin Michael,

mit GetMem wird der Speicher reserviert, und die Adresse dieser Reservierung in Result abgelegt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:45
Hüstel verlesen, sorry!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:46
Sirius,

Zitat von sirius:
Ist ja kein String sondern ein PChar. Der hat keinen Referenzzähler .
Schon, aber ein PChar braucht auch keine Länge...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: StrAlloc verstehen

  Alt 1. Aug 2007, 15:47
Zitat von Neutral General:
Ja gut was passiert hab ich jetzt verstanden aber der String könnte doch überall im Speicher sein.. Wieso zeigt Result standardmäßig schon am Anfang der Procedure (oder spätestens nach GetMem) auf das erste Zeichen des Strings ? (Müsste ja nach meinem Verständnis).

Wisst ihr was ich meine?
Nö, der Zeiger zeigt nah GetMem auf den reservierten speicherplatz (inkl. der 4 Bytes) und wird am Ende (das "inc") einfach hinter die ersten 4 Bytes gelegt, also an den Anfang von [size] reservierten Bytes.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  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:19 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