Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=6728874&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 21:36:30 2016
Кодировка: Windows-1251
Вопрос по указателям для типа record (Delphi) - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
Ighn
Helix pomatia

Рег.: 15.06.2005
Сообщений: 383
Из: Москва
Рейтинг: -10
  Вопрос по указателям для типа record (Delphi)
      12.10.2007 10:09
1

Ковыряюсь тут с одной прогой. Работаю с записями. Понадобилось очищать все поля записи одним махом. Задумался как реализовать. Напрямую, видимо, не получается. Начал делать через указатели. Получилось. Выяснилась одна неприятная особенность: когда работаешь с фактическими записями, то они всегда нормально инициализируются Delphi, наподобие глобальных переменных. Если работаешь с указателем на запись, то получается, что до присвоения какому-либо полю значения оно не определено. Все вроде понятно, так и должно быть, очевидно. Только вот незадача: прога была ориентирована на негласную инициализацию, а тут заглючила, поскольку поля записей стали вести себя наподобие локальных переменных.
--------------------------------------------------------------------------------------------------------
Type
  TMyRec = Record
  a: integer;
  b: integer;
  c: integer;
  d: array of integer;
 end;

var
PRec: ^TMyRec;

new(PRec);

//пока полям не присвоены числа, их значения не определены!!!!!!!!!!!!!!!!!!!!!!

With PRec^ do
begin
a:=100; b:=200; c:=300;
SetLength(d,5);
d[0]:=1; d[1]:=2; d[2]:=3; d[3]:=4; d[4]:=5;
end;

dispose(PRec);
-------------------------------------------------------------------------------------------------------
Вопрос: как мне инициализировать поля записей, когда они используются через указатель, не обращаясь отдельно к каждому полю?



Incertus animus dimidium sapientiae est - Сомнение - половина мудрости
_Seti
Добрые руки

Рег.: 18.10.2003
Сообщений: 3164
Рейтинг: 2131
  Re: Вопрос по указателям для типа record (Delphi) [re: Ighn]
      12.10.2007 10:33
 

первоначальная задача, насколько я понимаю - очистить все поля записи одним махом. Можно это сделать через вариантные массивы

code:
TMyRec = record case Integer of 1: (a1: Integer; a2: Integer; a3: Integer); 2: (RecArr: array [0..3*SizeOf(Integer) - 1] of byte); end;


поле RecArr хранится по тому же адресу, что и a1, a2,a3 - можно обнулить массив и обнулятся a1,a2,a3

halyavin
кфмн

Рег.: 14.12.2005
Сообщений: 916
Из: Moscow
Рейтинг: 622
  Re: Вопрос по указателям для типа record (Delphi) [re: Ighn]
      12.10.2007 10:41
 

Если тебе их нужно инициализировать нулем, то используй
code:
fillchar(prec^,sizeof(prec^),0);

Если тебе их нужно инициализировать не нулем, то нужно переходить на object (пока виртуальные методы не используются, он ведет себя как record):
code:
type TMyRec=object a:integer; b:integer; c:integer; d:array of integer; constructor init; destructor done; end; constructor TMyRec.init; begin a:=2; b:=1; c:=0; d:=nil; end; destructor TMyRec.done; begin setlength(d,0); end; var rec:^TMyRec; begin new(rec,init); writeln(rec^.a,',',rec^.b,',',rec^.c); dispose(rec,done); end.



Ighn
Helix pomatia

Рег.: 15.06.2005
Сообщений: 383
Из: Москва
Рейтинг: -10
  Re: Вопрос по указателям для типа record (Delphi) [re: _Seti]
      12.10.2007 12:21
 

Хорошо, а если в записи присутствуют разнородные данные, в том числе строки, массивы строк и др.?



Incertus animus dimidium sapientiae est - Сомнение - половина мудрости
Ighn
Helix pomatia

Рег.: 15.06.2005
Сообщений: 383
Из: Москва
Рейтинг: -10
  Re: Вопрос по указателям для типа record (Delphi) [re: halyavin]
      12.10.2007 12:22
 

Попробую, спасибо.



Incertus animus dimidium sapientiae est - Сомнение - половина мудрости
Ighn
Helix pomatia

Рег.: 15.06.2005
Сообщений: 383
Из: Москва
Рейтинг: -10
  Re: Вопрос по указателям для типа record (Delphi) [re: Ighn]
      12.10.2007 12:37
1

Да, еще: если методом fillchar заполнить выделенную память нулями, то как поведут себя поля с типом, отличным от integer? Как проще всего проинициализировать строковые переменные в записи, чтобы там не оказался "мусор"?



Incertus animus dimidium sapientiae est - Сомнение - половина мудрости
_Seti
Добрые руки

Рег.: 18.10.2003
Сообщений: 3164
Рейтинг: 2131
  Re: Вопрос по указателям для типа record (Delphi) [re: Ighn]
      12.10.2007 13:47
 

если использовать строки с фиксированной длиной, то в записи выделяется память для них, ссылки не используются
если используются разнородные данные, содержащие ссылки, то наверно, вместо записей надо использовать классы с published-секцией и получить информацию о количестве и типах полей в runtime

halyavin
кфмн

Рег.: 14.12.2005
Сообщений: 916
Из: Moscow
Рейтинг: 622
  Re: Вопрос по указателям для типа record (Delphi) [re: Ighn]
      12.10.2007 19:36
 

На сколько я знаю, типы вещественных данных при этом инициализируются нулем. Строки переменной длины инициализируются nil, что для паскаля равносильно пустой строке. Вот только с variant будут проблемы и, возможно, с множествами.

Ighn
Helix pomatia

Рег.: 15.06.2005
Сообщений: 383
Из: Москва
Рейтинг: -10
  Re: Вопрос по указателям для типа record (Delphi) [re: halyavin]
      12.10.2007 20:31
1

Попробовал через fillchar на разных типах полей (целое, строка, массив строк, булев тип). Все ok.
С конструктором-деструктором инициализация тоже хороший вариант. В общем, спасибо други!



Incertus animus dimidium sapientiae est - Сомнение - половина мудрости
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в