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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2016, 11:20   #1
VADYA12
Новичок
Джуниор
 
Регистрация: 30.03.2015
Сообщений: 1
По умолчанию Проблема с функцией

Возникает ошибка при работе функции. Притом не сразу, а после 2х успешных выполнений. Так для массива 2x2 и 3x3 - всё работает идеально. А с массивами большей размерности вылетает ошибка Access violation на повторный вызов функции в функции.

Код:
type
TMas=Array of Array string;
....
SetLength(Mas,d,d);
....
BufMas:=Variant(BufMas);

function Variant(Mas: TMas): TMas;                                              //Возвращяет перечень главных и побочных диагоналей
var BufMas: TMas;
  v,c,s,l: integer;
begin
  If Length(Mas)=2 then                                                           //массив 2х2 (меньше уже смешно, а больше будет сложнее)
  begin
    SetLength(Result,2);
    SetLength(Result[0],2);
    SetLength(Result[1],2);
    Result[0,0]:=Mas[0,0];  //Главная
    Result[0,1]:=Mas[1,1];  //диагональ;
    Result[1,0]:=Mas[0,1];  //Побочная
    Result[1,1]:=Mas[1,0];  //диагональ;
  end else
  begin
    Setlength(Result,0);  //Я тут забыл очистить память...
    For v:=High(Mas) downto Low(Mas) do begin
      c:=0;
      s:=0;
      SetLength(BufMas,Length(Mas)-1);
      While c<d do begin
        If v<>c then begin
          For l:=Low(BufMas) to High(BufMas) do begin
            SetLength(BufMas[l],s+1);
            BufMas[l,s]:=Mas[l+1,c];                                 //Генерируем массив N-1xN-1 убирая 1-ую строчку и i-ый столбец
          end;
          Inc(s);
        end;
        Inc(c);
      end;
    BufMas:=Variant(BufMas); //Здесь указывается место ошибки!                                                   //Передаем сгенерированный массив снова в эту процедуру пока не будет массив 2х2, ну а при 2х2 всего 2 возможные комбинации
    For c:=Low(BufMas) to High(BufMas) do
    begin
      SetLength(Result,Length(Result)+1);
      SetLength(Result[Length(Result)-1],Length(BufMas[c])+1);
      For s:=Low(BufMas[c]) to High(BufMas[c]) do Result[Length(Result)-1,s]:=BufMas[c,s];                                //Добавляем возможные результаты в нашу функцию (функции будут запускаться много раз, самая первая и будет иметь конечный результат, остальные будут иметь результат на усеченные массивы)
      Result[Length(Result)-1,Length(BufMas[c])]:=Mas[0,v];                     //Добавляем в конец результатов предыдущих функций, нашу переменную в i-ом столбце
    end;
  end;
end;
end;

Последний раз редактировалось Аватар; 11.03.2016 в 11:53.
VADYA12 вне форума Ответить с цитированием
Старый 11.03.2016, 11:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Простите, а зачем весь этот ужас с рекурсией и динамическим созданием массивов?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2016, 15:49   #3
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А мне стало интересно - как он читает в редакторе свои немыслимо длинные строки?
Или у него экран больше 4000 пикселов по ширине?
Или он понятия не имеет о переносе строк?
kropotkina-alice вне форума Ответить с цитированием
Старый 11.03.2016, 15:55   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Он их не читает. Он их пишет.
northener вне форума Ответить с цитированием
Старый 11.03.2016, 16:07   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

оффтоп: Есть мониторы сейчас такие длинные как 2 и разрешение у них прилично, жалко стоит под 60 тыр.
По теме - варианты решения:
1)Уйти от рекурсии чтобы было проще читать код и Вам и Нам. Если все еще будет ошибка Ф7 под палец и вперед.
2)Обьяснить суть этого всего ибо я почти ничего не понял в задаче и тогда можно будет искать варианты ответа.
IvaniuS вне форума Ответить с цитированием
Старый 11.03.2016, 16:48   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
BufMas[l,s]:=Mas[l+1,c];
Ошибка скорее всего здесь - попытка чтения из Mas по не существующему индексу. Ставь бряки и смотри
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с функцией Voldemort93 PHP 1 24.08.2013 21:49
проблема с функцией Madmaxisss Паскаль, Turbo Pascal, PascalABC.NET 5 23.08.2012 13:46
проблема с функцией Си blain Помощь студентам 1 19.02.2012 21:06
Проблема с функцией MeTeOpA C# (си шарп) 6 11.07.2011 00:07
проблема с функцией saix Общие вопросы C/C++ 14 28.10.2010 19:07