Paramètre de tableau 2D [Résolu]

Signaler
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013
-
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013
-
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

Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
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
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013

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!