2009-07-06 109 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你去的方式和思考问题了一下,画一些图表,然后用更清晰的代码回来和问题。