|
Вопрос # 30/ вопрос открыт / |
|
Ув. эксперты, нужна ваша помощь. Есть переменная такого типа:
array of array [0..2] of array of integer;
Нужно скопировать ее содержимое в другую такую же. Присваиванием динамические массивы не копируются, а Copy в данном случае выдает ошибку. Есть ли еще какой-нибудь способ скопировать такой массив, не используя цикл?
 |
Вопрос задала: Darya Ermakova (статус: 8-ой класс)
Вопрос отправлен: 31 мая 2006, 15:57
Состояние вопроса: открыт, ответов: 4.
|
Ответ #1. Отвечает эксперт: min@y™
Ни разу не работал с 3D-массивами, но попробую подсказать. Это у тебя динамический массив. Если хочешь скопировать его содержимое в такую же переменную (или ваще куда угодно), пользуйся процедурой Move(), только размер массива-получателя (во всех его измерениях) поставь большим или равным размеру данных в 1-м массиве.
Приложение: Переключить в обычный режим-
-
-
- var
- S: string;
- A: array of byte;
- begin
- S:= '12345';
- SetLength(A, Length(S));
- Move(S[1], A[0], Length(A));
- end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 31 мая 2006, 16:53
Оценка за ответ: 2
Комментарий к оценке: move я пробовала, он к сожалению тоже копирует только ссылку на массив.
|
Ответ #2. Отвечает эксперт: mvp
Ничего сложного не вижу, попробуйте так, как в приложении (правда такие замысловатые динамические массивы не пробовал, где они в середине не динамические). Где-то так примерно, как в приложении. Если б не фиксированный размер в середине, то работало б точно, а так - попробуйте
Приложение: Переключить в обычный режим- var
- a, b : array of array[0..2] of array of integer;
- _, __, i: integer;
-
- begin
-
-
- Setlength(b, length(a));
- for _:= 0 to length(a) - 1 do for i := 0 to 2
- begin
- Setlength(b(_, i), length(a(_, i));
- for __:= 0 to length(a(_, i)) - 1 do b(_, i, __) := a(_, i, __)
- end
- end;
 |
Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 31 мая 2006, 19:15
Оценка за ответ: 4
Комментарий к оценке: В результате почти так и сделала, только немного короче получилось. Было бы 5, если бы объяснили, почему без циклов нельзя :)
|
Ответ #3. Отвечает эксперт: Вадим К
Сделать это без циклов вам не получиться. Почему? Просто двумерный динамический массив - это одномерный массив указателей на одномерные массивы (кто то из сишников говорил мне, что такое в Делфе нельзя описать одной строкой :) ). Эти одномерные массивы могут находиться в разных местах памяти, поэтому за один проход - никак.
Что же делать?
копировать вручную. Правда иногда можно найти общего в своих процедурах и написать процедуру копирования
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 июня 2006, 11:59
Оценка за ответ: 5
Комментарий к оценке: Похоже, вы правы. Мне казалось, что Copy копирует и многомерные массивы, но видно что-то перепутала. Спасибо за разьяснения, помогли понять, что там происходит.
|
Ответ #4. Отвечает эксперт: Yurchik
Мож подкорректируешь оценку mvp? Все таки он код написал, лучше вряд ли что-то придумаешь. Оформи этот код в отдельную процедуру с двумя параметрами (массив-источник и массив-копия) и вызывай эту процедуру сколько хочешь раз :)
 |
Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 2 июня 2006, 00:49
Оценка за ответ: 3
Комментарий к оценке: согласна :)
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|