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

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

А как можно присвоить один типизированный массив другому


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 ?
В паскале помнится, прокатывало..


Наверх

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