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 :

pb tableau bidimensionnel en dynamique


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Par défaut pb tableau bidimensionnel en dynamique
    Salut tout le monde, je sais qu'il y a déjà des sujet traitant ce type de probleme mais je voulais quand meme savoir ce qui n'allait pas dans mon code,
    je voudrai allouer une place memoire pour un tableau[l][c] et copier sur une des lignes une chaine de caractere
    cependant je pense que le probleme vien du 'for', a moins que ce ne soit la façon de faire qui ne soit pas bonne
    Est ce que vous pourrier éclairer ma lanterne?

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {
     
        int c,l,i,lg;
        char ch[50],**mat2=NULL,*mat=NULL;
     
        gets(ch);
        fflush(stdin);
        lg=strlen(ch);
     
        printf("Nombre de lignes et des colonnes?");
        scanf("%d%d",&l,&c);
     
        mat2=(char**)malloc(sizeof(char*)); //alloue de la place pour les pointeurs(int*) de chaque ligne
     
            if(mat2!=NULL)
            {
                        for(i=0;i<l;i++)
                          {mat[i]=(char*)malloc(c*sizeof(char)); //alloue de la place pour chaque ligne composée uniquement de int
                          }
                          strcpy(*mat[0],ch);
                       printf("%s", mat[0]);  
            }
      system("PAUSE");	
      return 0;
    }

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par silencer
    Salut tout le monde, je sais qu'il y a déjà des sujet traitant ce type de probleme mais je voulais quand meme savoir ce qui n'allait pas dans mon code,
    Déjà, ça :

    Ensuite, tu peux toujours corriger ça, ça fera le ménage...
    Project : Forums
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:23: warning: assignment makes integer from pointer without a cast
    main.c:25: error: invalid type argument of `unary *'
    main.c:26: warning: format argument is not a pointer (arg 2)
    main.c: At top level:
    main.c:5: warning: unused parameter 'argc'
    main.c:5: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 1 seconds)
    1 errors, 4 warnings
    je voudrai allouer une place memoire pour un tableau[l][c] et copier sur une des lignes une chaine de caractere
    cependant je pense que le probleme vien du 'for', a moins que ce ne soit la façon de faire qui ne soit pas bonne
    Est ce que vous pourrier éclairer ma lanterne?
    Ne pas utiliser gets(), c'est un bug bien connu. On ne sait pas ce qui doit être saisi.http://emmanuel-delahaye.developpez.com/inputs.htm
    n'existe pas en C standard. Inutile si la fonction d'entrée fait son travail.

    scanf() est mal utilisée. Usage difficile. Préférer une saisie correcte de chaine et une conversion contrôlée avec sscanf().

    L'usage de malloc() est inutilement complexe.

    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Il faut allouer 'l' pointeurs.

    La copie de la chaine doit se faire en mat[0] (qui contient l'adresse du premier élément d'un tableau de char) et non en *mat[0] qui désigne un char non initialisé.

    Il faut choisir entre mat et mat2...

    Il faut penser à libérer les blocs alloués selon le principe "un malloc(), un free()" (dans le bon ordre, évidemment...).

  3. #3
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    A quoi sert mat2 ? Tu lui affecte le retour d'un malloc, mais elle n'est pas utilisée dans la suite.

    Même question.

    Comment on peut différencier les deux nombres saisis ?

    mat étant un char*, mat[0] est un char. Donc *mat[0] correspond à... quoi ?

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Par défaut
    -le fflush(stdin) doit marcher, sinon je ne voi pas pk notre prof nous aurait dit que l'on pouvais l'utuliser a la place d'un getchar() pour ne pas garder en mémoire le caracter "entrer"
    -*mat[] j'avais essayé ça suite a l'erreur qu'il m'a retourné mais a la base j'avai mis mat[] et ça me fesai la meme erreur
    "main.c [Warning] assignment makes integer from pointer without a cast "
    -lg je l'avais utilise pour qu'il me mette le caractère de fin de chaine où je voulais

    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
    31
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
     
        int c,l,i,**mat2=NULL,*mat=NULL;
        char ch[50];
        printf("entrer la chaine a copier dans le tableau\n");
        gets(ch);
        fflush(stdin);
     
     
        printf("Nombre de lignes et des colonnes?\n");
        scanf("%d%d",&l,&c);
     
        mat2=(int**)malloc(sizeof(char*)); //alloue de la place pour les pointeurs(int*) de chaque ligne
     
            if(mat2!=NULL)
            {
                        for(i=0;i<l;i++)
                          {mat[i]=(int*)malloc(c*sizeof(char)); //alloue de la place pour chaque ligne composée uniquement de char
                          }
     
                          strcpy(mat[0],ch);
                       printf("%s", mat[0]);  
            }
      system("PAUSE");	
      return 0;
    }

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par silencer
    -le fflush(stdin) doit marcher,
    Non. C'est incorrect (comportement indéfini.)
    sinon je ne voi pas pk notre prof nous aurait dit que l'on pouvais l'utuliser a la place d'un getchar() pour ne pas garder en mémoire le caracter "entrer"
    Parce que ce comportement est défini sur certaines plateformes DOS ou Windows. Mais ce n'est pas portable.

    Tu n'as besoin que d'un pointeur de type char **. Fait un dessin de la structure de données que tu veux faire, tu vas comprendre.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/03/2009, 15h53
  2. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33
  3. Réponses: 18
    Dernier message: 06/07/2005, 14h58
  4. [Reflection] Créer un tableau d'objets dynamiquement.
    Par salome dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 25/03/2005, 18h59
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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