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 :

Allocation d'un tableau 2D


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut Allocation d'un tableau 2D
    Bonjour,

    j'essai d'allouer un tableau à 2D en connaissant la taille d'une seule dimension.

    et sur chaque ligne je met une chaine de caractère dont je ne connais pas la taille.

    le problème et que lorsque je fais l'initialisation par une boucle for j'ai toujours la dernière chaine dans tous mon tableau.

    voici 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
        char** Aj;
        char num[2];
        char toto[4]="Bon";
        char tmp[4];
        int i,n=7,j=5,k;
     
        Aj=(char**) malloc (n*sizeof(char*));
     
        for(i=0;i<n;++i)
           Aj[i]=(char*) malloc (sizeof(char)*j);
    	/*for(i=0;i<n;i++)
            Aj[i]="Bonjo";*/
       /* for(i=0;i<n;++i)
    		for(k=0;k<j;++k)
    			Aj[i][k] = 'a';*/
       for(i=0;i<j;i++)
       {
    	   for(k=0;k<n;++k)
    	   {
               strcpy(tmp,toto);
               itoa(i,num,10);
               strcat(tmp,num);
               Aj[i] = tmp ; 
    	   }
       } 
     
       //for(i=0;i<n;i++)
        for(i=0;i<j;++i)
    		printf("valeur dans le tableau : %s\n",Aj[i]);
     
       //for(i=0;i<n;++i)
         //  free(Aj[i]);
       free(Aj);
     
        return 0;
    }

  2. #2
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut ?
    perso je comprends pas tres bien ce que tu veux faire. Tu veux allouer un tableau de pointeur sur chaine de caractere c'est ça? Mais avec quelles chaines de caractères?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    Citation Envoyé par ambessa Voir le message
    Bonjour,

    j'essai d'allouer un tableau à 2D en connaissant la taille d'une seule dimension.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        int n=7,j=5;
     
        Aj=(char**) malloc (n*sizeof(char*));
     
        for(i=0;i<n;++i)
           Aj[i]=(char*) malloc (sizeof(char)*j);
     
     
    }
    Moi je vois que tu alloues un tableau de 7 lignes ayant chacune 5 colonnes.
    Me trompe peut être. Je pige pas bien ton but en fait. Le résultat que tu souhaites.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    j'ai toujours la dernière chaine dans tous mon tableau.
    C'est normal : tu écrases la valeur de l'adresse des chaînes allouées pour mettre celle de la chaîne temp :
    Tu dois copier la chaîne dans temp dans la chaîne d'adresse Aj[i] (strcpy)

    Il faut effectivement libérer les Aj[i]) avant Aj. Supprimer les commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       //for(i=0;i<n;++i)
         //  free(Aj[i]);
       free(Aj);
    Note : caster le retour de malloc est inutile. Par contre, tester le retour de malloc pour vérifier que l'allocation a réussi est impératif.

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Attention à la taille de ton tableau de char tmp il a une taille de 4.
    Tu y copie une chaine de 3 char + \0 ce qui fait 4 char
    Jusqu'a la ça va !

    Ensuite tu concane avec une autre chaine de 2 char
    Là ! c'est pas bon, tu écris en dehors de ton tableau !

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    Voici mon code corrigé :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
        char** Aj;
        char num[2];
        char toto[6]="Bon";
        char tmp[6];
        int i,nl=7,nc=5,k;
     
    	//allocation des lignes
        Aj=(char**) malloc (nl*sizeof(char*));
     
    	//test de l'allocation
    	if(Aj == NULL)return -1;
     
    	//allocation des colonnes
        for(i=0;i<nl;++i)
    	{
            Aj[i]=(char*) malloc (sizeof(char)*nc);
     
    		//test de l'allocation
    		if(Aj[i] == NULL)return -1;
    	}
     
    	//affectation d'une chaine de caractère sur chaque lignes 
        for(i=0;i<nc;i++)
    	{
            for(k=0;k<nl;++k)
            {
               strcpy(tmp,toto); //copie de la chaine "Bon" dans tmp
               itoa(i,num,10); //num contient un indice en base 10
               strcat(tmp,num); //concatenation "Bon" + le numero en base 10
    		   strcpy(Aj[i],tmp); //copie du contenu de tmp a la ligne i
    	   }
       } 
     
    	for(i=0;i<nc;++i)
            printf("valeur : %s\n",Aj[i]); //affichage de chaque ligne du tableau
     
    	//liberation
        for(i=0;i<nl;++i)
            free(Aj[i]);
        free(Aj);
     
        return 0;
    }
    Merci beaucoup pour votre aide.

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Autre chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            for(k=0;k<nl;++k)
            {
               strcpy(tmp,toto); //copie de la chaine "Bon" dans tmp
               itoa(i,num,10); //num contient un indice en base 10
               strcat(tmp,num); //concatenation "Bon" + le numero en base 10
    	   strcpy(Aj[i],tmp); //copie du contenu de tmp a la ligne i
    	}
    A quoi sert la boucle for k ?
    Tu fait nl fois la même chose ???

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    je veux ajouter à ma chaine un indice de sorte à avoir :

    Bon0
    Bon1
    Bon2
    ...

  9. #9
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Ça j'ai bien compris !
    mais tu ne te sert pas de k mais de i dans ton code.
    tu as une boucle for en trop.

  10. #10
    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 ambessa Voir le message
    j'essai d'allouer un tableau à 2D en connaissant la taille d'une seule dimension.

    et sur chaque ligne je met une chaine de caractère dont je ne connais pas la taille.
    C'est pas super clair. Ce que je comprends, c'est que tu veux créer un tableau dynamique de pointeurs sur chaines, c'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Entrer le nombre de chaine : 3
     
    Entrer la chaine 1 : hello
    Entrer la chaine 2 : wild
    Entrer la chaine 3 : world
    et ensuite, par exemple, on peut afficher

    c'est ça ?

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    oui, vous avez raison.

  12. #12
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    Non pas tout à fait je veux avoir le nombre collé à ma chaine.

  13. #13
    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 ambessa Voir le message
    Non pas tout à fait je veux avoir le nombre collé à ma chaine.
    Quel nombre ? Collé où ? avant, après ?

    Il faut être précis, sinon, on ne peut rien coder de juste. La programmation, c'est pas du hasard...

  14. #14
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Ce que je voulais te dire c'est que tu aurai pu remplacer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	//affectation d'une chaine de caractère sur chaque lignes 
      for(i=0;i<nc;i++)
    	{
          for(k=0;k<nl;++k)
            {
               strcpy(tmp,toto); //copie de la chaine "Bon" dans tmp
               itoa(i,num,10); //num contient un indice en base 10
               strcat(tmp,num); //concatenation "Bon" + le numero en base 10
    	   strcpy(Aj[i],tmp); //copie du contenu de tmp a la ligne i
           }
       }
    Par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	//affectation d'une chaine de caractère sur chaque lignes
        for(i=0;i<nl;i++)
            {
               strcpy(tmp,toto); //copie de la chaine "Bon" dans tmp
               itoa(i,num,10); //num contient un indice en base 10
               strcat(tmp,num); //concatenation "Bon" + le numero en base 10
    	   strcpy(Aj[i],tmp); //copie du contenu de tmp a la ligne i
            }

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    ok.
    mais est ce que cela me fais écrire sur chaque ligne?

  16. #16
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par ambessa
    mais est ce que cela me fais écrire sur chaque ligne?
    Ce sont les fonctions strcpy et strcat qui copie dans tes lignes.

    A moins que je n'ai pas bien compris ce que tu voulais faire !

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2007, 09h26
  2. Réponses: 2
    Dernier message: 14/12/2006, 15h34
  3. Allocation mémoire et tableau
    Par Cazman dans le forum C++
    Réponses: 7
    Dernier message: 07/07/2006, 15h36
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42

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