【发布时间】:2023-03-30 18:38:01
【问题描述】:
我想知道是否可以将声明的类型(在本例中为记录)传递给我的函数。我什至不会问它是否不是 SizeOf() 函数,因为它可以将类型作为参数。
我正在翻译来自 C 的代码,我希望它尽可能接近原始代码。 C 程序将 PushArray 和 PushStruct 声明为宏。由于Delphi没有宏支持,我正在尝试将它们变成函数。
我用谷歌搜索了一下,似乎我可以使用泛型类型。
与function PushStruct<T>(Arena : Pmemory_arena; dtype : <T>) 类似,但您只能在 OOP 类型的应用程序中使用它。
function PushSize_(Arena : Pmemory_arena; Size : memory_index) : pointer;
begin
Assert((Arena^.Used + Size) <= Arena^.Size);
Result := Arena^.Base + Arena^.Used;
Arena^.Used := Arena^.Used + Size;
end;
function PushStruct(Arena : Pmemory_arena; dtype : ?) : pointer;
begin
result := PushSize_(Arena, sizeof(dtype));
end;
function PushArray(Arena : Pmemory_arena; Count: uint32; dtype : ?) : pointer;
begin
result := PushSize_(Arena, (Count)*sizeof(dtype))
end;
这里是原始的 C 代码:
#define PushStruct(Arena, type) (type *)PushSize_(Arena, sizeof(type))
#define PushArray(Arena, Count, type) (type *)PushSize_(Arena, (Count)*sizeof(type))
void *
PushSize_(memory_arena *Arena, memory_index Size)
{
Assert((Arena->Used + Size) <= Arena->Size);
void *Result = Arena->Base + Arena->Used;
Arena->Used += Size;
return(Result);
}
【问题讨论】:
-
这种事情让我很受挫。无论您翻译的整个工作是做什么的,都可能应该以面向对象的方式重新实现,而不是尝试直接翻译您的 C 代码。如果不需要,为什么还要继续做所有这些巫毒指针数学?你真的很喜欢 C 语言让你用这么几行代码就能自爆的方式吗?也许您甚至不必翻译整个内容,只需使用不同的模式、不同的数据结构、使用真实的数据类型或对象而不是低级内存缓冲区 hack 进行音译。
-
亲爱的沃伦。我正在翻译的代码来自一个专门教授低级 voodoo 内存缓冲区访问的教育资源。作者指出,虽然他知道如何使用高级语言,但这种低级的东西是一门垂死的艺术,他正在教它。以后我们甚至会做一些汇编代码。所以虽然我知道你的评论是好意,但在这种情况下它不适用。
-
好的。很高兴你将自己的力量用于善而不是恶。
标签: c delphi types parameter-passing