2012-11-27 49 views
2

我不確定這是否至少可能,但我想使用具有元素的確切名稱的變量來訪問我的結構中的元素。我的程序對結構的成員進行操作,它取決於用戶選擇的列,但爲了使它更簡單(因爲這不是要點),我要寫一些簡單的線條,所以它會是這樣的:如何使用具有元素的確切名稱的變量訪問結構的元素?

(比方說,我已經填寫了名單與其他功能,但是這不是主要的點都不是,所以我不會把它)

結構,這將被用於雙鏈表中的每個節點(每個節點表示類似於具有兩列的表中的一行)

typedef struct row { 
    float A, B; 
    struct row *prev, *next; 
} _row; 

主要

int main(){ 
    char column; 
    printf("Which column would you like to see? (A or B): "); 
    scanf("%c",&column); 
    show_column(column); 
    system("PAUSE"); 
} 

而且功能

void show_column(char column){ 
    _row *aux; 
    aux=start; 
    while(aux->next!=NULL){ 
     printf("\n %.2f",aux->column); 
     aux=aux->next; 
    } 
    //this is because that cycle is not going to show the last node 
    printf("\n %.2f",aux->column); 
} 

「開始」 是_row了。它被修改爲從插入節點的相同函數中的列表中指向開始。

我想知道的是如何使這部分的功能:

printf("\n %.2f",aux->column); 

由於「列」是不是從結構的成員,但它是應該包含一個名稱的變量的成員(A或B)。

我需要這個,所以我不必重複相同的代碼,但使用「如果」和只是一個字母(B)不同。

對不起,如果拼寫和語法有問題,我的英語不太好,並且非常感謝您的幫助!

+0

我認爲你正在努力實現運行時polyorphism。我不知道如何在c中實現這一點。但在oop(C++或Java)中這是很正常的。 –

回答

0

也許你可以這樣做:

typedef struct row { 
    float col[2]; 
    struct row *prev, *next; 
} _row; 

int main(){ 
    char column; 
    printf("Which column would you like to see? (A or B): "); 
    scanf("%c",&column); 
    show_column(column); 
    system("PAUSE"); 
} 

void show_column(char column){ 
    _row *aux; 
    aux=start; 

    column = column - 'A'; 
    while(aux->next!=NULL){ 
     printf("\n %.2f",aux->col[column]); 
     aux=aux->next; 
    } 
    //this is because that cycle is not going to show the last node 
    printf("\n %.2f",aux->col[column]); 
} 
+0

非常感謝@Daboyzuk和你,感謝你,我意識到將一個數組聲明爲一個元素要容易得多從結構中,然後向用戶詢問列的數量(一個整數,1或2),然後從該數中減1,並在所有操作中使用「列」作爲col []的索引。謝謝!! – Zaret

1

C不是解釋而是編譯語言。據我所知這是不可能的。你將不得不編寫額外的代碼。 此外,簡單的用戶知道你的結構字段的名稱並不好 - 所以,別擔心=)。

0

你可以做printf("\n %.2f",(*(aux->column) == 'A' ? aux->A : aux->B));我看不出你是如何做到這一點的,而不是以另一種方式做if語句。

1

所以基本上用戶給你「A」,並希望列A
如果只是單個字符的情況下,那麼你可以使用INT炭
讓你的花車像這樣的數組背後:

typedef struct row { 
float col[2]; //A, B 
struct row *prev, *next; 
} _row; 

然後改變

printf("\n %.2f",aux->column); 

成爲

printf("\n %.2f",aux->col[(int(toUpper(column) - 'A'))]); 

所以'A'將變爲0,
'B'將變成1等。
這隻適用於單個字符的列名,所以如果你想要一個列「AA」,這將不會工作沒有一些修改。

+0

oops,相同的答案和相同的成員名稱!!!,那麼這是一個好主意:) –