Ошибка не о Head
, а о Head->pData
. Обратите особое внимание на сообщение об ошибке. В некоторых компиляторах сообщение об ошибке четко идентифицирует строку, но не точное местоположение в строке;если ошибки вашего компилятора не ясны, вы можете получить более точное местоположение ошибки, если добавите разрывы строк и создадите больше промежуточных переменных.
void *data = Head->pData;
struct timeval time_created = data->oTimeCreated;
int responseTime = getDifferenceInMilliSeconds(time_created, start);
Обратите внимание, что для написания кода таким образом, я должен был датьтипы к промежуточным выражениям Head->pData
и data->oTimeCreated
. Чтобы выяснить, какие типы дать, я посмотрел определения struct element
и struct process
.
В частности, тип Head->pData
равен void*
. Это указатель на неопределенный тип. Вы не можете разыменовать его, и, в частности, data->oTimeCreated
приводит к ошибке компиляции, поскольку data
не является указателем на структуру или объединение. Неуказанный тип не является структурой или объединением.
C не имеет полиморфизма , запеченного в языке. Он допускает полиморфизм через указатели void, но, как и во многих вещах в C, вам нужно выполнить часть работы самостоятельно. C не отслеживает фактический тип объекта, если у вас есть только пустой указатель на него. Вы должны указать, когда вы хотите разыменовать указатель, и вам нужно сделать его правильно, иначе может произойти все, что угодно .
Если вы уверены, что то, что вы положили в список,указатель на struct process
, который все еще действителен, затем преобразуйте или приведите пустой указатель к указателю на struct process
. Вот идиоматический способ сделать это:
struct process *head_process = Head->pData;
runPreemptiveJob(head_process, &start, &end);
int responseTime = getDifferenceInMilliSeconds(head_process->oTimeCreated, start);