none
le bon emploi des délégués RRS feed

  • Question

  • Pour pouvoir utilise la fonction Find des methodes de la List pour le code managé voire ci_dessous

    j'ai besoin d'utiliser un predicat délégué.

    J'ai donc ecrit:

    public delegate bool System::Predicate( enPOSM);

    et le compilateur me répond

    >..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C3756: 'System::Predicate' : conflits de définitions de délégués avec un symbole existant
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2063: 'System::Predicate' : n'est pas une fonction

    ou trouver un exemple de prédicat délégué?


    Jean Noël Martin

    vendredi 3 janvier 2014 17:59

Réponses

  • IndexOf renvoie un entier

    J'ai donc choisi de procéder en deux temps: l'IndexOf (il retourne -1 quand il n'a rien trouve, sans cela il donne un index) dans le premier temps et le retour true ou false dans le second temps; Ça évite un warning et c'est plus clair Actuellement malgré une deuxième lecture je n'ai pas trouvé la règle pour typer un prédicat.

    J'ai simplifié le code du prédicat, mais je n'arrive toujours pas à le compiler: Je donne mon code:

    	System::Predicate<int>^ CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var)
    	{
    		int nPosWord;
    		nPosWord = ListPos->IndexOf( var);
    		return( nPosWord);
    	};

    et les messages d'erreurs du compilateur

    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(332): error C2440: 'return' : impossible de convertir de 'int' en 'System::Predicate<T> ^'
    1>          with
    1>          [
    1>              T=int
    1>          ]
    1>          Aucun opérateur de conversion défini par l'utilisateur disponible, ou
    1>          Il n'existe pas de conversion standard de la forme boxed du type arithmétique en type cible
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(344): error C2440: '<function-style-cast>' : impossible de convertir de 'System::Predicate<T> ^' en 'System::Predicate<T>'
    1>          with
    1>          [
    1>              T=int
    1>          ]
    1>          Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë

    Je suis toujours à la recherche de la bonne syntaxe.


    Jean Noël Martin

    finalement la bonne réponse était donné par Paul dans l'autre thread Mais comme celui si est verrouillé je ne peux pas le mettre à résolu



    • Marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 02:56
    • Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:42
    • Marqué comme réponse JeanNoel53 vendredi 10 janvier 2014 09:51
    • Modifié JeanNoel53 vendredi 10 janvier 2014 09:53
    mercredi 8 janvier 2014 02:56

Toutes les réponses

  • Dans la référence que vous avez vous même donné.

    Ne confondez pas la déclaration d'une méthode/fonction et la déclaration d'un delegate (qui est plus un pointeur de fonction qu'une fonction) inline.


    Paul Bacelar, Ex - MVP VC++

    samedi 4 janvier 2014 00:18
    Modérateur
  • J'ai essayé de coder le corps d'un délégué et je n'ai pas eu de succes

    je vous donne mon code et le message du compilateur

    public delegate bool System::Predicate( enPOSM var)
    {
    	List<enPOSM^>::Enumerator itPOS;
    	itPOS->GetEnumerator();
    	while( itPOS.MoveNext() == true)
    	{
    		if(itPOS.Current == var)
    			return(true);
    	}
    	return(false)
    };

    le compilateur me dit que je n'ai pas une liste de paramètre correct. Quel est donc la liste de paramètre générique qu'il demande?
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'


    Jean Noël Martin


    • Modifié JeanNoel53 dimanche 5 janvier 2014 21:13
    samedi 4 janvier 2014 02:17
  • MAGNIFIQUE :-(((

    Les paramètres génériques sont ceux de la classe Syste::Prédicate que vous essayez de, en faite je vois pas, et le compilateur non plus.

    C'est quoi ce delegate dans la définition d'une méthode ???

    La méthode Predicate de la classe System ??? WTF

    Et tout ça pour faire la même chose que la méthode statique "Contains" de la Classe Enumerable :

    if(Enumerable.Contains(listeALaCon,VariableALaCon)){...};

    MAGNIFIQUE :-(((


    Paul Bacelar, Ex - MVP VC++

    lundi 6 janvier 2014 11:20
    Modérateur
  • ET comment faire?

    Jean Noël Martin

    lundi 6 janvier 2014 18:57
  • if(Enumerable.Contains(listeALaCon,VariableALaCon)){...};

    Vous avez juste à donner votre nom de liste (un IEnumerable) et de la variable à trouver à la place des noms fantaisistes (à la con).


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mardi 7 janvier 2014 02:03
    • Non marqué comme réponse JeanNoel53 mardi 7 janvier 2014 02:12
    mardi 7 janvier 2014 00:17
    Modérateur
  • j'ai donc essayé

    nPosWord = m_ListPosNoun.Find( System::Collections::IEnumerable.Contains( m_ListPosNoun, pWord->POS));

    et j'ai le résultat:

    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): warning C4832: jeton '.' non conforme après UDT 'System::Collections::IEnumerable'
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Collections::IEnumerable'
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): error C2275: 'System::Collections::IEnumerable' : utilisation non conforme de ce type comme expression
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): error C2228: la partie gauche de '.Contains' doit avoir un class/struct/union
    


    Jean Noël Martin

    mardi 7 janvier 2014 02:26
  • nPosWord = m_ListPosNoun->IndexOf(pWord->POS)

    Exemple d'utilisation de prédicat :

    #include "stdafx.h"
    using namespace System;
    using namespace System::Collections::Generic;
    bool FindString(String^ s)
    {
    	return s=="Mamenchisaurus";
    }
    private ref class StringPredicate{
    	String^ SearchTerm;
    public:
    	StringPredicate(String^ SearchTermIn){
    		SearchTerm = SearchTermIn;
    	}
    	bool Matched(String^ s){
    		return s == SearchTerm;
    	}
    };
    int main(array<System::String ^> ^args)
    {
    	List<String^>^ dinosaurs = gcnew List<String^>();
        Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity);
        dinosaurs->Add("Tyrannosaurus");
        dinosaurs->Add("Amargasaurus");
        dinosaurs->Add("Mamenchisaurus");
        dinosaurs->Add("Deinonychus");
        dinosaurs->Add("Compsognathus");
        Console::WriteLine();
        for each(String^ dinosaur in dinosaurs )
        {
            Console::WriteLine(dinosaur);
        }
    	int titi = dinosaurs->IndexOf("Tyrannosaurus");
    	int tutu = dinosaurs->IndexOf("++Tyrannosaurus");
    	Console::WriteLine(titi);
    	Console::WriteLine(tutu);
    	String^ toto = dinosaurs->Find(gcnew Predicate<String^>(FindString));
    	Console::WriteLine(toto);
    	StringPredicate^ findString = gcnew StringPredicate("Amargasaurus");
    	String^ tyty = dinosaurs->Find(gcnew Predicate<String^>(findString, &StringPredicate::Matched));
    	Console::WriteLine(tyty);
        return 0;
    }


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mardi 7 janvier 2014 10:50
    • Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:41
    mardi 7 janvier 2014 09:47
    Modérateur
  • J'ai donc codé

            bool CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var)
    	{
    		int nPosWord;
    		nPosWord = ListPos->IndexOf( var);
    		if( nPosWord > 0)
    			return( true);
    		else
    			return( false);
    	};

    et l'appel du Find

    nPosWord = m_ListPosNoun->Find( gcnew( IsPos( m_ListPosNoun, pWord->POS)));


    Jean Noël Martin

    mardi 7 janvier 2014 11:51
  • Votre code est incompréhensible.

    nPosWord, c'est quoi ? Un indice "int" retourné par IndoxOf ou un enPOSM ?


    Paul Bacelar, Ex - MVP VC++

    mardi 7 janvier 2014 13:01
    Modérateur
  • IndexOf renvoie un entier

    J'ai donc choisi de procéder en deux temps: l'IndexOf (il retourne -1 quand il n'a rien trouve, sans cela il donne un index) dans le premier temps et le retour true ou false dans le second temps; Ça évite un warning et c'est plus clair Actuellement malgré une deuxième lecture je n'ai pas trouvé la règle pour typer un prédicat.

    J'ai simplifié le code du prédicat, mais je n'arrive toujours pas à le compiler: Je donne mon code:

    	System::Predicate<int>^ CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var)
    	{
    		int nPosWord;
    		nPosWord = ListPos->IndexOf( var);
    		return( nPosWord);
    	};

    et les messages d'erreurs du compilateur

    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(332): error C2440: 'return' : impossible de convertir de 'int' en 'System::Predicate<T> ^'
    1>          with
    1>          [
    1>              T=int
    1>          ]
    1>          Aucun opérateur de conversion défini par l'utilisateur disponible, ou
    1>          Il n'existe pas de conversion standard de la forme boxed du type arithmétique en type cible
    1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(344): error C2440: '<function-style-cast>' : impossible de convertir de 'System::Predicate<T> ^' en 'System::Predicate<T>'
    1>          with
    1>          [
    1>              T=int
    1>          ]
    1>          Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë

    Je suis toujours à la recherche de la bonne syntaxe.


    Jean Noël Martin

    finalement la bonne réponse était donné par Paul dans l'autre thread Mais comme celui si est verrouillé je ne peux pas le mettre à résolu



    • Marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 02:56
    • Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:42
    • Marqué comme réponse JeanNoel53 vendredi 10 janvier 2014 09:51
    • Modifié JeanNoel53 vendredi 10 janvier 2014 09:53
    mercredi 8 janvier 2014 02:56