c/c++中关于一段void*数据中数据类型的问题

liuyan 发布于 2012/07/05 16:24
阅读 566
收藏 0
有一段void*的数据,如void *pbuffer,其中填充了可能的 ,int 、short 、long、float、double,这几种数据类型之一,是一个存储了以上数据类型的数组,能通过某函数得知数据类型是哪一种,并且可以获得该数据类型所占的内存大小如 int 4字节,现在要遍历该数组,让数组中的数据与另外一个double值作比较或将数组中每一个数据转换为char*,请问有什么不用if else 和switch case的写法
加载中
0
陈舵主
陈舵主

第一,问题没看明白,可能是我理解不好,真心的一点看不懂,而且你这描述我也不想看下去,,

第二,我喜欢为了实现不择手段,不喜欢故意为了实现而绕弯子

liuyan
liuyan
很水
0
吥楛糖
吥楛糖

除了switch case和if else ,我也想不出其他好的办法了

0
liuyan
liuyan

其实本来是想请教c、c++有没有类型推导或者是类似var类型的东西

11里面有auto,gcc有typeof,还有typeid都不能很好地解决上面的问题,如果我要有多次比较,岂不是要写多个switch,所以我说丑,本来我不想说什么,不过的确大家的回复,对我没什么帮助,还不如靠自己

红薯
红薯
回复 @星星点天灯 : 我们也在检讨这个规则
情天大圣
情天大圣
回复 @红薯 : 会扣我分的,损人不利己
红薯
红薯
回复 @星星点天灯 : 你可以踩啊:)
情天大圣
情天大圣
回复 @红薯 : 只要提问人置为最佳答案的答案真的是最佳,也就罢了,我们就当学习了,可这,连答案都算不上,呵呵,难为红薯了,洗洗睡吧!
红薯
红薯
回复 @星星点天灯 : 提问人觉得OK就行,不过给自己设置最佳答案是没积分的:)
下一页
0
飞翔的天地
飞翔的天地
感觉LZ说了半天就是一句话:C++怎么实现反射
0
中山野鬼
中山野鬼
楼主,你的方法其实有两种方式解决。编译器自动代码拓展,或者你的代码自动通过逻辑来实现。如果是后者,有几种做法。常用的是switch。 一般的是 if else。两者区别不大。无非考虑概率大小的问题。不过更通常的做法是函数数组调用的方式。这样每个函数入口的费用是等同的。而且对代码在CACHE里的切换更有利。例如你 if else,有个else概率很小,但一样要成片的load到一级CACHE里 ,这种无谓的代码,但凡load,宏观上讲,都影响你的CODE的LOAD速度和利用效率。
0
Lunar_Lin
Lunar_Lin

加班好累.
      楼主要淡定.脾气要好. 没人供你吃供你穿, 你用的盗版系统,盗版IDE, 在互联网上以基本通信费获取着无数有价值的信息. 要感恩, 要淡定.
     不是特别清楚你的需求. C++就那么几种办法,你自己估量着看有办法没,
一. 动态保存类型信息, C++标准里有typeof,typeid,如果不想给全部类型打开.可以自己封装结构.
Value {  int type; union {char,int ,short,long long,......}    }
二. 静态匹配. 模板, 变量类型转换都可以实现.

     讨厌if, switch的话, 它们都可以使用多态的方式进行消除. (面对对象的极端形式是可以没有条件分支的). 函数指针, 模板多态,对象多态都可以用来干这个事情.
     boost中有any, variant等关于类型的容器. 你可以看看是否能为你提供帮助.
     最后的关键, 是你要知道你想达到什么效果.
如果一个变量是什么类型 即没有动态信息实现多态 也无法在静态编译时获得, 那么没有代码能省下if 帮助你,包括反射.

0
uian2000
uian2000
用工厂方法模式不会出现if else switch
uian2000
uian2000
只是不一定适合你的情境。 才发现楼上已经说过了…
0
liuyan
liuyan

    很感谢帮我回答问题的朋友,@uian2000 , @Lunar_Lin ,@中山野鬼 ,@吥楛糖 ,如果我让别人觉得脾气不好了,我先道歉。这也算是我第一次提问问题,不知道是什么原因@陈舵主@星星点天灯 ,的回答让我感觉多少都有点架子,也许是我自己的问题,暂且不表。

    因为当时比较急,问题描述的确写的很乱。确切来说,不知道大家有没有用过GDAL,处理栅格空间数据的开源库,做过GIS的人应该都知道。

    其中有一段读取栅格数据的函数GDALRasterIO,读出来的数据存放在void*中,

    可通过GDALGetRasterDataType获取数据类型,

    GDALGetDataTypeSize获取数据类型所占的内存大小,单位bit,

    GDALGetRasterNoDataValue获取NoData值,该值代表本处无数据,这个值的类型和读出来的数据是一样的,但是通过GDALGetRasterNoDataValue获取出来,是double类型

    现在我要通过遍历所独处的数据和这个NoData值作比较(还有另外几个其他数据的NoData,会比较多次),如果不等于这个值,将该处的值改为NoData。

    我后来也仔细想了一下,的确没有任何办法来避免switch case,只能尽量的少写,我现在缩减成只写一个switch case,将NoData值从double转换为相应类型,通过memcmp作比较,memcpy做赋值,void*的数据被我转换成了unsigned char *用来按字节取数据

    对于不吝时间看帖子的回帖的所有人,还是很感谢。@红薯

liuyan
liuyan
回复 @陈舵主 : 是我描述的不清楚,以后我写清楚点
陈舵主
陈舵主
要是问题像现在这样描述我相信大部分都能看懂的,我对c++不了解,以为你不是在真正解决问题,不好意思了
返回顶部
顶部