我正在撰寫 C 代碼來實作以下狀態機:(
來自TI-RSLK)。請在這里找到代碼:
#include <stdio.h>
struct state{
unsigned int output;
unsigned int delay;
const struct state *next[4];
};
#define center &fsm[0]
#define left &fsm[1]
#define right &fsm[2]
typedef const struct state state_t;
state_t fsm[3] = {
{3, 50, {right, left, right, center}},
{2, 50, {left, center, right, center}},
{1, 50, {right, left, center, center}}
};
int main(void)
{
state_t *spt;
unsigned int input;
unsigned int output;
spt = center;
while(1) {
output = spt->output;
printf("%u \n", output);
scanf("%u \n", input);
spt = spt->next[input];
}
printf("Hello World");
return 0;
}
這段代碼會回傳一個錯誤:
main.c: In function ‘main’:
main.c:37:17: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
37 | scanf("%u \n", input);
| ~^ ~~~~~
| | |
| | unsigned int
| unsigned int *
3
我以為 '%u' 接受無符號整數。為什么這里參考的是unsigned int型別的指標呢?
我也試過“%d”。我以為 '%d' 會接受一個整數。該錯誤還表明需要一個指標(整數型別)。
感謝您的任何討論!
uj5u.com熱心網友回復:
哦,不是printf指望指標……是scanf,原因很清楚。您是否曾經嘗試撰寫一個函式,以呼叫者可見的方式修改其引數?
void test(int fubar) {
fubar = 42; // this doesn't work
}
需要明確的是,scanf 需要能夠分配給呼叫者可見的物件,并且 C 嚴格按值傳遞(意味著引數是復制到臨時位置),因此scanf需要參考型別(例如指標,按值傳遞,因為 C 嚴格按值傳遞)以修改參考的內容。
你錯過了一個符號,你scanf的可怕猜測的后果。改變這個:scanf("%u \n", input);
對此:
scanf("%u", &input);
// ^--- see?
...并拿起一份 K&R2e,這樣您就可以閱讀它并快速完成練習...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537267.html
標籤:C指针状态机
