Форум программистов, компьютерный форум CyberForum.ru

Баг strcmp - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 18:57     Баг strcmp #1
Линк на архив с видео, где записана ошибка.
http://upload.com.ua/get/902136351/Bug.zip
Пароль: bug
Объясните ситуацию.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2010, 18:57     Баг strcmp
Посмотрите здесь:

strcmp C++
C++ strcmp()
C++ Функция strcmp
C++ STRCMP
strcmp C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
27.11.2010, 19:23     Баг strcmp #2
Неужели нельзя залить на файлообменник, где не надо ждать минуту со всякой рекламой?
X больше, чем O, возвращается любое положительное число, не обязательно единица. А там проверка на true.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 19:29  [ТС]     Баг strcmp #3
Цитата Сообщение от Somebody Посмотреть сообщение
Неужели нельзя залить на файлообменник, где не надо ждать минуту со всякой рекламой?
X больше, чем O, возвращается любое положительное число, не обязательно единица. А там проверка на true.
на true та же ситуация
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
27.11.2010, 19:34     Баг strcmp #4
alexsvk, за такую тему забанить мало
оформляйте тему нормально
CoolProgger
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 5
27.11.2010, 19:43     Баг strcmp #5
запомните у стандартных функций нет багов
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 19:47     Баг strcmp #6
А ТС знает, что strcmp возвращает ноль, если две строки равны, т.е. значение, которое в остальных случаях интерпретируется как ложь?
Кстати, а что мешает выложить тот участок кода, где был замечен "баг", вместо того, чтобы мучаться с записью видео/выкладыванием его на файлообменник и заставлять мучаться других при его скачивании?

Не по теме:

А еще багов в стандартной библиотеке не заметил? А то интересно было бы послушать...

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.11.2010, 19:58     Баг strcmp #7
Я заметил - log(-1) неправильно считает.

Добавлено через 1 минуту
И ещё sqrt(x) == x при x = 1 почему-то...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 20:04     Баг strcmp #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я заметил - log(-1) неправильно считает
да, беда-то какая А как должно быть правильно?
Цитата Сообщение от silent_1991 Посмотреть сообщение
И ещё sqrt(x) == x при x = 1 почему-то...
а у меня выводит единицу

Не по теме:

Кстати, asin(x) для |x|>1 только у меня не работает?

alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:12  [ТС]     Баг strcmp #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    char str[2] = "";
    char s [2];
 
    s [0] = who;
    s [1] = '\0';
 
    for(int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 63; j++)
        {
            getCellValue(i,j,str);
 
            if (strcmp(str,s) == true)
            {
                setCellValue(i,j,(char*)s);
            }
        }
    }
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 20:15     Баг strcmp #10
alexsvk, а теперь скажи, какие значения аргументов у функции strcmp в момент "бага" и какой результат ты от нее ожидаешь (str равна s, str больше s, str меньше s)? Судя по твоему коду, setCellValue должно срабатывать, когда str больше, чем s. Я прав?
И да, какой смысл кастовать s к типу char*?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:20  [ТС]     Баг strcmp #11
Цитата Сообщение от Nameless One Посмотреть сообщение
alexsvk, а теперь скажи, какие значения аргументов у функции strcmp в момент "бага" и какой результат ты от нее ожидаешь (str равна s, str больше s, str меньше s)?
И да, какой смысл кастовать s к типу char*?
Debug:
s[0] = 'X';
s [1] = 'O';

А смысл в том, что мне нужно SendMessage(...,WM_SETTEXT,...,...) реализовывать, где последний параметр типа const char*. who типа char.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 20:29     Баг strcmp #12
Цитата Сообщение от alexsvk Посмотреть сообщение
Debug:
s[0] = 'X';
s [1] = 'O';
а теперь вопрос на засыпку: сколько ты символов выделил для массива s? Два, правильно? А в твоем массиве где-нибудь есть символ '\0'? А с какими строками работает функция strcmp? Правильно, с теми, которые заканчиваются на '\0', т.е. с null-terminated strings. А ты передал в функцию strcmp просто массив символов, в котором нет символа '\0', т.е. признака конца строки, и после этого ожидаешь, что функция будет работать правильно?
Цитата Сообщение от alexsvk Посмотреть сообщение
А смысл в том, что мне нужно SendMessage(...,WM_SETTEXT,...,...) реализовывать, где последний параметр типа const char*. who типа char.
who может быть и типа char, но в функцию setCellValue ты передаешь не who, а s, у которой и так уже тип char*. Т.е. ты кастуешь переменную с типом char* к типу char*. Лично мне это кажется бессмысленным
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:37  [ТС]     Баг strcmp #13
Цитата Сообщение от Nameless One Посмотреть сообщение
а теперь вопрос на засыпку: сколько ты символов выделил для массива s? Два, правильно? А в твоем массиве где-нибудь есть символ '\0'? А с какими строками работает функция strcmp? Правильно, с теми, которые заканчиваются на '\0', т.е. с null-terminated strings. А ты передал в функцию strcmp просто массив символов, в котором нет символа '\0', т.е. признака конца строки, и после этого ожидаешь, что функция будет работать правильно?

who может быть и типа char, но в функцию setCellValue ты передаешь не who, а s, у которой и так уже тип char*. Т.е. ты кастуешь переменную с типом char* к типу char*. Лично мне это кажется бессмысленным

Не по теме:

Прошу прощения, что за бред.


Посмотрите ещё раз код, пожалуйста, там s[1] = '\0';
Да, и ещё. Если у Вас есть лучший вариант преобразования параметра с буквой к char*, то скажите как. Буду благодарен.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 20:41     Баг strcmp #14
Цитата Сообщение от alexsvk Посмотреть сообщение

Не по теме:

Прошу прощения, что за бред.


Посмотрите ещё раз код, пожалуйста, там s[1] = '\0';

Не по теме:

О да, бред...


Какая разница, какое значение s[1] имело при первичной инициализации? В интересующий нас момент какое значение у s[1] нам показывает отладчик? 'O', а 'O' != '\0'
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:44  [ТС]     Баг strcmp #15
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

О да, бред...


Какая разница, какое значение s[1] имело при первичной инициализации? В интересующий нас момент какое значение у s[1] нам показывает отладчик? 'O', а 'O' != '\0'
тьфу.. прошу прощения, там s[0] = 'O'; - т.е. проблема остаётся
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.11.2010, 20:49     Баг strcmp #16
Кстати, непонятно, как могло измениться значение s[1], которое вроде было равно '\0', если с момента начальной инициализации оно не менялось (вроде бы)? Если только функция setCellValue модифицирует значение s... Если это твоя функция, попробуй изменить тип параметра с char* на const char*.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.11.2010, 21:54     Баг strcmp #17
Цитата Сообщение от Nameless One
А как должно быть правильно?
Это уже другой вопрос

Цитата Сообщение от Nameless One
а у меня выводит единицу
Я на то и сетовал
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.11.2010, 01:05     Баг strcmp #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я заметил - log(-1) неправильно считает.

Добавлено через 1 минуту
И ещё sqrt(x) == x при x = 1 почему-то...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <math.h>
#include <errno.h>
 
int main(void)
{
    double n = log(-1);
    
    printf("%f" "\n", n);
    
    if (errno)
        perror("math");
    
    printf("%d" "\n", sqrt(1.0) == 1.0);
        
    return 0;
}
Код
[guest@localhost tests]$ ./t
nan
math: Numerical argument out of domain
1
[guest@localhost tests]$
C89
4.5.1 Treatment of error conditions

The behavior of each of these functions is defined for all
representable values of its input arguments. Each function shall
execute as if it were a single operation, without generating any
externally visible exceptions.

For all functions, a domain error occurs if an input argument is
outside the domain over which the mathematical function is defined.
The description of each function lists any required domain errors; an
implementation may define additional domain errors, provided that such
errors are consistent with the mathematical definition of the
function./94/ On a domain error, the function returns an
implementation-defined value; the value of the macro EDOM is stored in
errno .

Similarly, a range error occurs if the result of the function
cannot be represented as a double value. If the result overflows (the
magnitude of the result is so large that it cannot be represented in
an object of the specified type), the function returns the value of
the macro HUGE_VAL , with the same sign as the correct value of the
function; the value of the macro ERANGE is stored in errno . If the
result underflows (the magnitude of the result is so small that it
cannot be represented in an object of the specified type), the
function returns zero; whether the integer expression errno acquires
the value of the macro ERANGE is implementation-defined.
Добавлено через 4 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

Кстати, asin(x) для |x|>1 только у меня не работает?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <math.h>
#include <errno.h>
 
int main(void)
{
    double n = asin(2);
    
    printf("%f" "\n", n);
    
    if (errno)
        perror("math");
    
    return 0;
}
Код
[guest@localhost tests]$ ./t
nan
math: Numerical argument out of domain
[guest@localhost tests]$
silent_1991
28.11.2010, 01:07
  #19

Не по теме:

accept, если что, это всё был сарказм)))

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2010, 01:19     Баг strcmp
Еще ссылки по теме:

C++ std::regex : баг на сайте или баг компилятора?
C++ strcmp
Strcmp C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.11.2010, 01:19     Баг strcmp #20
Гм. Для снятия константности лучше использовать const_cast<char*> но т.к. тут нету константности, то смысла в использовании нет. Да и потом. ТС, ты может все таки объяснишь, что ты хочешь получить от сравнения строк?
Yandex
Объявления
28.11.2010, 01:19     Баг strcmp
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru