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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2009, 14:02   #1
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию Вставка вектора в динамический массив

Помогите пожалуйста, господа программеры!
Имеется динамический массив MxN типа Extended. В него надо вставить вектор размерности M того же типа в позицию index. Вопрос: как?
Пробовал так:
Код:
move(Arr[index],Arr[index+1],(length(Arr)-index)*SizeOf(extended));
Компилится нормально, но результат не нормальный. Что надо подправить или вообще как лучше написать, чтобы работало?
iiunbreakableii вне форума Ответить с цитированием
Старый 14.12.2009, 14:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот пример:
Код:
 var a:array[1..5,1..5] of extended;
  b:array[1..5] of extended;
  var j,i:integer;
begin
 for j:=1 to 5 do begin
  for i:=1 to 5 do begin a[i,j]:=i*j; write(a[i,j]:5:0);end;
  writeln;
 end;
 writeln;
  for i:=1 to 5 do begin b[i]:=random(100);write(b[i]:5:0);end;
 move(b[1],a[3,1],length(b)*sizeof(b[1]));
 writeln;
 writeln;
 for j:=1 to 5 do begin
  for i:=1 to 5 do begin
     write(a[j,i]:5:0);end;
  writeln;
 end;
   { TODO -oUser -cConsole Main : Insert code here }
  readln;
end.
Все верно работает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 15:03   #3
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

При вставке нового вектора, он переписавает строку в массиве
Вот код:
Код:
Type
  Tvektor=array of extended;
  Tmatrix=array of Tvektor;
...

procedure Matrix_Inset(var M:TMatrix; V:TVektor; index:integer);
var
  i:integer;
begin
  for i := 0 to high(V) do
   move(V[i],M[index,i],SizeOf(V[i]));
end;

procedure Test;
var
  i,j:integer;
  vec:TVektor;
begin
  Matrix_SetSize(B,5,5);
  for i := 0 to 4 do
    for j := 0 to 4 do
    begin
      Randomize;
      b[i,j]:=j;
    end;
  setlength(vec,5);
  for i := 0 to 10 do
  begin
    for j := 0 to 4 do
      vec[j]:=i+10;
    Matrix_Inset(B,vec,3);
  end;
end;
что не так? помоги о "СуперМодератор"!

Последний раз редактировалось iiunbreakableii; 14.12.2009 в 15:07.
iiunbreakableii вне форума Ответить с цитированием
Старый 14.12.2009, 15:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
iiunbreakableii
Так стоп!. Тебе нужно вставить вектор так чтоб остальные строки не затирались?
Именно ВСТАВИТЬ а не заменить некую строку?
И что за сложность весь код показать? Думаешь удобно латки твои штопать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 15:37   #5
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

да, именно вставить, а не заменить
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tvektor=array of extended;
  Tmatrix=array of Tvektor;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure Test;
  procedure Matrix_SetSize(var M:Tmatrix; X,Y:integer);
  procedure Matrix_Inset(var M:TMatrix; V:TVektor; index:integer);


var
  Form1: TForm1;
  B:Tmatrix;
implementation

{$R *.dfm}

procedure Matrix_SetSize(var M:Tmatrix; X,Y:integer);
var
  i:integer;
begin
  SetLength(M,X);
  for  i:= 1 to X do
    SetLength(M[i-1],Y);
end;

procedure Matrix_Inset(var M:TMatrix; V:TVektor; index:integer);
var
  i:integer;
begin
  for i := 0 to high(V) do
   move(V[i],M[index,i],SizeOf(V[i]));
end;

procedure Test;
var
  i,j:integer;
  vec:TVektor;
begin
  Matrix_SetSize(B,5,5);
  for i := 0 to 4 do
    for j := 0 to 4 do
    begin
      Randomize;
      b[i,j]:=j;
    end;
  setlength(vec,5);
  for i := 0 to 10 do
  begin
    for j := 0 to 4 do
      vec[j]:=i+10;
    Matrix_Inset(B,vec,2);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test;
end;

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

Ы-ы-ы тут вон чего...
Ок. Понял.
Так подойдет?
Код:
procedure Matrix_Inset(var M:TMatrix; V:TVektor; index:integer);
var
  k,i:integer;
begin                
   k:=length(m)-index-1;
   k:=k*SizeOf(v[1]);
   move(M[index,0],M[index+1,0],k);
   move(V[0],M[index,0],SizeOf(V[0])*(length(v)));
end;
Смысл ясен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 16:05   #7
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

ГИГАНТСКОЕ СПАСИБО, помогло!
iiunbreakableii вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Vito89 Помощь студентам 1 20.10.2009 01:55
Динамический массив Vito89 Общие вопросы Delphi 3 20.10.2009 01:20
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45