Подскажите, какой заполнить VA_LIST.
К примеру для вызова
- Код: Выделить всё
 function vsnprintf(AResult: PChar; ASize: Integer; const AFormat: PChar; AArgs: Pointer): Integer; cdecl; external 'libc';
нужно что-то записать в AArgs. Как это сделать?
Модератор: Модераторы
function vsnprintf(AResult: PChar; ASize: Integer; const AFormat: PChar; AArgs: Pointer): Integer; cdecl; external 'libc';
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;
      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;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; 
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;  
wavebvg писал(а):Для ARM-а должно прокатить способ от x32
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1