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 :

plantage du pc lors de la compilation


Sujet :

C

  1. #1
    Membre régulier
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Points : 85
    Points
    85
    Par défaut plantage du pc lors de la compilation
    Bonjour,

    j'ai programmé un code en C pour faire le produit d'une matrice et un vecteur , lors de la compilation tout ce passe bien jusqu'à la partie de l'appel de la fonction prod qui fais le calcul le pc se plante

    je travail sous Windows avec code::blocks 10.05
    est ce que vous pouvez m'aider à trouver l'erreur , voilà le code
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    // les prototypes
    void afficheMatrice(float **mat , int max );
    void afficherVect(float *b , int max);
    void remplirMatrice(float **mat, int max);
    void remplirVect(float *b , int max);
    void prod(float **mat,float *b,int max);
     
    //début main :(
    int main()
    {
       float **mat , *b, *t;
       int i,n;
     
       printf("Bonjour, Entrez la taille de la matrice \n");
       scanf("%d",&n);
     
     
       // Allocation mémoire
        t = (float*)malloc(n*sizeof(float));
        b = (float*)malloc(n*sizeof(float));
     
        mat = (float**)malloc(n*sizeof(float*));
        for(i=0 ; i<n ;i++)
        {
            mat[i] = (float*)malloc(n*sizeof(float));
        }
     
     
        printf("Le produit de A et x !!\n");
        remplirMatrice(mat,n);
        remplirVect(b,n);
        prod(mat,b,n);
        getch();
        return 0;
    }
    //fin main :D
    void afficheMatrice(float** mat, int n)
    {
         int i,j;
         printf("\n");
         for(i=0;i<n;i++)
         {
           for(j=0;j<n;j++ )
           {
                printf("%1.f \t",mat[i][j]);
           }
           printf("\n");
         }
    }
     
    void afficherVect(float *b,int n)
    {
         int i;
          printf("\n");
          for(i=0;i<n;i++ )
             printf(" %f ",b[i]);
             printf("\n");
    }
     
    void remplirMatrice(float **mat , int n)
    {
        int i,j;
        for(i=0;i<n;i++)
           for(j=0;j<n;j++ )
           {
               mat[i][j] = 0 ;
           }
           for(i = 0 ; i<n ; i++ )
              for(j = 0 ; j<n ; j++ )
              {
                 system("cls");
                 afficheMatrice(mat,n);
                 printf("Remplir la case(%d,%d) \n",i,j);
                 scanf("%f",&mat[i][j]);
                 system("cls");
              }
    }
     
    void remplirVect(float *b , int n)
    {
         int i;
           for(i=0;i<n;i++)
                 b[i] = 0 ;
                 for(i=0;i<n;i++)
                 {
                     system("cls");
                     afficherVect(b,n);
                     printf("Remplir la case(%d) \n",i);
                     scanf("%f",&b[i]);
                     system("cls");
                 }
    }
     
     
    void prod(float **mat,float *b,int n)
    {
        int h,k;float *t;
        for(k=0;k<n;k++)
        {
            t[k]=0;
            for(h=0;h<n;h++)
            {
                t[k]+=mat[k][h]*b[h];
            }
        }
     
        for(k=0;k<n;k++)
        {
            for(h=0;h<n;h++)
            {
                printf("t[%d]==%f \t",k+1,&t[k+1]);
            }
        }
    }
    est si ce n'est qu'un problème de mémoire ? que puis je faire ?
    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    malloc: où sont les free?

    Sais-tu ce qui se passe quand un malloc est exécuté, et pourquoi il faut faire le free.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    tu n'oublies pas de libérer la mémoire allouer lors du malloc?

  4. #4
    Membre régulier
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Points : 85
    Points
    85
    Par défaut
    vous avez raison en plus le free de la variable t dois se placer dans la fonction prod où elle est utilisée ,et son allocation dois être aussi déclaré dans "prod"

    maintenant pas de plantage ,il me reste qu'un petit problème de calcul , en effet le résultat de ce n'est que des 0

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for(k=0;k<n;k++)
        {
            for(h=0;h<n;h++)        {
                printf("t[%d]==%f \t",k+1,&t[k+1]);
            }
        }
    A quoi sert h ? t est un vecteur pas une matrice.
    Pourquoi afficher l'adresse de t[k+1] au lieu de sa valeur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for(k=0;k<n;k++)
        {
                printf("t[%d]==%f \t",k+1,t[k+1]);
        }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre régulier
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Points : 85
    Points
    85
    Par défaut
    Merci diogene

    pour une matrice de dimension (2,2) et in vecteur 2 dans le resulat; le t[1] est correct mais le t[2] est une variable aléatoire

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    dans un t[2] n'est même pas une "variable", c'est "la case mémoire située à 2 * (taille du type des éléments du tableau) adresses plus loin que t[0]".
    Ca peut-être n'importe quoi: une autre variable (résultat apparemment incohérent), du "rien", un bloc mémoire non accessible (provoquant une segmentation fault).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par sihamnet Voir le message
    pour une matrice de dimension (2,2) et in vecteur 2 dans le resulat; le t[1] est correct mais le t[2] est une variable aléatoire
    L'élément t[n], dernier à être affiché dans le code d'origine, ne fait pas partie du tableau t. Les tableaux C sont indexés à partir de 0, pas de 1. Par contre tu préfères faire l'affichage des indices à partir de 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for(k=0;k<n;k++)
        {
                printf("t[%d]==%f \t",k+1,t[k]);
        }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. [DEBUG] petit souci lors de la compilation...
    Par alex6891 dans le forum C
    Réponses: 11
    Dernier message: 29/09/2005, 23h16
  2. Réponses: 7
    Dernier message: 27/09/2005, 21h40
  3. [Debutant] probleme lors de la compilation
    Par boobi dans le forum Débuter
    Réponses: 5
    Dernier message: 26/08/2005, 15h57
  4. [MYSQL] Probleme lors de la compilation
    Par Nasky dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 24/02/2004, 17h04
  5. Warnings lors de la compilation
    Par polo54 dans le forum C
    Réponses: 5
    Dernier message: 07/02/2003, 09h12

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