for_each Problem



  • Hoi.

    Ich habe ein kleines Problem.
    Ich versuche for_each mit meinem custom Inputiterator zu benutzen. Leider gibt es nur einen Durchgang:

    for_each(Process::iterator(0), Process::iterator(), [&](PROCESSENTRY32W proc)
    {
      .......
    });
    

    Löse ich es über eine normale for-Schleife, dann klappt es korrekt:

    for(Process::iterator it(0); it != Process::iterator(); ++it)
    {
      .......
    }
    

    Was mich etwas verwirrt, schließlich ist std::for_each mit der selben Logik geschrieben:

    template<class _InIt,
    	class _Fn1> inline
    	_Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    	{	// perform function for each element
    	for (; _First != _Last; ++_First)
    		_Func(*_First);
    	return (_Func);
    	}
    

    Kann mir jemand auf die Sprünge helfden?
    Danke! 😉




  • Mod

    Dasgehtwohlwas schrieb:

    for_each(Process::iterator(0), Process::iterator(), [&](PROCESSENTRY32W proc)
    {
      .......
    });
    

    edit: Vergiss, was hier stand.

    edit: Ach, das ist ein Lambdaausdruck. Dann sieht es eigentlich richtig aus. Zeig mal ein compilierbares Beispiel.



  • Komische Parameter hast du da...
    

    Naja, ich musste ein bischen hacken da der Iterator über Datenmengen mit unbekannter Größe iteriert. Von daher erzeugt der Default-Constructor einen ungültigen iterator und beim Vergleichen wird jediglich die Gültigkeit verglichen um zu wissen ob der echte Iterator noch gültig ist.

    Zeig mal ein compilierbares Beispiel.
    

    Mit einem Vektor zb klappt es ja, das irritiert mich 😕
    Deswegen ist der Haken wohl bei meinem Iterator zu suchen.

    Ich komme nicht darauf, warum es mit einer normalen for-Schleife klappt aber mit for_each nicht, obwohl es doch eigentlich identisch funktioniert 😕



  • Ich habe etwas rumprobiert.

    Zu allererst der komplette Sourcecode (Bin gerade dabei Kommentierten Beispielscode für meine Library zu schreiben :> ):

    //C++ header files:
    #include <algorithm>
    #include <iostream>
    
    //Synthetic header files:
    #include <Synthetic.hpp>
    
    using namespace std;
    using namespace Synthetic;
    
    int main(int, char**)
    {
    	//Almost all Synthetic functions throw exceptions in case of error
    	try
    	{
    		// Start iterating processes.
    		// A iterator constructed with an id of zero means that we don't want to
    		// target a specific process.
    		// The second iterator constructed with the default constructor is invalid,
    		// what we want to be able to use std::for_each
    		// We use C++0x lamba-feature instead of creating a custom functor
    		Process::iterator first(0), last();
    		for_each(first, last, [&](PROCESSENTRY32W proc)
    		{
    			//I imitate the original examples output
    			wcout << L"\n\n=====================================================";
    			wcout << L"\nPROCESS NAME: " << proc.szExeFile;
    			wcout << L"\n-----------------------------------------------------";
    
    			//Print information about the process
    			wcout << L"\n  Process ID        = 0x"	<< hex << proc.th32ProcessID;
    			wcout << L"\n  Thread count      = "	<< dec << proc.cntThreads;
    			wcout << L"\n  Parent process ID = 0x"	<< hex << proc.th32ParentProcessID;
    			wcout << L"\n  Priority base     = "	<< dec << proc.pcPriClassBase;
    		});
    	}
    	catch(const exception& e) //Synthetic's exceptions inherit from std::exception
    	{
    		//Output a formatted error message
    		cout << e.what();
    	}
    
    	return 0;
    }
    

    Das gibt beim Kompilieren folgenden Fehler:

    1>x\main.cpp(36): error C2782: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : template parameter '_InIt' is ambiguous
    1> x\include\algorithm(28) : see declaration of 'std::for_each'
    1> could be 'Synthetic::Process::iterator (__cdecl *)(void)'
    1> or 'Synthetic::Process::iterator'
    1>x\main.cpp(36): error C2784: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : could not deduce template argument for '_InIt' from 'Synthetic::Process::iterator'
    1> x\include\algorithm(28) : see declaration of 'std::for_each'
    1>

    Sind das für den Compiler echt 2 unterschiedliche Typen, nur weil sie mit unterschiedlichen Constructor konstruiert werden?

    oO

    Grüße,
    Flo 😉



  • Process::iterator first(0), last();
    

    first ist ein Objekt, last ist eine Funktionsdeklaration. Lass die Klammern bei last weg, dann ist es auch ein Objekt.

    Zum Unterschied zwischen deiner for -Schleife und for_each :
    Was mir spontan auffällt, bei deiner Schleife rufst du regelmässig Process::iterator() auf. Bei der for_each Funktion dagegen, wird sie nur einmal aufgerufen und der Iterator, bzw. alle Iteratoren, werden kopiert.

    Setz mal deine Suche an diesen Punkten an.

    Grüssli


Log in to reply