![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Прога в два потока умножает и транспонирует матрицы(транспонирование вроде получается) зависает на умножении в строке 41 : a2[i,j]:= Random(100);
Код:
TThread1 = class(TThread)
a,res : array of array of integer;
procedure Execute; override;
end;
TThread2 = class(TThread) //умножение
a2,b2,res2 : array of array of integer;
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TThread1.Execute;
var
n,i,j:integer;
begin
n:=4;
Setlength(a,n,n);
Setlength(res,n,n);
for i:=0 to n-1 do
for j:=0 to n-1 do
a[i,j]:= Random(100);
//транспонирование
for i:=0 to n-1 do
for j:=0 to n-1 do
res[j,i]:=a[i,j];
end;
procedure TThread2.Execute;
var
i, j, k, s, n: integer;
begin
n:=3;
for i:=1 to n do
for j:=1 to n do
a2[i,j]:= Random(100);
for i:=1 to n do
for j:=1 to n do
b2[i,j]:= Random(100);
for I := 1 to n do //умножение
for j := 1 to n do
begin
s:=0;
for k := 1 to n do
s:=s+a2[k,i]*b2[j,k];
res2[j,i]:=s;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T1 : TThread1;
T2 : TThread2;
i,j,n,n2:integer;
begin
T1 := TThread1.Create(True);
T2 := TThread2.Create(True);
T1.Resume;
T2.Resume;
T1.WaitFor;
T2.WaitFor;
n:=3;
n2:=4;
for i:=0 to n2-1 do
for j:=0 to n2-1 do
StringGrid4.Cells[j,i]:=IntToStr(T1.a[i,j]); //вывод случайной матрицы
for i:=0 to n2-1 do
for j:=0 to n2-1 do
StringGrid5.Cells[j,i]:=IntToStr(T1.res[i,j]); //вывод транспонированной
for I := 1 to n do
for j := 1 to n do
stringgrid1.cells[i,j]:=IntToStr(T2.a2[i,j]); //вывод случайной матрицы
for I := 1 to n do
for j := 1 to n do
stringgrid2.cells[i,j]:=IntToStr(T2.b2[i,j]); //вывод случайной матрицы
for I := 1 to n do
for j := 1 to n do
stringgrid3.cells[i,j]:=IntToStr(T2.res2[i,j]); //вывод произведения матриц
T1.Free;
T2.Free;
end; |
|
#2
|
||||
|
||||
|
А кто будет SetLength делать в умножении?
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
labuda (26.03.2014)
| ||
|
#3
|
|||
|
|||
|
а это как и куда?
![]() |
|
#4
|
|||
|
|||
|
попробовал не помогает
|
|
#5
|
||||
|
||||
|
Цитата:
Такие вопросы либо к тому, у кого стащил код, либо к гуглу, он на них любит отвечать. |
|
#6
|
|||
|
|||
|
просто секундный тупняк... говорю же: вставил, не помогло(хотя первая матрица на половину заполнилась, но все равно зависает на том же цикле)
|
|
#7
|
|||
|
|||
|
А какого размера SetLength, и почему в Thread2.Execute индексы от 1 до N ?
|
|
#8
|
||||
|
||||
|
Попробуй так.
Код:
procedure TThread2.Execute;
var
i, j, k, s, n: integer;
begin
n:=3;
SetLenGth(a2,n,n);
for i:=0 to n-1 do
for j:=0 to n-1 do
a2[i,j]:= Random(100);
SetLenGth(b2,n,n);
for i:=0 to n-1 do
for j:=0 to n-1 do
b2[i,j]:= Random(100);
SetLenGth(res2,n,n);
for I := 0 to n-1 do //умножение
for j := 0 to n-1 do
begin
s:=0;
for k := 0 to n-1 do
s:=s+a2[k,i]*b2[j,k];
res2[j,i]:=s;
end;
end;Или же тот же Х, только вид с боку. Код:
procedure TThread2.Execute;
var
i, j, k, s, n: integer;
begin
n:=3;
SetLenGth(a2,n,n);
for i:=1 to n do
for j:=1 to n do
a2[i-1,j-1]:= Random(100);
SetLenGth(b2,n,n);
for i:=1 to n do
for j:=1 to n do
b2[i-1,j-1]:= Random(100);
SetLenGth(res2,n,n);
for I := 1 to n do //умножение
for j := 1 to n do
begin
s:=0;
for k := 1 to n do
s:=s+a2[k-1,i-1]*b2[j-1,k-1];
res2[j-1,i-1]:=s;
end;
end;И здесь огрехи имеются. Код:
procedure TForm1.Button1Click(Sender: TObject); var T1 : TThread1; T2 : TThread2; i,j,n,n2:integer; begin T1 := TThread1.Create(True); T2 := TThread2.Create(True); T1.Resume; T2.Resume; T1.WaitFor; T2.WaitFor; n:=3; n2:=4; for i:=0 to n2-1 do for j:=0 to n2-1 do StringGrid4.Cells[j,i]:=IntToStr(T1.a[i,j]); //вывод случайной матрицы for i:=0 to n2-1 do for j:=0 to n2-1 do StringGrid5.Cells[j,i]:=IntToStr(T1.res[i,j]); //вывод транспонированной for I := 0 to n-1 do for j := 0 to n-1 do stringgrid1.cells[i,j]:=IntToStr(T2.a2[i,j]); //вывод случайной матрицы for I := 0 to n-1 do for j := 0 to n-1 do stringgrid2.cells[i,j]:=IntToStr(T2.b2[i,j]); //вывод случайной матрицы for I := 0 to n-1 do for j := 0 to n-1 do stringgrid3.cells[i,j]:=IntToStr(T2.res2[i,j]); //вывод произведения матриц T1.Free; T2.Free; end; У динамических массивов индексация начинается с нуля. Вот тока не уточнял на счёт StringGrid. В StringGrid индексация начинается с 0 или с 1 ? Последний раз редактировалось seeman_tm, 27.03.2014 в 17:22. |