PDA

Επιστροφή στο Forum : Πράξεις με pointers στη Delphi



WAntilles
28-04-05, 14:09
Η Delphi ως σοβαρή γλώσσα προγραμματισμού, χωρίς να έχει να ζηλέψει απολύτως τίποτα από τη C, έχει πλήρη υποστήριξη για pointers, είτε ειδικούς, είτε γενικούς.

Για να αποφύγετε τα λάθη όμως, σας απαγορεύει να κάνετε πράξεις με αυτούς.

Έτσι π.χ. το παρακάτω:


Uses
Windows;

Type
PInteger = ^Integer

Procedure Wrong;
Var
i, j: Integer;
p1, p2: pointer;
MyArray: Array [1.. 10] of Integer;
Begin
i := 0;
j := 0;
p1 := Nil;
p2 := Nil;
zeromemory(@MyArray, sizeof(MyArray));
p1 := @MyArray;
p2 := p1;
For i := 1 to 9 do
Begin
p2 := p1 + i * sizeof(Integer);
End;
End;

Ας πούμε ότι το παραπάνω το κάνατε γιατί σας βόλευε για κάποιο λόγο να πηγαίνετε σε ένα-ένα τα στοιχεία του array και να τα κάνετε dereference.

Η Delphi θα σας βρίσει γιατί δεν επιτρέπεται να κάνετε πράξεις με pointers γενικούς ή ειδικούς.

Η λύση:


Uses
Windows;

Type
PInteger = ^Integer

Procedure Correct;
Var
i, j: Integer;
p1, p2: pointer;
MyArray: Array [1.. 10] of Integer;
Begin
i := 0;
j := 0;
p1 := Nil;
p2 := Nil;
zeromemory(@MyArray, sizeof(MyArray));
p1 := @MyArray;
p2 := p1;
For i := 1 to 9 do
Begin
PChar(p2) := PChar(p1) + i * sizeof(Integer);
End;
End;

Η λύση είναι τη στιγμή που κάνετε την πράξη να κάνετε typecast όλους τους pointers ως PChar.

Η PChar είναι ένας εξαιρετικά χρήσιμος τύπος μεταβλητής στη Delphi με διττή προσωπικότητα.

Είναι ταυτόχρονα καί pointer καί String, αναλόγως με το πού ή από πού την κάνετε assign.

Και είναι ο μόνος τύπος pointer με τον οποίο επιτρέπει η Delphi πράξεις.

@ ADSLgr.com All rights reserved.