Egtl was simples, aber es will mir nicht in den Kopf....[UPDATED]



  • Hallo!

    Ich habe folgendes Problem (minimal Beispiel):

    // myFunc nimmt einen Pointer auf ObjA und gibt Pointer auf ObjB zurück
    ObjB * myFunc(ObjA * o) {
        // irgendwas kommt hier noch...
        return &(stdVector->at(o->nr()));
    }
    
    // meine Hauptfunktion
    void function main() {
        ObjA * o1 = &(myObjVector->at(0));  // o1 ist also pointer, und zeigt auf das object im std:vector an stelle 0.
        ObjB * o2 = myFunc(o1);            // nun übergebe ich an myFunc o1 (ist ja Pointer auf ObjA) und das sollte dann o2 zugewisen werden.
    }
    

    Der compiler beschwert sich nun, dass es keine Funktion gäbe, auf die der Aufruf

    myFunc(ObjA*&)
    

    passt. Aber das mache ich doch auch nicht. Ich übergebe ja nicht ObjA& sondern eben nur ObjA*. Und das passt zur signatur von myFunc. Und wenn ich den Umweg über den Pointer nicht mache, sondern direkt

    myFunc(&(myObjVector->at(0)));
    

    dann geht es ja auch...Übergibt C++ pointer vllt grundsätzlich als Referenz und hängt darum das & dran?

    Wer weiß rat? 😞



  • main sollte int zurückgeben, nicht void.
    Versuch es mal in das hier zu ändern

    ObjB& myFunc(ObjA& o)
    
    ObjA* o1 = myObjVector->at(0);
    

  • Mod

    Das sollte eigentlich richtig sein. Wenn ich deinen (unvollständigen) Code zu etwas compilierbarem ergänze, funktioniert es auch:

    class ObjB{};
    class ObjA{};
    
    ObjB *globalObjBPointer;  // Bloß zum Testen
    ObjA globalObjA;
    
    ObjB * myFunc(ObjA * o) {
        return globalObjBPointer;
    }
    
    void function() {
        ObjA * o1 = &(globalObjA); 
        ObjB * o2 = myFunc(o1);    
    }
    

    Kannst du bitte ein minimales Beispiel bringen, dass den Fehler reproduziert? Und die genaue Fehlermeldung?



  • void function main() {
    

    was ist denn "function"?



  • Mr X schrieb:

    void function main() {
    

    was ist denn "function"?

    evtl ein

    #define function
    

    vllt hats ihm so besser gefallen 😃



  • Hm, ok, also erstmal danke soweit.

    Was ist denn function?

    void function main() {
    

    Wollte die funktion erst function1 nennen...hab mich dann spontan umentschieden. 🙂

    Ok, ich glaube mein Beispiel ist irgendwie schlecht. Hier einfach mal den Code:

    MTAPFTau * pk01Analysis::bestMatch(MTAGenTau * gt, MTAPFTaus * pftaus, std::set<unsigned int> * blacklist,  double threshold) {
    	double phi1 = gt->p4.phi();
    	double eta1 = gt->p4.eta();
    	double dPhi;
    	double dEta;
    	double tmp;
    
    	double min 		= -1;
    	int    id2use	= -1;
    
    	threshold *= threshold; 			
    
    	for (unsigned int i = 0; i < pftaus->size(); i++) {
    		dPhi = phi1 - (pftaus->at(i)).p4.phi();
    		dEta = eta1 - (pftaus->at(i)).p4.eta();
    		tmp = dPhi * dPhi + dEta * dEta;
    		if ( (tmp < min) && (tmp < threshold) && (blacklist->find(i) == blacklist->end()) ) {
    			// ok, this one is closer to threshold.
    			min = tmp;
    			id2use = i;
    		}
    	}
    
    	if (id2use >= 0) {
    		blacklist->insert(id2use);
    		return &(pftaus->at(id2use));	
    	} else {
    		return NULL;
    	}
    }
    
    void pk01Analysis::processEvent(MTAPFTaus * pftaus, MTAGenTaus * gentaus) {
    	if (debug)
    		std::cout << "processEvent\n";
    
    	// We should exit, if we do not have 2 GenTaus, and less than 2 Reco Taus
    	if ( (pftaus->size() < 2) || (gentaus->size() != 2) ) {
    		if (debug)
    			std::cout << "Dropping Event: Not enough GEN/RECO taus or tau count does not match [" << gentaus->size() << "/" << pftaus->size() << "].\n";
    	} else {
    		MTAGenTau* gt1 = &(gentaus->at(0));	
    		MTAGenTau* gt2 = &(gentaus->at(1));
    
    		std::set<unsigned int> blacklist;
    		MTAPFTau* rt1; // = bestMatch(gt1, pftaus, blacklist);
    		MTAPFTau* rt2; // = bestMatch(gt1, pftaus, blacklist);
    
    		rt1 = bestMatch(gt1, pftaus, blacklist, 2.0); // Hier gibts den Fehler!!
    
    		if ( rt1 && rt2 ) {
    			// rt[1,2] = best Reco Taus matching the GEN Taus
    			// we can do some magic here...
    
    		} else {
    			if (debug)
    				std::cout << "Dropping Event: Can not match two jets with GENTaus.\n";
    		}
    	}
    
    	if (debug)
    		std::cout << "end of processEvent\n";
    }
    

    Die genaue Fehlermeldung:

    g++ -O3 -fPIC -DPIC -ansi -Wall -Woverloaded-virtual -Wno-non-virtual-dtor -D_GNU_SOURCE -pthread -m32 -I/wlcg/sw/cms/slc4_ia32_gcc345/lcg/root/5.22.00d-cms4/include -I /storage/6/krauss/CMSSW_3_3_6/src/ -I /wlcg/sw/cms/slc4_ia32_gcc345/cms/cmssw/CMSSW_3_3_6/src/ -I ../../  -c modules/pk01Analysis.cc -o modules/pk01Analysis.o
    modules/pk01Analysis.cc: In member function `void pk01Analysis::processEvent(MTAPFTaus*, MTAGenTaus*)':
    modules/pk01Analysis.cc:58: error: no matching function for call to `pk01Analysis::bestMatch(MTAGenTau*&, MTAPFTaus*&, std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> >&, double)'
    modules/pk01Analysis.cc:10: note: candidates are: MTAPFTau* pk01Analysis::bestMatch(MTAGenTau*, MTAPFTaus*, std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> >*, double)
    modules/pk01Analysis.cc:52: warning: unused variable 'gt2'
    make: *** [modules/pk01Analysis.o] Error 1
    


  • Was ist MTAGenTaus?
    Was liefert MTAGenTaus::at()?



  • MTAGenTaus ist einfach ein std::vector<MTAGenTau>
    ->at() liefert also einen MTAGenTau (soweit ich das verstehe). Oder liefert es etwas nur einen Pointer? oO?

    #ifndef MTAGenTau_h
    #define MTAGenTau_h
    
    #include "MTALorentzVector.h"
    #include "MTALepton.h"
    
    class MTAGenTau : public MTALepton
    {
    public:
    	MTAGenTau() : MTALepton(15), decayMode(0) {};
    	MTAGenTau(MTAXYZELorentzVector temp_vec) : MTALepton(temp_vec,15) {};
    
    	MTALorentzVector p4_vis;		// momenta of visible particles
    	int status;
    	unsigned int decayMode;
    	//  0 - undefined
    	//	1 - electron
    	//	2 - muon
    	// >2 - hadronic
    	// most significant bit (1<<15):
    	//		0 = tau
    	//		1 = descendant of a tau
    };
    
    typedef std::vector<MTAGenTau> MTAGenTaus;
    #endif
    

  • Mod

    Dein Fehler ist ganz einfach:
    Deine Funktion erwartet blacklist als Pointer, du übergibst sie aber direkt.



  • SeppJ schrieb:

    Dein Fehler ist ganz einfach:
    Deine Funktion erwartet blacklist als Pointer, du übergibst sie aber direkt.

    OMG, du hast recht! Klar....Mensch und ich suche mich hier stundenlang zu Tode.
    Viele, vielen Dank 🙂

    (Topic kann geschlossen werden ^^)


Anmelden zum Antworten