PureBasic

Forums PureBasic
Nous sommes le Dim 16/Juin/2019 16:22

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 72 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5
Auteur Message
 Sujet du message: Re: Epb v2.68
MessagePosté: Mar 11/Juin/2019 8:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2133
Localisation: 50200 Coutances
Merci Zorro pour ces nouvelles rassurantes.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Sam 15/Juin/2019 12:04 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
.....

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Dernière édition par Zorro le Sam 15/Juin/2019 21:20, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Sam 15/Juin/2019 13:48 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1563
Content de t'avoir donné une piste :P

D'après le gif, tu utilises PB 5.50 (3 ans d'age), mais je suppose que tu as aussi essayé avec une version plus récente ?
D'après l'historique des versions PB, Scintilla a été mis à jour sur PB 5.3, mais il l'a peut-être été aussi depuis sans que ce soit indiqué ? (je ne sais pas comment vérifier la version d'une DLL ?). Si j'affiche toutes les Scintilla.dll de mon disque (avec le génial Everything), j'en ai plein y compris des différentes selon les version de PB

Ton bug se produit uniquement quand tu ajoutes au début, ou aussi en ajoutant entre deux procédures existantes ?
Quelque soit le programme, le langage, dès qu'il y a des listes, on a souvent des emm... avec le premier et/ou dernier élément (ex: le treegadget en pb) et il faut faire un traitement à part rien que pour eux :?

Je n'ai pas encore regardé à fond ton code, mais il faudrait être sur de bien isoler les Procedure car elles peuvent avoir plusieurs syntaxes et ne se trouvent pas toujours en début de ligne.

Procedure[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...])

Immédiatement à gauche, soit un:
- Début de ligne
- Espace(s)
- Tab(s)
- :
Immédiatement à droite, soit un:
- Espace
- .

(si je ne me trompes ?)

Voila une regex pour isoler les mots clés "Procedure"
\bprocedure[ .]
(\b pour boundary (= limite = caractère non word (voir définition sur le net)) : permet d'isoler si "Procedure" est contre la marge gauche)
Suffixé d'un 'espace' ou 'point'

Code:
If Not CreateRegularExpression(0, "\bprocedure[ .]", #PB_RegularExpression_NoCase)
    Debug RegularExpressionError()
    End
EndIf

; OK
Debug MatchRegularExpression(0, "Procedure ")
Debug MatchRegularExpression(0, "Procedure. ")
Debug MatchRegularExpression(0, "   Procedure ") ; Tab
Debug MatchRegularExpression(0, "   Procedure ") ; Espace
Debug MatchRegularExpression(0, ":Procedure ")

; KO
Debug MatchRegularExpression(0, "EndProcedure ") ; Faux
Debug MatchRegularExpression(0, "ProcedureTest "); Faux

Ça ne traite pas tous les cas possible (ex: Procedure:) mais ceux qui sont faux ne peuvent exister puisque rejetés par la pré-compilation.

Intéressant exercice d'entretien de neurones (vive PB) :wink:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 8:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
(apres effacement de mes gif animé par un modo, qui a du se dire qu'elles etaient trop grosses ... je me disait qu'aujourd'hui tout le monde a au mini 1920x1080 ... mais j'oubliais les telephones portable et autre tablette bas de game)

j'ai moi meme effacé mes messages... je me suis rendu compte que j'exprimais mal le probleme ....

en fait le challenge , c'est pas de trouver la position d'un mot "procedure" et son numero de ligne , qui avec findstring() ne prends
pas trop de temps ...

le probleme c'est de trouver TOUTES les occurences de Procedure , avec les numero de lignes ou ils apparaissent

et l'air de rien , sur un code de 9000 lignes , ben ça peut prendre beaucoup plus de temps ;)

si en plus on considere, qu'il faut ranger dans une liste (ou tableau) le nom de la procedure , et le numero de ligne
donc , qu'a chaque fois qu'on trouve une occurence, il faut effectuer un traitement particulier d'analyse de la ligne
de la séparation de celle-ci en "morceaux" pour etre attribué a une liste ou tableau ... là , les quelque milliseconde de recherche par occurence trouvée
se transforme en secondes pour un texte complet .....



l'editeur officiel doit utiliser une subtilité de scintilla que j'ignore , j'imagine une forme de tag , invisible , soit au niveau du contenu de la ligne
la mise a jour de l'onglet de droite que ce soit pour une procedure, ou un signet, est quasi instantané , quelque soit la taille du listing !!
je n'imagine meme pas qu'il utilise un systeme de recherche ... c'est trop rapide ...

de plus, moi j'utilise dans mon onglet le numero de la ligne, pour pouvoir sauter dessus lorsqu'on clique sur l'onglet de droite ....
l'editeur officiel, lui n'affiche aucun numero de ligne dans cet onglet ... donc, comment ferai t'il son "saut" a la bonne ligne,
si le numero de ligne n'est pas retenu quelque part ?? ....

mon systeme marche tres bien sur de petits listings
l'editeur officiel , lui fait un tour de magie !! LOL que franchement je ne comprends pas 8O
(a moins d'une fonction scintilla special ? .. )

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 10:24 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1563
Utilise les RegEx :wink:

Et hop, en 10 minutes un petit Quick and dirty code mais fonctionnel. :) 8)

Test: Un fichier PB de 9800 lignes contenant 127 procédures
Machine: Intel i3 disque dur non-SSD
- Chargement du fichier en RAM: 8 ms
- Extraction des 127 procédures et de leur offset: 71 ms :P (et encore, je fais un affichage formaté. L’enregistrement en liste irait bien plus vite)
- Fonctions: RegularExpressionMatchPosition et RegularExpressionMatchString(0)
Code:
; Mémorisation fichier de test (code pb 9800 lignes 127 procedures)
Deb = ElapsedMilliseconds()
Debug "Lecture Fichier source en cours..."
ReadFile(0, "TestFile9800Lines.pb")
While Not Eof(0)
    Txt$ = ReadString(0, #PB_File_IgnoreEOL)
Wend   
CloseFile(0)
Fin = ElapsedMilliseconds()
Debug "Lecture Terminée. (" + Str(Fin - Deb) + " ms)"

; Analyse
If Not CreateRegularExpression(0, "\bprocedure[ .]{1,}\w+", #PB_RegularExpression_NoCase)
    Debug RegularExpressionError()
    End
EndIf

Debug "Analyse..."
Deb = ElapsedMilliseconds()

If ExamineRegularExpression(0, Txt$)
    Debug "--- Resultat"
    While NextRegularExpressionMatch(0)
        i + 1
        Debug "Offset: " + LSet(Str(RegularExpressionMatchPosition(0)), 8, " ") + " - " +
              RegularExpressionMatchString(0)
        Wend   
EndIf
Debug ""

Fin = ElapsedMilliseconds()
Debug "Analyse Terminée. (" + Str(Fin - Deb) + " ms) " + Str(i) + " Procédures"

:idea: Suite: pas besoin de compter tous les sauts de lignes depuis le début, mais juste ceux depuis le précédent offset

(La suite plus tard, là ça va être l'apéro :D )


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 10:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
merci , je vais regarder ta technique :)

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 10:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
oui effectivement, c'est super rapide ...

faut que je regarde ces expressions regulieres... 8O

faut que j'isole nom de procedure + parametre (avec parenthese) -->nom_procedure(par,par,..ect ), <-- pour la completion
et aussi juste le nom de procedure sans parenthese et parametre <--- pour l'onglet
si en plus j'avais le numero de ligne...ça m'arrangerai bien <--- pour les sauts plus tard...et puis j'aime bien les avoir dans l'onglet

je vais faire mes propres recherches ;) ... je n'attends pas un code tout cuit :lol:

en tout cas, merci bien, tu vas peut etre , etre a l'origine de la reprise de EPB :) carrement ça me debloque...

j'aime bien travailler sur les Chaines, mais a l'ancienne (mid() Left() right() findstring() etc ... ) les expression regulieres, je ne maitrise pas :)

ps: a ta santé (avec la meilleurs bierre du monde ! ); Image

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 14:31 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1563
Merci pour la bière 8)

Bon, voila un autre affreux code (mais qui marche)
Te donne tous les numéros de lignes qui contiennent "Procédure (+un nom)
À améliorer pour isoler la suite après le nom
+ bug si la procédure est typée, le type est affiché avant le nom (je vais affiner la regex)

Code:
; Recherche des numéros de lignes contenant "Procedure (+ nom)
; dans un fichier source PB

; Mémorisation fichier de test (code pb 9800 lignes 127 procedures)
Deb = ElapsedMilliseconds()
Debug "Lecture Fichier source en cours..."
ReadFile(0, "TestFile9800Lines.pb")
While Not Eof(0)
    Txt$ = ReadString(0, #PB_File_IgnoreEOL)
Wend   
CloseFile(0)
Fin = ElapsedMilliseconds()
Debug "Lecture Terminée. (" + Str(Fin - Deb) + " ms)"

; Analyse
If Not CreateRegularExpression(0, "\bprocedure(?:[ .]\w)?\s+\w+", #PB_RegularExpression_NoCase)
    Debug RegularExpressionError()
    End
EndIf

Structure Type_Bookmark
    Offset.i    ; Position de la chaine "Procedure ..."
    Text$       ; Texte de la procédure (pour l'instant juste le nom)
    Line_Nb.i   ; Numéro de ligne (après calcul)
EndStructure
NewList Bookmark.Type_Bookmark()

Debug "Analyse..."
Deb = ElapsedMilliseconds()
If ExamineRegularExpression(0, Txt$)
    Debug "--- Resultat"
    While NextRegularExpressionMatch(0)
        i + 1
        AddElement(Bookmark())
        With Bookmark()
            \Offset = RegularExpressionMatchPosition(0)
            \Text$  = RegularExpressionMatchString(0)
        EndWith
    Wend   
EndIf
Debug ""

Fin = ElapsedMilliseconds()
Debug "Analyse Terminée. (" + Str(Fin - Deb) + " ms) " + Str(i) + " Procédures"

; ShowVariableViewer() : CallDebugger

Debug "Recherche des numéros de ligne..."
Deb = ElapsedMilliseconds()
; Ici je recompte depuis le début. On pourrait faire mieux en comptant depuis la dernière position
ForEach Bookmark()
    Txt_Part$ = Left(Txt$, Bookmark()\Offset)
    Bookmark()\Line_Nb = CountString(Txt_Part$, #CRLF$) + 1
    Debug "Ligne #" + LSet(Str(Bookmark()\Line_Nb), 6, " ") + " " + RemoveString(Bookmark()\Text$, "Procedure", #PB_String_NoCase)
Next
Fin = ElapsedMilliseconds()
Debug "Numéros de lignes trouvées en (" + Str(Fin - Deb) + " ms) " + Str(i) + " Procédures"

Test sur un PB de 9800 lignes sur i3 : 89 ms ! pour trouver le numéro de ligne de 135 procédures.
:idea: Si tu trouve que c'est encore trop lent, tu peux faire en sorte de régénérer la liste que sur commande avec un bouton

:wink:


Dernière édition par Marc56 le Dim 16/Juin/2019 14:43, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 14:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
arf!! j'etais tout fier de te montrer mon complement du regex
pour avoir la procedure complete :mrgreen:

Code:
If Not CreateRegularExpression(0, "\bprocedure[ .]{1,}[a-zA-Z_0-9-\(.\)-,-$-*- ]+", #PB_RegularExpression_NoCase)


vais tester ton code . Merci :)

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 14:50 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1563
Elle fonctionne bien :)
Mais comme la mienne, elle met dans le nom l'éventuel type

Ex:
Procedure.i maprocedure() :arrow: .i maprocedure()

Mais je me demande si c'est plus rapide de faire une procédure capturante ou de couper (removestring) l'éventuel .type à gauche ?

À tester...

Tu va y prendre gout aux regex :mrgreen:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 15:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
oui je prends aussi le type , puisque ceci sera pour les completions ...

regarde j'apprends vite :)

j'ai repris ton premier code , et je rajoute le numero de ligne ;)

grace a toi je pense que EPB va prendre un coup de turbo :)

Code:
; Mémorisation fichier de test (code pb 9800 lignes 127 procedures)


CallDebugger
file.s=OpenFileRequester("ouvre un pb","d:\","*.pb",0)
If file.s<>""

Debug "Lecture Fichier source en cours..."
ReadFile(0,file.s)
Deb = ElapsedMilliseconds()
While Not Eof(0)
    Txt$ = ReadString(0, #PB_File_IgnoreEOL)
Wend   
CloseFile(0)
Fin = ElapsedMilliseconds()
Debug "Lecture Terminée. (" + Str(Fin - Deb) + " ms)"
Else
   End
EndIf

; Analyse
If Not CreateRegularExpression(0, "\bprocedure[ .]{1,}[a-zA-Z_0-9-\(.\)-,-$-*- ]+", #PB_RegularExpression_NoCase)
    Debug RegularExpressionError()
    End
EndIf

Debug "Analyse..."
Deb = ElapsedMilliseconds()

If ExamineRegularExpression(0, Txt$)
   Debug "--- Resultat"
   While NextRegularExpressionMatch(0)
      i + 1
      pos_procedure=RegularExpressionMatchPosition(0)
      Debug "Offset: " + LSet(Str(RegularExpressionMatchPosition(0)), 8, " ") + " - " +RegularExpressionMatchString(0) +"ligne numero:"+CountString(Left(Txt$,pos_procedure), #CRLF$) + 1
   Wend   
EndIf
Debug ""

Fin = ElapsedMilliseconds()
Debug "Analyse Terminée. (" + Str(Fin - Deb) + " ms) " + Str(i) + " Procédures"

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Epb v2.68
MessagePosté: Dim 16/Juin/2019 15:04 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1970
merci encore :)

je vais faire ensuite l'adaptation pour les signets
(lignes commençant par ";-" ou ";{" ou ";{-" )



et aussi les constantes (le plus simple ) lignes commençant par "#" :)

mais là , c'est Dimanche , je vais m'arreter là :)

bon Dimanche a toi , (et a ceux qui lisent ) a+++ :)

ps: pour le type c'est pas trop grave , un traitement finale a base de Stringfield() ne prends pas beaucoup de temps
le plus long etant bien la recherche , et grace au regex , ben ... ça le fait , je pense :)

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 72 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye