我正试图从标准输入中读取不同的值,并将它们存储在我创建的名为流程结构的结构中的变量中。然后,我将获取该结构中的信息,并将其存储在优先级队列结构中的指针变量中。该过程结构如下:
typedef struct proc{
int creationTime;
int pid;
int runTime;
int ioTime;
int repeat;
}proc;
我的优先级队列的结构如下:
// type of one element in a queue
typedef struct _Queue_element {
void *info; //<- THIS IS WHERE ALL INFO FROM THE PROCESS STRUCTURE WILL BE STORED WHEN ADDED TO THE QUEUE
int priority;
struct _Queue_element *next;
} *Queue_element;
//basic queue type
typedef struct Queue {
Queue_element queue;
Queue_element tail;
Queue_element current;
Queue_element previous;
unsigned long queuelength;
unsigned int elementsize;
unsigned int duplicates;
int (*compare) (const void *e1, const void *e2);
pthread_mutex_t lock;
int priority_is_tag_only;
} Queue;
最后,这是我正在使用的现成队列包中的向队列添加元素的函数。
static void nolock_add_to_queue(Queue *q, void *element, int priority) {
Queue_element new_element, ptr, prev = NULL;
if (! q->duplicates && ! q->compare) {
fprintf(stderr, "If duplicates are disallowed, the comparison function must be specified in init_queue().n");
exit(1);
}
if (!q->queue ||
(q->queue && (q->duplicates || !nolock_element_in_queue(q, element)))) {
new_element = (Queue_element) malloc(sizeof(struct _Queue_element));
if (new_element == NULL) {
fprintf(stderr, "malloc() failed in function add_to_queue()n");
exit(1);
}
new_element->info = (void *)malloc(q->elementsize);
if (new_element->info == NULL) {
fprintf(stderr, "malloc() failed in function add_to_queue()n");
exit(1);
}
memcpy(new_element->info, element, q->elementsize);
new_element->priority = priority;
(q->queuelength)++;
if (q->queue == NULL) { // first element
new_element->next = NULL;
q->queue = new_element;
q->tail = new_element;
}
else if (q->priority_is_tag_only) { // FIFO queue
q->tail->next = new_element;
q->tail = new_element;
new_element->next = NULL;
}
else { // priority queue
ptr=q->queue;
while (ptr != NULL && priority <= ptr->priority) {
prev = ptr;
ptr = ptr->next;
}
if (! prev) { // queue only had one element and new element
// has higher priority
new_element->next=q->queue;
q->tail = q->queue;
q->queue=new_element;
}
else { // insert new element
new_element->next = prev->next;
prev->next = new_element;
if (new_element->next == NULL) {
// new tail
q->tail = new_element;
}
}
}
nolock_rewind_queue(q);
}
}
我感到困惑的是,这个添加到队列的函数将如何正确地将信息从typedef struct proc;
存储到typedef struct _Queue_element;
中的void *info
变量。如果这个问题缺少任何信息,比如我的包中包含的其他功能,或者我可能澄清的任何其他问题,请告诉我。即使你无法为我的问题提供具体的解决方案,我读到的任何可以帮助我理解这些主题的材料都肯定会很有用。
UPDATE:我已经意识到这个函数根本不需要更改。但我仍然困惑于它将如何从proc接收信息。
但我仍然困惑于它[函数
nolock_add_to_queue
]将如何从proc接收信息。
好吧,我宁愿说,在函数nolock_add_to_queue
中,通过它的参数,以及在函数外部,通过类型为proc
的变量,都可以访问相同的信息。但让我们冷静地分析一下。我自由地将代码的格式稍微不同一点,也许它会更可读。
首先,我们有这个typedef
声明:
typedef struct proc {
// ...
} proc;
在这里,我们做两件事:
- 定义了一个类型CCD_ 8
- 将标识符
proc
声明为该类型的别名
注意,第二标识符proc
意味着与第一标识符proc
不同的东西。
接下来,我们有这个typedef
声明:
typedef struct _Queue_element {
void *info; //<- THIS IS WHERE ALL INFO FROM THE PROCESS STRUCTURE WILL BE STORED WHEN ADDED TO THE QUEUE
// ...
} *Queue_element;
在这里,我们还做两件事:
- 定义了一个类型CCD_ 13
- 将标识符CCD_ 14声明为指针类型CCD_
接下来,我们有这个typedef
声明:
typedef struct Queue {
Queue_element queue;
// ...
} Queue;
在这里,我们还做两件事:
- 定义了一个类型CCD_ 17
- 将标识符CCD_ 18声明为该类型的别名
与之前类似,第二个Queue
与第一个不同。
接下来,我们有这个函数定义:
static void nolock_add_to_queue (Queue *q, void *element, int priority) {
// ...
}
在这里,我们定义了一个函数nolock_add_to_queue
,它是:
- 为CCD_ 21
- 取指针类型CCD_ 22的变量作为其第一自变量
- 取指针类型为CCD_ 23的变量作为其第二自变量
- 取CCD_ 24类型的变量作为其第三自变量
- 不返回任何内容
最后,它是如何协同工作的?
函数nolock_add_to_queue
采用一个Queue *
变量作为其自变量。接下来,此函数可以通过此变量访问Queue
类型的每个成员。
此外,此函数还将的void *
变量作为其参数。接下来,它可以访问与该变量访问的内存相同的内存。注意,我已经写了";存储器";,而不是";"类型变量";或";"类型的成员";。这是因为CCD_;指向无类型数据的指针变量";。有关void *
的详细信息,您可以看到例如"void*是什么意思以及如何使用它?"?,C编程中void指针的概念问题,或者void在C、C++和C#中意味着什么?。
当调用nolock_add_to_queue
时,它通过使用q->queue
来访问Queue
的成员queue
等。queue
可以访问其成员info
(在函数中不直接访问(。至于proc
,没有直接使用它的成员,但我认为它们在调用nolock_add_to_queue
的代码中使用。这种用法很可能不需要,因为函数对Queue
及其元素进行操作,而不是直接对其元素所保存的数据进行操作。
如果我写的东西不清楚,可以在评论中要求澄清。