Voir les messages
|
Pages: [1]
|
1
|
Challenges / Aide Hacking / Re : Hacking - Envoi d'email
|
le: 21 Février 2008 à 21:15:38
|
Bonjour à tous! Après avoir fais les modifications nécessaires en interne, je me retrouve coincé quant à l'exécution du script. J'ai bien essayé de chercher du côté des chemins relatifs et absolus (merci Folcan  ) mais je ne réussi tout de même pas à faire en sorte que la page s'exécute... Quelqu'un aurait-il une piste à me fournir, par MP ou ici, sur la démarche à suivre? Merci d'avance! Edurion
|
|
|
3
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 16 Février 2008 à 15:20:54
|
Non pas encore^^ Mais si tu me dis de le faire, c'est qu'il doit y avoir un intêret ^^
Il faudrait donc que je vérifie si celui-ci contient effectivement au moins un mot...
Je vais voir ça! Et puis je vais voir aussi pour nombreMot... Par contre, les messages que tu as la ne m'apparaissent pas du tout... Pourtant je suis bien en [-Wall] et -g...
|
|
|
4
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 16 Février 2008 à 15:10:10
|
Ok.. Mais ce que je comprends pas, c'est ce que mets le debugger: nombreAleatiore(nombreMot=0)
nombreMot n'ai pas égal à 0...
Pour le dico, je vais tout rassembler dans le mode un joueur.
Merci!
EDIT: Effectivement, tu vais raison... Le problème était bien lié au fichier... Il faudrait que j'aprenne à lire les debugger, parce que la je n'ai pas compris grand chose.. Comment savais-tu que le problème était lié à ça?
|
|
|
5
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 16 Février 2008 à 14:44:58
|
Merci encore pour ces réponses!
Le C n'a décidément pas fini de nous embêter!
Je vais faire comme tu m'as dis, poster mon code sur pastebin. Je pense aussi en parler à quelqu'un de ma famille qui est ingénieur informatique, on verra bien!
Bon, je vais essayer de résoudre tout ça!
Merci aussi pour la curiosité du getchar(), qui n'en ai surement pas une, je vais me renseigner car je crois que j'ai zappé quelque chose...
Sûrement à bientôt et bonne continuation à tous!
Edurion
|
|
|
6
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 15 Février 2008 à 16:18:46
|
Bonjour à tous!
Maintenant que le problème de lecture est résolu, alors que celui ne me faisait rien avant, je rencontre un problème avec le scanf du menu... J'étais au courant des différents inconvénients de scanf, c'est d'ailleurs pour ça que j'ai utilisé la fonction LireCaractere, et j'ai donc essayé avec d'autres fonction comme sscanf. J'ai même essayé scanf("%ld%*[^\n]"), mais rien n'y fait... Je cherche dons un moyen soit de remplacé scanf, soit de pouvoir vider le nombre en mémoire, et de recommencer la lecture du nombre entrée de manière propre. Pourriez-vous m'indiquez une piste?
Après avoir fait quelque test, ce n'est pas le scanf qui rencontre un problème, mais les appels aux fonctions... Je m'explique:
J'ai modifié mon code pour que le choix 3 lance une fonction ModeDAjout. Je lance donc mon programme. 1: Je choisi 1, le ModeUnJoueur (qui commence pas la fonction PiocherMot directement). Tout cela s'éxécute sans problème. 2: retour au menu: je refait 1, et la: "pendu.exe a rencontré une erreur et doit fermer..."
Je relance le programme: 1: ModeUnJoueur: sans problème 2: ModaDAjout; "pendu.exe a rencontré une erreur...."
Pareil si je fait deux fois ModeDAjout...
J'ai donc fait le test suivant: 1: MdeUnJoueur: pas de souci 2: l'option 2, le mode deux joueur, qui ne contient qu'un printf indiquant que le mode deux joueur n'est pas encore disponible, pas de problème...
C'est donc que lorsque j'appelle mes propres fonction, il y a un problème, même lorsque celles-ci n'ont pas étés utilisées la première fois... J'ai reegardé mes warnings, les ai tous résolus, rien à faire... Je ne comprends plus grand chose...Quelqu'un pourrait-il m'aider?
Au passage, quand j'ai essayé le scanf("%ld%*[^\n]"), suivi d'un getchar(), j'ai remarqué que le problème que je rencontrait avec la première lettre entrée qui ne marchait pas, était résolu?? O_o? Quelqu'un pourrait-il me dire pourquoi? je ne voit pas vraiment le rapport entre ce getchar() et le reste du code...
Merci d'avance!
Edurion
|
|
|
7
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 13 Février 2008 à 22:22:35
|
Pas de quoi. Je trouve que ça devient rare d'avoir un interlocuteur qui lit les réponses, les accepte et répond (qui plus est en français correct). D'autant que je m'attendais un peu à une réaction du genre «m'en tape de tes conneries, corrige moi mes bugs plutôt». Donc merci à toi aussi, tu me réconcilies un peu avec ce forum. Je te retourne le "pas de quoi"! Quand on réponds à ta question, la moindre des choses est quand même de l'écouter et d'en prendre compte! Pour Codes::Blocks, je me rappelai bien du -Wall, j'ai donc un peu farfouillé, et l'ai activé, mais il ne m'affichait rien de plus que d'habitude, c'est pour ça que j'ai demandé confirmation... Merci pour l'indice! Ce n'était pas prévu, mais je vais m'y remettre tout de suite! Enfin, merci, et bon courage à toi aussi ! Edurion P.S.: Merci aussi à Folcan! J'aurais du faire un peu plus attention 
|
|
|
8
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 13 Février 2008 à 15:03:34
|
Quand _o_ m'a dit que ma fonction main était trop grande, et que je devais faire plusieurs fonction, je me suis dit: fait plusieurs .c, sinon le main.c regorgera de fonction et on devra tout le temps faire des aller-retour pour lire le code... Je le ferais sur les prochaines versions!
Pour la tabulation, CodeBlocks est bien pour cela! Au moins, le code est clair et aéré!
Tes conseils seront pris en compte! Et du point de vue logique, maintenant, le code marche! La seule chose que je n'ai pas trouvée, c'est l'histoire du RechercheLettre qui ne marche jamais du premier coup... Mais je cherche, je cherche!
Par contre, _o_, pourrais-tu me donner le nom de ton compo? Je n'arrive pas à mettre CodeBlocks en full warning...
Merci d'avance!
|
|
|
9
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 13 Février 2008 à 10:27:15
|
Tout d'abord: MERCI!
Merci pour tous les conseils avisés que tu m'as donnés! Je les suivraient bien entendus!
Je vais de ce pas mettre mon compo en mode full warnings, et modifier un peu mon code! Pour la fonction main, le message est passé!
Tu viens aussi de me montrer qu'apprendre les bases de la programmation n'est pas seulement savoir utiliser les fonctions les plus employées, mais savoir programmer, tout simplement, avec les bons outils et de bonne rigueur. Et pour cela encore je te remercie!
Je reposterai le code final, de cette façon, vous pourrez me dire ce qu'il faut changer!
Sur ce, bonne continuation à tous!
Edurion
|
|
|
11
|
Programmation / Langages compilés / Re : [C] Problème avec un Pendu...
|
le: 12 Février 2008 à 20:56:33
|
Je vais répondre un par un à tes commentaires, qui, cela dit en passant, ne peuvent que m'aider à m'améliorer, et que donc je prendrai en compte. d'abord, je n'ai pas bien compris quel est ton problème. Tu cites des symptômes, mais ce serait intéressant que tu donnes des pistes pour les reproduire. Personnellement, je ne me sens pas (en ce moment), de jouer pendant une demi-heure avec le jeu pour tomber sur les problèmes. Un peu plus clairement: Le code est censé m'afficher les lettres trouvées (ou non) sous cette forme: ****E**R***T etc... Or, il ne m'affiche que des * ensuite, il manque deux ou trois petites choses dans ton explication. Par exemple le format du fichier dictionnaire. On doit pouvoir le retrouver en lisant le code, mais si tu donnais la spécification du fichier, ça pourrait montrer des bugs C'est un simple fichier *.txt ton code manque de structure et de commentaires. La fonction main est vraiment trop longue. Et on ne sait pas à quoi servent les autres fonctions et les variables en tout genre. Bien sûr, on peut le deviner, mais c'est du temps perdu, quelque part, étant donné que tu sais toi, à quoi elles servent. La fonction main est peut-être trop grande, mais as-tu p^ris en compte le switch? Et si oui, comment puis-je la réduire? Quant aux noms des fonctions, je pensent qu'ils sont assez éloquents... Tout comme le nom des variables... Par exemple: PiocherMot... ou lettreEntree... Je ne pense pas changer quoi que ce soit de ce point de vue. tu ne testes pas les codes retour, et ça c'est très mal. On le voit en particulier à l'ouverture du dictionnaire : il n'y a pas de traitement d'erreur. Pardonne moi, mais le traitement d'erreur est bien la... Dans la fonction PiocherMot, mais je suis d'accord, j'aurais du le mettre avant... e ne sais pas quel compilateur et quel système d'exploitation tu utilises, mais en l'occurrence, mon gcc configuré en Full warning (-Wall) crache pas mal d'injures (mais compile quand même). Méfiance, en général ces warnings reflètent des problèmes potentiels qui pourraient bien se finir en bug. En principe, on compile avec -Wall et on ne lance pas le bazar tant que tous les warnings n'ont pas disparu. Je "travail" avec CodeBlocks. Tous les messages qu'ils m'envoient sont de toute façon à corriger, puisque sinon ça ne marche pas... Cela explique aussi ta dernière remarque, puisque CodeBlocks inclue dirrectement une pause à la fin du programme... Enfin, je viens de corriger quelques trucs, notamment deux fclose inutiles, suite à la lecture d'un de tes posts ailleurs sur le forum, et si tu as des conseils pour l'optimisation, bien que cela ne soit pas une priorité (je dois finir le code assez vite..), je te promets qu'ils seront pris en compte! Ne serait-ce que dans les versions du pendu qui suivront, et qui permettront le jeu deux joueurs et l'ajout de mots. Sur ce, encore merci pour les conseils!
|
|
|
12
|
Programmation / Langages compilés / [C] Problème avec un Pendu...
|
le: 12 Février 2008 à 11:39:57
|
Bonjour à tous! Je vous explique rapidement mon problème: J'ai décidé, il y a déjà plusieurs semaines, de coder un pendu pour quelqu'un. Pas très intéressant, certes, mais je me suis dis qu'avant de me lancer dans l'algorythmique, les sockets et autres, je ferais bien de maitriser les bases. J'ai donc créé le jeu, sans gestion du dictionnaire, il marchait sans problème. Mais maintenant que cette dernière est arrivée, le programme rencontre un petit problème... Il y a plusieurs hypothèse, qui vous paraîtront évidentes avec le code sous les yeux, mais je vais déjà vous les donner: -Soit le programme n'affiche pas les lettres trouvées. -Soit il ne les reconnait pas (plus embêtant...) -Soit il ne lit pas la lettre entrée par l'utilisateur... (je n'ai pas utilisé de scanf) Le code n'est sûrement pas optimisé, mais pour l'instant, je m'interesse tout simplement à son bon fonctionnement. Je dois aussi préciser que certaines idées - notamment la non-utilisation du scanf - ne sont pas de moi, mais viennent du Site du Zero. Trêve de bavardage, et passons au code: /* Jeu du Pendu réalisé par Edurion Version numéro: 1.0 Gestion du dictionnaire incluse Copyright 2008 Toutes modification sans l'accord du dévellopeur est à proscrire */
#include <stdlib.h> #include <stdio.h> #include <time.h> #include <string.h> #include <ctype.h> #include <errno.h>
int PiocherMot(char *motPioche,FILE* dico); int nombreAleatoire(int nombreMot);
char LireCaractere(); int RechercheLettre(char lettreEntree, char motSecret[], int lettreTrouvee[]); void perror (const char *s); int main(int argc, char argv[]) { int choix, choix2, boucle, coupsRestant=11, i, arrete=0, gagne=0; char lettreEntree, motPioche; FILE* dico = NULL; dico = fopen("dico.txt", "r"); char motSecret[100]={0}; char* s=NULL; int lettreTrouvee[100]={0}; int nombreLettre=0;
do {
printf("\n -=-=-=-=-=-Bienvenue sur le Pendu!-=-=-=-=-=-\n"); printf("\n\n -=} 1 - Demarrer le jeu (1J){=-"); printf("\n -=} 2 - Demarrer le jeu (2J & +) {=-"); printf("\n -=} 3 - Rajouter un mot dans le dictionnaire {=-"); printf("\n -=} 4 - Quitter {=-\n"); scanf("%ld", &choix);
switch (choix) { case 1: perror(s);
if(PiocherMot(motSecret, dico)==0) { boucle=0; perror(s); } else { printf(" --=Vous avez choisi le mode 1 joueur=--!\n\n"); nombreLettre = strlen(motSecret); printf("Le mot a trouver est un mot de %ld lettres!\n", nombreLettre);
coupsRestant=11; arrete=0; int lettreTrouvee[100]={0}; gagne=0;
do { if(gagne==1) { printf("Bravo! Vous avez gagne!\n"); printf("Le mot a trouver etait bien %s !\n\n", motSecret); fclose(dico); arrete=1; } else if(coupsRestant==0) { //Code de la défaite printf("Desole, vous avez perdu!\n"); fclose(dico); arrete=1; } else { for(i=0; motSecret[i] != '\0'; i++) { if(lettreTrouvee[i]) { printf("%c", motSecret[i]); } else { printf("*"); } } printf("\nIl vous reste %ld coups a jouer!\nProposez une lettre...", coupsRestant); lettreEntree = LireCaractere(); if(!RechercheLettre(lettreEntree, motSecret, lettreTrouvee)) { coupsRestant--; }
printf("\n\n\n\n"); for(i=0; motSecret[i] != '\0'; i++) { gagne=0; if(lettreTrouvee[i] == 1) { gagne++; } else { gagne--; } } if(gagne==nombreLettre) { gagne=1; } else { gagne=0; } } }while(arrete==0); fclose(dico); printf("Voulez-vous refaire une partie?\n"); printf("1 - Oui\n2 - Non\n"); scanf("%ld", &boucle); } break; case 2: //Code 2 joueur printf("pas encore"); boucle=1; break; case 3: //Mode d'ajout printf("pâtience"); boucle=1; break; case 4: printf("\n\n\n\t\a Voulez-vous vraiment quitter?\n\n"); printf("1 - Oui\n2 - Non\n"); scanf("%ld", &choix2);
if(choix2==1) { boucle=0; } else { boucle = 1; } break; } }while(boucle==1);
return 0;
}
int RechercheLettre(char lettreEntree, char motSecret[], int lettreTrouvee[]) { int i=0; int bonneLettre = 0; for(i=0; motSecret[i] != '\0'; i++) { if(lettreEntree == motSecret[i]) { bonneLettre = 1; lettreTrouvee[i]=1; } } return bonneLettre; }
char LireCaractere() { char caractere = 0;
caractere = getchar(); // On lit le premier caractère caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
// On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer) while (getchar() != '\n') ;
return caractere; // On retourne le premier caractère qu'on a lu
}
int nombreAleatoire(int nombreMot) { srand(time(NULL)); return (rand() % nombreMot); }
int PiocherMot(char motSecret[],FILE* dico) { int caractereLu=0, nombreMot=0, numeroMotChoisi=0; if(dico==NULL) { printf("Le fichier du dictionnaire n'a pas pu etre charge..."); return 0; }
do { caractereLu=fgetc(dico); if(caractereLu == '\n') { nombreMot++; } }while(caractereLu != EOF);
numeroMotChoisi = nombreAleatoire(nombreMot);
rewind(dico); while(numeroMotChoisi > 0) { caractereLu = fgetc(dico); if(caractereLu == '\n') { numeroMotChoisi--; } } fgets(motSecret, 100, dico); motSecret[strlen(motSecret) - 1] = '\0'; return 1; }
Voila! Vous remarquerez que seuls le mode 1 joueur est disponible, les autres découlant du premier, je les rajouterais après sans problème, je pense. Je vous rappelle une dernière fois que mon but n'est pas, pour l'instant, d'optimiser mon code et de le simplifier, sauf si bien sur cela est nécessaire à son fonctionnement! Dans tous les cas, je vous remercie d'avance pour l'attention que vous porterez à mon message, et vous souhaite une excellente semaine! Edurion P.S.: Je viens de le voir en prévisualisation, mais ne prêtez pas attention aux quelques perror, c'était juste pour essayer de cerner le problème... Pour info: Ils renvient tous "no error"
|
|
|
|