Inno Setup访问违规增量字符串数组

时间:2014-02-25 10:37:34

标签: arrays string inno-setup pascal

我有一串字符串。当需要函数时,我会增加这个数组:

function insertMessageAction(list: TMessagesActions; message: String): TMessagesActions;
var
  lenght: integer;
begin
  if message <> '' then begin
    lenght := GetArrayLength(list);
    SetArrayLength(list, lenght +1);
    if GetArrayLength(list) > lenght then begin
      list[lenght] := message
    end;
  end;
  result := list;
end;

如果de increment为0到2,没有问题,当我增加到3长度时,数组被破坏,列表的'value'是:“在地址00403498处访问违规。读取地址0000006A < /强>”。

创建2个项目(字符串)的更长的数组是不可能的?人物有限制吗?

感谢。

1 个答案:

答案 0 :(得分:3)

首先,不要为您的任务使用数组。更改字符串数组大小时发生的内存重新分配是一项昂贵的操作。更重要的是,你试图返回该输入数组的副本(以错误的方式),这也是非常低效的。

我强烈建议您使用旨在用于字符串集合的TStringList。使用TStringList,您问题中的整个代码将变为:

StringList.Add(Message);

但对你的问题。这是可能的,但你需要遵守一些事情;至少:

  1. 不要尝试返回通过引用传递的输入数组:

    Result := list;
    
  2. 如果由于某种原因需要将数组作为返回类型,请分配此输出数组的大小并复制输入数组中的所有元素:

    InputLen := GetArrayLength(List);
    SetArrayLength(Result, InputLen + 1);
    for I := 0 to InputLen - 1 do
      Result[I] := List[I];
    
    Result[InputLen] := Message;
    
  3. 如果你还想留在数组中,最好通过变量参数传递它:

    [Code]
    type
      TMessagesActions = TArrayOfString;
    
    procedure InsertMessageAction(var AList: TMessagesActions;
      const AMessage: String);
    var
      ArrayLen: Integer;
    begin
      ArrayLen := GetArrayLength(AList);
      SetArrayLength(AList, ArrayLen + 1);
      AList[ArrayLen] := AMessage;
    end;