IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme d'affichage selectif


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut 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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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 c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Peux tu préciser ton problème plus en détail ? As tu un problème à la compilation, l'édition de liens, l'execution ?

    A part la ligne qui ne veut pas dire grand chose et la fonction gmReInit qui n'est pas déclarée, le code fonctionne chez moi... Cela dis, je ne sais pas ce qu'il est sensé faire.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut 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

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Ma fonction gmDisplaySelectif contient des erreurs , le main aussi
    Lesquelles, comment les obtiens tu ?

    Je ne suis pas sur de comprendre comment me servir de ton appli...

    Si dans les menus, je tappe 1 puis 1, l'appli quitte, mais sans erreur.
    Tu pourrais peut être faire un gestionnaire de choix dans ce gout là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int quit = 0;
    char choix;
    while(!quit){
       /*Afficher le menu*/
       printf("Choix 1 \n");
       printf("Choix 2 quitter\n");
       choix = getchar();
       switch(choix){
        case '1':
          sousMenu_1();
        case '2':
          quit = 1;;
        default:;
       }
    }
    Si dans les menus, je tappe 1 puis 4, ça crashe, mais c'est normal puisse que non initialisé.

    Cela dit, ce qui suit me parait louche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Déjà ici, il faudrait que pGMsg->dCurPos soit défini*/
    if(pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay !=0)
       /*pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay egal 1 ?*/
       for(dI = pGMsg->pstTabMsg[pGMsg->dCurPos].dDisplay; dI < pGMsg->dCurPos; dI++)
       /* supposons pGMsg->dCurPos nul, for(di = 1; dI < 0; dI ++ ) risque de prendre du temps.*/
    Il n'y a qu'en cuisine qu'on peut mélanger choux et carottes.
    Si je comprends ce que tu veux faire, tu veux afficher les messages non affichés ?
    alors il faut parcourir l'ensemble des messageset s'ils ne sont pas affichés, le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(dI = 0; di < nombre de message; ++dI){
       if(!pGMsg->pstTabMsg[dI].dDisplay){
          printf("...");/*afficher le dit message*/
          pGMsg->pstTabMsg[dI].dDisplay = 1;
       }    
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 53
    Points
    53
    Par défaut 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

Discussions similaires

  1. [VB.NET] Probleme d'affichage entre ListBox/TextBox
    Par Monster77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2004, 11h02
  2. [VB.NET] Probleme d'affichage de controle
    Par mic56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/06/2004, 15h03
  3. xml-xsl-fo : probleme d'affichage d'un tableau
    Par clindoeil dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 12/12/2003, 12h46
  4. [langage] Problème d'affichage
    Par marcoss dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2003, 13h05
  5. IE [Applet] Plug-in problème d'affichage
    Par Tonton Luc dans le forum JBuilder
    Réponses: 4
    Dernier message: 19/06/2003, 08h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo