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

C Discussion :

Erreur de Segmentation


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut Erreur de Segmentation
    Bonjour!
    et oui encore un sujet sur les erreur de segmentation! bon je précise que je sais ce que c'est mais la réponse n'est pas ouferte surtout quand on a pas de debugger ( je suis sous linux et tout ne marche po super...je travail sous kwrite :S

    alors voila mon probleme

    je dispose d'un tableau 3D allé par mes soins en 1D
    on va considérer ce tbleau sous le nom Grid.Tab3D[...]
    Grid.varx Grid.vary et Grid.varz constitue les tailles de ce tableau

    bon graçon ^^ je veux accéder à une case de ce tableau
    je posse donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const int pos = x  +y*(Grid.varx)  +z*(Grid.vary)*(Grid.varx);
    correspondante a la position ds le talbeau 1D de [x][y][z] ( position 3D) ( j'ai bien vérifié que l'indice ne dépasse pas le tableau)

    jusque là tout se passe bien
    mais ( il y a toujours un mais... ) dès que je veux utiliser cette valeur ( attention seulement au bout du 800 éme acces...c'est beaucoup mais je suis pas encore au bout ( 959)), même avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("pos = %i \n",pos);
    je retrouve le temp aimé, l'unique erreur de segmentation, seulement sur un affichage...alors si quelqu'un à une idée..bha siouplé dite^^

    merchi!

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Rastacouéne
    Bonjour!
    et oui encore un sujet sur les erreur de segmentation! bon je précise que je sais ce que c'est mais la réponse n'est pas ouferte surtout quand on a pas de debugger ( je suis sous linux et tout ne marche po super...je travail sous kwrite :S

    alors voila mon probleme

    je dispose d'un tableau 3D allé par mes soins en 1D
    on va considérer ce tbleau sous le nom Grid.Tab3D[...]
    Grid.varx Grid.vary et Grid.varz constitue les tailles de ce tableau

    mon, bon graçon ^^ je veux accéder à une case de ce tableau
    je posse donc :
    const int pos = x +y*(Grid.varx) +z*(Grid.vary)*(Grid.varx); correspondante a la position ds le talbeau 1D de [x][y][z] ( position 3D)

    jusque là tout se passe bien
    mais ( il y a toujours un mais... ) dès que je veux utiliser cette valeur ( attention seulement au bout du 800 éme acces...c'est beaucoup mais je suis pas encore au bout ( 959)), même avec :
    printf("pos = %i \n",pos);
    je retrouve le temp aimé, l'unique erreur de segmentation, seulement sur un affichage...alors si quelqu'un à une idée..bha siouplé dite^^

    merchi!
    Moi, j'aurais plutôt dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int pos = x*(Grid.vary)*(Grid.varz) + y*(Grid.varz) + z;
    qui me semble plus logique (du moins, c'est ce que j'attends d'un tableau 3D), mais l'erreur de segmentation ne vient pas de là.

    En ce qui concerne l'erreur de segmentation, je vois pas comme ça. Aurais-tu un morceau de code minimal et compilable qui reproduit le problème à nous donner?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    pour l'acces tout cela dépend de ka façon d'ont j'accéde de maniére global a ma vase , tout ce qu'il faut c'est rester danbs les limites du tableau

    quand au morceau de code, je peux pas vous le filer, car tout ceci fait parti d'un gros projet de lancer de rayon dans lequel je me suis inséré. enfin bon...voila ce que je peux donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(l = min[0] ; l <max[0] ; l++)
    		{
    			for(m = min[1] ; m < max[1] ; m++)
    			{
    				for( n = min[2] ; n < max[2] ; n++)
    				{
    						ajouterId(i,l,m,n);
    				}
    			}
    		}
    ceci correspond a une boucle pour ajouter des boites englobantes dans mon tableau, je parcours les x,y et z stocké respectivement dans [0] [1] et [2]

    suis dans ajout id , la simplification donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            const int pos = x  +y*(Grid.varx)  +z*(Grid.vary)*(Grid.varx);
    	printf("pos = %i \n",pos);
    normalement tout devrai bien se passer, mais le plus surprenant est que l'erreur ne viens que très tard dans les boucles...cela peux venir d'un faille mémoire?

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux

    C'est classique : ce n'est pas parce que le programme tourne qu'il n'ya pas d'erreurs. Il peut yavoir une erreur dans un programme et ne jamais s'en rendre compte -- les comportements indeterminés ne font pas forcement planter le processus.

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Il faudrait :

    - Les déclarations des variables : min, max
    - La fonction ajout_id

    Jc

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int min[3],max[3];
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void ajouterId(int id,int x, int y, int z)
    {
    	const int pos = x  +y*(Grid.varx)  +z*(Grid.vary)*(Grid.varx);
    	printf("pos = %i \n",pos);
    merci de regarder^^

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Citation Envoyé par Gruik
    Salux

    C'est classique : ce n'est pas parce que le programme tourne qu'il n'ya pas d'erreurs. Il peut yavoir une erreur dans un programme et ne jamais s'en rendre compte -- les comportements indeterminés ne font pas forcement planter le processus.

    Je fais comment pour situer ces comportements indéterminés ?

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Rastacouéne
    alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void ajouterId(int id,int x, int y, int z)
    {
    	const int pos = x  +y*(Grid.varx)  +z*(Grid.vary)*(Grid.varx);
    	printf("pos = %i \n",pos);
    merci de regarder^^
    Je suis sûr qu'il y a autre chose dans la fonction ajouterId, non ?

    Jc

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    tout le reste de la fonction a été mis en commentaire pour les test: il ne reste que l'affichage de la position pour voir si il n'y a pas de depacement du tableau

    mais bon en entier ça donne :
    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
     
    static void ajouterId(int id,int x, int y, int z)
    {
    // 	point_t p; p.m[0]=x;	p.m[1]=y;	p.m[2]=z;
    // 	//convertion autorisé car copie lors du passage de la fonction ( valeur initiale p
    // 	CONVERT(p,x,y,z);
    	//const int pos = x  +y*(Grid.varx)  +z*(Grid.vary)*(Grid.varx);
    	int pos;
    	ACESS(x,y,z,pos);
    	printf("pos = %i \n",pos);
    	//const int i = Grid.Tab3D[pos].nbObj++;
     
    	/*
    	if(Grid.Tab3D[pos].indice==0)//pas de case alloué, il faut en ajouter
    	{
    		Grid.Tab3D[pos].id = malloc(5*sizeof(int));	//premier allocation
    		Grid.Tab3D[pos].indice=5;			//passage à 5 du maximum de valeurs
    	}
    	else
    	{
    		if(Grid.Tab3D[pos].indice==Grid.Tab3D[pos].nbObj) //besoin de réallouer
    		{
    			Grid.Tab3D[pos].indice+=5;		//augmentation de 5 du nombre max de valeur
    			Grid.Tab3D[pos].id = realloc(Grid.Tab3D[pos].id,sizeof(int)*Grid.Tab3D[pos].indice);
    				//on a réalouer de la taille voulue
    		}
    	}
    	Grid.Tab3D[pos].id[i] = id;	// on stock le point voulu*/
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    ha oui pour simplifier, entre temps j'ai défini une macro pour le calcul de pos :

    #define ACESS(_x,_y,_z,_ind) \
    _ind = (int)(_x +_y*(Grid.varx) +_z*(Grid.vary)*(Grid.varx))



    je rappel quand même a tout le monde ( je trouve ça un peu important) que le programme ne plante que sur l'utilisation du printf... ou toute utilisation de la variable pos

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Est-ce qu'on peut voir le code qui suit la boucle qui appelle ajouteId et la déclaration de la structure Grid (déclaration des champs de la structure et déclaration de la variable Grid).

    Jc

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    je vais faire détailé:

    la fonction ajoutId est appellé dans
    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
     
    void CalculBB(scene_t* scene_a,object_t* object_a)
    {
    	BBOX tmp;
    	int l,m,n;
    	int min[3],max[3];
    	triangle_t* t;
     
    	for(tuint_t i = object_a->m_first_triangle; i <= object_a->m_last_triangle; i++) {
     
    		t = &scene_a->m_tabTriangle[i];
     
    		tmp.m_min.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_min.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_min.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
     
    		tmp.m_max.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_max.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_max.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
     
    	/*//2éme point
    	      TestBB(t->m_id_second,0,&tmp,&scene_a);
    		TestBB(t->m_id_second,1,&tmp,&scene_a);
    		TestBB(t->m_id_second,2,&tmp,&scene_a);
     
    	//3éme point
    		TestBB(t->m_id_third,0,&tmp,&scene_a);
    		TestBB(t->m_id_third,1,&tmp,&scene_a);	
    		TestBB(t->m_id_third,2,&tmp,&scene_a);	*/
     
    	//2éme point
    		if(scene_a->m_tabPoint[t->m_id_second].m[0] > tmp.m_max.m[0])
    			tmp.m_max.m[0] = scene_a->m_tabPoint[t->m_id_second].m[0];
    		else //  <=
    			if(scene_a->m_tabPoint[t->m_id_second].m[0] < tmp.m_min.m[0])
    				tmp.m_min.m[0] = scene_a->m_tabPoint[t->m_id_second].m[0];
     
    		if(scene_a->m_tabPoint[t->m_id_second].m[1] > tmp.m_max.m[1])
    			tmp.m_max.m[1] = scene_a->m_tabPoint[t->m_id_second].m[1];
    		else //  <=
    			if(scene_a->m_tabPoint[t->m_id_second].m[1] < tmp.m_min.m[1])
    				tmp.m_min.m[1] = scene_a->m_tabPoint[t->m_id_second].m[1];
     
    		if(scene_a->m_tabPoint[t->m_id_second].m[2] > tmp.m_max.m[2])
    			tmp.m_max.m[2] = scene_a->m_tabPoint[t->m_id_second].m[2];
    		else //  <=
    			if(scene_a->m_tabPoint[t->m_id_second].m[2] < tmp.m_min.m[2])
    				tmp.m_min.m[2] = scene_a->m_tabPoint[t->m_id_second].m[2];
     
    	//3éme point
     
    		if(scene_a->m_tabPoint[t->m_id_third].m[0] > tmp.m_max.m[0])
    			tmp.m_max.m[0] = scene_a->m_tabPoint[t->m_id_third].m[0];
    		else // <=
    			if(scene_a->m_tabPoint[t->m_id_third].m[0] < tmp.m_min.m[0])
    				tmp.m_min.m[0] = scene_a->m_tabPoint[t->m_id_third].m[0];
     
    		if(scene_a->m_tabPoint[t->m_id_third].m[1] > tmp.m_max.m[1])
    			tmp.m_max.m[1] = scene_a->m_tabPoint[t->m_id_third].m[1];
    		else // <=
    			if(scene_a->m_tabPoint[t->m_id_third].m[1] < tmp.m_min.m[1])
    				tmp.m_min.m[1] = scene_a->m_tabPoint[t->m_id_third].m[1];
     
    		if(scene_a->m_tabPoint[t->m_id_third].m[2] > tmp.m_max.m[2])
    			tmp.m_max.m[2] = scene_a->m_tabPoint[t->m_id_third].m[2];
    		else // <=
    			if(scene_a->m_tabPoint[t->m_id_third].m[2] < tmp.m_min.m[2])
    				tmp.m_min.m[2] = scene_a->m_tabPoint[t->m_id_third].m[2];
     
    	//stocker dans le tableau en incrémentant case
     
    	CONVERT(tmp.m_min,min[0],min[1],min[2]);
    	CONVERT(tmp.m_max,max[0],max[1],max[2]);
     
    		for(l = min[0] ; l <max[0] ; l++)
    		{
    			for(m = min[1] ; m < max[1] ; m++)
    			{
    				for( n = min[2] ; n < max[2] ; n++)
    				{
    						ajouterId(i,l,m,n);
    				}
    			}
    		}
    	}
    }

    cette fonction est elle même appellé dans ma fonction de rendu par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    scene_t* sc = &world_a->scene;
     
    	for(tuint_t i = 0; i < scene_nb_objects(sc); i++) {
    		CalculBB(sc,&sc->m_tabObject[i]);
    	}

    voici les définitoin de mes structures:
    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
     
    typedef struct{
    	int *id;		//indice des objets de la case , peux être passé en adresse
    	int indice;		//nb de case reservé dans la liste de triangle
    	int nbObj;		//nombre d'objet de la case
    	bool pass;		
    	int indFrus;		
    }CASE;
     
    typedef struct {
    	CASE * Tab3D ;
    	int varx,vary,varz;
    	float lx,ly,lz;
    	point_t up,down;
    }Tabl;
     
     
    Tabl Grid;

    j'espére que c'est assez clair...sinon possez vos questions!

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    il semblerai que le probléme vienne de l'initialisation de min et max lors du calcul de la boite englobante...vous en pensez quoi?

  14. #14
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Rastacouéne
    il semblerai que le probléme vienne de l'initialisation de min et max lors du calcul de la boite englobante...vous en pensez quoi?
    Que fait la macro CONVERT ?

    Jc

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    la macro convert permet de passer un point 3D de l'espace en un coordonée d'une case de mon tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define CONVERT(_p,_x,_y,_z) \
      _x = (int) ((((_p.m[0] - Grid.down.m[0])/Grid.lx)*Grid.varx)); \
      _y = (int) ((((_p.m[1] - Grid.down.m[1])/Grid.ly)*Grid.vary)); \
      _z = (int) ((((_p.m[2] - Grid.down.m[2])/Grid.lz)*Grid.varz))

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    si je défini de maniére arbitraire des valeurs à min et max, je ne me retrouve pas avec l'erreur de segmentation. Cependant, les valeurs de min sont bien toutes inférieur au valeur de max ce qui ne devrai pas poser de probléme. Il y a donc un probléme dans la convertion je dirai... faut t'il forcer tout les types dans une macros?

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    bon...j'ai réussi a localiser excatement le problème mais ça reste toujours un grand mistére... je vais vous l'expliquer...si quelqu'un peux m'aider...

    voila les deux cas...le premier marche nikel, le seconde non...mais je vois pas pourquoi il place une erreur de segmentation.

    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
     
    void CalculBB(scene_t* scene_a,object_t* object_a)
    {
    	BBOX tmp;
    	int l,m,n;
    	int min[3],max[3];
    	triangle_t* t;
     
    	for(tuint_t i = object_a->m_first_triangle; i <= object_a->m_last_triangle; i++) {
     
    		printf("i = %i\n",i);	
     
    		t = &scene_a->m_tabTriangle[i];
    		printf("balise 1\n");
    		tmp.m_min.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_min.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_min.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
    		printf("balise 2\n");
    		tmp.m_max.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_max.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_max.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
    		printf("balise 3\n");
    	        TestBB(t->m_id_second,0,&tmp,scene_a);
    		TestBB(t->m_id_second,1,&tmp,scene_a);
    		TestBB(t->m_id_second,2,&tmp,scene_a);
     
    	//3éme point
    		TestBB(t->m_id_third,0,&tmp,scene_a);
    		TestBB(t->m_id_third,1,&tmp,scene_a);	
    		TestBB(t->m_id_third,2,&tmp,scene_a);	
     
     
    		CONVERT(tmp.m_min,min[0],min[1],min[2]);
    		CONVERT(tmp.m_max,max[0],max[1],max[2]);
     
    			/*for(l = min[0] ; l <=max[0] ; l++)
    				for(m = min[1] ; m <= max[1] ; m++)
    					for( n = min[2] ; n <= max[2] ; n++)
    							printf(".");
                           */
    		printf("fin ajout\n");
     
    	}
    }

    bon maintenant ce qui marche pas

    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
     
     
    void CalculBB(scene_t* scene_a,object_t* object_a)
    {
    	BBOX tmp;
    	int l,m,n;
    	int min[3],max[3];
    	triangle_t* t;
     
    	for(tuint_t i = object_a->m_first_triangle; i <= object_a->m_last_triangle; i++) {
     
    		printf("i = %i\n",i);	
     
    		t = &scene_a->m_tabTriangle[i];
    		printf("balise 1\n");
    		tmp.m_min.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_min.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_min.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
    		printf("balise 2\n");
    		tmp.m_max.m[0] = scene_a->m_tabPoint[t->m_id_first].m[0];
    		tmp.m_max.m[1] = scene_a->m_tabPoint[t->m_id_first].m[1];
    		tmp.m_max.m[2] = scene_a->m_tabPoint[t->m_id_first].m[2];
    		printf("balise 3\n");
    	        TestBB(t->m_id_second,0,&tmp,scene_a);
    		TestBB(t->m_id_second,1,&tmp,scene_a);
    		TestBB(t->m_id_second,2,&tmp,scene_a);
     
    	//3éme point
    		TestBB(t->m_id_third,0,&tmp,scene_a);
    		TestBB(t->m_id_third,1,&tmp,scene_a);	
    		TestBB(t->m_id_third,2,&tmp,scene_a);	
     
     
    		CONVERT(tmp.m_min,min[0],min[1],min[2]);
    		CONVERT(tmp.m_max,max[0],max[1],max[2]);
     
    			for(l = min[0] ; l <=max[0] ; l++)
    				for(m = min[1] ; m <= max[1] ; m++)
    					for( n = min[2] ; n <= max[2] ; n++)
    							printf(".");
    		printf("fin ajout\n");
     
    	}
    }
    oui oui, seulement les boucle où plus precisemment l'acces au valeur de min[] et max[] pourtant définie en local et rien de dynamqiue
    l'erreur est donc une erreur de segmentation mais entre la balise 1 et 2

    On ma sugéré que l'erreur venait des optimisations de compilations, que j'ai retiré et toujours le même résultat...

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Rastacouéne
    l'erreur est donc une erreur de segmentation mais entre la balise 1 et 2
    d'abord, combien de fois doit-on répéter :

    pour savoir exactement où ça plante avec des print il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf ( stderr," balise 1");
    qui est synchrone, alors que printf n'est PAS synchrone.

    Donc si le printf te dis que ça plante entre 1 et 2, c'est peut-être pas ça...

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Et ensuite utilises un debugger, qui s'arrête là où ça plante, et te permt d'explorer le contenu des varaibles.

    Si tu es sur *n*x ddd est très bon. Sur Windows je ne connais pas, mais je suis sûr que les outils de déveoppements en contiennent de très bons.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    pour les printf je prend note...mais l'erreur reste toujours au même endroit....même si ça peux se produire ailleur

    quand au debugger style ddd ou kdbg je ne peux pas les utiliser pour je ne sais quel raison sur ma machine... il me manque des librairie que je ne peux pas mettre sur ma machine ( j'ai pas les droit administrateur)
    j'ai voulu utiliser gdb directement mais en mode console j'ai un peu de mal a le faire arééter et voir comme il faut mes variables.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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