Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---

Boucle conditionnelle !

Forum général sur le langage C !

Modérateur : Jérémy

Jérémy
Administrateur du site
Administrateur du site
Messages : 2755
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boucle conditionnelle !

Messagepar Jérémy » jeu. 26 mai 2016 18:28

Bonjour à tous ,

Je cherche à simplifier un bout de code, mais je bloque sur un point !.

en effet suivant le résultat d'un test je dois effectuer tel ou tel fonction. C'est fonctions sont plutot proches et j'aurais souhaité les regrouper en une seule et même fonction .

Le hic c'est que dans une, j'ai une boucle de plus que dans l'autre!

Voici la première qui me permet de convertir une lettre de 32 octets :

Code : Tout sélectionner

//------------------Convertit une lettre composée de 32 Octets -----------------
// Paramètre d'entrée : la position dans le tableau "alphabet" du premier des 32 Octets
void affichage_Lettre2(unsigned int position){

     i = j = k = m = valeur = 0;

     for (k=0;k<=1;k++){
         for (m=0;m<=1;m++){
             position += m;
             for (i=0;i<=7;i++){
                 for (j=0;j<=7;j++){
                      valeur +=  (  (((font16x8[(position+(k*15)+(j*2))])>>(7-i)) & (0x01))  << j  )  ;
                  }
                  OLED_M_data(valeur);
                  valeur = 0 ;
              }
          }
      }
}


Et voici la seconde qui me permet de convertir une lettre de 16 octets :

Code : Tout sélectionner

//------------------Convertit une lettre composée de 16 Octets -----------------
// Paramètre d'entrée : la position dans le tableau "alphabet" du premier des 16 Octets
void affichage_Lettre(unsigned int position){

     i = j = k = m = valeur = 0;
     
     for 
(k=0;k<=1;k++){
          for (i=0;i<=7;i++){
               for (j=0;j<=7;j++){
                    valeur +=  (  (((font16x8[(position+(k*8)+j)])>>(7-i)) & (0x01))  << j  )  ;
                }
                OLED_M_data(valeur);
                valeur = 0 ;
           }
      }
}


On voit dans la seconde il y a une boucle de moins la boucle m et quelques valeurs qui changent mais ca me j'en chargerais.
Je choisis donc suivant le résultat d’une comparaison d'effectuer soit la première soit la deuxième ;

Comment rendre conditionnelle une boucle ? je ne vois pas comment m'y prendre !

merci
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » jeu. 26 mai 2016 18:56

Bonjour
ici viewtopic.php?f=10&t=261&start=20 en #30

un for avec un if

a priori, tu n'as pas compris. Donc, tu fais ton if est dans ton if tu fais ta boucle c'est l'inverse te mon exemple

A+

PS: je trouve que cela commence a faire long cette conversion, il faudrait voir peut -être une autre possibilité .Je sais, tu ne sais pas faire .J'aimerais bien connaître, occupation flash et temps de conversion ,cela serais bien tu ne crois pas :wink:
Modifié en dernier par Anonymous le jeu. 26 mai 2016 19:11, modifié 1 fois.

Jérémy
Administrateur du site
Administrateur du site
Messages : 2755
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boucle conditionnelle !

Messagepar Jérémy » jeu. 26 mai 2016 19:09

Hello Maï,

Pour mettre un lien directement d'un post, tu peux directement copier le lien du post en question ! en faisant un clic droit sur le petit chiffre du numéro du post en question celui qui comment par un #, et copier/coller l'adresse du lien : :wink:

Si sur ta solution le If se trouve dans la dernière boucle , ce qui n'est pas mon cas ici ! car je ne souhaite pas supprimer les autres blocs imbriqués mais seulement la boucle "m"
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » jeu. 26 mai 2016 19:19

bon j'ai compris le lien je vais ne coucher moins C.... :lol:

sinon regarde de faire un spg pour la partie commune

Code : Tout sélectionner

void affichage_Lettre2(unsigned int position)
{

     i = j = k = m = valeur = 0;

     for (k=0;k<=1;k++)
   {
            for (m=0;m<=1;m++)
            {
                position += m;
           call XXX
            }
   }
}
spg XXX
{
        for (i=0;i<=7;i++)
   {
                 for (j=0;j<=7;j++)
                 {
                      valeur +=  (  (((font16x8[(position+(k*15)+(j*2))])>>(7-i)) & (0x01))  << j  )  ;
                  }
   OLED_M_data(valeur);
        valeur = 0 ;
   }
}
       
 

bon j'ai voulu modifier ton code directement pas très jolie la présentation pas envie de mettre mplabx en route :wink:
A+

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » jeu. 26 mai 2016 19:34

tu cherches a optimiser ta conversion ?? Avec un spg moins de place mais plus long

Jérémy
Administrateur du site
Administrateur du site
Messages : 2755
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boucle conditionnelle !

Messagepar Jérémy » jeu. 26 mai 2016 19:41

oui j'avais pensé a l'utilisation d'un SP , mais pas trés élégant. Mon but était de rassembler ces deux fonctions.

tu cherches a optimiser ta conversion ??

oui , pas forcement optimiser niveaux performances, mais simplification . ces 2 fonctions quasiment identiques , c'est dommage de ne pas en faire qu'une seule :lol:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » jeu. 26 mai 2016 19:51

regarde aussi cote break; pour sortir d'une boucle si test .Regard aussi ta 1er boucle avec un do while pour une passe, plus court qu'un for

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » ven. 27 mai 2016 08:38

bonjour

test ca:
le test
IF M entre boucle K et M
si oui suite
sinon
M=fin de boucle
suite sur boucleI bon je suis sur que tu n'as rien compris alors

Code : Tout sélectionner

Code : Tout sélectionner
//------------------Convertit une lettre composée de 32 Octets -----------------
// Paramètre d'entrée : la position dans le tableau "alphabet" du premier des 32 Octets
void affichage_Lettre2(unsigned int position){

     i = j = k = m = valeur = 0;

     for (k=0;k<=1;k++){
     
     
     TEST m
  si oui   
         for (m=0;m<=1;m++){
             position += m;
             
 sinon
            m=1;
           
             
             for (i=0;i<=7;i++){
                 for (j=0;j<=7;j++){
                      valeur +=  (  (((font16x8[(position+(k*15)+(j*2))])>>(7-i)) & (0x01))  << j  )  ;
                  }
                  OLED_M_data(valeur);
                  valeur = 0 ;
              }
          }
      }
}

Jérémy
Administrateur du site
Administrateur du site
Messages : 2755
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boucle conditionnelle !

Messagepar Jérémy » ven. 27 mai 2016 08:46

Bonjour Maï,

J'ai essayé hier et j'avais une erreur de compilation car l'accolade fermante de la boucle "m" pose probléme !

J'entrevois une solution, grâce a ta piste du while .

Si mon test est vrai je ne touche pas à la valeur de "m" , si la condition est fausse je met m=5 ainsi on sortira naturellement de la boucle et elle ne se répétera pas .
Comme ça première valeur =0 ça ne devrait pas déranger qu"elle fasse la première boucle !

A tester !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

Boucle conditionnelle !

Messagepar Guest » ven. 27 mai 2016 09:07

Jérémy a écrit :Bonjour Maï,

J'ai essayé hier et j'avais une erreur de compilation car l'accolade fermante de la boucle "m" pose probléme !

J'entrevois une solution, grâce a ta piste du while .

Si mon test est vrai je ne touche pas à la valeur de "m" , si la condition est fausse je met m=5 ainsi on sortira naturellement de la boucle et elle ne se répétera pas .
Comme ça première valeur =0 ça ne devrait pas déranger qu"elle fasse la première boucle !

A tester !

pas le temps de faire le test je le ferais plus tard

Autre soucis: POURQUOI faire une BOUCLE pour 1 passe ?


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités