Problème de segmentation, incrémentation champs de tableaux [Résolu]

Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 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.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
3
Merci
Bon voici la réponse :

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


il faut utilisé push_back() ;

tchaooo

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 210 internautes nous ont dit merci ce mois-ci

Commenter la réponse de wizard512
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
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
Commenter la réponse de cptpingu