试图将void指针强制转换为struct

时间:2014-03-23 21:24:59

标签: c pointers struct

我知道之前已经问过这个问题,但我从来没有得到适合我的答案..所以这里就是.. 这是我的项目头文件:

struct rss_s {
char * device_info;
char * device_model;
char * device_serial;
Radio_Types radio_type;
int power_48v;
int power_400hz;
int panel_lamps;
void * radio_info;
int sub_devices;
struct device_s {
    int fd[ FD_pair ];
    int frequency[ tuned ];
    int panel_lamp;
}sub_device[];
  };

,这是一个无线电的结构:

struct radio_614L8 {
loop_sw614L8 loop_sw_614L8;
mode_sw614L8 mode_sw_614L8;
int sw_band;
int sw_bfo;
int meter;
int dial_lamp;
  };

我使用以下内容初始化了main中的所有内容:

static struct radio_G3713 G_3713;
static struct radio_614L8 C_614L8;
static struct radio_G1981 G_1981;
static struct radio_G3490 G_3490;
static struct radio_G4214 G_4214;

static struct rss_s radios[] = {
{ "COM/NAV #1", "G-3717", "81",  G3717, 0, 0, 0, & G_3713,  2, },
{ "ADF",        "614L8", "8384", C614L8,0, 0, 0, & C_614L8, 1, },
{ "ATC",        "G-1981", "336", G1981, 0, 0, 0, & G_1981,  1, },
{ "5in1",       "G-3490", "31",  G3490, 0, 0, 0, & G_3490,  4, },
{ "COM/NAV #2", "G-4214", "68",  G4214, 0, 0, 0, & G_4214,  1, }};

第四列是一个枚举:所以通过使用指向“radio - > radio_info”的指针,我现在知道我需要使用哪个无线电子系统。
问题是我需要将“void * radio_info”转换为指针类型“struct radio_C614L8” 所以我试过了:
    无线电 - > radio_info =(struct radio_614L8 *)无线电 - > radio_info;
并且声明没有效果....

但是我从日食中得到的只是一条错误信息:
 未定义的引用`init_C614L8'

好吧,我放弃了我做错了什么..请帮忙

3 个答案:

答案 0 :(得分:0)

我认为,如果现在理解正确,你需要一个临时变量。

如果您想使用radio_G3713,您应该执行以下操作:

   struct radio_G3713 *radio = ((struct radio_G3713 *)(radios[i]->radio_info);
   radio->meter++;

答案 1 :(得分:0)

radios -> radio_info = ( struct radio_614L8 *) radios -> radio_info;

什么都不做,因为radios-> radio_info仍然是void *。

您需要将类型转换的结果放在正确类型的变量中

 struct radio_614L8 * r_614L8 = ( struct radio_614L8 *) radios -> radio_info;
例如

答案 2 :(得分:0)

正如我所说的那样,对变量进行类型转换只会创建一个具有所需类型的临时变量。您可能永远不会更改已声明的变量的类型。例如,以下内容也不会起作用,而且非常类似:

int a = 5;
a = (float) a;

这里,在第一行中,声明了int类型的变量,赋值为5。然后使用第二行,首先将值5转换为float,这样我们就会得到5.0。然后,此5.0将再次分配给a,这恰好是int,因此它将首先隐式地转换为int,转换为{{1} },然后分配给5

a可能永远不会是afloat自宣布以来一直注定为a

我真的不知道你最终希望拥有什么,但这里有一些东西:

通过拨打int之类的电话,您可以参考第一个radios->radio_info内的radio_inforadio,请注意这一点。如果您想引用特定radio[0]的{​​{1}},请使用radio_inforadio,两者都是等效的。

第二件事是,您首先需要一个包含(radio + x)->radio_info的内存位置才能指向它。有两种方法可以做到:

radio[x].radio_info

在此之后,您可以使用以下方式引用struct radio_614L8指针,就像它是// declaring one and then assigning its address to your pointer struct radio_614L8 asd; (radio + 0)->radio_info = &asd; // or allocating memory for one and assigning the address of the memory to your pointer (radio + 0)->radio_info = malloc( sizeof( struct radio_614L8 ) ); 指针一样,并更改其voidstruct radio_614L8,无论:

sw_band

我知道,它有点长......但如果你真的想将meter保留在你的结构中((struct radio_614L8 *) (radio + 0)->radio_info) -> meter = 2345; ((struct radio_614L8 *) (radio + 0)->radio_info) -> dial_lamp = 123; ,那么这就是你要走的路。发生了什么:

radio_info