C ++非静的メンバー関数を使用したCコールバック関数の問題

user3475861

コールバック関数を必要とするCライブラリがあります。

void func( int *a, double *b, double *c, double *d )

a、b、cが入力され、「d」が出力されます。私のクラスは次のようになります。

class Test{
public:
    Test()
    {
        a   = 2;               
        ip  = new int[128];     
        kd  = new int[a];   
        c   = new double[a];
        dp  = new double[26];
        ja  = NULL;         
        h   = 1.0e-7;       
        hm  = 1.0e-14;  
        ep  = 1.0e-8;   
        tr  = 1.0e-3;   

        for (int i = 0; i < 128; ++i)
            ip[i] = 0;

        b     = 0.0;
        t_e   = 160.e0;

        c[0]    = 2.e0;
        c[1]    = 0.e0;
    }

    void my_func( int *a, double *b, double *c, double *d ) {
       d[0] = some_value;
       d[1] = some_other_value;
    }

    operator()() 
    {
        auto member_func = std::bind( &Test::my_func, *this, _1, _2, _3, _4 );
        external_function( ip, &a, &b, &t_e, c, &member_func, ja, &h, &hm, &ep, &tr, dp, kd, &ie );
    }

private: 
    int *ip, *kd;
    int a, ie;
    double b, t_e;
    double *c, *dp;
    double h, hm, ep, tr;
    void *ja;
};

正常にコンパイルされますが、実行すると「セグメンテーション違反(コアダンプ)」が発生します。なぜこれが起こるのか分かりません。

メンバー関数(my_func)を使用せずに、つまり、グローバルスコープで直接「func」を宣言、定義、および使用すると、正常に機能し、正しい結果が生成されます。

問題は、それぞれがクラスデータメンバーを変更して使用する必要があるため、Testクラスの複数のインスタンスを同時に並行して実行できないことです。残念ながら、「func」は引数を取りません。たとえば、(void * data)は、「テスト」へのキャストを許可します。

助けてもらえますか。どうもありがとう。

user3475861

これは、単一のスレッドと複数のスレッドで機能します。

// C function
void func( int *a, double *b, double *c, double *d );

// Forward declaration of Test class
class Test;

// Thread local for thread safety
thread_local Test *p_global;

class Test{
public:
Test()
{
    a   = 2;               
    ip  = new int[128];     
    kd  = new int[a];   
    c   = new double[a];
    dp  = new double[26];
    ja  = NULL;         
    h   = 1.0e-7;       
    hm  = 1.0e-14;  
    ep  = 1.0e-8;   
    tr  = 1.0e-3;   

    for (int i = 0; i < 128; ++i)
        ip[i] = 0;

    b     = 0.0;
    t_e   = 160.e0;

    c[0]    = 2.e0;
    c[1]    = 0.e0;
}

void assign_this_pointer_to_global_and_dostuff()
{
    p_global = this;
    dostuff();
}

dostuff() 
{
    external_function( ip, &a, &b, &t_e, c, &func, ja, &h, &hm, &ep, &tr, dp, kd, &ie );
}

private: 
    int *ip, *kd;
    int a, ie;
    double b, t_e;
    double *c, *dp;
    double h, hm, ep, tr;
    void *ja;
};

// C function
void func( int *a, double *b, double *c, double *d ) {
   d[0] = some_value;
   d[1] = some_other_value;
}


int main()
{
    Test test;
    std::thread t1( &Test::assign_this_pointer_to_global_and_dostuff, &test );

    //Join the thread with the main thread
    t1.join();
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C ++の非静的メンバー関数をコールバックおよびクラススコープの問題として使用する

分類Dev

非静的メンバー関数をC ++のコールバックとして使用する方法

分類Dev

メンバー静的コールバック関数のextern "C"

分類Dev

C ++ 11:クラスコンストラクターのデフォルト引数として非静的メンバー関数を使用する

分類Dev

C ++メンバー関数を使用して、単純な静的関数ポインターを受け取るコールバックを処理する

分類Dev

メンバー関数の問題を渡すc ++クラス

分類Dev

Emscriptenを使用したCコードのjavascript関数コールバック

分類Dev

静的メンバー関数を使用したC ++ / CLIスレッド

分類Dev

静的コールバックパラメーターを使用してC関数を、プライベートメンバーをコールバックとして受け入れるC ++関数にラップする

分類Dev

メンバー関数へのC ++コールバック関数

分類Dev

非静的メンバー関数c ++スレッドLinuxの無効な使用

分類Dev

メンバー関数ポインターをキーとして使用するC ++マップの問題

分類Dev

コールバックとしてのC ++メンバー関数

分類Dev

C ++非静的メンバー関数のオーバーヘッド

分類Dev

C ++テンプレートクラスを使用して非静的メンバー関数を呼び出す

分類Dev

外部ライブラリへのコールバック関数としてのC ++メンバー関数

分類Dev

Cでctypesコールバック関数を渡すと、メモリ関連の問題が発生します

分類Dev

C ++のコールバック関数

分類Dev

オブジェクト引数なしの非静的メンバー関数の呼び出し、C ++ノード

分類Dev

エラー:非静的メンバー関数C ++の無効な使用

分類Dev

メンバー関数コールバックc ++ 14のバインドまたはラムダ

分類Dev

cを使用したpahomqttコールバック関数の場合、elseの数を減らす方法は?

分類Dev

C ++メンバー関数をCコールバックにマップします

分類Dev

C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

分類Dev

inoスケッチをC ++クラスに変換し、非静的メンバー関数を無効に使用します

分類Dev

静的メンバー関数からのC ++クラスのsizeof

分類Dev

Cコールバック関数用のC ++「動的」関数ポインタ

分類Dev

C言語バインディングを使用した静的メンバー関数?

分類Dev

c ++ 11関数コールバックを使用して複数のテンプレートパラメータを宣言する方法

Related 関連記事

  1. 1

    C ++の非静的メンバー関数をコールバックおよびクラススコープの問題として使用する

  2. 2

    非静的メンバー関数をC ++のコールバックとして使用する方法

  3. 3

    メンバー静的コールバック関数のextern "C"

  4. 4

    C ++ 11:クラスコンストラクターのデフォルト引数として非静的メンバー関数を使用する

  5. 5

    C ++メンバー関数を使用して、単純な静的関数ポインターを受け取るコールバックを処理する

  6. 6

    メンバー関数の問題を渡すc ++クラス

  7. 7

    Emscriptenを使用したCコードのjavascript関数コールバック

  8. 8

    静的メンバー関数を使用したC ++ / CLIスレッド

  9. 9

    静的コールバックパラメーターを使用してC関数を、プライベートメンバーをコールバックとして受け入れるC ++関数にラップする

  10. 10

    メンバー関数へのC ++コールバック関数

  11. 11

    非静的メンバー関数c ++スレッドLinuxの無効な使用

  12. 12

    メンバー関数ポインターをキーとして使用するC ++マップの問題

  13. 13

    コールバックとしてのC ++メンバー関数

  14. 14

    C ++非静的メンバー関数のオーバーヘッド

  15. 15

    C ++テンプレートクラスを使用して非静的メンバー関数を呼び出す

  16. 16

    外部ライブラリへのコールバック関数としてのC ++メンバー関数

  17. 17

    Cでctypesコールバック関数を渡すと、メモリ関連の問題が発生します

  18. 18

    C ++のコールバック関数

  19. 19

    オブジェクト引数なしの非静的メンバー関数の呼び出し、C ++ノード

  20. 20

    エラー:非静的メンバー関数C ++の無効な使用

  21. 21

    メンバー関数コールバックc ++ 14のバインドまたはラムダ

  22. 22

    cを使用したpahomqttコールバック関数の場合、elseの数を減らす方法は?

  23. 23

    C ++メンバー関数をCコールバックにマップします

  24. 24

    C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

  25. 25

    inoスケッチをC ++クラスに変換し、非静的メンバー関数を無効に使用します

  26. 26

    静的メンバー関数からのC ++クラスのsizeof

  27. 27

    Cコールバック関数用のC ++「動的」関数ポインタ

  28. 28

    C言語バインディングを使用した静的メンバー関数?

  29. 29

    c ++ 11関数コールバックを使用して複数のテンプレートパラメータを宣言する方法

ホットタグ

アーカイブ