Results 1 to 8 of 8

Thread: Gebruik van Pointers

  1. #1

    Gebruik van Pointers

    Ik heb in D6 2 arrays van strings A en B met elk verschillende afmetingen gedeclareerd. Naargelang de waarde van een bepaalde variabele X zou ik het adres van één van die arrays willen toekennen aan een nieuwe array variabele C zodat ik daarna C kan gebruiken in de plaats van A of B zodat X niet meer elke keer opnieuw moet getest worden. Ik weet dat dit met pointers werkt en waarschijnlijk moet ik C als dynamische array declareren maar voor de rest weet ik niet hoe ik het moet ineensteken. Dank bij voorbaat.

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Is er een bepaalde reden dat je strings in arrays wilt stoppen of zijn het gewoon statische arrays?

    Zou een TStrings-afgeleide niet makkelijker/beter gaan (in het geval van een dynamische array)?

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Delphi Code:
    1. type
    2.   PStringArray = ^TStringArray;
    3.   TStringArray = array[0..MaxListSize] of String;
    4.  
    5. var
    6.   A: array[0..10] of String;
    7.   B: array[0..20] of String;
    8.   X: Boolean;
    9.   C: PStringArray;
    10.  
    11. procedure UpdateC;
    12. begin
    13.   if X then
    14.     C := @A
    15.   else
    16.     C := @B;
    17. end;
    18.  
    19. procedure TForm1.Button1Click(Sender: TObject);
    20. var
    21.   I: Integer;
    22. begin
    23.   for I := 0 to 10 do
    24.     A[I] := 'Dit is string A' + IntToStr(I);
    25.   for I := 0 to 20 do
    26.     B[I] := 'Dit is string B' + IntToStr(I);
    27.   X := True;
    28.   UpdateC;
    29.   Memo1.Lines.Add(C[2]);
    30.   X := False;
    31.   UpdateC;
    32.   Memo1.Lines.Add(C[4]);
    33. end;
    Last edited by NGLN; 10-Dec-10 at 02:34.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Sorry ik had moeten vermelden dat A en B tweedimensionale arrays zijn en zelfs constante arrays. Als ik het programma zo run krijg ik een foutmelding dat ik 2GB overschrijd en als ik die MaxListSize vervang door 30 dan blijft Memo1 gewoon leeg. Bedankt in ieder geval voor de reacties!

    Delphi Code:
    1. type
    2.   PStringArray = ^TStringArray;
    3.   TStringArray = array[0..MaxListSize, 0..MaxListsize] of String;
    4.  
    5. var
    6.   A: array[0..10,0..10] of String;
    7.   B: array[0..20,0..20] of String;
    8.   X: Boolean;
    9.   C: PStringArray;
    10.  
    11. procedure UpdateC;
    12. begin
    13.   if X then
    14.     C := @A
    15.   else
    16.     C := @B;
    17. end;
    18.  
    19. procedure TForm1.Button1Click(Sender: TObject);
    20. var
    21.   I: Integer;
    22. begin
    23.   for I := 0 to 10 do
    24.     A[I,0] := 'Dit is string A' + IntToStr(I);
    25.   for I := 0 to 20 do
    26.     B[I,0] := 'Dit is string B' + IntToStr(I);
    27.   X := True;
    28.   UpdateC;
    29.   Memo1.Lines.Add(C[2,0]);
    30.   X := False;
    31.   UpdateC;
    32.   Memo1.Lines.Add(C[4,0]);
    33. end;

  5. #5
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Dan gaat je dit niet lukken. Maar dan maak je toch gewoon een functie?

    Delphi Code:
    1. function C(W, H: Integer): String;
    2. begin
    3.   if X then
    4.     Result := A[W, H]
    5.   else
    6.     Result := B[W, H];
    7. end;
    8.  
    9. ...
    10.  
    11.   Memo1.Lines.Add(C(4,0));
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  6. #6
    Het is dat juist dat ik probeerde te vermijden omdat ik dan grote delen van de code gewoon moet dupliceren (en ook omdat ik gewoon eens een keer pointers wou uitproberen ) maar als het niet anders gaat...

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Als het je om de syntax met [] i.p.v. () gaat, dan kun je er altijd nog een property voor schrijven.

    Enfin, de reden waarom het niet werkt is dat de elementen van een fixed sized (multidimensionaal) array allemaal achter elkaar (dus als één "array") in jouw geheugen staan. Zolang je dus maar één dimensie hebt én je binnen de bounds blijft van het eigenlijk array waar de pointer naar verwijst, dan gaat het goed.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  8. #8
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by VideoRipper View Post
    Is er een bepaalde reden dat je strings in arrays wilt stoppen of zijn het gewoon statische arrays?

    Zou een TStrings-afgeleide niet makkelijker/beter gaan (in het geval van een dynamische array)?
    Als je zoiets noemt, moet je IMHO minstens aangeven waarom. Het is niet omdat het niet deug; eEr zit wel wat in (een type dat je dynamisch kan doorgeven), maar dat moet je IMHO dan wel zeggen.

    Ik zou overigens de twee arrays dynamisch maken (TStringdynarray of tdynstringarray in unit Types), en het procedure argument ook van dit soort type maken. Kan je eenvoudigweg arrays passen zonder gedoe. Pointers kan ook, maar zou ik niet aanraden voor automatische types tenzij je _heel_ goed weet wat je doet, en is sowieso pas echt doendelijk in hetzij FPC of D2009+ (dan heb je de TStringArray in NGLN's eerste voorbeeld niet meer nodig)

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •