![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А как можно присвоить один типизированный массив другому
msgipss © (2002-12-26 13:59:00)Подскажите пожалуйста, есть ли какая либо команда для загрузки данных из одного динанич. массива в другой, например
b,a:array of type1
.....
как присвоить один массив другому не перебирая и присваивая поэлементно
Alex Konshin (2002-12-28 05:18:00) [1]2msgipss: Ты просто забываешь о том, что у тебя массив массивов, т.е. каждый элемент - ДИНАМИЧЕСКИЙ массив.
CopyMemory и System.Move скопирует некий кусок памяти, и что толку? Здесь же мы имеем массив указателей на другие куски памяти, я уж не говорю о том, что дин.массив имеет заголок и счетчик ссылок в нем.
System.Copy вроде должен скопировать массив, но ты получишь новый массив ссылок на старые массивы.
Короче, les ответил, что нужно делать, но если посмотреть в код, то ясно, что там просто поэлементно все копируется.
les (2002-12-27 16:30:00) [2]В модуле system есть несколько очччень интересних (правда совсем недокументированих функций) (D5):
procedure _DynArrayCopy(a: Pointer; typeInfo: Pointer; var Result: Pointer);
procedure _DynArrayCopyRange(a: Pointer; typeInfo: Pointer; index, count : Integer; var Result: Pointer);
procedure _DynArrayAsg;
procedure _CopyArray;
procedure CopyArray(dest, source, typeInfo: Pointer; cnt: Integer); - ета вообще не импортируется.
typeInfo получаешь через функцию TypeInfo (как ни странно :). Попробуй.
gsu (2002-12-27 14:02:00) [3]>> shane54 © (27.12.02 11:06)
>> Всё проще.
Да, ладно - он нечаянно.
Дурак2 (2002-12-27 12:32:00) [4]
> shane54 © (27.12.02 11:56)
> Ник подходит
Подходит? - так бери - не жалко.
Севостьянов Игорь (2002-12-27 11:56:00) [5]
> shane54 © (27.12.02 11:06)
Действительно какой у него "динамический" массив однако
shane54 (2002-12-27 11:56:00) [6]Ник подходит
Дурак2 (2002-12-27 11:20:00) [7]А мы тут колбасимся - а все так просто ;-)
Может и вечный двигатель сделаешь?
shane54 (2002-12-27 11:06:00) [8]Всё проще.
type
MyType = array[1..N] of integer;
var
Mas1, Mas2 : MyType;
begin
....
....
Mas1 := Mas2;
end;
Такой вот нехитрой уловкой обходится ограничение с присваиванием массивов.
ИгорЁк (2002-12-27 10:45:00) [9]а если так?
SetLength(zzz2, Length(zzz1)):
Move(zzz1[0], zzz2[0], Length(zzz1)*SizeOF(xxx));
VaS (2002-12-27 10:19:00) [10]У тебя в элементах массива (записях) имеются указатели (дин. массивы). Их тоже надо move-ать. Так что только поэлементно с копированием данных по указателям записей.
perov (2002-12-27 09:15:00) [11]для динамических массивов можно залочить (LockArray вродебы) их и system.copy
msgipss (2002-12-27 08:59:00) [12]придется по старинке поэлементно, думал может уже есть чего поинтереснее, 8)
всем спасибо....
msgipss (2002-12-27 08:59:00) [13]придется по старинке поэлементно, думал может уже есть чего поинтереснее, 8)
Дурак2 (2002-12-27 05:13:00) [14]с динамическими массивами работаю только поэлементно.
msgipss (2002-12-27 05:06:00) [15]что то массив типа
type xxx=record
x1:word;
x2:string;
yyy=array of xxx;
zzz=array of yyy;
var zzz1,zzz2:zzz;
....
zzz1:=system.copy(zzz2,Low(zzz2),Length(zzz2));
не хочет копироваться, 8(
gsu (2002-12-26 16:12:00) [16]Для статических a:=b - угу, для динамических это присваивание указателей, но не копирование элементов. А вообще copy, хотя она временами ся странно ведет ...
icWasya (2002-12-26 15:55:00) [17]a:=system.copy(B,Low(B),Length(B));
Anatoly Podgoretsky (2002-12-26 14:15:00) [18]ZrenBy © (26.12.02 14:10)
Ну да
type
type1 = array of array of ...
ZrenBy (2002-12-26 14:10:00) [19]CopyMemory
Song (2002-12-26 14:03:00) [20]a:=b ?
В паскале помнится, прокатывало..