Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-使用可选VAR参数调用过程?_Delphi_Var_Procedures - Fatal编程技术网

Delphi-使用可选VAR参数调用过程?

Delphi-使用可选VAR参数调用过程?,delphi,var,procedures,Delphi,Var,Procedures,Delphi2010-我有一个例程,它接受一个字符串并处理它。有3种不同类型的处理,我可能需要任何组合,包括所有3种处理方式。我试图确定如何调用我的例程,但我尝试的每件事都会引起问题。我想做的是把这个过程叫做这样的 StringProcess(StartString1, VarProcess1, VarProcess2, VarProcess3); 但也很容易,我只需要两个过程 StringProcess(StartString1, '', VarProcess2, VarProcess3);

Delphi2010-我有一个例程,它接受一个字符串并处理它。有3种不同类型的处理,我可能需要任何组合,包括所有3种处理方式。我试图确定如何调用我的例程,但我尝试的每件事都会引起问题。我想做的是把这个过程叫做这样的

StringProcess(StartString1, VarProcess1, VarProcess2, VarProcess3);
但也很容易,我只需要两个过程

StringProcess(StartString1, '', VarProcess2, VarProcess3);
过程定义类似于

procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string);
总之。。。如何定义返回1到3个变量的过程?Delphi希望我总是传递3个变量,如果我不需要,我只需要忽略其中一个。有没有一种方法可以传递“不存在的”VAR参数,并根据需要忽略它们


谢谢

var参数不能是可选的。解决方案是为函数定义重载:

procedure StringProcess(StartString: string; var S1:String); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string); overload;
您可以像这样实现重载:

procedure StringProcess(StartString: string; var S1:String); overload;
var
  S2, S3: String;
begin
  StringProcess(StartString, S1, S2, S3);
end;
StringProcess(StartString1, @VarProcess1, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, nil, @VarProcess3);
StringProcess(StartString1, @VarProcess1, nil, @VarProcess3);
...

一个进程的重载只调用大多数进程的重载,并使用虚拟变量来捕获输出。

问题是,
StringProcess
rountene在试图修改这些值时必须有变量来表示S1、S2和S3。毫无疑问,您不想经历为您不感兴趣的值声明变量的麻烦

考虑的一个选项是将所有变量捆绑成记录结构如下:

type
  TStringData = record
    S1, S2, S3: string;
  end;

procedure StringProcess(StartString: string; var StringData: TStringData);
不过我会更进一步。我怀疑您在
StringProcess
例程中没有真正使用S1、S2和S3的输入。这意味着它们也可以是out参数。在这种情况下,我建议你写:

function StringProcess(StartString: string): TStringData;

var
参数不能是可选的,必须传递一个变量。对于您要查找的内容,请使用指针:

procedure StringProcess(StartString: string; S1:PString; S2:Pstring; S3:Pstring);
begin
  ...
  if S1 <> nil then
  begin
    // Use S1^ as needed...
  end;
  ...
end;

@这个问题可能是一个很好的替代方案,但它肯定不是重复的。这个问题是关于一个有3个变量字符串输入的函数,询问如何使其中一个成为可选的。另一个问题是关于const输入的
数组,询问如何使其成为var参数。这听起来和我不一样。@GolezTrol好的,对不起,我可能抓错了答案,所以请在这里引用。我引用的问题的标题是如何创建一个接受可变数量变量参数的函数。我收回了我的接近票。这不起作用,因为如果我通过两个字符串,例程将不知道我是否通过S1和S3,或者S2和S3等等。它只知道我通过了两个字符串。我必须添加另一个参数,告诉程序我想要7种组合中的哪一种。显然,编译器必须知道你想要什么。你不能指望它能读懂你的心思。我现在明白你的意思了。快速修复方法是只传递3个变量和一个位掩码,告诉函数您想要实际使用其中的哪一个。但对于更好的解决方案,我会选择一种完全不同的方法,因为这种方法根本不灵活。将不同类型的处理隔离在不同的类中。无论如何,答案的核心是:你不能有可选的var参数,所以你必须解决这个问题。我认为类是解决这个问题的理想方案。在类中设置输入字符串,并生成函数或属性getter以获取不同的已处理字符串。这些函数中的每一个都可以检查处理的共享部分是否已经完成。如果没有,它可以调用完成该部分的方法,并将结果存储在类字段中。@GolezTrol同意。人们通常害怕创建小班。但这很可能是一个单一责任类的理想例子。同样简单,但在这种情况下,仍然没有关于您想要哪些字符串的视图。这意味着所有这些都是由过程计算的,这可能是对周期的浪费(取决于处理的复杂性)。@GolezTrol
if(S1='')
if(StringData.S1='')
可以用完全相同的方式解释,如果打算使用输入值来决定应该计算什么。由于字符串是托管类型,本地记录变量将自动初始化为所有空字符串。指针的内容看起来不太好,但至少这个解决方案允许您检测调用方是否实际传递了字符串或nil,因此,您可以检查是否需要处理该字符串。另一种方法也是可能的,
StringProcess(StartString1,PString(nil)^,VarProcess2,…
,然后在proc中测试
@S1nil
。过程的声明保持不变,但看起来没有什么好。。。