IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> "Услужливый компилятор", Злая шутка Delphi 3
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 206
Пол: Мужской

Репутация: -  3  +


Пишу я маленькую программку на Delphi 3. В этой программе у меня есть двумерный массив 4х4, заполненный цифрами от 0 до 15 (угадайте, что за прога?). И мне нужно проверить, расположены ли эти цифры в массиве таким вот образом:
Цитата
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 0

(...правильно! игра в "15")
Я, не особо крутой программер, решил этот вопрос примерно так:
Код

i:=1;
result := false;
for х:=1 to 4 do
for у:=1 to 4 do
begin
if i<16 then
 begin
  if pole[x][y] <> i then exit;
  i := i+1;
 end;
end;
result := true;

imho должно работать. Не работает! Лезу в отладчик, смотрю значения переменных х и у. Что за лажа... в первой же итерации х=4, и у=4. Во второй итерации х=3, у=4. Протираю глаза, смотрю в код - да нет же! У меня там нет никакого downto! А прога работает так, будто у меня цикл построен с убыванием индексов. Ладно. Может, я и идиот. Вывожу значения х не только в отладчике, а еще пишу их в caption формы. Ага! Теперь х пошел от 1 до 4, а вот у по-прежнему считается от 4 до 1. Нормально? Если я в программе написал for y:=1 to 4 do, то я вообще-то рассчитываю, что программа именно это и сделает! Даже если я отвернулся! ;) И не компиляторова ума это дело втихаря мой код переиначивать! Даже если он дурацкий! Что ли, отключить оптимизацию в опциях компилятора?...
...слегка поостыв, вижу в своем коде ошибочку... таки я идиот... циклы по х и по у надо поменять местами. Меняю... Опа! Прога заработала, так, как я и хотел. Но почему в отладчике индексы идут по-прежнему "задом наперед"??? Это ж еще зачем???? Чтобы не быть голословным, даю скриншот. Самая первая итерация цикла. По замыслу должно быть х=1, у=1, i=1, Pole[x][y]=1. В отладчике - то, что на скрине. х=4, у=4, i=1, Pole[x][y]=0. Но прога при этом работает "по замыслу", вот что меня убивает. Если бы отладчик был прав, то был бы выход из процедуры. А его не происходит. Не, забью я на программирование... пойду в балерины...

Сообщение отредактировано: Бродяжник -


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Аналогичные эффекты наблюдаются и в Delphi 5. Вообще, один из самых популярных продуктов Borland при детальном рассмотрении просто поражает множеством изощренных решений - как подсказывает интуиция (разум пасует!) с целью оптимизации... (в частности, в недрах VCL) smile.gif


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


запиши условие так:
if poly[x,y]<>x+(y-1)*4 then ...
правда если вдруг понадобится поменять порядок цифр, формулу придется изменить
а вообще оптимизатор не должен переворачивать цикл, если его счетчик используется в теле этого цикла... вот если не используется - тогда да...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






А разве можно массив писать так: poly[x][y]?

Сообщение отредактировано: APAL -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


в Дельфи можно... а в Си вроде вообще только так и надо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Можно и в BP. Так или иначе, "строка" m-мерного массива может быть рассмотрена компилятором как одномерный массив.

Сообщение отредактировано: xds -


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 15.05.2024 20:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name