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 :

malloc tableau 2D + fonction + main


Sujet :

C

  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut malloc tableau 2D + fonction + main
    Je voudrais creer une fonction create_table qui me permettera de creer un tableau dynamique 2D.

    en voici le code de 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
     
    int main (void){
        int nb_col, nb_lig;
        char *grille=NULL;
     
      scanf("%d", &nb_col);
      scanf("%d", &nb_lig);
      create_table(grille, nb_lig, nb_col);
     
      initialisation_grille(grille, nb_lig, nb_col);
      draw_grille(grille, nb_lig, nb_col);
     
      free(grille);
     
      system("PAUSE");	
      return EXIT_SUCCESS;
    }
    Et voici le code de create_table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void create_table(char *grille, int nb_lig, int nb_col){
        grille=malloc(nb_col*nb_lig*sizeof(*grille));
         }
    Le programme se lance, mais des que j'ai entré mes nb_col et nb_lig le prog beug

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Puisque tu initialises grille dans create_table, tu dois transmettre son adresse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create_table((char **) &grille,nb_lig,nb_col);
    ...
    void create_table(char **grille, int nb_lig, int nb_col){
        *grille=malloc(nb_col*nb_lig*sizeof(**grille));
         }
    Dans ton code, c'est une copie de grille que tu initialises.

  3. #3
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    pourquoi avoir déclarer un pointeur sur pointeur?
    sacant que dans mon main j'ai déclarer char * grille;

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Dans ton code initial, quand tu appelles create_table avec comme premier paramètre grille, tu ne fais que transmettre une copie de grille à ta fonction (passage des paramètres par valeur).

    Quand tu ressors de ta fonction, grille n'est pas modifiée (affiche sa valeur avant et après avec un printf et tu verras).

    Tu dois donc transmettre son adresse pour que ta fonction puisse le modifier. D'où le char **.

    Ce qui te perturbe est que la valeur à modifier (initialiser) est un pointeur.
    Si cela avait été un int à initialiser dans ta fonction, tu aurais de toi-même (enfin j'espère !) transmis son adresse.

  5. #5
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Toujours un soucis, voila mon code :
    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
     
    void create_table((char **) &grille ,int nb_lig, int nb_col); 
    // Probleme de syntaxe
     
    int main (void){
        int nb_col, nb_lig;
        char *grille=NULL;
     
      scanf("%d", &nb_col);
      scanf("%d", &nb_lig);
      create_table(grille, nb_lig, nb_col);
     
      initialisation_grille(grille, nb_lig, nb_col);
      draw_grille(grille, nb_lig, nb_col);
     
      free(grille);// liberation de l'espace memoire precedement alloue
     
      system("PAUSE");	
      return EXIT_SUCCESS;
    }
    void create_table(char **grille, int nb_lig, int nb_col){
    *grille=malloc(nb_col*nb_lig*sizeof(**grille));
    }

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    regarde bien le code que je t'ai donné et notamment l'appel à create_table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create_table((char **) &grille,nb_lig,nb_col);

  7. #7
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    erreur de syntaxe, pareil
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void initialisation_grille(char *grille, int nb_lig, int nb_col);
    void draw_grille(char *grille, int nb_lig, int nb_col);
     
    void create_table(char **grille, int nb_lig, int nb_col){
        *grille=malloc(nb_col*nb_lig*sizeof(**grille));
         }
     
    int main (void){
        int nb_col, nb_lig;
        char *grille=NULL;
     
      scanf("%d", &nb_col);
      scanf("%d", &nb_lig);
      create_table((char **) &grille,nb_lig,nb_col);
     
     
      initialisation_grille(grille, nb_lig, nb_col);
      draw_grille(grille, nb_lig, nb_col);
     
      free(grille);// liberation de l'espace memoire precedement alloue
     
      system("PAUSE");	
      return EXIT_SUCCESS;
    }

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Sur quelle ligne est ton erreur de syntaxe ?

    Si c'est sur le malloc (défini en void *), ajoute (char *) malloc(...

  9. #9
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void create_table((char **) &grille, int nb_lig,int nb_col){
    36 syntax error before '(' token

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Tu es sous quel environnement ? (OS et compilateur)

    Ton code se compile sans erreur sous C++ Builder/Windows (si ce n'est à l'édition de liens puisqu'il n'y a pas le code des fonctions initialisation_grille et draw_grille).

    Oups, je viens de voir une énormité dans ton message du dessus (paramètre de create_table): ce n'est pas void create_table((char **) &grille, ...) qu'il faut mettre mais void create_table(char ** grille, ...).

    Est-ce une erreur de retranscription lors de l'écriture de ton message où cela figure-t'il dans ton code ?

  11. #11
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    C'est bon, j'ai rectifier mon soucis (dans ma fonction initialisation, je refaisait un malloc dedans, alors que ce n'était pas mon but)

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

Discussions similaires

  1. passer un tableau issu d'un malloc a une fonction
    Par tixweb dans le forum Débuter
    Réponses: 6
    Dernier message: 09/07/2007, 07h14
  2. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  3. la fonction main
    Par harvouj dans le forum Langage
    Réponses: 1
    Dernier message: 13/02/2006, 01h34
  4. [mise à jour tableau en fonction du button radio]
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 30/12/2005, 11h41
  5. tableau et fonction en c++
    Par flobx dans le forum C++
    Réponses: 5
    Dernier message: 13/11/2005, 15h12

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