Как сохранить значения члена объединения между вызовами функций в C? - PullRequest
0 голосов
/ 17 мая 2019

Может кто-нибудь сказать мне, как я могу сохранить значение, присвоенное члену объединения, используя функцию записи, зная, что объединение является членом глобальной структуры очереди?

По сути, я определил одну структуру буфера очереди данных с именем очереди, длиной и мьютексами (для синхронизации между функциями чтения и записи). Данные буфера являются структурами хранения различных систем; Объединение было использовано для инкапсуляции всех различных структур. Различные экземпляры структуры очереди были созданы для каждой системы (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 *, но это слишком хлопотно с выделением памяти и разыменованием указателя. Что ты думаешь?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Вам нужно перечислить в очереди, чтобы сказать, какой член союза выбран. Пример:

typedef enum 
{
   qbuf_select_eps = 0;
   qbuf_select_odb;
   qbuf_select_com;
   qbuf_select_cam;
   qbuf_select_adcs;
}qbuf_select_t;

typedef struct {
        qbuf_t  qbuf; 
        qbuf_select_t qbuf_select;
        int qwindex;
        int qlength;
        int qfull;
        char *qname;
        pthread_mutex_t *qmut; 
        pthread_cond_t *qFull;
}queue;

И в функции вы используете переключатель, как это.

queue *q;
...

switch (q->qbuf_select)
{
   case qbuf_select_eps:
   //Operations on q->qbuf.eps_buf
   break;
   case qbuf_select_com:
   //Operations on q->qbuf.com_buf
   break;
...
}

Я использовал это решение и отлично работает.

0 голосов
/ 17 мая 2019

Что ж, в вашей функции записи вы обновляете / увеличиваете индекс (он же qwindex), а в функции чтения вы используете такой же индекс для чтения.Таким образом, функция чтения вернет элемент после последнего элемента, который вы написали (т. Е. Элемент, который еще не был записан).

Я бы ожидал, что функция чтения будет либо

1) взять индекс элемента, который вы хотите прочитать

или

2) использовать qwindex - 1 в качестве индекса (а затем уменьшить индекс, чтобы получить поведение, подобное стеку).

Или, может быть, вам нужен один индекс для записи и другой индекс для чтения, чтобы был возвращен самый старый элемент (поведение FIFO).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...