Avatar billede koden12 Nybegynder
08. august 2003 - 21:19 Der 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
Avatar billede erikjacobsen Ekspert
08. august 2003 - 21:20 #1
Den skal kun bruges, når man skal tilgå funktioner i biblioteker (DLL-er)
der fx er lavet i C. Altså kun til rimeligt nørdet programmering ;)
Avatar billede theplayer.da.ru Nybegynder
08. august 2003 - 21:21 #2
Er du fuld? :-)
Avatar billede koden12 Nybegynder
08. august 2003 - 21:42 #3
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
Avatar billede athlon-pascal Juniormester
08. august 2003 - 21:43 #4
Der er vist noget med noget #0 til sidst...
Avatar billede athlon-pascal Juniormester
08. august 2003 - 21:44 #5
Og så er den vist en pointer og lidt sværere at tilgå ind en String (der også er en pointer).
Avatar billede djernaes Nybegynder
08. august 2003 - 21:47 #6
Koden12,

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!

Martin
Avatar billede athlon-pascal Juniormester
08. august 2003 - 21:48 #7
Prøv lige at gå til side 265 igen, og læs afsnit 4.
"Windows-styresystemet er i høj grad programmeret i programmeringssproget C"...
Avatar billede koden12 Nybegynder
08. august 2003 - 21:49 #8
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
Avatar billede athlon-pascal Juniormester
08. august 2003 - 21:50 #9
//Uden for spørgsmål
Djernaes -> Er dine fede mailslot-komponenter helt færdige, eller kan der evt. komme noget NetSend til WinNT/XP?
Avatar billede djernaes Nybegynder
08. august 2003 - 21:51 #10
StrPCopy kopiere en string (Pascal style) ind i en (ny) PChar ...
Avatar billede djernaes Nybegynder
08. august 2003 - 21:53 #11
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 ;(
Avatar billede janbb Juniormester
09. august 2003 - 03:23 #12
koden12
jeg så hejhej bruge StrPCopy i et spm forleden:
procedure ExecuteShellCommand(cmdline: string; hidden: Boolean);
const
  flags: array [Boolean] of Integer = (SW_SHOWNORMAL, SW_HIDE);
var
  cmdbuffer: array [0..MAX_PATH] of Char;
begin
  GetEnvironmentVariable('COMSPEC', cmdBUffer, SizeOf(cmdBuffer));
  StrCat(cmdbuffer, ' /C ');
  StrPCopy(StrEnd(cmdbuffer), cmdline);
  WinExec(cmdbuffer, flags[hidden]);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecuteShellCommand('net stop etellerandet', True);
end;
Avatar billede erikjacobsen Ekspert
09. august 2003 - 07:42 #13
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.
Avatar billede koden12 Nybegynder
09. august 2003 - 12:16 #14
Så hvis jeg skal lave en string i en edit1.txt og gerne vil have den større end 255 tegn skal den laves om til PChar ?
VH
SpørgerJørgen
Avatar billede athlon-pascal Juniormester
09. august 2003 - 12:54 #15
Nej... En String kan være langt større end 255 tegn :-)
Avatar billede erikjacobsen Ekspert
09. august 2003 - 13:27 #16
I ældre versioner af Delphi kunne strenge kun være 255 tegn.
Avatar billede koden12 Nybegynder
09. august 2003 - 13:55 #17
SUK !
Nu troede jeg lige jeg havde fattet det.
VH
SprøgerJørgen
Avatar billede erikjacobsen Ekspert
09. august 2003 - 14:07 #18
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.
Avatar billede djernaes Nybegynder
09. august 2003 - 19:00 #19
Koden12,

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).

Martin
Avatar billede tolderlund Nybegynder
11. august 2003 - 08:34 #20
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).
Avatar billede borrisholt Novice
11. august 2003 - 08:55 #21
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 :

s := p;

Jens B
Avatar billede koden12 Nybegynder
11. august 2003 - 10:10 #22
Meget flot
Tak
VH
SpørgerJørgen
Avatar billede djernaes Nybegynder
11. august 2003 - 16:24 #23
borrisholt,

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?

Martin
Avatar billede borrisholt Novice
11. august 2003 - 16:33 #24
en LargeString bruger 4 bit til at skrive størelsen i
en ShortString  bruger 1 byte.

En Pchar er blot en pointer type, og der for har du et 32-bits adresse rum ! I den sidste ende bruger du GetMEM.

Jens B
Avatar billede djernaes Nybegynder
11. august 2003 - 16:47 #25
Jens,

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.

Martin
Avatar billede borrisholt Novice
12. august 2003 - 07:29 #26
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester