Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-83725
VID
2003-05-07 10:43
2003.05.26
Захват экрана


4-83817
Kron
2003-03-31 12:31
2003.05.26
Как обработать событье максимизации формы?


3-83357
Avreliy
2003-05-05 15:21
2003.05.26
Отображение значений поля выборки на управляющей сетке!


14-83681
StarCon
2003-05-06 08:55
2003.05.26
как получить список таблиц в локальной БД?


14-83719
sapr
2003-05-07 07:27
2003.05.26
Нестандартный DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский