none
error C2059: syntax error : 'string' By vector RRS feed

  • Question

  • Bonjour Tout le monde ,

    Lors de la réalisation d'un petit programme sur l'algo de Dijkstra j'ai "DU JOUR AU LENDEMAIN " eu l'erreur : <error C2059: syntax error : 'string' > la source de cette erreur d'après VS2015 est un vector dans mon programme or mon programme marchait parfaitement la veille!!!! Surtout que je ne vois vraiment pas d'où peut provenir l'erreur je sollicite votre aide SVP !!! 

    PS : l'erreur disparaît comme par magie une fois tous les appelles/déclarations des vectors sont mis en commentaire !!! 

    #pragma once
    #include"PElement.h"
    #include"Graphe.h"
    #include"Sommet.h"
    #include"InfoSommetCarte.h"
    #include"InfoAreteCarte.h"
    #include"Arret.h"
    #include<vector>
    
    using namespace std;
    
    
    static Sommet<InfoSommetCarte>* GetNoeud(Graphe<InfoAreteCarte, InfoSommetCarte > *g, int cle) {
    	PElement< Sommet<InfoSommetCarte> > * lSommets;
    	for ( lSommets=g->lSommets; lSommets; lSommets=lSommets->s) {
    		if (lSommets->v->clef == cle) {
    			return lSommets->v;
    		}
    	}
    	return NULL;
    }
    
    static int ChoisirSuivant(vector< pair<double, Sommet<InfoSommetCarte>*> > &v, vector<bool> &f) {
    	double d = INT_MAX;
    	int min = -1;
    	for (int i = 0; i < v.size(); i++) {
    		if (v[i].first < d && !f[i]) {
    			d = v[i].first;
    			min = i;
    		}
    	}
    	f[min] = true;
    	return min;
    }
    
    static void Initialisation(vector< pair<double, Sommet<InfoSommetCarte>*> > &v, Sommet<InfoSommetCarte> *source, int n, vector<bool> &f) {
    	v =  vector< pair<double, Sommet<InfoSommetCarte>*> >(n);
    	int cleSource = source->clef;
    	for (int i = 0; i < n; i++) {
    		if (i == cleSource) {
    			pair<double, Sommet<InfoSommetCarte>*> p;
    			p.first = 0;
    			p.second = NULL;
    			v[i] = p;
    		}
    		else {
    			pair<double, Sommet<InfoSommetCarte>*> p;
    			p.first = INT_MAX;
    			p.second = NULL;
    			v[i] = p;
    		}
    	}
    	f = vector<bool>(n);
    	for (int i = 0; i < n; i++) {
    		if (i == cleSource) {
    			f[i] = true;
    		}
    		else {
    			f[i] = false;
    		}
    	}
    }
    
    static bool IsDifferent(Sommet<InfoSommetCarte>* courant, Sommet<InfoSommetCarte>* destination) {
    	if (courant->clef == destination->clef) {
    		return false;
    	}
    	return true;
    }
    
    static PElement<Sommet<InfoSommetCarte>>* Dijkstra(Graphe<InfoAreteCarte, InfoSommetCarte > *g, Sommet<InfoSommetCarte> *source, Sommet<InfoSommetCarte> *destination) {
    
    	std::vector< pair<double, Sommet<InfoSommetCarte>* > > visite;
    	std::vector<bool> ferme;
    	PElement<Sommet<InfoSommetCarte>> *Pcc=NULL;
    	int NbSommet = g->nombreSommets();
    	Initialisation(visite, source, NbSommet, ferme);
    	Sommet<InfoSommetCarte>* courant = source;
    	int iteration = 0;
    	while (iteration<NbSommet)
    	{
    		int cleCourant = courant->clef;
    
    		PElement< pair< Sommet<InfoSommetCarte>*, Arret<InfoAreteCarte, InfoSommetCarte>* > > *successeur = g->successeur(courant);
    		if (successeur == NULL) {
    			cout << "successeur vide du noeud:"<< courant->v << endl;
    			break;
    		}
    		else {
    			PElement< pair< Sommet<InfoSommetCarte>*, Arret<InfoAreteCarte, InfoSommetCarte>* > > *l;
    			cout<<"successeur du noeud:" << courant->v << endl;
    			for (l = successeur;l; l=l->s) {
    				try {
    					Sommet<InfoSommetCarte>* suivant = l->v->first;
    					cout << suivant->v << endl;
    					double d = l->v->second->v.cout;
    					int cle = suivant->clef;
    					double distanceCourante = visite[cleCourant].first;
    					if (visite[cle].first > (d + distanceCourante)) {
    						visite[cle].first = (d + distanceCourante);
    						visite[cle].second = courant;
    					}
    				}
    				catch (exception e) {
    					cout << e.what() << endl;
    				}
    			}
    		}
    		int cleSuivant = ChoisirSuivant(visite, ferme);
    		cout << "prochaine cle choisi:" << cleSuivant << endl;
    		if (cleSuivant != -1) {
    
    			courant = GetNoeud(g, cleSuivant);
    			cout << "prochain noeud choisi est :" << courant->v<< endl;
    			if (courant == NULL) {
    				cout << "ERROR DANS DIJKSTRA DANS LA RECHERCHE DU SUIVANT" << endl;
    				break;
    			}
    		}
    		else {
    			cout << "ERROR DANS DIJKSTRA DANS LA RECHERCHE DU SUIVANT (cleSuivant ==-1)" << endl;
    			break;
    		}
    		iteration++;
    	}
    	courant = destination;
    	while (courant != NULL) {
    		Pcc = new PElement<Sommet<InfoSommetCarte>>(courant, Pcc);
    		courant = visite[Pcc->v->clef].second;
    	}
    	
    	return Pcc;
    }

    mardi 16 février 2016 19:55

Réponses

  • Bon, ça sent le merdoillage dans les fichiers d'en-tête.

    Comme il n'y a pas de "std::" devant le "string" dans le message d'erreur, ça sent le "using namespace" dans un .h.

    Pour éviter que les conneries que l'on fait dans nos fichiers d'en-tête ne se répercutent dans les fichiers d'en-tête standard, on inclus toujours les en-tête standard en premier.

    Donc déplacez le "include <vector>" juste après le "#prama once", pour voir.


    Paul Bacelar, Ex - MVP VC++

    vendredi 26 février 2016 10:19
    Modérateur

Toutes les réponses

  • Quelle ligne dans le source et le message d'erreur complet, SVP.

    Paul Bacelar, Ex - MVP VC++

    mercredi 17 février 2016 10:14
    Modérateur
  • Bonjour,

    Première correction

    courant = GetNoeud(g, cleSuivant);

    cout << "prochain noeud choisi est :" << courant->v<< endl; if (courant == NULL)
    {
    cout
    << "ERROR DANS DIJKSTRA DANS LA RECHERCHE DU SUIVANT" << endl;
    break;
    }

    Vous allez chercher le noeud courant, vous affichez l'information et aprés vous regardez si le noeud courant est égal à null !!!

    Si le noeud courant est différent de null faites l'affichage cout<< courant->v << endl;

    Cordialement
    Gérard

    mercredi 17 février 2016 10:46
  • le message d'erreur au complet est le titre de ce sujet soit " C2059 : syntax error:'string' " dans le fichier vector ( que je n'ai pas touché ) . Sinon j'ai pu trouver une solution ( que je ne comprend pas d'ailleurs !!! ) en modifiant dans les paramètres du projet en modifiant la RunTime library de " Multi-Threaded debug DLL(/MDd)" en " Multi-Threaded(/MT). Toutefois comme précédemment préciser je ne comprend pas cette solution . D'ailleurs je ne sais même pas la différence entre ses options !!! donc si quelqu'un a une autre solution ou/et a une explication à cette solution je suis toute ouïe !! :D
    jeudi 18 février 2016 01:16
  • Tout à fait d'accord sur ce point !! Cependant si cela était l'erreur cela générera une erreur ou une exception a l'execution et non une erreur de compilation et surtout pas une erreur syntaxique !!! ce qui est le cas ici !!! Aussi cette partie du code est surtout juste du code non propre vue que dans un ordre chronologique j'ai vérifier que la fonction retournera toujours un résultat non null puis j'ai vérifié dans un second temps le contenue du résultat retourné en oubliant de supprimer le contrôle si c'est null !! du coup je suis sur que le problème ne vient pas de là !! 

    jeudi 18 février 2016 01:24
  • Oui le premier problème ne vient pas de là, mais c'est quand même largement souhaitable de ne pas avoir ce genre de code un peu foireux qui traine quand on débogue.

    Le message d'erreur N'EST PAS COMPLET. Il y a au minimum un numéro de ligne et un nom de fichier en plus, que vous l'ayez modifier ou non, c'est pas le problème.

    Arrêtez de vous justifiez, on n'est pas des juges, on est ici pour vous aider. Mais pour cela, il faut répondre correctement à nos questions.

    Quelle ligne dans le source (même si c'est pas le votre) et le message d'erreur complet, SVP ???

    Il y a déjà des choses très étranges :

    -"string" n'existe pas, c'est "std::string"

    -"std::string" utilise "std::vector", alors avoir une "std::string" dans vector(.h), c'est pas logique.

    J'ai donc l'impression que vous n'utilisez pas les classes de la STL correctement.

    Le passage de la RunTime library de " Multi-Threaded debug DLL(/MDd)" en " Multi-Threaded(/MT)", change quelques constantes de compilation qui peuvent influencer les fichiers header utilisés et le code de pas mal de MACRO.

    Ce passage ne peut être LA SOLUTION, car utiliser une C-Runtime "Release" (Multi-Threaded(/MT)) dans un projet en Debug pose pas mal de problème assez complexe.

    Il faut analyser le problème, mais pour cela, il faut répondre à nos questions DE MANIÈRE CORRECTE.


    Paul Bacelar, Ex - MVP VC++

    jeudi 18 février 2016 10:24
    Modérateur
  • Tout à fait d'accord je sais très bien que ce changement de Runtime n'est pas la solution pour le message d'erreur au complet voici un copier coller 
    Severity	Code	Description	Project	File	Line	Suppression State
    Error	C2059	syntax error: 'string'	tp2Representation	c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector	1233	
    
    et merci pour votre aide ;D
    lundi 22 février 2016 03:19
  • Je n'ai pas cette version de VS sous la main, mais l'utilisation de "string" dans l'implémentation de std::vector, c'est vraiment pas très catholique.

    Pouvez-vous nous donner un extrait du code autour de cette ligne 1233 dans "vector" ?


    Paul Bacelar, Ex - MVP VC++

    mardi 23 février 2016 17:35
    Modérateur
  • pour le fichier vector c'est un fichier système de VS !! pour la ligne ou il retourne l'erreur voici un extrait:
    	reference operator[](size_type _Pos)
    		{	// subscript mutable sequence
     #if _ITERATOR_DEBUG_LEVEL == 2
    		if (size() <= _Pos)
    			{	// report error
    			_DEBUG_ERROR("vector subscript out of range");
    			_SCL_SECURE_OUT_OF_RANGE;//ligne 1233
    			}
    
     #elif _ITERATOR_DEBUG_LEVEL == 1
    		_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
     #endif /* _ITERATOR_DEBUG_LEVEL */
    
    		return (*(this->_Myfirst() + _Pos));
    		}

    mercredi 24 février 2016 17:04
  • Bon, ça sent le merdoillage dans les fichiers d'en-tête.

    Comme il n'y a pas de "std::" devant le "string" dans le message d'erreur, ça sent le "using namespace" dans un .h.

    Pour éviter que les conneries que l'on fait dans nos fichiers d'en-tête ne se répercutent dans les fichiers d'en-tête standard, on inclus toujours les en-tête standard en premier.

    Donc déplacez le "include <vector>" juste après le "#prama once", pour voir.


    Paul Bacelar, Ex - MVP VC++

    vendredi 26 février 2016 10:19
    Modérateur