Partage
  • Partager sur Facebook
  • Partager sur Twitter

[erreur] vector subscript out of range

Sujet résolu
    16 septembre 2017 à 20:28:18

    Bonjour :)

    Pour la création d'un programme, je dois créer une "petite" machine virtuelle en C++, lors de la conception des bases de celle-ci sous Visual Studio, aucunes erreurs ne m'est indiqué, lors du buid, tout fonctionne nickel, du moins, c'est ce que je pensais... En effet, lors des premiers tests, mon programme s'ouvre, mais affiche une boite de dialog générée par le "header vector" si mes recherches sont bonne. Au début j'ai cru que s'était un simple débordement de mémoire, ou un truc du genre.

    Voici la boite de dialog :

    Je ne vais pas vous partager tous mes codes, se serait de trop, voici juste le fichier qui génère l'erreur lorsque je debug en "pas à pas détaillé" :

    #include "stack-VM.h"
    
    /*
    * Instruction format
    * header: 2 bits
    * data: 30 bits
    *
    * header format:
    * 0 => positive integer
    * 1 => primitive instruction
    * 2 => negative integer
    * 3 => undefined
    * */
    
    // functions
    StackVM::StackVM() {
    	memory.reserve(1000000);
    }
    i32 StackVM::getType(i32 instruction) {
    	i32 type = 0xc0000000;
    	type = (type & instruction) >> 30;
    	return type;
    }
    i32 StackVM::getData(i32 instruction) {
    	i32 data = 0x3fffffff;
    	data = data & instruction;
    	return data;
    }
    void StackVM::fetch() {
    	pc++;
    }
    void StackVM::decode() {
    	typ = getType(memory[pc]);
    	dat = getData(memory[pc]);
    }
    void StackVM::execute() {
    	if (typ == 0 || typ == 2) {
    		sp++;
    		memory[sp] = dat;
    	}
    	else {
    		doPrimitive();
    	}
    }
    void StackVM::doPrimitive() {
    	switch (dat) {
    	case 0: // halt
    		std::cout << "halt" << std::endl;
    		running = 0;
    		break;
    	case 1: // add
    		std::cout << "add " << memory[sp - 1] << " " << memory[sp] << std::endl;
    		memory[sp - 1] = memory[sp - 1] + memory[sp];
    		sp--;
    		break;
    	}
    }
    void StackVM::run() {
    	pc -= 1;
    	while (running == 1) {
    		fetch();
    		decode();
    		execute();
    		std::cout << "tos: " << memory[sp] << std::endl;
    	}
    }
    void StackVM::loadProgram(std::vector<i32> prog) {
    	for (i32 i = 0; i < prog.size(); i++) {
    		memory[pc + i] = prog[i];
    	}
    }

    (désoler, c'est quand même un peu long, et pas toujours facile à lire, je sais :) mais j'ai mis tout le contenu du fichier parceque je ne sais pas quel partie bug)

    Voici la hyerarcie des fichies :

    • stack-VM.h
    • main.cpp
    • stack-vm.cpp

    Ayant deux fichiers sources (.cpp), je me dis que c'est peut être une cause d'erreur...

    Voilà, si vous avez besoin d'autre informations, dite le moi :)

    Merci d'avoir lu :)

    • Partager sur Facebook
    • Partager sur Twitter
    Le doute est le commencement de la sagesse
      16 septembre 2017 à 20:54:38

      C'est que le programme essaie probablement d'accéder à un élément situé au delà du dernier contenu dans le vecteur.

      On ne voit pas la manière avec laquelle tu ajoutes des éléments dans le vecteur, typiquement pushback().

      -
      Edité par zoup 16 septembre 2017 à 20:57:17

      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2017 à 23:20:53

        Bonjour, voici alors la façon avec laquelle j'ajoute les éléments dans le vecteur :

        #ifndef STACK_VM_H
        #define STACK_VM_H
        
        #include <iostream>
        #include <vector>
        
        // type definitions
        typedef int32_t i32;
        
        class StackVM {
        	i32 pc = 100; // program counter
        	i32 sp = 0; // stack pointer
        	std::vector<i32> memory;
        	i32 typ = 0;
        	i32 dat = 0;
        	i32 running = 1;
        
        	// private function
        	i32 getType(i32 instruction);
        	i32 getData(i32 instruction);
        	void fetch();
        	void decode();
        	void execute();
        	void doPrimitive();
        
        public:
        	// public functions
        	StackVM();
        	void run();
        	void loadProgram(std::vector<i32> prog);
        };
        
        #endif


        Normalement, le programme vas chercher là où il doit dans le vecteur, et ne dépasse pas la pile d'appel... Enfin, je pense xD (je suis un peu fatiguer ^^)

        C'est ça que je ne comprend pas trop... parce que les codes que j'ai présenté, son "juste", évidemment il y a toujours moyen d'optimiser, mais je ne comprend pas d'où vient l'erreur...

        • Partager sur Facebook
        • Partager sur Twitter
        Le doute est le commencement de la sagesse
          16 septembre 2017 à 23:38:49

          Geralt de Riv a écrit:

          voici alors la façon avec laquelle j'ajoute les éléments dans le vecteur


          Je ne vois que la déclaration du vecteur, pas l'ajout d'éléments
          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2017 à 23:54:07

            std::vector<i32> memory;

            Déclaration du vecteur 'memory'

            memory.reserve(1000000);

            Capacité vectorielle du vecteur 'memory'

            memory[sp] = dat;
            memory[sp - 1] = memory[sp - 1] + memory[sp];
            memory[pc + i] = prog[i];

            Je n'ajoute pas d'éléments, avec pushback(), j'utilise les operators. Mais c'est vrai qu'après réflexion, je ne peux pas les utilisé, puisque aucuns éléments ne se trouve dans le vecteur...

            Je suis désoler si le problème parait tout bête, et ne pensez pas que je veuille que l'on face le travaille à ma place, et je sais aussi que dire que je suis plus ou moins débutant n'est pas une "excuse".

            Mais pourriez-vous m'expliquer alors comment je dois faire pour ajouter les éléments ?

            • Partager sur Facebook
            • Partager sur Twitter
            Le doute est le commencement de la sagesse
              17 septembre 2017 à 0:12:56

              Geralt de Riv a écrit:

              Mais pourriez-vous m'expliquer alors comment je dois faire pour ajouter les éléments ?


              memory.push_back(valeur à ajouter)

              Attention, la fonction reserve(100000) ne crée par un vecteur de 100000 éléments. Elle ne fait que s'assurer que le vecteur pourra accueillir 100000 éléments sans être relocalisé.

              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2017 à 1:11:42

                Si ton besoin est d'avoir 1000000 d'éléments à utiliser à ta guise, il suffit de faire memory.resize(1000000) plutôt que memory.reserve(1000000) ensuite tu pourras utiliser les memory[pc] tant que pc<1000000.
                • Partager sur Facebook
                • Partager sur Twitter

                En recherche d'emploi.

                  17 septembre 2017 à 18:23:06

                  Merci infiniment ! .resize était la solution, merci beaucoup Dalfab 

                  Et merci aussi à toi, zoup pour ton aide ;)

                  Aaaa, ca fait du bien de pouvoir continuer sans erreur un gros projet xD

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Le doute est le commencement de la sagesse

                  [erreur] vector subscript out of range

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown