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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6
Page Suivante
Auteur Sujet :

les pointeurs , les tableaux ??? je mis perd

n°1139605
super-tupa​pau
Posté le 04-07-2005 à 17:34:17  profilanswer
 

Reprise du message précédent :
voila pour malloc:
 

Code :
  1. char *p = malloc(P_SIZE);
  2. if(p == NULL){
  3. printf("malloc n'a pas réussi à allouer l'espace mémoire requis" );
  4. exit(EXIT_FAILURE);
  5. }


Message édité par super-tupapau le 04-07-2005 à 17:35:10
mood
Publicité
Posté le 04-07-2005 à 17:34:17  profilanswer
 

n°1139622
el muchach​o
Comfortably Numb
Posté le 04-07-2005 à 17:58:10  profilanswer
 

Ok, très rapidement (je suis tjrs au taf, là), c'est pas mal. Ce serait bon qu'à la fin de ton programme, tu donnes une copie de l'exécution.
Sinon, ta gestion d'erreurs est un peu violente : au moindre pb, tu quittes le programme direct. Dans un "vrai" programme, plutôt que de quitter directement avec un exit, tu vas plutôt essayer de "remonter" la pile d'appels, c'à d prévenir d'une manière ou d'une autre l'appelant qu'il y a eu un blème, de sorte qu'il puisse traiter l'erreur comme il l'entend (donc le plus proprement possible), donc il faut faire comme Em. Delahaye recommande.
Dans les langages objet, on utilise généralement les exceptions pour celà. En C, il faut se creuser la tête et être rigoureux, la gestion d'erreurs étant tjrs un pb épineux.
Tu peux décider de passer un code d'erreur à chaque appel de fonction par ex. Dans ce schéma, l'EXIT_FAILURE ne doit apparaître pratiquement que dans le main.
Par contre, tester le strcpy ne sert pas à grand-chose.
 
Autre commentaire, su la méthode: il n'est pas utile de recopier la chaine à encoder dans un autre tableau, qui est lui même à nouveau recopié. Tu fais l'opération d'encodage directement dans la chaîne.
Surtout que là, ton algo, je me demande sérieusement s'il marche: tu utilises des strcpy à tort et à travers et à mon avis, ça ne marche pas du tout.
Pour le moment, interdiction d'utiliser strcpy, memcpy, etc.


Message édité par el muchacho le 04-07-2005 à 18:06:43
n°1139660
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-07-2005 à 18:25:35  profilanswer
 

super-tupapau a écrit :


Code :
  1. printf("malloc n'a pas réussi à allouer l'espace mémoire requis" );



J'avais fait une remarque sur le '\n' qui manque ... Merci d'en tenir compte... Ca donne l'impression de servir à quelque chose...
 
D'autre part, un exit() , c'est violent... En principe, on deconstruit gentiment ce qu'on a construit avant de quitter, genre, 'on est pas des barbares'... (suppression des processus fils, fermeture des sockets, fermeture des fichiers, sauvegarde des données, libération de la mémoire...bref, on essaye d'être un minimum civilisé...)


---------------
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°1139719
super-tupa​pau
Posté le 04-07-2005 à 20:03:41  profilanswer
 

ok voila les améliorations (ce programme je l'ai compilé est il marche impécablement au niveau de l'algo)
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #define P_SIZE 64
  5. /* Prototypes */
  6. void display(char *str);
  7. int encrypte(char *chaine);
  8. int decrypte(char * chaine);
  9. int main(int argc, char ** argv){
  10. /* Définition est inisialisation */
  11. char *p = malloc(P_SIZE);
  12. FILE *file;
  13. if(p == NULL){
  14. printf("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
  15. /* Fin du programme */
  16. fclose(file);
  17. free(p);
  18. exit(EXIT_FAILURE);
  19. }
  20. /* Vérifier la présence d'un argument */
  21. if(argv[1] == 0){
  22. printf("Erreur: aucun fichier fournie\n" );
  23. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  24. /* Fin du programme */
  25. fclose(file);
  26. free(p);
  27. exit(EXIT_FAILURE);
  28. }
  29. /* Ouvrir un flux de données en lecture seule */
  30. if((file = fopen( argv[1], "r" )) == NULL){
  31. perror("fopen" );
  32. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  33. /* Fin du programme */
  34. fclose(file);
  35. free(p);
  36. exit(EXIT_FAILURE);
  37. }
  38. /* Lire le flux de données */
  39. if( !fread( p, sizeof(char), P_SIZE, file) ){
  40. perror("fread" );
  41. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  42. /* Fin du programme */
  43. fclose(file);
  44. free(p);
  45. exit(EXIT_FAILURE);
  46. }
  47. display( p );
  48. printf("Encryptage...\n" );
  49. /* Encrypter la chaine */
  50. if(encrypte( p ) != 0){
  51. printf("Erreur: Impossible d'encrypter la chaine\n" );
  52. /* Fin du programme */
  53. fclose(file);
  54. free(p);
  55. exit(EXIT_FAILURE);
  56. }
  57. display( p );
  58. printf("Decryptage...\n" );
  59. /* Decrypter la chaine */
  60. if(decrypte( p ) != 0){
  61. printf("Erreur: Impossible de decrypter la chaine\n" );
  62. /* Fin du programme */
  63. fclose(file);
  64. free(p);
  65. exit(EXIT_FAILURE);
  66. }
  67. display( p );
  68. /* Fin du programme */
  69. fclose(file);
  70. free(p);
  71. return EXIT_SUCCESS;
  72. }
  73. /* Fonction display */
  74. void display(char *str){
  75. printf("Chaine: %s\n", str);
  76. fflush(stdout);
  77. }
  78. /* Fonction encrypte */
  79. int encrypte(char * chaine){
  80. char new_chaine[P_SIZE];
  81. int i;
  82. strcpy( new_chaine, chaine);
  83. for(i=0; i<P_SIZE-1; i++){
  84. new_chaine[i] += 3;
  85. }
  86. strcpy( chaine, new_chaine);
  87. return 0;
  88. }
  89. /* Fonction decrypte */
  90. int decrypte( char * chaine ){
  91. char new_chaine[P_SIZE];
  92. int i;
  93. strcpy( new_chaine, chaine);
  94. for(i=0; i<P_SIZE; i++){
  95. new_chaine[i] -= 3;
  96. }
  97. strcpy( chaine, new_chaine);
  98. return 0;
  99. }


 
resultat avec la phrase: Voila une phrase qui sera encriptée avec le chiffre de César!
 
Chaine: Voila une phrase qui sera encriptée avec le chiffre de César!
 
Encryptage...
Chaine: Yrlod#xqh#skudvh#txl#vhud#hqfulsw&#428;h#dyhf#oh#fkliiuh#gh#F&#428;vdu$
 
Decryptage...
Chaine: Voila une phrase qui sera encriptée avec le chiffre de César!
 
sinon pour la gestion des erreur tu veux que ca produise un fichier core? je peux utiliser la fonction abort pour envoyer le signal SIGARBT? ou atexit()?
je voudrais bien créer une fonction par exemple destroy qui permet de quitter proprement le programme mais les pointeurs sont déclaré dans main et  
c'est pas conseillé d'en déclaré en GLOBAL
 

Citation :

tu vas plutôt essayer de "remonter" la pile d'appels

je sais pas faire?  j'ai vu une fonction qui permet de revenir a un état précédent du programme dans mon livre de programmation systeme linux

n°1139724
Taz
bisounours-codeur
Posté le 04-07-2005 à 20:06:52  profilanswer
 

# FILE *file;
#
# if(p == NULL){
# printf("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
# /* Fin du programme */
# fclose(file);
 
 
file n'est pas initialisé. et tout ça manque de const

n°1139727
super-tupa​pau
Posté le 04-07-2005 à 20:08:57  profilanswer
 

# FILE *file = NULL;
#
# if(p == NULL){
# printf("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
# /* Fin du programme */
# fclose(file);  
 
des constantes ? pk ?
 
sinon taz tu doit savoir  

Citation :

tu vas plutôt essayer de "remonter" la pile d'appels


comment on fait ca?


Message édité par super-tupapau le 04-07-2005 à 20:10:01
n°1139738
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-07-2005 à 20:23:34  profilanswer
 

super-tupapau a écrit :

ok voila les améliorations (ce programme je l'ai compilé est il marche impécablement au niveau de l'algo)


#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
 
#define P_SIZE 64
 
/* Prototypes */
void display(char *str);
int encrypte(char *chaine);
int decrypte(char * chaine);
 
int main(int argc, char ** argv){
 
/* Définition est inisialisation */
char *p = malloc(P_SIZE);
FILE *file;
 
if(p == NULL){
printf("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
/* Fin du programme */
fclose(file);
free(p);
exit(EXIT_FAILURE);
}



Typiquement le genre de codage à la barbare que j'évite...
 
La compile... Pas terrible...


main.c: In function `main_':
main.c:22: warning: unused parameter `argc'
 
main.c:26: warning: `file' might be used uninitialized in this function
 
main.c: In function `encrypte':
main.c:111: warning: implicit declaration of function `strcpy'


 
J'ai un beau crash à l'exécution, probablement le fclose() du 'file' non initialisé... (comportement indéfini).
 
Pourquoi tu fermes des fichiers que tu n'as jamais ouvert ?
 
Pas besoin de ces copies incessantes... Ceci marchouille...


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define SIZE 64
 
/* Fonction display */
void display (char const *str)
{
   printf ("Chaine: %s\n", str);
}
 
/* Fonction encrypte */
int encrypte (char *chaine)
{
   int i;
 
   for (i = 0; i < SIZE - 1; i++)
   {
      chaine[i] += 3;
   }
 
   return 0;
}
 
/* Fonction decrypte */
int decrypte (char *chaine)
{
   int i;
 
   for (i = 0; i < SIZE; i++)
   {
      chaine[i] -= 3;
   }
 
   return 0;
}
 
static void usage (char *const *argv)
{
   printf ("Syntaxe: %s FICHIER\n", argv[0]);
}
 
int main (int argc, char **argv)
{
 
   int ret = EXIT_SUCCESS;
 
/* Vérifier la présence d'un argument */
   if (argc > 1)
   {
/* Ouvrir un flux de données en lecture seule */
      FILE *file = fopen (argv[1], "r" );
 
      if (file != NULL)
      {
/* Définition et initialisation */
         char *p = malloc (SIZE);
 
         if (p != NULL)
         {
/* Lire le flux de données */
            fread (p, 1, SIZE, file);
 
            display (p);
            printf ("Encryptage...\n" );
 
/* Encrypter la chaine */
            encrypte (p);
            display (p);
            printf ("Decryptage...\n" );
 
/* Decrypter la chaine */
            decrypte (p);
 
            display (p);
            free (p), p = NULL;
         }
         else
         {
            printf ("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
            ret = EXIT_FAILURE;
         }
         fclose (file), file = NULL;
      }
      else
      {
         perror (argv[1]);
         ret = EXIT_FAILURE;
      }
   }
   else
   {
      printf ("Erreur: aucun fichier fournie\n" );
      usage (argv);
      ret = EXIT_FAILURE;
   }
 
/* Fin du programme */
   return ret;
}


Message édité par Emmanuel Delahaye le 04-07-2005 à 20:48:57

---------------
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°1139745
super-tupa​pau
Posté le 04-07-2005 à 20:28:10  profilanswer
 

???  

Citation :


main.c: In function `main_':
main.c:22: warning: unused parameter `argc'
 
main.c:26: warning: `file' might be used uninitialized in this function
 
main.c: In function `encrypte':
main.c:111: warning: implicit declaration of function `strcpy'  


 
j'ai rien avec GCC 3.4?
 
ca n'ouvre pas le fichier ceci?

Citation :


if((file = fopen( argv[1], "r" )) == NULL){


 
et pour le file chez moi il est inisialisé
FILE *file = NULL;
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #define P_SIZE 64
  5. /* Prototypes */
  6. void display(char *str);
  7. int encrypte(char *chaine);
  8. int decrypte(char * chaine);
  9. int main(int argc, char ** argv){
  10. /* Définition est inisialisation */
  11. char *p = malloc(P_SIZE);
  12. FILE *file = NULL;
  13. if(p == NULL){
  14. printf("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
  15. /* Fin du programme */
  16. fclose(file);
  17. free(p);
  18. exit(EXIT_FAILURE);
  19. }
  20. /* Vérifier la présence d'un argument */
  21. if(argv[1] == 0){
  22. printf("Erreur: aucun fichier fournie\n" );
  23. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  24. /* Fin du programme */
  25. fclose(file);
  26. free(p);
  27. exit(EXIT_FAILURE);
  28. }
  29. /* Ouvrir un flux de données en lecture seule */
  30. if((file = fopen( argv[1], "r" )) == NULL){
  31. perror("fopen" );
  32. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  33. /* Fin du programme */
  34. fclose(file);
  35. free(p);
  36. exit(EXIT_FAILURE);
  37. }
  38. /* Lire le flux de données */
  39. if( !fread( p, sizeof(char), P_SIZE, file) ){
  40. perror("fread" );
  41. printf("Syntaxe: %s [ FICHIER ]\n", argv[0]);
  42. /* Fin du programme */
  43. fclose(file);
  44. free(p);
  45. exit(EXIT_FAILURE);
  46. }
  47. display( p );
  48. printf("Encryptage...\n" );
  49. /* Encrypter la chaine */
  50. if(encrypte( p ) != 0){
  51. printf("Erreur: Impossible d'encrypter la chaine\n" );
  52. /* Fin du programme */
  53. fclose(file);
  54. free(p);
  55. exit(EXIT_FAILURE);
  56. }
  57. display( p );
  58. printf("Decryptage...\n" );
  59. /* Decrypter la chaine */
  60. if(decrypte( p ) != 0){
  61. printf("Erreur: Impossible de decrypter la chaine\n" );
  62. /* Fin du programme */
  63. fclose(file);
  64. free(p);
  65. exit(EXIT_FAILURE);
  66. }
  67. display( p );
  68. /* Fin du programme */
  69. fclose(file);
  70. free(p);
  71. return EXIT_SUCCESS;
  72. }
  73. /* Fonction display */
  74. void display(char *str){
  75. printf("Chaine: %s\n", str);
  76. fflush(stdout);
  77. }
  78. /* Fonction encrypte */
  79. int encrypte(char * chaine){
  80. char new_chaine[P_SIZE];
  81. int i;
  82. strcpy( new_chaine, chaine);
  83. for(i=0; i<P_SIZE-1; i++){
  84. new_chaine[i] += 3;
  85. }
  86. strcpy( chaine, new_chaine);
  87. return 0;
  88. }
  89. /* Fonction decrypte */
  90. int decrypte( char * chaine ){
  91. char new_chaine[P_SIZE];
  92. int i;
  93. strcpy( new_chaine, chaine);
  94. for(i=0; i<P_SIZE; i++){
  95. new_chaine[i] -= 3;
  96. }
  97. strcpy( chaine, new_chaine);
  98. return 0;
  99. }

n°1139771
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-07-2005 à 20:54:47  profilanswer
 

super-tupapau a écrit :

???  

Citation :


main.c: In function `main_':
main.c:22: warning: unused parameter `argc'
 
main.c:26: warning: `file' might be used uninitialized in this function
 
main.c: In function `encrypte':
main.c:111: warning: implicit declaration of function `strcpy'  


 
j'ai rien avec GCC 3.4?


Essaye avec -W -Wall -O2
 

Citation :

ca n'ouvre pas le fichier ceci?

Citation :


if((file = fopen( argv[1], "r" )) == NULL){




Si, mais en cas d'erreur, tu fermes le fichier alors qu'il n'est pas ouvert... -> UB...

Citation :


et pour le file chez moi il est inisialisé
FILE *file = NULL;


Pas dans le code que tu as publié avant... Et pour la dernière fois c'est initialisé. C'est fatiguant de lire du français massacré comme ça...


---------------
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°1139785
super-tupa​pau
Posté le 04-07-2005 à 21:16:45  profilanswer
 

Avec gcc -W -Wall -O2 .... j'obtient:
exo3.c: Dans la fonction « main »:
exo3.c:12: attention : unused parameter `argc'
exo3.c: Dans la fonction « encrypte »:
exo3.c:101: attention : implicit declaration of function `strcpy'
 
et pour file je peux faire:
 
file = fopen( argv[1], "r" );
if(file == NULL){...}
 

Citation :

Et pour la dernière fois c'est initialisé. C'est fatiguant de lire du français massacré comme ça...


Pour l'orthographe désolé, le pire c'est qu'il y a un truc facile pour le retenir, le processus init de linux
 
enfin
 

Citation :


tu vas plutôt essayer de "remonter" la pile d'appels


 
comment on fait ca?


Message édité par super-tupapau le 04-07-2005 à 21:17:48
mood
Publicité
Posté le 04-07-2005 à 21:16:45  profilanswer
 

n°1139788
chrisbk
-
Posté le 04-07-2005 à 21:21:47  profilanswer
 

el muchacho a écrit :


edit: en fait ça ne tient pas vraiment debout, comme explication... :ange:


 
 
pas du tout, parce que
 

Code :
  1. truc bidule;


 
est syntaxiquement correct, meme si truc est inconnu. Ca respecte la grammaire C, dirais je
 
emmanuel > pour le coup t'as visé a coté, ou j'ai posté un code stupide qui ne montre pas ce que je veux montrer :d

n°1139797
el muchach​o
Comfortably Numb
Posté le 04-07-2005 à 21:43:52  profilanswer
 

super-tupapau a écrit :


Citation :


tu vas plutôt essayer de "remonter" la pile d'appels


 
comment on fait ca?


 
Regarde bien le code d'Emmanuel. Dans son code, il n'y a qu'un point d'entrée (la fonction main), et un seul point de sortie (le return de la fonction main).  
Pour cela, il utilise une variable ret qu'il initialise à EXIT_SUCCESS, et la met à jour en cas d'erreur. Dans tous les cas, le flot passe par le return ret;
Cela permet de contrôler exactement ce que le programme fait quand on l'appelle, et d'éviter les effets de bord.
 
Dans ton programme, il y a un point d'entrée, et N points de sortie. C'est pas beau. De façon générale, en prog, si on veut être tjrs sûr de savoir ce qu'on fait, il faut éviter les effets de bord, c-à-d que les changements doivent se faire au niveau de l'interface et pas ailleurs. Pour des raisons de performance et d'économie de ressources, il peut y avoir des exceptions, mais elles doivent être soigneusement documentées.
Dans ton cas, ton programme sort n'importe comment, ce n'est pas bon.
 
Quand je dis "remonter" la pile d'appels, je veux dire que la fonction qui provoque une erreur ne doit pas tout faire planter comme c'est le cas dans ton code. Comme dans une hiérarchie de prise de décision, elle doit "nettoyer sa merde" (désallouer ce qu'elle a alloué par ex.), puis signaler l'erreur, et c'est à l'appelant de gérer cette erreur comme il l'entend. Pour être clair, prenons l'exemple d'un système d'avionique. Si une fonction provoque un calcul erronné (un dépassement de capacité par ex.), il n'est évidemment pas question qu'elle sorte un exit(FAILURE)  [:freekill]. Elle doit détecter le dépassement (NaN) et signaler que le calcul est erronné, et c'est à la fonction appelante de gérer cela, en faisant un calcul par défaut   moins précis ou en retournant une valeur moyenne par exemple.


Message édité par el muchacho le 04-07-2005 à 21:48:03
n°1139798
el muchach​o
Comfortably Numb
Posté le 04-07-2005 à 21:56:14  profilanswer
 

super-tupapau a écrit :

???  

Citation :


ca n'ouvre pas le fichier ceci?
[quote]
if((file = fopen( argv[1], "r" )) == NULL){


 
et pour le file chez moi il est inisialisé
FILE *file = NULL;


 
Le pointeur est initialisé mais le fichier n'est pas ouvert.
Si ton malloc échoue, tu n'as pas besoin de faire un fclose vu que tu n'as jamais fait de fopen. De même que le free va planter.
 
Enfin, dernière remarque, il est inutile de tester le résultat des fonctions encrypte et décrypte, vu qu'elles ne retournent que 0.
 
Et un test confirme ce que je pensais. Comme prévu, ton programme explose en vol. Pourquoi ça ? Parce que tu ajoutes 3 à ton 0 de fin de chaîne. Donc au strcpy suivant, tu jardines joliment la mémoire.
 
edit: au debugger, c'est pire que ça, tu lis une chaine de 89 caractère dans ton fichier donc dès le premier strcpy, tu jardines. Le code d'ED marche parce qu'il limite les opérations encrypte et decrypte à SIZE caractères, tandis que le tiens plante parce que tu fais un usage non maitrisé de strcpy. Tu t'imaginais que c'était facile à utiliser et tu t'es vautré. Ce n'est pas pour rien que j'ai mis ces fonctions en dernier dans le plan des exercices.
 
Dans cet exercice, la mémoire doit être allouée dynamiquement pour contenir toute la chaîne et seulement la longeur de la chaîne (tu pourras utliser la fonction strlen si nécessaire. Il se peut que fread fasse lui-même l'allocation et te retourne juste le pointeur, je n'ai pas vérifié), et non par un tableau statique de longeur fixée à l'avance. Je te conseille de repartir sur la solution d'ED et de l'adapter.
Dans l'exercice suivant, il faudra lire un nombre indéterminé de phrases de longueurs quelconques dans le fichier, mais commence par faire fonctionner le programme avec une seule phrase dans le fichier.


Message édité par el muchacho le 04-07-2005 à 23:01:38
n°1139870
el muchach​o
Comfortably Numb
Posté le 04-07-2005 à 23:09:10  profilanswer
 

chrisbk a écrit :

pas du tout, parce que
 

Code :
  1. truc bidule;


 
est syntaxiquement correct, meme si truc est inconnu. Ca respecte la grammaire C, dirais je


Ce qui respecterait la grammaire, ce ne serait pas plutôt :
truc, bidule;
 
d'où le parse error ?

n°1139880
super-tupa​pau
Posté le 04-07-2005 à 23:20:32  profilanswer
 

ok pour le code de ED

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define SIZE 64
  5. /* Fonction display */
  6. void display (char const *str)
  7. {
  8.    printf ("Chaine: %s\n", str);
  9. }
  10. /* Fonction encrypte */
  11. int encrypte (char *chaine)
  12. {
  13.    int i;
  14.  
  15.    /* tu met -1 pour ne pas inclure le caractère \0 */
  16.    for (i = 0; i < SIZE - 1; i++)
  17.    {
  18.       chaine[i] += 3;
  19.    }
  20.    return 0;
  21. }
  22. /* Fonction decrypte */
  23. int decrypte (char *chaine)
  24. {
  25.    int i;
  26.    for (i = 0; i < SIZE; i++)
  27.    {
  28.       chaine[i] -= 3;
  29.    }
  30.    return 0;
  31. }
  32. static void usage (char *const *argv)
  33. {
  34.    printf ("Syntaxe: %s FICHIER\n", argv[0]);
  35. }
  36. int main (int argc, char **argv)
  37. {
  38.    int ret = EXIT_SUCCESS;
  39. /* Vérifier la présence d'un argument */
  40.    if (argc > 1)
  41.    {
  42. /* Ouvrir un flux de données en lecture seule */
  43.       FILE *file = fopen (argv[1], "r" );
  44.       if (file != NULL)
  45.       {
  46. /* Définition et initialisation */
  47.          char *p = malloc (SIZE);
  48.          if (p != NULL)
  49.          {
  50. /* Lire le flux de données */
  51.             fread (p, 1, SIZE, file);
  52.             display (p);
  53.             printf ("Encryptage...\n" );
  54. /* Encrypter la chaine */
  55.             encrypte (p);
  56.             display (p);
  57.             printf ("Decryptage...\n" );
  58. /* Decrypter la chaine */
  59.             decrypte (p);
  60.             display (p);
  61.             free (p), p = NULL;
  62.          }
  63.          else
  64.          {
  65.             printf ("malloc n'a pas réussi à allouer l'espace mémoire requis\n" );
  66.             ret = EXIT_FAILURE;
  67.          }
  68.          fclose (file), file = NULL;
  69.       }
  70.       else
  71.       {
  72.          perror (argv[1]);
  73.          ret = EXIT_FAILURE;
  74.       }
  75.    }
  76.    else
  77.    {
  78.       printf ("Erreur: aucun fichier fournie\n" );
  79.       usage (argv);
  80.       ret = EXIT_FAILURE;
  81.    }
  82. /* Fin du programme */
  83.    return ret;
  84. }


 
en fait pour n'avoir qu'une sortie il suffit denbriquer les conditions (ou autre instructions)
merci à ED pour son code je le conserve comme exemple  :jap:
 
EDIT: une nouveauté. je savais pas que l'on pouvais faire ca

Citation :

fclose (file), file = NULL;


Message édité par super-tupapau le 04-07-2005 à 23:23:12
n°1139887
Taz
bisounours-codeur
Posté le 04-07-2005 à 23:26:03  profilanswer
 

ça peut pas marcher ce truc. tu fais une boucle 0-SIZE, et donc tu bouzilles '\0' final

n°1139889
super-tupa​pau
Posté le 04-07-2005 à 23:27:18  profilanswer
 

Vous auriez pas des conseils pour faire un commentaire "pratique". Quand en mettre et quoi dire. une tuto la dessus serait parfaite.


Message édité par super-tupapau le 04-07-2005 à 23:27:34
n°1139891
super-tupa​pau
Posté le 04-07-2005 à 23:28:42  profilanswer
 

Citation :


ça peut pas marcher ce truc. tu fais une boucle 0-SIZE, et donc tu bouzilles '\0' final


 
ohoho doucement. une boucle 0-SIZE?


Message édité par super-tupapau le 04-07-2005 à 23:31:17
n°1139893
chrisbk
-
Posté le 04-07-2005 à 23:29:49  profilanswer
 

el muchacho a écrit :

Ce qui respecterait la grammaire, ce ne serait pas plutôt :
truc, bidule;
 
d'où le parse error ?


 
nanan, t'essayerais :o

n°1139927
Taz
bisounours-codeur
Posté le 05-07-2005 à 00:14:27  profilanswer
 

for (i = 0; i < SIZE; i++)

n°1139935
super-tupa​pau
Posté le 05-07-2005 à 00:33:34  profilanswer
 

Citation :

for (i = 0; i < SIZE; i++)


 
ah excuse je savais pas que tu parler de mon code. J'ai compris maintenant en fesant -1 on exclue le \0

n°1139997
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-07-2005 à 08:43:23  profilanswer
 

super-tupapau a écrit :

désolé pour la répétition j'ai reloadé la page accidentellement.


edition / suppression
 


---------------
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°1141379
el muchach​o
Comfortably Numb
Posté le 05-07-2005 à 22:09:02  profilanswer
 

Tiens, il a disparu, notre padawan du C ?

n°1141476
super-tupa​pau
Posté le 05-07-2005 à 23:13:20  profilanswer
 

non non il  a rien à dire [:afcmetos]. si vous avez un autre exo dans la suite du précédent je suis pas contre  :p

n°1141481
Taz
bisounours-codeur
Posté le 05-07-2005 à 23:17:05  profilanswer
 

super-tupapau a écrit :

Citation :

for (i = 0; i < SIZE; i++)


 
ah excuse je savais pas que tu parler de mon code. J'ai compris maintenant en fesant -1 on exclue le \0


non. qui te dit que s[SIZE-1] est l' '\0' final ?

n°1141487
super-tupa​pau
Posté le 05-07-2005 à 23:20:57  profilanswer
 

Citation :

for (i = 0; i < SIZE; i++)


 
alors de quoi tu parle? de la faute que j'avais faite?
 

Citation :

Dans l'exercice suivant, il faudra lire un nombre indéterminé de phrases de longueurs quelconques dans le fichier, mais commence par faire fonctionner le programme avec une seule phrase dans le fichier.


 
j'ai retrouver l'exercice suivant  :sarcastic:

n°1142086
super-tupa​pau
Posté le 06-07-2005 à 14:31:17  profilanswer
 

bon pour l'exercice suivant je vois pas comment faire. j'ai une idée mais je pense pas qu'elle soit bonne.
je pourrais allouer la place pour un caractère puis récuperer un caractère dans le fichier. ensuite je rajouterais à cette allocation la place pour un seconde caractère je recupère le caractère suivant du fichier et ainsi de suite jusqu'à qu'il n'y est plus de caractère à ce moment là j'ajouterais le caractère \0 à la fin de l'allocation.

n°1142464
super-tupa​pau
Posté le 06-07-2005 à 18:18:41  profilanswer
 

personne pour répondre  :(

n°1142486
el muchach​o
Comfortably Numb
Posté le 06-07-2005 à 18:31:20  profilanswer
 

Fais un man fgets, ça devrait convenir.
Sinon man 2 read.
 
(tu peux avoir les man pages sur le net aussi si tu n'as pas un Linux sous la main)
 
Dans un premier temps, fais fonctionnner le prog avec une seule phrase dans le fichier. Cela signifie que tu ne dois plus  avoir besoin de la constante SIZE.
 
Ah, et pour apprendre à utiliser les arguments de main(), ce qui serait bien, c'est qu'on puisse appeler ton prog comme ça:
cesar fichier.txt, ou bien cesar -e fichier.txt    <-- encode
cesar -d fichier.txt                               <-- decode


Message édité par el muchacho le 06-07-2005 à 18:36:13
n°1142529
super-tupa​pau
Posté le 06-07-2005 à 19:17:27  profilanswer
 

Citation :

(tu peux avoir les man pages sur le net aussi si tu n'as pas un Linux sous la main)


 
j'utilise que linux
 

Citation :


Ah, et pour apprendre à utiliser les arguments de main(), ce qui serait bien, c'est qu'on puisse appeler ton prog comme ça:
cesar fichier.txt, ou bien cesar -e fichier.txt    <-- encode
cesar -d fichier.txt                               <-- decode


 
j'ai un chapitre entier la dessus dans mon livre de prog systeme

n°1145997
Sve@r
Posté le 11-07-2005 à 10:03:47  profilanswer
 

Ok, le chiffre de Cesar c'est assimilé.
Si on passait à Vigenere pour corser le truc ? Ensuite on finit par ENIGMA non ???

n°1146241
super-tupa​pau
Posté le 11-07-2005 à 13:10:01  profilanswer
 

Citation :


 Ok, le chiffre de Cesar c'est assimilé.
Si on passait à Vigenere pour corser le truc ? Ensuite on finit par ENIGMA non ???


 
je veux bien mais je part en vacances. En attendant mon K&R j'ai acheté un livre d'exercice C  :)

n°1146244
chrisbk
-
Posté le 11-07-2005 à 13:12:02  profilanswer
 

super-tupapau a écrit :

Citation :

(tu peux avoir les man pages sur le net aussi si tu n'as pas un Linux sous la main)


 
j'utilise que linux


 
aie :/

n°1146933
super-tupa​pau
Posté le 11-07-2005 à 19:15:25  profilanswer
 

Citation :


super-tupapau a écrit :
Citation :(tu peux avoir les man pages sur le net aussi si tu n'as pas un Linux sous la main)
 
 
j'utilise que linux
 
 
aie :/


 
t'as quelque chose contre linux?  :fou:

n°1147046
el muchach​o
Comfortably Numb
Posté le 11-07-2005 à 20:38:15  profilanswer
 

Bons alors, ces char ** ?

n°1147052
super-tupa​pau
Posté le 11-07-2005 à 20:40:44  profilanswer
 

j'ai pas le temps je part demain mais je le ferais en revenant  :D

n°1149552
el muchach​o
Comfortably Numb
Posté le 13-07-2005 à 22:28:54  profilanswer
 

Sve@r a écrit :

Ok, le chiffre de Cesar c'est assimilé.
Si on passait à Vigenere pour corser le truc ? Ensuite on finit par ENIGMA non ???


 
En fait, Vigenère n'est guère plus compliqué que César et un bon exercice pour qui a du temps à perdre. Simuler Enigma, par contre, ça devient costaud...

n°1149663
Sve@r
Posté le 14-07-2005 à 00:07:15  profilanswer
 

el muchacho a écrit :

En fait, Vigenère n'est guère plus compliqué que César et un bon exercice pour qui a du temps à perdre. Simuler Enigma, par contre, ça devient costaud...


 
Non, Enigma n'est que du Vigenère sur 26x26x26=17576 alphabets différents
3 rotors et un miroir
Chaque fois qu'une lettre est cryptée, le premier rotor avance d'un cran
Dès que le rotor 1 a fait un tour complet, le suivant avance d'un cran etc.
Une lettre à crypter passe par les 3 rotors, puis passe au miroir qui renvoie son opposé qui passe les 3 rotors dans le sens inverse. La lettre qui en ressort est la lettre cryptée. Pendant ce temps, le premier rotor a avancé d'un cran et la suivante sera cryptée différemment.
 
Pas réellement compliqué...


Message édité par Sve@r le 14-07-2005 à 00:08:37

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Résolu] [C#] Déclaration de tableaux d'objets à taille inconnueezPDF => tableaux et position "y"
Probleme super etrange de tableaux superposés [resolu]Bordures des tableaux sous FireFox
css et tableaux?Aligner deux tableaux
Probleme avec tableaux, demande d'aide aux spécialistes![Résolu] tableaux et sessions
les pointeurs - petite aide !Habillage de tableaux?
Plus de sujets relatifs à : les pointeurs , les tableaux ??? je mis perd


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)