1

私のC ++シミュレーションで配列を実装しようとしています(提供されたこのコーディングは、1つのネットワークパケットフィールドに2つの値を持つことです)

これは私の変数宣言です(ヘッダー内)

 Ptr<Name> m_names [2];

これは私の関数宣言です(ヘッダー内)

void SetName (unsigned which, Ptr<Name> name);
void SetName (unsigned which, const Name &name);

ソースファイルで

void Interest::SetName (unsigned which, Ptr<Name> name)
{
    if (which < 2)
    {
        m_names[which] = name;
    }
}

void Interest::SetName (unsigned which, const Name &name)
{
    if (which < 2)
    {
        m_names[which] = Create<Name> (name);
    }
}

これを呼び出す方法は次のとおりです(メインファイル内):

interest->SetName (0, nameWithSequence);
interest->SetName (1, nameWithNextSequence);

その結果、このようなエラーが発生します

src/ndnSIM/bindings/ns3module.cc: In function ‘PyObject* _wrap_PyNs3NdnData_SetName__0(PyNs3NdnData*, PyObject*, PyObject*, PyObject**)’:
src/ndnSIM/bindings/ns3module.cc:8418:62: error: no matching function for call to ‘ns3::ndn::Data::SetName(ns3::Ptr<ns3::ndn::Name>)’
src/ndnSIM/bindings/ns3module.cc:8418:62: note: candidates are:
./ns3/ndn-data.h:60:3: note: void ns3::ndn::Data::SetName(unsigned int, ns3::Ptr<ns3::ndn::Name>)
./ns3/ndn-data.h:60:3: note:   candidate expects 2 arguments, 1 provided

問題は、正しいステートメントを宣言する正しい方法は何かです。どんな種類の助けにも感謝します

編集私のC++コード(SetName)をバインドするためのpyhton定義のいくつかを見つけました

def __setattr__(self, name, value):
    if name == "_interest":
        return object.__setattr__ (self, name, value)

    elif name == "name":
        if value is None:
            return self._interest.SetName (ns.ndnSIM.ndn.Name ())
        elif isinstance (value, Name):
            return self._interest.SetName (value._name)
        elif isinstance (value, ns.ndnSIM.ndn.Name):
            return self._interest.SetName (value)
        elif isinstance (value, str):
            return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
        else:
            raise ValueError ("Invalid name parameter")

これを解決する正しい方法と方法は何ですか。ありがとう

4

2 に答える 2

0

わかりました.. 例を挙げましょう。のようPtrな動作を想定しています (少なくとも例として)。std::shared_pointerNamestd::string

まずstd::array、C スタイルの配列の代わりに使用することをお勧めします。しかし、それは本当に必要ではありません。2番。m_namesfidex サイズの配列にする予定がある場合は、存在しないメンバーにアクセスするときに例外をスローできます。

ここにいくつかのコードがあります。
ヘッダー (test.h):

#include <string>
#include <memory>
#include <array>

typedef std::shared_ptr<std::string> pString;

struct A{
protected:
    static constexpr size_t array_size = 2;
    std::array<pString, array_size> m_names;
    static void CheckRange(size_t);
public:
    void SetName(size_t id, const std::string& name);
    void SetName(size_t id, const pString& name);

    const std::string& GetName(size_t id) const;
    const pString& GetNamePtr(size_t id) const;
};

ソース:

#include "test.h"
#include <exception>

void A::SetName(size_t id, const pString &name){
    CheckRange(id);
    m_names[id] = name;
}

void A::SetName(size_t id, const std::string& name){
    CheckRange(id);
    m_names[id] = std::make_shared<std::string>(name);
}

const std::string& A::GetName(size_t id) const{
    CheckRange(id);
    if (!m_names[id])
            throw std::logic_error("Pointer is not initialized");
    return *(m_names[id].get());
}

const pString& A::GetNamePtr(size_t id) const {
    CheckRange(id);
    return m_names[id];
}

CheckRange関数の例を次に示します。

void A::CheckRange(size_t id){
    if (!(id < array_size))
            throw std::logic_error("ID should be < " +
              std::to_string(array_size));
}

このコードといくつかのテスト: http://ideone.com/rUvVhH

ヒント

if (m_names[id])m_names[id]が有効なポインタを含んでいるかどうかを調べます (たとえば、 not ) nullptr。似たような機能を持っていると思いPtrます。std::make_shared<T>(...)に似ていると思いますCreate<T>(...)

まあ、私にとっては、これは配列の内容を取得するための多かれ少なかれ正しい方法です :)
何かが複雑すぎる場合は、理解しやすくするようにします。
ご不明な点がございましたら、お気軽にお問い合わせください。

于 2014-01-22T07:40:21.843 に答える
0

エラーはコンパイル時の Python バインディング コードにあります。そう、

  1. (Python C API または boost::python を使用して) バインディング (ラッパー) コードを自分で作成した場合は、SetName バインディングを定義する場所を見つける必要があります。パラメーターがありません。

  2. 何らかのツール (SWIG や SIP など) によってバインディングが自動的に生成される場合、SetName バインディングが定義されている場所を見つける必要があります。これは、ラッパー ツールが生成するコードを特定するために使用するものです。間違いはその定義にあります。

投稿に追加した Python コードsetattrは、self._interest.SetName(obj) 呼び出しが間違っていることを明確に示しています。C++ は SetName が 2 つのパラメーターを取ることを示しています。setattrが何らかのツール (ns3?) によって生成される場合、 setattrが適切に呼び出されるように、SetName の適切な定義を与える方法を見つける必要があります。

于 2014-01-24T14:50:59.620 に答える