У меня есть следующий фрагмент кода:Как преобразовать указатели в целые числа и наоборот?
typedef Module * Ptr;
producer(Ptr net)
Ptr Node;
Node = net;
pthread_mutex_lock(&mutex);
produce(q,(uint64_t)Node);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
Здесь производят библиотека: продукт (Queue д, значение uint64_t)
Тогда у меня есть код потребителя:
consumer()
Ptr Node;
pthread_mutex_lock(&mutex);
while(!canConsume(q))
{
pthread_cond_wait(&cond,&mutex);
}
Node = (Ptr)consume(q);
pthread_mutex_unlock(&mutex);
Однако, когда я пытаюсь распечатать значение modNode в обеих функциях. Хотя Node в функциях производителя, по-видимому, является адресом, Node в функции пользователя оказывается равным 0. Я думаю, что я как-то испортил конверсию между указателями и целыми числами, потому что этот код отлично работает с передачей целых чисел. Мой вопрос: как преобразовать указатель в uint64_t?
Что такое 'q'? Вы писали «потреблять» и «производить» себя? Вы уверены, что нет ошибок в 'потреблении' или' производстве'? – immibis
Проблема может заключаться в том, что вы не знаете фактический размер указателя на каждой платформе, на которой вы будете строить. Поэтому старайтесь использовать ['(u) intptr_t'] (https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#Integers_wide_enough_to_hold_pointers) всякий раз, когда можете. – StoryTeller
Трудно сказать из вашего сообщения, но поскольку Node равен 0, когда вы его тестируете, а 0 обычно является эквивалентом значения NULL-указателя на C, я бы предположил, что на каком-то этапе ваша функция потребления() возвращает NULL. Возможно, очередь пуста. – StephenG