Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 161

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
У меня задание написать поток для обращения матрицы методом гауса. Алгоритм я разработал без проблем, но вот с потоком есть проблемы. Вроде все делаю по правилам, по логике.
А проблема в том, что когда доходит программа до создания экземпляра формы, то поднимается класс исключения, говорящий о том, что программа пытается обратиться к не найденым файлам. И ещё проблема в том, что при сохранении проекта, а в последствии его открытия форма куда то пропадает и не открывается!
Подскажите пожалуйста, что я не корректно делаю.
заранее спасибо!
так же прикреплю проект.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, Grids, ExtCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Panel1: TPanel;
  12. GroupBox1: TGroupBox;
  13. GroupBox2: TGroupBox;
  14. StringGrid1: TStringGrid;
  15. StringGrid2: TStringGrid;
  16. GroupBox3: TGroupBox;
  17. Button1: TButton;
  18. Button2: TButton;
  19. GroupBox4: TGroupBox;
  20. Edit1: TEdit;
  21. procedure Edit1Change(Sender: TObject);
  22. procedure Button2Click(Sender: TObject);
  23. procedure FormCreate(Sender: TObject);
  24. procedure Button1Click(Sender: TObject);
  25. private
  26. { Private declarations }
  27. public
  28. { Public declarations }
  29. end;
  30.  
  31. var
  32. Form1: TForm1;
  33.  
  34. implementation
  35. uses unit2;
  36. var
  37. Thread1: TSampleThread;
  38.  
  39. procedure TForm1.Edit1Change(Sender: TObject);
  40. begin
  41. if Edit1.Text<>'' then
  42. begin
  43. StringGrid1.ColCount:=StrToInt(Edit1.Text);
  44. StringGrid1.RowCount:=StrToInt(Edit1.Text);
  45. StringGrid2.ColCount:=StrToInt(Edit1.Text);
  46. StringGrid2.RowCount:=StrToInt(Edit1.Text);
  47. end;
  48. end;
  49.  
  50. procedure TForm1.Button2Click(Sender: TObject);
  51. begin
  52. Application.Terminate;
  53. end;
  54.  
  55. procedure TForm1.FormCreate(Sender: TObject);
  56. begin
  57. Edit1.Text:='5';
  58. end;
  59.  
  60. procedure TForm1.Button1Click(Sender: TObject);
  61. begin
  62. Thread1 := TSampleThread.Create(False);
  63. Thread1.Priority := tpLowest;
  64.  
  65. end;
  66.  
  67. end.
  68.  
  69. {========================================}
  70.  
  71. unit Unit2;
  72.  
  73. interface
  74. uses
  75. Classes, SysUtils;
  76.  
  77. type
  78. TSampleThread = class(TThread)
  79. private
  80. m1: array of array of double;
  81. m2: array of array of double;
  82. n: integer;
  83. protected
  84. procedure Read;
  85. procedure Write;
  86. procedure Execute; override;
  87. end;
  88.  
  89. var
  90. i,j,k: integer;
  91. implementation
  92. uses Unit1;
  93.  
  94. procedure TSampleThread.Write;
  95. begin
  96. for i:=0 to n-1 do
  97. for j:=0 to 2*n-1 do
  98. Form1.StringGrid2.Cells[j,i]:=FloatToStr(m1[i,j]);
  99. end;
  100.  
  101. procedure TSampleThread.Read;
  102. begin
  103. n:=StrToInt(Form1.Edit1.Text);
  104. SetLength(m1,StrToInt(Form1.Edit1.Text),StrToInt(Form1.Edit1.Text));
  105. SetLength(m2,StrToInt(Form1.Edit1.Text),StrToInt(Form1.Edit1.Text));
  106. for i:=0 to n-1 do
  107. for j:=0 to 2*n-1 do
  108. m1[i,j]:=StrToFloat(Form1.StringGrid1.cells[j,i]);
  109. end;
  110.  
  111. procedure TSampleThread.Execute;
  112. begin
  113.  
  114. for i:=0 to n-1 do
  115. for j:=n to 2*n-1 do
  116. if j=i+n then m1[i,j]:=1
  117. else m1[i,j]:=0;
  118.  
  119. for k:=0 to n-1 do
  120. begin
  121. if k>0 then
  122. for i:=k to n-1 do
  123. begin
  124. for j:=2*n-1 downto 0 do
  125. m1[i,j]:=m1[i,j]-m1[k-1,j]*m1[i,k-1];
  126. end;
  127. for j:=2*n-1 downto 0 do
  128. begin
  129. m1[k,j]:=m1[k,j]/m1[k,k];
  130. end;
  131. end;
  132.  
  133. for k:=n-1 downto 0 do
  134. begin
  135. if k<n-1 then
  136. for i:=k downto 0 do
  137. begin
  138. for j:=2*n-1 downto 0 do
  139. m1[i,j]:=m1[i,j]-m1[k+1,j]*m1[i,k+1];
  140. end;
  141. end;
  142. Synchronize(Write);
  143. end;
  144. end.
  145.  
  146.  
  147.  


Саня-1184 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Саня-1184 (статус: Посетитель)
Вопрос отправлен: 2 декабря 2007, 05:10
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Скачал я твой мегапроект. Совать в архив экзешник программы было совсем ни к чему, согласись.

Цитата:

А проблема в том, что когда доходит программа до создания экземпляра формы, то поднимается класс исключения, говорящий о том, что программа пытается обратиться к не найденым файлам. И ещё проблема в том, что при сохранении проекта, а в последствии его открытия форма куда то пропадает и не открывается!


Эта ошибка вылетает из-за того, что ты грохнул в Unit1.pas из секции implementation директиву включения в EXE ресурса формы {$R *.dfm}. Я добавил её и переоткрыл проект - форма появилась, ошибка при открытии пропала.

//--------------------

А твой поток - это ваще что-то с чем-то. Налицо полное незнание матчасти работы с потоками. Его надо переделывать с нуля. Могу, конечно, помочь, но советую почитать книжку по этому поводу.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 2 декабря 2007, 10:02


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 3 декабря 2007, 01:55; участников в обсуждении: 2.
Саня-1184

Саня-1184 (статус: Посетитель), 2 декабря 2007, 05:14 [#1]:

И ещё, был бы безмерно благодарен, если бы помощь поступила в максимально короткие сроки :)
min@y™

min@y™ (статус: Доктор наук), 2 декабря 2007, 11:12 [#2]:

Сижу, копаюсь в твоём проекте от нечего делать.

procedure TSampleThread.Read;
begin
 n:=StrToInt(Form1.Edit1.Text); // Ну это, типа, размерность квадратной матрицы, ладно...
 SetLength(m1,StrToInt(Form1.Edit1.Text),StrToInt(Form1.Edit1.Text));
 SetLength(m2,StrToInt(Form1.Edit1.Text),StrToInt(Form1.Edit1.Text));
 // Может будет лучше написать SetLength(m1,n,n); ???
 
 for i:=0 to n-1 do
  for j:=0 to 2*n-1 do // Ну это ваще!
   m1[i,j]:=StrToFloat(Form1.StringGrid1.cells[j,i]);
 // Куда будет указывать m1[i, j] при n = 5 и 5 <= j <= 9 ? 
 // Ума не разложу, почему for j:=0 to 2*n-1 do, а не to n - 1?
end;

В алгоритме вычисления то же самое. Где ты откопал этот алгоритм?
Но до сомих вычислений дело не дойдёт, получишь Access violation гораздо раньше.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Саня-1184

Саня-1184 (статус: Посетитель), 2 декабря 2007, 11:58 [#3]:

спасибо всем огромное!!!
А цикл там такой, потому что метод основывается на том, что сначала присоеденяется справа еденичная матрица и потом делив строки на определенные элементы, и отнимая от них другие строки умноженные на какое либо число, мы добиваемся образования еденичной матрицы слева. А что останется справа это будет обратная.
А я просто ночью ступил, что инициализировал массив с одинаковой размерностью. надо было SetLenght(m1,n,2*n);
:)
Саня-1184

Саня-1184 (статус: Посетитель), 3 декабря 2007, 01:55 [#4]:

Алгоритм писал раньше сам, только просто в модуле. а теперь задание получил через поток оформить..

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.