forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Массив записей = массив указателей? (http://forum.boolean.name/showthread.php?t=16262)

AVL 01.02.2012 16:06

Массив записей = массив указателей?
 
Заметил в мп такую... особенность:
Код:

program NewProject;
type r1=record
  n:integer;
end;

var
  a:array[1..10] of r1;
  i:integer;

begin
  a[1].n:=1;
  a[2]:=a[1];
  a[1].n:=2;
  drawtext(''+a[2].n,0,0);
  repaint;
  delay(1000);
end.

Результат - выводится 2. Это баг или фича?

ViNT 01.02.2012 16:13

Ответ: Массив записей = массив указателей?
 
Не баг и не фича, а особенности реализации, так сказать.
Записи (как типы) - отдельные классы, переменные данного типа - экземпляры класса, так что копируя переменную (т.е. экземпляр класса) мы копируем не только поля, а всю структуру в целом, и указатели тоже.
Не знаю, предвидели ли разработчики такой эффект, но обойти его можно, только копируя поля вручную.

AVL 01.02.2012 16:25

Ответ: Массив записей = массив указателей?
 
То есть все-таки в массиве хранятся не сами записи (экземпляры класса), а указатели на них? И если так - можно ли это как-нибудь использовать для реализации динамических массивов?

ViNT 01.02.2012 16:44

Ответ: Массив записей = массив указателей?
 
Хранятся экземпляры класса, массив a:array[1..10] of r; создается как a = new R_1[10];, правда, там используется еще какой-то странный массив, его роль мне непонятна, но копирование и присвоение значений производится без его использования. просто, как я понимаю, экземпляр класса содержит в себе указатель на данные в памяти, и копируя экземпляр мы копируем и этот адрес.

AVL 01.02.2012 17:32

Ответ: Массив записей = массив указателей?
 
Цитата:

Сообщение от ViNT (Сообщение 218386)
как я понимаю, экземпляр класса содержит в себе указатель на данные в памяти, и копируя экземпляр мы копируем и этот адрес.

Такое наблюдается только при работе с массивом:

Код:

program NewProject;
type r1=record
  n:integer;
end;

var
  a1,a2:r1;
  i:integer;

begin
  a1.n:=1;
  a2:=a1;
  a1.n:=2;
  drawtext(''+a2.n,0,0);
  repaint;
  delay(1000);
end.

Результат - 1.

И при пересылке из одного массива в другой тоже указатель копируется:
Код:

program NewProject;
type r1=record
  n:integer;
end;

var
  a1,a2: array[1..10] of r1;
  i:integer;

begin
  a1[1].n:=1;
  a2[1]:=a1[1];
  a1[1].n:=2;
  drawtext(''+a2[1].n,0,0);
  repaint;
  delay(1000);
end.

Результат - 2.

ViNT 01.02.2012 18:14

Ответ: Массив записей = массив указателей?
 
Тогда вообще непонятно, как оно работает, разбираться надо...


Часовой пояс GMT +4, время: 13:05.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot