Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.25;
Скачать: CL | DM;

Вниз

программирование IncDay-style   Найти похожие ветки 

 
Virgo_Style ©   (2011-09-02 22:04) [0]

if (somebool = false) then begin
 exit;
end;

if List.Count>0 then begin
 for i:=0 to List.Count-1 do begin
   if fileexists( List[i] ) then begin
     try
       DeleteFile( List[i] );
     except
     end;
   end;
 end;
end;


код слегка условный, но полностью передающий особенности стиля.
я не пойму, человеку посимвольно платили, или что это вообще такое?

p.s. На самом деле, проверка Count>0 имеет свое объяснение: кое-где бывало беззнаковым. Byte или word, к примеру. Видимо, автор обжегся однажды и далее дул на воду всегда.


 
Virgo_Style ©   (2011-09-02 22:07) [1]


> кое-где бывало


*кое-где i бывало


 
Игорь Шевченко ©   (2011-09-02 22:12) [2]


> или что это вообще такое?


http://lurkmore.ru/%D0%91%D1%8B%D0%B4%D0%BB%D0%BE%D0%BA%D0%BE%D0%B4


 
xayam ©   (2011-09-02 22:15) [3]


> *кое-где i бывало

знаковым?


 
asails   (2011-09-02 23:33) [4]


> xayam ©   (02.09.11 22:15) [3]

Не. Именно беззнаковым... Тогда да - грабли могут быть.


 
Германн ©   (2011-09-03 01:15) [5]

Если форматирование есть, значит не всё ещё потеряно. :)


 
Ega23 ©   (2011-09-03 10:05) [6]

Или пример на pascal:

var
 i: word;
begin
for i:=0 to List1.Count-1 do
 ShowMessage(List1.Items[i]);
...


   Если в списке было 0 элементов, компилятор выкидывал исключение о недопустимом индексе.

В данном случае из-за того, что i беззнакового типа, число List1.Count — 1, равное минус единице, автоматом преобразовывалось к тому же типу, что i, и становилось равным $FFFF. То есть данный код при пустом списке эквивалентен for i := 0 to $FFFF do… То есть будет пытаться перебрать ВСЕ значения i от 0 до $FFFF, выдав ошибку на первом же из них.


 
Дмитрий С ©   (2011-09-03 11:23) [7]

Вырывать код из контекста и говорить что он кривой имхо плохо.

P.S.
К тому же мы уже знаем, что
if somebool = false then
и
if not somebool then
это не одно и то же :)


 
DiamondShark ©   (2011-09-03 11:29) [8]


> for i:=0 to List1.Count-1 do

Must сдохнуть в диких корчах.

foreach (var elt in List1)
{
...
}

i, Count, 0, -1, Items[i], знаки, беззнаки -- это всё информационный мусор.
Правда, олдскульным кодерам, до сих пор фапающим на то, как они фортрановский код вручную перфорировали на карты пять километров в гору зимой, весь этот булшит необходим для надрачивания ЧСВ.


 
Дмитрий С ©   (2011-09-03 11:42) [9]


> DiamondShark ©   (03.09.11 11:29) [8]

Ахаха) А если надо все кроме первого или последнего элемента перечислить или каждый второй.


 
_Юрий   (2011-09-03 11:56) [10]


> http://lurkmore.ru/%D0%91%D1%8B%D0%B4%D0%BB%D0%BE%D0%BA%D0%BE%D0%B4


Статья чуть менее чем полностью состоит их взаимоисключающих параграфов


 
uw ©   (2011-09-03 11:58) [11]

Дмитрий С ©   (03.09.11 11:23) [7]

Когда не одно и то же - это и есть кривой код.


 
_Юрий   (2011-09-03 12:03) [12]


> Ахаха) А если надо все кроме первого или последнего элемента
> перечислить или каждый второй.


Вот интересно, для чего может понадобиться перечислить все кроме первого и последнего?


 
Дмитрий С ©   (2011-09-03 12:09) [13]


> Вот интересно, для чего может понадобиться перечислить все
> кроме первого и последнего?

Ну это сам придумаешь, я уверен.


 
Юрий Зотов ©   (2011-09-03 12:27) [14]


> Дмитрий С ©   (03.09.11 11:42) [9]
> А если надо все кроме первого или последнего элемента
> перечислить или каждый второй.


Тогда "олдскульные кодеры, до сих пор фапающие на то, как они фортрановский код вручную перфорировали на карты пять километров в гору зимой" делают это легко и просто. На автопилоте. И многое другое они тоже делают на автопилоте.

А вот скороспелки, ничего, кроме "надроченного ЧСВ", за плечами реально не имеющие, в таких случаях пишут что-то вроде сабжа.

LOL


 
Virgo_Style ©   (2011-09-03 12:30) [15]


> олдскульным кодерам


вот не надо этих... инсинуаций. Новые технологии и приемы нам совсем не чужды.

Например, очень удобно написать процедуру с параметром - анонимной процедурой, чтобы первая заворачивала вторую в try-except end.
Такой процедуре очень удобно передавать завернутые в анонимную процедуру StrToInt или там деление x на y в том случае, если y может оказаться нулем.


 
_Юрий   (2011-09-03 12:32) [16]


> Ну это сам придумаешь, я уверен.


Да вот как то не придумывается.
Каждый второй - еще может и придумаю, а тут - нет.

В общем то, в 99 процентах случаев детали реализации итератора не интересуют вовсе, то бишь таки да, информационный мусор


 
DiamondShark ©   (2011-09-03 13:01) [17]


> Дмитрий С ©   (03.09.11 11:42) [9]
> Ахаха) А если надо все кроме первого или последнего элемента перечислить или каждый второй.


А ещё круче, если надо чтобы перечисляемые индексы образовывали ряд Фибоначчи.

Ведь очевидно же, что линейный просмотр списка -- самый редкоиспользуемый сценарий. Гораздо чаще списки просматриваются со второго по предпоследний задом-наперёд в шахматном порядке.


> Юрий Зотов ©   (03.09.11 12:27) [14]
> делают это легко и просто. На автопилоте.

Покажите код, перечисляющий элементы TList, кроме первого и последнего.


 
DiamondShark ©   (2011-09-03 13:04) [18]


> Virgo_Style ©   (03.09.11 12:30) [15]

А что делает процедура-обёртка, если игрек таки ноль?


 
Virgo_Style ©   (2011-09-03 13:21) [19]


> А что делает процедура-обёртка, если игрек таки ноль?


Примерно то же, что и

try
 something:=x/y;
except
end;


, я полагаю.


 
Юрий Зотов ©   (2011-09-03 13:33) [20]


> DiamondShark ©   (03.09.11 13:01) [17]
> Покажите код, перечисляющий элементы TList, кроме первого
> и последнего.

Это шутка такая?

Поимка ручного льва в пустыне Сахара предоставляется читателю в качестве самостоятельного упражнения.


 
DiamondShark ©   (2011-09-03 13:43) [21]


> Virgo_Style ©   (03.09.11 13:21) [19]

facepalm.jpg


> Юрий Зотов ©   (03.09.11 13:33) [20]
> Это шутка такая?

Нет.
А почему вы спрашиваете?


 
Anatoly Podgoretsky ©   (2011-09-03 14:57) [22]

> _Юрий  (03.09.2011 12:03:12)  [12]

Тогда for I:= 7 to 13


 
Кто б сомневался ©   (2011-09-03 15:00) [23]

А вас что смущает именно проверка на ноль (хотя я довольно часто их делаю - т.к. необходимо, но здесь она не нужна конечно), а остальное типа пойдет?
Меня смущает то, что он вообще не продуман.
Я бы его переделал так:

if not somebool then exit;

for i:=0 to List.Count - 1 do
begin
 if fileexists(List.[i] ) then
   DeleteFile( List[i] );
  < здесь можно обработку ошибок сделать на delete file, но смысла нет
end;

>>Покажите код, перечисляющий элементы TList, кроме первого и последнего.
Поражаюсь просто.

For i := 1 to Count - 2 do

Ну и проверки соответствующие на наличие этого диапазона.


 
uw ©   (2011-09-03 15:08) [24]

Юрий Зотов ©   (03.09.11 13:33) [20]

> DiamondShark ©   (03.09.11 13:01) [17]
> Покажите код, перечисляющий элементы TList, кроме первого
> и последнего.

Это шутка такая?

Поимка ручного льва в пустыне Сахара предоставляется читателю в качестве самостоятельного упражнения.


А это уж точно шутка, я полагаю. Во всяком случае, "метод" поиска льва в пустыне всегда считался шуткой :-)


 
uw ©   (2011-09-03 15:10) [25]

Кто б сомневался ©   (03.09.11 15:00) [23]

Пожалуй, и fileexists ни к чему, а?


 
Anatoly Podgoretsky ©   (2011-09-03 15:10) [26]

> Кто б сомневался  (03.09.2011 15:00:23)  [23]

разве Count - 2 не есть проверка на наличие этого на наличие


 
Кто б сомневался ©   (2011-09-03 15:20) [27]


> Пожалуй, и fileexists ни к чему, а?


Да верно. Ни к чему.


 
Кто б сомневался ©   (2011-09-03 15:23) [28]

if not somebool then exit;

for i:=0 to List.Count - 1 do
  if not DeleteFile( List[i] ) then
    raise exception ... или Result :=


 
uw ©   (2011-09-03 15:28) [29]

Кто б сомневался ©   (03.09.11 15:23) [28]
if not somebool then exit;

for i:=0 to List.Count - 1 do
 if not DeleteFile( List[i] ) then
   raise exception ... или Result :=


Я думаю, эту проблему можно решить более конкретно:

for i:=0 to List.Count - 1 do
 if not DeleteFile( List[i] ) then
   ОтказатьсяОтИдеиУдаленияФайлаКоторыйНиФигаНеУдаляетсяНиФига;


 
uw ©   (2011-09-03 15:28) [30]

Кто б сомневался ©   (03.09.11 15:23) [28]
if not somebool then exit;

for i:=0 to List.Count - 1 do
 if not DeleteFile( List[i] ) then
   raise exception ... или Result :=


Я думаю, эту проблему можно решить более конкретно:

for i:=0 to List.Count - 1 do
 if not DeleteFile( List[i] ) then
   ОтказатьсяОтИдеиУдаленияФайлаКоторыйНиФигаНеУдаляетсяНиФига;


 
Кто б сомневался ©   (2011-09-03 15:31) [31]


> uw ©   (03.09.11 15:28) [30]

Не то.

А если это файл менеджер - юзер нажмет удалить а файл не удалиться?
Юзер начнет истеречить.
Юзеру нужно показать причину.


 
uw ©   (2011-09-03 15:32) [32]

Если у юзера не работает ОС, то ему остаётся только предложить удавиться. Но как это сделать, если у юзера не работает ОС?


 
uw ©   (2011-09-03 15:33) [33]

Хотя да. Такое может быть.


 
Кто б сомневался ©   (2011-09-03 16:24) [34]


> uw ©   (03.09.11 15:32) [32]


Файл может не удаляться по нескольким причинам.
Он может открыт другой программой, либо у текущего юзера просто нет прав на удаление.
Предлагаешь юзеру гадать над каждый файлом?


 
_Юрий   (2011-09-03 16:30) [35]

Не совсем олдскульному программеру решение данной задачи видится примерно так:

if (someBool)
 list.ForEach(x => DeleteFile(x));


 
©   (2011-09-03 18:11) [36]

есть чем статью на лурке пополнить, да


 
uw ©   (2011-09-03 19:28) [37]

Кто б сомневался ©   (03.09.11 16:24) [34]
Файл может не удаляться по нескольким причинам.
Он может открыт другой программой, либо у текущего юзера просто нет прав на удаление.
Предлагаешь юзеру гадать над каждый файлом?


Да я уже согласился, честно. В [33].


 
©   (2011-09-03 20:40) [38]


> _Юрий   (03.09.11 16:30) [35]

как раз лисп изобрели заново :-)


 
_Юрий   (2011-09-04 14:00) [39]


> * ©   (03.09.11 20:40) [38]


Видимо, есть не только старая школа, но еще и древняя


 
TUser ©   (2011-09-04 21:16) [40]

А зачем делают переменную в цикле беззнакового типа? Приключений в жизни мало?


 
Игорь Шевченко ©   (2011-09-04 22:05) [41]

TUser ©   (04.09.11 21:16) [40]

Всякое бывает нужно, зависит от других параметров цикла.
Например в цикле

for I:=одно беззнаковое значение to другое беззнаковое значение do

I должна быть объявлена без знака.


 
asail ©   (2011-09-04 23:26) [42]


> Игорь Шевченко ©   (04.09.11 22:05) [41]

> I должна быть объявлена без знака

Не понял... Почему "должна"? Чем такое плохо?
var i: Integer;
for i := 1 to 10 do something;


> TUser ©   (04.09.11 21:16) [40]

> А зачем делают переменную в цикле беззнакового типа?

Напрмер, если нужен цикл, скажем, на 200 итераций... Можно взять беззнаковый Byte или знаковый Integer, что явно излишне. Ну, или где-то надо брать знаковый Int64 вместо Cardinal (Integer может быть недостаточно)... Но, конечно, при сегодняшних объемах памяти кто будет такое ерундой заморачиваться?


 
Германн ©   (2011-09-04 23:45) [43]


> Напрмер, если нужен цикл, скажем, на 200 итераций... Можно
> взять беззнаковый Byte или знаковый Integer, что явно излишне.
>

В большом числе случаев разницы вообще никакой не будет. Да и самой этой переменной в исполняемом коде не будет.


 
Inovet ©   (2011-09-05 00:04) [44]

> [42] asail ©   (04.09.11 23:26)
> Не понял... Почему "должна"? Чем такое плохо?
> var i: Integer;
> for i := 1 to 10 do something;

for i := a to b do something;
a и b могут быть беззнаковые целые


 
Германн ©   (2011-09-05 00:08) [45]


> for i := a to b do something;
> a и b могут быть беззнаковые целые

Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл и посмотри CPU View.


 
Inovet ©   (2011-09-05 00:21) [46]

> [45] Германн ©   (05.09.11 00:08)
> Сделай тестовый пример. Скомпилируй. Поставь брейк на цикл
> и посмотри CPU View.

Я там увижу что-то экзотическое? Надо посмотреть.


 
asail ©   (2011-09-05 00:22) [47]


> Германн ©   (04.09.11 23:45) [43]

> В большом числе случаев разницы вообще никакой не будет

В случае Byte и Integer, действительно не будет, а в случае Cardinal и Int64 - думаю, будет.


 
Германн ©   (2011-09-05 00:30) [48]


> Я там увижу что-то экзотическое? Надо посмотреть.

А то ты не помнишь многочисленные удивлённые вопросы новичков про то, что "типа я задал цикл от 0 до 5, а в отладчике вижу что цикл выполняется в обратном порядке от 5 до 0".
Под переменную цикла в Дельфи очень часто вообще не выделяется память. Ибо нафиг, если её значение не влияет на то, что выполняется в теле цикла.


 
Германн ©   (2011-09-05 00:44) [49]


> Игорь Шевченко ©   (04.09.11 22:05) [41]
>
> TUser ©   (04.09.11 21:16) [40]
>
> Всякое бывает нужно, зависит от других параметров цикла.
>
> Например в цикле
>
> for I:=одно беззнаковое значение to другое беззнаковое значение
> do
>
> I должна быть объявлена без знака.
>

???


 
Игорь Шевченко ©   (2011-09-05 00:53) [50]

Игорь Шевченко ©   (04.09.11 22:05) [41]

Был неправ.

var
 I: Cardinal;
begin
 for I := $7FFFFFFF to $80000001 do
   ...;
end;

var
 I: Integer;
begin
 for I := $7FFFFFFF to $80000001 do
   ...;
end;


не выполняются ни разу


 
Inovet ©   (2011-09-05 01:09) [51]

> [48] Германн ©   (05.09.11 00:30)
> Под переменную цикла в Дельфи очень часто вообще не выделяется память.

Я не о том

> [50] Игорь Шевченко ©   (05.09.11 00:53)
> не выполняются ни разу

Что ли I всегда знаковая?

procedure TForm1.Button1Click(Sender: TObject);
 var
 i: Integer;
 a, b : Cardinal;
begin
 a := $fffffffe;
 b := $ffffffff;
 for i := a to b do ShowMessage(IntToStr(i));
end;

Почему нет предупреждения о присвоении беззнакового знаковому?
-2, -1

Не идентично, но похоже по смыслу

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i;
 unsigned int a, b;
 a = 0xfffffffe;
 b = 0xffffffff;
 for (i = a; i <= b; i++)
 {
   ShowMessage(i);
 }
}

хотя бы получаю [BCC32 Warning] Unit1.cpp(23): W8012 Comparing signed and unsigned values
и цикл
-2, -1, 0, 1, ...


 
Игорь Шевченко ©   (2011-09-05 01:13) [52]


> Почему нет предупреждения о присвоении беззнакового знаковому?


есть.

var
 I: Integer;
begin
 for I := $80000000 to $80000001 do
   ...;
end;


[Pascal Warning] main.pas(35): W1012 Constant expression violates subrange bounds

А так - нету:

var
 I: Cardinal;
begin
 for I := $80000000 to $80000001 do
   ...;
end;


 
Германн ©   (2011-09-05 01:17) [53]


> Inovet ©   (05.09.11 01:09) [51]
>
> > [48] Германн ©   (05.09.11 00:30)
> > Под переменную цикла в Дельфи очень часто вообще не выделяется
> память.
>
> Я не о том
>
>

Ну как же не о том?
Именно о том!
Ты не исходник на СИ приводи. Ты посмотри на "исполняемый код"!


 
Inovet ©   (2011-09-05 01:17) [54]

> [52] Игорь Шевченко ©   (05.09.11 01:13)
> есть.
>
> var
> I: Integer;
> begin
> for I := $80000000 to $80000001 do
>   ...;
> end;

А с переменными беззнаковыми вместо констант.


 
Inovet ©   (2011-09-05 01:23) [55]

> [53] Германн ©   (05.09.11 01:17)
> Ты посмотри на "исполняемый код"!

Смотрел, вычитается нижняя граница из верхней сохраняется в сщётчик, и отдельно переменная цикла имеется.

Unit1.pas.31: a := $fffffffe;
004BD9D7 C745F4FEFFFFFF   mov [ebp-$0c],$fffffffe
Unit1.pas.32: b := $ffffffff;
004BD9DE C745F0FFFFFFFF   mov [ebp-$10],$ffffffff
Unit1.pas.33: for i := a to b do ShowMessage(IntToStr(i));
004BD9E5 8B45F4           mov eax,[ebp-$0c]
004BD9E8 8B55F0           mov edx,[ebp-$10]
004BD9EB 2BD0             sub edx,eax
004BD9ED 7C22             jl $004bda11
004BD9EF 42               inc edx
004BD9F0 8955EC           mov [ebp-$14],edx
004BD9F3 8945F8           mov [ebp-$08],eax
004BD9F6 8D55E4           lea edx,[ebp-$1c]
004BD9F9 8B45F8           mov eax,[ebp-$08]
004BD9FC E877E8F5FF       call IntToStr
004BDA01 8B45E4           mov eax,[ebp-$1c]
004BDA04 E8AB9EFEFF       call ShowMessage
004BDA09 FF45F8           inc dword ptr [ebp-$08]
004BDA0C FF4DEC           dec dword ptr [ebp-$14]
004BDA0F 75E5             jnz $004bd9f6


 
Игорь Шевченко ©   (2011-09-05 01:30) [56]


> 004BD9ED 7C22             jl $004bda11


Для случая беззнаковых переменных должно быть
jb $004bda11


 
Германн ©   (2011-09-05 01:56) [57]


>  Inovet ©   (05.09.11 01:23) [55]
>
> > [53] Германн ©   (05.09.11 01:17)
> > Ты посмотри на "исполняемый код"!
>
> Смотрел, вычитается нижняя граница из верхней сохраняется
> в сщётчик, и отдельно переменная цикла имеется.
Ещё вопросы есть?
:)
А ты убери  из кода  ShowMessage.


 
Inovet ©   (2011-09-05 02:41) [58]

> [57] Германн ©   (05.09.11 01:56)
> Ещё вопросы есть?

Что присвоишь, то и получишь.


 
Anatoly Podgoretsky ©   (2011-09-05 10:32) [59]

> Игорь Шевченко  (05.09.2011 01:13:52)  [52]

Так первый случай вообще то бессмысленный, 0 иттераций, в отличии от
второго.
Кроме того у кодогенератора Дельфи есть проблемы с граничными значениями
Integer, а тут одно из них - MinInt



Страницы: 1 2 вся ветка

Текущий архив: 2011.12.25;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.008 c
2-1315895287
KIR@PRO
2011-09-13 10:28
2011.12.25
TComboBox vs PStrings


2-1316110480
alexdn
2011-09-15 22:14
2011.12.25
Rave reports и edit


2-1316479455
FZT
2011-09-20 04:44
2011.12.25
ПРоблемы с указателями


9-1189541217
antonn
2007-09-12 00:06
2011.12.25
Конкурс по написанию игр на Дельфи


15-1315427389
Юрий
2011-09-08 00:29
2011.12.25
С днем рождения ! 8 сентября 2011 четверг