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

Langage C++ Discussion :

Taille tableaux


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Par défaut Taille tableaux
    Bonjour,
    Cela fait des années que je n'ai pas codé avec C++. J'ai implémenté un algorithme simple, le code compile, l'exécutable est parfait, sauf que ça crash pour des performances faibles ( tableaux 5000*3*2 par exemple). pour être pratique, vous trouver ci-après le main du code si vous avez des propositions, sachant que je ne sais plus comment manipuler des vecteurs std::...Merci infiniment par avance!
    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
    118
    119
    120
    121
    122
    123
    124
    125
     
    int main()
    {
    double Data1[k][n][d];
    double Data2[k][n][d];
    double x[d];
    double sum=0;
    //double ksi[k+1][d];
    double k_nouveau[k+1][d];
    double x_nouveau[k+1][d];
    //double valeur[d];
    double gamma[k];
    double beta[k];
    double ck[k];
    double grad_discret[d];
    double grad_W[d];
    int deb=0;
    double moyenne[d];
     double sumgamma=0;
     //initialisation generateur pseudo-aléatoire :
    srand(time(0));
     
     for(int i=0;i<d;i++)
       {
         x[i]=rand()/(double)RAND_MAX;
           sum=sum+x[i];
       }
     
     for(int i=0;i<d;i++)
       {
         x[i]=x[i]*u/sum;
         //  cout << "init x "<< x[i] <<endl;
       }
     // cout << endl;
     
     
      // on lit les données dans le fichier entree.txt qui contient
     ifstream fichier1("C:/simple/prog/data1.txt", ios::in);
    ifstream fichier2("C:/simple/prog/data2.txt", ios::in);
     ifstream fichier3("C:/simple/prog/param_algo.txt",ios::in); 
     
    fichier1.precision(15); 
    fichier2.precision(15); 
    fichier3.precision(15); 
     
            if(fichier1&&fichier2&&fichier3)
            {
    	  for (int j=0;j<d;j++)
    	    for (int i=0; i<n; i++)
    	      for (int p=0; p<k; p++)
    		{
    		  fichier1 >> Data1[p][i][j];
    		  fichier2 >> Data2[p][i][j];
    		}
     
    	  for (int p=0;p<k;p++)  fichier3 >> gamma[p] >> beta[p] >> ck[p];
                    fichier1.close();
    		fichier2.close();
    		fichier3.close();
            }
            else
                    cerr << "Impossible d'ouvrir les fichiers !" << endl;
     
    	for (int j=0;j<d;j++)
    	  { grad_discret[j]=0;
    	    grad_W[j]=0;
    	    //	    valeur[j]=0;
    	    k_nouveau[0][j]=0;
    	    x_nouveau[0][j]=x[j];
    	    //	    ksi[0][j]=0;
    	    moyenne[j]=0;
    	  }
    	deb=int(k/2);
    	//	cout << " debut "<<deb<<endl;
     
    	for (int p=1;p<(k+1);p++)
    	  {
    	    // cout <<"p="<<p<<" "<<gamma[p-1]<<" "<<beta[p-1]<<" "<<ck[p-1]<<" ";
    	    H(grad_discret,x_nouveau[p-1], Data1[p-1], Data2[p-1],ck[p-1]);
     
    	      for (int j=0;j<d;j++)
    		{//cout<<" Data1 et Data2 "<<setprecision(5)<<Data1[p-1][0][j]<<" "<<setprecision(5)<<Data2[p-1][0][j];
    		k_nouveau[p][j]=k_nouveau[p-1][j]-gamma[p-1]*grad_discret[j];
        	      }
    	      //  cout<<endl;
    	    W(grad_W,k_nouveau[p], beta[p-1]);
    	    for (int j=0;j<d;j++)
    	      {
    		x_nouveau[p][j]=grad_W[j];
    		//	cout << "j="<<j<<" grad_discret " <<grad_discret[j]<<" grad_W "<<grad_W[j]<<" x " << x_nouveau[p][j] << " ksi " << k_nouveau[p][j]<<endl;
    		//if (p>deb) 
    		if(p>deb)
    		  {
    		    moyenne[j]=moyenne[j]+gamma[p-1]*x_nouveau[p-1][j];
    		    if (j==0) sumgamma=sumgamma+gamma[p-1];
    		  }
    	      }
     
    	  }
     for (int i=0;i<d;i++) {
       moyenne[i]=moyenne[i]/sumgamma;
       // cout << "i="<< i <<" "<<moyenne[i]<<" ";
     }
     // cout << endl;
    ofstream fichier4("C:/simple/prog/resultats.txt", ios::out);  // Ecriture résultats
    ofstream fichier5("C:/simple/prog/details.txt",ios::out);
    fichier4.precision(12); 
    fichier5.precision(12); 
     
            if(fichier4&&fichier5)
    	  { //cout<<"Ecriture des resultats";
    	  for (int i=0; i<d; i++) {
    	    fichier4 << moyenne[i] << " ";
    	    for (int p=0; p<(k+1);p++)
    	      {
    		fichier5<<x_nouveau[p][i]<<" ";
    	      }
    	    fichier5<<endl;
    	    fichier4<<endl;
    	    	  }
    	  }
    	else  cout << "Erreur d'ouverture du fichier resultats !" << endl;
    	fichier4.close();
    	return(0);
    }

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Ça crash donc à cause d'un stack overflow (trop de donnée allouée sur la pile) ?

    Tu peux utiliser des std::vector de cette manière :

    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
    #include <vector>
     
    int main()
    {
      typedef std::vector<double> array1D;
      typedef std::vector<array1D> array2D;
      typedef std::vector<array2D> array3D;
     
      // Déclaration d'un tableau 3D.
      array3D data1;
      data1.resize(k);
      for(std::size_t i=0; i < data1.size(); ++i)
      {
        data1[i].resize(n);
        for(std::size_t j=0; j < data1[i].size(); ++j)
          data1[i][j].resize(d);
      }
     
      // Utilisation de data1 comme avec des tableaux classiques.
      // ...
     
      return 0;
    }
    Par contre c'est loin d'être optimal (même si ça ne fera plus de stack overflow).

    La première amélioration c'est d'utiliser des tableaux 3D aplatis sur 1 dimension où tu recalcules l'indice 1D à partir de celui 3D. M'enfin, si tu as vraiment besoin de C++ et que tu ne sais même plus utiliser la STL je te recommande un bon livre pour débuter rapidement, il s'agit de Accelerated C++. Sinon tu peux toujours trouver des ressources sur ce site.

    Et finalement, je te conseille d'utiliser la bibliothèque Boost.uBlas si c'est pour un projet sérieux. Par contre c'est impossible à aborder sans des bases en C++.

    Bon courage

    PS : Va supprimer l'autre post que t'as été mettre dans la section Outils pour C & C++

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Par défaut stack overflow
    Tout d'abord, je te remercie pour ta réponse!
    Oui il s'agit bien d'un stack overflow, le code n'est pas du tout optimisé, le but est d'avoir quelques exemples numériques d'un algorithme mathémtiques. Je vais essayé ce que tu m'as proposé ce soir meme! je devient débutant ( après 6ans de distance du code). Je te remercie aussi pour le Livre, je pense que j'en ai besoin !

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Par défaut Résultat
    Bonsoir, j'utilise Visuel studio express 2012, j'ai effectué pour commencer ce que tu m'as proposé à la lettre, sans rien changer après dans le code, mais je pense que le lecture ne ressemble pas à celle des tableaux, erreur de compilation liée à l'utilisation des vectors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     H(grad_discret,x_nouveau[p-1], Data1[p-1], Data2[p-1],ck[p-1]);
    Message Erreur: Impossible de convertir le paramètre 3 de std::vector<_Ty> en double [][3] (mon d=3, n=1, k=30000)
    C'est un mauvais sentiment quand on découvre qu'on est nul

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Par défaut std::vector<double>
    J'ai changé les dclarations double tableaux , en std::vector<double> dans toutes les foonctions, la nouvelle erreur eest liée à l'utilisation de la variable dans les autres fonctions, voila le code de la petite partie avant le main! Je te remercie infiniment par avance!

    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
     
     
    // #include <GL/glut.h>
    #include <iostream>  
    #include <cstdlib>
    #include <fstream>
    #include <stdlib.h>
    #include <map>
    #include <ctime>
    #include <iomanip>
    //#include "constantes.h"
     
    using namespace std;
     
     
     
    double g(double x)
    {
      x=-x;
      return(x);
    }
     
    double U(double z[],std::vector<double> y[n][d]) // Fonction Calcul de I
    {
     
     
      double r[n][d];
      double sr[n];
      bool psr[n];
      bool pr[n][d];
      double interm[n][d];
      double res=0;
     
      for (int i=0; i<n; i++)
        {
        sr[i]=0;
        for (int j=0; j<d;j++)
          { 
    	r[i][j]=y[i][j]+z[j];
    	pr[i][j]=(r[i][j]<0);
    	//	cout <<" j="<< j <<" y[i][j] "<< y[i][j]<<" z[j] "<<z[j]<<" r[i][j] "<< r[i][j] ;
    	sr[i]=sr[i]+r[i][j];
          }
        //cout <<"sr= "<<sr[i]<< " ";
        psr[i]=(sr[i]>0);
        for (int j=0; j<d;j++)
          {
    	if (pr[i][j]&&psr[i])	interm[i][j]=g(r[i][j]);
    	else interm[i][j]=0;
    	res=res+interm[i][j];
          }
        }
      return(res);
    }
     
     
    void H(double grad_discret[], double z[], std::vector<double> y1[n][d],std::vector<double> y2[n][d], double c)
    { // la sortie est grad_discret 
      double zm[d];
      double zp[d];
      double up;
      double um;
     
     
      for (int i=0; i<d; i++)
        {
          for (int k=0;k<d;k++)
    	{zp[k]=z[k];zm[k]=z[k];}
          zp[i]=z[i]+c;
          zm[i]=z[i]-c;
          up=U(zp,y1);
          um=U(zm,y2);
          grad_discret[i]=(up-um)/(2*c); //ici Ci=C
          // cout << " i= " << i <<" up= "<<up <<" um= "<<um<<" " << "grad_discret= "<< grad_discret[i] << " ";
        }
    }
     
     
    void W(double grad_W[],double H_util[], double beta)
    { 
      double expo[d];
      double somme=0;
     
      for (int i=0; i<d;i++)
        {
        expo[i]=exp(H_util[i]*u/beta);
        somme=somme+expo[i];
        }
      // cout<<"somme= "<<somme<<" ";
      for (int i=0;i<d;i++)
        {
          grad_W[i]=u*expo[i]/somme;
        }  
    }
     
    int main()
    {
     typedef std::ve

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Il y a trop de choses à redire et des choses qui prouvent que tu as passés des étapes importantes dans ton apprentissage du C++. En définitive il est difficile de t'aider sans le faire à ta place

    À mon avis, si ce n'est pas un projet urgent, tu ferais mieux de lire le bouquin que je t'ai conseillé, si tu le lis 2h tous les soirs, je pense que dans 1 semaine tu comprendras déjà beaucoup plus de choses

    Bon courage !

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Par défaut
    Bonsoir,
    Je comprends, mon seul soucis est que c'est urgent pour une présentation des résultats lundi! j'essaye depuis hier, erreur après erreur, je pense que je comprends que c'est la manipulation des types, mais ça va demander du temps pour obtenir quelque chose ! Je te remercie en tout cas ! Tu m'as bien aidé jusqu'au là!

    Les exemples de la lecture du contenu des vectors 2D, + opérations avec les types doubles, tableaux, sont rares sur le net!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] erreur bbcode taille
    Par speedylol dans le forum Langage
    Réponses: 1
    Dernier message: 04/09/2006, 16h51
  2. [Tableaux] taille tableau a deux dimensions
    Par nath-0-0 dans le forum Langage
    Réponses: 2
    Dernier message: 24/08/2006, 18h04
  3. [Tableaux] Taille cellule de tableau
    Par johnkro dans le forum Langage
    Réponses: 4
    Dernier message: 27/07/2006, 08h48
  4. [Tableaux] trouver taille tableau html en php
    Par eulalie15 dans le forum Langage
    Réponses: 4
    Dernier message: 03/07/2006, 13h47
  5. [Tableaux] Comment connaitre la taille d'un tableau?
    Par Polaire76 dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2005, 17h34

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