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 =)
Code :
#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 ! =)
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)
Message édité par elendilm le 05-05-2007 à 20:54:45
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().
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.....
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 :
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 ?
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];
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.
Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois. Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.