Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
#1

Функция изменяет матрицу в Delphi - Delphi

18.03.2013, 11:37. Просмотров 603. Ответов 10
Метки нет (Все метки)

Добрый день. Пишу программу по теории групп и внезапно появилась проблема, что на определенном шаге в функции передаваемая по значению матрица изменяется и программа вылетает. Происходит не при любых значениях.

В процессе отладки заметил, что это происходит после выполнения функции SetLength(c,n,n);
Изменяется матрица a, которая вроде бы не при делах.
http://www.cyberforum.ru/delphi-beginners/thread151191.html
0
Миниатюры
Функция изменяет матрицу в Delphi   Функция изменяет матрицу в Delphi   Функция изменяет матрицу в Delphi  

Вложения
Тип файла: rar Редактор группы матриц.rar (176.8 Кб, 5 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 11:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция изменяет матрицу в Delphi (Delphi):

В VB есть функция DoEvents, какая подобная функция есть в Delphi?
В Visual Basic'е есть функция DoEvents, какая подобная функция есть в Delphi?

транспонировать матрицу в delphi
транспонировать матрицу x(m,n)

Сформировать матрицу в delphi
сформировать квадратную матрицу порядка n по задан- ному образцу

Построить квадратную матрицу порядка 2n Delphi
Построить квадратную матрицу порядка 2n.

Умножение вектора-строки на матрицу в Delphi
Помогите пожалуйста написать код для вычисления умножение вектора-строки на...

10
unick12345
1341 / 1032 / 149
Регистрация: 27.03.2009
Сообщений: 3,846
18.03.2013, 11:54 #2
не подскажешь, а зачем тебе такая большая размерность mat_st?
0
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
18.03.2013, 11:58  [ТС] #3
Цитата Сообщение от unick12345 Посмотреть сообщение
не подскажешь, а зачем тебе такая большая размерность mat_st?
с большой размерностью я закомментировал, я там просто экспериментировал, но уже не помню, что делал с этой матрицей.
0
unick12345
1341 / 1032 / 149
Регистрация: 27.03.2009
Сообщений: 3,846
18.03.2013, 11:59 #4
меня интересует функция newmatrix. как я понял всегда результат возвращает true.
0
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
18.03.2013, 12:03  [ТС] #5
Цитата Сообщение от unick12345 Посмотреть сообщение
меня интересует функция newmatrix. как я понял всегда результат возвращает true.
эту функцию я высмотрел на этом сайте, она генерирует новую матрицу. работает вполне правильно, возвращает true всегда, кроме последнего варианта, когда все элементы матрицы максимальны
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.03.2013, 14:19 #6
Almaz1992, в программе происходят нарушения в базе адресов менеджера памяти. Это происходит в коде, где идёт работа с массивом Clas. В этот массив записываются указатели на матрицу Mat, а также происходят изменения размеров Clas. Если в массив Clas не записывать указатели на массив Mat, то ошибок не будет:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure TForm1.Start;
var i,j,k,ch:integer; Mat:TMatrix; was:boolean;
begin
 m:=StrToInt(Edit1.Text); //Количество элементов (по модулю вычетов)
 n:=StrToInt(Edit2.Text); //Размерность матриц
 SetLength(Mat,n,n);  k:=0;
 for i:=0 to n-1 do
  for j:=0 to n-1 do
   Mat[i,j]:=0;
 //Все возможные варианты матриц
 kol:=0;
 SetLength(c,2,1);
 c[0,0]:=0;
 c[1,0]:=0;
 SetLength(clas,1,1);
 while NewMatrix(Mat) do
 begin
  k:=k+1;
  SetLength(mat_st,k+1);
  if det(Mat,n)=1 then
  begin
   ch:=poryadok(Mat);
   mat_st[k]:=ch;
   if simple(ch) then
   begin
    was:=false;
    for i:=0 to kol do
     if c[0,i]=ch then
     begin
      was:=true;
      inc(c[1,i]);
      SetLength(clas,kol+1,c[1,i]);
      //clas[i,c[1,i]]:=Mat; //Отключено на время отладки.
     end;
    if not was then
    begin
     kol:=kol+1;
     SetLength(c,2,kol+1);
     c[0,kol]:=ch;
     inc(c[1,kol]);
     SetLength(clas,kol+1,c[1,kol]+1);
     //clas[kol,c[1,kol]]:=Mat; //Отключено на время отладки.
    end;
   end;
  end
  else mat_st[k]:=0;
 end;
 Caption:=IntToStr(kol);
 //Caption:=inttostr(c[1])+' '+inttostr(c[2])+' '+inttostr(c[3])+' '+inttostr(c[4])+' '+inttostr(c[5]);
end;
1
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
18.03.2013, 14:23  [ТС] #7
Mawrat, Спасибо!
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.03.2013, 14:33 #8
Цитата Сообщение от Almaz1992 Посмотреть сообщение
появилась проблема, что на определенном шаге в функции передаваемая по значению матрица изменяется
Кстати, в программе используются динамические массивы, а в этом случае передача такого массива по значению не защитит данные массива от изменений. Потому что на самом деле передаётся только значение указателя на массив. И внутри процедуры данные массива через этот указатель могут быть изменены обычным образом.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TArr = array of Integer;
 
procedure test(a : TArr);
var
  i : Integer;
begin
  for i := 0 to High(a) do a[i] := 1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  a : TArr;
  i : Integer;
begin
  Memo1.Clear;
 
  SetLength(a, 10);
  Test(a);
  for i := 0 to High(a) do
    Memo1.Lines.Add(IntToStr(a[i]));
end;
В этом коде процедура Test() поменяет значения элементов динамического массива, хотя этот массив передаётся по значению.

Добавлено через 2 минуты
И даже, если объявить параметр, как const - это тоже не защитит данные динамического массива от изменений в процедуре:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TArr = array of Integer;
 
procedure test(const a : TArr);
var
  i : Integer;
begin
  for i := 0 to High(a) do a[i] := 1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  a : TArr;
  i : Integer;
begin
  Memo1.Clear;
 
  SetLength(a, 10);
  Test(a);
  for i := 0 to High(a) do
    Memo1.Lines.Add(IntToStr(a[i]));
end;
0
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
18.03.2013, 14:36  [ТС] #9
Ну насчет прямых изменений понятно, я просто не мог понять, почему меняется массив при изменении других элементов
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.03.2013, 14:39 #10
И ещё, на время отладки надо отключать режим оптимизации:
Project - Options... - закладка Compiler:
- Optimization - убрать галочку.
- Debug Information - поставить галочку.
Еще на время отладки можно поставить галочки:
- I/O Checking
- Range Checking
После этого перекомпилировать проект.

Добавлено через 31 секунду
Цитата Сообщение от Almaz1992 Посмотреть сообщение
Ну насчет прямых изменений понятно, я просто не мог понять, почему меняется массив при изменении других элементов
Ясно. Я на всякий случай об этом упомянул.
0
Almaz1992
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 6
18.03.2013, 14:40  [ТС] #11
Цитата Сообщение от Mawrat Посмотреть сообщение
И ещё, на время отладки надо отключать режим оптимизации:
Project - Options... - закладка Compiler:
- Optimization - убрать галочку.
- Debug Information - поставить галочку.
Еще можно поставить галочки:
- I/O Checking
- Range Checking
Спасибо, учту
0
18.03.2013, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 14:40
Привет! Вот еще темы с решениями:

DELPHI функция
Добрый день, помогите с ответом. Задание: написать Fctg, используя Fsin и...

Функция в Delphi
Создал функцию в Delphi, но как правильно реализовать помогите :) В паблик...

Функция Лапласа в Delphi
Подскажите, пожалуйста, в чем проблема? Выдаёт ошибку Error: local...

Функция return (delphi)
Подскажите, есть ли функция return (delphi) для окончания выполнения дочерней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru