2013-03-18 71 views
2

爲下面的C/C++代碼我可以知道變量是否在函數調用C中將其值與以前的值進行比較而改變了它的值嗎?

void fun(int* x) 
{ 
    //SOMECODE;//WITHOUT SAVING PREVIOUS VALUE 
    if(SOME CONDITION) 
    printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n"); 
} 

int main() 
{ 
    int a; 
    a=9; 
    fun(&a); 
    a=12; 
    fun(&a); 
    return 0; 
} 

是有這給我們介紹一下變量是否得到改變與否 信息的任何功能或標誌值,所以如果有任何解決方案請回復

+1

剛剛創建一個'靜態'變量很麻煩? – antonijn 2013-03-18 16:59:32

+4

這是C問題還是C++問題?另外,如果值被改變,然後又改回到原來的值,那麼值是否改變? – 2013-03-18 16:59:52

+0

不,你要求的不支持 – antlersoft 2013-03-18 17:01:36

回答

1

重讀你的問題,你沒有檢查一個變量是否改變,但是兩個不同的實例是否具有相同的詞彙標識符不同。

這是不可能的,除非明確的比較。關於更改檢測到一個變量


原來的答覆:

有便攜式,標準C或C++沒有辦法。

但是,有些環境特定的方法可以檢測變量何時更改。您可以使用MMU訪問控制標誌(通過mprotectVirtualProtect)在第一次寫入時生成異常,並在處理程序中設置髒標誌。 (幾乎每一個現代操作系統都使用內存映射文件來做這件事,以確定它是否需要寫回到磁盤)。或者您可以使用硬件斷點來匹配寫入該地址(調試器使用它來實現變量的斷點)。

這些都不如舊價值的效率。 (但與舊值相比將會錯過ABA情景)

1

無法檢查當前值是否與上次調用發送的值不同。

在運行時,每調用一次fun()都會創建一個獨立的堆棧幀,其自身的副本爲xfun()無法在此堆棧幀(用於存儲本地變量)內保存任何值以供以後調用。

也無法確定「變量是否已將其值與以前的值進行比較」。

+0

是的,這是可能的。但是'fun()'獲取'x'是通過值傳遞的,而不是通過引用傳遞的,所以不可能(在這種情況下)檢查這個。 – flyingOwl 2013-03-18 17:09:51

+0

對不起,我想我誤解了這個問題。寫得很糟糕。既然他在談論兩個不同的實例,而不是對一個(單個實例)變量的修改,那麼你是對的。 – 2013-03-18 17:10:53

+0

好吧,沒問題:) – flyingOwl 2013-03-18 17:11:55

5

沒有提供一些額外的代碼的「最後」調用你的函數「期間」存儲參數有一點機會都沒有檢測到,如果用相同的值或另一個叫。

隨着「當前」 x的值將生活堆棧只將完​​全失去一旦你的函數調用結束上。

前多線程時代只使用一個靜態變量的函數func的最後運行期間緩存x的值可能(幾乎)已經解決了你的問題:

void fun (int x) { 
    static int old_value = VALUE_INVALID; 

    if(x != old_value) 
     printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n"); 

    old_value = x; 
} 

的這種方法仍然存在的問題是重入 - 意味着如果在信號處理程序中調用func,則緩存的值可能會被破壞。

如果在多線程應用程序中運行,您還需要在使用此方法時提供某種鎖定機制,否則遲早會弄得很糟糕。

也許你會在這種情況下,反正被搞砸了,你將不得不澄清「最後」呼叫功能和「中」價值執行準確的意思。

是線程A在線程B之前輸入func但仍在執行中的當前正確值,還是B之後輸入但已完成func執行的線程B的當前正確值?

+0

非常好的回答Mikyra :) – 2013-03-18 17:40:54

0

檢查變量是否變更的目的是什麼?

如何使用包含變量和標誌的結構。當變量更改時,設置標誌並將結構傳遞給函數。現在在函數中測試標誌來檢查變量是否被改變。

相關問題