我有一串字符串。当需要函数时,我会增加这个数组:
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个项目(字符串)的更长的数组是不可能的?人物有限制吗?
感谢。
答案 0 :(得分:3)
首先,不要为您的任务使用数组。更改字符串数组大小时发生的内存重新分配是一项昂贵的操作。更重要的是,你试图返回该输入数组的副本(以错误的方式),这也是非常低效的。
我强烈建议您使用旨在用于字符串集合的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;