[RESOLU]Trier une structure sur 2 arguments

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU]Trier une structure sur 2 arguments

Message 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 




 





Dernière modification par omega le dim. 13/oct./2019 23:15, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Trier une structure sur 2 arguments

Message 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
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU]Trier une structure sur 2 arguments

Message 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:
Répondre