gpt4 book ai didi

delphi - 如何使用varargs打印出字符串?

转载 作者:行者123 更新时间:2023-12-03 18:30:56 25 4
gpt4 key购买 nike

如何使用varargs打印出多个字符串?我试过了,但是我无法确定数组的大小。它只是打印垃圾。

program Project1;

{$APPTYPE CONSOLE}
{$POINTERMATH ON}

function _Print(const S: String): string; cdecl;
var
Args: Array[0..100] of Pointer absolute S;
I: Integer;
begin
I := 0;
while Args[I] <> nil do
begin
WriteLn(PString(@Args[I])^);
Inc(I);
end;
end;

const Print: function(const S: String): string; cdecl varargs = _Print;

var
A, B: String;
begin
A := 'ABC';
B := 'CDE';
Print(a, b, 'asdasd', 'fasd', ' ')
end.

最佳答案

varargs函数没有自动的方法来确定要传递的参数数量,因为只有调用者才知道它在调用堆栈中放置了多少个参数。该函数必须通过以下方式手动确定参数:


要求调用者传递参数的实际数量作为固定参数:

function _Print(NumStrings: Integer; const Strings: string): string; cdecl;
var
Args: Array[0..100] of Pointer absolute Strings;
I: Integer;
begin
for I := 0 to NumStrings-1 do
begin
WriteLn(PString(@Strings[I])^);
end;
end;

const
Print: function(NumStrings: Integer; const Strings: string): string; cdecl varargs = _Print;

var
A, B: String;
begin
A := 'ABC';
B := 'CDE';
Print(5, a, b, 'asdasd', 'fasd', ' ');
end.

将哨兵值放在该函数可以查找的参数列表的末尾。您的函数已经为此进行了编码(它正在寻找 nil指针),因此只需传递一个即可:

Print(a, b, 'asdasd', 'fasd', ' ', nil);



话虽如此,这两种方法都容易受到调用者错误的影响,因此,如果使用不当,可能会带来危险,这就是为什么 varargs样式的函数很少使用的原因。您应该考虑使用开放数组参数:

program Project1;

{$APPTYPE CONSOLE}
{$POINTERMATH ON}

function _Print(const Args: array of string): string;
var
I: Integer;
begin
for I := Low(Args) to High(Args) do
begin
WriteLn(Args[I]);
end;
end;

const
Print: function(const Args: array of string): string = _Print;

var
A, B: String;
begin
A := 'ABC';
B := 'CDE';
Print([a, b, 'asdasd', 'fasd', ' ']);
end.

关于delphi - 如何使用varargs打印出字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33180657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com