2009-07-06 108 views
0

編輯:原因隊列是2d是因爲我需要一個命令的指針,以便cmd可以等於NULL。 NULL ==(void *)。這是我感到困惑的地方,爲什麼我來到這裏。 :)指針混淆指針

爲了幫助嘗試找出我在Python中遇到的另一個問題,我正在C中實現一個小測試程序。雖然我知道一點,但顯然我很困惑。我正在嘗試寫一個簡單的隊列用於異步USB傳輸。隊列中的某些內容不正確,因爲從隊列中彈出的每個命令都是相同的。如果我將隊列[1024] [0]寫入隊列[1024] [1],而是在兩個不同的命令之間切換,並且程序在command_thread_main中崩潰。顯然它沒有注意到cmd應該是NULL。據我所知,改變[1]任何更高都沒有效果。任何提示?

typedef struct Command { 
    void (*cb) (char *data, int size); 
    unsigned char *data; 
    int size; 
} Command; 

struct Command queue[1024][0]; 

int queueEnd = 0; 
int queueStart = 0; 

static void queue_push(void (*cb), unsigned char *data, int size) { 
    if (queueEnd >= 1024) 
     return; 
    queue[queueEnd]->cb = cb; 
    queue[queueEnd]->data = data; 
    queue[queueEnd]->size = size; 
    queueEnd++; 
} 

struct Command * queue_pop(void) { 
    if(queueStart > queueEnd) 
     return NULL; 
    return queue[queueStart++]; 
} 

static void *command_thread_main(void *arg) { 
    struct Command *cmd; 
    while (!do_exit) { 
     if(locked) continue; 
     locked = 1; 
     cmd = queue_pop(); 
     if(cmd != NULL) 
      cmd->cb(cmd->data, cmd->size); 
    } 
} 
+2

爲什麼數組2D?那看起來不對 – Hasturkun 2009-07-06 08:47:25

回答

2
  • 不要你的意思struct Command queue[1024];? (也就是說,沒有[0][1]或其他)
  • queue_pop我想你應該測試queueStart >= queueEnd
  • 你應該實現一個圓形數組。

現在你將結構本身存儲在一個數組中,而不是指向它的指針。這是明智的。你需要改變->.雖然:

queue[queueEnd].cb = cb; 
queue[queueEnd].data = data; 
queue[queueEnd].size = size; 

(因此queue_pop應該返回struct Command型(不struct Command *的變量),以及主代碼也應該相應地更新。)

中當然你可以也傳遞指針,但是用這麼小的結構/隊列就沒有實際的需要。

+0

1)我需要一個指針。 2)一旦queueStart傳遞queueEnd,隊列被認爲是空的。當queueStart == queueEnd時,隊列至少有一個成員彈出。 3)這個隊列將被使用一次,最多有65個命令通過它。這是一個簡單的測試程序,以滿足那些幫助我在Python中調試問題的人員。不需要圓形陣列! – Scott 2009-07-06 08:50:06

3

我覺得你有一個bug,你需要在其他任何事情之前修復。你有一個二維數組的命令,並已將其中一個尺寸設置爲零!

struct Command queue[1024][0]; 

當您訪問隊列時,您似乎將其視爲一維結構。如果你把它聲明爲:

struct Command queue[1024]; 
+0

那麼,我需要一個來自隊列的指針,所以cmd可以== NULL。 – Scott 2009-07-06 08:50:59

+1

要麼有queue_pop返回`&隊列[queueStart ++]`或將數組更改爲Command * – Hasturkun 2009-07-06 08:55:30

1

另一個問題是,你聲明隊列爲struct秒的數組,但你使用它作爲一個指針數組通過使用反引用->操盤的成員.一個結構。

我並不是說聽起來那麼尖銳,但編譯器警告標誌(gcc的-Wall)是你的朋友。

2

正如其他人指出的那樣,2D隊列肯定是錯誤的。你需要一維隊列,我懷疑你想要的是一個指針數組:

Command * queue[1024]; 

我reommend你去的方式和思考問題了一下,畫一些圖表,然後用更清晰的代碼回來和問題。