|
Вопрос # 1 161/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
У меня задание написать поток для обращения матрицы методом гауса. Алгоритм я разработал без проблем, но вот с потоком есть проблемы. Вроде все делаю по правилам, по логике.
А проблема в том, что когда доходит программа до создания экземпляра формы, то поднимается класс исключения, говорящий о том, что программа пытается обратиться к не найденым файлам. И ещё проблема в том, что при сохранении проекта, а в последствии его открытия форма куда то пропадает и не открывается!
Подскажите пожалуйста, что я не корректно делаю.
заранее спасибо!
так же прикреплю проект.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Grids, ExtCtrls;
-
- type
- TForm1 = class(TForm)
- Panel1: TPanel;
- GroupBox1: TGroupBox;
- GroupBox2: TGroupBox;
- StringGrid1: TStringGrid;
- StringGrid2: TStringGrid;
- GroupBox3: TGroupBox;
- Button1: TButton;
- Button2: TButton;
- GroupBox4: TGroupBox;
- Edit1: TEdit;
- procedure Edit1Change(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
- uses unit2;
- var
- Thread1: TSampleThread;
-
- procedure TForm1.Edit1Change(Sender: TObject);
- begin
- if Edit1.Text<>'' then
- begin
- StringGrid1.ColCount:=StrToInt(Edit1.Text);
- StringGrid1.RowCount:=StrToInt(Edit1.Text);
- StringGrid2.ColCount:=StrToInt(Edit1.Text);
- StringGrid2.RowCount:=StrToInt(Edit1.Text);
- end;
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- Application.Terminate;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- Edit1.Text:='5';
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Thread1 := TSampleThread.Create(False);
- Thread1.Priority := tpLowest;
-
- end;
-
- end.
-
- {========================================}
-
- unit Unit2;
-
- interface
- uses
- Classes, SysUtils;
-
- type
- TSampleThread = class(TThread)
- private
- m1: array of array of double;
- m2: array of array of double;
- n: integer;
- protected
- procedure Read;
- procedure Write;
- procedure Execute; override;
- end;
-
- var
- i,j,k: integer;
- implementation
- uses Unit1;
-
- procedure TSampleThread.Write;
- begin
- for i:=0 to n-1 do
- for j:=0 to 2*n-1 do
- Form1.StringGrid2.Cells[j,i]:=FloatToStr(m1[i,j]);
- end;
-
- 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));
- for i:=0 to n-1 do
- for j:=0 to 2*n-1 do
- m1[i,j]:=StrToFloat(Form1.StringGrid1.cells[j,i]);
- end;
-
- procedure TSampleThread.Execute;
- begin
-
- for i:=0 to n-1 do
- for j:=n to 2*n-1 do
- if j=i+n then m1[i,j]:=1
- else m1[i,j]:=0;
-
- for k:=0 to n-1 do
- begin
- if k>0 then
- for i:=k to n-1 do
- begin
- for j:=2*n-1 downto 0 do
- m1[i,j]:=m1[i,j]-m1[k-1,j]*m1[i,k-1];
- end;
- for j:=2*n-1 downto 0 do
- begin
- m1[k,j]:=m1[k,j]/m1[k,k];
- end;
- end;
-
- for k:=n-1 downto 0 do
- begin
- if k<n-1 then
- for i:=k downto 0 do
- begin
- for j:=2*n-1 downto 0 do
- m1[i,j]:=m1[i,j]-m1[k+1,j]*m1[i,k+1];
- end;
- end;
- Synchronize(Write);
- end;
- end.
-
-
-
 |
Вопрос задал: Саня-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 (статус: Посетитель), 2 декабря 2007, 05:14 [#1]:
И ещё, был бы безмерно благодарен, если бы помощь поступила в максимально короткие сроки
|
|
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 (статус: Посетитель), 2 декабря 2007, 11:58 [#3]:
спасибо всем огромное!!!
А цикл там такой, потому что метод основывается на том, что сначала присоеденяется справа еденичная матрица и потом делив строки на определенные элементы, и отнимая от них другие строки умноженные на какое либо число, мы добиваемся образования еденичной матрицы слева. А что останется справа это будет обратная.
А я просто ночью ступил, что инициализировал массив с одинаковой размерностью. надо было SetLenght(m1,n,2*n);
|
|
Саня-1184 (статус: Посетитель), 3 декабря 2007, 01:55 [#4]:
Алгоритм писал раньше сам, только просто в модуле. а теперь задание получил через поток оформить..
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|