Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allocation dynamyque d'un tableau de pointeurs sur fonction

Sujet résolu
    16 avril 2008 à 9:05:47

    Bonjour.
    J'essaie depuis un certain temps de me débrouiller avec un tableau dynamique sans std::vector. Il doit contenir des pointeurs sur fonction, mais il m'affiche tellement d'erreurs que je sens que je vais faire un malaise ^^ .
    Voici mon code:

    //callbacks.hpp
    
    namespace cab
    {
    	class Application
    	{
    		public:
    		Application();
    		~Application();
    		void AddCallback(bool (*fWhatCall)(), void (*fToCall)());
    		void Activate();
    
    		private:
    		bool (*WhatCall)();
    		void (*ToCall)();
    		int nCallbacks;
    	};
    }
    

    //callbacks.cpp
    
    #include"callbacks.hpp"
    
    namespace cab
    {
    	Application::Application()
    	{
    		WhatCall = NULL;
    		ToCall = NULL;
    		nCallbacks = 0;
    	}
    
    	Application::~Application()
    	{
    		delete[] WhatCall;
    		delete[] ToCall;
    	}
    
    	void Application::AddCallback(bool (*fWhatCall)(), void (*fToCall)())
    	{
    		bool (*oWhatCall)() = new bool()[nCallbacks];
    		void (*oToCall)() = new void()[nCallbacks];
    		if(ToCall != NULL)
    		{
    			for(int i = 0; i < nCallbacks; i ++)
    			{
    				*oWhatCall[i] = *WhatCall[i];
    				*oToCall[i] = *ToCall[i];
    			}
    			delete[] WhatCall;
    			delete[] ToCall;
    			WhatCall = new bool[nCallbacks + 1]();
    			ToCall = new void[nCallbacks + 1]();
    			for(int i = 0; i < nCallbacks; i ++)
    			{
    				WhatCall[i] = oWhatCall[i];
    				ToCall[i] = oToCall[i];
    			}
    		}
    		else
    		{
    			*WhatCall = new bool()[1];
    			*ToCall = new void()[1];
    		}
    		WhatCall[nCallbacks] = fWhatCall();
    		ToCall[nCallbacks] = fToCall();
    		nCallbacks += 1;
    	}
    
    	void Application::Activate()
    	{
    		bool running = true;
    		while(running)
    		{
    			for(int i = 0; i < nCallbacks; i ++)
    			{
    				if((*WhatCall[i])())
    				{
    					(*ToCall[i])();
    				}
    			}
    		}
    	}
    }
    



    Et voici les erreurs :

    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp: In constructor «cab::Application::Application()":
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:7: erreur: «NULL" was not declared in this scope
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp: In destructor «cab::Application::~Application()":
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:14: erreur: cannot delete a function.  Only pointer-to-objects are valid arguments to «delete"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:15: erreur: cannot delete a function.  Only pointer-to-objects are valid arguments to «delete"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp: In member function «void cab::Application::AddCallback(bool (*)(), void (*)())":
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:20: erreur: cannot convert «bool*" to «bool (*)()" in initialization
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:21: erreur: invalid use of «void"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:22: erreur: «NULL" was not declared in this scope
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:26: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:26: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:26: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:26: erreur: cannot convert «bool ()()" to «bool ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:27: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:27: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:27: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:27: erreur: cannot convert «void ()()" to «void ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:29: erreur: cannot delete a function.  Only pointer-to-objects are valid arguments to «delete"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:30: erreur: cannot delete a function.  Only pointer-to-objects are valid arguments to «delete"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:31: erreur: cannot convert «bool*" to «bool (*)()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:32: erreur: invalid use of «void"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:35: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:35: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:35: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:35: erreur: cannot convert «bool ()()" to «bool ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:36: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:36: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:36: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:36: erreur: cannot convert «void ()()" to «void ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:41: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:41: erreur: cannot convert «bool*" to «bool ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:41: erreur: expected `;' before «[" token
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:42: erreur: invalid use of «void"
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:42: erreur: expected `;' before «[" token
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:44: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:44: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:44: erreur: cannot convert «bool" to «bool ()()" in assignment
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:45: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:45: erreur: assignment of read-only location
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:45: erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp: In member function «void cab::Application::Activate()":
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:56: erreur: usage en arithmétique d'un pointeur vers une fonction
    /home/nathan/Documents/Programmes/callbacks/callbacks.cpp:58: erreur: usage en arithmétique d'un pointeur vers une fonction

    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2008 à 10:03:11

      Commence *TOUJOURS* par corriger la première erreur et inclure ce qui définit null. Ou alors, utilise 0.

      Sinon,
      - or le pre-standard VC6, NULL ne renvoie pas 0, mais une exception si l'allocation est impossible
      - Fais toi des typedefs (moins de risques, plus lisible)
      - Distingue capacité et taille, prévois des fonctions de redimensionnement, etc ... -- car là, ton algo n'est pas du tout efficace.
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
      Anonyme
        16 avril 2008 à 10:25:33

        Citation : Pas de titre

        J'essaie depuis un certain temps de me débrouiller avec un tableau dynamique sans std::vector



        Tu peux me dire ce qui te pousse à ne pas utiliser std::vector et boost::function ?
        • Partager sur Facebook
        • Partager sur Twitter
          16 avril 2008 à 11:41:36

          En fait, si je n'utilisait pas std::vector, c'est que je ne savait pas m'en servir. Mais j'ai appris et mon code est devenu beaucoup plus clair et il a marché !
          Merci beaucoup.

          PS : J'ai utilisé std::list et non pas std::vector : c'était plus adapté a mon cas.
          • Partager sur Facebook
          • Partager sur Twitter

          Allocation dynamyque d'un tableau de pointeurs sur fonction

          × 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