1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida em C

Discussão em 'Programação' iniciada por MoLt1eS, 3 de Maio de 2012. (Respostas: 7; Visualizações: 999)

  1. MoLt1eS

    MoLt1eS Power Member

    Boas, estou a desenvolver um programa para ler varios numeros de um ficheiro, meter num array e ordenar.

    Acontece que estou com problemas na parte de ler o ficheiro, aparece sempre o erro Segmentation fault.

    Código:
        int nElem,i,temp; 
        FILE *ptfich; 
       
       
        /*validacao do ficheiro*/   
        if((ptfich = fopen(argv[1],"r"))==NULL) 
        fprintf (stderr, "O ficheiro %s não existe\n", argv[1]); 
         
         
        /**********************************************************/ 
     
        /*leitura da dimensao do ficheiro*/ 
         
        while(fscanf (ptfich, "%d", &temp) == 1) 
        nElem++; 
         
        printf(" \nNUMERO ELEM: %d ", nElem); 
        
        /*Criacao dos arrays*/ 
        int* array_a = calloc(sizeof(int),nElem); /*Array a - para usar no Insertion Sort*/ 
        int* array_b = calloc(sizeof(int),nElem); /*Array b - para usar no Merge Sort*/ 
        
    
        /*Preencher os arrays com os valores do ficheiro*/ 
        for (i = 0; i < nElem; i++){ 
        fscanf (ptfich, "%d", &array_a[i]); 
        array_b[i]=array_a[i];
        } 
        
        fclose (ptfich);
    O erro ocorre na parte da leitura da dimensao do ficheiro.
    Qual é o erro que estou a cometer?


    Cumps,
    MoLt1eS
     
  2. Cfreitas

    Cfreitas Power Member

    Eu acho que o que está a acontecer é que se tiveres 23 p.e. ele retorna 2 e não 1 e acaba o teu while.
    Tenta fazer isso com um "!= 0" para ver se só para com o EOF.

    cumps e boa sorte.
     
  3. MoLt1eS

    MoLt1eS Power Member

    Bem agora não deu o erro mas esta a ler mal os numeros visto que sao listas de 10000 numeros em que pode conter 0's ele pode parar num 0 ou msm arrebentar visto que sao numeros bem grandes :P


    a lista esta neste formato:
    Código:
       212850028
       451231347
       189695537
       239757231
       171096576
       475896798
         8365964
       313580494
        85560229
       206005527
       370979491
        31599583
       483104746
        87802908
        85400712
       286186432
       324346867
    
    eu cheguei por a condiçao while(fscanf (ptfich, "%d\n", &temp) == EOF)
    mas da-me segmentation fault
     
  4. MoLt1eS

    MoLt1eS Power Member

    Acabei por dar a volta a isto inserindo manualmente o numero de elemntos e começou a dar :)
     
  5. Cfreitas

    Cfreitas Power Member

    Aí a situação é diferente... Os valores que aí tens não são inteiros (no sentido de programação) e se não me engano no fscanf o %d é para fazer scan de um INT.
    Por isso tens que procurar um novo método.

    Vê isto: http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/ na tabela tens as coisas direitinhas.

    Cumps e boa sorte.
     
  6. Kemosabe-TBC

    Kemosabe-TBC Power Member

    O problema é muito simples, estás a inicializar a variável nElem, incrementando-a, sem a ter inicializado. Basta inicializares com 0.
     
  7. daveseco7

    daveseco7 Power Member

    oh tiago isso é AlgC ou LFA ? xD
     
  8. mauro1855

    mauro1855 I'm cool cuz I Fold

    Então fazes fscanf para ler a dimensão do ficheiro e depois não a usas? Estás a guardar na variável temp e devias guardar na variável nElem, pelo que percebi.
    E como disseram: estás a usar o nElem sem o teres "inicializado" devidamente.


    O meu conselho: compila o programa com a flag -g ou -ggdb e corre depois o programa usando a ferramenta valgrind, que te indica exactamente qual foi a linha/função que originou a geração de um Segmentation fault (Sinal 11 - SIGSEGV) e, quase mais importante ainda, indica-te onde estás a usar valores não inicializados para operações.

    Exemplo:

    $ gcc programa.c -o programa -ggdb

    $ valgrind --leak-check=full ./programa

    Cumps
     

Partilhar esta Página