Como dividir um codigo em varios arquivos? [RESOLVIDO]

1. Como dividir um codigo em varios arquivos? [RESOLVIDO]

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

Enviado em 01/12/2012 - 12:30h

Bom tenho um codigo em um arquivo so porem quero dividir ele para ficar mais facil de continuar desenvolvendo a aperfeiçoando o mesmo, so que eu peguei e dividi ele em arquivos sendo main.c funcoes.h funcoes.c so que antes do main no arquivo original eu tenho variaveis globais e o que é mais terrivel ainda tenho declarado uma struct fora da função main então de geito nenhum consigo compilar meu codigo por favor me ajudem programo em C a algum tempo mais sempre em programas de um unico arquivo e quando fiz com multiplos arquivos nao tinhas essas variaveis globais e muito menos uma strutura declarada fora da função main.



  


2. MELHOR RESPOSTA

???
gokernel

(usa Linux Mint)

Enviado em 02/12/2012 - 10:31h

me parece que o erro fica no arquivo ( common.h ) ...


//------------------------------------------------------------------
//
// FILE: common.h
//
// INFO: arquivo atualizado e correto ok ...
//
// APROVEITANDO O ESPAÇO:
//
// Glória e honra ao Rei dos Reis e Senhor dos Senhores, Jesus Cristo ... \o/
//
// Faço parte do Fã Clube deste, pois este realmente merece ...
//
//------------------------------------------------------------------

// ERRO: #ifdef __common_h ... o correto seria assim: #ifndef

#ifndef __common_h
#define __common_h

#include <stdio.h> //For all standard things
#include <stdlib.h> //For malloc
#include <string.h> //For memset
#include <sys/socket.h> //For create a Raw Socket
#include <netinet/ip.h> //Declaration for ip header
#include <netinet/tcp.h> //Declaration for tcp header
#include <netinet/udp.h> //Declaration for udp header
#include <netinet/ip_icmp.h>//Declaration for icmp header
#include <arpa/inet.h> //Declaration for arp header

/*function prototipes*/
extern void print_ip_header(unsigned char*, int);
extern void print_tcp_packet(unsigned char*, int);
extern void print_udp_packet(unsigned char*, int);
extern void print_icmp_packet(unsigned char*, int);
extern void printDatagram(unsigned char*, int);
extern void processPacket(unsigned char*, int);

// NAO PRECISA DECLARAR ISSO: int main();

/*global var declaration*/
extern int sock_raw;
extern int tcp, udp, icmp, igmp, others, total, i, j;
extern FILE *smppslog;
extern struct sockaddr_in source, dest;

#endif /*__common_h*/




OBS: nao consegui identificar o que fica na linha 7 do arquivo ( main.c ) ...

para facilitar a leitura do seu codigo, se possível postar o codigo usando o ( http://www.codepad.org ) pois ficaria mais facil de ler e identificar as linhas no seu codigo ... e lógico enviar o link.



3. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

Renato
renato20

(usa Ubuntu)

Enviado em 01/12/2012 - 13:24h

Post os erros que aparecem ao compilar.


4. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 01/12/2012 - 13:33h

quando inicio um projeto geralmente organizo assim:

crio o header principal e declaro todas a variaveis globais e prototipos neste, exemplo:


// file: global.h

extern int var_int;

extern void funcao_nome (void);



e sempre coloco as variaveis globais no arquivo ( main.c )

entao faço a compilacao assim:

gcc -c arquivo1.c
gcc -c arquivo2.c
gcc -c main.c

gcc -o programa *.o

ou usando o MAKEFILE ...

EDITADI ... EDITADO ...

e lembrando:

se vc declarar uma variavel no arquivo ( global.h ) assim:
--------------------------------
externo int valor;
--------------------------------

no arquivo ( main.c ) tem que ser definido assim:
---------------------------
int valor;
---------------------------

qualquer duvida é só "gritar".



5. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

tatsu
tatsutsuki

(usa Outra)

Enviado em 01/12/2012 - 13:36h

nos outros arquivos onde vc utiliza as variaveis use a declaração extern tipo:

extern int var;
extern struct var;

e assim por diante;






6. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

Enviado em 01/12/2012 - 19:18h

Amigos ja tentei de tudo mais nada deu certo tudo jeito que tento de struturar meu codigo em multiplos arquivos acaba voltando umas 50 mensagens de erro no compilador a hora de compilar vou postar o link do condigo para voces olharem ja que tem umas 325 linhas o que esta funcionando no caso de um arquivo so porem é muito grande para mim postar aqui la vai o link. ok?

http://sourceforge.net/p/smpps/code/ci/0c779c167ca2c4c794a2f367c102cd01827182dd/tree/smpps.c

aproveitem para me dar criticas, soluçoes, e/ou qualquer coisa que me ajude a estruturar este meu codigo que em um arquivo so esta compilando sem nenhum erro porem na hora de desmebrar ele a coisa fica seria.

Obrigado a todos e sei que vão me ajudar :)


7. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 01/12/2012 - 20:00h

faça o que o colega acima falou: postar os erros aqui.


8. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

Enviado em 01/12/2012 - 20:20h

Vou postar os erros que meu compilador volta com o programa dividido em 6 modulos (sendo estes main.c ip_header.c tcp_packet.c udp_packet.c icmp_packet.c print_data.c) mais um arquivo header chamado common.h:

Erros:

root@bt:~/Desktop# gcc -o SMPPS main.c ip_header.c tcp_packet.c udp_packet.c print_data.c
main.c:1:19: error: common.h: No such file or directory
main.c:5: warning: ‘tcp’ initialized and declared ‘extern’
main.c:5: warning: ‘udp’ initialized and declared ‘extern’
main.c:5: warning: ‘icmp’ initialized and declared ‘extern’
main.c:5: warning: ‘igmp’ initialized and declared ‘extern’
main.c:5: warning: ‘others’ initialized and declared ‘extern’
main.c:5: warning: ‘total’ initialized and declared ‘extern’
main.c:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
main.c: In function ‘main’:
main.c:12: error: storage size of ‘saddr’ isn’t known
main.c:13: error: storage size of ‘in’ isn’t known
main.c:14: warning: incompatible implicit declaration of built-in function ‘malloc’
main.c:16: error: ‘smppslog’ undeclared (first use in this function)
main.c:16: error: (Each undeclared identifier is reported only once
main.c:16: error: for each function it appears in.)
main.c:17: error: ‘NULL’ undeclared (first use in this function)
main.c:18: warning: incompatible implicit declaration of built-in function ‘printf’
main.c:24: error: ‘AF_INET’ undeclared (first use in this function)
main.c:24: error: ‘SOCK_RAW’ undeclared (first use in this function)
main.c:24: error: ‘IPPROTO_TCP’ undeclared (first use in this function)
main.c: At top level:
main.c:50: warning: conflicting types for ‘processPacket’
main.c:40: note: previous implicit declaration of ‘processPacket’ was here
main.c: In function ‘processPacket’:
main.c:56: error: dereferencing pointer to incomplete type
main.c:77: warning: incompatible implicit declaration of built-in function ‘printf’
ip_header.c:1:19: error: common.h: No such file or directory
ip_header.c: In function ‘print_ip_header’:
ip_header.c:7: error: dereferencing pointer to incomplete type
ip_header.c:9: warning: incompatible implicit declaration of built-in function ‘memset’
ip_header.c:9: error: ‘source’ undeclared (first use in this function)
ip_header.c:9: error: (Each undeclared identifier is reported only once
ip_header.c:9: error: for each function it appears in.)
ip_header.c:10: error: dereferencing pointer to incomplete type
ip_header.c:12: error: ‘dest’ undeclared (first use in this function)
ip_header.c:13: error: dereferencing pointer to incomplete type
ip_header.c:15: warning: incompatible implicit declaration of built-in function ‘fprintf’
ip_header.c:15: error: ‘smppslog’ undeclared (first use in this function)
ip_header.c:17: error: dereferencing pointer to incomplete type
ip_header.c:18: error: dereferencing pointer to incomplete type
ip_header.c:18: error: dereferencing pointer to incomplete type
ip_header.c:19: error: dereferencing pointer to incomplete type
ip_header.c:20: error: dereferencing pointer to incomplete type
ip_header.c:21: error: dereferencing pointer to incomplete type
ip_header.c:25: error: dereferencing pointer to incomplete type
ip_header.c:26: error: dereferencing pointer to incomplete type
ip_header.c:27: error: dereferencing pointer to incomplete type
tcp_packet.c:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
udp_packet.c:1:19: error: common.h: No such file or directory
udp_packet.c: In function ‘print_udp_packet’:
udp_packet.c:7: error: dereferencing pointer to incomplete type
udp_packet.c:10: warning: incompatible implicit declaration of built-in function ‘fprintf’
udp_packet.c:10: error: ‘smppslog’ undeclared (first use in this function)
udp_packet.c:10: error: (Each undeclared identifier is reported only once
udp_packet.c:10: error: for each function it appears in.)
udp_packet.c:15: error: dereferencing pointer to incomplete type
udp_packet.c:16: error: dereferencing pointer to incomplete type
udp_packet.c:17: error: dereferencing pointer to incomplete type
udp_packet.c:18: error: dereferencing pointer to incomplete type
udp_packet.c:28: error: dereferencing pointer to incomplete type
print_data.c:1:19: error: common.h: No such file or directory
print_data.c: In function ‘printDatagram’:
print_data.c:6: error: ‘i’ undeclared (first use in this function)
print_data.c:6: error: (Each undeclared identifier is reported only once
print_data.c:6: error: for each function it appears in.)
print_data.c:8: warning: incompatible implicit declaration of built-in function ‘fprintf’
print_data.c:8: error: ‘smppslog’ undeclared (first use in this function)
print_data.c:9: error: ‘j’ undeclared (first use in this function)
print_data.c:18: warning: incompatible implicit declaration of built-in function ‘fprintf’


Espero que me ajudem lembrando que o codigo que esta no sourceforge em um arquivo so compila sem nenhum erro


9. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 02/12/2012 - 00:04h

nao vi o codigo de main.c, mas acredito que vc usou include assim:

#include <common.h>

para arquivo na mesma pasta usa-se:

#include "common.h"

e tente compilar somente o main.c

gcc -Wall -c main.c



10. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

Enviado em 02/12/2012 - 08:05h

Bom voce estava certo eu tava declarando errado a include ou seja com <> agora declarei com "" e tentei compilar apenas o main.c mesmo assim volto muitos erros então vou passar a postar os erros novamente e vou postar o conteudo do arquivo common.h e do main.c

Erros apresentados:
root@bt:~/Desktop# gcc -Wall -c main.c
main.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
main.c: In function ‘main’:
main.c:13: error: storage size of ‘saddr’ isn’t known
main.c:14: error: storage size of ‘in’ isn’t known
main.c:15: warning: implicit declaration of function ‘malloc’
main.c:15: warning: incompatible implicit declaration of built-in function ‘malloc’
main.c:17: error: ‘smppslog’ undeclared (first use in this function)
main.c:17: error: (Each undeclared identifier is reported only once
main.c:17: error: for each function it appears in.)
main.c:17: warning: implicit declaration of function ‘fopen’
main.c:18: error: ‘NULL’ undeclared (first use in this function)
main.c:19: warning: implicit declaration of function ‘printf’
main.c:19: warning: incompatible implicit declaration of built-in function ‘printf’
main.c:25: warning: implicit declaration of function ‘socket’
main.c:25: error: ‘AF_INET’ undeclared (first use in this function)
main.c:25: error: ‘SOCK_RAW’ undeclared (first use in this function)
main.c:25: error: ‘IPPROTO_TCP’ undeclared (first use in this function)
main.c:35: warning: implicit declaration of function ‘recvfrom’
main.c:41: warning: implicit declaration of function ‘processPacket’
main.c:44: warning: implicit declaration of function ‘close’
main.c:14: warning: unused variable ‘in’
main.c:13: warning: unused variable ‘saddr’
main.c: At top level:
main.c:51: warning: conflicting types for ‘processPacket’
main.c:41: note: previous implicit declaration of ‘processPacket’ was here
main.c: In function ‘processPacket’:
main.c:57: error: dereferencing pointer to incomplete type
main.c:67: warning: implicit declaration of function ‘print_tcp_packet’
main.c:71: warning: implicit declaration of function ‘print_udp_packet’
main.c:78: warning: incompatible implicit declaration of built-in function ‘printf’


common.h

#ifdef __common_h
#define __common_h

#include<stdio.h> //For all standard things
#include<stdlib.h> //For malloc
#include<string.h> //For memset
#include<sys/socket.h> //For create a Raw Socket
#include<netinet/ip.h> //Declaration for ip header
#include<netinet/tcp.h> //Declaration for tcp header
#include<netinet/udp.h> //Declaration for udp header
#include<netinet/ip_icmp.h>//Declaration for icmp header
#include<arpa/inet.h> //Declaration for arp header

/*function prototipes*/
void print_ip_header(unsigned char*, int);
void print_tcp_packet(unsigned char*, int);
void print_udp_packet(unsigned char*, int);
void print_icmp_packet(unsigned char*, int);
void printDatagram(unsigned char*, int);
void processPacket(unsigned char*, int);
int main();

/*global var declaration*/
extern int sock_raw;
extern int tcp, udp, icmp, igmp, others, total, i, j;
extern FILE *smppslog;
extern struct sockaddr_in source, dest;

#endif /*__common_h*/

main.c

#include "common.h"


/*global var declaration*/
int sock_raw;
int tcp = 0, udp = 0, icmp = 0, igmp = 0, others = 0, total = 0, i, j;
FILE *smppslog;
struct sockaddr_in source, dest;

/*function main*/
int main(){
int saddr_size, data_size;
struct sockaddr saddr;
struct in_addr in;
unsigned char *buffer = (unsigned char *)malloc(65536);//65536 Ports

smppslog=fopen("smpps.txt", "w");
if(smppslog == NULL)
printf("Unable to create the smppslog file, check the permissions.\n");
printf("\n\n\t ##### # # ###### ###### #####\n\t# # ## ## # # # # # #\n\t# # # # # # # # # #\n\t ##### # # # ###### ###### #####\n\t # # # # # #\n\t# # # # # # # #\n\t ##### # # # # #####\n\n");
printf("\t Simple Multi Protocol Packet Sniffer\n\t\t SMPPS v0.9.0 pre-alpha\n\t Development and Programing by\n\t\t Cr4sh_Dump\n\n");
printf("Starting packets capture...\n");

/*create a raw socket that sniffer*/
sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if(sock_raw < 0){
printf("Socket Error on create\n");
return 1;
}


while(1){
saddr_size = sizeof saddr;
/*Receive a packet*/
data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, &saddr_size);
if(data_size < 0){
printf("Recvfrom Error, failed to get packets\n");
return 1;
}
/*Now Process the packet*/
processPacket(buffer, data_size);
}

close(sock_raw);
printf("Process Finished\n");

return 0;
}

/*Process Packet cap function*/
void processPacket(unsigned char* buffer, int size){
/*Get the part IP header of this packet */
struct iphdr *iph = (struct iphdr*)buffer;
++total;

/*Check the protocol and...*/
switch(iph -> protocol){
case 1: //ICMP Protocol
++icmp;
//print_icmp_packet(buffer, size);
break;
case 2: //IGMP Protocol
++igmp;
break;
case 6: //TCP Protocol
++tcp;
print_tcp_packet(buffer, size);
break;
case 17: //UDP Protocol
++udp;
print_udp_packet(buffer, size);
break;
default: //Case other protocol exp: ARP, etc.
++others;
break;
}

printf("TCP : %d UDP : %d ICMP : %d IGMP : %d Others : %d Total : %d\n\n", tcp, udp, icmp, igmp, others, total);
}





Desde já agradeço a ajuda e a paciencia que voces estão me dando Obrigado mesmo.



11. Re: Como dividir um codigo em varios arquivos? [RESOLVIDO]

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

Enviado em 02/12/2012 - 12:08h

Amigo quero le agradecer pois agora sim compilo sem voltat nenhum erro consegui compilar tudo eu tava deixando passar coisas muito simples mais que porém causabam grandes erros de logica le agradeço pela dedicação e gostaria de convidalo a voce e a toda a comunidade a seguirem meu projeto no sourceforge que graças a voces agora tem uma versão Alpha funcional e ainda modulada fiquem no aguardo pela versão 1.0 que vai estar totalmente funcional.

Aclarando o da linha 7 do arquivo main.c e a FILE onde salva os logs da captura dos pacotes. Mais isso não esta mais causando erros e por fim o projeto esta dividido em modulos e compilando sem problemas mais uma vez obrigado a todos e la vai o link do projeto pra quem quizer acompanhar.

http://sourceforge.net/projects/smpps








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts