# Problema programacion C



## xxxasdfxxx (Feb 2, 2010)

Hola.
Estoy utilizando un software llamado "mikroC" que me permite programar un pic en Lenguaje C, pero al compilar el codigo me da un error. He intentado programar de dos formas distintas pero en de ambas formas me da error, alguien podria ayudarme???

La estructura del codigo es la siguiente:
lo que pretendo es configurar distintos parametros en el "main" y tras esto que entre en un bucle infinito en donde primero se ejecuta la funcion "func_desactivar" y despues "func_activar", y cuando esta finaliza que vuelva a ejecutarse "func_desactivar"


/***********************************************/
void main()
{
//codigo
//codigo
func_desactivar();
}

void func_desactivar(){
//codigo
func_activar();
} 

void func_activar(){  
//codigo
func_desactivar();
}

/**************************************************/

LA OTRA FORMA EN QUE LO HE INTENTADO ES ESTA

/*************************************************/

void main()
{
//codigo

desactivar:
func_desactivar();

activar:
func_activar();
}

void func_desactivar(){
//codigo
goto activar;
} 

void func_activar(){  
//codigo
goto desactivar;
}

/*****************************************/

que alguien me ayude, necesito programar esta estructura y el compilador no hace mas que darme un error......


----------



## tecnogirl (Feb 2, 2010)

Transcribe el mensaje de error que te dá el compilador.... Salu2


----------



## elbrujo (Feb 2, 2010)

Que codigo estas escribiendo y que error te da, sino eso.. poco se puede aportar..


----------



## cosmefulanito04 (Feb 2, 2010)

Proba esto:


```
void main()
{
  ...
  while(1)
     {
      func_desactivar();
      func_activar();
     }
}
```


----------



## Dr. Zoidberg (Feb 2, 2010)

xxxasdfxxx dijo:


> /***********************************************/
> void main()
> {
> //codigo
> ...



Eso que has hecho es un DESASTRE. Es una invocación recursiva infinita de las funciones activar() y desactivar() y el error probablemente sea del tipo "Stack Overflow" o algo por el estilo.



xxxasdfxxx dijo:


> /**************************************************/
> 
> LA OTRA FORMA EN QUE LO HE INTENTADO ES ESTA
> 
> ...



Y esta otra es poco menos que ESPANTOSA. Estás tratando de saltar (goto) entre espacios de código diferentes con diferentes stacks.

Te recomiendo que hagas lo que dice cosmefulanito y que tomes un libro de C y estudies, por que a juzgar por lo que has hecho, no tenés NI IDEA de un lenguaje de alto nivel.


----------



## Eduardo (Feb 2, 2010)

xxxasdfxxx dijo:


> ...que alguien me ayude, necesito programar esta estructura y el compilador no hace mas que darme un error......


Seguramente el mensaje de error dice algo asi:
ERR 731: Programmer error. Read a good C language book and try again


Tal como te dijo EZavalla estas asesinando el stack.

Si queres programar una estructura de ese tipo tenes que hacerlo dentro de la misma rutina usando goto (perdon Dijkstra ) 


/******************/
void main()
{
//codigo
//codigo
goto func_desactivar;


func_desactivar:
//codigo
goto func_activar;


func_activar:
//codigo
goto func_desactivar;

}


----------



## iDan (Feb 2, 2010)

Amigo xxxasdfxxx


Hablas que programas en MikroC verdad?? bueno vamos a ver tus estructuras:



```
/***********************************************/
void main()
{
//codigo
//codigo
func_desactivar();
}

void func_desactivar(){
//codigo
func_activar();
}

void func_activar(){
//codigo
func_desactivar();
}

/**************************************************/

LA OTRA FORMA EN QUE LO HE INTENTADO ES ESTA

/*************************************************/

void main()
{
//codigo

desactivar:
func_desactivar();

activar:
func_activar();
}

void func_desactivar(){
//codigo
goto activar;
}

void func_activar(){
//codigo
goto desactivar;
}

/*****************************************/

que alguien me ayude, necesito programar esta estructura y el compilador no hace mas que darme un error......
```

1er Error: Hacer las subrrutinas despues del programa principal:


```
void main
{
//
cualquiera();
}
void cualquiera();
{
//
}
```

MikroC no deja hacer esto al realizar tu programa, recomendacion... realizar primero las subrrutinas y luego llamarlas:


```
void cualquiera();
{
//
}
void main
{
//
cualquiera();
}
```

2do Error: Tratar de llamar una subrrutina dentro de una subrrutina, te puedes ahorrar un while(1){} al momento de realizarlo asi pero... no lo permite el compilador y si fuera posible no seria muy eficiente en programas grandes, recomendacion... aprender mas funciones, ciclos, etc. de Lenguaje C; ejemplo:



```
void prender()
{
//
}
void apagar()
{
//
}
void main()
{
//
[B]while(1)[/B]
[B]{[/B]
prender();
apagar();
[B]}[/B]
}
```

aqui te dejo tu escritura solo que en una adecuada estructura:


```
/*Programa on & off de un LED mediante subrrutinas*/

void func_desactivar()
{
PORTC=0;
delay_ms(1000);
}
void func_activar()
{
PORTC=1;
delay_ms(1000);
}
void main()
{
ANSEL=0;
CMCON0=7;
TRISC=0;
while(1)
{
activar();
desactivar();
}
}
```

acortando el programa con la misma funcion:


```
/*Programa on & off de un LED*/

void main()
{
ANSEL=0;
CMCON0=7;
TRISC=0;
while(1)
{
PORTC=1;
delay_ms(1000);
PORTC=0;
delay_ms(1000);
}
}
```


Espero que haya quedado clara la idea...


Saludos


----------



## elbrujo (Feb 2, 2010)

A claro esta en un loop eterno...


----------



## cosmefulanito04 (Feb 2, 2010)

> MikroC no deja hacer esto al realizar tu programa, recomendacion... realizar primero las subrrutinas y luego llamarlas:



No se como con ese IDE, pero en C para realizar eso tenes que hacer esto:


```
...
void mi_funcion();

void main()
{
...
}

void mi_funcion()
{
...
}
```

Sino se pone la subrutina antes del main como dijiste.

Y sobre el uso de *Goto* en C, no es una buena idea, C es un lenguaje estructurado y pensado para evitar justamente el uso de Goto.


----------



## iDan (Feb 2, 2010)

En MikroC para realizar escritura o una funcion de Assembler hay que realizar una *"asm Declaration"* (ver en Ayuda de MikroC) la cual su estructura seria la siguiente:


asm {
  block of assembly instructions
}


Ejemplo:

unsigned myvar;
void main() {
  asm {
    MOVLW 10  // just a test
    MOVLW test_main_global_myvar_1
  }
}


----------



## Dr. Zoidberg (Feb 2, 2010)

iDan dijo:


> En MikroC para realizar escritura o una funcion de Assembler hay que realizar una *"asm Declaration"* (ver en Ayuda de MikroC) la cual su estructura seria la siguiente:
> asm {
> block of assembly instructions
> }
> ...



Y que tiene que ver tu respuesta con la consulta original?


----------



## iDan (Feb 2, 2010)

Aclarando el uso de Assembler dentro del compilador MikroC, en mi primer respuesta escribí lo relacionado escencialmente en este tema...


----------



## xxxasdfxxx (Feb 2, 2010)

mu*chi*simas gracias a todos, ya consegui solucionar el problema.
mu*cha*s mu*cha*s gracias.

son los mejores!!!!


----------



## striker2487 (Jun 6, 2012)

yo tengo un problema ................... me sale que la ram ya esta llena como hago o que instruccion uso para usar toda la memoria ram del pic 16f877a



tengo un problema estoy haciendo una chapa electrica con el pic 16f877a y me sale en el compiladfor que la memoria ram esta llena ................. yo se que en total son 8k de ram  divididos en 2k por pag ..................ahora que instruccion uso para usar el total de la memoria ........ ayuda porfis


----------



## Chico3001 (Jun 6, 2012)

No puedes.... eso lo determina el compilador a la hora de compilar el programa

Lo unico que puedes hacer es eliminar o reusar variables, o declararlas como locales en vez de globales... o reducir el tipo.. si usas int, declaralas como char... obvio eso reducira el rango de almacenamiento de la variable.. asi que hazlo con cuidado..


----------

