Guest
Новичок
|
В данной процедуре должно происходить заполнение массива Matrix1 даными из StringGrid1 и Vector1 из StringGrid2. Но нажатие кнопки Button1 после заполнения StringGrid вызывает ошибку. procedure TForm1.Button1Click(Sender: TObject); begin Setlength(Matrix1, Stringgrid1.ColCount-1, Stringgrid1.RowCount-1); Setlength (Vector1, 1, StringGrid2.RowCount-1); For i:=1 to StringGrid1.colcount-1 do For j:=1 to StringGrid1.rowcount-1 do Matrix1 [i,j]:= StrToFloat (StringGrid1.Cells[i,j]); For i:=1 to StringGrid2.colcount-1 do Vector1 [1,i]:= StrToFloat (StringGrid2.Cells[1,i]); Umnoz (Matrix1, Vector1, StringGrid1.ColCount, Stringgrid1.RowCount); end; Процедура Umnoz должна выполнять умножение матрицы на вектор procedure Umnoz (const Matrix:ardex; const Vector:ardex; col:Integer; row:Integer); var i1,j1:Integer; Rachet:Double; begin for i1:=1 to col do begin Rachet:= 0; for j1:=1 to row do begin Rachet:= (Matrix[i1,j1])* (Vector[1,j1]); end; end;
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 2 дек. 2005 15:16 | IP
|
|
miss_graffiti
Долгожитель
|
Setlength(Matrix1, Stringgrid1.ColCount-1, Stringgrid1.RowCount-1); Setlength (Vector1, 1, StringGrid2.RowCount-1); вот здесь ошибка. -1 не нужно.... Setlength(Matrix1, Stringgrid1.ColCount, Stringgrid1.RowCount); Setlength (Vector1, 1, StringGrid2.RowCount); ошибка возникает из-за переполнения массива. а нумерация в динамических массивах начинается с нуля. то есть цикл пойдет от 0 до StringGrid1.colcount-1
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 2 дек. 2005 16:14 | IP
|
|
Dzen
Удален
|
2miss graffiti
-1 не нужно...
Почему? (Сообщение отредактировал Dzen 5 дек. 2005 13:54)
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 5 дек. 2005 13:51 | IP
|
|
miss_graffiti
Долгожитель
|
Dzen, ну... если мы пишем SetLength(A,10), то получаем массив из 10 элементов, то есть самый большой индекс - 9. кстати, еще. зачем задавать второй массив как двумерный?
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 5 дек. 2005 16:40 | IP
|
|
Guest
Новичок
|
Теперь происходит ошибка Access violation на участке процедуры а заполнение массива происходит правильно. procedure TForm1.Button1Click(Sender: TObject); begin Setlength(Matrix1, Stringgrid1.ColCount, Stringgrid1.RowCount); Setlength(Vector1, 1, StringGrid2.RowCount); For i:=0 to StringGrid1.colcount-1 do For j:=0 to StringGrid1.rowcount-1 do Matrix1 [i,j]:= StrToFloat (StringGrid1.Cells[i,j]); For i:=0 to StringGrid2.rowcount-1 do Vector1 [0,i]:= StrToFloat (StringGrid2.Cells[0,i]); Umnoz (Matrix1, Vector1, StringGrid1.ColCount, Stringgrid1.RowCount); end; Vector1 двумерный для совместимости типов type Ardex= array of array of Extended; var Form1: TForm1; i,j:Integer; Matrix1, Vector1: ardex;
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 5 дек. 2005 17:04 | IP
|
|
miss_graffiti
Долгожитель
|
Matrix1 [i,j]:= StrToFloat (StringGrid1.Cells[j,i]); ... Vector1 [0,i]:= StrToFloat (StringGrid2.Cells[i,0]); это раз два. еще раз повторяю. динамические массивы нумеруются с нуля.
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 5 дек. 2005 18:46 | IP
|
|
Guest
Новичок
|
Спасибо за помощь. Задача теперь получилась.
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 6 дек. 2005 11:59 | IP
|
|
Dzen
Удален
|
2miss graffiti спасибо, я просто перепутал длину и верхний индекс массива
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 6 дек. 2005 13:13 | IP
|
|
miss_graffiti
Долгожитель
|
Dzen, да в них все путаются... в Делфи ж еще статические можно нумеровать откуда угодно... кто с нуля начинает, кто с единицы...
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 6 дек. 2005 13:38 | IP
|
|
|