1

Salut à tous!

Est-ce que ous connaissez une class C++ qui permet de gérer une liste d'éléments comme le fait QPtrList mais sans Qt?

------------------------------------
=> Les sources de ce que j'ai fait + les corrections données dans les posts #endif CList.h : //  --------------------------------------------------------------------------------------- // //                C++ Class                                                                 // //                    Copyright (c) 2006 Spomky.Dev                                         // //                       <http://www.spomky.com/>                                           // // ---------------------------------------------------------------------------------------- // //  This program is free software; you can redistribute it and/or modify                    // //  it under the terms of the GNU General Public License as published by                    // //  the Free Software Foundation; either version 2 of the License, or                       // //  (at your option) any later version.                                                     // //                                                                                          // //  You may not change or alter any portion of this comment or credits                      // //  of supporting developers from this source code or any supporting                        // //  source code which is considered copyrighted (c) material of the                         // //  original comment or credit authors.                                                     // //                                                                                          // //  This program is distributed in the hope that it will be useful,                         // //  but WITHOUT ANY WARRANTY; without even the implied warranty of                          // //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                           // //  GNU General Public License for more details.                                            // //                                                                                          // //  You should have received a copy of the GNU General Public License                       // //  along with this program; if not, write to the Free Software                             // //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA                // // ---------------------------------------------------------------------------------------- // // Author: Webmaster/Spomky.Dev (webmaster@spomky.com) // URL:  http://www.spomky.com // Project:  //HEADER #ifndef CLIST_H      #define CLIST_H      #include <cstdlib>            template <class Type>      class CList      {           public:                CList( void );                ~CList( void );                                bool addElement( void );                bool addElement( Type& );                                bool clearList( void );                bool removeElement( size_t );                                bool changeElement( size_t , Type& );                bool swapElement( size_t , size_t );                                Type getElement( size_t );                                size_t count( void ) const { return this->number; };                bool is_empty( void ) const { return this->count() == 0; };           protected:           private:                Type  **list;                size_t number;      };            #include "CList.cpp"  } #endif CList.cpp : //  --------------------------------------------------------------------------------------- // //                C++ Class                                                                 // //                    Copyright (c) 2006 Spomky.Dev                                         // //                       <http://www.spomky.com/>                                           // // ---------------------------------------------------------------------------------------- // //  This program is free software; you can redistribute it and/or modify                    // //  it under the terms of the GNU General Public License as published by                    // //  the Free Software Foundation; either version 2 of the License, or                       // //  (at your option) any later version.                                                     // //                                                                                          // //  You may not change or alter any portion of this comment or credits                      // //  of supporting developers from this source code or any supporting                        // //  source code which is considered copyrighted (c) material of the                         // //  original comment or credit authors.                                                     // //                                                                                          // //  This program is distributed in the hope that it will be useful,                         // //  but WITHOUT ANY WARRANTY; without even the implied warranty of                          // //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                           // //  GNU General Public License for more details.                                            // //                                                                                          // //  You should have received a copy of the GNU General Public License                       // //  along with this program; if not, write to the Free Software                             // //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA                // // ---------------------------------------------------------------------------------------- // // Author: Webmaster/Spomky.Dev (webmaster@spomky.com) // URL:  http://www.spomky.com // Project:  //C++ CODE SOURCE #include "CList.h" #ifndef CLIST_CPP      #define CLIST_CPP      template <class Type>      CList<Type>::CList( void )      {           this->number = 0;           this->list = NULL;      }                  template <class Type>      CList<Type>::~CList( void )      {           this->clearList();      }                  template <class Type>      bool CList<Type>::addElement( void )      {           if ( this->number == 0 )                this->list = (Type**)malloc(sizeof(Type*));           else                this->list = (Type**)realloc( this->list , sizeof(Type*) * (this->number+1) );                      if ( this->list == NULL )                return false;                      this->list[this->number] = new Type;           this->number++;           return true;      }                  template <class Type>      bool CList<Type>::addElement( Type &newElement )      {           if ( this->addElement() )                *this->list[this->number-1] = newElement;           else                return false;           return true;      }                  template <class Type>      bool CList<Type>::clearList( void )      {           if ( this->is_empty() )                return true;           while ( !this->is_empty() )                removeElement(0);           return true;      }                  template <class Type>      bool CList<Type>::removeElement( size_t element )      {           if ( this->count() == 0)                return true;                      if ( this->number == 1 )           {                free(this->list[0]);                free ( this->list );                this->list = NULL;           }           else           {                free(this->list[element]);                this->list[element] = NULL;                for (size_t cptr=element ; cptr < this->number-1 ; cptr++)                     this->list[cptr] = this->list[cptr+1];                this->list = (Type**)realloc( this->list , (this->number-1) * sizeof(Type*) );           }                      this->number--;           return true;      }                  template <class Type>      bool CList<Type>::changeElement( size_t element , Type &source )      {           if ( element >= this->count() )                return false;                      *this->list[element] = source;           return true;      }                  template <class Type>      bool CList<Type>::swapElement( size_t element1 , size_t element2 )      {           if ( element1 >= this->count() || element1 >= this->count() )                return false;                      Type temp;           temp = *this->list[element1];           *this->list[element1] = *this->list[element2];           *this->list[element2] = temp;           return true;      }                  template <class Type>      Type CList<Type>::getElement( size_t element )      {           Type tempElement;           if ( element >= this->count() )                return tempElement;                      return *this->list[element];     

2

heu je connais pas QPtrList, mais list ou vector ça va pas ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Grosso modo, les QPtrList sont équivalents aux conteneurs de la stdlib du c++.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

et donc par rapport à list/vector, ça apporte quoi ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

bein c'est proprietaire triso

6

N'importe quoi, c'est sous GPL...

En fait, ces classes avaient été écrites avant que les conteneurs standard du c++ n'apparaissent, donc ils sont là surtout pour la compatibilité antérieure, mais aussi, il y a un nombre plus large de conteneurs, qui sont tous différents et donc plus adaptés à un certain type de travail (QPtrList vs QValueList par exemple).
Enfin, utiliser ces conteneurs dans un programme avec une GUI en Qt rend simplement le code source plus homogène.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

oki mci
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

heu si ca appartient a qt, c'est sous double licence...

9

Sasume :
N'importe quoi, c'est sous GPL...

Si tu veux jouer sur les mots, c'est "vendor-specific", contrairement au container standard de la STL... Ca n'empêche que c'est Mal ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

Merci pour la classe list de la STL, je connaissais pas.
C'est facil à utiliser en plus, c'est exactement ce qu'il me fallait

11

JackosKing-VNR :
heu si ca appartient a qt, c'est sous double licence...

Oui c'est sous double licence : tu choisis la licence que tu préfères l'une d'elles étant la GPL.

12

heu il y a une grande difference entre un projet GPL et un projet sous double licence dont l'une GPL.
Si vous ne voyez pas la difference, moi je la vois.
Quand tu choisis la licence... je dirais plutot la situation impose le choix de la licence.
Enfin bon sujet clos.

13

Je reouvre. J'ai eu ce probleme de licence l'annee derniere en stage: je bossais sur un soft sous Qt4 (prog de theorie des graphes dans un labo connu au CANADA). Au debut, on etait tout content, Qt4, licence libre... Mais u bout d'un moment, quand on s'est apercu qu'on serait oblige de filer le code source si qqn nous le demandais, la ca merde:
- dans ce soft il y a des methodes qui n'avaient pas encore ete publiees... et au CANADA/USA les labos marchent au papiers pour le financement!
C'est pour cela que le soft n'est pas sorti en release public et y sera uniquement quand les papiers seront sortis...


Sinon, sur le QPtrList, tu pourras faire les memes choses avec un std::vector meme si ca ne fonctionne pas de la meme maniere en interne (le QPtrList est plus proche des containers de Java)

14

J'ai un petit problème avec list.
Avant j'avais une liste dans ma classe que je définissais comme ça : "type **ma_list;" avec des malloc, realloc et free à tout va.
J'ai voulu utiliser list de la STL et j'ai écrit ça : "list<type*> ma_list;" à utiliser avec des new et delete cette fois-ci.
Malheureusement le compilateur me renvoi "ISO C++ forbids declaration of «list» with no type"

J'ai l'impression que des déclarations comme celle-ci dans une classe ne sont pas autorisée, seulement dans les fonctions. Ou alors il y a une méthode que j'ai loupée

15

std::list ?

16

OK j'ai rien dit!
dehors

17

Finalement j'ai créé ma propre class avec templates pour faire des listes.
Je joins les sources
VOIR AU PREMIER POSTE
Ça vaut ce que ça vaut. En tous cas ça à l'air de marcher (c'est ma première class avec templates)

18

Ca a pas l'air mal, mais j'ai une remarque et une question :
- le #include "Clist.cpp" c'est horriblement moche. Ne fais pas ça à moins d'avoir une très, très, très bonne raison.
- pourquoi avoir fait une classe CList, alors que tu disposes déjà de std::list ?

19

(ce serait plutôt std::vector, en fait)

Hmm sinon :
- tu ne libères par l'élément de la liste que tu supprimes, donc il y a des leaks de mémoire
- pourquoi unsigned long et pas size_t ?
- pourquoi removeElement(void) plutôt que clearList(void) ?
- qqs petits bugs : il manque this->list=0 après free(this->list), pas de return à la fin de removeElement(unsigned long) [ton compilo met pas un warning pour ça ? confus]

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

spectras :
Ca a pas l'air mal, mais j'ai une remarque et une question :
- le #include "Clist.cpp" c'est horriblement moche. Ne fais pas ça à moins d'avoir une très, très, très bonne raison.

Si je ne le mets pas j'ai des "undifined reference to ..." pour chaque fonctions que j'utilise.
J'ai trouvé sur un forum (je ne sais plus où qu'il fallait ajouter à la fin de la déclaration de la class ce include vers le .cpp
spectras :
- pourquoi avoir fait une classe CList, alors que tu disposes déjà de std::list ?

Pour la gloire! Non plus sérieusement je n'avais jamais fait de class avec les template alors pourquoi ne pas commencer pas ça?

21

spomky
:
spectras :
Ca a pas l'air mal, mais j'ai une remarque et une question :
- le #include "Clist.cpp" c'est horriblement moche. Ne fais pas ça à moins d'avoir une très, très, très bonne raison.

Si je ne le mets pas j'ai des "undifined reference to ..." pour chaque fonctions que j'utilise.

Les déclarations de fonctions templatées sont à mettre dans un .h, pas dans un .cpp ^^ (exactement comme les macros en C, en fait)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

22

Conventionnellement - tjrs reve d'utiliser ce mot - , on met l'implementation des fct templates dans un .cxx

23

Pollux :
Les déclarations de fonctions templatées sont à mettre dans un .h, pas dans un .cpp ^^ (exactement comme les macros en C, en fait)

OK je ne savais pas ça.
J'ai l'habitude d'écrire mes déclarations dans un .h et mes fonctions dans un .cpp, je pensais qu'il fallait faire de même pour des fonctions templatées
Pollux :
- tu ne libères par l'élément de la liste que tu supprimes, donc il y a des leaks de mémoire

C'est corrigé.
Existe-t-il un programme qui peux vérifier si un programme a des fuites de mémoire? J'ai vu passer les noms de valgrind et KCachegrind mais je n'ai pas appronfondi
Pollux :
- pourquoi unsigned long et pas size_t ?

Je ne connais pas la différence confus. J'ai appris le C/C++ grace à des doc et je n'ai jamais eu de cours d'info hormis en VB
Pollux :
- pourquoi removeElement(void) plutôt que clearList(void) ?

Il n'y a aucune raison. Je veux bien changer le nom ça ne me pose aucun problème.
Pollux :
- qqs petits bugs : il manque this->list=0 après free(this->list), pas de return à la fin de removeElement(unsigned long) [ton compilo met pas un warning pour ça ? confus]

OK pour le return oublié. Le compilo ne met un warning que si on lui demande smile (j'ai ajouté un -Wall).
Deux choses (à mon tour) :
-J'ai vu que this->list=0 n'est pas forcément la même chose que this->list=NULL pour certains compilo
-Je croyais qu'après un free(this->list) mon this->list=0 vallait automatiquement NULL

24

spomky
:
Pollux :
- pourquoi unsigned long et pas size_t ?

Je ne connais pas la différence confus. J'ai appris le C/C++ grace à des doc et je n'ai jamais eu de cours d'info hormis en VB

Selon la norme C, unsigned long, ça veut juste dire "un entier non signé d'au moins 32 bits" -- mais quelqu'un qui utilise tes fonctions sur un système 64 bits (ou plus) peut vouloir créer un tableau avec une taille qui ne tient pas sur 32 bits... size_t est justement fait pour éviter ce genre de cas : il est assez grand pour contenir un tableau quelconque (regarde les fonctions de la librairie standard, en C ou en C++ : que ça soit fread(), qsort() ou std::vector, tous utilisent size_t pour décrire un nombre d'éléments)
Deux choses (à mon tour) : -J'ai vu que this->list=0 n'est pas forcément la même chose que this->list=NULL pour certains compilo

C'est à dire ? (en principe c'est censé être la même chose...)
-Je croyais qu'après un free(this->list) mon this->list=0 vallait automatiquement NULL

free() est une fonction C, donc elle ne peut pas modifier ses arguments : this->list reste égal à ce qu'il était avant ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

25

Pollux
: Selon la norme C, unsigned long, ça veut juste dire "un entier non signé d'au moins 32 bits" -- mais quelqu'un qui utilise tes fonctions sur un système 64 bits (ou plus) peut vouloir créer un tableau avec une taille qui ne tient pas sur 32 bits... size_t est justement fait pour éviter ce genre de cas : il est assez grand pour contenir un tableau quelconque (regarde les fonctions de la librairie standard, en C ou en C++ : que ça soit fread(), qsort() ou std::vector, tous utilisent size_t pour décrire un nombre d'éléments)

OK j'ai mis des size_t à la place des unsigned long.
C'est bon de savoir ça surtout quand on a un proc 64bits!

C'est à dire ? (en principe c'est censé être la même chose...)

J'ai lu que pour certains systèmes NULL vaut -1 ce qui peut poser quelques problèmes (lu ici dans la note).

free() est une fonction C, donc elle ne peut pas modifier ses arguments : this->list reste égal à ce qu'il était avant ^^

Oui effectivement c'est logique happy

26

spomky :
OK j'ai mis des size_t à la place des unsigned long. C'est bon de savoir ça surtout quand on a un proc 64bits!

Enfin sur un système 64 bits les unsigned long peuvent très bien faire 64 bits, c'est juste que c'est pas toujours le cas ^^

C'est à dire ? (en principe c'est censé être la même chose...)

J'ai lu que pour certains systèmes NULL vaut -1 ce qui peut poser quelques problèmes (lu ici dans la note).

Euh non c'est faux, ou alors ça doit être des compilos vraiment préhistoriques : même si le pointeur nul est représenté en interne par l'entier -1, si tu castes la constante 0 en pointeur elle est censée être comprise comme le pointeur nul par le compilo (et donc si besoin est sera représentée en interne par l'entier -1)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

27

Il y a effectivement eu des compilateurs à une époque qui utilisaient cette technique pour forcer le plantage quand on déréférençait un pointeur nul, le -1 donnant une adresse qui faisait planter alors que l'adresse 0 était une adresse parfaitement valide. Mais c'est une époque oubliée depuis longtemps ça.