PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Boucle infinie
Boucle infinie
Iniciado por Quentin Lec., 26,feb. 2020 11:08 - 2 respuestas
Miembro registrado
18 mensajes
Publicado el 26,febrero 2020 - 11:08
Bonjour à toutes et à tous

Lors du test de mon programme, j'ai une boucle infinie (je suppose), hors je n'arrive pas à en trouver l'origine.
Le test que je réalise avec le fichier (voir Screenshot plus bas) me permet de directement recopier les lignes sans les traiter.
Le programme devrait donc se lancer puis s’arrêter quasiment instantanément hors ce n'est pas le cas.

Merci d'avance pour cette longue lecture







// Déclaration des variables
FichierNonTraité est une chaîne
sFichierTraité est une chaîne
IDFichier est un entier
LigneLue est une chaîne
tabTableauEnregistre est un tableau <agrandissement=1> de chaînes
TableauTraité est un tableau <agrandissement=1> de chaînes
Extractchaine est une chaîne
X1, X2, X3, Y1, Y2, Y3, E, rXmin ,rXmax, rYmin, rYmax, Dx, Dy, Cx, Cy, Rayon sont des réels
rDecx,rDecy sont des réels
//Xc, Yc, rRayonc sont des réels
//a1, b1, a2, b2 sont des réels
rVec1x, rVec1y, rVec2x, rVec2y sont des réels
rVec1len, rVec2len, rVecAng, VecProd, rVecSca sont des réels
//rXdeb,rYdeb sont des réels
i,j,w sont des entier

// Sélection du fichier à analyser et création du fichier d'extraction
FichierNonTraité = fSélecteur("", "","Sélection du fichier gcode à analyser", ...
"Fichier externe" + TAB + "*.gcode", "gcode", fselCrée)
IDFichier = fOuvre(FichierNonTraité)
SI IDFichier = -1 ALORS
Erreur(ErreurInfo(errMessage))
SINON
sFichierTraité = fCrée("C:\Users\Fnay\Desktop\ExtractWindev\FichierTraité.gcode")
SI sFichierTraité = -1 ALORS
Erreur(ErreurInfo(errMessage))
SINON
fOuvre(sFichierTraité)
SI sFichierTraité = -1 ALORS
Erreur(ErreurInfo(errMessage))
SINON
FIN
FIN
FIN
// Boucle principale
BOUCLE
SupprimeTout(tabTableauEnregistre)
SupprimeTout(TableauTraité)
Ajoute(tabTableauEnregistre,LigneLue)
j=1
// Extraction d'une couche dans le 1er tableau
BOUCLE
LigneLue = fLitLigne(IDFichier)
SI ErreurDétectée ALORS
Erreur(ErreurInfo())
SORTIR
FIN
SI ChaîneOccurrence(LigneLue,"; layer ")=1 OU LigneLue = EOT ALORS SORTIR
tabTableauEnregistre[j]=LigneLue
j=j+1
FIN
j=1
w=1
E=0
// Inscription des commentaires et début de layer
TANTQUE ChaîneOccurrence(tabTableauEnregistre[j],"; ")=1
TableauTraité[w]=tabTableauEnregistre[j]
j=j+1
w=w+1
FIN
// Inscription des codes ne contenant pas de X et Y
TANTQUE ChaîneOccurrence(tabTableauEnregistre[j],"X")=0 OU ChaîneOccurrence(tabTableauEnregistre[j],"Y")=0
TableauTraité[w]=tabTableauEnregistre[j]
j=j+1
w=w+1
FIN
FinProgramme()
BOUCLE
SI TableauCherche(tabTableauEnregistre,tcLinéaireDernier,"")=(j-1) ALORS SORTIR
POUR i=1 À 3
{"X"+i,indVariable}=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"X")+1 À]])
{"Y"+i,indVariable}=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"Y")+1 À]])
E=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"E")+1 À]])+E
j=j+1
FIN
rVec1x=X2-X1
rVec1y=Y2-Y1
rVec2x=X3-X2
rVec2y=Y3-Y2
rVec1len=rVec1x^2+rVec1y^2
rVec2len=rVec2x^2+rVec2y^2
VecProd=rVec1x*rVec2y-rVec2x*rVec1y
rVecSca = rVec1x * rVec2x + rVec2y * rVec1y
SI rVec1len<>0 ET rVec2len<>0 ALORS
rVecAng=(((VecProd^2)/rVec1len)/rVec2len)*90
rVec1len = rVec1len^0.5
rVec2len = rVec2len^0.5
SINON
SI rVecSca < 0 ALORS
rVecAng= 180-rVecAng
SINON
FIN
SI VecProd < 0 ALORS
rVecAng = - rVecAng
SINON
FIN
FIN
SELON rVecAng
CAS 0 : TableauTraité[w]=tabTableauEnregistre[j-3]
w=w+1
TableauTraité[w]=tabTableauEnregistre[j-2]
w=w+1
TableauTraité[w]=tabTableauEnregistre[j-1]
w=w+1
CAS À 5 :
rXmin=X1
rXmax=X1
rYmin=Y1
rYmax=Y1
BOUCLE
SI ChaîneOccurrence(tabTableauEnregistre[j],"E0.0000")=1 OU ChaîneOccurrence(tabTableauEnregistre[j],"; ")=1 OU TableauCherche(tabTableauEnregistre,tcLinéaireDernier,"")=(j-1) ALORS SORTIR
SI rXmin>Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"X")+1 À]]) ALORS rXmin=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"X")+1 À]])
SI rXmax<Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"X")+1 À]]) ALORS rXmax=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"X")+1 À]])
SI rYmin>Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"Y")+1 À]]) ALORS rYmin=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"Y")+1 À]])
SI rYmax<Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"Y")+1 À]]) ALORS rYmax=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"Y")+1 À]])
E=Val(tabTableauEnregistre[j][[Position(tabTableauEnregistre[j],"E")+1 À]])+E
j=j+1
FIN
Dx=rXmax-rXmin
Dy=rYmax-rYmin
Cx=(rXmax+rXmin)/2
Cy=(rYmax+rYmin)/2
Rayon=Dx/2
rDecx=Cx-Rayon*Cosinus(-5/(180*3.14))
rDecy=Cy-Rayon*Sinus(-5/(180*3.14))
TableauTraité[w]="G1 x" &rXmin &" Y" &Cy
w=w+1
TableauTraité[w]="G3 X" &(rXmin+2*Rayon) &" Y" &Cy &" R" &Rayon &" E" &E/2
w=w+1
TableauTraité[w]="G3 X" &rDecx &" Y" &rDecy &" R" &Rayon &" E" &E
w=w+1
TableauTraité[w]="G3 X" &rXmin &" Y" &Cy &" R" &Rayon
w=w+1

CAS 5 À 180 :

AUTRE CAS :
FIN
FIN
POUR TOUT ValeurTableauTraite de TableauTraité
Extractchaine+=[RC] + ValeurTableauTraite
FIN
fSauveTexte("C:\Users\Fnay\Desktop\ExtractWindev\FichierTraité.gcode",Extractchaine)
SI LigneLue= EOT ALORS SORTIR
SAI_ContenuFichier=X1 + RC + Y1 + RC + X2 + RC + Y2 + RC + X3 + RC + Y3 + RC + rVecAng + RC + E
FIN
ToastAffiche("Traitement du fichier terminé")
Miembro registrado
4.362 mensajes
Publicado el 26,febrero 2020 - 11:27
Bonjour,
As-tu tenté d'exécuter ton code en mode pas à pas ?

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
18 mensajes
Publicado el 26,febrero 2020 - 11:51
Bonjour,
Update qui répond à ton commentaire, j'ai coupé lin fichier test afin de garder un minimum de ligne et le problème vient de la boucle tant que concernant X et Y.

Celle ci donc :
TANTQUE ChaîneOccurrence(tabTableauEnregistre[j],"X")=0 OU ChaîneOccurrence(tabTableauEnregistre[j],"Y")=0
TableauTraité[w]=tabTableauEnregistre[j]
j=j+1
w=w+1
FIN


En fait la valeur de X et Y reste à 0 donc la boucle tourne.
J'ai donc essayé d'y ajouté une sortie, ici en l’occurrence avec le nombre d'élément max du tableau :

SI TableauCherche(tabTableauEnregistre,tcLinéaireDernier,"")=(j-1) ALORS SORTIR


Mais cela ne fonctionne pas.

Des idées?