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

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

编辑:说三道四文库 发布时间:2017-02-25 01:14
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的例子
病毒式传播到商业价值,Docker开创以开发者为主导的商业模式 一周消息树: Windows 9系统截图大量曝光,一起来看看它长什么样! 腾讯李朝晖:不移动非互联,投资关注四大领域 【问底】Yao Yu:谈Twitter的百TB级Redis缓存实践 “OKCoin与你·北京一夜”:共商比特币可持续繁荣之道 苹果再发力:推Apple Pay,或将引发新一轮支付变革 CausalImpact,谷歌开源的R时域因果关系分析工具 腾讯云总裁陈磊:互联网和传统企业互联网化是主线 不得不看,苹果Pay技术大起底! 详解Apple Pay:一大波iOS原生应用正在逼近! 高性能微信公众平台开发 【先锋】事务、高性能,王涛谈打造超越MongoDB的NoSQL 浅谈互联网数据中心海量运营之道 一篇文章读懂开源web引擎Crosswalk Facebook创建新开源组织TODO,Google、Twitter等继续捧场 微软明日将启动第二轮裁员 涉及所有的事业部 IBM推出Watson Analytics 将人机对话带进企业决策 参与2014中国移动开发者大调查 MDCC门票等你拿 手游开发经验谈:付费体系决定游戏收成好与坏? 惠普推出全新ProLiant Gen9服务器 腾讯安全出杀手锏 搭建全国最大Wi-Fi开放平台帮助网友免费蹭网 云与数据安全实践尽在ISC 2014(免费门票) 开源的对决,MapR将Apache Drill引入企业应用 令程序员费解的10个语言特性 走进雅虎北京全球研发中心:五年光阴缔造雅虎全球创新引擎 超强集成游戏编辑器!开源跨平台引擎Wave 求别再侵犯儿童隐私!FTC狠罚Yelp和TinyCo 华为应用市场助力开发者 软硬结合造就强大生态系统 【CTO俱乐部看板研修班北京站现场速递】看板方法:渐进变革的过程 《近匠》不背单词,用“沉浸”征服英语学习 ETpl——强复用、灵活、高性能的JavaScript模板引擎 用Borland C++5.0编译c 时遇到的问题? 如何安装控件 类体系,大虾请进? 郁闷,汇了款没有结果 请问哪里有二级C语言试题(要答案)下载? 灌水 怎样把unicode转成GB? 该死的蝈蝈这个大变态, 你来给个封我的IP的理由 请教Object pascal书 神啊救救我把,mapinfo,gis,pb,数据库,bcb, 那位大虾知道为什么今天别人给我的答复不能发道我email,平时可以的,怎样设置 8086的堆栈初始容量是不是就是sp的初值? 那位大虾知道怎样把参考分转位可用分,我没可用分给你们了 将xml文档(表格形式)转换为Excel表格形式?? 请问硕泰克810的主板(型号为SL_65H60),上CII633最高能超多少,如何超?多谢另外.. 能不能用DD来定义字符串? 一个很简单的关于list的问题~~ only instances of classes are subject to garbage collection not primitives.怎么翻译? dbms_session.is_session_alive如何用 很糟糕的问题 因为我是程序员,都没人要我了?????? 为什么在写数据库时出现错误? 救命, 无法运行regedit, 提示注册编辑已被管理员禁止,如何使regedit 重新运行 难、难、实在难,难上加难......上帝救我!!! 班门弄斧,我也谈谈pb 割玻璃.......如何割?????????????????? Delphi 大侠救命~~~数据库转化后类型不匹配~~~在线等待~~~ 数据库登录问题,哪位请指点一二!!! 求救!!如何用sql语句向vfp数据表中插入一条日期型数据 vb窗体 ???能否将ppt的文件转换成为pps的,怎么样转换??? 关于sql Server中错误消息的具体描述如何取出的高级问题? ini信息文件的读写 pb7安装的问题请告知!不胜感激,我是新手! 怎样判断一个session是否存在 文件夹和文件的遍历 word问题,急阿 各位老兄,在哪里可以下载年终总结??? 请问各位高手!小键盘的键值各是多少?谢谢! 我用: Open "e:\mypicture.jpg" For Output As #1 语句打开一个文件,但是说文件已打开,但是发生错误55。为什么 请高手请来帮帮忙!!! 请问:回调方法(callback)可以在远程对象中实现吗? SoftICE都对我的Win2000做了什么??? 有tc++编译器吗?如果有,哪儿能下载到呢? 几个比较常用的应用软件所使用的编程语言 大虾:请问安装盘怎么作? 用OPEN打开一个文件,会显示到屏幕上吗 大虾救我!!--在socket中,如何实现server端检测网络断链 常用的应用软件所使用的编程语言 一个很紧急的问题:如何在一个自己程序中用程序来关闭模态消息对话框(500分,不够在加),详情见贴子 奇怪,我用vb写excel sheet在外面打不开了。。。高手帮忙呀 (化工)关于偶联剂的一道方子.偶联剂 10%清水稀释 90%用醋酸调 PH5 左右晾干上面几道程序后的产出品用途 西门子ULTRAMAT6的红外气体分析仪现在大概多少钱?甲烷丙烷双组分测量的,另外4组分双通道的一体机大概多少? 金属材料的热导率随温度升高而降低,而非金属材料的热导率随温度升高而增大对吗?...金属材料的热导率随温度升高而降低,而非金属材料的热导率随温度升高而增大对吗?金属材料的热导率随 什么是偶联剂 西门子在线分析仪能对两元气体检测岀吗? 煤炭化验机用法 为什么萃取剂的沸点一般要比所提取的芳香油的沸点低(高中生物) 怎么区别人工钻石和天然钻石? 聚氯乙烯电缆和聚乙烯电缆的区别? 不分光红外线分析仪的测量原理? 人造金刚石做成的钻石贵吗?和真正的钻石比怎么样?那做成的戒子,他们的区别大吗? 三相交联聚氯乙烯电缆 三相铠装交联聚氯乙烯电缆三相交联聚氯乙烯电缆和三相铠装交联聚氯乙烯电缆有什么不一样啊?各用在什么地方?如何选择大小? 功率分析仪是什么东西,有什么组成,有什么作用,它分很多种种类么?总之希望各位能让我清楚的了解就可以 关于金刚石与石墨的疯狂问题我们学过一篇课文《阿西莫夫短文两篇》,课文中提到“(你也可以在真空中对金刚石加热,从而把它恢复到原始碳的状态,但谁愿意这样做呢?)”.那么,如果在真 导热膏的热导率怎么测量 怎样比较晶体的熔沸点 为什么二氧化碳能吸收地面的发出的红外线?为什么地面能发出红外线? 石墨与金刚石哪个稳定? 几种晶体的熔沸点比较?离子晶体 金属晶体 分子晶体 原子晶体四种 谢啦 急求 为什么二氧化碳和水蒸汽可以吸收红外线,臭氧可以吸收紫外线? 为什么说气压越小,沸点越低啊?求原理! 晶体熔沸点比较分子晶体的熔沸点是不是比较分子量?它们的稳定性是不是看键能?也就是通过比较键长来比较?离子晶体呢?原子晶体呢?是不是凡是涉及熔沸点都与分子量有关?稳定性都与键有 为什么二氧化碳吸收红外线?(原理) 罗氏、雅培、贝克曼、东曹、西门子等进口品牌的全自动化学发光免疫分析仪的最新的机型是哪些?最好有机型参数,另外国产的全自动免疫分析仪的代表厂家及仪器型号也劳烦列举一下, 请问晶体熔沸点高低咋比较啊? 为什么一氧化碳、二氧化碳会被红外线吸收?在红外线气体分析仪表中,利用红外线对CO、CO2的吸收,来进行测量气体组分.请问为什么红外线能吸收CO 或CO2这些物质呢?弄错了,请问为什么CO、CO2 液体的导热系数能测试吗?什么方法可以测试液体热导率? 什么叫"零点漂移补偿"请问那位大哥知道什么叫零点漂移补偿? 红外线体温测试仪的原理请运用物理知识(好像是关于光现象的) 电炉炼钢和转炉炼钢哪个更先进点? 氯化铝的熔沸点哪个高?说氯化铝的熔点高于沸点,所以是共价化合物,这是为什么?一般物质不应该是熔点低于沸点吗?怎么会先汽化再熔化,还是有条件限制? 三氧化二铝导热系数(陶瓷基板)?铝基板的导热系数?氮化铝的导热系数? 设计实验证明供电线路上用铜导线好还是铝导线好? 放大器产生零点漂移的主要原因是( ).A.电路增益太大 B.电路采用了直接耦合方式 C.电路采用了变压器耦合 D.电路参数随环境温度的变化而变化 氧化锆和氧化铝的导热系数,热膨胀系数 现有一种铜粉和铝粉的混合物样品.测定样品中铝的含量,称取5.0克此样品置于锥形瓶中,将100毫升稀盐酸...现有一种铜粉和铝粉的混合物样品.测定样品中铝的含量,称取5.0克此样品置于锥形瓶 ALCL3有关熔沸点的问题为什么熔点190℃ 沸点182.7℃ 原因是什么?在达到上述两个温度是它是如何变化的呢? 不同的液体,沸点什么,且沸点随气压的增大而什么 35号钢和45号钢哪个贵 引起零点漂移的主要因素是 ,其后果是 ,一般通过 电路来抑制引起零点漂移的主要因素是 ,其后果是 ,一般通过 电路来抑制 一切液体的沸点,都是气压减小的时候__,气压增大的时候__ 45号钢是什么钢? 氯化铝的熔沸点?氯化铝的熔沸点各是多少? 什么是水质 COD 、氨氮和 pH 45号钢怎么表示 AlCl3的熔沸点较低,易升华怎么解释?既然易升华何来熔沸点较低 沼气产气于COD,PH.VFA的关系 浓硫酸的分子量,熔沸点,密度,折射率,以及在水醇醚中的溶解性 MgCl2和AlCl3的熔、沸点相差很大的原因可能是_______,镁和铝都是活泼金属,很难用还原的方法进行冶炼,一般采用电解其化合物的方法.推断冶炼铝时应采用电解____的方法.说明不选用另一种化合 氧化锆PH值多少? 需要苯甲醛的物理性质如性状,溶解度,熔沸点等 直接耦合放大电路存在零点漂移的原因是( )A.电阻阻值有误差B.晶体管参数的分散性C.晶体管参数受温度影响D.电源电压不稳定 食品厂工业废水.设计原水水质为COD 4200mg/l,BOD5 2000 mg/l,SS 420 mg/l,NH3-N 40 mg/l,pH 5.2,色度250倍.废水经处理系统处理后,出水水质指标要求达到《污水综合排放标准》(GB8978-1996)工业废水一级排 怎样用电子气理论解释金属晶体热导率随温度升高而降低 直流放大器应用中,抑制零点漂移的手段主要有( )A补偿 B调制(或转化) C补偿和调制 D,上述说法都不对 废水的PH值对COD有影响么? 为什么温度升高金属的热导率反而降低? 直接耦合放大电路为什么产生零点漂移 西门子,什么家电是强项? 金属的热导率为什么随温度升高而降低
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn