C语言的联合出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言的联合出错相关的知识,希望对你有一定的参考价值。

#define MAX_FEATURE_NUM 42
#define MAXNumber 70
#define MAXLINE 500
#define NUMBER 494021
#define ERROR -1
#define NULL -1
typedef struct ArcBox

int tail,head;
struct ArcBox * hlink,* tlink;
ArcBox;

typedef struct FeaNode

char * feaname;
int type;
union range

char * c_range[MAXNumber];
int i_range[MAXNumber];
double d_range[MAXNumber];
;
int indegree;
int valuenum;
int visit[MAXNumber];
struct ArcBox * parent,* child;
FeaNode;

typedef struct

struct FeaNode fealist[MAX_FEATURE_NUM];
int feanum,arcnum;
BayesNetwork;

struct LNode

int sequence;
int valuenum;
int n;
int flag;
int type;
union Lrange

char ** c_range;
int * i_range;
double * d_range;
;
int * visit;
struct LNode * next;

;
typedef struct LNode * Linklist;

Linklist CalParent (BayesNetwork * nb,int i)

struct ArcBox * r;
struct LNode * p,* q;
Linklist head=(Linklist)malloc(sizeof(struct LNode));
if(!head)

error ("No space for node can be obtained!");
return ERROR;

p=head;
r=(* nb).fealist[i].parent;
while(r)

q=(struct LNode *)malloc(sizeof(struct LNode));
if(!q)

error("No space for node can be obtained!");
return ERROR;

q->type=(* nb).fealist[r->tail].type;
q->Lrange.d_range=(* nb).fealist[r->tail].range.d_range;
q->visit=(* nb).fealist[r->tail].visit;
q->sequence=r->tail;
q->valuenum=(* nb).fealist[r->tail].valuenum;
q->n=0;
clear(q->visit,q->valuenum);
p->next=q;
p=q;
r->hlink=r;

p->next=NULL;
return(head);


错误提示为:
D:\My Documents\3\Enum.C(38) : error C2039: 'Lrange' : is not a member of 'LNode'
d:\my documents\3\linklist.h(2) : see declaration of 'LNode'
D:\My Documents\3\Enum.C(38) : error C2039: 'range' : is not a member of 'FeaNode'
d:\my documents\3\bayesnetwork.h(14) : see declaration of 'FeaNode'
请教大家,到底是哪里出现了问题,谢谢了!

union 在定义的时候没有进行实例化就在后面的程序中应用了,只要在定义的时候做个补充就可以了,例如:union range char * c_range[MAXNumber]; int i_range[MAXNumber]; double d_range[MAXNumber]; range;以及:union Lrange char ** c_range; int * i_range; double * d_range; Lrange; 参考技术A union是什么类型?不定义可以直接使用?
还有你的头文件呢
参考技术B 楼上的,union是联合。也就是共用体。

探讨C语言中的“联合“类型

前面我们知道C语言在定义一个变量时,往往会为定义的变量分配一段内存空间。但是C语言有一个特殊功能,可以使多个变量共享同一个内存。这个功能可以通过联合来实现。那么什么是联合呢?

一.联合

联合:在C语言中允许多个不同变量共享同一内存区域的功能称为联合。

假如现在我要定义三个变量共享的一个联合,也就是三个变量同属同一内存区域,应该怎么定义呢?

union unnode

   int n;
   double a;
   char c1;
u;

现在我们来看上述代码,你发现它与那一种类型很相似呢?对的,从其结构上看,与我们所学的结构模板极为相似。最明显其头部的关键字不一样,结构的关键字是struct,而联合的关键字是union(就是联合的英文单词)。其次你会发现,3个变量n,a,c1的数据类型不同,也就是说不同数据类型的变量也可以联合起来,共享同一内存,不一定非要都是同一数据类型。分号前的u表示定义一个联合变量。即在声明联合时定义联合变量,这一点与我们前面所说的定义结构类型时定义结构变量是相通的。当然也可以这样定义:union unnode u;

刚才我们说了,所谓联合就是不同变量占同一内存空间,那么编译系统如何为联合变量分配内存空间呢?如char型占一个字节,int型占4个字节,double型占8个字节。那么在上例中,编译系统为上述联合变量分配几个字节的内存空间呢?C语言规定,编译器按联合的成员中最长的那一个类型为联合变量分配存储空间,所以为u分配8个字节,其中u.n占前4个字节,u.a占全部8个字节,u.c1占前一个字节。由于同一内存单元在每一个瞬间只能存放其中一种类型的成员,也就是说同一时刻只有一个成员是有意义的,因此在每一瞬间起作用的成员就是最后一次被赋值的成员。基于此,不能为联合的所有成员同时进行初始化,只能对第一个成员初始化。

记住:联合成员的访问与结构成员的访问一模一样。

//定义一个联合类型,用其声明变量,为变量赋值后输出各成员的值
#include<stdio.h>

union share

   float decval;
   int pnum;
   double my_value;
u;

int main(void)

   u.my_value = 125.5;
   u.pnum = 10;
   u.decval = 1000.5f;
   printf("\\ndecval=%f pnum=%d my_value=%lf",u.decval,u.pnum,u.my_value);
   printf("\\nu size=%d\\ndecval size=%d pnum size=%d my_value 
  size=%d",sizeof(u),sizeof(u.decval),sizeof(u.pnum),sizeof(u.my_value);
  return 0;

运行结果

decval=1000.500000 pnum = 1148854272 my_value = 125.500016
u.size=8;
decval size=4 pnum size=4 my_value size=8

总结:由输出结果可以看出,只有最后一个变量的值是正确的,其它两个都是错的,这是因为他们共享同一块内存空间。

二.联合指针

定义联合指针可以用下列语句:

union unode *p;

有了指针后,就可以修改联合的成员。如下语句:

p = &u;  u1.a = p---->a;

三.联合的初始化

只能用和联合中第一个变量相同类型的常量初始化。

四.联合和结构

结构和数组可以是联合的成员,反之联合也可以是结构的成员。对此要合理结合结构和联合,这样可以定义出各种各样能满足实际需要的数据类型。

以上是关于C语言的联合出错的主要内容,如果未能解决你的问题,请参考以下文章

python学习_C语言联合编程

探讨C语言中的“联合“类型

C语言干货分享 | C语言的联合体

C语言中关于联合体中成员变量的问题

c语言 联合和枚举

c语言 联合和枚举