Типы данных

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Типы данных

Сообщение olegy123 » 04.12.2017 08:24:14

Объясните мне пожалуйста политику работы в паскале с указателями.
вот пример
http://www.delphibasics.ru/PInt64.php
Код: Выделить всё
var
  int64Ptr : PInt64;
  a : TDateTime;

begin
  // Ассигнование памяти для трёх Int64 переменных
  GetMem(int64Ptr, 3 * SizeOf(Int64));

  // Заполнение этих переменных значениями
  int64Ptr^ := 1;
  Inc(int64Ptr);
  int64Ptr^ := 22;
  Inc(int64Ptr);
  int64Ptr^ := 333;

  // Показ этих значений
  Dec(int64Ptr, 2);
  ShowMessageFmt('Значение 1 = %d',[int64Ptr^]);
  Inc(int64Ptr);
  ShowMessageFmt('Значение 2 = %d',[int64Ptr^]);
  Inc(int64Ptr);
  ShowMessageFmt('Значение 3 = %d',[int64Ptr^]);
end;


вот пример работы с классом
http://www.delphibasics.ru/Pointer.php
Код: Выделить всё
var
  generalPtr : Pointer;  // Указатель на что-нибудь
  formPtr    : ^TForm;   // Указатель на объект формы

begin
  // Форма текущего модуля адресуемая через ключевое слово self
  generalPtr := Addr(self);

  // Мы можем присвоить этот указатель указателю формы
  formPtr := generalPtr;

  // И установить заголовок формы, чтобы показать это
  [b]formPtr.Caption := 'Test program';[/b]
end;

почему в одном случае мы должны указывать явно int64Ptr^ := 1;
а вот работу с классами в таком виде formPtr^.Caption неправильно.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение zub » 04.12.2017 08:30:20

В mode delphi ^ можно опустить, в objfpc нельзя.
В данном случае компилятор сам приводит formPtr.Caption := 'Test program'; к formPtr^.Caption := 'Test program';

>>вот пример работы с классом
глупый пример, неправильный
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Типы данных

Сообщение olegy123 » 04.12.2017 08:35:38

В {$mode objfpc}{$H+}
я столкнулся с тем что при передачи адреса (Self) мне приходит адресс на адресс переменную.

Добавлено спустя 2 минуты 7 секунд:
Просто в синтаксисе нужно указывать явно "^" а где то в местах присутствует очень своеобразный подход к указателям и классам
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение zub » 04.12.2017 09:13:16

лезти в классы через указатели смысла нету никакого... Они и пришли на замену обжектам какраз чтоб избавить программиста от возни с указателями.

^TForm - это не указатель на данные формы, это указатель на переменную содержащую адрес данных формы
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Типы данных

Сообщение olegy123 » 04.12.2017 09:43:53

Я про то что возникают непонятки
как при
PInteger(p)^:=1; правильно
PForm(p)^.Caption:=..; уже ошибка. нужно так TForm(p).Caption:=..;
нет общего подхода.

что будет с :
tvar = object..end;
pvar=^tvar;
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение Дож » 04.12.2017 10:34:59

Общего подхода нет (и не должно быть -- object и class должны же чем-то различаться, иначе нужды в двух словах для одной конструкции в языке не было бы).

Переменные с типом какого-то class'а -- это всегда указатели, и их синтаксис предполагает неявное разыменование.

Указатель на object будет действовать как обычный указатель.

Опцией {$MODESWITCH AUTODEREF} можно разрешить неявное разыменование всех конструкций, т.е. вместо X^.F можно будет писать X.F даже для указателей на record'ы и object'ы.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Типы данных

Сообщение Лекс Айрин » 04.12.2017 11:02:48

Дож писал(а):Общего подхода нет (и не должно быть -- object и class должны же чем-то различаться, иначе нужды в двух словах для одной конструкции в языке не было бы).


Вообще-то как бы и нет нужды. Причины наличия дублирования чисто исторические (из-за совместимости).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Типы данных

Сообщение olegy123 » 04.12.2017 13:00:37

Дож писал(а):Переменные с типом какого-то class'а -- это всегда указатели, и их синтаксис предполагает неявное разыменование.

Тут скорее пошли с противоположного конца - зачем указывать указатели, а с ООП их активно стали применять.. зачем указывать указатели раз это зло, вот и зашили их в спецификацию, мол раз класс А, то работаем не с А^ а A.
оно бы ничего - только когда начинаешь работать глубоко тут выясняется что А это А^, а чтобы передать А^ нужно работать с А, но с другими элементами другой подход.

Еще вопрос возник к гуру - когда в функцию/процедуру передается ссылка а когда копия объекта и что возвращается . Существуют ли там подводные камни?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение serbod » 04.12.2017 14:22:04

Тип object - это переменная, по сути тот же record, только с методами, конструктором-деструктором, наследованием и счетчиком ссылок. При передаче в качестве параметра ведет себя в точности как record. Память выделяется автоматически в стеке, освобождается при выходе из области видимости переменной и нулевом счетчике ссылок.

Тип calss - это уже чисто абстрактное понятие. По сути, типизированный указатель. Память выделяется явным образом в куче, освобождается тоже явным образом. Счетчика ссылок нет, на область видимости пофиг. Экземпляр класса очень похож на объект, но нифига не объект, не надо их путать. TObject не совместим с object.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Типы данных

Сообщение Ichthyander » 04.12.2017 15:24:52

serbod писал(а):Тип object - это переменная, по сути тот же record, только с методами, конструктором-деструктором, наследованием и счетчиком ссылок. При передаче в качестве параметра ведет себя в точности как record. Память выделяется автоматически в стеке, освобождается при выходе из области видимости переменной и нулевом счетчике ссылок.

Может я что-то не так понял... Но объект при передачи в процедуру не ведет себя как record со счетчиком ссылок. Это же не стринг. Объект при передаче в качестве параметра, ведет себя как если бы передали указатель. То есть если внутри процедуры, Вы уничтожите объект, то при выходе, переменная типа объект будет указывать на несуществующий объект.

Добавлено спустя 1 минуту 50 секунд:
Да, и еще, если переменной типа объект присвоить nil, то не произойдет уничтожение объекта, но в результате может возникнуть (если об это не позаботится программист) утечка памяти. Это к слову "о счетчике ссылок"
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Типы данных

Сообщение serbod » 04.12.2017 15:57:12

Вот поэтому object не рекомендуют использовать, слишком много непоняток и условностей.

object нельзя просто так уничтожить, как нельзя уничтожить record. Можно только освободить его память, если она была выделена ранее для указателя на object. Можно попытаться обмануть систему, взять указатель на существующий object и освободить по нему память. Скорее всего, будет ошибка.

Присвоить nil переменной типа object тоже нельзя, они не совместимы.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Типы данных

Сообщение Ichthyander » 04.12.2017 16:53:04

serbod писал(а):Вот поэтому object не рекомендуют использовать, слишком много непоняток и условностей.

Кто не рекомендует??? Я сам стараюсь использовать object. Все там понятно, как и в других языках программирование поддерживающих ООП.
object нельзя просто так уничтожить, как нельзя уничтожить record. Можно только освободить его память, если она была выделена ранее для указателя на object. Можно попытаться обмануть систему, взять указатель на существующий object и освободить по нему память. Скорее всего, будет ошибка.

"Решительно" Вас не понимаю (без всякой иронии)...
Присвоить nil переменной типа object тоже нельзя, они не совместимы.

У меня опять складывается впечатление: либо я на форуме о другом языке программирования, либо я вообще не понял о каких "object" идет речь в этом топике. Переменные типа TObject и переменные его наследников по сути указатели и им можно, а иногда и нужно присваивать nil. А чем вообще эти переменные по Вашему инициируются????
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Типы данных

Сообщение Лекс Айрин » 04.12.2017 17:15:06

Ichthyander писал(а):Переменные типа TObject и переменные его наследников по сути указатели и им можно, а иногда и нужно присваивать nil. А чем вообще эти переменные по Вашему инициируются????


Есть класс TObject, а есть объектный тип -- это совсем разные типы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Типы данных

Сообщение Ichthyander » 04.12.2017 17:39:10

Лекс Айрин писал(а):Есть класс TObject, а есть объектный тип -- это совсем разные типы.
Когда я пишу о переменных типа TObject, я, конечно же, имею ввиду указатели на объекты класса TObject, а не переменные типа классов
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Типы данных

Сообщение Лекс Айрин » 04.12.2017 17:59:16

Есть объекты типа класс и есть объекты типа объект.

TObject относится к первым.


переменная объектного типа описывается как

Код: Выделить всё
_имя_ object (_тип родитель_)
описание полей
end;

Несмотря на то, что внешне класс описывается так же поведение объекта типа класс достаточно сильно отличается.
Я не знаю, зачем нужен был вообще тип TObject, но тому кто это придумал но путаницы это прибавило знатно.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru