Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1681 connectés 

  FORUM HardWare.fr
  Programmation

  Problème avec tableau dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec tableau dynamique

n°75923
sielfried
Posté le 27-11-2001 à 12:37:58  profilanswer
 

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 !

mood
Publicité
Posté le 27-11-2001 à 12:37:58  profilanswer
 

n°75933
youdontcar​e
Posté le 27-11-2001 à 13:18:00  profilanswer
 

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 :D

n°75934
BENB
100% Lux.
Posté le 27-11-2001 à 13:19:38  profilanswer
 

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).

n°75936
la viper
Posté le 27-11-2001 à 13:23:40  profilanswer
 

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

n°75941
sielfried
Posté le 27-11-2001 à 13:55:12  profilanswer
 

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  :jap:  
 
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 :D
 
Edit : hmmm j'ai peut-être une idée :D...

 

[edtdd]--Message édité par Sielfried--[/edtdd]

n°75950
la viper
Posté le 27-11-2001 à 14:36:09  profilanswer
 

bah si ton projet reste dans le MFC .. tu as CArray et CList .. ;)
 
ils peuvent accepter n'importe quel type de données.

n°75951
El_gringo
Posté le 27-11-2001 à 14:39:02  profilanswer
 

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.

n°75952
sielfried
Posté le 27-11-2001 à 14:39:52  profilanswer
 

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  :jap:

n°75954
sielfried
Posté le 27-11-2001 à 14:52:23  profilanswer
 

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 ?

n°75961
LeGreg
Posté le 27-11-2001 à 15:08:10  profilanswer
 

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

mood
Publicité
Posté le 27-11-2001 à 15:08:10  profilanswer
 

n°75964
El_gringo
Posté le 27-11-2001 à 15:32:52  profilanswer
 

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 :D
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 :D

n°75972
LeGreg
Posté le 27-11-2001 à 15:51:36  profilanswer
 

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 :D.
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++ :D ?
 

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 :D  




 
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

n°75976
El_gringo
Posté le 27-11-2001 à 15:57:05  profilanswer
 

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...

n°75978
El_gringo
Posté le 27-11-2001 à 15:59:07  profilanswer
 

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 !??

n°75985
LeGreg
Posté le 27-11-2001 à 16:17:25  profilanswer
 

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 :
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string hello_string = "hello world !\n";
  7. cout << hello_string;
  8. return 0;
  9. }


 
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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Problème avec tableau dynamique

 

Sujets relatifs
[C++] Problème avec des pointeursToujours le même problème !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!
[c++] Tableau de charproblème avec un script PHP
[D3D] Problème avec les matériaux[c] tableau d'entier en chaine de caratères ???
[PHP-NUKE] Probleme avec le bloc Last Links ! :([php] probleme avec mail()+multi OU cmt rediriger une page d'erreur
[ JAVA ] Servlet ? probleme de mise a jour de la Servlet sur serveur[php] probleme classique de forum : pros des regexp demandés!
Plus de sujets relatifs à : Problème avec tableau dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR