1

libmodbusでコンパイルの問題が発生しています。次のコードがあります

boost::shared_ptr <modbus_t> ctx;
ctx->modbus_new_tcp(ip_address.c_str(), modbus_port);

しかし、次のエラーが表示されます

error: invalid use of incomplete type 'struct _modbus'

modbus.hのこの行を指しています

typedef struct _modbus modbus_t;

問題のトラブルシューティングを行うには、これについて十分に理解していません。それは何だと思いますか?このライブラリはスマート ポインタと互換性がありませんか? 通常のポインターを使用するように指示されます

modbus_t* ctx;

ありがとうございました。

4

2 に答える 2

3

あなたは - おそらく - を使用することができます

if (std::unique_ptr<modbus_t, void(*)(modbus_t*)> mb(modbus_new_tcp(ip_address.c_str(), modbus_port), &modbus_free)) {

    modbus_connect(mb);

    /* Read 5 registers from the address 0 */
    modbus_read_registers(mb, 0, 5, tab_reg);

    modbus_close(mb);
} // modbus_free invoked, even in the case of exception.

もちろん、これは一意の所有権があることを前提としています。

于 2015-09-09T21:51:39.947 に答える
1

実際、これは C スタイルの API のように見えmodbus_tます (オブジェクト メンバーを呼び出すのではなく、フリー関数へのポインターを渡すため) の実装がユーザーから完全に隠されています。

これが意味することは、そのままでは を使用できないということですshared_ptr( call の定義が必要でdeleteあり、間違った呼び出しを行うこともあるため)。適切なクリーンアップ関数を呼び出すカスタム デリーターを使用する方法があるかもしれませmodbus_freeん (おそらく)。.get()その後、API を呼び出したいときはいつでも生のポインターを取得するためにを使用する必要があります。

于 2015-09-09T20:28:53.723 に答える