Ничего не понимаю.. есть такие строчки
CString m_sT1Boards = "2";
int Boards = atoi (m_sT1Boards);
на второй строчке приложение крашится напрочь и просто вылетает. Никаких ошибок не выдает.. как только я вместо 2 ставлю 0 допустим, то все нормально
Апликация запускается на NT. На всех других работает нормально
atoi crashes the application
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 7728
- Joined: 10 Jan 1999 10:01
- Location: OH->TX->MI->MA->VA->FL->...
uniqueman, наблюдая Вашу активность здесь, разрешите Вас спросить, Вы когда нибудь пользовались Google Groups http://www.google.com/grphp в поисках ответов на Ваши вопросы?
Мне кажется что это было бы гораздо эффективней, да и встретили бы массу интересного для себя.
Для начала Вы бы обратили внимание на определение функции atoi()? Это функция из стандартного C, и ее аргумент ессно не может быть MFC объектом (С++)!
Ну а дальше - GOOGLE RULEZZZZZZ! :
http://groups.google.com/groups?hl=ru&l ... .com#link1
http://groups.google.com/groups?hl=ru&l ... .net#link1
Мне кажется что это было бы гораздо эффективней, да и встретили бы массу интересного для себя.
Для начала Вы бы обратили внимание на определение функции atoi()? Это функция из стандартного C, и ее аргумент ессно не может быть MFC объектом (С++)!
Ну а дальше - GOOGLE RULEZZZZZZ! :
http://groups.google.com/groups?hl=ru&l ... .com#link1
http://groups.google.com/groups?hl=ru&l ... .net#link1
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
Sanych,
При всем уважении, don't be a smart ass, OK? Неужели Вы думаете, что я по каждому вопросу буду бегать в Привет. Я перепробовал все параметры которые только можно..
из Вашего же примера..
char *str = "9";
int x = atoi(str); // говорят будет работать
В моем примере,
const char* sTemp = "9";
int i = atoi (sTemp);
приводит к крашу..
При всем уважении, don't be a smart ass, OK? Неужели Вы думаете, что я по каждому вопросу буду бегать в Привет. Я перепробовал все параметры которые только можно..
из Вашего же примера..
char *str = "9";
int x = atoi(str); // говорят будет работать
В моем примере,
const char* sTemp = "9";
int i = atoi (sTemp);
приводит к крашу..
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
uniqueman wrote:В моем примере,
const char* sTemp = "9";
int i = atoi (sTemp);
приводит к крашу..
Даже если создать новый совершенно пустой проект?
То что изначальный пример вылетает только в NT наводит на мысли что это может быть как-то связано с unicode. А скорее этот краш никак не связан с atoi и CString. Кто-то в совершенно другом месте трет память/стек и т.д. и т.п.
-
- Уже с Приветом
- Posts: 7728
- Joined: 10 Jan 1999 10:01
- Location: OH->TX->MI->MA->VA->FL->...
> При всем уважении, don't be a smart ass, OK? Неужели Вы
> думаете, что я по каждому вопросу буду бегать в
> Привет.
Однако у меня возникло такое впечатление, несмотря на то что дело дошло до задниц...
> Я перепробовал все параметры которые только
> можно..
По моему подход неверен. Попробуйте сделать то же самое в пустом проекте, как упоминал KVA
> из Вашего же примера..
Моего???
Я вроде не приводил ни единого примера
> char *str = "9";
> int x = atoi(str); // говорят будет работать
uniqueman, "будет работать" - понятие условное. Если смешать пополам бензин с соляркой, то некоторые карбюраторные автомобили тоже могут работать, хотя чад будет еще тот
Если вовсю баловаться кастингом, не вникая в детали, то то и стандартные функции могут не работать. Часто первые признаки - Debug версия работает, а Release - падает.
Наиболее часто такие вещи происходят, когда переменные "наезжают" друг на друга.
У нас ребята 3 месяца ловили проблему с крушением DLL'a в Release, когда в Debug все вроде работало (если пробовать меньше 5-ти раз ) А проблема оказалась в том, что в DLL функцию объявили как
int WINAPI func(void *);
а потом пользовали указатель как на:
int WINAPI func(void);
В результате возникал "перекос" стека.
Или, скажем, популярная проблема, объявили
char str[4];
int i;
а потом загоняете в str что нить типа строки "stop" длиной в 4 символа. и инициализируете
i = 25;
Если компилятор последовательно распределит память под str а потом под i, то строка "stop" частично "наедет" на переменную i. Ну а когда Вы проинициализируете i, то, по сути дела, убьете '\0' на конце строки "stop". Ну и ессно потом любая строковая операция с str вызовет непредсказуемые результаты.
Это наиболее типичные примеры возникновения подобных проблем. Действительность может быть намного хуже
> В моем примере,
> const char* sTemp = "9";
> int i = atoi (sTemp);
> приводит к крашу.
А попробуйте поставить для прикола пару буферов вокруг, типа:
const char buf1[512] = {'\0'};
const char* sTemp = "9";
const char buf2[512] = {'\0'};
int i = atoi (sTemp);
Если крэша не будет, то очень похоже на "наезд" переменных или перекос стека.
> думаете, что я по каждому вопросу буду бегать в
> Привет.
Однако у меня возникло такое впечатление, несмотря на то что дело дошло до задниц...
> Я перепробовал все параметры которые только
> можно..
По моему подход неверен. Попробуйте сделать то же самое в пустом проекте, как упоминал KVA
> из Вашего же примера..
Моего???
Я вроде не приводил ни единого примера
> char *str = "9";
> int x = atoi(str); // говорят будет работать
uniqueman, "будет работать" - понятие условное. Если смешать пополам бензин с соляркой, то некоторые карбюраторные автомобили тоже могут работать, хотя чад будет еще тот
Если вовсю баловаться кастингом, не вникая в детали, то то и стандартные функции могут не работать. Часто первые признаки - Debug версия работает, а Release - падает.
Наиболее часто такие вещи происходят, когда переменные "наезжают" друг на друга.
У нас ребята 3 месяца ловили проблему с крушением DLL'a в Release, когда в Debug все вроде работало (если пробовать меньше 5-ти раз ) А проблема оказалась в том, что в DLL функцию объявили как
int WINAPI func(void *);
а потом пользовали указатель как на:
int WINAPI func(void);
В результате возникал "перекос" стека.
Или, скажем, популярная проблема, объявили
char str[4];
int i;
а потом загоняете в str что нить типа строки "stop" длиной в 4 символа. и инициализируете
i = 25;
Если компилятор последовательно распределит память под str а потом под i, то строка "stop" частично "наедет" на переменную i. Ну а когда Вы проинициализируете i, то, по сути дела, убьете '\0' на конце строки "stop". Ну и ессно потом любая строковая операция с str вызовет непредсказуемые результаты.
Это наиболее типичные примеры возникновения подобных проблем. Действительность может быть намного хуже
> В моем примере,
> const char* sTemp = "9";
> int i = atoi (sTemp);
> приводит к крашу.
А попробуйте поставить для прикола пару буферов вокруг, типа:
const char buf1[512] = {'\0'};
const char* sTemp = "9";
const char buf2[512] = {'\0'};
int i = atoi (sTemp);
Если крэша не будет, то очень похоже на "наезд" переменных или перекос стека.
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
заметил вот еще что..
Если пишу
const char* a = "0";
int i = atoi (a);
то без проблем, но если вместо нуля вставить любое другое число - crash
Никаких переменных рядом с ней не инициализирую. Повторил то же самое на 2000 системе. Ужасно не нравится когда простые до боли функции перестают работать на голом месте. Еще как назло в дебаге не могу запустить софт
Если пишу
const char* a = "0";
int i = atoi (a);
то без проблем, но если вместо нуля вставить любое другое число - crash
Никаких переменных рядом с ней не инициализирую. Повторил то же самое на 2000 системе. Ужасно не нравится когда простые до боли функции перестают работать на голом месте. Еще как назло в дебаге не могу запустить софт
-
- Уже с Приветом
- Posts: 176
- Joined: 21 Feb 2002 10:01
- Location: KZ -> KY -> WA
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
-
- Уже с Приветом
- Posts: 3811
- Joined: 14 Oct 2001 09:01
Выглядит так, как будто стэк отвалился. Проверьте включена ли опция компилятора /GZ или нет. Эта опция была введена начиная с VC++ 6.0 и в новых проектах включена по умолчанию. Если используется сконвертированный вариант старого проекта, например от VC++ 5.0, то этой опции в settings естественно не будет, если только самому не поставить. При включенной /GZ можно легко найти функцию, которая портит стек, и дальше уже смотреть, в чем же дело.