Newsgroup: it.comp.lang.c++
Titolo: Stringhe STL

Non sono sicuro, ma credo che le stringhe STL tronchino a 480 caratteri, di
piů non ne accettano...se č cosě, come si puň ovviare al problema di dover
gestire una stringa maggiore di 480 caratteri?
grazie e ciao
Gazza

 gestire una stringa maggiore di 480 caratteri?
La classe std::string della Standard Library ha un metodo "size_type
max_size() const" che restiruisce la lunghezza massima cui la string
puo' arrivare.  Non ho lo Standard sotto mano, ma mi stupirebbe assai
che non fossero garantite strings piu' lunghe di 480 caratteri...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 caratteri, di più non ne accettano...
Assumo che con "stringhe STL" tu intenda std::string.
Potresti spiegare quale genere di prove o quali manuali ti hanno portato a
ipotizzare l'esistenza di una siffatta limitazione?
Puoi mostrare il più piccolo frammento di codice che documenti
l'immpossibilità, con la piattaforma, il compilatore e la libreria che
usi, di manipolare stringhe più lunghe di 480 caratteri?
Max

 ha scritto nel messaggio
news:Pine.LNX.4.10.102060...@c64.comm2000.it...

Perbacco, eccoti tutto :
1 - Il codice è di questo tipo:
    Chiamo la funzione Func( string, string, vector<string> ) passandogli
una stringa normale come primo parametro, una stringa che rappresentra
un'espressione regolare del Perl(utilizzo la classe regex delle boosts) e
per ultimo un vettore che conterrà i risultati estrapolati dalla prima
stringa seguente l'espressione della seconda stringa. La funzione Func al
suo interno esegue alcune operazioni per poi chiamare le funzioni necessarie
della classe regex( delle boosts).
2 - I manuali che utilizzo per capire come funziona il tutto sono, oltre che
quelli per il Perl (ma non credo che ti interessino) sono, semplicemente,
l'MSDN.
3 - Il codice è menzionato nel passo 1, ma spiegherò meglio il problema più
in basso.
    Per quanto riguarda le librerie utlizzo oltre che le boosts le standard
cel C++ e delle STL, il tutto utilizzando il Microsoft Visual C++ 6.
4 - Il problema...passo come secondo parametro della Func una espressione
regolare lunga più di 550 caratteri,, entro nella funzione e questa stringa
è lunga 480 caratteri...mi succede con due chiamate diverse.
Premetto che il tutto funziona perfettamente tranne che in questi due casi.
Premetto in oltre che il max_size (seguendo il consiglio di Maurizio Loreti)
è ben oltre i 4 miliardi.
A questo punto mi viene in mente solo un problema di passaggio di parametri,
ma non capisco quale possa essere.
Sperando che la spiegazione sia più esaustiva della precedente aspetto con
impazienza un qualsiasi aiuto.
bye
Gazza

 Gazza
Il problema dovrebbe essere nel passaggio dei parametri string, che vanno
sullo stack.
Puo' darsi che lo stack sia dimensionato per default in modo da non superare
un certo limite.
Invece che passare i parametri string per valore, prova a modificare il
prototipo della tua funzione in modo tale
che il passaggio sia fatto per riferimento:
void Func( string &, string &, vector<string> )
Maurus

 ha scritto nel messaggio
news:adic45$114tmm$1...@ID-125555.news.dfncis.de...

Ho provato, ma non serve, basta che dichiari std::string pippo("...."); che
pippo è già fissata a 480 caratteri, mentre la stringa che gli passo va ben
oltre;
Mai successo nulla di simile?
Gazza

 diverse.
Hai tenuto in considerazione il fatto che i backlash nei letterali stringa
in C/C++ hanno un significato speciale? Ad esempio, se inizialziamo un
std::string con un letterale di questo tipo:
  std::string regexp( "\n\t+" );
otteniamo una stringa di lunghezza 3, non 5.
Sarei portato a sospettare che la regexp che tu passi contenga alcune
sequenze speciali (come '\n', '\f', etc), le quali in realtà rappresentano
singoli caratteri, non coppie di caratteri.
Max


ha scritto nel messaggio news:ZI2L8.42$vq5....@nreader1.kpnqwest.net...

Ok, risolto, la stringa va bene a quella lunghezza... :-( anche se non
funziona, ma questo è un altro problema
ciao e scusate per il disturbo.
gazza

 ha scritto nel messaggio
news:Pine.LNX.4.10.102060...@c64.comm2000.it...

Infatti, era quello il problema...mi era già sorto in precedenza, ma avevo
già postato il messaggio, anche perchè mi capitava in due punti con due
stringhe di lunghezza diversa che però venivano accorciate a 480 ed erano le
uniche due stringhe che mi davano problemi....allora, la coincidenza mi ha
distolto dal reale problema che era un altro.
comunque grazie per le risposte
ciao
Gazza

gestire una stringa maggiore di 480 caratteri?
Fai bene a non esserne sicuro, in quanto le basic_string della STL non
hanno alcuna limitazione a 480 caratteri, anzi, uno degli scopi per i
quali sono state progettate e quello di poter gestire delle stringhe
senza doversi preoccupare di dover porre dei loro limiti, anche se
come ti hanno già detto in realtà basic_string ha una funzione membro
max_size() che normalmente però ha valori troppo alti( nell'ordine dei
miliardi) per potersi preoccupare del suo valore.
Non é escluso però che in casi di forti limitazioni di memoria
disponibile il limite possa diventare molto basso, ma in questo caso
basterebbe visualizzare il valore di ritorno di max_size() per
potersene accorgere.
Ultima considerazione: non ho prove certe, e dovrei consultare meglio
i testi che ho a disposizione, ma dubito altamente che in caso di
sforamento dei limiti massimi il comportamento sia quello di far
passare tutto sotto silenzio tagliando semplicemente la stringa, in
questo caso é molto più naturale che venga lanciata un'eccezione
length_error() proprio come viene fatto quando si eccedono i limiti su
una chiamata a reserve. Esempio
std::string a;
a.reserve(a.max_size()+1);	//genera length_error
Il Ghenio
---------
// TODO: Place your ass here