Problème avec tableau dynamique - Programmation
Marsh Posté le 27-11-2001 à 13:18:00
tu ne peux pas faire de malloc pour utiliser les objets car dans ce cas le constructeur n'est pas appelé et la mémoire contient alors n'importe quoi.
donc CString* CStringTable;
numCStrings = ...;
CStringTable = new CString [numCStrings];
je te laisse chercher pour le realloc
Marsh Posté le 27-11-2001 à 13:19:38
Le melange de C et de C++ n'est pas toujours bon...
les allocateurs dynamiques du C (calloc, malloc, realloc) ne peuvent pas instancier d'objet C++, ils allouent de la memoire, mais n'appellent pas les constructeurs des objets. De meme free n'appelle pas le destructeur des memes objets.
Comment faire : la solution la plus simple est d'utiliser les allocateurs/desalocateurs du C++ (new-new[]/delete-delete[]) qui eux appellent les constructeurs/destructeurs.
La solution la plus compliquee : utiliser les allocateurs du C, puis instancier les objets par un new localise...
Enfin tu peux aussi utiliser la STL qui te propose ce que tu cherches sous la forme d'un vector ou d'une list....
Attention aux Cstrings qui ne sont pas du C++, mais des composants MFC (preferer la string STL).
Marsh Posté le 27-11-2001 à 13:23:40
pkoi se compliquer la vie ?!?
y'a une classe qui existe et qui fait ca : CStringArray ou CStringList
voir plus d'info dans la MSDN
Marsh Posté le 27-11-2001 à 13:55:12
la viper a écrit a écrit : pkoi se compliquer la vie ?!? y'a une classe qui existe et qui fait ca : CStringArray ou CStringList voir plus d'info dans la MSDN |
Bah disons que CString n'était qu'un exemple, dans le cas de mon projet c'est surtout mes tableaux CClasseSocket (classe dérivée de CAsyncSocket) que je voudrais dynamiser.
Sinon merci des conseils
J'avais pensé à new(), mais sachant que la longueur du tableau doit être modifiée plusieurs fois dans le prog, j'ai tout de suite utilisé realloc, je ne savais pas (plus) qu'il n'appelait pas le constructeur de l'objet.
youdontcare : pour realloc, est-il utilisable après un new dans mon cas ? C'est gentil de me laisser chercher mais je connais rien d'autre que realloc dans le genre
Edit : hmmm j'ai peut-être une idée ...
[edtdd]--Message édité par Sielfried--[/edtdd]
Marsh Posté le 27-11-2001 à 14:36:09
bah si ton projet reste dans le MFC .. tu as CArray et CList ..
ils peuvent accepter n'importe quel type de données.
Marsh Posté le 27-11-2001 à 14:39:02
BENB a écrit a écrit : Attention aux Cstrings qui ne sont pas du C++, mais des composants MFC (preferer la string STL). |
Et c quoi les MFC si c pas du C++ !?? c'est d'la merde en boite !?
bon Dieu d'bon Dieu...
oups... g affaire à une demoiselle.
Pardon d'vous dire ça mam'selle BENB, mais les MFC, Microsoft Fondation Class, c du C++, tu veux que ça soit des classes écrites en quoi !? Avant de critiquer, est ce que t'as déja rencontré le moindre problème avec des CString !? j'en doute... alors quand on sait pas, on fait pas de l'anti-MFC-isme primaire !
Pour ce que tu veux faire, niveau des CString, t'as les CStringArray, sinon tu peut utiliser des CPtrArray qui te permet de stocker (dynamiquement) des pointeur vers tout ce que tu veux... Donc tu peut utiliser ça, ms oublies pas d'appeler les contructeurs (avec un new) de tes objets avant de stocker un pointeur vers une instance de l'objet.
Marsh Posté le 27-11-2001 à 14:39:52
la viper a écrit a écrit : bah si ton projet reste dans le MFC .. tu as CArray et CList .. ils peuvent accepter n'importe quel type de données. |
Arf oui effectivement... J'y ai même pas pensé
Bon ben je vais utiliser ça alors !
Cela dit s'il y a un moyen avec les fonctions "standard" d'allocation/reallocation, je veux bien qu'on me dise, ça pourrait tout de même servir
Merci en tout cas
Marsh Posté le 27-11-2001 à 14:52:23
El_Gringo a écrit a écrit : Et c quoi les MFC si c pas du C++ !?? c'est d'la merde en boite !? bon Dieu d'bon Dieu... oups... g affaire à une demoiselle. Pardon d'vous dire ça mam'selle BENB, mais les MFC, Microsoft Fondation Class, c du C++, tu veux que ça soit des classes écrites en quoi !? Avant de critiquer, est ce que t'as déja rencontré le moindre problème avec des CString !? j'en doute... alors quand on sait pas, on fait pas de l'anti-MFC-isme primaire ! |
Dans mon cas je n'ai effectivement jamais eu de problèmes avec les CString, méthodes efficaces, concaténation hyper simple, etc... Je ne m'en plains pas même si cela fait peu de temps que je travaille avec les MFC.
Citation : Pour ce que tu veux faire, niveau des CString, t'as les CStringArray, sinon tu peut utiliser des CPtrArray qui te permet de stocker (dynamiquement) des pointeur vers tout ce que tu veux... Donc tu peut utiliser ça, ms oublies pas d'appeler les contructeurs (avec un new) de tes objets avant de stocker un pointeur vers une instance de l'objet. |
Bah en fait pour l'instant je n'ai manipulé que des CList tout court, quel que soit le type que j'ai utilisé avec... Je crois même que je l'ai fait avec des CString, ce qui me fait me demander pourquoi j'ai eu l'idée de passer par les fonctions d'alloc/desalloc, alors que ces classes sont faîtes pour ça.
Donc je pense rester sur les CList, même si je pense que pour une chaîne de caractères CStringList est plus adapté.
A propos, quelle est la différence entre les classes en List et Array, grossièrement ?
Marsh Posté le 27-11-2001 à 15:08:10
El_Gringo a écrit a écrit : Et c quoi les MFC si c pas du C++ !?? c'est d'la merde en boite !? |
Le probleme..(si probleme il y a)
c'est que la personne qui a pose
sa question (Sielfried)
n'a pas precise qu'elle souhaitait
coder en C++ sous environnement Microsoft
(Visual Studio+windows).
Donc idealement, il vaut mieux rediriger
vers les strings de la STL
que vers la solution MFC.
A+
LEGREG
Marsh Posté le 27-11-2001 à 15:32:52
Et qu'y suffit de lire le sujet pour éviter de dire n'imp, et de voir qu'il utilise lui même des CString. S'il tenais à ce que son truc soit multiplateforme, il l'aurai précisé...
Et... là je reprend mon calme
les fonctions de la STL c pas spécifique à Windows ?
Moi, qd g commencé le C++, ce qui m'a décider à préférer les objets des MFC à ceux de la STL, c que sur MSDN Library, la doc sur la STL est toute pourrie
Marsh Posté le 27-11-2001 à 15:51:36
El_Gringo a écrit a écrit : Et qu'y suffit de lire le sujet pour éviter de dire n'imp, et de voir qu'il utilise lui même des CString. S'il tenais à ce que son truc soit multiplateforme, il l'aurai précisé... |
Donc y'a pas de probleme .
Par contre s'il utilise les conteneurs MFC il a
deja fait la moitie du boulot
comme disait la personne qui a evoque
les CArray et CList
(ou list et vector pour la STL)
El_Gringo a écrit a écrit : les fonctions de la STL c pas spécifique à Windows ? |
Euh.. tu codes en C++ ?
El_Gringo a écrit a écrit : Moi, qd g commencé le C++, ce qui m'a décider à préférer les objets des MFC à ceux de la STL, c que sur MSDN Library, la doc sur la STL est toute pourrie |
Un peu normal. ils vont pas detailler un truc
qui n'est pas developpe par eux et qui fait
double emploi avec leur solution.
A+
LEGREG
Marsh Posté le 27-11-2001 à 15:57:05
et, par curiosité, comment je fais par exemple pour utiliser des string ? y a des includes particulier à faire ? les dll à linker ?
tu peux me faire un tout petit exemple, vite fait ?
ou alors mieux qui c'est qui fait la STL !? pour aller voir la doc sur leur site internet...
Marsh Posté le 27-11-2001 à 15:59:07
ha ha... ouais, je code en C++... sous windows. Quel besoin j'aurai eu d'aller vois si la STL (que g jammais utilisée) est compatible avec autre chose que windows !??
Marsh Posté le 27-11-2001 à 16:17:25
El_Gringo a écrit a écrit : et, par curiosité, comment je fais par exemple pour utiliser des string ? y a des includes particulier à faire ? les dll à linker ? tu peux me faire un tout petit exemple, vite fait ? |
Code :
|
Enfin c'est la version compliquee:
j'etais pas obligee d'utiliser une string intermediaire
mais bon tu m'as demande l'exemple avec les strings alors..
El_Gringo a écrit a écrit : ou alors mieux qui c'est qui fait la STL !? pour aller voir la doc sur leur site internet... |
La STL fait partie du langage C++.
C'est pour ca que si tu pretends etre un gourou en C++
et que si un employeur te pose des questions
sur la STL et que tu ne vois pas de quoi il parle
tu es mal .
A+
LEGREG
Marsh Posté le 27-11-2001 à 12:37:58
C'est sûrement comme d'habitude une question de newbie que je pose, mais tant pis : j'ai appris le C++ sur un bouquin qui explique comment réaliser un tableau dynamique de types prédéfinis comme char ou int, mais apparemment cela ne marche pas sur les objets, ou sur les types d'objets que je veux utiliser.
Par ex., je voudrais faire un tableau de CString, qui s'agrandit à mesure que l'on saisit des chaînes :
Je fais :
int nbchaines = 0;
CString *chaine = NULL;
Puis à chaque chaîne :
nbchaines++;
chaine = (CString*)realloc(chaine, nbchaines*sizeof(CString));
(en vérifiant à chaque fois l'éventuelle erreur d'allocation mais ce n'est pas de là que vient le problème)...
Déjà, est-ce correct ? Avec du char** ça marche, c'est sûr, mais c'est plus chiant, puique CString permet directement de stocker des chaînes de longueur dynamique. Il n'y aurait donc plus que le nombre de chaînes à "dynamiser", ce serait vraiment pratique.
En fait jusque là cela marche, mais dès que j'essaie d'initialiser une chaîne (genre chaine[0] = "salutcava?" ), j'obtiens une erreur non conforme.
D'autre part dans le cadre de mon programme de chat, j'utilise aussi des objets CClasseSocket. J'avais fait un tableau de 1000 objets fixe (en fait ça correspond aux clients, c'est géré côté serveur) mais je trouverais ça beaucoup plus fin de le dynamiser en fonction du nombre de clients. Mais même problème que précédemment, impossible d'accéder au tableau par la suite.
Merci d'avance !