Newsgroup: it.comp.lang.c++
Titolo: Attenzione a showmanyc() del BCC 5.5

Come da oggetto, attenzione allo showmanyc() di default
(quello definito in streambuf) del compilatore BCC 5.5
(e di conseguenza ad in_avail()).
Ecco cosa è capace di fare:
template<class charT, class traits>
streamsize basic_streambuf<charT, traits>::showmanyc()
{
    if(gptr())
        if(pptr() > egptr()) setg(eback(), gptr(), pptr());
    else
        if(pptr()) setg(pbase(), pbase(), pptr());
    return (streamsize)(egptr() - gptr());
}
Ma che roba è???
Come fa a mischiare i puntatori della get e put area??
Mi sono accorto di questa cosa perchè in un mio streambuf (conbuf)
ho usato due buffer distinti per l'input e l'output
(in quanto scorrelati).
Ogni volta che usavo in_avail ed il buffer di input era esaurito
mi dave risultati facilmente immaginabili °~*.
Ho risolto facilmente la cosa facendo l'override di showmanyc in
conbuf (e facendogli restituire 0, come peraltro dice lo Standard);
MA ho perso più di mezza giornata a capire dove era l'errore *~*.
Borland C++ 5.5, se lo conosci lo eviti;
se lo conosci, non ti uccide.
Saluti   Manlio Perillo

 se lo conosci, non ti uccide.
L'aggiornamento alla 5.5.1 l'hai fatto? Se si, è cambiato niente
riguardo a questo problema?
EMG

 ha scritto nel
messaggio news:39DC83C3...@flashnet.it...

Sul sito della Borland non c'è nessun riferimento alla versione 5.5.1.
Comunque ho installato il service-pack 2.
Manlio Perillo

 Comunque ho installato il service-pack 2.
Ma scrivendo solo BCC32 ti scrive, all'inizio (usa il tasto PAUSA per
bloccare lo scorrimento), versione 5.5.1?
EMG

 ha scritto nel
messaggio news:39DCB92E...@flashnet.it...

Si, lo scrive.
(Non me ne ero mai accorto).
Comunque riguardo a showmanyc non credo sia un vero č prorpio bug
ma una scelta di design della Rogue Wave.
Quello che non capisco sono le motivazioni che li hanno spinti
a fare una cosa del genere!
Inoltre, ripeto, mi sembra non sia Standard - compliant.
Manlio Perillo

 Inoltre, ripeto, mi sembra non sia Standard - compliant.
E allora è un bug, no? A meno che il loro scopo fosse di scrivere una
libreria C++ non-standard, il che sarebbe assurdo.
EMG

 ha scritto nel
messaggio news:39DDEF86...@flashnet.it...

Mah, non so proprio cosa pensare.
Mi chiedo anche se la Borland abbia programmatori C++ 'veri' per fare i
test.
Io ho trovato molti bugs nella libreria.
Manlio Perillo

dunque, ho appena guardato sull'MSDN del visual c++, e dice, al riguardo di
showmanyc:
The protected virtual member function returns a count of the number of
characters that can be extracted from the input stream without the program
experiencing an indefinite wait. The default behavior is to return zero.
cioč restituisce il numero di caratteri che possono essere estratti
dall'input stream senza avere un'attesa indefinita (e dice che di default
deve restituire 0).
Perň se fai una differenza tra il puntatore dell'input-stream e il puntatore
dell'output stream, effettivamente dovresti avere proprio il numero di
caratteri estraibili senza attesa.
-- 
Posted from [213.82.54.99] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 caratteri estraibili senza attesa.
showmanyc() viene chiamata da inavail() quando la get area non
esiste o e' vuota, quindi e' inutile che tenti di fare la differenza
fra i puntatori.
Le funzioni di basic_streambuf<C,T> per i caratteri disponibili
in lettura sono:
streamsize inavail()     [public, non-virtual]
  restituisce il numero di caratteri disponibili, cioe'
  se la get area esiste e non e' vuota restituisce egptr()-gptr(),
  altrimenti chiama showmayc() e restituisce il risultato della
  chiamata.
int showmanyc()          [protected, virtual]
 
  restituisce una stima del numero di caratteri che e' possibile
  leggere (possono esserci piu' caratteri di quelli indicati da 
  showmanic(), ma non di meno).
  Il numero di carattatteri restituito da showmanyc() puo' essere
  reso disponibile da una o piu' chiamate a underflow()/uflow().
  basic_streambuf<C,T>::showmanyc() restituisce sempre 0.
  (Quindi l'implementazione di Rogue Wave e' sbagliata.)
 
  Le classi derivate possono ridefinire showmanic() per restituire
  una stima migliore (per esempio basandosi sulla lunghezza del file).
	Mauro



In base a quale criterio? Non riesco a capire.
Comunque nel mio conbuf ho due array, uno per la get area e l'altro per
la put area, cosa che credo lo Standard non vieta).
Non si possono confrontare puntatori che non appartengano allo stesso
array.
Manlio Perillo

 [CUT]
Quindi se derivo un mio streambuf non devo fare l'override
di tutti i metodi virtuali, vero?
Purtroppo il BCC 5.5 e la sua libreria bacata mi stanno
facendo venire molti dubbi.
Manlio Perillo

 array.
non in questa condizione, probabilmente.


Manlio Perillo

 a quello che ho sentito).
A neanche ai suoi, credimi. :-)
EMG

alt, alt, alt...
non ho detto da nessuna parte che quello che ha fatto la RogueWave sia
giusto e/o conforme agli standard. Anzi, leggendo e investigando un po',
sono senz'altro d'accordo con te sul fatto che implementando una propria
classe derivata da questa streambuf si č legati ai dettagli implementativi
di questa (cosa sbagliata).
Stavo solo provando a dare una risposta ad una domanda del genere: "perchč
l'hanno fatto?" e non a "perchč l'hanno fatto _cosě_?".


 l'hanno fatto?" e non a "perchč l'hanno fatto _cosě_?".
In effetti č la domanda che mi sto ponendo anche io
(e ci sono anche altri punti in cui la libreria della
Rogue Wave fa cose strane :-).
Manlio Perillo

per capire perchè il mio programma non funziona).
A quello che ho capito lo standard descrive esplicitamente cosa
deve fare la versione base di showmanyc() e quanto pare la
RogueWave "ha toppato".
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 Rogue Wave fa cose strane :-).
quali x esempio? sgrunt... mamma Borland mi sta perdendo colpi ultimamente,
ed io che ne avevo una fiducia pressochč cieca :-((