PB Tableaux multidimensionnel - débutant

PB Tableaux multidimensionnel - débutant - C - Programmation

Marsh Posté le 04-01-2008 à 13:26:44    

Bonjour,
Je débute en C et je voudrais créer un tableau à 2 dimensions.
Il doit comporter sur la première ligne des caractères et sur la deuxième des entiers.(J'ai transtypé les entiers en caractère).
 
J'ai plusieurs problèmes:  
- Le nombre de colonnes dépend d'une entrée au clavier, je ne peux pas le définir dès le début. Comment faut il faire ?J'ai tenté de réalisé une allocation dynamique de mon tableau mais je doute qu'elle soit exacte.
 
- J'ai transtypé les entiers en caractères à l'aide de la commande sprintf, mais il y a une erreur à la ligne 22.
 
- D'autre part, je n'arrive pas à accéder correctement aux cases de mon tableau ainsi créee pour le remplir.
 
 
Merci de votre aide.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4.      int i=0,j=0,k=0;
  5.      int nbPersonnes=0;
  6.      int var;
  7.      char chaine[100];
  8.      printf("Combien de personnes participent au voyage ?" );
  9.      scanf("%d",&nbPersonnes );
  10.      //Allocation dynamique
  11.      char *tab;
  12.      tab=(char*) malloc(2*nbPersonnes*sizeof(char));
  13.      for(k=1;k<=nbPersonnes;k++){
  14.         printf("\nEntrez le nom de la %d eme personne:",k);
  15.         scanf("%s",tab[i*nbPersonnes+j]); 
  16.         printf("\nEntrez le montant de ses depenses:" );
  17.         scanf("%d",& var);
  18.         sprintf(chaine,"%d",var);   
  19.         tab[(++i)*nbPersonnes+j]=chaine[];
  20.         i--;
  21.         j++;
  22.      }
  23.    return(0);
  24. }

Reply

Marsh Posté le 04-01-2008 à 13:26:44   

Reply

Marsh Posté le 04-01-2008 à 13:40:00    

* ton allcoation est correcte, sauf qu'on ne transtype pas le retour de malloc (à part durant le 18e siécle)
 
* scanf est à proscrire, préfére fgets+sscanf
 
* chaine[] ne veut rien dire, ce que tu cherche c'est strcpy

Reply

Marsh Posté le 04-01-2008 à 14:11:59    

Si je fais de cette manière, j'ai toujours une erreur à la ligne 22:  
 
 [Warning] passing arg 1 of `strcpy' makes pointer from integer without a cast "
 
Je déclare mal les cases de mon tableau mais je ne sais pas comment les déclarer correctement.
 

Code :
  1. Code :
  2.    1. #include <stdio.h>
  3.    2. #include <stdlib.h>
  4.    3.
  5.    4. int main(){
  6.    5.      int i=0,j=0,k=0;
  7.    6.      int nbPersonnes=0;
  8.    7.      int var;
  9.    8.      char chaine[100];
  10.    9.      printf("Combien de personnes participent au voyage ?" );
  11.   10.      scanf("%d",&nbPersonnes );
  12.   11.
  13.   12.      //Allocation dynamique
  14.   13.      char *tab;
  15.   14.      tab= malloc(2*nbPersonnes*sizeof(char));
  16.   15.
  17.   16.      for(k=1;k<=nbPersonnes;k++){
  18.   17.         printf("\nEntrez le nom de la %d eme personne:",k);
  19.   18.         scanf("%s",tab[i*nbPersonnes+j]);
  20.   19.         printf("\nEntrez le montant de ses depenses:" );
  21.   20.         scanf("%d",& var);
  22.   21.         sprintf(chaine,"%d",var); 
  23.   22.         strcpy(tab[(++i)*nbPersonnes+j],chaine);
  24.   23.         i--;
  25.   24.         j++;
  26.   25.      }
  27.   26.    return(0);
  28.   27. }

Reply

Marsh Posté le 04-01-2008 à 14:24:24    

à quoi elle sert ta variable i ?

Reply

Marsh Posté le 04-01-2008 à 14:36:59    

as tu vu le concept de structure ?
Typiquement ici, la bonne solution consiste à créer une structrue qui contient le nom (sous forme de char*) et la dépense (sosu forme d'un float par ex.)
 

Code :
  1. typedef struct depense
  2. {
  3.   char* nom;
  4.   float montant;
  5. } depense_t;


 
Ensuite tu te donnes un ensemble de fonction qui crée/détruit/remplis une structure de ce type
 

Code :
  1. void Depense_Creer( depense_t** ptr, const char* nom, float mnt )
  2. {
  3.   *ptr = malloc( sizeof(depense_t) );
  4.   (*ptr)->montant = mnt;
  5.   (*ptr)->nom = malloc( sizeof(char)*strlen(nom) );
  6.   strcpy((*ptr)->nom,nom);
  7. }
  8. void Depense_Detruire( depense_t** ptr )
  9. {
  10.   free( *ptr );
  11.   *ptr = NULL;
  12. }
  13. const char* Depense_GetNom( const depense_t* ptr )
  14. {
  15.   return ptr->nom;
  16. }
  17. float Depense_GetMontant( const depense_t* ptr )
  18. {
  19.   return ptr->montant;
  20. }
  21. void Depense_SetNom( depense_t* ptr, const char* nom )
  22. {
  23.   if(ptr->nom) free(ptr->nom);
  24.   ptr->nom = malloc( sizeof(char)*strlen(nom) );
  25.   strcpy(ptr->nom,nom);
  26. }
  27. void Depense_SetMontant( depense_t* ptr, float mnt )
  28. {
  29.   ptr->montant = mnt;
  30. }


 
Avec tout ça, il ne te reste qu'à créer un tableau dynamique de structure.
 

Code :
  1. depense_t *tab = malloc( sizeof(depense_t)*n);


 
et à le remplir simplement
 

Code :
  1. /* recupartion du nom et du montant avec fgets */
  2. ....
  3. Depense_Creer( &tab[i], nom, montant );


 
C'est de tête à chaud mais ca devrait te donner les bases

Reply

Marsh Posté le 04-01-2008 à 20:02:50    

Merci beaucoup, j'ai appliqué cette méthode à quelque détails près et ca fonctionne très bien !
 
Neanmoins, quelque chose me tracasse dans ma première ébauche.
J'ai appris qu'on allouait dynamiquement des tableaux de 2D de cette manière :
 
char *tab;
tab = malloc ( sizeof(*tab)  *  taille * taille2);
 
et qu'on accédait aux cases par tab[taille2*i1 + i2].
Donc si je fais ca, pourquoi je me retrouve avec une erreur au niveau de strcpy ?
 

Code :
  1. int main(){
  2.   int h=0;
  3.   int i=0,j=0;
  4.   int nbPersonnes=0;
  5.   int var=0;
  6.   char chaine[100];
  7.   char *tab;
  8.   printf("Combien de personnes participent ?" );
  9.   scanf("%d",&nbPersonnes );
  10.   tab= malloc(sizeof(*tab)*nbPersonnes*2);
  11.   for(h=1;h<=nbPersonnes;h++){
  12.     printf("\nEntrez le nom de la %d eme personne:",h);
  13.     scanf("%s",tab[i*nbPersonnes+j]); 
  14.     printf("\nEntrez le montant de ses depenses:" );
  15.     scanf("%d",& var);
  16.     sprintf(chaine,"%d",var);
  17.     strcpy(tab[(++i)*nbPersonnes+j],chaine);
  18.     i--;
  19.     j++;
  20.     }

Reply

Marsh Posté le 04-01-2008 à 20:19:44    

yoyo2215 a écrit :


J'ai appris qu'on allouait dynamiquement des tableaux de 2D de cette manière :


 
Tu as mal appris.
 
http://forum.hardware.fr/hfr/Progr [...] 0227_1.htm

Reply

Marsh Posté le 04-01-2008 à 20:36:09    

J'ai trouvé cette info sur http://c.developpez.com/faq/?page=tableaux  , une page de Developpez.com.... mais je vais regarder le lien que tu me donnes!

Reply

Marsh Posté le 04-01-2008 à 20:57:39    


 
J'ai alloué mon tableau de manière plus reglementaire :
 

Code :
  1. char **tab;
  2. /* Allocation de la 1er dimension */
  3. tab = malloc ( sizeof(*tab)  *  2);
  4. /* Allocation des tableaux */
  5. for (i=0; i<TAILLE; i++)
  6. {
  7.    tab[i] = malloc ( sizeof(**tab) * nbPersonnes);
  8. }


 
J'accède donc aux cases de ce tableau par tab[i][j].
Mais pourquoi je rencontre une erreur lorsque je souhaite copier la chaine de caractère(l'entier transtypé) dans mon tableau [i][j] ?
 
[Warning] passing arg 1 of `strcpy' makes pointer from integer without a cast  
 

Code :
  1. printf("\nEntrez le montant de ses depenses:" );
  2.  scanf("%d",& var);
  3.  sprintf(chaine,"%d",var);
  4.  strcpy(tab[i][j],chaine)

Reply

Marsh Posté le 04-01-2008 à 21:02:09    

yoyo2215 a écrit :


J'ai alloué mon tableau de manière plus reglementaire :


U = FAIL
 
Un tableau à N dimensions ne necessite que N malloc pas N*taille.
Ensuite ton tableau de char ne contien pas du tout ce que tu crois.  
tab[i][j] poitn vers un char pas un char*
 
Hors d ela soluce avec struct, tu t'exposes à du beau caca

Reply

Marsh Posté le 04-01-2008 à 21:02:09   

Reply

Marsh Posté le 04-01-2008 à 22:15:46    

yoyo2215 a écrit :

J'ai appris qu'on allouait dynamiquement des tableaux de 2D de cette manière :

Code :
  1. char *tab;
  2. tab = malloc ( sizeof(*tab)  *  taille * taille2);


et qu'on accédait aux cases par

tab[taille2*i1 + i2].




C'est une façon de faire, oui. Mais ici, on t'a proposé un tableau de structures, ce qui est beaucoup plus rationnel vu le projet.


Message édité par Emmanuel Delahaye le 04-01-2008 à 22:16:33

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-01-2008 à 22:59:06    

Oui je suis tout a fait d'accord, c'est plus cohérent et simple avec une structure.
 
Mais  quand même comment fait on pour copier une chaine de caractère  dans une case d'un tableau à deux dimensions en utilisant strcpy ?

Reply

Marsh Posté le 04-01-2008 à 23:36:25    

yoyo2215 a écrit :

Oui je suis tout a fait d'accord, c'est plus cohérent et simple avec une structure.
 
Mais  quand même comment fait on pour copier une chaine de caractère  dans une case d'un tableau à deux dimensions en utilisant strcpy ?


Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. static void aff(char p[][10], size_t n)
  4. {
  5.    size_t i;
  6.    for (i = 0; i < n;i++)
  7.    {
  8.       printf ("'%s'\n", p[i]);
  9.    }
  10.    printf ("\n" );
  11. }
  12. int main (void)
  13. {
  14.    char a[4][10] ={""};
  15.    aff(a, sizeof a/sizeof *a);
  16.    strcpy(a[1], "hello" );
  17.    aff(a, sizeof a/sizeof *a);
  18.    strcpy(a[2], "world" );
  19.    aff(a, sizeof a/sizeof *a);
  20.    return 0;
  21. }



''
''
''
''
 
''
'hello'
''
''
 
''
'hello'
'world'
''
 
 
Press ENTER to continue.



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed