Se connecter avec
S'enregistrer | Connectez-vous

Probleme avec mon programme en C !

Dernière réponse : dans Programmation

Bonjour tout le monde, j'ai ecrit un petit programme tres simple mais malgrès cela j'ai quand meme une erreur a la fin de son execution ! C'est peut-etre un truc tout bete... je ne sais pas ! En tout cas je vous met le code et si vous pourriez voir vite fait le probleme sa serait cool =)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void) {
  5. FILE* fich;
  6. char* fichier;
  7. int ouvert=0, cpt=1;
  8. printf("Nom du fichier : ");
  9. scanf("%s", fichier);
  10. while ((ouvert==0) && (cpt<=5000000)) {
  11. fich=fopen(fichier,"r");
  12. if ((ouvert==0) && (fich!=NULL)) {
  13. system(fichier);
  14. ouvert=1;
  15. }
  16. if ((cpt==5000000) && (ouvert==0)) {
  17. printf("Fichier introuvable !");
  18. }
  19. cpt++;
  20. }
  21. fclose(fich);
  22. system("PAUSE");
  23. }


L'erreur c'est : "prog.exe a rencontré un probleme et doit fermé. Nous vous prions de nous ......." , alors que le programme est executé entierement, c'est vraiment a la fin qu'il me met ca !

PS : desole si le code est peu cochon ... je ne suis pas un pro en c lol et j'avais pas besoin de le pofiner c'est juste pour une utilisation unique ^^,

PS 2 : Si tout de meme vous avez des amelioration a apportées je suis prenant ! =)

Merci et bonne journée a tous !

Autres pages sur : probleme programme

Lassé par la pub ? Créez un compte

  1. #define true 1
  2. #define false 0
  3. int main(void) {
  4. FILE* fich;
  5. char* fichier= new char[255];
  6. int ouvert=0, cpt=1;
  7. printf("Nom du fichier : " );
  8. scanf("%s", fichier);
  9. while ( !ouvert && cpt<=5000000 )
  10. {
  11. fich=fopen(fichier,"r" );
  12. /* le test sur ouvert ne sert à rien car
  13. *dans la boucle
  14. *s'il est à true tu sort.
  15. */
  16. if ( fich!=(FILE *)NULL)
  17. {
  18. fclose(fich);
  19. system(fichier);
  20. ouvert=true;
  21. }
  22. cpt++;
  23. }
  24.  
  25. /*en l'occurence, le test de 5000000 est inutile.
  26. *si ton ouvert est à false, c'est que la boucle est
  27. *arrivée à son terme.
  28. *if ((cpt==5000000) && (ouvert==0))
  29. *{
  30. * printf("Fichier introuvable !\n" );
  31. *}
  32. */
  33. if (!ouvert)
  34. printf("fichier introuvable ..! \n");
  35.  
  36. delete fichier;
  37. system("PAUSE" );
  38. }


fait gaffe, si tu fais 1 fclose sur une variable NULL, tu aura 1 coredump ..

Ah je savais pas.... merci ! Bon j'ai pas tout compris dans ton programme mais merci quand meme ! Quelques questions :

la ligne :
  1. char* fichier= new char[255];

--> je ne vois pas a quoi sert le new char[255], enfin sa limite le nom a 255 caracteres c'est ca ? mais c'est pas vraiment utile si ?

  1. if ( fich!=(FILE *)NULL)

--> le (file *) il sert a quoi ?

  1. delete fichier;

--> "delete" je ne connais pas, ca fait quoi ?

Désolé pour toutes ces questions mais je débute en C...

pas de problème.
1:
Tu déclare une variable de type char * (fich).
tu fais 1 scanf dessus, ok. il vaut mieux apprendre à TOUJOURS initialiser les variables de type pointeur (char *) à une longueur suffisante...

Par exemple, tu déclare un char * ... ok, ce n'est qu' 1 pointeur sur une chaine de caractères.
En faisant un new dessus, tu annonces au systeme que la valeur fera 255 de longueur, la mémoire est réservée. Avec un scanf dessus, ca ne semble pas poser de problème, par contre, déclare ta variable juste avec ton char * et essaye de faire 1 sprintf dessus, tu verras le problème.

Donc toujours allouer de la mémoire pour tes pointeurs, et toujours libérer (le fameux delete) la mémoire quand tu n'en as plus besoin . Tu as surement entendu parler des fuites de mémoire (dans les failles de sécurité par exemple), ca arrive souvent quand des secteurs mémoires sont alloués avec une mauvaise taille, ou ne sont pas désalloués.

le (FILE *) est un cast. Tu demandes au système de bien vérifier que le NULL est bien un retour d'un fopen, c'est plus propre. En effet, le fopen te retourne un pointeur sur FILE (FILE *), donc, les conventions demandent de préciser quel type de données tu attends.
voilou :) 

Ps: ca marche avec ces modifs? (honnetement, vu la simplicité du code, j'ai meme pas cherché à le compiler...)


Enfin, passes directement du C au C++, c'est beaucoup plus pratique. programmation objet, utilisation de classes, API évoluées, tout ça avec une meme syntaxe, une meme base, et surtout, tu peux utiliser des fonctions C en c++ , pas vraiment directement le contraire. (change surtout de compilateur)
Expert Programmation

C'est sur! Quoique le compilateur lui laissera passer, il se tapera juste une segmentation fault à l'execution...
Et c'est probablement de là que vient le problème.

En remplaçant char* fichier; par char fichier[255]; ça marchera peut être mieux... Ou alors, faut faire un malloc().

Citation :

En remplaçant char* fichier; par char fichier[255]; ça marchera peut être mieux... Ou alors, faut faire un malloc().

+1, suite à mon edit !

faudrait que je vérifie si le compilateur C (strict) accepte le new :) 

Ps:
D'où la correction de son source!
Expert Programmation

http://www.cppreference.com/keywords/new.html
Ils disent:
Citation :
The new operator (valid only in C++) allocates a new chunk of memory

Pis j'ai essayé de compiler directement avec gcc un petit truc avec le mot clé new, il a pas voulu (par contre, avec g++ ça passe impec).
Il me semblait quand même que gcc acceptait de compiler du C++ tant que ça ressemblait suffisament à du C, mais faut croire que new, c'est déja trop pour lui...

Je suis d'accord qu'il est preferable d'apprendre le c++ que le C pour la prog objet, mais moi j'apprend le c en cours et pour la prog objet on fait du java.....

Sinon, un delete, c'est un free en C quoi ?

Merci, mais j'ai deja trouvé ce genre d'explications... et ca m'aide pas :/ 
Moi je voudrais une fonction ( peut-etre que c'est pas createprocess dont j'ai besoin... ) qui joue le meme role que fork() sous unix.
Ex :

  1. pid_t proc;
  2.  
  3. proc=fork();
  4. if (proc==0) {
  5. //mon code a executer par le processus fils
  6. }


Je sais pas si c'est assez clair ^^,
Expert Programmation

La création de processus ou thread est dépendant de l'OS et n'est pas inscrit dans la norme C ni C++.
fork() est la fonction pour un système POSIX. Pour windows (qui n'est pas POSIX), il faut gérer ça différemment avec le CreateProcess ou CreateThread (comme indiqué précédemment). Donc, le portage d'un code posix en code windows, n'est pas forcément évident.

Sinon, je vois que ça parle des operateurs new/delete et fonctions malloc/free.
new, c'est pour le C++, malloc c'est pour le C. Il n'y a pas de new pour le C ANSI (j'ai pas vérifié, mais ça n'existait pas pour le C).
En C++, on peut toujours utiliser malloc, mais attention, il ne faut jamais mélanger du "malloc" et du "new" dans un même source ! Pour simplifier, le code qui se cache derrière n'est pas tout à fait le même. Dans certains cas, ça peut faire crasher l'application, et c'est le genre de problème (avec les thread) qui sont difficiles à debuger ;) 

gcc compile un peu du C++, ça compile des classes, mais il ne faut pas trop le pousser (comme l'utilisation des templates). Il vaut mieux rester en C pur quand on fait du C (par souci de portabilité, voire maintenance).

ok merci ! Et c'est si compliqué que ca d'utiliser createprocess() comme dans le cas que j'ai mis dans mon dernier poste ?

Sinon j'ai un programme a faire, il me faudrais pouvoir creer un tableau de n structures, je crois qu'il me faut utiliser malloc(), seulement je comprend pas trop le principe, ma structure est composée de 2 chaine de 20 caracteres et d'un float, mais je vois pas trop comment reserver une place en memoire avec malloc() et que cette place puisse acceuillir le tableau... pouvez-vous m'aider ?

J'ai essayé cette solution, seulement sa me met "storage size of 'tab' isn't know" ... en faite moi je calcule le nombre de structures a mettre dans le tableau et ensuite je declare le tableau de la taille du nombre de structures que j'ai trouvé, donc ce n'est pas p[20] pour moi mais p[nbr], je pense que je n'est pas le choix, il me faut un malloc() non ? mais comment je fait pour declarer mon malloc() et y mettre un tableau de 'nbr' structures ?

"malloc
Cette fonction permet de réserver une zone de mémoire. Elle accepte, en paramètre le nombre d'octets désirés"
donc c'est un pas évident d'utiliser malloc mais tu peu déclarer un tableau p[100] puis quand tu calcule le nombre de structure tu peu affecter ce nombre à une variable puis tu utilise seulement le nombre de case qu tu as besion c'est un tableau statique .
ps: la declaration de variable ce fait au debut de programme.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde