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

[C] Ajuda

Discussão em 'Programação' iniciada por brunocosta505, 25 de Junho de 2008. (Respostas: 0; Visualizações: 526)

  1. brunocosta505

    brunocosta505 Power Member

    boas..

    tenho estado a fazer tipo um jogo em c.. e agora passaram este bocado de código.. que supostamente deveria guardar os dados que são lidos na funçao.. mas o que acontece é o seguinte.. da primeira vez kue corro ele automaticamente cria o ficheiro "ficheiros" que é como se fosse a base de dados onde ele vai guardar os dados recebidos durante a execuçao do programa.. só que depois de terminar a execução da primeira vez e correr o .exe por uma segunda vez da uma erro de:

    Windows has triggered a breakpoint in ficheiros.exe.

    This may be due to a corruption of the heap, and indicates a bug in ficheiros.exe or any of the DLLs it has loaded.

    The output window may have more diagnostic information

    aqui está o código:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    #define DIMS 80
    
    typedef struct e
    {
        char nome[DIMS];
        int ordenado;
        struct e *seguinte;
    }EMPREGADO, *PTREMP;
    
    PTREMP head=NULL, tail=NULL;
    
    PTREMP criaremp(void)
    {
        PTREMP novo;
    
        novo=(PTREMP) malloc(sizeof(EMPREGADO));
        if (!novo)    //novo==NULL
        {
            printf("memoria cheia\n");
            getch();
            return (NULL);
        }
    
        printf("qual o nome do empregado-> ");
        gets (novo->nome);
        printf ("qual o ordenado-> ");
        scanf ("%d",&novo->ordenado);
        novo->seguinte=NULL;
        return (novo);
    }
    
    
    void listar (void)
    {
        PTREMP aux;
        
        if (!head)
        {
            printf("Lista vazia\n");
            getch();
            return;
        }
        printf("Nome\tOrdenado\n\n");
        for (aux=head;aux!=NULL;aux=aux->seguinte)
        {
            printf("%s\t%d\n",aux->nome,aux->ordenado);
        }
        getch();
    }
    
    void inserir_cab(void)
    {
        PTREMP novo;
    
        novo=criaremp();
        if (!novo)
            return;
    
        novo->seguinte=head;
        head=novo;
        if (!tail) // se não existir tail tinhamos a lista vazia
            tail=novo;
    }
    
    void inserir_cauda(void)
    {
        PTREMP novo;
    
        novo=criaremp();
        if (!novo)
            return;
    
        if (!tail)    // caso da lista vazia
        {
            tail=novo;
            head=novo;
        }
        else
        {
            tail->seguinte=novo;
            tail=novo;
        }
    }
    
    void inserir_ordenado(void)
    {
        PTREMP novo, anterior, corrente;
        int res;
    
        novo=criaremp();
        if (!novo)
            return;
    
        
        // se a lista estiver vazia 
        if (!head)
        {
            tail=novo;
            head=novo;
            return;
        }
        
        //percorrer a lista
        corrente=head;
        anterior=NULL;
        while (corrente!=NULL)
        {
            res=strcmp(novo->nome,corrente->nome);
            if (res==0)
            {
                printf("Dados já existentes\n");
                getch();
                return;
            }
            else if (res<0)
            {
                //se o anterior for NULL vamos inserir à cabeça
                if (anterior==NULL)
                {
                    novo->seguinte=head;
                    head=novo;
                    return;
                }
                // inserção em qualquer ponto da lista
                anterior->seguinte=novo;
                novo->seguinte=corrente;
                return;
            }
            anterior=corrente;
            corrente=corrente->seguinte;
        }
        
        // se chegamos ao fim da lista temos inserção à cauda
        tail->seguinte=novo;
        tail=novo;
    
    }
    
    void eliminar1 (void)
    {
        PTREMP anterior, corrente;
        char nome[DIMS];
    
        if (!head)
        {
            printf("Lista Vazia\n");
            getch();
            return;
        }
    
        printf("Qual o nome-> ");
        gets(nome);
    
        corrente=head;
        anterior=NULL;
    
        while (corrente!= NULL)
        {
            if (strcmp(nome,corrente->nome)==0)
            {
                if (!anterior)    //eliminar primeiro elemento
                {
                    head=corrente->seguinte;
                    if (tail==corrente)  // se só existir um elemento da lista
                        tail=NULL;
                }
                else
                {
                    anterior->seguinte=corrente->seguinte;
                    if (tail==corrente)  // se estamos a eliminar o último
                        tail=anterior;
                }
                free (corrente);
                return;
            }
            anterior=corrente;
            corrente=corrente->seguinte;
        }
    
        //chegamos ao fim da lista
        printf("o elemento com o nome %s nao existe\n",nome);
        getch();
    
    }
    
    void eliminar (void)
    {
        PTREMP aux;
    
        while(head!=NULL)
        {
            aux=head;
            head=head->seguinte;
            free (aux);
        }
        tail=NULL;
    }
    
    int op;
    
    void ler_fich(void)
    {
        FILE *fich;
        EMPREGADO gf;
        PTREMP novo;
    
        fich=fopen("dados.bin","rb");
        if (!fich)
        {    
            printf ("O ficheiro nao existe\n");
            getch();
            system("CLS");
            return;
        }
        
        //enquanto conseguir ler dados do ficheiro vou enchendo a lista
        while (fread(&gf,sizeof(EMPREGADO),1,fich)==1)
        {
            novo =(PTREMP)malloc(sizeof(PTREMP));
            if (!novo)
            {
                printf("falta de memoria\n");
                getch();
                system("CLS");
                fclose(fich);
            }
    
            strcpy(novo->nome,gf.nome);
            novo->ordenado=gf.ordenado;
            novo->seguinte=NULL;
    
            if(!head)
            {
                head=novo;
                tail=novo;
            }
            else
            {
                tail->seguinte=novo;
                tail=novo;
            }
        }
    
        fclose (fich); //fechar o ficheiro
    }
    
    void escrever_fich(void)
    {
        FILE *fich;
        PTREMP aux;
        EMPREGADO gf;
    
        fich=fopen("dados.bin","wb");
        if (!fich)
        {
            printf("Nao se conseguiu criar o ficheiro\n");
            getch();
            system("CLS");
            return;
        }
        
        while (head)
        {
            // copiar dados para um registo simples para podermos gravar no ficheiro
            strcpy(gf.nome,head->nome);
            gf.ordenado=head->ordenado;
            fwrite(&gf,sizeof(EMPREGADO),1,fich);
            aux=head;
            head=head->seguinte;
            free(aux);
        }
    
        fclose(fich);
    
    }
    void main (void)
    {
        
        ler_fich();
        do
        {
            printf("0-Sair\n1-Listar elementos\n2-Inserir a cabeca\n3-Inserir a cauda\n4-Inserir ordenado\n5-Eliminar 1\n6-Eliminar Todos\nEscolha a sua opcao-> ");
            scanf("%d",&op);
            while(getchar()!='\n');
            system("CLS");
            switch (op)
            {
                case 1: listar();
                        break;
                case 2: inserir_cab();
                        break;
                case 3: inserir_cauda();
                        break;
                case 4: inserir_ordenado();
                        break;
                case 5: eliminar1();
                        break;
                case 6: eliminar();
                        break;
                
    
            }
            system("CLS");
        }while (op!=0);
    
        escrever_fich();
    }
     
    Última edição pelo moderador: 25 de Junho de 2008

Partilhar esta Página