Paramètre de tableau 2D

Résolu
cs_Nairos Messages postés 11 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 7 janvier 2013 - 6 déc. 2012 à 14:19
cs_Nairos Messages postés 11 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 7 janvier 2013 - 6 déc. 2012 à 15:45
Bonjour,
J'ai écris un programme qui déclare, initialise puis affiche un tableau à deux dimensions. Toutefois, je souhaiterais le moduler en plusieurs fonctions : une qui déclare, une qui initialise et une qui affiche.
Le code suivant est signalé sans erreur, est compilé et fonctionne :

int main()
{
    char** tab=NULL;
    int lignes=5;
    int colonnes=5;
    //déclare un tableau
    tab = malloc(sizeof(char*)*lignes);
    for (int i = 0; i<lignes ; i++)
    {
        tab[i]=malloc(colonnes*sizeof(char*));
    }

    //Remplit un tableau de char
    for (int i = 0; i<5 ; i++)
    {

        for (int j=0; j<5; j++)
        {

            tab[i][j]='M';

        }
    }
    //Imprime à l'écran un tableau de char
        for (int i = 0; i<5 ; i++)
    {
        puts("\n");
        for (int j=0; j<5; j++)
        {
            putchar(' ');
            putchar(' ');
            printf("%c",tab[i][j]);
        }
    }

    free(tab);

    return 0;
}


Toutefois, dès que j'essaye de transformer ceci en fonction, à savoir comme ceci :
void DeclarationTabChar(char** tab, int lignes, int colonnes)
{
        //déclare un tableau
    tab = malloc(sizeof(char*)*lignes);
    for (int i = 0; i<lignes ; i++)
    {
        tab[i]=malloc(colonnes*sizeof(char*));
    }
}

void UniRemplissageTabChar(char **Tab, char caractereunique)
{
    for (int i = 0; i<5 ; i++)
    {
        printf("ok");
        for (int j=0; j<5; j++)
        {
            printf("ok");
            Tab[i][j]=caractereunique;
            printf("ok");
        }
    }
}

void AffichageTabChar(char** tab)
{
    for (int i = 0; i<5 ; i++)
    {
        for (int j=0; j<5; j++)
        {
            printf("%c",tab[i][j]);
        }
    }
}

int main()
{
    tab = malloc(sizeof(char*)*lignes);
    DeclarationTabChar(tab, 5,5);
    UniRemplissageTabChar(tab,'M');
    AffichageTabChar(tab);
    free(tab);
}


Et là, plantage systématique, le code est signalé sans erreur et est compilé, mais il plante immédiatement.
Si des âmes charitables pouvaient m'éclairer, ça ne serait pas de refus.
N.

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 déc. 2012 à 14:49
Bonjour.

C'est tout simplement que tu fais passer "tab" dans DeclarationTabChar mais que tu affectes la copie et non le tableau en lui même. Tu ne récupères donc jamais la tableau initialisé, mais tu conserves ton pointeur non initialisé, d'où ton erreur. Il te faudrait faire un: DeclarationTabChar(&tab, 5,5); avec en déclaration: "void DeclarationTabChar(char*** tab, int lignes, int colonnes)
"

Je te propose une solution un peu plus élégante:
#include <stdio.h>
#include <stdlib.h>

char** declarationTabChar(int lignes, int colonnes)
{
  char** tab = malloc(sizeof(char*) * lignes);
  for (int i = 0; i < lignes ; ++i)
    tab[i] = malloc(colonnes * sizeof(char*));
  return tab;
}

void uniRemplissageTabChar(char **tab, char caractereunique,
   int lignes, int colonnes)
{
  for (int i = 0; i < lignes ; ++i)
    for (int j = 0; j < colonnes; ++j)
      tab[i][j] = caractereunique;
}

void affichageTabChar(char** tab,
      int lignes, int colonnes)
{
  for (int i = 0; i < lignes; ++i)
  {
    for (int j = 0; j < colonnes; ++j)
      printf("%c ", tab[i][j]);
    printf("\n");
  }
}

int main(void)
{
  int ligne = 7;
  int colonne = 5;

  char** tab = declarationTabChar(ligne, colonne);
  uniRemplissageTabChar(tab,'M', ligne, colonne);
  affichageTabChar(tab, ligne, colonne);
  free(tab);

  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cs_Nairos Messages postés 11 Date d'inscription mardi 19 octobre 2010 Statut Membre Dernière intervention 7 janvier 2013
6 déc. 2012 à 15:45
J'avais envisagé cette solution mais je n'étais parvenu à rien! Je fais du C depuis un mois et sans doutes m'embrouillais-je avec les '&'...
Un grand merci à toi!
0
Rejoignez-nous