2015-10-31 1 views
1

Je suis nouveau en C++. Dans la méthode suivante, j'ai essayé d'imprimer sans retour. C'est très bien. Ce dont j'ai besoin, c'est que je dois retourner comme suit. (Besoin de lire le résultat avec cette boucle while). Je sais qu'une fois le retour nous ne pouvons pas revenir en arrière. Le problème est le résultat devrait être retourné dans toutes les itérations dès que le résultat est disponible. (similaire à un résultat de lecture de thread une fois qu'il est disponible alors que l'autre thread exécute cette boucle). Puis-je utiliser le rappel pour le résoudre?Comment revenir d'une fonction encore et encore en C++?

list<string>MyLogRetriever::handleEventsOnEventID(std::string logType, DWORD eventID) 
    { 
     while (GetAsyncKeyState(VK_ESCAPE) != true) 
     { 
      wstring wsLogType = stringToWidestring(logType); 
      LPCWSTR lpcwstrLogType = wsLogType.c_str(); 

      string string_query = ""; 
      string_query = string_query + "*[System/EventID= " + to_string(eventID) + "]"; 
      wstring wsCons = stringToWidestring(string_query); 
      LPCWSTR pwsQuery = wsCons.c_str(); 

      getEvents(lpcwstrLogType, pwsQuery, -1); 
      //printResultedEvent(myLogStructures, numberOfAvailableEvents); 
      return returnResultedEvent(myLogStructures, numberOfAvailableEvents); 
      numberOfAvailableEvents = 0; 
     } 
    } 
+0

Avez-vous vraiment besoin d'en retourner un à la fois, ou pouvez-vous obtenir tous les résultats et les retourner tous en même temps? La première option serait beaucoup plus facile si C++ avait des générateurs (comme 'yield' en Python et C#), ce qui ne se fait pas officiellement depuis un moment, bien que MSVC ait le support initial et que Clang travaille dessus. – chris

+0

@chris Je dois en retourner un à la fois. Le résultat n'est pas disponible à la fois. Puis-je utiliser le rappel pour le résoudre? – Veena

+0

Vous pourriez, si l'équilibre temps-effort-entretien est assez bon pour vous. – chris

Répondre

3

Ce que vous demandez est semblable à un generator:

En informatique, un générateur est une routine spéciale qui peut être utilisé pour contrôler le comportement d'itération d'une boucle. En fait, tous les générateurs sont des itérateurs. Un générateur est très similaire à une fonction qui retourne un tableau, en ce qu'un générateur a des paramètres, peut être appelé, et génère une séquence de valeurs. Cependant, au lieu de construire un tableau contenant toutes les valeurs et de les renvoyer toutes en même temps, un générateur fournit les valeurs une à la fois, ce qui nécessite moins de mémoire et permet à l'appelant de commencer immédiatement à traiter les premières valeurs.

Bien que cette fonctionnalité soit largement connue et supportée dans d'autres langages tels que Python, il n'y a pas encore de support officiel des générateurs en C++.

Pour contourner ce problème, vous pouvez utiliser une table et le faire passer comme argument à votre fonction et également ajouter chaque résultat et le retourner à chaque fois au lieu - vous pourriez écrire une classe avec une méthode next() pour obtenir le prochain résultat (crédits aller à Siyuan Ren pour ce).

+3

Ou écrivez une classe avec une méthode 'next()' pour obtenir le résultat suivant. –

+0

@ naltipar Je pense que next() ne convient pas. Parce que j'ai besoin de résultat immédiatement une fois qu'il est disponible. S'il vous plaît considérer la dernière édition – Veena

2

Il n'existe qu'une seule méthode pour retourner d'une méthode. Si vous souhaitez capturer plus d'informations, vous devez ajouter à un type de structure (par exemple, un tableau ou un autre objet couplex), et renvoyez-le à la place. Dans votre cas, vous devez le déclarer avant que votre boucle while soit exécutée, et l'utiliser dans la boucle. Ou vous pouvez appeler la méthode plusieurs fois avec des paramètres différents.

+0

Je dois en retourner un à la fois. Le résultat n'est pas disponible à la fois. Puis-je utiliser le rappel pour le résoudre? – Veena

+0

La réponse de naltipar est ce que vous voulez alors. L'idée est que vous devez encapsuler la méthode dans un objet afin qu'il puisse maintenir l'état de sorte que la prochaine fois que next() est appelée, elle retournera la suivante. Si vous ne l'encapsulez pas dans un objet, vous devrez utiliser une variante de ma solution. – ergonaut

1

Les fonctions sont mathématiquement des constructions qui effectuent un calcul et renvoient un résultat. La fonction se réfère généralement à une relation binaire, qui a un mappage unique pour chaque élément de son domaine (ensemble d'entrées) à son codomaine (ensemble de sorties). Maintenant, ces éléments peuvent être eux-mêmes agrégés.

Je ne suis pas un expert dans d'autres langages tels que Java ou Python, mais je suppose que cela vaut aussi pour eux. Selon votre cas d'utilisation, vous pouvez renvoyer un agrégat (vecteur, carte, ensemble, etc.) de la fonction en sortie.

+0

Je dois retourner un à la fois. Le résultat n'est pas disponible à la fois. Puis-je utiliser le rappel pour le résoudre? – Veena

+0

oui .. approche axée sur l'événement est une façon de le faire – basav