![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копировать массив в другой массив
Тимоха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;