【发布时间】:2009-09-09 11:17:23
【问题描述】:
好的,伙计们,只是一个简短的问题,希望有人能很快找到我的错误,但我现在看不到它
这是我的结构:
typedef struct {
Car *buffer[CAR_PARK_SIZE];
char *arrival_time[CAR_PARK_SIZE];
int keep_running;
int size;
} CarPark;
typedef struct {
Car *buffer[MAX_QUEUE_SIZE];
char *arrival_time[MAX_QUEUE_SIZE];
int keep_running;
int size;
int index;
} CarQueue;
typedef struct {
char str[3];
int id;
} Car;
我会试着说出来,希望我已经提供了足够的信息让人们找出问题所在,问题与 CarQueue 缓冲区中的指针有关,该指针是一个数组汽车指针。当我的代码运行时,它似乎将相同的指针写入 CarQueue 缓冲区中的每个项目,这是逐个播放。
_cq = CarQueue,_cp = 停车场
它们都是全局变量
我的线程调用这些行来生成一个新的汽车结构。
Car c;
c = new_car();
printf("[A] Car Arrived with ID: %s\n", get_car_id(&c));
pthread_mutex_lock(&mutex);
_cq.size++;
_cq.index++;
_cq.buffer[_cq.index] = &c;
pthread_mutex_unlock(&mutex);
这应该将新汽车结构的指针放入 CarQueue 缓冲区中。
下一个线程尝试将指针从该数组中取出,并将其粘贴到自己的数组中,然后将其从旧数组中删除。 CarPark 获取汽车的指针,将其放入存储数组中,然后将其从 CarQueue 中删除(或者在这种情况下,只需增加索引并稍后覆盖它)。
pthread_mutex_lock(&mutex);
_cp.buffer[_cp.size] = _cq.buffer[_cq.index]; //should take the pointer and put it into its own
printf("[C] Car Parked -> %s\n", get_car_id(_cp.buffer[_cp.size])); //gets the right information
_cp.size++;
pthread_mutex_unlock(&mutex);
我认为问题在于代码中的注释在哪里,但我不确定。最终,如果我在 CarPark 中打印出数组,它的所有项目似乎都完全相同。我是否意外地将错误的指针传递给某个地方的指针?
如果我遍历 CarPark 数组并将其打印出来,如下所示
printf("| element %d is %s with pointer %d |\n", j, get_car_id(_cp.buffer[j]), _cp.buffer[j]);
它们看起来都是完全相同的项目、相同的名称和指针。
【问题讨论】:
-
如果您打算将其用作队列(添加到末尾,从末尾删除),那么链表将是一个很好的数据结构。对于数组,您必须知道大小(或像您一样使用常量)。链表很容易扩展和收缩,你不会永远被限制在 MAX_QUEUE_SIZE 和 CAR_PARK_SIZE 大小的数组中。