Ir ao conteúdo
  • Cadastre-se

C Problema de execução do programa em C


Posts recomendados

É o código de desbloqueio de Android. Este código abaixo está funcionando bem.

 

void cadastrarPadrao(){
    FILE *arq;
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))){
        fclose(arq);
        arq = fopen("padrao_desbloqueio.txt", "w");
        fclose(arq);
        cadastrarPadrao();
    }
    else{
        fseek(arq, 0, SEEK_END);
        if(ftell(arq) != 0) printf("\nO padrão já foi cadastrado!\n");
        else{
            fclose(arq);
            arq = fopen("padrao_desbloqueio.txt", "w");
            int m[9][9];
            int padraoDesbloqueio[41];
            int i, j, k = 0;
            bool valido = true;
            char afirm;
            bool visitados[9];
            for(i = 0; i < 9; i++) for(j = 0; j < 9; j++){
                if(i == 0 && j == 2) m[i][j] = 0;
                else if(i == 2 && j == 0) m[i][j] = 0;
                else if(i == 6 && j == 8) m[i][j] = 0;
                else if(i == 8 && j == 6) m[i][j] = 0;
                else if(i - j == 6) m[i][j] = 0;
                else if(-i + j == 6) m[i][j] = 0;
                else if(i + j == 8) m[i][j] = 0;
                else if(i == j) m[i][j] = 0;
                else m[i][j] = 1;
            }
            for(i = 0; i < 9; i++) visitados[i] = false;
            for(i = 0; i < 41; i++) padraoDesbloqueio[i] = -2;
            do{
                do{
                    printf("\nPonto %d do padrão: ", k);
                    scanf("%d", &padraoDesbloqueio[k]);
                }while(padraoDesbloqueio[k] < 0 || padraoDesbloqueio[k] > 8);
                if(visitados[padraoDesbloqueio[k]]){
                    valido = false;
                    break;
                }
                visitados[padraoDesbloqueio[k]] = true;
                if(k == 0) afirm = 'S';
                else if(m[padraoDesbloqueio[k]][padraoDesbloqueio[k - 1]] == 0){
                    valido = false;
                    break;
                }
                else{
                    if(k == 8) break;
                    do{
                        printf("\nDeseja adicionar outro ponto (S/s/N/n)? ");
                        fflush(stdin);
                        scanf("%c", &afirm);
                    }while(!(afirm == 'S' || afirm == 's' || afirm == 'N' || afirm == 'n'));
                }
                if(afirm == 'S' || afirm == 's') k++;
            }while(afirm == 'S' || afirm == 's');
            if(valido){
                for(i = 0; i < 41; i++){
                    if(padraoDesbloqueio[i] >= 0 && padraoDesbloqueio[i] <= 8){
                        fprintf(arq, "%d\t", padraoDesbloqueio[i]);
                    }
                }
                printf("\nPadrão cadastrado com sucesso!\n");
            }
            else printf("\nPadrão inválido!\n");
            fclose(arq);
        }
    }
}

 

Neste código abaixo, quando digito o um valor diferente do primeiro valor do arquivo, o programa informa padrão incorreto, que é pra informar. Mas quando no ponto 0 do padrão digito o primeiro valor do arquivo e no ponto 1 digito o segundo valor do arquivo, o programa dá padrão incorreto, que não é pra dar, sim é para ir para o ponto 2.

 

void testarPadrao(){
    FILE *arq;
    bool correto = true;
    long pos = 0;
    int ponto, k = 0;
    int padraoDesbloqueio[41];
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))) printf("\nErro ao tentar abrir arquivo!\n");
    else{
        fseek(arq, 0, SEEK_END);
        if(ftell(arq) == 0) printf("\nO padrão ainda não foi cadastrado!\n");
        else{
            long tam = ftell(arq);
            do{
                printf("\nPonto %d do padrão: ", k);
                scanf("%d", &padraoDesbloqueio[k]);
                fseek(arq, pos, SEEK_SET);
                fscanf(arq, "%d", &ponto);
                if(ponto != padraoDesbloqueio[k]){
                    correto = false;
                    break;
                }
                k++;
                pos = k * (sizeof(int) + sizeof('\t'));
            }while(pos <= tam);
            if(correto) printf("\nPadrão correto!\n");
            else printf("\nPadrão incorreto!\n");
        }
    }
}

 

Link para o comentário
Compartilhar em outros sites

Veja se funciona:

void testarPadrao(){
    FILE *arq;
    bool correto = true;
    int ponto, i = 0, k = 0;
    int padraoDesbloqueio[41];
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))) printf("\nErro ao tentar abrir arquivo!\n");
    else{
        //fseek(arq, 0, SEEK_END);
        //long tam = ftell(arq);
        while(fscanf(arq, "%d", &ponto) == 1) {
            printf("\nPonto %d do padrão: ", k);
            scanf("%d", &padraoDesbloqueio[k]);
            //fseek(arq, i, SEEK_SET);
            //fscanf(arq, "%d", &ponto);
            printf("\n");
            if(ponto != padraoDesbloqueio[k]){
                correto = false;
                break;
            }
            //i = i + k * (sizeof(int) + sizeof('\t'));
            k++;
        }
        if(correto) printf("\nPadrão correto!\n");
        else printf("\nPadrão incorreto!\n");
    }
}

 

Link para o comentário
Compartilhar em outros sites

Como antes o problema é o mesmo:

pos = k * (sizeof(int) + sizeof('\t'));

 

sizeof(int) é igual a 4 bytes, mas você não guardou como int no arquivo, mas sim usou fprintf para converter o número inteiro em uma string de caracteres e escrever a string no arquivo de texto.

                    if(padraoDesbloqueio[i] >= 0 && padraoDesbloqueio[i] <= 8){
                        fprintf(arq, "%d\t", padraoDesbloqueio[i]);
                    }

 

Mas como os valores salvos só vão de 0 a 8 então a string sempre terá apenas 1 caractere.

 

Logo, seguindo sua lógica o correto seria:

pos = k * (sizeof(char) + sizeof('\t'));

 

Mas char tem apenas 1 byte, e '\t' também é 1 único caractere logo também ocupa 1 byte, então:

pos = k * (sizeof(char) + sizeof('\t'));
//é igual a:
pos = k * (sizeof(char) + sizeof(char));
//que é igual a:
pos = k * (1 + 1);

//E finalmente obtemos:
pos = k * 2;

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!