Mar*_*mke 1 delphi parameters void
我用void类型参数写了两个方法:
procedure Method1(const MyVar; size: cardinal);
var
Arr: array of byte;
begin
SetLength(Arr, size);
{now copy the data from MyVar to Arr, but how?}
end;
procedure Method2(var MyVar; size: cardinal);
var
Arr: array of byte;
begin
SetLength(Arr, size);
{return the data from the array, but how?}
end;
Run Code Online (Sandbox Code Playgroud)
在第一个中,我想将MyVar作为byte数组访问.在第二个中,我想将数据从本地数组Arr复制到MyVar.因此我使用了CopyMemory()函数,但它有问题.
如果我在第二种方法中使用以下内容,只要调用Method2并将数组作为其参数(Method2(指针(MyString)^,长度(MyString))或Method2(指针(MyArray),长度(MyArray)) ))).
CopyMemory(Pointer(MyVar), Pointer(Arr), size);
Run Code Online (Sandbox Code Playgroud)
如果我用一个整数参数(Method2(MyInteger,SizeOf(MyInteger)))调用Method2,它就无法正常工作.在这种情况下,必须以这种方式调用CopyMemory():
CopyMemory(@MyVar, Pointer(Arr), size);
Run Code Online (Sandbox Code Playgroud)
如何正确地从Method2返回数据而不知道它是简单类型(或记录)还是数组?Method1中的情况类似,但在这里我将不得不使用
CopyMemory(Pointer(Arr), Pointer(MyVar), size);
Run Code Online (Sandbox Code Playgroud)
在数组和
CopyMemory(Pointer(Arr), @MyVar, size);
Run Code Online (Sandbox Code Playgroud)
在简单类型的情况下.
当我不知道MyVar参数是什么时,我该怎么办呢?
在Delphi中没有这样的东西.你所指的是一个无类型参数.
无类型参数始终是实际的东西,而不是指向您应该使用的东西的指针.因此,使用CopyMemory这种参数的正确方法是将@运算符应用于它,如下所示:
CopyMemory(@MyVar, @Arr[0], size);
Run Code Online (Sandbox Code Playgroud)
注意我也改变了传递第二个参数的方式.如果你不依赖于动态数组实际上是指向第一个元素的指针的事实,那就更好了.如果你需要一个指向第一个元素的指针,那就明确说明,就像我在这里做的那样.
您的混淆来自于您使用参数进行的测试,就好像它是一个指针一样,测试似乎有效.不过,我怀疑该测试的有效性.当你说Pointer(MyString)^,你所拥有的是字符串的第一个字符.当你Pointer(MyVar)在函数内部说,你将该字符输入到指针中,这是一个无效的类型转换.如果你的程序似乎工作,那只是偶然的; 你的代码错了.
除非你真的需要,否则我能给出的最好的建议是不要打字.当你这样做时,请确保你输入的东西真的有那种类型.在您的情况下,在将其作为无类型参数传递之前,您不需要输入任何内容.你可以这样打电话Method1:
Method1(MyString[1], Length(MyString) * Sizeof(Char));
Run Code Online (Sandbox Code Playgroud)
(我乘以,SizeOf(Char)因为我不知道你是否有Delphi 2009.)
另外,请避免使用无类型参数.编译器可以帮助确保程序正确性的一个好处是强制类型安全,但是当你拿走类型时,编译器就无法帮助你了.