Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2014, 22:02   #1
MisterON
 
Аватар для MisterON
 
Регистрация: 19.03.2012
Сообщений: 8
По умолчанию Delphi: might not have been initialized

Прога в два потока умножает и транспонирует матрицы(транспонирование вроде получается) зависает на умножении в строке : 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;
MisterON вне форума Ответить с цитированием
Старый 26.03.2014, 22:12   #2
MisterON
 
Аватар для MisterON
 
Регистрация: 19.03.2012
Сообщений: 8
По умолчанию

добавил SetLength в умножение - стала заполнятся первая матрица да и то на половину
MisterON вне форума Ответить с цитированием
Старый 26.03.2014, 22:53   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Куда добавил?
По идее у тебя нет в TThread2 для a2,b2,res2 вызова SetLength() для их инициализации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.03.2014, 02:00   #4
MisterON
 
Аватар для MisterON
 
Регистрация: 19.03.2012
Сообщений: 8
По умолчанию

вот сюда:
Код:
procedure TThread2.Execute;
var
    i, j, k, s, n: integer;
begin
  n:=3;
Setlength(a,n,n);
Setlength(res,n,n);
Setlength(b,n,n);
for i:=1 to n do
for j:=1 to n do
a[i,j]:= Random(100);
for i:=1 to n do
for j:=1 to n do
b[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+a[k,i]*b[j,k];
        res[j,i]:=s;
      end;
end;
MisterON вне форума Ответить с цитированием
Старый 27.03.2014, 06:03   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Динамические массивы индескируются с 0, поэтому, надо все циклы исправить с for i := 1 to n do на for i := 0 to n-1 do
Поправляй и проверяй, плюс ещё через отладку пройдись (F5 F7).

П.С. Зачем менять пол ?
phomm вне форума Ответить с цитированием
Старый 27.03.2014, 09:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
на for i := 0 to n-1 do
А лучше
Код:
 на for i := Low(a) to High(a) do
И не париться по поводу пределов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инициализация структуры: W1036 Variable 'LpAdapterAddresses' might not have been initialized malor Общие вопросы Delphi 5 28.04.2013 12:13
Если переменная might not have been initialized то...? kta87 Общие вопросы Delphi 12 01.02.2012 08:52
variable 'ch' is being used without being initialized (С++) DarkAltair Помощь студентам 6 06.10.2011 15:18
Variable <Имя> might not have been initialized Anchut@ Общие вопросы Delphi 5 21.06.2010 11:01
BGI Error: Graphics not initialized (use InitGraph) Klyan Паскаль, Turbo Pascal, PascalABC.NET 3 30.04.2009 15:32