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

VB 6 et antérieur Discussion :

Problème: du If à tout va!


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut Problème: du If à tout va!
    Bonjour à tous,

    J'essaye de faire une petite add-ons pour un jeu de simulation de vol (Flight Simulator)...
    Je rencontre un petit problème sur une fonction que je souhaites réaliser :
    Cette fonction à pour but de vérifier que l'appareil est orienté dans une direction donnée tout en admettant une certaine erreur (exemple vérifier qu'il suit bien un cap 310 +/- 10°).
    Parce que les valeurs possibles du cap sont comprises entre 1 et 360, l'expression logique qui permettrait de vérifier cette condition se complique quelque peu.
    Voici comment je pourrais traduire cette expression sous Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(MIN(SI((Cap_avion-Consigne)<0;360+(Cap_avion-Consigne);(Cap_avion-Consigne));SI((Consigne-Cap_avion)<0;360+(Consigne-Cap_avion);(Consigne-Cap_avion)))<Marge_erreur;"Validé";"Non validé")
    Traduit en VB, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (If (If(Cap_avion - Consigne) < 0 Then (360 + Cap_avion - Consigne) Else (Cap_avion - Consigne)) < (If (Consigne - Cap_avion) < 0 Then (360 + Consigne - Cap_avion) Else (Consigne - Cap_avion)) Then (If (Cap_avion - Consigne) < 0 Then (360 + Cap_avion - Consigne) Else (Cap_avion - Consigne)) Else (If (Consigne- Cap_avion) < 0 Then (360 + Consigne- Cap_avion) Else (Consigne- Cap_avion))) < Marge_erreur Then Lavel2.Text = "Valid" Else Lavel2.Text = "Invalid"

    Mais voilà, il m'indique une erreur sur le deuxième If => "Expression expected"... Je ne comprends pas pourquoi... Aurais je oublié un Then / Else quelque part?
    Comment puis écrire cette fonction de manière plus digeste?

    Je précise que je suis complètement débutant dans ce domaine et donc que vous voudriez bien m'excuser si je vous sollicite pour une toute petite erreur...
    D'avance, je vous remercie de votre aide.
    Benoît

  2. #2
    Membre émérite
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Par défaut
    c'est......euh comment dire....illisible.
    une petite indentation aurait été bienvenue

    entre IF et THEN, il te faut une expression qui te renvoie un booléen

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Bien compliqué cette imbrication de If ... Then.
    Sur un Form un TextBox nommé Text1, pour entrée le Cap_Avion, et le code qui suit
    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
    Option Explicit
    Dim Cap_Avion As Integer
    Dim Consigne As Integer
    Dim Marge As Integer
    Dim Maxi As Integer, Mini As Integer
     
    Private Sub Form_Load()
    Consigne = 310: Marge = 10
    Maxi = Consigne + ((Consigne * Marge) / 100)
    Mini = Consigne - ((Consigne * Marge) / 100)
    End Sub
    Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
     KeyAscii = 0
     Cap_Avion = Text1.Text
     ' la formule ce resumant à sa
     If Cap_Avion >= Mini And Cap_Avion <= Maxi Then
      MsgBox "Valid"
      Else
      MsgBox "Invalid"
     End If
    End If
    End Sub
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Bonsoir,

    Bin merci Gérald2545 pour la retouche du post... Je tâcherais de faire attention la prochaine fois...
    Et merci à ProgElect pour ce code bien plus clair et "fonctionnel" que mon essai!!!
    Ca marche à merveille!
    Merci à tous les deux...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Non, j'ai crié victoire trop vite... En fait le problème se pose quand l'appareil est au cap 360. Si on applique une marge d'erreur de 10°, l'appareil doit avoir un cap compris entre 350° et 10°. Deux plages de valeurs sont valides : 350-360 et 0-10.
    Dans le code de ProgElect, c'est plus valable...
    Je vais continuer à chercher de mon coté... Si je ne trouve pas de solution, je reviendrais vers vous... si vous êtes d'accord.
    Bonne nuit!

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,
    La fonction EtatCap renvoie vrai si le "cap réel" est compris dans le "cap à suivre" avec une "marge" de + ou - un nombre de degrés.
    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
    Private Sub Command1_Click()
    lblResultat.Caption = EtatCap(txtCapASuivre.Text, txtCapReel.Text, txtMarge.Text) 'affiche vrai ou faux
    End Sub
     
    ' cas : Cap a Suivre
    ' cr : Cap Réel
    ' m : Marge
    Function EtatCap(cas As Long, cr As Long, m As Long) As Boolean
    Dim bRes As Boolean
      bRes = False
      If cas >= m And cas <= (360 - m) Then
        If cr >= (cas - m) And cr <= (cas + m) Then
          bRes = True
        End If
      Else
        If cas < m Then
          If cr <= cas + m Then
            bRes = True
          Else
            If cr >= (cas + 360 - m) Then
              bRes = True
            End If
          End If
        Else
          If cr >= cas - m Then
            bRes = True
          Else
            If cr <= (cas - 360 + m) Then
              bRes = True
            End If
          End If
        End If
      End If
    EtatCap = bRes
     
    End Function
    Je traite en 3 partie
    Note : je ne gére pas les erreurs de saisie (valeur <0 ou >360) ce qui mettrai la pagaille.
    Edit : Un seul cas particulier peut poser problème (cas=350,cr=360, comme 360° = 0°, si tu as cas=350 et cr=0 il considére faux. Si ce cas de figure peut se présenter, il faut rajouter un if supplémentaire sur ce cas particulier)
    Il est un peu tard, si tu as besoin d'explication, n'hésite pas à demander.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de Skybox toute blanche
    Par Mssp704 dans le forum Ogre
    Réponses: 7
    Dernier message: 03/12/2009, 00h06
  2. Réponses: 6
    Dernier message: 23/03/2009, 15h40
  3. Réponses: 0
    Dernier message: 28/10/2008, 09h34
  4. problème d'accents toutes sortes
    Par lionel256 dans le forum VB.NET
    Réponses: 3
    Dernier message: 10/05/2008, 08h36

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