Подскажите, какой заполнить 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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3