begin process at 2013 05 23 04:59:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Tableau de string


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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&#8217;½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&#8217;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&#8217;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

Administrateur CodeS-SourceS

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

Administrateur CodeS-SourceS

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&#8217;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

Administrateur CodeS-SourceS

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

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales