我在写一个能返回数组的函数但是好像delphi不支持数组不知道怎写呢?
还有返回指针的话怎么写呢?怎么调用呢?比如function ptest(i:integer):pointer;
begin
result:=@i;
end;procedure test;
begin
  showmessage(ptest(3));  //这里面怎么写不是错误呢?
end;

解决方案 »

  1.   


    type
      TDynIntArr = array of Integer;function foo: TDynIntArr;
      

  2.   

    返回数组的函数最好这样写,对结果的操作也会比较方便,调用函数之前要先在外部初始化数组的大小:
    procedure StringToByteArr(str:string;var ByteArr:Array of Byte);
    begin
      move(str[1],ByteArr[0],Length(str));
    end;
      

  3.   

    楼主的思路感觉有点问题,除非你把你那数组定义为全局变量,要不你在函数里修改数组的值是没用的,
    另外可以用引用,加个var,要不用 MOVE函数修改
      

  4.   

    对于此类应用,最好先理清楚内存如何管理,首先由于函数执行完之后堆栈立即被清理,那么返回的如果是栈内存的引用,结果就会是不可预测的,特别是存在多线程争夺内存的情况时,出问题是迟早的事。
    因此内存必须是动态分配,包括使用动态数组。但是对于Delphi的动态数组由于是特殊格式,并且生成的代码当中会隐藏着对其的生命周期管理,也就是当你对一个数组进行SetLength分配内存之后,当它的“引用计数”为0时就会被清理,而这个引用计数的管理,当你跨过来了一个模块,则必须要采用公共的内存管理器才能够完成统一的计数管理,否则这个“引用计数”就不再有意义,出问题也是迟早的事。
    除了使用动态数组以外,那就是动态内存的分配,而这个也跟数组相类似,但是省心一点的是不会生成几乎“不可见”的生命周期管理代码,换句话说,这个时候该内存的生命周期就完全掌握在你的手里,因为首先需要的就是内存管理器的统一,一般建议使用系统的API,或者使用C运行库,比如msvcrt.dll当中的内存管理函数,一句话就是要统一,否则错把公鸡当母鸡,就算是把整个鸡分成一千八百块,也达不到“杀鸡取卵”的效果。当这个统一之后,就是看由谁来进行申请,然后又由谁来进行释放。其实在这个过程当中,个人更为建议使用引用计数管理,如此就会清晰很多,谁要用,第一件事是增加一个属于自己的计数,从而保证该内存的生命周期延长至整个服务过程,用完再释放。其实对于引用计数的使用,COM是一个相当出色的模型,在Delphi当中使用Interface就可以很容易的完成相应的工作,对于应用代码,则只需要实现IInterface的接口就可以。