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 :

Problème Allocation de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Par défaut Problème Allocation de mémoire
    Chers Amis programmeurs Bonsoir !

    Je suis des cours de programmation en langage C et je rencontre un problème lors de l'allocation mémoire de certaine de mes variables.

    Je vais d'abord exposer le code avant de dire ce qu'il est censé faire et ou se trouve mon problème car peut être que ce qui ne me saute pas au yeux sautera aux vôtres !

    J'utilise GNU GCC Compiler
    Ceci est mon fichier.c
    Code C : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    #include "functions.h"
    #include "voidFun.h"
    #include "voidFun2.h"
    #include "void25.h"
    #include "time.h"
    #define MYSTMAX 100
    #define MYSTMIN 0
     
    void tab2DTri()
    {
        int i, j, k= 0, n, m, buff;
        int **tab2D = malloc(n*sizeof(int*));
        int **tab2Tri = malloc(n*sizeof(int*));
        int *tab1Tri = malloc((n*sizeof(int)*(m*sizeof(int))));
     
        srand(time(NULL));
        printf("Veuillez definir les dimensions du tableau a 2 dim\n");
        printf("Nombre de Lignes (max 10)?  ");
        scanf("%d", &n);
        printf("\nNombre de Colonnes (max 10)?  ");
        scanf("%d", &m);
        printf("\n");
     
     
        for (i = 0; i < n; i ++)
        {
            tab2D[i] = malloc(m*sizeof(int));
     
        }
        for (i = 0; i < n; i ++)
        {
            tab2Tri[i] = malloc(m*sizeof(int));
     
        }
     
     
        for (i = 0; i < n; i ++)
        {
            for (j = 0; j < m; j ++)
            {
                tab2D[i][j] = rand()%(100 + 0 + 1) + 0;
            }
        }
        printf("\nVoici le tableau generer aleatoirement\n");
        affiche2D(tab2D,n,m);
     
        for (i = 0; i < n; i ++)
        {
            for (j = 0; j < m; j ++)
            {
                tab1Tri[k] = tab2D[i][j];
                k++;
            }
        }
     
        for (i = 0; i < n*m; i ++)
        {
            for (j = 0 ; j < n*m - 1 - i; j ++)
            {
                if (tab1Tri[j+1] < tab1Tri[j])
                {
                    buff = tab1Tri[j];
                    tab1Tri[j] = tab1Tri[j+1];
                    tab1Tri[j+1] = buff;
                }
            }
        }
        k = 0;
        for (i = 0; i < n; i ++)
        {
            for (j = 0; j< m; j ++)
            {
                tab2Tri[i][j] = tab1Tri[k];
                k ++;
            }
        }
        printf("Voici maintenant le moment que vous attendiez tous, le tableau trier !\n");
        affiche2D(tab2Tri,n, m);
        free(tab2D);
        free(tab2Tri);
        free(tab1Tri);
     
    }
     
    void affiche2D(int **tab,int n,int m)
    {
     
        int i, j;
        for (i = 0; i < n; i ++)
        {
            for (j = 0; j < m; j ++)
            {
                printf("%3d", tab[i][j]);
            }
            printf("\n");
        }
        printf("\n\n");
     
    }

    Lorsque j'utilise le debug de CodeBlock, je me rend compte que lorsque le programme exécute l'initialisation des variables (pointeurs dans mon cas), il n'alloue pas d'adresse mémoire à Tab2Tri et parfois à Tab1Tri. Ce qui à pour influence que le programme ne réponde plus.Le problème arrive au niveau de ma boucle qui est censé alloué des adresses mémoire aux pointeurs dans Tab2Tri.

    Bizarrement le programme a déjà fonctionner. Ce qui veut dire , même si je ne prend peut être pas la méthode la plus facile, que le fond du code est bon.

    C'est un exercice ou je dois générer un tableau à deux dimension d'entiers aléatoires et ensuite les trier.

    J'espère que quelqu'un saura m'aider !
    Merci d'avance et bonne soirée à tous et à toutes !!!

  2. #2
    Membre averti Avatar de Butcher22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    Bonsoir,

    le premier problème que je vois, est que tu utilises malloc avec des variables (m et n) qui ne sont pas initialisées ! Il faudrait mieux faire tes malloc après avoir récupéré le contenu de tes deux variables.

  3. #3
    Membre averti
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Par défaut
    Citation Envoyé par Butcher22 Voir le message
    Bonsoir,

    le premier problème que je vois, est que tu utilises malloc avec des variables (m et n) qui ne sont pas initialisées ! Il faudrait mieux faire tes malloc après avoir récupéré le contenu de tes deux variables.
    Je l'ai déja fait plusieurs fois dans des programmes précédents et ça avait l'air de fonctionner.
    Le problème étant que vu que je dois mettre le malloc à l'initialisation, et que les tailles (lignes et colonnes) sont demandés dans un scanf, je ne peux pas le faire avant sauf si je les mets en paramètres de ma fonction .
    C'est pas le but des tableaux dynamiques ? ( je me trompe peut être ^^ )

    Je viens d'essayer en leur donnant la valeur de 10 , et le soucis reste le même. Je n'ai pas d'adresse mémoire allouer à Tab2Tri et Tab1Tri

  4. #4
    Membre averti Avatar de Butcher22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    si tu n'indiques pas de valeur à tes variables, à la compilation elles seront initialisées avec des valeurs aléatoires, ça peut marcher quand ton compilateur te générera des chiffres positifs assez grand (mais là tu alloueras de l'espace que tu n'utiliseras pas, ce qui pourrait poser problème, ou pas, selon l'utilisation de ton prog....)

    sinon tu peux très bien décaler tes malloc, après tes scanf ! en fait il le faut...

    essaye comme ça et dis moi quoi.

  5. #5
    Membre averti
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Par défaut
    Citation Envoyé par Butcher22 Voir le message
    si tu n'indiques pas de valeur à tes variables, à la compilation elles seront initialisées avec des valeurs aléatoires, ça peut marcher quand ton compilateur te générera des chiffres positifs assez grand (mais là tu alloueras de l'espace que tu n'utiliseras pas, ce qui pourrait poser problème, ou pas, selon l'utilisation de ton prog....)

    sinon tu peux très bien décaler tes malloc, après tes scanf ! en fait il le faut...

    essaye comme ça et dis moi quoi.
    C'était bien ça
    C'est un peu nouveau pour moi les malloc et l'allocations dynamique mais au final ce que tu dis tiens plus que la route.
    Encore merci beaucoup !
    Passe une excellente soirée ! Je m'en vais réécrire tout mes codes

  6. #6
    Membre averti Avatar de Butcher22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    ravi d'avoir pu aider

    sinon, ayant regardé d'un peu plus prés ton code, pour le free, il faut , comme lors de l'allocation, utilisé une boucle et faire un free de chaque sous case, sinon tu ne libéreras pas toutes tes cases mémoires.


    edit: voila le guide parfait pour toi
    http://rperrot.developpez.com/articles/c/allocationC/

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

Discussions similaires

  1. problème d'allocation de mémoire
    Par NomadSoul123 dans le forum C++
    Réponses: 2
    Dernier message: 18/10/2007, 11h08
  2. problème d'allocation de mémoire
    Par kreel dans le forum C
    Réponses: 10
    Dernier message: 28/04/2007, 14h40
  3. Problème allocation mémoire
    Par Arnaud F. dans le forum C
    Réponses: 9
    Dernier message: 08/04/2007, 13h42
  4. problème allocation mémoire
    Par kinta dans le forum C++
    Réponses: 7
    Dernier message: 09/02/2006, 23h22
  5. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22

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