gpt4 book ai didi

delphi - 读取并分配 void 类型参数

转载 作者:行者123 更新时间:2023-12-02 16:17:01 24 4
gpt4 key购买 nike

我编写了两个带有 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;

在第一个中,我想以字节数组的形式访问 MyVar。在第二个中,我想将数据从本地数组 Arr 复制到 MyVar。因此我使用了 CopyMemory() 函数,但它出了问题。

如果我在第二个方法中使用以下内容,只要以数组作为参数调用 Method2 就可以了(Method2(Pointer(MyString)^, Length(MyString)) 或 Method2(Pointer(MyArray),长度(MyArray)))。

CopyMemory(Pointer(MyVar), Pointer(Arr), size);

如果我使用整数参数调用 Method2 (Method2(MyInteger, SizeOf(MyInteger))),则它无法正常工作。在这种情况下,必须以这种方式调用 CopyMemory():

CopyMemory(@MyVar, Pointer(Arr), size);

如何从Method2正确返回数据,而不知道它是简单类型(或记录)还是数组?情况与方法1类似,但这里我必须使用

CopyMemory(Pointer(Arr), Pointer(MyVar), size);

对于数组和

CopyMemory(Pointer(Arr), @MyVar, size);

对于简单类型。

当我不知道 MyVar 参数是什么时该怎么办?

最佳答案

Delphi 中没有 void 类型这样的东西。您所指的称为 untyped parameter .

无类型参数始终是实际事物本身,而不是指向您应该使用的事物的指针。因此,将 CopyMemory 与此类参数一起使用的正确方法是对其应用 @ 运算符,如下所示:

CopyMemory(@MyVar, @Arr[0], size);

请注意,我还更改了传递第二个参数的方式。如果您不依赖动态数组实际上是指向第一个元素的指针这一事实,那就更好了。如果您需要指向第一个元素的指针,只需明确说明即可,就像我在这里所做的那样。

您的困惑来自于您所做的测试,其中参数被用作指针,并且测试似乎有效。不过,我怀疑该测试的有效性。当你说Pointer(MyString)^时,你得到的是字符串的第一个字符。然后,当您在函数内说 Pointer(MyVar) 时,您将该字符类型转换为指针,这是无效的类型转换。如果你的程序看起来能工作,那么这只是偶然的;你的代码是错误的。

我能给出的最好建议是不要对内容进行类型转换,除非确实有必要。当您这样做时,请确保您正在类型转换的东西确实具有该类型。就您而言,在将其作为无类型参数传递之前,您不需要进行任何类型转换。您可以像这样调用 Method1:

Method1(MyString[1], Length(MyString) * Sizeof(Char));

(我乘以 SizeOf(Char) 因为我不知道您是否有 Delphi 2009。)

此外,请避免使用无类型参数。编译器可以做的帮助确保程序正确性的伟大事情之一就是强制类型安全,但是当您删除类型时,编译器将无法再为您提供帮助。

关于delphi - 读取并分配 void 类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com