Autor Tema: funcion que llama a subfuncion  (Leído 2793 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
funcion que llama a subfuncion
« en: 05 de Marzo de 2005, 11:39:00 »
hola, estoy intentando hacer esto:
esto está en la libreria:
void gclcd_SelectFont(char data)
{
   gclcdFontData       = data;
   gclcdFontWidth      = gclcdFontData[2];
   gclcdFontHeight     = gclcdFontData[3];
   gclcdFontBitsPixel  = gclcdFontData[4];
   gclcdFontFirstChar  = gclcdFontData[5];
   gclcdFontLastChar   = gclcdFontData[6];
}
esto en el main:
gclcd_SelectFont(f6x8);

lo que intento hacer es, en el main se pasa la configuración del tipo de fuente a usar, en este caso f6x8 ... y esto corresponde a este vector:
static const unsigned int8 f6x8 []={0x01, 0x76, 0x08, 0x08, 0x01, 0x20, 0x7A, 0x01, 0x00, 0x00..................... etc etc}
al pasarle f6x8 a la funcion SelecFont esta asigna a FontWidth, y aquí es donde falla, el valor de la variable FontData, que debe ser f6x8, quedando algo así:
gclcdFontData       = f6x8;
gclcdFontWidth      = f6x8[2];
gclcdFontHeight     = f6x8[3];
...
..
.
o eso es lo que pretendo que quede, la cosa esq me da error en la compilación, me dice (subrayando el 2) que el indentificador anterior debe ser un puntero...
el problema se soluciona poniendo lo que en teoria pretendo que salga, es decir:
gclcdFontData       = f6x8;
gclcdFontWidth      = f6x8[2];
gclcdFontHeight     = f6x8[3];
...
..
.
y de esta forma se compila bien... la pregunta es, como debo hacer para que gclcdFontData se sustituya por f6x8

Gracias! Sonrisa

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: funcion que llama a subfuncion
« Respuesta #1 en: 05 de Marzo de 2005, 13:26:00 »
Usa punteros,no se puede pasar un array como parámetro a un procedimiento si no lo haces con un puntero.

Declara f6x8 como puntero a array:

const char *f6x8[10] = ....... // Especifica la dimensión ó seguramente dé error

La llamada a la función con tu punterito:

gclcd_SelectFont(f6x8); // Aquí no se pone el asterisco

Y en la función...
para asignar un array a otro se me ocurren dos formas:
- Una es implementando otra función a la que le mandes sendos punteros a array,y en la cual vayas asignando elemento por elemento:

void copia_array(char *array1,*array2)
{
  int j;
  for( j=0; j<LONGITUD_ARRAY; j++)
  {
  array2[j] = array1[j];
  }
}

- La otra podría ser definiendo el array destino también como puntero
 e igualándolos en la función:

void gclcd_SelectFont(char *data)
{
gclcdFontData = data;   // gclcdFontData debe estar declarado tb  
// como puntero.Aún así posiblemente de error,aunque no debería.
// El resto puedes dejarlo igual,siempre y cuando hayas conseguido asignar
// los arrays...
gclcdFontWidth = gclcdFontData[2];
gclcdFontHeight = gclcdFontData[3];
gclcdFontBitsPixel = gclcdFontData[4];
gclcdFontFirstChar = gclcdFontData[5];
gclcdFontLastChar = gclcdFontData[6];
}

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: funcion que llama a subfuncion
« Respuesta #2 en: 05 de Marzo de 2005, 15:25:00 »
Hola Modulay, la respuesta esta bien, menos una cosilla...

"Declara f6x8 como puntero a array". Hay que declararlo como un vector normal (asi como lo pone J1M). Al pasarle a la funcion:

gclcd_SelectFont(f6x8);

como bien dices, lo que le estas pasando es un puntero, que apunta al comienzo del vector. De este modo en la funcion llamada, declaramos un puntero al cual se le asigna la direccion pasada (osea apunta tb al primer elemento de f6x8).

Ahora como tb dices, pues copia ese puntero en otro puntero (gclcdFontData) que usa la libreria, y ya va accediendo a los elementos de gclcdFontData
  • que son los mismos que los de f6x8, ya que ambos estan en la misma direccion de memoria.

    J1M, para pasar la direccion de un vector bien puedes usar literalmente el operador "direccion" ( & ) y poner:

    gclcd_SelectFont( &f6x8[0] ); // indicando que pasa la direccion del elemento 0

    o simplemente poner:

    gclcd_SelectFont( f6x8 ); // ya que el nombre del vector en C lo trata como un puntero al primer elemento del vector.

    Un saludo.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #3 en: 06 de Marzo de 2005, 06:35:00 »
gracias a los 2 Sonrisa voy a probar las 2 formas que me habeis dicho

gracias!! Giño

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: funcion que llama a subfuncion
« Respuesta #4 en: 06 de Marzo de 2005, 12:10:00 »
Damago lleva toda la razón,J1M.
C toma la dirección del elemento inicial como parámetro a la hora de pasar un array a un procedimiento.
Después de simularlo todo en MPLAB 7.0,cuando me ha dejado,pq con bastante frecuencia hace lo que le da la ganaloco ,parece impepinable que la forma de hacerlo es tal y como te hemos comentado.
Para volcar un vector sobre el otro,el segundo,sea declarado en la función ó donde lo tengas,que sea de tipo puntero y le asignas directamente el parámetro entrante de la función:

gclcdFontData = data

¿Alguien tiene buenas referencias sobre el MPLAB SIM? porque a mi no hizo más que darme tormento

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #5 en: 10 de Marzo de 2005, 11:30:00 »
Sigo con problemas con los dichosos punteros, a ver que no me aclaro pq me da este error:

static unsigned int8 COLOR_RED[] = {0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F};

void gclcd_const(unsigned int8 *buffer, unsigned int8 count)
{
   unsigned int8 i;
   for (i=0;i<count;i++)
   {
      gclcd_data(buffer);
   }
}

gclcd_const(COLOR_RED, sizeof COLOR_RED);

si hago eso, no hay ningun problema, todo perfecto... pero si pongo esto:

static const unsigned int8 COLOR_RED[] = {0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F};

ya la hemos liado, me dice que estoy intentando crear un puntero a una constante, pero joerrrr!! si es lo q necesito! y lo necesito puesto q en este caso el vector color_red son solo 8bytes, pero tengo un caso de un vector de 19600 bytes, q si NO lo pongo como "const" me dice que la memoria ROM se ha llenado.

Es decir, necesito que ese vector esté constante en la memoria ROM del pic, pero puede que haya varios constante, y elegir cual pasar, por eso he creado la funcion gclcd_const.... entendeis el lio?? pq yo no! :S

Gracias y saludos!!

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: funcion que llama a subfuncion
« Respuesta #6 en: 10 de Marzo de 2005, 16:01:00 »
Hola J1M, no se si he entendio bien el problema....el error es al pasar el puntero a la funcion? o al crear ese vector?

Si es el pasar el puntero, prueba a hacer un cast en la llamada de la funcion para pasar un puntero de la misma clase que el k tienes definido en la funcion (recuerda que en la funcion es "unsigned int *"  y el pasado a la funcion es "const unsigned int*":

static const unsigned int8 COLOR_RED[] = {0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F};

void gclcd_const(unsigned int8 *buffer, unsigned int8 count)
{
unsigned int8 i;
for (i=0;i<count;i++)
{
gclcd_data(buffer);
}
}

gclcd_const((unsigned int8 *)COLOR_RED, sizeof COLOR_RED);


Un saludo.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #7 en: 10 de Marzo de 2005, 16:29:00 »
AvergonzadoAvergonzadoAvergonzado si creo q llevas razon jejeje, lo q no sabia esq el puntero debia ser tb const... :P el problema esq... esto ocupará entonces mas memoria??? mañana lo pruebo i os cuento a ver q tal...

Muchas GRacias damago! Sonrisa

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: funcion que llama a subfuncion
« Respuesta #8 en: 10 de Marzo de 2005, 21:14:00 »
Hola J1M, no se qué compilador C estas usando, pero por las dudas recuerda que en CCS no se pueden definir punteros a constantes de cadena, o en otras palabras no hay punteros para memoria de programa (donde se almacenan las constantes), una gran falencia del CCS que espero pronto esten cambiando.
Si este es tu problema intenta con otro compilador o resuelve esto de otra manera.
Te dejo aqui una caracteristica especial del CCS que quizas te ayude:

Una función que tiene un parámetro de tipo char aceptará una constante de cadena. El compilador generará un bucle que llama a la función una vez para cada carácter de la cadena.

Ejemplo:
void lcd_putc(char c ) {
// definición de la función
...
}
lcd_putc ("Máquina parada".);

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #9 en: 11 de Marzo de 2005, 05:50:00 »
puesss nada, no doy con la solución :S .... y es una putaaada q ccs no permita hacer esto!!!, voy a mandar un correo a los de ccs a ver q me dicen...

Gracias y en cuanto de con el resultado lo pongo x aki

Salu2!

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #10 en: 16 de Marzo de 2005, 10:30:00 »
bueeeno parece que ya tengo algo.. aunq aun no funciona del todo... esta es la solucion q me dieron los de CCS

main.c
gclcd_img(1,1,foto1);

libreria.h
void gclcd_img(unsigned int8 x, unsigned int8 y, unsigned int8 imagen)
{
   unsigned int16 IMGENDX, IMGENDY, imgrom, i;
   unsigned char img[];

   imgrom = label_address(imagen);
   img = read_program_memory(imgrom);

   gclcd_setarea(x,IMGENDX-1+x,y,IMGENDY-1+y);

   gclcd_cmd(MEMWRITE);
   for(i=0; i<(IMGENDX*IMGENDY); i++)
   {
        gclcd_data(img);
   }
}

array.c
STATIC CONST UNSIGNED CHAR foto1 []={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF...........};

Lo que intento hacer... pq no funciona! ... es pasarle a la funcion gclcd_img el nombre de la etiketa del array a mandar a la pantalla...

sabeis como??

gracias!! Sonrisa

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: funcion que llama a subfuncion
« Respuesta #11 en: 19 de Marzo de 2005, 05:46:00 »
probastes a guardar las imagenes en posiciones conocidas de la flash para poder acceder a ellas por la direccion??Idea
tengo muchas ganas de probar esa pantalla... aver si temino la movida que tengo entre manos.. de ahi que aparezca poco por aqui.

saludos a todosVacilando

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: funcion que llama a subfuncion
« Respuesta #12 en: 19 de Marzo de 2005, 06:52:00 »
sip, ahora mismo lo estoy haciendo con una eeprom... calculé que con una de 512 entraban unas 15 imagenes de 130x130 a 64k colores... el problema esq no son 512kB .. sino 512kb .. por lo q la cosa se reduce a casi 2 xDDDD, en el mercado la mas grande es de 1024kb es de atmel, y es jodio encontrarla, y para 4 imagenes realmente no merece la pena... asiq... el siguiente paso creo q es ir a por una MMC ... el problema esq usa el mismo bus que la pantalla SPI ... asiq creo q va a tocar implementarlo a mano para no tener conflictos...

saludos!!


 

anything