Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: 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 вся ветка

Текущий архив: 2003.05.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
7-83767
Serega
2003-03-25 18:19
2003.05.26
CTRL+ALT+DEL и ALT+TAB


14-83667
Ziv
2003-04-30 17:02
2003.05.26
Проблема с запуском Kylix-a


11-83431
MyVeryShortLogin
2002-08-16 13:47
2003.05.26
Не обрабатывается событие OnKeyDown


6-83623
neodiX
2003-03-25 19:32
2003.05.26
ServerSocket(stThreadBlocking) - как правильно отсоединится?


8-83616
FROM_X
2003-02-13 13:27
2003.05.26
DirectSS кто нить работал с ним? Вопрос...