Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

nombre réponses : 25

#0 Re : -1 »  Recherche de langage pr programmation algorithmique : finance 2 marché » Le 18/06/2016, à 08:45

no_spleen
Réponses : 8

Bonjour,

Si tu parles bien du job de "quantitative developer", le C++ est de loin de langage le plus demandé. Je t'invite à regarder les offres d'emploi sur Linkedin pour ce type de poste. On y demande généralement en plus le C et le python. J'ai moi-même passé plusieurs entretiens pour ce genre de poste, et le seul requirement non négociable est le C++.

Bàt,

EDIT: Autre chose, si tu t'intéresse vraiment au monde bancaire/financier, ne perd pas trop de temps à apprendre les tout derniers langages à la mode. En particulier, ne t'attend pas à utiliser les dernières fonctionnalités du C++11, encore moins le C++14. Pour te donner une idée, dans ma boite précédente je codais encore en COBOL. Je n'ai encore jamais travaillé sur un système avec python installé, donc tous mes scripts sont en ksh ou perl.

#1 Re : -1 »  [SOLVED] Besoin d'un coup de main en C++ » Le 05/12/2015, à 12:56

no_spleen
Réponses : 11

Bonjour,

Comme Pingouinux te l'a renseigné, le problème vient de ta variable r. Tu l'initializes à 0 en dehors de ta boucle sur la matrice, et tu l'incrémentes de 1 à l'intérieur à chaque passage -> à la deuxième ligne, r devient égal à 2, ce qui est en dehors des indexes de ta matrices.

Pour ce qui est du style, il y a pas mal à corriger dans ton code. J'ai changé 2/3 trucs dans le code ci-dessous. Je ne dis pas que tout ce que j'ai fait est à garder, ce sont juste des idées en vracs.

PS : je n'ai pas vérifié la bonne implémentation de l'algorithme !
PSS : Est-ce que l'algorithme de Gauss ne s'applique pas seulement aux matrices carrées ? Si oui, pas besoin de demander le nombre de lignes ET de colonnes.

Changements :
- J'ai placé l'initialisation de r dans ta boucle
- Plutôt que de taper vector<vector<float>> partout, mieux vaux effectuer un define en début de code
- Comme renseigné par grigouille, il vaudrait mieux définir une vraie classe matrice, mais j'imagine que ce n'est pas le but de l'exercice
- pourquoi définir une fonction valeur absolue alors qu'il en existe une dans la librairie standard ?
- pour transformer tous les éléments d'un container, il vaut mieux utiliser std::transform que de faire une boucle


#include <iostream>
#include <vector>
#include <string.h>
#include <cmath>
#include <algorithm>

using namespace std;

using Matrice = std::vector< std::vector<float> >;

void afficher_matrice(Matrice matrice) 
{
	for (auto const &row : matrice){ 
		for (auto const &item : row){ 
			cout << item << "    "; 
		}
		cout << "\n\n"; 
	}
}

Matrice matrice_identite(int lignes, int colones)
	// CRÉATION D'UNE MATRICE IDENTITE
{
	Matrice matrice;
	for (int i=0;i<lignes;i++)
	{
		matrice.push_back(vector<float>(colones));
	}

	// remplissage
	for (unsigned int i=0;i<lignes;i++) { for (unsigned int j=0;j<colones;j++) {
		if ( i == j ) { matrice[i][j] = 1; }
		else { matrice[i][j] = 0; }
	}}

	return matrice;
}

void creer_matrice(Matrice &matrice)
	//CRÉATION D'UNE MATRICE AVEC REMPLISSAGE
{
	int lignes,colones;
	cout << "Vous allez creer une matrice, commencez par renseigner sa taille :\nNombre de lignes ? ";
	cin >> lignes;
	cout << "\nNombre de colones ? ";
	cin >> colones;
	for (int i=0;i<lignes;i++){ // ici on fait des pushback pour intialiser notre tableau, ce sera une matrice ligne*colone
		matrice.push_back(vector<float>(colones));

	}
	cout << "\nVotre matrice a bien ete cree. Merci maitnenat de la remplir :";
	for (int i=0;i<lignes;i++){
		for(int j=0;j<colones;j++){
			cout << "\nLigne " << i << " Colone " << j << " : ";
			cin >> matrice[i][j];
		}
	}
	cout << "Votre matrice a bien ete remplie\n";
	//afficher_matrice(matrice);

}

// Commençons par coder les opération éllémentaires utilisées par l'algorythme de gauss-jordan :

void echanger_deux_lignes(Matrice &matrice, int i, int j)
	// ECHANGE DE DEUX LIGNES D'UNE MATRICE
{
	float relai;
	for (unsigned int k=0;k<matrice.size();k++) // on parcourt sur les colones pour inverser les valeurs une par unes
	{
		relai=matrice[i][k];
		matrice[i][k]=matrice[j][k];
		matrice[j][k]=relai;
	}
}

void multiplier_ligne_par_scalaire(Matrice &matrice, int numligne, float scalaire)
	// MULTIPLICATION D'UNE LIGNE D'UNE MATRICE PAR UN SCALAIRE
{
	std::transform(begin(matrice[numligne]),end(matrice[numligne]),begin(matrice[numligne]),
			[&scalaire](auto x){return x*scalaire;});
}

void soustraire_mult_ligne_a_autre(Matrice &matrice, int ligneL, int ligneM, float scalaire)
	// SOUSTRACTION DU MULTIPLE D'UN SCALAIRE PAR UNE LIGNE L A UNE LIGNE M
{
	std::transform(begin(matrice[ligneL]) , end(matrice[ligneL]),
                       begin(matrice[ligneM]) , begin(matrice[ligneL]),
                       [&scalaire](auto l , auto m){return l -= m*scalaire;});
}

// Passons maitnenant a l'inversion en elle meme : il faudra appliquer l'agorythme sur deux matrice ( celle fournie et l'identitée )
Matrice inverse_matrice(Matrice &matrice)
	// INVERSION D'UNE MATRICE VIA GAUSS-JORDAN
{
	// Notons m la taille de la matrice
	int m = matrice.size();
	// créons une matrice identitée a laquelle on apliquera la meme chose
	Matrice ident=matrice_identite(m,m);

	// c'est partit pour l'algorythme de gauss-jordan :
	for (int j=0;j<m;++j)
	{
		float max_colone=abs(matrice[0][j]);
		int k=0;
		int r=0;
		for (int i=r;i<m;i++)
		{
			if ( abs(matrice[i][j]) > max_colone ) 
			{
				max_colone = abs(matrice[i][j]); k=i;
			}   
		}
		if ( matrice[k][j] != 0 )
		{
			r+=1;
			multiplier_ligne_par_scalaire(matrice,k,1/matrice[k][j]);
			multiplier_ligne_par_scalaire(ident,k,1/matrice[k][j]);
			echanger_deux_lignes(matrice,k,r);
			echanger_deux_lignes(ident,k,r);
			for ( int i=0;i<m;i++)
			{
				if ( i != r )
				{ 
					soustraire_mult_ligne_a_autre(matrice,i,r,matrice[i][j]);
					soustraire_mult_ligne_a_autre(ident,i,r,matrice[i][j]);
				}
			}
		}
	}
	return ident;
}

int main()
{
	Matrice matrice;
	creer_matrice(matrice);
	afficher_matrice(matrice);
	afficher_matrice(inverse_matrice(matrice));
}

#2 Re : -1 »  [SOLVED] Besoin d'un coup de main en C++ » Le 05/12/2015, à 14:42

no_spleen
Réponses : 11

Salut !

Effectivement, c'est du C++14, il faut compiler avec l'option -std=C++14.

J'ai aussi testé un peu après avoir posté, et ce n'est clairement pas correct. Mais cela, c'est ton exercice, on ne va pas le faire à ta place :-)

Côté style, il y a aussi une fonction swap pour échanger les valeurs de deux containers, donc tu peux écrire

void echanger_deux_lignes(Matrice &matrice, int i, int j)
{
        swap(matrice[i],matrice[j]);
}

Plutot que d'écrire le swap à la main.

#3 Re : -1 »  [SOLVED] Besoin d'un coup de main en C++ » Le 05/12/2015, à 14:52

no_spleen
Réponses : 11

Bon,

En fait, le problème vient de m'apparaitre, alors je lache le morceau (je pense que les modifs sont assez claires, mais n'hésite pas à poser des questions).

#include <iostream>
#include <vector>
#include <string.h>
#include <cmath>
#include <algorithm>

using namespace std;

using Row = std::vector<float>;
using Matrice = std::vector< Row >;

void afficher_matrice(const Matrice &matrice) 
{
	for (auto const &row : matrice){ 
		for (auto const &item : row){ 
			cout << item << "    "; 
		}
		cout << "\n\n"; 
	}
}


Matrice matrice_identite(int n)
{
	Matrice matrice(n,Row(n,0.0));

	for (auto i=0 ; i < n ; ++i){
		matrice[i][i] = 1.0;
	}

	return matrice;
}

Matrice creer_matrice()
{
	int n;
	cout << "Vous allez creer une matrice, commencez par renseigner sa dimension ";
	cin >> n;

	Matrice matrice(n,Row(n));

	cout << "\nVotre matrice a bien ete cree. Merci maitenant de la remplir :";
	for (int i=0;i<n;++i){
		for(int j=0;j<n;++j){
			cout << "\nLigne " << i << " Colone " << j << " : ";
			cin >> matrice[i][j];
		}
	}
	cout << "Votre matrice a bien ete remplie\n";
	return matrice;

}

// Commençons par coder les opération éllémentaires utilisées par l'algorythme de gauss-jordan :

void echanger_deux_lignes(Matrice &matrice, int i, int j)
{
	swap(matrice[i],matrice[j]);
}

void multiplier_ligne_par_scalaire(Matrice &matrice, int numligne, float scalaire)
{
	std::transform(begin(matrice[numligne]),end(matrice[numligne]),begin(matrice[numligne]),
			[scalaire](auto x){return x*scalaire;});
}

void soustraire_mult_ligne_a_autre(Matrice &matrice, int ligneL, int ligneM, float scalaire)
{
	std::transform(begin(matrice[ligneL]) , end(matrice[ligneL]),
		       begin(matrice[ligneM]) , begin(matrice[ligneL]),
		       [scalaire](auto l , auto m){return l -= m*scalaire;});
}

// gauss-jordan 
Matrice inverse_matrice(Matrice &matrice)
{
	int m = matrice.size();
	Matrice ident=matrice_identite(m);

	int r=-1;
	for (int j=0;j<m;++j)
	{
		float max_colone=abs(matrice[0][j]);
		int k=0;
		for (int i=r+1;i<m;++i)
		{
			if ( abs(matrice[i][j]) > max_colone ) 
			{
				max_colone = abs(matrice[i][j]); k=i;
			}   
		}
		if ( matrice[k][j] != 0 )
		{
			r+=1;
			auto val = matrice[k][j];
			multiplier_ligne_par_scalaire(matrice,k,1.0/val);
			multiplier_ligne_par_scalaire(ident,k,1.0/val);
			echanger_deux_lignes(matrice,k,r);
			echanger_deux_lignes(ident,k,r);
			for ( int i=0;i<m;++i)
			{
				if ( i != r )
				{ 
					val = matrice[i][j];
					soustraire_mult_ligne_a_autre(matrice,i,r,val);
					soustraire_mult_ligne_a_autre(ident,i,r,val);
				}
			}
		}
	}
	return ident;
}

int main()
{
	auto matrice = creer_matrice();
	afficher_matrice(matrice);
	afficher_matrice(inverse_matrice(matrice));
}

En gros :
- r initialisé à -1
- passage par une variable intermédiaire avant l'appel aux fonctions multiplier_ligne_par_scalaire et soustraire_mult_ligne_a_autre, car sinon le premier appel modifie la valeur du scalaire que tu utilises pour le deuxième appel.

Le reste des modifications est juste cosmétique. J'ai modifié le code pour travailler sur des matrices carrées, à toi de voir si c'est correct (c'est un peu loin pour moi, mais on n'inverse que des matrices carrées non ?).

#4 Re : -1 »  [SOLVED] Besoin d'un coup de main en C++ » Le 05/12/2015, à 15:47

no_spleen
Réponses : 11

Alors,

std::transform permet d'appliquer une fonction sur tous les membres d'un/plusieurs containers. Tu trouveras la syntaxe facilement sur internet. Pour la raison de son utilisation, tout est dit ici.

Auto permet de laisser le compilateur déterminer le type d'une variable. D'autres explications ici.

Dans ma version du code, j'utilise aussi des lambda, une autre facilité de C++11. N'hésite pas à faire quelques recherches sur google.

Bon week end !

#5 Re : -1 »  [RESOLU] [C] Afficher *proprement* une structure » Le 10/11/2015, à 12:43

no_spleen
Réponses : 2

Bonjour,

Je viens de vérifier dans ma bible (The Linux Programming Interface, Michael Kerrisk), et ta façon de faire est bien la bonne.

De plus, sur mon système j'ai le define suivant dans le header sched.h

#define sched_priority  __sched_priority

Ce qui fait que tu pourrais utiliser une syntaxe plus naturelle

printf("Valeur de param = %d\n", param.sched_priority);

Bonne journée !

#6 Re : -1 »  [résolu]error:CPU you selected does not support x86-64 instruction set » Le 23/07/2015, à 20:28

no_spleen
Réponses : 11

Bonjour,

Peux-tu essayer en enlevant l'option -march=pentiumpro dans le paragraphe suivant de ton makefile ?

 56 
 57 linux:
 58         $(MAKE) $(MFLAGS) -f Makefile.arch \
 59         "prog   = medit-2.3-linux"\
 60         "CC     = gcc" \
 61         "CFLAGS = -O3 -march=pentiumpro -ansi -fexpensive-optimizations \
 62                   -Wuninitialized -Wunused -Winline -Wshadow" \
 63         "LDFLAGS= -s -static-libgcc $(HOME)/code/library.cur/objects/$(ARCHI)/*.o" \
 64         "INCDIR = -I. -I$(HOME)/code/library.cur/sources" \
 65         "XLIBS  = -L/usr/X11R6/lib -lXmu -lXext -lX11" \
 66         "GL_LIB   = /usr/lib/libGL.so" \
 67         "GLU_LIB  = /usr/local/lib/libGLU.so" \
 68         "GLUT_LIB = /usr/local/lib/libglut.a" \
 69         "EXEDIR = $(HOME)/bin/i86"

#7 Re : -1 »  [résolu]error:CPU you selected does not support x86-64 instruction set » Le 25/07/2015, à 17:36

no_spleen
Réponses : 11

Hello,

J'ai moi même réalisé ma thèse dans le domaine des éléments finis. Connais-tu GMSH ?

Sinon, j'ai réussi à compiler ton programme, en bidoullant un peu les makefiles.

makefile

 57 linux:
 58         $(MAKE) $(MFLAGS) -f Makefile.arch \
 59         "prog   = medit-2.3-linux"\
 60         "CC     = gcc" \
 61         "CFLAGS = -O3 -ansi -fexpensive-optimizations \
 62                   -Wuninitialized -Wunused -Winline -Wshadow" \
 63         "LDFLAGS= -s -static-libgcc " \
 64         "INCDIR = -I. -I./sources/" \
 65         "XLIBS  = -L/usr/X11R6/lib -lXmu -lXext -lX11" \
 66         "GL_LIB   = -lGL" \
 67         "GLU_LIB  = -lGLU" \
 68         "GLUT_LIB = -lglut" \
 69         "EXEDIR = ."

Makefile.arch

 1 # makefile for medit
  2 
  3 # objects list
  4 src    = $(wildcard *.c)
  5 objs   = $(src:.c=.o)
  6 header = $(wildcard *.h)
  7 
  8 # working dirs
  9 SRCDIR = sources
 10 OBJDIR = objects
 11 ARCDIR = archives
 12 DIRDIR = objects $(OBJDIR) $(ARCDIR)
 13 VPATH  = $(SRCDIR)
 14 
 15 # objects list
 16 src    = $(wildcard $(SRCDIR)/*.c)
 17 header = $(wildcard $(SRCDIR)/*.h)
 18 objs   = $(patsubst $(SRCDIR)%,$(OBJDIR)%,$(src:.c=.o))
 19 
 20 #.SILENT:
 21 
 22 $(prog): $(DIRDIR) $(objs)
 23         echo "#define COMPIL " '"' `date` '"' > $(SRCDIR)/compil.date
 24         $(CC) -c $(CFLAGS) $(INCDIR) $(SRCDIR)/medit.c -o $(OBJDIR)/medit.o
 25         $(CC) -o $@ $(objs) $(LDFLAGS) $(GLUT_LIB) $(GL_LIB) $(GLU_LIB) $(XLIBS) -lm
 26         mv $@ $(EXEDIR)
 27 
 28 $(OBJDIR)/%.o: $(SRCDIR)/%.c
 29         $(CC) -c $(CFLAGS) $(INCDIR) $< -o $@
 30 
 31 $(objs): $(header)
 32 
 33 $(DIRDIR):
 34         @[ -d $@ ] || mkdir $@
 35 
 36 clean:
 37         -rm $(objs) $(EXEDIR)/$(prog)
38 
 39 tar:$(DIRDIR)
 40         tar czf $(ARCDIR)/medit.`date +"%Y.%m.%d"`.tgz sources makefile
 41 
 42 target: $(prog)
 43 

#8 Re : -1 »  [résolu]error:CPU you selected does not support x86-64 instruction set » Le 28/07/2015, à 19:49

no_spleen
Réponses : 11

Bonsoir,

Normalement, tu devrais avoir l'éxécutable "medit-2.3-linuxCC" dans le répertoire à partir duquel tu as lancé l'installation.

Si tu veux me contacter, n'hésite pas à m'envoyer un message privé via ce forum.

Bàt,

#9 Re : -1 »  [résolu]error:CPU you selected does not support x86-64 instruction set » Le 28/07/2015, à 20:34

no_spleen
Réponses : 11

Très bonne nouvelle, n'oublie pas de mettre [resolu] au début du titre de ce sujet.

Pour envoyer un message privé, il suffit de cliquer sur mon pseudo au dessus de ce message.

#10 Re : -1 »  [C++] Utiliser les rValue references ? [RESOLU] » Le 09/07/2015, à 06:02

no_spleen
Réponses : 12

Bonjour,

Tu dois utiliser std::move

my_class obj4(std::move(my_class(1,2)));

#11 Re : -1 »  [C++] Utiliser les rValue references ? [RESOLU] » Le 10/07/2015, à 07:32

no_spleen
Réponses : 12

Bonjour,

Je pense qu'il s'agit simplement d'une optimisation du compilateur.

Si tu regardes les displays obtenus par la ligne suivante

my_class obj4{my_class(1,2)};

Tu n'en a qu'un, qui est le constructeur par défaut. -> Le compilateur est assez malin pour comprendre qu'il n'a pas besoin de créer l'object et d'ensuite le déplacer.

Sans optimisation, tu devrais en avoir 2, un display pour la création par défaut du my_class(1,2), et un contructeur par R-value.

En utilisant std:move, tu forces le comportement voulu, qui est en fait moins performant.

#12 Re : -1 »  Recherche un code source mininaliste du noyaux linux. » Le 29/06/2015, à 19:57

no_spleen
Réponses : 3

Hello,

Ce livre doit être exactement ce que tu cherches.

The Art of Linux Kernel Design: Illustrating the Operating System Design Principle and Implementation
de Lixiang Yang

#13 Re : -1 »  librairie UART (programmation C sur AVR) » Le 13/03/2015, à 09:22

no_spleen
Réponses : 8

Bonjour,

As-tu déjà regardé du côté de avr-libc ?

http://www.nongnu.org/avr-libc/

Je débute actuellement l'aprentissage de la programmation d'AVR. Ton retour d'expérience m'intéresse :-)

#14 Re : -1 »  programmer en fortran » Le 12/02/2015, à 20:04

no_spleen
Réponses : 8

Hello,

Question bête, pourquoi ne pas utiliser le compilateur gfortran qui si je ne me trompe pas se trouve dans les dépots ?

#15 Re : -1 »  [Résolu] C++, Qt : size_t does not name a type » Le 05/12/2014, à 21:00

no_spleen
Réponses : 6

Bonjour,

Peux-tu poster ton code pour que nous puissions essayer de le compiler de notre côté ?

#16 Re : -1 »  quel langage pour utiliser des stats? » Le 15/11/2014, à 13:13

no_spleen
Réponses : 16

Bonjour,

Perso je ne suis pas un des plus grands fans de python, mais il existe un module Python fortement utilisé dans le domaine du data science, Pandas.

Pandas

#17 Re : -1 »  [C++] Taille d'un tableau par un pointeur. » Le 02/08/2014, à 12:51

no_spleen
Réponses : 10

Bonjour,

Difficle de donner une réponse précise sans plus de détails sur ton code, mais est-ce que tu ne peux pas remplacer ton tableau par un std::vector < std::string > , ou un std::vector < std::vector < std::string > > ? std::vector possède en effet une fonction size() qui te permet de connaitre la taille de ton vecteur.

#18 Re : -1 »  besoin d'aide pour un code c. » Le 24/08/2013, à 13:29

no_spleen
Réponses : 5

Bonjour,

Une piste pour continuer : as tu essayé ton code ? Je te propose de tester ta fonction sur quelques cas de tests, et les résultats devraient te permettre d'avancer.

#19 Re : -1 »  C: de int vers char* » Le 24/08/2013, à 13:48

no_spleen
Réponses : 6

Salut,

Je ne dois pas bien comprendre ton problème, car j'ai l'impression qu'il suffit de faire cela

   char a = autreFonction();
   int b = fonction(&a);

#20 -1 »  [Résolu] C++ erreur d'édition de lien » Le 03/03/2013, à 19:12

no_spleen
Réponses : 5

Bonjour à tous,

J'ai débuté la programmation d'un petit module de jeu d'échecs, j'en suis à la représentation de l'échiquier et j'ai une erreur à l'édition de lien que je n'arrive pas à résoudre.

Voici comment j'ai structuré la chose :
- Une classe square : chaque case contient dans ses membres son numéro de case et des pointeurs vers les 8 cases adjacentes
- Une classe board : rassemble toutes les cases de l'échiquier dans un std::vector.

Je souhaite ajouter une fonction board::get_iterator qui retourne un iterateur sur le vecteur de cases, et c'est à l'édition de lien de cette fonction que j'ai une erreur.

Voici mes fichiers
iterator.h

#ifndef ITERATOR_H
#define ITERATOR_H

#include <vector>

template <class Item>
class Iterator {
public :
   virtual void First() = 0;
   virtual void Next() = 0;
   virtual bool IsDone() = 0;
   virtual Item CurrentItem() = 0;
protected:
   Iterator();
};


template <class Item>
class VectorIterator : public Iterator <Item>{
public :
   VectorIterator(std::vector<Item>* aVec);
   virtual void First();
   virtual void Next();
   virtual bool IsDone();
   virtual Item CurrentItem();
protected:
   std::vector<Item> *_vec;
   int _current;
};

#endif

iterator.cpp

#include "iterator.h"

template < class Item >
VectorIterator<Item>::VectorIterator(std::vector<Item>* aVec)
{
  _vec = aVec;
  _current=0;
};

template < class Item >
void VectorIterator<Item>::First()
{
   _current=0;
};

template < class Item >
void VectorIterator<Item>::Next()
{
   _current++;
};

template < class Item >
bool VectorIterator<Item>::IsDone()
{
  return _current >= _vec->size();
};


template < class Item >
Item  VectorIterator<Item>::CurrentItem()
{
   return (*_vec)[_current];
};

square.h

#ifndef SQUARE_H
#define SQUARE_H

class square
{
   private :
     static int nb_squares;
     int num;
     square* nxt_0;
     square* nxt_1;
     square* nxt_2;
     square* nxt_3;
     square* nxt_4;
     square* nxt_5;
     square* nxt_6;
     square* nxt_7;
   public :
     square();
     ~square();
     void set_next(int , square*);
     square* get_next(int);
     inline int get_num(){return num;};
};


#endif

square.cpp

#include <iostream>
#include "square.h"


int square::nb_squares = 0;

square::square()
{
   nb_squares++;
   num = nb_squares;
   nxt_0 =0;
   nxt_1 =0;
   nxt_2 =0;
   nxt_3 =0;
   nxt_4 =0;
   nxt_5 =0;
   nxt_6 =0;
   nxt_7 =0;
};

square::~square()
{
   delete nxt_0;
   delete nxt_1;
   delete nxt_2;
   delete nxt_3;
   delete nxt_4;

   delete nxt_5;
   delete nxt_6;
   delete nxt_7;
};

void square::set_next(int nxt , square* sq)
{
   switch (nxt)
   {
     case 0 :
        nxt_0 = sq;
     case 1 :
        nxt_1 = sq;
     case 2 :
        nxt_2 = sq;
     case 3 :
        nxt_3 = sq;
     case 4 :
        nxt_4 = sq;
     case 5 :
        nxt_5 = sq;
     case 6 :
        nxt_6 = sq;
     case 7 :
        nxt_7 = sq;
   }
};


square* square::get_next (int nxt)
{
   switch (nxt)
   {
     case 0 :
        return nxt_0 ;
     case 1 :
        return nxt_1 ;
     case 2 :
        return nxt_2 ;
     case 3 :
        return nxt_3 ;
     case 4 :
        return nxt_4 ;
     case 5 :
        return nxt_5 ;
     case 6 :
        return nxt_6 ;
     case 7 :
        return nxt_7 ;
   }
   return 0;
};

board.h

#ifndef BOARD_H
#define BOARD_H

#include <vector>
#include "square.h"
#include "iterator.h"

class board
{
private :
   int nb_row , nb_col;
   std::vector<square*> squares;
public :
   board(int nb_row , int nb_col);
   square* get_square(int num);
   Iterator<square*>* get_iterator();
};


#endif

board.cpp

#include "board.h"
#include <iostream>



board::board(int _nb_row , int _nb_col)
{

   nb_row = _nb_row;
   nb_col = _nb_col;
   for (int i=0 ; i<nb_row ; i++)
   {
      for (int j=0 ; j<nb_col ; j++)
      {
         squares.push_back(new square);
      }
   }

   int nb_squares = nb_row * nb_col;
   for (int i=0 ; i < nb_squares; i++)
   {
     int row = i / nb_col + 1;
     int col = i%nb_col +1;

     // rangée du dessus
     if ( row < nb_row)
     {
        squares[i]->set_next(1,get_square(i+nb_col));
        if (col < nb_col)
        {
              squares[i]->set_next(2,get_square(i+nb_col+1));
        }
        if (col != 1)
        {
              squares[i]->set_next(0,get_square(i+nb_col-1));
        }
     }

     // case de droite
     if (col < nb_col)
        squares[i]->set_next(4,get_square(i+1));

     // case de gauche
     if (col != 1)
        squares[i]->set_next(3,get_square(i-1));

     // rangée du bas
     if (row > 1)
     {
        squares[i]->set_next(6,get_square(i-nb_col));
        if (col < nb_col)
                squares[i]->set_next(7,get_square(i-nb_col+1));
        if (col != 1)
                squares[i]->set_next(5,get_square(i-nb_col-1));
     }
   }
};


square* board::get_square(int num)
{
   if (num > nb_row*nb_col  || num < 0)
   {
      return 0;
   }
   else
   {
      return squares[num];
   }
};

Iterator<square*>* board::get_iterator()
{
   return new VectorIterator<square*>(&squares);
};

Et quand je veux compiler, j'ai cette erreur

board.o: dans la fonction « board::get_iterator() »:
board.cpp:(.text+0x41c): référence indéfinie vers « VectorIterator<square*>::VectorIterator(std::vector<square*, std::allocator<square*> >*) »
collect2: erreur: ld a retourné 1 code d'état d'exécution

Est-ce que vous voyez l'erreur ?

Merci de votre aide,

#21 Re : -1 »  [Résolu] C++ erreur d'édition de lien » Le 07/03/2013, à 20:03

no_spleen
Réponses : 5

Je n'ai toujours pas trouvé la solution, donc si une personne à une piste :-)

#22 Re : -1 »  [Résolu] C++ erreur d'édition de lien » Le 07/03/2013, à 21:20

no_spleen
Réponses : 5

Bon, il a suffit que je valide le message précédent pour que l'erreur me saute aux yeux. Iterator est une classe template, et j'avais placé la définition et l'implémentation dans deux fichiers différents...

Merci à ceux qui ont réfléchi au problème !

#23 Re : -1 »  [Résolu] C++ erreur d'édition de lien » Le 07/03/2013, à 22:31

no_spleen
Réponses : 5

Bonjour pingouinux,

Le contenu du fichier iterator.cpp doit se trouver dans le fichier iterator.h (il n'y a donc pas de fichier iterator.cpp). Ceci car l'implémentation des fonctions templates doit se trouver dans le même fichier que leurs déclarations.

Je ne peux malheureusement pas te donner plus de détails car je ne suis pas non plus un expert en C++. Ce petit projet est justement un moyen de m'y remettre !.

Dans les versions des sources de mon premier message, j'ai aussi oublié les instructions break dans le switch de la fonction square::set_next.

J'espère avoir été plus clair.

Bàt,

#24 Re : -1 »  [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs » Le 15/08/2012, à 19:34

no_spleen
Réponses : 33

@pinguinux

La règle était que si plusieurs mots ont la même taille, on prend le premier. Ici phrase à la même taille que tester.