|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
might not have been initialized
Прога в два потока умножает и транспонирует матрицы(транспонирование вроде получается) зависает на умножении в строке 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 делать в умножении?
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
labuda (26.03.2014)
|
#3
|
|||
|
|||
????
а это как и куда?
|
#4
|
|||
|
|||
попробовал не помогает
|
#5
|
||||
|
||||
Цитата:
Такие вопросы либо к тому, у кого стащил код, либо к гуглу, он на них любит отвечать. jmp $ ; Happy End! The Cake Is A Lie. |
#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. |