Leudassdf Posted February 13, 2014 at 05:06 PM Report #545164 Posted February 13, 2014 at 05:06 PM (edited) Boas pessoal, De forma a ilustrar um problema que tenho com funcoes criei 4 ficheiros. main.c,funcoes.h,menu_Principal.h,Redes.h No main: #include <stdio.h> #include <stdlib.h> #include "funcoes.h" int main() { criar_rede(); return 0; } Funcoes: #ifndef FUNCOES_H_INCLUDED #define FUNCOES_H_INCLUDED #include "Redes.h" #include "menu_Principal.h" void criar_rede(); void menu_Inicial(char); #endif // FUNCOES_H_INCLUDED Redes: #ifndef REDES_H_INCLUDED #define REDES_H_INCLUDED #include "funcoes.h" void criar_rede(){ printf("rede\n"); menu_Inicial('1'); } #endif // REDES_H_INCLUDED Menu_Principal: #ifndef MENU_PRINCIPAL_H_INCLUDED #define MENU_PRINCIPAL_H_INCLUDED #include "funcoes.h" void menu_Inicial(char irparaopcao){ printf("menu\n"); criar_rede(); } #endif // MENU_PRINCIPAL_H_INCLUDED Os warmings que me aparecem sao: warning: implicit declaration of function 'menu_Inicial' warning: conflicting types for 'menu_Inicial' Redes.h|6|note: previous implicit declaration of 'menu_Inicial' was here| Já perdi algumas horas a tentar descobrir qual o problema mas sem exito. será que alguem me pode ajudar? Cumprimentos Leandro Rodrigues Edited February 13, 2014 at 06:02 PM by Leudassdf
Flinger Posted February 13, 2014 at 05:36 PM Report #545173 Posted February 13, 2014 at 05:36 PM Corrige lá isso. Tens as tags mal pelo que te falhou aí alguma coisa. Uma foi o funcoes.h
Leudassdf Posted February 13, 2014 at 05:39 PM Author Report #545175 Posted February 13, 2014 at 05:39 PM Bem pelas tentativas que fui fazendo apercebi-me que o ficheiro funcoes.h são desnecessários. É necessario declarar um prototipo da funçao em todos os headers. Eu pensei que colocando os prototipos no ficheiro já nao necessitaria de declarar em cada um dos headers os prototipos mas pelos vistos tenho. ou seja a funcao.h não tem utilidade nenhuma. Se alguem souber agradecia uma explicação mais profunda sobre este tema. Corrige lá isso. Tens as tags mal pelo que te falhou aí alguma coisa. Uma foi o funcoes.h Como assim? não percebi
Flinger Posted February 13, 2014 at 05:47 PM Report #545178 Posted February 13, 2014 at 05:47 PM (edited) Se olhares para o teu post, vês que não colocaste o código todo correctamente. #include <stdio.h> #include <stdlib.h> #include "funcoes.h" int main() { criar_rede(); return 0; } [/code=c] Funcoes:<!--NoParse6--> Redes:[code=c] #ifndef REDES_H_INCLUDED #define REDES_H_INCLUDED #include "funcoes.h" void criar_rede(){ printf("rede\n"); menu_Inicial('1'); } #endif // REDES_H_INCLUDED PS: Além disso tens aí uma salgalhada fenomenal. Então dentro da criar_rede() chamas a menu_Inicial('1'); e dentro da menu_Inicial chamas a criar_rede??? não achas que isso vai entrar em cíclo infinito? Edited February 13, 2014 at 05:51 PM by Flinger
Leudassdf Posted February 13, 2014 at 06:01 PM Author Report #545181 Posted February 13, 2014 at 06:01 PM PS: Além disso tens aí uma salgalhada fenomenal. Então dentro da criar_rede() chamas a menu_Inicial('1'); e dentro da menu_Inicial chamas a criar_rede??? não achas que isso vai entrar em cíclo infinito? sim o objetivo é mesmo entrar em ciclo infinito. isto é so para testes do warming.
Flinger Posted February 13, 2014 at 06:16 PM Report #545187 Posted February 13, 2014 at 06:16 PM (edited) Estás a usar um redes.h e um menuprincipal.h com os headers das funções? Se sim o problema é esse. Defines 2 vezes cada header, dá conflito. Esquece... Porque é que estás a declarar funções dentro de ficheiros .h??? Os .h só devem ter os headers, não o código... Edited February 13, 2014 at 06:18 PM by Flinger
Flinger Posted February 13, 2014 at 06:28 PM Report #545190 Posted February 13, 2014 at 06:28 PM (edited) fica aqui a solução: main.c: #include "redes.h" int main() { criar_rede(); return 0; } redes.c: #include <stdio.h> #include "redes.h" #include "menu.h" void criar_rede(){ printf("rede\n"); menu_Inicial('1'); } redes.h: #ifndef REDES_H_ #define REDES_H_ void criar_rede(); #endif /* REDES_H_ */ menu.c #include <stdio.h> #include "menu.h" #include "redes.h" void menu_Inicial(char irparaopcao){ printf("menu\n"); criar_rede(); } menu.h: #ifndef MENU_H_ #define MENU_H_ void menu_Inicial(char irparaopcao); #endif /* MENU_H_ */ EDIT: isto é o mais tradicional... podes sempre juntar os 2 .h num só ficheiro e incluí-lo em todos os .c. Edited February 13, 2014 at 06:32 PM by Flinger
HappyHippyHippo Posted February 13, 2014 at 09:54 PM Report #545208 Posted February 13, 2014 at 09:54 PM isso continua com um ciclo infinito de chamada de funções ... mas no entanto acho que esse problema só se resolve quando ficar claro qual o intuito do código ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 13, 2014 at 11:37 PM Author Report #545216 Posted February 13, 2014 at 11:37 PM isso continua com um ciclo infinito de chamada de funções ... mas no entanto acho que esse problema só se resolve quando ficar claro qual o intuito do código ... O problema nao e o ciclo infinito. Este codigo é so uma exemplificação do problema que eu tenho uma vez que o codigo do projeto está muito extenso.... Basicamente o utilizador mediante a escolha de uma opcao, executa uma funcao que se encontra noutro ficheiro .c, por sua vez essa funcao tambem pode chamar essa mesma funcao que o chamou. isto nao dá ciclo infinito porque é o utilizador que controla os inputs. O problema nao e o ciclo infinito. Este codigo é so uma exemplificação do problema que eu tenho uma vez que o codigo do projeto está muito extenso.... Basicamente o utilizador mediante a escolha de uma opcao, executa uma funcao que se encontra noutro ficheiro .c, por sua vez essa funcao tambem pode chamar essa mesma funcao que o chamou. isto nao dá ciclo infinito porque é o utilizador que controla os inputs. Neste exemplo efetivamente é gerado um ciclo infinito. Mas quando faço as verificaçoes ja não.
Leudassdf Posted February 13, 2014 at 11:55 PM Author Report #545219 Posted February 13, 2014 at 11:55 PM EDIT: isto é o mais tradicional... podes sempre juntar os 2 .h num só ficheiro e incluí-lo em todos os .c. Certo. Era isto que eu queria. So que em vez de usar o menu.h, redes.h usava tudo num unico ficheiro .h. Já fiz isso e deu tudo bem. O meu problema estava no facto de eu incluir os ficheiros .h no cabeçalho não? já para não falar do codigo que estava nos .h em vez de nos .c. FOi uma distração minha. Agora ja percebi como se faz no entanto se alguem me souber explicar como é que sem eu indicar onde se encontra a funcao, como é que ele a vai "ligar" a funcao que está no ficheiro redes.c ou no menu.c? #ifndef MENU_H_ #define MENU_H_ void menu_Inicial(char irparaopcao); #endif /* MENU_H_ */ ou seja como é que o compilador vai saber que o void menu_inicial(char irparaopcao); está no ficheiro menu.c?
HappyHippyHippo Posted February 14, 2014 at 05:12 AM Report #545232 Posted February 14, 2014 at 05:12 AM o compilador trabalha somente com um único ficheiro .c ao ler as alusões às funções, assume que esta existe é trabalho do linker juntar tudo (os .o) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 16, 2014 at 09:23 PM Author Report #545503 Posted February 16, 2014 at 09:23 PM (edited) o compilador trabalha somente com um único ficheiro .c ao ler as alusões às funções, assume que esta existe é trabalho do linker juntar tudo (os .o) Agora percebo. realmente não sabia que o compilador trabalhava apenas com um ficheiro. Obrigado pelo explicação. SO mais uma pergunta. Se eu tiver uma variavel declarada quando é que ela é libertada da memória? depois de chegar ao fim do bloco de codigo em que está inserida, ex void teste(){char opcao='a';printf("%c",opcao);}, a avarivél é destruida depois de fazer o printf? ou só quando o programa termina mesmo? Edited February 16, 2014 at 09:26 PM by Leudassdf
HappyHippyHippo Posted February 16, 2014 at 09:49 PM Report #545508 Posted February 16, 2014 at 09:49 PM (edited) Se eu tiver uma variavel declarada quando é que ela é libertada da memória? a resposta é simples : depende a uma questão destas, o melhor é apresentar exemplos: int global_i1; // todas as variáveis globais serão "libertadas" no fim de execução da aplicação static int global_i2; // todas as variáveis globais serão "libertadas" no fim de execução da aplicação void func(int param) { // todas as variáveis declaradas localmente na função serão libertadas no retorno da função, excepto ... int local_i1; // todas as variáveis declaradas localmente na função serão libertadas no retorno da função, excepto ... static int local_i2; // aqui está a excepção ... variáveis estáticas são libertadas no final da execução da aplicação } Edited February 16, 2014 at 09:49 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 17, 2014 at 05:39 PM Author Report #545579 Posted February 17, 2014 at 05:39 PM a resposta é simples : depende a uma questão destas, o melhor é apresentar exemplos: int global_i1; // todas as variáveis globais serão "libertadas" no fim de execução da aplicação static int global_i2; // todas as variáveis globais serão "libertadas" no fim de execução da aplicação void func(int param) { // todas as variáveis declaradas localmente na função serão libertadas no retorno da função, excepto ... int local_i1; // todas as variáveis declaradas localmente na função serão libertadas no retorno da função, excepto ... static int local_i2; // aqui está a excepção ... variáveis estáticas são libertadas no final da execução da aplicação } Obrigado mais uma vez. Pois esta era uma duvida que eu me colocava. as variaveis globais ja sabia que so eram libertadas no final da execução do programa. agora as static é que não estava a espera. para falar a verdade ainda não as usei... As variaveis globais dizem que deve-se evitar. Porque? Eu posso aceder num programa c a um bloco de memória ram através do numero? ou seja eu num programa declaro uma variavel int teste=0; suponhamos que temos um ciclo infinito e que esta varivel está declarada em global. Se o endereço daquela variavel na memoria for a 111987 eu com outro programa em c consigo saber os dados que estao naquele endereço?
HappyHippyHippo Posted February 17, 2014 at 06:03 PM Report #545585 Posted February 17, 2014 at 06:03 PM As variaveis globais dizem que deve-se evitar. Porque? por várias razões : http://c2.com/cgi/wiki?GlobalVariablesAreBad Eu posso aceder num programa c a um bloco de memória ram através do numero? não. ser global não quer dizer que seja global em termos do sistema mas sim da aplicação IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now