Newsgroup: it.comp.lang.delphi
Titolo: Aritmetica dei puntatori in Delphi: impossibile?

Salve,
sto traducendo un pezzo di codice dal C e devo
trovare un sistema per replicare l'aritmetica dei puntatori.
(lo so, non dovrei, ma non posso intevenire "a monte"
della chiamata, per cui devo arrangiarmi).
Devo per forza usare Addr() e Ptr() o c'č un modo migliore?
Grazie

 trovare un sistema per replicare l'aritmetica dei puntatori.
Con qualche giro, si puo' eseguire l'aritmetica dei
puntatori anche con Delphi.  Se mi fai vedere il pezzo
di codice C, forse posso aiutarti.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Puoi fare calcoli sui puntatori, semplicemente castandoli come interi.
ad esempio:
var p:pbyte;
begin
 p:=@unbyte;
integer(p):=integer(p)+3; // punta tre byte dopo
forse si puo' fare anche inc(integer(p), 3); ma non sono sicuro
Attento che se non ricordo male, se il puntatore C e' tipizzato, lo
spostamento ha come unita' di misura le dimensioni della struttura del tipo.
Ciao !                    {MSX}
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt

 di codice C, forse posso aiutarti.
Grazie, ma cercando e leggiucchiando qua e la ho scoperto che
x: array[0..0] of integer;
mi da un array senza limiti... in pratica posso scrivere
x[n] con n qualsiasi senza che il compilatore rompa le scatole :-)
In più ho scoperto le Inc(x) e Dec(x) della unit system,
per cui in pratica ho risolto da solo il problema :-))

 x[n] con n qualsiasi senza che il compilatore rompa le scatole :-)
Il compilatore non ti rompe le scatole finquando non
attivi i controlli di range-checking, ma la cosa peggiore e'
che, a run-time, rischi di avere un bel "segmentation-fault".
Non puoi pensare di usare x con un indice qualsiasi.
Tieni presente che, in C, l'aritmetica dei puntatori e' 
legale, secondo lo standard del linguaggio (ma e' intuitivo
capirne il perche'), solo lungo la zona di memoria allocata
per il puntatore (fa eccezione il primo elemento dopo la
fine dell'array).  Teoricamente, se ho:
char a[] = "andrea";
char *p = a-1;
posso produrre un segmentation fault, >> anche se non
faccio riferimento al valore puntato da p <<.
In Delphi, ovviamente, vale il principio per cui, 
allocata una certa quantita' di memoria (staticamente o
dinamicamente) non posso muovermi al di fuori di 
quella dimensione.
Se vuoi avere un array espandibile, usa :
var
  X: array of integer;
e lo allochi/espandi/riduci a run-time per il numero di 
elementi che ti serve effettivamente.


 Non puoi pensare di usare x con un indice qualsiasi.
In teoria (e in un codice Delphi nativo) non ci penserei
nemmeno.
Ma come ti dicevo, mi devo arrangiare e portare in
Delphi una subroutine C a cui vengono passati puntatori
che poi vengono usati come array... cosa legale in C ma
proibita in Object Pascal. Quindi devo prendere il
puntatore che mi arriva, "farci un array" e indicizzarlo
sperando che fili tutto liscio...
Per questo non posso usare un array dinamico, perchè
una sua estensione occupa *altra* memoria e non usa
quella che contiene i dati su cui devo operare.

 Devo per forza usare Addr() e Ptr() o c'è un modo migliore?
Inc() e Dec(). Con i puntatori tipizzati si comportano esattamente come 
in C
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.18. C, C++ and ASM developers
                              and beta testers are welcome!

 in C
Mi giungeva nuova, grazie.
Per completezza, aggiungerei che s'ha da avere l'extended syntax On
{$H+} (il default cmq e' appunto ON)
Saluti
Paolo Arosio

 {$H+} (il default cmq e' appunto ON)
oops: {$X+}
Paolo Arosio

Ciao Belfagor,
xkè non provi un po' con il riadattare questo codice?
var a:^byte;
    b:char;
begin
  a:=@b;
  while <TuaCondizione> do
   begin
    write(a^);
    inc(a);
   end;
end.
Adattalo al meglio a l tuo problema!!
Buana fortuna!