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 :

Allocations dynamiques multiples.


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 43
    Points : 17
    Points
    17
    Par défaut Allocations dynamiques multiples.
    Salut à tous !

    J'ai vu mardi, l'allocation dynamique multiple et depuis je patauge dans la semoule... Cependant en travaillant sur le sujet, j'ai l'impression que ça va mieux ! Par exemple dans le code suivant j'ai réussi à remplir une matrice ! Mais le programme plante... Voici la bête
    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 <stdlib.h>
    #include <time.h>
     
    double** create_matrix(int I, int J){
        double** matrix = calloc(sizeof(double*),I);
        int i;for(i=0;i<I;i++){
            matrix[i] = calloc(sizeof(double),J);
        }
        return matrix;
    }
     
    void free_matrix(double **m, int I){
        int i;for(i=0;i<I;i++){free(m[i]);}
        free(m);
    }
     
    void fill_matrix(double **m, int I, int J){
        srand(time(NULL));
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){
                m[i][j]=rand()%(I*J);
            }
        }
    }
     
    void print_matrix(double **m, int I, int J){
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){printf("%.2lf | ",m[i][j]);}
            printf("\n");
        }
    }
    Et maintenant voici ce que j'ai compris : Je crée un tableau de I tableau(x) de double contenant J double(s) ainsi pour accéder au tableau 1 de J double(s) je peux demander matrix[1] et pour accéder à la case 1 du tableau 1 je peux demander matrix[1][1].

    Enfin voici jusqu'à où le programme déroule avant de planter : Il déroule jusqu'à l'affiche de ma deuxième matrice.
    Voici mon main :
    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
        int i, j, k;
        int dimA = 4;
        int dimB [] = {4,5};
        int dimId = 4;
        double **A;
        double **B;
        double **C;
        double **Id;
     
        printf("Création de A et B\n");
        A = create_matrix(dimA, dimA);
        B = create_matrix(dimB[0], dimB[1]);
        printf("\n");
     
        printf("Suppression de A et B\n");
        free_matrix(A, dimA);
        free_matrix(B, dimB[0]);
        printf("\n");
     
        printf("Création de A et B\n");
        A = create_matrix(dimA, dimA);
        B = create_matrix(dimB[0], dimB[1]);
        printf("\n");
     
        printf("Remplissage de A et B\n");
        fill_matrix(A, dimA, dimA);
        fill_matrix(B, dimB[0], dimB[1]);
        printf("\n");
     
        printf("Affichage de A et B\n");
        print_matrix(A, dimA, dimA);
        printf("\n");
        print_matrix(B, dimB[0], dimB[1]);
        printf("\n");
     
        printf("Création et affichage d'une matrice identité %dx%d\n", dimId, dimId);
    Qu'en dites-vous ? Pouvez vous m'expliquer où sont mes erreurs que j'essaye d'apprendre ! J'espère arriver à comprendre cette nouvelle technique ce serait génial .

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ton code est pas mal, je trouve. En revanche tu as un certain goût pour le risque: comme tu remplis ta matrice avec cette formule:
    quand tu décides d'afficher comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print_matrix(B, dimB[0], dimB[1]);
    il y a une chance non nulle que dimB[0] ou dimB[1] soit supérieur au nombre respectivement de lignes et de colonnes de la matrice; et que se passe-t-il quand on affiche des éléments en dehors de la matrice?

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est bien, les seules erreurs que je vois dans ce que tu nous proposes sont les appels à calloc. Relis-bien la documentation en détail, tu devrais vite les identifier.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    tu dis que ton programme affiche A et B. c'est bien ce qu'il est censé fait je crois le résultat escompter pour toi était lequel?
    si ça plante après avoir tout afficher; alors jet encore un coup d’œil comme la dit matt_ à la doc sur calloc

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos conseils !

    Ca fait du bien un forum où on se fait pas crier dessus quand on débute ! .

    J'ai bien suivi vos conseils et j'ai pu me corriger, mon programme avance. Voici mon nouveau code (avec quelques fonctions en plus si jamais quelqu'un a besoin MAIS ATTENTION la fonction puissance de matrice ne fonctionne pas pour n>1, elle n'affiche que des matrices nulles, je vais tenter de corriger cela demain à tête reposer).

    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
    double** create_matrix(int I, int J){
        double** matrix = calloc(sizeof(double*),I);
        int i;for(i=0;i<I;i++){
            matrix[i] = calloc(sizeof(double),J);
        }
        return matrix;
    }
     
    void free_matrix(double **m, int I){
        int i;for(i=0;i<I;i++){free(m[i]);}
        free(m);
    }
     
    void fill_matrix(double **m, int I, int J){
        srand(time(NULL));
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){
                m[i][j]=rand()%(I*J);
            }
        }
    }
     
    void print_matrix(double **m, int I, int J){
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){printf("%.2lf | ",m[i][j]);}
            printf("\n");
        }
    }
     
    double ** create_identity(int I){
        double **Id = create_matrix(I,I);
        int i,j;
        for(i=0;i<I;i++){
            for(j=0;j<I;j++){
                    if(i==j){Id[i][j]=1 ;}
                    else {Id[i][j]=0 ;}
            }
        }
        return Id;
    }
     
    double compute_trace(double **m, int I){
        double sum=0;
        int i,j;
        for(i=0;i<I;i++){
            for(j=0;j<I;j++){
                    if(i==j){sum+=m[i][j];}
            }
        }
        return sum;
    }
     
    double ** compute_product(double **m1, double **m2, int I, int J, int K){
        double** m3 = create_matrix(I,K);
        int i,j,k;
        for(i=0;i<I;i++){
            for(k=0;k<K;k++){
                    for(j=0;j<J;j++){
                        m3[i][k]+= (m1[i][j])*(m2[j][k]);
                    }
            }
        }
        return m3;
    }
     
    double ** compute_power(double **m, int I, int n){
        if(n==1){return m;}
        if(n==2) {return compute_product(m,m,I,I,I);}
        else {return compute_power(compute_product(m,m,I,I,I),I,n-1);}
    }
    Bonne soirée les codeurs !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    il y a une chance non nulle que dimB[0] ou dimB[1] soit supérieur au nombre respectivement de lignes et de colonnes de la matrice; et que se passe-t-il quand on affiche des éléments en dehors de la matrice?
    La réponse selon moi est : Il y a une erreur de segmentation car le programme réquisitionne des bouts de mémoire qui sont déjà alloué.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    La réponse est "si tu as de la chance, il y a une erreur de segmentation tout de suite car ton OS détecte à un accès à une zone à laquelle tu n'as pas le droit t'accéder ; sinon, tu corromps simplement la mémoire avec des conséquences allant de rien du tout, à des affichages bizarres, des comportements incompréhensibles ou encore des plantages à retardement".

    J'ai ecrit un article qui montre pourquoi ne pas utiliser gets() car on peut écrire en dehors des bornes : https://gradot.wordpress.com/2013/05...-programmes-c/. Le principe de dépassement est le même ici avec tes fonctions de matrices.

    Ici, on ne crie que sur les gens qui font n'importe quoi ou ne font pas d'effort

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    En programmation comme ailleurs, il est bon de prendre tout de suite de bonnes habitudes, afin de ne pas avoir à les corriger plus tard. Ci-dessous quelques conseils de "bonnes habitudes" sur ton code. Bien sur, chacun a ses bonnes habitudes, mais il existe tout de même un consensus sur le fait de bien nommer ses variables, vérifier les codes de retour des fonctions qu'on appelle et ce genre de choses.
    Pour le formatage du code, chacun ses habitudes, les tiennes ne sont pas plus mauvaises que les miennes

    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
     
    /* on evite les majuscules pour les variables, et on donne des noms explicites aux variables */
    double** create_matrix(int nb_colonne, int nb_ligne)
    {
    /* On declare les variables au debut de la fonction ou du bloc */
        double** matrix;
        int i; /* i est accepte en tant qu'iterateur, pas besoin de le nommer autrement */
     
      matrix = calloc(sizeof(double*),nb_colonne);
      if (matrix == NULL)
      {
        /* Ne pas oublier de gerer l'erreur */
        printf (erreur);
      }
      else
      {
        for(i=0 ; i< nb_colonne;i++)
        {
           matrix[i] = calloc(sizeof(double),nb_ligne);
           if (matrix[i] == NULL)
          {
           printf ("erreur allocation ligne %d\n", i);
           free_matrix (matrix, nb_colonne);
          }
        }
      }
      return matrix;
    }
     
    void free_matrix(double **m, int nb_colonne)
    {
      int i;
      for(i=0;i<nb_colonne;i++)
      {
         free(m[i]);
      }
      free(m);
    }
     
    /* Et ainsi de suite :) */
     
    void fill_matrix(double **m, int I, int J){
        srand(time(NULL));
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){
                m[i][j]=rand()%(I*J);
            }
        }
    }
     
    void print_matrix(double **m, int I, int J){
        int i,j;for(i=0;i<I;i++){
            for(j=0;j<J;j++){printf("%.2lf | ",m[i][j]);}
            printf("\n");
        }
    }
     
    double ** create_identity(int I){
        double **Id = create_matrix(I,I);
        int i,j;
        for(i=0;i<I;i++){
            for(j=0;j<I;j++){
                    if(i==j){Id[i][j]=1 ;}
                    else {Id[i][j]=0 ;}
            }
        }
        return Id;
    }
     
    double compute_trace(double **m, int I){
        double sum=0;
        int i,j;
        for(i=0;i<I;i++){
            for(j=0;j<I;j++){
                    if(i==j){sum+=m[i][j];}
            }
        }
        return sum;
    }
     
    double ** compute_product(double **m1, double **m2, int I, int J, int K){
        double** m3 = create_matrix(I,K);
        int i,j,k;
        for(i=0;i<I;i++){
            for(k=0;k<K;k++){
                    for(j=0;j<J;j++){
                        m3[i][k]+= (m1[i][j])*(m2[j][k]);
                    }
            }
        }
        return m3;
    }
     
    double ** compute_power(double **m, int I, int n){
        if(n==1){return m;}
        if(n==2) {return compute_product(m,m,I,I,I);}
        else {return compute_power(compute_product(m,m,I,I,I),I,n-1);}
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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