2013-12-16 45 views
2

過去幾個小時我一直在調試以下代碼。我意識到這可能是愚蠢的,但似乎無法弄清楚。函數調用後可變值更改未使用

在第二個for循環(請參閱debug printfs)中,bitsA的值會更改。我無法弄清楚爲什麼。

編輯:如果有人想知道在sat_count_update代碼:

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

文件:SaturatingCounter.H

#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 

SaturatingCounterTest.H

#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: %d\n",bitsA); 
//      printf ("%p bitsA\n %p mycounter\n",&bitsA, &mycounter); 
         sat_count_down(&mycounter); 
         printf("DEBUG AFTER: BITS: %d\n",bitsA); 
//      printf ("%p bitsA\n %p mycounter\n",&bitsA, &mycounter); 

       } 

     } 
}  

回答

4

你的問題是在線

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

你正在改變,其中counter指向 - 和以前的存儲位置是存儲bitsA

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

我想你的意思是別的遞減的東西 - 也許

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

是的,這是問題。這就是爲什麼你不應該喝酒和點:p謝謝! (我會在3分鐘內接受答案,我將被允許) – GCon

+0

啊......巴爾梅峯。 http://xkcd.com/323/ – Floris

+1

是的,巴爾默峯。我花了20分鐘編寫代碼,4個小時(不成功)調試。我的BAC一定是有點關閉的:p – GCon

相關問題