注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

union的使用  

2015-11-17 21:43:16|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

union的使用

 

这次传递参数需要进行两个类型的转换,本来想直接用Void*来传递,内部使用强制转换,但觉得用UNION更好。于是就把传递的参数定义成为了一个共用体,如下:

typedef union __uParamData

{

         struct

         {

                   InfoArray *pLeftEnrIris;

                   InfoArray *pRightEnrIris;

         }Param;

         struct

         {

                   unsigned char *code;

                   int codeL;

                   IKALGMatchOutput *pOutput;

                   unsigned char *codeR;

                   int NumR;

                   IKALGMatchOutput *p ROutput;

         }Param;

}UParamData,*PuParamData;

不过在同事使用时却发现了问题,参数的数据包括内存的地址一用就会崩溃。没有成功的传递进去,后来因为一些其它问题,就没理它,当处理完成所有的问题的时候儿,就写了一个例程来测试,因为原来的程序是在LINUX下的,不好调试,所以就在Win下写了一个程序:

const int READ_LEN = 1024 * 1024 * 200;

unsigned char bufRead[READ_LEN] = {0};

typedef struct  __myData

{

         int my;

         char buf[200];

}MyData,*PMyData;

 

typedef union __TestPoint

{

         struct

         {

                   int td;

                   PMyData ptemp;

         }test0;

         struct

         {

                   unsigned char* pT;

                   int te;

                   unsigned char* ppt;

                   int num;

         }test1;

}TestPoint,*PTestPoint;

 

DWORD WINAPI ReadThread(LPVOID lpParam)

{

         int num = 0;

         PTestPoint ptp = (PTestPoint)lpParam;

        

         while (1)

         {

                   memmove(bufRead, bufWrite, READ_LEN);

                   memset(ptp->test0.ptemp->buf, 0, 200);

                   printf("cure num is----------------:%d\n", ptp->test0.ptemp->buf[199]);

         }

 

         return 0;

}

 

TestPoint tp;// = new TestPoint();

int main()

{

         HANDLE hThread;

         DWORD dwThread;

 

         PMyData pmy = new MyData;

 

         tp.test0.ptemp = pmy;

         tp.test0.td = 100;

         hThread = CreateThread(NULL, 0, ReadThread, &tp, 0, &dwThread);

 

         while (1)

         {

                   Sleep(30);

         }

    return 0;

}

实验证明,传递参数到线程都没有问题(http://www.jellythink.com/archives/468,这个网址上原来说其不可以做函数参数和返回值,但可以使用指向UNION的变量,后来删除了这一条。),那么在Linux下理论上应该也是可以的。

回头认真翻看Linux下的代码,都无语了。根本就没有初始化内存地址,它要是能传递进去,那才是闹了鬼呢。

小小一个问题,牵出多少眼泪,总结下这坑:

1、两个BUF,结果把真有数据的扔掉,传递去没数据的。

2、图像的长宽颠倒。

3、内存不初始化。

这就是结果,对此无语了。

  评论这张
 
阅读(214)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017