Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

копировать массив в другой массив


Тимоха111 ©   (2011-02-01 22:15:00) 

Всем привет, существуют ли в дельфи 7 стандартные фунции, позволяющие скопировать динамический массив, т.е.
mass1:array[0..6] of real;
mass2:array of real;

чтото типо того можно сделать: mass2 := mass1  ??


han_malign   (2011-02-02 10:45:00) [1]


> mass2:=@mass1;
> правда это  не копирование
> у тебя просто в памяти один  массив и две переменные
> через которые ты можешь к нему обашаться и редактировать

- ну-ну..., а потом все внезапно умирает:
program darr;
{$APPTYPE CONSOLE}
{$IF CompilerVersion >= 15.0}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_CAST OFF}
{$IFEND}

var    refCount : longword;
      itemCount: longword; //!!! Подделка структуры динамическго массива
      _m: array[0..7]of integer;

type tdarr = array of integer;

procedure _fail(var v: tdarr);
var m1: tdarr;
begin
  m1:= @ _m;
  Writeln('2:refCount ', refCount);
  v:= copy(m1, 2, 3);
  // а вот здесь m1 выходит из области видимости
end;

var m2: tdarr;
   i: integer;
begin
 for i:= low(_m) to high(_m) do _m[i]:= i;

 //подделываем внутренню струтктуру динамического массива
 refCount:= 0; itemCount:= Length(_m);
 m2:= copy(tdarr(@_m), 0, 8);

 Write(Length(m2),'/',itemCount, ': ');
 for i:= 0 to Length(m2)-1 do write(m2[i], ' ');
 writeln;

 refCount:= 1;
 Writeln('1:refCount ', refCount);
 _fail(m2);
 Writeln('3:refCount ', refCount, ' !!!');
 Write(Length(m2),'/',itemCount, ': ');
 for i:= 0 to Length(m2)-1 do write(m2[i], ' ');
 writeln;

  refCount:= 0;//!!!
 itemCount:= 0;//!!! - чтобы все поняли, что это наверняка
try
 Writeln('1:refCount ', refCount, ' !!!');
 _fail(m2);
 Writeln('До сюда мы дойти не должы! refCount ', refCount, ' x ', itemCount);
except
 // хотя этого мы тоже не увидим
 // - потому что менеджер памяти убитгорем
 writeln('А чего вы еще ожидали? refCount ', refCount);
 raise;
end;
end.


Jeer   (2011-02-02 09:44:00) [2]


> Тимоха111   (01.02.11 22:15)
>
> Всем привет, существуют ли в дельфи 7 стандартные фунции,
>  позволяющие скопировать динамический массив


Если два динамических массива, то:
arTwo := Copy(arOne,0,Length(arOne));


Тимоха111   (2011-02-01 23:24:00) [3]

KilkennyCat, спасибо:)


KilkennyCat   (2011-02-01 22:54:00) [4]


> Женя (Прохожий - это я)   (01.02.11 22:29) [4]

> for i:=0 to 6 do begin
> SetLength(mass2,Length(mass2));
> mass2[i]:=mass1[i];
> end;

гениально.
почувствуй разницу:
SetLength(mass2,Length(mass1));
for i:= 0 to 6 do mass2[i]:=mass1[i];

универсально и защищенно от ошибок границ:
SetLength(mass2,Length(mass1));
y := 0;
for i:= Low(mass1) to high(mass1) do begin
 mass2[y]:=mass1[i];
 inc(y);
end;


Тимоха111   (2011-02-01 22:49:00) [5]

Игорь Шевченко, Благодарю!


Игорь Шевченко   (2011-02-01 22:41:00) [6]


> в вопросе было конкретно есть ли стандартные функции, без
> использования циклов и т.п.


Move


Женя (Прохожий - это я)   (2011-02-01 22:39:00) [7]

Удалено модератором


Тимоха111   (2011-02-01 22:34:00) [8]

спасибо, этот вариант и так понятен, в вопросе было конкретно есть ли стандартные функции, без использования циклов и т.п.


Женя (Прохожий - это я)   (2011-02-01 22:31:00) [9]

пишеш такую процедуру и усе
for i:=0 to 6 do begin можно написать для общего случая :
for i:=0 to Length(mass1) do begin


Женя (Прохожий - это я)   (2011-02-01 22:29:00) [10]

mass2:=@mass1;
правда это  не копирование
у тебя просто в памяти один  массив и две переменные
через которые ты можешь к нему обашаться и редактировать
а чтоб копировать :

for i:=0 to 6 do begin
SetLength(mass2,Length(mass2));
mass2[i]:=mass1[i];
end;


Женя (Прохожий - это я)   (2011-02-01 22:26:00) [11]

Удалено модератором


Amoeba_   (2011-02-01 22:26:00) [12]


> Прохожий   (01.02.11 22:24) [1]
>
> mass2:=@mass1;

Уверен?


Прохожий   (2011-02-01 22:24:00) [13]

mass2:=@mass1;


Наверх

Титульная страница Поиск, карта сайта Написать письмо