+ Responder ao Tópico



  1. #1

    Padrão Ajuda com algoritmo de ordenação em C.

    Olá amigos, meu professor me passou um trabalho que é elaborar um programa em C onde se gera um arquivo TXT com números de 0 a 999 de forma aleatória e que esse arquivo tenha o tamanho de 2gb, posteriormente abra esse mesmo TXT. ordene todos os valores e salve em um novo arquivo...usei o método Quicksort, testei com diversos valores, até 1gb funciona bacana, mas com 2gb ele dá um erro de execução logo após ter criado o primeiro TXT ( desordenado ). alguém tem ideia de oque pode estar ocasionando esse erro ?

  2. #2

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Primeiro, veja onde você está criando esse arquivo. Obviamente, veja se tem espaço ( uns 5GB pra garantir, já que são dois arquivos de 2GB ). Dai veja como está formatado. É melhor rodar isso no hd, seja em ext-qquer coisa do linux, seja em NTFS. Se você está criando esse arquivo em um pendrive formatado em fat, pode ser isso.

    Eliminadas essas possibilidades simples, tem que ver o código. Por acaso a variável que você está usando como contador para ver se deu o tamanho do arquivo não está sub-dimensionada ? Se é C, bota ela como long e vê se resolve.

    Fora isso, teria que saber exatamente qual erro ele dá, e também ver se está criando o primeiro arquivo até o fim mesmo, ou se está dando erro antes. Seria mais útil voce postar o codigo do programa.

  3. #3

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Obrigado pelo retorno amigo, então estou executando no HD mesmo, em NTFS tem bastante espaço livre...é em C, quando me alertou fiquei na duvida e testei com long, após a conclusão do arquivo desordenado ele trava ( ele cria o primeiro arquivo direitinho, completo com os 2gb)...vou postar o codigo

  4. #4

    Padrão

    Código :
    #include <stdio.h>#include <stdlib.h>
    #define num 555698376
    //277849188 <--- 1 gb //
    //555698376 <--- 2 gb //
     
     
    void quick_sort(int *p, int inicio, int fim){
        int i, j, pivo, aux;
     
     
        i=inicio;
        j=fim-1;
        pivo=p[(inicio+fim)/2];
        while(i<=j){
            while(p[i]<pivo && i<fim){
                i++;
            }
            while(p[j]>pivo && j>inicio){
                j--;
            }
            if(i<=j){
               aux = p[i];
               p[i] = p[j];
               p[j] = aux;
               i++;
               j--;
            }
        }
        if(j > inicio)
            quick_sort(p, inicio, j+1);
        if(i < fim)
            quick_sort(p, i, fim);
    }
    int main()
    {
        int *p;
        p = (int*)malloc (num * sizeof(int));
        int i;
        int n;
        FILE *pFile;
        pFile = fopen ("teste.txt","w");
        for(n=0;n<=num;n++)
    {
            fprintf (pFile,"%d ",rand()%1000);
    }
        FILE *orde;
        orde = fopen ("teste.txt","r");
        for(i=0; i<num; i++)
        {
            fscanf(orde,"%d ", &p[i]);
        }
        orde = fopen ("teste2.txt","w");
        quick_sort(p, 0, num);
     
     
        printf("Valores ordenados");
     
     
        for(i=0; i<num; i++){
            fprintf(orde,"%d ",p[i]);
        }
    }

  5. #5

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Vamos lá, alguns palpites pra garantir :

    Depois do for () que cria o arquivo, feche ele ( fclose() ) , pra garantir que esteja tudo escrito e buffers limpos.
    Coloque também um fclose() depois da primeira ver que usa "orde" para ler do arquivo para a variavel p, já que você está usando o mesmo descritor de arquivo "orde" para abrir o arquivo que vai gravar.
    E claro, coloque um fclose() no final do programa, depois que criou o arquivo teste2.txt.

    Ponha também uns printf no meio dessa parte que abre o arquivo e chama o quieck sort, para saber até onde o programa está chegando antes de dar erro.

  6. #6

    Padrão

    testei de todas as formas e continua dando o mesmo erro..ao que parece é na leitura do arquivo desordenado...estou em Linguagem de programação 1, tudo ainda é muito novo pra mim, desculpa se estiver cometendo erros bobos, estou aprendendo...adicionei outro descritor e o fclose em todas as aberturas, mas o erro continua...

    Código :
    #include <stdio.h>#include <stdlib.h>
    #define num 555698376
    //277849188 <--- 1 gb //
    //555698376 <--- 2 gb //
     
     
    void quick_sort(int *p, int inicio, int fim){
        int i, j, pivo, aux;
     
     
        i=inicio;
        j=fim-1;
        pivo=p[(inicio+fim)/2];
        while(i<=j){
            while(p[i]<pivo && i<fim){
                i++;
            }
            while(p[j]>pivo && j>inicio){
                j--;
            }
            if(i<=j){
               aux = p[i];
               p[i] = p[j];
               p[j] = aux;
               i++;
               j--;
            }
        }
        if(j > inicio)
    		quick_sort(p, inicio, j+1);
    	if(i < fim)
    		quick_sort(p, i, fim);
    }
    int main()
    {
        int *p;
        p = (int*)malloc (num * sizeof(int));
        long long i;
        int n;
        FILE *pFile;
        pFile = fopen ("teste.txt","w");
        for(n=0;n<=num;n++)
    {
            fprintf (pFile,"%d ",rand()%1000);
    }
        printf ("Arquivo desordenado criado com sucesso.\n\n");
        fclose(pFile);
        FILE *orde;
        orde = fopen ("teste.txt","r");
        for(i=0; i<num; i++)
        {
            fscanf(orde,"%d ", &p[i]);
        }
        printf("Leitura arquivo do desordenado com sucesso.\n\n");
        fclose(orde);
        FILE *tet;
        tet = fopen ("teste2.txt","w");
        quick_sort(p, 0, num);
        printf("Valores ordenados\n\n");
     
     
        for(i=0; i<num; i++){
            fprintf(tet,"%d ",p[i]);
        }
        fclose(tet);
    }

  7. #7

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Ele chega a executar a linha do "printf("Leitura arquivo do desordenado com sucesso.\n\n");" ?

  8. #8

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    não, trava antes...um amigo recomendou usar um filtro no malloc, p/ verificar se ele está alocando a memoria...coloquei o filtro e pra minha surpresa não está...sera que é algo no windows ?

  9. #9

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Coloque isto logo depois da linha p = (int*)malloc (num * sizeof(int)); :

    if (p==NULL) {
    printf("Erro : buffer nao foi alocado\n");
    exit(1);
    }


    e também lá no final do programa coloque um

    free(p);

  10. #10

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    vamos no básico : quanto de memória tem no seu micro ?

  11. #11

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    mais uma coisa : bota uma quantidade pequena para num ( uns 10 a 15 numeros, por exemplo ) e veja se o programa roda.

  12. #12

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Citação Postado originalmente por rogfanther Ver Post
    Coloque isto logo depois da linha p = (int*)malloc (num * sizeof(int)); :

    if (p==NULL) {
    printf("Erro : buffer nao foi alocado\n");
    exit(1);
    }


    e também lá no final do programa coloque um

    free(p);
    coloquei, com o numero de 1gb (277849188) ele aloca bacana, mas com o numero de 2gb (555698376) ele trava

    Citação Postado originalmente por rogfanther Ver Post
    vamos no básico : quanto de memória tem no seu micro ?
    tem 6gb de ram

    Citação Postado originalmente por rogfanther Ver Post
    mais uma coisa : bota uma quantidade pequena para num ( uns 10 a 15 numeros, por exemplo ) e veja se o programa roda.
    com 277849188 ele funciona, cria o arquivo desordenado, depois ordena e cria o arquivo ordenado...o problema acontece quando dobro esse valor p/ conseguir os 2gb....ele cria o primeiro arquivo (desordenado) e quando inicia a leitura desse mesmo arquivo ele trava.

  13. #13

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Faça o teste do NULL pro valor retornado no malloc. Se ele não conseguir alocar o buffer, vai dar erro depois porque você está tentando escrever num buffer que não existe.

    Um outro teste que pode fazer ( está tarde e já não estou pensando direito por causa do sono ) :
    mude todos os int para long e teste. Tem uma dúvida de qual o tamanho de um int ( 16 ou 32 bits ) no seu compllador, então pode ser algo desse tipo que esteja tentando alocar um buffer de tamanho incorreto. Ou uma limitação do seu compilador.

  14. #14

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Galera, consegui resolver o problema, achei importante voltar e dizer como resolvi...acabei descobrindo que o problema não era no meu código, e sim no compilador que era 32bits ( codebloks ) instalei o devc++ e usei o compilador 64 bits funcionou bacana...grande abraço rogfanther, obrigado pela força !!

  15. #15

    Padrão Re: Ajuda com algoritmo de ordenação em C.

    Jóia ,que bom que funcionou! Abraço!