2

PRJをデバッグすると、次のエラーが発生します。

argsエラー:複数のエラーが報告されました。\ MIコマンドの実行に失敗しました:-var-create-

argsデバッガバックエンドからのエラーメッセージ:ジェネリックポインタを逆参照しようとしました。\変数オブジェクトを作成できません

void*argsからMapper*argにキャストするとエラーが発生します。

更新1

KMaster、KMapperは、それぞれMaster、Mapperを実装しますが、それらは何も追加しません。事実上、メソッドを呼び出すKMapperですwork()。コードは次のとおりです。

int main(){
    int np=1,K=4;
    string path="lucca.gps";
    KMaster* master=new KMaster(path,np,K);
    KMapper* mapper[np];
    master->splitting();
    for(int i=0;i<np;i++){
            mapper[i]=new KMapper(master,master->mData[i].key,master->mData[i].value);
            while(mapper[i]->work()!=0){
                cout<<"failed creating mapper, retry..."<<endl;
                sleep(1000);
            }
    }
}

int KMaster::splitting(){
    cout<<"start splitting"<<endl;
    fstream is(path.c_str());
    string s="";
    getline(is,s);
    while(!is.eof()){
        for(int i=0;i<nProc;i++){
            pair<double,double> res;
            is>>res.first;
            is>>res.second;
            is>>s;
            mapData[i].push_back(res);
            Data.push_back(res);
            if(is.eof()) break;
        }
    }        
    list<pair<double,double> >::iterator it=Data.begin();
    int increment=Data.size()/K;
    for(int i=0;i<K;i++){
        Klusters.push_back(*it);
        advance(it,increment);
    }
    for(int i=0;i<nProc;i++){
        mData[i].key=&Klusters;
        mData[i].value=&mapData[i];
    }
    cout<<"splitting completed"<<endl;
    return 0;
}

int Mapper::work(){
    Mapper* m=this;
    void* p=m;
    return pthread_create(&thread,NULL,start,p);
}

void* start(void* args){
    cout<<"start()"<<endl;
    Mapper* arg= reinterpret_cast<Mapper*>(args);
    arg->mapResult=arg->map(arg->k,arg->v);
    cout<<"Mapper finish, sending result..."<<endl;
    arg->send(arg->mapResult);
}

誰かが助けてくれることを願っています!

更新2

デバッガーのスクリーンショット:

Eclipseデバッグ

4

1 に答える 1

0

の値argは 24 で、通常のオブジェクトは存在しないため、キャストはこれとは何の関係もありません。

残念ながら、呼び出し元のコードを示していないため、この "答え" は当て推量にすぎません。

arg常に24 の場合、次のようなものを確認します。

class Something
{
public:
    void dostuff() { mapper.work(); }
private:
    // 24 bytes of "stuff" before this member (including possibly a vtable)
    Mapper mapper;
};

Something *thing = 0;
thing->dostuff(); // Thing->mapper will have address 24.

初期化されていない変数がある可能性もあります

Mapper* mapper;
mapper->work(); // Oops, uninitialised

たまたま24です。

于 2013-01-24T21:08:23.310 に答える