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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2011, 14:54   #1
GBAXA
Пользователь
 
Аватар для GBAXA
 
Регистрация: 06.05.2010
Сообщений: 73
По умолчанию Ошибка при работе с динамическими массивами

Не могу понять в чем проблема.
Есть класс матрицы и функция которая ищет алгебраическое дополнение. В ней непонятная ошибка.
Помогите пожалуйста.
Заведомо благодарю!
Вот Функция и тип:
Код:
function AlgDopM(X:TMatrix;i,j:byte):TMatrix;  // Алгебраїчне доповнення матричне
var k,l,n,m:byte;
  begin
try
  n:=0;
  m:=0;
   result.i:=X.i-1;
   result.j:=X.j-1;
   SetLength(result.M,result.i,result.j);

  for k:=0 to X.i-1 do begin
   for l:=0 to X.j-1 do begin
     if (l<>j) and (k<>i) then begin
       result.M[n,m]:=X.M[k,l];
       if n<result.j-1 then n:=n+1 else begin
         n:=0;
         if m<result.i-1 then m:=m+1;
         MessageDlg('AlgDopM',mtInformation,mbAbortIgnore,0);
       end;
     end;
   end;
  end;
except
  MessageDlg('AlgDopM',mtError,mbAbortIgnore,0);
    exit;
end;
 end;
Код:
  TMatrix = record
   i,j:byte;
   M:array of array of real;
  end;
GBAXA вне форума Ответить с цитированием
Старый 29.03.2011, 15:29   #2
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

Цитата:
Сообщение от GBAXA Посмотреть сообщение
Код:
  TMatrix = record
   i,j:byte;
   M:array of array of real;
  end;
в записях как товых нельзя использовать динамические масивы и строки (за исключением когда используется директива $H - объясняет компилятору является ли данная строка динамической, но это уже другой вопрос)..

можно использовать только масивы и строки определенной длины(статические)
lowercase вне форума Ответить с цитированием
Старый 29.03.2011, 15:33   #3
GBAXA
Пользователь
 
Аватар для GBAXA
 
Регистрация: 06.05.2010
Сообщений: 73
По умолчанию

Цитата:
Сообщение от lowercase Посмотреть сообщение
в записях как товых нельзя использовать динамические масивы и строки (за исключением когда используется директива $H - объясняет компилятору является ли данная строка динамической, но это уже другой вопрос)..

можно использовать только масивы и строки определенной длины(статические)
Но в других функциях все в порядке????????????
GBAXA вне форума Ответить с цитированием
Старый 29.03.2011, 15:47   #4
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

а текст ошибки можно привести?
lowercase вне форума Ответить с цитированием
Старый 29.03.2011, 15:58   #5
GBAXA
Пользователь
 
Аватар для GBAXA
 
Регистрация: 06.05.2010
Сообщений: 73
По умолчанию

Благодарю за внимание.
Я уже нашел причину.
Она в потому что массив двумерный но иногда создается как [1..1] то есть с одного элемента.
Теперь не знаю что делать с индексацией таких маленьких массивов, тип нужный тот же , индексация одним числом не разрешается компилятором , а двумя вызывает ошибку??????????????
Капець
GBAXA вне форума Ответить с цитированием
Старый 29.03.2011, 16:03   #6
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

вы описали var M: array of array of real; это значит что каждый елемент динамческого массива M: array так же является динамическим массивом, длину которого надо тоже задать. то есть(например):
setLength(M,20);
setLength(m[0],12);
то есть нужно еще задать длину для каждого елемента (напрмер цыклом)

p.s. хочу добавить об этой строчке:
SetLength(result.M,result.i,result. j);
я уже немножко позабыл, т.к. давно не делал такого, вобщем еси указать два параметра после переменной-масива, то даная процедура задаст индексацию масива от result.i до result.j (но я точно не помню до result.j или до result.j - 1)

Последний раз редактировалось Stilet; 30.03.2011 в 11:57.
lowercase вне форума Ответить с цитированием
Старый 29.03.2011, 19:03   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от справка дельфи
For dynamic arrays, SetLength may take more than one length parameter (up to the number of array dimensions). Each parameter specifies the number of elements along a particular dimension
таки она выставляет размеры двумерного массива, а не диапазоны, как было представлено. первое значени для 2-мерных - "строки", а второе - "столбцы"
phomm вне форума Ответить с цитированием
Старый 29.03.2011, 20:43   #8
GBAXA
Пользователь
 
Аватар для GBAXA
 
Регистрация: 06.05.2010
Сообщений: 73
По умолчанию

Все создается правильно!
Проблема в потому что иногда нужно создавать массив с одного элемента, а тогда этот тип не подходит(
Может можно как-то обойти ограничение компилятора?????
Очень надо!
GBAXA вне форума Ответить с цитированием
Старый 29.03.2011, 20:58   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в Делфи массивы индексируются с нуля.
можно обойти написанием своего класса, и там индексировать с единицы, но это костыль понижающий скорость работы(на пересчет индекса, копейка, но тем не менее)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2011, 21:02   #10
GBAXA
Пользователь
 
Аватар для GBAXA
 
Регистрация: 06.05.2010
Сообщений: 73
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в Делфи массивы индексируются с нуля.
можно обойти написанием своего класса, и там индексировать с единицы, но это костыль понижающий скорость работы(на пересчет индекса, копейка, но тем не менее)
То что массивы индексируются из нуля не проблема, это все учтенной
Проблема в двумерном массиве размерностью один на один
GBAXA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедуры и функции при работе с массивами irina belka Помощь студентам 1 12.12.2010 16:33
Переполненние стека при работе с массивами max&ilja Помощь студентам 2 22.12.2009 22:03
Задача с динамическими массивами _grusha_ Помощь студентам 2 22.04.2009 19:46
Проблема с динамическими массивами Arassir Помощь студентам 2 11.11.2008 00:15