Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685

Непонятный баг в правильном коде

13.07.2010, 02:44. Показов 1192. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ирк-бот на c#, раньше все работало нормально, но теперь стало игнорироваться условие
C#
1
2
3
4
if ((CHANNEL != "#shock-world") | (CHANNEL != "#help") | (CHANNEL != "#announce") | (CHANNEL != "#trade") | (CHANNEL != "#testing"))
{
// тело
}
Оно означает, что указанные действия будут происходит только если сообщение написано не на перечисленных каналах, но все равно они выполнялись на этих каналах, не понимаю почему, раньше работало, а после добавления n-ного количества скриптов в тело проверки - перестало работать, пробовал вшить проверку отдельно в каждый скрипт - тоже самое, игнорируется условие, заменил его на
C#
1
2
3
4
5
6
7
if ((CHANNEL == "#shock-world") | (CHANNEL == "#help") | (CHANNEL == "#announce") | (CHANNEL == "#trade") | (CHANNEL == "#testing"))
{
}
else
{
//тело
}
Теперь все работает, но все равно не понятно почему такое случилось, какие бывают нюансы? Пробовал половину скриптов закомментировать, чтобы снизить нагрузку, хотя их и так не много, по сегодняшним меркам - около 30, всего в боте 1500 строк, ничего особо не грузит его, не помогало, условие просто игнорировалось.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2010, 02:44
Ответы с готовыми решениями:

Непонятный баг в приложении ASP.Net
Здравствуйте друзья. Это очень странный баг, выскакивает наверно из 100 попыток 1 раз. Есть ASP.Net приложение работающее с базой...

Непонятный баг
Пишу программу на Си++ с использованием Qt и FMOD. Вот место, где глючит (тут только куски кода, не весь): void...

Непонятный баг в ListView
В общем, суть такова: Имеется список контактов в ListView. Каждый пункт содержит аватарку, имя и телефон. Адаптер ListView: ...

12
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
13.07.2010, 03:39
C#
1
2
3
4
if ((CHANNEL != "#shock-world") | (CHANNEL != "#help") | (CHANNEL != "#announce") | (CHANNEL != "#trade") | (CHANNEL != "#testing"))
{
// тело
}
Войдет в "тело" если хотя бы одно из значений не совпадет с CHANNEL

C#
1
2
3
4
5
6
7
if ((CHANNEL == "#shock-world") | (CHANNEL == "#help") | (CHANNEL == "#announce") | (CHANNEL == "#trade") | (CHANNEL == "#testing"))
{
}
else
{
//тело
}
Войдет в "тело" если все значения не совпадут с CHANNEL

Если брать первый вариант, при условии что должен работать как второй, то правильно будет
C#
1
2
3
4
f ((CHANNEL != "#shock-world") & (CHANNEL != "#help") & (CHANNEL != "#announce") & (CHANNEL != "#trade") & (CHANNEL != "#testing"))
{
// тело
}
Это разные вещи
Похоже немного условие в свое время поменяли и не учли....
А вообще, читал как-то - есть теорема в логике по подобным перестановкам, но названия не помню
1
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.07.2010, 08:25
Похоже на проблемы с составлением лог вырыжения. Поробуй это
C#
1
2
3
4
if ((CHANNEL != "#shock-world") || (CHANNEL != "#help") || (CHANNEL != "#announce") || (CHANNEL != "#trade") || (CHANNEL != "#testing"))
{
// тело
}
1
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
13.07.2010, 09:46
Цитата Сообщение от nio Посмотреть сообщение
Похоже на проблемы с составлением лог вырыжения. Поробуй это
C#
1
2
3
4
if ((CHANNEL != "#shock-world") || (CHANNEL != "#help") || (CHANNEL != "#announce") || (CHANNEL != "#trade") || (CHANNEL != "#testing"))
{
// тело
}
Полностью согласен! учите мат часть ув. топик стартер! "|" - оператор бинарный и вообще непонятно как он у вас там работал!; а "||" оператор логический, вот его то вам и требуется использовать для составления логических выражений!

зы:
Непонятный баг в правильном коде
не говари "гоп" пока не перепрыгнул!
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
13.07.2010, 09:48  [ТС]
nio, пробовал и с | и с ||,
s-kvv, да, вы правы, с & действительно работает, что-то я запутался, ночью уже думал, что я сошел с ума, а сейчас ошибку понял быстро, наверное сон и правильная подсказка хорошо влияют на мозг, спасибо =)
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.07.2010, 10:16
s-kvv, r0fL, для сравнения используются логические операторы: || , && , == , !=
Почитайте учебник по C#. Использование для сравнения "|" или "&" недопустимо.
0
118 / 119 / 20
Регистрация: 21.01.2010
Сообщений: 252
13.07.2010, 10:55
Насколько я помню, оператор | в конструкциях на условия логический, так что его испольлзовать тоже можно. || это сокращенный. Вот и Шилдт о том же:"Единственное различие между обычноей и сокращенной версиями этих операторов состоит в том, что при использовании обычной операции всегда вычисляются оба операнда, в случае же сокращенной версии второй операнд вычисляется только при необходимости." Т.е. в случае с ИЛИ, если первое значение возвращает true, то второе даже не высчитывается.
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
13.07.2010, 11:03
Цитата Сообщение от nio Посмотреть сообщение
s-kvv, r0fL, для сравнения используются логические операторы: || , && , == , !=
Почитайте учебник по C#. Использование для сравнения "|" или "&" недопустимо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        static void Main(string[] args)
        {
            if (func(false, 0) & func(false, 1) & func(false, 2) & func(false, 3) & func(true, 4))
            {
                Console.WriteLine("Не может быть!");
            }
            else
            {
                Console.WriteLine("Ура!");
            }
 
            if (func(false, 0) && func(false, 1) && func(false, 2) && func(false, 3) && func(true, 4))
            {
                Console.WriteLine("Не может быть!");
            }
            else
            {
                Console.WriteLine("Ура!");
            }
 
            Console.ReadKey();
        }
 
        static bool func(bool bv, int num)
        {
            Console.WriteLine("{0} {1}", bv, num);
            return bv;
        }
Изучите, nio, этот код, а главное - его вывод на консоль, и можете сами себе учебник получше купить)))))

Оператор && - полностью булевый (1)
а & - и битовый и булевый (2)

Отличия (при булевых вычислениях):
& - проверяет все выражение до конца, даже если уже ясно что дальше можно и не сравнивать, как и в примере
&& - сравнивает "ускоренно", т.е. когда становится ясно, что дальнейшие вычисления можно не проводить, он прекращает сравнения.
В данном примере код
C#
1
func(false, 1) && func(false, 2) && func(false, 3) && func(true, 4)
никогда не выполнится
и совсем наоборот с кодом
C#
1
func(false, 1) & func(false, 2) & func(false, 3) & func(true, 4)
уже "ежику" понятно, что после func(false, 0) дальше сравнения можно и не делать, а & их делает

Смысл написанного мной в предыдущем сообщении никак не меняется от такой особенности этих операторов

У r0fL код не работал по причине описанной мной ранее. Только так!)))))

Добавлено через 1 минуту
Цитата Сообщение от _Art_ Посмотреть сообщение
Насколько я помню, оператор | в конструкциях на условия логический, так что его испольлзовать тоже можно. || это сокращенный. Вот и Шилдт о том же:"Единственное различие между обычноей и сокращенной версиями этих операторов состоит в том, что при использовании обычной операции всегда вычисляются оба операнда, в случае же сокращенной версии второй операнд вычисляется только при необходимости." Т.е. в случае с ИЛИ, если первое значение возвращает true, то второе даже не высчитывается.
Пока сообщение составлял этого не видел...
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
13.07.2010, 12:12  [ТС]
l_a_m, изначально у меня было || это я потом уже стал перебирать вариации, кстати, и код действительно работал, потому и думал, что он правильный, а вчера увидел, что он не работает, ночью, вот и думал, что какой-то баг, в коде, который до этого работал
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
13.07.2010, 13:19
Цитата Сообщение от r0fL Посмотреть сообщение
l_a_m, изначально у меня было || это я потом уже стал перебирать вариации, кстати, и код действительно работал, потому и думал, что он правильный, а вчера увидел, что он не работает, ночью, вот и думал, что какой-то баг, в коде, который до этого работал
У Вас сейчас так - не работает
C#
1
2
3
4
if ((CHANNEL != "#shock-world") | (CHANNEL != "#help") | (CHANNEL != "#announce") | (CHANNEL != "#trade") | (CHANNEL != "#testing"))
{
// тело
}
А так заработало в том же самом коде?
C#
1
2
3
4
if ((CHANNEL != "#shock-world") || (CHANNEL != "#help") || (CHANNEL != "#announce") || (CHANNEL != "#trade") || (CHANNEL != "#testing"))
{
// тело
}
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
13.07.2010, 17:36
Может быть там было
C#
1
2
3
4
if (!((CHANNEL == "#shock-world") | (CHANNEL =!= "#help") | (CHANNEL =!= "#announce") | (CHANNEL =!= "#trade") | (CHANNEL =!= "#testing")))
{
// тело
}
или что то такое?
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
14.07.2010, 10:39  [ТС]
gGrn-7DA, s-kvv, Работает с &&, || - не правильно логически, так как канал не должен быть равен всем перечисленным каналам
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
14.07.2010, 10:42
слегка намудрил с =!=

C#
1
2
3
4
if (!((CHANNEL == "#shock-world") | (CHANNEL == "#help") | (CHANNEL == "#announce") | (CHANNEL == "#trade") | (CHANNEL == "#testing")))
{
// тело
}
проверь, так должно работать=) отвечаю=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2010, 10:42
Помогаю со студенческими работами здесь

Непонятный баг. Вставка в стек
В общем суть. Дан Стек указателей, от него потомок - стек чисел. Задача - распечатать в обратном порядке отдельно отрицательные и...

Непонятный баг при запросе
Подскажите, это баг или что? Выводит 77тыс, а показывает 70тыс

непонятный баг textarea под ie
проверял под ie8 и ff 3 у кого есть другие браузеры под рукой, скиньте результаты в ff 3 все ок код такой: &lt;!DOCTYPE...

Непонятный баг со спрайтом в Unity 2D
Всем доброго времени суток. Разрабатываю двухмерную RTS с видом сверху на движке Unity, и вчера столкнулся с очень непонятным явлением. ...

Ошибки в правильном коде
Человек дал готовые для сдачи работы, но компилятор указывает ошибки на строчках 11 и 19. Пожалуйста помогите разобраться в чем проблема,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru