Newsgroup: it.comp.programmare
Titolo: int islower(int c);

Il prototipo della islower() e'
int islower(int c);
Ho controllato, verificato, ed e' proprio questo.
Un programma in c che fa uso della islower, compilato col gcc sotto
linux funziona benissimo.
Lo stesso sorgente, portato sul visual studio, compila senza warning,
ma all'atto dell'esecuzione, se l'argomento della islower e' maggiore
di 255, mi manda un assert e il programma si chiude!
E per risolvere il problema mi e' toccato andare a mettere un test se
il dato e' minore di 256 prima di ogni islower() che per fortuna erano
solo in due punti.
Ma che cavolo!
E per fortuna che mi e' comparso l'assert nel test, per via di un caso
particolare, altrimenti...


Ciao,
probabilmente passerò per chi tenta di far 
l'avvocato del diavolo ma la funzione/macro in 
oggetto dovrebbe servire per determinare se un 
carattere alfabetico è minuscolo quindi 
bisognerebbe prima capire se il carattere è 
alfabetico usando, ad esempio, "isalpha" mentre tu 
ti limiti a verificare che sia minore di 256.

 [...]
Ciao   Manlio

 
http://www.opengroup.org/onlinepubs/000095399/functions/islower.html
E' un intero perchè accetta anche EOF.
EOF viene restituito dalle funzioni dell'I/O su stream, ed è definito in 
modo che *non sia* un carattere.
Ciao   Manlio

On 4 Ott, 13:28, Manlio Perillo <manlio_perill...@SPAMlibero.it>
wrote:

Non sta facendo niente di *molto* sbagliato.
Mi arriva un xml che devo andare a parsare.
Un certo campo, per specifiche, contiene una stringa che puo' essere a
seconda dei casi
a) un numero
b) un codice ascii di un carattere
c) un carattere
Stanno ancora decidendo cosa scriverci, e io nel frattempo devo
sviluppare la procedura che legge.
Quindi prendo il dato, lo trasformo in int, e poi vado a vedere se
l'int per caso sia l'ascii di una lettera minuscola e lo passo
banalmente alla islower().
Solo che quando e' un numero piu' grosso mi esce l'assert!
Questo col compilatore di VC.
Perche' il gcc si comporta come mi aspettavo io: se l'int e' piu'
grosso di un char, non e' mai islower().
Sta di fatto che se una funzione accetta un int come argomento, non
dovrebbe cacciarmi un assert se gli passo un int che non gli piace.
Come ne esco in modo pulito?
Dite che devo fare prima un test isalpha()?
Non vorrei che pure questo generasse un assert simile.
Adesso provo...

 Adesso provo...
Niente!
Anche con isalpha() mi emette l'assert se l'argomento e' maggiore di
255.
Per adesso ho patchato scrivendo (c<0x100)&&islower(c), ma va da se'
che non mi piace.

 Adesso provo...
Leggere la documentazione no?
Ciao  Manlio

 che non mi piace.
Io nella man page leggo:
"""
The 4.4BSD extension of accepting arguments outside of the range of the 
unsigned char type in locales with large character sets is considered 
obsolete and may not be supported in future releases.  The iswlower() 
function should be used instead.
"""
puoi usare iswlower()?

 puoi usare iswlower()?
Non risolvi il problema, lo rimandi.
Innanzitutto per usare iswlower si assume tu stia usando le wide strings.
Inoltre, secondo lo standard (Commitee Draft - May 6, 2005):
For all functions described in this sublause that accept an argument of 
type wint_t, the value shall be representable as a wchar_t or shal equal 
to the value of the macroo WEOF. If this argument has any other value, 
the behaviour is undefined.
Le funzioni isxxx funzionano su stringhe, e non su numeri.
Ciao  Manlio