fag_oliv
(usa Gentoo)
Enviado em 01/04/2009 - 09:21h
Caros, depois de ler diversos artigo e ver que me programa continuava sem funcionar resolvi escrever pra se alguem pode me ajudar. Estou com seguinte problema, tenho um pequeno programa em c ansi com mais ou menos 2 mil linhas e comecei a me perder no meio das minhas funções. Pois bem, ai resolvi separar o programa em arquivo ".c" e ".h". Segui o padrão encontrado na net, ou seja funções no arquivo fonte (.c) e declarações no arquivo de cabeçalho (.h).
So que desde entao, meu programa não compila. Já realizei alterações de várias maneiras e não tem jeito de funcionar.
Segue meu programa principal e uma da funcao para que possam da uma olhada. Caso tenham um site ou uma referencia em que eu possa me basear para realizar esta tarefa.
Obrigado.
/*
************************************************************************
main.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include "desempilha.h"
#include "comunicacao.h"
#include "read.h"
#include "auxiliares.h"
#include "main.h"
int main() {
int num = 10;
UNIAO *inicio = NULL;
UNIAO *drivers = NULL;
inicio = (UNIAO *) malloc(sizeof(UNIAO));
if (inicio == NULL) {
printf("Erro ao alocar uniao principal.");
return 0;
}
else {
inicio->per = NULL;
inicio->com = NULL;
inicio->updates = NULL;
}
drivers = (UNIAO *) malloc(sizeof(UNIAO));
if (drivers == NULL) {
printf("Erro ao alocar uniao principal.");
return 0;
} else {
drivers->per = NULL;
drivers->com = NULL;
drivers->updates = NULL;
}
// Realiza a leitura do Config05.ini.
ReadPerifericos(&inicio, ARQ_CONFIG05);
// Realiza a leitura do drivers.ini.
ReadPerifericos(&drivers, ARQ_DRIVERS);
ReadCom(&inicio->com);
printf("{TTEXTO}33[2J");
printf("{TTEXTO}33[2J");
printf("{TTEXTO}33[40m");
limpa_tela();
while (num != 0) {
limpa_tela();
printf("\t\t\t\tConfigurador D-PDV \n\n");
printf(" |-----------------------|\n");
printf(" |1-Perifericos |\n");
printf(" |2-Comunicacao |\n");
printf(" |3-Updates files |\n");
printf(" |0-Sair |\n");
printf(" |-----------------------|\n\n");
printf("Opcao:");
scanf("%i", &num);
switch (num) {
case 1:
Perifericos(&inicio, &drivers);
break;
case 2:
Comunicacao(&inicio);
break;
case 3:
puts("EM CONSTRUCAO");
/*update_files();*/
break;
case 0:
DesempilhaConfig05(&drivers->per);
DesempilhaConfig05(&inicio->per);
DesempilhaCom(&inicio->com);
exit(0);
default:
puts("TENTE NOVAMENTE");
}
}
return (0);
}
/*
************************************************************************
main.h
*/
ifndef MAIN_H_
#define MAIN_H_
#define MAX 255
#define ARQ_CONFIG05 "/root/direcao/dpdv/config05.ini"
#define ARQ_LIBDPDVCLIENT "/root/direcao/dpdv/libdpdv_client.conf"
#define ARQ_DRIVERS "/root/direcao/dpdv/drivers.ini"
typedef struct uniao {
struct config05 *per;
struct libdpdv *com;
struct dpdvclient *updates;
} UNIAO;
typedef struct config05 {
char Funcao[MAX];
char SAM[MAX];
char Tipo[MAX];
char PortaSerial[MAX];
char DisplayNaTela[MAX];
char BitsPorSegundo[MAX];
char BitsDeDados[MAX];
char Paridade[MAX];
char BitsDeParada[MAX];
char BitsDeParidade[MAX];
char Config[MAX];
char xxxIRQ[MAX];
char LogInv[MAX];
struct ecfNfiscal *ecfNfiscal;
struct config05 *prox;
} CONFIG05;
typedef struct ecfNfiscal {
char Funcao[MAX];
char NumeroSerieECF[MAX];
char NumeroLoja[MAX];
char NumeroECF[MAX];
char RazaoSocial[MAX];
char CNPJ[MAX];
char IncricaoEstadual[MAX];
char UF[MAX];
char Endereco[MAX];
} ECF_N_FISCAL;
typedef struct libdpdv {
char Funcao[MAX];
char Host[MAX];
char Port[MAX];
char Timeout[MAX];
char Log_Days[MAX];
char StoreNumber[MAX];
char ServerOffLine[MAX];
char TefOffLine[MAX];
char ConvenioOffLine[MAX];
struct libdpdv *prox;
} LIBDPDV;
typedef struct dpdvclient {
char Funcao[20];
char SENDFILES[20];
char RECEIVEFILES[20];
char SENDFILESOK[20];
char FILE[20][20];
char TEFOFFLINE[40];
char RECEIVEFILESOK[40];
char CONVENIOOFFLINE[40];
char SERVEROFLINE[40];
struct dpdv_client *prox;
} DPDV_CLIENT;
//Funcao principal
int main();
#endif /* MAIN_H_ */
/*
* comunicacao.h
*
* Created on: 26/03/2009
* Author: root
*/
#ifndef COMUNICACAO_H_
#define COMUNICACAO_H_
void PosicionaPonteiroCom(UNIAO **inicio, int *status, char string[MAX]);
int ConfiguraCom(UNIAO **inicioCom, char funcao[MAX], int num);
int ModificaComunicacao(UNIAO **inicioCom, int numFuncao);
int Comunicacao(UNIAO **inicio);
#endif /* COMUNICACAO_H_ */
/*
* comunicacao.c
*
* Created on: 26/03/2009
* Author: root
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include "comunicacao.h"
#include "read.h"
#include "auxiliares.h"
#include "main.h"
void PosicionaPonteiroCom(UNIAO **inicio, int *status, char string[MAX]) {
LIBDPDV *aux = NULL;
int flag = 1;
int flag_1 = 1;
aux = (*inicio)->com;
while (flag_1 == 1) {
if ((*inicio)->com == aux && flag == 0) {
*status = 2;
flag_1 = 0;
}
flag = 0;
if (strcmp(aux->Funcao, string) == 0) {
flag_1 = 0;
*status = 0;
}
else
aux = aux->prox;
}
(*inicio)->com = aux;
}
int ConfiguraCom(UNIAO **inicioCom, char funcao[MAX], int num){
// Realiza a configuracao dos dispositivos.
UNIAO *inicio;
LIBDPDV *novo;
int op, status, retLista, numFuncao, new;
status = 2;
op = 0;
numFuncao = num;
new = 0;
retLista = 0;
printf("{TTEXTO}33[3;0H");
//Inicializando ponteiros.
inicio = *inicioCom;
if (strcmp(inicio->com->Funcao, funcao) == 0)
status = 0;
// Coloca ponteiro na posicao da estrutura onde consta a configuracao do periferico, caso o mesmo nao seja encontrado a funcao retorna status=0;
else
PosicionaPonteiroCom(&inicio, &status, funcao);
/* Se status retornar diferente de zero, significa que a aba selecionada não foi encontrada. Neste ponto, o operador
podera optar por criar esta aba */
if (status == 2) {
printf("{TTEXTO}33[2J");
printf("{TTEXTO}33[3;0H");
printf("Não identificamos no .conf a aba para comunicação. \n");
printf("Deseja inserir %s?(s/n)", funcao);
scanf("%s", &op);
while (op != 115 && op != 110) {
printf("\nOpcao invalida.\n");
printf("Deseja modificar?(s/n)");
scanf("%s", &op);
}
if (op == 115) {
novo = (LIBDPDV *) malloc(sizeof(LIBDPDV));
sprintf(novo->Funcao, "%s", funcao);
ordenaString(novo->Funcao);
novo->prox = inicio->com->prox;
inicio->com->prox = novo;
inicio->com = novo;
// Seta new para informar nova entrada na lista.
new = 1;
// Modifica status para permitir nova configuração.
status = 0;
}
else if (op == 110)
return (0);
}
if (status == 0) {
limpa_tela();
if (new == 0) {
printf("\n Configuração '%s': \n", inicio->com->Funcao);
printf(
"---------------------------------------------------------------------- \n");
//Mostra a configucao atual do periferico.
ImprimeCabecalho(funcao, numFuncao);
ImprimeConfiguracaoAtual(inicio, funcao, numFuncao);
printf(
"---------------------------------------------------------------------- \n");
printf("Deseja modificar?(s/n)");
scanf("%s", &op);
}
else if (new == 1)
op = 's';
while (op != 115 && op != 110) {
printf("\nOpcao invalida.\n");
printf("Deseja modificar?(s/n)");
scanf("%s", &op);
}
if (op == 115) {
retLista = 1;
//Realiza a troca da configuracao.
ModificaComunicacao(&inicio, numFuncao);
printf("\nConfiguracao alterada\n");
printf(
"---------------------------------------------------------------------- \n");
//Mostra a configucao atual
ImprimeCabecalho(funcao, numFuncao);
ImprimeConfiguracaoAtual(inicio, funcao, numFuncao);
printf(
"---------------------------------------------------------------------- \n");
printf("Configuracao realizada com sucesso.\n");
system("break");
} else {
printf("Nao exitem configuracoes pre-estabelicidas.\n");
printf("pressione [enter] para retornar ao menu principal.\n");
system("break");
printf("{TTEXTO}33[2J");
}
} else {
printf("Pressione [Enter] para retornar ao menu principal.\n");
system("break");
printf("{TTEXTO}33[2J");
}
return (retLista);
}
int ModificaComunicacao(UNIAO **inicioCom, int numFuncao) {
UNIAO *inicio;
inicio = *inicioCom;
if (strcmp(inicio->com->Funcao, "[SERVER]") == 0 || strcmp(
inicio->com->Funcao, "[CONVENIO]") == 0 || strcmp(
inicio->com->Funcao, "[CONSULTA_CHEQUE_RETAGUARDA]") == 0) {
printf("\nInforme os dados:\n\n");
printf("Host:");
lestring(inicio->com->Host, MAX);
printf("Porta:");
lestring(inicio->com->Port, MAX);
printf("timeout:");
lestring(inicio->com->Timeout, MAX);
}
if (strcmp(inicio->com->Funcao, "[TEF]") == 0) {
printf("\nInforme os dados:\n\n");
printf("Host:");
lestring(inicio->com->Host, MAX);
sprintf(inicio->com->Port, "6500");
sprintf(inicio->com->Timeout, "50");
}
if (strcmp(inicio->com->Funcao, "[TEF8]") == 0) {
printf("\nInforme os dados:\n\n");
printf("Host:");
lestring(inicio->com->Host, MAX);
sprintf(inicio->com->Port, "6800");
sprintf(inicio->com->Timeout, "50");
}
if (strcmp(inicio->com->Funcao, "[CONFIG]") == 0 && numFuncao == 7) {
printf("Numero da Loja:");
lestring(inicio->com->StoreNumber, MAX);
}
if (strcmp(inicio->com->Funcao, "[CONFIG]") == 0 && numFuncao == 6) {
printf("Dias de logs:");
lestring(inicio->com->Log_Days, MAX);
}
if (strcmp(inicio->com->Funcao, "[DIRECTORIES]") == 0) {
printf("TEFOFFLINE:");
lestring(inicio->com->TefOffLine, MAX);
printf("SERVEROFFLINE:");
lestring(inicio->com->ServerOffLine, MAX);
printf("CONVENIOOFFLINE:");
lestring(inicio->com->ConvenioOffLine, MAX);
}
return 1;
}
int Comunicacao(UNIAO **inicio) {
int num, retLista, w;
char funcao[MAX];
num = 1;
retLista = 0;
w = 0;
limpa_tela();
while (num != 0) {
printf("*** * **** **** *** * * * \n");
printf("* * * * * * * * * * * \n");
printf("* * * **** *** * * * * * \n");
printf("* * * * * * * * * * * * * \n");
printf("*** * * * **** *** * * * * \n\n");
printf("\t\t\t\tConfigurador D-PDV \n\n");
printf(" |-----------------------|\n");
printf(" |1-SERVERLOJA |\n");
printf(" |2-TEF5 |\n");
printf(" |3-TEF8 |\n");
printf(" |4-CONVENIO |\n");
printf(" |5-RET. CHEQUE |\n");
printf(" |6-DIA DE LOGS |\n");
printf(" |7-NUMERO DA LOJA |\n");
printf(" |8-DIRETORIOS |\n");
printf(" |0-MENU PRINCIPAL |\n");
printf(" |-----------------------|\n\n");
printf("Opcao:");
scanf("%i", &num);
switch (num) {
case 1:
sprintf(funcao, "[SERVER]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 2:
sprintf(funcao, "[TEF]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 3:
sprintf(funcao, "[TEF8]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 4:
sprintf(funcao, "[CONVENIO]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 5:
sprintf(funcao, "[CONSULTA_CHEQUE_RETAGUARDA]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 6:
sprintf(funcao, "[CONFIG]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 7:
sprintf(funcao, "[CONFIG]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 8:
sprintf(funcao, "[DIRECTORIES]");
retLista = ConfiguraCom(&(*inicio), funcao, num);
if (retLista != 0)
ChamaGravaCom((*inicio)->com);
break;
case 0:
num = 0;
printf("{TTEXTO}33[2J");
break;
default:
puts("TENTE NOVAMENTE");
}
}
}
--------------------------------------------------------------------------------
Obs: estao todos os fontes e cabeçalhos no mesmo diretório.
Erro que ocorre durante compilacao:
make main
cc main.c -o main
/tmp/ccjt49YO.o: In function `main':
main.c:(.text+0xd3): undefined reference to `ReadPerifericos'
main.c:(.text+0xe7): undefined reference to `ReadPerifericos'
main.c:(.text+0xf9): undefined reference to `ReadCom'
main.c:(.text+0x131): undefined reference to `limpa_tela'
main.c:(.text+0x13b): undefined reference to `limpa_tela'
main.c:(.text+0x25a): undefined reference to `Perifericos'
main.c:(.text+0x26b): undefined reference to `Comunicacao'
main.c:(.text+0x28e): undefined reference to `DesempilhaConfig05'
main.c:(.text+0x29d): undefined reference to `DesempilhaConfig05'
main.c:(.text+0x2af): undefined reference to `DesempilhaCom'
collect2: ld returned 1 exit status
make: ** [main] Erro 1
Obrigado.