Thread View: pl.comp.lang.c
7 messages
7 total messages
Started by Karol Wojtiuk
Thu, 13 Nov 1997 19:46
Uwaga: blad w funkcji isdigit .
Author: Karol Wojtiuk
Date: Thu, 13 Nov 1997 19:46
Date: Thu, 13 Nov 1997 19:46
29 lines
1781 bytes
1781 bytes
Witam wszystkich funkcja isdigit jest zadeklarowana następująco: int isdigit(int c); i ma ona za zadanie sprawdzać czy dane c jest znakiem z przedzialu '0' - '9'. Nie wiem jak wyglądają implementacje w innych bibliotekach ale w dostarczanej przez Microsoft isdigit operuje na tablicy _ctype[257]. Jak widać z rozmiaru tablicy można sprawdzić tylko 257 wartości i jeżeli zmienna c przyjmie wartość ujemną (co może być bardzo częste gdy używamy jako parametru wartości typu char ze znakiem) lub przyjmie wartość powyżej 256 to program nam się wywala. Rozumiem, że ze względu na dużą szybkość przyjęto taki sposób implementacji ale po pierwsze należało sporządzić inną deklarację funkcji (parametr typu int mówi wyraźnie, że możemy używać wartości parametru w o wiele większym zakresie niż tylko od 0 do 256) i po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko wartości od 0 do 256. Co o tym sądzicie? A może ja jestem w błędzie? Czy zauważyliście inne kwiatki? Pozdrowienia Karol Wojtiuk PS. Powyższe prawdopodobnie tyczy się wszystkich funkcji is..., ale jeszcze tego nie sprawdzałem.
Re: Uwaga: blad w funkcji isdigit .
Author: Jacek Czerwinski
Date: Fri, 14 Nov 1997 06:17
Date: Fri, 14 Nov 1997 06:17
37 lines
2187 bytes
2187 bytes
Karol Wojtiuk wrote: Chyba masz racje, w borlandzie o ile pamietam jest najpierw filtrowana na zakres, a moze tylko w wersji z mocniejszym deguggiem ? Moze nie w borlandzie, ale gdzies widzialem .... Albo makra, ktore pomyslane sa dla liczb dodatnich, a daje ktos znak > 128, a znak jest signed ... > > Witam wszystkich > funkcja isdigit jest zadeklarowana następująco: > int isdigit(int c); > i ma ona za zadanie sprawdzać czy dane c jest znakiem z przedzialu '0' - > '9'. > Nie wiem jak wyglądają implementacje w innych bibliotekach ale w > dostarczanej > przez Microsoft isdigit operuje na tablicy _ctype[257]. Jak widać z rozmiaru > tablicy > można sprawdzić tylko 257 wartości i jeżeli zmienna c przyjmie wartość > ujemną (co > może być bardzo częste gdy używamy jako parametru wartości typu char ze > znakiem) > lub przyjmie wartość powyżej 256 to program nam się wywala. > Rozumiem, że ze względu na dużą szybkość przyjęto taki sposób implementacji > ale > po pierwsze należało sporządzić inną deklarację funkcji (parametr typu int > mówi wyraźnie, > że możemy używać wartości parametru w o wiele większym zakresie niż tylko od > 0 do 256) i > po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko > wartości od 0 do 256. > Co o tym sądzicie? > A może ja jestem w błędzie? > Czy zauważyliście inne kwiatki? > Pozdrowienia > Karol Wojtiuk > PS. Powyższe prawdopodobnie tyczy się wszystkich funkcji is..., ale jeszcze > tego nie sprawdzałem.
Re: Uwaga: blad w funkcji isdigit .
Author: Marek Kotowski
Date: Fri, 14 Nov 1997 09:05
Date: Fri, 14 Nov 1997 09:05
22 lines
1392 bytes
1392 bytes
Karol Wojtiuk wrote: > funkcja isdigit jest zadeklarowana nastêpuj±co: > int isdigit(int c); [...] > po pierwsze nale¿a³o sporz±dziæ inn± deklaracjê funkcji (parametr typu int > mówi wyra¼nie, > ¿e mo¿emy u¿ywaæ warto¶ci parametru w o wiele wiêkszym zakresie ni¿ tylko od > 0 do 256) i > po drugie mo¿na by³o zaznaczyæ w opisie funkcji, ¿e akceptuje ona tylko > warto¶ci od 0 do 256. > Co o tym s±dzicie? Zgodnie z "Rationale" funkcja (makro) isdigit oraz inne standardowe funkcje zadeklarowane w ctype.h maja jako argument int po to, by oprocz malych wartosci znakowych (unsigned char) moc obsluzyc takze znak EOF, ktory tradycyjnie ma wartosc -1 lub inna ujemna. Z tej samej przyczyny takie funkcje jak getchar zwracaja nie char ale int. Zatem bledu w isdigit nie ma. Marek Kotowski
Re: Uwaga: blad w funkcji isdigit .
Author: Karol Wojtiuk
Date: Fri, 14 Nov 1997 10:25
Date: Fri, 14 Nov 1997 10:25
51 lines
2616 bytes
2616 bytes
Marek Kotowski wrote in message <346C146D.4F69@imm.org.pl>...
>Karol Wojtiuk wrote:
>
>> funkcja isdigit jest zadeklarowana następująco:
>> int isdigit(int c);
>[...]
>> po pierwsze należało sporządzić inną deklarację funkcji (parametr typu
int
>> mówi wyraźnie,
>> że możemy używać wartości parametru w o wiele większym zakresie niż tylko
od
>> 0 do 256) i
>> po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko
>> wartości od 0 do 256.
>> Co o tym sądzicie?
>
> Zgodnie z "Rationale" funkcja (makro) isdigit oraz inne standardowe
>funkcje
>zadeklarowane w ctype.h maja jako argument int po to, by oprocz malych
>wartosci znakowych (unsigned char) moc obsluzyc takze znak EOF, ktory
>tradycyjnie ma wartosc -1 lub inna ujemna. Z tej samej przyczyny takie
>funkcje jak getchar zwracaja nie char ale int. Zatem bledu w isdigit nie
>ma.
>
> Marek Kotowski
Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach
bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach od -1
do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z
zakresu int. Dodatkowo trzeba zaznaczyc, ze powoduje to trudno wykrywalny
blad jezeli operuje sie na wartosciach signed char (po prostu nie
przypuszczasz ze wywali ci program na znaku funta angielskiego). Dodatkowo
jako dowod moze tu posluzyc koncowka implementacji tablicy _ctype z pliku
ctype.c:
...
_PUNCT, /* 7E ~ */
_CONTROL, /* 7F (DEL) */
/* and the rest are 0... */
};
Chodzi mi o zdanie "and the rest are 0", ktore jest nieprawda.
Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji bibliotecznych
Microsoft.
Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane, ze
operuja one
tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta prozno
szukac.
Pozdrowienia
Karol Wojtiuk
Re: Uwaga: blad w funkcji isdigit .
Author: Marek Kotowski
Date: Fri, 14 Nov 1997 15:40
Date: Fri, 14 Nov 1997 15:40
46 lines
2567 bytes
2567 bytes
Karol Wojtiuk wrote: > Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach > bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach od -1 > do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z > zakresu int. Calkowite nieporozumienie. Wartosci znakow nigdy nie beda zaznaczone, albowiem standard nie mowi nic o wartosciach kodow. Nawet wartosc EOF jakkolwiek tradycyjnie ujemna, formalnie moze byc takze dodatnia. Definicja isdigit mowi tylko, ze zwraca ona wartosc rozna od zera, jesli dany znak (konwertowany do int) jest '0' - '9' oraz wartosc rowna zeru w przeciwnym wypadku. To, jakie sa wartosci kodow znakow '0'-'9', to sprawa zupelnie inna i zalezna calkowicie od implementacji. Wszystko. > Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji bibliotecznych > Microsoft. Niewykluczone, ze implementacja isdigit jest bledna, chociaz prawde rzeklszy musialbym sam zobaczyc, by uwierzyc. Napisalem duzo kodu z wykorzystaniem isdigit, i w BC, i w MSC, i w GNU, i nigdy z ta funkcja nie bylo problemu. > Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane, ze > operuja one > tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta prozno > szukac. I bardzo dobrze. Funkcja isdigit jest funkcja standardowa. A w standardzie nie ma nic o kodzie ASCII, ani np. EBCDIC. Powiem nawet wiecej: zgodnie ze standardem znak moze byc kodowany takze na wiekszej liczbie bitow, 9, 12, czy 16. I jeszcze jedno: dzialanie funkcji isdigit moze byc uzaleznione od biezacej wersji jezykowej, ustawianej za pomoca standardowej funkcji setlocale. Z tego, co Pan napisal, mogloby wynikac, ze w UNIX SVR4 jest to niedopuszczalne (wersje jezykowe inne niz "amerykanski" angielski wymagaja wiecej niz 7 bitow na znak. Tym samym w UNIX SVR4 (kompilator?) takich wersji nie mozna by deklarowac. Z powazaniem Marek Kotowski
Re: Uwaga: blad w funkcji isdigit .
Author: Karol Wojtiuk
Date: Fri, 14 Nov 1997 16:12
Date: Fri, 14 Nov 1997 16:12
71 lines
3566 bytes
3566 bytes
Marek Kotowski wrote in message <346C70EB.6EE9@imm.org.pl>... >Karol Wojtiuk wrote: >> Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach >> bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach od -1 >> do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z >> zakresu int. > > Calkowite nieporozumienie. Wartosci znakow nigdy nie beda zaznaczone, >albowiem standard nie mowi nic o wartosciach kodow. Nawet wartosc EOF >jakkolwiek tradycyjnie ujemna, formalnie moze byc takze dodatnia. >Definicja isdigit mowi tylko, ze zwraca ona wartosc rozna od zera, >jesli dany znak (konwertowany do int) jest '0' - '9' oraz wartosc >rowna zeru w przeciwnym wypadku. To, jakie sa wartosci kodow znakow >'0'-'9', to sprawa zupelnie inna i zalezna calkowicie od implementacji. >Wszystko. > Zgadzam sie ze jest to nieporozumienie ale ze strony implementujacego funkcje isdigit. Jak widac z powyzszego podajac jako argument wartosc 258 lub -2 powinienem otrzymac zero, a otrzymuje wywalenie programu. >> Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji bibliotecznych >> Microsoft. > >Niewykluczone, ze implementacja isdigit jest bledna, chociaz prawde >rzeklszy >musialbym sam zobaczyc, by uwierzyc. Napisalem duzo kodu z >wykorzystaniem >isdigit, i w BC, i w MSC, i w GNU, i nigdy z ta funkcja nie bylo >problemu. > >> Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane, ze >> operuja one >> tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta prozno >> szukac. > >I bardzo dobrze. Funkcja isdigit jest funkcja standardowa. A w >standardzie >nie ma nic o kodzie ASCII, ani np. EBCDIC. Powiem nawet wiecej: zgodnie >ze >standardem znak moze byc kodowany takze na wiekszej liczbie bitow, 9, >12, czy 16. > I jeszcze jedno: dzialanie funkcji isdigit moze byc uzaleznione od >biezacej wersji jezykowej, ustawianej za pomoca standardowej funkcji >setlocale. Z tego, co Pan napisal, mogloby wynikac, ze w UNIX SVR4 >jest to niedopuszczalne (wersje jezykowe inne niz "amerykanski" >angielski >wymagaja wiecej niz 7 bitow na znak. Tym samym w UNIX SVR4 (kompilator?) >takich wersji nie mozna by deklarowac. > Napisalem tylko skrotowo, bo chodzilo mi o blad gdy setlocale jest ustawione na wersje "amerykanska". Prawdopodobnie tak u Microsofta jak i w UNIX SVR4 (chodzi tu zapewne o opis bibliotek standardowych tego systemu - sorry ale sie nie znam) gdy wlaczymy wersje "polska" to wtedy jest wykonywany dla isdigit zupelnie inny kod (to samo sie tyczy i innych funkcji is...). Co za tym idzie nie jest tez generowany blad przy przekroczeniu powyzszego zakresu poniewaz wtedy funkcja ta nie operuje juz na statycznej tablicy. > Z powazaniem > Marek Kotowski Takze z powazaniem Karol Wojtiuk
Re: Uwaga: blad w funkcji isdigit .
Author: Qrczak
Date: Sat, 15 Nov 1997 13:14
Date: Sat, 15 Nov 1997 13:14
47 lines
2310 bytes
2310 bytes
On Thu, 13 Nov 1997, Karol Wojtiuk wrote:
> funkcja isdigit jest zadeklarowana następująco:
[...]
W Linuxowym GCC:
ISALPHA(3) Linux Programmer's Manual ISALPHA(3)
NAME
isalnum, isalpha, isascii, isblank, iscntrl, isdigit,
isgraph, islower, isprint, ispunct, isspace, isupper,
isxdigit - character classification routines
[...]
DESCRIPTION
These functions check whether c, which must have the value
of an unsigned char or EOF, falls into a certain character
class according to the current locale.
[...]
CONFORMING TO
ANSI - C, BSD 4.3. isascii() is a BSD extension and is
also an SVID extension. isblank() is a GNU extension.
Tak więc tutaj jest jasno określone, że znaki przyjmować wartości 0..255
albo EOF.
W pliku include/ctype.h można przeczytać:
/* These are defined in ctype-info.c.
The declarations here must match those in localeinfo.h.
These point into arrays of 384, so they can be indexed by any `unsigned
char' value [0,255]; by EOF (-1); or by any `signed char' value
[-128,-1). ANSI requires that the ctype functions work for `unsigned
char' values and for EOF; we also support negative `signed char' values
for broken old programs. The case conversion arrays are of `int's
rather than `unsigned char's because tolower (EOF) must be EOF, which
doesn't fit into an `unsigned char'. */
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://kki.net.pl/qrczak/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads