Compiler, Exécuter et Obtenir le résultat d'un Code

Programmation d'applications complexes
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Shadow »

Bonsoir,

Je vous propose ce Code pour vous montrer comment Compiler et Exécuter
Facilement un Code puis obtenir le résultat.

Je suis ouvert à toutes amélioration du code, ajout, idée, critique constructive, etc:

Édit: Ajouté: Procédure et exemple CheckCode (Vérifié juste un code, pas de Compilation ni de Résultat).
Édit: Correction d'une erreur qui faussait les informations sur la position de retour des erreurs de lignes.
Édit: Corrections diverses, Ajout de plus de Code dans Code.s

Code : Tout sélectionner

; Créé par Monsieur Dieppedalle David le 13/03/2017.
; Compiler et Exécuter un code puis obtenir le résultat.

; Procédure pour Compiler et Exécuter un code.
Procedure.b CompileAndExecuteCode(CodePourCompilation.s)
  
  Define Compilateur.i = 0
  Define Sortie.s = "", Erreur.s = ""
  Define AncientCurrentDirectory.s = ""
  
  ; Il y a t-il du code ?:
  If CodePourCompilation.s <> ""
    
    ; Créer un répertoire nommé "Compilation".
    CreateDirectory(GetCurrentDirectory() + "Compilation")
    
    ; Sauvegarde le chemin actuel de l'application (Où est situé ce code).
    AncientCurrentDirectory.s = GetCurrentDirectory()
    
    ; Change le chemin de l'application en allant dans le dossier "Compilation" s'il existe.
    SetCurrentDirectory(GetCurrentDirectory() + "Compilation")
    
    ; Peut-on créer le Fichier "CodeSource.pb" ?:
    If CreateFile(1, "CodeSource.pb")
      
      ; On écrit le code dans le Fichier "CodeSource.pb".
      WriteStringN(1, "DisableDebugger", #PB_Ascii) ; On désactive le debugeur pour pouvoir intercepter les messages d'erreurs.
      WriteStringN(1, "", #PB_Ascii)
      
      ; Ecrit dans le fichier une chaîne vide.
      WriteStringN(1, ~"CreateFile(0, \"ErreurExecution_CodeSource.txt\")", #PB_Ascii)
      WriteStringN(1, ~"WriteString(0, \"Pas d'erreur.\")", #PB_Ascii)
      WriteStringN(1, "CloseFile(0)", #PB_Ascii)
      
      WriteStringN(1, "", #PB_Ascii)
      
      WriteStringN(1, "Procedure CompileError()", #PB_Ascii) ; Procédure qui s'exécutera si une erreur intervient dans le code.
      
      ; Ecrit dans le fichier l'erreur survenue et fermer celui-ci.
      WriteStringN(1, ~"  CreateFile(0, \"ErreurExecution_CodeSource.txt\")", #PB_Ascii)
      WriteStringN(1, ~"  WriteString(0, \"Erreur: Ligne \" + Str(ErrorLine() - 14) + \" - \" + ErrorMessage() + \".\")", #PB_Ascii)
      WriteStringN(1, "  CloseFile(0)", #PB_Ascii)
      
      WriteStringN(1, "EndProcedure", #PB_Ascii)
      WriteStringN(1, "", #PB_Ascii)
      
      WriteStringN(1, "OnErrorCall(@CompileError())", #PB_Ascii) ; Activation de la gestion des erreurs, Si une erreur intervient dans le code, la procédure CompileError() sera appelée.
      WriteStringN(1, "", #PB_Ascii)
      
      WriteString(1, CodePourCompilation.s, #PB_Ascii) ; Ecrit le code.
      
      CloseFile(1) ; Ferme le fichier.
      
      ; Lance le compilateur avec comme premier argument l'enplacement du compilateur PB.
      ; Le segond est le nom du fichier + un Flag qui active la gestion des erreurs pour OnError.
      ; Le troixième est l'emplacement de travail (A quel endroit se situe le fichier "CodeSource.pb").
      ; Le dernier:
      ; #PB_Program_Open = Ouvre des canaux de communication entre le programme lancé et le programme PureBasic.
      ; #PB_Program_Read = Lecture possible sur la sortie standard (stdout).
      ; #PB_Program_Write = Ecriture possible sur l'entrée standard (stdin).
      ; #PB_Program_Error = Lecture possible sur la sortie d'erreur (stderr).
      ; #PB_Program_Hide = Lance le programme en mode invisible (Ici le compilateur).
      
      ; Renvoie une valeur non nulle si le programme a été lancé avec succès, zéro sinon. 
      Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "CodeSource.pb /LINENUMBERING", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error | #PB_Program_Hide)
      
    Else
      MessageRequester("Erreur lors de la création du fichier du code...", "   Une erreur est survenue, Impossible d'écrire le code source !", 16)
      ProcedureReturn 0 ; Retourne 0 pour dire que l'opération c'est mal passée.
      
    EndIf
    
    ; Le Compilateur a t-il été lancé ?:
    If Compilateur
      
      ; Boucle tant que le Programme tourne (Ici le compilateur).
      While ProgramRunning(Compilateur)
        
        ; S'il y a des Données à lire.
        If AvailableProgramOutput(Compilateur)
          
          ; Lit le texte provenant de la sortie standard (stdout) du programme (Ici le compilateur).
          Sortie.s = ReadProgramString(Compilateur)
          
          ; Si on trouve "Line", c'est qu'il y a une erreur.
          If FindString(Sortie.s, "Line")
            
            Erreur.s = Sortie.s
            
            ; Traduction des messages d'erreurs en Français (Liste non Exhaustive):
            Erreur.s = ReplaceString(Erreur.s, "Error: Line", "Erreur: Ligne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "is Not a valid operator", "n'est pas un opérateur valide", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Not a valid Decimal number", "Ceci n'est pas un nombre décimal valide", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Syntax error", "Erreur de syntaxe", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Bad parameter type: a string is expected", "Type de paramètre incorrect: une chaîne est attendue", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Bad parameter type, number expected instead of string", "Type de paramètre incorrect: un nombre est attendu au lieu d'une chaîne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, ~"Literal string Not terminated (\"missing\")", "Une chaîne n'est pas terminée: il manque un guillemet", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "A Variable can't be named the same as a keyword", "Une Variable ne peut pas être nommée comme un mot-clé", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Comparisons (=, <, >, =< And >=) are only supported With keywords like If, While, Until Or within Bool", "Les comparaisons (=, <,>, = <And> =) ne sont prises en charge qu'avec des mots clés comme: If, While, Until ou Bool", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Division by 0 forbidden", "Division par 0 interdite", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Numerical overflow: too many digits", "Débordement numérique: trop de chiffres", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "is Not a function, Array, List, Map Or Macro", "Cette expression est inconnue, ce n'est ni: Une Fonction, Un Tableau, Une Liste, Une Map ou une Macro", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Can't mix strings with numerical values.", "Impossible de mélanger des chaînes avec des valeurs numériques.", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Structure Not found", "Structure introuvable", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "The Array dimensions value needs To be between 1 And 255 For", "Nombre de dimensions du Tableau non valide, Le nombre de dimensions du tableau doit être compris entre 1 et 255 pour", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Garbage at the End of the line", "Erreur à la fin de la ligne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "A string expression is expected ('number' Not allowed)", "Une chaîne est attendue, Nombre non autorisé.", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Constant Not found", "Constante non trouvé", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "With 'EnableExplicit', variables have To be declared", "Variable non déclarée", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Array type is different than earlier", "L'Extension d'une Variable de Type Tableau n'est pas la même que lors de sa déclaration", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Variable already declared With another type", "Cette Variable est déjà déclarée avec une Extension différente", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Negative values are Not allowed", "Les valeurs négatives ne sont pas autorisées", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "A field in a 'Structure' needs an explicit declared type", "Un champ dans une 'Structure' a besoin d'un type explicitement déclaré.", #PB_String_NoCase)

            ; Extraction du numéro de la ligne ou se situe l'érreur.
            If FindString(Erreur.s, "Erreur: Ligne")
              LigneErreur.i = Val(Mid(Erreur.s, 15, FindString(Erreur.s, "-") - FindString(Erreur.s, "Erreur: Ligne")))
            EndIf
            
            ; Remplacement du numéro de la ligne d'érreur du Code Source "CodeSource.pb" par le numéro de la ligne d'érreur du Code "Code.s"
            ; car le fichier contient d'autres lignes de Code que le "Code.s", ne prends en compte que le Code "Code.s".
            Erreur.s = ReplaceString(Erreur.s, "Erreur: Ligne " + Str(LigneErreur.i), "Erreur: Ligne " + Str(LigneErreur.i - 14))
            
            ; Création d'un fichier ou serra inscrit le méssage d'érreur de la Compilation.
            If CreateFile(1, "ErreurCompilation_CodeSource.txt")
              WriteString(1, Erreur.s, #PB_Ascii)
              CloseFile(1)
            EndIf
            
            ; Restaure le chemin de l'application.
            SetCurrentDirectory(AncientCurrentDirectory.s)
            
            ; Retourne 0 pour dire que la Compilation s'est mal passée.
            ProcedureReturn 0
            
          Else
            
            If CreateFile(1, "ErreurCompilation_CodeSource.txt")
              WriteString(1, "Pas d'erreur.", #PB_Ascii)
              CloseFile(1)
            EndIf
            
          EndIf
          
        EndIf ; Plus de donnée à lire.
        
      Wend ; Le Programme a terminé (Ici le compilateur).
      
      ; Renvoie le code de retour du programme (0 = Ok, 1 = Erreur) quand il c'est terminé (Ici le compilateur).
      ExitCode = ProgramExitCode(Compilateur)
      
      ; Ferme la connection vers le programme (Ici le compilateur).
      CloseProgram(Compilateur)
      
      ; La Compilation s'est-elle bien passée ?:
      If Bool(Not ExitCode) ; Not, inversion de valeur, 0 = 1 et 1 = 0. 0 = pas d'erreur, 1 = erreurs.
        
        ; Restaure le chemin de l'application.
        SetCurrentDirectory(AncientCurrentDirectory.s)
        
        ; Attends un peu pour laisser le temps à la Procedure CompileError() d'écrire le résultat dans
        ; le fichier si une erreur survient l'or de l'exécution du Code source "CodeSource.pb".
        Delay(50)
        
        ProcedureReturn 1 ; Retourne 1 pour dire que l'opération s'est bien passée.
        
      Else
        
        ; Restaure le chemin de l'application.
        SetCurrentDirectory(AncientCurrentDirectory.s)
        
        ProcedureReturn 0 ; Retourne 0 pour dire que l'opération s'est mal passée.
        
      EndIf
      
    Else
      
      ; Restaure le chemin de l'application.
      SetCurrentDirectory(AncientCurrentDirectory.s)
      
      MessageRequester("Erreur lors de la compilation du code...", "   Une erreur est survenue, Impossible de lancer le compilateur !", 16)
      ProcedureReturn 0 ; Retourne 0 pour dire que l'opération s'est mal passée.
      
    EndIf
    
  EndIf
  
EndProcedure

; Procédure pour Verifier un code.
Procedure.b CheckCode(CodePourCompilation.s)
  
  Define Compilateur.i = 0
  Define Sortie.s = "", Erreur.s = ""
  
  ; Il y a t-il du code ?:
  If CodePourCompilation.s <> ""
    
    ; Créer un répertoire nommé "Compilation".
    CreateDirectory(GetCurrentDirectory() + "Compilation")
    
    ; Sauvegarde le chemin actuel de l'application (Où est situé ce code).
    AncientCurrentDirectory.s = GetCurrentDirectory()
    
    ; Change le chemin de l'application en allant dans le dossier "Compilation" s'il existe.
    SetCurrentDirectory(GetCurrentDirectory() + "Compilation")
    
    ; Peut-on créer le Fichier "CodeSource.pb" ?:
    If CreateFile(1, "CodeSource.pb")
      WriteString(1, CodePourCompilation.s) ; Ecrit le code.
      
      CloseFile(1) ; Ferme le fichier.
      
      ; Lance le compilateur avec comme premier argument l'enplacement du compilateur PB.
      ; Le segond est le nom du fichier + un Flag qui active la gestion des erreurs pour OnError.
      ; Le troixième est l'emplacement de travail (A quel endroit se situe le fichier "CodeSource.pb").
      ; Le dernier:
      ; #PB_Program_Open = Ouvre des canaux de communication entre le programme lancé et le programme PureBasic.
      ; #PB_Program_Read = Lecture possible sur la sortie standard (stdout).
      ; #PB_Program_Write = Ecriture possible sur l'entrée standard (stdin).
      ; #PB_Program_Error = Lecture possible sur la sortie d'erreur (stderr).
      ; #PB_Program_Hide = Lance le programme en mode invisible (Ici le compilateur).
      
      ; Renvoie une valeur non nulle si le programme a été lancé avec succès, zéro sinon. 
      Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "CodeSource.pb /CHECK", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error | #PB_Program_Hide)
      
    Else
      MessageRequester("Erreur l'or de la création du fichier du code...", "   Une erreur est survenue, Impossible d'écrire le code source !", 16)
      ProcedureReturn 0 ; Retourne 0 pour dire que l'opération c'est mal passée.
      
    EndIf
    
    ; Le Compilateur a t-il été lancé ?:
    If Compilateur
      
      ; Boucle tant que le Programme tourne (Ici le compilateur).
      While ProgramRunning(Compilateur)
        
        ; S'il y a des Données à lire.
        If AvailableProgramOutput(Compilateur)
          
          ; Lit le texte provenant de la sortie standard (stdout) du programme (Ici le compilateur).
          Sortie.s = ReadProgramString(Compilateur)
          
          ; Si on trouve "Line", c'est qu'il y a une erreur.
          If FindString(Sortie.s, "Line")
            
            Erreur.s = Sortie.s
            
            ; Traduction des messages d'erreurs en Français (Liste non Exhaustive):
            Erreur.s = ReplaceString(Erreur.s, "Error: Line", "Erreur: Ligne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "is Not a valid operator", "n'est pas un opérateur valide", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Not a valid Decimal number", "Ceci n'est pas un nombre décimal valide", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Syntax error", "Erreur de syntaxe", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Bad parameter type: a string is expected", "Type de paramètre incorrect: une chaîne est attendue", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Bad parameter type, number expected instead of string", "Type de paramètre incorrect: un nombre est attendu au lieu d'une chaîne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, ~"Literal string Not terminated (\"missing\")", "Une chaîne n'est pas terminée: il manque un guillemet", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "A Variable can't be named the same as a keyword", "Une Variable ne peut pas être nommée comme un mot-clé", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Comparisons (=, <, >, =< And >=) are only supported With keywords like If, While, Until Or within Bool", "Les comparaisons (=, <,>, = <And> =) ne sont prises en charge qu'avec des mots clés comme: If, While, Until ou Bool", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Division by 0 forbidden", "Division par 0 interdite", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Numerical overflow: too many digits", "Débordement numérique: trop de chiffres", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "is Not a function, Array, List, Map Or Macro", "Cette expression est inconnue, ce n'est ni: Une Fonction, Un Tableau, Une Liste, Une Map ou une Macro", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Can't mix strings with numerical values.", "Impossible de mélanger des chaînes avec des valeurs numériques.", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Structure Not found", "Structure introuvable", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "The Array dimensions value needs To be between 1 And 255 For", "Nombre de dimensions du Tableau non valide, Le nombre de dimensions du tableau doit être compris entre 1 et 255 pour", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Garbage at the End of the line", "Erreur à la fin de la ligne", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "A string expression is expected ('number' Not allowed)", "Une chaîne est attendue, Nombre non autorisé.", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Constant Not found", "Constante non trouvé", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "With 'EnableExplicit', variables have To be declared", "Variable non déclarée", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Array type is different than earlier", "L'Extension d'une Variable de Type Tableau n'est pas la même que lors de sa déclaration", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Variable already declared With another type", "Cette Variable est déjà déclarée avec une Extension différente", #PB_String_NoCase)
            Erreur.s = ReplaceString(Erreur.s, "Negative values are Not allowed", "Les valeurs négatives ne sont pas autorisées", #PB_String_NoCase)
            
            ; Création d'un fichier ou serra inscrit le méssage d'érreur de la Compilation.
            If CreateFile(1, "ErreurVerification_CodeSource.txt")
              WriteString(1, Erreur.s)
              CloseFile(1)
            EndIf
            
            ; Restaure le chemin de l'application.
            SetCurrentDirectory(AncientCurrentDirectory.s)
            
            ; Retourne 0 pour dire que la Compilation s'est mal passée.
            ProcedureReturn 0
            
          Else
            
            If CreateFile(1, "ErreurVerification_CodeSource.txt")
              WriteString(1, "Pas d'erreur.")
              CloseFile(1)
            EndIf
            
          EndIf
          
        EndIf ; Plus de donnée à lire.
        
      Wend ; Le Programme a terminé (Ici le compilateur).
      
      ; Renvoie le code de retour du programme (0 = Ok, 1 = Erreur) quand il c'est terminé (Ici le compilateur).
      ExitCode = ProgramExitCode(Compilateur)
      
      ; Ferme la connection vers le programme (Ici le compilateur).
      CloseProgram(Compilateur)
      
      ; La Compilation s'est-elle bien passée ?:
      If Bool(Not ExitCode) ; Not, inversion de valeur, 0 = 1 et 1 = 0. 0 = pas d'erreur, 1 = erreurs.
        
        ; Restaure le chemin de l'application.
        SetCurrentDirectory(AncientCurrentDirectory.s)
        
        ProcedureReturn 1   ; Retourne 1 pour dire que l'opération s'est bien passée.
        
      Else
        
        ; Restaure le chemin de l'application.
        SetCurrentDirectory(AncientCurrentDirectory.s)
        
        ProcedureReturn 0 ; Retourne 0 pour dire que l'opération s'est mal passée.
        
      EndIf
      
    Else
      
      ; Restaure le chemin de l'application.
      SetCurrentDirectory(AncientCurrentDirectory.s)
      
      MessageRequester("Erreur lors de la compilation du code...", "   Une erreur est survenue, Impossible de lancer le compilateur !", 16)
      ProcedureReturn 0 ; Retourne 0 pour dire que l'opération s'est mal passée.
      
    EndIf
    
  EndIf
  
EndProcedure

; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Exemple d'utilisation CompileAndExecuteCode():
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

; Déclaration des Variables.
Define NomFichier_Resultat_CodeSource.s = "", Code.s = "", MessageErreur.s = "", ErreurCode.s = "", Resultat.s = ""

; Le Nom du Fichier ou le Résultat de la Compilation sera écrit.
NomFichier_Resultat_CodeSource.s = "Resultat_CodeSource.txt"

; Code Source, c'est grace à ce Code que le Résultat de la Compilation sera inscrit dans le Fichier "NomFichier_Resultat_CodeSource.s".

; Une Structure.
Code.s + "Structure Yz" + Chr(13) + Chr(10)
Code.s + "  Asd.a" + Chr(13) + Chr(10)
Code.s + "  Dfg.s" + Chr(13) + Chr(10)
Code.s + "  Hjk$" + Chr(13) + Chr(10)
Code.s + "  *Iop" + Chr(13) + Chr(10)
Code.s + "  List Klm.i()" + Chr(13) + Chr(10)
Code.s + "  Array Yui.d(10, 20)" + Chr(13) + Chr(10)
Code.s + "  Map Rty.f(10000)" + Chr(13) + Chr(10)
Code.s + "EndStructure" + Chr(13) + Chr(10)

; Une Ligne vide.
Code.s + Chr(13) + Chr(10)

; Les Variables
Code.s + "Abc.a = 155" + Chr(13) + Chr(10)
Code.s + "Def.d = 123456789.123456789" + Chr(13) + Chr(10)
Code.s + ~"#Ghi = \"Blablabla\"" + Chr(13) + Chr(10)
Code.s + "#Jkl = 147.258" + Chr(13) + Chr(10)
Code.s + "*Mno = 456" + Chr(13) + Chr(10)
Code.s + ~"Pqr$ = \"Blobloblo\"" + Chr(13) + Chr(10)
Code.s + "NewList Stu.w()" + Chr(13) + Chr(10)
Code.s + "Dim Vwx.Yz(1, 2, 3, 4)" + Chr(13) + Chr(10)
Code.s + ~"NewMap Ghi.u(5000)" + Chr(13) + Chr(10)

; Une Ligne vide.
Code.s + Chr(13) + Chr(10)

; Création d'un fichier texte et écriture du résultat dedans.
Code.s + ~"If CreateFile(1, \"" + NomFichier_Resultat_CodeSource.s + ~"\")" + Chr(13) + Chr(10)
Code.s + ~"  WriteString(1, ReplaceString(StrD(Abc.a + Def.d * #Jkl / Vwx.Yz(1, 2, 3, 4)\\Yui.d(10, 20)), \"Infinity\", \"Infinité\", #PB_String_NoCase), #PB_Ascii)" + Chr(13) + Chr(10)
Code.s + "  CloseFile(1)" + Chr(13) + Chr(10)
Code.s + "EndIf"

; Peut-on Compiler le Code ?:
If CompileAndExecuteCode(Code.s)
  
  ; Lecture du message d'erreur survenue lors de l'exécution du Code.
  If ReadFile(0, "Compilation\ErreurExecution_CodeSource.txt") ; Si le fichier peut être lu, on continue...
    
    ; Récupération de la Ligne de Code dans le Fichier.
    ErreurCode.s = ReadString(0, #PB_Ascii)
    
    ; S'il y a un message d'erreur, l'affiche dans une boîte de dialogue.
    If ErreurCode.s <> "Pas d'erreur."
      MessageRequester("Erreur...", "    Erreur lors de l'Exécution du code..." + Chr(13) + "    " + ErreurCode.s, 16) ; Affichage du résultat.
      
    Else
      
      ; Lecture du Résultat du code.
      If ReadFile(1, "Compilation\Resultat_CodeSource.txt") ; Si le fichier peut être lu, on continue...
        
        Resultat.s = ReadString(1, #PB_Ascii)
        
        MessageRequester("Information sur le Code...", "    Compilation et Exécution terminées !" + Chr(13) + "    Résultat: " + Resultat.s, 64) ; Affichage du résultat.
        CloseFile(1)                                                                                                                             ; Ferme le fichier.
        
      EndIf
      
    EndIf
    
    CloseFile(0) ; Ferme le fichier.
    
  EndIf
  
Else ; Impossible de Compiler le Code.
  
  ; Lecture du message d'erreur survenue lors de la Compilation du Code.
  If ReadFile(0, "Compilation\ErreurCompilation_CodeSource.txt") ; Si le fichier peut être lu, on continue...
    
    MessageErreur.s = ReadString(0, #PB_Ascii)
    
    ; Affiche le message dans une boîte de dialogue.
    MessageRequester("Erreur...", "    Erreur lors de la Compilation du Code..." + Chr(13) + "    " + MessageErreur.s, 16) ; Affichage du résultat.
    CloseFile(0)                                                                                                           ; Ferme le fichier.
    
  EndIf
  
EndIf

; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Exemple d'utilisation CheckCode():
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

; Déclaration des Variables.
Define Code.s = ""

Code.s = ~"MessageRequester(\"Information...\", \"    Cette boite ne s'affichera pas !\", 64)"

; Le Code est-il correct ?:
If CheckCode(Code.s)
  MessageRequester("Information sur le Code...", "    Le code a été vérifié, pas d'erreurs.", 64) ; Affichage du résultat.
  
Else ; Le Code comporte des Erreurs.
  
  ; Lecture du message d'erreur survenue lors de la Vérification du Code.
  If ReadFile(0, "Compilation\ErreurVerification_CodeSource.txt") ; Si le fichier peut être lu, on continue...
    
    ; Affiche le message dans une boîte de dialogue.
    MessageRequester("Erreur...", "    Erreur lors de la vérification du Code..." + Chr(13) + "    " + ReadString(0, #PB_Ascii), 16) ; Affichage du résultat.
    CloseFile(0)                                                                                                          ; Ferme le fichier.
    
  EndIf
  
EndIf
Dernière modification par Shadow le mar. 14/mars/2017 18:21, modifié 7 fois.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Compiler Et Exécuter Facilement un Code et Obtenir résul

Message par Micoute »

Très bon programme, merci pour le partage.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par JohnJohnsonSHERMAN »

Mmmm...
Image

Mais mais j'ai rien fait 8O
J'ai juste cliqué sur le bouton Compiler :mrgreen:

Merci pour cette magnifique erreur à stocker dans les annales de l'erreur :lol:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Kwai chang caine »

Non moi ça marche.
Il dit que y'a pas d'erreur 8)
Maintenant j'ai pas essayé avec un de mes codes :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Shadow »

Non le code fonctionne bien, maintenant ya très surement des bug que je dois résoudre.
Alors recommence et dis moi comment ta fais ça champion :mrgreen:
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par TazNormand »

Shadow, tu peux m'expliquer dans quel cas utiliser ton "programme" ? Je veux dire dans quel cas concret je peux être amené à l'utiliser ?
Image
Image
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Shadow »

@TazNormand

En faite j'ai commencer par un éditeur d'expression, ça pourrais servir
à faire un programme de création de programme ou autre.

J'étais bloquer pour envisager de faire une suite (Logiciel de création par exemple)
car les valeurs et expression doivent être vérifier et je savais pas comment faire.

Vérifier qu'une expression est bonne, comme dans
certain logiciel de création de jeu et programme.

S’était dans ce but que j'ai fais ça.
Une fois tout ok, j'envisagerais peut être de faire ça (Logiciel de création par exemple).

Ensuite, bha, j’approfondis mon sujet car ya des lacunes je trouve.

Alors j’essaie de faire des genre de Module (Des bout de code)
plus court et plus propre mais pas facile.

Pour ce code, en faite c'est plus je pense, un exemple
mais tu peut très bien t'en servir par exemple
pour créer un editeur tiers.

Tu met le code de l'éditeur dans la variable
Code.s et zou c'est partie mon kiki !

J'essaie d'apprendre et d’approfondir
pour une futur utilisation.

Dans l'exemple tu as aussi la méthode pour
compiler, exécute puis récupérer la valeur !

Pourquoi me demande tu cela TazNormand ? :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par JohnJohnsonSHERMAN »

J'ai réessayé, j'ai beau sauvegarder le code a différents endroits, j'obtiens toujours la même erreur

Je suis sous Win 10 x64 et PB 5.60 x64 aussi
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Shadow »

Je ne sais pas quoi te dire...
Regarde la ligne 161 par là:

Code : Tout sélectionner

ExitCode = ProgramExitCode(Compilateur)
Fais juste après un:

Code : Tout sélectionner

Debug ExitCode
Je pense que l'erreur viens de là mais pourquoi je ne sais point :(
La compilation se passe bien mais une mauvais valeur est retourné, ici 1 (Ok) au lieu de 0 (Raté).
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par JohnJohnsonSHERMAN »

Résultat :1
Y'a pas de fichier à créer, de chemin à modifier ou un truc dans le genre?
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Compiler, Exécuter et Obtenir le résultat d'un Code

Message par Shadow »

Peut être des droit administrateur je ne sais pas, résultat devrais être 0, pas 1 !
Supprime le dossier Compilation s'il existe ensuite relance et dis moi les fichier créer et leur résultat.

Regarde et vérifie la ligne 66 par là:

Code : Tout sélectionner

Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "CodeSource.pb /LINENUMBERING", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error | #PB_Program_Hide)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre