Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 30

/ вопрос открыт /

Ув. эксперты, нужна ваша помощь. Есть переменная такого типа:
array of array [0..2] of array of integer;
Нужно скопировать ее содержимое в другую такую же. Присваиванием динамические массивы не копируются, а Copy в данном случае выдает ошибку. Есть ли еще какой-нибудь способ скопировать такой массив, не используя цикл?

Darya Ermakova Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Darya Ermakova (статус: 8-ой класс)
Вопрос отправлен: 31 мая 2006, 15:57
Состояние вопроса: открыт, ответов: 4.

Ответ #1. Отвечает эксперт: min@y™

Ни разу не работал с 3D-массивами, но попробую подсказать. Это у тебя динамический массив. Если хочешь скопировать его содержимое в такую же переменную (или ваще куда угодно), пользуйся процедурой Move(), только размер массива-получателя (во всех его измерениях) поставь большим или равным размеру данных в 1-м массиве.

Приложение:
  1.  
  2.  
  3.  
  4. var
  5. S: string;
  6. A: array of byte;
  7. begin
  8. S:= '12345';
  9. SetLength(A, Length(S));
  10. Move(S[1], A[0], Length(A));
  11. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 31 мая 2006, 16:53
Оценка за ответ: 2

Комментарий к оценке: move я пробовала, он к сожалению тоже копирует только ссылку на массив.

Ответ #2. Отвечает эксперт: mvp

Ничего сложного не вижу, попробуйте так, как в приложении (правда такие замысловатые динамические массивы не пробовал, где они в середине не динамические). Где-то так примерно, как в приложении. Если б не фиксированный размер в середине, то работало б точно, а так - попробуйте

Приложение:
  1. var
  2. a, b : array of array[0..2] of array of integer;
  3. _, __, i: integer;
  4.  
  5. begin
  6.  
  7.  
  8. Setlength(b, length(a));
  9. for _:= 0 to length(a) - 1 do for i := 0 to 2
  10. begin
  11. Setlength(b(_, i), length(a(_, i));
  12. for __:= 0 to length(a(_, i)) - 1 do b(_, i, __) := a(_, i, __)
  13. end
  14. 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

Комментарий к оценке: согласна :)

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.02 сек.