2009-11-16 110 views
1

我不是太熟悉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

回答

1

編輯:(加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

2

a->words->wnum

->既取消引用指針和允許引用結構的字段。

4

一定要檢查空指針,但在總體上是:

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

4

你走過來

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

或者:

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

根據你收到什麼作爲你的函數的實際參數。

  1. 如果您收到指向單個SVECTOR元素的指針,則可以使用第一種方法。另一方面,如果您收到一個指向服務器SVECTOR元素的指針,您可能會發現第二種方法更方便。
0

你有一個指針WORD定義的類型,所以:

a->words->(member) 

如果你只是有一個沒有指針成員,你應該做的:

a->words.(member) 
2

名稱的基礎上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