Erro no tamanho do array e na chamada(é o que aparenta..)

4 respostas
V

Galera, antes de mostrar a minha duvida vou explicar o que estou fazendo.
É um trabalho da faculdade, estou fazendo um pipeline aritmético… o erro está acontecendo na parte da conversão de um número decimal ponto flutuante para um binário ponto flutuante, mas não na conversão(já até simulei ela várias vezes) mas sim no array, acredito eu(pela própria indicação do erro) e também na chamada, que acho que não estou conseguindo fazer direito…

Enfim, aí vai o trecho do código, ele se encontra na classe Binario

public int[] converte(double numero){

// Transformando o numero decimal ponto flutuente em binário
    // ponto flutuante

        // Nesta primeira parte, fazemos a divisão do número decimal
        // até que ele seja maior 0.5 e menor que 1
    double number = 0;
    int exp;
    for(exp = 0 ; (numero > 1) || (numero <= 0.5) ; exp++){
        number = numero/2;
        numero = numero/2;
    }

        //  nesta outra parte, transformamos realmente o número em binário
    double aux = 0;
    int numero_binario[] = new int[24];
    if(number >= 0)     numero_binario[0] = 0;
    else               numero_binario[0] = 1;
    for(int i = 1; number != 1 ; i++){
        numero_binario[i] = (int)number*2;
        if(number*2 == 1.0)     break;
        if( (int)number*2 == 1){
            aux = (number*2) - ((int)number*2);
            number = aux;
        }
        else     number = number*2;
    }

    // Transformando o expoente em binário para armazenar na mantissa
    int expoente_binario[] = new int[8];
    if(exp == 1)     expoente_binario[7] = 1;
    else{
        for(int a = 0 ; exp >= 2 ; a++){
            expoente_binario[a] = exp % 2;
            exp = (int)exp/2;
            if(exp < 2){
                a++;
                expoente_binario[a] = 1;
            }
        }
       }

    // Concatenando agora os dois arrays em um outro array, que será a mantissa
    int binario[] = new int[32];
    int k = 0;
    for(k = 0 ; numero_binario[k] != '\0' ; k++)
        binario[k] = numero_binario[k];
    while(k < 24){
        binario[k] = 0;
        k++;
    }
    for(int j = 0 ; expoente_binario[j] != '\0' ; j++, k++)
        binario[k] = expoente_binario[j];

    return binario;

}

/********************************/
Trecho da classe main que chama o método:
Binario bin = new Binario();

double teste = 4.5;

int esse[] =  new int[32];

esse = bin.converte(teste);

for(int i = 0 ; i < esse.length ; i++)

System.out.print(esse[i]);

// Fiz essa parte assim só para testar o método mesmo, que por sinal ta apontando dois erros, aí vão eles:

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 24

at pipelinearitmetico.Binario.converte(Binario.java:131)

at pipelinearitmetico.Main.main(Main.java:64)

Java Result: 1

OBS: sei que requer um pouco de paciência para simular cada etapa do código, mas espero que possam me ajudar!
Acredito não haver nenhum erro nos algoritmos de conversão, como mencionei anteriormente, já os simulei várias vezes.

Agradeço desde já

4 Respostas

V

ninguém? : /

ugleiton

vc esta tentando acessar um indice que exede o tamanho da array…

OBS: veja como postar seus códigos no forum

V

isso eu percebi…mas já simulei esse código 3 vezes e n acho esse erro !

ugleiton

Uma coisa importante a fazer é interpretar seu erro

quando o compilador mostra:

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 24

at pipelinearitmetico.Binario.converte(Binario.java:131)

at pipelinearitmetico.Main.main(Main.java:64)

Java Result: 1

ele está dizendo que existe um erro na classe Binario na linha 131, onde vc está tentando acessar o indice 24 que exede o limite da array… (sua array vai de 0 a 23).

o erro é de logica no trecho

for (int i = 1; number != 1; i++) {

a condição de parada desse for nao está vinculada ao array, e isso é arriscado,
pois ninguem sabe quando esse laço pode parar, sendo que o limite de loops é o tamanho da array numero_binario;

o laço teria que ser assim:

for (int i = 1; i < numero_binario.length; i++) {

agora essa condição de number != 1 poderia ser colocado na condição do break

assim:

if (number * 2 == 1.0 || number == 1) { break; }

espero que resolva seu problema

Criado 14 de abril de 2011
Ultima resposta 16 de abr. de 2011
Respostas 4
Participantes 2