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

GTK+ avec C & C++ Discussion :

Problème d'allocation mémoire


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut Problème d'allocation mémoire
    Bonjour,
    je dois actuellement changer la couleur de chaque pixel d'une de mes drawing area apres avoir déterminé cette couleur en fonction de diverses données qui me sont fournies.
    Seulement voilà, mon problème est que, dès que ces données sont trop importantes, les calculs prennent trop de temps et tout d'un coup ca plante... std::bad_alloc.

    Je me suis donc dit que c'était un problème d'allocation de mémoire ou de destruction de pointeurs. Mais après avoir corrigé ces fautes... ben ca plante toujours.

    Je vous poste ci-dessous la fonction contenant ma boucle.
    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
    void affInt(double **tabInt, int nbElem)
    {
    	int nbNoeuds, nbTriangles, nbTrianglesBord;
    	Noeud *noeuds;
    	Triangle *triangles;
    	int *noeudsBord;
    	int *trianglesBord;
    	gc = gdk_gc_new(aireA->window);
     
    	initTPSF("cercle_fin2.msh", "donnees.txt", nbNoeuds, nbTriangles, nbTrianglesBord, noeuds, triangles, noeudsBord, trianglesBord);
     
    	delete noeudsBord;
    	delete trianglesBord;
     
    	double maxechx = 0;
    	double maxechy = 0;
    	double coef = 0;
    	double max;
    	double *muas = new double[2];
    	ifstream ifs ( "donnees.txt" );
    	string ligne;
    	stringstream ss;
    	vector<double*> labels;
     
    	while (!ifs.eof())	//Tant qu'il reste des lignes à lire, on met la valeur de la ligne courante dans le vecteur
    	{
    		getline (ifs, ligne);
    		ss << ligne;
    		ss >> muas[0] >> muas[1];
    		labels.push_back (muas);
    		ss.clear();
    	}
    	delete muas;
    	ifs.close();
     
    	for (int p=0; p< labels.size()-1; p++)
    	{
    		g_print("mua %g / mus %g\n", labels.at(p)[0], labels.at(p)[1]);
    	}
     
    	//On trouve la plus grosse intensité mua
    	for (int i=0; i<labels.size()-1; i++)
    	{
    		if (labels.at(i)[0] > max)
    		{
    			max = labels.at(i)[0];
    		}
    	}
     
    	//On trouve le plus gros x et y afin de calculer l'échelle x
    	for (int i=0; i<nbNoeuds; i++)
    	{
    		if (noeuds[i].getX() > maxechx)
    		{
    			maxechx = noeuds[i].getX();
    		}
    		if (noeuds[i].getY() > maxechy)
    		{
    			maxechy = noeuds[i].getY();
    		}
    	}
     
    	double echx = 200/maxechx;
    	double echy = 200/maxechy;
     
    	double x=0, y=0;
    	double val;
    	Triangle t;
    	int label;
     
    	for (int i=0; i<200; i++)
    	{
    		x = (i-100)/echx;
    		for (int j=0; j<200; j++)
    		{
    			y = (j-100)/echy;
    			t = Matrice::getTriangleSource(nbTriangles, noeuds, triangles, x, y);
     
    			label = t.getLabel();
     
    			val = labels.at(label)[0]/max;
    			changer_couleur(val);
    			gdk_draw_point(pixmapA, gc, j, i);
    			gtk_widget_draw ( aireA, NULL );
     
    			g_print("pixel %d/%d créé\n", i, j);
    		}
    	}
    }
    Je sais juste que ca plante toujours lors de l'appel de ma fonction getTriangleSource()

    Voici ci-dessous les deux fonctions appelées dans ma boucle :
    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
    void changer_couleur(double value)
    {
    	GdkColor *colors = new GdkColor[1];
    	colors[0] = gdk_color;
     
    	gdk_colormap_free_colors (colormap, colors, 1);
    	delete colors;
     
    	gdk_color.red   = (guint16)(value*65535.0);
    	gdk_color.green = (guint16)(value*65535.0);
    	gdk_color.blue  = (guint16)(value*65535.0);
     
    	colormap = gdk_window_get_colormap (aireA->window);
    	gdk_color_alloc (colormap, &gdk_color);
     
    	gdk_gc_set_foreground (gc, &gdk_color);
    }
    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
    Triangle Matrice::getTriangleSource(const int nbElements, Noeud *noeuds, Triangle *triangles, const double x, const double y)
    {
     
        double p_courant;
        double min, xmin, ymin;
        int tmin= 0;
     
        Noeud n1, n2, n3;
        double x1, x2, x3;
        double y1, y2, y3;
        int i= 0;
     
        do {
            n1= noeuds[triangles[i].getN1()];
            n2= noeuds[triangles[i].getN2()];
            n3= noeuds[triangles[i].getN3()];
     
            x1= n1.getX(), x2= n2.getX(), x3= n3.getX();
            y1= n1.getY(), y2= n2.getY(), y3= n3.getY();
     
            //Calcul du centre du triangle
            xmin= (x1 + x2 + x3) / 3.0;
            ymin= (y1 + y2 + y3) / 3.0;
     
            //Distance minimale
            p_courant= sqrt(pow(xmin - x, 2) + pow(ymin - y, 2));
     
            if (i == 0) {
                min= p_courant;
            }
     
            if (p_courant < min) {
                min= p_courant;
                tmin= i;
            }
            i++;
        } while (i < nbElements);
     
        return triangles[tmin];
    }
    Merci d'avance pour votre aide !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    delete noeudBords;
    delete trianglesBords;

    alors que noeudsBords et trianglesBords ne sont pas initialisés ?

    Ca me fait un peu peur des new/delete dans un programme gtk+ qui utilise g_malloc/g_free, fais gaffe à pas avoir des new/g_free ou des g_malloc/delete mélangés.
    valgrind devrait être capable de te dire ce qui ne va pas avec tes allocations mémoires si tu as effectivement un problème d'allocations mémoires

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    delete noeudBords;
    delete trianglesBords;

    alors que noeudsBords et trianglesBords ne sont pas initialisés ?
    Ces tableaux sont initialisés dans la fonction initTPSF que je n'ai pas montrée car je sais qu'elle marche bien.


    J'ai rajouté le free_colors par la suite pour régler mon problème... mais c'est inneficace.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Citation Envoyé par Fibus Voir le message
    Ces tableaux sont initialisés dans la fonction initTPSF que je n'ai pas montrée car je sais qu'elle marche bien.
    Je ne mets pas et doute le fait que des *copies* de ces 2 pointeurs sont bien initialises dans ta fonction d'init, par contre ca ne va pas se repercuter dans ta fonction principale....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void inc (int i)
    {
       i++
    }
     
    int main ()
    {
        int toto = 4;
        inc (toto);
        printf ("%d", toto);
    }
    ca va afficher 4, pas 5. La on est dans le meme cas de figure.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Toutes ces variables sont en entrée sortie

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Tu les passes par reference tu veux dire ? Si oui, direction valgrind alors, y a des chances que ca fasse gagner du temps a tout le monde...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai utilisé Valgrind et je me suis rendu compte que je perdait énormément de mémoire... ca fait mal d'oublier un delete pars-ci pars-la quand il y a une boucle à beaucoup d'itérations quand même

    Merci beaucoup de m'avoir indiqué ce programme

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

Discussions similaires

  1. Problème d'allocation mémoire > 2Go
    Par tnarol dans le forum C++
    Réponses: 19
    Dernier message: 09/07/2008, 12h03
  2. Problème d'allocation mémoire
    Par elmayor1983 dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2007, 10h08
  3. Problème d'allocation mémoire et fork
    Par Conap dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2006, 15h34
  4. Problème d'allocation mémoire
    Par araya dans le forum C
    Réponses: 2
    Dernier message: 04/05/2006, 20h03
  5. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23

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