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 =)
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 !
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE* fich;
char* fichier;
int ouvert=0, cpt=1;
printf("Nom du fichier : ");
scanf("%s", fichier);
while ((ouvert==0) && (cpt<=5000000)) {
fich=fopen(fichier,"r");
if ((ouvert==0) && (fich!=NULL)) {
system(fichier);
ouvert=1;
}
if ((cpt==5000000) && (ouvert==0)) {
printf("Fichier introuvable !");
}
cpt++;
}
fclose(fich);
system("PAUSE");
}
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
#define true 1
#define false 0
int main(void) {
FILE* fich;
char* fichier= new char[255];
int ouvert=0, cpt=1;
printf("Nom du fichier : " );
scanf("%s", fichier);
while ( !ouvert && cpt<=5000000 )
{
fich=fopen(fichier,"r" );
/* le test sur ouvert ne sert à rien car
*dans la boucle
*s'il est à true tu sort.
*/
if ( fich!=(FILE *)NULL)
{
fclose(fich);
system(fichier);
ouvert=true;
}
cpt++;
}
/*en l'occurence, le test de 5000000 est inutile.
*si ton ouvert est à false, c'est que la boucle est
*arrivée à son terme.
*if ((cpt==5000000) && (ouvert==0))
*{
* printf("Fichier introuvable !\n" );
*}
*/
if (!ouvert)
printf("fichier introuvable ..! \n");
delete fichier;
system("PAUSE" );
}
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 :
--> 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 ?
--> le (file *) il sert a quoi ?
--> "delete" je ne connais pas, ca fait quoi ?
Désolé pour toutes ces questions mais je débute en C...
la ligne :
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 ?
if ( fich!=(FILE *)NULL)
--> le (file *) il sert a quoi ?
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)
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)
http://www.cppreference.com/keywords/new.html
Ils disent:
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...
Ils disent:
Citation :
The new operator (valid only in C++) allocates a new chunk of memoryPis 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...
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 :
Je sais pas si c'est assez clair ^^,
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 :
pid_t proc;
proc=fork();
if (proc==0) {
//mon code a executer par le processus fils
}
Je sais pas si c'est assez clair ^^,
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).
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 ?
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.
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
- Contenus similaires :
Tags :
- ForumC lancer programme avec argument
- ForumC programme en cour d'execution
- ForumC est quoi un programme
- ForumC probleme malloc et free
- ForumC quoi un programme
- ForumC executer programme externe
- ForumC programme batch
- ForumC programme
- ForumC programme execute trop vite
- ForumC code lancer programme .exe
- Voir plus