Arquivos de cabeçalhos...

1. Arquivos de cabeçalhos...

Fagner Pires de Oliveira
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.


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts