Текущий архив: 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