2016-07-20 1 views
-4

私はlibnl3nl80211.hを使用して、接続されたワイヤレスインターフェイスの使用可能な帯域を取得しています。入れ子になった配列に "nla_for_each_nested"を使用すると、エラー:「void *」から「nlattr *」への無効な変換が発生します。

私はerror: invalid conversion from ‘void*’ to ‘nlattr*’を取得コンパイルしてみてください。 IDE(Clion)もnla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS], rem_band)という行に不満を持ち、incompatible pointer type 'nlattr *' and 'void *'と言っています。

void *と見なされているのは、と考えられるから/usr/include/libnl3/netlink/attr.hですか?

コンパイルエラー:

/home/username/Documents/Development/appname/fs_nl80211Class.cpp: In function ‘int callback(nl_msg*, void*)’: 
/usr/include/libnl3/netlink/attr.h:328:21: error: invalid conversion from ‘void*’ to ‘nlattr*’ [-fpermissive] 
    for (pos = nla_data(nla), rem = nla_len(nla); 
        ^

libnl3/netlink/attr.hファイルからマクロ:

#define nla_for_each_nested(pos, nla, rem) \ 
    for (pos = nla_data(nla), rem = nla_len(nla); \ 
     nla_ok(pos, rem); \ 
     pos = nla_next(pos, &(rem))) 

マイコード:

static int callback(struct nl_msg *msg, void *arg) { 

    genlmsghdr *gnlh = (genlmsghdr *) nlmsg_data(nlmsg_hdr(msg)); 

    struct nlattr *tb_msg[NL80211_ATTR_MAX + 1]; 
    struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1]; 

    struct nlattr *nl_band; 

    int rem_band; 
    static int last_band = -1; 
    static bool band_had_freq = false; 

    nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); 

    if (tb_msg[NL80211_ATTR_WIPHY_BANDS]) { 

     // macro from libnl3/netlink/attr.h 
     nla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS], rem_band) { 
      if (last_band != nl_band->nla_type) { 
       cout << ("Band %d:", nl_band->nla_type) << endl; 
       band_had_freq = false; 
      } 
      last_band = nl_band->nla_type; 

      nla_parse(tb_band, 
         NL80211_BAND_ATTR_MAX, 
         nla_data(nl_band), 
         nla_len(nl_band), NULL); 

      if (tb_band[NL80211_BAND_ATTR_FREQS]) { 
       if (!band_had_freq) { 
        cout << "Frequencies:" << endl; 
        band_had_freq = true; 
       } 
      } 
     } 
    } 

    //nl_msg_dump(msg, stdout); 

    return NL_SKIP; 
} 
+1

:へ

for (pos = nla_data(nla), rem = nla_len(nla); \ 

から変更しました。 –

+1

引数の型が 'nlattr *'のときは 'void *'を使うことはできません。関数を呼び出す前に 'void *'を 'nlattr *'に明示的にキャストする必要があります。明示的なキャストを行うには、 'reinterpret_cast (arg)'を使用してください。 –

+0

エラーのある行を含むコードを投稿していないのはなぜですか? – Barmar

答えて

0

問題がg ++がnla_for_each_nestedマクロでコードをコンパイルすることができませんでしたvoid *からnlattr *への暗黙的な型変換によるものです。 libnlリストから

参照リンク:

http://lists.infradead.org/pipermail/libnl/2016-February/002096.html

修正nla_for_each_nestedマクロではnla_for_each_nestedマクロの型キャストを追加しました。エラーメッセージが実際に言って何_ _ "私は間違って何をしているのですか?"

for (pos = (struct nlattr *) nla_data(nla), rem = nla_len(nla); \ 
関連する問題