- Remove From My Forums
-
Question
-
HI,
I am getting an assertion in isctype.c saying for expression (unsigned) c <=256 what could be the reason
Kishore
Answers
-
It sounds like you might be passing in a value larger than 255 — this is not allowed for isctype.c.
All replies
-
It sounds like you might be passing in a value larger than 255 — this is not allowed for isctype.c.
-
Hi.
Though this call is late I just encountered the same problem again; I guess 101st times now.
As I see it, many developers seem to run into this problem and the statement that passing a value larger than 255 is not allowed for isctype.c may be correct so far but the circumstances that lead to it seem to be a problem made by Microsoft itself.
E.g. I have a mutithreaded program in debug, i.e. compiled with _DEBUG and _MT compiler switches, and I use some of the isspace, isdigit, is… CRT functions in my program. All of these functions have a signature specifying to accept an integer as only parameter and therefore I claim to use it as integer to test whatever (unicode) character to be a digit, a space or whatsoever.
Now, if I run this program testing any arabic, kyrillic, chinese character the beforementioned assertion will come up. In release the program will state a protection fault. If you take a look at the CRT implementation you will find that it is not supported for multithreading but still the CRT itself (not my program) refers it. So as a developer I have no chance to work around it (and it really should not be my task to work around it).
#if !defined (_MT) || defined (_DEBUG)
int __cdecl _chvalidator(
int c,
int mask
)
{
_ASSERTE((unsigned)(c + 1) <= 256);
return ( _pctype[c] & mask);
}Addenum:
There may be of course the possibility to use the isw… functions but I am not quite sure if these are supported in the ANSI standard — and therefore may not be available on non-Windows platform compilers.Regards
Frank-
Proposed as answer by
Wednesday, June 18, 2008 2:09 PM
-
Edited by
Frank2068
Wednesday, June 18, 2008 2:53 PM
added addenum
-
Proposed as answer by
-
Or less than -1, which is perfectly allowed for char. Try ‘я’ char(0xff).
I encountered this assertion in the development of the project some time ago. After reading a lot of information on the Internet, there is still no result. Most of the processing methods are:
Set the project -> Configuration Properties -> C / C + ± > Language -> Default Char unsigned, select Yes (/J)
This operation changes the default char type in the project to unsigned char (unsigned char), but this method does not work in the current VS2010. The current VS2010 does not have this option, and I am not sure about the default char type of the project. Whether the change will have other effects on my project, so I did not use this method.
Debugging for a long time found that my program called isspace (determine whether the character is a space), isprint (determine whether it is a printed character), isalnum (determine whether the character is a number), isdigit function, these functions in isctype.c, by viewing Isctype.c implementation source code found:
extern "C" int __cdecl _chvalidator(int const c, int const mask)
{
_ASSERTE(c >= -1 && c <= 255);
return _chvalidator_l(nullptr, c, mask);
}
extern "C" int __cdecl _chvalidator_l(_locale_t const locale, int const c, int const mask)
{
_ASSERTE(c >= -1 && c <= 255);
_LocaleUpdate locale_update(locale);
int const index = (c >= -1 && c <= 255) ? c : -1;
return locale_update.GetLocaleT()->locinfo->_public._locale_pctype[index] & mask;
}
Since my project default char is a signed type, its value range is [-128 ~ 127], when the passed characters exceed 127 (may be Chinese), then the char type value overflows to a negative number, and when called When the function is reached, the assertion _ASSERTE(c> = -1 && c <= 255) is triggered.
Solution:
When calling these functions, the argument is first forced to an unsigned char type (value range 0~255)
eg: isprint((unsigned char) c);
Sheffs 1 / 1 / 0 Регистрация: 31.05.2013 Сообщений: 14 |
||||||||||||
1 |
||||||||||||
Программа не обрабатывает кириллицу31.05.2013, 02:15. Показов 3081. Ответов 9 Метки нет (Все метки)
Всем привет. У меня такая проблема. Программа не хочет обрабатывать кириллицу. К примеру, у меня задача, подсчитать в последнем слове текста количество буквы «к». Если я ввожу текст на английском и ищу букву «k», то все нормально работает. Если же я ввожу русский текст и ищу букву «к», то программа выдает ошибку (скрин выложил ниже ).
из библиотеки
p.s. пусть вас не пугает список библиотек, я всегда добавляю всего и побольше)))
Миниатюры
0 |
26 / 26 / 17 Регистрация: 29.12.2010 Сообщений: 90 |
|
31.05.2013, 02:33 |
2 |
Какая строка в вашей программе 68я? (обратите внимание на описание ошибки) Добавлено через 6 минут
0 |
Croessmah Неэпический 17815 / 10586 / 2044 Регистрация: 27.09.2012 Сообщений: 26,627 Записей в блоге: 1 |
||||
31.05.2013, 02:36 |
3 |
|||
Либо запускайте в релизе, либо приводите к unsigned char символы при передаче си функциям:
0 |
Sheffs 1 / 1 / 0 Регистрация: 31.05.2013 Сообщений: 14 |
||||
31.05.2013, 02:39 [ТС] |
4 |
|||
Насколько я понял Code::Blocks это некая программа(возможно ошибаюсь), но этой программы, к сожалению, нету у преподавателя
0 |
Неэпический 17815 / 10586 / 2044 Регистрация: 27.09.2012 Сообщений: 26,627 Записей в блоге: 1 |
|
31.05.2013, 02:43 |
5 |
В этой программе, почему то, все прекрасно читает и обрабатывает. Здесь нет функций на подобии isspace,isdigit,isalpha и т.д., поэтому и работает.
1 |
Nikoys 26 / 26 / 17 Регистрация: 29.12.2010 Сообщений: 90 |
||||
31.05.2013, 02:50 |
6 |
|||
Эта ошибка работает внутри Visual Studio, у меня тоже сработала эта ошибка. Хотя, в принципе, под Code::Blocks работает. Добавлено через 1 минуту
Либо запускайте в релизе, либо приводите к unsigned char символы при передаче си функциям:
только хотел написать, что выбивает на isspace. Что ж, вот где собака зарыта. Буду и сам на будущее знать.
0 |
1 / 1 / 0 Регистрация: 31.05.2013 Сообщений: 14 |
|
31.05.2013, 02:52 [ТС] |
7 |
Croessmah, Благодарю. Заработало. Можно поинтересоваться, собственно, в чем волшебство? в чем была проблема?
0 |
26 / 26 / 17 Регистрация: 29.12.2010 Сообщений: 90 |
|
31.05.2013, 02:52 |
8 |
Sheffs, Code::Blocks — другое IDE для С++. Только, в отличие от Visual Studio, в основе лежит компилятор GCC.
0 |
1500 / 1146 / 165 Регистрация: 05.12.2011 Сообщений: 2,279 |
|
31.05.2013, 03:07 |
9 |
это не ошибка компилятора. это такая реализация стандартной библиотеке, в частности той функции, откуда вылетает ассерт. его туда намеренно поставили, чтобы разработчики обратили внимание на то, что их код как-то неправильно использует функцию. как такое получилось мне непонятно. нужно дебажить. проверка такая там:
0 |
Croessmah Неэпический 17815 / 10586 / 2044 Регистрация: 27.09.2012 Сообщений: 26,627 Записей в блоге: 1 |
||||||||
31.05.2013, 03:08 |
10 |
|||||||
в чем была проблема? Потому что вот что стоит в isctype.c
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
31.05.2013, 03:08 |
10 |
Форум программистов Vingrad
Модераторы: Daevaorn |
Поиск: |
|
проблема при отладке, Debug assertion Failed |
Опции темы |
aleknek |
|
||
Новичок Профиль Репутация: нет
|
Не могу нормально отладить программу! Вылетает сообщение: Debug assertion Failed Expression: (unsigned)(c+1)<=256 Смотрел файл isctype.c , не могу вычислить где ошибка ? Собственно сам код:
Это сообщение отредактировал(а) aleknek — 9.12.2007, 19:23 |
||
|
|||
JackYF |
|
||||
полуавантюрист Профиль
Репутация: 18
|
На какой строке исходного кода?
не проверяешь выход за слово. Возможно переполнение.
——————— Пожаловаться на меня как модератора можно здесь. |
||||
|
|||||
aleknek |
|
||
Новичок Профиль Репутация: нет
|
Как организовать проверку выхода за слово ? |
||
|
|||
JackYF |
|
||
полуавантюрист Профиль
Репутация: 18
|
узнать strlen’ом длину и поставить в while дополнительное условие на счётчик операций (или на разницу указателей) ——————— Пожаловаться на меня как модератора можно здесь. |
||
|
|||
zkv |
|
||
Профиль
Репутация: 26
|
судя по всему вылетает на isalnum(), локаль надо советскую поставить |
||
|
|||
Random13 |
|
||
Шустрый Профиль Репутация: нет
|
Интересно, а _tmain вместо обычного мэйн — это в какой среде пишеться в борланде что-ли ? |
||
|
|||
zkv |
|
||
Профиль
Репутация: 26
|
это TCHAR версия, ссылка |
||
|
|||
aleknek |
|
||||
Новичок Профиль Репутация: нет
|
Пишется это все в Microsoft Visual Studio 2005
Как это сделать ? |
||||
|
|||||
crazy_hand |
|
||||
Новичок Профиль
Репутация: нет
|
Для русской локали это выглядит примерно так:
смотри MSDN. |
||||
|
|||||
aleknek |
|
||||
Новичок Профиль Репутация: нет
|
А это разве не русская локаль ?? Это сообщение отредактировал(а) aleknek — 15.12.2007, 19:47 |
||||
|
|||||
baldina |
|
||||
Эксперт Профиль
Репутация: 32
|
Тут две проблемы: 1. т.к. приложение консольное, должна использоваться локаль 866. 2. int isalnum(int) — на входе целое.
понятно, что все буковки с кодом больше 127 представляются … как отрицательные! и (unsigned)(c+1) значительно больше 256. вывод — использовать unsigned char всместо char в коде либо выставить в свойствах компиляции Кстати там еще ошибка в коде — ‘ 0’, т.е. пробел между и 0 Добавлено через 1 минуту и 47 секунд Добавлено через 12 минут и 21 секунду
|
||||
|
|||||
aleknek |
|
||
Новичок Профиль Репутация: нет
|
Всем огромное спасибо, проблема решилась при подключении 866 локали и изменении свойств компиляции. |
||
|
|||
|
Правила форума «С++:Общие вопросы» | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
I am working on writing a compiler for a school project, and this assignment calls for me to print the tokens of a text file to the console window. I want to make it clear I do not want my homework done for me.
I have been working with this stupid function that iterates through the file, and concatenates a char or a c-string value (my tutor was vague on this part of his instructions…) to a string variable named «token.» I can work through the first line of the file fine, which is «main()», but when I try and access the next line I get 1 of two errors. The first is a string subscript out of range error, though I think this was because I was trying to access part of a string array that didn’t exist. The most prevalent error I am getting is a debug assertion error:
Debug Assertion Failed Final.exe
File:f:ddvctoolscrt_bldself_x86crtsrcisctype.c Expression:
(unsigned)(c+1) <= 256
I have included my function and its associated header file. Nothing is going on in main except a function call. If at all possible, could you see what I am failing to see. I realize that my code structure is poor, I won’t lie (I am in school after all). So, any comments, criticism, and suggestions are very welcome. And always,thank you for any and all time.
.CPP File (As it is now)
#include <iostream>
#include <string>
using namespace std;
void tokenWork::openFile()
{
fileName = "test.txt";
source.open(fileName);
if(!source.is_open())
{
cout << "Cannot find file " << endl;
}
}
void tokenWork::traveseLine()
{
pos = 0;
while (!source.eof())
{
getline(source,myLine);
int length = myLine.length();
letters = new char[length];
myLine.copy(letters,length);
c = letters[pos];
if (isalpha(c))
token = token + myLine[pos];
else if (isdigit(c))
token = token + letters;
else
{
cout << token << endl;
token = "";
}
if (c == '{' || c == '}' || c == '+' || c == '=' || myLine[pos] == '(' || c == ')' || c == ';')
cout << myLine[pos] << endl;
c = letters[pos++];
}
}
.h file
#ifndef H_LEX
#define H_LEX
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
class tokenWork
{
public:
std::string fileName;
std::string myLine;
std::string token;
int pos;
int length;
int c;
char *letters;
ifstream source;
void openFile();
void traveseLine();
void closeFile();
};
#endif