|
| 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

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
rVec1x, rVec1y, rVec2x, rVec2y sont des réels rVec1len, rVec2len, rVecAng, VecProd, rVecSca sont des réels
i,j,w sont des entier
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 SupprimeTout(tabTableauEnregistre) SupprimeTout(TableauTraité) Ajoute(tabTableauEnregistre,LigneLue) j=1
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
TANTQUE ChaîneOccurrence(tabTableauEnregistre[j],"; ")=1 TableauTraité[w]=tabTableauEnregistre[j] j=j+1 w=w+1 FIN
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? |
| |
| |
| | | |
|
| | | | |
| | |
|