【问题标题】:Define an array of Char as constant?将 Char 数组定义为常量?
【发布时间】:2020-05-03 19:20:11
【问题描述】:

我在 Delphi 10.3.3 中使用了这个功能:

function StrTrimCharsLeft(const S: string; const Chars: array of Char): string;
var
  I, L: SizeInt;
begin
  I := 1;
  L := Length(S);
  while (I <= L) and ArrayContainsChar(Chars, S[I]) do
    Inc(I);
  Result := Copy(S, I, L - I + 1);
end;

当我以这种方式使用该函数时,我得到一个错误:

[dcc32 错误]: E2250 没有可以使用这些参数调用的“StrTrimCharsLeft”的重载版本

const
    BomChars = ['ï', '»', '¿'];
...
s := JclStrings.StrTrimCharsLeft(s, BomChars);

但是当我以这种方式使用它时,一切正常而没有错误:

s := JclStrings.StrTrimCharsLeft(s, ['ï', '»', '¿']);

那么如何定义和使用Char 的数组作为常量呢?

【问题讨论】:

    标签: arrays delphi constants delphi-10.3-rio


    【解决方案1】:

    当你写作时

    const
      BomChars = ['ï', '»', '¿'];
    

    您已经声明了一个名为 BomCharsset -- 不是一个数组!

    如果您改为将BomChars 声明为static array

    const
      BomChars: array[0..2] of Char = ('ï', '»', '¿');
    

    它会起作用的。 (见Declared Constants § Array Constants。)

    StrTrimCharsLeft(s, ['ï', '»', '¿']); 有效,因为这里的括号是open array 语法的一部分。具体来说,括号是“开放数组构造函数”的一部分。)

    【讨论】:

    • 所以明确不可能将其声明为 OPEN ARRAY 常量?这在其他语言中如何工作?
    • @user1580348:不存在“开放数组常量”之类的东西;这个概念甚至没有意义。 open array parameter 是一种特殊的函数/过程参数,所以它们只存在于函数/过程参数的上下文中。开放数组参数可以接受静态数组、动态数组和这种构造。但是在这种情况下,三个字符的静态数组正是您所需要的,不是吗?
    • 我的意思是,在函数参数之外,Delphi只有两种数组:static arraysdynamic arrays。基本上,开放数组参数允许您定义单个函数,该函数接受静态和动态数组作为输入。特别是,它将接受您的静态三元素字符数组。
    • 在 Delphi 中,方括号用于sets。因此,你的常数变成了一个集合。但是该符号也用于开放数组构造函数,因此同一个符号有两个功能,这可能会造成混淆。从 Delphi XE7 开始,方括号提供第三个功能(使其更加混乱):它们可用于动态创建动态数组:var a: array of Integer; begin a := [2, 3, 1];。但是在声明静态数组常量时,您总是使用带有普通括号的语法。
    • (对不起,“开放数组参数允许”当然应该是“开放数组参数允许”。但现在编辑评论为时已晚。)
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2018-10-22
    • 2017-03-05
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多