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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2008, 12:42   #1
master_root
Пользователь
 
Регистрация: 18.05.2008
Сообщений: 30
Восклицание Непонятное поведение алгоритма

вот код:
Код:
{функция возрощает строку, которая содержит самую длиную последовательность,
 которая повторяется в массиве N раз}
function GetMaxSeq(arr: array of integer; N: integer): string;
type
  RmaxM = Record
    index: integer;// i-индекс, с которого начинается в массиве очередная последовательность
    length: integer;// j-длина последовательности
  end;
var
  maxM: RmaxM;
  i,j,z,j1,z1: integer;
  M: integer;//число повторений последовательности
  eq: boolean;
  tmp_result: string;//строка,в которой формируется результат функции
begin
{инициализация переменных - присваивание начальных значений}
  maxM.index:=0;
  maxM.length:=1;
  tmp_result:='';
  eq:=false;
  for i := 1 to Length(arr) do//перебор всех возможных длин в массиве
  begin
    M:=1;
    j:=0;
    {поиск}
    repeat// j изменение отсчётного индекса посделовательности
      z:=0;
      repeat//z изменение индекса последовательности с которой сравнивается текущая последовательность
        if z<>j then//если индексы не совпадают то сравниваем соответствующие последовательности
        begin
          z1:=z;
          for j1 := j to i do//перебор элементов в последовательностях, которые сравниваются
          begin
            if arr[j1]=arr[z1] then//сравнение элементов в последовательностях
            begin
              eq:=true;
              z1:=z1+1;
            end
            else
            begin
              eq:=false;
              z1:=z1+1;
              break;
            end;
          end;
          if eq = true then M:=M+1;//если все элементы совпали в последовательностях, то увеличиваем счётчик вхождения
        end
        else
        z:=z+1;
        until z=Length(arr)-i;
        if M=N then//если счётчик вхождений совпадает с нужным числом вхождений, то
        begin
          if maxM.length<i then//и если длина последовательности больше текущей, то
          begin
            //записываем параметры новой более длинной последовательности
            maxM.length:=i;
            maxM.index:=j;
          end;
        end;
    until j=Length(arr)-i;
  end;
{формируем результат в виде строки, которая содержит элементы
самой длиной последовательности}
  for i:=maxM.index to maxM.index+maxM.length do
    tmp_result:=tmp_result+inttostr(arr[i]);
  result:=tmp_result;//вывод результата
end;
при прогоне программы пошагово после сравнения:
Код:
 if arr[j1]=arr[z1] then//сравнение элементов в последовательностях
            begin
              eq:=true;
              z1:=z1+1;
            end
            else
            begin
              eq:=false;
              z1:=z1+1;
              break;
            end;
переменная z1 теряет своё значение и BDS говорит что она неопределена. Получается бесконечный цикл. С чем это связано? Объясните пожалуйста
master_root вне форума Ответить с цитированием
Старый 06.06.2008, 13:13   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

z1 здесь не причем:

Код:
    repeat
        if z<>j then begin  
           ... // а здесь z не меняется - следующее сравнение z <> j = true
           ... // отсюда бесконечный цикл
        end else  
        z:=z+1;   
    until z=Length(arr)-i;
alexBlack вне форума Ответить с цитированием
Старый 11.06.2008, 14:05   #3
master_root
Пользователь
 
Регистрация: 18.05.2008
Сообщений: 30
По умолчанию

так то оно так, но переменная z1 в этом месте теряет своё значение:
компилятор при трассировке выдаёт:
variable 'z1' inaccessible here due to optimization
master_root вне форума Ответить с цитированием
Старый 11.06.2008, 14:32   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
master_root
Отключи оптимизацию. {$o-} в начале кода где эта переменка не используется и если надо {$o+} в его конце.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Независимое поведение форм Alter Общие вопросы Delphi 2 25.07.2008 22:12
SetFocus!!!Нужен ответ!Творится,что-то непонятное!!! Alexij Общие вопросы Delphi 4 14.06.2008 14:59
Странное поведение ПОИСКПОЗ ZORRO2005 Microsoft Office Excel 5 19.05.2008 14:02
Непонятное поведение программы на Delphi Kashp Помощь студентам 10 14.12.2007 21:12