Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

en C : allocation dynamique tableau 2D avec sous programmes



  1. #1
    Annabaile

    en C : allocation dynamique tableau 2D avec sous programmes


    ------

    Bonjour

    J'ai réalisé un programme permettant d'allouer dynamiquement un tableau à deux dimensions.
    Je voulais faire la saisie et l'impression des valeurs du tableaux dans deux sous programmes différents mais je n'y arrive pas.
    Voila ce que j'ai fait :

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    void saisietab(int *tab)
    {
        int k;
        for(k=0;k<2;k++)
        scanf("%d",&tab[k]);
    }
    
    void affichertab(int *tab)
    {
        int k;
        for(k=0;k<2;k++)
        printf("%d",tab[k]);
    }
    
    int main()
    {
        int **tab;
        int i;
        int k;
        int ligne=4;
        int colonne=2;
    
        tab=(int**)malloc(4*sizeof (int*)); ///allocation des lignes
        for (i=0;i<4;i++)
        {
            tab[i]=(int*)malloc(2*sizeof(int)); ///allocation des colonnes
            saisietab(tab[i]);
            affichertab(tab[i]);
        }
    
        return 0;
    }
    Je voudrais afficher tout le tableau d'un coup et non saisir la ligne puis l'afficher.
    Pouvez-vous m'aider ?
    Merci d'avance pour vos réponses.

    -----

  2. Publicité
  3. #2
    Sawken

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Bonjour Annabaile,

    Si j'ai bien compris tu voudrais afficher tout ton tableau d'un coup,
    Si c'est le cas t'as juste à modifier un peu ton code en procédant d'abord par étape comme suit:

    - J'alloue le nombre de ligne que je veux pour mon tableau
    - Dans une boucle j'alloue l'espace de chaque ligne du tableau puis je remplis ma ligne avec ma fonction "saistab(tab[i])"
    - puis quand je suis sortie de ma boucle "for" je fais appel à "affichertab" en le modifiant un peu

    Ça donnerait ceci

    Code:
    #include <stdio.h>
    #include <stdlib.h>
     
    void        saisietab(int *tab)
    {
        int     k;
    
        for(k = 0; k < 2; k++)
            scanf("%d", &tab[k]);
    }
    
    void        affichertab(int **tab)
    {
        int     i;
        int     k;
     
        for (i = 0; i < 4; i++)
        {
            for(k = 0; k < 2; k++)
                printf("%d", tab[i][k]);
            printf("\n");
        }
    }
     
    int         main(void)
    {
        int     **tab;
        int     i;
        int     k;
        int     ligne = 4;
        int     colonne = 2;
     
        tab = (int**)malloc(4 * sizeof(int*)); ///allocation des lignes
        for (i = 0; i < 4; i++)
        {
            tab[i] = (int*)malloc(2 * sizeof(int)); ///allocation des colonnes
            saisietab(tab[i]);
        }
        affichertab(tab);
        return (0);
    }
    Si j'ai mal compris ta question fais le mois savoir
    Dernière modification par Sawken ; 12/05/2016 à 16h38.

  4. #3
    Annabaile

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Merci beaucoup !!!
    C'est exactement ce que je cherchais.

  5. #4
    Annabaile

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Bonsoir,

    J'approfondis mon exercice et cette fois je veux en plus enregistrer les valeurs du tableau dans un fichier.
    J'ai rajouté ça :
    Code:
    void enregistrertab(int *tab)
    {
        int k;
        FILE*fic;
        fic=fopen("valeur.txt","w");
        if (fic==NULL)
            printf("erreur de fichier");
        else
        {
        for(k=0; k<2; k++)
        scanf("%d",&tab[k]);
        fprintf(fic,"%d",tab[k]);
        }
    }
    
    void affichertab(int **tab)
    {
        int i;
        int k;
        for (i=0; i<4; i++)
        {
            for(k=0; k<2; k++)
                printf("%d",tab[i][k]);
        }
    }
    
    
    int main()
    {
        int **tab;
        int i;
        int k;
        int ligne=4;
        int colonne=2;
    
        tab=(int**)malloc(4*sizeof (int*)); ///allocation des lignes
        for (i=0; i<4; i++)
        {
            tab[i]=(int*)malloc(2*sizeof(int)); ///allocation des colonnes
            enregistrertab(tab[i]);
        }
    
        affichertab(tab);
    
        return 0;
    }
    Le problème c'est que lorsque j'ouvre mon fichier je n'ai pas du tout les valeurs saisies.
    Je crois que c'est un problème de pointeurs...

    Pouvez m'aider encore une fois ?
    Merci d'avance

  6. A voir en vidéo sur Futura
  7. #5
    albanxiii
    Modérateur

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Bonjour,

    A quoi sert le scanf dans la fonction enregistrer ?
    A rien évidemment, mais je vous demande le raisonnement qui vous a conduit à l'utiliser.

    Et bien sur, vous tombez dans le piège classique des personnes qui n'aiment pas les accolades... combien de fois le fprintf est-il appelé dans la fonction enregistrer selon vous ?
    Not only is it not right, it's not even wrong!

  8. #6
    Annabaile

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Bonjour,

    Merci de votre réponse.

    En fait dans ma fonction enregistrer je souhaite saisir les valeurs (d'ou le scanf) puis les enregistrer.(Je ne sais pas si ce résonnement est bon.)
    J'ai rajouté les accolades mais les valeurs dans mon fichier restent inexactes.

  9. Publicité
  10. #7
    mAdVax

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Bonjour

    Où sont les nouvelles accolades?
    Je vois un autre problème: le fichier est ouvert à chaque ligne en mode écrasement, et n'est jamais fermé. Il faudrait probablement écrire une procédure «enregistrertab» à l'image de «affichertab», qui enregistrerait le tableau en une seule fois. Et donc une procédure de saisie en une fois, et par la même occasion séparer l'allocation dans une procédure dédiée. Tout sera plus clair.
    Il est toujours préférable de séparer les tâches — le tableau est là pour stocker les valeurs entre chaque tâche.

    Dernier point: il faut non seulement fermer le fichier, mais aussi libérer la mémoire allouée! Même si c'est fait automatiquement à la fin du programme, c'est une bonne habitude à prendre.

    Question: y-a-t'il une raison pour utiliser un tableau de tableaux, au lieu d'un simple tableau à 2 dimensions?
    Un tableau à 2 dimensions normal est accessible par tab[i][k]. L'allocation dynamique se fait en une fois tab = (int*)malloc(ligne*colonne*siz eof(int))

  11. #8
    albanxiii
    Modérateur

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    Citation Envoyé par Annabaile Voir le message
    En fait dans ma fonction enregistrer je souhaite saisir les valeurs (d'ou le scanf) puis les enregistrer.(Je ne sais pas si ce résonnement est bon.)
    Vous saisissez donc les valeurs au clavier, les écrivez dans le fichier et les stockez dans le tableau ?
    Je n’avais pas compris ça, pour moi, vous vouliez écrire les valeurs contenues dans le tableau, rempli par ailleurs dans le fichier.

    Citation Envoyé par Annabaile Voir le message
    J'ai rajouté les accolades mais les valeurs dans mon fichier restent inexactes.
    D'où la question :
    Citation Envoyé par albanxiii Voir le message
    combien de fois le fprintf est-il appelé dans la fonction enregistrer selon vous ?
    Not only is it not right, it's not even wrong!

  12. #9
    Sawken

    Re : en C : allocation dynamique tableau 2D avec sous programmes

    J'ai cru avoir répondu à ta question hier soir mais mon message ne s'est pas envoyé et je ne sais pas pourquoi...

    Écrire dans un fichier n'est pas aussi simple que tu le penses,
    Tu dois convertir en chaine de caractères (char *) chaque entier (int) pour que dans ton fichier tu n'ais pas de caractères mystiques quand
    tu fait ton fprintf.
    De plus tu fais appel à "enregistertab" plusieurs fois et cette fonction à chaque fois créée un nouveau flux "FILE *" donc à chaque appel de cette fonction tu fopen le fichier et tu écrases tout ce qu'il y avait précédemment.

    Voilà comment arranger tout ça pour ton cas précisément

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    
    void enregistrertab(int *tab, FILE *fic)
    {
            int k;
            int i;
            char buf[9];
    
            i = 0;
            bzero(buf, 9);
            for(k=0; k<2; k++)
                    scanf("%d", &tab[k]);
            while (i < 2)
            {
                    snprintf(buf, 9, "%d", tab[i]);
                    fprintf(fic, "%s", buf);
                    bzero(buf, 9);
                    if (i == 0)
                            fprintf(fic, ", ");
                    i++;
            }
            fprintf(fic, "\n");
    }
    
    void affichertab(int **tab)
    {
            int i;
            int k;
            for (i=0; i<4; i++)
            {
                    for(k=0; k<2; k++)
                            printf("%d ",tab[i][k]);
                    printf("\n");
            }
    }
    
    int main()
    {
            int **tab;
            int i;
            int k;
            int ligne=4;
            int colonne=2;
            FILE*fic;
    
            fic = fopen("valeur.txt","w");
            tab=(int **)malloc(4*sizeof (int *)); ///allocation des lignes
            for (i=0; i<4; i++)
            {
                    tab[i]=(int*)malloc(2*sizeof(int)); ///allocation des colonnes
                    enregistrertab(tab[i], fic);
            }
    
            affichertab(tab);
    
            return 0;
    }

Discussions similaires

  1. Allocation dynamique C++
    Par bastien31 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 25/02/2016, 13h36
  2. Allocation Dynamique
    Par andromedae dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 20/10/2013, 20h14
  3. allocation dynamique C
    Par Jack dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 21/10/2012, 10h27
  4. Allocation dynamique
    Par Titoune971 dans le forum Programmation et langages, Algorithmique
    Réponses: 16
    Dernier message: 03/02/2011, 16h43
  5. allocation dynamique c/c++
    Par Lt972 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 16/06/2008, 13h19