Page 1 sur 1

[RESOLU]Trier une structure sur 2 arguments

Publié : dim. 13/oct./2019 23:01
par omega
Bonsoir,

Je ne comprends pas ce qui se passe car ce code marchait si bien depuis plus d'une année et maintenant, en changeant seulement le nom d'un champs, le tri ne marche plus ! Il s'agit de trier une liste structurée sur 2 arguments.

Code : Tout sélectionner

NewList JstockListe
;
Structure Jstock
  mag.s
  fam.s
  prod.s
  stock.s
  pu.s
  mnt.s
  cletri.s
EndStructure
;
;En remplissant la liste, je mets le champs mag et le champs fam dans Cletri 
     AddElement(JstockListe())
     JstockListe()\mag=Mag$
     JstockListe()\fam=Fam$
     JstockListe()\prod=Des$
     JstockListe()\Stock=wqf$
     JstockListe()\pu=wpmp$
     JstockListe()\Mnt=wvaleur$
     JstockListe()\cletri=mag$+space(1)+fam$

;Avant de lister le contenu, je trie ma liste:
SortStructuredList(jstockListe(), #PB_Sort_Ascending, OffsetOf(jstock\cletri),TypeOf(jstock\cletri))

;La liste affichée est malheureusement non triée sur les arguments spécifiés (mag + fam)

Merci de m'éclairer 




 






Re: Trier une structure sur 2 arguments

Publié : dim. 13/oct./2019 23:12
par omega
C'est bizarre, ça me dépasse ! Le problème est réglé mais je ne saurais l'expliquer ...
J'ai seulement remplacé

Code : Tout sélectionner

JstockListe()\cletri=mag$+space(1)+fam$
par

Code : Tout sélectionner

 dans JstockListe()\cletri=mag$+fam$+des$
Je ne suis pas convaincu mais bon,voilà.... ça marche. N'empêche que je suis très curieux d'en connaître la cause!

Merci à tous

Re: [RESOLU]Trier une structure sur 2 arguments

Publié : lun. 14/oct./2019 8:54
par Marc56
(Ce serait bien de donner un exemple complet et testé et pas des bouts de codes avec erreur de syntaxe... NewList -> NewList nom.<type>() et ça se déclare après la définition de structure) 8)

Donc un exemple complet

Code : Tout sélectionner

Structure Jstock
    mag.s
    fam.s
    prod.s
    stock.s
    pu.s
    mnt.s
    cletri.s
EndStructure

NewList JstockListe.Jstock()

Debug #CRLF$ + "--- Préparation structure"
Restore DataTest
For i = 1 To 3
    Read.s Mag$
    Read.s Fam$
   
    AddElement(JstockListe())
    With JstockListe()
        \mag    = Mag$
        \fam    = Fam$
        \prod   = Des$
        \Stock  = wqf$
        \pu     = wpmp$
        \Mnt    = wvaleur$
        ; \cletri = mag$ + Space(1) + fam$
        \cletri = mag$ + " " + fam$
    EndWith
   
    Debug Mag$ + "," + Fam$ + " -> «" + JstockListe()\cletri + "»"
Next


Debug #CRLF$ + "--- AVANT Tri"
ForEach JstockListe()
    Debug "Mag: " + JstockListe()\mag + " - CleTri -> «" + JstockListe()\cletri + "»"
Next

SortStructuredList(jstockListe(), #PB_Sort_Ascending, OffsetOf(jstock\cletri),TypeOf(jstock\cletri))

Debug #CRLF$ +  "--- APRES Tri"
ForEach JstockListe()
    Debug "Mag: " + JstockListe()\mag + " - CleTri -> «" + JstockListe()\cletri + "»"
Next

End

DataSection
    DataTest:
    Data.s "b bb", "b cc", "b bb", "a cc", "c cc", "c dd"
EndDataSection
Résultat

Code : Tout sélectionner

--- Préparation structure
b bb,b cc -> «b bb b cc»
b bb,a cc -> «b bb a cc»
c cc,c dd -> «c cc c dd»

--- AVANT Tri
Mag: b bb - CleTri -> «b bb b cc»
Mag: b bb - CleTri -> «b bb a cc»
Mag: c cc - CleTri -> «c cc c dd»

--- APRES Tri
Mag: b bb - CleTri -> «b bb a cc»
Mag: b bb - CleTri -> «b bb b cc»
Mag: c cc - CleTri -> «c cc c dd»
Ceci fonctionne, le tri s'est bien fait sur CleTri
Mais après ça dépend de tes données
- Dixit la doc, SortStructuredList ne trie pas les champs de longueur fixe (mais tu n'en as pas ici)
- Dixit la doc, le tri est sensible aux majuscules/minuscules
- Utiliser une fonction plutôt que son résultat connu d'avance provoque des calculs supplémentaires à chaque itération. Donc " " ou Chr(32) est mieux dans ce cas que Space(1)

:wink: