Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Основной форум

Основной форум Сюда все проблемы связанные с программированием.

Ответ
 
Опции темы
Старый 01.02.2012, 16:06   #1
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Массив записей = массив указателей?

Заметил в мп такую... особенность:
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. Это баг или фича?
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 16:13   #2
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Массив записей = массив указателей?

Не баг и не фича, а особенности реализации, так сказать.
Записи (как типы) - отдельные классы, переменные данного типа - экземпляры класса, так что копируя переменную (т.е. экземпляр класса) мы копируем не только поля, а всю структуру в целом, и указатели тоже.
Не знаю, предвидели ли разработчики такой эффект, но обойти его можно, только копируя поля вручную.
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 16:25   #3
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Массив записей = массив указателей?

То есть все-таки в массиве хранятся не сами записи (экземпляры класса), а указатели на них? И если так - можно ли это как-нибудь использовать для реализации динамических массивов?
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 16:44   #4
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Массив записей = массив указателей?

Хранятся экземпляры класса, массив a:array[1..10] of r; создается как a = new R_1[10];, правда, там используется еще какой-то странный массив, его роль мне непонятна, но копирование и присвоение значений производится без его использования. просто, как я понимаю, экземпляр класса содержит в себе указатель на данные в памяти, и копируя экземпляр мы копируем и этот адрес.
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 17:32   #5
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Массив записей = массив указателей?

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

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.
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 18:14   #6
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Массив записей = массив указателей?

Тогда вообще непонятно, как оно работает, разбираться надо...
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com