Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::optional ne fonctionne pas

Sujet résolu
Anonyme
    17 août 2021 à 18:57:44

    struct QueueFamilyIndices {
    	std::optional<uint32_t> graphicsFamily;
    
    	bool isComplete() {
    		return graphicsFamily.has_value();
    	}
    };

    Bonjour, je ne comprends pas pourquoi ça ne fonctionne pas, sachant que c'est mots pour mots ce que je dois écrire d'après le tuto Vulkan... HELP

    int i = 0;
    		for (const auto& queueFamily : queueFamilies) {
    			if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
    				indices.graphicsFamily = i;
    			}
    
    			i++;
    		}



    Cordialement

    -
    Edité par Anonyme 19 août 2021 à 18:27:34

    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2021 à 19:08:22

      Salut !

      Qu'est-ce qui ne fonctionne pas ?

      • Partager sur Facebook
      • Partager sur Twitter

      Si vous ne trouvez plus rien, cherchez autre chose.

        18 août 2021 à 0:02:30

        Erreur de compilation ? Erreur à l'exécution ?

        Je te repose la question : Qu'est-ce qui ne fonctionne pas ?

        Si tu ne donnes pas plus de détails sur les problèmes rencontrés, on ne pourra pas t'aider

        • Partager sur Facebook
        • Partager sur Twitter

        Si vous ne trouvez plus rien, cherchez autre chose.

          18 août 2021 à 8:33:00

          Alors déjà bonjour, s'il vous plait, merci tout ça tout ça ...

          Il n'y a pas pire façon de poser une question que de balancer un code sans contexte et de juste dire "ça marche pas"

          Les gens ont besoin de savoir si ton code compile, si il crash ou si il produit un résultat différent de celui que tu attends, quel est le message d'erreur si jamais ça compile pas

          Si ça compile, un peu de contexte stp => Un lien vers le tuto Vulkan que tu es en train de suivre ? Une explication de ce que tu essayes de faire globalement ? Une explication de ce que tu essayes de faire avec cette fonction précise ? Quel est le résultat attendu ? Quel est le résultat qui tu obtiens à la place ?

          Ca fait beaucoup de question et les intervenants peuvent pas deviner les réponses 

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            18 août 2021 à 21:50:28

            J'avais pourtant envoyé l'erreur que j'avais :/ L'image n'a pas été prise on dirait. (d'où l'image avec la silhouette blanche en bas de mon message)

            Donc le problème est le suivant : je dois utiliser <optional>. Jusqu'ici je comprends et donc j'applique. Mais lorsque je l'écris (std::optional<uint32_t> graphicsFamily;) la liste d'erreurs m'affiche :

            "Cette déclaration n'a pas de classe de stockage ou de spécificateur de type"

            Pourtant j'ai écrit la même chose que sur le tuto Vulkan (sur le site officiel !). Lien ici

            Cordialement.

            -
            Edité par Anonyme 18 août 2021 à 21:58:36

            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2021 à 23:18:34

              Est-ce que le compilateur et les options de compilations sont-ils compatibles avec l'utilisation de cette "nouvelle" fonctionnalité ?
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              Anonyme
                19 août 2021 à 2:55:43

                @bacelar, il me semble que oui.

                Comment puis-je le vérifier et en être ainsi sûr ? 

                • Partager sur Facebook
                • Partager sur Twitter
                  19 août 2021 à 8:31:00

                  std::optional est apparu avec C++17, il faut donc vérifier que le compilateur est réglé en C++17 et pas avec une version précédente

                  Comment le vérifier, ça dépend de ton IDE, c'est quelque part dans les réglages 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 août 2021 à 12:04:47

                    Tu peux mettre a liste d'erreurs complète ? (le problème peut venir de std::optional, ou de uint32_t)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Si vous ne trouvez plus rien, cherchez autre chose.

                      19 août 2021 à 12:13:25

                      Quand on n'arrive pas à faire marcher un truc qu'on ne connait pas dans un projet en cours, il faut rétropedaler, et essayer de le faire marcher tout seul. Ca évite de combiner les problèmes.

                      Donc faire un exemple minimal avec un optionnel

                      #include <iostream>
                      #include <optional>
                      
                      int main() {
                          std::optional<std::string> opt{"foo"};
                          std::cout << opt.value() <<  std::endl;
                      }
                      

                      compilons (ici avec g++ 10)

                      $ g++ opt.cc
                      opt.cc: In function ‘int main()’:
                      opt.cc:5:10: error: ‘optional’ is not a member of ‘std’
                          5 |     std::optional<std::string> opt{"foo"};
                            |          ^~~~~~~~
                      opt.cc:5:10: note: ‘std::optional’ is only available from C++17 onwards
                      opt.cc:5:30: error: expected primary-expression before ‘>’ token
                          5 |     std::optional<std::string> opt{"foo"};
                            |                              ^
                      opt.cc:5:32: error: ‘opt’ was not declared in this scope
                          5 |     std::optional<std::string> opt{"foo"};
                            |                       


                      Constatation : ça compile pas. optional not a member of std.

                      Mais bon, il y a une indication 

                      only available from C++17 onwards

                       C'est à dire, disponible seulement à partir de C++17. Donc, compilons avec la bonne option

                      $ g++ -std=c++17 opt.cc
                      $

                      et puis là, ça marche

                      $ ./a.out 
                      foo
                      



                      -
                      Edité par michelbillaud 19 août 2021 à 12:21:26

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        19 août 2021 à 15:59:14

                        Je suis en C++17, j'ai vérifié dans les réglages car je pensais aussi que c'était un problème de version. Et j'étais en effet en C++14 (sauf que je l'avais changé avant qu'on m'en donne l'idée via ce forum) mais toujours la même erreur. Je suis sur Visual Studio 2019 d'ailleurs.

                        Voici la liste des erreurs :

                        Erreur 'graphicsFamily' n'est pas membre de 'MyEngine::QueueFamilyIndices'     // Normal

                        Erreur 'graphicsFamily' n'est pas membre de 'MyEngine::QueueFamilyIndices'     // Normal

                        Erreur 'graphicsFamily' : identificateur non déclaré  // Normal

                        Erreur 'optional' n'est pas membre de 'std'  // Mon problème

                        Erreur Spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut  // Explication ?

                        Erreur (active) Cette déclaration n'a pas de classe de stockage ou de spécificateur de type  // Mon problème

                        Erreur (active) Identificateur "graphicsFamily" non défini  // Normal

                        Erreur (active) Namespace "std" n'a pas de membre "optional"  // Mon problème

                        Voici les paramètres généraux (si ça fonctionne cette fois-ci) : 

                        paramètres généraux

                        Et aussi le code qui bloque (je le remets ici) :

                        La structure dans le .hpp

                        struct QueueFamilyIndices {
                        		std::optional<uint32_t> graphicsFamily;
                        
                        		bool isComplete() {
                        			return graphicsFamily.has_value();
                        		}
                        	};

                        Le code dans le .cpp

                        //PHYSICAL DEVICE / QUEUE FAMILIES
                        	bool HelloTriangleApp::isDeviceSuitable(VkPhysicalDevice device) {
                        		QueueFamilyIndices indices = findQueueFamilies(device);
                        
                        		return indices.graphicsFamily.has_value();
                        	}
                        
                        //QUEUE FAMILIES !!!
                        
                        	QueueFamilyIndices HelloTriangleApp::findQueueFamilies(VkPhysicalDevice device) {
                        		QueueFamilyIndices indices;
                        
                        		uint32_t queueFamilyCount = 0;
                        		vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
                        
                        		std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
                        		vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
                        
                        		int i = 0;
                        		for (const auto& queueFamily : queueFamilies) {
                        			if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
                        				indices.graphicsFamily = i;
                        			}
                        
                        			i++;
                        		}
                        
                        		
                        
                        		return indices;
                        	}

                        -
                        Edité par Anonyme 19 août 2021 à 16:05:10

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 août 2021 à 16:09:04

                          Est-ce que tu as inclus l'entête qui va avec?
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Eug

                            19 août 2021 à 16:20:27

                            On peut jouer aux devinettes très longtemps si on n'a pas une vue sur le code.

                            Y a pas de

                            #include <optional>

                            Forcément ça gêne. "Normal".

                            -
                            Edité par michelbillaud 19 août 2021 à 16:23:36

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              19 août 2021 à 17:01:08

                              Le <optional> y est ! Je l'ai dit dans mon deuxième message, et je dis "Normal" car c'est à cause d'une réaction en chaine donc si un truc déconne, le reste va déconner aussi, donc la source du problème est le std::optional qui, de mon côté, ne fonctionne pas. Et je ne trouve malheureusement pas la source de ce problème. Une fois ce dernier trouvé, les attributs non définis et non déclarés seront enfin définis et déclaré. Voilà pourquoi le " // Normal " !

                              Donc...

                              1 - J'ai mis l'entête " #include <optional> " dans le .hpp

                              2- Dans mes paramètres je suis en C++17 (voir image plus haut)

                              3 - J'ai écrit la même chose que le tuto que je suis sur le site officiel de Vulkan (à part que j'ai fait  un .hpp et un .cpp)

                              Info en + : Je suis sur VS2019

                              Ainsi, quel pourrait être ce fameux problème s'il-vous-plait sachant que la source du problème est le " std::optional " ?

                              Cordialement

                              PS : Si quelqu'un pouvait m'expliquer l'erreur sur le int par défaut du C++ (où j'ai mis " // Explication ? "), vous seriez bien aimable !! :D

                              -
                              Edité par Anonyme 19 août 2021 à 17:01:46

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 août 2021 à 18:08:14

                                As tu essayé sur le petit exemple que j'ai fourni ?

                                Ça permettrait de déterminer si ta configuration permet d'utiliser les optionals ou pas, au lieu de yoyoter d'un problème à l'autre.

                                Ps y a pas d'include du hpp.

                                Ca peut durer, tant qu'on ne voit que des fragments. En fait c'est une situation fréquente ici, quelqu'un vient avec un  probleme et ne fournit pas tous les éléments, préférant accuser le langage, l'ordinateur, le compilateur, le système etc plutôt que de montrer son code, parce que t'inquiète frère pas besoin  y marche j'te jure. Si il marchait si bien, y aurait pas de problème.  La psychologie de la programmation, toute une histoire.

                                -
                                Edité par michelbillaud 19 août 2021 à 18:13:46

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  19 août 2021 à 18:16:39

                                  Pour info, je n'ai en aucun cas accusé le langage, l'ordinateur, le compilateur, le système, etc. Je sais qu'il y a une couille dans mon code. Ainsi, merci de rester calme et de me demander gentiment les choses. C'est un forum d'entraide, oui ou non ? Donc au lieu de t'emporter pour un rien, arrête-toi juste à " As-tu essayé sur le petit exemple que je t'ai fourni ? Cela permettrait de déterminer si ta configuration permet d'utiliser les optionals ou pas". Je l'aurais fait, comme il faut, et j'aurais dit, "oui, ça fonctionne bien ! Quel pourrait être mon problème selon toi ?"

                                  Cordialement

                                  PS : amabilité avant tout !

                                  -
                                  Edité par Anonyme 19 août 2021 à 18:27:00

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    19 août 2021 à 18:29:28

                                    C'est bon !

                                    J'ai rien changé, mais ça a décidé de fonctionner !

                                    -
                                    Edité par Anonyme 19 août 2021 à 18:33:25

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 août 2021 à 21:39:33

                                      J'ai rien changé et maintenant ça marche (ou ça marche plus) : on y croit tous.

                                      Ps: je m'énerve pas, je fais le spectacle.  En même temps j'explique un bug psychologique qu'on a tous, en fait. C++ qui ne marche pas, c'etait un autre fil dans ce forum.

                                      Je rappelle que ton titre c'est "optional ne fonctionne pas". Et pas "j'arrive pas à faire marcher optional dans mon code dont je ne vous montre qu'un bout". Tu vois la nuance ?

                                      Ps2 il a quand même fallu que je m'y reprenne à 3 fois pour demander gentiment

                                      - de tester optional à part

                                      - de tester avec un exemple complet que je t'ai fourni

                                      - et que j'insiste pour que tu essaie

                                      -
                                      Edité par michelbillaud 19 août 2021 à 22:03:39

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        20 août 2021 à 0:09:12

                                        Quand je dis que ça a finalement fonctionné sans rien faire, je veux dire que je n'ai rien touché dans mon code... Mais le fait que j'ouvre un autre projet pour essayer optional tout seul comme demandé puis que je revienne sur mon ancien projet (car j'ouvre un projet à la fois), il m'a mis le optional en couleur donc non, je n'ai rien touché dans mon code mais le fait d'ouvrir un autre projet, ça m'a débloqué d'une façon ou d'une autre mon premier projet (le fait de quitter et de relancer le projet à la bonne version du C++ qui sait car je n'avais pas fermé mon projet après avoir changer la version).

                                        Cordialement

                                        PS : ce sujet est fermé :)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 août 2021 à 0:37:34

                                          Quand on change des paramètres de la chaine de compilation, on fait, au minimum, une régénération complète du projet (headers pré-compilés, générations automatiques de code, constantes de compilation, etc...), et encore, quand on n'a correctement géré les dépendances entre projets.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                            20 août 2021 à 10:42:03

                                            > tuto que je suis sur le site officiel de Vulkan

                                            vulkan-tutorial n'est pas sur le site officiel de Vulkan.

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Si vous ne trouvez plus rien, cherchez autre chose.

                                            Anonyme
                                              20 août 2021 à 12:09:35

                                              Le sujet est fermé ! C'est dingue ça
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              std::optional ne fonctionne pas

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown