Jump to content

Problema com funcoes


Recommended Posts

Posted (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 by Leudassdf
Posted

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

Posted (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 by Flinger
Posted

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.

Posted (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 by Flinger
Posted (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 by Flinger
Posted

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.

Posted

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?

Posted (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 by Leudassdf
Posted (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 by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

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?

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.