HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

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

Репутация: 0


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

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

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

  #2  
Старый 17.12.2009, 15:07
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

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

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

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

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

  #3  
Старый 17.12.2009, 17:30
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
С нами: 12604706

Репутация: 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;
 
Ответить с цитированием

  #4  
Старый 17.12.2009, 15:17
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

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

  #5  
Старый 17.12.2009, 17:55
.Slip
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
С нами: 10692266

Репутация: 3486


По умолчанию

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

  #6  
Старый 17.12.2009, 18:05
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
С нами: 12604706

Репутация: 0


Angry

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

  #7  
Старый 17.12.2009, 23:48
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #8  
Старый 18.12.2009, 01:00
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
С нами: 12604706

Репутация: 0


По умолчанию

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

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

Репутация: 836


По умолчанию

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

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

  #10  
Старый 19.12.2009, 19:52
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию

Цитата:
Сообщение от Algol  
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ?
ой, я почему-то был уверен в том, что оно печатается. Как-то это всё очень странно.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПК как лаборатории для "выращивания" цифровой жизни 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 ™ © 2001- Antichat Kft.