[ C ] Help, i'm gonna kill myself.

Help, i'm gonna kill myself. [ C ] - C++ - Programmation

Marsh Posté le 18-06-2002 à 15:45:26    

Mais comment que c'est casse couille les pointeurs .. franchement je comprends que dalle, je reste une éternité sur une pauvre portion de code. Je les utilise et je sais  m^^eme pas ce que ça représente ...
 
Comment peut t on savoir où se trouve un erreur de type mémoire .. Quand je débugue, j'ai un truc du genre , User BReakpoint called from code at 0x77f etc ... ça représente quoi par rapport a mon code ???
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define RESULT_FILE "result.txt"
  5. #define LINERETURN  "\n"
  6. #define SIZETAB  2000
  7. #define MAXCHAR  100
  8. #define BATFILE  "greptab.bat"
  9. #define CPY_TO_FILE " >> "
  10. char *tables[SIZETAB];
  11. char input_f[100];
  12. char path[100];
  13. char *bat;
  14. /* declaration des fonctions */
  15. void launch_bat();
  16. void help(void);
  17. void writefile(char *mot);
  18. char *insert(char *table);
  19. int del_fichier_res(char *fileres);
  20. int del_bat_file(void);
  21. void fAnalyse(char *fileres);
  22. /*Fonction qui scanne le fichier contenant la liste des chaines a rechercher dans les sources*/
  23. void fRun(char *fichier)
  24. {
  25. FILE *fic;
  26. FILE *sortie;
  27. char temp[32];
  28. char *cmd;
  29. char *retour;
  30. char *fileres;
  31. int j;
  32. int i=0;
  33. char *tables_res;
  34. char *info;
  35. //formation de la chaine pour le chemin du fichier resultat
  36. fileres = malloc((strlen(RESULT_FILE)+strlen(path))*sizeof(c
  37. har));
  38. sprintf(fileres,"%s%s",path,RESULT_FILE);
  39. retour=malloc(strlen(CPY_TO_FILE)*sizeof(char));
  40. strcpy(retour,CPY_TO_FILE);
  41. info=malloc(strlen("echo " )*sizeof(char));
  42. strcpy(info,"echo " );
  43. fic = fopen(fichier,"r" );
  44.  if(fic != NULL)
  45. {
  46. // system("md result" );
  47.  do
  48.  {
  49.   fscanf(fic, "%s", temp);
  50.   tables[i]=malloc(strlen(temp)*sizeof(char));
  51.   strcpy(tables[i],temp);
  52.   i++;
  53.  }
  54.  while(!feof(fic));
  55.     //Pour se situer reelement a la derniere ligne
  56.  i--;
  57.  fclose(fic);
  58.  bat = malloc((strlen(path)+strlen(BATFILE))*sizeof(char)
  59. );
  60.  sprintf(bat,"%s%s",path,BATFILE);
  61.  printf("effacement du fichier bat %s\n",bat);
  62.  if(del_bat_file()==0)
  63.  {
  64.   printf("le fichier bat %s a ete efface\n",bat);
  65.  }
  66.  else
  67.  {
  68.   printf("pas de fichier bat %s trouve\n",bat);
  69.  }
  70.  printf("effacement du fichier resultat %s\n",fileres);
  71.  if(del_fichier_res(fileres)==0) printf("le fichier resultat %s a ete efface\n",fileres);
  72.   else printf("pas de fichier resultat %s trouve\n",fileres);
  73.  sortie = fopen(bat,"a" );
  74.  if(sortie != NULL)
  75.  {
  76.   for(j=0;j<i;j++)
  77.   {
  78.    cmd = malloc(strlen(tables[j])*sizeof(char));
  79.    strcpy(cmd,insert(tables[j]));
  80.    tables_res = malloc((strlen(info)+strlen(tables[j])+strlen(file
  81. res)+strlen(retour)+strlen(LINERETURN))*sizeof(cha
  82. r));
  83.    sprintf(tables_res,"%s%s%s%s%s",info,tables[
  84. j],retour,fileres,LINERETURN);
  85.    fputs(tables_res, sortie);
  86.    fputs(cmd, sortie);
  87.   }
  88.   fclose(sortie);
  89.  }
  90.  launch_bat(bat);
  91. //  fAnalyse(fileres,i);
  92. }
  93. else printf("le fichier %s n'a pas pu etre ouvert\n\n",input_f);
  94. }
  95. int del_bat_file(void)
  96. {
  97. char *command;
  98. char delcom[5];
  99. strcpy(delcom,"del " );
  100. command = malloc((strlen(delcom)+strlen(bat))*sizeof(char));
  101. sprintf(command,"%s%s",delcom,bat);
  102. if (system(command) == 0)
  103. {
  104.  return(0);
  105. }
  106. else
  107. {
  108.  return(-1);
  109. }
  110. }
  111. void launch_bat(void)
  112. {
  113. FILE *batfile;
  114. batfile = fopen(bat,"r" );
  115. if (batfile == NULL)
  116. {
  117.  printf ("le fichier %s contenant les commandes à executer n'a pas pu être trouvé\n",BATFILE);
  118. }
  119. else
  120. {
  121.  system(bat);
  122. }
  123. }
  124. char *insert(char *table)
  125. {
  126. char *cmdd;
  127. char *cmdf;
  128. char *cmd;
  129. char *separateur = "/";
  130. char *lResultFileName;
  131. char *searchdir;
  132. char *filename;
  133. lResultFileName = malloc(strlen(RESULT_FILE)*sizeof(char));
  134. strcpy(lResultFileName,RESULT_FILE);
  135. filename = malloc((strlen(path)+strlen(lResultFileName))*size
  136. of(char));
  137. sprintf(filename,"%s%s",path,lResultFileName);
  138. cmdd=malloc(strlen("grep -i -c -d " )*sizeof(char));
  139. cmdf=malloc(strlen(" >> " )*sizeof(char));
  140. strcpy(cmdd,"grep -i -c -d " );
  141. strcpy(cmdf," >> " );
  142. searchdir = malloc((strlen(path)+strlen("*.*" ))*sizeof(char));
  143. sprintf(searchdir,"%s%s%s"," ",path,"*.*" );
  144. cmd = malloc((strlen(cmdd)+strlen(table)+strlen(searchdi
  145. r)+strlen(cmdf)+strlen(filename)+strlen(LINERETURN
  146. ))*sizeof(char));
  147.    sprintf(cmd,"%s%s%s%s%s%s",cmdd,table,searchdir
  148. ,cmdf,filename,LINERETURN);
  149. // free(lResultFileName);
  150. // free(filename);
  151. // free(searchdir);
  152.    return(cmd);
  153. }
  154. int del_fichier_res(char *fileres)
  155. {
  156. char *command;
  157. char delcom[6];
  158. strcpy(delcom,"del " );
  159. command = malloc((strlen(delcom)+strlen(path))*sizeof(char))
  160. ;
  161. sprintf(command,"%s%s",delcom,fileres);
  162. if (system(command) == 0) return(0);
  163.  else return(-1);
  164. }
  165. void main(int argc, char *argv[])
  166. {
  167. argc = 3;
  168. argv[1]="C:\\wrkcesar\\database\\list.txt
  169. ";
  170. argv[2]="C:\\wrkcesar\\database\\";
  171. if (argc != 3) help();
  172. else
  173. {
  174.   strcpy(input_f,argv[1]);
  175.   strcpy(path,argv[2]);
  176.   fRun(argv[1]);
  177. }
  178. }
  179. void help(void)
  180. {
  181. printf("Correct syntax is :\n\tgreper <list.file> <search.path>" );
  182. exit(0);
  183. }


 
 
C'est surement très laid, c'est premier exe en C.
 
Est ce que vous pourriez juste me taper deux trois chtites remarques comme les erreurs a pas faire, les trucs que j'ai fais etc ..
 
Ce code est censé greper des mots ( qui sont contenues dans un fichier ) dans un répertoire et ses sous repertoires .. et de mettre le résultat dans un fichier resultat.txt
 
D'abord je tente de lire ma liste de mots pour construire un .bat qui éxécuté va remplir mon fichier resultat.txt
 
Je m'en sors pas du tout ..
 
Merci


Message édité par paranoidandroid le 18-06-2002 à 15:59:40
Reply

Marsh Posté le 18-06-2002 à 15:45:26   

Reply

Marsh Posté le 18-06-2002 à 16:23:32    

c surement un débordement mémoire.
quand tu fais un *scanf (ici, un fscanf), pour tes arguments (les derniers paramètres), tu doit mettre l'adresse, pas l'argument lui-même, donc tu vas plutot mettre :

Code :
  1. fscanf(fic, "%s", &temp);


ensuite, vas voir sur l'autre topic pour la lecture de fichier :
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
 
Essaye déja ça avant de te tuer !  :hello:


Message édité par El_gringo le 18-06-2002 à 16:24:13
Reply

Marsh Posté le 18-06-2002 à 16:28:36    

et puis, dans ton main, ça va pas du tout:

Code :
  1. void main(int argc, char *argv[])
  2.   {
  3.      argc = 3;
  4.      argv[1]="C:\\wrkcesar\\database\\list.txt
  5.     ";
  6.      argv[2]="C:\\wrkcesar\\database\\";
  7.    
  8.      if (argc != 3) help();
  9.        else
  10.      {
  11.          strcpy(input_f,argv[1]);
  12.          strcpy(path,argv[2]);
  13.          fRun(argv[1]);
  14.      }
  15.   }


 
T'utilises int argc et char *argv[] en écriture, j'aurais même pas pensé que ça pourrait compiler.
ces trucs, c fait pour récupérer les arguments que t'as passé à ton exe en ligne de comande. T'as pas à aller bricoler dedant. Pourquoi tu mets des valeurs dedant !? j'comprend pas ? c quoi ces : "C:\\wrkcesar\\database\\list.txt" et "C:\\wrkcesar\\database\\" ?

Reply

Marsh Posté le 18-06-2002 à 16:35:56    

el_gringo a écrit a écrit :

c surement un débordement mémoire.
quand tu fais un *scanf (ici, un fscanf), pour tes arguments (les derniers paramètres), tu doit mettre l'adresse, pas l'argument lui-même, donc tu vas plutot mettre :

Code :
  1. fscanf(fic, "%s", &temp);


ensuite, vas voir sur l'autre topic pour la lecture de fichier :
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
 
Essaye déja ça avant de te tuer !  :hello:  




 
Non c pas nécessaire, temp est déjà un pointeur vers une zone mémoire, par contre elle est peut être pas assez grande.


---------------
Le Tyran
Reply

Marsh Posté le 18-06-2002 à 16:39:17    

paranoidandroid a écrit a écrit :

 

Code :
  1. void main(int argc, char *argv[])
  2. {
  3. argc = 3;
  4. argv[1]="C:\\wrkcesar\\database\\list.t
  5. xt
  6. ";
  7. argv[2]="C:\\wrkcesar\\database\\";
  8. if (argc != 3) help();
  9. else
  10. {
  11.   strcpy(input_f,argv[1]);
  12.   strcpy(path,argv[2]);
  13.   fRun(argv[1]);
  14. }
  15. }
  16. void help(void)
  17. {
  18. printf("Correct syntax is :\n\tgreper <list.file> <search.path>" );
  19. exit(0);
  20. }





 :ouch:  
tu nous fais quoi la ??
argc et argv sont utilisés pour récupérer les paramètres passés en ligne de commande, t'as pas à y accéder en écriture !!!


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-06-2002 à 16:44:02    

el_gringo a écrit a écrit :

et puis, dans ton main, ça va pas du tout:

Code :
  1. void main(int argc, char *argv[])
  2.   {
  3.      argc = 3;
  4.      argv[1]="C:\\wrkcesar\\database\\list.txt
  5.     ";
  6.      argv[2]="C:\\wrkcesar\\database\\";
  7.    
  8.      if (argc != 3) help();
  9.        else
  10.      {
  11.          strcpy(input_f,argv[1]);
  12.          strcpy(path,argv[2]);
  13.          fRun(argv[1]);
  14.      }
  15.   }


 
T'utilises int argc et char *argv[] en écriture, j'aurais même pas pensé que ça pourrait compiler.
ces trucs, c fait pour récupérer les arguments que t'as passé à ton exe en ligne de comande. T'as pas à aller bricoler dedant. Pourquoi tu mets des valeurs dedant !? j'comprend pas ? c quoi ces : "C:\\wrkcesar\\database\\list.txt" et "C:\\wrkcesar\\database\\" ?  




 
Je bidouille dedans pour l'executer en mode débug ...
 
Avec VC++6 si je fais fais F5 je m'arrête des la fin du main ... Alors c'est pour le forcer a =entrer dans le read .. en quelque sorte ..

Reply

Marsh Posté le 18-06-2002 à 16:51:51    

Bah, avec VC++, tu vas dans les Setting de ton projet, onglet debug, le 3e champ de texte en partant du haut : "program arguments"
ici, tu mets C:\\wrkcesar\\database\\list.txt C:\\wrkcesar\\database\\
ça sera plus simple et vachement moins vilain !

Reply

Marsh Posté le 18-06-2002 à 16:53:23    

paranoidandroid a écrit a écrit :

 
 
Je bidouille dedans pour l'executer en mode débug ...
 
Avec VC++6 si je fais fais F5 je m'arrête des la fin du main ... Alors c'est pour le forcer a =entrer dans le read .. en quelque sorte ..  




Voui mais non !  ;)  
Déjà tu ne peux pas faire  

Code :
  1. mon_pointeur_de_caractère = "toto" ;


en C.  
Mais  

Code :
  1. strcpy(mon_pointeur_de_caractère,"toto" ) ;


 
Et encore, ce n'est pas suffisant : il faut que mon_pointeur_de_caractère définissent une zone mémoire libre de taille supérieure ou égale à ceux que tu veux y faire rentrer dedans.
argc et argv étant des variables réservées, je ne m'y risquerai même pas.


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 18-06-2002 à 17:02:21    

C est pas joli, joli  :heink:  :eek2:  
 
Mais le probleme principal c est que tout oubli la place pour le '\0' lorsque tu fais des malloc de chaine de caractère


---------------
WoIP - Video and Voice over IP -  http://www.woip.net/
Reply

Marsh Posté le 18-06-2002 à 17:45:21    

MrTonio a écrit a écrit :

C est pas joli, joli  :heink:  :eek2:  
 
Mais le probleme principal c est que tout oubli la place pour le '\0' lorsque tu fais des malloc de chaine de caractère  




 
Je sais que c'est pas beau ...
Je m'y recolle ce soir, que du c

Reply

Marsh Posté le 18-06-2002 à 17:45:21   

Reply

Marsh Posté le 18-06-2002 à 17:45:44    

el_gringo a écrit a écrit :

Bah, avec VC++, tu vas dans les Setting de ton projet, onglet debug, le 3e champ de texte en partant du haut : "program arguments"
ici, tu mets C:\\wrkcesar\\database\\list.txt C:\\wrkcesar\\database\\
ça sera plus simple et vachement moins vilain !  




Merci pour cette précision ...

Reply

Marsh Posté le 18-06-2002 à 20:57:22    

Y'a  pas une taille maximale lorsque on lit une ligne dans un fichier ... genre 256 je sais plus

Reply

Marsh Posté le 18-06-2002 à 21:11:20    

Loaded 'C:\WINNT\System32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found.
The thread 0x5C0 has exited with code 57 (0x39).
The program 'E:\BTS\pti\greper\Debug\grep.exe' has exited with code 57 (0x39).
 
:D j'ai tout compris ...

Reply

Sujets relatifs:

Leave a Replay

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