![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в delphi 7 [D7, WinXP]
Sicilla © (2004-11-17 18:34:00)Привет всем. Постваил себе delphi 7 взамен delphi 5. delphi 5 не удалял. И теперь ошибка: при отладке F7 например в переменной i значение 2, а кажет, что там 10 или -5. Хотя считает правильно в целом.
Sicilla (2004-11-18 15:16:00) [81]Вот и я так думаю. Но все-таки видно это глюк в delphi 7. Delphi 5 мне больше нравился. Но от прогресса не уйдешь. А что касается строки j := num - ini.kol_prov, то мне надо было просто узнать знак разности, т.е. что из них больше. А читать всех интересно. Надо бы это все куда-нибудь опубликовать:))) Большое всем спасибо!!!
Amoeba (2004-11-18 15:03:00) [82]Странно всё это. Ошибок в коде не видно. Есть, правда, пара шероховатостей.
j := num - ini.kol_prov; // отсюда глюки
Эта строка лишняя, т.к. в предыдущем цикле значения num и ini.kol_prov не изменяются.
...
end;
if j < 0 then
begin
....
Это лучше переписать так:
...
end
else if j < 0 then
begin
...
Что же касается существа дела, то просто мистика какая-то.
Sicilla (2004-11-18 14:39:00) [83]Короче мужики! Кто нибудь скажет в чем проблема??? См. вопрос.
Anatoly Podgoretsky (2004-11-18 09:51:00) [84]Palladin © (18.11.04 00:42) [31]
Равносильно глобальным переменным
Palladin (2004-11-18 02:10:00) [85]У меня на одно сравнение меньше :)
И мне понятней. Но это уже ИМХО.
Defunct (2004-11-18 02:07:00) [86]> относительно break и continue..
> Всегда предпочитаю их использовать вместо сложных if в цыклах с ветвлениями.
Кому как, меня, например, от асм'a уже подташнивает, потому и не люблю пользоваться ни break ни exit ни goto.
> Palladin © (18.11.04 01:48) [49]
Для таких случаев у меня всегда используется while
a:array of string;
Function FindS(Const S:String):Integer;
Var
i:Integer;
Begin
i := 0;
while (A[i]<>S) and (i<Length(A)) do inc(i);
if i<Length(A) then Result := i
else Result := -1
End;
Ihor Osov'yak © (18.11.04 01:54) [52]
> Надежный код - всегда красивый.
Золотые слова.
Ihor Osov'yak (2004-11-18 01:54:00) [87]2 [51] Defunct © (18.11.04 01:50)
> А смысл? Разве здесь состязание по красоте кода?
Надежный код - всегда красивый.
>Скажите лучше по сути 22A или 36, что нагляднее?
надежнее 36. Но новичку он может быть неочевидным. Я все же дал-бы предпочнетие 36. Тем более, он написан по всем классическим канонам.
Defunct (2004-11-18 01:50:00) [88]> Palladin © (18.11.04 01:36) [46]
Это были мысли в слух. А вы тут уже атомную войну заметили ;)
> Ihor Osov'yak © (18.11.04 01:38) [47]
> зы. код в 22А и 36 намного прозрачнее.
А смысл? Разве здесь состязание по красоте кода?
Скажите лучше по сути 22A или 36, что нагляднее?
Imho 36.
Ihor Osov'yak (2004-11-18 01:49:00) [89]относительно break и continue..
Всегда предпочитаю их использовать вместо сложных if в цыклах с ветвлениями. И даже довольно часто вместо многослолойных if (либо вместо генерации исключения с целью прерывания последовательности кода) делаю псевдоцыклы c break, примерно так:
repeat // psewdoloop
..
if что-то1
then
break;
...
if что-то2
then
break;
...
Break;
until false;
в старом-добролм паскале до появления break в аналогичных ситуациях соотв. псевдоцыклы оформлял как процедуры с exit в соотв. местах.
Впрочем, иногда сейчас также использую аналогичную технику.
Конечно, с точки зрения читабельности желательно делать примерно так -
try
..
if что-то1
then
Abort;
...
if что-то2
then
Abort;
...
except
..
end;
Но учитывая что обработка исключения немного ресурсоемкая операция, то все же даю предпочтение двум упомянутым выше способам.
Palladin (2004-11-18 01:48:00) [90]Я его использую... и очень часто...
Function FindS(Const S:String):Integer;
Var
i:Integer;
Begin
Result:=-1;
For i:=0 to high(a) do
If a[i]=S Then
Begin
Result:=i;
Break;
End;
End;
a:array of string;
Defunct (2004-11-18 01:43:00) [91]> Дык, тоже Exception. Ты же сам произнес слово "ошибка".
Черт его знает.
IMHO уровень ошибки не столь высок чтобы в Exception превратиться ;>
> Palladin © (18.11.04 01:33) [45]
> Цикл принципально так и реальзиван
> Но он - это первое, что пришло мне в голову для примера оправданного использования Break... :)
Вот видите, зачем же предлагать Break, если сами его не используете. :)
Ihor Osov'yak (2004-11-18 01:38:00) [92]2 [39] Defunct © (18.11.04 01:15)
>while NoError do
NoError :=
IsDeviceConnected and
ReadCommand and
ProceedCommand and
DeviceConnected and
WriteCommand
> И Break по сути не нужен.
хм... а как относительно опции "Complete boolean eval"?
зы. код в 22А и 36 намного прозрачнее.
Palladin (2004-11-18 01:36:00) [93]
> Скажем, ввести что-то типа ErrorCount
А зачем? При добавлении единицы задачи вводить каждый раз новую переменную, которая будет что то значить? И что бы потом мудрить с комбинациями этих переменных? И народить такую лапшу, которой даже Goto позавидует?
Palladin (2004-11-18 01:33:00) [94]
> [41] Игорь Шевченко © (18.11.04 01:20)
Ну да. Когда в ранней молодости я понаписал пару-тройку продуктов способом кодовой пластмассы, ко мне тоже вскоре откровение пришло... :)
Цикл принципально так и реальзиван как и Ваше решение... Но он - это первое, что пришло мне в голову для примера оправданного использования Break... :)
Игорь Шевченко (2004-11-18 01:30:00) [95]
> Ошибка же может быть не только из-за того что девайс не
> подключен. Может быть, что код команды в ProceedCommand
> левый попал.
Дык, тоже Exception. Ты же сам произнес слово "ошибка".
Defunct (2004-11-18 01:29:00) [96]> Но если это все таки функция, которая возвращает результат выполнения команды?
Тогда пришлось бы построить тело цикла подругому.
Скажем, ввести что-то типа ErrorCount.
> вы уверены, что команды выполнятся именно в том порядке в котором они записаны?
Да, можете попробовать с отладчиком. После первого результата False запуск функций прекращается.
> Кто его знает, этот оптимизатор...
Не влияет. И от версии делфи не зависит.
> у вас ушло времени гораздо больше чем у меня на вариант A)... Как вы думаете... Это хорошо?
Нет, думаю, что плохо понял алгоритм A) поэтому долго провозился. Насторожило меня там IsDeviceConnected и DeviceConnected. Ну и про обязательный порядок функций я тоже не знал...
Игорь Шевченко © (18.11.04 01:02) [36]
А я бы написал все же
while NoError do ...
Ошибка же может быть не только из-за того что девайс не подключен. Может быть, что код команды в ProceedCommand левый попал.
Игорь Шевченко (2004-11-18 01:23:00) [97]
> Если уж полностью соблюсти логику примера A)
> И Break по сути не нужен.
Да нет, на мой взгляд, ты ухудшил код, введя совершенно ненужную конструкцию - сделав из процедуры ProceedCommand функцию, возвращающую всегда одно значение.
Игорь Шевченко (2004-11-18 01:20:00) [98]Palladin © (18.11.04 01:11) [38]
Извиняюсь :) Для меня, начиная с какого-то момента, самым главным критерием кода стала его удобочитаемость, до такой степени, чтобы глядя на чужой код, я мог быстро понять, что он делает. Это относится к названиям методов и свойств объектов, к именам переменных и классов, к оформлению кода (отступы, единый стиль) и т.д.
Поскольку обычно на код смотреть приходится, когда он либо работает не так, как задумывалось, либо его приходится изменять под изменившиеся требования окружающей среды, читаемость кода является основным критерием :)
Palladin (2004-11-18 01:19:00) [99]IsDeviceConnected и DeviceConnected - аналогичны... просто во второй раз Is забыл написать...
Defunct (2004-11-18 01:15:00) [100]Игорь Шевченко © (18.11.04 00:55) [35]
> гарантировано работает не так, как оригинал.
Я не знаю как работает оригинал, потому что не знаю сколько там устройств на самом деле. Начало DeiveConnect и секция finally дает понять, что устройство одно, но почему-то присутствует две функции IsDeviceConnected и DeviceConnected. Спрашивается зачем две функции когда устройство одно? Если уж полностью соблюсти логику примера A) получим:
while NoError do
NoError :=
IsDeviceConnected and
ReadCommand and
ProceedCommand and
DeviceConnected and
WriteCommand
И Break по сути не нужен.
> Такие советы давались на заре программирования или в эпоху структурного программирования.
Возможно.
> что введение операторов управления улучшает удобочитаемость кода.
IMHO для кого как.
Вот хоть я в основном и пищу на асм (а там сами понимаете сплошные "goto"), но когда дело касается паскаля стараюсь соблюдать рекомендации прошлого (пишу без использования Break, Cont., goto, exit). И код получается вполне удобочитаемым и главное по коду сразу видно алгоритм, за это мне и нравится паскаль.