none
数组类型代替指针类型后遇到的“大”问题 RRS feed

  • 问题

  • C++写的控件的一个方法是SetData(float FAR* pSourceData, long TotalPointNum)

    其中FAR*指针要存入的是一个长度为4096字节的二进制数据(理论上这4096字节里有1024个点数据)

    后来因为控件在网页中使用将这个指针类型改成了数组类型 

    控件能调用了  可是读取到的数据确和原来不一样了

    我是这样做的:我把那个长4096字节的数据每四个字节截取成一个1024个元素的数组传给上述方法,得到的处理结果却大不一样 

     

    这是为什么??怎么样截取才能消除这种差异??

     

    注:网页中用的脚本语言是vbscript,如果我对问题的描述还有让你不清楚的地方请慷慨留言发问  不胜感激 

    2008年12月20日 3:49

答案

  • 研究了一天  终于发现原来是float型数据用16进制表示的时候会有颠倒的问题:比如说一个float型转换成16进制数后是“9A014D3C”   要想把这个数还原成float型得用字符串“3C4D019A”还原才能成功。这涉及的是计算机原理里的东西了

    我也才刚知道  将这点信息反馈给关注本帖的人   想要明白具体怎么回事的人可以参看http://www.mcustudio.com/jixue/ShowArticle.asp?ArticleID=195

    谢谢大家的关注  特别感谢两位顶贴的高手 

    2008年12月23日 13:37

全部回复

  • 接口错误,vbscript里面没有指针。你应该传递safe array (COleSafeArray)。
    2008年12月20日 15:12
    版主
  • 感谢你对我问题的关注   vbscript不支持指针  我们就把控件的相应方法里的指针换成了你说的数组类型  解决了控件调用出错的问题 

    现在的问题是:以前用FAR*指针读取的数据现在切成数组之后得到的结果不正确  希望高人继续关注  谢谢 

    2008年12月21日 3:02
  • 经过这两天查资料我觉得问题应该是出在数据转换上。  存在数据库里的那个Image类型的长二进制数据[这个数据的组成是这样的:长度为4096字节、二进制 如果用指针读取,即float FAR*这样的指针,刚好是每四个字节一读取并随之转换成这4字节内存单元对应的float型数据]

    而网络传输的时候我在服务器上将其用C#中的xmlWriter类的WriterBinHex()方法转换成了16进制的总共8192字节的字符,再将这个16进制的长字符串按8字符截取完了之后转换成二进制数的时候   不知道其中发生了什么样的差别  进一步研究中……   希望大家继续关注  谢谢 

    2008年12月23日 2:36
  • FAR这样的指针好像只是在16位机的时代才有作用,因为那个时候操作系统的内存分段和分页存储,而且程序可以直接访问物理内存,例如在同一内存段或内存页的指针叫做near,而不同内存页的指针叫做far,32位Windows引入虚拟内存的概念,用户程序已经不能支持访问和处理物理内存了,因此far和near的概念就已经消失了。

     

    我觉得你的C++函数声明应该有问题,你的C++函数声明应该是:

    SetData(SAFEARRAY *psaSourceData)

     

    而且你的IDL文件里面,接口的声明应该是:
    SetData([in] SAFEARRAY(float) psaSourceData)

    2008年12月23日 10:44
  • 研究了一天  终于发现原来是float型数据用16进制表示的时候会有颠倒的问题:比如说一个float型转换成16进制数后是“9A014D3C”   要想把这个数还原成float型得用字符串“3C4D019A”还原才能成功。这涉及的是计算机原理里的东西了

    我也才刚知道  将这点信息反馈给关注本帖的人   想要明白具体怎么回事的人可以参看http://www.mcustudio.com/jixue/ShowArticle.asp?ArticleID=195

    谢谢大家的关注  特别感谢两位顶贴的高手 

    2008年12月23日 13:37