Вниз
Скачать: CL | DM;

Копирование open array массива в динамический массив   Найти похожие ветки 

← →
stkatch   (2003-05-13 15:44) [0]

Уважаемые, мастера!

Как можно скопировать open array массив в динамический массив внутри процедуры, кроме как копировать поэлементно?

procedure CopyArray(S: array of integer);
var
D: array of integer;
begin
SetLength(D, Length(S));
// Существует что нить типа такого???
D := Copy(S, 0, Length(S));
end;


← →
MBo ©   (2003-05-13 15:51) [1]

Move


← →
VMcL ©   (2003-05-13 15:58) [2]

2 stkatch

Верно, "Move". Но для Move нужно быть уверенным в "одинаковости" размеров данных. Я обычно в таких ситуациях, на всякий случай, объявляю packed array.


← →
stkatch   (2003-05-13 16:00) [3]

> MBo, VMcL
все это верно, но проблема в том что у меня массив структур со строками :-( я слишком упростил приведенный пример

TRecord = record
id: Integer;
name: string;
end;

procedure CopyArray(S: array of TRecord);
var
D: array of TRecord ;
begin
SetLength(D, Length(S));
// Существует что нить типа такого???
D := Copy(S, 0, Length(S));
end;


← →
Паша ©   (2003-05-13 16:02) [4]

ИМХО, только циклом. Move не будет работать


← →
MBo ©   (2003-05-13 16:03) [5]

Нет, не существует, и Move в данном случае приведет к некорректным результатам - указатели-то на строки скопируются, но вот счетчики ссылок не увеличатся - потенциальная возможность ошибок.
Какая цель копирования?


← →
PVOzerski ©   (2003-05-13 16:10) [6]

packed в Delphi принципиален только для record. Move - решение правильное. Но есть три уточнения. 1) Длина массива-источника - его (high(...)+1)*sizeof(элемент); 2) Перед move выставляем длину target-массива через SetLength; 3) в силу специфики внутренней организации динамических массивов в move используем адрес не target-массива, а его 0-го элемента.


← →
stkatch   (2003-05-13 16:11) [7]

> MBo
Передать в класс параметры настройки


← →
PVOzerski ©   (2003-05-13 16:12) [8]

А вот если речь идет о массивах длинных строк - действительно, см. MBo © (13.05.03 16:03).


← →
stkatch   (2003-05-13 16:14) [9]

>PVOzerski
Конструкция

SetLength(D, Length(S));
Move(S, D[0], Length(S));

не работает :-(


← →
evvcom ©   (2003-05-13 16:16) [10]

А что с этим потом делать будешь?

У меня, например, была похожая ситуация. Я не собирался менять внутренние структуры (в данном случае можно провести аналогию со стрингами), поэтому меня Move устроил. Все пришлось делать очень аккуратно (см. замечания MBo © (13.05.03 16:03)), а в конце процедуры типа твоего локального D: array of TRecord; пришлось чистить FillChar(D[0], Length(D)*SizeOf(TRecord), #0) вроде так. Иначе локальный массив автоматически чистится и нужные мне структуры в рабочем массиве после выхода из процедуры стали содержать мусор.


← →
evvcom ©   (2003-05-13 16:18) [11]


> Move(S, D[0], Length(S));
>
> не работает :-(

правильно Move(S [0], D[0], Length(S));


← →
MBo ©   (2003-05-13 16:21) [12]

Length(S)*SizeOf(TRecord)


← →
stkatch   (2003-05-13 16:25) [13]

> evvcom
Move(S[0], D[0], Length(S));
не точно так же не работает

MBo
а какой смысл в SizeOf(TRecord) если фактический размер записи неизвестен на этапе компиляции?


← →
stkatch   (2003-05-13 16:29) [14]

> MBo

Sorry! Погорячился. Все работает, спасибо!


← →
MBo ©   (2003-05-13 16:29) [15]

известен - 8 байт.


← →
evvcom ©   (2003-05-13 16:29) [16]


> Move(S[0], D[0], Length(S));
> не точно так же не работает

Прошу прощения, действительно см. MBo © (13.05.03 16:21)

> а какой смысл в SizeOf(TRecord) если фактический размер
> записи неизвестен на этапе компиляции?

Неправда! SizeOf(TRecord) определен, так как SizeOf(name)=4 всегда!


← →
MBo ©   (2003-05-13 16:30) [17]

И не забудь о возможных проблемах - (13.05.03 16:03)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.01 c
1-83457
NewBegginer
2003-05-12 20:44
2003.05.26
Работа с масками вида xyz* ну или что-то подобное


14-83662
gn
2003-05-05 13:32
2003.05.26
Попытка номер 2


4-83791
jen_bond
2003-03-25 20:28
2003.05.26
Вопрос по работе с EnumEnhMetaFile


3-83325
smol_cerber
2003-05-07 10:48
2003.05.26
BDE + Paradox таблицы версии 3.5 в DOS-кодировке


14-83676
zhenya
2003-05-04 20:39
2003.05.26
Как удолить файл с неизвестным расшерением?




   Наверх