Thread: An Acess Violation (Segmentation Fault) raised in your program.

  1. #1
    Registered User
    Join Date
    Jan 2012
    Posts
    6

    An Acess Violation (Segmentation Fault) raised in your program.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAX_IT  500
    #define MAX_FN  100
    #define MAX_TXT 150
    
    typedef struct data {
    short int dia;
    char mes[3]; short int ano;
    }data_tipo; typedef struct funcionario {
    short int cod_fn; char nome[40]; char morada[50]; data_tipo data_admissao; short int especialidade;
    }funcionario_tipo; typedef struct componente {
    short int cod_cp; char descricao[50]; data_tipo data_compra;
    }componente_tipo; typedef struct intervencao {
    short int cod_it; componente_tipo cp_principal; char tipo_intervencao; componente_tipo vec_cp[100]; char vec_it[100]; char estado; data_tipo data_pedido; char urgencia; data_tipo data_inicio; data_tipo data_fim; funcionario_tipo equipa[100]; funcionario_tipo responsavel;
    }intervencao_tipo; char especialidades[][20]={"Eletricista","Manobrador","Mecânico","Serralheiro","Trolha"}; short int lerInteiro(short int li,short int ls, short int tam) {
    short int num, certo=0; char valor[MAX_TXT]; do
    {
    printf("\nDigite um valor entre %u e %u: ",li,ls); gets(valor); if (strlen(valor)==tam)
    { num=atoi(valor); if (num>=li && num<=ls)
    certo=1;
    else
    printf("\nUnicamente digitos entre %u e %u !",li,ls);
    }
    else printf("\nComprimento inválido !");
    }while(certo==0); // enquanto o valor lido não estiver correcto return num;
    } void lerChars(char *s, short int tam, char *info) {
    short int i=0; char ch; puts(info); ch=getchar(); while(ch!='\n' && i<tam) {
    s[i]=ch; i++; ch=getchar();
    } s[i]='\0';
    } short int procurarCodigoFn(funcionario_tipo fn[], short int qtd, short int cod) {
    short int i, enc=-1; for(i=0;i<qtd && enc==-1;i++) if (fn[i].cod_fn==cod) enc=i; return enc;
    } // Lê dados de um funcionario e guarda no vetor void inserirFn(funcionario_tipo fn[], short int *qtd) {
    short int n, i, encontrou; char valor[MAX_TXT]; struct tm *local; time_t t; if (*qtd==MAX_FN)
    printf("\nEste Porto não admite mais funcionários!!\n");
    else {
    printf("\n--- Dados do funcionário ---");
    n=lerInteiro(1000,9999,4); encontrou=procurarCodigoFn(fn,*qtd,n); printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd); while(encontrou>=0) // Significa que é repetido e não pode acontecer!!! {
    n=lerInteiro(1000,9999,4); encontrou=procurarCodigoFn(fn,*qtd,n);
    } printf("\n\t\t Fora: "); fn[*qtd].cod_fn=n; lerChars(valor,39,"\nNome (max 39 caracteres):"); printf("\n\t %s ", valor); strcpy(fn[*qtd].nome,valor); lerChars(valor,49,"\nMorada (max 49 caracteres):"); printf("\n\t %s ", valor); strcpy(fn[*qtd].morada,valor); n=lerInteiro(0,4,1); fn[*qtd].especialidade=n; t= time(NULL); local=localtime(&t); fn[*qtd].data_admissao.dia=local->tm_mday; strncat(fn[*qtd].data_admissao.mes, __DATE__ , 3); fn[*qtd].data_admissao.ano=local->tm_year+1900;
    }
    (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    } // Recebe um funcionario por parâmetro e mostra os seus dados void mostrarFn(funcionario_tipo fn) {
    printf("\n--- Dados do Funcionario ---\n"); printf("\n Codigo: %hd",fn.cod_fn); printf("\n Nome: %s",fn.nome); printf("\n Morada: %s",fn.morada); printf("\n Especialidade: %s",especialidades[fn.especialidade]); printf("\n Dia/Mes/Ano: %hd//%s//%hd",fn.data_admissao.dia,fn.data_admissao.mes,fn.data_admissao.ano);
    } // Procura um funcionario e mostra todos os seus dados void mostrarDadosFn(funcionario_tipo fn[], short int qtd) {
    short int n, encontrou=0; if (qtd==0) printf("\nEste Porto não tem funcionarios inscritos!!\n"); else { n=lerInteiro(1000,9999,4); encontrou=procurarCodigoFn(fn,qtd,n); if (encontrou>=0)
    mostrarFn(fn[encontrou]);
    else
    printf("\n Não existe nenhum funcionario com código = %hd",n);
    } getch();
    } // Mostrar todos os dados de todos os funcionarios void mostrarDadosFns(funcionario_tipo fn[], short int qtd) {
    short int i; if (qtd==0)
    printf("\nEste Porto não tem funcionarios inscritos!!\n");
    else
    for(i=0;i<qtd;i++) {
    mostrarFn(fn[i]); getch();
    }
    } // Eliminar um funcionario void eliminarFn(funcionario_tipo fn[], short int qtd) {
    short int n, encontrou=0; char r; if (qtd==0)
    printf("\nEste Porto não tem funcionarios inscritos!!\n");
    else {
    n=lerInteiro(1000,9999,4); encontrou=procurarCodigoFn(fn,qtd,n); if (encontrou>=0){
    mostrarFn(fn[encontrou]);
    do{
    printf("\n\nConfirma? (s/n)");
    r=getch();
    }while(r!='s' && r!='S' && r!='n' && r!='N');
    if (r=='s' || r=='S'){
    //inserir aqui códgo para eliminar funcionario
    printf("\n\nFuncionário ELIMINADO");
    }
    else
    printf("\n\nFuncionário NÃO ELIMINADO");
    }
    else
    printf("\n Não existe nenhum funcionario com código=hd",n);
    }
    getch();
    } short int procurarCodigoIt(intervencao_tipo it[],short int qtd, short int cod) {
    short int i, enc=-1; for(i=0;i<qtd && enc==-1;i++)
    if (it[i].cod_it==cod)
    enc=i;
    return enc;
    }//Valida o tipo de intervenção char valtipo() {
    char s='s'; do {
    printf("\nTipo de intervenção no componente:\n'A'-avaria 'M'-melhoria 'N'-nenhuma\n");
    scanf("%c",&s);
    } while(s!='a'&&s!='A'&&s!='m'&&s!='M'&&s!='n'&&s!='N'); return(s);
    } //Procura uma intervenção e altera os seus dados char alterarEstadoIntervencao(intervencao_tipo it[], short int qtd) {
    char estado; struct tm *local; time_t t; do {
    printf("\nEstado de intervenção no componente:\n'0'- pendente '1'- em curso '2'- concluída\n"); scanf("%c",&estado);
    } while(estado!='0'&&estado!='1'&&estado!='2'); t= time(NULL); local=localtime(&t); switch(estado) {
    case '0':
    it[qtd].data_pedido.dia=local->tm_mday; strncat(it[qtd].data_pedido.mes, __DATE__ , 3); it[qtd].data_pedido.ano=local->tm_year+1900; break;
    case '1':
    it[qtd].data_inicio.dia=local->tm_mday;
    strncat(it[qtd].data_inicio.mes, __DATE__ , 3); it[qtd].data_inicio.ano=local->tm_year+1900; break;
    case '2':
    it[qtd].data_fim.dia=local->tm_mday; strncat(it[qtd].data_fim.mes, __DATE__ , 3); it[qtd].data_fim.ano=local->tm_year+1900; break;
    } return estado;
    } void alterarEquipas(intervencao_tipo it[],short int *qtd) {
    int i,n,encontrou; funcionario_tipo fn[MAX_FN]; do{
    n=lerInteiro(1000,9999,4); encontrou=procurarCodigoFn(fn,*qtd,n); if (encontrou>=0)
    {
    it[*qtd].equipa[i].cod_fn=n; i++;
    }
    }while(n==0||i==100);
    } short int procurarCodigoEq(componente_tipo cp[],short int qtd, short int cod) {
    short int i, enc=-1; for(i=0;i<qtd && enc==-1;i++)
    if (cp[i].cod_cp==cod)
    enc=i;
    return enc; } // Lê dados de um equipamento e guarda no vetor void inserirEquipamentos(componente_tipo eq[], short int *qtd) {
    short int n, i, encontrou; char valor[MAX_TXT]; struct tm *local; time_t t; printf("\n--- Dados do equipamento ---"); n=lerInteiro(100,999,3); encontrou=procurarCodigoEq(eq,*qtd,n); printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd); while(encontrou>=0) // Significa que é repetido e não pode acontecer!!! {
    n=lerInteiro(100,999,3); encontrou=procurarCodigoEq(eq,*qtd,n);
    } eq[*qtd].cod_cp=n; lerChars(valor,50,"\nDescrição (max 50 caracteres):"); printf("\n\t %s ", valor); strcpy(eq[*qtd].descricao,valor); t= time(NULL); local=localtime(&t); eq[*qtd].data_compra.dia=local->tm_mday; strncat(eq[*qtd].data_compra.mes, __DATE__ , 3); eq[*qtd].data_compra.ano=local->tm_year+1900; (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    } // Lê dados de uma intervenção e guarda no vetor void inserirIntervencao(intervencao_tipo it[], short int *qtd) {
    short int n, i, encontrou,m,qtd_eq=0; char valor[MAX_TXT],s,estado; struct tm *local; time_t t; componente_tipo vec_cp[100]; componente_tipo eq[100]; if (*qtd==MAX_IT)
    printf("\nEste Porto não admite mais intervenções!!\n");
    else {
    printf("\n--- Dados da Intervenção ---"); n=lerInteiro(100,999,3); encontrou=procurarCodigoIt(it,*qtd,n); printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd); while(encontrou>=0) // Significa que é repetido e não pode acontecer!!! {
    n=lerInteiro(100,999,3);
    encontrou=procurarCodigoIt(it,*qtd,n);
    } it[*qtd].cod_it=n; do {
    encontrou=-1; printf("\nQual é o componente principal?"); m=lerInteiro(100,999,3); encontrou=procurarCodigoEq(eq,*qtd,m);
    } while(encontrou<0); it[*qtd].cp_principal.cod_cp=m; it[*qtd].tipo_intervencao=valtipo(); for(i=0;i<100;i++) {
    inserirEquipamentos(vec_cp,&qtd_eq);
    } for(i=0;i<100;i++) {
    n=lerInteiro(100,999,3); //if(vec_cp[i]>0) it[*qtd].vec_it[i]=valtipo();
    } it[*qtd].estado=alterarEstadoIntervencao(it,*qtd); //it[*qtd].equipa=alterarEquipas(it,qtd);
    } (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    } void mostrarIt(intervencao_tipo it) {
    printf("\n--- Dados da Intervenção ---\n"); printf("\n Codigo: %hd",it.cod_it);
    } // Procura uma intervenção e mostra todos os seus dados void mostrarDadosIt(intervencao_tipo it[], short int qtd) {
    short int n, encontrou=0; if (qtd==0)
    printf("\nNeste momento, não existe nenhuma intervenção!!\n");
    else {
    n=lerInteiro(100,999,3); encontrou=procurarCodigoIt(it,qtd,n); if (encontrou>=0)
    mostrarIt(it[encontrou]);
    else
    printf("\n Não existe nenhuma intervenção com código = %hd",n);
    } getch();
    } // Recebe um equipamento por parâmetro e mostra os seus dados void mostrarEq(componente_tipo cp) {
    printf("\n--- Dados do Equipamento ---\n"); printf("\n Codigo: %hd",cp.cod_cp); printf("\n Descrição: %s",cp.descricao);
    } // Procura um equipamento e mostra todos os seus dados void mostrarDadosEq(componente_tipo cp[], short int qtd) {
    short int n, encontrou=0; if (qtd==0)
    printf("\nEste Porto não tem equipamento!!\n");
    else {
    n=lerInteiro(100,999,3); encontrou=procurarCodigoEq(cp,qtd,n); if (encontrou>=0)
    mostrarEq(cp[encontrou]);
    else
    printf("\n Não existe nenhum equipamento com código = %hd",n);
    }
    getch(); } // Menu de opções char formulario() {
    char r; do {
    system ("cls"); system ("title GESTÃO DA MANUTENÇÃO DE EQUIPAMENTOS PORTUÁRIOS"); printf("\n\n===> INSERIR DADOS"); printf("\n1- Inserir informação sobre funcionários"); printf("\n2- Inserir informação sobre materiais (equipamentos/componentes)"); printf("\n3- Inserir informação sobre intervenção\n"); printf("\n\n===> LISTAGENS"); printf("\n4- Mostrar estado, equipa de manutenção e datas de todas as intervenções"); printf("\n5- Mostrar equipamentos e componentes com intervenções superiores à média"); printf("\n6- Mostrar equipas com melhores resultados de desempenho"); printf("\n\n===> ATUALIZAR DADOS"); printf("\n7- Eliminar um funcionário"); printf("\n8- Alterar o estado de uma intervenção"); printf("\n9- Alterar equipas de manutenção"); printf("\n\ns/S- Sair\n"); r=getch();
    }while(r!='s' && r!='S' && r!='1' && r!='2' && r!='3' && r!='4' && r!='5' && r!='6' && r!='7' && r!='8'); return r;
    } // Função principal int main() {
    short int qtd_fn=0,qtd_eq=0,qtd_it=0,qtd_equipas=0; funcionario_tipo vec_fn[MAX_FN]; componente_tipo vec_eq[MAX_IT]; intervencao_tipo vec_it[MAX_IT]; funcionario_tipo vec_equipas[100]; char ch; do {
    ch=formulario(); switch (ch) {
    case '1':{ inserirFn(vec_fn,&qtd_fn); break; } case '2':{ inserirEquipamentos(vec_eq,&qtd_eq); break; } case '3':{ inserirIntervencao(vec_it,&qtd_it); break; } case '4':{ mostrarDadosIt(vec_it,qtd_it); break; } case '5':{ mostrarDadosEq(vec_eq,qtd_eq); break; } //case '6':{ mostrarDadosEquipas(vec_equipas,qtd_equipas); break; } case '7':{ eliminarFn(vec_fn,qtd_fn); break; } case '8':{ alterarEstadoIntervencao(vec_it,qtd_it); break; } //case '9':{ alterarEquipas(vec_equipas,qtd_equipas); break; }
    }
    }while(ch!='s' && ch!='S'); getch(); return 0;
    }
    Someone find what causes that error?
    The program compiles but does not execute.
    Last edited by Andrezinho15; 01-03-2012 at 09:21 AM.

  2. #2
    Registered User
    Join Date
    Apr 2011
    Location
    dust
    Posts
    70
    While running which particular option you are getting error?

  3. #3
    Registered User
    Join Date
    Jan 2012
    Posts
    6
    Quote Originally Posted by ArunS View Post
    While running which particular option you are getting error?
    I can't even choose the option.
    It don't run!

  4. #4
    Registered User
    Join Date
    May 2009
    Posts
    4,183
    Are you sure you are compiling the code you posted?
    It errors out on me.

    Tim S.

  5. #5
    Registered User
    Join Date
    Jan 2012
    Posts
    6
    Quote Originally Posted by stahta01 View Post
    Are you sure you are compiling the code you posted?
    It errors out on me.

    Tim S.
    Yes, i'm 100% sure!
    It executed on you?
    Last edited by Andrezinho15; 01-03-2012 at 08:56 AM.

  6. #6
    Registered User
    Join Date
    May 2009
    Posts
    4,183
    You have too much poorly pasted code for me to help you with; no idea if it is your fault or it is the website/browser at fault.

    Tim S.

  7. #7
    Registered User
    Join Date
    Jan 2012
    Posts
    6
    Quote Originally Posted by stahta01 View Post
    You have too much poorly pasted code for me to help you with; no idea if it is your fault or it is the website/browser at fault.

    Tim S.
    When i posted it, it looks fine! But i'm updating.

  8. #8
    Registered User
    Join Date
    May 2009
    Posts
    4,183
    If you read this post you should see a to "plain text" button above the code; this shows that the code snippet was posted right. NOTE: After editing your post you might need to refresh page after saving to see the button that switches from plain text to colored text appear.

    I had to edit your code because the "{" after the while statements were on same line as comments.

    Tim S.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAX_IT  500
    #define MAX_FN  100
    #define MAX_TXT 150
    
    typedef struct data
    {
        short int dia;
        char mes[3];
        short int ano;
    } data_tipo;
    
    typedef struct funcionario
    {
        short int cod_fn;
        char nome[40];
        char morada[50];
        data_tipo data_admissao;
        short int especialidade;
    } funcionario_tipo;
    
    typedef struct componente
    {
        short int cod_cp;
        char descricao[50];
        data_tipo data_compra;
    } componente_tipo;
    
    typedef struct intervencao
    {
        short int cod_it;
        componente_tipo cp_principal;
        char tipo_intervencao;
        componente_tipo vec_cp[100];
        char vec_it[100];
        char estado;
        data_tipo data_pedido;
        char urgencia;
        data_tipo data_inicio;
        data_tipo data_fim;
        funcionario_tipo equipa[100];
        funcionario_tipo responsavel;
    } intervencao_tipo;
    
    char especialidades[][20]= {"Eletricista","Manobrador","Mecânico","Serralheiro","Trolha"};
    
    short int lerInteiro(short int li,short int ls, short int tam)
    {
        short int num, certo=0;
        char valor[MAX_TXT];
        do
        {
            printf("\nDigite um valor entre %u e %u: ",li,ls);
            gets(valor);
            if (strlen(valor)==tam)
            {
                num=atoi(valor);
                if (num>=li && num<=ls)
                    certo=1;
                else
                    printf("\nUnicamente digitos entre %u e %u !",li,ls);
            }
            else printf("\nComprimento inválido !");
        }
        while(certo==0);  // enquanto o valor lido não estiver correcto return num;
    }
    
    void lerChars(char *s, short int tam, char *info)
    {
        short int i=0;
        char ch;
        puts(info);
        ch=getchar();
        while(ch!='\n' && i<tam)
        {
            s[i]=ch;
            i++;
            ch=getchar();
        }
        s[i]='\0';
    }
    
    short int procurarCodigoFn(funcionario_tipo fn[], short int qtd, short int cod)
    {
        short int i, enc=-1;
        for(i=0; i<qtd && enc==-1; i++) if (fn[i].cod_fn==cod) enc=i;
        return enc;
    }
    
    // Lê dados de um funcionario e guarda no vetor
    void inserirFn(funcionario_tipo fn[], short int *qtd)
    {
        short int n, i, encontrou;
        char valor[MAX_TXT];
        struct tm *local;
        time_t t;
        if (*qtd==MAX_FN)
            printf("\nEste Porto não admite mais funcionários!!\n");
        else
        {
            printf("\n--- Dados do funcionário ---");
            n=lerInteiro(1000,9999,4);
            encontrou=procurarCodigoFn(fn,*qtd,n);
            printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
            while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
            {
                n=lerInteiro(1000,9999,4);
                encontrou=procurarCodigoFn(fn,*qtd,n);
            }
            printf("\n\t\t Fora: ");
            fn[*qtd].cod_fn=n;
            lerChars(valor,39,"\nNome (max 39 caracteres):");
            printf("\n\t %s ", valor);
            strcpy(fn[*qtd].nome,valor);
            lerChars(valor,49,"\nMorada (max 49 caracteres):");
            printf("\n\t %s ", valor);
            strcpy(fn[*qtd].morada,valor);
            n=lerInteiro(0,4,1);
            fn[*qtd].especialidade=n;
            t= time(NULL);
            local=localtime(&t);
            fn[*qtd].data_admissao.dia=local->tm_mday;
            strncat(fn[*qtd].data_admissao.mes, __DATE__ , 3);
            fn[*qtd].data_admissao.ano=local->tm_year+1900;
        }
        (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    }
    
    // Recebe um funcionario por parâmetro e mostra os seus dados
    void mostrarFn(funcionario_tipo fn)
    {
        printf("\n--- Dados do Funcionario ---\n");
        printf("\n Codigo: %hd",fn.cod_fn);
        printf("\n Nome: %s",fn.nome);
        printf("\n Morada: %s",fn.morada);
        printf("\n Especialidade: %s",especialidades[fn.especialidade]);
        printf("\n Dia/Mes/Ano: %hd//%s//%hd",fn.data_admissao.dia,fn.data_admissao.mes,fn.data_admissao.ano);
    }
    
    // Procura um funcionario e mostra todos os seus dados
    void mostrarDadosFn(funcionario_tipo fn[], short int qtd)
    {
        short int n, encontrou=0;
        if (qtd==0) printf("\nEste Porto não tem funcionarios inscritos!!\n");
        else
        {
            n=lerInteiro(1000,9999,4);
            encontrou=procurarCodigoFn(fn,qtd,n);
            if (encontrou>=0)
                mostrarFn(fn[encontrou]);
            else
                printf("\n Não existe nenhum funcionario com código = %hd",n);
        }
        getch();
    }
    
    // Mostrar todos os dados de todos os funcionarios
    void mostrarDadosFns(funcionario_tipo fn[], short int qtd)
    {
        short int i;
        if (qtd==0)
            printf("\nEste Porto não tem funcionarios inscritos!!\n");
        else
            for(i=0; i<qtd; i++)
            {
                mostrarFn(fn[i]);
                getch();
            }
    }
    
    // Eliminar um funcionario
    void eliminarFn(funcionario_tipo fn[], short int qtd)
    {
        short int n, encontrou=0;
        char r;
        if (qtd==0)
            printf("\nEste Porto não tem funcionarios inscritos!!\n");
        else
        {
            n=lerInteiro(1000,9999,4);
            encontrou=procurarCodigoFn(fn,qtd,n);
            if (encontrou>=0)
            {
                mostrarFn(fn[encontrou]);
                do
                {
                    printf("\n\nConfirma? (s/n)");
                    r=getch();
                }
                while(r!='s' && r!='S' && r!='n' && r!='N');
                if (r=='s' || r=='S')
                {
    //inserir aqui códgo para eliminar funcionario
                    printf("\n\nFuncionário ELIMINADO");
                }
                else
                    printf("\n\nFuncionário NÃO ELIMINADO");
            }
            else
                printf("\n Não existe nenhum funcionario com código=hd",n);
        }
        getch();
    }
    
    short int procurarCodigoIt(intervencao_tipo it[],short int qtd, short int cod)
    {
        short int i, enc=-1;
        for(i=0; i<qtd && enc==-1; i++)
            if (it[i].cod_it==cod)
                enc=i;
        return enc;
    }//Valida o tipo de intervenção
    char valtipo()
    {
        char s='s';
        do
        {
            printf("\nTipo de intervenção no componente:\n'A'-avaria 'M'-melhoria 'N'-nenhuma\n");
            scanf("%c",&s);
        }
        while(s!='a'&&s!='A'&&s!='m'&&s!='M'&&s!='n'&&s!='N');
        return(s);
    }
    
    //Procura uma intervenção e altera os seus dados
    char alterarEstadoIntervencao(intervencao_tipo it[], short int qtd)
    {
        char estado;
        struct tm *local;
        time_t t;
        do
        {
            printf("\nEstado de intervenção no componente:\n'0'- pendente '1'- em curso '2'- concluída\n");
            scanf("%c",&estado);
        }
        while(estado!='0'&&estado!='1'&&estado!='2');
        t= time(NULL);
        local=localtime(&t);
        switch(estado)
        {
        case '0':
            it[qtd].data_pedido.dia=local->tm_mday;
            strncat(it[qtd].data_pedido.mes, __DATE__ , 3);
            it[qtd].data_pedido.ano=local->tm_year+1900;
            break;
        case '1':
            it[qtd].data_inicio.dia=local->tm_mday;
            strncat(it[qtd].data_inicio.mes, __DATE__ , 3);
            it[qtd].data_inicio.ano=local->tm_year+1900;
            break;
        case '2':
            it[qtd].data_fim.dia=local->tm_mday;
            strncat(it[qtd].data_fim.mes, __DATE__ , 3);
            it[qtd].data_fim.ano=local->tm_year+1900;
            break;
        }
        return estado;
    }
    
    void alterarEquipas(intervencao_tipo it[],short int *qtd)
    {
        int i,n,encontrou;
        funcionario_tipo fn[MAX_FN];
        do
        {
            n=lerInteiro(1000,9999,4);
            encontrou=procurarCodigoFn(fn,*qtd,n);
            if (encontrou>=0)
            {
                it[*qtd].equipa[i].cod_fn=n;
                i++;
            }
        }
        while(n==0||i==100);
    }
    
    short int procurarCodigoEq(componente_tipo cp[],short int qtd, short int cod)
    {
        short int i, enc=-1;
        for(i=0; i<qtd && enc==-1; i++)
            if (cp[i].cod_cp==cod)
                enc=i;
        return enc;
    }
    
    // Lê dados de um equipamento e guarda no vetor
    void inserirEquipamentos(componente_tipo eq[], short int *qtd)
    {
        short int n, i, encontrou;
        char valor[MAX_TXT];
        struct tm *local;
        time_t t;
        printf("\n--- Dados do equipamento ---");
        n=lerInteiro(100,999,3);
        encontrou=procurarCodigoEq(eq,*qtd,n);
        printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
        while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
        {
            n=lerInteiro(100,999,3);
            encontrou=procurarCodigoEq(eq,*qtd,n);
        }
        eq[*qtd].cod_cp=n;
        lerChars(valor,50,"\nDescrição (max 50 caracteres):");
        printf("\n\t %s ", valor);
        strcpy(eq[*qtd].descricao,valor);
        t= time(NULL);
        local=localtime(&t);
        eq[*qtd].data_compra.dia=local->tm_mday;
        strncat(eq[*qtd].data_compra.mes, __DATE__ , 3);
        eq[*qtd].data_compra.ano=local->tm_year+1900;
        (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    }
    
    // Lê dados de uma intervenção e guarda no vetor
    void inserirIntervencao(intervencao_tipo it[], short int *qtd)
    {
        short int n, i, encontrou,m,qtd_eq=0;
        char valor[MAX_TXT],s,estado;
        struct tm *local;
        time_t t;
        componente_tipo vec_cp[100];
        componente_tipo eq[100];
        if (*qtd==MAX_IT)
            printf("\nEste Porto não admite mais intervenções!!\n");
        else
        {
            printf("\n--- Dados da Intervenção ---");
            n=lerInteiro(100,999,3);
            encontrou=procurarCodigoIt(it,*qtd,n);
            printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
            while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
            {
                n=lerInteiro(100,999,3);
                encontrou=procurarCodigoIt(it,*qtd,n);
            }
            it[*qtd].cod_it=n;
            do
            {
                encontrou=-1;
                printf("\nQual é o componente principal?");
                m=lerInteiro(100,999,3);
                encontrou=procurarCodigoEq(eq,*qtd,m);
            }
            while(encontrou<0);
            it[*qtd].cp_principal.cod_cp=m;
            it[*qtd].tipo_intervencao=valtipo();
            for(i=0; i<100; i++)
            {
                inserirEquipamentos(vec_cp,&qtd_eq);
            }
            for(i=0; i<100; i++)
            {
                n=lerInteiro(100,999,3); //if(vec_cp[i]>0) it[*qtd].vec_it[i]=valtipo();
            }
            it[*qtd].estado=alterarEstadoIntervencao(it,*qtd); //it[*qtd].equipa=alterarEquipas(it,qtd);
        } (*qtd)++; // Incrementa a quantidade de utentes existentes no vector
    }
    
    
    void mostrarIt(intervencao_tipo it)
    {
        printf("\n--- Dados da Intervenção ---\n");
        printf("\n Codigo: %hd",it.cod_it);
    }
    
    // Procura uma intervenção e mostra todos os seus dados
    void mostrarDadosIt(intervencao_tipo it[], short int qtd)
    {
        short int n, encontrou=0;
        if (qtd==0)
            printf("\nNeste momento, não existe nenhuma intervenção!!\n");
        else
        {
            n=lerInteiro(100,999,3);
            encontrou=procurarCodigoIt(it,qtd,n);
            if (encontrou>=0)
                mostrarIt(it[encontrou]);
            else
                printf("\n Não existe nenhuma intervenção com código = %hd",n);
        }
        getch();
    }
    
    // Recebe um equipamento por parâmetro e mostra os seus dados
    void mostrarEq(componente_tipo cp)
    {
        printf("\n--- Dados do Equipamento ---\n");
        printf("\n Codigo: %hd",cp.cod_cp);
        printf("\n Descrição: %s",cp.descricao);
    }
    
    // Procura um equipamento e mostra todos os seus dados
    void mostrarDadosEq(componente_tipo cp[], short int qtd)
    {
        short int n, encontrou=0;
        if (qtd==0)
            printf("\nEste Porto não tem equipamento!!\n");
        else
        {
            n=lerInteiro(100,999,3);
            encontrou=procurarCodigoEq(cp,qtd,n);
            if (encontrou>=0)
                mostrarEq(cp[encontrou]);
            else
                printf("\n Não existe nenhum equipamento com código = %hd",n);
        }
        getch();
    }
    
    // Menu de opções
    char formulario()
    {
        char r;
        do
        {
            system ("cls");
            system ("title GESTÃO DA MANUTENÇÃO DE EQUIPAMENTOS PORTUÁRIOS");
            printf("\n\n===> INSERIR DADOS");
            printf("\n1- Inserir informação sobre funcionários");
            printf("\n2- Inserir informação sobre materiais (equipamentos/componentes)");
            printf("\n3- Inserir informação sobre intervenção\n");
            printf("\n\n===> LISTAGENS");
            printf("\n4- Mostrar estado, equipa de manutenção e datas de todas as intervenções");
            printf("\n5- Mostrar equipamentos e componentes com intervenções superiores à média");
            printf("\n6- Mostrar equipas com melhores resultados de desempenho");
            printf("\n\n===> ATUALIZAR DADOS");
            printf("\n7- Eliminar um funcionário");
            printf("\n8- Alterar o estado de uma intervenção");
            printf("\n9- Alterar equipas de manutenção");
            printf("\n\ns/S- Sair\n");
            r=getch();
        }
        while(r!='s' && r!='S' && r!='1' && r!='2' && r!='3' && r!='4' && r!='5' && r!='6' && r!='7' && r!='8');
        return r;
    }
    // Função principal
    int main()
    {
        short int qtd_fn=0,qtd_eq=0,qtd_it=0,qtd_equipas=0;
        funcionario_tipo vec_fn[MAX_FN];
        componente_tipo vec_eq[MAX_IT];
        intervencao_tipo vec_it[MAX_IT];
        funcionario_tipo vec_equipas[100];
        char ch;
        do
        {
            ch=formulario();
            switch (ch)
            {
            case '1':
            {
                inserirFn(vec_fn,&qtd_fn);
                break;
            }
            case '2':
            {
                inserirEquipamentos(vec_eq,&qtd_eq);
                break;
            }
            case '3':
            {
                inserirIntervencao(vec_it,&qtd_it);
                break;
            }
            case '4':
            {
                mostrarDadosIt(vec_it,qtd_it);
                break;
            }
            case '5':
            {
                mostrarDadosEq(vec_eq,qtd_eq);
                break;
            } //case '6':{ mostrarDadosEquipas(vec_equipas,qtd_equipas); break; } case '7':{ eliminarFn(vec_fn,qtd_fn); break; } case '8':{ alterarEstadoIntervencao(vec_it,qtd_it); break; } //case '9':{ alterarEquipas(vec_equipas,qtd_equipas); break; }
            }
        }
        while(ch!='s' && ch!='S');
        getch();
        return 0;
    }
    Warnings I got
    Code:
    mingw32-gcc.exe -Wall  -O2     -c H:\SourceCode\Projects\testc\main.c -o obj\Release\main.o
    H:\SourceCode\Projects\testc\main.c: In function 'inserirFn':
    H:\SourceCode\Projects\testc\main.c:97:18: warning: unused variable 'i' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'mostrarDadosFn':
    H:\SourceCode\Projects\testc\main.c:158:5: warning: implicit declaration of function 'getch' [-Wimplicit-function-declaration]
    H:\SourceCode\Projects\testc\main.c: In function 'eliminarFn':
    H:\SourceCode\Projects\testc\main.c:204:13: warning: too many arguments for format [-Wformat-extra-args]
    H:\SourceCode\Projects\testc\main.c: In function 'inserirEquipamentos':
    H:\SourceCode\Projects\testc\main.c:293:18: warning: unused variable 'i' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'inserirIntervencao':
    H:\SourceCode\Projects\testc\main.c:324:12: warning: unused variable 't' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:323:16: warning: unused variable 'local' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:27: warning: unused variable 'estado' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:25: warning: unused variable 's' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:10: warning: unused variable 'valor' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'main':
    H:\SourceCode\Projects\testc\main.c:447:22: warning: unused variable 'vec_equipas' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:443:42: warning: unused variable 'qtd_equipas' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'lerInteiro':
    H:\SourceCode\Projects\testc\main.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]
    H:\SourceCode\Projects\testc\main.c: In function 'alterarEquipas':
    H:\SourceCode\Projects\testc\main.c:274:38: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
    The important warnings
    Code:
    mingw32-gcc.exe -Wall  -O2     -c main.c -o obj\Release\main.o
    main.c: In function 'mostrarDadosFn':
    main.c:158:5: warning: implicit declaration of function 'getch' [-Wimplicit-function-declaration]
    main.c: In function 'eliminarFn':
    main.c:204:13: warning: too many arguments for format [-Wformat-extra-args]
    main.c: In function 'lerInteiro':
    main.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]
    main.c: In function 'alterarEquipas':
    main.c:274:38: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
    Last edited by stahta01; 01-03-2012 at 09:22 AM.

  9. #9
    Registered User
    Join Date
    Jan 2012
    Posts
    6
    Quote Originally Posted by stahta01 View Post
    If you read this post you should see a to "plain text" button above the code; this shows that the code snippet was posted right. NOTE: After editing your post you might need to refresh page after saving to see the button that switches from plain text to colored text appear.

    I had to edit your code because the "{" after the while statements were on same line as comments.

    Tim S.

    (...)

    Warnings I got
    Code:
    mingw32-gcc.exe -Wall  -O2     -c H:\SourceCode\Projects\testc\main.c -o obj\Release\main.o
    H:\SourceCode\Projects\testc\main.c: In function 'inserirFn':
    H:\SourceCode\Projects\testc\main.c:97:18: warning: unused variable 'i' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'mostrarDadosFn':
    H:\SourceCode\Projects\testc\main.c:158:5: warning: implicit declaration of function 'getch' [-Wimplicit-function-declaration]
    H:\SourceCode\Projects\testc\main.c: In function 'eliminarFn':
    H:\SourceCode\Projects\testc\main.c:204:13: warning: too many arguments for format [-Wformat-extra-args]
    H:\SourceCode\Projects\testc\main.c: In function 'inserirEquipamentos':
    H:\SourceCode\Projects\testc\main.c:293:18: warning: unused variable 'i' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'inserirIntervencao':
    H:\SourceCode\Projects\testc\main.c:324:12: warning: unused variable 't' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:323:16: warning: unused variable 'local' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:27: warning: unused variable 'estado' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:25: warning: unused variable 's' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:322:10: warning: unused variable 'valor' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'main':
    H:\SourceCode\Projects\testc\main.c:447:22: warning: unused variable 'vec_equipas' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c:443:42: warning: unused variable 'qtd_equipas' [-Wunused-variable]
    H:\SourceCode\Projects\testc\main.c: In function 'lerInteiro':
    H:\SourceCode\Projects\testc\main.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]
    H:\SourceCode\Projects\testc\main.c: In function 'alterarEquipas':
    H:\SourceCode\Projects\testc\main.c:274:38: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
    The important warnings
    Code:
    mingw32-gcc.exe -Wall  -O2     -c main.c -o obj\Release\main.o
    main.c: In function 'mostrarDadosFn':
    main.c:158:5: warning: implicit declaration of function 'getch' [-Wimplicit-function-declaration]
    main.c: In function 'eliminarFn':
    main.c:204:13: warning: too many arguments for format [-Wformat-extra-args]
    main.c: In function 'lerInteiro':
    main.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]
    main.c: In function 'alterarEquipas':
    main.c:274:38: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
    Why you put the option 6,7,8 and 9 in comments?

  10. #10
    Registered User
    Join Date
    May 2009
    Posts
    4,183
    Quote Originally Posted by Andrezinho15 View Post
    Why you put the option 6,7,8 and 9 in comments?
    I DID NOT Your poor code tag formatting DID!!!

    Edit: I still do NOT see the button to switch between "plain" and "colored" text display in your code post.

    Tim S.
    Last edited by stahta01; 01-03-2012 at 09:35 AM.

  11. #11
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,659
    Code:
    int main()
    {
        printf("%lu\n",sizeof(funcionario_tipo)*MAX_FN);
        printf("%lu\n",sizeof(componente_tipo)*MAX_IT);
        printf("%lu\n",sizeof(intervencao_tipo)*MAX_IT);
        printf("%lu\n",sizeof(funcionario_tipo)*100);
        return 0;
    }
    
    
    $ gcc bar.c
    $ ./a.out 
    10200
    30000
    8247000
    10200
    Just one of your arrays is absolutely massive - it's over 8MB.
    Which is a problem, given the default stack size is between 1 and 8MB (usually).

    Try say
    static intervencao_tipo vec_it[MAX_IT];
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  12. #12
    Registered User
    Join Date
    Jan 2012
    Posts
    6
    Quote Originally Posted by Salem View Post
    Code:
    int main()
    {
        printf("%lu\n",sizeof(funcionario_tipo)*MAX_FN);
        printf("%lu\n",sizeof(componente_tipo)*MAX_IT);
        printf("%lu\n",sizeof(intervencao_tipo)*MAX_IT);
        printf("%lu\n",sizeof(funcionario_tipo)*100);
        return 0;
    }
    
    
    $ gcc bar.c
    $ ./a.out 
    10200
    30000
    8247000
    10200
    Just one of your arrays is absolutely massive - it's over 8MB.
    Which is a problem, given the default stack size is between 1 and 8MB (usually).

    Try say
    static intervencao_tipo vec_it[MAX_IT];
    Thanks man!
    It finally executes!

  13. #13
    Algorithm Dissector iMalc's Avatar
    Join Date
    Dec 2005
    Location
    New Zealand
    Posts
    6,318
    You should still go and fix the "The important warnings" that were brought to your attention earlier.
    My homepage
    Advice: Take only as directed - If symptoms persist, please see your debugger

    Linus Torvalds: "But it clearly is the only right way. The fact that everybody else does it some other way only means that they are wrong"

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 8
    Last Post: 10-01-2011, 11:26 PM
  2. Replies: 3
    Last Post: 01-13-2010, 11:16 PM
  3. access violation segmentation fault raised in your program
    By dinamit875 in forum C++ Programming
    Replies: 8
    Last Post: 04-23-2009, 11:44 AM
  4. Replies: 3
    Last Post: 07-17-2008, 08:45 AM
  5. access violation (segmentation fault)
    By MarlonDean in forum C++ Programming
    Replies: 7
    Last Post: 05-16-2008, 05:02 AM