Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / record helper for на тип Pointer / 19 сообщений из 19, страница 1 из 1
30.07.2018, 13:21
    #39681029
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Создаю структуру, делаю на неё Pointer. Этот Pointer указываю в record helper for X в итоге ничего не работает, хотя Self определён.

PTest. не имеет никаких GetX

Это баг?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  PTest = ^TTest;

  TTest = record
    X: Integer;
  end;

  TTestHelper = record helper for PTest
  public
    function GetX: Integer; inline;
  end;


...

[SRC delphi]function TTestHelper.GetX: Integer;
begin
  Result := Self.X;
end;


[/SRC]



Кстати, такой код он считает вполне валидным
Код: pascal
1.
2.
3.
4.
function TTestHelper.GetX: char;
begin
  Result := ^X;
end;
...
Рейтинг: 0 / 0
30.07.2018, 13:58
    #39681069
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Гирлионайльдо,

А зачем такие извращения? Почему бы для TTest не сделать?
...
Рейтинг: 0 / 0
30.07.2018, 14:09
    #39681074
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
alekcvpА зачем такие извращения? Почему бы для TTest не сделать?+1

А если так?
Код: pascal
1.
2.
3.
4.
function TTestHelper.GetX: Integer;
begin
  Result := Self^.X;
end;
...
Рейтинг: 0 / 0
30.07.2018, 14:13
    #39681075
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
alekcvp,

Хочется сделать нормальный аналог String (Он ведь тоже Pointer, только как то по умному определён)

В общем, строки в 4 гб захотелось! Надоел этот сраный EOutOfMemory со своим MaxInt в 2147483647


Пока пришёл к выводу, что самое лучшее. Это определить так
Код: pascal
1.
2.
3.
  TMemoryString = array of Byte;

  TMemoryStringHelper = record helper for TMemoryString



Выделяем нужную длину, пишем в неё структуру. А дальше сама строка
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  // Sizeof == 16
  TSSEString = record
    CurrLength, MaxLength: NativeUInt; // Текущая используемая длина. И максимально выделанная (Аналог StringBuilder)
    CodePage: Word; // Текущая кодировка 
    elemSize: Byte; // Тип символа.
    Ref: Cardinal; // Количество ссылок
  end;
...
Рейтинг: 0 / 0
30.07.2018, 14:14
    #39681077
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
_Vasilisk_,

Не определён.
...
Рейтинг: 0 / 0
30.07.2018, 14:19
    #39681080
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Гирлионайльдо,

А чего UINT а не int64?
...
Рейтинг: 0 / 0
30.07.2018, 14:28
    #39681085
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
rgreat,

По сути, можно и UInt64. Только он 8 ... И над этим типом, сложно работать 32 битным процессором.

По этому NativeUInt ибо манипуляция происходит в два раза быстрее.


И если что, то можно будет создать доп тип, если нужно будут строки более 4 гб
...
Рейтинг: 0 / 0
30.07.2018, 14:47
    #39681094
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
ГирлионайльдоХочется сделать нормальный аналог String
...
Рейтинг: 0 / 0
30.07.2018, 14:47
    #39681095
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
rgreatГирлионайльдо,

А чего UINT а не int64?
Ну и что будет делать 32-разрядная софтина со строками больше 4 Гб?
...
Рейтинг: 0 / 0
30.07.2018, 14:51
    #39681098
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
ГирлионайльдоВ общем, строки в 4 гб захотелось!а ничего, что без специального ключа ты не выделишь непрерывный кусок памяти объемом даже куда меньше, чем MaxInt?
...
Рейтинг: 0 / 0
30.07.2018, 14:52
    #39681101
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Василий 2rgreatГирлионайльдо,

А чего UINT а не int64?
Ну и что будет делать 32-разрядная софтина со строками больше 4 Гб?
пусть автор сначала расскажет, как он планирует оперировать строками больше 4 Гб в 32-разрядном режиме
...
Рейтинг: 0 / 0
30.07.2018, 15:20
    #39681124
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
В древнем Китае желающим странного отрубали голову. Просто и надежно.
...
Рейтинг: 0 / 0
30.07.2018, 15:56
    #39681152
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Гирлионайльдоrgreat,

По сути, можно и UInt64. Только он 8 ... И над этим типом, сложно работать 32 битным процессором.

По этому NativeUInt ибо манипуляция происходит в два раза быстрее.


И если что, то можно будет создать доп тип, если нужно будут строки более 4 гб
А какой смысл в UInt64 для х86?
Это только для х64.
...
Рейтинг: 0 / 0
30.07.2018, 16:59
    #39681197
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
rgreatА какой смысл в UInt64 для х86?
Это только для х64.
На вскидку - обмен данными с 64-битным приложением (через пайп/сокет/файл/http/ftp...)
...
Рейтинг: 0 / 0
30.07.2018, 17:28
    #39681215
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Cobalt747rgreatА какой смысл в UInt64 для х86?
Это только для х64.
На вскидку - обмен данными с 64-битным приложением (через пайп/сокет/файл/http/ftp...)
Попрос был в контексте задачи топикстартера.

Для чего нужен Int64 вообще я в курсе. ;)
...
Рейтинг: 0 / 0
30.07.2018, 18:03
    #39681243
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
ГирлионайльдоКстати, такой код он считает вполне валидным
Код: pascal
1.
2.
3.
4.
function TTestHelper.GetX: char;
begin
  Result := ^X;
end;



^X или @X ???

Если второе - то это потому, что по умолчанию пойнтеры не типизированные
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Type-checked_pointers_(Delphi)
...
Рейтинг: 0 / 0
30.07.2018, 18:08
    #39681246
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Гирлионайльдо
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  // Sizeof == 16
  TSSEString = record
    CurrLength, MaxLength: NativeUInt; // Текущая используемая длина. И максимально выделанная (Аналог StringBuilder)
    CodePage: Word; // Текущая кодировка 
    elemSize: Byte; // Тип символа.
    Ref: Cardinal; // Количество ссылок
  end;



На x64 будет SizeOf = 24

Кстати, ты бы его сразу проверял в коде, завёл бы например метод в record'e.
Жаль, что у рекордов ,в отличие от классов, нет конструкторов типа....
...
Рейтинг: 0 / 0
30.07.2018, 18:10
    #39681248
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
ГирлионайльдоPTest. не имеет никаких GetX
_Vasilisk_
Код: pascal
1.
2.
3.
4.
function TTestHelper.GetX: Integer;
begin
  Result := Self^.X;
end;


ГирлионайльдоНе определён.

Кто на ком стоял ?

у тебя неопределён PTest.GetX - или у тебя неопределён X внутри PTest.GetX ?
...
Рейтинг: 0 / 0
30.07.2018, 18:12
    #39681250
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
record helper for на тип Pointer
Гирлионайльдо
Код: pascal
1.
2.
3.
4.
  TTestHelper = record helper for PTest
  public
    function GetX: Integer; // без inline;
  end;



или вообще просто вот так

Код: pascal
1.
2.
3.
4.
5.
6.
  TTest = record
  private
    X: Integer;
  public
    property GetX: integer read X;
  end;



Другими словами - на хрен тебе тут вообще хелперы?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / record helper for на тип Pointer / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]