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 |
|
|
| Des DLL pour Panoramic ? | |
| | |
Auteur | Message |
---|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Des DLL pour Panoramic ? Dim 19 Déc 2021 - 20:52 | |
| Merci pour ces exemples. Effectivement, on peut stocker un tableau à plusieurs dimensions dans un tableau à une dimension. Je m'en sers dans certains programmes, notamment pour mémoriser des matrices symétriques (on mémorise la demi-matrice supérieure dans un tableau monodimensionnel, cela gagne de la place). Mais il faut alors récrire tous les algorithmes, avec le risque d'erreur que cela comporte ! Donc je reviens aux chaînes de caractères. Voici un exemple en FBCroco. - Code:
-
const CR = chr(13)
dim mat$
mat = " 2 1 5 -8 0" + CR mat = mat + " 7 6 2 2 17" + CR mat = mat + "-1 -3 -10 4 -10" + CR mat = mat + " 2 2 2 1 7"
On n'utilise que 2 caractères séparateurs : l'espace pour les colonnes et le retour-chariot pour les lignes. Une procédure SPLIT permet de découper la chaîne afin de remplir un tableau classique à 2 dimensions sur lequel se font les calculs. A titre indicatif, voici un programme complet en FBCroco. Attention : l'instruction SPLIT ne fonctionne pas dans la version actuelle. Il faudra attendre la prochaine mise à jour ! - Code:
-
' ******************************************************************* ' Solution d'un systeme d'equations lineaires (methode de Gauss-Jordan) ' *********************************************************************
const CR = chr(13)
dim mat$
mat = " 2 1 5 -8 0" + CR mat = mat + " 7 6 2 2 17" + CR mat = mat + "-1 -3 -10 4 -10" + CR mat = mat + " 2 2 2 1 7"
' Lecture des donnees
dim row$(), elem$() dim nrow%, ncol%, i%, j%, res%
nrow = split(mat, CR, row()) ncol = split(row(1), " ", elem())
dim a(nrow, ncol), det
for i = 1 to nrow ncol = split(row(i), " ", elem()) for j = 1 to ncol a(i,j) = val(elem(j)) next j next i
print : print "Matrice du systeme" : print for i = 1 to nrow for j = 1 to ncol print a(i,j), next j print next i
res = gaussjordan(a(), det)
print : print "Matrice inverse et vecteur solution" : print for i = 1 to nrow for j = 1 to ncol print using "####.####"; a(i,j); next j print next i
print : print "Determinant : "; using "####.####"; det
end
function gaussjordan% (a(), det) ' ------------------------------------------------------------------ ' Algorithme de Gauss-Jordan pour une matrice a(1..n, 1..m), m >= n ' ------------------------------------------------------------------ ' En entree : ' la sous-matrice a(1..n, 1..n) contient les coefficients ' la sous-matrice a(1..n, (n+1)..m) contient le(s) vecteur(s) constant(s) ' ' En sortie : ' la sous-matrice a(1..n, 1..n) contient la matrice inverse ' la sous-matrice a(1..n, (n+1)..m) contient le(s) vecteur(s) solution(s) ' le determinant de la matrice originelle est retourne dans det ' la fonction retourne un code d'erreur : ' 0 : pas d'erreur ' -1 : dimensions incompatibles (n > m) ' -2 : matrice quasi-singuliere ' ------------------------------------------------------------------
const EPS = 1.0E-15
dim n%, m% ' Bornes de a dim i%, j%, k% ' Indices de boucles dim ik%, jk% ' Coordonnees du pivot dim pvt ' Pivot dim t ' Variable auxiliaire
n = ubound(a, 1) m = ubound(a, 2)
if n > m then return -1
dim prow(n) ' Sauvegarde la ligne du pivot dim pcol(n) ' Sauvegarde la colonne du pivot dim mcol(n) ' Sauvegarde une colonne de la matrice
det = 1 k = 1
while k <= n ' Recherche du plus grand pivot dans la sous-matrice a[k..n, k..n] pvt = a(k, k) ik = k jk = k for i = k to n for j = k to n if abs(a(i, j)) > abs(pvt) then pvt = a(i, j) ik = i jk = j end_if next j next i
' Pivot trop faible ==> matrice quasi-singuliere if abs(pvt) < EPS then det = 0 : return -2
' Sauver la position du pivot prow(k) = ik pcol(k) = jk
' Mettre a jour le determinant det = det * pvt if ik <> k then det = -det if jk <> k then det = -det
' Echanger la ligne courante (k) avec la ligne du pivot (ik) if ik <> k then for j = 1 to m swap a(k, j), a(ik, j) next j end_if
' Echanger la colonne courante (k) avec la colonne du pivot (jk) if jk <> k then for i = 1 to n swap a(i, k), a(i, jk) next i end_if
' Stocker la colonne k de a dans mcol et mettre cette colonne a 0 for i = 1 to n if i <> k then mcol(i) = a(i, k) a(i, k) = 0 else mcol(i) = 0 a(i, k) = 1 end_if next i
' Transformer la ligne du pivot for j = 1 to m a(k, j) = a(k, j) / pvt next j
' Transformer les autres lignes for i = 1 to n if i <> k then t = mcol(i) for j = 1 to m a(i, j) = a(i, j) - t * a(k, j) next j end_if next i
k = k + 1 end_while
' Echanger les lignes de la matrice globale for i = n to 1 step -1 ik = pcol(i) if ik <> i then for j = 1 to m swap a(i, j), a(ik, j) next j end_if next i
' Echanger les colonnes de la matrice inverse for j = n to 1 step -1 jk = prow(j) if jk <> j then for i = 1 to n swap a(i, j), a(i, jk) next i end_if next j
return 0 end_function
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Lun 20 Déc 2021 - 18:40 | |
| Je viens de publier une nouvelle version de KGF.dll donnant la possiblité de lire et/ou modifier des tableaux simulés en 2 ou 3 dimensions, quelque oit le type des données, donc même de type chaîne de caractères. Il y a un programme de démo qui montre précisément cela. J'ai également publié l'unite Delphi contenant toutes les fonctions nécessaires ainsi que l'objet MDA. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Jeu 23 Déc 2021 - 0:45 | |
| Je viens de publier la doc de la nouvelle version de KGF.dll. Dans la section des "Objets", il y a un nouvel objet MDA. Et dans cette partie, j'ai non seulement documentée de façon détaillée la technique d'accès aux tableaux de Panoramic, mais également une unité Delphi totalement indépendante de KGF et utilisable partout réalisant l'accès aux tableaux, et, dans ses commentaires, une petite routine permettant de déterminer si le programme Panoramic en cours est en mode "compilé" ou "interpêté"... | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 8:17 | |
| Merci Klaus J'ai vu tout cela dans l'aide en ligne. Le lien sur KGF.chm ne semble pas fonctionner. La prochaine version de FBCroco sortira dans quelques jours. Les DLL pour Panoramic se limiteront aux variables simples. Les tableaux viendront ensuite. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 9:02 | |
| - Citation :
- Le lien sur KGF.chm ne semble pas fonctionner.
Curieux... Ma signature est: Lorsque je clique sur KGF.chm, j'obtiens un nouvel olglet avec: Il suffit de choisir "Enregistrer" puis cliquer siur OK et on a le fichier KGFchm.zip dans le dossier choisi. Dézipper ce fichier produit KGF.chm. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 12:01 | |
| Bonjour Klaus Je confirme ce qu'a dit jean_debord. Aucun lien n'est fonctionnel Ni KGF.dll(en format ZIP), ni ApplicationIcons.dll(en format Zip), ni KGF.chm ça renvoie vers cette page : https://servimg.com/view/18686814/701EDIT Maintenant quand je clique sur un lien, ça ouvre un autre onglet furtivement et se ferme immédiatement sans que l'on puisse voire quelque chose | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 12:41 | |
| | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 14:31 | |
| Pardon Klaus, mais ça ne fonctionne toujours pas même avec les liens que tu viens de donner. J'ai trouvé une astuce : il suffit de copier le lien puis le coller dans la recherche Google et ... tout est bien qui finit bien. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 14:36 | |
| Je ne comprends pas, Papydall. Même maintenant, si je clique sur ces liens, cela fonctionne.
Enfin, si tu as trouvé un moyen, ça peut aller... | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Des DLL pour Panoramic ? Ven 24 Déc 2021 - 20:28 | |
| Je viens d'essayer à nouveau. Cette fois-ci le lien a fonctionné !
J'ai donc bien le fichier KGF.htm | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Des DLL pour Panoramic ? Mar 28 Déc 2021 - 11:54 | |
| @jean_debord Je viens de tomber par hasard sur un code FreeBasic pour programmer des matrices, je ne sais pas si cela peut-être utile mais le voici: - Code:
-
type Matrix dim as double m( any , any ) declare constructor ( ) declare constructor ( byval x as uinteger , byval y as uinteger ) end type constructor Matrix ( ) end constructor constructor Matrix ( byval x as uinteger , byval y as uinteger ) redim this.m( x - 1 , y - 1 ) end constructor operator * ( byref a as Matrix , byref b as Matrix ) as Matrix dim as Matrix ret dim as uinteger i, j, k if ubound( a.m , 2 ) = ubound( b.m , 1 ) and ubound( a.m , 1 ) = ubound( b.m , 2 ) then redim ret.m( ubound( a.m , 1 ) , ubound( b.m , 2 ) ) for i = 0 to ubound( a.m , 1 ) for j = 0 to ubound( b.m , 2 ) for k = 0 to ubound( b.m , 1 ) ret.m( i , j ) += a.m( i , k ) * b.m( k , j ) next k next j next i end if return ret end operator 'some garbage matrices for demonstration dim as Matrix a = Matrix(4 , 2) a.m(0 , 0) = 1 : a.m(0 , 1) = 0 a.m(1 , 0) = 0 : a.m(1 , 1) = 1 a.m(2 , 0) = 2 : a.m(2 , 1) = 3 a.m(3 , 0) = 0.75 : a.m(3 , 1) = -0.5 dim as Matrix b = Matrix( 2 , 4 ) b.m(0 , 0) = 3.1 : b.m(0 , 1) = 1.6 : b.m(0 , 2) = -99 : b.m (0, 3) = -8 b.m(1 , 0) = 2.7 : b.m(1 , 1) = 0.6 : b.m(1 , 2) = 0 : b.m(1,3) = 21 dim as Matrix c = a * b print c.m(0, 0), c.m(0, 1), c.m(0, 2), c.m(0, 3) print c.m(1, 0), c.m(1, 1), c.m(1, 2), c.m(1, 3) print c.m(2, 0), c.m(2, 1), c.m(2, 2), c.m(2, 3) print c.m(3, 0), c.m(3, 1), c.m(3, 2), c.m(3, 3)
je l'ai trouvé ici | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Des DLL pour Panoramic ? Mar 28 Déc 2021 - 12:46 | |
| Une astuce pour gérer des matrices en Basic - bien. Delphi a déjà tout ce qu'il faut pour gérer les marices. Le probème étalt le lien entre Panoramic et Delphi pour passer des matrices. Outre la solution que j'ai proposée ci-dessus (via des tableaux multi-dimensionnels simulés par des tableaux uni-dimensionnels); il reste la solution de la mémoire partagée que représente mon objet "SharedMemory" dont la documentation se trouve ici: http://klauspanoramic.infinityfreeapp.com/ObjetSharedMemory.html#SharedMemory_frCela permet de travailler directement sur des zones mémoires partagées entre Panoramic et une DLL en Delphi, et de gérer en particulier des tableaux, mais pas que. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Des DLL pour Panoramic ? Mar 28 Déc 2021 - 15:00 | |
| @silverman :
Oui c'est un bel exemple de "Programmation Orientée Objet".
@Klaus :
Toujours le même problème. Je n'arrive pas à accéder au lien !
J'obtiens le message "Votre accès à Internet est bloqué" !
EDIT : j'y suis arrivé finalement. Je pense que c'est un bug de Windows. | |
| | | Contenu sponsorisé
| Sujet: Re: Des DLL pour Panoramic ? | |
| |
| | | | Des DLL pour Panoramic ? | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |