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

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

编辑:说三道四文库 发布时间:2017-03-27 04:51
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的例子
Vuforia SDK 3.0发布在即 全球注册开发者已逾10万 最受职场青睐的十大热门云计算技能盘点 Android Bootstrap:开发也能用模板,省时又省力! Facebook开源又一力作,欲借Broadcom开放交换机 华为敏捷网络:坚持被集成,引领ICT融合 专访赵桂华:.Net也有春天及高性能网站架构实践 《近匠》Testin:云测试除了APP和真机 还有可穿戴和汽车 应用开发利器FXForms:iOS上实现各种Form View Firefox 30正式版:支持GStreamer 1.0技术、内置全新Gecko 30内核 从阿里、UC联姻 看移动互联网“入口”之争 AppCode发布3.0.1更新,支持Xcode 6和Swift 智能家居持续升温:苹果HomeKit合作伙伴Honeywell发布恒温器 欲与谷歌、亚马逊抗衡,苹果推CloudKit拥抱云服务 针对新一代物联网应用 Atmel推全新32位微控制器 实时计算,流数据处理系统简介与简单分析 Cue:秒杀HealthKit,打造自己的家庭医生 新iPhone要来:4.7就够了么?我们还有更大的 Docker迈入云(DockerHub)+端(Docker引擎)时代 《近匠》壹枱智能钢琴:改造音乐行业的新“玩”家 圣何塞Hadoop Summit 2014看点 唯快不破!90后大学生9天完成近670页的Swift语言文档翻译 一周消息树:Java、.NET、Web技术应用特点 苹果生态格局:软硬件之后,iLifestyle才是王道 小米互娱总经理尚进:独立游戏当为发烧而生 哪些编程语言、框架/平台最受企业青睐? 高德LBS应用大赛:百万大奖、千万基金等你来拿! Gartner:有数据有真相 从浪潮看服务器市场走势 PhoneGap 3.5.0发布,不再支持iOS 5和ARM64 “中美青年创客大赛”之“创客&#183;教育论坛” 以创客教育支持创新人才培养 授之以渔,谷歌发布开源秘密武器Kubernetes 炫耀分数已经out!ShareSDK发布游戏内视频录制SDK 为什么JET老出毛病呀??? 数据绑定的问题 初学者提的关于C的问题。 问个菜问题 有关音箱的问题 哪里可以下载linux? 在对话框中的edit上敲字符,如何让对话框也收到该WM_CHAR消息? 那位高手用c++写过解释器请指教一二 有关内存泄漏 为什么PostMessage会改变lParam参数? 如何取得日历控件中点击的日期? DateTimeStr=CSTR(now()+TIMEADJUST/24)什么意思? WINDOWS NT 远程访问的问题!急急----100分 HOOK到底是什么东西呀?有没有例子呀? 一个很基本的问题 上高中的时候,军训,学军体拳,练过这一招... 又一个入门级的问题:关于在Graphics中输出文字 在VC++6.0开发程序中,怎样象ACDSee那样加载扫描仪扫描 jpg与jpeg的问题 哈哈,考考你:你能说出这6行代码的结果吗? 我为什么在2000svr下,安装realserver7.0,装不上??? 如何传递消息 请问如何把 一个数组的值放到表格的某一行中 请教,如何使对话框的模板在程序启动后变大 怎样将在一个网页中的值传递给另一网页用?!急 用xsl解析<iframe>出现问题! 救命,在win2k下使用IIS+php4,无援无辜启动了好多php.exe进程。 关于多语种开发的问题 在MFC中出现libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main错误的可能有几种,如何解决? 有没有对音箱价格了解的,也许你懂一点就能回答我的问题。 求助:如何设置Jet OLEDB:Database Password的属性 .mdb数据库的字符型字段不能超过50个字符,但是我要存入更长的字符于一个字段该怎么办呢? 我只安装了Rose,Vss,却常有提示:虚拟内存不足,我在“设置”中改为499mb,还是没用 HtmlInputFile的缺陷,还可以用什么控件或方法来做? 问一下wdl格式的文件用什么软件可以打开? 先来的得分。OVERRIDE 和 OVERLOAD 的区别究竟是什么?谢谢! ip地址的添加, 大家看看什么原因出错???SOS 又是一个巨简单的问题,怎么偶老是问这样的问题? 为何会这样? 谁能帮我用PB做一个学籍管理系统 大家都来发表意见:我因为职业道德问题,被迫辞职 谁能开导开导小弟,各位大哥帮帮忙吧。我真没得混了。 在VB中如何把图片存储到SQL Server 的数据库中 请问CDialogBar用鼠标拖动改变其大小(这时其大小并没变化)时,将触发什么事件? capboy:为什么我加入了memfile.h后编译回出这样的错误: 我为什么在2000svr下,安装realserver7.0,装不上???(请高手帮忙。) 如何编写象datagrid一样的控件?大家给点建议。 jb6中怎么象JDK中一样编译类哦? 关于非阻塞通信的一个问题!(BSD系统,非WSA...) 哪里有power builder 8.0正式版的下载 我为什么在2000svr下,安装realserver7.0,装不上???, 宇宙中的黑洞吸收的能量能释放出来吗?会怎样释放? 若某人沿着坡度i=3:4的斜坡前进10米,则他所在的位置比原来的位置升高了多少米? 有两种金属合金10.5g,与足量稀硫酸反应后,产生的气体在标况下占体积11.2L,则组成该合金的元素可能是A Mg和Al B Fe和Zn c Mg和Cu D AL和Cu 马拖着一根树干在粗糙的水平地面上做加速直线运动,已知马对树干的拉力为F1,树干对马的拉力为F2为什么F1=F2 怎样探测黑洞 有两种金属组成的合金8g,投入足量的稀硫酸,生成标准状态下气体5.6g,这两种金属不可能是?A、Mg-Cu合金B、Mg-Fe合金C、Al-Zn合金D、Fe-Zn合金 黑洞是什么?到底有多重?黑洞是什么物质,性质是什么,什么时候产生,内在的价值有多大,什么时候可以研究 下列各种物质,在氧化还原反应中通常只可作为氧化剂使用的是A SO2B H2SO4C Cl2D FeCl3他不是说【只】可作为氧化剂吗? 某合金粉末11克,加入到足量的稀硫酸中,在标准状况下产生的气体体积为11.2L,此合金可能是( )A.镁铝合金 B.铜锌合金 C锌铁合金 D锰锌合金 氢氧化钠和水反应放不放热? 是氧化还原反应中的氧化剂和还原剂是一种物质还是一种元素? 在同一反应中:氧化性:氧化剂>氧化产物 还原性:还原剂>还原产物O2 + 4HI === 2I2 + 2H2O氧化剂 还原剂 还原产物 氧化产物 故氧化性O2>I2不是说氧化剂大于氧化产物吗,那应该是氧元素的氧 最大的黑洞有多重什么星座,什么星系或星中 某人从坡底沿着坡度为i=3:1的斜坡前进了810米到达坡顶,则这个斜坡的高度为多少?A.81米 B.9米 C.24米 D.27米 氧化剂的氧化性大于氧化产物的氧化性,还原剂的还原性大于还原产物的还原性,什么是氧化产物,什么是还原产物 说得清楚一点 某人沿坡度为3:4的斜坡前进10米.则他所在的位置比原来的位置升高 米 宇宙黑洞是怎么回事? 已知关于X的一元二次方程(a-1)x^2+(2-3a)x+3=01 求证:当a取不等于1的实数时,此方程总有俩个实数根 2 若m,n(m<n)是此方程俩根,并且1/m+1/n=3/4.直线l:y=mx+n交x轴于点A,交y轴于点B,坐标原点O 若某人沿坡度为i=3:4的斜坡前进了10m,则他所在的位置比原来的位置升高多少米 若某 若某人沿坡度3:4的斜坡前进10m,则他所在的位置比原来的位置升高了________m 设a、b是关于x的一元二次方程x^2+x+n-2=mx的两个实数根a2 2、m>1 n 某人沿坡度i=1:0.75的斜坡前进10m,则他所在的位置比原来的位置升高____________m. 某人沿坡度为3∶4的斜坡前进10米,则他所在的位置比原来升高__ 当m取何值时,关于x的一元二次方程mx+(m-2)x+(1|4)m-2=0有两个实数根? 氧化钠与水反应的离子方程式 氧化钠拆么?为什么不拆?溶于水的物质不都要拆吗...这个NaO在水中就没了...虽然是反应掉了,可也算溶吧? 与稀硫酸反应放出气体的物质一定是金属吗 由两种金属组成的合金8g,投入到足量的稀硫酸中,测的产生气体5.6L(标准状况),则原合金不可能是?A、Mg-Cu合金B、Mg-Fe合金C、Al-Zn合金D、Fe-Zn合金 氧化还原反应怎么看氧化剂和还原剂化合价升高(得)电子,为(还原)剂,本身被(氧化);降低(失)电子,为(氧化)剂,本身被(还原)。对不对啊? 谢谢!!! 浙大夜惊魂结尾什么意思 什么情况下恒星不会被黑洞吞噬?就是银河中心 但恒星绕到银河中心时 会出现很大的急转弯 那是因为中心是黑洞的引力造成的 但是为什么那颗恒星不会被黑洞吞噬呢?是不是因为恒星的速度 离子方程式 氧化钠能拆吗 (不是过氧化钠!) 由两种金属组成的混合物共20克,与 足量的稀硫酸反应,直到生成气体为止,测得共放出氢气的质量是1克,判断金属混合物的组成不可能是 ____.A 镁和铁 B 铝和铁 C 镁和锌 D 铝和镁直到不再生成气 有两种金属的合金13g,与足量稀硫酸反应后,在标准状况下产生气体11.2L,则组成该合金的金属可能是A Mg和AlB Mg和ZnC Fe和ZnD Al和FeC为什么不对从“极值法”看的话11.2L=0.5mol=1gZn----H2 Fe-----H265 2 56 21 偏铝酸钠和什么反应? 强氧化剂遇到强还原剂不一定能发生氧化还原反应为什么,请举例说明 浙大夜惊魂的结局是什么? 向碳酸钠中滴加氯化氢的两个反应,氯化氢足量和不足量的 黑洞由什么构成? 请问红色光照在绿色衣服上,看到的结果是什么? 如果利用黑洞的能量(加上宇宙中可以探测到并且可以吸收的能量),围着黑洞转,能否逃离黑洞?如果成功了,则可以利用能量让飞船以超光速飞行! 氧化钠与氯水反应的离子方程式 浙大夜惊魂 结局怎么回事 杜学明 李家明他们怎么样了 那一晚后来张超落水后其他人发生了什么事 黑洞吸收能量到一定程度的时候会爆炸吗? 黑洞的构成?真的存在黑洞?如题.黑洞是个物质还是星球?是星球的话为什么会“吸”近很多东西?黑洞周围扭曲的空间是怎么恢复的啊? 氧化还原反应到底有什么用?如何判别一个物质它是氧化剂还是还原剂?非常感谢! 黑洞可以吸收任何物质,请问黑洞的能量如何产生,该能量可实现穿越时空吗 写出钠,氧化钠,过氧化钠分别与水反应的离子方程式 判断下列反应是否是氧化还原反应,是氧化还原反应的指出氧化剂和还原剂.① Fe + CuSO4 3 FeCl2 是或否_____氧化剂_______还原剂_______⑧ CH2OH(CHOH)4CHO + 2 [Ag(NH3)2]OH CH2OH(CHOH)4COONH4 + 2Ag↓ + 3NH3 物体受竖直向上拉力作用,拉力F1=140N,物体向上的加速度a1=4m/s方.物体在2s内位移多大?那2秒末的速度多大? 黑洞具体是由什么组成的? 氧化还原反应中氧化剂可以有多个吗? 黑洞为什么什么能量都吸收?是什么原因呢?可以制照吗? 氧化钠和水反应离子方程式 设A为n阶方阵,且满足A^2-3A+2E=0,证明A的特征值只能是1或2 一物体受竖直向上拉力作用,当拉力F1=140N时,物体向上的加速度a1=4m/s方,求物体的质量? 黑洞是由什么组成的? 设A为n阶矩阵,且满足方程3A^-2A+4I=0.证明A与3A+2I均可逆 黑洞有没有重量? 若斜坡坡度为1:3,沿着坡面前进10米,升高几米? 有两种金属的合金10.5g与足量稀硫酸反应后产生的气体在标况下站体积11.2l则组成该我要哭了啊啊啊啊啊啊为什么al是9g />
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘