51Halcon机器视觉

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 273|回复: 0

[资料] HALCON的HTuple和HString(C ++)的常见问题

[复制链接]
  • TA的每日心情
    开心
    前天 20:10
  • 签到天数: 622 天

    连续签到: 3 天

    [LV.9]以坛为家II

    137

    主题

    697

    帖子

    4027

    积分

    Rank: 9

    积分
    4027

    热心会员突出贡献切换助手验证会员最佳新人

    发表于 2020-2-21 12:16:21 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    blog-007-HTuple_HString_Bug_con.jpg
    假设您具有以下HalconCpp代码以输出的字符串保存在HTuple中:
    1. #include <iostream>
    2. #include <halconcpp/HalconCpp.h>

    3. int main() {
    4.   HalconCpp::HTuple text("Hello World");
    5.   const char* s = text.S().Text();
    6.   std::cout << s << '\n';
    7.   return 0;
    8. }
    复制代码

    该程序在第5-7行中包含一个严重的错误,我经常看到该错误。你马上抓到吗?

    继续自己发现错误:

    启动VS 2015的开发人员命令提示符(这是x86构建环境)
    1. set PATH=%HALCONROOT%\bin\x86sse2-win32;%PATH%
    2. cl main.cpp /Zi /EHsc /I%HALCONROOT%/include /link halconcpp.lib /LIBPATH:"%HALCONROOT%/lib/x86sse2-win32
    3. main.exe
    复制代码

    输出将是一些神秘的东西ð☼▲x└,甚至崩溃。

    发生了什么?
    调查中
    VS2015调试器抢救!使用以下命令从开发人员命令提示符启动它devenv main.cpp /debugexe main.exe
    在代码行设置断点 const char* s = text.S().Text();
    调试(F5)
    要了解发生了什么,查看单个C ++语句的CPU实际执行的操作通常会很有帮助:

    在VS2015中按ALT + 8查看汇编器输出
    1. const char* s = text.S().Text();

    2. 0131C38A  lea         eax,[ebp-24h]  
    3. 0131C38D  push        eax  
    4. 0131C38E  lea         ecx,[text]  
    5. 0131C391  call        dword ptr [__imp_HalconCpp::HTuple::S (013BD218h)]  
    6. 0131C397  mov         dword ptr [ebp-10h],eax  
    7. 0131C39A  mov         ecx,dword ptr [ebp-10h]  
    8. 0131C39D  mov         dword ptr [ebp-14h],ecx  
    9. 0131C3A0  mov         byte ptr [ebp-4],1  
    10. 0131C3A4  mov         ecx,dword ptr [ebp-14h]  
    11. 0131C3A7  call        dword ptr [__imp_HalconCpp::HString::Text (013BD224h)]  
    12. 0131C3AD  mov         dword ptr [s],eax  
    13. 0131C3B0  mov         byte ptr [ebp-4],0  
    14. 0131C3B4  lea         ecx,[ebp-24h]  
    15. 0131C3B7  call        dword ptr [__imp_HalconCpp::HString::~HString (013BD228h)]  

    16.   std::cout << s << '\n';

    17. 0131C3BD  push        0Ah  
    18. 0131C3BF  mov         edx,dword ptr [s]  
    19. 0131C3C2  push        edx
    复制代码

    也许你是不是在确信基于x86架构,但调用HTuple::S应该很容易看到,调用HString::Text上HString的返回HTuple::S和再调用临时的析构函数HString::~HString。从现在开始,每次对HString返回的内部数据HString::Text的访问都是对未定义内存的访问!因此,s的输出是未定义内存的输出,而不是预期的“ Hello World”的输出。

    怎么修
    始终立即将myTuple.S().Text()的输出分配给像std :: string这样的内存管理类,如下所示:
    1. #include <iostream>
    2. #include <string>
    3. #include <halconcpp/HalconCpp.h>

    4. int main() {
    5.   HalconCpp::HTuple text("Hello World");
    6.   //const char* s = text.S().Text(); //DO NOT USE
    7.   std::string s = text.S().Text();
    8.   std::cout << s << '\n';
    9.   return 0;
    10. }
    复制代码

    顺便说一句:与上面的问题类似,永远不要分配std::string的c_str()给const char*。

    1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

    3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用反馈 | 51Halcon论坛管理团队论坛管理团队

    申请友链| 小黑屋| 手机版| Archiver|  

    粤ICP备15095995号-2 粤公网安备44030602000670号

    CopyRight © 2015-2020 51Halcon机器视觉. Tencent Cloud X3.4.

    快速回复 返回顶部 返回列表