08. august 2003 - 21:19Der er
25 kommentarer og 1 løsning
Hvad er det med PChar
I min bog/Bøger står der : At man godt nok har en PChar men næsten aldrig får brug for den. Men her og alle andre steder bruges den igen og ingen ??? Hvad er det som er SÅ hemmeligt ved den PChar at vi andre ikke må vide det :) VH SpørgerJørgen
Nej, nej ,jeg er ikke fuld :) *G* på side 265 i per Amdal bog om Delphi 4 står der : "Vi nøjes !!! ??? derfor KORT at omtale denne TYBE..Det besværlige ved PChar er osv osv..." Så den må være hemmelig da den bruges hele tiden igen og igen men de vil ikke skrive andet end KORT om den. Hvad er der med den ? VH Sprøgerjørgen
PChar er en pointer til en række bytes som er afsluttet med et NULL tegn. Hvis PChar peger på strengen "foo", så peger den på hukommelses pladsen hvor "f" står og Pascal/Delphi ved at den skal lede efter tegn (char) indtil den finder et null tegn (#0). Altså peger den egentligt på "foo#0".
Yderligere ved en PChar streng hvor meget plads der er i den, da dette står som to bytes lige enden det som PChar'en peger på. Altså står der $00,$04,f,o,o,#0 på de seks pladser som optages af din hukommelse (for at være helt ærlig, så kan jeg ikke huske om der står 4 eller 6).
Hvad skal du med det? Jo der var en gang hvor en Pascal/Delphi streng kun kunne bruge 255 bytes, da den brugte en byte til at beskrive længden, og PChar var den eneste måde at gemme en streng større end 255 bytes. Idag har Delphi strenge der er større og du kan i 99% af dit arbejde bruge den i stedet, dog bør du sikre dig at du type caster til en PChar hvis du vil have noget ind i Windows API'et, da det ikke ved hvad en Pascal/delphi streng er!
Man kan derfor med held ??? skriver han vidre på side 268 benytte en anden i steder for PChar.... StrPCopy ???? Den har jeg aldrig hørt om ?? Jeg har heller aldrig set den brugt ? VH SpørgegJørgen
MailSlot: Jeg regner ikke med at lave noget på dem, med mindre der bliver fundet nogle fejl ... det er jo noget tid siden sidste ;-) Hvis jeg skulle få enormt meget tid en dag (tvirvler), så ville jeg gerne lave en rigtig "net send" komponent, men der er kun 24 timer i et døgn og kun 7 døgn i en uge ;(
Det er fordi han skal bruge WinExec som stammer fra en DLL i Windows - som sikkert er skrevet i C. Den metoder forstår ikke normale Delphi strenge, så de skal bare lige laves om.
det er egentlig meget simpetlt: du skal ikke bruge PChar. Du skal (måske) bruge PChar hvis du anvender funktioner og procedurer i andre DLL-er (måske er de skrevet i C), men ikke til det du selv laver med almindelig Delphi-kode.
Jeg er enig med Erik, du behøves ikke at bruge PChar (mere) og selv "hejhej"s kode kunne skrives uden at bruge PChar idag med brug af SetLength og type casting, men måske er det fordi jeg er vand til at bruge PChar at jeg også ville have brugt PChar her.
Som tommelfinger regel kan du sagtens bruge string til alt, men PChar hvis du skal snakke med Windows API funktioner (eller andre dll funktioner).
Det med PChar er ikke så hemmeligt. PChar kan indeholde tekst ligesom Delphis string type. Normalt og i de fleste tilfælde skal du bare bruge Delphis egen string type. PChar bruger man når man skal kalde et Windows API, fordi Windows ikke ved hvad en Delphi string type er. Ligeledes når man skal kalde eksterne rutiner i DLL skrevet i andre sprog (kan også gælde DLL skrevet i Delphi).
Lad os lige slå et par ting fast en streng er bygger op således :
Det er et array af 0..n chars. Den første position i en streng hedder 1. Før char nr. 1 ligger der 4 byte altså en hel integer, hvor i størelsen står. Det giver plads til 2147483647 byte /2097151 KB / 1741 MB/ 1,7 GB. I den en char og en Byte er det samme.
En PChar er en pointer til et array af chars. Det er INGEN størelses angivelse i sådan. Og det første element hedder 0. For at vide hvornår sådan et array slutter har man bestemt at man eftter den sidste karakter sætter en #0. Sådan en PChar har de samme begrænsinger son en streng, i det at godt 1,7 GB er den største hukommelses block du sådan lige umiddelbark kan allokere i er 32 bits operativ system.
Mange forveksler en streng, med en ShortString. En short string svarer til en streng fra D1 samt de gamle Tourbo Pascal dage. Den kunne indeholde 255 karekterer. Den er opbygger son et array af chars. Den første plads hed 1. På plads nummer 0 fandt man en enkely byte, hvor i størelsen på din streng står.
Winodws er IKKE skrevet i C, den er skrevet i C++. "FLUE KNEPPER" sidder i sikkert og råber ! Men nej C og C++ er IKKE det sammen sprog. Syntaks en ligner meget, men samme sprog NEJ !
Man san konvetere en streng til en Pchar således :
var s : String; p : PChar; begin s := 'Her er en hest'; p := PChar(s); end;
Det findes en udokumenteret feature som rentfaktisk er lidt hurtigere :
var s : String; p : PChar; begin s := 'Her er en hest'; p := pointer(s); end;
skal du konvetere en Pchar til en streng er det meget nemt :
Lad os skippe udtrykket string, og sige at der findes LargeString (ny) og ShortString (gammel) ... hvilket du har beskrevet meget fint (bruger LargeString 32 bit til længden?), men godt nok indeholder en PChar ikke længden, som en Large-/ShortString, men den indeholder en "allokeret størrelse" på byte -1 og -2 og kan derfor egentligt ikke være større end 64k. Ved du om Borland har ændret det?
En PChar er ganske rigtigt "bare" en pointer, men på position -1 og -2 stod en 16 bit værdi med størrelsen af pointeren, så den PChar funktionen var begrænset til 16 bit. Om det har ændret sig skal jeg ikke kunne sige.
Hmmn .. Det er jeg ikke bekendt med.. Jeg har kigget i sourcen til StrLen og det er ihvertfald ikke den metode borland bruger .....
Men er det ikke bare ar prøve at se hvad det står der ?
Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.