Autor Tema: Pasar array a una función  (Leído 4756 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Pasar array a una función
« en: 16 de Septiembre de 2006, 12:15:55 »
Hola amigos, estuve buscando a ver si había un tema referente a mi pregunta (espero que no se me haya escapado alguna, habian 3 paginas sobre el tema de arrays).
Tengo un problema, tengo un array unidimensional como argumento de una función, parte del código es este:

Código: C
  1. // funcion
  2. short COMPROBAR_CONEXION(int temp[8]){
  3.         ...
  4.         ...
  5. }
  6. /////////////////////////////////////
  7. // codigo principal
  8. void main(){
  9.         if (COMPROBAR_CONEXION(DIRECTO[8])){
  10.                 ...
  11.                 ...
  12.         }
  13. }

DIRECTO[8] es una array de constantes, al compilar en CCS, me sale el el error:

Subscript out of range

en la linea:

Código: C
  1. if (COMPROBAR_CONEXION(DIRECTO[8])){

segun la ayuda, el tipo de error dice:

"A subscript to a RAM array must be at least 1 and not more than 128 elements.  Note that
large arrays might not fit in a bank. ROM arrays may not occupy more than 256 locations."


pero mi array es de 8 direcciones, ¿hay algo mal en el código?, ¿se pueden pasar arrays a funciónes en este compilador?

salu2

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Pasar array a una función
« Respuesta #1 en: 16 de Septiembre de 2006, 12:32:26 »
Un array no puede ser pasado como parámetro a una función en CCS, y tampoco una constante.

La solución a tu problema pasa por utilizar punteros, y enviar a la función el puntero a la posición de memoria donde está el dato que quieres enviar.

En estos hilos se hablo del tema y puede que te sirvan de ayuda:
http://www.todopic.com.ar/foros/index.php?topic=4815.0
http://www.todopic.com.ar/foros/index.php?topic=5521.0

y no encuentro una explicación magistral que ofreció Diego Redpic pero que anda escondida en alguna parte del foro.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Pasar array a una función
« Respuesta #2 en: 16 de Septiembre de 2006, 13:45:42 »
Si no encuentras solución en lo comentado por Manolo prueba esto:
http://www.ccsinfo.com/forum/viewtopic.php?t=27714&start=105

No estoy seguro si es solo para la versión 4 o también sirve para la 3.249... el tema de los punteros y las constantes estan algo peleados en CCS...

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Pasar array a una función
« Respuesta #3 en: 16 de Septiembre de 2006, 15:38:48 »
Bueno, ya le encontré utilidad a los punteros en este compilador :), he investigado un poco y esto es lo que llevo hasta ahora:

leí en un conocido manual de C en CCS, como manejar los arrays con punteros, lo adapté al código:

Código: C
  1. short COMPROBAR_CONEXION(){
  2.  short bandera;
  3.  int *p,k;
  4.  p=DIRECTO;
  5.  ...
  6.  if(dato[k]==p[k])
  7.  ...
  8.  }

ya declaré a DIRECTO[8] y a dato[8] como constantes, pero en la linea:
Código: C
  1. p=DIRECTO;

pero me sale otro error:

bad expression sintaxis

si coloco los corchetes [8], me sale el error anterior. Voy a seguir investigando, lo que quiero es comprobar 1 array de datos variables con 3 arrays constantes y para no repetir la misma función 3 veces, llamo un array y la meto en esa función.

Salu2
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Pasar array a una función
« Respuesta #4 en: 17 de Septiembre de 2006, 11:29:34 »
Bueno, ya le encontré utilidad a los punteros en este compilador :)

Solo piensa en lo siguiente.  Si le pasas un array de 10 elementos como parámetro a una función, todos esos elementos se copian en la pila porque para la función son "desconocidos".  Entonces, la pila debe cargarse tantas veces como elementos tengas, luego descargarse cuando salgas de la función.

Querer hacer eso, no solo conlleva un gasto innecesario de memoria sino en tiempo que para ciertas aplicaciones puede ser prohibitivo.

Un puntero soluciona todo esto porque solo ocupa lo que ocupa direccionar la memoria ( 2 bytes).

El uso de punteros no solo es una herramienta útil sino en muchos casos una necesidad.

Cuando comiences a conocerlos y a practicar con ellos verás que no es tan difícil y que por otra parte te serán tremendamente útiles.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Pasar array a una función
« Respuesta #5 en: 17 de Septiembre de 2006, 11:41:07 »
Creo que resolví el problema, yo había declarado a DIRECTO así

Código: C
  1. int const DIRECTO[8]={...}

despues se me ocurrió quitar const

Código: C
  1. int DIRECTO[8]={...}

ahí no "chilló" el compilador  :o, me lo compiló sin problemas.

estos son los que probé:

   *(p+k), p[k] incluso probé *p++ y también funcionó

tienen razón, para pasar un array a una función en CCS hay que utilizar punteros. El CCS cuando declara un array de n datos, los agrupa en direcciones de memoria contigua, es decir, si son 8 datos y el primero se guarda en la dirección 0x20, entonces el segundo se guarda en 0x21 y el tercero 0x22..., octavo 0x27, el truco de usar un puntero (yo lo llamo truco ó artimaña) es tratar de tomar la primera dirección del array para despues hacer el recorrido mediante un bucle: p[k]

Hice una simulación de puntero_recorriendo_array para comprobar si el puntero recorría mi campo de direcciones y fino, (bueno eso es lo que entiendo de punteros hasta ahora).

lo que no entiendo es porque el compilador me tira error cuando declaro el array con el const



Desde luego que estas son aproximaciones, haría falta grabar el programa en un pic y montarlo fisicamente para ver los resultados practicos.

Salu2
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything