【问题标题】:Invalid types: 'Array' and 'dynamic array'无效类型:“数组”和“动态数组”
【发布时间】:2009-08-05 09:21:02
【问题描述】:

我写了一个函数,它通过将动态数组转换为字符串并询问 length(trim(string)); 来给出动态数组的长度;

function arraylength(a: array of char): integer;
var i: integer;
s: string;
begin
    for i:=0 to high(a) do
  begin
  s[i] := a[i-1];
    Result := length(trim(s));
  end;
end;

在我的主程序中,我将文本读入字符串,将其转换为数组

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to length(sString) do
  begin
    cChar[i] := sString[i];
  end;
end;

然后做:

ShowMessage(IntToStr(arraylength(cChar)));

我得到了标题中所述的错误。

【问题讨论】:

  • 你的代码的其余部分非常破碎。数组的基本索引为零。字符串的基地址为 1。在调用 SetLength 之前,字符串和数组都不包含任何内容。您应该在循环外检查s 的长度;否则,您应该收到一个警告,指出该函数可能不会返回值。如果接下来要做的就是将它塞回字符串中,为什么还要将字符串转换为数组?
  • 查看 StrLen() 和类似的函数。你为什么不首先使用 PChar

标签: delphi arrays char


【解决方案1】:

在 delphi 中将数组传递给过程和函数时,您应该将它们声明为单独的类型。因此:

type
  MyArray =  array of char; 

然后

function arraylength(a: MyArray ): integer;

顺便说一句:你为​​什么不使用像 Length() 这样的内置函数? Delphi2009 中的类型字符串是 unicode 字符串,所以 Length 以字符而不是字节返回 Length。

【讨论】:

  • 我没有使用它,因为在这种情况下,我有一个动态数组,并且由于空间的动态分配,length(cChar) 返回的值大于数组中的实际字符数。非常感谢提供给我实际字符数的功能。
  • 你的意思是你有 20 个元素的数组,现在只用 15 个?
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2016-03-18
  • 2010-10-23
相关资源
最近更新 更多