JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: En attendant l'Arlésienne: bibliothèques de sous-programmes Mer 20 Juil 2011 - 17:41 | |
| J'ai ma solution à moi: des bibliothèques de sous-programmes, qui ne contiennent que ça. Et j'ai un programme qui va les chercher pour les intégrer dans un programme principal, en gérant les DIM et les LABEL. En fait, ce programme intègre des variables et labels des sous-programmes inclus dans les déclarations DIM et LABEL du programme principal, puis intègre les sous-programmes eux-mêmes à la suite du programme. Les contraintes (sinon ce serait trop facile !): - les labels contenus dans les sous-programmes doivent être uniques et ne pas déjà figurer dans le programme principal - les variables peuvent déjà exister, mais elles sont communes, avec ce que ça implique: les modifications se répercutent partout. - les lignes DIM et LABEL doivent être seules sur leur ligne, pas de compactage avec d'autres instructions (par exemple pas de DIM a$, b$, i%: i% = 10 sur la même ligne) Donc, pas de variables locales. Les bibliothèques figurent avec les sources Panoramic, avec le suffixe .bi Chacune peut contenir un ou plusieurs sous-programmes et ne contiennent que ça, rassemblés par genre, par exemple. Chacun des sous-programme a ses propres déclarations de DIM ( toutes les variables utilisées) et LABELs éventuels, s'il y a des étiquettes internes au sous-programme. Exemple d'une bibliothèque: - Code:
-
Bissex: ' rend bi = 1 si année bissextile DIM bi, An bi=0: IF (FRAC(An/4)=0 AND FRAC(An/100)>0) OR FRAC(An/400)=0 THEN bi=1 RETURN
Sousprog2: DIM b$, c$, bi, i%, j% LABEL Toto ... corps du s/P... Toto: .... suite ... RETURN Le rôle du programme d'insertion (IncSub) ci-dessous: Après choix du programme principal, et des sous-programmes à insérer, analyse des déclarations de variables et labels, puis fusion avec les variables et labels des sous-programmes à insérer (en éliminant les redondances), puis ajout des sous-programmes à la fin du programme principal. Dans l'exemple ci-dessus, le s/p Bissex se retrouvera sous la forme: - Code:
-
Bissex: ' rend bi = 1 si année bissextile bi=0: IF (FRAC(An/4)=0 AND FRAC(An/100)>0) OR FRAC(An/400)=0 THEN bi=1 RETURN la ligne DIM a disparu. Il y a alerte si un label est en double, mais ce n'est pas forcément anormal, par exemple si un sous-programme en appelle un autre. On peut visualiser le programme principal, les bibliothèques et sous-programmes, et le résultat obtenu. Le programme résultant obtenu doit évidemment être exécutable sans autre modification. Le programme d'insertion (un peu long, 400 lignes): - Code:
-
' IncSub.bas Insertion de sous-programme(s) dans un programme donné DIM w0, h0, o, ls1, ls2, ls3, ls4, bt1, bt2, bt3, bt5, bt6, bt7, ed1 DIM f$, fd$, fo$, fr$, ft$, fsp$, sd$, a$, b$, sp$, la$, i%, j%, k%, k1%, v$ DIM var$(500), lab$(100), nva, nla, affic$, t$, fl$, rt$ DIM atp, atb, ats, ati DIM vas$(200), las$(100), fsa$(20), nvs, nls, nsp, llab$, ldim$ LABEL Ajout, Suppr, Maj, Chbib, Exec, nxe, Vpro, Aide LABEL Listvl, nvla, nvla1, nxwh, rra
' ====================== FICHIERS DE TRAVAIL, A AJUSTER ! ====================== rt$ = "Z:\": ' Répertoire de manoeuvre fd$ = rt$ + "Dir" ft$ = rt$ + "Tmp.bas" sd$ = "C:\Langages\Panoramic\": ' répertoire des sources et bibliothèques Panoramic ' affic$ = "Notepad.exe " affic$ = "C:\UTIL\Notepad2.exe " ' (sources: *.bas, bibliothèques de s/p: *.bi) ' ==============================================================================
w0 = 640: h0 = 900 WIDTH 0, w0: HEIGHT 0, h0: COLOR 0, 220,255,255 CAPTION 0, " - INSERTION DE SOUS-PROGRAMMES -"
o=1 LIST o: TOP o, 25: WIDTH o, 200: HEIGHT o, h0-90: ls1 = o o=o+1: LIST o: TOP o, 25: LEFT o, 210: WIDTH o, 200: HEIGHT o, 150: ls2 = o o=o+1: LIST o: TOP o, 220: LEFT o, 210: WIDTH o, 200: HEIGHT o, h0-260: ls3 = o o=o+1: LIST o: TOP o, 25: LEFT o, 420: WIDTH o, 200: HEIGHT o, 400: ls4 = o ON_CLICK ls1, Maj: ON_CLICK ls2, Chbib: ON_CLICK ls3, Ajout: ON_CLICK ls4, Suppr o=o+1: BUTTON o: TOP o, 530: LEFT o, 450: WIDTH o, 150: HEIGHT o, 40: CAPTION o, "Exécuter": bt1 = o o=o+1: BUTTON o: TOP o, 590: LEFT o, 470: WIDTH o, 100: CAPTION o, "Aide": bt5 = o ON_CLICK bt1, Exec: ON_CLICK bt5, Aide o=o+1: BUTTON o: TOP o, h0-64: LEFT o,0: WIDTH o, 200 CAPTION o, "Voir le programme": bt2 = o o=o+1: BUTTON o: TOP o, 176: LEFT o,210: WIDTH o, 200 CAPTION o, "Voir la bibliothèque": bt6 = o o=o+1: BUTTON o: TOP o, h0-64: LEFT o,210: WIDTH o, 200 CAPTION o, "Voir le sous-programme": bt3 = o ON_CLICK bt2, Vpro: ON_CLICK bt3, Vpro: ON_CLICK bt6, Vpro o=o+1: ALPHA o: TOP o, 430: LEFT o, 430: CAPTION o, "Fichier résultat:" o=o+1: EDIT o: TOP o, 450: LEFT o, 420: WIDTH o, 200: ed1 = o o=o+1: BUTTON o: TOP o, 470: LEFT o, 420: WIDTH o, 200 CAPTION o, "Voir le résultat": bt7 = o ON_CLICK bt7, Vpro
FONT_SIZE 0, 10: FONT_BOLD 0 o=o+1: ALPHA o: TOP o,5: LEFT o, 20: atp = o o=o+1: ALPHA o: TOP o,5: LEFT o, 240: atb = o o=o+1: ALPHA o: TOP o, 202: LEFT o, 230: CAPTION o, " - Sous-Programmes -": ats = o o=o+1: ALPHA o: TOP o, 5: LEFT o, 450: CAPTION o, " - S/P à insérer -": ati = o
EXECUTE_WAIT "Cmd.exe /c DIR " + sd$ + "*.bas /B >" + fd$: ' Sources FILE_LOAD ls1, fd$ EXECUTE_WAIT "Cmd.exe /c DIR " + sd$ + "*.bi /B >" + fd$: ' Bibliothèques FILE_LOAD ls2, fd$: FILE_DELETE fd$
CAPTION atp, "- Programmes ("+STR$(COUNT(ls1))+") -" CAPTION atb, "- Bibliothèques ("+STR$(COUNT(ls2))+") -" END ' =============================================================================
Chbib: fsp$ = ITEM_INDEX$(ls2) FILE_OPEN_READ 1, sd$ + fsp$ CLEAR ls3 WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: a$ = RTRIM$(a$): k% = INSTR(a$, ":") IF k% > 0 IF INSTR(a$, " ") < 1 ' c'est une étiquette la$ = a$ FILE_READLN 1, a$ WHILE UPPER$(a$) <> "RETURN": FILE_READLN 1, a$: END_WHILE ITEM_ADD ls3, la$ END_IF END_IF END_WHILE FILE_CLOSE 1 CAPTION ats, "- Sous-Programmes ("+STR$(COUNT(ls3))+") -" RETURN
Ajout: a$ = ITEM_INDEX$(ls3) IF COUNT(ls4) > 0 FOR i% = 1 TO COUNT(ls4) IF ITEM_READ$(ls4, i%) = a$ THEN RETURN NEXT i% END_IF ITEM_ADD ls4, a$: CAPTION ati, "- S/P à insérer ("+STR$(COUNT(ls4))+") -" FONT_COLOR ed1, 0,0,0 RETURN
Suppr: ITEM_DELETE ls4, ITEM_INDEX(ls4) CAPTION ati, "- S/P à insérer ("+STR$(COUNT(ls4))+") -" FONT_COLOR ed1, 0,0,0 RETURN
Maj: a$ = ITEM_INDEX$(ls1): fr$ = rt$ + "_" + a$: TEXT ed1, fr$: FONT_COLOR ed1, 0,0,0 f$ = sd$ + a$: fl$ = fd$: t$ = "DIM": GOSUB Listvl: ' liste des variables déclarées FILE_OPEN_READ 1, fl$: nva = 0 WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nva = nva + 1: var$(nva) = a$ END_WHILE FILE_CLOSE 1 t$ = "LABEL": fl$ = fd$: GOSUB Listvl: ' liste des labels FILE_OPEN_READ 1, fl$: nla = 0 WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nla = nla + 1: lab$(nla) = a$ END_WHILE FILE_CLOSE 1: FILE_DELETE fl$ RETURN
Exec: IF ITEM_INDEX(ls1) = 0 THEN MESSAGE "Sélectionner un programme": RETURN IF COUNT(ls4) = 0 THEN MESSAGE "Aucun sous-programme sélectionné": RETURN nsp = COUNT(ls4) FOR j% = 1 TO nsp b$ = ITEM_READ$(ls4, j%): ' s/p cherché (label) fsa$(j%) = rt$ + LEFT$(b$, LEN(b$)-1) FILE_OPEN_WRITE 2, fsa$(j%) FILE_OPEN_READ 1, sd$ + ITEM_INDEX$(ls2): ' bibliothèque WHILE FILE_EOF(1) = 0: FILE_READLN 1, a$: a$ = TRIM$(a$) IF UPPER$(b$) = UPPER$(LEFT$(a$, LEN(b$))) WHILE UPPER$(LEFT$(a$, 6)) <> "RETURN" FILE_WRITELN 2, a$: FILE_READLN 1, a$ END_WHILE FILE_WRITELN 2, a$: EXIT_WHILE END_IF END_WHILE FILE_CLOSE 1: FILE_CLOSE 2 NEXT j% nvs = 0: nls = 0 FOR j% = 1 TO nsp f$ = fsa$(j%): fl$ = fd$: t$ = "DIM": GOSUB Listvl FILE_OPEN_READ 1, fl$ WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nvs = nvs + 1: vas$(nvs) = a$ END_WHILE FILE_CLOSE 1 t$ = "LABEL": GOSUB Listvl FILE_OPEN_READ 1, fl$ WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nls = nls + 1: las$(nls) = a$ END_WHILE FILE_CLOSE 1 a$ = MID$(fsa$(j%), 4, 50) FOR i% = 1 TO nls IF a$ = las$(i%) THEN EXIT_FOR NEXT i% IF i% > nls THEN nls = nls + 1: las$(nls) = a$ NEXT j% FILE_DELETE fl$ FOR j% = 1 TO nvs nva = nva + 1: var$(nva) = vas$(j%) NEXT j% FOR j% = 1 TO nls nla = nla + 1: lab$(nla) = las$(j%) NEXT j% ' vérification que les étiquettes sont uniques FOR j% = 1 TO nla-1 a$ = lab$(j%) FOR i% = j%+1 TO nla IF lab$(i%) = a$ MESSAGE a$ + " : Label dupliqué (warning)" END_IF NEXT i% NEXT j% ' éliminer les redondances de variables FOR j% = 1 TO nva-1 a$ = var$(j%) FOR i% = j%+1 TO nva IF var$(i%) = a$ THEN var$(i%) = "" NEXT i% NEXT j% ' élimineer les redondances de labels FOR j% = 1 TO nla-1 a$ = lab$(j%) FOR i% = j%+1 TO nla IF lab$(i%) = a$ THEN lab$(i%) = "" NEXT i% NEXT j% llab$ = "LABEL ": ldim$ = "DIM " k1% = 6 FOR j% = 1 TO nla a$ = lab$(j%) IF a$ <> "" IF k1%+LEN(a$) > 80 llab$ = LEFT$(llab$, LEN(llab$)-1)+CHR$(13)+CHR$(10) llab$ = llab$ + "LABEL ": k1% = 6 END_IF llab$ = llab$ + a$ + ",": k1% = k1% + LEN(a$) + 1 END_IF NEXT j% llab$ = LEFT$(llab$, LEN(llab$)-1) k1% = 4 FOR j% = 1 TO nva a$ = var$(j%) IF a$ <> "" IF k1%+LEN(a$) > 80 ldim$ = LEFT$(ldim$, LEN(ldim$)-1)+CHR$(13)+CHR$(10) ldim$ = ldim$ + "DIM ": k1% = 4 END_IF ldim$ = ldim$ + a$ + ",": k1% = k1% + LEN(a$) + 1 END_IF NEXT j% ldim$ = LEFT$(ldim$, LEN(ldim$)-1) f$ = sd$ + ITEM_INDEX$(ls1) FILE_OPEN_READ 1, f$: FILE_OPEN_WRITE 2, fr$ FILE_READLN 1, a$: a$ = RTRIM$(a$) WHILE LEFT$(LTRIM$(a$), 1) = "'" FILE_WRITELN 2, a$ FILE_READLN 1, a$: a$ = RTRIM$(a$) END_WHILE FILE_WRITELN 2, llab$: ' labels FILE_WRITELN 2, ldim$: ' dims WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: a$ = RTRIM$(a$) rra: k% = INSTR(UPPER$(a$), "DIM ") IF k% = 0 THEN k% = INSTR(UPPER$(a$), "LABEL ") IF k% > 0 IF k% = 1 k% = INSTR(a$, ":") IF k% > 0 a$ = MID$(a$, k%+1): GOTO rra END_IF GOTO nxe END_IF IF MID$(a$, k%-1, 1) = " " b$ = LEFT$(a$, k%-1) k% = INSTR(a$, ":") IF k% > 0 a$ = b$ + MID$(a$, k%): GOTO rra END_IF GOTO nxe END_IF END_IF FILE_WRITELN 2, a$ nxe: END_WHILE FILE_CLOSE 1 ' Ajout des sous-programmes FOR j% = 1 TO nsp FILE_WRITELN 2, "" FILE_OPEN_READ 1, fsa$(j%) WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$ b$ = TRIM$(a$) IF LEFT$(b$, 4) <> "DIM " AND LEFT$(b$, 6) <> "LABEL " FILE_WRITELN 2, a$ END_IF END_WHILE FILE_CLOSE 1 NEXT j% FILE_CLOSE 2 FONT_COLOR ed1, 255,0,0 RETURN
Vpro: IF CLICKED(bt2) = 1 IF ITEM_INDEX(ls1) = 0 MESSAGE "Sélectionner un programme !": RETURN END_IF f$ = sd$ + ITEM_INDEX$(ls1): ' voir le fichier d'origine ELSE IF CLICKED(bt7) = 1 f$ = fr$: ' voir le fichier résultat ELSE IF CLICKED(bt6) = 1 IF ITEM_INDEX(ls2) = 0 MESSAGE "Sélectionner une bibliothèque !": RETURN END_IF f$ = sd$ + ITEM_INDEX$(ls2) ELSE IF CLICKED(bt7) = 1 f$ = fr$ ELSE IF ITEM_INDEX(ls3) = 0 MESSAGE "Sélectionner un sous-programme !": RETURN END_IF sp$ = ITEM_INDEX$(ls3): ' voir le sous-programme sélectionné FILE_OPEN_READ 1, sd$ + fsp$ WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: a$ = RTRIM$(a$): k% = INSTR(a$, ":") IF k% > 0 IF INSTR(a$, " ") < 1 ' c'est une étiquette IF a$ = sp$ FILE_OPEN_WRITE 2, ft$: FILE_WRITELN 2, a$ FILE_READLN 1, a$ WHILE UPPER$(a$) <> "RETURN" FILE_READLN 1, a$: FILE_WRITELN 2, a$ END_WHILE FILE_CLOSE 1: FILE_CLOSE 2: f$ = ft$: EXIT_WHILE END_IF END_IF END_IF END_WHILE END_IF END_IF END_IF END_IF EXECUTE_WAIT affic$ + f$ IF FILE_EXISTS(ft$) = 1 THEN FILE_DELETE ft$ RETURN
Listvl: ' liste des variables (t$="DIM") ou labels (t$="LABEL") du source f$, dans fl$ FILE_OPEN_READ 1, f$: FILE_OPEN_WRITE 2, fl$ WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: a$ = TRIM$(a$) k% = INSTR(a$, "'") IF k% > 0 THEN a$ = RTRIM$(LEFT$(a$, k% - 1)) IF a$ = "" THEN GOTO nxwh k% = INSTR(a$, CHR$(34)) IF k% > 0 b$ = MID$(a$, k% + 1, 300) k% = INSTR(b$, CHR$(34)) IF k% > 0 THEN a$ = LEFT$(a$, k%) + MID$(b$, k%, 300) END_IF nvla: k% = INSTR(UPPER$(a$), t$ + " ") IF k% > 0 IF k% > 1 b$ = MID$(a$, k% - 1, 1) IF b$ <> ":" AND b$ <> " " AND b$ <> CHR$(9) a$ = MID$(a$, k% + 1, 300): GOTO nvla END_IF END_IF a$ = MID$(a$, k% + LEN(t$) + 1, 300) nvla1: k% = INSTR(a$, ",") IF k% > 0 FILE_WRITELN 2, TRIM$(LEFT$(a$, k% - 1)) a$ = MID$(a$, k% + 1, 300): GOTO nvla1 ELSE k% = INSTR(a$, ":") IF k% > 0 FILE_WRITELN 2, TRIM$(LEFT$(a$, k% - 1)) a$ = MID$(a$, k% + 1, 200): GOTO nvla ELSE FILE_WRITELN 2, TRIM$(a$) END_IF END_IF END_IF nxwh: END_WHILE FILE_CLOSE 1: FILE_CLOSE 2 RETURN
Aide: a$ = " - INSERTION D'UN OU PLUSIEURS SOUS-PROGRAMMES DANS UN SOURCE -" + CHR$(10) a$ = a$ + " ============================================" + CHR$(10) + CHR$(10) a$ = a$ + " PRINCIPE" + CHR$(10) a$ = a$ + " ------------" + CHR$(10) a$ = a$ + "Les sous-programmes sont contenus dans des 'bibliothèques', dans lesquelles ils sont" + CHR$(10) a$ = a$ + "de la forme:" + CHR$(10) a$ = a$ + CHR$(9)+"Etiquette:" + CHR$(10) a$ = a$ + CHR$(9)+"DIM [variables internes au sous-programme]"+CHR$(10) a$ = a$ + CHR$(9)+"LABEL éventuel (s'il y a des étiquettes internes au sous-programme)" + CHR$(10) a$ = a$ + CHR$(9)+".... corps du sous-programme ..." + CHR$(10) a$ = a$ + CHR$(9)+"RETURN" + CHR$(10) a$ = a$ + " et ainsi de suite pour chacun des sous-programmes." + CHR$(10) a$ = a$ + "Les bibliothèques se trouvent dans le même répertoire que les sources, sous forme" + CHR$(10) a$ = a$ + "de fichiers sources au format Panoramic, de noms 'xxxxxxx.bi'." + CHR$(10) a$ = a$ + "Ces fichiers sont créés sous éditeur Panoramic, mais ne sont pas exécutables tels quels."+ CHR$(10) a$ = a$ + CHR$(10) a$ = a$ + "Les sous-programmes sélectionnés seront ajoutés à la fin du programme source" + CHR$(10) a$ = a$ + "d'origine, leurs variables et leurs labels étant insérés juste avant le 'END' du" + CHR$(10) a$ = a$ + "programme. Il y a un contrôle pour éviter la duplication des noms de variables." + CHR$(10) a$ = a$ + "Il peut donc y avoir des variables identiques d'un sous-programme à l'autre." + CHR$(10) a$ = a$ + CHR$(10) a$ = a$ + " INSERTION DES SOUS-PROGRAMMES" + CHR$(10) a$ = a$ + " ---------------------------------------------" + CHR$(10) a$ = a$ + "Le programme IncSub.bas (celui-ci) affiche:" + CHR$(10) a$ = a$ + "- la liste des programmes sources .bas du répertoire." + CHR$(10) a$ = a$ + "- la liste des bibliothèques, de la forme xxxxxx.bi." + CHR$(10) a$ = a$ + "On clique le source à modifier dans la première colonne, puis la bibliothèque" + CHR$(10) a$ = a$ + "contenant les sous-programmes désirés dans la deuxième colonne." + CHR$(10) a$ = a$ + "Le programme affiche alors la liste des sous-programmes de cette bibliothèque." + CHR$(10) a$ = a$ + "On clique dans cette liste le ou les sous-programmes à insérer, qui vont alors" + CHR$(10) a$ = a$ + " s'afficher dans la dernière colonne (pour supprimer une sélection, cliquer sur" + CHR$(10) a$ = a$ + " son nom à droite)." + CHR$(10) a$ = a$ + "Le nom du fichier résultat est dérivé du nom d'origine, pour ne pas détruire l'original," + CHR$(10) a$ = a$ + "mais on peut le modifier à loisir (c'est un Edit)." + CHR$(10) a$ = a$ + "Une fois tous les sous-programmes désirés sélectionnés, clic 'OK', ils seront alors" + CHR$(10) a$ = a$ + "ajoutés au source d'origine pour former le fichier résultat, dont le nom s'affiche" + CHR$(10) a$ = a$ + "en rouge une fois l'opération terminée." + CHR$(10) a$ = a$ + CHR$(10) a$ = a$ + "-> Le fichier résultat obtenu doit être exécutable tel quel." + CHR$(10) a$ = a$ + CHR$(10) a$ = a$ + " CONTROLES" + CHR$(10) a$ = a$ + " ---------------" + CHR$(10) a$ = a$ + "On peut visualiser (dans le Notepad):" + CHR$(10) a$ = a$ + "- le source sélectionné ('Voir le programme')" + CHR$(10) a$ = a$ + "- la bibliothèque sélectionnée ('Voir la bibliothèque')" + CHR$(10) a$ = a$ + "- le sous-programme sélectionné ('Voir le sous-programme')" + CHR$(10) a$ = a$ + "- le résultat obtenu ('Voir le résultat')" + CHR$(10) a$ = a$ + CHR$(10) a$ = a$ + " REMARQUES" + CHR$(10) a$ = a$ + " ---------------" + CHR$(10) a$ = a$ + "Il n'y a aucune contrainte de noms de variables dans les sous-programmes." + CHR$(10) a$ = a$ + "Si ces noms sont en double ou plus, seule une occurence sera déclarée." + CHR$(10) a$ = a$ + "Rappel pour l'exécution: toutes les variables sont communes dans le source Panoramic" + CHR$(10) a$ = a$ + "'résultat', une modification d'une variable se répercute donc dans tout le programme." + CHR$(10) a$ = a$ + "Par contre, les noms de sous-programmes et autres labels doivent impérativement" + CHR$(10) a$ = a$ + "être uniques." MESSAGE a$ RETURN | |
|