Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Arrays Inno安装程序访问字符串的增量数组_Arrays_String_Inno Setup_Pascal - Fatal编程技术网

Arrays Inno安装程序访问字符串的增量数组

Arrays Inno安装程序访问字符串的增量数组,arrays,string,inno-setup,pascal,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

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

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;
函数insertMessageAction(列表:tmessageActions;消息:String):tmessageActions;
变量
长度:整数;
开始
如果消息为“”,则开始
长度:=GetArrayLength(列表);
设置阵列长度(列表,长度+1);
如果GetArrayLength(列表)>长度,则开始
列表[长度]:=消息
结束;
结束;
结果:=列表;
结束;
如果反增量为0到2,则没有问题,当我增量到3长度时,数组已损坏,列表的“值”为:“访问地址00403498处的冲突。读取地址0000006A

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


谢谢。

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

我强烈建议您使用
TStringList
,它用于字符串集合。通过使用
TStringList
,您问题的全部代码将变成:

StringList.Add(Message);
但是你的问题。这是可能的,但你需要遵守一些事情;至少:

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

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

    InputLen := GetArrayLength(List);
    SetArrayLength(Result, InputLen + 1);
    for I := 0 to InputLen - 1 do
      Result[I] := List[I];
    
    Result[InputLen] := Message;
    
  • 如果您仍然希望保留数组,最好通过变量参数传递:

    [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;
    

  • 首先,更改数组大小时发生的内存重新分配是一项昂贵的操作。你甚至复制了一份要退回的文件,这也是无效的。如果我是你,我会使用
    TStringList
    ,它更适合字符串集合。此外,通过使用
    TStringList
    ,您问题中的所有代码将被缩短为
    StringList.Add(Message)。谢谢。问题解决了。Inno设置和Pascal对我来说是新的,不知道所有的函数和对象。