Liste et sous programme
Résolu
evilfalcon
Messages postés
58
Date d'inscription
Statut
Membre
Dernière intervention
-
evilfalcon Messages postés 58 Date d'inscription Statut Membre Dernière intervention -
evilfalcon Messages postés 58 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Liste et sous programme
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Programme demarrage windows - Guide
- Comment mettre en veille un programme sous windows 10 - Guide
3 réponses
Salut,
Sans vouloir rentrer en profondeur, essaye dejà de faire ceci dans le main:
ce qui est étonnant c'est que le liste_map cpp n'inclue pas son .h qui devrait être celui qui ajoute les
.... bon je suis sûrement un peu rouillé ^^
naga
[EDIT] ah, et pourquoi redefinir ta structure dans ton fichier contenant le main ?/EDIT
Sans vouloir rentrer en profondeur, essaye dejà de faire ceci dans le main:
#ifndef LISTE_MAP_H_INCLUDED
#include "liste_map.h"
#endif
ce qui est étonnant c'est que le liste_map cpp n'inclue pas son .h qui devrait être celui qui ajoute les
#include <stdio.h>
#include <stdlib.h>
.... bon je suis sûrement un peu rouillé ^^
naga
[EDIT] ah, et pourquoi redefinir ta structure dans ton fichier contenant le main ?/EDIT
la fonction créa_map:
Lliste crea_map( Lliste liste1, Lliste liste2, Lliste liste3, Lliste liste4, int numero_map, int info_map) { element* nouvelleElement = malloc(sizeof(element)); nouvelleElement -> numero_map = numero_map; nouvelleElement -> info_map = info_map; nouvelleElement -> info_affichage = 0; nouvelleElement -> svt_est = liste1; nouvelleElement -> svt_ouest = liste2; nouvelleElement -> svt_nord = liste3; nouvelleElement -> svt_sud = liste4; return nouvelleElement; }
Voila comment j'ai réfléchie ma fonction:
Etat 0: crea_map reçoit que des NULL mais renvoie une adresse.
Etat 1: crea_map reçoit 3 NULL et une adresse qui l'élément actuelle avec le précédent.
ensuite j'ai 3 autre fonctions pour liée chaque élément avec 3 autre éléments.
oui oui c'est juste que je ne comprends pas c'est le fait de faire :
ca serait plus simple de faire directement :
Mais ce n'est pas un point important ^^ Par contre je ne vois pas de definition pour "generateur_carte" (
Je pense que la première chose a faire pour toi est de ne faire dans un premiers temps qu'un fichier :
Une fois que c'est fait et que ca fonctionne, refais seulement un .h qui contiendra :
- Les includes
- la structure
- L'objet
Ensuite ton main ne contiendra que les l'include de ce .h +fonction+main
(pas besoin de redefinir de structure ou reinclure des bibliotheques -> on recupere le tout du .h)
A mon avis le problème vient du decoupage de ton contenu ( dans ton öain tu redefinis ta structure, ton type et des methodes alors qu'il n y a surtout pas lieu => ca ecrase les precedentes ). En fait il faut que tu te dise que lorsque tu inclu un autre fichier, c'est comme si tu travaillais sur un seul => le fichier que tu inclus s'ajoutera au niveau de la balise #include.
Et donc ceci :
Juste une question con : pourquoi le c et pas le c++ ? avec des classes ca serai plus propre ^^
naga
Lliste carte = NULL;
generateur_carte(lvl);
carte = liste_map(carte, lvl);
ca serait plus simple de faire directement :
generateur_carte(lvl);
Lliste carte = liste_map(NULL, lvl);
Mais ce n'est pas un point important ^^ Par contre je ne vois pas de definition pour "generateur_carte" (
generateur_carte(lvl)), c'est pour ca que je demandais ton code complet ^^ quel est son rôle ?
Je pense que la première chose a faire pour toi est de ne faire dans un premiers temps qu'un fichier :
//-------------INCLUDES--------------//
/***** ici on met les include de base ->iostream etc. *****/
//-------------STRUCTURES---------//
/***** ici tu definis ta structure *******/
//-------------OBJET LISTE----------//
/***** la tu defini ton objet ******/
//-------------FONCTION OBJET---//
/***** ici tu defini les fonctions *****/
//-------------MAIN--------------------//
/**** et donc le main *****/
Une fois que c'est fait et que ca fonctionne, refais seulement un .h qui contiendra :
- Les includes
- la structure
- L'objet
Ensuite ton main ne contiendra que les l'include de ce .h +fonction+main
(pas besoin de redefinir de structure ou reinclure des bibliotheques -> on recupere le tout du .h)
A mon avis le problème vient du decoupage de ton contenu ( dans ton öain tu redefinis ta structure, ton type et des methodes alors qu'il n y a surtout pas lieu => ca ecrase les precedentes ). En fait il faut que tu te dise que lorsque tu inclu un autre fichier, c'est comme si tu travaillais sur un seul => le fichier que tu inclus s'ajoutera au niveau de la balise #include.
Et donc ceci :
Juste une question con : pourquoi le c et pas le c++ ? avec des classes ca serai plus propre ^^
naga
Il y a certains points aussi qui te poseront surement problèmes. Je prends le premier que j'ai sous les yeux : (elle apparait plusieurs fois, plus ou moins identiques)
en fait ici tu crée 3 pointeurs qui pointent tous sur le même élément, ce qui risque de te poser problème assez vite (surtout que tu les lies entre eux ensuite) ... bref tu risques de te marcher sur les pieds ... mais ce n est pas encore d actualité ^^
Lliste liste_nord_sud(Lliste liste, int lvl)
{
element* tmp = liste;
element* ptmp = liste;
element* pptmp = liste;
.
.
.
}
en fait ici tu crée 3 pointeurs qui pointent tous sur le même élément, ce qui risque de te poser problème assez vite (surtout que tu les lies entre eux ensuite) ... bref tu risques de te marcher sur les pieds ... mais ce n est pas encore d actualité ^^
C'est bon! Ca fonctionne! Mais je ne sais pas pourquoi! et ni comment!
J'ai juste restructuré mon main!
MAIN
J'ai juste restructuré mon main!
MAIN
/********************** CONSTANTE *******************/ #define MAX 13 /********************** INCLUDES ******************/ #ifdef _WIN32 #include <windows.h> #include <conio.h> #endif #include <stdio.h> #include "ouverture_carte.h" #include "generateur_carte.h" //#include "liste_map.h" #ifndef LISTE_MAP_H_INCLUDED #include "liste_map.h" #endif /********************** STRUCTURES *****************/ /*typedef struct element element; struct element { int numero_map; int info_map; int info_affichage; struct element *svt_nord; struct element *svt_sud; struct element *svt_est; struct element *svt_ouest; };*/ /********************** OBJET LISTE ****************/ //typedef element *Lliste; /********************* FONCTION OBJET **************/ int MyGetch(); void Locate(int x,int y); void Afficher(int x,int y, char laby[MAX][MAX]); void TryMove(int* x,int* y,int vx,int vy, char laby[MAX][MAX]); void affichier_total(Lliste liste, int lvl); /********************* FONCTION MAIN **************/ int main() { int x,y; // position joueur int touche; char laby[MAX][MAX]; int nb_fichier = 1; int lvl = 5; Lliste carte = NULL; generateur_carte(lvl); carte = liste_map(carte, lvl); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); afficher_la_carte(carte, lvl); //printf("%d",carte); x = 6; y = 1; touche = 0; while(1) { touche = 0; ouverture_fichier(laby, nb_fichier); while(touche!=27) // ECHAP { //touche = MyGetch(); printf(" %d, %d, %c",x,y,nb_fichier); Afficher(x,y,laby); touche = MyGetch(); switch(touche) { case 'q': TryMove(&x,&y,0,-1,laby); break; case 'd': TryMove(&x,&y,0,1,laby); break; case 'z': TryMove(&x,&y,-1,0,laby); break; case 's': TryMove(&x,&y,1,0,laby); break; default: break; } if ((y == 0) && (x == 6)) { carte = carte -> svt_ouest; nb_fichier = carte -> numero_map; x = 6; y = 11; touche = 27; } if ((x == 6) && (y == 12)) { carte = carte -> svt_est; nb_fichier = carte -> numero_map; y = 1; x = 6; touche = 27; } if ((x == 0) && (y == 6)) { carte = carte -> svt_nord; nb_fichier = carte -> numero_map; y = 6; x = 11; touche = 27; } if ((x == 12) && (y == 6)) { carte = carte -> svt_sud; nb_fichier = carte -> numero_map; y = 6; x = 1; touche = 27; } } } return 0; } /********************* FONCTION OBJET SCRIPT **************/ int MyGetch() { #ifdef _WIN32 return getch(); #endif // trouver alternative hors Windows. } void Locate(int x,int y) { #ifdef _WIN32 HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE); COORD C; C.X=(SHORT)x; C.Y=(SHORT)y; SetConsoleCursorPosition(H,C); #endif // trouver alternative hors Windows. } void Afficher(int x,int y, char laby[MAX][MAX]) { int i,j; Locate(0,0); for(i=0;i<MAX;i++) { for(j=0;j<MAX;j++) { if (i==x && j==y) printf("p"); else printf("%c",laby[i][j]); } printf("\n"); } } void TryMove(int* x,int* y,int vx,int vy, char laby[MAX][MAX]) { if (laby[*x+vx][*y+vy]=='*') return; (*x)+=vx; (*y)+=vy; }
j'obtiens l'erreur: unknow type name 'lliste'.
si je rajoute la structure de la liste même erreur qu'avant déjà définie ailleurs.
et avec les deux bibiliothéques stdio et stdlib dans liste_map.h ça change rien.
<citation>ah, et pourquoi redéfinir ta structure dans ton fichier contenant le main ?</citation>
Il me reste encore quelque ligne de code à écrire qui vont utiliser la liste dans le main. Je configure juste ma liste dans un sous programme.
j'ai enlevé la définition de la liste dans le main, et je l'ai laissé dans liste_map.h. Maintenant le programme ce compile mais il plante sur l'affichage de la liste. Pourtant, si je demande de l'afficher dans liste_map.c pas de soucis alors que dans le main c'est la bérézina.
Tu définit aussi ta structure mais aussi (et surtout Lliste) dans le h et dans le cpp. Null besoin (ca risque de creer justement une erreur).
Ensuite j ai un peu peur que tu ai quelques manques de connaissances vis à vis de la portée des variables et des pointeurs.
Par exemple, la ligne
Avec les pointeurs, tu n as pas besoin de retourner en valeur de retour OU il n y a qu'un retour et dans ce cas pas de parametre a passer...
Ce qui est étonnant aussi, c'est que tu créé ce "carte" a null, que tu le passe en paramètre pour enfin faire :
et donc faire la meme chose que :
Enfin, tu utilise la fonction "generateur_carte" que je ne connais pas (pas dans ton cpp ou h).
Je pense qu'il y a 2/3 choses à voir avant que je te donne vraiment une réponse. Peux tu me donner le code complet que tu utilise actuellement ? J essaye de voir ca cet aprem.
Naga