Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Analyse d'un programme source .bas | |
| | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Analyse d'un programme source .bas Dim 31 Oct 2010 - 23:50 | |
| Pour visualiser un source, extraire la liste des variables, des labels, des objets et leur utilisation. Le premier nombre affiché entre crochets est la ligne de déclaration, les autres sont les lignes d'utilisation. Également la liste des lignes contenant des If, Else, End_If, pour recherche une erreur éventuelle. Il n'y a pas de mode d'emploi, mais ça me paraît assez intuitif. Il y a quelques variables à adapter, au début: fm$, fn$, dir$ C'est un peu long (600 lignes...) - Code:
-
' Analyse d'un programme source Panoramic (.bas) DIM w0, h0, a$, a1$, b$, c$, v$, sva$, fm$, fn$, f$, fs$, font$, fsz%, fpr%, afl% DIM i%, j%, k%, k1%, k2%, n%, nl%, u%, ign%, lv%, flf%, fls%, dir$, flsz%, lc%, nc% DIM objn$(50), var$(100), obj$(100), eti$(80), tob%, nvar%, nobj%, neti%, wf, hf DIM indt%, car$(20), tca%, p$, s$, marg%, ll%(5000)
LABEL opn, opn1, sav, savs, sauve, impr, quit, chp, cnl, vfont, vlf, new, copy LABEL paste, cut, Misfo, Listvar, Recvar, Reclab, Receti, Recobj, Recif, Recsou LABEL Instrs, Mids, der, ra, rb, rc, rd, re, rf, rg, rk, rces, rcvs LABEL Suit1, Suit2, Suit3, Suit4, Suit41, Suit5, Suit51, Suit6, Suit7, Suit8, Suit9 LABEL Recwhile, Recrep, Recseq, Debug, Ecsva, Supelem, Charsou, Afl, Supquot ' ERROR_FRENCH: ON_ERROR_GOTO Debug ' Noms des objets Panoramic: DATA "FORM ","BUTTON ","CHECK ","CONTAINER ","DLIST ","LIST ","EDIT ","MEMO " DATA "OPEN_DIALOG ","TIMER ","PICTURE ","ALPHA ","COMBO ","MOVIE ","GRID " DATA "OPTION ","SCENE2D ","SCENE3D","SCROLL_BAR ","SOUND ","SPIN ","SPRITE " DATA "MAIN_MENU ","SUB_MENU " DATA "#" tob% = 0: READ a$ WHILE a$ <> "#": tob% = tob% + 1: objn$(tob%) = a$: READ a$ : END_WHILE ' Caractères susceptibles de côtoyer les variables dans le code ' (254 si variable en début de ligne, 255 si variable en fin de ligne) DATA " ","=",":","+","-","*","/",",",">","<","(",")",";",CHR$(254),CHR$(255) DATA "#" tca% = 0: READ a$ WHILE a$ <> "#": tca% = tca% + 1: car$(tca%) = a$: READ a$: END_WHILE
fm$ = "C:\TEMP\fpri.tmp" fn$ = "C:\TEMP\ftmp.tmp" dir$ = "C:\LANGAGES\Panoramic": ' répertoire des sources Panoramic
w0 = 800: h0 = 900: h0 = SCREEN_Y-30 WIDTH 0, w0: HEIGHT 0, h0 CAPTION 0, " - ANALYSE D'UN PROGRAMME SOURCE PANORAMIC (.bas) - afl% = 1: ' affichage implicite des numéros de lignes marg% = 8
' Menus --------------------------------------------------------------- MAIN_MENU 1
' Menu principal SUB_MENU 2: CAPTION 2,"Fichier" : PARENT 2, 1 SUB_MENU 3: CAPTION 3,"Edition" : PARENT 3, 1 SUB_MENU 4: CAPTION 4,"Affichage": PARENT 4, 1 SUB_MENU 5: CAPTION 5,"Recherches": PARENT 5, 1
' Sous-menus 2 (Fichier) SUB_MENU 21: CAPTION 21,"Nouveau" : PARENT 21, 2 SUB_MENU 22: CAPTION 22,"Ouvrir" : PARENT 22, 2 SUB_MENU 23: CAPTION 23,"Ouvrir dernier enregistré": PARENT 23, 2 SUB_MENU 24: CAPTION 24,"Enregistrer" : PARENT 24, 2 SUB_MENU 25: CAPTION 25,"Enregistrer sous...": PARENT 25, 2 SUB_MENU 26: CAPTION 26,"Imprimer": PARENT 26, 2 SUB_MENU 27: CAPTION 27,"Quitter" : PARENT 27, 2 ON_CLICK 21, new: ON_CLICK 22, opn: ON_CLICK 23, der: ON_CLICK 24, sav ON_CLICK 25, savs: ON_CLICK 26, impr: ON_CLICK 27, quit
' Sous-menus 3 (Edition) SUB_MENU 31: CAPTION 31,"Copier" : PARENT 31, 3 SUB_MENU 32: CAPTION 32,"Coller" : PARENT 32, 3 SUB_MENU 33: CAPTION 33,"Couper" : PARENT 33, 3 ON_CLICK 31, copy: ON_CLICK 32, paste: ON_CLICK 33, cut
' Sous-menus 4 (Affichage) SUB_MENU 41: CAPTION 41,"Police": PARENT 41, 4 SUB_MENU 42: PARENT 42, 4 IF afl% = 0 CAPTION 42,"Numéros de lignes" ELSE CAPTION 42, "Suppr. N°s de lignes" END_IF ON_CLICK 41, chp: ON_CLICK 42, cnl
' Sous-menus 5 (Recherches) SUB_MENU 51: CAPTION 51,"Variables": PARENT 51, 5 SUB_MENU 52: CAPTION 52,"Labels": PARENT 52, 5 SUB_MENU 53: CAPTION 53,"Objets": PARENT 53, 5 SUB_MENU 54: CAPTION 54,"If...Then...End_If": PARENT 54, 5 SUB_MENU 55: CAPTION 55,"While...End_While": PARENT 55, 5 SUB_MENU 56: CAPTION 56,"Repeat...Until": PARENT 56, 5 SUB_MENU 57: CAPTION 57,"Sous-programmes": PARENT 57, 5 SUB_MENU 58: CAPTION 58,"Séquence...": PARENT 58, 5 ON_CLICK 51, Listvar: ON_CLICK 52, Reclab: ON_CLICK 53, Recobj ON_CLICK 54, Recif: ON_CLICK 55, Recwhile: ON_CLICK 56, Recrep ON_CLICK 57, Recsou: ON_CLICK 58, Recseq ' Fin menus -------------------------------------------------------------
FORM 96: TOP 96, 60: LEFT 96, 50: HEIGHT 96, 180: WIDTH 96, 260: HIDE 96 CAPTION 96, "Police/Taille" LIST 97: PARENT 97, 96: TOP 97, 5: HEIGHT 97, 90: WIDTH 97, 150 FONT_NAMES_LOAD 97: ON_CLICK 97, vfont SPIN 98: PARENT 98, 96: TOP 98, 5: LEFT 98, 160: WIDTH 98, 60 POSITION 98, 10: MIN 98, 6: MAX 98, 30: ON_CLICK 98, vfont BUTTON 99: PARENT 99, 96: TOP 99, 60: LEFT 99, 160: WIDTH 99, 80 CAPTION 99, "OK": ON_CLICK 99, vlf LIST 100: PARENT 100, 96: TOP 100, 100: WIDTH 100, 240: HEIGHT 100, 40 font$ = "Bitstream Vera Sans Mono": fsz% = 10 FONT_NAME 100, font$: FONT_SIZE 100, fsz% ITEM_ADD 100, font$ ITEM_ADD 100, "Voyez le Brick Géant Que J'examine Près du Wharf"
OPEN_DIALOG 11 FILTER 11,"Sources .bas|*.bas|Textes .txt|*.txt|Tous|*.*" SAVE_DIALOG 13 FILTER 13,"Sources|*.bas|Textes|*.txt|Tous|*.*"
' Fenêtre principale d'affichage fpr% = 12 MEMO fpr%: WIDTH fpr%, w0-16: HEIGHT fpr%, h0-56 FONT_NAME fpr%, font$: FONT_SIZE fpr%, fsz% BAR_BOTH fpr%
' Fenêtre des résultats de recherches flf% = 78: wf = 500: hf = h0-100 FORM flf%: TOP flf%, 60: LEFT flf%, 200: WIDTH flf%, wf: HEIGHT flf%, hf HIDE flf% fls% = flf%+1 LIST fls%: PARENT fls%, flf% TOP fls%, 0: LEFT fls%, 0: WIDTH fls%, wf-16: HEIGHT fls%, hf-40 COLOR fls%, 255,255,220 flsz% = 10: ' taille caractères FONT_NAME fls%, "Lucida Console": FONT_SIZE fls%, flsz%: FONT_COLOR fls%,0,0,128 lc% = INT(flsz%/1.25): IF FRAC(flsz%/1.25) >= 5 THEN lc% = lc%+1 nc% = INT(wf-20)/lc% - 4: ' nb de caractères affichables par ligne END ' -------------------------------------------------------------------- quit: TERMINATE ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- copy: CLIPBOARD_COPY fpr% RETURN paste: CLIPBOARD_PASTE fpr% RETURN cut: CLIPBOARD_CUT fpr% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- new: CLEAR fpr% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- opn: f$ = FILE_NAME$(11): IF f$ = "_" OR f$ = "" THEN RETURN opn1: IF afl% = 0 FILE_LOAD fpr%, f$ ELSE FILE_OPEN_READ 1, f$: FILE_OPEN_WRITE 2, fn$: nl% = 0 WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nl% = nl% + 1 a$ = STR$(nl%) + ": " + a$ IF nl% < 1000 THEN a$ = STRING$(4-LEN(STR$(nl%)), " ") + a$ FILE_WRITELN 2, a$ END_WHILE FILE_CLOSE 1: FILE_CLOSE 2 FILE_LOAD fpr%, fn$: FILE_DELETE fn$ END_IF select_text fpr%, 4500, 50 CAPTION 0, f$ + " " + STR$(COUNT(fpr%)) + " lignes." RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- der: EXECUTE_WAIT "Cmd.exe /C DIR " + dir$ + "\*.bas /O:-D /B >" + fm$ FILE_OPEN_READ 1, fm$ FILE_READLN 1, f$: FILE_CLOSE 1: FILE_DELETE fm$ f$ = dir$ + "" + f$: GOTO opn1 RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- sav: fs$ = f$: GOSUB sauve RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- savs: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN fs$ = FILE_NAME$(13): IF fs$ = "_" OR fs$ = "" THEN RETURN GOSUB sauve RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- sauve: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN FILE_OPEN_WRITE 1, fs$ FOR i% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, i%) IF afl% = 1 ' sauvegarde sans les numéros de lignes k% = INSTR(a$, ":") IF k% <= 5 IF LEN(a$) > (k%+1) a$ = MID$(a$, k%+2, LEN(a$)-k%-1) ELSE a$ = "" END_IF END_IF END_IF FILE_WRITELN 1, a$ NEXT i% FILE_CLOSE 1 RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- impr: FILE_SAVE fpr%, fm$ EXECUTE_WAIT "write.exe /p " + fm$ FILE_DELETE fm$ RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- chp: SHOW 96 RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- cnl: FILE_OPEN_WRITE 2, fn$ IF afl% = 0 FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%) FILE_WRITELN 2, STRING$(4-LEN(STR$(nl%)), " ") + STR$(nl%) + ": " + a$ NEXT nl% afl% = 1: CAPTION 42, "Suppr. N°s de lignes" ELSE FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%) k% = INSTR(a$, ": ") IF k%<=5 IF LEN(a$)>(k%+1) a$ = MID$(a$, k%+2, LEN(a$)-k%-1) ELSE a$ = "" END_IF END_IF FILE_WRITELN 2, a$ NEXT nl% afl% = 0: CAPTION 42, "Numéros de lignes" END_IF FILE_CLOSE 2 CLEAR fpr% FILE_LOAD fpr%, fn$: FILE_DELETE fn$ RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- vfont: CLEAR 100 IF ITEM_INDEX(97) > 0 THEN font$ = ITEM_INDEX$(97) fsz% = POSITION(98) FONT_NAME 100, font$: FONT_SIZE 100, fsz% ITEM_ADD 100, font$ ITEM_ADD 100, "Voyez le Brick Géant Que J'examine Près du Wharf" RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- vlf: IF ITEM_INDEX(97) > 0 THEN font$ = ITEM_INDEX$(97) fsz% = POSITION(98) FONT_NAME fpr%, font$: FONT_SIZE fpr%, fsz% HIDE 96 RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Misfo: ' Mise en forme de a$ avant analyse (élimination des éléments superflus) ign% = 0 CAPTION flf%, STR$(nl%)+" / "+STR$(COUNT(fpr%)) IF afl% = 1 k% = INSTR(a$, ":"): IF k% > 0 THEN a$ = MID$(a$, k%+1, LEN(a$)) END_IF a$ = TRIM$(a$): IF a$ = "" THEN ign% = 1: RETURN GOSUB Supquot: ' *** Éliminer les contenus éventuels entre quotes ' *** Éliminer les commentaires IF a$ = "" OR LEFT$(LTRIM$(a$), 1) = CHR$(39) OR LEFT$(UPPER$(LTRIM$(a$)), 3) = "REM" ign% = 1: RETURN END_IF b$ = UPPER$(a$) + " ": k% = INSTR(b$, "REM ") k% = INSTR(UPPER$(a$), "REM"): IF k% = 0 THEN k% = INSTR(a$, CHR$(39)) IF k% > 0 IF MID$(a$, k%-1, 1) = " " OR MID$(a$, k%-1, 1) = ":" a$ = RTRIM$(LEFT$(a$, k%-2)) IF a$ = "" THEN ign% = 1: RETURN END_IF END_IF IF RIGHT$(a$, 1) = ":" THEN a$ = LEFT$(a$, LEN(a$) - 1) RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Supquot: ' *** Éliminer les contenus entre quotes k1% = 0: k2% = 0 FOR i% = 1 TO LEN(a$)-2 IF MID$(a$, i%, 1) = CHR$(34) THEN k1% = i%: EXIT_FOR NEXT i% IF k1% > 0 FOR i% = k1%+1 TO LEN(a$) IF MID$(a$, i%, 1) = CHR$(34) THEN k2% = i%: EXIT_FOR NEXT i% IF k2% > 0 THEN a$ = LEFT$(a$, k1%-1) + MID$(a$, k2%+1, LEN(a$)): GOTO Supquot a$ = LEFT$(a$, k1%-1): ' 2ème quote non trouvé END_IF RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Listvar: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN ' ***** VARIABLES DÉCLARÉES (DIM) ***************************************** CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES VARIABLES ******" ITEM_ADD fls%, "" ITEM_ADD fls%, " un moment svp..." nvar% = 0 FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit1 ra: k% = INSTR(UPPER$(a$), "DIM ") IF k% > 0 a$ = MID$(a$, k%+4, LEN(a$)-k%-3) k% = INSTR(a$, ":"): a1$ = "" IF k% > 0 THEN a1$ = MID$(a$, k%+1, LEN(a$)-k%): a$ = LEFT$(a$, k%-1) FOR i% = 1 TO LEN(a$) k1% = 0 IF MID$(a$, i%, 1) = "(" FOR j% = i%+1 TO LEN(a$) IF MID$(a$, j%, 1) = ")" FOR k% = i%+1 TO j%-1 IF MID$(a$, k%, 1) = "," a$ = LEFT$(a$, i%-1)+"["+MID$(a$, i%+1, LEN(a$)) a$ = LEFT$(a$, k%-1)+"."+MID$(a$, k%+1, LEN(a$)) a$ = LEFT$(a$, j%-1)+"]"+MID$(a$, j%+1, LEN(a$)) k1% = 1: EXIT_FOR END_IF NEXT k% EXIT_FOR END_IF NEXT j% END_IF NEXT i% rb: k% = INSTR(a$, ",") nvar% = nvar% + 1: b$ = STR$(nl%): b$ = STRING$(5-LEN(b$)," ") + b$ IF k% > 0 var$(nvar%) = TRIM$(LEFT$(a$, k%-1)) + b$ a$ = MID$(a$, k%+1, LEN(a$)-k%): GOTO rb END_IF var$(nvar%) = TRIM$(a$) + b$ IF a1$ <> "" THEN a$ = a1$: GOTO ra END_IF Suit1: NEXT nl% IF nvar% = 0 THEN GOTO Suit41 ' remise en forme des déclarations de tableaux à double entrée ' (remplacement des crochets par des parenthèses et du point par virgule) FOR i% = 1 TO nvar% a$ = var$(i%) k% = INSTR(a$, "[") IF k% > 0 a$ = LEFT$(a$, k%-1) + "(" + MID$(a$, k%+1, LEN(a$)-k%) k% = INSTR(a$, "]") IF k% > 0 a$ = LEFT$(a$, k%-1) + ")" + MID$(a$, k%+1, LEN(a$)-k%) k% = INSTR(a$, ".") IF k% > 0 THEN a$ = LEFT$(a$, k%-1) + "," + MID$(a$, k%+1, LEN(a$)-k%) END_IF b$ = LEFT$(a$, LEN(a$)-5) FOR k% = 1 TO LEN(b$): ' suppression éventuelle des espaces superflus IF MID$(a$, k%, 1)=" " THEN b$=LEFT$(b$, k%-1) + MID$(b$,k%+1,LEN(b$)-k%) NEXT k% var$(i%) = b$ + RIGHT$(a$, 5) END_IF NEXT i% ' Tri alphabétique des résultats DLIST 89: FOR i% = 1 TO nvar%: ITEM_ADD 89, var$(i%): NEXT i% SORT 89: FOR i% = 1 TO nvar%: var$(i%) = ITEM_READ$(89, i%): NEXT i% DELETE 89 ' ajout des crochets autour des numéros de lignes (ligne de déclaration DIM) FOR i% = 1 TO nvar% var$(i%) = LEFT$(var$(i%), LEN(var$(i%))-5) + " [" + TRIM$(RIGHT$(var$(i%),5)) + "]" NEXT i% ' ***** RECHERCHE DES VARIABLES DANS LE CODE ******************************* FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit4 k% = INSTR(UPPER$(a$), "DIM ") IF k% = 0 THEN k% = INSTR(UPPER$(a$), "LABEL ") IF k% > 0 ' c'est une ligne de DIM ou de LABEL a1$ = "": IF k% > 1 THEN a1$ = LEFT$(a$, k%-1) b$ = MID$(a$, k%, LEN(a$)-k%+1) k1% = INSTR(b$, ":") IF k1% > 0 a$ = a1$ + MID$(b$, k1%, LEN(b$)-k1%+1) ELSE a$ = a1$ END_IF IF TRIM$(a$) = "" THEN GOTO Suit4 END_IF k% = INSTR(UPPER$(a$), "LABEL") FOR n% = 1 TO nvar% v$ = var$(n%): k% = INSTR(v$, " "): v$ = LEFT$(v$, k%-1) GOSUB Recvar IF ign% = 0 THEN var$(n%) = var$(n%) + "," + STR$(nl%) NEXT n% Suit4: NEXT nl% Suit41: HIDE flf%: CLEAR fls% ITEM_ADD fls%, " ****** LISTE DES VARIABLES ("+STR$(nvar%)+") ******" ITEM_ADD fls%, "" IF nvar% > 0 FOR i% = 1 TO nvar% a$ = var$(i%): GOSUB Afl NEXT i% END_IF SHOW flf% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recvar: ' Recherche de la variable v$ dans a$ sva$ = a$: ign% = 0 k% = INSTR(v$, "("): ' tableaux IF k% > 0 THEN v$ = LEFT$(v$, k%) lv% = LEN(v$) c$ = CHR$(254) rf: k% = INSTR(a$, v$): IF k% < 1 THEN ign% = 1: GOTO rcvs s$ = CHR$(255) IF k% > 1 THEN c$ = MID$(a$, k%-1,1): ' caractère précédent (si pas le 1er) IF k% < (LEN(a$)-lv%+1) THEN s$ = MID$(a$, k%+lv%, 1): ' caractère suivant (si pas le dernier) j% = 0 FOR i% = 1 TO tca% IF c$ = car$(i%) THEN j% = 1: EXIT_FOR NEXT i% IF j% = 0 THEN a$ = MID$(a$, k%+1, LEN(a$)): GOTO rf j% = 0 FOR i% = 1 TO tca% IF s$ = car$(i%) THEN j% = 1: EXIT_FOR NEXT i% IF RIGHT$(v$, 1) <> "(" IF j% = 0 THEN c$ = MID$(a$, k%, 1): a$ = MID$(a$, k%+1, LEN(a$)): GOTO rf END_IF ' trouvé rcvs: a$ = sva$ RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Afl: k% = INSTR(a$, " "): b$ = MID$(a$, k%, LEN(a$)): a$ = LEFT$(a$, k%-1) IF LEN(a$) < marg% THEN a$ = a$ + STRING$(marg%-LEN(a$), " ") a$ = a$ + b$ rk: IF LEN(a$) > nc% FOR j% = nc%+1 TO 0 STEP -1 IF MID$(a$, j%, 1) = "," THEN EXIT_FOR NEXT j% ITEM_ADD fls%, LEFT$(a$, j%) a$ = STRING$(marg%+1, " ") + MID$(a$, j%+1, LEN(a$)-j%): GOTO rk END_IF ITEM_ADD fls%, a$ RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Instrs: ' recherche de b$ dans a$ à partir de u% -> k1% k1% = 0 IF u% <= LEN(a$) c$ = MID$(a$, u%, LEN(a$)-u%+1): k1% = INSTR(c$, b$) IF k1% > 0 THEN k1% = k1% + u% - 1 END_IF RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Mids: ' renvoie la chaîne b$, reste de a$ à partir de k% (y compris vide) b$ = "": IF k% <= LEN(a$) THEN b$ = MID$(a$, k%, LEN(a$)-k%+1) RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Reclab: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES LABELS ******" ITEM_ADD fls%, "" ITEM_ADD fls%, " un moment svp..." neti% = 0 ' ***** ÉTIQUETTES DÉCLARÉES (LABEL) *********************************** FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit2 k% = INSTR(UPPER$(a$), "LABEL ") IF k% > 0 a$ = MID$(a$, k%+6, LEN(a$)-k%-5) rc: k% = INSTR(a$, ":"): a1$ = "" IF k% > 0 THEN a1$ = MID$(a$, k%+1, LEN(a$)-k%): a$ = LEFT$(a$, k%-1) rd: k% = INSTR(a$, ",") neti% = neti% + 1: b$ = STR$(nl%): b$ = STRING$(5-LEN(b$)," ") + b$ IF k% > 0 eti$(neti%) = TRIM$(LEFT$(a$, k%-1)) + b$ a$ = MID$(a$, k%+1, LEN(a$)-k%): GOTO rd END_IF eti$(neti%) = TRIM$(a$) + b$ IF a1$ <> "" THEN a$ = a1$: GOTO rc END_IF Suit2: NEXT nl% IF neti% = 0 THEN GOTO Suit51 FOR i% = 1 TO neti% eti$(i%) = LEFT$(eti$(i%), LEN(eti$(i%))-5) + " [" + TRIM$(RIGHT$(eti$(i%),5)) + "]" NEXT i% ' Tri alphabétique du résultat DLIST 89: FOR i% = 1 TO neti%: ITEM_ADD 89, eti$(i%): NEXT i% SORT 89: FOR i% = 1 TO neti%: eti$(i%) = ITEM_READ$(89, i%): NEXT i% DELETE 89 ' ***** RECHERCHE DES APPELS AUX LABELS DANS LE CODE ************************ FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit5 k% = INSTR(UPPER$(a$), "LABEL "): IF k% > 0 THEN GOTO Suit5 FOR i% = 1 TO neti% v$ = eti$(i%): k% = INSTR(v$, " "): v$ = LEFT$(v$, k%-1) GOSUB Receti IF ign% = 0 THEN eti$(i%) = eti$(i%) + "," + STR$(nl%) NEXT i% Suit5: NEXT nl% Suit51: HIDE flf% CLEAR fls%: ITEM_ADD fls%, " ****** LISTE DES LABELS ("+STR$(neti%)+") ******" ITEM_ADD fls%, "" IF neti% > 0 FOR i% = 1 TO neti% a$ = eti$(i%): GOSUB Afl NEXT i% END_IF SHOW flf% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Receti: ' Recherche de l'étiquette v$ dans a$ sva$ = a$: ign% = 0: lv% = LEN(v$) k% = INSTR(a$, v$) IF k% = 1 AND a$ = v$ THEN GOTO rces: ' étiquette en place IF k% < 6 THEN ign% = 1: GOTO rces IF MID$(a$, k%-1, 1) <> " " AND MID$(a$, k%-1, 1) <> "," THEN ign% = 1: GOTO rces IF LEN(a$) < (k% + lv%) THEN GOTO rces c$ = MID$(a$, k%+lv%, 1) IF c$ <> ":" AND c$ <> " " THEN ign% = 1: GOTO rces rces: a$ = sva$ RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recobj: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN ' ***** OBJETS DÉCLARÉS ******************************************* CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES OBJETS ******" ITEM_ADD fls%, "" ITEM_ADD fls%, " un moment svp..." nobj% = 0 FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit3 a$ = UPPER$(a$) k% = INSTR(a$, "DATA ") IF k% > 0 THEN GOSUB Supelem: IF ign% = 1 THEN GOTO Suit3 k% = INSTR(a$, "DIM ") IF k% > 0 THEN GOSUB Supelem: IF ign% = 1 THEN GOTO Suit3 k% = INSTR(a$, "LABEL ") IF k% > 0 THEN GOSUB Supelem: IF ign% = 1 THEN GOTO Suit3 FOR i% = 1 TO tob% v$ = objn$(i%): lv% = LEN(v$) u% = 1 re: b$ = v$: GOSUB Instrs: k% = k1% IF k% > 0 IF k% > 1 n% = ASC(MID$(a$, k%-1, 1)) IF n%>32 THEN GOTO rg END_IF u% = k%: b$ = ":": GOSUB Instrs IF k1% > 0 c$ = MID$(a$, k%+lv%, k1%-k%-lv%) ELSE k% = k% + lv%: GOSUB Mids: c$ = b$ END_IF c$ = TRIM$(c$) nobj% = nobj% + 1: obj$(nobj%) = v$ + c$ + " ["+STR$(nl%)+"]" rg: IF k1% > 0 THEN u% = k1%+1: GOTO re END_IF NEXT i% Suit3: NEXT nl% ' Tri du résultat DLIST 89: FOR i% = 1 TO nobj%: ITEM_ADD 89, obj$(i%): NEXT i% SORT 89: FOR i% = 1 TO nobj%: obj$(i%) = ITEM_READ$(89, i%): NEXT i% DELETE 89 HIDE flf% CLEAR fls% ITEM_ADD fls%, " ****** LISTE DES OBJETS ("+STR$(nobj%)+") ******" ITEM_ADD fls%, "" FOR i% = 1 TO nobj%: ITEM_ADD fls%, obj$(i%): NEXT i% SHOW flf% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recif: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES IF...ELSE...END_IF ******" ITEM_ADD fls%, "": WAIT 10 indt% = 0: ' indentation FOR nl% = 1 TO COUNT(fpr%) CAPTION flf%, STR$(nl%)+" / "+STR$(COUNT(fpr%)) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ IF afl% = 1 k% = INSTR(a$, ":"): a$ = MID$(a$, k%+1, LEN(a$)-k%) END_IF IF LEN(a$) < 4 THEN GOTO Suit6 a$ = UPPER$(TRIM$(a$)): IF a$ = "" THEN GOTO Suit6 k% = INSTR(a$, ":") IF k% > 0 k1% = 0 FOR i% = 1 TO k%-1 IF MID$(a$, i%, 1) = " " THEN k1% = 1: EXIT_FOR NEXT i% IF k1% = 0 AND k% = LEN(a$) ITEM_ADD fls%, RTRIM$(sva$)+" *****" indt% = 0: GOTO Suit6: ' étiquette END_IF END_IF IF LEFT$(a$, 6) = "RETURN" OR LEFT$(a$, 9) = "TERMINATE" ITEM_ADD fls%, RTRIM$(sva$)+" "+STRING$(nc%-12, "-") indt% = 0: GOTO Suit6 END_IF GOSUB Supquot: ' suppression des expressions entre quotes k% = INSTR(a$, CHR$(39)): IF k% = 1 THEN GOTO Suit6 IF k% > 0 THEN a$ = LEFT$(a$, k%-1): IF TRIM$(a$) = "" THEN GOTO Suit6 k% = INSTR(a$, "REM"): IF k% = 1 THEN GOTO Suit6 IF k% > 0 THEN a$ = LEFT$(a$, k%-1): IF TRIM$(a$) = "" THEN GOTO Suit6 k% = INSTR(a$, "IF ") IF k%>0 IF k% = 1 GOSUB Ecsva k% = INSTR(a$, "THEN "): IF k% < 1 THEN indt% = indt% + 4 GOTO Suit6 END_IF IF k% > 1 THEN c$ = MID$(a$, k%-1, 1) IF c$=" " OR c$<>":"THEN GOSUB Ecsva: GOTO Suit6 END_IF k% = INSTR(a$, "ELSE") IF k% = 1 THEN indt%=indt%-4: GOSUB Ecsva: indt% = indt% + 4: GOTO Suit6 k% = INSTR(a$, "END_IF") IF k% = 1 THEN indt% = indt%-4: GOSUB Ecsva Suit6: NEXT nl% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Ecsva: c$ = "": IF indt% > 0 THEN c$ = STRING$(indt%, " ") IF afl% = 1 k% = INSTR(sva$, ":"): c$ = LEFT$(sva$, k%+1)+c$: sva$ = MID$(sva$, k%+2, LEN(sva$)) END_IF ITEM_ADD fls%, c$ + TRIM$(sva$) RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recwhile: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES WHILE...END_WHILE ******" ITEM_ADD fls%, "": WAIT 10 indt% = 0: ' indentation FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit7 a$ = TRIM$(UPPER$(a$)) k% = INSTR(a$, "WHILE "): k1% = INSTR(a$, "END_WHILE") IF k%>0 OR k1%>0 THEN ITEM_ADD fls%, sva$ Suit7: NEXT nl% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recrep: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES REPEAT...UNTIL ******" ITEM_ADD fls%, "": WAIT 10 indt% = 0: ' indentation FOR nl% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ GOSUB Misfo: IF ign% = 1 THEN GOTO Suit8 a$ = TRIM$(UPPER$(a$)) k% = INSTR(a$, "REPEAT"): k1% = INSTR(a$, "UNTIL ") IF k%>0 OR k1%>0 THEN ITEM_ADD fls%, sva$ Suit8: NEXT nl% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Supelem: ' suppression d'un élément ign% = 0 u% = k%+1: b$ = ":": GOSUB Instrs IF k1% = 0 a$ = LEFT$(a$, k%-1) ELSE a$ = LEFT$(a$, k%-1) + MID$(a$, k1%+1, LEN(a$)) END_IF IF a$ = "" THEN ign% = 1 RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recsou: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN CLEAR fls%: SHOW flf%: ITEM_ADD fls%, " ****** LISTE DES SOUS-PROGRAMMES ET LABELS ******" ITEM_ADD fls%, "" FOR nl% = 1 TO COUNT(fpr%) CAPTION flf%, STR$(nl%)+" / "+STR$(COUNT(fpr%)) a$ = ITEM_READ$(fpr%, nl%): sva$ = a$ IF afl% = 1 k% = INSTR(a$, ":"): a$ = MID$(a$, k%+1, LEN(a$)-k%) END_IF IF LEN(a$) < 4 THEN GOTO Suit9 a$ = UPPER$(TRIM$(a$)): IF a$ = "" THEN GOTO Suit9 k% = INSTR(a$, ":") IF k% > 0 IF LEN(RTRIM$(a$)) > k% THEN GOTO Suit9 k1% = 0 FOR i% = 1 TO k%-1 IF MID$(a$, i%, 1) = " " THEN k1% = 1: EXIT_FOR NEXT i% IF k1% = 0 ITEM_ADD fls%, RTRIM$(sva$) GOTO Suit9: ' étiquette END_IF END_IF IF LEFT$(a$, 6) = "RETURN" OR LEFT$(a$, 9) = "TERMINATE" ITEM_ADD fls%, RTRIM$(sva$) ITEM_ADD fls%, "----------------" GOTO Suit9 END_IF Suit9: NEXT nl% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Recseq: IF COUNT(fpr%) = 0 THEN GOSUB Charsou: RETURN s$ = MESSAGE_INPUT$("Recherche séquence","Séquence cherchée:","") IF s$ = "" THEN RETURN FOR i% = 1 TO COUNT(fpr%): ll%(i%) = LEN(ITEM_READ$(fpr%, i%))+2: NEXT i% FOR i% = 1 TO COUNT(fpr%) a$ = ITEM_READ$(fpr%, i%) k% = INSTR(UPPER$(a$), UPPER$(s$)) IF k% > 0 n% = 0 FOR j% = 1 TO i%-1: n% = n% + ll%(j%): NEXT j% ' SELECT_TEXT fpr%, n%+k%, LEN(s$) b$ = "- Séquence cherchée: " + chr$(34)+s$ + chr$(34)+" -"+chr$(10) b$ = b$ + "============================="+chr$(10)+a$ b$ = b$ + chr$(10)+ "=============================" b$ = b$ + chr$(10)+" - Suivant ? -" IF MESSAGE_CONFIRMATION_YES_NO(b$ ) <> 1 THEN RETURN END_IF NEXT i% RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Charsou: MESSAGE "Pas de programme source à analyser !" RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Debug: MESSAGE "Erreur ligne: " + str$(error_line)+" " + error_type$ TERMINATE RETURN ' +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Dernière édition 28/11 14h45
Dernière édition par JL35 le Dim 28 Nov 2010 - 14:46, édité 23 fois | |
| | | Invité Invité
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 0:27 | |
| Voila un gros travail. Très bien. Je vais te donner une astuce, car je vois que tu code le restant d'une chaine comme je le faisais il y a encore deux mois. J'ai vu ça dans ton code: - Code:
-
b$ = MID$(a$, k%, LEN(a$)-k%+1) aujourd'hui, je code ainsi, en sachant par exemple qu'une ligne ne va pas plus loin disons de 200, et avec sécurité: - Code:
-
b$=MID$(a$,k%+1,300) Il n'y a pas besoin ainsi de faire des calculs pour la fin, tu mets simplement un nombre plus grand, Cela ne provoque pas d'erreur. J'aurai aimé deux choses pour le programme, vu la lenteur des calculs, est de mettre dans des memos différents les variables et les labels, et de faire une indentation calculée des IF et END_IF, plutôt que de suivre le programme. Cette façon de faire rend inutile le programme que j'ai commencé. On voit tout de suite si il y a une erreur dans la construction des testes. J'espère ne pas paraître trop grognon en mettant ces remarques. Je rajoute que pour les IF et END_IF, ce serait bien aussi que tu les séparent des différents sous programmes. Chaque fois que tu vois return, tu tire un trait et tu mets le prochain label |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Lun 1 Nov 2010 - 16:37 | |
| Eh, pas mal du tout, ce programme ! Alors voilà ton éditeur de code spécifique, c'est une belle réalisation ! Ce que j'aime le mieux, ce sont les possibilités de recherche. Il y a cependant encore pas mal de bugs à corriger : - par exemple : lorsqu'on utilise : Ouvrir plus récent (dont je ne comprend pas l'utilité) cela produit l'erreur : file already used - J'ai chargé un programme au hasard et ça donne des résultats curieux : - Citation :
- ****** LISTE DES VARIABLES (14) ******
a$ [4],129,134 d$ [5] f$ [6] i [4],56,144,151,157,161 it [7] j [4],150,156 rem Date de la lecture précédente d'histoire [5],4,5,6,7,8,9 rem Hauteur du tableau [9],4,5,6,7,8,9 rem Indicateur de Taille du tableau [7],4,5,6,7,8,9 rem Nombre de Fois où une histoire a été lue ce jour [6],4,5,6,7,8,9 rem Titre du programme [8],4,5,6,7,8,9 rem Variables provisoires [4],4,5,6,7,8,9 t$ [8] y [9]
Ce qui est faux, il n'y a que 8 variables, et les rem n'en sont pas. (le début du programme étant : - Citation :
- 4: dim a$ , i , j : rem Variables provisoires
5: dim d$ : rem Date de la lecture précédente d`histoire 6: dim f$ : rem Nombre de Fois où une histoire a été lue ce jour 7: dim it : rem Indicateur de Taille du tableau 8: dim t$ : rem Titre du programme 9: dim y : rem Hauteur du tableau (la détection des labels semble bonne) - La détection des objets ne marche pas : il me déclare qu'il y a 0 objet système, ce qui est faux, en fait, il y en a 8 dans ce programme, 6 avant le end et 2 après. - La détection des if...else...end_if est plutôt bien, à la différence que je me demande pourquoi ça comment par la déclarartion des labels qui n'ont rien à voir. Ceci dit, bon travail quand même ! Juste un peu de travail de correction en plus pour ce jour férié... (mais tout le monde sait que la retraite, c'est la galère, car il n'y a plus de dimanche ni de jours fériés................... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 17:13 | |
| @cosmos merci pour ton astuce concernant le MID$, à chaque fois je me casse la tête pour calculer la longueur restante, et pour éviter l'erreur si le restant est vide (mon s/p Mids). Concernant tes remarques sur If End_If, j'ai fait ça vite fait mais je vais étudier ça un peu plus pour que ça serve à quelque chose. @jjn4 je suis bien conscient qu'il y a des lacunes et je comptais bien sur vous pour me les signaler ! Par exemple j'ai tendance pour les commentaires à tester l'apostrophe et oublier le Rem (dont je ne me sers plus). - l'Ouvrir plus récent c'est automatiquement le dernier source qui a été enregistré dans le répertoire source, donc en principe celui qui est en cours de mise au point. Ça peut peut-être faire une erreur s'il est déjà lu dans une autre application ? quoique normalement ça ne devrait pas... J'ai remplacé le libellé par 'Ouvrir le dernier enregistré'. - pour les objets je ne vois pas, ça semble marcher chez moi mais je vais regarder ça de plus près, je n'ai pas fait de tests sur beaucoup de programmes, d'une part, et toujours sur ma façon de coder à moi ! Nonobstant (hein, je cause bien), je vous remercie tous les deux pour vos remarques constructives Edit: Ah cosmos, super ton astuce du Mid$, si j'avais su ça plus tôt depuis le temps que je m'enquiquine avec ça, à calculer la longueur restante, avec + ou - 1, et à éviter l'erreur si la chaîne résultante est vide. Là ça résout tous les problèmes, merci camarade ! Edit2: j'ai fait une petite mise à jour: - indentation forcée pour les IF/Else/End_if, les lignes de If qui contiennent le Then n'influencent pas l'indentation. j'ai ajouté l'affichage des labels et return, et je réinitialise l'indentation à chaque s/p. dis-moi cosmos si ça te convient mieux comme ça. - ajout de tests pour les REM | |
| | | Invité Invité
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 19:10 | |
| Merci, J'ai pas pensé à le dire plus tôt, car je pensais que vous le saviez avant moi. Il me semble que vous aviez fait un post la dessus, peut-être avec Klaus, mais j'ai pas pu suivre. Tout comme toi, j'en avait marre de calculer. Par contre depuis un moment, je prenais Right$( et non mid$(, vu qu'on prenait le restant de la ligne.
Les programmes du forum, il m'arrive de les essayer mais j'arrive pas à rentrer dedans. J'ai toujours plein de choses à faire, et j'essaye de garder mes programmes en tête, vu que pour l'instant je ne peux rester devant longtemps.
Depuis que j'ai changé d'éditeur, les choses sont déjà plus facile. J'arrive mieux à regarder vos codes sans surcharger l’éditeur Panoramic, qui malheureusement se bloque facilement, et ne permet pas de retirer un onglet.
En ce qui concerne les objets, il me semble effectivement qu'ils ne sont pas tous listés. Mais j'ai pas regardé en profondeur les résultats.
Si tu arrives à faire une indentation des IF et END_IF, sans t'occuper de la présentation du programme tel qu'il est écrit, et si tu remets à zéro le compteur d'indentation à chaque sous programme, on verra tout de suite si il y a une erreur avec la conception des boucles. (un sous programme pour moi ici c'est un label et le code qui va jusqu'au return, en ne tenant pas compte des labels à l'intérieur de ce sous programme). De cette façon, je peux laisser de côté celui que j'ai commencé, et moins lisible, ainsi je peux retourner à autre chose.
|
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 20:37 | |
| C'est ce que j'ai fait cosmos, suite à tes suggestions, et le code ci-dessus a été mis à jour. Pour les objets il faut que je regarde plus en détail, jusqu'ici je n'ai pas eu d'erreur, mais je vais multiplier les exemples.
PS pour les objets, il y avait au moins un problème de majuscules/minuscules, corrigé. Ça devrait maintenant aller beaucoup mieux. | |
| | | Invité Invité
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 22:36 | |
| Ca a l'air de bien marcher. Le seul petit reproche et vraiment une paille, c'est de mettre les numéros de lignes pour la recherche de IF et END_IF pour 4 chiffres, afin de ne pas montrer de décalage de dizaine centaine et millier. Bon travail, je mets le programme de côté. A ce propos, pour tester le mien que je viens de mettre, j'ai fais une copie avec "Code:", j'ai cliqué sur l'icône de mon programme, et sans installation, il fonctionne. (c'était la partie que je n'étais pas très sure) |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Lun 1 Nov 2010 - 22:54 | |
| Oui, aligner les numéros de lignes j'y avais pensé et je l'ai négligé, mais je vais le faire, ce sera plus propre. Edit voilà, c'est fait. Et il va falloir que j'essaye sérieusement ton système de lancement de programmes à tester, qui a l'air bien intéressant. Mais là... Edit du 2/11: nouvelle version éditée avec quelques petites modifs, ajout de la recherche des sous-programmes, correction d'une omission dans la lecture du dernier source enregistré. | |
| | | Invité Invité
| Sujet: Re: Analyse d'un programme source .bas Jeu 4 Nov 2010 - 23:56 | |
| Je viens d'essayer ton programme pour retrouver une variable dans mon programme, alors que celui-ci fonctionnait (tout du moins pour la partie finie) et maintenant j'ai une erreur en me disant qu'un nom est déjà défini (et que j'ai rajouté) Seulement je m’aperçois qu'il est loin de toutes les retrouvées. Ainsi par exemple j'ai dim encre%, ton programme déclare la variable, mais les 45: encre% dont 42 sont entre accolades, il ne les vois pas. Et ce n'est pas la seule!
C'est grave, le cosmos te tombe sur la tête! |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 5:09 | |
| Bonjour JL35, Pour améliorer la recherche des objets: il faut tester si tu n'as pas plusieurs instructions sur la même ligne. par exemple : DIM titi% : titi%=1 : LIST titi%PS: Si tu n'as pas envie de te prendre la tête, tu peux récupérer mon code... | |
| | | Invité Invité
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 9:32 | |
| Bonjour, Il y a quelque chose de bizarre avec Panoramic!
J'ai délaissé quelques jours un programme pour prendre un peu d'espace, et le programme qui fonctionnait sur les commandes qui étaient finies, se bloquait. Je me suis rappelé que l'erreur que j'avais était la même que celle que j'avais auparavant avec SELECT cas, et il me semble que c'était avec toi Nardo, avant que Jack corrige une erreur sur cette instruction. Select n'est pas utilisé, et ce n'est pas un problème de variable. Le programme fonctionnait avant, il n'y a pas eus de modification, et j'ai contrôlé celles-ci.
Je repris le programme avec mon programme de déboggage, et pareil, les 2 premières fois, il y a eu blocage. Et puis voilà qu'ensuite, l'erreur incriminée a disparue. J'ai repris le programme de départ, et maintenant, plus de problème!. On dirais que parfois Panoramic a besoin de "se chauffer". Je sais que le terme est inapproprié. Mais il y a quelque chose de pas bien défini. Mais là, il n'y a que Jack qui peut répondre. Moi je ne fais que de reporter des constatations.
Nouvelle constatation: Les essais je les ai fait avec l'éditeur Panoramic. J'essaye de lancer le programme maintenant avec comme dit Nardo, le loader de ma conception, et j'ai de nouveau l'erreur: (35) Name Already Defined Line 6. A noter que l'erreur n'est pas valable sur la ligne, et que ce n'est pas une définition de variable qui est en cause.
J'ai pas envie de remettre sur le devant les déboires, et pour cette raison, je ne fais que rééditer le sujet. J'espère que Jack lira ce poste. Je vais essayer de retrouver la cause, comme j'avais pu le faire pour Select.
Dernière édition par cosmos70 le Ven 5 Nov 2010 - 12:52, édité 1 fois |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 5 Nov 2010 - 12:49 | |
| @JL35 : Pas mal, cette fois : Encore des petites remarques, (histoire de chipoter un peu plus) : - Les recherches de variables : Dans mon exemple précédent, cela donne maintenant ceci : - Citation :
- ****** LISTE DES VARIABLES {8} ******
a$ [4],129,134 d$ [5] f$ [6] i [4],56,144,151,157,161 it [7] j [4],150,156 t$ [8] y [9]
C'est mieux, mais il y a encore un problème, pourquoi toutes les utilisations ne sont-elles pas notées : a$ n'est pas utilisé qu'aux lignes 129 et 134 mais bien plus de fois, il n'y a que les « message a$ », qu'il trouve et les autres variables comme d$ donnent l'impression de ne pas être utilisées, ce qui est faux, mais il ne trouve pas où. - Les if...then ou if...else...end_if : C'est bon, mais je ne comprends toujours pas pourquoi on y trouve les labels - Le memo où s'affiche le listing du programme : avec un bar_vertical, ce serait mieux. Je sais, je chipote, je chipote...... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 13:06 | |
| Oui le scroll-bar vertical serait pas mal. Idem pour la largeur...
@jjn4: Trouver l'utilisation des variables, est loin d'être évident: J'ai cherché de mon coté à définir des règles et je m'y suis cassé les dents ! entre les affectations entre variable, les expressions mathématique, les tableaux, les appels de fonctions, ça fait pas mal de cas spéciaux ! ...sans compter les variables système qu'il faut filtrer (pas de DIM dans ces cas là) les cas où on utilise la variable sans avoir vu de DIM de cette variable dans les lignes de code précédentes... par ex:
gosub InitVariable a$="toto" end
InitVariable: dim a$
@cosmos70: En cas de plantage il vaut mieux fermer panoramic_editor car j'ai l'impression que panoramic.exe (qui se trouve dans un répertoire temporaire) pose des problèmes lorsque l'on lance des executions par la suite... ton pb provient peut être de là.... est-ce que tu rencontres parfois le même problème si tu passes par ton 'loader' (exécution d'un chain) ?
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 13:35 | |
| Merci à tous pour vos tests
@jjn4, mais oui bien sûr, il faut chipoter ! ça fait avancer le schmilblick. - Pour les if/else/end_if, j'ai rajouté les labels et les return suite à une remarque qui m'a semblé justifiée (cosmos ?), en effet quand on attaque ou qu'on quitte un sous-programme il ne doit pas y avoir de structure IF en cours, ça permet peut-être de mieux repérer les ruptures. - Pour les variables, je fais 2 passes: une première pour les déclarations (DIM), et une deuxième pour les utilisations, ligne par ligne. Apparemment je trouve toutes les déclarations, ce serait intéressant de voir dans quels cas je ne trouve pas les utilisations (structure de la ligne de code incriminée ?).
@Nardo et jjn4, pour les scroll_bar je vais regarder de plus près, a priori je ne sais pas trop les utiliser, mais tout s'apprend ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 5 Nov 2010 - 13:40 | |
| bah, bah, bah, bah... JL35 est très fort, il va trouver la solution ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 13:57 | |
| Effectivement, pour les barres de défilement, c'est très simple: il suffit de rajouter: BAR_BOTH fpr% à la déclaration du MEMO fpr%, et le tour est joué, merci Panoramic ! Maintenant jjn4, ce serait bien que tu me donnes un exemple d'une ligne où je ne trouve pas une variable donnée... PS au fait Nardo, merci pour ton offre de récupérer ton code pour les objets, je la garde sous le coude PS2 (rien à voir avec la console): j'ai édité le listing de la page 1, avec ajout des scroll_bar, et amélioration des recherches, suite entre autres aux suggestions de Nardo, tenir compte par exemple des lignes contenant des DIM multiples, des LABEL et des déclarations d'objets, tout ça mélangé (il y en a qui sont vicieux...). | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 18:26 | |
| @JL35: Je suis ce programme, avec intérêt. Mais j'ai sursauté à la remarque suivante: - Citation :
- - Pour les if/else/end_if, j'ai rajouté les labels et les return suite à une remarque qui m'a semblé justifiée (cosmos ?), en effet quand on attaque ou qu'on quitte un sous-programme il ne doit pas y avoir de structure IF en cours, ça permet peut-être de mieux repérer les ruptures.
Qu'est-ce que tu veux dire par là ? En parcourant le code, ligne par ligne, ou dynamiquement, à l'exécution ? Dans les deux cas, cela peut ressembler à une "bonne pratique" de programation, mais n'est sûrement pas une obligation. Qu'est-ce qui interdirait de programmer ceci, même si je suis d'accord pour dire que c'est "cochonné": - Code:
-
dim i% label lab_sub, lab_goto1, lab_goto2
i% = 0
lab_goto2: if i%>10 print "limite atteinte" else i% = i% + 1 gosub lab_sub goto lab_goto1 lab_sub: print "lab_sub ";i% return lab_goto1: print "lab_goto1" goto lab_goto2 end_if
print "fin ";i%
end
Ce programme marche. Il est "sale", mal écrit, mais il marche. Et puis, tu parles de structire if...end_if, mais pourquoi pas des structure while...end_while, repeat...until ? Il y a quelque chose que je n'ai pas dû comprendre. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 18:43 | |
| Si, tu as bien compris Klaus, c'est simplement que je n'ai pas imaginé qu'on pouvait programmer comme ça ! Dans mon esprit le s/p Etiquette/Return est une entité indépendante, mais je t'accorde que ça marche aussi en faisant un peu n'importe quoi. Le programme est surtout fait au départ dans l'esprit de rechercher une erreur de structure et de vérifier que tout est correct (genre plus de if que de end_if...). Mais on est d'accord, il n'y a rien d'interdit, mais à mon sens il faut un minimum de rigueur, mais bon, chacun fait comme il lui plait, ce n'est qu'une proposition. On pourrait effectivement ajouter des contrôles sur les while, repeat etc. Ce que je me permets, personnellement, c'est d'appeler éventuellement un sous-programme sur une étiquette intermédiaire: - Code:
-
Gosub toto ... Gosub tata ... ... End toto: ... tata: ... Return | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 19:54 | |
| OK, je comprends mieux ce que tu veux dire. Tu as évidemment raison quant à la structure "correcte" d'un programme, et je milité également pour une rigueur certaine dans l'écriture. Alors, je continue de regarder l'évolution du projet qui me paraît intéressant ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Ven 5 Nov 2010 - 21:08 | |
| Et moi je te remercie pour tes remarques intéressantes, comme d'habitude. Comme tu dois bien le penser, mon idée n'est pas du tout de donner des leçons de structuration de programme, simplement pour moi c'est bien plus facile d'intervenir sur un source (même un source à moi) qui n'ait pas des branchements acrobatiques dans tous les sens, même si parfois c'est plus rapide à écrire, mais à terme on n'y gagne pas.
Raison de plus quand c'est un travail d'équipe et qu'il faut intervenir sur le programme d'un autre, parfois dans l'urgence, alors si le programme est tarabiscoté et bordélique (et le programmeur aussi), ça cause parfois des sueurs froides. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Analyse d'un programme source .bas Sam 6 Nov 2010 - 0:15 | |
| c'est clair qu'il faut un minimum de cohérence dans le prog mais chacun à sa façon d'aborder un problème -> pour un pb donné , plusieurs solutions possible ! Je viens de mettre à jour mon prog d' analyse de source sur mon site... (encore une autre facon de faire) Je pense qu'elle est maintenant complète : objets + variables + label quand aux "if et end_if", si on est pas trop bordelique (hors bug pano, bien entendu) cela ne devrait poser pas trop de soucis... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Sam 6 Nov 2010 - 13:31 | |
| Heureusement qu'il y a en général plusieurs solutions pour un problème donné, sinon ça n'aurait pas de charme !
Pour les if...endif ce n'est pas toujours si évident, il m'est arrivé de faire sauter une ligne par inadvertance, à l'éditeur (une ligne sélectionnée en plus par exemple), et au lancement il te dit "Plus de If que de End_If, mais il ne peut évidemment pas te dire où ça se passe, c'est global, alors si tu as fait d'autres modifs en même temps, tu peux chercher un bon moment. Et pire si tu n'as pas fait d'indentation. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 6 Nov 2010 - 19:02 | |
| @JL35 : je t'envoie des extraits du programme avec lequel je teste le tiens : - Code:
-
46: alpha 6 47: left 6,30 : top 6,275 48: font_bold 6 : font_size 6,10 : color 6,0,255,0 49: a$=" Cliquez ici pour " 50: a$=a$+chr$(13)+" agrandir le tableau " 51: caption 6,a$ 52: on_click 6,agran
76: agran: 77: it=it+1 78: if it>1 then it=0 79: if it=1 80: y=470 : height 0,y ...........
110: hist: 111: file_open_read 1,"Adresses.txt" 112: file_readln 1,d$ 113: file_readln 1,f$ 114: file_close 1 115: if d$<>date$ .........
122: if f$="1" 123: file_open_write 1,"Adresses.txt" 124: file_writeln 1,d$ 125: file_writeln 1,2 126: file_close 1 127: a$="Deux histoires le même jour !"+chr$(13)+"Dites donc, votre moral est" 128: a$=a$+chr$(13)+"vraiment bas, aujourd'hui !" 129: message a$ 130: execute "ADR-STORY-07.EXE" 131: else 132: a$="Trois histoires le même jour !?!"+chr$(13)+"Ce n'est plus de la déprime, ça," 133: a$=a$+chr$(13)+"c'est de la gourmandise."+chr$(13)+"Désolé !" 134: message a$ 135: end_if
(désolé de te faire travailler comme ça..... ) | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Analyse d'un programme source .bas Sam 6 Nov 2010 - 20:00 | |
| il n'y a qu'a regarder mon prog: J'ai mis des commentaires aux endroits où j'étais tenter de faire un goto sur un autre else un peu plus loin dans le code... cela rajoute une étiquette (pour le goto) mais cela ne change pas le fait qu'il faut que tu mettes un end_if (qui ne sert à rien) juste en dessous du goto | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Analyse d'un programme source .bas Sam 6 Nov 2010 - 21:37 | |
| @jjn4 j'ai mis une nouvelle version qui je pense améliore beaucoup la recherche des variables... Tu peux essayer si tu veux bien | |
| | | Contenu sponsorisé
| Sujet: Re: Analyse d'un programme source .bas | |
| |
| | | | Analyse d'un programme source .bas | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |