Newsgroup: it.comp.lang.c++
Titolo: dov'e' l'errore???

#include <windows.h>
#include <iostream.h>
char *Strcpy(char*);
int main()
{
 char szSource[19] = "Stringa da copiare";
 char *ptConcat = Strcpy(&szSource[0]);
 cout << *ptConcat << endl;
 /* delete ptConcat; */ /* l'ho remmato perche' mi dava errore */
 return (0);
}
char *Strcpy(char *szSource)
{
 char *szDest = new char[strlen (szSource) + 1];
 while((*szDest++ = *szSource++) != '\0')
  ;
 return (szDest);
};
quando richiamo la mia Strcpy e stampo il risultato con la cout, ho dei
simboli strani, come se il puntatore non fosse inizializzato...
dov'e' l'errore???
ciao e grazie in anticipo!!!

 ciao e grazie in anticipo!!!
ciao

ho risolto l'errore, grazie, era che ptDest all'uscita della funzione
puntava all'ultimo elemento dell'array, gli ho associato un puntatore
all'inizio e tutto va bene
adesso ho un altro problema, non ho capito come funziona la delete e
infatti ho un errore quando provo ad utilizzarla
P.S. hai ragione,il codice e' poco comprensibile, ma ho iniziato a
studiare adesso e l'entusiasmo mi porta a provare tutte le soluzioni
possibili, anche scrivendo codice contorto
quando pero' l'avro' imparato e l'usero' per lavoro il codice sara' il
piu' leggibile possibile
adesso sono entusiasta perche' e' da due settimane che studio il C++ e
quindi voglio provare tutte le soluzioni, tutti i costrutti possibili...
Mi dici concettualmente e in pratica perche' ho un errore di run time
nella delete???
ciao e grazie in anticipo
char *Strcpy(char*);
int main()
{
	char szSource[19] = "Stringa da copiare";
	char *ptConcat = Strcpy(&szSource[0]);
	cout << ptConcat << endl;
	delete ptConcat; /* ERRORE, ERRORE */
	return (0);
}
char *Strcpy( char *ptSource)
{
	for(char *ptDest = new char[strlen (ptSource) + 1],
		char *ptResult = ptDest; (*ptDest++ = *ptSource++); )
		;
	*ptDest = 0;
	return (ptResult);
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
Spero di esserti stato d'aiuto!
Ciao
Francesco

 }
qui vi sono due errori:
uno nella linea con il delete che porta ad un, credo, memory leak.
Infatti passi a delete un puntatore che e' stato allocato come un array, 
ma non la informi di questo.
codice corretto
char* p=new char[100];
delete [] p; // <-- nota le []
secondo errore, e penso sia questo che ti fa sballare il prog
nella tua foga di scrivere codice super-compresso (non 
super-ottimizzato), hai voluto inserire nel for di Strcpy piu' roba 
possibile, con il risultato di inserirne troppa :)
La dichiarazione di una variabile in un for, ha uno scope pari al for 
stesso.
quindi se scrivi
for(int i=0;i<10;i++) ;
std::cout << i; //<-- qui i non e' piu' accessibile
infatti compilando il codice soprastante il g++ si incazza e mi dice:
a1.cpp: In function `int main()':
a1.cpp:27: name lookup of `i' changed for new ANSI `for' scoping
a1.cpp:26:   using obsolete binding at `i'
allora prova a riscrivere Strcpy cosi:
char *ptDest = new char[strlen (ptSource) + 1];
char *ptResult = ptDest;
for(; (*ptDest++ = *ptSource++); );
return (ptResult);
P.S.
non capisco cmq perche' quel codice compili, che compilatore usi?


uso il Visual C++ 6.0 della Microsoft
ciao

stefano wrote:
[snip]
ok , il codice qui sotto compila e funge sotto g++
#include <iostream>
using namespace std;
char *Strcpy(char*);
int main()
{
         char szSource[19] = "Stringa da copiare";
         char *ptConcat = Strcpy(&szSource[0]);
         cout << ptConcat << endl;
         delete [] ptConcat;
         return (0);
}
char *Strcpy( char *ptSource)
{
         char *ptDest = new char[strlen (ptSource) + 1];
         char *ptResult = ptDest;
         for(; (*ptDest++ = *ptSource++); );
         //*ptDest = 0;
         return ptResult;
}
probabilmente il tuo errore era in quel *ptDest=0, non serve, lo zero lo 
hai gia' messo con il for
byez

 ha scritto nel messaggio
news:3D3BE5...@supereva.it...

Secondo me l'errore era nella delete! delete si usa solo con  la memoria
allocata dinamicamente!

 delete [] p; // <-- nota le []
purtroppo il danno e` ben maggiore: se si chiama l'operatore delete 
(senza le []) su un puntatore allocato con new[] il comportamento e` 
indefinito; puo` succedere di tutto: se gli elementi dell'array sono di 
tipo built-in (int, char, float, ecc.) e` possibile che tutti funzioni 
correttamente, ma se e` un array di tipi definiti dall'utente e` 
*estremamente* probabile che qualcosa vada storto: nei casi piu` comuni 
il distruttore degli elementi non verra` richiamato, ma se le classi 
sono un po' piu` complicate (ad esempio se ridefiniscono operator 
new/delete) non sono da escludersi comportamenti anche peggiori, come la 
corruzione della memoria, il blocco del programma o la formattazione del 
disco fisso ;-)
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 allocata dinamicamente!
infatti
char *ptDest = new char[strlen (ptSource) + 1];
delete [] ptConcat;
ciao

 il distruttore degli elementi non verra` richiamato, ma se le classi 
hai perfettamente ragione.... colpa mia
byez