Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Произведение матрицы на вектор в Delphi
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Одна страница
Модераторы: paradise, KMA
  

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

Отправка ответа:
Имя пользователя   Вы зарегистрировались?
Пароль   Забыли пароль?
Сообщение

Использование HTML запрещено

Использование IkonCode разрешено

Смайлики разрешены

Опции отправки

Добавить подпись?
Получать ответы по e-mail?
Разрешить смайлики в этом сообщении?
Просмотреть сообщение перед отправкой? Да   Нет
 

Переход к теме
<< Назад Вперед >>
Одна страница

Форум работает на скрипте © Ikonboard.com