首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTTI Delphi将n维矩阵创建为TValue

RTTI Delphi将n维矩阵创建为TValue
EN

Stack Overflow用户
提问于 2010-12-30 21:33:43
回答 1查看 2.1K关注 0票数 4

日安,

TValue是Delphi-2010及更高版本的特性。

从我的earlier question开始,我尝试使用递归函数来返回n维的TValue。矩阵(2D、3D、4D...)

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

代码语言:javascript
复制
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维矩阵。例如,我需要一个函数CreateDynArray(Dimensions:整数数组;Kind:TTypeKind): TValue;该函数将返回一个TValue,它是一个包含维数的动态数组,例如:

Return=CreateDynArray(2,3,tkInteger);将返回一个TValue作为tkDynArray,如果我显示( return )将列出

代码语言:javascript
复制
0 0 0
0 0 0

不会被终止。我尝试从一个TValue创建一个n维的DynArray

代码语言:javascript
复制
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

非常感谢,祝你有愉快的一天!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-31 08:16:50

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

坦率地说,我建议您在类似脚本语言的问题中使用与内置Delphi动态数组不同的结构来表示数组。从长远来看,这可能比试图动态生成低级RTTI数据要少得多,由于它在Rtti单元中具有更高的抽象级别,因此更有可能在不同版本之间发生变化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4562982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档