2012-09-04 37 views
0

我是新來的編碼,我試圖完成這項任務,但我不能得到它的工作:編寫和使用一個函數,口罩作爲參數,並返回一個結構

編寫並使用一個將掩碼作爲參數並返回結構的函數。

這是我到目前爲止所做的。有人能幫助我理解我做錯了什麼嗎?

typedef enum { 
    fast = 1, 
    slow = 2, 
    strong = 4, 
    smart = 8, 
    agile = 16, 
}Skills; 

typedef struct _Team { 
int ranking; 
char name; 
} Team; 

Team Alabama; 

Team USC; 

Team _function (Skills skills); 
Team _function (Skills skills) { 
    if (skills == (fast | smart)) { 
     return Alabama; } 
    if (skills == (fast | agile)) 
     return USC; 
    else 
     return nil; 

} 
+0

請解釋「無法正常工作」的意思。你期望的結果是什麼,你的實際結果是什麼,你對這種差異有什麼想法? –

+1

並將'NULL'作爲空結構而不是'nil'返回。 – Mazyod

回答

3

當你有光罩式枚舉,你檢查枚舉是否滿意或不使用位與運算符&

所以,如果你想檢查技能是快速和智能,做它像這樣:

if ((skills & fast) && (skills & smart)) { 
    // this team has the brains and speed.. possible other stuff 
} 

另外,在這種情況下,XOR運算也將是一個不錯的人選:

if (skills^(fast | smart) == 0) { 
    // this team has ONLY the brains and speed. 
} 

末注:

這樣定義枚舉,要容易得多:

typedef enum { 
    fast = 1 << 0, 
    slow = 1 << 1, 
    strong = 1 << 2, 
    smart = 1 << 3, 
    agile = 1 << 4, 
} Skills; 

編輯:

OK,因爲這是一個任務,讓我去通過一些麻煩解釋它是如何工作:

正如我相信你也知道,你的枚舉是這個樣子(二進制):

(00001) 
(00010) 
... 
(10000) 

現在,使用逐位或運算|,你能兩個技能合併到一起:

00001 
OR 01000 
    _____ 
    01001 

然後,我們可以檢查是否是新的一專多能枚舉具有使用&一些特定的技能:

01001 
AND 01000 
    _____ 
    01000 != 0 (aka true) 

要進入更先進的水平,我們使用XOR,它通過定義,集合如果兩位相同,則得到的位爲0

01001 
XOR 01000 
    _____ 
    00001 != 0 (aka true) 

    01001 
XOR 01001 
    _____ 
    00000 == 0 (aka false) 
+1

還應該提到'nil'不是用於指示「無結構」的正確返回類型。 –

+1

這是一個非常好的答案! – Chimera

相關問題