例如,当您声明动态数组时,您会这样做
var
MyArray: array of Byte;
这样编译器就知道当它超出范围时它必须完成该变量(数组)。但我想将动态数组声明为这样的指针
var
MyArray: Pointer;
我知道如何在运行时动态初始化(设置长度)到这样的数组。问题是编译器不知道它需要完成它。我想知道是否有办法告诉编译器在超出范围时将该指针最终确定为数组。我会告诉他当我第一次初始化数组时。
我知道这是一个 hack,我不想听到这不是正确的方法。我有一个非常具体的愿望(问题),我想知道这是否可以实现。我想这不像编译器那样使用编译器魔法。
编辑:
我想保持问题简单,但有些人想知道更多,我会告诉更多。我认为这与问题无关,但无论如何,就在这里。
我想为每条记录保留 4 个字节(或 64 位系统上的 8 个字节)。它更像是一个游戏。我的想法是在变量记录 TSimpleData 中插入一个指向动态数组的指针。这类记录不接受需要最终确定的变量。完全清楚为什么。但我想知道以后是否有办法注册完成。我 99% 确定没有办法,但要求 100% 确定没有害处。波纹管是有问题的相关代码。我希望 FComplexData 作为简单指针成为 TSimpleData 的一部分。
TSimpleData = record { do not pack this record; it is compiler-generated }
case Byte of
atInteger: (VInteger: Integer);
atCardinal: (VCardinal: Cardinal);
atBoolean: (VBoolean: Boolean);
atObject: (VObject: TObject);
atPointer: (VPointer: Pointer);
atClass: (VClass: TClass);
atWideChar: (VWideChar: WideChar);
atChar: (VChar: AnsiChar);
{$IFDEF AnyValue_UseLargeNumbers}
atInt64: (VInt64: Int64);
atExtended: (VExtended: Extended);
{$ENDIF}
end;
TAnyValue = packed record private
FValueType: TValueType;
{$IFNDEF AnyValue_NoInterfaces}
FInterface: IInterface;
{$ENDIF}
FSimpleData: TSimpleData;
FComplexData: array of Byte;
...
end;