说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于传递结构中的指针指向的结构的动态数组问题。

编辑:说三道四文库 发布时间:2017-07-21 08:42
HTML文档下载 WORD文档下载 PDF文档下载

Type 
  TResponse = record
    Return : boolean;
    Command : PChar;
    Buffer : pointer;
  end;
  TrtArr = record
    size : integer;
    arr : array of integer;
  end;

function getData() : pointer;
var p : ^TResponse;
    rt : TResponse;
    rtArr : TrtArr;
begin
    rt.Return:=0;
    rt.Command:=nil;
    rt.Buffer:=nil;
    rt.Size:=0;
    rt.Reserve:=0;

    p:=AllocMem(SizeOf(TResponse));
    result:=p;

    .......... //这里的一些过程对rtArr中的size和动态数组进行了赋值。
    //*********将赋值后的rtArr拷贝到rt.Buffer***************
    rt.Buffer := AllocMem(SizeOf(rtArr));
    move(rtArr, rt.Buffer^, SizeOf(rtArr));
    rt.Size := SizeOf(rtArr);  
    //***********************************************
    rt.Return := true;
    rt.Command := 'SUCCEED';
    move(rt, p^, SizeOf(rt)); //将整个rt结构,拷贝到返回结构指针p   
end;

//以下接收返回的结构时出现错误
var data : ^TResponse;
begin
      data := getData();
      rtArr := data.Buffer;
      n := rtArr.size;

      ListBox2.Items.Clear;
      for i:=0 to n-1 do begin
          ListBox2.Items.Add( IntToStr(rtArr.p[i]) );//执行到此处出现内存操作错误的提示
      end;
end;

我试过,如果data.Buffer光是一个数组、字符串、或固定长度的结构的话不会有问题。
但是现在我必须将一个动态数组放入data.Buffer传出去。不知道该如何做。

就相当于一个指针指向一个结构,而这个结构中又有一个指针指向另一个结构,而这另一个结构中有一个元素是动态数组。

Faint!!!
没人回答呀?
我自己已经搞定了,不得不放弃使用动态数组,而改用指针数组。
不过这样一换好像效率提高了,自己也长了不少知识。

使用move进行内存拷贝时最好将目的和源都强制转换pointer型,呵呵。

欢迎继续讨论,别把我的分给糟蹋了。
我看了好久,一个问题是ListBox2.Items.Add( IntToStr(rtArr.p[i]) );
好像你的结构中没有P?第二个问题就是对于动态数组,为什么不用SetLength?
没有p是因为我打错了,把p改成arr就成了,不好意思
我是用SetLength来设置动态数组的长度的,只是此操作与问题没太大关系,所以省略了。
动态数组是delphi中比较特殊的类型,更多的象指针,如果它放在结构中,它始终只占4字节(指针大小),如果是数组的话,则会占用相应大小的字节数,所有两者是有很大区别的.在使用它的高级用法前必须了解其原理
不错
那这样说我就是不能在结构中的指针里使用动态数组了?
可用指针数组来替代有点乱七八糟的感觉。
不是不可以,只是访问它的数据时不能通过结构简单的来完成,举例:
type
  TRec1 = Record
    Arr: Array of Integer;
  end;
  TRec2 = Record
    Arr: Array[0..4] of Integer;
  end;
var
  Rec1: TRec1;
  Rec2: TRec2;
begin
  Rec1.Arr := VarArrayCreate([0,4],varInteger);
  ShowMessage(IntToStr(SizeOf(Rec1)));
  ShowMessage(IntToStr(SizeOf(Rec2)));
end;

你发现结构其实大小完全不一样了吧
另外,如何将一个Pchar拷贝到pointer中

var str : PChar;
    p : pointer;

我是该使用
move(str, p^, StrLen(str));
还是
move(str^, p^, StrLen(str));

另外读p^里的PChar时该怎么做?

已经给分了
test ok
在system单元中查StringToVarArray函数的实现,那里有MOVE的例子
让文本框输入完后,直接跳入下一行 -VB资料 VB如何编制带有不定个数参数的过程。 VB如何充分扩充VB功能 VB如何传递不固定个数的叁数? VB如何打开和关闭光驱门 VB如何导出收藏夹到文件或者导入文件到收藏夹 VB如何得到磁盘上剩余空间的值 VB如何得到应用程序的资料! VB如何调用chm格式的帮助文件 VB如何调用控制面版中的应用程序 VB如何动态更新数据报表 VB如何改变 NT 预设的打印机? VB如何改变 Windows 预设的打印机 VB如何关闭其他程序 VB如何过滤键盘录入 VB如何获得Windows95已经运行的时间 VB如何检测左右键同时按下? VB如何检查您的电脑是否打开 ActiveDesktop? VB如何将程序建立成“启动”文件夹的捷径? VB如何将程序建立成「启动」资料夹的捷径。 VB如何结束 Shell 所启动的程序? VB如何拦截键盘输入 如何判定VB调用的一个EXE程序已经结束. VB如何判断某一个Drive是否为光碟机? VB如何清空回收站? VB如何取得汉字的区位码 VB如何去优化你的VB程序 VB如何让点阵打印机每次印出一行? VB如何设计一个可中断循环的按钮。 VB如何实现VB程序登录密码加密 VB如何使程序不出现在任务列表中 请问:键盘上"DEL"按键的内码是多少? 问天下谁能帮我?从纸的上端10mm处开始打印 那位大哥知道成都高程成绩那儿可以查啊? 关于双连接上网。 帮朋友问个问题。一定帮忙啊各位大虾!可以另外开帖给分 怎样改变标题栏大小? 请问如何使image上的图形变成没有?谢谢! 帮帮忙:怎样将一个IP地址转换成一个二进制的数字(32位) 程序快完了, 不知道如何作安装程序 各位有水晶报表的资料吗?能否提供一些此方面的资料! c#更改系统日期 怎样改变标题栏的大小? 一个渴望学习网络知识的大三学生,请求各位学过和未学过认证的朋友的帮助!!!紧急等待中..... 寻CSharp的生成注释Web页的资料! 谁有9X下进入RING0 来HOOK API的源码?[急求中] 为何在我得浏览器里打开这里的帖子看到的是源代码? 求救!!请问我的Ie窗口关不了是什么原因,有什么解决办法 DBF问题 提问几个文盲问题 如何得到一台机器所在的工作组或者域名!~ 菜鸟题一个问题:想在oracle中实现一个定时任务 100分 如何一本书扫描并保存为PDF格式?利用PDF文件格式可否到数字签名的操作?Acrobat Reader 5.1新增了该功能,但我用不好。 真正的P2P技术,实现了Internet上局域网对局域网、局域网对公网、公网对公网的交互 在mysql中,php如何存取图片,给个例子行么? 如何一本书扫描并保存为PDF格式?利用PDF文件格式可否到数字签名的操作?Acrobat Reader 5.1新增了该功能,但我用不好。谢谢 导航条 大家来看一下啊,,, 关于IE和注册表的两个问题 CComboBox疑问? 如何在字符界面下更改linux的X图形界面? 请问pc机的Com是不是就是一个UART,还是别的什么结构,请告知 如何发布基于tomcat4的加密ssl协议http://的网站 ADO对象问题,在线等待. 查看那些访问数据库(sqlserver)引发死锁的线程的方法(菜鸟请教高手),在线等待...... 思路 如何将表格中的已有数据删为空?总是提示数据类型不正确,怎么办呢? 当FORM1窗体最小化时 如何注册c++build6.0?注册机用不了? 而当FORM1窗体最小化时 --在线等待,高手入内:-IE打印中4.23的问题--- 请问如何在另外一个服务器的文件里写入数据?帮帮忙,急!! 我的困惑 weblogic7.0部署JavaBean和Servlet问题 CComboBox的GetCurSel()问题? 象《金山快译》那样的导航条效果该怎么做了? sql查询的问题,急于解决,请指教! 请问笔记本的开机密码忘了怎么办? 我的困惑 如下小程序,怎么也有问题???请教!? 请问.asf用什么播放 有什么办法能把文本文件中的一个空行给删除 台湾当局提前扩建太平岛码头 应对南海康妮台风致40年一遇洪水 半个云林县郑洁战胜大威多次被雨打断 共耗时近7绿营:两岸服贸协议辩论 马英九苏贞昌中国女排险胜意大利 郎平上任后已豪取马来西亚华校幼儿教师风行来华研修 目切尔西官方宣布签约埃托奥 年薪700北仑象山住房公积金最高贷款额度回调至黑鸭子流入卤小二 工商部门证实两家门郑洁首赢大威 3小时拉锯战不给自己留薛蛮子欠嫖资 态度蛮横叫嚣自己是美国浙江省扎实做好今年十方面为民实事杭州市人大首次对检察官开展履职评议温州开房处长被判刑6年 开房百次终因姑娘深夜金华街头迷路 搭顺风车被摸腿杭州首次对检察官进行履职评议杭州5岁女孩爬窗找爷爷从20米高东园浙江义乌团伙利用微信组织卖淫 3天获4岁男孩开货车倒车 开了10多米差点贵州18岁小伙在义乌工作 被偷手机跑金华世纪联华边来必堡土狗咬伤俩人切尔西16-17赛季主场球衣发布美女探花专属配色,Nike Zoom母亲节广发借记卡100元立减38元非洲警犬宝宝协助保护大象(图)网购族注意!网购被坑,你该怎么办?RPG游戏新作《天军:无限争夺战》预广式烧鸭做法培训 满天红传统正宗品卡罗尔:洛瑞必须振作起来!布登霍尔泽谈变阵可能:会考虑所有的可2v2决胜关键 火影忍者手游小队激斗在潮湿的天气里衣服该怎么办?JR:一直在空位,所以就投了中美石油大战“风谲云诡”,大量囤油意卢谈2比0领先:做了我们该做的贝兹莫尔:原以为骑士第一场已经投疯波波:上一场输球责任在我们自己国米皇马将竞争边后卫法比尼奥库存暴增供应中断风险 油价后市“命悬斯科特:本以为还能执教一年湖人《天行九歌》霍尊MV发布 制作特辑揭保定-中国电谷智慧能源国际创新峰会成
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘