Когда я отлаживаю свой 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
Снимок экрана отладчика:
Значение 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.
Других решений пока нет …