IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez C++ Discussion :

Sources C++ : mettez votre code ici


Sujet :

Contribuez C++

  1. #1
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut Sources C++ : mettez votre code ici
    Bonjour à tous.

    L'équipe a pensé qu'il pourrait être intéressant de mettre à disposition une page recensant les petits bouts de codes récurrents, plutôt utiles pour vos développements.
    Nous espérons que vous ajouterez les votres ci-dessous.
    Nous nous efforcerons d'adapter ceux mis dans le forum également.

    Merci donc, de poster ci-après ce que vous souhaitez mettre à la disposition de tous (votre code, ou celui d'autres dans ce forum). Ce code sera entièrement libre et gratuit.

    Ce thread est un espace de stockage temporaire de vos codes avant intégration dans la future page Sources

    Précisez à chaque fois :
    - Titre
    - Auteur
    - Champ d'application

    Merci de nous aider dans ce sens, et de permettre ainsi d'aider encore plus de monde.

    L'équipe C++
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Résolution d'équation différentielle par la méthode de Runge-Kutta

    Auteur : millie

    Champs d'application : Dès que l'on souhaite résoudre une équation différentielle du premier ordre du type : dy/dx = f(x,y)

    Code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <iostream>
    #include <cmath>
     
    /**
     Permet la résolution d'équation différentielle du type :
      dy/dx = f(x,y)
      Avec des conditions initiales sur y et x.
     */
    class RungeKutta
    {
     private:
      double (*eqnFun) (double, double);
      double y_current;
      double dx;
      double nbpas;
      double x_current;
     public:
      RungeKutta(double (*f) (double, double), double dx, double y0, double x0);
      void suivant();
      double lireY() const;
      double lireX() const;
     
     virtual ~RungeKutta();
    };
     
    /**
     * f correspond à la fonction de l'équation différentielle,
     * (x0, y0) correspondent aux conditions initiales de l'équation
     * deltax correspond au pas de discrétisation
     **/
    RungeKutta::RungeKutta(double (*f) (double, double), double deltax, double y0, double x0)
    {
     eqnFun = f;
     dx= deltax;
     y_current = y0;
     x_current = x0;
     this->nbpas = nbpas;
    }
     
     
    /**
     * Calcul de l'étape suivante
     *  Donc : calcul de y{n+1} et de x{n+1}
     */
    void RungeKutta::suivant()
    {
      double k1;
      double k2;
      double k3;
      double k4;
     
      k1 = eqnFun(x_current, y_current) * dx;
      k2 = eqnFun(x_current + dx / 2.0, y_current+k1/2.0) *dx;
      k3 = eqnFun(x_current + dx/2.0, y_current+k2/2.0) *dx;
      k4 = eqnFun(x_current + dx, y_current+ k3) *dx;
     
      y_current += 1.0/6.0 * (k1 + 2.0*k2 + 2.0*k3 + k4);
      x_current += dx;
     
    }
     
    /**
     * Recupère la valeur de y{n} courant
     */
    double RungeKutta::lireY() const
    {
     return y_current;
    }
     
    /**
     * Recupère la valeur de x{n} courant
     */
    double RungeKutta::lireX() const
    {
     return x_current;
    }
     
    RungeKutta::~RungeKutta() {
    }
     
     
    /*****
     * pour les tests
     *****/
    double equation(double x, double y)
    {
      return (-2.0 * x*y);
    }
     
     
    int main(void)
    {
      double x0 = 0.0;
      double y0 = 1.0;
      double dx = 0.1;
     
     /****
      * On résout l'équation différentielle :
      *  dy/dx = -2x*y (y0 = 1 et x0 = 0)
      *  Donc de solution : y = exp(-x²)
      ****/
      RungeKutta eqn = RungeKutta(equation, dx, y0, x0);
     
      for(int i=0; i<20;i++)
      {
        std::cout<<"Solution par RungeKutta : "<<eqn.lireY()<<", solution analytique"<<exp(-eqn.lireX() * eqn.lireX())<<std::endl;
        eqn.suivant();
      }
     
    	return EXIT_SUCCESS;
    }
    Je ne répondrai à aucune question technique en privé

  3. #3
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par r0d
    Une matrice 2D template qui utilise un std::vector:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    // Template class Dyn2DMatrix 
    // 
    // * la construction de cette matrice se fait de manière à ce que chaque rangée (row) comporte 
    // le même nombre de colonnes (col). 
    // * le type contenu dans le tableau doit avoir:
    // -> un constructeur par défaut, 
    // -> un constructeur de copie, 
    // -> un opérateur d'affectation. 
    // * il est possible de définir un élément neutre (neutralElement) dans le constructeur, cet 
    // élément sert à remplir les trous du tableau. S'il n'est pas défini, l'élément neutre est 
    // construit à partir du constructeur par défaut du type contenu dans le tableau. 
    // * lorsqu'un élément est rajouté, la matrice s'aggrandit automatiquement ( voir mutateur )   
     
    #ifndef DYN_2D_MATRIX 
    #define DYN_2D_MATRIX   
     
    #include <vector>   
     
    namespace DynMatrix 
    {   
     
    template <typename T> 
    class Dyn2DMatrix 
    { 
    private: 
         size_t m_nbRow, m_nbCol; 
         std::vector<T> m_array; 
         T m_neutralElement;   
     
    public: 
         // --- construction/destruction  
         Dyn2DMatrix()  
         : m_nbRow(0)
         , m_nbCol(0)
         , m_neutralElement(T())  
         { }
     
         Dyn2DMatrix(const size_t nbRow, const size_t nbCol)  
         : m_nbRow(nbRow)
         , m_nbCol(nbCol)
         , m_neutralElement(T())  
         {  
              std::vector<T>::iterator it = m_array.begin(); 
              m_array.insert(it, nbRow*nbCol, m_neutralElement); 
         }   
     
         Dyn2DMatrix(const T &neutralElement)  
         : m_nbRow(0)
         , m_nbCol(0), m_neutralElement(T())  
         { }   
     
         Dyn2DMatrix(const size_t nbRow, const size_t nbCol, const T &neutralElement)  
         : m_nbRow(nbRow)
         , m_nbCol(nbCol)
         , m_neutralElement(neutralElement)  
         {  
              std::vector<T>::iterator it = m_array.begin(); 
              m_array.insert(it, nbRow*nbCol, m_neutralElement); 
         }  
     
         ~Dyn2DMatrix(){}   
     
         // --- accesseurs  
         T operator() (const size_t row, const size_t col) const  
         {  
              if ( ( m_nbRow <= row ) || ( m_nbCol <= col ) )  
                   throw std::exception("const Dyn2DMatrix subscript out of bounds");   
     
              return m_array[m_nbCol*row+col]; 
         }   
     
         size_t width() {return m_nbCol;}  
         size_t height() {return m_nbRow;}   
     
         // --- mutateurs  
         T &operator() (const size_t row, const size_t col)  
         {  
              // Dans un premier temps, je vérifie si la matrice est assez grande.  
              // Si elle ne l'est pas, je l'aggrandis.   
              if ( m_nbCol <= col )  
              {
                   // je dois ajouter des colonnes  
                   size_t colDiff = col - m_nbCol + 1; 
                   for (size_t curRow = 0 ; curRow < m_nbRow ; ++curRow )  
                   {  
                        std::vector<T>::iterator it = m_array.begin(); 
                        size_t tmp = curRow*(col+1) + m_nbCol; 
                        m_array.insert( it + tmp, colDiff, m_neutralElement); 
                   }  
                   m_nbCol = col+1; 
              }   
     
              if ( m_nbRow <= row )  
              {
                   // je dois ajouter des rangées  
                   std::vector<T>::iterator it = m_array.begin();
                   m_array.insert(it+m_nbCol*m_nbRow, (row - m_nbRow + 1)*m_nbCol, m_neutralElement); 
                   m_nbRow = row+1; 
              }  
     
              // puis je retourne simplement l'élément demandé.  
              return m_array[m_nbCol*row+col]; 
         }   
     
         // méthode clear: initialise tous les éléments de la matrice avec l'élément passé  
         // en paramètre.  
         void clear(const T &initElement = m_neutralElement)  
         {  
              std::vector<T>::iterator it; 
              for ( it = m_array.begin() ; it != m_array.end() ; ++it)  
                   (*it) = initElement; 
         } 
    };   
     
    } //namespace 
     
    #endif
    Exemple d'utilisation (une matrice d'entiers):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // une fonction d'affichage de la matrice (en mode console)
    template <typename T>
    void displayMatrix(DynMatrix::Dyn2DMatrix<T> matrix)
    {
    	for (size_t i=0; i<matrix.height(); i++)
    	{
    		for (size_t j=0; j< matrix.width(); j++)
    		{
    			cout << matrix(i, j) << "  ";
    		}
    		cout << endl;
    	}
    }
     
    // exemple d'utilisation:
    DynMatrix::Dyn2DMatrix<int> matrix(4, 3);
    matrix(2,1) = 1;
    displayMatrix(matrix);
     
    matrix.clear(2);
    displayMatrix(matrix);
     
    matrix(4,3) = 3;	
    displayMatrix(matrix);
    Limitations connues: il semble qu'il y ait quelques problème pour compiler ça sous linux.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre habitué Avatar de deeal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 218
    Points : 169
    Points
    169
    Par défaut
    Connaitre la taille memoire exacte avec les differents (Private, mapped, ect...)

    Auteur : moi meme

    Champ d'applocation : quand on une grande application, et on veut vraiment traquer la memoire utilisee par notre application


    Code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    #include "Psapi.h"
     
    #pragma comment(lib,"Psapi.lib")
    using namespace std;
     
     
     
    int _tmain(int argc, _TCHAR* argv[])
     
    {
     
    			cout << "Parcourir la memoire virtuelle" << endl;
    			cout << "==============================" << endl;
    			 SIZE_T address = 0;
    			 SIZE_T returnVal = -1;
    			 LPCVOID inputAddress = 0;
    			 HANDLE currProcess = GetCurrentProcess();
    			 MEMORY_BASIC_INFORMATION memInfoStruct;
    			 ZeroMemory(&memInfoStruct, sizeof(MEMORY_BASIC_INFORMATION));
     			 // VirtualQueryEx retourne 0 avec une adress du kernel
    			 // commencer la lecture de la memoire
    			 while(returnVal != 0)
    			 {
    							inputAddress = (LPCVOID)address;
    							returnVal = VirtualQueryEx(currProcess, inputAddress, &memInfoStruct, sizeof(MEMORY_BASIC_INFORMATION));
    							cout << address << "\t" << memInfoStruct.RegionSize  << "\t";
    							// State
    							// MEM_COMMIT - 0x1000
    							// MEM_FREE - 0x10000
    							// MEM_RESERVE - 0x2000
    							if(memInfoStruct.State == 0x1000 )
    							{
    										cout << "MEM_COMMIT\t";
    							}
    							else if( memInfoStruct.State == 0x10000 )
    							{
    										cout << "MEM_FREE\t";
    							}
    						 else if( memInfoStruct.State == 0x2000 )
    							{
    										cout << "MEM_RESERVE\t";
    							}
    							// Protect
    							// PAGE_EXECUTE - 0x10
    							// PAGE_EXECUTE_READ - 0x20
    							// PAGE_EXECUTE_READWRITE - 0x40
    							// PAGE_EXECUTE_WRITECOPY - 0x80
    							// PAGE_NOACCESS - 0x01
    							// PAGE_READONLY - 0x02
    							// PAGE_READWRITE - 0x04
    							// PAGE_WRITECOPY - 0x08
    							// PAGE_GUARD - 0x100
    							// PAGE_NOCACHE - 0x200
    							// PAGE_WRITECOMBINE - 0x400
    							cout << memInfoStruct.AllocationProtect << "\t";
    							cout << memInfoStruct.Protect << "\t";
    							// TYPE 
    							// MEM_IMAGE - 0x1000000
    							// MEM_MAPPED - 0x40000
    							// MEM_PRIVATE - 0x20000
    							if(memInfoStruct.Type == 0x1000000 )
    							{
    										 cout << "MEM_IMAGE\t";
    										 _TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
    										 HMODULE modHandle = (HMODULE)memInfoStruct.AllocationBase;
    										 GetModuleBaseName(currProcess, modHandle, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    										 _tprintf( _T("%s"), szProcessName );
    							}
    							else if( memInfoStruct.Type == 0x40000 )
    							{
    										 cout << "MEM_MAPPED\t";
                         _TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
                         HMODULE modHandle = (HMODULE)memInfoStruct.AllocationBase;
                         GetModuleBaseName(currProcess, modHandle, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
                         _tprintf( _T("%s"), szProcessName );
    							}
    							else if( memInfoStruct.Type == 0x20000 )
    							{
    										 cout << "MEM_PRIVATE\t";
    							}
    							cout << endl;
      						address = address + memInfoStruct.RegionSize;
     
     
    			 }
           char c;
           cin>>c;
    			 return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut Re: [Win32] Connaitre les tailles mémoire exactes d'un process
    Ouille... C'est la première fois que je vois une indentation à 3 tabs par colonne...

    Code réindenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    #include "Psapi.h"
     
    #pragma comment(lib,"Psapi.lib")
    using namespace std;
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << "Parcourir la memoire virtuelle" << endl;
    	cout << "==============================" << endl;
    	SIZE_T address = 0;
    	SIZE_T returnVal = -1;
    	LPCVOID inputAddress = 0;
    	HANDLE currProcess = GetCurrentProcess();
    	MEMORY_BASIC_INFORMATION memInfoStruct;
    	ZeroMemory(&memInfoStruct, sizeof(MEMORY_BASIC_INFORMATION));
    	// VirtualQueryEx retourne 0 avec une adress du kernel
    	// commencer la lecture de la memoire
    	while(returnVal != 0)
    	{
    		inputAddress = (LPCVOID)address;
    		returnVal = VirtualQueryEx(currProcess, inputAddress, &memInfoStruct, sizeof(MEMORY_BASIC_INFORMATION));
    		cout << address << "\t" << memInfoStruct.RegionSize  << "\t";
    		// State
    		// MEM_COMMIT - 0x1000
    		// MEM_FREE - 0x10000
    		// MEM_RESERVE - 0x2000
    		if(memInfoStruct.State == 0x1000 )
    		{
    			cout << "MEM_COMMIT\t";
    		}
    		else if( memInfoStruct.State == 0x10000 )
    		{
    			cout << "MEM_FREE\t";
    		}
    		else if( memInfoStruct.State == 0x2000 )
    		{
    			cout << "MEM_RESERVE\t";
    		}
    		// Protect
    		// PAGE_EXECUTE - 0x10
    		// PAGE_EXECUTE_READ - 0x20
    		// PAGE_EXECUTE_READWRITE - 0x40
    		// PAGE_EXECUTE_WRITECOPY - 0x80
    		// PAGE_NOACCESS - 0x01
    		// PAGE_READONLY - 0x02
    		// PAGE_READWRITE - 0x04
    		// PAGE_WRITECOPY - 0x08
    		// PAGE_GUARD - 0x100
    		// PAGE_NOCACHE - 0x200
    		// PAGE_WRITECOMBINE - 0x400
    		cout << memInfoStruct.AllocationProtect << "\t";
    		cout << memInfoStruct.Protect << "\t";
    		// TYPE 
    		// MEM_IMAGE - 0x1000000
    		// MEM_MAPPED - 0x40000
    		// MEM_PRIVATE - 0x20000
    		if(memInfoStruct.Type == 0x1000000 )
    		{
    		cout << "MEM_IMAGE\t";
    			_TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
    			HMODULE modHandle = (HMODULE)memInfoStruct.AllocationBase;
    			GetModuleBaseName(currProcess, modHandle, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    			_tprintf( _T("%s"), szProcessName );
    		}
    		else if( memInfoStruct.Type == 0x40000 )
    		{
    			cout << "MEM_MAPPED\t";
    			_TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
    			HMODULE modHandle = (HMODULE)memInfoStruct.AllocationBase;
    			GetModuleBaseName(currProcess, modHandle, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    			_tprintf( _T("%s"), szProcessName );
    		}
    		else if( memInfoStruct.Type == 0x20000 )
    		{
    			cout << "MEM_PRIVATE\t";
    		}
    		cout << endl;
    		address = address + memInfoStruct.RegionSize;
    	}
    	char c;
    	cin>>c;
    	return 0;
    }
    PS: Quels headers as-tu inclus dans stdafx.h ?
    Et pourquoi des guillemets au lieu des <> sur les headers standards ainsi que ceux de Windows ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Mauvais forum ? Ou alors rappeler les pré-requis. Parce qu'avec SunWSPro, je ne pourrais définitivement rien en faire.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 43
    Points
    43
    Par défaut Un tokenizer simple
    Auteur : flyweight

    Champs d'application : Pour decouper une chaîne de caractères selon des séparateurs

    exemple: T=Tok(string("x=9;y=7"),string(" ;="));
    T=["x","9","y","7"]

    Code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include <algorithm>
    #include <string>
    #include <deque>
    #include <iostream>
     
    using namespace std;
     
    typedef std::deque<std::string> StringList;
     
    StringList Tok(std::string source, std::string sep)
    {
            StringList T;
            std::string S;
     
            unsigned int j=0;
            while (!(sep.find(source[j])==std::string::npos)) {
                    j++;
            }
     
            for (unsigned int i=j; i<source.length(); i++) {
                    if (!(sep.find(source[i])==std::string::npos || S=="")) {
                            T.push_back(S);
                            S="";
                            if (i<source.length()-1) {
                                    while (!(sep.find(source[i+1])==std::string::npos || (i
                                                    ==source.length()-1)))
     
                                            i++;
                            }
     
                    } else {
                            S.push_back(source[i]);
                    }
                    if (i==source.length()-1&& S.length()>0)
                            T.push_back(S);
            }
            return T;
    }

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 43
    Points
    43
    Par défaut fonctions mathématiques optimisées
    Auteur : flyweight

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    //racine caree
    inline float asm_sqrt(float x)
    {
      __asm{
        fld x;
        fsqrt;
        fstp x;
      }
      return x;
    }
    //cosinus
    inline float asm_cos(float x)
    {
      __asm{
        fld x;
        fcos;
        fstp x;
      }
      return x;
    }
    //sinus
    inline float asm_sin(float x)
    {
      __asm{
        fld x;
        fsin;
        fstp x;
      }
      return x;
    }
    //racine carree ave instruction SSE
    inline float sqrtSSE(float f)	{
      __asm    {    
       MOVSS xmm2,f     
       SQRTSS xmm1, xmm2     
       MOVSS f,xmm1   
      }    
      return f;
    }

    Sous le compilateur msvc7 (SSE et SSE2 activé architecture i386)
    pour gcc il faut remplacer __asm{code} par asm("code"); et mettre l'option
    -msse pour SSE
    -mmmx pour MMX

    Albert EINSTEIN
    « Je n’ai pas de talents particuliers. Je suis juste passionnément curieux. »

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    (Un peu compliqué l'algo; manque les références constantes; types incorrects ; il y a tout ce qu'il faut dans boost (et dans la FAQ) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <string>
     
    template <typename OO, typename Sep> 
    OO split(std::string const& source, OO dest, Sep sep)
    {
        std::string::size_type p = 0;
        while (p != std::string::npos) // pas top efficace
        {
            const std::string::size_type p2 = source.find_first_of(sep, p);
            if (p2 != std::string::npos) {
                *dest++ = source.substr(p, p2-p);
                p = p2 + 1;
            } else {
                *dest++ = source.substr(p);
                p = p2;
            }
        }
        return dest;
    }
     
    #include <vector>
    #include <iterator>
    #include <algorithm>
     
    int main (int argc, char **argv)
    {
    #if 0
        std::vector<std::string> res;
        split("x=9;y=7", std::back_inserter(res), " ;=");
        std::copy(
            res.begin(),res.end(),
            std::ostream_iterator<std::string>(std::cout,"\n"));
    #else
        split("x=9;y=7", std::ostream_iterator<std::string>(std::cout,"\n"), " ;=");
    #endif
     
    }
    Pour le second code, édite-le pour préciser l'architecture cible ; et tant qu'à faire le gain car rien ne garantit qu'il y en ait un si tu utilises le compilo et les options qui vont bien.)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par flyweight Voir le message
    Auteur : flyweight

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    //racine caree
    inline float asm_sqrt(float x)
    {
      __asm{
        fld x;
        fsqrt;
        fstp x;
      }
      return x;
    }
    //cosinus
    inline float asm_cos(float x)
    {
      __asm{
        fld x;
        fcos;
        fstp x;
      }
      return x;
    }
    //sinus
    inline float asm_sin(float x)
    {
      __asm{
        fld x;
        fsin;
        fstp x;
      }
      return x;
    }
    //racine carree ave instruction SSE
    inline float sqrtSSE(float f)	{
      __asm    {    
       MOVSS xmm2,f     
       SQRTSS xmm1, xmm2     
       MOVSS f,xmm1   
      }    
      return f;
    }
    en quoi elles sont optimisé??
    si tu veut des fonctions math qui peuvent être plus rapide regarde
    http://ktd.club.fr/programmation/cpp-fastmath.php

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pour GCC, asm ne fonctionne pas comme tu l'as dit.
    http://www.developpez.net/forums/sho...61#post2843861

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 43
    Points
    43
    Par défaut class de vecteur4D en SIMD
    Auteur : flyweight

    c'est un exemple de classe de vecteur en SIMD
    ce n'est pas une classe complete mais elle donne une idée sur l'utilisation des instructions SIMD.
    Remarque:
    cette fois le code compile tres bien sur gcc
    attention: ajouter l'option -msse sous gcc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    //Auteur : flyweight
    #include <xmmintrin.h>
    //pour la conversion
    union conv {
            __m128 m128;
            float index[4];
    };
     
    class Vecteur4D
    {
    public:
            //constructeurs
            Vecteur4D() {
                    _mm_set1_ps(0);
            }
            Vecteur4D(float x,float y,float z,float w) {
                    conv m;
                    m.index[0]=x;
                    m.index[1]=y;
                    m.index[2]=z;
                    m.index[3]=w;
     
                    data=m.m128;
            }
            Vecteur4D(__m128 a) {
                    data=a;
            }
     
            inline const Vecteur4D operator +( const Vecteur4D &vec ) const {
                    return Vecteur4D( _mm_add_ps( data, vec.data ) );
            }
     
            inline const Vecteur4D operator *( const Vecteur4D &v ) const {
                    return Vecteur4D( _mm_mul_ps( data, v.data ) );
            }
     
            inline const float getX() {//de meme pour getY getZ ...
                    conv m;
                    m.m128=data;
                    return m.index[0];
            }
            void setX(const float x) {//de meme pour setY setZ ...
                    conv m;
                    m.m128=data;
                    m.index[0]=x;
                    data=m.m128;
            }
     
     
            __m128 data;
    };
    exemple:

    Vecteur4D v(1,3,9,0);
    Vecteur4D v2(3,6,9,7);
    Vecteur4D s=v+v2;

    cout << s.getX()<< endl;

    on obtient 4

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Cool.
    Pourrai tu regarder ce thread, a propose de ton code sur fcos.
    http://www.developpez.net/forums/sho...61#post2843861
    On as peut être quelque chose qui manque. Car au final cela ne serait pas toujours vrai comme tu le dit.

  14. #14
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /**
    *       split an std::string into several strings, using a separator
    *       @param   str         string to explode
    *       @param   separator   separator
    *       @return  a vector that contains the strings built from the input string
    */
    std::vector<std::string> Explode(const std::string & str, char separator )
    {
       std::vector< std::string > result;
       size_t pos1 = 0;
       size_t pos2 = 0;
       while ( pos2 != str.npos )
       {
          pos2 = str.find(separator, pos1);
          if ( pos2 != str.npos )
          {
             if ( pos2 > pos1 )
                result.push_back( str.substr(pos1, pos2-pos1) );
             pos1 = pos2+1;
          }
       }
       result.push_back( str.substr(pos1, str.size()-pos1) );
       return result;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    C'est aussi faisable avec std::getline et std::stringstream
    (aucune idée duquel est plus performant)

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'en doute. Tu paies les flux et toutes leurs fonctions virtuelles (qui servent en d'autres circonstances), plus une copie de la chaine de départ.
    De l'autre côté, on ne fait que rechercher un caractère et copier des groupes de caractères vers des chaines.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En effet. L'utilisation des stringstreams est plus couteuse.

  18. #18
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Par contre, il doit y avoir moyen de faire ça avec boost::regex , non?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  19. #19
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Voir même boost.tokenizer

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    version qui marche sous visual et gcc utilisant un foncteur et for_each

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <vector>
    #include <string>
    #include <iostream>
    #include <iterator>
    #include <algorithm>
     
    struct spliter
    {
    	//constructeur de base
    	spliter(std::vector<std::string> & vect,const char c) : m_separator(c),m_split(vect)
    	{
    		m_split.resize(1);
    		m_split[0].clear();
    	};
     
    	//constructeur de recopie.
    	spliter(const spliter & split)
    		:  m_separator(split.m_separator),m_split(split.m_split)
    	{
    		if(m_split.size() == 0) m_split.resize(1);
    	}
     
    	void operator()(const char & c)
    	{
    		//si le caractere est le séparateur
    		//on ajoute m_s dans le vector
    		if (c == m_separator)
    		{
    			if (!(*m_split.rbegin()).empty())
    				m_split.resize(m_split.size()+1);
    		}
    		else
    		{
    			(*m_split.rbegin()).push_back(c);
    		}
    	}
    	char m_separator;
    	std::vector<std::string> &  m_split;
    };
     
    void split_string(const std::string & myString,const char c,std::vector<std::string> & res)
    {
    	spliter sp(res,c);
    	std::for_each(myString.begin(),myString.end(),sp);
    	//si le dernier element est vide, on l'enleve
    	if (res.size()>0 && (*res.rbegin()).empty())
    		res.pop_back();
    }
    int main(int argc, char* argv[])
    {
     
    	std::string myString = "Tu peux pas test r0d";
    	std::vector<std::string> split;
     
    	split_string(myString,' ',split);
    	std::copy(split.begin(),split.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
     
        split_string(myString,'e',split);
    	std::copy(split.begin(),split.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    	return 0;
    }

Discussions similaires

  1. Page Code Source, mettez vos codes ici
    Par Bovino dans le forum Contribuez
    Réponses: 8
    Dernier message: 05/12/2008, 12h11
  2. Page Code Source, mettez vos codes ici
    Par Kerod dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 05/12/2008, 12h11
  3. Façon d'écrire votre code
    Par reptils dans le forum C
    Réponses: 6
    Dernier message: 03/03/2007, 17h20
  4. Recherche de source pour tracer des codes barres
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/10/2004, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo