Avatar billede zerohero Nybegynder
26. september 2000 - 09:54 Der er 3 kommentarer og
1 løsning

Cardinal, Pointer, Pchar

Er der en eller anden som kan forklare mig hvad Cardinal, Pointer og Pchar betyder og hvornår og hvordan man kan bruge disse begreber. Jeg har allerede læst i hjælpe filen, men forstod mildest talt ikke en brik af det. Jeg vil meget gerne have en masse eksempler på nogle koder (da jeg er lidt tungnem *gg*)...

På forhånd mange tak fra ZeroHero
Avatar billede borrisholt Novice
26. september 2000 - 10:11 #1
sådan står der i online hjælpen hvis du slår ordet cardinal op.

Cardinal    0..4294967295    unsigned 32-bit

i modsætning til en integer kan den ikke indeholde negative tal, men tilgengæld kan den så rumme et tal der er dobbelt så stort. Altså alle heltal far 0 til og med 4294967295 (godt 4,2 milliarder)

En pointer betyder en peger hvis du oversætter det direkte til dansk. Den peger på noget. I programmerings verden peger den på en datatype. En pointer er basalt set blot en integer. I dne integer skriver man memory adressen hvor på den data type du peger på ligger ..

Feks :

type
  TMinType = class(TObject)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


så erklærer du dig sådan en fætter :

procedure Hest;
var
  MinType : TMinType;
  MinType1 : TMinType;
  p : Pointer;
begin
  MinType := TMinType.Create;
  p :=  MinType;
  MinType1^ := p;
end;

Nu er det to variabler ens !

En Pchar er en pointer til et NULL termineret array of chars. Snak dansk forhelvede og kom med noget brugbart !

Jo ser du en array of chars kan fx. se sådan ud :
[#32,#33,#34,#35,#36,#0]
som du ser er dette array NULL termineret, mens det følgende ikke er :
[#32,#33,#34,#35,#36]

en PChar indeholder simpelthen adressen på den første karekter i arrayet. Når du bruger den som parameret til en funktion forventer funktionen at arrayet er NULL termineter, som i det første eksempel. Den vel således blivee ved med at læse i hukommelsen til den møder karekteren #0 og så opfatte det som en streng.

Datatypen findes i Delphi bla. for at gøre det muligt at kalde funktioner nede i DLL filer skrevet i C++, fordi C++ ikke som standard indeholder en pendant til Delphis String type.

\"Jammen jeg er sq da lige glad med jeres C++, jeg er igang med Delphi\" ... Joeee men Windows er skrevet i C++, og når du programmerer kalder du tit windows. Måske ikke direkte selv, men så gør Delphis bibloteker det for dig ....

Så sådan er deT!

jens B
Avatar billede zerohero Nybegynder
26. september 2000 - 10:27 #2
Tak jens B men...

Cardinal:
kan du ikke lige give mig et eksempel på cardinal... (please)...

Pointer:
tak for koden, men den eksempel du har givet mig
hvad kan jeg bruge den til?

Phar:
Jamen hvordan kan det så være at når man skal kopier filer, så skal man bruge Pchar (jeg er stadig lidt forvirret).
Avatar billede borrisholt Novice
26. september 2000 - 11:10 #3
Cardinal bruges til lagering af store tal på relativ lidt plads. Alternativet er en 64 bits datatyper som fyldermere og performance messigt er en dårlig forretning. Nogle funktions kald kræver disideret en Cardinal eller en pointer til en Cardinal in som paramerer. Fx. GetComputername i Wndows API\'en ... Et kald til den kan fx. udformes som følger :

Function  GetComputerName : String;
var
  Size : Cardinal;
begin
Size := MAX_PATH;
SetLength(Result, MAX_PATH);
Windows.GetComputerName(PChar(Result),Size);
SetLength(Result, Pred(Pos(#0,Result)));
end;

En cardinal i C++ werden hedder en DWORD og så du i hjælpen der noget alla dette

BOOL GetComputerName(

    LPTSTR lpBuffer,    // address of name buffer
    LPDWORD nSize     // address of size of name buffer
  );

betyder det at du skal først erklære dig en forekomst så så komme den ind i funktions kaldet. præcis som vist ..

pointere .. hvis du fx. vil oprette en liste af brugere til dit system vil du nok basere den på en TList ...


man kunne forestille sig en datatype TUser som den her :

  pUser = ^TUser; //^TUser betyder en pointer til en TUser struktur
  TUser = Record
    UserName: String[255];
    Password: String[255];
  end;

Nå så du vil tilføje sådan en fætter til din liste så gør noget alla det her :

Procedure TUserList.Add(const User : TUser);
var
  aUser : pUser;
begin
  aUser := new (pUser);
  aUser^.UserName := User.UserName;
  aUser^.Password := User.Password;
  inherited Add(aUser);
end;

Kode stumpen er taget ud fra et stører eksempel der viser hvordan man laver en krypteret liste ...

Nå du sk kopiere filer kalder du direkte ned i Windows og da API\'en ikke kender til pascal Strings er du nødtil at bruge C++ verden og det vil sige PChars.

Et eksemple på hvordan man bruger PChar så kig på mit svar på dit andet spørgsmål ...

EOA (End of Answer)
Jens B
Avatar billede zerohero Nybegynder
26. september 2000 - 11:19 #4
1000 tak 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