unit Unit14;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  Taaa=record
     A:array of Pchar;
     B:pchar;
  end;
  Paaa=^Taaa;
type
  TForm14 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
     procedure getvalue(var ab:integer);
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form14: TForm14;implementation{$R *.dfm}
procedure TForm14.Button1Click(Sender: TObject);
var i:integer;
begin
   getvalue(i);
   ShowMessage(Paaa(i).b);
   ShowMessage(Inttostr(High(Paaa(i).A)));end;procedure TForm14.getvalue(var ab:integer);
var aa:Taaa;
  i:integer;
begin
   aa.B :='3sds上';
   SetLength(aa.A,3);
   for I := 0 to 2 do
      AA.A[i]:=Pchar(Inttostr(i));
   ab:=integer(@aa);
end;
end.

解决方案 »

  1.   

    Taaa=record 
        A:array of Pchar; 
        B:pchar; 
      end; 
      Paaa=^Taaa; 
    A是一个指针数组,如果写成A:array of char;应该就不会有问题了
      

  2.   

    对啊,是不是,结构体里面只能是integer,char,boolean,等固定长度的变量?
      

  3.   

    To bdmh
    请问怎么标记,我这个结构体里有N多个动态数组的
      

  4.   

    pChar 字符指針,要申請內存且長度通過申請來得到Array of Pchar    再 SetLength  這叫什麼啊??
      

  5.   

    指针数组啊,直接这样用没问题的,我现在做在dll里,当参数用,想给c#和vb都能调用,所以想只传个结构体数据的指针
      

  6.   

     暈,我是嚴重的表達不清,我說的就是這個意思。
     結構裏面應該就是 PChar   或  Array of AnsiChar;  
    要不你直接貼出你C#調用的代碼吧,應該是對傳遞的思路不對。
      

  7.   

    楼上的兄弟:不好意思,这个函数还没写好
    Taaa=record 
        A:array of integer; 
        B:pchar; 
      end; 
      Paaa=^Taaa; 
    即使是array of integer
    下成的函数也得不到A的所有值,delphi都没通过,能否帮忙完成这个过程
    procedure getvalue(var ab:integer); 
      

  8.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;  type
      Taaa=record
        A:array of Pchar;
        B:pchar;
      end;
      Paaa=^Taaa;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
         procedure getvalue(var ab:Taaa);  end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    var i:Taaa;
    begin
      getvalue(i);
      ShowMessage(i.b);
      ShowMessage(Inttostr(High(taaa(i).A)));end;procedure TForm1.getvalue(var ab:Taaa);
    var aa:Taaa;
      i:integer;
    begin
      //getmem(aa,sizeof(AA));
      aa.B :='3sds上';
      SetLength(aa.A,3);
      for I := 0 to 2 do
          AA.A[i]:=Pchar(Inttostr(i));
      ab:= AA;
    end;end.
      

  9.   

    楼上这样是可以,但这个函数是我dll是的输也函数,vb和c#或其他语言可以调用吗?
      

  10.   

    结构体中,在每一个动态数组下面增加一个指定动数组大小的变量.
    Taaa=record 
      A:array of Pchar; 
      ASize: Integer;
      B:pchar; 
    end; 
      
    Paaa=^Taaa; 
      

  11.   

    能走通是能走通,但你确定vb和c#能方便的接收么?
      

  12.   

    我要做的就是让vb/delphi/c#,至少这3个要能收到,这是目标
      

  13.   

    还有没有人知道帮帮我啊,结构体里面有动态数组的,要vb,delphi和c#都能访问
      

  14.   

    写dll时要vb与c#共用时,结构体内的成员最好要用基础数据类型,否则是自找麻烦
      

  15.   

    Type
         PElementList=^TElementList;
         TElementList=record
         Path:string;
         WebPath:String;
         Name:String;
         Head:TIntegerDynArray;
         T:TDoubleDynArray;
         MaxT,MinT:Double;
         Td:TDoubleDynArray;
         MaxTD,MinTD:Double;
         AVGT:Double;
         AVGTD:Double;
         Sp:TDoubleDynArray;
         Dir:TIntegerDynArray;
         P:TDoubleDynArray;
         MaxP,MinP,MaxRain:Double;
         MaxSP:TDoubleDynArray;
         MaxDir:TIntegerDynArray;
         T2Max:TDoubleDynArray;
         T2Min:TDoubleDynArray;
         RH:TIntegerDynArray;
         R:TDoubleDynArray;
         R624:TDoubleDynArray;
         CLD,CLDL,CLDM,CLDH:TIntegerDynArray;
         VIS:TDoubleDynArray;
    end;
    Type
      PInterMode=^TInterMode;
      TInterMode=record
      JCHead:TIntegerDynArray;
      JCT,JCTD,JCP,JCSP,JCRH,JCT2MAX,JCT2MIN:TDoubleDynArray;
      JCAVGT,JCAVGTD:TDoubleDynArray;
      JCR,JCR1,JCR2,JCR3:TDoubleDynArray;
      JCDIR,JCRP,JCRP1,JCRP2,JCRP3,JCRF,JCRF1,JCRF2,JCRF3:TIntegerDynArray;
      JCCLD,JCCLDL,JCCLDM,JCCLDH:TIntegerDynArray;
      AllMaxT,AllMaxP,AllMinT,AllMinP:Integer;
      PathDateTime:String;
      JCMStateNum:String;
      JCMWeiDu,JCMJinDu:String;
      JCStation:String;
      aExists:Boolean;
      JCIndex:Integer;
    end;
    这两个结构体数据是我要用到的,现在我主程序与数据获取分离,写了User_Check_Data.dll这个dll处理数据,所有的数据都转化成上面的结构体,用户二次开发也用这个数据,我这个dll函数该怎么写
      

  16.   

    procedure TForm14.getvalue(var ab:integer); 
    var aa:Taaa; 
      i:integer; 
    begin 
      aa.B :='3sds上'; 
      SetLength(aa.A,3); 
      for I := 0 to 2 do 
          AA.A[i]:=Pchar(Inttostr(i)); 
      ab:=integer(@aa); 
    end;
    有没有发现,你的A[i]在使用之前,没有GetMem
      

  17.   


    已经用setlength初始了,呵呵~~
      

  18.   

    var 
      Form1: TForm1;
      aa:Taaa;
      i:integer;这样也可以吖,呵呵~~