2013-03-18 18 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

检查变量是否变更的目的是什么?

如何使用包含变量和标志的结构。当变量更改时,设置标志并将结构传递给函数。现在在函数中测试标志来检查变量是否被改变。

相关问题