Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 11:07   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Злость Странность в условии

Я не могу понять, как делфи обрабатывает это:
Код:
for z := 1 to 4 do
  if (RoomW[x + Xss[z], y + Yss[z]] = 0) and
  (Room[x + Xss[z], y + Yss[z]] = 0) and
  TestFrom(Xss[z], Yss[z]) then
Во-первых, z начинает считаться с 4 до 1, но это еще ладно. Вначале оно работает нормально (это все находится еще в одном цикле), но в определенный момент глючит. Я из под F7 выписал все значения -
Код:
if (RoomW[2 + 1, 6 + 0] = 0) and //Действительно, RoomW[3,6] = 0
(Room[2 + 1, 6 + 0] = 0) and //Действительно, Room[3,6] = 0
TestFrom(Xss[z], Yss[z]) then //По выполнению функции было бы True
Но оно просто не вызывает TestFrom и считает, что результат - FALSE, как это вообще возможно?!
k1r1ch вне форума Ответить с цитированием
Старый 03.11.2009, 11:12   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1
2 проверьте еще раз условие
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.11.2009, 11:17   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но оно просто не вызывает TestFrom
Правильно. Оптимизатор не выполняет проверки дальше если текущая дала false
Если (RoomW[x + Xss[z], y + Yss[z]] = 0) = False то при таком условии оптимизатор однозначно не захочет проходить (Room[x + Xss[z], y + Yss[z]] = 0) and TestFrom(Xss[z], Yss[z]), и правильно делает - ибо все равно в результе будет False.
Ты выбрал неверную стратегию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2009, 11:22   #4
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Но они все дают true!
k1r1ch вне форума Ответить с цитированием
Старый 03.11.2009, 11:28   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

приведите полный код
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.11.2009, 11:37   #6
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Код:
program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TFrom = record
    X: integer;
    Y: integer;
  end;
const
  Xss: array [1..4] of integer = (1, -1, 0, 0);
  Yss: array [1..4] of integer = (0, 0, 1, -1);
  DOOR = 0;
  WALL = 1;
var
  Inp: Text;
  Width, Height, Moves, x, y, i, z, XS, YS, XE, YE: integer;
  Room, RoomW: array [1..100, 1..100] of integer;
  Temp: char;
  From: TFrom;

function TestFrom(CX, CY: integer): boolean;
begin
  TestFrom := false;
  if From.X <> 0 then
    if CY <> From.X then TestFrom := true;
  if From.Y <> 0 then
    if CX <> From.Y then TestFrom := true;
  if (From.X = - CX) and (From.Y = - CY) then
    TestFrom := false;
end;

procedure BossDoor(X, Y: integer);
var i: integer;
begin
  for i := 1 to 4 do
    if Room[X + Xss[i], Y + Yss[i]] = DOOR then
      begin
        XE := X + Xss[i];
        YE := Y + Yss[i];
        Break;
      end;
end;

procedure ClercDoor(X, Y: integer);
var i: integer;
begin
  for i := 1 to 4 do
    if Room[X + Xss[i], Y + Yss[i]] = DOOR then
      begin
        XS := X + Xss[i];
        YS := Y + Yss[i];
        From.X := Xss[i];
        From.Y := Yss[i];
        Break;
      end;
end;

begin
  try
    Assign(Inp, 'C:\Documents and Settings\Пользователь\Рабочий стол\TP\BIN\School\Input.txt');
  Reset(Inp);
  Readln(Inp, Height, Width);
  for x := 1 to Height * 2 + 1 do
    begin
      for y := 1 to Width * 2 + 1 do
        begin
          Read(Inp, Temp);
          case Temp of
            '+', '-', '|': Room[x, y] := WALL;
            '.': Room[x, y] := DOOR;
            'C': begin XS := x; YS := y end;
            'B': begin XE := x; YE := y end;
          end;
        end;
      Readln(Inp);
    end;
  ClercDoor(XS, YS);
  BossDoor(XE, YE);
  Close(Inp);
  for x := 1 to Height * 2 + 1 do
    begin
      for y := 1 to Width * 2 + 1 do
        Write(Room[x, y], ' ');
      Writeln;
    end;
  RoomW[XS, YS] := 1;
  i := 1;
  repeat
    Inc(i);
    for x := 1 to Height * 2 + 1 do
      for y := 1 to Width * 2 + 1 do
        if RoomW[x, y] = i - 1 then
          for z := 1 to 4 do
            if (RoomW[x + Xss[z], y + Yss[z]] = 0) and
            (Room[x + Xss[z], y + Yss[z]] = 0) and
            TestFrom(Xss[z], Yss[z]) then
              begin
                RoomW[x + Xss[z], y + Yss[z]] := i;
                From.X := Xss[z];
                From.Y := Yss[z];
              end;
    if i = Width * Height then
      begin
        Writeln('No way!');
        readln;
        Exit;
      end;
  until RoomW[XE, YE] > 0;
  Moves := i - 1;
  Writeln('Total moves: ', Moves);
  readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Это волновой алгоритм на графе; лабиринт во вложении.
Кстати, я условие как-то писал, но мне никто не ответил и я сам решать начал - вот оно
Вложения
Тип файла: txt Input.txt (66 байт, 116 просмотров)
k1r1ch вне форума Ответить с цитированием
Старый 03.11.2009, 11:42   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но они все дают true!
Ты в этом точно уверен?
Поставь точку прерывания на этот IF и посмотри кто что дает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2009, 11:48   #8
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Ну я числа на бумажке подставил и да, все дают TRUE
k1r1ch вне форума Ответить с цитированием
Старый 03.11.2009, 11:54   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
k1r1ch
Не пойму... Запустил твой код - все работает.
При каких значений счетчиков циклов прога глючит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2009, 11:58   #10
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Как работает то, пишет No way в смысле? Или прямо кол-во ходов?
k1r1ch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странность POST-запроса Voody Работа с сетью в Delphi 4 21.07.2009 20:39
String - странность или кривые руки elsin Общие вопросы Delphi 12 29.01.2009 02:17
Проблема в условии.. POPOV Общие вопросы C/C++ 6 25.12.2007 13:39
Ошибка в условии запроса boks SQL, базы данных 4 25.10.2007 10:43