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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 171
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

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

#1

Message 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
Modifié en dernier par Yle le ven. 19 juin 2015 23:32, modifié 2 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#2

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#3

Message 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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 171
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

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

#4

Message 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.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#5

Message 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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre