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 de boucle infini


Sujet :

C

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Points : 17
    Points
    17
    Par défaut probleme de boucle infini
    Salut à tous!

    Voila j'ai un bout de code qui me pose un souci, je souhaiterais rajouter une condition à ma while afin d'eviter une boucle infini.
    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
    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
     
    void	CommandParse(void)
    {
    	unsigned int		Addr;
    	unsigned int		Value;
    	char			c;
     
    	c = UART1_Parse();
    	if(c) putchar(c);
    	if(c!=0x0d) return;
     
     
    	UartReadPtr = 0;
    	UartRxPtr = 0;
     
    	while ((UartRxCnt!=0) && (UartReadPtr <= UartRxCnt) )
    	{
     
    		if (toupper(UartRxBuffer[UartReadPtr])=='W')
     
    					{			UartReadPtr++;
    								SkipRaw();
    								Addr = GetHex();
    								SkipRaw();
    								Value = GetHex();
    								MAC_Write(Addr, Value);
    								printf("\nOK\n");
    					}
     
     
     
    		else if 	(toupper(UartRxBuffer[UartReadPtr])=='R')
    					{
    						UartReadPtr++;
    						SkipRaw();
    						Addr = GetHex();
    						Value = MAC_Read(Addr);
    						printf("\n%04x = %04x\n", Addr, Value);
     
    					}
     
    		else if     (toupper(UartRxBuffer[UartReadPtr])=='T')
    					{	
    						UartReadPtr++;
    						SkipRaw();
    						CP220x_Send(&DESTMAC, UartRxBuffer, sizeof(UartRxBuffer) - UartRxPtr, IP_PACKET);
    						printf("\nOK\n");
    						vBufferClear();
     
     
    					}
    		else
    					{	printf("\nERROR\n");
     
    					}
    		UartReadPtr++;
    	}
     
    	UartRxPtr = 0;
     
    }

  2. #2
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    bien bizarre ton code
    UartRxCnt on sait pas combien il vaut et il est jamais modifié dans la boucle. Ensuite les variables que tu as suffixées "Ptr", pour moi c'est pas des pointeurs, UartReadPtr c'est un index pour parcourir ton buffer, donc tes conventions de nommage laissent à désirer. Je suppose que tu veux que UartRxCnt soit la taille max de ton buffer non? Eclaire nous un peu sur qui fait quoi parce que je suis pas sur de tout comprendre.
    Si tu veux utiliser un pointeur plutot qu'un index pour parcourir ton buffer, tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type * ptrUartRxBuffer = UartRxBuffer;
    while (ptrUartRxBuffer != NULL){
        traitement...
        ptrUartRxBuffer++
        [...]
    }
    Mais fait gaffe de bien prendre en compte tous les cas possibles sur le contenu du buffer sinon effectivement tu risques d'avoir une boucle infinie. par exemple si UartRxBuffer[4]="E" et que tu ne traites pas ce cas dan ta boucle tu vas indéfiniment boucler sur ce cas la, sauf si tu incrémentes ton pointeur quelque soit le cas rencontré (dans ce cas incrémente ton pointeur en dehors de tout branchement if/else)
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Desolé, j'ai pas été très precis effectivement .voici en plus detaillé:
    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
    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
     
    //-------------------------------------------------------------------------// _getkey
     
     
    long    UartRxBufferlenght = 512;
    char	xdata UartRxBuffer[512];
    char	UartRxPtr;
    int 	UartRxCnt = 0;
    int		UartReadPtr = 0;
     
    char UART1_Parse(void)  {
     
     
       char c = 0;
     
       SFRPAGE = UART1_PAGE;
     
       if(RI1){
    		UartRxBuffer[UartRxPtr++] = c = SBUF1;
    		if(UartRxPtr >= UartRxBufferlenght) UartRxPtr = UartRxBufferlenght;
    		UartRxCnt = UartRxPtr;
    		RI1 = 0;
       }
     
       SFRPAGE = SFRPAGE_SAVE;
     
       return (c);
    }
     
    //-------------------------------------------------------------------------
     
    int		GetHex(void)
    {
    	int	value = 0;
    	char	c;
     
    	do{
    		c = UartRxBuffer[UartReadPtr++];
    		if(c>='0'	&& c<='9') value *= 16, value += c - '0';
    		if(c>='A' && c<='F')  value *= 16, value += c - 'A' + 10;
     
    	} while(c >= '0');
     
    	return value;
     
    }
     
     
    void	SkipRaw(void)
    {
    	while(UartRxBuffer[UartReadPtr] <= '0' && UartReadPtr<sizeof(UartRxBuffer)) UartReadPtr++;
    }
     
    void	CommandParse(void)
    {
    	unsigned int		Addr;
    	unsigned int		Value;
    	char			c;
     
    	c = UART1_Parse();
    	if(c) putchar(c);
    	if(c!=0x0d) return;
     
     
    	UartReadPtr = 0;
    	UartRxPtr = 0;
     
    	while ((UartRxCnt!=0) && (UartReadPtr <= UartRxCnt) )
    	{
     
    		if (toupper(UartRxBuffer[UartReadPtr])=='W')
     
    					{			UartReadPtr++;
    								SkipRaw();
    								Addr = GetHex();
    								SkipRaw();
    								Value = GetHex();
    								MAC_Write(Addr, Value);
    								printf("\nOK\n");
    					}
     
     
     
    		else if 	(toupper(UartRxBuffer[UartReadPtr])=='R')
    					{
    						UartReadPtr++;
    						SkipRaw();
    						Addr = GetHex();
    						Value = MAC_Read(Addr);
    						printf("\n%04x = %04x\n", Addr, Value);
     
    					}
     
    		else if     (toupper(UartRxBuffer[UartReadPtr])=='T')
    					{	
    						UartReadPtr++;
    						SkipRaw();
    						CP220x_Send(&DESTMAC, UartRxBuffer, sizeof(UartRxBuffer) - UartRxPtr, IP_PACKET);
    						printf("\nOK\n");
    						vBufferClear();
     
     
    					}
    		else
    					{	printf("\nERROR\n");
     
    					}
    		UartReadPtr++;
    	}
     
    	UartRxPtr = 0;
     
    }
    Bon il ne faut pas attacher trop d'importance à certains details comme le SFRPAGE qui sont spécifique à ma cible de dev.

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    c'est toujours un peu embrouillé. déja revois tes conventions de nommage comme je l'ai déja dit, il est malvenu de suffixer une variable de type int par Ptr (bonjour l'embrouille pour le gars qui va maintenir). Je peux pa trop deviner à quoi va etre égal UartRxCnt apres l'appel à UART1_Parse(), ça dépend de ce qu'il y a dans le buffer.En fait non meme pas tu ecris UartRxBuffer[UartRxPtr++] sans avoir initialisé UartRxPtr...
    Je te conseille de corriger ça et de tracer les valeurs de UartRxCnt et UartReadPtr avant et pendant la boucle. Sinon dans ta boucle tu incrémentes UartReadPtr dans les branchements conditionnels et à la fin du corps de la boucle, donc suivant les cas tu risques d'incrémenter deux fois ton index, c'est pas ce que tu veux je pense..
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Là j'ai essayé de le reecrire différement et je l'espère à le rendre plus lisible:
    Ce code fait partie d'une ensemble de fichier particulier à une cible precise.
    Il se trouve qu'en faisant le test, la commande"W" marche sans probleme, , cêst pour le "R" que c'est plus delicat car le UartRxBuffer, car quand j'execute cette commande sur ma console il va en timeout et la valeur contenu dans Value est simplement error.
    Il peut arriver que UartRxBuffer contiene le caractere "R" mais ceci est aleatoire et n'arrive presque jamais.Comment alors resoudre ce cas?
    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
    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
     
     
    char	xdata	UartRxBuffer[512];
    char	UartRxPtr;
     
    char UART1_Parse(void)  {
     
       char SFRPAGE_SAVE = SFRPAGE;     // Save Current SFR page
       char c = 0;
     
       SFRPAGE = UART1_PAGE;
     
       if(RI1){
    		UartRxBuffer[UartRxPtr++] = c = SBUF1;
    		if(UartRxPtr >= sizeof(UartRxBuffer)) UartRxPtr = sizeof(UartRxBuffer)-1;
    		RI1 = 0;
       }
     
       SFRPAGE = SFRPAGE_SAVE;
     
       return (c);
    }
     
     
     
     
    int		GetHex(void)
    {
    	int	value = 0;
    	char	c;
     
    	do{
    		c = UartRxBuffer[UartRxPtr++];
    		if(c>='0'	&& c<='9') value *= 16, value += c - '0';
    		if(c>='A' && c<='F')  value *= 16, value += c - 'A' + 10;
     
    	} while(c >= '0');
     
    	return value;
     
    }
     
     
    void	SkipRaw(void)
    {
    	while(UartRxBuffer[UartRxPtr] <= '0' && UartRxPtr<sizeof(UartRxBuffer)) UartRxPtr++;
    }
     
     
    extern	MACADDRESS xdata DESTMAC;
     
     
    void	CommandParse(void)
    {
    	unsigned int		Addr;
    	unsigned int		Value;
    	char				c;
     
    	c = UART1_Parse();
    	if(c) putchar(c);
    	if(c!=0x0d) return;
     
     
    	UartRxPtr = 0;
     
    	switch(UartRxBuffer[0]){
     
    		case	'W':	UartRxPtr++;
    						SkipRaw();
    						Addr = GetHex();
    						SkipRaw();
    						Value = GetHex();
    						MAC_Write(Addr, Value);
    						printf("\nOK\n");
    						break;
    	// zone probleme
     
    		case	'R':	UartRxPtr++;
    						SkipRaw();
    						Addr = GetHex();
    						Value = MAC_Read(Addr);
    						printf("\n%04x = %04x\n", Addr, Value);
    						break;
     
     
    		case	'T':	UartRxPtr++;
    						SkipRaw();
    						CP220x_Send(&DESTMAC, UartRxBuffer, sizeof(UartRxBuffer) - UartRxPtr, IP_PACKET);
    						printf("\nOK\n");
    						break;
     
     
    		default		:	printf("\nERROR\n");
    						break;
     
    	}
     
    	UartRxPtr = 0;
    }

  6. #6
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Perso la j'ai du mal à comprendre ce qu'est censé faire ton code. Selon le premier caractere de ton buffer tu fais certaines operations en relation avec le reseau, ok, mais a quoi sert UartRxPtr ? De plus dans la fonction UART1_Parse tu n'as toujours pas résolu le problème de ta variable non initialisée.
    Donc que veux tu faire réellement?
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  7. #7
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Mon probleme est de pouvoir contrôller le contenu de UartRxBuffer!
    UartRxPtr consulte toute les positions de mon Buffer.
    En fait j'amerais vider ce buffer apres chaque commande afin de pouvoir être certains qu'il soit vide apres chaque operation.

  8. #8
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Dans le dernier exemple de code que tu as donné, tu ne regarders que UartRxBuffer[0]
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

Discussions similaires

  1. probleme avec une boucle infinie
    Par hunter99 dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2007, 23h37
  2. Diminuer la taille d'un code et probleme boucle infini
    Par Alucard9800XT dans le forum MATLAB
    Réponses: 3
    Dernier message: 11/06/2007, 11h42
  3. Probleme de boucle infini
    Par Premium dans le forum C++
    Réponses: 4
    Dernier message: 29/03/2007, 22h10
  4. probleme de gestion de boucle infinie
    Par masterix59 dans le forum C
    Réponses: 8
    Dernier message: 27/12/2006, 16h34
  5. Probleme Boucle infinie Recordset.movenext "muet"?
    Par shub dans le forum VBA Access
    Réponses: 7
    Dernier message: 14/06/2006, 13h22

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