Le premier OR est évalué mais rentre dans le second OR alors qu'il ne devrait pa

Résolu
beegeezzz Messages postés 152 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 10 avril 2017 - 24 mai 2009 à 16:15
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 - 24 mai 2009 à 18:17
Bonjour tout le monde,

J'ai ce code qui cherche le maximum dans un tableau :

Public Function RechercheMax(ByVal Tableau)
    Dim i_maximal, i As Integer
    i_maximal = 0
   
    For i = 1 To NE
        If Tableau(i) >= 0 Then
            If (i_maximal = 0) Or (Tableau(i) > Tableau(i_maximal)) Then
                i_maximal = i
            End If
        End If
        If i_maximal > 0 Then
            MsgBox "le maximum est " + Tableau(i_maximal)
        Else
            MsgBox "Problème dans le max"
        End If
    Next i
End Function

Arrivé ici :

If (i_maximal = 0) Or (Tableau(i) > Tableau(i_maximal)) Then

Je pensais qu'après avoir vérifié le premier OR, il sortirait du if mais ce n'est pas le cas.
If (i_maximal 0)> VRAI

mais il ne sort pas du if, est-ce normal ?

Merci d'avance pour l'aide.

Voici l'algo de départ :

'* Recherche d'une valeur maximale (tableau à une dimension)
'    i_maximal = 0;
'    POUR i ALLANT DE 1 A nombre_elements
'        SI Tableau[i] respecte un critère ALORS
'            SI (i_maximal == 0) OU (Tableau[i] > Tableau[i_maximal]) ALORS
'                i_maximal = i;
'            FIN SI;
'        FIN SI
'    FIN POUR i
'    SI i_maximal > 0 ALORS
'        exploitation de l'élément trouvé à l'indice i_maximal;
'    SINON
'        gestion du "pas trouvé";
'    FIN SI

beegees
A voir également:

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 mai 2009 à 16:56
salut,

ni le test ni l'utilisation d'une FONCTION ne sont ici corrects...






Public Function 
RechercheMax(
ByRef 
Tableau)

    Dim i As Integer, iValue As Integer
    iValue = Tableau(LBound(Tableau))
    
    For i = LBound(Tableau) To UBound(Tableau)
        If (Tableau(i) > iValue) Then iValue =
Tableau(i)
    Next i
    
    RechercheMax = iValue
End Function

Private Sub Form_Load()
    Dim aiArr
    aiArr = Array(5, 2, 0, 7, 9, 1)
    
    MsgBox "la plus grande valeur du
tableau est : " & RechercheMax(aiArr)
    Unload Me
End Sub





<small>
[../code.aspx?ID=39466 Coloration VB6, VBA,
VBS]
</small>






++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 mai 2009 à 16:49
Qu'entends-tu par sortir du If exactement ?????
Parce que si If (i_maximal 0) est vrai il va aller executer les instructions dans le if, c'est à dire ici i_maximal i

Les instructions dans la if ne seront pas executer que si le resultat du test fait par le if est Faux

Donc la première fois, si i_maximal =0, il est normal qu'il rentre dans le If. Les fois suivantes, normalement i_maximal sera différent de 0, donc il ne rentrera dans le if que si Tableau(i) > Tableau(i_maximal)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 mai 2009 à 16:58
Bonjour,

Si c'est bien cela que tu cherche à faire, essaye ce code:

Dim maxId As Integer = 0
For i = 0 To UBound(Tableau)
If Tableau(i) > Tableau(maxId) Then
maxId = i
End If
Next

Il part du principe que le premmier élément du tableau est le plus grand, puis il le compare au reste, il un autre élément est plus grand, alors il passe en tête et devient l'élément maximal du tableau.

@+
0
beegeezzz Messages postés 152 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 10 avril 2017 1
24 mai 2009 à 17:41
Salut,

Un tout grand merci à vous trois.

Vos réponses sont très intéressantes.

Casy :

J'obtiens "indice en dehors de la plage"  car :

Dans If (i_maximal = 0) Or (Tableau(i) > Tableau(i_maximal)) Then

Tableau(i_maximal) qui vaut Tableau(0) n'existe en effet pas.

Je pensais que i_maximal = 0 était testé, c'est vrai, hop on va dans le if sans tester le second test, ce n'est pas le cas.

Encore merci à toi Casy.

PCPT :

Merci pour ta réponse.

Ton code me semble génial.

Il n'est pas plus prudent de commencer l'indice du for à 1 ?

iValue = Tableau(LBound(Tableau))

Encore merci.

Mayzz :

Merci pour ton code qui me semble aussi génial.

La seule chose est que je commence mon tableau à 1 et non à 0 mais ça, ce n'est qu'un détail.

Encore merci à vous trois.

beegees
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beegeezzz Messages postés 152 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 10 avril 2017 1
24 mai 2009 à 17:48
Re,

PCPT,

Je me pose une question par rapport à ton code.

Pas besoin de mettre as integer ici :

Public Function RechercheMax(ByRef Tableau) as integer ???

On renvoie une donnée numérique quand même ?

Merci d'avance pour le complément d'information.

beegees
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 mai 2009 à 17:51
"...Je pensais que i_maximal = 0 était testé, c'est vrai, hop on va dans le if sans tester le second test, ce n'est pas le cas...."

L'instruction existe en .Net mais pas en VB6.

En VB6, tous les tests sont effectués avant de déterminer le résultat de la condition, d'où ton erreur.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 mai 2009 à 17:55
çà serait bien de renvoyer un INTEGER oui, tout comme de typer le tableau en paramètre
(byref tableau() as integer)

je ne l'ai pas fait à cause de l'initialisation dans le form_load (le tableau est un variant), mais type tout correctement oui


"

Il n'est pas plus prudent de commencer l'indice du for à 1 ?

"


non, lbound renvoie l'index le plus petit, donc 0 dans mon exemple, et 1 avec ton code apparemment

++
0
beegeezzz Messages postés 152 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 10 avril 2017 1
24 mai 2009 à 17:58
Casy,

Merci pour cette information que j'ignorais.

PCPT :

Merci pour l'info, très sympa.

Je vois donc que ça peut fonctionner sans renvoyer quelque chose.

beegees
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 mai 2009 à 18:07
ça peut fonctionner sans renvoyer quelque chose



le but d'une fonction est de renvoyer qqchose, sinon utilise une procédure

sans type çà renvoie un variant qui se type selon ce qu'il a, ici un integer (cf :

RechercheMax = iValue

)

donc dans ce cas précis le résultat est le même, mais il vaut mieux se forcer à tout typer proprement, tant pour l'habitude, que pour d'autres langages, que pour les performances
0
beegeezzz Messages postés 152 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 10 avril 2017 1
24 mai 2009 à 18:11
C'est ce que j'appelle de la réponse.

Merci.

beegees
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 mai 2009 à 18:14
Une question, comment arrive tu as commencer un tableau à l'index 1 ????

Tu peux ne commencer à le remplir qu'à l'index 1, mais l' élément 0 existera toujours bien que sa valeur soit 0 pour un tableau d'Interger ou vide (Nothing) pour un tableau non typé.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 mai 2009 à 18:17
arf! désolé je répond tout seul à ma question

Redim Tableau(5 to 10)...
0
Rejoignez-nous