C语言 变量值在函数调用后更改,未使用



在过去的几个小时里,我一直在调试以下代码。我意识到这可能是一些愚蠢的事情,但似乎无法弄清楚。

在第二个 for 循环中(参见调试 printfs(,bitsA 的值会发生变化。我不知道为什么。

编辑:如果有人想知道sat_count_update中的代码是什么:

counter->taken = (bool)((1 << counter->cbits - 1) & counter->count) ;

文件:饱和计数器。

#ifndef SATURATINGCOUNTER_H
#define SATURATINGCOUNTER_H
#include <stdbool.h>
//Macro function to return taken/not taken of counter
#define sat_count_taken(COUNTER) COUNTER->taken
typedef struct sat_count{
        char count;
        char cbits;
        bool taken;
} sat_count_t;
//Initialize and return counter
void sat_count_init(char bits, sat_count_t *counter){
        counter->count = 0;
        counter->cbits = bits;
        counter->taken = false;
}
//Update taken member of sat_counter_t based on count
void sat_count_update(sat_count_t *counter){
//COMMENTING OUT THIS LINE MAKES IT WORK. NORMALLY THERE IS CODE TO SET THE CORRECT VALUE        
counter->taken = true;
}       
//Up counter, respecting saturation
void sat_count_up(sat_count_t *counter){
        //If counter is saturated
        if ((counter->count < ( 1 << counter->cbits) - 1)) counter->count = counter->count + 1;
        sat_count_update(counter);
}
//Down counter, respecting saturation
void sat_count_down(sat_count_t *counter){
        //If counter is 0
        if (counter->count > 0) --counter;
        sat_count_update(counter);
}
#endif  

饱和反测试。

#include "SaturatingCounter.H"
#include "SaturatingCounter.H" //Multiple include to test include guards
#include <stdbool.h>
#include <stdio.h>
void main(){
        //Initialize counter    
        char i,NULL1, NULL2, bitsA;
        sat_count_t mycounter;
        //Test all bit counters
        for(bitsA=1;bitsA<=5;++bitsA){
                sat_count_init(bitsA,&mycounter);
                printf("***************************** %d bits **************n",bitsA);
                printf("**UP**n");
                for(i=0;i<((1<<bitsA) + 1);i++) {
                        printf("Counter is currently %d, %sTAKEN.n",mycounter.count,(!mycounter.taken) ? "NOT " : "");
                        sat_count_up(&mycounter);
                }

                printf("**DOWN**n");
                for(i=0; i<(((1<<bitsA) + 1));i++) {
                        printf("Counter is currently %d, %sTAKEN.n",mycounter.count,(!mycounter.taken) ? "NOT " : "");
                        //THIS IS WHERE bitsA CHANGES!
                        printf("DEBUG BEFORE: BITS: %dn",bitsA);
//                      printf ("%p bitsAn %p mycountern",&bitsA, &mycounter);
                        sat_count_down(&mycounter);
                        printf("DEBUG AFTER: BITS: %dn",bitsA);
//                      printf ("%p bitsAn %p mycountern",&bitsA, &mycounter);
                }
        }
}     

你的问题出在这条线上

if (counter->count > 0) --counter;

您正在更改counter指向的位置 - 以前的内存位置是您存储bitsA的位置:

   char i,NULL1, NULL2, bitsA;
   sat_count_t mycounter;

我想你的意思是减少别的东西 - 也许

if(count->count > 0) --(counter->count)

最新更新