Se connecter / S'enregistrer
Votre question

Probleme avec mon programme en C !

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
5 Mai 2007 17:16:00

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

5 Mai 2007 18:26:00

tu veux l'ouvrir combien de fois le fichier que tu saisis ?

PS: ton code n'est pas ANSI :s
5 Mai 2007 18:28:17

Une seule fois ! d'où le booléen "ouvert" ^^,
Contenus similaires
5 Mai 2007 18:39:02

un boolean ne veut pas dire qu'on passe une seule fois ;) 
c'etait pour etre sur qu'il n'y a pas de confusion...

quelle est ta plate-forme ?
5 Mai 2007 18:50:58

je vois pas trop ce que tu veux savoir... AMD par ex ? :p 
5 Mai 2007 19:35:15

  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 ..
5 Mai 2007 20:02:34

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...
5 Mai 2007 20:51:40

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)
5 Mai 2007 21:28:06

Knail:au fait, ce que elendilm te montre, c'est déja du C++ (mot clés new, delete)...
5 Mai 2007 21:52:35

edit:
connerie (de ma part) ...


l'operateur new est juste une allocation de mémoire. tu pourrai aussi faire 1 malloc.

strictement, le C++ introduit la notion d'objet, de classe.
5 Mai 2007 22:01:15

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().
5 Mai 2007 22:49:10

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!
6 Mai 2007 01:09:30

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

6 Mai 2007 19:14:14

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 ?
11 Mai 2007 10:56:22

Bonjour, est-ce que quelqu'un pourrait me donner un exemple clair de l'utilisation de createprocess() car je n'arrive pas a l'utiliser...
12 Mai 2007 00:01:30

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 ^^,
a b L Programmation
12 Mai 2007 12:08:09

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).
12 Mai 2007 16:25:40

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 ?
12 Mai 2007 23:32:02

tu n'est pas obligé d'utiliser malloc() juste declare ta structure puis le tableau c'est pas aussi difficile que ca voici un exemple:
struct personne
{
char nom[10],pren[20];
int age;
};
struct personne p[20];
13 Mai 2007 02:58:48

Ok je vais essayer ! merci =)
13 Mai 2007 13:31:27

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 ?
13 Mai 2007 14:51:30

"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.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS