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
    Nouveau Candidat au Club
    Femme Profil pro
    étudiant
    Inscrit en
    Janvier 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Erreur de segmentation
    Bonjour,
    J'ai une erreur de segmentation dans ce code mais je sais pas la réparer, est-ce que quelqu'un voit d'où ça peut venir ?
    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
     
    #include <iostream>
    #include <string.h>
    #include <vector>
    #include <fstream>
    #include <math.h>
     
    using namespace std;
     
    int main()
    {
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // Définition des variables et constantes
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
        int i,j;
        const double J=24000;
        const double L1= 8;
        const double L2= 8;
        const double l= 0.196;
        const double dx = 0.001;
        const double dy = 0.001;
        const double S01=0.010;
        const double S02=0.015;
        const double S03=0.020;
        double tabX[24000];
        double tabY[196];
        double tabZ[24000][196];
        string nom_fichier;
        const string chemin = "C://Users//anais//Desktop//STAGE GE4 HYDRO-INFO//";
        const string extension = ".txt";
        string dossier;
     
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // Corps du programme
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
        i=0;
        j=0;
     
        // Calcul de la topographie du canal
     
        // Boucle sur les X
         for (i=0;i<=J;i++)
            {
                tabX[i]=tabZ[i-1][0]*dx+(dx/2);
                if (tabX[i]<=L1)
                {
                    tabZ[i][0]=tabZ[i-1][0]-S03;
                }
                else if (tabX[i]<L1+L2)
                {
                    tabZ[i][0]=tabZ[i-1][0]-S01;
                }
                else
                {
                    tabZ[i][0]=tabZ[i-1][0]-S02;
                }
            }
     
        // Boucle sur les Y
         for (j=0;i<=l;i++)
            {
                tabY[j]=tabZ[0][j-1]*dy+(dy/2);
                for (i=1;i<=J;i++)
                {
                    tabZ[i][j]=tabZ[i][0];
                }
            }
     
        // Création du fichier
     
        cout << "Vous allez créer un fichier .txt de topographie du canal en 3D avec les conditions B." << endl;
        cout << "Comment voulez-vous l'appeler ?" << endl;
        cin >> nom_fichier;
        dossier = chemin + nom_fichier + extension;
     
        // Ouverture 
        ofstream fichier;
        fichier.open(dossier.c_str(), ios::out | ios::trunc); //ouvre le fichier en ecriture
        if(fichier)//permet de tester la validité du fichier
        {
               // En-tête du fichier
            string titre = "#Topographie condition du canal B modele 3D";
            string colonne[3];
            colonne[0] = "#X Longueur (m)   ";
            colonne[1] = " Y Largeur (m)    ";
            colonne[2] = " Z Topo (m)";
     
                // Mise en forme du fichier
            fichier << titre << endl;
            fichier << colonne[0] << colonne[1] << colonne[2] << endl;
            // Mise en forme
            for (i=0;i>=J;i++)
            {
                for (j=0;j<=l;i++)
                {
                    fichier << tabX[i] << "           " << tabY[j] << "          " << tabZ[i][j] << endl;
                }
            }
            fichier.close(); //on ferme le fichier
        }
        else
            cerr << "Impossible d'ouvrir le fichier !" << endl;
     
        return 0;
    }
    Merci de votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    pour une bien meilleure lisibilité du code, il faut le sélectionner et utiliser le bouton # de l'éditeur.

    Ce que j'ai vu:
    • Les backslashs dans une chaîne doivent être doublés ; ici ce sont des slashs!
    • Dans la première boucle, on lit des valeurs de tabZ alors qu'il n'est pas initialisé et en plus à des indices potentiellement négatifs!
    • Les tableaux définis dans main() sont placés sur la pile, la pile à une taille maximum
    Si c'est le cas l'application va planter dès l'entrée dans la fonction main().
    En mettant au moins le tableau tabZ à l’extérieur, il y aura une marge de manœuvre suffisante.

    Dalfab

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ce qui est bien avec les segfault c'est que le debugger te dira directement où ça se produit.
    Mais bon, reprenons les choses dans l'ordre : en C++, comme dans de très nombreux langages, un tableau de N entrées se lit de 0 à N-1 inclus.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    étudiant
    Inscrit en
    Janvier 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    merci pour vos réponses. Qu'est-ce que tu veux dire par "En mettant au moins le tableau tabZ à l’extérieur " ? A priori, c'est de là que viendrait ma principale erreurs parce que quand je lance le debbuger il s'arrête dès le début.

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    il y a énormément de choses qui me gênent dans ton code, mais je vais m'en tenir à ton premier problème :
    comme l'a expliqué dalfab ton tableau est trop gros pour être déclaré dans ta fonction main, déclare le au niveau global (en-dehors de toute fonction).
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Points : 558
    Points
    558
    Par défaut
    Bonjour,
    outre les deux remarques precedentes (le tableau à l'exterieur et les boucles de 0 à n-1 pour un tableau tab[n]) tu as du faire une erreur sur l, l doit etre egal à 196 et pas 0.196 et en plus tu devrais plutot mettre l,L1,L2,J en entiers de type int plutot qu en double.

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