powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Универсальная передача указателя
11 сообщений из 11, страница 1 из 1
Универсальная передача указателя
    #39931986
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция, которая в разных версиях Delphi определена разными способами
Код: pascal
1.
2.
3.
func(AParam: PPAnsiChar);
func(AParam: PPByte);
func(var AParam: PByte);


вопрос: как написать код с минимальным количеством {$IFDEF}, который бы вызывал эту функцию в разных версиях

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39931989
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Есть функция, которая в разных версиях Delphi определена разными способами
Код: pascal
1.
2.
3.
func(AParam: PPAnsiChar);
func(AParam: PPByte);
func(var AParam: PByte);


вопрос: как написать код с минимальным количеством {$IFDEF}, который бы вызывал эту функцию в разных версиях
С уважением, Vasilisk


Первые два, по-идее, можно вызвать func(@Value), где Value - это PByte, например.
А для третьего можно заифдефить PByte(Value).

Итого что-то вроде
Код: pascal
1.
func({$IFDEF V3}PByte({$ELSE}Pointer(@{$ENDIF}Value));
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39931991
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А третий точно var AParam: P Byte?
Да. А почему сомнения? Поменяли логику возврата параметра
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39931993
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
А третий точно var AParam: P Byte?
Да. А почему сомнения? Поменяли логику возврата параметра

Не заметил PP в первых двух, я отредактировал ответ.
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39931994
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока сделал так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  {$IF VER < 2}
  PDataType = PAnsiChar;
  {$ELSE}
  PDataType = PByte;
  {$IFEND}

var
  param: PDataType;
begin
  func(
    {$IF VER < 3}@{$IFEND}
    param
  );
end;
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39931995
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
вопрос: как написать код с минимальным количеством {$IFDEF}, который бы вызывал эту функцию в разных версиях

Думаю, это не самый важный из вопросов. Отвечу так. Если стоит цель вызывать её из многих мест кода, компилируемого в разных версиях Delphi, то я сделал бы для неё функцию-обёртку, куда и упаковал бы парочку ifdef-ов. Если же нужно вызывать её однажды, то реализацию этой обёртки можно просто написать в месте вызова. В любом случае, стремиться нужно не к "минимальному количеству ifdef-ов", а к максимальной надёжности и сопровождаемости этого фрагмента кода.
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39932037
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
и дальше что, при каждом чихе на param зелёнку разливать?
Выбери для себя один вариант и дальше так и пиши. Логика работы этих 'func' то одинаковая, или как?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var Funk: procedure(var AParam: PByte);

procedure Work;
var
 Param: PByte;
begin
 Funk(Param);
end;

initialization
 Funk := @func;

PS
Код: pascal
1.
2.
func(const AParam: PPAnsiChar);
func(const AParam: PPByte);

...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39932148
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я за обертку как советует softwarer.
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39932260
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
В любом случае, стремиться нужно не к "минимальному количеству ifdef-ов", а к максимальной надёжности и сопровождаемости этого фрагмента кода.
Вот об этом и пекусь. Ибо куча ifdef-ов читабельности не добавляют
Bred eFeM
Выбери для себя один вариант и дальше так и пиши.
Еще раз
_Vasilisk_
функция, которая в разных версиях Delphi определена разными способами
Мне лично пофигу как она определена, но приходится поддерживать разные версии Delphi и код должен компилироваться в любой из них
Bred eFeM
Код: pascal
1.
2.
initialization
 Funk := @func;

Так не получится. Функция - метод интерфейса. А заморачиваться с TMethod еще хуже
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39932335
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Так не получится. Функция - метод интерфейса. А заморачиваться с TMethod еще хуже

Ну блин. Сразу надо было говорить.
Тогда только так
intf.EvilMethod({$IFNDEF EvilMethodUsesVar}@{ENDIF}Param);
либо через наследника
...
Рейтинг: 0 / 0
Универсальная передача указателя
    #39932364
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, хозяин-барин,
определена то она разными способами, а по факту и там и там как параметр передаётся указатель на указатель.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Универсальная передача указателя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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