Newsgroup: it.comp.lang.c++
Titolo: Un aiuto per poche righe di codice.

Potete dirmi se in queste poche righe di codicea c'e'
qualcosa che non va?
Se evito di togliere gli spazi in coda a
Anagrafica.Professione funziona, altrimenti no.
Le varie Anagrafica sono tutte string. 
In pratica leggo un .dbf e lo importo in una tabella Postgres.
Le dichiarazioni di variabili e funzioni ci sono tutte, praticamente
se tolgo gli spazi in coda a Anagrafica.Professione la variabile
InsQryBuf si sporca aggiungendo una lettera "Q" che non capisco da 
dove proviene, se invece non tolgo gli spazi in coda a 
Anagrafica.Professione tutto funziona.
Scusate se la richiesta e' un po' pretenziosa.
Anagrafica.Qualifica = stringa.substr(301,1);
Anagrafica.Professione = stringa.substr(306,50);
Anagrafica.Area = stringa.substr(356,2);
Anagrafica.Divisione = stringa.substr(358,2);
Anagrafica.Ufficio = stringa.substr(360,2);
Anagrafica.Subufficio = stringa.substr(362,1);
/* sostituisco l'apice con il doppio apice */
int cognomedove = Anagrafica.Cognome.find('\'');
if (cognomedove >= 0)
  Anagrafica.Cognome.replace(cognomedove,1,"''");
int nomedove  = Anagrafica.Nome.find('\'');
if (nomedove >= 0)
  Anagrafica.Nome.replace(nomedove,1,"''");
int professionedove  = Anagrafica.Professione.find('\'');
if (professionedove >= 0)
   Anagrafica.Professione.replace(professionedove,1,"''");
/* tolgo gli spazi in coda */
 
// trova l'indice dell'ultimo non spazio della stringa
int ultimo_valido_cognome = Anagrafica.Cognome.find_last_not_of(' ');
// modifica la stringa di conseguenza
if (ultimo_valido_cognome < 0) // sono tutti spazi
   Anagrafica.Cognome="";
else  // cancella
   Anagrafica.Cognome.erase(ultimo_valido_cognome + 1);
int ultimo_valido_nome = Anagrafica.Nome.find_last_not_of(' ');
// modifica la stringa di conseguenza
if (ultimo_valido_nome < 0) // sono tutti spazi
   Anagrafica.Nome="";
else  // cancella
   Anagrafica.Nome.erase(ultimo_valido_nome + 1);
int ultimo_valido_prof = Anagrafica.Professione.find_last_not_of(' ');
// modifica la stringa di conseguenza
if (ultimo_valido_prof < 0) // sono tutti spazi
  Anagrafica.Professione="";
else  // cancella
  Anagrafica.Professione.erase(ultimo_valido_prof + 1);
InsQryBufStream << "INSERT INTO " << Table << " VALUES(\'" << Anagrafica
.Codice << "\',\'" << Anagrafica.Cognome << "\',\'" << Anagrafica.Nome 
<< "\',\'" << Anagrafica.Qualifica << "\',\'" << Anagrafica.Professione
<< "\',\'" << Anagrafica.Area << "\',\'" << Anagrafica.Divisione
<< "\',\'" << Anagrafica.Ufficio << "\',\'" << Anagrafica.Subufficio
<< "\')" << ends;
char *InsQryBuf = InsQryBufStream.str();
InsQryBufStream.seekp(0);
//delete InsQryBufStream.str();
res = PQexec(conn, InsQryBuf);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
  fprintf(stderr,"Query  failed1!");
  fprintf(stderr,"%s",PQerrorMessage(conn));
  PQclear(res);
  exit_nicely(conn);
}
 
-- 
per rispondere togli <toglimi> dall'indirizzo di posta. 

 else  // cancella
con
else if(ultimo_valido_prof+1 < Anagrafica.Professione.size())
e vedi un po' se per caso le cose non migliorano...
Alex

 di tipo out_of_range, ma forse il tuo compilatore non ha
Giacchè sospettavo quel quel erase(), potenzialmente out-of-range, potesse
essere la causa del problema di Mauro, ho fatto un paio di test (prima di
andare a vedermi l'implementazione), è ho scoperto che:
     string a("0123");
     a.erase(4);  // tutto ok, ma 4 è fuori dalla stringa  
     a.erase(5);  // eccezione! 
In effetti nell'implementaziona di replace() (invocato da erase())  
(egcs-2.90.29), c'è un
	OUTOFRANGE (pos > len);
che non innesca l'eccezione (o l'assert) se pos == len.
Max


 di tipo out_of_range, ma forse il tuo compilatore non ha
Giacchč sospettavo quel quel erase(), potenzialmente out-of-range, potesse
essere la causa del problema di Mauro, ho fatto un paio di test (prima di
andare a vedermi l'implementazione), č ho scoperto che:
     string a("0123");
     a.erase(4);  // tutto ok, ma 4 č fuori dalla stringa
     a.erase(5);  // eccezione!
Giusto, l'eccezione deve venire solo quando l'indice iniziale e`
SUPERIORE alla lunghezza della stringa (non eguale).  Un
indice eguale alla lunghezza della stringa e` il normale modo
di esprimere "non cancellare nulla".
Alex

 
Ok. Beh, era il suggerimento che avevi dato a Mauro, ovvero:
 else if(ultimo_valido_prof+1 < Anagrafica.Professione.size()) 
che mi aveva convinto che 
   erase( size() );
fosse "illegale". Visto che l'istruzione incriminata era
  erase( ultimo_valido_prof+1 );
e non può verificarsi che 
 ultimo_valido_prof >= size();
il tuo suggerimento mi sembrava servisse ad affrontare il caso in cui
  ultimo_valido_prof == size() - 1;
Max

 di esprimere "non cancellare nulla".
Ma c'è un motivo particolare? A occhio, avrei pensato a un bug di
implementazione della libreria.
Ciao
-----
Giovanni Bajo
Lead Programmer
Prograph Research S.r.l.
http://www.prograph.it

 implementazione della libreria.
Ok, la prossima volta prima penso e poi scrivo. Ve lo giuro!!! :)


 wrote in message news:Pine.LNX.4.10.100010...@c64.comm2000.it...
    [snip]
fosse "illegale". Visto che l'istruzione incriminata era
  erase( ultimo_valido_prof+1 );
e non può verificarsi che
 ultimo_valido_prof >= size();
il tuo suggerimento mi sembrava servisse ad affrontare il caso in cui
  ultimo_valido_prof == size() - 1;
Sto solo cercando di supportare qualcuno che potrebbe avere
incontrato un bug nella implementazione che usa delle librerie
standard; visto che i bug tendono a concentrarsi nei casi-limite,
potrebbe cercare di evitarli, cioe` non chiamare l.erase(x) con
x==l.size(), che, tanto, e` una no-op (ma forse sta causando
dei problemi alla implementazione delle librerie che lui usa...).
Alex

Alex
