我在这里做了一些关于上面给出的问题的研究,并提出了以下代码:
VarStr = array of WideChar;
function ArrayToString(const a: VarStr): UnicodeString;
begin
if Length(a) > 0 then
begin
ShowMessage ('Länge des übergebenen Strings: ' + IntToStr(Length(a)));
SetString(Result, PWideChar(@a[0]), Length(a) div 2)
end
else
Result := '';
end;
ShowMessage在给定数组中显示正确的字符数,但该函数的结果始终为空字符串。
你的想法好吗?
答案 0 :(得分:6)
您传递的错误长度值。你只要求一半的角色。像这样修复你的代码:
function ArrayToString(const a: VarStr): string;
begin
SetString(Result, PWideChar(a), Length(a));
end;
但是,您还报告您的函数返回一个空字符串。最可能的原因是您将无效输入传递给函数。考虑一下这个程序:
{$APPTYPE CONSOLE}
type
VarStr = array of WideChar;
function ArrayToStringBroken(const a: VarStr): UnicodeString;
begin
SetString(Result, PWideChar(@a[0]), Length(a) div 2);
end;
function ArrayToStringSetString(const a: VarStr): UnicodeString;
begin
SetString(Result, PWideChar(a), Length(a));
end;
var
a: VarStr;
begin
a := VarStr.Create('a', 'b', 'c', 'd');
Writeln(ArrayToStringBroken(a));
Writeln(ArrayToStringSetString(a));
end.
输出结果为:
ab abcd
因此,除了您问题中的代码问题之外,您似乎还遇到了问题中不存在的代码问题。
也许当你说:
该函数的结果始终为空字符串。
您实际上意味着将返回的值传递给ShowMessage
时不会显示任何文本。这完全是另一回事。正如@bummi在评论中指出的那样,ShowMessage
将在遇到的第一个空终止符处截断其输入。使用适当的调试工具来检查变量的内容。
答案 1 :(得分:1)
Result:= Trim(string(a));
更新:正如同事们在评论中慷慨地指出,这是一个错误的答案!它的工作原理只是因为内部字符串和动态数组实现非常相似,并且无法保证这些代码在将来的编译器版本中可以正常工作。 David答案中描述了DynArray-> String转换的正确方法。我不会删除我保留评论的答案,在我看来他们的价值要大得多。