Liste et sous programme
Résolu
evilfalcon
Messages postés
76
Statut
Membre
-
evilfalcon Messages postés 76 Statut Membre -
evilfalcon Messages postés 76 Statut Membre -
Bonjour,
Je suis en train de programmer une liste quadruplement chainé et après plusieurs heures de travail, j'ai obtenue un résultat satisfaisant.
Par contre, je dois maintenant intégrer ma liste dans mon programme principale. Rien de bien compliquer, je rajoute un .h, je change les noms et créer les variables...
Une fois fini, je compile le tous (en me disant enfin fini), j'obtiens le messages d'erreur:
error: unknown type name 'lliste'.
Bon je me dis que c'est rien, juste besoin de définir la liste dans le .h. Aussitôt dis aussi fait. Je compile et paf belote et re, nouvelle erreur:
error: redifinition of 'struct element' (pour le .h avec la petit note originally defined here désignant ma partie de configuration de ma liste dans le main).
Et là, je ne vois plus trop quoi faire, je dois la définir ou pas??? je suis un peu perdu, si quelqu'un pouvait m'aider ou m'explication ce qui se passe car la je ne trouve pas.
Je vous rajoute mon programme:
le main
le .h (liste_map.h)
le programme liste_map:
Je vous remercie par avance.
Cordialement
Je suis en train de programmer une liste quadruplement chainé et après plusieurs heures de travail, j'ai obtenue un résultat satisfaisant.
Par contre, je dois maintenant intégrer ma liste dans mon programme principale. Rien de bien compliquer, je rajoute un .h, je change les noms et créer les variables...
Une fois fini, je compile le tous (en me disant enfin fini), j'obtiens le messages d'erreur:
error: unknown type name 'lliste'.
Bon je me dis que c'est rien, juste besoin de définir la liste dans le .h. Aussitôt dis aussi fait. Je compile et paf belote et re, nouvelle erreur:
error: redifinition of 'struct element' (pour le .h avec la petit note originally defined here désignant ma partie de configuration de ma liste dans le main).
Et là, je ne vois plus trop quoi faire, je dois la définir ou pas??? je suis un peu perdu, si quelqu'un pouvait m'aider ou m'explication ce qui se passe car la je ne trouve pas.
Je vous rajoute mon programme:
le main
#ifdef _WIN32
#include <windows.h>
#include <conio.h>
#endif
#include <stdio.h>
#include "ouverture_carte.h"
#include "generateur_carte.h"
#include "liste_map.h" // fonction utilisant la liste
#define MAX 13
/*********** Generation Liste chainee ********************/
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;
};
typedef element *Lliste;
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]);
int main()
{
int x,y; // position joueur
int touche;
char laby[MAX][MAX];
int nb_fichier = 1;
int lvl = 1;
Lliste carte = NULL;
generateur_carte(lvl);
carte = liste_map(carte, lvl);
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))
{
nb_fichier = 1;
x = 6;
y = 11;
touche = 27;
}
if ((x == 6) && (y == 12))
{
nb_fichier = 2;
y = 1;
x = 6;
touche = 27;
}
if ((x == 0) && (y == 6))
{
nb_fichier = 3;
y = 6;
x = 11;
touche = 27;
}
if ((x == 12) && (y == 6))
{
nb_fichier = 4;
y = 6;
x = 1;
touche = 27;
}
}
}
return 0;
}
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;
}
le .h (liste_map.h)
/*********** Generation Liste chainee ********************/
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;
};
typedef element *Lliste;
#ifndef LISTE_MAP_H_INCLUDED
#define LISTE_MAP_H_INCLUDED
Lliste liste_map(Lliste carte, int lvl);
#endif // LISTE_MAP_H_INCLUDED
le programme liste_map:
#include <stdio.h>
#include <stdlib.h>
/*********** Generation Liste chainee ********************/
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;
};
typedef element *Lliste;
/******************** AJOUTER EN TETE ********************/
/** OK **/
/*********************************************************/
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;
}
/****************** AJOUTER EST OUEST ********************/
/** LISTE DOUBLEMENT CHAINEE **/
/*********************************************************/
Lliste liste_est_ouest(Lliste liste)
{
element* tmp = liste;
element* ptmp = NULL;
element* pptmp = liste;
if (liste == NULL)
{
return NULL;
}
else
{
while(tmp -> svt_ouest!= NULL)
{
ptmp = tmp;
tmp = tmp -> svt_ouest;
if (ptmp != NULL)
{
tmp -> svt_est = ptmp;
}
}
tmp -> svt_ouest = pptmp;
pptmp -> svt_est = tmp;
return liste;
}
}
Lliste liste_nord_sud(Lliste liste, int lvl)
{
element* tmp = liste;
element* ptmp = liste;
element* pptmp = liste;
int affichage = liste ->info_affichage;
int affichage_compare = affichage;
affichage++;
int i = 0;
int j = 0;
if (liste == NULL)
{
return NULL;
}
else
{
for (i = 0; i<(lvl);i++)
{
ptmp = ptmp -> svt_est;
pptmp = pptmp -> svt_ouest;
}
for(i = 0 ;i<(lvl*lvl);i++ )
{
tmp -> svt_sud = ptmp;
ptmp = ptmp -> svt_est;
tmp ->svt_nord = pptmp;
pptmp = pptmp -> svt_est;
tmp -> info_affichage = 0;
tmp = tmp -> svt_est;
}
return liste;
}
}
Lliste bord_ouest_est(Lliste liste, int lvl)
{
element* tmp = liste;
element* ptmp = liste;
tmp = tmp -> svt_est;
ptmp = ptmp -> svt_est;
int i = 0;
int j = 0;
for (i = 0; i<lvl-1; i++)
{
tmp = tmp -> svt_est;
}
for (i = 0; i< lvl; i++)
{
tmp -> svt_est = ptmp;
ptmp -> svt_ouest = tmp;
tmp = tmp -> svt_sud;
ptmp = ptmp -> svt_sud;
}
return liste;
}
/******************** AFFICHER LISTE *********************/
/** OK **/
/*********************************************************/
void affichier_total(Lliste liste, int lvl)
{
int i,j;
element* tmp = liste;
i = j = 0;
tmp = tmp -> svt_est;
for (i=0; i<lvl;i++)
{
for (j = 0; j<lvl ;j++)
{
printf("%d", tmp -> numero_map);
printf("%d ",tmp -> info_map);
printf("ad %d, est %d, ouest %d, sud %d, nord %d\n",tmp, tmp -> svt_est, tmp -> svt_ouest,tmp -> svt_sud,tmp -> svt_nord);
tmp = tmp -> svt_est;
}
printf("%d", tmp -> numero_map);
printf("%d ",tmp -> info_map);
printf("ad %d, est %d, ouest %d, sud %d, nord %d\n",tmp, tmp -> svt_est, tmp -> svt_ouest,tmp -> svt_sud,tmp -> svt_nord);
printf("\n");
tmp = tmp -> svt_sud;
}
printf("\n\n");
for (i=0; i<lvl;i++)
{
for (j = 0; j<lvl ;j++)
{
printf("%d", tmp -> numero_map);
printf("%d ",tmp -> info_map);
tmp = tmp -> svt_est;
}
printf("\n");
tmp = tmp -> svt_sud;
}
}
Lliste liste_map(Lliste carte, int lvl)
{
//Lliste carte = NULL;
//int lvl = 1*2+1;
char caractereActuel;
int multiple = 1000;
int memo1, memo2;
memo2 = memo1 = 0;
FILE *fichier = NULL;
fichier = fopen("map.txt", "r+");
if (fichier != NULL)
{
do
{
caractereActuel = fgetc(fichier);
//printf("%d ",caractereActuel);
if (caractereActuel == 32)
{
carte = crea_map(NULL, carte, NULL, NULL, memo2, memo1-48);
//printf("%d%d ",memo2, memo1-48);
memo2 = 0;
memo1 = 0;
multiple = 1000;
}
if ((memo1>=48 )&&(memo1 <= 58))
{
memo2 = memo2 + (memo1-48)*multiple;
multiple = multiple / 10;
}
memo1 = caractereActuel;
} while (caractereActuel != EOF);
fclose(fichier);
}
else
{
printf("\n Impossible d'ouvrir le fichier test.txt\n");
}
carte = liste_est_ouest(carte);
carte = liste_nord_sud(carte,lvl);
carte = bord_ouest_est(carte,lvl);
return carte;
}
Je vous remercie par avance.
Cordialement
A voir également:
- Liste et sous programme
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Programme demarrage windows - Guide
- Liste déroulante en cascade - 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;
}
#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 #define MAX 13 /*********** Generation Liste chainee ********************/ 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; }; typedef element *Lliste; 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]); int main() { ... }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.
#include <stdio.h> #include <stdlib.h> /*********** Generation Liste chainee ********************/ /*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; }; typedef element *Lliste;*/ #ifndef LISTE_MAP_H_INCLUDED #define LISTE_MAP_H_INCLUDED Lliste liste_map(Lliste carte, int lvl); #endif // LISTE_MAP_H_INCLUDED<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.
#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 #define MAX 13 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); int main() { int x,y; // position joueur int touche; char laby[MAX][MAX]; int nb_fichier = 1; int lvl = 3; 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\n\n\n"); afficher_ouest_est(carte); ... }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