Cの関数呼び出し間で共用体メンバーの値を保持するにはどうすればよいですか?

ibtissam latai

共用体がグローバルキュー構造体のメンバーであることを知っているのに、書き込み関数を使用して共用体メンバーに割り当てられた値を保持する方法を教えてもらえますか?

基本的に私がしたことは、キュー名、長さ、およびミューテックス(読み取り関数と書き込み関数の間の同期用)を使用して1つのデータキューバッファー構造体を定義することです。バッファデータは、さまざまなシステムのハウスキーピング構造体です。ユニオンを使用して、さまざまな構造体をすべてカプセル化しました。キュー構造体のさまざまなインスタンスがシステムごとに作成されました(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 *ポインターを使用することを考えましたが、メモリー割り当てとポインターの逆参照にはあまりにも面倒です。どう思いますか?

4386427

さて、書き込み関数では、インデックス(別名qwindexを更新/インクリメントし、読み取り関数では、読み取りに同じインデックス使用しますしたがって、read関数は、最後に書き込んだ要素(つまり、まだ書き込まれていない要素)の後にある要素を返します。

私は読み取り機能がどちらかになることを期待します

1)読みたい要素のインデックスを取得します

または

2)qwindex - 1インデックスとして使用します(次に、インデックスをデクリメントしてスタックのような動作を取得します)。

または、最も古い要素が返されるように、書き込み用に1つのインデックスと読み取り用に別のインデックスが必要な場合があります(FIFOの動作)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メンバー関数の最後でデストラクタの呼び出しをバイパスするにはどうすればよいですか?

分類Dev

Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

分類Dev

'nullでのメンバー関数real_escape_string()の呼び出し'を修正するにはどうすればよいですか?

分類Dev

クラスのメンバーである関数を別の関数から呼び出すにはどうすればよいですか?

分類Dev

「nullのメンバー関数update()の呼び出し」エラーを修正するにはどうすればよいですか?

分類Dev

C ++共用体のメンバー変数である文字列オブジェクトを削除するにはどうすればよいですか?

分類Dev

外部の呼び出し可能なメンバー関数を匿名オブジェクトに追加するにはどうすればよいですか?

分類Dev

Cの構造体で関数を呼び出すにはどうすればよいですか?

分類Dev

構造体の値をprint関数に渡して、mainで呼び出すにはどうすればよいですか?-C言語

分類Dev

呼び出し元は、同じ名前のどのメンバー関数が呼び出されるかをどのように知るのですか?

分類Dev

C ++でgtest / gmockを使用して別のグローバル関数を呼び出すグローバル関数の単体テストを作成するにはどうすればよいですか?

分類Dev

関数の最初の呼び出しでのみifステートメントを実行するにはどうすればよいですか?

分類Dev

Cの関数呼び出しでポインター引数の値を1行でインクリメントまたはデクリメントするにはどうすればよいですか?

分類Dev

C#でそのメンバー関数にアクセスしながら、1つのクラスのコンストラクターを呼び出さないようにするにはどうすればよいですか?

分類Dev

input関数を使用して変数の値を呼び出すにはどうすればよいですか?

分類Dev

特定の時間枠を使用して関数を呼び出すにはどうすればよいですか?

分類Dev

promiseから呼び出し元の関数に値を返すにはどうすればよいですか?

分類Dev

`std :: vector`メンバー変数をメソッドの呼び出し元に移動するにはどうすればよいですか?

分類Dev

$()。animateがアニメーションしている間、関数を継続的に呼び出すにはどうすればよいですか?

分類Dev

`into()`への複数の呼び出しをチェーンするにはどうすればよいですか?

分類Dev

LLVMで関数呼び出しの引数を取得するにはどうすればよいですか?

分類Dev

関数呼び出しの後で変数を変更するにはどうすればよいですか?

分類Dev

別のクラスからメンバーへのポインタ関数を呼び出すにはどうすればよいですか?

分類Dev

再帰的なテンプレート関数の最初の呼び出しで関数を実行するにはどうすればよいですか?

分類Dev

ATSで関数呼び出しを実行するのにかかる時間を測定するにはどうすればよいですか?

分類Dev

構造体の変数メソッドを呼び出すにはどうすればよいですか

分類Dev

関数呼び出しのselectで行全体を使用するにはどうすればよいですか?

分類Dev

Python3で呼び出し元の関数にさらに値を返し、結果を表示するにはどうすればよいですか?現在、インクリメントなしで最初の値のみを出力していますか?

分類Dev

パラメータリストに関数呼び出しを簡単に保持するにはどうすればよいですか?

Related 関連記事

  1. 1

    メンバー関数の最後でデストラクタの呼び出しをバイパスするにはどうすればよいですか?

  2. 2

    Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

  3. 3

    'nullでのメンバー関数real_escape_string()の呼び出し'を修正するにはどうすればよいですか?

  4. 4

    クラスのメンバーである関数を別の関数から呼び出すにはどうすればよいですか?

  5. 5

    「nullのメンバー関数update()の呼び出し」エラーを修正するにはどうすればよいですか?

  6. 6

    C ++共用体のメンバー変数である文字列オブジェクトを削除するにはどうすればよいですか?

  7. 7

    外部の呼び出し可能なメンバー関数を匿名オブジェクトに追加するにはどうすればよいですか?

  8. 8

    Cの構造体で関数を呼び出すにはどうすればよいですか?

  9. 9

    構造体の値をprint関数に渡して、mainで呼び出すにはどうすればよいですか?-C言語

  10. 10

    呼び出し元は、同じ名前のどのメンバー関数が呼び出されるかをどのように知るのですか?

  11. 11

    C ++でgtest / gmockを使用して別のグローバル関数を呼び出すグローバル関数の単体テストを作成するにはどうすればよいですか?

  12. 12

    関数の最初の呼び出しでのみifステートメントを実行するにはどうすればよいですか?

  13. 13

    Cの関数呼び出しでポインター引数の値を1行でインクリメントまたはデクリメントするにはどうすればよいですか?

  14. 14

    C#でそのメンバー関数にアクセスしながら、1つのクラスのコンストラクターを呼び出さないようにするにはどうすればよいですか?

  15. 15

    input関数を使用して変数の値を呼び出すにはどうすればよいですか?

  16. 16

    特定の時間枠を使用して関数を呼び出すにはどうすればよいですか?

  17. 17

    promiseから呼び出し元の関数に値を返すにはどうすればよいですか?

  18. 18

    `std :: vector`メンバー変数をメソッドの呼び出し元に移動するにはどうすればよいですか?

  19. 19

    $()。animateがアニメーションしている間、関数を継続的に呼び出すにはどうすればよいですか?

  20. 20

    `into()`への複数の呼び出しをチェーンするにはどうすればよいですか?

  21. 21

    LLVMで関数呼び出しの引数を取得するにはどうすればよいですか?

  22. 22

    関数呼び出しの後で変数を変更するにはどうすればよいですか?

  23. 23

    別のクラスからメンバーへのポインタ関数を呼び出すにはどうすればよいですか?

  24. 24

    再帰的なテンプレート関数の最初の呼び出しで関数を実行するにはどうすればよいですか?

  25. 25

    ATSで関数呼び出しを実行するのにかかる時間を測定するにはどうすればよいですか?

  26. 26

    構造体の変数メソッドを呼び出すにはどうすればよいですか

  27. 27

    関数呼び出しのselectで行全体を使用するにはどうすればよいですか?

  28. 28

    Python3で呼び出し元の関数にさらに値を返し、結果を表示するにはどうすればよいですか?現在、インクリメントなしで最初の値のみを出力していますか?

  29. 29

    パラメータリストに関数呼び出しを簡単に保持するにはどうすればよいですか?

ホットタグ

アーカイブ