2013-10-23 89 views
1

我在C++的那一刻,讓我創造我的3D應用程序定向光線,當我點擊屏幕上建立一個功能。我正在研究x和y的計算,但問題是我在x和y上執行std::cout,這些值保持不變。如果我刪除了static這個關鍵字,這個工作正常,但我想保留它作爲一個靜態局部變量,因爲我將多次使用這個函數,那麼究竟是什麼問題或者我究竟做了什麼錯誤,使得它的打印效果相同一直都有價值?C++靜態局部變量不改變價值

繼承人的功能:

void Mouse::GetClickDirection(D3DXMATRIX projMatrix) 
{ 
    static POINT mousePoint; 
    GetCursorPos(&mousePoint); 

    ScreenToClient(hwnd, &mousePoint); 

    static float width = (float)backBufferWidth; 
    static float height = (float)backBufferHeight; 

    static float x = (2.0f * mousePoint.x/width - 1.0f)/projMatrix(0, 0); 
    static float y = (-2.0f * mousePoint.y/height + 1.0f)/projMatrix(1,1); 

    D3DXVECTOR3 origin(0.0f, 0.0f, 0.0f); 
    D3DXVECTOR3 dir(x, y, 1.0f); 

    system("CLS"); 
    std::cout << "X: " << x << std::endl; 
    std::cout << "Y: " << y << std::endl; 

} 
+0

「我想保持它作爲一個靜態的局部變量,因爲我將使用這個功能很多次」 - 我不完全相信你明白什麼'static'是。你的代碼會做你所期望的,沒有'static'關鍵字,並且你實際上並沒有通過使你的變量變爲靜態來實現任何有用的優化。 – benjymous

+0

爲什麼你認爲使用靜態變量更有效? – Sarien

+0

@Sarien我知道這不像用戶會「注意到」這種差異,但就像我說的那樣,該功能將在程序的整個生命週期中一遍又一遍地使用,所以(至少對我而言)似乎沒有以保持銷燬並創建相同的局部變量:( – Danny

回答

0

這正是static關鍵字意味着,變量被初始化一次。從你的代碼中,你的變量的值只在初始化器中被改變,每個程序執行只執行一次。由於它們依賴於參數,因此它們不能是靜態的。如果要保留取決於參數的值,則需要保留某種形式的緩存,但是,如果使用每個函數調用初始化變量,則可能會有更大的開銷。

+0

你應該添加到如何解決它的答案。 – pippin1289

+0

我做了,只花了一些時間寫出來。 – Erbureth

+0

@ pippin1289 - 修復很明顯 - 刪除靜態關鍵字 – Slava

0

不要讓他們staticstatic局部變量初始化最多一次,當函數首先調用(正式,執行時首先經過初始化,但不同的是在此代碼相關的),所以在後續調用xy保持其原有的價值。沒有理由讓它們成爲靜態的。

2

這裏沒有理由使用靜態變量。

一旦局部靜態已初始化,它不更新,除非你明確指定新的值給它。
你在做什麼是初始化,而不是分配。

如果你擔心的效率,這是最有可能有效地使用本地靜態 - 他們至少需要一個初始化檢查(每次函數調用)和可能的高速緩存未命中或兩個來獲取值。

1

我的猜測是,你必須單獨的變量定義和賦值:

static float x; 
static float y; 
x = (2.0f * mousePoint.x/width - 1.0f)/projMatrix(0, 0); 
y = (-2.0f * mousePoint.y/height + 1.0f)/projMatrix(1,1); 

因爲初始化只進行一次。

+0

的確如此,但它沒有解決使用靜態代碼完全沒有必要的事實,並且可能在將來的代碼中導致更多的錯誤 – benjymous