FPC VA_LIST - как использовать

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

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

FPC VA_LIST - как использовать

Сообщение wavebvg » 03.07.2014 16:07:33

В текущей версии компилятора нельзя использовать array of const из не cdecl; функции в cdecl; функцию.
Подскажите, какой заполнить VA_LIST.
К примеру для вызова
Код: Выделить всё
function vsnprintf(AResult: PChar; ASize: Integer; const AFormat: PChar; AArgs: Pointer): Integer; cdecl; external 'libc';

нужно что-то записать в AArgs. Как это сделать?
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: FPC VA_LIST - как использовать

Сообщение sign » 04.07.2014 05:53:13

Попробуйте такой вот вариант
Код: Выделить всё
function VotKakToTak: Integer;
var My: array of Integer; // Или что мы хотим;
    P: Pointer absolute My;
begin
  My[0] := 0; //[Всё, что надо];
  My[1] := 1;
  Result := vsnprintf(AResult, ASize, AFormat, P);
end;
     
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: FPC VA_LIST - как использовать

Сообщение wavebvg » 04.07.2014 09:16:21

Прошу прощения, не уточнил: требуется это выполнить на 64 битной платформе
Как я понимаю - на 32 битной это дело как бы попроще
Посмотрел исходники компилятора, там размазано так, что концов не сведёшь, одним словом "ООП": нужно очень вдумчиво разбираться, а задача, казалось бы, стандартная для импорта библиотек

ЗЫ Самое интересное, что чаще всего ответ такой: напишите обертку на C или "параметры передаются не полностью, поэтому нельзя". Первый ответ без комментариев, второй слишком расплывчатый, чтобы поверить, что у всех компиляторов ОК, а тут... НЕ ХВАТАЕТ )))
ЗЫ2 Параметры нужно в обратном порядке передавать
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: FPC VA_LIST - как использовать

Сообщение Sergei I. Gorelkin » 04.07.2014 13:33:58

Нет такого понятия как "64-битная платформа". На 32-битных процессорах Intel, windows и linux (и остальные платформы в общем-то тоже) действительно схожи в смысле передачи параметров настолько, что их можно воспринимать как одну платформу, но у 64-битных windows и linux совершенно разные способы передачи параметров. Если рассматривать более экзотическую powerpc64-linux - там будет третий способ. Поэтому таки да, размазано, по всему компилятору, а точнее, находится в модулях cpupara.pas в директориях соответствующих процессоров.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: FPC VA_LIST - как использовать

Сообщение wavebvg » 04.07.2014 17:59:44

Не в этом дело, просто оперировать приходится несколькими 10-ми параметров, которые просто посмотрев не видно, что делают.
Там есть спец. метод для обработки аргуметов, но оперируется там объектами и флагом - т.е. нужно заранее изучить, как потом это все разворачивается.
Код компилятора не применить в коде обычной программы (нужно разобраться, как ставить все флаги).
Буду искать, может задача за меня уже кем-то решена, потому что компилятор с ней сам справляется (просто разработчик чего-то опасался), значит и есть уже универсальная реализация, только надо её найти и применить.
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: FPC VA_LIST - как использовать

Сообщение Vapaamies » 04.07.2014 21:45:27

В коде KOL вызывается виндовая функция wvsprintf, описанная с va_list:
Код: Выделить всё
function Format( const fmt: KOLString; params: Array of const ): KOLString;
var Buffer: array[ 0..1023 ] of KOLChar;
    ElsArray, El: PDWORD;
    I : Integer;
    P : PDWORD;
begin
  ElsArray := nil;
  if High( params ) >= 0 then
    GetMem( ElsArray, (High( params ) + 1) * sizeof( Pointer ) );
  El := ElsArray;
  for I := 0 to High( params ) do
  begin
    P := @params[ I ];
    P := Pointer( P^ );
    El^ := DWORD( P );
    Inc( El );
  end;
  wvsprintf( PKOLChar(@Buffer[0]), PKOLChar( fmt ), Pointer( ElsArray ) );
  Result := Buffer;
  if ElsArray <> nil then
     FreeMem( ElsArray );
end;

Под x64 не компилировал, не пользую.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: FPC VA_LIST - как использовать

Сообщение wavebvg » 04.07.2014 23:26:29

Спасибо большое, что-то я толком и не посмотрел в KOL, хотя скачал как раз для этого...

Добавлено спустя 1 час 27 минут 15 секунд:
Спасибо большое, что-то я толком и не посмотрел в KOL, хотя скачал как раз для этого...
Может кому и пригодится

32
Код: Выделить всё
function Format32(const AFormat: String; const AArgs: array of const): string;
var
  VLength: Integer;
  VArgs: array of Integer;
  i: Integer;
begin
  SetLength(VArgs, Length(AArgs));
  for i := 0 to High(AArgs) do
    VArgs[i] := Integer(AArgs[i].VPChar);
  SetLength(Result, 1000);
  VLength := vsnprintf(PChar(Result), 1000, PChar(AFormat), Pointer( @VArgs[0] ));
  SetLength(Result, VLength);
end;


64
Код: Выделить всё
type
  TVAItem = record
    GPOffset: Cardinal;
    FPOffset: Cardinal;
    OverflowArgArea: Pointer;
    RegSaveArea: Pointer;
  end;
  TVAList = array[0..0] of TVAItem;
  PVAList = ^TVAList;
var
  DefaultVAList: TVAList;
function Format3(const AFormat: String; const AArgs: array of const): string;
var
  VLength: Integer;
  VAList: TVAList;
  VArgs: array of Integer;
  i: Integer;
begin
  SetLength(VArgs, Length(AArgs)*2);
  for i := 0 to High(AArgs) do
    VArgs[i*2] := Integer(AArgs[i].VPChar);
  VAList := DefaultVAList;
  VAList[0].OverflowArgArea := @VArgs[0];
  VAList[0].RegSaveArea := @VArgs[0];
  SetLength(Result, 1000);
  VLength := vsnprintf(PChar(Result), 1000, PChar(AFormat), Pointer( @VAList[0] ));
  SetLength(Result, VLength);
end;

initialization
  DefaultVAList[0].GPOffset := 6 * 8;
  DefaultVAList[0].FPOffset := 6 * 8 + 16 * 16; 


Сейчас прикинул, для чего мне это пригодится и понял... Что пригодится только для ARM и x32 )))
Просто когда делал на компе не было кросса )))
Версию для ARM пока не на чем проверить
Подробнее для x64 прямым текстом в документации, главное долистать
Пример, описывающий что и как для x64 в исходниках
Описание что да как инициализировать
Для ARM-а должно прокатить способ от x32
Всем огромное спасибо
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: FPC VA_LIST - как использовать

Сообщение Vapaamies » 05.07.2014 05:28:22

wavebvg писал(а):Для ARM-а должно прокатить способ от x32

Платформы x32 не знаю, знаю x86. В KOL для x86 используется вариант на ассемблере. :lol:
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


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

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

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

Рейтинг@Mail.ru