Newsgroup: it.comp.programmare.win32
Titolo: strcpy vc++ 2010

Devo copiare una CString in una char[10], con il vc++ 6.0 facevo così
CString sText = "prova";
char cCar[10];
strcpy(cCar, sText);
ora con il vc++ 2010 mi da errore, sapete se la funzione strcpy è
stata sostituita con altre oppure se devo cambiare qualcosa?
Grazie

 ora con il vc++ 2010 mi da errore
L'help del VC dovrebbe dirti cosa è successo alla strcpy.
Probabilmente dovrai usare _strcpy(), _strncpy() o qualcosa del genere.
Le funzioni CRT ora generano un warning di deprecazione adesso, e devi 
usare le versioni sicure, cioè con la _s finale: strcpy_s(), strstr_s(), 
strchr_s() ecc. ecc... che vogliono come argomento anche la lunghezza 
della stringa su cui lavorano. E' comunque possibile disabilitare il 
warning e fregarsene, però: il codice compila lo stesso correttamente.

 Grazie
al posto di strcpy devi utilizzare strcpy_s.
La riga diventerebbe:
strcpy_s(cCar, sizeof(cCar), sText);
oppure, visto che il compilatore conosce la dimensione dell'array cCar, 
nel tuo caso č ancora meglio scrivere:
strcpy_s(cCar, sText);
Se hai molte righe di quel tipo e vuoi evitare di modificarle tutte, 
puoi crearti la seguente macro:
#define strcpy strcpy_s

 #define strcpy strcpy_s
No, mi sa proprio di no :-)
Il rischio di non ricordarsi più della macro e che strcpy è in realtà 
strcpy_s è altino (almeno per me lo è), per cui in casi del genere io 
faccio un cerca&sostituisci globale e sistemo la cosa alla radice.

 #define strcpy strcpy_s
Ho Provato con:
strcpy_s(cCar, sText);
questo è l'errore ricevuto;
error C2665: 'strcpy_s': nessuno dei 2 overload potrebbe convertire
tutti i tipi di argomenti
mentre con:
strcpy_s(cCar, sizeof(cCar), sText);
error C2664: 'strcpy_s': impossibile convertire il parametro 3 da
'CString' a 'const char *'
sono errori e quindi il compilatore si ferma
sapete il perché di questi errori?

> > Devo copiare una CString in una char[10], con il vc++ 6.0 facevo cosě
CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);

 _tcscpy_s(lpsz, sizeOfString, theString);
Ok funziona, anche so ho qualche problema nel trasferimento del 'lpsz'
alla COM, devo verificare.

> ora con il vc++ 2010 mi da errore
purtroppo Microsoft ha 'deprecato' quasi tutto il C standard.
-- 
Vincenzo Mercuri

 stata sostituita con altre oppure se devo cambiare qualcosa?
Secondo me il tuo non č un problema di "deprecation" (magari se posti 
l'errore che ti da...) ma piuttosto un problema di convivenza char vs 
wchar_t
Se non hai idea di quello che sto dicendo e se per te le parole ANSI e 
UNICODE non significano nulla... cerca nella msdn "Unicode Programming 
Summary"  
http://msdn.microsoft.com/en-us/library/dybsewaf(VS.80).aspx
Prova con:
CString sText = "prova";
TCHAR cCar[10];
_tcscpy(cCar, sText);
Se invece ti servivano proprio dei char... allora devi convertire ma 
questo non č sempre possibile (cosa succede se in sText ci sono dei 
caratteri non ansi?) ad esempio usa CT2CA()


Le CRT standard hanno grossi problemi di security perché nella maggior 
parte dei casi non c'è modo di prevenire un buffer overrun.
Se vuoi i warning si possono disabilitare e tutte le CRT senza "_s" 
funzionano senza più dare alcuna segnalazione.
Se la security non è una motivazione sufficiente a cambiare (anche se 
dovrebbe sempre esserlo) posso dire che convertendo le chiamate verso 
le versioni con "_s" si trovano anche bug. Infatti nella versione debug 
delle safe-crt la cosa avviene grossomodo così:
- il buffer viene sempre sovrascritto completamente
- in cima e in fondo al buffer ci sono dei sentinel (byte di valori 
noti) che permettono il detect di eventuali sovrascritture.
Quindi se dichiari un buffer di dimensioni maggiori rispetto a quello 
vero, il sentinel viene sovrascritto e il debugger ti avverte del 
problema.
Spesso questi errori non si vedono perché è possibile che venga 
sovrascritta una zona di memoria non utilizzata. Con le safe-crt invece 
lo trovi subito.
Nella versione release tutto questo viene rimosso per motivi di 
performance.
Aggiungo un paio di cose:
1. su windows non ha molto senso usare la versione ansi o tchar delle 
stringhe. Da sempre NT è Unicode e se chiamo la versione ansi di una 
API internamente avviene la conversione in Unicode, quindi è 
peggiorativo di performance. Da quando non si usa più Win9x la versione 
ansi non serve e la tchar è un grattacapo in più per i test.
2. Nei sorgenti C++ è preferibile evitare l'uso delle CRT.
Le STL sono la scelta primaria in C++ anche se sulle prime possono 
sembrare un po' ostiche.
Con VC++2008SP1 hanno esordito le TR1 della ISO. Quindi smart pointer 
'veri' e tante altre belle cose che rendono l'uso esplicito di 
puntatori del tutto inutile.
Con VC++2010 hanno esordito tante altre cose che faranno parte dello 
standard C++1x (o C++0x per i pignoli) che includono le lamba, nuove 
keyword, etc.
Sorry per la sbrodolata ...
-- 
Raffaele Rialdi  
http://www.iamraf.net
Weblog: 
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - 
http://www.ugidotnet.org/