Ir ao conteúdo

Posts recomendados

Postado

Galera, estou a semana inteira estudando e fazendo esse trabalho pra faculdade. Agora, perto do prazo final(sexta 19h) ele está dando um erro muito sutil que eu não consigo perceber!!  No CodeBlocks, quando chega nas funções para achar jogadores na parte em que eu igual *jogador = &times.jogadores[j] o compilador simplesmente para de funcionar, no site da minha faculdade, diz que dá segmentation fault(não tenho Linux ainda, não testei lá)... O trabalho era só para implementar funções, então a main, eu que fiz mas no site da faculdade ele vai gerar uma main própria...Anexarei e também deixarei abaixo as duas versões do código, o lab4.h e o definições.h, incluídas no código e que tem instruções nos comentários. Me ajudem por favor, estou desesperado! P.S: o código é grande, mas as funções começam a quase que se repetir, mudando uma coisa ou outra, então, se achar meu erro no início é só mudar nas outra...

 

 

SEGUE ABAIXO AS INTRUÇÕES, LOGO APÓS O LAB4.H, DEFINICOES.H, E MEU CODIGO. ESTÁ MUITO GRANDE, ENTÃO SE PREFERIREM LEIAM SÓ AS INSTRUÇÕES E DEPOIS BAIXEM OS AQUIVOS QUE VOU DEIXAR ANEXADO. O CÓDIGO ESTÁ MUITO GRANDE, ENTÃO PRA FACILITAR, O ERRO ESTÁ MUITO PROVAVELMENTE NA TERCEIRA FUNÇÃO OU NAS DUAS ANTERIORES.

 

AQUI VOCÊS PODEM BAIXAR UM ARQUIVO PARA TESTAR O CÓDIGO: https://goo.gl/RLkcfx

P.S: Nome dos times e jogadores bugados pois foram gerados aleatoriamente.

 

***EDUT: TIREI AS INSTRUÇÕES AQUI.

 

 

Muito obrigado pela ajuda!! Lá vai:

 

 

 

#include <stdlib.h>
#include "lab4.h"

 


FILE *abre_arquivo(const char *arquivo){
    FILE *arq;
    arq = fopen(arquivo,"rb");
    if (arq == NULL){
        printf("ERRO");
        return NULL;
}
    return arq;
}

 

int fecha_arquivo(FILE *arq){
return fclose(arq);
}

 

times_t *le_times(const char *arquivo, unsigned int *numero_de_times){
    unsigned int i = 0;
    FILE *arqu = abre_arquivo(arquivo);
    times_t equipe;
        while(!feof(arqu)){
            i++;
            fseek(arqu,i*sizeof(times_t),SEEK_SET);
            fread(&equipe, sizeof(times_t),1,arqu);
   }
    *numero_de_times = i;
    times_t *times = (times_t*)malloc(i*sizeof(times_t));
    if(times == NULL){
       free(times);
       fecha_arquivo(arqu);
       return NULL;
       }
    fseek(arqu,0,SEEK_SET);
 int checagem = fread(times,sizeof(times_t),i,arqu);
 if (checagem < i){
                free(times);
                fecha_arquivo(arqu);
                return NULL;
            }
 fecha_arquivo(arqu);
   return times;
}

 

void encontra_jogador_cartao_vermelho_e_jogos(times_t *times, unsigned int num_times, jogador_t **jogador, times_t **time){
    int i,j;
    float proporcao = 0.0;
    for (i = 0; i < num_times; i++){
        for(j = 0; j < NUM_JOGADORES; j++){
                if (((float)(times.jogadores[j].cartoes_vermelhos)/(times.jogadores[j].numero_jogos)) > proporcao){
                    proporcao = ((float)(times.jogadores[j].cartoes_vermelhos))/(times.jogadores[j].numero_jogos);
                    *jogador = &times.jogadores[j];
                    *time = &times;
               }
        }
    }
}

 

void encontra_jogador_artilheiro(times_t *times, unsigned int num_times, jogador_t **jogador, times_t **time){
    int i,j,gols = 0;
    for (i = 0; i < num_times; i++){
        for(j = 0; j < NUM_JOGADORES; j++){
            if ((times.jogadores[j].gols_marcados) > gols){
                            gols = times.jogadores[j].gols_marcados;
                            *jogador = &times.jogadores[j];
                            *time = &times;
                    }
            }
        }
}

 

void encontra_jogador_mais_eficiente(times_t *times, unsigned int num_times, jogador_t **jogador, times_t **time){
    int i,j;
    float artilharia = 0.0;
    for (i = 0; i < num_times; i++){
        for(j = 0; j < NUM_JOGADORES; j++){
            if (((float)(times.jogadores[j].gols_marcados))/(times.jogadores[j].numero_jogos) > artilharia){
                artilharia = ((float)(times.jogadores[j].gols_marcados))/(times.jogadores[j].numero_jogos);
                *jogador = &times.jogadores[j];
                *time = &times;
                    }
            }
        }
}

 

void encontra_time_com_mais_titulos(times_t *times, unsigned int num_times, times_t **time){
    int i;
    float titulo = 0.0;
        for(i = 0; i < num_times;i++){
           if (((float)(times.numero_copas_brasil + times.numero_tit_brasileiros + times.numero_tit_estadual + times.numero_tit_libertadores)/(times.ano_fundacao)) > titulo){
                titulo = (((float)(times.numero_copas_brasil + times.numero_tit_brasileiros + times.numero_tit_estadual + times.numero_tit_libertadores))/(times.ano_fundacao));
                *time = &times;
           }
        }
}

 

void encontra_goleiro_que_defendeu_mais_penaltis(times_t *times, unsigned int num_times, jogador_t **jogador, times_t **time){
 int i,j;
 float defesas = 0.0;
 for (i = 0; i < num_times; i++){
        for(j = 0; j < NUM_JOGADORES; j++){
            if (times.jogadores[j].posicao == 0){
                if(((float)(times.jogadores[j].penalti_defendidos)/(times.jogadores[j].numero_jogos)) > defesas){
                    defesas = ((times.jogadores[j].penalti_defendidos)/(times.jogadores[j].numero_jogos));
                    *jogador = &times.jogadores[j];
                    *time = &times;
                        }
                    }
 }
 }
 }

 

void encontra_jogador_mais_agressivo(times_t *times, unsigned int num_times, jogador_t **jogador, times_t **time){
int i,j;
float agressividade = 0.0, x;
     for (i = 0; i < num_times; i++){
            for(j = 0; j < NUM_JOGADORES; j++){
                x = 5*(times.jogadores[j].cartoes_vermelhos) + times.jogadores[j].cartoes_amarelos + 0.2*(times.jogadores[j].faltas_cometidas);
                if(x > agressividade){
                    agressividade = x;
                    *time = &times;
                    *jogador = &times.jogadores[j];
                }
}
     }

 

}

 


int main(void){

 

    int numeroDeTimes;
    char nomeArquivo[15] = "arq.dat";

 

    times_t *times = le_times(nomeArquivo, &numeroDeTimes);
    times_t *maiorTime;
    jogador_t *maiorJogador;
    encontra_jogador_cartao_vermelho_e_jogos(times,numeroDeTimes,&maiorJogador, &maiorTime);
    printf("%s \n",maiorTime->nome);
    printf("%s",maiorJogador->nome);
    encontra_jogador_artilheiro(times,numeroDeTimes,&maiorJogador, &maiorTime);
    encontra_jogador_mais_eficiente(times,numeroDeTimes,&maiorJogador, &maiorTime);
    encontra_time_com_mais_titulos(times,numeroDeTimes, &maiorTime);
    encontra_goleiro_que_defendeu_mais_penaltis(times,numeroDeTimes,&maiorJogador, &maiorTime);
    encontra_jogador_mais_agressivo(times,numeroDeTimes,&maiorJogador, &maiorTime);

 


    return 0;
}

 

 

 

definicoes.txt

lab4h.txt

 

 

lab4c.txt

Postado

@vangodp cara, muito obrigado pela ajuda!! Mas infelizmente eu arrumei esse erro e mesmo assim continua acusando segfault lá no site! No CodeBlocks tá rodando tranquilo! Tô usando só uma versão do código agora que eu vou atualizar na postagem. To mandando também a main que eu to usando e tá dando certo. Continuo achando erro está em lê times ou na comparação do ponteiro duplo *jogador = &timesjogadores[j]. Muito obrigado pela ajuda!!

Postado

@vangodp hum, entendo. Cara, eu tentei com a função que você fez pra ele e deu a mesma coisa. Deu certo no pc mas lá no site não deu... Então não deve ser a le_times, deve ser no ponteiro duplo.. O erro que aparece no compilador do site:

 

Copiando arquivos de teste...                                                   

FIM                                                                             

./vpl_execution: line 16: 29242 Segmentation fault      (core dumped) ./$PROG   

 

 

e nos comentários de avaliação:

 

Copiando arquivos de teste...
FIM
Iniciando avaliação de compilação.
Acabou a avaliação de compilação.
Iniciando avaliação de tempo máximo de execução.
[☠☠☠] Erro: falha de segmentação (crashed)!
 

Visitante
Este tópico está impedido de receber novas respostas.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!