ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[C#] Из жизни багов: байты в циклах
  #1  
Старый 17.12.2009, 14:42
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


Smile [C#] Из жизни багов: байты в циклах

МиниКвест.
Недавно выловил такой вот баг в программе:
Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто Очевидный, на первый взгляд код, не работает:

Код:
for (byte b = 0; b <= 255; b++)
      Console.WriteLine(b);
Кто скажет почему не работает этот код? (желательно без компиляции )
 
Ответить с цитированием

  #2  
Старый 17.12.2009, 15:07
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

так там после 255 идет 0
т.е. если будет число 255, то оно проверится по условию. цикл выполнится, далее число увеличится на 1. А так как это байт, то оно станет = 0 и тогда опять процдет проверку.

достаточно было бы поставить < 256 чтобы исключить такое.

Это собственно говоря проблема любого языка.

Последний раз редактировалось slesh; 17.12.2009 в 15:10..
 
Ответить с цитированием

  #3  
Старый 17.12.2009, 15:17
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

А да точно. туплю. Просто не ткомпилятора под рукой чтобы проверить. тогда типа так:
Код:
for (byte b = 0; b <= 255; b++)
{
      Console.WriteLine(b);
      if (b == 255) break;
}
но вообще в данных условиях лучше просто расширить переменную хотябы до short
 
Ответить с цитированием

  #4  
Старый 17.12.2009, 17:30
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от slesh  
достаточно было бы поставить < 256 чтобы исключить такое.
Это вообще говоря некорректно, потому как 256 выходит за рамки байта, и сравнивать с байтом - не очень хорошо (компилятор морщится на это варнингом). Ну и кроме того, как уже сказали, это не решает проблему.
Цитата:
Сообщение от slesh  
Это собственно говоря проблема любого языка.
А вот здесь ты не прав. На delphi аналогичный код работает на ура
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
begin
 for i:=0 to 255 do
     self.text := intToStr(i);
end;
 
Ответить с цитированием

  #5  
Старый 17.12.2009, 17:33
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от dober.man  
Algol, все нормально, смотри что я придумал:
Код:
for (byte i = 0, j = 255; i < j; i++)
    System.Console.WriteLine(i);
Работает! =)
Твой код выводит не все значения байта, он не выводит 255
 
Ответить с цитированием

  #6  
Старый 17.12.2009, 17:55
.Slip
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме:
21768337

Репутация: 3486


По умолчанию

Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.
__________________
..
 
Ответить с цитированием

  #7  
Старый 17.12.2009, 18:05
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


Angry

Цитата:
Сообщение от .Slip  
Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.
И ?
Я разве спрашивал/утверждал чей это баг?
 
Ответить с цитированием

  #8  
Старый 17.12.2009, 23:48
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме:
5812656

Репутация: 1540


Отправить сообщение для scrat с помощью ICQ
По умолчанию

Цитата:
Сообщение от Algol  
МиниКвест.
Недавно выловил такой вот баг в программе:
Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто Очевидный, на первый взгляд код, не работает:

Код:
for (byte b = 0; b <= 255; b++)
      Console.WriteLine(b);
Кто скажет почему не работает этот код? (желательно без компиляции )
тут как-то замешано то, что все типы в .net основаны на object, и byte - это не привычные 8 битов.

Решение: Использовать CompareTo()

рабочий пример:
Код:
byte b = 0x0;
	for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);

Последний раз редактировалось scrat; 18.12.2009 в 00:04..
 
Ответить с цитированием

  #9  
Старый 18.12.2009, 01:00
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от scrat  
рабочий пример:
Код:
byte b = 0x0;
	for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ?
 
Ответить с цитированием

  #10  
Старый 18.12.2009, 12:27
W!z@rD
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме:
1892597

Репутация: 836


Отправить сообщение для W!z@rD с помощью ICQ
По умолчанию

Цитата:
Сообщение от Algol  
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ?
for (byte i = byte.MaxValue; i > byte.MinValue; i--)
{
Console.WriteLine(byte.MinValue + i);
}

rofl, теперь нет нуля? ))))
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПК как лаборатории для "выращивания" цифровой жизни b1oxa Мировые новости 0 05.10.2009 21:54
Sale of ICQ Hertz ICQ - Покупка, продажа 1 28.09.2009 04:27
Фразы о жизни novichok Болталка 10 15.07.2006 21:04



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ