probleme d'affichage selectif
Bonjour à tous, je fais un programme avec un gestionnaire de messge. Les opérations qu'on peut y effectuer: initialiser, ajouter des messages afficher.
l'affichage peut être total ou selectif c'est à dire afficher les messages qui ne le sont pas encore affichés.
L'interface du module est le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| struct etMsg {
char *psMsg;
int dDisplay;
};
typedef struct {
struct etMsg *pstTabMsg;
int dCurPos;
int dNbrBloc;
} GMESSAGE ;
//Prototypes des fonctions:
void gmInit (GMESSAGE *pGM, int *pRC);
void gmReInit (GMESSAGE *pGMsg, int *pRC);
void gmAdd (GMESSAGE *pGM, char *pMsg, int *pRC);
void gmDisplay (GMESSAGE *pGMsg, int *pRC);
void gmDisplaySelectif (GMESSAGE *pGMsg, int *pRC); |
code ma fonctions d'initialisation
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void gmInit (GMESSAGE *pGMsg, int *pRC)
{
//-----------------------------------------------
//création du tableau de structure par 1 malloc
//et gestion des erreurs
//initilalisation de la position courante
//initilalisation du nombre de blocs
//-----------------------------------------------
pGMsg->pstTabMsg = (struct etMsg *)malloc(sizeof(struct etMsg)* TAILLE_BLOC);
//pGMsg->pstTabMsg <==> (*pGMsg) . pstTabMsg
if(pGMsg->pstTabMsg == NULL)
{
printf("Erreur allocation memoire");
*pRC = GM_ERROR;
return;
}
pGMsg->dCurPos = 0;
pGMsg->dNbrBloc = 1;
} |
code fonction d'insertion
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
//*********************************************************************
//FONCTION D'INSERTION DE MESSAGE DANS LE GESTIONNAIRE DE MESSAGE
//Description : Cette fonction ajoute un nouveau message dans le
//gestionnaire de messages.
//Pré-condition : le gestionnaire de messages doit avoir été initialisé
//**********************************************************************
void gmAdd(GMESSAGE *pGMsg, char *pMsg, int *pRC)
{
int dLong;
//-----------------------------------------------------------
//si PosCur depasse la taille du bloc faire une réallocation
//-----------------------------------------------------------
if(pGMsg->dCurPos >= TAILLE_BLOC * pGMsg->dNbrBloc )//-> prioritire à *
{
pGMsg->dNbrBloc++;
pGMsg->pstTabMsg = (struct etMsg *)realloc(pGMsg->pstTabMsg, sizeof(struct etMsg) * pGMsg->dNbrBloc * TAILLE_BLOC);
if(pGMsg->pstTabMsg == NULL)
{
printf("Erreur reallocation \n ");
*pRC = GM_ERROR_REALLOC;
return;
}
}
//--------------------------------------------------------
//calcul de la longueur du message reçu en paramètre
//création du tableau pour ce message et gestion d'erreurs
//copie du messge
//initialisation du display pour le message
//incrémentation de la position courante
//--------------------------------------------------------
dLong = strlen(pMsg);
pGMsg->pstTabMsg[pGMsg->dCurPos].psMsg = (char * )malloc(sizeof(char) * (dLong + 1));
if(pGMsg->pstTabMsg[pGMsg->dCurPos].psMsg == NULL)
{
printf("Erreur alocation memoire message\n ");
*pRC = GM_ERROR_ALLOC;
return;
}
strcpy(pGMsg->pstTabMsg[pGMsg->dCurPos].psMsg, pMsg);
pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay = 0;
(pGMsg->dCurPos)++;
} |
code fonction affichage total:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void gmDisplay (GMESSAGE *pGMsg, int *pRC)
{
int dI;
for(dI = 0; dI < pGMsg->dCurPos; dI++)
printf("Message %d = %s\n", dI, pGMsg->pstTabMsg[dI].psMsg);
*pRC = GM_OK;
pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay = 1;
return;
} |
mais j'ai des problémes avec la fonction d'affichage selectif
voici ce que j'ai fait
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void gmDisplaySelectif(GMESSAGE *pGMsg, int *pRC)
{
int dI;//indice de parcours du tableau
//dI = pGMsg->dCurPos;
if(pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay !=0)
for(dI = pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay; dI < pGMsg->dCurPos; dI++)
printf("Message %d: %s\n", dI, pGMsg->pstTabMsg->psMsg[dI]);
pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay = 1;
*pRC = GM_OK;
return;
} |
Dans le main, je dois faire un menu et l'utlisateur peut par exemple choisir le gestionnaire de message qu'il veut et y effectuer les opérations qu'il désire.
voila le main qui a plein d'erreurs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include"PRJ35FONC.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{
int dRC;
char tsMsg[100];
char cRep;
char cGM_Choice;
char cGM_Action;
GMESSAGE tyGestError;
GMESSAGE tyGestInfo;
//ALGORITHME:
//Initilaiser le gestionnaire de message
//si ereur_initit stopper le programme et afficher 1 message d'erreur
//Voulez-vous introduire 1 message?
//Lire Rep
//Tant que Rep!= Non
// lire le message et le mémoriser dans le gestionnaire de messages
// si erreur_mémorisation stopper programme et afficher 1 message d'erreur
// Voulez-vous introduire 1 message?
// Lire Rep
//Fin tantque
//Afficher les messges mémorisés
//si erreur_affichage afficher 1 messsge d'erreur
//---------------------------------------------------------------
printf("LE GESTIONNAIRE DE MESSSAGES VERSION 4\n ");
printf("\nPour utilisier le GM d'erreurs entrer 1,\nPour utiliser le GM d'info entrer 2...\n\n");
printf("Choix du GM : ");
cGM_Choice = getchar();
fflush(stdin);
if(cGM_Choice == '1')
{
printf("Que voulez-vous faire sur le GM ?\n");
printf("Pour initialiser entrer 1\n");
printf("Pour inserer 1 message dans le GM entrer 2\n");
printf("Pour 1 affichage total du GMentrer 3\n");
printf("Pour 1 affichage selectif du GM entrer 4\n");
printf("Pour reinitialiser le GM entrer 5\n");
printf("L\'action choisie est : ");
cGM_Action = getchar();
fflush(stdin);
//-------------------------------------
//Traitement pour le GM 1 ===> GestError
//-------------------------------------
if (cGM_Action == '1')
{
gmInit(&tyGestError, &dRC);
if(dRC == GM_ERROR)
{
printf("\n Initialisation incorrecte \n ");
exit(0);
}
}
if (cGM_Action == '2')
do{
printf("\n Entrer le message : ");
gets(tsMsg);
fflush(stdin);
//memoriser le message
gmAdd(&tyGestError, tsMsg, &dRC);
if(dRC == GM_FULL)
{
printf("\n Le gestionnaire est complet \n ");
exit(0);
}
if(dRC == GM_ERROR)
{
printf("\n Impossible de réaliser l'insertion \n ");
exit(0);
}
printf("\n Voulez-vous introduire un autre message ? ");
cRep = getchar();
fflush(stdin);
}
while(cRep != 'N');
if (cGM_Action == '3')
{
printf("\nAFFICHAGE DE TOUS LES MESSAGES ");
printf("\n---------------------------------\n");
gmDisplay(&tyGestError, &dRC);
printf("-----------------------------------\n");
if(dRC == GM_ERROR)
{
printf("\nErreur d'affichage\n ");
exit(0);
}
}
if (cGM_Action == '4')
{
printf("\nAFFICHAGE SELECTIF DES MESSAGES ");
printf("\n---------------------------------\n");
gmDisplaySelectif(&tyGestError, &dRC);
printf("-----------------------------------\n");
if(dRC == GM_ERROR)
{
printf("\nErreur d'affichage\n ");
exit(0);
}
}
if(cGM_Action == '15')
{
gmReInit(&tyGestError, &dRC);
if(dRC == GM_ERROR)
{
printf("\n Initialisation incorrecte \n ");
exit(0);
}
}
}
} |
Voila je sais qu'il ya pas mal d'erreurs, je n'arive pas à me corriger. Merci de votre aide
CoolD
probleme d'affichage selectif
Non, à la compilation, édiltion des liens tous te se passe bien, c'est plutôt à l'exécution.
L'utilisateur doit avoir la possibilité de choisir le gestionnaire de message qu'il veut et il doit pouvoir y efectuer les opérations qu'il souhaite.
Il y'a des précondtions qui sont comme initialiser le gestionnaire de message.
Pour afficher les messages, il a deux possibilité soit afficher tous les messages soit afficher que les messages qui ne sont pas encore affichés. Ma fonction gmDisplaySelectif contient des erreurs , le main aussi, mais voila je n'aarive pas à me corriger. Merci de l'aide
coold
probleme d'affichage selectif
merci mabu des conseils
En fait quand je l'exécute et comme vous avez pu le constater en faisant 1 puis 1 effectivement je sors de l'application et moi je devrai avoir la possiblité de poursuivre en insérant des messages puis par exemple les afficher, puis a nouveau d'inserer de nouveaux messages et cette fois-ci d'fficher que ceux pas encor faits ou de tout les afficher. En fait, il me faut un "menu" pour me permettre de choisir sur quel gestionnaire je veux travaillet et quelles actions je veux y mener.
donc j'ai apporté quelque modif à gmDisplaSelectif
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void gmDisplaySelectif(GMESSAGE *pGMsg, int *pRC)
{
int dI;//indice de parcours du tableau
for(dI = 0; dI < pGMsg->dCurPos; dI++)
if(pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay !=0)
printf("Message %d: %s\n", dI, pGMsg->pstTabMsg->psMsg[dI]);
pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay = 1;
*pRC = GM_OK;
return;
} |
Merci
coold
probleme d'affichage selectif
salut mabu, je n'avais pas bien fait attention au style de code que vous me proposez pour le menu. Je vais essayer en fai si j'ai bien compris, il ya deux choix soit c'est avoir la possibilité de renterr dans le sous menu et soit c'est quitter c'est bien vu, c'est vrai je pense que ça simplifie un peu les choses.
c cool merci j'essaie et je vous tiens au courant
coold