我想知道是否有可能传递一个声明类型(在这种情况下是一条记录)到我的函数。我甚至不会问是否不适用于SizeOf()
函数,因为它可能需要一个类型作为参数。德尔福 - 如何传递'类型'作为参数
我正在翻译C代码,我希望尽可能地保持原代码。 C程序声明PushArray和PushStruct为宏。由于德尔福没有宏支持,我试图把它们变成功能。
我已经使用了这一点,似乎我可以使用泛型类型。 像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的方式,让你在脚上打几行代码?也许你甚至不需要翻译这整个东西,只需使用不同的模式,不同的数据结构进行音译,使用真正的数据类型或对象而不是低级别的内存缓冲区破解。 –
亲爱的沃伦。 我正在翻译的代码来自专门教授低级Voodoo内存缓冲区访问的教育资源。作者说,虽然他知道如何使用高阶语言,但这种低层次的东西是一种垂死的艺术,他正在教它。后来我们甚至会做一些汇编代码。所以虽然我知道你对你的评论意见不错,但在这种情况下,它不适用。 –
好的。很高兴你使用你的力量而不是邪恶。 –