Confuso erro "std :: out_of_range"

votos
-1

Eu tenho a depuração este erro durante as últimas 2 horas, e sabendo eu não vou ser capaz de dormir se eu não pedir ajuda antes de eu ir para a cama. Eu estou escrevendo um carregador de modelo para o meu jogo, e apenas por agora eu estou usando um método muito frágil para dividir strings. No entanto, ele funciona em linhas quase idênticas, então não aleatoriamente. Estou usando String.substr (), e eu acredito que o erro significa que a sua tentativa de começar em um local que não existe na cadeia. A pilha de chamadas diz que seu acontecendo nesta linha:

v1 = v1.substr(s.find(,)+1);

e usando um ponto de interrupção que imprime uma mensagem, ela diz

Vertex 1 está usando 1,1 e toda a cadeia é 173,1,1 175,1,1 174,1,1

onde Vertex 1 é o valor de v1, e a corda é o valor de s.

Esta é toda a função:

FaceData data;
s = s.substr(5); //remove FACE 
string v1, v2, v3;

//vertex 1
v1 = s.substr(0, s.find( ));

data.vertexIndexes[0] = atoi(v1.substr(0, s.find(,)).c_str());
v1 = v1.substr(s.find(,)+1);
data.textureIndexes[0] = atoi(v1.substr(0, s.find(,)).c_str());
v1 = v1.substr(s.find(,)+1);
data.normalIndexes[0] = atoi(v1.c_str());

//vertex 2
s = s.substr(s.find( )+1);
v2 = s.substr(0, s.find( ));

data.vertexIndexes[1] = atoi(v2.substr(0, s.find(,)).c_str());
v2 = v2.substr(s.find(,)+1);
data.textureIndexes[1] = atoi(v2.substr(0, s.find(,)).c_str());
v2 = v2.substr(s.find(,)+1);
data.normalIndexes[1] = atoi(v2.c_str());

//vertex 3
s = s.substr(s.find( )+1);
v3 = s;

data.vertexIndexes[2] = atoi(v3.substr(0, s.find(,)).c_str());
v3 = v3.substr(s.find(,)+1);
data.textureIndexes[2] = atoi(v3.substr(0, s.find(,)).c_str());
v3 = v3.substr(s.find(,)+1);
data.normalIndexes[2] = atoi(v3.c_str());

return data;

o std :: string 's' que está sendo passado para a função sempre se parece com isso: face X, X, XX, X, XX, X, X, onde x é um número.

Esta é a única maneira que eu poderia encontrar para dividir uma string ...

Agora, eu não entendo por que ele está recebendo este erro aqui ... Parece que está quase acontecendo só aleatoriamente. Eu não consigo entender por que ele não irá trabalhar com

173,1,1 175,1,1 174,1,1

mas ele vai trabalhar com

175,2,2 176,2,2 175,2,2

Publicado 18/12/2011 em 03:02
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

Eu não tenho certeza que estou interpretando sua pergunta, mas dada a informação fornecida, este parece ser o que você está fazendo:

#include <string>
#include <iostream>

int main() {
    std::string v1 = "1,1";
    std::string s = "173,1,1 175,1,1 174,1,1";

    try {
        v1 = v1.substr(s.find(",")+1);
    }
    catch (const std::out_of_range& e) {
        std::cout << "out_of_range: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}

Nesse caso, s.find(",")vai retornar 3(o primeiro ,no sestá na posição 3), no entanto uma vez que v1tem apenas três caracteres apenas os índices são válidas entre [0,2]. Passando 3, ou com o +1 4seria fora do intervalo para v1.

Respondeu 18/12/2011 em 05:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more