Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/86: Рейтинг темы: голосов - 86, средняя оценка - 4.91
 Аватар для XenoFlize
1 / 1 / 0
Регистрация: 09.11.2011
Сообщений: 16

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

16.11.2011, 13:42. Показов 17267. Ответов 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
13113 / 5894 / 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
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
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
13113 / 5894 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru