La section hors sujet non officielle.

Vous n'êtes pas identifié(e).

#1 05-06-2020 10:42:15

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Salut les copain (mais pas tous), j'assume

Venez sur le forum anglais, l'esprit d'entraide est là, loin de l'esprit claniste du forum fr.

Je suis venu suite à un message sur le forum En qui m'a rappelé que le pouvoir perverti les gens ...
Je me ferais peut-être tailler un short mais je survivrai.

De très bons codeurs sur le forum fr, autant que sur le forum En.
Un meilleur esprit sur le forum EN.

Salut Ar-S ainsi que mes copains Zorro et KCC, Flype, Cederavic etc. (Flype tu vas bien depuis 2000 date à laquelle j'ai connu et utilisé PB ?)

Je code toujours autant, je suis comme KCC, je me suis mis une peu au C pour le projet sur lequel je bosse.

A+ les copains

Hors ligne

#2 05-06-2020 10:47:24

~ Ar-S ~
Admin
Inscription : 17-02-2020
Messages : 178
Site Web

Re : Salut les copain (mais pas tous), j'assume

Salut Denis.
Content de te lire. Sois le bienvenu.
Le Bistrot est un peu calme mais on peut venir s'y détendre h24  babacool


~ Ar-S ~  babacool

Hors ligne

#3 05-06-2020 10:55:08

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Re : Salut les copain (mais pas tous), j'assume

J'adore tes  dents happy

Hors ligne



#4 05-06-2020 11:02:31

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Re : Salut les copain (mais pas tous), j'assume

C'est bien ce petit forum,  je met un blâme à Fred qui ne veux rien savoir.

Lorsque j'étais au primaire dans les années 60, on mettait un bonnet d'âne si on répondait vraiment mal, c'est Pour Fred  mrgreen

Je rigole, je suis admiratif, tenir autant de temps pour gagner des clopinettes, ..0.   respect!

Dernière modification par Denis (05-06-2020 16:14:36)

Hors ligne

#5 05-06-2020 14:24:06

~ Ar-S ~
Admin
Inscription : 17-02-2020
Messages : 178
Site Web

Re : Salut les copain (mais pas tous), j'assume

Effet Golgate PB plus icon_lol


~ Ar-S ~  babacool

Hors ligne

#6 07-06-2020 19:02:01

kwai chang caine
PureBasicien
Inscription : 18-02-2020
Messages : 64

Re : Salut les copain (mais pas tous), j'assume

Salut DENIS toujours heureux de te lire  cool
Et puisque l'on parle de dents, dans la langue de "molaire"  mrgreen en plus cool
Kcc il reve de faire du C, DENIS il en fait, that is all the difference  mrgreen
Au plaisir de se retrouver sur le comptoir de ARS...pour parler tricot  ohyeah

Hors ligne

#7 07-06-2020 23:46:28

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Je te connais très peu Denis. Mais le peu d'exemple que je connais de toi, c'est que tu ne lâches pas quelqu'un qui est dans une merde trois étoile. Ça remonte à quelques années.

Hors ligne

#8 09-06-2020 14:47:13

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

Bonjour Denis , je ne vois pas mon pseudo dans la liste des bonjours icon_lol , c’était bien le Denis super calé en ASM du forum FR ? J’espère ne pas avoir participé à ton départ , si oui, je ne me rappelle absolument pas , ni même pourquoi et quand tu est parti. et si j'en suis la cause ou une partie de la cause, je suis désolé  smile

Hors ligne



#9 10-06-2020 09:52:47

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Re : Salut les copain (mais pas tous), j'assume

CplBator,

désolé, c'est toujours à double tranchant de citer des codeurs, on en oublie forcément toi entre autre mais aussi Erix14 et tant d'autres...
J'espère que nous survivrons tous les deux... roll

KCC, je démarre tout doucement en C mais je n'avance pas vite.
Je n'écris pas des applis complètes mais plus des bouts de code en C, en ce moment je travaille sur un projet mais avec le jardin, les champis, la lecture de livre sur le C et le reste, j'ai peu de temps.

Olliv, c'est un de tes messages qui m'a fait venir ici.

Finalement à 58 balais, se mettre au C, je me demande si c'est pas du suicide mrgreen

Dernière modification par Denis (10-06-2020 09:54:44)

Hors ligne



#10 10-06-2020 10:55:45

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

Denis a écrit :

Finalement à 58 balais, se mettre au C, je me demande si c'est pas du suicide mrgreen

C'est bien , au contraire , tu verras que la syntaxe n'est pas plus compliqué qu'en PB.
Tu utilises quel compilateur ? je suis tombé amoureux de visual studio et son autocomplétion , un vrai régal , il te donne les erreurs avant même d'avoir compilé ( intelisense je crois ) et sors des exe assez petit si tu n'utilise pas la STL.
Sur quel genre de projet tu bosses ?

Hors ligne

#11 10-06-2020 20:05:47

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Merci Denis, pourtant, c'était dénué de plaisir que j'ai écrit ce message.

La section "Débutant" est, en fait comme une "Coding question". Et se voir effacé ça sans prévenir, sans raison ni auteur, c'est lourd. Parce qu'on reste tous débutant. Ayant croisé d'anciens informaticiens, c'est une réalité à ne pas voiler.

La fièreté du fait ne sert à rien. Chercher un coupable ne sert à rien. Seuls me semblent servir échanges et mémoires, ce qui est loin d'être simple !

Et, si ça peut te rassurer, découvrir le C tardivement est un labeur. Mais se faire une double fenêtre PureBasic/C, ça me semble une tâche enrichissante.

Hors ligne

#12 11-06-2020 14:25:12

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Par contre, l'auto-complétion, je reste sceptique. Elle s'était remise en 2016 quand j'ai dl la version 5.50. J'ai voulu m'y faire, mais... Rien à faire. Donc, après 4 ans, je l'ai enlevé et, franchement, je dirais que j'arrive enfin à me concentrer. En réalité, c'est une chienlit : il vaut mieux apprendre par coeur les fonctions, les variables et les champs de structure que de rester voir un truc qui t'arrête net, qui te met une liste dans un ordre alphabétique donc absolument pas dans l'ordre fonctionnel ni thématique, et qui casse la lancée.

En fait, je pense que ça dépend comment on se concentre et moi, c'est complètement à l'opposé de ma manière de me concentrer. Je le vois dans la taille des programmes que je fais depuis : c'est nettement plus consistant. Et vraiment, je ne sais vraiment pas comment vous arrivez à vous concentrer quand une liste apparaît comme ça...

Hors ligne



#13 11-06-2020 14:26:30

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Re : Salut les copain (mais pas tous), j'assume

CplBator a écrit :
Denis a écrit :

Finalement à 58 balais, se mettre au C, je me demande si c'est pas du suicide mrgreen

C'est bien , au contraire , tu verras que la syntaxe n'est pas plus compliqué qu'en PB.
Tu utilises quel compilateur ? je suis tombé amoureux de visual studio et son autocomplétion , un vrai régal , il te donne les erreurs avant même d'avoir compilé ( intelisense je crois ) et sors des exe assez petit si tu n'utilise pas la STL.
Sur quel genre de projet tu bosses ?

J'utilise Visual studio 2019.

Je ne bosse pas en C sur un projet global, juste des codes qui me servent à comprendre.
Je bosse plusieurs choses en PB et en particulier j'essaye un analyseur lexical  (mais la partie syntaxique est ardue) pour extraire des données de fichiers h en C.
Je fais ça parce que j'ai eu des soucis sur la taille de structure en PB, alors j'ai voulu regarder. Etant donné que PB utilise les API C/Cpp (windows pour moi), on est donc sur des déclarations dans les fichiers h.

En ayant Visual, on a les derniers SDK qui se mettent à jour.

Hors ligne



#14 11-06-2020 14:40:45

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Une petite question : vous faites un peu d'ASM en ARM ?

--->  Je rajoute un lien pour ne pas pourrir le sujet
https://hs.ldvmultimedia.com/viewtopic.php?pid=375

Dernière modification par Olliv (11-06-2020 16:06:37)

Hors ligne

#15 11-06-2020 17:19:54

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

Olliv , l'autocomplétion est au top, par exemple , tu inclue n'importe quel lib , l'autocomplétion ne sera jamais au hasard , elle est systématiquement pertinente , et c'est vraiment top.

@Denis, j'ai déjà bosser le sujet il y a longtemps pour faire du transpilage PB -> C , et .H en .PBI pour me faire une moulinette d'import de fonction.

Voici comment j'ai fait :

- Je lis le code source en format ASCII , le tout par dans la RAM. ( on a rarement des gigas de sources )

- Je lis caractère par caractère , ma mémoire contenant le fichier.

Cela me permet de savoir si je suis dans un string ou pas , ex : std::string value = "je suis un dans un string";
cela m'évite par la suite de faire un traitement inutile dans l'intérieur du string. Cela me permet aussi de séparé en mot tout le code source.

ex :

MaVar2 = MaVar * #PI 
Str$ = "Test" 

deviens

MaVar2
=
MaVar
*
#PI
Str$
=
"Test"

Chaque mot isolé est stocké dans une liste structurée , je sais donc de quel fichier , de quel ligne il sagit sur n'importe quel mot , cela facilite la gestion d'erreur par la suite.
ensuite , quand j'ai tout isolé ( et supprimé les commentaires ) , si ton projet est un peu plus poussé , je fait une passe préprocesseur ici , càd que je remplace toute les constantes par les vrais valeurs & j'applique les includes en utilisant le même procédé de lecture.
Maintenant , j'identifie tout les mot , savoir si c'est une variable, un opérateur , un texte , etc...

Dès lors que tout est identifié ( tu peu le faire avec des regex , moi je fait tout a la main ) tu peu généré un byte-code intermédiaire.
Le byte code , est relativement simple , c'est toi qui fixe les règles. pour chaque mot ( token ) tu attribue une valeur , un peu comme un op-code de processeur

par ex :

MaVar = 56

deviens

0xFF <- Tag pour une variable
0x00000000 <- place dans une vtable
0x0D <- Operateur =
0xFE <- Immediate value
0x38 <- 56

Si tu as réussi tout cela , tu as créer la partie arrière d'un compilateur ! wink tu peu facilement géré les erreurs avec une machine à état.
càd que la machine à état attends une valeur bien particulière pour continué , au début , elle n'attends rien de spécifique , le premier mot va mettre la machine dans un certain état , par exemple :

MaVar = 32

Le premier mot est une variable, la machine à état s'attend donc à recevoir un opérateur quelconque derrière , si ce n'est pas le cas, il y a une erreur de syntaxe.
voila, je ne vais pas te faire toute les règles , mais les grandes lignes sont là.
Ensuite, à partir de ton bytecode, tu peu facilement le convertir dans n'importe quel langage de programmation.
Attention toutefois au C , avec les macro , c'est vite hardcore wink

je ne comprends pas ton soucis de taille de structure en PB , mais au cas ou tu ne le sait pas , il y a cela en PB :

Structure Test Align #PB_Structure_AlignC
  
EndStructure

Hors ligne

#16 12-06-2020 15:09:21

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Petit ajout. Je vois que Cpl.bator se limite à l'ASCII 7 bits. Ça ne pose pas de problème, mais ça empêche l'Assembleur si on utilise un format de caractère à occupation variable dans la mémoire. Un résumé vaut mieux que des mots :

ASCII     1 octet (fixe)
UTF8      1 + 3K (1; 4; 7; 10; etc...) octet(s) (variable)
UNICODE   2 octets (fixe)

Et l'IDE natif de PureBasic enregistre en UTF8. Donc le modèle UTF8 ressemble un peu à ça :

[ ][  | ][  | ][  | ]etc...

Légende :
[ ] 1 octets
[  ] 2 octets
[  | ] 3 octets

Dès le bit 7 de l'octet est à 1, zoup, un bloc de 3 octets se crée.
2 octets pour identifier une "page" de caractère et 1 octets (enfin 7 bits, pour être précis) pour définir le caractère.

Voilà, j'ouvre ma goule, parce qu'en ASM, ça va très vite pour charger un fichier texte, et compter les lignes en même qu'elles sont indexées (table de pointeurs de chaînes). Et là, ça peut faire plusieurs gigas sans problème (imaginons un mordu des datas...).

Hors ligne



#17 12-06-2020 19:43:28

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

Olliv a écrit :

mais ça empêche l'Assembleur

Qu'est ce que tu chantes ? je parle uniquement de lecture du code source en ascii , rien d'autre. si tu parles du byte code qui viens ensuite , c'est à ta guise selon tes besoins.

Hors ligne

#18 12-06-2020 23:28:19

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Je parle bien de la 1ère étape : la lecture du fichier, c'est de l'UTF8, pas de l'ASCII. Lire de l'UTF8 en considérant que c'est de l'ASCII, c'est risquer qu'une zone exclue (commentaire, guillemets de chaîne, etc...) ponde un caractère ASCII d'échappement, et vienne faire croire qu'une chaîne c'est du code.

Si un numéro de page de caractère UTF8 contient 1 octet de code 34 (le guillemet de chaîne, en hexa 0x22h), par exemple une page 0x??22h ou 0x22??h, pour afficher je ne sais quel caractère exotique entre guillemets, si elle est lue en ASCII, octet par octet, ça te fait fermer ta chaîne de caractères, et le reste de la chaîne entre le caractère exotique et la fin de chaîne est considéré comme du code.

C'est pour ça que tu me vois préciser la structure d'un caractère UTF8. En binaire c'est plus simple :

Représentation de 3 caractères UTF8
[0xxxxxxx] ; caractère standard ASCII7
[1xxxxxxx][pppppppp][pppppppp][0xxxxxxx] ; caractère étendu
[1ppppppp][pppppppp][pppppppp][1qqqqqqq][qqqqqqqq][qqqqqqqq][0xxxxxxx] ; caractère étendu double

Je suis d'accord que le but, ce n'est pas de définir le sens d'écriture ou la fusion de caractère, comme le permet l'UTF. Mais si le bit 7 d'un caractère ASCII est à 1, il faut s'inquiéter pour éviter qu'un artefact dans la zone pppp ou qqqq (numéro de page de caractère étendu) vienne pourrir ton scan de fichier.

Hors ligne

#19 13-06-2020 11:58:09

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

je t'avoue que je ne me suis jamais vraiment soucié du 1er bit. j'ai toujours fait en sorte que les fichiers que je lisait était en utf-8 sans bom & encodé sur un octet par caractère.

Hors ligne



#20 13-06-2020 20:29:57

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

@Cpl.bator

En gérant les exceptions de l'UTF8, les 2 cas de l'ASCII 8 bits et de l'UNICODE 16 bits étant fixes, on prend effectivement le BOM que tu cites et on rentre tout en mémoire, inclusions comprises (même si on ne les a pas dans l'ordre) avec ReadData() et on peut tout traiter en ASM.

Pour le byte code, effectivement, y'aura jamais mieux !

Hors ligne

#21 14-06-2020 00:22:57

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

J'ai glissé sur la "table à sky"...

Define CS.S ; This below is a zipped buffer of the 4096 bytes required to stored the 437-coded page font matrix 8 * 16 dots
CS = "" +
     "789C85573F6B2347141F1CD86AD129DD121B5F8AFB004B02CE922C361CF90AE9075FD85CB124AE74822CEB737355AA1401933A4DBE8361B160B842B8140229C695D51C87E0C0A742CCE6BD9937336FE4" +
     "0B7992F1BE9DDDF9BDF77BFF4642FCAF344ADDDEDE2EBB06953CCF7696CBEABAEBBAEBAA4C137C22CBA518A7CD743A1DE16A66E569F4CA68399FCF9723ABB4177F5D5C5C5D5E5CB456CFCAB28437E04D" +
     "AB0F8B5A29AD40FCFB6C7F21A6F03562F534CB4561304B86DF07F0313C3A9FC27653C2EF177D3F59F5BDC5AFAAEA5964EC16EE34F0576DAD7E27E5B846BDF1788DD25DA7AC8EFE37682DE9567AB2037C" +
     "02573A2B6EB1D6204D31746AAD6BF3C7F9458259443A8F07F4447C203EE3C3F11FF0C182DA8ADB6E58341E3ECB1A75DD3549F24635F6E98D71B6AAEA8D7DFA204DCB7A1AF11FC563B4144BFB06F79F5D" +
     "6B2573B05269D221E0ABD58AE28572AD525C7F438F57A72FC72FE569A5FD0E9C6FD88BE303BABA7FD0B737942F2EFEDC7FD1CE51CE3C7E0BC1F7F8455D17A365F087F0A55CBBF51FE55A7ABDA88BC8FF" +
     "B2AE8F45EB4D25F623FE0D398D945D780A529E2EF31C02C8C5C4FF56A9EA5B7F6B64E2DBA4D3313D2125965FE9CC1721F58EAC7C43FF8F2C47C196DEC86A8205806212DA4896DA1D30954DF951FD41FE" +
     "D723F4E0DEA8987F3C1EE0007C6547F96FD1F313E6509B95F076990592CAEAF9739FDE006C04EACA2E3AEA4AC728AF6FB02FCE071B335E5E429CE4DC7FEA274093F37F727975753921FF3140655FFAEC" +
     "3D34D600DF966C9124629018A9D066CCBFC7F8B81CF8FFC8F31FE11596DF7BDA7FF0C557D893DCFEC6C536F36DF61E4A6F8C1DE7DEF36F6F900E86723EA053A82994CFCD9F49EABA6E2F3E06FF0F81E0" +
     "638C5FE9C8B7D1C8E2C60E1BDA00985C97A1FE8A381E10CC4FE157377F1C230514FF28FF44BB582C7CF44FBE3EC1743B5BDF31F450EB42BDD77AA6A2FEFF4ECF50CC35F25FECE4072AA1A2D07FDE7F3E" +
     "4B00FF43EBCAEFFCC5F90B909F56F7DD0E0184EFDA49C0E7FD4D8501E5D78FEA797D449736FE8CFF835C4A287E991F78A045B92A1781FFBD04FB5FF7DA6A769844F384CD176C3F8FF001BD9EBBCDCDF4" +
     "E3FEFB0D8DF6BABB5B6FF4667DE7F0CA6A32592C2613971F5BDBAC7CFFF3FE37780BC78DAED0219B1F9F7F1F7FC86D8E8FC1D53EC47BC9E0F0581F1F0E923DB2B818DBFC6A237367B74D3AA00D5CFF4B" +
     "0FADFEF377FBED7CF90A2F7FF83BFE98F55E44FD9FCA8B6C82F68F603E5D1A65E977F3C9F85FFB7E67FC1F55818F6318861AEDB941ED9F57F187DEE859FE43FD21821B121525939B97809F94D03E5CBC" +
     "C17F59A4491C7FB8C3E63FCB876C470896F75FF40EBB3BE19F4331FEBA8F42CB0730DE75EAC9D5B3DF87460AAB0FF37C8B057B44F9ABC427F03791114FF9F96FB0BFCF968C2F357663E710F6EE2DF35F" +
     "3DCE7F7EDEB3FD37C6DF047CF30C9BBF4ED8FCB7A820F6AA9080CFF008BDF6E7337BCBE9F978CAED21BE1FA27E074D8EEB6055EBDB4BC83F8A8786F8DB19CCF067331DCE6B826E78FF391FB4C9512C7D" +
     "640F1C92E01BE17BAE0C994DE43FB86A7A5CC0873B70831447519BA434C2363BF1EFD9F9CB9C4FB8D0822FC0C66C95F8CD2CD721FF04C3DB20BCEB67E1BCF19078FE5D3E0AB1031A69A94EB39D45FF84" +
     "56BF65C32FE5B50A33494FC3F955F9040DF84CE88DE8FC6730387E2EB5CC1FE1BBF34F4E42FD7800BB9CE156037AB89D40C54CF8FCD6C1FF7E47C413739C7957D7E54140840D82770935888474981067" +
     "C541E8CF999DB084E78FC3F75BC63F9BDF4602FE3CFAE961E559D5473FBA5AC14ED0654A42FEA3EFC84146F50B838A128CF1EFF1D73B22CEE6B97C1BA7C3B0289A46FB5724356869D76A153DCC2AC708" +
     "8C87E6B4FA053AF807C70EF61FB7FC6447F05E63C56F013FFE9AC2B71748E73463BF7F398BCE5E3C4292BD03ECA6B6825947F3F5E768FF2FF917632FDCEC"

Procedure VgaSetup(CS.S)
       
       Structure TemporaryArrays
              ZipSize.I
              *Temp
              Array LineCharSet.A(31, 127)
              Array PointCharSet.I(255, 127)
              Image.I
              Image2.I
       EndStructure
       
       Structure DisplayMemory
              Lap.I
              Path.S
              
              Array C.I(79, 29, 2)
              Win0.I
              CursorSprite.I
              CursorDelay.I
              CursorPersist.I
              CursorX.I
              CursorY.I
              CursorStatus.I
              CursorColor.I
              ShutDown.I
       EndStructure
       
       Define.I I, X, Y, U, GC, Alp
       Define *CS.TemporaryArrays = AllocateStructure(TemporaryArrays)
       Define *DM.DisplayMemory = AllocateStructure(DisplayMemory)
       UseZipPacker()       
       With *CS
              \ZipSize = Len(CS) << 1
              \Temp = AllocateMemory(\ZipSize)
              ; *** hexa >>> mem ***
              For I = 0 To (\ZipSize - 1)
                     PokeA(\Temp + I, Val("$" + Mid(CS, I << 1 + 1, 2) ) )       
              Next
              If  UncompressMemory(\Temp, \ZipSize, @\LineCharSet(0, 0), 4096, #PB_PackerPlugin_Zip) = 1 << 12
                     ; *** Pe() >>> Pc() ***
                     For Y = 0 To 127
                            For X = 0 To 255 Step 8
                                   Alp = \LineCharSet(X / 8, Y)
                                   For U = 0 To 7
                                          GC = Bool(($80 >> U) & Alp) * 255
                                          \PointCharSet(X + U, Y) = RGB(GC, GC, GC)
                                   Next
                            Next
                     Next                    
                     \Image = CreateImage(#PB_Any, 256, 128)
                     If StartDrawing(ImageOutput(\Image) )
                            For Y = 0 To 127
                                   For X = 0 To 255
                                          Plot(X, Y, \PointCharSet(X, Y) )  
                                   Next
                            Next
                            StopDrawing()
                     EndIf
                     ExamineDesktops()
                     InitSprite()
                     InitKeyboard()
                     InitMouse()
                     *DM\Win0 = OpenWindow(#PB_Any, 0, 0, DesktopWidth(0), DesktopHeight(0), DesktopName(0), #PB_Window_BorderLess)
                     Wdelta = 80
                     Hdelta = 30
                     OpenWindowedScreen(WindowID(*DM\Win0), 0, 0, 8*Wdelta, 16*Hdelta, 1, 0, 0)
                     For I = 0 To 255
                            X = I % 32
                            Y = I / 32
                            \Image2 = GrabImage(\Image, #PB_Any, X * 8, Y * 16, 8, 16)
                            CreateSprite(I, 8, 16)
                            If StartDrawing(SpriteOutput(I) )
                                   DrawImage(ImageID(\Image2), 0, 0)
                            EndIf
                            StopDrawing()
                            FreeImage(\Image2)
                     Next
              EndIf
       EndWith
       FreeStructure(*CS)
       With *DM
              
              \CursorSprite = CreateSprite(#PB_Any, 8, 16)
              If StartDrawing(SpriteOutput(\CursorSprite) )
                     Box(0, 14, 8, 2, RGB(255, 255, 255) )
              EndIf
              StopDrawing()
              \CursorPersist = 100
              \CursorColor = RGB(127, 127, 127)
       EndWith
       
       ProcedureReturn *DM
EndProcedure

*DM.DisplayMemory = VgaSetup(CS)

Procedure Locate(*DM.DisplayMemory, X, Y)
       *DM\CursorX = X
       *DM\CursorY = Y
EndProcedure

Procedure.S St(Qty, S$)
       Define R$
       For i = 1 To Qty
              R$ + S$
       Next
       ProcedureReturn R$       
EndProcedure

Procedure Cls(*DM.DisplayMemory, FrontColor, BackColor)
       Define I, J
       For I = 0 To 29
              For J = 0 To 79
                     *DM\C(J, I, 1) = FrontColor
                     *DM\C(J, I, 2) = BackColor
                     *DM\C(J, I, 0) = 32
              Next
       Next
EndProcedure

Procedure Pr1(*DM.DisplayMemory, A)
       Hm = 29
       If *DM\CursorY > HM
              *DM\CursorY = HM
              For y = 0 To HM-1
                     For x = 0 To 79
                            *DM\c(x, y, 0) = *DM\c(x, y + 1, 0)
                     Next
              Next
              For x = 0 To 79
                     *DM\c(x, HM, 0) = 32
              Next
       EndIf
       *DM\C(*DM\CursorX, *DM\CursorY, 0) = A
       *DM\CursorX + 1
       If *DM\CursorX > 79
              *DM\CursorX - 80
              *DM\CursorY + 1
       EndIf
EndProcedure

Procedure Pr(*DM.DisplayMemory, A$)
       For I = 1 To Len(A$)
              Pr1(*DM, Asc(Mid(A$, I, 1) ) )
       Next
EndProcedure

Procedure PrN(*DM.DisplayMemory, A$)
       For I = 1 To Len(A$)
              Pr1(*DM, Asc(Mid(A$, I, 1) ) )
       Next
       Locate(*DM, 0, *DM\CursorY + 1)
EndProcedure

Procedure tWindow(*DM.DisplayMemory, x, y, w, h)
       Locate(*DM, x, y)
       Define i, iw = w - 2
       Locate(*DM, x, y)
       Pr(*DM, Chr(201) + St(iw, Chr(205) ) + Chr(187) )
       For I = 1 To (h - 2)
              Locate(*DM, x, y + I)
              Pr(*DM, Chr(186) + St(iw, Chr(32) ) + Chr(186) )
       Next
       Locate(*DM, x, y + h - 1)
       Pr(*DM, Chr(200) + St(iw, Chr(205) ) + Chr(188) )
EndProcedure



Procedure Sync(*DM.DisplayMemory)
       With *Dm
              For i = 0 To 29
                     For j = 0 To 79
                            x = 8 * j
                            y = 16 * i
                            DisplayTransparentSprite(219, x, y, 255, \c(j, i, 2) )
                            DisplayTransparentSprite(\c(j, i, 0), x, y, 255, \c(j, i, 1) )
                     Next
              Next
              If \Lap > \CursorDelay
                     \CursorDelay = \Lap + \CursorPersist
                     \CursorStatus ! 1
              EndIf
              
              If \CursorStatus
                     DisplayTransparentSprite(\CursorSprite, \CursorX * 8, \CursorY * 16, 255, \CursorColor)
              EndIf
              FlipBuffers()
       EndWith
EndProcedure


Procedure Synt(*DM.DisplayMemory)
       If Right(*DM\Path, 1) = "\"
              *DM\Path = Left(*DM\Path, Len(*DM\Path) - 1)
       EndIf
EndProcedure


Procedure ShowTable(*Dm.DisplayMemory)
       PrN(*Dm, "")
       PrN(*Dm, Chr(201) + St(34, Chr(205) ) + Chr(187) )
       For Y = 0 To 7
              A$ = ""
              For X = 0 To 31
                     A$ + Chr(X + Y * 32)
              Next
              Pr(*DM, Chr(186) + St(34, Chr(32) ) + Chr(186) )
              Locate(*Dm, 2, *Dm\CursorY)
              PrN(*Dm, A$)
       Next
       Pr(*DM, Chr(200) + St(34, Chr(205) ) + Chr(188) )
EndProcedure


Procedure XXX(*DM.DisplayMemory)
       X0 = *Dm\CursorX
       Y0 = *Dm\CursorY
       Define.S Text, Name, Ext
       Define.I FileCount, DirCount
       Repeat
              *Dm\Lap = ElapsedMilliseconds()
              ExamineKeyboard()
              Delay(12)
              WindowEvent()
              Locate(*Dm, X0, Y0)
              Char.S = KeyboardInkey()
              If Char
                     CharA = Asc(Char)
                     If CharA = 8
                            If Text
                                   Text = Left(Text, Len(Text) - 1)
                                   Locate(*DM, X0 + Len(Text), Y0)
                                   Pr(*DM, " ")
                                   Locate(*DM, X0, Y0)
                            EndIf
                     EndIf
                     If CharA = 13
                            Command.S = Trim(UCase(Text) )
                            If Command = "ASC"
                                   ShowTable(*Dm)
                                   y0 = *Dm\CursorY
                                   
                            EndIf
                            If Command = "EXIT"
                                   End
                            EndIf
                            If Command = "CLS"
                                   Locate(*Dm, 0, 0)
                                   Pr(*Dm, St(80 * 30, " ") )
                                   Locate(*Dm, 0, 0)
                                   x0 = 0
                                   y0 = 0
                            EndIf
                            If Command = "DIR"
                                   Locate(*Dm, 0, y0 + 1)
                                   Dir = ExamineDirectory(#PB_Any, *Dm\Path, "*.*")
                                   FileCount = 0
                                   DirCount = 0
                                   ByteCount = 0
                                   While NextDirectoryEntry(Dir)
                                          Name = DirectoryEntryName(Dir)
                                          Select DirectoryEntryType(Dir)
                                                 Case #PB_DirectoryEntry_Directory       
                                                        PrN(*Dm, " [" + Name + "]")
                                                        DirCount + 1 
                                                 Case #PB_DirectoryEntry_File
                                                        Ext = UCase(StringField(Name, 2, ".") )
                                                        Name = StringField(Name, 1, ".")
                                                        Pr(*Dm, Name)
                                                        Locate(*DM, 30, *DM\CursorY)
                                                        Pr(*Dm, Ext)
                                                        Locate(*DM, 34, *DM\CursorY)
                                                        Size = DirectoryEntrySize(Dir)
                                                        ByteCount + Size
                                                        PrN(*Dm, Str(Size) )
                                                        FileCount + 1
                                          EndSelect
                                          
                                          Sync(*Dm)
                                   Wend
                                   PrN(*Dm, Str(FileCount) + " Fichier(s)  " + Str(DirCount) + " R"+Chr(130)+"pertoire(s)  " + Str(ByteCount) + " octet(s)")
                                   y0 = *Dm\CursorY
                                   
                            EndIf
                            Locate(*Dm, 0, y0 + 1)
                            Pr(*DM, *Dm\Path + ">")
                            x0 = *Dm\CursorX
                            y0 = *Dm\CursorY
                            Text = ""
                     EndIf
                     If CharA => 32
                            Text + Char
                     EndIf
              EndIf
              
              Pr(*DM, Text)
              Sync(*DM)
              
       Until KeyboardPushed(#PB_Key_Escape)
       
       *DM\ShutDown = 1
       
EndProcedure

Cls(*DM, RGB(63, 63, 63), RGB(0, 0, 0) )
For I = Int(205 /32)*32-32 To Int(205 /32)*32  + 32
       X$ + Chr(I)
Next
Pr(*DM, X$)
Locate(*DM, 0, 1)
tWindow(*DM, 0, 0, 80, 3)
Locate(*DM, 1, 1)
Pr(*DM, CPUName() )
Locate(*DM, 0, 3)
ShowTable(*Dm)
*DM\Path = GetCurrentDirectory()
Synt(*DM)
Pr(*DM, *DM\Path + ">")
XXX(*DM)

Hors ligne

#22 16-06-2020 09:56:17

Denis
PureBasicien
Inscription : 05-06-2020
Messages : 12

Re : Salut les copain (mais pas tous), j'assume

J'ai été assez malade depuis mercredi, mais vraiment pas bien (j'ai fais le test du Covid mais il n'est pas là icon_lol ). Ca va mieux maintenant.

Je ne cherche pas vraiment à faire un vrai compilateur, je n'utilise pas les REGEX, je ne maitrise pas assez.
J'ai tout écrit l'analyseur lexicographique à la main, j'ai extrait toutes les les structures des fichiers h avec, il me reste à retrouver certaines valeurs (les noms en C des structures sont variables).
J'ai déjà comparé la taille en C et celle en PB il me semble qu'il y a 2 structures qui sont fausses.  Il me reste à comparer les OffsetOf de chaque élément et j'aurais fait le 1ère partie.
J'avais laissé un peu de côté car j'ai plusieurs projets en cours alors je vais de l'un à l'autre.

Je parle de cela car une structure mal définie en taille (celles utilisée par les API windows) peut dans certain cas entraîner un plantage de l'application.

Finalement je cherche à pouvoir extraire toutes les structures en C d'un fichier h pour les convertir directement en PB. Ce n'est peut-être pas possible pour toutes mais si je continue et que j'arrive à faire exactement ce que je veux, je serais content.

Structure Test Align #PB_Structure_AlignC  / EndStructure   ne peut pas être employé systématiquement, je pense même qu'il faut faire attention.

A+

Hors ligne

#23 16-06-2020 13:21:25

CplBator
PureBasicien
Inscription : 23-03-2020
Messages : 28

Re : Salut les copain (mais pas tous), j'assume

Bonjour Denis, comme je te disait en C , il y a beaucoup de macro...
je prend le premier exemple que je trouve :

WinGDI.h :

#if(WINVER >= 0x0400)
typedef struct _DRAWPATRECT {
        POINT ptPosition;
        POINT ptSize;
        WORD wStyle;
        WORD wPattern;
} DRAWPATRECT, *PDRAWPATRECT;
#endif /* WINVER >= 0x0400 */

la structure n'est définie qu'a une certaine condition , il faut aussi savoir a quoi correspond POINT & WORD , qui dans ce cas là est simple , mais ce n'est pas toujours évident. C'est pour cela que je t'ai fait un "gros laïus" plus haut. pour faire un truc "générique" , cela reviens pratiquement a faire la partie arrière d'un compilo. En gros , tu seras capable de Trans pilé du C en PB.  ce n'est pas une mince affaire. Bon courage à toi & bon rétablissement wink

Hors ligne

#24 17-06-2020 08:19:06

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Salut les copain (mais pas tous), j'assume

Denis a écrit

<< J'ai été assez malade depuis mercredi, mais vraiment pas bien (j'ai fais le test du Covid mais il n'est pas là ). Ca va mieux maintenant. >>

Petite parenthèse, si c'était peu "glaireux", vérifie peut-être si tu n'as pas fait un AVC. Ça laisse des protéïnes spécifiques dans les urines pour le "ischémique", et le "hémorragique" donne de l'hyper-tension.

Hors ligne

Pied de page des forums