Accueil > Forum > > > > Tableau de string
Tableau de string
vendredi 10 août 2012 à 17:37:28 |
Tableau de string

Polack77
|
Bonsoir,
Je n'arrive pas a faire un truc tout simple (et ça m'agace mais alors m’agacccccccce)
Je commence a utiliser espace de nom std (qui vas me faire gagné pas mal de temps maintenant que je peut l'utiliser dans mes projets pro, eennffiinn  ).
Je cherche à passer un pointeur sur tableau a une sous fonction qui doit dimensionner le tableau, le remplir, et se terminer (avec une valeur de retour pour remonté les erreurs)
Habituellement j'utilisais des char*, je débute avec les string (et wstring).
Je fait donc :
Déclaration :
Code C/C++ :
char DecoupeLigne(const wstring Ligne,const wstring Separateur,int* NombreDeChampsTrouve,wstring** TableauDeStringTrouve)
{
[...]
*TableauDeStringTrouve = (wstring*)malloc(sizeof(wstring*)*NombreDeChampsLut);
for (int Compteur = 0 ; Compteur<NombreDeChampsLut ; Compteur++)
{
(*TableauDeStringTrouve)[Compteur] = new wstring(); //<-- ICI
(*TableauDeStringTrouve)[Compteur] = CourElement->Item;
CourElement = CourElement->Suivant;
}
}
Appel :
Code C/C++ :
wstring Ligne;
wstring* ListeDonnees;
[...]
DecoupeLigne(Ligne,L"\t",&NombreItem,&ListeDonnees);
J'ai une erreur a la compilation sur la ligne noté "ICI" :
Error 1 error C2106: '=' : left operand must be l-value xxx.cpp 120 1 yyy
Ce qui veux dire (sauf erreur de ma part ^^) que je cherche a mettre un pointeur dans une variable...
Je comprend bien l'erreur (l'opérateur "=" est redéfini par la classe string je ne peut donc pas insérer comme ça l'adresse de ma variable dans mon tableau  , ce qui me permet de faire la ligne suivante sans "strcpy" ou autre "memcpy" ^^) mais je ne trouve pas de solution pour contourner ça
Comment faire svp ?
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
vendredi 10 août 2012 à 17:40:25 |
Re : Tableau de string

Polack77
|
Oups j'ai mit l'erreur IntelliSense dans mon message
L'erreur :
Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::wstring *' (or there is no acceptable conversion) xxx.cpp 120 1 yyy
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
vendredi 10 août 2012 à 18:43:17 |
Re : Tableau de string

CptPingu
|
Bonjour.
Tout d'abord, quelques remarques:
- Évite les "using namespace", voir: [ Lien ]
- En C++ on ne fait jamais de malloc/free, on fait du new/delete. (Attention, lors d'un new, il y a bien appel du constructeur à l'initialisation, ce qui n'est pas le cas d'un malloc !)
- Pourquoi ne pas utiliser un std::vector au lieu de faire un tableau C ? (Je verrais bien à la place de "wstring**" un petit "std::vector<std::wstring>&")
- new std::wstring(); => new std::wstring; ! Attention dans le cas d'un new sur constructeur sans parenthèse, il n'y a pas de "()". C'est une subtilité du C++. Si tu mets les parenthèses tu déclares une fonction anonyme qui renvoie un type std::wstring et qui fait un new du résultat. Ça fonctionne, mais c'est moche :).
Pour ton souci, si je ne m'abuse, le type de "(*TableauDeStringTrouve)[Compteur]" c'est "std::wstring" et non "std::wstring*".
C'est tout simplement ça ton problème, non ?
Autre petite chose. Je vois un "CourElement = CourElement->Suivant;", ça ressemble à une liste chaînée. Sache qu'en C++, tu n'as pas besoin de la recoder, tu as déjà les std::list (liste doublement chaînée) et les std::forward_list (liste simplement chaînée).
Enfin, pour parcourir une collection C++, il est préférable d'utiliser des iterators.
Si tout ceci n'est pas clair, je te ferais un petit exemple.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 13 août 2012 à 10:54:27 |
Re : Tableau de string

Polack77
|
Bonjour,
Et tout d'abord merci pour tes conseils  .
Pour répondre aux pourquoi, je suis de formation C, et je doit reconnaitre que je ne connais pas encore les outils disponible en C++  .
Tout me semble claire mis a part les "iterators" ?
Je m'applique déjà à recorder tout ça en suivant tes conseils et je posterais ici.
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
lundi 13 août 2012 à 11:36:10 |
Re : Tableau de string

Polack77
|
Arf j'ai des soucis :
(Pour la petite histoire, je travail dans un projet anciennement C qui évolue maintenant vers du C++. Néanmoins la majeur partie du code n'a pas encore évolué, un collègue c'est occupé des quelques modifications indispensable pour que le projet fonctionne sans erreur. Maintenant je cherche a utiliser les outils a ma disposition ^^)
J'ai lut ton lien concernant les "using namespace" :
"using namespace" =>
J'ai une erreur sur l'utilisation des listes :
Error 1 error C2039: 'forward_list' : is not a member of 'std' xxxxxx.cpp 75 1 yyyyyyyy
Idem sur le vector :
Error 1 error C2039: 'vector' : is not a member of 'std' xxxxxx.cpp 62 1 yyyyyyyy
Des lib sont ignorées, peut être la cause de l'erreur ??? :
Param "Ignore Specific Default Libraries" :
libc.lib;%(IgnoreSpecificDefaultLibraries)
A part cette configuration je ne voie rien qui m'attire l’½il niveau configuration
PS :
Mon code actuel (qui est fonctionnel, le "new" tout bêtement, j'aurais dû y penser tout seul  ) :
Code C/C++ :
char DecoupeLigne(const std::wstring Ligne,const std::wstring Separateur,int* NombreDeChampsTrouve,std::wstring** TableauDeStringTrouve)
{
[...]
*TableauDeStringTrouve = new std::wstring[NombreDeChampsLut];
CourElement = PremElements;
for (int Compteur = 0 ; Compteur<NombreDeChampsLut ; Compteur++)
{
(*TableauDeStringTrouve)[Compteur] = CourElement->Item;
CourElement = CourElement->Suivant;
}
[...]
}
Donc pour le moment code fonctionnel donc pouf sauvegarde. Mais je suis un peut têtu et si tu a un peut de temps a m’accorder je voudrais comprendre pourquoi je ne peut pas utiliser les "forward_list" (et "list") ni même les "vector".
Merci pour l'info (indispensable) pour comprendre pourquoi "new" et pas "malloc" (le pire c'est que j'étais en train de pointer sur quel variable l’allocation étais faite par "new" pour faire des "delete" et idem avec "malloc"/"free"). Pourquoi ne pas avoir banni "malloc"/"free" tout de suite ??? Même moi je me comprend pas toujours
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
lundi 13 août 2012 à 11:43:32 |
Re : Tableau de string

CptPingu
|
je suis de formation C, et je doit reconnaitre que je ne connais pas encore les outils disponible en C++
Ne t'inquiète pas, ça va venir vite. Avoir une formation initiale en C est un avantage que l'on met vite à profit en C++ (la compréhension de ce qui se passe "en dessous" est toujours un plus).
Tout me semble claire mis a part les "iterators" ?
Les iterators sont une manière propre et unifiée de parcourir une collection quelque soit sa nature. Pour parcourir un arbre (std::map), une liste chaînée (std::list) ou un tableau (std::vector) on utilisera le même code. Ex:
Code C/C++ :
std::vector<int> tab;
std::list<int> list;
std::map<int, int> tree;
for (std::vector<int>::iterator it = tab.begin(); it != tab.end(); ++it)
{
//
}
for (std::list<int>::iterator it = list.begin(); it != list.end(); ++it)
{
//
}
for (std::map<int, int>::iterator it = tree.begin(); it != tree.end(); ++it)
{
//
}
Si tu remplaces "iterator", "begin" et "end", respectivement par "reverse_iterator", "rbegin", "rend", tu parcouras la collection en partant de la fin, au lieu du début, sans changer quoi que ce soit à ton code ! (Et quelque soit ta structure de donnée).
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 13 août 2012 à 11:48:26 |
Re : Tableau de string

CptPingu
|
J'ai une erreur sur l'utilisation des listes :
Error 1 error C2039: 'forward_list' : is not a member of 'std' xxxxxx.cpp 75 1 yyyyyyyy
La std::forward_list n'est disponible qu'en C++0x. La nouvelle version du C++ qui est sortit récemment. Si tu peux activer l'option -std=c++0x, tu pourras l'utiliser. En revanche, si tu n'as pas le droit à cette mouture, utilise une std::list.
Idem sur le vector :
Error 1 error C2039: 'vector' : is not a member of 'std' xxxxxx.cpp 62 1 yyyyyyyy
Je pense que tu as oublié un #include <vector>, tout simplement :p.
Pourquoi ne pas avoir banni "malloc"/"free" tout de suite ??? Même moi je me comprend pas toujours
Pour des raisons de compabilité, tout ce qui est C, est compatible en C++. malloc/free sont donc considérés comme valides en C++.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 13 août 2012 à 11:51:07 |
Re : Tableau de string

Polack77
|
Heeeeeeeeee non code fonctionnel (heeee là je comprend pas trop pourquoi par contre  :
A l’exécution de cette ligne :
Code C/C++ :
DecoupeLigne(LigneFichier,L"\t",&NombreItem,&ListeDonnees);
[...]
delete ListeDonnees; // <- Ici ^^
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
lundi 13 août 2012 à 11:57:08 |
Re : Tableau de string

CptPingu
|
char DecoupeLigne(const std::wstring Ligne,const std::wstring Separateur,int* NombreDeChampsTrouve,std::wstring** TableauDeStringTrouve)
{
*TableauDeStringTrouve = new std::wstring[NombreDeChampsLut];
CourElement = PremElements;
for (int Compteur = 0 ; Compteur<NombreDeChampsLut ; Compteur++)
{
(*TableauDeStringTrouve)[Compteur] = CourElement->Item;
CourElement = CourElement->Suivant;
}
}
En C++, ça aurait plutôt cette tête là (tu noteras l'utilisation de & pour éviter les copies inutiles de ligne et separateur):
Code C/C++ : char decoupeLigne(const std::wstring& ligne, const std::wstring& separateur, std::vector<std::wstring>& tableauDeStringTrouve)
{
//
CourElement = PremElements;
for (int Compteur = 0 ; Compteur < NombreDeChampsLut; ++Compteur)
{
tableauDeStringTrouve.push_back(CourElement->Item);
CourElement = CourElement->Suivant;
}
//
}
std::vector<std::wstring> tab;
decoupeLigne(L"line", L"sep", tab);
tab.size(); // NombreDeChampsTrouve
DecoupeLigne(LigneFichier,L"\t",&NombreItem,&ListeDonnees);
[...]
delete ListeDonnees; // <- Ici ^^
J'ai besoin de voir plus de code. Notamment ce qu'est "ListeDonnees".
PS: En C++, seul les noms de classe portent une majuscule. Les attributs de classe sont suffixés par '_'.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 13 août 2012 à 12:04:50 |
Re : Tableau de string

Polack77
|
Heee oui les majuscules un peut partout sont une mauvaise habitude.
Un peut plus de code :
Code C/C++ : if (!FileSrc.bad())
{
std::wstring LigneFichier;
std::wstring* ListeDonnees;
ListeDonnees=0;
while(std::getline(FileSrc, LigneFichier))
{
int NombreItem;
NombreItem=0;
DecoupeLigne(LigneFichier,L"\t",&NombreItem,&ListeDonnees);
[...]
delete ListeDonnees;
ListeDonnees=0;
}
}
PS :
Le problème avec les vector étais bien le "#define", je regarde ça
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo 
|
|
Cette discussion est classée dans : ligne, code, string, tableau, wstring
Répondre à ce message
Sujets en rapport avec ce message
Tableau de STRING comme paramètre [ par guiguimac ]
Bonjour !est-ce que qq'un parmi vous aurait sous la main un code qui montre comment passer comme paramètre à une fonction un tableau de type STRING ..
myvar = new string [ par Tyroflan ]
typedef char string[100];string *ligne;...main(){ligne = new string [2] // je crée donc 2 string, només ligne[0], ligne[1]...plus tard, il me faut un
[C] recherche caractere [ par GazGaz ]
bonjourj'ai un bout de code qui me permet de chercher un caractere dans une phrase. Ce code me renvoie l'emplacement du premier carcactere.ex : "yop"a
pb classe [ par JediMaster ]
j'ai créé un tableau dynamique dans une classe comme ca:class MaClasse{public: int m_largeur; int m_hauteur; int** m_tableau; MaClasse(int lar,int hau
Tableau multidimensionel et fichiers [ par AngeloVivaldi ]
slt à tous.Voila, je voudrai mettre dans un tableau multidimensionel chaque ligne d'un fichier, puis modifier une ligne du tableau pour le réécrire da
Editeur de code VS .NET VC++ [ par Koryn38 ]
Hi, je cherche à comprendre pourquoi sous VStudio .NET, VC++, j'ai d'importants décalages, en mode debug notamment, entre la véritable ligne executée
C++ Standard ? [ par mmuller57 ]
Voila, je viens d'aller sur le site de Bjarne Stroustrup et j'y ai pris un exemple de code source en C++ standard :#include#includeusing namespace std
intercepter un overflow [ par dfrag ]
bonjour je cherche a intercepter un depassement de buffer lors de la lecture d'un fichier ligne a ligne(cf code ci dessous)mais ca marche pas !!!!# de
tableau de char -> string [ par alfred289 ]
bonjour,j'utilise BOrland C++ builder 5 et j'essaie de transformer un tableau de caractères en sring et je trouve pas commentmerci de votre aide
[C] lignes d'un fichier dans un tableau : Segmentation fault [ par Michel76 ]
Bonjour,Pardonnez-moi de cette question de débutant.Soit un fichier contenant :-----001002-----Je souhaiterais mettre chacune des lignes de ce fichier
Livres en rapport
|
Derniers Blogs
SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet [ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS.[ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS. par Patrick Guimonet
C'est un point peu mis en avant mais SharePoint 2013 a été l'occasion de remettre de l'ordre dans les modèles de sites. Tout d'abord, un certain nombre de modèles ont été tout simplement rendus obsolètes (cf. Fonctionnalités déco...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
QUESTION QUESTION par wouroudkouka
Cliquez pour lire la suite par wouroudkouka PB PACMAN C++PB PACMAN C++ par garfield95
Cliquez pour lire la suite par garfield95
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|