use*_*126 4 delphi matrix rtti delphi-2010 tvalue
美好的一天,
TValue是Delphi-2010及更高版本的RTTI功能.
继我之前的问题之后,我曾尝试使用循环函数将TValue作为n维返回.矩阵(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;
Run Code Online (Sandbox Code Playgroud)
我不明白如何创建一个函数来从TValue创建一个n维矩阵.例如,我需要一个Function CreateDynArray(Dimensions:整数数组; Kind:TTypeKind):TValue; 并且该函数将返回一个TValue,这是一个动态数组,如何包含dimenssions例如:
返回= CreateDynArray([2,3],tkInteger); 将返回TValue作为tkDynArray,如果我将显示(返回)将列出
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
没有终止.从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
Run Code Online (Sandbox Code Playgroud)

非常感谢,祝你有愉快的一天!
要动态创建动态数组,需要引用其类型信息结构(PTypeInfo)以传递给DynArraySetLength; 调用DynArraySetLength和传递对nil指针的引用是如何创建一个新的动态数组.如果Delphi程序中不存在特定的动态数组形状PTypeInfo,则编译器将不会为您生成特定的指针.在这种情况下,您必须自己生成相应的PTypeInfo数据结构.虽然单调乏味,但这是可能的.
坦率地说,我建议您使用与内置Delphi动态数组不同的结构来表示类似脚本语言的数组中的数组.从长远来看,它可能比尝试动态生成低级RTTI数据要少得多,由于它在Rtti单元中具有更高级别的抽象,因此更有可能在不同版本之间进行更改.
| 归档时间: |
|
| 查看次数: |
1776 次 |
| 最近记录: |