Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в delphi 7 [D7, WinXP]


Страницы:   1 2 3 4 5 6 7

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). И код получается вполне удобочитаемым и главное по коду сразу видно алгоритм, за это мне и нравится паскаль.


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо