Может кто-нибудь сказать мне, как я могу сохранить значение, присвоенное члену объединения, используя функцию записи, зная, что объединение является членом глобальной структуры очереди?
По сути, я определил одну структуру буфера очереди данных с именем очереди, длиной и мьютексами (для синхронизации между функциями чтения и записи). Данные буфера являются структурами хранения различных систем; Объединение было использовано для инкапсуляции всех различных структур. Различные экземпляры структуры очереди были созданы для каждой системы (eps_q, com_q..etc).
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
typedef union qbuf{
eps_hk eps_buf[EPS_HK_SIZE];
odb_hk odb_buf[ODB_HK_SIZE];
com_hk com_buf[COM_HK_SIZE];
cam_hk cam_buf[CAM_HK_SIZE];
adcs_hk adcs_buf[ADCS_HK_SIZE];
}qbuf_t;
typedef struct {
qbuf_t qbuf;
int qwindex;
int qlength;
int qfull;
char *qname;
pthread_mutex_t *qmut;
pthread_cond_t *qFull;
}queue;
queue *odb_q;
queue *eps_q;
queue *com_q;
queue *cam_q;
queue *adcs_q;
/*************************************************/
/**** read and write functions in eps.c *****/
int eps_queueAdd (queue *q, eps_hk hk)
{
q->qbuf.eps_buf[q->qwindex] = hk;
printf(".... After queue add..... vbatt %u\n", q->qbuf.eps_buf[q->qwindex].vbatt);
q->qwindex++;
if (q->qwindex == q->qlength) {
q->qwindex = 0;
q->qfull=1;
}
return (q->qfull);
}
eps_hk eps_queueRead(queue *q) //read hk from local eps hk table, for hk handlers
{
eps_hk hk;
sleep (10);
hk = q->qbuf.eps_buf[q->qwindex];
printf(".... INSIDE queue read .....vbatt %u \n", q->qbuf.eps_buf[q->qwindex].vbatt);
return (hk);
}
Функция записи (queueADD) работает просто отлично. Проблема в том, что когда я пытаюсь прочитать значение, ранее записанное с использованием (queueADD) (скажем, 10), я не могу найти его (я получаю 0 ).
Спасибо, что нашли время, чтобы прочитать мой пост =)
=== РЕДАКТИРОВАТЬ ================================================= =====================
Моя цель использования объединения в структуре очереди состоит в том, чтобы определить общую очередь для различных типов данных. Конечно, я думал об использовании указателя void *, но это слишком хлопотно с выделением памяти и разыменованием указателя. Что ты думаешь?