c-如何获取位于特定结构中的变量等信息,并将其存储在位于另一个结构中的单个指针中



我正试图从标准输入中读取不同的值,并将它们存储在我创建的名为流程结构的结构中的变量中。然后,我将获取该结构中的信息,并将其存储在优先级队列结构中的指针变量中。该过程结构如下:


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;

在这里,我们做两件事:

  1. 定义了一个类型CCD_ 8
  2. 将标识符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;

在这里,我们还做两件事:

  1. 定义了一个类型CCD_ 13
  2. 将标识符CCD_ 14声明为指针类型CCD_

接下来,我们有这个typedef声明:

typedef struct Queue {
Queue_element queue;
// ...
} Queue;

在这里,我们还做两件事:

  1. 定义了一个类型CCD_ 17
  2. 将标识符CCD_ 18声明为该类型的别名

与之前类似,第二个Queue与第一个不同。

接下来,我们有这个函数定义:

static void nolock_add_to_queue (Queue *q, void *element, int priority) {
// ...
}

在这里,我们定义了一个函数nolock_add_to_queue,它是:

  1. 为CCD_ 21
  2. 取指针类型CCD_ 22的变量作为其第一自变量
  3. 取指针类型为CCD_ 23的变量作为其第二自变量
  4. 取CCD_ 24类型的变量作为其第三自变量
  5. 不返回任何内容

最后,它是如何协同工作的?

函数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及其元素进行操作,而不是直接对其元素所保存的数据进行操作。

如果我写的东西不清楚,可以在评论中要求澄清。

最新更新