KAKURO

cs_uko Messages postés 12 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 18 décembre 2009 - 19 mai 2007 à 14:44
opeltaze Messages postés 2 Date d'inscription dimanche 15 avril 2012 Statut Membre Dernière intervention 20 avril 2012 - 20 avril 2012 à 23:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42733-kakuro

opeltaze Messages postés 2 Date d'inscription dimanche 15 avril 2012 Statut Membre Dernière intervention 20 avril 2012
20 avril 2012 à 23:04
Salut, à propos de ce programme, le problème c'est qu'il s’exécute mais pas correctement, s'il vous plais si vous pouvez m'aider je j'ai besoin de ce programme en masse ! aidez-moi !
cs_uko Messages postés 12 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 18 décembre 2009
27 mai 2007 à 22:38
J'étais allé trop vite la semaine dernière en répondant à CLMercutio. Merci pour cette précision.
thor_le_asgard Messages postés 2 Date d'inscription mercredi 23 mai 2007 Statut Membre Dernière intervention 26 mai 2007
26 mai 2007 à 20:08
"En attendant, les fonctions verifregle posent problème. Déjà, ligne 276 et 326, tu initialises la variable départ dans les for avec départ départ elle-même. Autrement dit, la variable de départ n'est jamais correctement initialisée car si tu n'entres pas dans ton if, depart n'est initialisée nulle part avec une valeur, ce qui donne un comportement aléatoire à cette fonction. De plus, si tu tentes de saisir une valeur à la ligne 0 et la colonne 0 de ta grille, les variables li et co ligne 268 et 318 valent -1 et j'obtiens un memory core dumped."

C'est normal et fait exprès. Dans tous les cas, on rentrera dans le if car si tu regarde un peu mieux le code, c'est fait de telle manière a ce que tu rentre dedans. Dans une autre fonction, je vérifie que quand je rentre une valeur en 0 0, ou dans une case noire, définition, que je sache pas mettre de valeur dedans !!

Voila bonne journée
Voila bonne journée
cs_uko Messages postés 12 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 18 décembre 2009
20 mai 2007 à 09:30
Bonjour Clmercutio,

Il faut que tu supprimes toute la partie entre la ligne 152 et 174 si tu veux que ton affichage fonctionne. Comme la taille de ta grille dépendra du fichier, tu devras donc avoir une fonction qui te donne la taille de ta grille avant de la charger puis faire ton malloc dans le main en fonction du résultat.

Bon courage pour la suite.
clmercutio Messages postés 12 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 5 août 2009
19 mai 2007 à 17:39
oki je te remercie, je cherche aussi de mon coté et je post si je trouve solution. Mais c'est vrai que le fait de passer le tableau de statique a dynamique pose des problèmes par rapport a mon premier code qui marchait pas mal.
cs_uko Messages postés 12 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 18 décembre 2009
19 mai 2007 à 17:27
J'essayerai de comprendre pourquoi et de t'aider plus si j'en ai le temps, car j'en ai très peu malheureusement. En attendant, les fonctions verifregle posent problème. Déjà, ligne 276 et 326, tu initialises la variable départ dans les for avec départ départ elle-même. Autrement dit, la variable de départ n'est jamais correctement initialisée car si tu n'entres pas dans ton if, depart n'est initialisée nulle part avec une valeur, ce qui donne un comportement aléatoire à cette fonction. De plus, si tu tentes de saisir une valeur à la ligne 0 et la colonne 0 de ta grille, les variables li et co ligne 268 et 318 valent -1 et j'obtiens un memory core dumped.
clmercutio Messages postés 12 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 5 août 2009
19 mai 2007 à 15:53
Après rectification de mon code, la grille s'affiche bien seul hic, c'est que les cases sont vides :(
clmercutio Messages postés 12 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 5 août 2009
19 mai 2007 à 15:43
En tout merci, ca m'enlève une epine du pied. Maintenant que je sais ce que je dois, je peux rectifier mon code en conséquence.
clmercutio Messages postés 12 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 5 août 2009
19 mai 2007 à 15:30
Je suis d'accord avec toi pour les #define mais si tu lis tout mon post, je dois recupére la longueur et la largeur du tableau en le lisant dans le fichier grille.
Donc ce n'est que temporaire et uniquement pour me permettre d'avoir le tableau et de continuer la suite de mon projet. Mais merci de ton aide. Aide que a mon avis je solliciterai encore. :)
cs_uko Messages postés 12 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 18 décembre 2009
19 mai 2007 à 14:44
Bonjour clmercutio, ton souci vient du fait que tu n'a pas réservé de mémoire pour ta grille dans main. Du coup, à la ligne 82, ton switch fait appel à des variables non allouées en mémoire et tu obtiens ton message d'erreur.

Il faut allouer par malloc de la place pour ton tableau de tableau d'élément puis pour chaque ligne :

int taille_tab = 0, i;
taille_tab = nx*ny;
tab = (element **) malloc(taille_tab * sizeof(element *));
if (tab == NULL)
{
printf("Erreur d'allocation mémoire pour initialiser la grille\n");
exit(EXIT_FAILURE);
}
for (i=0; i< ny; i++)
{
tab[i] = (element *) malloc(nx * sizeof(element));
}
init(tab);

NB : a la fin du main(), ne pas oublier de désallouer la mémoire

for(i=0; i< ny; i++)
{
free(tab[i]);
}
free(tab);

Sinon, juste un point parmi d'autres : vu que nx et ny ne servent que pour définir la taille de ta grille,
déclare les en début de programme par un #define (donc ce ne seront plus des variables qui coutent 4 octets chacune).

#define nx 9
#define ny 9

Retire ensuite dans les fonctions et les appels de fonction nx et ny. Tes fonctions en deviendront donc plus lisibles.

Vu que tu as déclaré stdlib, tu peux utiliser return EXIT_SUCCESS au lieu de return 0 (ca ne change pas grand chose, mais ça pourra être utile avec des outils comme un débugger par exemple qui le repère) et dans le même registre EXIT_FAILURE.

Evite les menu2, menu3, etc... Sur un plus gros projet, tu y perdras ton latin. Utilise plutôt menu_difficulte, menu_jeu, etc...

pour les commentaires, tu n'est pas obligé de faire /* et */ sur chaque ligne. Par exemple, pour les commentaires du menu init, tu aurais pu écrire

/* Explication de la fonction INIT
* Fonction servant a initialiser le tableau pour eviter des problemes d'allocation
* de valeur dans les cases, pouvant causer des erreurs
*/

NB : les * en début de ligne 2 et 3, c'est juste pour aligner le texte

Tu peux aussi utiliser // pour un commentaire sur une ligne.

Enfin, prends l'habitude de déclarer les fonctions locales saisies dans main en mode static, c'est pour éviter les problèmes de conflits de noms lorsque tu travailles avec plein de fichiers .c. Tu ajoutes static en début de fonction, c'est tout.

Voilà, bonne continuation. Désolé pour mon commentaire un peu long.
Rejoignez-nous