原创 共用体与OPENCV里面矩阵的定义

2009-5-30 12:21 2486 10 10 分类: 软件与OS
opencv里面关于CVMAT类型的定义:
typedef struct CvMat
{
    int type;
    int step;

    /* for internal use only */
    int* refcount;
    int hdr_refcount;

    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;

#ifdef __cplusplus
    union
    {
        int rows;
        int height;
    };

    union
    {
        int cols;
        int width;
    };
#else
    int rows;
    int cols;
#endif

}
CvMat;
最近写一个代码的时候,浏览一下OPENCV的源码,觉得共用体在这里还是挺方便的,但是弄不清中间的存储结构就不会很好的使用这个结构。
一、  共用体的使用大概有这几点:
 1.共用体的定义和结构体差不多


    union

    {

        uchar* ptr;

        short* s;

        int* i;

        float* fl;

        double* db;

    } data;
 2.共用体顾名思意就是里面的的数据占用同一断内存空间,共用体的内存长度等于里面最长的变量。既然占用一段内存空间,你改变任意一个共用体的变量都会改变其他 的成员,而且你不能在同一时刻使用里面的2个变量
二、指针的使用
    data共用体里面有好几种类型,如果你想写一个创建矩阵的函数,例如:
/*************************************************
函数名: CreateMatHeader
函数作用 :创建一个矩阵
参数:
     cols 列数
     rows 行数
     type 数据类型
     data 数据指针
返回:矩阵的头指针
说明:函数在使用的时候,如果data == NULL ,则创建空间
**************************************************/
CMat *CreateMat(uint cols,uint rows,MAT_DATA_TYPE type, void *data);
你事先不知道DATA的时候类型,VOID*类型不会提供关于数据长度的信息,所以在使用union data的时候你可以对数据类型进行判断,但是这样毕竟太麻烦了,最好的方法是使用union共占一段结构体的特点:直接对字节进行操作,在需要的时候再去转换为其他类型的指针
我做的一个小实验:
void main(void)
{
    float pl = (float)5.98789;           //浮点数指针
    float *data ;
    unsigned char *c ;
    c =(unsigned char*) malloc(2*sizeof(float));
    memcpy(c,&pl,sizeof(float));
    data = (float*)c ;
    printf("%f",*data);

}
我把浮点数据copy到char类型的指针下,在通过转换为浮点类型,然后输出。。。
三、VC里面的内存分配的问题
1.不同编译器分配的内存
   (1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2;
int ->unsigned int ->4;  long ->float->4;   double
->long double ->8

     (2)在TC下,下面各类型占字节数为:char->unsigned
int ->1; short int ->2; int ->unsigned int ->2;  long
->float->4;   double ->8; long double ->10

对于vc内存的分配问题的解答:http://xfeng.bloghome.cn/posts/53651.html。里面详细说了vc下内存分配的问题


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /1 下一条