Newsgroup: it.comp.programmare.win32
Titolo: C++ Builder e AnsiString

Segnalo uno strano comportamento delle AnsiString (Borland C++ Builder 3).
Passando una String (per valore)come parametro ad una funzione che lo
modifica attraverso l'operatore [] (param[i] = 'x'), si modifica la stringa
originale, come se fosse stata passata per riferimento!
Usando invece l'assegnamento (param = "xxx") viene fatta correttamente la
copia (copy-on-write) e l'originale resta intatto.
La stessa identica operazione in Delphi (V.5) da' il risultato corretto ed
e' in accordo con quanto affermato da Marco Cantu' (Essential Pascal,
Chapter 7 - Looking at Strings in Memory).
Significa che l'implementazione di AnsiString in Delphi è diversa da quella
C++B! ?-o
ciao Sly 55
--
Per la casella di posta
metti si al posto di NO

C++B! 
In Delphi e' un tipo predefinito.
In C++B e' una classe.
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

 In C++B e' una classe.
Si, me ne sono accorto leggendo i metodi sull'help...
Cio' non toglie pero' che quello che ho descritto e' un comportamento
non corretto anzi, proprio perche' si tratta di una classe non dovrebbe
comportarsi come un array!
Comunque grazie per la precisazione.
ciao, Sly55


comportarsi come un array!
E difatti non e' cosi'.
Sei sicuro di non passare un reference alla classe ?
Il seguente codice, compilato con C++ Builder 5, funziona
perfettamente :
void NonModificare( String A )
{
     A[3] = 'u' ;
}
void Modifica( String& A )
{
     A[3] = 'u' ;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String A = "ciao ciao" ;
    ShowMessage( A ) ;
    NonModificare( A ) ;
    ShowMessage( A ) ;
    Modifica( A ) ;
    ShowMessage( A ) ;


     ShowMessage( A ) ;
ciuo ciao
Non solo, ma se prima di chiamare NonModificare() o Modifica() pongo
String B = A;
dopo la chiamata (di una qualsiasi delle due) risulta modificata anche B !
Se pero' cambio la funzione in:
void NonModificare( String A )
{
     A = A.Trim();
     A[3] = 'u' ;
}
le cose vanno a posto ed A non viene modificata (e neanche B).
Non so che pensare... sara' un problema del mio C++B !-(
(originale, aquistato anni fa, ma anche quello gratis che gira da qualche
mese e' identico, ed anche con gli aggiornamenti scaricati da 
borland.com
 )
ciao Sly_55

Non so che pensare... sara' un problema del mio C++B !-(
Non so che dirti. Con C++ Builder 5 funziona perfettamente ;(


Siccome la classe AnsiString contiene un puntatore alla stringa e non la
stringa intera, è possibile che l'assegnamento A = B si comporti come nel
caso di assegnamento fra puntatori.
Se vuoi rendere unica una stringa devi fare A.Unique()
Questo ti garantisce l'immutabilità della stessa fra chiamate a più
funzioni.
Non so se con il BCB5 questo è stato risolto, ma hai provato ad applicare
qualche patch al tuo BCB3?
Magari ce n'è proprio una che risolve il tuo problema.
Ciao
--
Stefano Tempesta
ste...@tempesta.org

caso di assegnamento fra puntatori.
Non ho guardato il codice sorgente, eppure mi sembra molto strano che
si comporti cosi' !...



http://www.borland.com/devsupport/bcppbuilder/patches/bcpp5/BCB5FIXES.HTML
ma non c'e' traccia di quanto riscontrato e l'unica patch per BCB3 l'ho gia
applicata... certo che se BCB5 e' corretto qualcuno se ne sara' ben accorto!
Sinceramente avrei preferito fosse stato un mio errore perche' almeno avrei
potuto farci qualcosa!
Grazie in ogni caso per l'attenzione
ciao, Sly_55


Beato te che hai i sorgenti!
Io ho fatto un po' di "cast esplorativi" nei dintorni di String.c_str() ...
    String A = "ciao";
    int DataAdr = *(int*)&A;
    char* Data = *(char**)&A);  /* equival. ad A.c_str()  !!!! */
    int Len = *(int*)(DataAdr - 4);
    int RefCount = *(int*)(DataAdr - 8);
Prima ancora (DataAdr - 12) c'e' qualcos'altro ma non sono riuscito ad
indovinare.
Quando si assegna String B = A , &A ed &B puntano alla stessa c_str().
Inoltre facendo un Orrore del genere (non picchiarmi please!):
A.c_str()[3] = 'u';
il risultato e' _identico_ ad A[3] = 'u';
con tutte le conseguenze di cui abbiamo gia' parlato!!!
Ok, sono daccordo: abbiamo perso abbastanza tempo intorno a questa storia!
Il fatto e' che ho la febbre e passo la notte tra matasse di String che mi
si annodano tra le gambe! &~(
Grazie a tutti per la discussione.
ciao, Sly_55.