-1

私のコードは、ここに置くには非常に複雑です。マップ操作の実行方法を説明しようと思います。

接続.h

struct mAttributeTable_Compare
{
bool operator()(char* s1, char* s2) const
{
    return (strcmp(s1,s2) < 0);
}
};
typedef struct
{
  map<Char*, Attribute*, mAttributeTable_Compare> mAttributeTable_API;
  map<Char*, Attribute*, mAttributeTable_Compare>::iterator iter_API;      

} Connection_vars;
class Attribute
{
    protected:
           Attribute(char*);

    public:
        Void            AddValue(Char* value);
        Char*           GetName();
        Char*           GetValue(Int index = 0); 

    private:
        Char*   mName;
        vector<Char*>   mValues;      
        Int     mType;
        Int     mCount;
};
class Connection
{
   public:
    Connection();
   Protected:
    Void  ProcessAttribute(int,Attribute*);
   private:
    map<Char*, Attribute*, mAttributeTable_Compare> mAttributeTable;
    map<Char*, Attribute*, mAttributeTable_Compare>::iterator iter;      
    void *mConnVars;
};

接続.cpp

#include "connection.h"
Connection()
{
    mConnVars = (Connection_vars *)calloc(1, sizeof(Connection_vars));  
    if(!mConnVars)                                                      
    {                                                                   
      return;                                                           
    }                                                                   

}
Void Connection::ProcessAttribute(int attrName, Attribute* attribute )
{
 Attribute* attr_API;
 Connection_vars *my_ConnectionVars = (Connection_vars *)mConnVars;
 if ( attrName == 10 )
 {
  attr_API = new Attribute("TraceOutput");
  Char* fileName = (Char*)attribute->GetValue(0);
  attr_API->AddValue(filename);

  /* this map variable insert operation is working*/ 
  mAttributeTable.insert(pair<Char*, Attribute*>(attr_API->GetName(), attr_API);

  /* But the below operation is returning a SEGMENTATION FAULT*/
  (my_ConnectionVars ->mAttributeTable_API).insert(pair<Char*, Attribute*>(attr_API->GetName(), attr_API);


}
Attribute::Attribute(Char* name)
{ 
    mName = strdup(name);
    mType = 0; 
    mCount = 0;
}

Char* Attribute::GetName()
{
    return mName;
}

Char* Attribute::GetValue(Int index)                        
{
    if (index >= 0 && index < (Int)mValues.size())
        return mValues[index];
    else
        return NULL;
}
Void Attribute::AddValue(Char* value)
{
    Char* temp = (Char*)strdup(value);              

    mValues.push_back(temp);
    mCount++;
}

上記の ProcessAttribute() 内では、ヘッダーから構造体 (Connection_vars) で宣言されたマップ コンテナー (mAttributeTable_API) に挿入できず、SEGMENTATION FAULT を取得できませんでした。クラス内のプライベート変数(接続)。私が間違っている理由を見つけることができません。これを修正するのを手伝ってください。どんな親切な助けも大歓迎です!

前もって感謝します!

4

2 に答える 2

0

次の行だと思います:

mConnVars = (Connection_vars *)calloc(1, sizeof(Connection_vars));

Connection_vars 構造体内の std::maps を正しく初期化しません。メモリを割り当ててゼロで初期化するだけです。

上記の行を次のように置き換えると役立つ場合があります。

mConnVars = new Connection_vars;
于 2013-06-25T06:17:49.603 に答える
0

上記の ProcessAttribute() 内で、マップ コンテナー (mAttributeTable_API) に挿入できません。

'Void' は型を指定しません。

それを出荷!

于 2013-06-25T06:13:54.040 に答える