Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Вниз
Копирование 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c