gpt4 book ai didi

delphi - RTTI Delphi 创建一个 n 维矩阵作为 TValue

转载 作者:行者123 更新时间:2023-12-03 15:27:56 33 4
gpt4 key购买 nike

美好的一天,

TValue 是 Delphi-2010 及更高版本的 RTTI 功能。

继我的 earlier question 之后,我尝试创建循环函数以返回 n 维的 TValue。矩阵(2D、3D、4D...)

例如,此过程将显示一个 n 维矩阵(它将列出 n 维矩阵中的所有元素作为 TValue 变量):

Procedure Show(X:TValue);
var i:integer;
begin
if x.IsArray then
begin
for i:=0 to x.GetArrayLength-1 do
show(x.GetArrayElement(i));
writeln;
end else
write(x.ToString,' ');

end;

我不明白如何创建一个函数来从 TValue 创建 n 维矩阵。例如我需要一个 Function CreateDynArray(Dimensions:array of integer; Kind:TTypeKind):TValue;该函数将返回一个 TValue,它是一个动态数组,如何包含维度,例如:

返回=CreateDynArray([2,3],tkInteger);将返回 TValue 作为 tkDynArray如果我显示(返回)将列出

0 0 0
0 0 0

未终止。我尝试从 TValue 创建一个具有 n 维的 DynArray

Procedure CreateArray(var Value:TValue; NewDimmension:integer; NewValue2Kind:TTypeKind; NewValue2:TValue; IsLast:Boolean);
var i:integer;
NewValue:TValue;
len:Longint;
begin
If Value.IsArray then// we have components in this dimension
begin
for i:=0 to Value.GetArrayLength-1 do// list all
begin
NewValue:=Value.GetArrayElement[i];
CreateArray(newValue,NewDimension,NewValue2Kind,NewValue2,IsLast);
Value.SetArrayElement(i,NewValue);
end;
end;
end else
begin
if isLast then
begin
len:=NewDimension;
DynArraySetLength(PPointer(Value.GetRefereneToRawData)^,Value.TypeInfo,1,@len); //set length to NewDimension
for i:=0 to NewDimension-1 do //Fill all with 0
Value.SetArrayElement(i,NewValue2);
end else
begin
len:=NewDimension;
DynArraySetLength(PPointer(Value.GetRefereneToRawData)^,Value.TypeInfo,1,@len);//I will create len TValues
end;
end;



var Index:array of integer;
Value:TValue;
ValuKind:TTypeKind;
......
......
....
Case token of
tokInt:
begin
ValueKind:=tkInteger;
Value:=0;
end;
.....
end;

Index:=GetIndexFromSintacticTree;//for example if i have int[20][30] index=[20,30]
for i:=0 to high(index) do
begin
if i = high(index) then CreateArray(Variable.Value,Index[i],ValueKind,Value,True)
else CreateArray(Variable.Value,Index[i],ValueKind,Value,False)
//Variable.Value is TValue
end;
//first TValue have 1 element, after that it will have 20 elements, and after that will have 20*30 elements

The ideea

非常感谢您,祝您度过愉快的一天!

最佳答案

要动态创建动态数组,您需要将其类型信息结构 (PTypeInfo) 的引用传递给 DynArraySetLength;调用 DynArraySetLength 并传递对 nil 指针的引用是创建新动态数组的方法。如果您的 Delphi 程序中尚不存在动态数组的特定形状,则编译器不会为您生成特定的 PTypeInfo 指针。在这种情况下,您必须自己生成相应的 PTypeInfo 数据结构。这是可能的,尽管很乏味。

坦率地说,我建议您使用与内置 Delphi 动态数组不同的结构来表示类似脚本语言问题中的数组。从长远来看,它可能比尝试动态生成低级 RTTI 数据要少得多,因为它在 Rtti 单元中具有更高级别的抽象,因此更有可能从一个版本到另一个版本进行更改。

关于delphi - RTTI Delphi 创建一个 n 维矩阵作为 TValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562982/

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