访问变量

问题描述:

我不是太熟悉C语言编程,我必须做一个源代码稍加修改,现在的问题是:
我有这样的一个头文件: 访问变量

 
typedef structword { 
    long wnum; 
    float weight; 
} WORD;

typedef structsvector { WORD *words; double norm; } SVECTOR;

在我的文件.C,我有这样

 
double function(SVECTOR *a, SVECTOR *b){ 

} 

我应该怎么做才能在我的函数接取的wnum和重量变量的函数???
在此先感谢;)

+2

作为一个头,不要命名一个结构WORD。这是一个常见的#define unsigned short。很久以前,两个字节被称为WORD。它是库代码中的常用定​​义,特别是Windows代码。 – jmucchiello 2009-11-16 17:39:08

编辑:(加words,我已经错过了,有两个嵌套的结构,在我急于解释各种deferencing运营商......)
即原反应的事实像some_long_var = a->wNum;这当然是错误的...

第二次试;-)

some_long_var = a->words->wNum; 
// or 
some_float_var = a->words->weight; 

应该做的伎俩。

由于a和b是指针,所以在它们的成员可以被访问之前,它们需要首先解除引用。 - >运算符一次执行两件事。

可选地(如果预期是一个数组或可能与值大于0作为下标),则可以执行类似

some_long_var = a[0].words->wNum; 

。关键是在C中,数组通常被看作指向数组中元素类型的指针,因此[]数组操作符可以是一个功能上并且经常在语义上正确地取消引用指针的正确方式。

最后,但是这更有意思(但推动了对各种c操作符背后语义的理解),您可以通过两个步骤完成此操作,即*运算符执行取消引用,并且成员运算符(。)获取到所需的结构/类成员:

some_long_var = (*a).words->wNum; 
+1

其实没有。 'a'变量是一个指向'SVECTOR',而不是'WORD'的指针。正如Heinzi所表明的那样,你需要通过它的'字词'字段来间接。 – 2009-11-16 17:08:25

+0

对,我的坏,我错过了这个问题... – mjv 2009-11-16 17:11:34

a->words->wnum

->既取消引用指针和允许引用结构的字段。

一定要检查空指针,但在总体上是:

a->words->wnum 
a->words->weight 

因为,它被称为话听起来像它可能数组(校验码,以确保)。您可能需要遍历数组。如果您可以显示更多代码或指向某些文档,我们可以确定该数组的大小。

for(unsigned int t = 0; t < [SIZE OF words ARRAY]; ++t) 
{ 
    a->words[t].wnum; 
    a->words[t].weight; 
} 
+0

a和单词可能是指向数组的指针,我们无法从我们所看到的代码中看出来。 – djna 2009-11-16 17:10:20

+0

绝对,我认为这是一个数组...但我没有得到你的循环? – jamel 2009-11-16 17:17:40

+0

增加了一些注释,并明确地检查了0(NULL) – 2009-11-16 17:34:49

你走过来

a->words->wnum 
a->words->weight 

或者:

a->words[SUBINDEX].wnum 
a->words[SUBINDEX].weight 

根据你收到什么作为你的函数的实际参数。

  1. 如果您收到指向单个SVECTOR元素的指针,则可以使用第一种方法。另一方面,如果您收到一个指向服务器SVECTOR元素的指针,您可能会发现第二种方法更方便。

你有一个指针WORD定义的类型,所以:

a->words->(member) 

如果你只是有一个没有指针成员,你应该做的:

a->words.(member) 

名称的基础上SVECTOR和单词,这听起来像你正在处理数组。这里有一些变化:

/** 
* a and words are meant to be treated as arrays 
*/ 
a[i].words[j].wnum = ...; 
a[i].words[j].weight = ...; 
/** 
* a is treated as an array, words is not 
*/ 
a[i].words->wnum = ...; 
a[i].words->weight = ...; 
/** 
* a is not treated as an array, words is 
*/ 
a->words[j].wnum = ...; 
a->words[j].weight = ...; 
/** 
* a and words are not treated as arrays 
*/ 
a->words->wnum = ...; 
a->words->weight = ...; 

那么为什么要使用.当我们应用标和->当我们不?首先,请记住,在通过指针访问结构成员时使用->,而在通过结构实例访问成员时使用.。数组下标操作定义为a[i] == *(a + i);下标行为有效地解引用指针。因此,words的类型是struct word *(指向结构字的指针),并且words[i]的类型是struct word。所以我们需要对前者使用->,对后者使用.。同样的推理适用于ab

IFab,或words旨在被视为阵列,它们的尺寸必须某处已知的。

+0

我认为这个单词是一个数组。你知道一种方法来获得它的大小,以便我可以循环它吗? – jamel 2009-11-16 17:56:12

+0

根据你发布的代码,没有。 “单词”指针不包含任何关于它指向的块的大小的信息。考虑到你发布的内容,很可能会有一个全局变量或宏定义来保存这些信息,但最好问问知道该代码应该如何工作的人。 – 2009-11-16 20:40:41