Bonsoir à tous, J'ai écris un interpréteur brainfuck en C++ dans le but de m'entraîner et de pratiquer. Seulement j'ai un gros gros problème d'optimisation: mon interpréteur ne fait marcher que le "hello word" :/. Je pense que cela vient notamment de mes deux boucles for, mais je ne vois pas comment supprimer une des boucles. Je vous demande donc vos yeux avisés en C++ pour m'aiguiller et me conseiller sur ce code:
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* **************************** */ /* interpreteur brainfuck C++ */ /* */ /* main.cpp */ /* */ /* ******************************/ #include <iostream> #include <algorithm> #include <stack> const std::string instructions = {"<>-+[]-.,;"}; using namespace std; int main() { string c; char input; cout << "interpreteur brainFuck" << endl; cout << "----------------------" << endl; cout << "----------------------" << endl; cout << "instruction: >"; //on verifie que l'instruction est valable do { cin >> input; //si l'instruction n'existe pas on quitte le programme(pour le moment :p) auto it = find(instructions.cbegin(),instructions.cend(), input); if(it == instructions.cend()){ cout << "probleme de compilation" << endl; break; } //on ajoute l'instruction a la ligne du programme c+=input; }while(!(input == ';'));// ';' est l'instruction de fin vector<char> memory;//tableau des octets du programme vector<char> ::iterator memoryPtr = memory.begin(); vector<int> brackets(c.length()); stack<char, vector<char>> bracketStack; memory.push_back(0); memoryPtr = memory.begin(); for(int i(0); i < c.length(); i++) { if(c[i] == '[') {//si on rencontre un crochet on l'ajoute au stack de crochets existants bracketStack.push(i); } if(c[i] == ']') { if(bracketStack.empty())//si on rencontre un ] alors que le stack est vide, il y a une erreur de syntaxe { cerr << "probleme de ] à la position " << i << endl; return 404; }else { int pos = bracketStack.top(); bracketStack.pop();//on retire la [ du dessus brackets[i] = pos; brackets[pos] = i; } } } if(!bracketStack.empty()) { cerr << "[ non fermé a la position " << bracketStack.size() << endl; return 404; } for(int i(0); i < c.length(); i++) { switch (c[i]) { case '<': if(memoryPtr != memory.begin()) memoryPtr--; break; case '>': if(memoryPtr == memory.end() - 1) { memory.push_back(0); memoryPtr = memory.end() - 1; }else{ memoryPtr++; } break; case '+': (*memoryPtr) ++; break; case '-': (*memoryPtr) --; break; case '.': putchar(*memoryPtr); break; case ',': *memoryPtr = cin.get(); break; case '[': if(!(*memoryPtr)) i = brackets[i]; break; case ']': if(*memoryPtr) i = brackets[i]; break; } } //on quitte le programme cout << "-----logs de sortie----" << endl; cout << c<< endl; cout << "fin du programme"; //fin } |
voila mon code que j'ai essayé de rendre le plus propre possible avec les règles d'indentation et de const-correctness au mieux. Merci de vos conseils et vos critiques
+0
-0