2017-08-10 62 views
0

我目前正在嘗試創建一個切換系統,在那裏我會有一堆可能的選項和一個值,我將所有這些可能的選項作爲參數輸入,然後獲取所需的參數。這是我試過到目前爲止:根據值查找特定參數

void Toggle(int scroll, int &state, int maxV, ...) 
{ 
    state++; 
    if (state >= maxV) 
     state = 0; 

    char *char_State = ""; 

    va_list argptr; 

    va_start(argptr, maxV); 

    for (int i = 0; i < maxV; i++) 
    { 
     if (i == state) 
      char_State = va_arg(argptr, char*); 
    } 

    va_end(argptr); 

    printf("State: %s\n", char_State); 
} 

我會用這樣的:

int state = 0; 

Toggle(0, state, 3, "Option 1", "Option 2", " Option 3"); 
printf("StateNum: %i\n", state); 
Toggle(0, state, 3, "Option 1", "Option 2", " Option 3"); 
printf("StateNum: %i\n", state); 
Toggle(0, state, 3, "Option 1", "Option 2", " Option 3"); 
printf("StateNum: %i\n", state); 
Toggle(0, state, 3, "Option 1", "Option 2", " Option 3"); 
printf("StateNum: %i\n", state); 

但由於某些原因運行代碼時,從上面我得到這個作爲一個結果:

State: Option 1 
StateNum: 1 
State: Option 1 
StateNum: 2 
State: Option 1 
StateNum: 0 
State: Option 1 
StateNum: 1 

任何想法我做錯了什麼?由於這是我第一次使用va,任何幫助都是值得讚賞的!

回答

2

va_arg()應該每次輸入toggle()時爲所有3個參數調用,或者至少在每個選項中調用,直到找到正確的參數爲止。這是因爲在內部,va_list只是堆棧中的數據(指針在你的情況下)的數組,你必須用va_arg將它們覆蓋到所需的數組上。

void Toggle(int scroll, int &state, int maxV, ...) 
{ 
    state++; 
    if (state >= maxV) 
     state = 0; 

    char *char_State = ""; 

    va_list argptr; 

    va_start(argptr, maxV); 

    for (int i = 0; i < maxV; i++) 
    { 
     char* p = va_arg(argptr, char*); 
     if (i == state) 
      char_State = p; 
    } 

    va_end(argptr); 

    printf("State: %s\n", char_State); 
}