我知道之前已经问过这个问题,但我从来没有得到适合我的答案..所以这里就是.. 这是我的项目头文件:
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'
好吧,我放弃了我做错了什么..请帮忙
答案 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
可能永远不会是a
,float
自宣布以来一直注定为a
。
我真的不知道你最终希望拥有什么,但这里有一些东西:
通过拨打int
之类的电话,您可以参考第一个radios->radio_info
内的radio_info
,radio
,请注意这一点。如果您想引用特定radio[0]
的{{1}},请使用radio_info
或radio
,两者都是等效的。
第二件事是,您首先需要一个包含(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 ) );
指针一样,并更改其void
,struct 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