Koodaan ohjelmaa jonka tulisi osata muuttaa kirjaimet pieniksi. Yritän käyttää seuraavaa funktiota:
char pieneksi( char c )
{
switch ( c ) {
case 'å':
case 'Å':
return 'å';
case 'ä':
case 'Ä':
return 'ä';
case 'ö':
case 'Ö':
return 'ö';
default:
return tolower( c );
}
}
saan g :lta seuraavanlaisia varoituksia:
warning: multi-character character constant
warning: overflow in implicit constant conversion
mikä vikana?
char pieneksi( char c )
{
switch ( c ) {
case 'å':
case 'Å':
return 'å';
case 'ä':
case 'Ä':
return 'ä';
case 'ö':
case 'Ö':
return 'ö';
default:
return tolower( c );
}
}
saan g :lta seuraavanlaisia varoituksia:
warning: multi-character character constant
warning: overflow in implicit constant conversion
mikä vikana?
Vastaukset 10
Vanhimmat
tolower-funktio ottaa parametriksi int-tyypin ja palauttaa sellaisen. Tee omasta funktiostasi samanlainen.
tolower toimii kyllä näinkin, vain noissa erityistapauksissa (äåö) tulee warningia
Epäilen että käytät editoria jonka asetuksissa määritetty että se tuottaa utf-8 koodia jossa yli 7-bittiset ASCII merkit esitetään useammlla tavulla. Switchin parametrina on kuitenkin char joten ristiriita on valmis.
Vaihda koodaukseksi ISO-8859-1 niin varoitukset katoavat.
Eihöhän onnistu makrolla helpommin (ja nopeammin) näin:
#define TO_LOWER(c) c|0x20
(Voit tietysti muuttaa sen funktioksi.)
Tuohan on juuri mitä tolower() tekee paitsi että se myös tarkistaa onko annettu parametri 7-bittisen ASCII:n kirjain. Siis EI toimi öökkösillä.
Onkelmahan on tietysti ettei toi makro tarkista mitään, vaan muuttaa esim. merkin '[' merkiksi '{' jne., mikä tuskin on toivottavaan. Eli pitäisi ensin tarkistaa että merkki on kirjain. Ja kun katsotaan ISO 8859-15 merkistöä
http://fi.wikipedia.org/wiki/ISO_8859-15 niin joku tommoinen (ehkä) toimii. (muuttaa myös ei skandeja):
char to_lower(char c)
{
if ( c == '×') // välissä ei kirjain
return c;
if ((('A' >= c)&&(c = c)&&(c
Ongelma on Microsoftin käyttämät epämääräiset Extended-ASCII merkistöt joissa scandit on missä sattuu.
Esim Windowsilla 'Å'=10001111, 'å'=10000110, 'Ä'=10001110 ja 'ä'=10000100 joten case-muunnos ei onnistu 1 bitin maskauksella ja eikä useammallakaan bitillä muuten kuin tapauskohtaisesti.
- Microsoftilla ei ole tekemistä asian kanssa.
http://www.personal-computer-tutor.com/extended.htm
Eivätkä ne ole 'epämääräisiä muutoihn kuin, että amerikkalaisille ei ollut muuta maailmaa.
>Eivätkä ne ole 'epämääräisiä ...
Eivät vai? Miksi DOS:in ja Windowsin extended koodit ovat TÄYSIN erilaisia? :)
http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ext-pc.htm
Ja Macissa vielä erilaisempia:
http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ext-mac.htm
Ei olis pitänyt antaa Bill Gatesille tietsikkaa sotkettavaksi.