2012-01-31 70 views
0

是否可以將枚舉作爲參數傳遞給可變參數函數?我試圖做到以下幾點:使用枚舉引起SIGILL信號的變量函數

GLenum ShaderManager::initialize() 
{ 
    GLuint program = loadShader("Flat", 2, ATTRIBUTE_VERTEX, "coord3d", ATTRIBUTE_TEXTURE0, "texcoord"); 

    //... 
} 


GLuint ShaderManager::loadShader(std::string shaderName, ...) 
{ 
    GLuint program; 

    //... 

    va_list arglist; 
    va_start(arglist, shaderName); 

    int count = va_arg(arglist, int); 
    for(int i = 0; i < count; i++) { 
     AttributeLocation location = va_arg(arglist, AttributeLocation); 
     char * name = va_arg(arglist, char *); 
     glBindAttribLocation(program, location, name); 
    } 
    va_end(arglist); 

    //... 
} 

如果雙方ATTRIBUTE_VERTEXATTRIBUTE_TExTURE被聲明爲

enum AttributeLocation { 
     ATTRIBUTE_VERTEX = 0, 
     ATTRIBUTE_COLOR, 
     ATTRIBUTE_NORMAL, 
     ATTRIBUTE_TEXTURE0 
    }; 

但該程序只是終止。我發現,調試程序,錯誤發生在for循環後的第一行。所以我想知道是否有可能做到這一點或者它是非法的。

+0

我不認爲這個錯誤是在這個代碼中,你必須發佈更多。 – 2012-01-31 01:35:39

+0

@SethCarnegie實際上我認爲是這樣,因爲如果我只將'AttributeLocation location = va_arg(arglist,AttributeLocation);'改爲'int location = va_arg(arglist,int);'它按預期工作。無論如何,我會發布更多相關的代碼。 – 2012-01-31 01:39:06

+0

謝謝。我已經找出了什麼是錯誤的,見下文。 – 2012-01-31 01:42:48

回答

3

這是因爲將小於sizeof(int)字節大小的整數類型傳遞給可變參量函數會在堆棧中傳遞時將它們轉換爲sizeof(int)字節。如果AttributeLocation小於sizeof(int)字節,則sizeof(int)字節被壓入堆棧,但您只需從va_arg調用中檢索到堆棧中的sizeof(AttributeLocation)字節。然後,當您嘗試讀取char*時,會得到AttributeLocation的其餘字節以及您通過的const char*的一些字節。

+0

所以看來最好的解決方案是簡單地傳遞一個枚舉並使用va_arg檢索一個整數,如果我已經正確地承擔了。 – 2012-01-31 01:46:26

+0

@Narrakan是的,那是最好的。 – 2012-01-31 01:47:38

+0

你說的是正確的(實際上我看到的是即使你只有一個變量參數,並使用va_arg(list,char)來檢索它,它會引發SIGILL)。我的問題是你有這方面的參考資料嗎? – themoondothshine 2013-12-27 16:11:02