J’Y SUIS ARRIVÉ !!!
Premier appel :
SI TableauInfo(iet_jour,tiDimension) = 0 ALORS
//aucun élément, c’est facile
TableauAjoute(iet_jour, le_HeureDeb)
TableauAjoute(iet_jour, le_HeureFin)
SINON
TableauSupprimeTout(iet_TabTampon)
POUR le_I2 = 1 A TableauInfo(iet_jour,tiDimension) / 2
Test_Recouvrement(iet_jour, le_HeureDeb, le_HeureFin, le_I2)
FIN
TableauCopie(iet_TabTampon, {ict_Jours[le_I]})
FIN
Et la fonction récursive :
FONCTION Test_Recouvrement(pc_NomTableau est une chaîne, pe_ValAjoutDeb est un entier, pe_ValAjoutFin est un entier, pe_Indice est un entier)
le_BorneDeb, le_BorneFin sont des entiers
SI TableauInfo({pc_NomTableau}, tiDimension) >= pe_Indice * 2 ALORS
//Récupération des bornes
le_BorneDeb = {pc_NomTableau}[pe_Indice * 2 -1]
le_BorneFin = {pc_NomTableau}[pe_Indice * 2]
SINON
//Insertion directe. On a dépassé le niveau max
TableauAjoute(iet_TabTampon, pe_ValAjoutDeb)
TableauAjoute(iet_TabTampon, pe_ValAjoutFin)
RENVOYER 2
FIN
SI pe_ValAjoutDeb < le_BorneDeb ALORS
SI pe_ValAjoutFin < le_BorneDeb ALORS
//Complètement avant la borne suivante, insère et renvoie 1
TableauAjoute(iet_TabTampon, pe_ValAjoutDeb)
TableauAjoute(iet_TabTampon, pe_ValAjoutFin)
TableauAjoute(iet_TabTampon, le_BorneDeb)
TableauAjoute(iet_TabTampon, le_BorneFin)
RENVOYER 1
SINON
SI pe_ValAjoutFin <= le_BorneFin ALORS
//Rejoint la borne suivante sans dépasser le recouvrement, insère et renvoie 3
TableauAjoute(iet_TabTampon, pe_ValAjoutDeb)
TableauAjoute(iet_TabTampon, le_BorneFin)
RENVOYER 3
SINON
//les valeurs à insérer incluent la borne actuelle
pe_Indice++
SI Test_Recouvrement(pc_NomTableau, le_BorneDeb, pe_ValAjoutFin, pe_Indice) = 5 ALORS
RENVOYER 5
FIN
FIN
FIN
SINON
SI pe_ValAjoutDeb <= le_BorneFin ALORS
//Débute dans la borne actuelle
SI pe_ValAjoutFin <= le_BorneFin ALORS
//Les valeurs à ajouter sont inclues dans les bornes, l’ajout est inutile, on insère néanmoins les valeurs
TableauAjoute(iet_TabTampon, le_BorneDeb)
TableauAjoute(iet_TabTampon, le_BorneFin)
RENVOYER 6
SINON
pe_Indice++
SI Test_Recouvrement(pc_NomTableau, le_BorneDeb, pe_ValAjoutFin, pe_Indice) = 5 ALORS
RENVOYER 5
SINON
RENVOYER 4
FIN
FIN
SINON
//Insertion “propre” à la suite de la borne
TableauAjoute(iet_TabTampon, le_BorneDeb)
TableauAjoute(iet_TabTampon, le_BorneFin)
pe_Indice++
SI Test_Recouvrement(pc_NomTableau, pe_ValAjoutDeb, pe_ValAjoutFin, pe_Indice) = 5 ALORS
RENVOYER 5
SINON
RENVOYER 2
FIN
FIN
FIN
RENVOYER 0
A noter que les retours ne sont (presque pas) utilisés mais me permettent de me repérer dans le code.
Le tableau iet_TabTampon est un tableau d’instance (portée dans tout l’objet), nécessaire pour que le lien entre les différents appels à la fonction travaillent sur un tableau viable.
Pour ceux qui ne connaissent pas windev, les opérateurs {} permettent de faire une référence dynamique à un contrôle/une variable à l’éxecution et les fonction TableauInfo(), TableauAjoute() etc sont des fonctions intégrées au langage.
Quand on vous dit que c’est puissant… ![]()
Ah oui, et le premier qui critique ma façon de nommer les variables se prends un double combo de programmeur furax (“mouahah, on code plus ça depuis longtemps, c’est dépassé”, rien à foutre au moins je connais le type et la portée de mes variables !).