tableau de chaine de caractère : enregistrement

tableau de chaine de caractère : enregistrement - C - Programmation

Marsh Posté le 11-03-2012 à 01:05:45    

Bonjour,
 
j'ai un petit problème en C : je voudrais faire un tableau de chaine de caractères : pas un simple tableau de char qui contiendrait pour chaque rang, 1 seul caractère, mais qui contiendrait pour chaque rang une chaine particulière entière de caractère.
 
j'ai voulu définir une structure qui contiendrait un type définit lui même par une chaine de char, pour pouvoir faire ce tableau mais ça ne marche pas :(
le voici :  
 

Code :
  1. typedef
  2. struct
  3. {
  4.     char mot[26];
  5. }
  6. bdd;
  7. typedef
  8. struct
  9. {
  10.     bdd tab[10];
  11. }
  12. liste;


 
si quelqu'un aurait une solution ça serait cool :)
 
merci d'avance.

Reply

Marsh Posté le 11-03-2012 à 01:05:45   

Reply

Marsh Posté le 11-03-2012 à 14:24:19    

Tableau à deux dimensions / pointeurs sur pointeurs
 
char liste_mot[16][256]; te donnera un tableau de 16 chaines de caractères pouvant toutes contenir 256 lettres max, mais je te recommande plutôt les double pointeurs avec malloc (bien que ça dépend de ce que tu veux faire)


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 11-03-2012 à 15:21:01    

je ne connais pas suffisamment le C pour comprendre ça :s
je sais ( a peu près ) ce qu'est les pointeurs, mais pointeurs sur pointeurs je comprends pas trop :s  
 
en gros je peux marquer :  
 

Code :
  1. mot[1][]="bonjour";
  2. mot[2][]="bonsoir";
  3. etc...


 
 
en déclarant juste un truc du genre :

Code :
  1. char mot[const1][const2]; ?


Message édité par Benh_31 le 11-03-2012 à 15:24:07
Reply

Marsh Posté le 11-03-2012 à 16:09:01    

Citation :

je ne connais pas suffisamment le C pour comprendre ça :s

Ben c'est le moment de t'y mettre, parce que la programmation vaudou, on n'en est pas fana sur ce forum.

Citation :

mot[1][]="bonjour";

C'est pas possible en C!
Il va te falloir utiliser une fonction comme strcpy.
A+,


Message édité par gilou le 11-03-2012 à 16:09:29

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-03-2012 à 16:30:02    

je suis qu'en première année d'IUT informatique.. je peux pas aller plus vite que le programme...
 
enfin bon merci j'ai réussi à faire ce que je voulais
 
edit : j'ai un nouveau problème qui concerne toujours ce fameux tableau : je voudrais le faire passer en paramètre d'une fonction... mais je ne sais pas comment on passe les tableaux à deux dimensions...

Message cité 1 fois
Message édité par Benh_31 le 11-03-2012 à 18:05:09
Reply

Marsh Posté le 11-03-2012 à 19:00:16    

Tu dois préciser la taille de la hauteur :
 
void unefonction( int [14] [] untableau){}


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 12-03-2012 à 02:43:07    

merci :) j’essayerai demain

Reply

Marsh Posté le 12-03-2012 à 08:31:27    

Benh_31 a écrit :

je suis qu'en première année d'IUT informatique.. je peux pas aller plus vite que le programme...
 
enfin bon merci j'ai réussi à faire ce que je voulais
 
edit : j'ai un nouveau problème qui concerne toujours ce fameux tableau : je voudrais le faire passer en paramètre d'une fonction... mais je ne sais pas comment on passe les tableaux à deux dimensions...


 
Un tableau à deux dimensions, c'est ça:
 
char **tableau_2_dim_dynamique; // qu'il faut allouer avec plusieurs malloc
 
ou ça
 
char tableau_2_dim_fige[10][20]; // 10 chaines de 19 caractères+1 zéro terminateur
 
pour envoyer ce tableau, le plus simple est d'envoyer le pointeur directement
 

Code :
  1. void ma_fonction(char **tableau, int nb_elements)
  2. {
  3. int i;
  4. for (i=0;i<nb_elements;i++) printf("%s",tableau[i]);
  5. }
  6. void main()
  7. {
  8. char tableau_2_dim_fige[10][20];
  9. /* insertion des chaines*/
  10. ma_fonction(tableau_2_dim_fige);
  11. }


Message édité par edwoud le 12-03-2012 à 08:33:33
Reply

Marsh Posté le 12-03-2012 à 11:20:42    

Code :
  1. ma_fonction(tableau_2_dim_fige);


 
tu n'aurais pas oublié le nombre d'élément edwoud ?
 
moi j'ai fais comme toi mais mon compilateur me trouve un warning et quand j’exécute, ça plante
 
warning : passing arg 1 of 'ma_fonction' from incompatible pointer type
 
:(

Reply

Marsh Posté le 12-03-2012 à 11:27:06    

Benh_31 a écrit :

Code :
  1. ma_fonction(tableau_2_dim_fige);


 
tu n'aurais pas oublié le nombre d'élément edwoud ?
 
moi j'ai fais comme toi mais mon compilateur me trouve un warning et quand j’exécute, ça plante
 
warning : passing arg 1 of 'ma_fonction' from incompatible pointer type
 
:(


 
oui, tout à fait :)
 

Code :
  1. ma_fonction(tableau_2_dim_fige,10);


 
Tu pourrais aussi laisser la dernière chaine vide (ou pointeur NULL dans le cas dynamique)
 
Et boucler tant que le pointeur n'est pas NULL ou que la chaine n'est pas vide. Ainsi, pas besoin de donner le nombre d'éléments.

Reply

Marsh Posté le 12-03-2012 à 11:27:06   

Reply

Marsh Posté le 12-03-2012 à 11:46:13    

oui mais je vais me contenter de faire passer le nombre d’éléments en paramètre ^^, c'est plus le passage du tableaux qui me pose problème :/
 
j'ai déclaré mon tableaux comme ça :  
 

Code :
  1. char montab[5]30];


 
et j'ai déclaré ma fonction comme ça :
 

Code :
  1. int bigword(char ** ptrouve,int i)


 
et quand j'appelle ma fonction je mets simplement :  
 

Code :
  1. int bigword(montab,i);


 
mais ça marche pas :/ mon warning persiste

Message cité 1 fois
Message édité par Benh_31 le 12-03-2012 à 11:49:21
Reply

Marsh Posté le 12-03-2012 à 13:36:37    

Benh_31 a écrit :

oui mais je vais me contenter de faire passer le nombre d’éléments en paramètre ^^, c'est plus le passage du tableaux qui me pose problème :/
 
j'ai déclaré mon tableaux comme ça :  
 

Code :
  1. char montab[5]30];


 
et j'ai déclaré ma fonction comme ça :
 

Code :
  1. int bigword(char ** ptrouve,int i)


 
et quand j'appelle ma fonction je mets simplement :  
 

Code :
  1. int bigword(montab,i);


 
mais ça marche pas :/ mon warning persiste


 
Tu as écrit pour l'appel

Code :
  1. bigword(montab,i);

ou bien

Code :
  1. int bigword(montab,i);

? (le "int" est de trop)
 
Tu devrais même écrire: code_retour=bigword(montab,i); si ta fonction retourne vraiment quelque chose


Message édité par edwoud le 12-03-2012 à 13:37:34
Reply

Marsh Posté le 12-03-2012 à 15:52:46    

oula désolé j'ai un peu mélangé mon code et ce que je voulais marquer : montab = ptrouve
 
et oui pardon a l'appel je mets pas le int


Message édité par Benh_31 le 12-03-2012 à 15:53:48
Reply

Marsh Posté le 12-03-2012 à 16:02:57    

Et c'est quoi ton warning exactement?

Reply

Marsh Posté le 12-03-2012 à 16:53:02    

ben ça :  
 
warning : passing arg 1 of 'ma_fonction' from incompatible pointer type

Reply

Marsh Posté le 12-03-2012 à 18:42:17    

Ah ouais, j'pensais que ça marcherait (comme j't'avais dit, je ne fais jamais de tableaux claqués en dur, c'est pas beau)
 
 
Tu veux pas le faire avec des allocations dynamiques? :D

Reply

Marsh Posté le 12-03-2012 à 20:22:48    

edwoud a écrit :

Ah ouais, j'pensais que ça marcherait (comme j't'avais dit, je ne fais jamais de tableaux claqués en dur, c'est pas beau)
 
 
Tu veux pas le faire avec des allocations dynamiques? :D


 
 
ben moi je suis ouvert à toutes propositions ^^ du moment que ça me fasse pas tout modifier mon code et que ça ne soit pas trop compliqué parce que je l'ai pas encore vu

Reply

Marsh Posté le 12-03-2012 à 20:59:08    

Tu connais déjà les pointeurs ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 12-03-2012 à 21:01:56    

moui plus ou moins, je sais que c'est l'adresse mémoire de la variable

Reply

Marsh Posté le 13-03-2012 à 00:57:55    

Nan, un pointeur c'est une variable qui contient une adresse, et c'est aussi utilisé comme tableau, du coups un pointeur sur pointeur c'est un tableau à deux dimensions, zieute des cours sur internet tu devrais y trouver ton bonheur ;)


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 13-03-2012 à 12:01:36    

Terminapor a écrit :

Nan, un pointeur c'est une variable qui contient une adresse, et c'est aussi utilisé comme tableau, du coups un pointeur sur pointeur c'est un tableau à deux dimensions, zieute des cours sur internet tu devrais y trouver ton bonheur ;)

Non!
Un pointeur ce n'est pas un tableau!
Un tableau en C, c'est une variable associée à zone mémoire allouée, et des mécanismes d'accès qui utilisent éventuellement la même syntaxe que celle des pointeurs (ie si tab est un tableau, tab + i pointe sur la zone mémoire associée a la  i-eme case de tab, tab[i]).
Un pointeur en C, c'est une variable qui contient une adresse. A priori, on ne sait rien du tout sur l'allocation mémoire de ce sur quoi pointe un pointeur [ie la zone mémoire qui a pour adresse la valeur du pointeur]. Peut être que ça pointe sur quelque chose d'alloué (une variable, qui peut être un tableau), peut être qu'on a alloué dynamiquement avec un malloc, ou peut être que ça pointe sur un truc pas alloué (en attente d'un malloc) ou plus alloué (après un free).
 
A+,


Message édité par gilou le 13-03-2012 à 12:07:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2012 à 00:33:38    

Oui mais je dis que c'est un tableau dans le sens où on peut manipuler comme un tableau, et que je pense que ça sera plus facile à manipuler qu'un vrai tableau en 2D :spamafote:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 14-03-2012 à 02:18:38    

Vu que c'est quelqu'un qui connait pas bien le C, il vaut mieux éviter de lui rendre les choses confuses avec des assertions pas tout à fait justes.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2012 à 14:34:26    

mais mon tableau à deux dimensions, lors de ma déclaration de fonction, il faut pas que je le le pense en tant que simple char * et non plus char ** ?

Reply

Marsh Posté le 14-03-2012 à 14:43:09    

Non, non, c'est correct.
Mais il faut juste que tu te rappelles que c'est pas ton tableau que tu passes, mais son adresse, et que c'est pour ça que tu utilises les pointeurs.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2012 à 15:15:59    

mais comment je fais pour "restituer" sa valeur de tableau à mon pointeur ?

Reply

Marsh Posté le 14-03-2012 à 15:20:55    

Tu ne restitues pas, mais tu peux accéder au contenu de ton tableau, ce qui est en général la seule chose utile pour une fonction ou tu le passes par adresse.
 
Fais voir un peu ton code (l'ensemble et pas juste un bout insuffisant pour déterminer le pb, comme ce qui précède) si tu as toujours des pbs avec ton passage par adresse, qu'on diagnostique exactement ce qui se passe.
 
A+,


Message édité par gilou le 14-03-2012 à 15:24:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2012 à 17:48:00    

Alors voila mon code, soyez indulgent il doit surement être sale mais j'ai fais du mieux que j'ai pu,
j'ai essayer de faire un espèce de pendu, où chaque mot trouvé, est un indice pour découvrir un nouveau mot par association des autre,
c'est à dire, avec les mot ballon, stade, zidane, on doit trouvé football par exemple.
 
mon .h qui contient la déclaration de mes fonctions :  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int hung(char * pmot);    //pendu
  5. int freemod();  // jeux libre : pendu traditionnel
  6. int challenge();        //  fonction permettant de trouver les indices.
  7. int bigword(char ** ptrouve,int pi);        // fonction permettant de trouver le "super" mot
  8. void pendu(int pchance);        // fonction permettant d'afficher les dessin du pendu


 
l'appel de ma fonction "bigword" se trouve dans la sous fonction "challenge", le main n'est pas vraiment important c'est juste un menu, je vous le mets quand même :
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "fonction.h"
  4. #define kmax 26
  5. int main()
  6. {
  7.     int choix;
  8.     printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  9.     printf("\nThe goal is to discover five words like in the famous hang game." );
  10.     printf("\nThe five words give you clues. Then, when you have found all of the words,\nyou have to discover a new word which matches with the previous words\n\n\n" );
  11.     system("pause" );
  12.     system("cls" );
  13.     while(choix!=3)
  14.     {
  15.             printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  16.     printf("\nthere are 2 mods :\n\n1) Challenge mod\n2) Free Mod\n3) Exit\n\n" );
  17.     scanf("%d",&choix);
  18.     switch(choix)
  19.     {
  20.         case 1:
  21.             system("cls" );
  22.             challenge();
  23.             break;
  24.         case 2:
  25.             system("cls" );
  26.             freemod();
  27.             printf("\n" );
  28.             break;
  29.         case 3:
  30.             system("cls" );
  31.             exit(1);
  32.             break;
  33.         default :
  34.         printf("\nError, you can choose only 1) for Challenge mod, 2) for Free mod and 3) to quit" );
  35.         scanf("%d",&choix);
  36.         break;
  37.     }
  38.     system("pause" );
  39.     system("cls" );
  40.     }
  41.     system("pause" );
  42.     return 0;
  43. }


 
 
 
puis mes fonction : seule challenge et bigword sont importantes :
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "fonction.h"
  5. #define kmax 26
  6. int hung(char * pmot)
  7. {
  8.       system("cls" );
  9.       printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  10.       int i;
  11.       int nb;   // nombre de caractères du mot
  12.       char tabRep[kmax];    // tableau contenant les caractères trouvés par le joueur
  13.       int chance=11;    // nombre de chance restante
  14.       char lettre;  // lettre saisie par le joueur
  15.       int ok=1; // 0 si mot trouvé 1 sinon
  16.       int rep=1; //0 si gagné 1 sinon
  17.       int win=2;
  18.       // détermination du nombre de caractère du mot et initialisation du tableau avec le caractère "_"
  19.       i=0;
  20.       nb=0;
  21.       while(pmot[i]!='\0')
  22.       {
  23.             nb++;
  24.             tabRep[i]='_';
  25.             i++;
  26.       }
  27.       //atribution premiere et dernière lettre du mot a trouver
  28.       tabRep[0]=pmot[0];
  29.       tabRep[nb-1]=pmot[nb-1];
  30.       tabRep[nb]='\0';
  31.       //affichage du mot en cour de "recherche"
  32.       for(i=0;i<nb;i++)
  33.       {
  34.           printf("%c ",tabRep[i]);
  35.       }
  36.       while((chance!=0)&&(rep==1))
  37.       {
  38.           ok=1;
  39.           printf("\n\n\nenter a letter : \n\n" );
  40.           pendu(chance+1);
  41.           fflush(stdin);
  42.           scanf("%c",&lettre);
  43.           // si la lettre saisie est la bonne, on la met dans le tableau tabRep au bon rang, sinon une chance en moins jusqu'a 0 chance
  44.           for(i=0;i<nb;i++)
  45.           {
  46.               if(pmot[i]==lettre)
  47.               {
  48.                   tabRep[i]=pmot[i];
  49.                   ok=0;
  50.               }
  51.           }
  52.           if(ok==1)
  53.           {
  54.               system("cls" );
  55.               printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  56.               for(i=0;i<nb;i++)
  57.               {
  58.                     printf("%c ",tabRep[i]);
  59.               }
  60.               chance--;
  61.               printf("\n\n\nerror, this letter isn't in the word, you no longer than %d trials\n\n",chance);
  62.               pendu(chance+1);
  63.               system("pause" );
  64.           }
  65.           for(i=1;i<nb-1;i++)
  66.           {
  67.               if(tabRep[i]==pmot[i])
  68.               {
  69.                   rep=0;
  70.               }
  71.               else
  72.               {
  73.                   rep=1;
  74.                   i=nb+1;
  75.               }
  76.           }
  77.           system("cls" );
  78.           printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  79.           // affichage du mot
  80.           for(i=0;i<nb;i++)
  81.           {
  82.               printf("%c ",tabRep[i]);
  83.           }
  84.       }
  85.       system("cls" );
  86.       if(rep==0)
  87.       {
  88.           printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  89.           printf("\n\nvictory !!! you win the level\n\n\n" );
  90.           for(i=0;i<nb;i++)
  91.           {
  92.               printf("%c",tabRep[i]);
  93.           }
  94.           printf("\n\n\n" );
  95.           win=0;
  96.       }
  97.       else
  98.       {
  99.           printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  100.           printf("\n\nsorry you lost the word was : \n\n" );
  101.           win=1;
  102.           for(i=0;i<nb;i++)
  103.           {
  104.               printf("%c",pmot[i]);
  105.           }
  106.           printf("\n\n\n" );
  107.           pendu(chance+1);
  108.       }
  109. return win;
  110. }
  111. int challenge()
  112. {
  113.     int courant;
  114.     int choix;
  115.     int cpt=0;  // numéro du mot actuel
  116.     int i=0;
  117.     char mot[5][30];
  118.     char trouve[5][30];
  119.     // initialisation des mot a trouvé : je m'occuperai plus tard de rentrer d'autre cas.
  120.     strcpy(mot[0],"island" );
  121.     strcpy(mot[1],"surf" );
  122.     strcpy(mot[2],"oceania" );
  123.     strcpy(mot[3],"sidney" );
  124.     strcpy(mot[4],"kangaroo" );
  125.     // tant qu'on a pas trouvé tous les 5 mots : appellé la fonction hung selon le choix de l'utilisateur via le menu
  126.     while(cpt<5)
  127.     {
  128.             system("cls" );
  129.             printf("\n\n                   Hung Man 3000\n\n" );
  130.     printf("\n\n\n\n\ndiscovered the word number %d : \n\n",cpt+1);
  131.     system("pause" );
  132.     system("cls" );
  133.     printf("\n\n                   Hung Man 3000\n\n" );
  134.     courant=hung(mot[cpt]);
  135.     // si le mot courant a été trouvé, on copie le mot courant dans le tableau ( fameux tableau à deux dimensions )
  136.     if(courant==0)
  137.     {
  138.         strcpy(trouve[i],mot[cpt]);
  139.         i++;
  140.     }
  141.     cpt++;
  142.     printf("\n1) Continue with a new clue\n2) Try to guess the word\n3) Go to the main menu \n" );
  143.     scanf("%d",&choix);
  144.         switch(choix)
  145.         {
  146.             case 1:
  147.                 break;
  148.                 system("cls" );
  149.             case 2:
  150.                 // appel de ma fonction bigword qui pose problème
  151.                 bigword(trouve,i);
  152.                 break;
  153.             case 3:
  154.                 return 0;
  155.                 break;
  156.             default:
  157.                 printf("\nError, enter again : " );
  158.                 printf("\n1) Continue with a new clue\n2) Try to guess the word\n 3) Go to the main menu\n" );
  159.                 scanf("%d",&choix);
  160.                 system("cls" );
  161.                 break;
  162.             }
  163.         }
  164. return 0;
  165. }
  166. void pendu(int pchance)
  167. {
  168.     switch(pchance)
  169.     {
  170.         case 11:
  171.         printf("\n      \n           \n           \n            \n             \n      \n   ______\n\n" );
  172.         break;
  173.         case 10:
  174.         printf("\n      \n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  175.         break;
  176.         case 9:
  177.         printf("\n      ________\n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  178.         break;
  179.         case 8:
  180.         printf("\n      ________\n      |  /     \n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  181.         break;
  182.         case 7:
  183.         printf("\n      ________\n      |  /   |\n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  184.         break;
  185.         case 6:
  186.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      \n      |       \n      |\n   ___|___\n\n" );
  187.         break;
  188.         case 5:
  189.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      | \n      |       \n      |\n   ___|___\n\n" );
  190.         break;
  191.         case 4:
  192.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /| \n      |       \n      |\n   ___|___\n\n" );
  193.         break;
  194.         case 3:
  195.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |       \n      |\n   ___|___\n\n" );
  196.         break;
  197.         case 2:
  198.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     /  \n      |\n   ___|___\n\n" );
  199.         break;
  200.         case 1:
  201.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     / \\ \n      |\n   ___|___\n\n\n" );
  202.         break;
  203.     }
  204. }
  205. int freemod()
  206. {
  207.     char mot[kmax];
  208.     system("cls" );
  209.     printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  210.     printf("\n\n player 1 : enter a word : " );
  211.     scanf("%s",mot);
  212.     system("cls" );
  213.     hung(mot);
  214.     return 0;
  215. }
  216. int bigword(char ** ptrouve,int pi)
  217. {
  218.     //indice
  219.     int i;
  220.     int n;
  221.     system("cls" );
  222.     printf("\n\n                   Hung Man 3000\n\n\n\n\n" );
  223.     printf("\nyou discovered these words : \n\n" );
  224.     // affichage des mots trouvés
  225.     for(i=0;i<=pi;i++)
  226.     {
  227.         n=0;
  228.         while(ptrouve[i][n]!='\0')
  229.         {
  230.             printf("%c",ptrouve[i][n]);
  231.             n++;
  232.         }
  233.         printf("\n" );
  234.     }
  235. system("pause" );
  236.     return 0;
  237. }

Reply

Marsh Posté le 14-03-2012 à 18:28:43    

Ton message est juste un warning:
Tu déclares  
int bigword(char ** ptrouve,int pi);    
Mais à l'appel bigword(trouve,i); le compilo voit que le premier paramètre comme char *ptrouve[30] et il signale qu'il voit une différence avec le type déclaré (pas grave ici, car compatible)
Il suffit juste de caster à l'appel:
bigword((char **)trouve,i);
et le problème sera réglé
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2012 à 18:33:32    

gilou a écrit :

Ton message est juste un warning:
Tu déclares  
int bigword(char ** ptrouve,int pi);    
Mais à l'appel bigword(trouve,i); le compilo voit que le premier paramètre comme char *ptrouve[30] et il signale qu'il voit une différence avec le type déclaré (pas grave ici, car compatible)
Il suffit juste de caster à l'appel:
bigword((char **)trouve,i);
et le problème sera réglé
A+,


 
 
trop fort :) merci beaucoup, mon warning est réglé, mais ça bug toujours.
 
une fois que j'ai réussi a récupéré mon pointer, comment je fais pour afficher les chaines de caractères pour chaque ran de i ?
 
j'ai fais ça :

Code :
  1. for(i=0;i<=pi;i++)
  2.     {
  3.         printf("\n%s",ptrouve[i]);
  4.         printf("\n" );
  5.     }


mais ça marche pa, ni ça :

Code :
  1. for(i=0;i<=pi;i++)
  2.     {
  3.         n=0;
  4.         while(ptrouve[i][n]!='\0')
  5.         {
  6.             printf("%c",ptrouve[i][n]);
  7.             n++;
  8.         }
  9.         printf("\n" );
  10.     }


Message édité par Benh_31 le 14-03-2012 à 18:39:24
Reply

Marsh Posté le 14-03-2012 à 21:34:25    

Citation :

i=0; i<=pi

C'est toujours douteux, ça en C
Ce serait pas par hasard
i=0; i < pi
?
Et ceci est la bonne méthode en effet:
printf("\n%s",ptrouve[i])
 
Il marche pas ton code?
J'avais fait un essai avec island et ça avait l'air fonctionnel.
 
A+,

Message cité 1 fois
Message édité par gilou le 14-03-2012 à 21:35:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2012 à 00:11:35    

gilou a écrit :

Citation :

i=0; i<=pi

C'est toujours douteux, ça en C
Ce serait pas par hasard
i=0; i < pi
?
Et ceci est la bonne méthode en effet:
printf("\n%s",ptrouve[i])
 
Il marche pas ton code?
J'avais fait un essai avec island et ça avait l'air fonctionnel.
 
A+,


 
non ça ne marche pas :/

Reply

Marsh Posté le 15-03-2012 à 02:23:23    

Ah oui, désolé, j'avais pas les yeux en face des trous.
J'étais resté sur le cas habituel d'une déclaration comme:

Code :
  1. char *mot[]= { "island",
  2.       "surf",
  3.       "oceania" ,
  4.       "sidney" ,
  5.       "kangaroo" };


auquel cas le code donné marche.
 
Mais si tu as un tableau de taille constante, alors ça ne marche pas ainsi.
C'est en fait nettement plus simple:
Tu peux faire:
1) une déclaration
int bigword(char ptrouve[5][30], int pi);  
2) un appel
bigword(trouve,i);
3) un corps de fonction ou tu utilises ptrouve comme le tableau qu'il est
 
le tableau, est passé par adresse et non pas par copie, comme le petit programme exemple suivant te montre:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void printall(char p[5][30]) {
  5.     int k;
  6.     // impression du tableau
  7.     for (k = 0; k < 5; k++) {
  8.         printf("%s\n", p[k]);
  9.     }
  10.     // modif d'un élément
  11.     strcpy(p[1],"test" );
  12.     for (k = 0; k < 5; k++) {
  13.         printf("%s\n", p[k]);
  14.     }
  15.    
  16. }
  17. int main (int argc, char *argv[]) {
  18.     char mot[5][30];
  19.     int k;
  20.     strcpy(mot[0],"island" );
  21.     strcpy(mot[1],"surf" );
  22.     strcpy(mot[2],"oceania" );
  23.     strcpy(mot[3],"sidney" );
  24.     strcpy(mot[4],"kangaroo" );
  25.     printall(mot);
  26.     // vérification que printall a modifié le tableau durant l'appel
  27.     for (k = 0; k < 5; k++) {
  28.         printf("%s\n", mot[k]);
  29.     }
  30.     return 0;
  31. }


 
Notes qu'on peut avoir le paramètre intérieur non précisé, et donné par une variable:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void printall(char p[][30], int i) {
  5.     int k;
  6.     for (k = 0; k < i; k++) {
  7.         printf("%s\n", p[k]);
  8.     }
  9. }
  10. int main (int argc, char *argv[]) {
  11.     char mot[5][30];
  12.     strcpy(mot[0],"island" );
  13.     strcpy(mot[1],"surf" );
  14.     strcpy(mot[2],"oceania" );
  15.     strcpy(mot[3],"sidney" );
  16.     strcpy(mot[4],"kangaroo" );
  17.     printall(mot, 5);
  18.     return 0;
  19. }


C'est plus souple et souvent plus simple.
 
Une pratique encore plus standard serait d'agir ainsi:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define SIZE_MOT 30
  5. typedef char mot[SIZE_MOT];
  6. void printall(mot p[], int i) {  // ou équivalent void printall(mot *p, int i)
  7.     int k;
  8.     for (k = 0; k < i; k++) {
  9.         printf("%s\n", p[k]);
  10.     }
  11. }
  12. int main (int argc, char *argv[]) {
  13.     mot tabmot[5];
  14.     strcpy(tabmot[0],"island" );
  15.     strcpy(tabmot[1],"surf" );
  16.     strcpy(tabmot[2],"oceania" );
  17.     strcpy(tabmot[3],"sidney" );
  18.     strcpy(tabmot[4],"kangaroo" );
  19.     printall(tabmot, 5);
  20.     return 0;
  21. }

C'est a dire de redéfinir ton tableau double comme un tableau simple pour un nouveau type de donnée que tu définir avec un typedef.
L'avantage est que le sens du premier paramètre, mot p[] est alors clair: p est un tableau de mot.
Bref, si tu as pas un vrai tableau 2D de données homogènes (comme le serait une image avec ses pixels), il y a aucune raison de rester en 2D.
 
A+,


Message édité par gilou le 15-03-2012 à 02:37:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2012 à 11:20:02    

ben oui justement, au début j'avais définit une structure, mais ça marché pas ( premier post ^^ ) :

Code :
  1. typedef
  2.     struct
  3.     {
  4.         char mot[26];
  5.     }
  6.     bdd;
  7.     typedef
  8.     struct
  9.     {
  10.         bdd tab[10];
  11.     }
  12.     liste;


 
mais mon problème et je suis sur qu'il vient de la c'est cette instruction :  

Code :
  1. printf("\n%s",ptrouve[i]);


 


Message édité par Benh_31 le 15-03-2012 à 11:37:08
Reply

Marsh Posté le 15-03-2012 à 12:35:23    

&ptrouve[i], non ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 15-03-2012 à 13:22:21    

Mais tu as pas besoin de structs ici:
C'est complètement inutile (et ça va surement foutre le boxon, puisqu'un pointeur risque d'être interprété comme un pointeur sur un tableau de struct et non pas sur le tableau interne à la struct)
 
Il suffisait de faire  
typedef char mot[26];
typedef mot tab[10];
 
A+,


Message édité par gilou le 15-03-2012 à 13:25:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2012 à 13:28:07    

Bon sinon, pour ton pendu, ceci est nettement plus lisible

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // 12 dessins en comptant le premier vide
  5. // 10 lignes de 18 signes et un \0 en fin de ligne -> 181 chars
  6. static char pendu_state[12][181] = {
  7. //
  8.     "                 \n"
  9.     "                 \n"
  10.     "                 \n"
  11.     "                 \n"
  12.     "                 \n"
  13.     "                 \n"
  14.     "                 \n"
  15.     "                 \n"
  16.     "                 \n"
  17.     "                 \n",
  18. //
  19.     "                 \n"
  20.     "                 \n"
  21.     "                 \n"
  22.     "                 \n"
  23.     "                 \n"
  24.     "                 \n"
  25.     "                 \n"
  26.     "   _______       \n"
  27.     "                 \n"
  28.     "                 \n",
  29. //
  30.     "                 \n"
  31.     "                 \n"
  32.     "      |          \n"
  33.     "      |          \n"
  34.     "      |          \n"
  35.     "      |          \n"
  36.     "      |          \n"
  37.     "   ___|___       \n"
  38.     "                 \n"
  39.     "                 \n",
  40. //
  41.     "                 \n"
  42.     "      _________  \n"
  43.     "      |          \n"
  44.     "      |          \n"
  45.     "      |          \n"
  46.     "      |          \n"
  47.     "      |          \n"
  48.     "   ___|___       \n"
  49.     "                 \n"
  50.     "                 \n",
  51. //
  52.     "                 \n"
  53.     "      _________  \n"
  54.     "      | /        \n"
  55.     "      |/         \n"
  56.     "      |          \n"
  57.     "      |          \n"
  58.     "      |          \n"
  59.     "   ___|___       \n"
  60.     "                 \n"
  61.     "                 \n",
  62. //
  63.     "                 \n"
  64.     "      _________  \n"
  65.     "      | /    |   \n"
  66.     "      |/         \n"
  67.     "      |          \n"
  68.     "      |          \n"
  69.     "      |          \n"
  70.     "   ___|___       \n"
  71.     "                 \n"
  72.     "                 \n",
  73. //
  74.     "                 \n"
  75.     "      _________  \n"
  76.     "      | /    |   \n"
  77.     "      |/     o   \n"
  78.     "      |          \n"
  79.     "      |          \n"
  80.     "      |          \n"
  81.     "   ___|___       \n"
  82.     "                 \n"
  83.     "                 \n",
  84. //
  85.     "                 \n"
  86.     "      _________  \n"
  87.     "      | /    |   \n"
  88.     "      |/     o   \n"
  89.     "      |      |   \n"
  90.     "      |          \n"
  91.     "      |          \n"
  92.     "   ___|___       \n"
  93.     "                 \n"
  94.     "                 \n",
  95. //
  96.     "                 \n"
  97.     "      _________  \n"
  98.     "      | /    |   \n"
  99.     "      |/     o   \n"
  100.     "      |     /|   \n"
  101.     "      |          \n"
  102.     "      |          \n"
  103.     "   ___|___       \n"
  104.     "                 \n"
  105.     "                 \n",
  106. //
  107.     "                 \n"
  108.     "      _________  \n"
  109.     "      | /    |   \n"
  110.     "      |/     o   \n"
  111.     "      |     /|\\  \n"
  112.     "      |          \n"
  113.     "      |          \n"
  114.     "   ___|___       \n"
  115.     "                 \n"
  116.     "                 \n",
  117. //
  118.     "                 \n"
  119.     "      _________  \n"
  120.     "      | /    |   \n"
  121.     "      |/     o   \n"
  122.     "      |     /|\\  \n"
  123.     "      |     /    \n"
  124.     "      |          \n"
  125.     "   ___|___       \n"
  126.     "                 \n"
  127.     "                 \n",
  128. //
  129.     "                 \n"
  130.     "      _________  \n"
  131.     "      | /    |   \n"
  132.     "      |/     o   \n"
  133.     "      |     /|\\  \n"
  134.     "      |     / \\  \n"
  135.     "      |          \n"
  136.     "   ___|___       \n"
  137.     "                 \n"
  138.     "                 \n",
  139. };
  140. // Test
  141. int main (int argc, char *argv[]) {
  142.     int choix;
  143.     while (1) {
  144.         scanf("%d", &choix);
  145.         switch (choix) {
  146.         case 11:
  147.         case 10:
  148.         case  9:
  149.         case  8:
  150.         case  7:
  151.         case  6:
  152.         case  5:
  153.         case  4:
  154.         case  3:
  155.         case  2:
  156.         case  1:
  157.             printf("%s", pendu_state[choix]);
  158.             break;
  159.         case 0:
  160.             exit(0);
  161.             break;
  162.         default:
  163.             printf("\n" );
  164.             break;
  165.         }
  166.     }
  167.     return 0;
  168. }


 
qu'un truc comme ceci (équivalent, mais clair comme du jus de moule par une nuit sans lune)
 

Code :
  1. void pendu(int pchance)
  2. {
  3.     switch(pchance)
  4.     {
  5.         case 11:
  6.         printf("\n      \n           \n           \n            \n             \n      \n   ______\n\n" );
  7.         break;
  8.         case 10:
  9.         printf("\n      \n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  10.         break;
  11.         case 9:
  12.         printf("\n      ________\n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  13.         break;
  14.         case 8:
  15.         printf("\n      ________\n      |  /     \n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  16.         break;
  17.         case 7:
  18.         printf("\n      ________\n      |  /   |\n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  19.         break;
  20.         case 6:
  21.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      \n      |       \n      |\n   ___|___\n\n" );
  22.         break;
  23.         case 5:
  24.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      | \n      |       \n      |\n   ___|___\n\n" );
  25.         break;
  26.         case 4:
  27.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /| \n      |       \n      |\n   ___|___\n\n" );
  28.         break;
  29.         case 3:
  30.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |       \n      |\n   ___|___\n\n" );
  31.         break;
  32.         case 2:
  33.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     /  \n      |\n   ___|___\n\n" );
  34.         break;
  35.         case 1:
  36.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     / \\ \n      |\n   ___|___\n\n\n" );
  37.         break;
  38.     }
  39. }


C'est une question de style, mais la lisibilité, c'est important.
A+,

Message cité 1 fois
Message édité par gilou le 15-03-2012 à 13:35:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2012 à 17:14:51    

gilou a écrit :

Bon sinon, pour ton pendu, ceci est nettement plus lisible

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // 12 dessins en comptant le premier vide
  5. // 10 lignes de 18 signes et un \0 en fin de ligne -> 181 chars
  6. static char pendu_state[12][181] = {
  7. //
  8.     "                 \n"
  9.     "                 \n"
  10.     "                 \n"
  11.     "                 \n"
  12.     "                 \n"
  13.     "                 \n"
  14.     "                 \n"
  15.     "                 \n"
  16.     "                 \n"
  17.     "                 \n",
  18. //
  19.     "                 \n"
  20.     "                 \n"
  21.     "                 \n"
  22.     "                 \n"
  23.     "                 \n"
  24.     "                 \n"
  25.     "                 \n"
  26.     "   _______       \n"
  27.     "                 \n"
  28.     "                 \n",
  29. //
  30.     "                 \n"
  31.     "                 \n"
  32.     "      |          \n"
  33.     "      |          \n"
  34.     "      |          \n"
  35.     "      |          \n"
  36.     "      |          \n"
  37.     "   ___|___       \n"
  38.     "                 \n"
  39.     "                 \n",
  40. //
  41.     "                 \n"
  42.     "      _________  \n"
  43.     "      |          \n"
  44.     "      |          \n"
  45.     "      |          \n"
  46.     "      |          \n"
  47.     "      |          \n"
  48.     "   ___|___       \n"
  49.     "                 \n"
  50.     "                 \n",
  51. //
  52.     "                 \n"
  53.     "      _________  \n"
  54.     "      | /        \n"
  55.     "      |/         \n"
  56.     "      |          \n"
  57.     "      |          \n"
  58.     "      |          \n"
  59.     "   ___|___       \n"
  60.     "                 \n"
  61.     "                 \n",
  62. //
  63.     "                 \n"
  64.     "      _________  \n"
  65.     "      | /    |   \n"
  66.     "      |/         \n"
  67.     "      |          \n"
  68.     "      |          \n"
  69.     "      |          \n"
  70.     "   ___|___       \n"
  71.     "                 \n"
  72.     "                 \n",
  73. //
  74.     "                 \n"
  75.     "      _________  \n"
  76.     "      | /    |   \n"
  77.     "      |/     o   \n"
  78.     "      |          \n"
  79.     "      |          \n"
  80.     "      |          \n"
  81.     "   ___|___       \n"
  82.     "                 \n"
  83.     "                 \n",
  84. //
  85.     "                 \n"
  86.     "      _________  \n"
  87.     "      | /    |   \n"
  88.     "      |/     o   \n"
  89.     "      |      |   \n"
  90.     "      |          \n"
  91.     "      |          \n"
  92.     "   ___|___       \n"
  93.     "                 \n"
  94.     "                 \n",
  95. //
  96.     "                 \n"
  97.     "      _________  \n"
  98.     "      | /    |   \n"
  99.     "      |/     o   \n"
  100.     "      |     /|   \n"
  101.     "      |          \n"
  102.     "      |          \n"
  103.     "   ___|___       \n"
  104.     "                 \n"
  105.     "                 \n",
  106. //
  107.     "                 \n"
  108.     "      _________  \n"
  109.     "      | /    |   \n"
  110.     "      |/     o   \n"
  111.     "      |     /|\\  \n"
  112.     "      |          \n"
  113.     "      |          \n"
  114.     "   ___|___       \n"
  115.     "                 \n"
  116.     "                 \n",
  117. //
  118.     "                 \n"
  119.     "      _________  \n"
  120.     "      | /    |   \n"
  121.     "      |/     o   \n"
  122.     "      |     /|\\  \n"
  123.     "      |     /    \n"
  124.     "      |          \n"
  125.     "   ___|___       \n"
  126.     "                 \n"
  127.     "                 \n",
  128. //
  129.     "                 \n"
  130.     "      _________  \n"
  131.     "      | /    |   \n"
  132.     "      |/     o   \n"
  133.     "      |     /|\\  \n"
  134.     "      |     / \\  \n"
  135.     "      |          \n"
  136.     "   ___|___       \n"
  137.     "                 \n"
  138.     "                 \n",
  139. };
  140. // Test
  141. int main (int argc, char *argv[]) {
  142.     int choix;
  143.     while (1) {
  144.         scanf("%d", &choix);
  145.         switch (choix) {
  146.         case 11:
  147.         case 10:
  148.         case  9:
  149.         case  8:
  150.         case  7:
  151.         case  6:
  152.         case  5:
  153.         case  4:
  154.         case  3:
  155.         case  2:
  156.         case  1:
  157.             printf("%s", pendu_state[choix]);
  158.             break;
  159.         case 0:
  160.             exit(0);
  161.             break;
  162.         default:
  163.             printf("\n" );
  164.             break;
  165.         }
  166.     }
  167.     return 0;
  168. }


 
qu'un truc comme ceci (équivalent, mais clair comme du jus de moule par une nuit sans lune)
 

Code :
  1. void pendu(int pchance)
  2. {
  3.     switch(pchance)
  4.     {
  5.         case 11:
  6.         printf("\n      \n           \n           \n            \n             \n      \n   ______\n\n" );
  7.         break;
  8.         case 10:
  9.         printf("\n      \n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  10.         break;
  11.         case 9:
  12.         printf("\n      ________\n      |     \n      |     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  13.         break;
  14.         case 8:
  15.         printf("\n      ________\n      |  /     \n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  16.         break;
  17.         case 7:
  18.         printf("\n      ________\n      |  /   |\n      |/     \n      |      \n      |       \n      |\n   ___|___\n\n" );
  19.         break;
  20.         case 6:
  21.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      \n      |       \n      |\n   ___|___\n\n" );
  22.         break;
  23.         case 5:
  24.         printf("\n      ________\n      |  /   |\n      |/     o\n      |      | \n      |       \n      |\n   ___|___\n\n" );
  25.         break;
  26.         case 4:
  27.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /| \n      |       \n      |\n   ___|___\n\n" );
  28.         break;
  29.         case 3:
  30.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |       \n      |\n   ___|___\n\n" );
  31.         break;
  32.         case 2:
  33.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     /  \n      |\n   ___|___\n\n" );
  34.         break;
  35.         case 1:
  36.         printf("\n      ________\n      |  /   |\n      |/     o\n      |     /|\\ \n      |     / \\ \n      |\n   ___|___\n\n\n" );
  37.         break;
  38.     }
  39. }


C'est une question de style, mais la lisibilité, c'est important.
A+,


 
 
 
je sais ^^ c'est un copain qui a voulu faire les dessins ^^ ça lui faisait plaisir ^^

Reply

Marsh Posté le 15-03-2012 à 17:17:58    

Terminapor a écrit :

&ptrouve[i], non ?


 
 
yep :) déjà ça ne bug plus, ça marche même :)
ça me rajoute un warning mais bon au moins ça marche :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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