Newsgroup: it.comp.lang.c++
Titolo: forse un pochino OT, ma date un'occhiata

è un problema di compilatore (almeno credo), ma ve lo pongo lo stesso.
io uso il VC++ 6.0 della Microsoft, in questo compilatore c'è l'opzione
build in debug e quella in release. Vorrei sapere perchè (se possibile)
quando faccio la build in debug mi dà i warning di variabili char* non
inizializzate (le dichiaro tutte "char* nome;" senza inizializzazione), ma
il programma funziona benissimo. Altrettanto quando faccio la build in
release con la differenza che il programma si impalla ogni volta. Ho
scoperto che se le char* le inizializzo a "" (stringa vuota) in release il
programma funziona benissimo, ma in debug mi si impalla costantemente.
ed un'altra cosa: perchè in release una istruzione come la seguente non
funziona?
int i=5;
cout<<"il valore di i è: "<<i<<endl;
l'output è:
il valore di i é:
non mi scrive "5", in debug invece tutto funziona benissimo.
Immagino che sia un problema di compilatore, ma davvero ne sto uscendo
pazzo.
Ciao e grazie per chi mi dà un suggerimento.
--
Roberto
FV
----------
robymes#
hotmail.com
ICQ# 37732681
----------
Resistance is futile

Cerchiamo di mettere da parte il problema Release-Debug che puo´ essere un
falso problema.
Puoi postare il codice che ti da´ problemi per intero?
Grazie
Mauro

"Maurus" <REMOVE...@rocketmail.com-REMOVE> ha scritto nel messaggio
news:98kqu8$nnj$1...@newstoo.ericsson.se...

ok
#include <iostream.h>
#include <fstream.h>
ifstream Dem;
char* s;
Dem.open(File);
//File è una variabile char* passata come argomento alla funzione di cui il
codice
cout<<"Caricamento DEM"<endl;
//un DEM è sostanzialmente una matrice di numeri (quote sul livello del
mare) con un
//particolare header per georeferenziarlo
//In questa funzione leggo tale DEM da un file di testo è lo memorizzo in
//un'opportuna struttura dati
if (!Dem)
{
    cout<<"Errore nell'apertura del file DEM"<<endl;
    exit(0);
}
Dem.setf(ios::skipws);
Dem>>s;
//nell'header ci deve essere una stringa "ncols" e dopo un numero (numero di
//colonne della matrice) se non c'è l'header non è valido quindi anche il
file
//s la utilizzo solo come buffer
if ((strcmp(s,"ncols"))||(!Dem))
{
    cout<<"Errore nella lettura dell'header del DEM"<<endl;
    exit(0);
}
.
.
.
//lettura del resto dell'header e delle quote nello stesso modo appena
scritto
.
.
.
Dem.close();
Allora se NON la inizializzo a "" nella dichiarazione (char*s;) in debug
funziona e in release no, se s viene inizializzata a "" nella dichiarazione
(char*s="") in debug NON funziona e in release si. E questo è un problema;
se per esempio voglio avere il codice dell'eventuale errore di lettura provo
a fare così:
Dem.setf(ios::skipws);
Dem>>s;
if ((strcmp(s,"ncols"))||(!Dem))
{
    int Comp=strcmp(s,"ncols");
    cout<<"Errore nella lettura dell'header del DEM "<<endl;
    if (Comp!=0)
    {
        cout<<"Errore nella stringa ncols: "<<Comp<<endl;
    }
    exit(0);
}
Lasciate perdere il fatto che sia quasi inutile all'atto pratico
visualizzare se s è minore o maggiore di "ncols", il fatto è che l'output in
release è il seguente:
Errore nella lettura dell'header del DEM
Errore nella stringa ncols:
Non mi viene visualizzato il valore di Comp. Ho fatto le prove in debug e
controllando il valore di Comp nella finestra watch ho un valore
significativo (-1 nel caso di prova), ma non mi viene visualizzato in
release, in debug l'output è:
Errore nella lettura dell'header del DEM
Errore nella stringa ncols: -1
Non so che dire


Ciao Roberto,
adesso e´ chiara la cosa.
Ripeto, lascia perdere il fatto di Debug/Release.
Quando si tratta di puntatori non inizializzati gli effetti indesiderati
possono essere curiosi o fatali.
Nel tuo caso si tratta appunto di puntatore non inizializzato:
char* s;
Qua dichiari un puntatore ma non si sa ancora a cosa sta puntando, ovvero
sta puntando a una posizione casuale della memoria.
Per cui quando vai ad assegnare qualcosa ad s , molto probabilmente vai a
sporcare una zona utile di memoria e sara´ un caso che il programma non ti
salta se sei nella versione Debug o Release.
Quindi....o usi string s al posto di char * s con i dovuti aggiustamenti,
senza preoccuparti di allocare memoria, oppure continui con char *s
ma...allocandogli memoria con new.
Ciao
Mauro

Dem>>s;
Devo ammettere di non aver letto con attenzione tutto il tuo codice,
ho comunque notato che s è un puntatore a char, ma in realtà non punta
a niente, o meglio punta ad una zona di memoria in cui non sai cosa ci
possa essere; infatti s può puntare ad una zona di memoria non valida
e il tuo programma si blocca; ad una zona di memoria valida ma già
usata, magari cambiando valore a qualche variabile del programma o ad
una zona di memoria non usata e quindi il tuo programma può funzionare
correttamente.
Per risolvere il problema devi fare qualcosa come:
char s[20];
Dem >> s;
a questo punto tutto dovrebbe funzionare, ma c'è un problema s ha
dimensione 20, qundi o tu sai esatamente la dimensione di ciò che
leggi e regoli la dimensione dell'array in base a questo o più
semplicemente usi std::string (#include <string>), che si espande in
base alle necessità.
Ciao
Marco Barisione (ICQ 84277092)