【问题标题】:Need help in a school project [closed]在学校项目中需要帮助[关闭]
【发布时间】:2021-01-15 12:21:20
【问题描述】:

此代码适用于学校项目,适用于公司。 我们需要创建一个包含一些信息的员工。如果我只是把 printf 它工作,但当我使用 scanf 代码崩溃。 我不知道为什么它不起作用。 如果您需要更多信息,请告诉我

main.c


int main() {
    
    FILE *file;
    Funcionario *lista_funcionarios;
    int tam_lista = 0, escolha = 0;
menu_funcionario(lista_funcionarios, tam_lista, file);
}

funcionario.c

void criar_funcionario(Funcionario *funcionario, Funcionario *lista_funcionarios, int tam_lista, FILE *file) {

    
    printf("Code:");
    scanf("%d", &funcionario->codigo);
}
void menu_funcionario(Funcionario *lista_funcionarios,int tam_lista, FILE *file) {
    
    int op;
    Funcionario *funcionario_temp;
    int codigo_temp;
    criar_funcionario(funcionario_temp, lista_funcionarios, tam_lista, file);
}



funcionario.h 我认为一切都很好,但你可以看到 funcionar 和 codigo 的类型


#define MAX_FUNCIONARIOS  2000
#define TAM_NOME  200   
#define MIN_NUM_FUNCIONARIO  0
#define MAX_NUM_FUNCIONARIO  10000
#define MIN_DIA  0
#define MAX_DIA  31
#define MIN_MES  1
#define MAX_MES  12
#define MIN_ANO  1900
#define MAX_ANO  2021
#define MIN_TELEMOVEL  0 
#define MAX_TELEMOVEL  999999999
#define SUB_ALIMENTACAO 4.30
#define MIN_FILHOS  0
#define MAX_FILHOS  100  
#define VENC_BASE_EMP_LIMP 2.65
#define VENC_BASE_COST 2.90
#define VENC_BASE_SOC_GER 3.13
#define VENC_BASE_ENC_LINHA 3.44
#define VENC_BASE_EMP_ESC 4.16
#define VENC_BASE_MOD  6.25
#define MIN_PREFIXO 0
#define MAX_PREFIXO 9999
#define MAX_ESTADO_CIVIL 5
#define MIN_ESTADO_CIVIL 0

    typedef enum {
        casado, solteiro, divorciado, viuvo, separado
    } Estado_civil;

    typedef enum {
        empregada_limpeza,
        costureira,
        modelista,
        empregada_escritorio,
        encarregada_linha,
        socio_gerente
    } Cargo;

    typedef struct {
        int tm_sec; //representa os segundos de 0 a 59
        int tm_min; //representa os minutos de 0 a 59
        int tm_hour; //representa as horas de 0 a 24
        int tm_mday; //dia do mês de 1 a 31
        int tm_mon; //representa os meses do ano de 0 a 11
        int tm_year; //representa o ano a partir de 1900
        int tm_wday; //dia da semana de 0 (domingo) até 6 (sábado)
        int tm_yday; // dia do ano de 1 a 365
        int tm_isdst; //indica horário de verão se for diferente de zero
    } tm;

    typedef struct {
        int dia, mes, ano;
    } Data;

    typedef enum {
        false, true
    } Bool;

    typedef struct {
        Bool eliminado;
        int codigo, numero_telemovel, numero_filhos, indicativo_numero_telemovel, saida;
        char nome [TAM_NOME];
        Cargo cargo;
        Estado_civil estado_civil;
        Data data_entrada, data_saida, data_nascimento, tempo_empresa, data_entrada_temp, data_saida_temp;
        double subsidio_alimentacao, vencimento_base, ent_empregadora_seg_social;
        tm data_atual, data_atual_temp;

    } Funcionario;

    void criar_funcionario(Funcionario *funcionario, Funcionario *lista_funcionarios, int tam_lista, FILE *file);
    void editar_funcionario(Funcionario * funcionario);
    void remover_funcionario(Funcionario * funcionario);
    void mostrar_funcionario(Funcionario *funcionario);
    Bool esta_removido(Funcionario *funcionario);
    void criar_Data(Data* data, int dia, int mes, int ano);
    void calcular_tempo_empresa_saiu(Funcionario *funcionario);
    void time_now();
    void calcurar_tempo_empresa(Funcionario *funcionario);
    Funcionario procurar_funcionario(int codigo, Funcionario *lista_funcionarios, int tam_lista, FILE *file);
    void menu_funcionario(Funcionario *lista_funcionarios, int tam_lista, FILE *file);


#ifdef __cplusplus
}
#endif

#endif /* FUNCIONARIO_H */

【问题讨论】:

  • 你有一个 C 程序,所以请不要用 C++ 标记它。顺便说一句,您的标头会破坏 C++ 程序。您的 #ifdef __cplusplus } #endif 不平衡。
  • Funcionario *lista_funcionarios; -- lista_funcionarios 在这里指向什么?考虑使用malloc 对其进行初始化。
  • 请创建一个具有实际和预期行为的minimal reproducible example

标签: c project


【解决方案1】:

menu_funcionario 中,您将未初始化的指针funcionario_temp 传递给criar_funcionario,在那里您取消引用它。如果funcionario_temp 不指向现有的Funcionario 对象,那将无法工作。您需要创建Funcionario 的实例并将其地址传递给criar_funcionario

void menu_funcionario(Funcionario *lista_funcionarios,int tam_lista, FILE *file) {
    Funcionario funcionario_temp;
    criar_funcionario(&funcionario_temp, lista_funcionarios, tam_lista, file);
}

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多