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

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

编辑:说三道四文库 发布时间:2017-05-29 03:44
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的例子
当数据中心遭遇污水 微软新能源数据中心的诞生 2012vForum:更加注重开发者 腾讯赵伟:Hive在腾讯分布式数据仓库的实践 Apple将在2013年启动香港数据中心的建设 顶级域名扩张受阻:ICANN透露部分域名存争议 硅谷创业教父Paul Graham:如何获得创业好点子? GDC2012特别报道:中西方游戏开发思想在这里融合 应用示例和对象是编程的未来吗? 为什么2012年HTML5发展远未达预期 当程序不再工作时,程序员说 独立游戏开发者易犯的9大致命错误 “Do Not Track”的前世今生 《Warcraft是怎样炼成的(三)》:从Demo到游戏 无限强大的超级马里奥AI 以Google第二代数据库产品MegaStore为理论模式 探索HBase系统 传Google明年推Chrome OS触摸屏上网本 下载自己过去的Tweets?用户准备好了吗? 微软任命研究部门新副总裁 负责北京等实验室 欧朋首席标准官:HTML5将在2014年成熟 开发利器:对游戏开发者最具价值的5类iOS应用 专访前IE浏览器内核研发工程师,带你深入了解IE10 Windows 8市场接纳速度慢于Windows 7 别只看下载量!“用户留存率”才是关键! 预计2020年出现百亿亿次级超级计算机 Google数据中心PUE的秘密 一个传奇:有个人不断赢得世界算法冠军 音乐能力开放平台合作探索之旅 社交网络海外营销技巧及工具实战 大数据谬误 —— 为什么我们需要收集更多的数据 传苹果地图负责人Rich Williamson遭解雇? 一个月:Windows 8授权许可已破四千万 下午要去中国企业网福州分公司面试 几个小问题,敬请指教! 天要下雨,娘要嫁人!(zyq_123 (雍亲王)不是再作秀吧!) 在线调查:大家都用什么搜索引擎呀,google经常上不去 求教 为什么我从TListBox(或TCustomListBox)派生出的组件,放到窗口上后,总是出现no parent window的错误? 我在一个应用程序中以Motif风格显示控件,可是点击控件时总有个红 框框,应该怎么去掉呀! 开发EXCHANGE应用的困或? 关于增加新硬盘 ftp下载的实现(用internet transfer) 想订杂志但不知道哪些杂志好?诸位能给点意见与我吗???(图像类和网络类) 如何卸掉red hat linux7.2 sql server 2000 的配置参数疑问? 如果计算机有多个IP地址,如何得到主机的默认IP地址? 想订杂志但不知道哪些杂志好?诸位能给点意见与我吗???(图像类和网络类 想订杂志但不知道哪些杂志好?诸位能给点意见与我吗???(图像类和网络类 请问join的用法,谢谢! 请好心人帮帮忙吧,可以这样用VC做服务器组件吗? tomcat+apache为什么样会有这样的错误? 怎样在一个PROJECT里启动另一个PROJECT?大虾一定是轻车熟路的! 这样的写发为什么他只取第一个啊??? 在windows API中,有没有那个函数可以直接调用来显示cpu利用率的————请教!! 学FOXPRO到底还有没有用啊?为什么大学课程里都有它啊? 哪里有公式编辑器(包括数学,化学等公式)的ocx 或com呢? 急救 sqlserver 6.5 急~~到底是病毒作孽还是系统问题?? 燃眉之急,请各位指教 怎么知道数据库是否存在某个存储过程,在线急等! 请教:取CppWebBrowser中的page source 为什么我提交后的页面却又Dreamweaver打开了提交后的页面? 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到硬盘,而是response到用户? 一道怪题,欢迎讨论 谁知道关于调整麦克风音量的API函数???请叙述详细一些,紧急,谢谢!!!!!! 发布一个串口调试程序,若用的着请进,急急急!!! 请问有那些关于vc界面的书呢? 请问大家硬盘是怎么装的,电路板朝上还是下,或者是斜着的?对硬盘有没有影响?up有分 关于动态SQL的问题,请各位大虾帮忙,急急.............. 为什么触发器只触发最后一条记录?(付触发器) 怎样查找一个时间范围的数据? 在Workflow流程中,如何实现域值的改变? 访问该页者有分!!!!!!!!!!!!!! 数据库问题!急用! 为什么触发器只触发最后一条记录?(付触发器) 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到 俯卧撑次数首次超40,放分! 一个使用motoSDK的问题请较! 一个奇怪的问题?? 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到硬盘,而是response到用户? 一个非常初级的问题。 中国积极培养电脑“网络战士” ---泰晤士报星期刊 sco unix 高手请进 thermosol是什么意思? 不是构成蛋白质的氨基酸之间能脱水缩合吗? 为毛不能用食盐水去菜刀上的铁锈? 钢铁是怎样被腐蚀的如题~ 蛋白质大多是由20种氨基酸脱水缩合形成的肽链结构那里错了 用热的纯碱溶液洗去菜刀上的铁锈 钢铁是怎样腐蚀的?被泪水腐蚀的. A、B、C、D是中学化学中常见的四种单质,已知它们在常温下均为气体.其中D能分别与A、B、C在一定条件下化合,生成化合物X、Y、Z.E、F均为气体,且F为红棕色.有关的转化关系如下图所示(反应 氨基酸、蛋白质、肽、脱水缩合………都是怎么回事儿?说明白一点儿..形象的说.便于理解,记忆 举一例关于计算的. 理想变压器的初,设P1为初级线圈功率,P2为次级线圈功率则P1=I1U1=P2=I2U2我的问题是:为什么当I2为0时,I1为0?虽然从数学式子上很容易理解,但是在实际中:U1存在,且电路闭合,怎么会无电流请解 有哪些著名品牌的硬度计?都有哪些品牌的硬度计,什么品牌的硬度计好?国外的和国内的…… 如何计算悬垂绝缘子是否会发生顺线路放线偏移如何计算悬垂绝缘子串是否会发生顺线路方向的偏移~ 硫化类类似硫化钠等 关于理想变压器的功率.理想变压器功率是输入功率加输出功率还是只是输出功率? 进口硬度计那个牌子好洛氏和球压的,具体都那几个牌子好! 为什么在太空看地球是圆的 理想变压器可以转换直流电吗? 硬度计Shore A与IRHD测试结果可以相互换算吗? 地球是圆的怎上太空 高中阶段: 理想变压器功率.理想变压器输出功率等于输入功率.那就是说输入功率全部转化成输出功率,也就是说输入线圈(原线圈)中就不会再有电流,因为功率全部输出.可实际是原线圈中 什么是"虚假水位"?锅炉出现"虚假水位"时如何处理? 某工厂有一堆钢管,第1层3根,第二层无根,以后每层多2根,最底层一共有11根,这堆钢管共有多少根? 深圳市好博译翻译有限公司怎么样 锅炉水位波动大的原因用气时和不用气时相差十几公分,请教是什么原因?不用气时低,用气时高 请问这是什么橡胶,软的,有弹性的,像海绵,但是韧性比海绵大.请问这是什么橡胶,软的,有弹性的,像海绵,但是韧性比海绵大,怎么扭都会恢复原形. 深圳市欧美意科技有限公司,英文如何翻译最好, “某单质与浓硝酸反应,两者物质量比为2:1,该元素在反应中显现的化合价可为多少?”此题如何做? 断层角砾岩 与破碎带 有何关系? 两个氨基酸分子缩合形成二肽,并生成一分子水,这一分子水中的氢来自于( )A 羧基 B 氨基 C 羧基和氨基 D 连接在碳原子上的氢 由常见元素的化合价可知,为什么有的元素只有一种化合价,而有些元素有多种化合价呢? 地球上含量最丰富的是氧,那么在宇宙中呢?谢谢!有选择:A 氡 B 氮 C 氧 D 氢 两个氨基酸分子脱水缩合形成二肽,同时生成一水分子,该水分子中的氢来自哪? 氧化反应中化合价变化是指氧或含氧化合物的中的氧化合价变化还是随便一种物质或其中的元素化合价变化? 宇宙的数量是不是无限的? 两个氨基酸脱水缩合为二肽 那么水中的氢来自与?肯定有氨基 但是否有羧基 氨基有一个H 但羧基分出的是H还是OH根 两个氨基酸是通过脱水缩合的反复是结合在一起的吗? 怎样制作热熔胶粒 SEBS 热熔胶膜有听说吗 polytpe 微信公众账号 两个氨基酸是通过脱水缩合的方式结合在一起的 ,正误我正式作业,快阿 直流输电线路的绝缘子片数是如何确定的? 考古金属探测器能不能识别金属属性吗? 两种氨基酸是怎样结合到一起的 是通过脱水缩合的方式吗? HDPE热熔胶粉属于热熔胶吗?它跟HDPE粉是一种物质吗 为什么电子计算机的广泛使用是第三次科技革命的核心? 什么东西可以快速腐蚀钢板 热熔胶里有hvac的物质吗 虚假水位现象是怎样形成的? 腰间盘突出往腰里打臭氧行吗 什么爱吃蚂蚁 虚假水位产生的原因是什么? 腰椎间盘突出可以用臭氧介入治疗吗?如果有在哪个科?【腰椎间盘突出】发病有2个月了,腰酸,腿脚没问题,做牵引,时好时坏,影响工作了 万喜燃气热水器 排水阀 排的是什么水?冷水管里进的自来水还是冷凝水?万喜燃气热水器 排水阀 排的是什么水?冷水管里进的自来水. 什么是“虚假水位”? 用热的纯碱溶液能否洗去菜刀上的铁锈?为什么? 热熔胶的软化点是什么意思 试述虚假水位现象是怎样形成的? 用热的纯碱溶液洗去菜刀上的铁锈 为什么不对 热熔胶 RHA什么意思 氨基酸形成蛋白质脱水缩合过程问题由51个氨基酸形成某蛋白质的过程中共脱水48个,则形成的肽键数目、该蛋白质含多肽链的条数、该蛋白质分子中最少的氨基数目各是( )A.48、3、51 B.50、3 如何清除菜刀上的铁锈?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘