Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1627 connectés 

  FORUM HardWare.fr
  Programmation
  C

  PB Tableaux multidimensionnel - débutant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PB Tableaux multidimensionnel - débutant

n°1665792
yoyo2215
Posté le 04-01-2008 à 13:26:44  profilanswer
 

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. }

mood
Publicité
Posté le 04-01-2008 à 13:26:44  profilanswer
 

n°1665803
Joel F
Real men use unique_ptr
Posté le 04-01-2008 à 13:40:00  profilanswer
 

* 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

n°1665831
yoyo2215
Posté le 04-01-2008 à 14:11:59  profilanswer
 

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. }

n°1665843
capitainei​gloo
Posté le 04-01-2008 à 14:24:24  profilanswer
 

à quoi elle sert ta variable i ?

n°1665854
Joel F
Real men use unique_ptr
Posté le 04-01-2008 à 14:36:59  profilanswer
 

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

n°1666086
yoyo2215
Posté le 04-01-2008 à 20:02:50  profilanswer
 

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.     }

n°1666095
Joel F
Real men use unique_ptr
Posté le 04-01-2008 à 20:19:44  profilanswer
 

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

n°1666104
yoyo2215
Posté le 04-01-2008 à 20:36:09  profilanswer
 

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!

n°1666112
yoyo2215
Posté le 04-01-2008 à 20:57:39  profilanswer
 


 
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)

n°1666113
Joel F
Real men use unique_ptr
Posté le 04-01-2008 à 21:02:09  profilanswer
 

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

mood
Publicité
Posté le 04-01-2008 à 21:02:09  profilanswer
 

n°1666149
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-01-2008 à 22:15:46  profilanswer
 

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/
n°1666182
yoyo2215
Posté le 04-01-2008 à 22:59:06  profilanswer
 

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 ?

n°1666219
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-01-2008 à 23:36:25  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  PB Tableaux multidimensionnel - débutant

 

Sujets relatifs
Petit programme simple pour débutant VBAquestion de débutant que je suis
Conseil pour débutant: mise en place de galerie avec backoffice[ADA - débutant] Concaténer 2 listes
[Resolu] [Problème] [Perl,Tableaux] lire un fichier texte[debutant] Programme perso de mastermind, qu'en pensez-vous?
[Oracle - Débutant] Exporter le résultat d'une requête dans un fichierDébutant html - Insertion d'image & navigateurs
Algo de tri de tableauxhtml / php problème débutant
Plus de sujets relatifs à : PB Tableaux multidimensionnel - débutant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR