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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Par défaut Erreur de segmentation
    Bonjour
    Voila quand je creer mon tableau, ca fait une erreur de segmentation :
    Valeur de n : 3000
    Erreur de segmentation

    Sur un tableau de 600, je ne rencontre pas de problemes mais la sur 3000 , oui !
    Pour je ne pense pas que cela vienne de ma memoire, voici un top de ma memoire :
    Mem: 1025856k total, 580932k used, 444924k free, 31768k buffers

    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
     
    n=3000;
     
    	int ** graphe;
    	graphe = new int * [n+1];
     
    	printf("Valeur de n : %d \n Taille tableau : %d",n,sizeof(*graphe));
     
    	if (graphe != NULL)
    		{
    		for (i=0; i<n; i++)
    			{
    			  /* printf("Tour de boucle n %d\n",i); */
    			graphe[i]=new int [n+1];
    			if (graphe[i]==NULL)
    				{cout<<"Probleme la creation de la matrice"<<endl;
    				exit(0);
    				}
    			}
    		}
     
    	printf("Ici");
    Merci de votre aide,
    Ciao,

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    code tester sous compilateur microsoft C++ pas d'erreur.

    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
    #include <stdio.h>
    #include <iostream>
    using namespace std;
     
    void func()
    {
    	int n=3000;
    	int ** graphe;
    	graphe = new int * [n+1];
     
    	printf("Valeur de n : %d \n Taille tableau : %d",n,sizeof(*graphe));
     
    	if (graphe != NULL)
    	{
    		for (int i=0; i<n; i++)
    		{
    			graphe[i]=new int [n+1];
    			if (graphe[i]==NULL)
    			{
    				cout<<"Probleme la creation de la matrice"<<endl;
    				exit(0);
    			}
    		}
    	}
    	cout << "Ici";
    }
     
    int main()
    {
    	func();
    	return 0;
    }
    sortie :
    Valeur de n : 3000
    Taille tableau : 4Ici

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Par défaut humm
    Merci mais ca ne fonctionne pas !!!
    Toujours l'erreur de segmentation a 3000 sommets !
    Merci de vos conseils,
    Ciao,

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Utilise un déboggeur et repère quelle instruction provoque l'erreur de segmentation.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 49
    Par défaut merci
    Bonjour,
    Utilise un déboggeur : la je suis dans une station embarqué, il n'y a pas de deboggueurs
    L'instruction est une affectation sur la case 3000, erreur de segmentation, le for depasse.
    Ciao,

  6. #6
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    Citation Envoyé par leCcsympas
    L'instruction est une affectation sur la case 3000, erreur de segmentation, le for depasse.
    Tu veux dire que l'erreur de segmentation n'est pas située sur une des lignes de code que tu as posté ici ?
    Dans ce cas, c'est assez normal qu'on ne puisse pas la trouver.
    Pourquoi ne postes tu pas le code qui plante ?

    Bonne journée.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphe = new int * [n+1];
    Tu devrais faire un catch car new throw un std::bad_alloc en cas de problème.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    A partir du moment ou il teste la valeur de retour le bad alloc n'est pas indispensable.
    Surtout que si c'est pour de l'embarqué, il n'y a peut-être pas de gestion d'exception.

    EDIT: L'initialisation me semble suspecte néanmoins.
    Tu déclares 3001 éléments à chaque fois en faisant un 'new int[n+1]'
    Cependant, dans ta boucle tu n'initialise jamais le 3001e élément, puisque ta boucle va de 0 à 2999.
    J'imagine que quand tu accède au 3001e élément, celui d'index 3000 il y a un soucis.

    En d'autre termes les instructions suivantes sont vouée à l'échec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    graphe[n] = ...
    graphe[i][n]=... (quelque soit i)

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Jan Rendek
    A partir du moment ou il teste la valeur de retour le bad alloc n'est pas indispensable.
    No comment.

    Enfin si quand même: si l'exception est lancée mais qu'il n'y a pas de catch alors ça va faire planter son programme. Ou alors il faut utiliser un new(std::no_throw) et là tu peux tester si la valeur de retour est NULL.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Ce que tu dis est vrai, à condition que tu compiles avec le support des exceptions ce qui dans un cadre embarqué n'est pas une certitude. A la vue du code, j'imagine que ce n'est pas le cas, puisque les valeurs de retour sont testées.
    De plus, j'imagine qu'à l'execution l'OP a dû voir une partie de ses messages de déboggage, ce qui exclue un plantage dû à une exception non gérée.

    Avant de chercher de midi à 14h, je regarderais d'abord s'il n'y a pas un problème de dépassement de bornes. Vu la mémoire disponible et la taille à allouer je ne pense pas que le new pose problème. Cependant il y a à la lecture du code 3001 eléments non alloués.
    Selon le bon vieux principe de tonton Occam, s'il doit y avoir une erreur c'est probablement de ce coté.

    EDIT: accessoirement c'est std::nothrow (sans underscore)

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

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