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);
}
}
}
是的,這是問題。這就是爲什麼你不應該喝酒和點:p謝謝! (我會在3分鐘內接受答案,我將被允許) – GCon
啊......巴爾梅峯。 http://xkcd.com/323/ – Floris
是的,巴爾默峯。我花了20分鐘編寫代碼,4個小時(不成功)調試。我的BAC一定是有點關閉的:p – GCon