Page 1 sur 1

[R] Problème de test entre une chaîne égale à 0 et vide

Posté : ven. 19 juin 2015 22:40
par Yle
Bonsoir tout le monde

Voici un extrait de mon code

Code : Tout sélectionner

[spoiler=]#include <Array.au3>
#include <Array2D.au3>

Dim $Tab[6][5], $Tri[22]

For $i = 0 to 5
    For $j = 0 to 4
        $Tab[$i][$j]=""
    Next
next
$Tab[0][0]="A"
$Tab[1][0]="B"
$Tab[2][0]="C"
$Tab[3][0]="D"
$Tab[4][0]="E"
$Tab[5][0]="F"


$Tab[0][2]= 0

$Tab[1][1]= 4
$Tab[1][2]= 0

$Tab[2][1]= 1
$Tab[2][2]= 1

$Tab[3][1]= 0


$Tab[4][1]= 11
$Tab[4][2]= 11

$Tab[5][1]= 1
 _ArrayDisplay($Tab)

For $i = 0 to 5         ; on balaie les 6 personnes

    $Itot = 0
    $i_part = 0
    For $j = 1 to 2
        Switch $Tab[$i][$j]
            Case ""
                $Tab[$i][$j] = -99999       ; la personne n'a pas de note, donc je met valeur fictive -99999
            Case 0
                $i_part+=1
                $Itot = $Itot + $Tab[$i][$j]
                MsgBox(0,"","VU")               ; on ne passe JAMAIS ici, pourquoi ?
            Case else
                $i_part+=1
                $Itot = $Itot + $Tab[$i][$j]
        EndSwitch

        $Tri[$j-1] = $Tab[$i][$j]           ; on stocke les différentes notes
    Next

    $Tab[$i][3] = $Itot
    ; on trie Note + fort au - fort
    _ArraySort($Tri,1,0,0)

    $TotalPT = 0
    For $k13 = 0 to 1 ; Pour chaque personne, on fait le total de ses  X notes
        if $Tri[$k13] = -99999 then $Tri[$k13] = 0
        $TotalPT = $TotalPT + $Tri[$k13]
    Next
    if $i_part = 2 Then     ; si on a le compte de participations, on met le cumul dans 4eme colonne
        $Repere = 1
        $Tab[$i][4] = $TotalPT
        else
            $RepereCol4 = 1
    EndIf
    For $j = 1 to 2
        if $Tab[$i][$j] = -99999 then $Tab[$i][$j] = ""
    Next

Next

if $Repere = 1 then
    _ArraySort($Tab,1,0,0,4)    ; on trie en montant du debut à la fin sur la colonne 4
    if $RepereCol4 = 1 Then
        For $k = 0 to 5
            if $Tab[$k][4] = "" Then
                _ArraySort($Tab,0,$k,2,0) ; on trie par ordre alpha sur les noms pour ceux qui n'ont pas 2 notes
                ExitLoop
            EndIf
        Next
    EndIf
    Else
        _ArraySort($Tab,0,1,0,0)
    EndIf

; le tableau final est faux car B ayant 2 notes l'une à 0 et l'autre à 4 devrait être second !


    _ArrayDisplay($Tab, " trié")

[/spoiler]
J'initialise un tableau pour 6 personnes.
La personne a une note de 0 à x ou une valeur nulle (pas de note)
Mon souci est qu'AutoIt ne me display jamais mon "VU" car il ne teste pas le zéro
A la fin, je trie mon tableau de telle sorte que ceux qui ont 2 notes soient placés en tête et je devrais voir E (11 + 11) avec 22 points suivi de B (4 + 0) et C (1+1)

Où est mon erreur ?

Merci d'avance

Re: [..] Problème de test entre la valeur 0 et nulle

Posté : ven. 19 juin 2015 23:16
par orax
Une solution est de changer le bloc Switch en Select et d'utiliser l'opérateur « == ». Le Switch ne fait pas la différence entre "" et 0 donc ce qui est dans "" est exécuté même si $Tab[$i][$j] = 0.

Code : Tout sélectionner

            Select
                Case $Tab[$i][$j] == ""
                    $Tab[$i][$j] = -99999       ; la personne n'a pas de note, donc je met valeur fictive -99999
                Case $Tab[$i][$j] = 0
                    $i_part+=1
                    $Itot = $Itot + $Tab[$i][$j]
                    MsgBox(0,"","VU")               ; on ne passe JAMAIS ici, pourquoi ?
                Case else
                    $i_part+=1
                    $Itot = $Itot + $Tab[$i][$j]
            EndSelect

Code : Tout sélectionner

ConsoleWrite((0 = "") & @CRLF)  ; True
ConsoleWrite((0 == "") & @CRLF) ; False

Re: [..] Problème de test entre la valeur 0 et nulle

Posté : ven. 19 juin 2015 23:25
par jchd
Les variables AutoIt sont des variants dont le typage est dynamique.
C'est à dire qu'une variable est suceptible de voir son contenu converti en fonction du contexte.
Du coup, quand tu compares une variable dans laquelle tu as stocké l'entier 0 à une chaîne vide, la chaîne vide est convertie en numérique (par un appel interne à Number) et la valeur résultante est 0, ce qui fait que les valeurs "" et 0 sont capturées dans le premier Case.

De plus, comme tu peux le constated ci-dessous, une variable déclarée mais non initialisée l'est en interne avec une chaîne vide. Donc il est inutile de remplir les entrées de ton tabvleau avec "" et tu peux allègrement sucrer cette étape redondante.

Code : Tout sélectionner

Local $a
ConsoleWrite('$a est une ' & VarGetType($a) & ' contenant "' & $a & '"' & @LF)
If $a = "" Then ConsoleWrite('$a se compare positivement à "" avec l''opérateur =' & @LF)
If $a = 0  Then ConsoleWrite('$a se compare positivement à 0  avec l''opérateur =' & @LF)
If Not ($a == 0) Then ConsoleWrite("$a se compare négativement à 0  avec l'opérateur ==" & @LF)
ConsoleWrite('"" = 0 est ' & ("" = 0) & @LF)
ConsoleWrite('"" == 0 est ' & ("" == 0) & @LF)
Argh, grillé !

Ah oui, autre chose : ton titre n'est pas juste. Tu parles de valeur nulle, ce qui est inexact. Tu veux dire une chaîne vide, ce qui est différent de Null.

Re: [..] Problème de test entre la valeur 0 et nulle

Posté : ven. 19 juin 2015 23:28
par Yle
Messieurs bonsoir,

Merci pour vos réponses qui m'ont permises de résoudre mon souci
Bonne soirée et je passe le sujet en résolu.

Re: [R] Problème de test entre la valeur 0 et nulle

Posté : ven. 19 juin 2015 23:33
par jchd
Une autre façon de faire est de conserver l'initialisation mais de stocker -1 dans chaque élément (ou -99999, comme tu veux), puis de tester contre cette valeur dans le switch et à ce moment, ce premier test ne sert plus à rien.