Problème de segmentation, incrémentation champs de tableaux

Résolu
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 - 31 oct. 2010 à 10:02
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 2 nov. 2010 à 10:28
Bonjour,
J'ai un petit souci en langage C++ rien de bien compliquer mais bon sachant que je suis rouiller quelques années... J'ai créer une class avec en son sein deux fonctions. La première place tous simplement son argument dans un tableau (du moins elle essaye lol) et La deuxieme nous affiche le contenue du tableau.
En théorie c'est simple en pratique prise de tete...
Voici la ligne de commande pour la compilation : g++ -o tmp.exe tmp.cpp
Durant la compilation aucune erreur n'est retourner et la compilation s'effectue correctement, mais lors de l'exécution j'obtient une erreur de segmentation. Voici le code :


	#define taille_tab(tab) sizeof(tab)/sizeof(tab[0])
#include <string>
#include  
#include <vector>
using namespace std ;

class redigeForMe
{
public  :
void addLigne( const char* str ) ;
void cc( void ) ;
vector< string > mesChaines;
static int counter ;
private :
int index ;
int nbIns ; // nombre d'instruction archivé
string HTMLcode ;		
} ;

int redigeForMe::counter = 0 ;
void redigeForMe::addLigne( const char* str )
{
cout << counter << endl ;
mesChaines[ counter ] = str ;
counter += 1 ;
} ;

void redigeForMe::cc( void ) // Create Content
{
for( index = 0 ; index < counter ; index++ )
HTMLcode += mesChaines[ index ] + "\n"  ;
cout << HTMLcode << endl ;
} ;



Voila son équivalent en php (en gros comment j'aurais souhaitez que sa marche)


$MesChaines = Array() ;
$HTMLCode = "" ;

function addLigne($str)
{
    global $MesChaines ;
    $MesChaines[ count( $MesChaines ) ] = $str ;
} ;

function cc()
{
    global $MesChaines ;
    global $HTMLCode ;
             for( $index = 0 ; $index < count( $MesChaines ); $index++ )
                   $HTMLCode .= $MesChaines[ $index ] ;
    echo $HTMLCode ;
} ;



Cordialement, Adam.

2 réponses

wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
31 oct. 2010 à 11:28
Bon voici la réponse :

void redigeForMe::addLigne( const char* str )
{
mesChaines.push_back( string(str) );
}


il faut utilisé push_back() ;

tchaooo
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 nov. 2010 à 10:28
Plein de remarques:
- Évite les using namespace std, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Évite les char*, préfère les std::string.
- En C++, inutile de mettre void dans une fonction ne prenant pas d'argument, on préfère laisser les parenthèses vides.
- Lorsque l'on concatène un nombre indéfini d'éléments, on évite d'utiliser un std::string. On préfère utiliser une classe dédiée aux concaténations rapides: std::iostringstream.
- Pour parcourir une collection, on utilise une méthode unifié appelée "iterateur".
- Une fonction d'affichage prend généralement en argument le flux ou afficher (sortie standard, sortie d'erreur, un fichier, etc...).

Là c'est du détail:
- Une classe commence généralement par une majuscule.
- On différencie les attributs d'une classe, par exemple en les préfixant d'un "_".
- Met plus de warning sur ta ligne de compil, au moins: g++ -W -Wall -Wabi -pedantic

#include <sstream>
#include 
#include <vector>

class RedigeForMe
{
public:
  void addLigne(const std::string& str);
  void cc(std::ostream& out);

private:
  typedef std::vector<std::string>::const_iterator iter;

  std::vector<std::string> _mesChaines;
  int nbIns; // nombre d'instruction archivé
};

void RedigeForMe::addLigne(const std::string& str)
{
  _mesChaines.push_back(str);
}

void RedigeForMe::cc(std::ostream& out)
{
  std::ostringstream buff;

  for (iter it = _mesChaines.begin(); it != _mesChaines.end() ; ++it)
    buff << *it << std::endl;
  out << buff.str() << std::endl;
}


int main()
{
  RedigeForMe redige;

  redige.addLigne("Linge 1");
  redige.addLigne("Linge 2");

  redige.cc(std::cout); // Sortie standard
  redige.cc(std::cerr); // Sortie d'erreur
  //  redige.cc(file); // On pourrait aussi mettre un fichier

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous