Newsgroup: it.comp.lang.pascal
Titolo: Computer Impazziti

end;
Facendo due rapidissime prove con i PChar mi e' sorto questo dubbio.
MiaStringa e' un puntatore; ora, di solito i puntatori puntano a
qualcosa, tant'e' vero che prima di usarli li fai puntare da qualche
parte. In questo caso xo' a che punta MiaStringa? Cioe' facendo
sizeof(...) da' 4, come tutti gli altri puntatori, ma puo' contenere
stringhe lunghe quanto vuoi. Dove le mette? Tra l'altro mettendo
MiaStringa nei Watches non fa vedere un indirizzo, ma la stringa. In
particolare la memoria occupata e' fissa, bisogna stabilirla a priori
(come x le stringhe normali) o varia a seconda della lunghezza?
Scusatemi se ho detto delle castronerie...
Grazie,
Luigi
PS: mi sembra che sia {$X+} x usare i PChar.
--
|\/\/\/|              |\/\/\/|  Luigi Balduzzi
 \    /    |\/\/\/|    \    /   studente, 4 liceo scientifico
 | II |\/\/| .__. |\/\/| II |   Genova, Italy
 | II | II | |++| | II | II |
 |____|____|_|++|_|____|____|   e-mail: 
jy...@usa.net
==============================  powwow: 
gi...@genova.it

Be', grazie mille x la risposta.
Pero', qualcuno sa spiegarmi sto programma:
{$X+}
var
 a, b: PChar;
begin
 a:='Ciao!';
 WriteLn('a=',a);
 a:='Io mi chiamo Luigi.';
 WriteLn('a=',a);
 a:='Luigi come mio nonno, il padre di mio padre.';
 WriteLn('a=',a);
 b:=a;
 WriteLn('b=',b);
 b:='Bye bye!';
 WriteLn('a=',a);
 WriteLn('b=',b);
 ReadLn;
end.
La variabile a infatti contiene un numero sempre maggiore di
caratteri. Inoltre essendo a e b puntatori facendo b:=a dovrebbeso
puntare alla stessa cosa (o dico una c.....a?) e quindi cambiando una
stringa dovrebbe cambiare l'altra; invece non e' cosi'.
Grazie,
Luigi


Facendo due rapidissime prove con i PChar mi e' sorto questo dubbio.
[...cut...]
tutti i tuoi dubbi derivano dal fatto che la giusta inizializzazione di una 
stringa asciiz è quella che ho scritto io è non l'altra, inoltre ricordati che 
per copiare stringhe asciiz da una all'altra devi usare le routine apposite 
(strcopy, strcat, etc) che contengono come parametri dei pchar. Come detto il 
pchar è un banale ^char e quindi ben si adatta a trattare dati che contengono 
byte. Inoltre ricordati che non esiste la struttura asciiz, ma è solo un tipo 
di convenzione (comoda) che sia usa per gestire le stringhe... Il Pascal ci è 
arrivato tardi, prima passando per i packed array, poi per le string (che come 
sai contengono la lunghezza della stessa nell'elemento zero, non accessibile, 
o meglio al quale non si dovrebbe accedere) e finalmente adeguandosi a tutti 
gli altri linguaggi più evoluti.
                                                                        Luca.
magari non è chiarissimo, ma l'ora è quella che è e non sono ancora andato a 
dormire...

Secondo me il discorso e' il seguente:
1) a  e  b essendo PChar sono puntatori.
2) Nel tuo caso tu assegni 3 allocazioni di memoria diverse, mi spiego:
le costanti stringa (ovvero quello che tu metti tra virgolette) vengono
messe nel file EXE (se lo apri con un viewer le vedi). A questo punto,
quando tu assegni ad a questa stringa, tu in effetti vai ad assegnare alla
pchar il puntatore a questa allocazione. Tutto questo per tre volte.
Ovviamente questo vale anche per b al quale farai puntare lo stesso valore
a cui punta a. 
3) Il casino nasce se le tue stringhe non sono costanti, per esempio quando
le chiedi con una readln, oppure quando cerchi un file ecc. ecc. In questo
caso devi prima assegnare una quantita' sufficente di memoria piu' un byte
per il terminatore #0 e poi inserire la stringa con una strcopy. 
NB questa operazione la fa' automaticamente strnew, con la fregatura che
strnew vuole come parametro una pchar (se non
     sbaglio...).
NB2 Questo e' lo stesso funzionamento delle stringhe in C (CASINO!!!!) :(  
 
NB3 Puo' darsi che non sia niente vero... Pero' tutto fila...
NB4 Rileggendo non ho capito niente neanche io....
Ciao ciao.
-- 
Please mail me at:
Matteo.F...@fe.nettuno.it
Ciao.

Secondo me il discorso e' il seguente:
[...cut...]
Scusa, non ho capito a chi stai rispondendo... puoi, magari, postare un pezzo 
del msg a cui stai rispondendo?
                                                                        Luca.