Аватар для XenoFlize
1 / 1 / 0
Регистрация: 09.11.2011
Сообщений: 16

Копирование массива

16.11.2011, 13:42. Показов 17505. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пожалуйста, подскажите, как создать автономную копию массива, чтобы при изменении оригинала копия не менялась (и наоборот).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2011, 13:42
Ответы с готовыми решениями:

Копирование двумерного массива
В общем, есть задание. Создать двумерный динамический массив, вывести его в StringGrid1, а потом уже с этим массивом выполнять всякие...

Копирование массива с сохранением индексов
var id: integer; const NameArray: array of string = ('1','2',...); Str = '2'; function GetArrayStrIndex(index: string;...

Копирование обычного или вариантного массива в Excel, в чем разница?
Сразу к задаче: задача заполнять динамический массив из массивов в два значения - т.е. двумерный (тип Double) в течение 15 мин данными....

4
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.11.2011, 13:59
Здесь копия - это будет второй массив, совпадающий по размеру с первым. Содержимое второго массива надо скопировать из первого массива.
Если массив динамический:
Delphi
1
2
3
4
5
6
7
8
9
10
var
  Arr1, Arr2 : array of Integer;
  i : Integer;
begin
  SetLength(Arr1, 100);
...
  //Создаём копию.
  SetLength(Arr2, Length(Arr1));
  for i := 0 to High(Arr2) do Arr2[i] := Arr1[i];
...
Если требуется ускорить копирование, можно отключить код проверки индексов:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
  Arr1, Arr2 : array of Integer;
  i : Integer;
begin
  SetLength(Arr1, 100);
...
  //Создаём копию.
  SetLength(Arr2, Length(Arr1));
  {$R-}
  for i := 0 to High(Arr2) do Arr2[i] := Arr1[i];
  {$R+}
...
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
13.07.2015, 15:17
Mawrat, а как создать свою функцию для копирования массива? У меня function CopyArr1(Arr1,Arr2:array of Boolean):array;
не создается...
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
13.07.2015, 16:03
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  Form1: TForm1;
  s:boolean=true;
implementation
 
{$R *.dfm}
type mas=array of boolean;
function CopyArr1(Arr1:mas;n:byte):mas;
begin
result:=Arr1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b:mas;
    n,i:byte;
begin
randomize;
n:=6;
setlength(a,n);
setlength(b,n);
for i:=0 to n-1 do
 begin
  a[i]:=odd(i);
  label1.Caption:=label1.Caption+' '+booltostr(a[i],s);
 end;
b:=CopyArr1(a,n);
for i:=0 to n-1 do
label2.Caption:=label2.Caption+' '+booltostr(b[i],s);
end;
1
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
14.07.2015, 12:45
Для динамических массивов такой подход не сработает. Здесь дело вот в чём. Если переменные ссылаются на динамические массивы, то их присваивание приведёт к копированию только ссылки (указателя на данные массива). Т. е., копия массива не будет создана и обе переменные будут ссылаться на один и тот же динамический массив. При этом утечек памяти не будет. Потому, что динамические массивы, длинные строки, варианты и интерфейсы являются объектами с автоматическим подсчётом ссылок. Учёт ссылок ведёт менеджер памяти программы. Как только счётчик ссылок на такой объект оказывается равен нулю - память, выделенная для него, автоматически освобождается.
Пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b : array of Integer;
  i : Integer;
begin
  SetLength(a, 5);
  SetLength(b, 5);
  for i := 0 to High(a) do
  begin
    a[i] := 1;
    b[i] := 2;
  end;
 
  //Получим сообщение: "A и B ссылаются на разные массивы."
  if Pointer(a) = Pointer(b) then
    ShowMessage('A и B ссылаются на один и тот же массив.')
  else
    ShowMessage('A и B ссылаются на разные массивы.');
  
  { При этом произойдёт следующее:
    1. В переменную b будет записан указатель из переменной a.
    2. Счётчик ссылок массива, на который раньше ссылалась переменная b, обнулится
       и менеджер памяти освободит память, занятую для этого массива.
    3. Счётчик ссылок массива, на который ссылается переменная a, станет равным 2.
       Потому, что теперь на этот массив ссылаются 2 переменные - a и b. }
  b := a;
 
  //Получим сообщение: "A и B ссылаются на один и тот же массив."
  if Pointer(a) = Pointer(b) then
    ShowMessage('A и B ссылаются на один и тот же массив.')
  else
    ShowMessage('A и B ссылаются на разные массивы.');
 
  b[0] := 3;
  //Получим сообщение: "a[0] = 3, b[0] = 3" - т. е. a и b указывают на один и тот же массив.
  ShowMessage('a[0] = ' + IntToStr(a[0]) + ', b[0] = ' + IntToStr(b[0]));
end;
Для динамических массивов действует следующее правило: Если несколько переменных ссылаются на один и тот же массив, то попытка изменения значения элемента через обращение к одной из таких переменных не приводит к созданию нового массива. Но если происходит попытка изменить размер массива через одну из таких переменных, то для такой переменной будет создана новая копия массива с новой длинной и в эту переменную будет записан указатель на эту новую копию массива.

Поэтому, чтобы получить копию динамического массива, можно действовать двумя способами:
1. Применить функцию Copy().
2. Выделить для массива память и скопировать значения элементов.
3. Либо - скопировать ссылку на массив и затем вызвать для него функцию изменения длины.
Пример для способа 3:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b : array of Integer;
  i : Integer;
begin
  SetLength(a, 5);
  SetLength(b, 5);
  for i := 0 to High(a) do
  begin
    a[i] := 1;
    b[i] := 2;
  end;
 
  //Получим сообщение: "A и B ссылаются на разные массивы."
  if Pointer(a) = Pointer(b) then
    ShowMessage('A и B ссылаются на один и тот же массив.')
  else
    ShowMessage('A и B ссылаются на разные массивы.');
  
  { Далее произойдёт следующее:
    1. В переменную b будет записан указатель из переменной a.
    2. Счётчик ссылок массива, на который раньше ссылалась переменная b, обнулится
       и менеджер памяти освободит память, занятую для этого массива.
    3. Счётчик ссылок массива, на который ссылается переменная a, станет равным 2.
       Потому, что теперь на этот массив ссылаются 2 переменные - a и b. }
  b := a;
 
  //Получим сообщение: "A и B ссылаются на один и тот же массив."
  if Pointer(a) = Pointer(b) then
    ShowMessage('A и B ссылаются на один и тот же массив.')
  else
    ShowMessage('A и B ссылаются на разные массивы.');
 
  { Далее произойдёт следующее:
    Менеджер памяти обнаружит, что к переменной b применена функция изменения длины.
    Так, как счётчик ссылок на массив больше единицы, то менеджер создаст в памяти
    новый экземпляр массива с новой длиной. И указатель на этот новый массив запишет
    в переменную b. При этом счётчик ссылок на новый массив станет равным 1. А счётчик ссылок
    на тот массив, на который ссылается переменная a, уменьшится на 1 и станет равным: 2 - 1 = 1. }
  SetLength(b, Length(b));
    
  //Получим сообщение: "A и B ссылаются на разные массивы."
  if Pointer(a) = Pointer(b) then
    ShowMessage('A и B ссылаются на один и тот же массив.')
  else
    ShowMessage('A и B ссылаются на разные массивы.');
 
  b[0] := 3;
  //Получим сообщение: "a[0] = 1, b[0] = 3" - т. е. a и b указывают на разные массивы.
  ShowMessage('a[0] = ' + IntToStr(a[0]) + ', b[0] = ' + IntToStr(b[0]));
end;
Добавлено через 2 минуты
Пример с функцией Copy():
Delphi
1
b := Copy(a); //Теперь b - это новый массив, содержимое которого скопировано из массива a.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2015, 12:45
Помогаю со студенческими работами здесь

Копирование массива в центр другого массива
Комрады. рад приветствовать всех. Я новичок в ИТ и программировании и прохожу обучение. Добавлено через 9 минут подскажите знающие,...

Копирование массива
Как скопировать массив одномерный, который ввели?

копирование массива
Здравствуйте! значит мне нужно скопировать массив! в первом куске кода я заполняю массив рандомно во втором куске мне нужно использовать...

Копирование массива
Добрый день, уважаемые! Новичок, совсем ещё зелёный, только ещё учусь программированию на Java. Такой вот вопрос поставил меня в тупик:...

Копирование массива
Здравствуйте. Собственно вот в чем вопрос. Есть три текстэрии. В первую текстирию я ввожу текст, во вторую последовательность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru