Autor Tema: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3  (Leído 2352 veces)

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

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Hola gente del foro, me encuentro haciendo gráficos para un LCD de 20x4, ya programé pelotas que rebotan por toda la pantalla, pero ahora quiero poner bloques con los cuales choquen, para lo cuál hice una función que me genera los bloques en la pantalla, previamente definiendo sus coordenadas y su tamaño, pues bien, primero defino mis bloques:

Código: [Seleccionar]
int8 block_1[2][2]= {1,1, // coordenadas
2,2 }; // tamaño
int8 block_2[2][2]= {1,18, // coordenadas
3,3 }; // tamaño

int8 block_3[2][2]= {2,6, // coordenadas
1,1 }; // tamaño

y cuando quiero imprimir un bloque, lo tengo que hacer según la siguiente función:

Código: [Seleccionar]
void print_block(int8 block_number) // Imprime un bloque en la pantalla
{
if(block_number==1)
{
         // trabaja con block_1
}
else if(block_number==2)
{
         // trabaja con block_2
}
else if(block_number==3)
{
         // trabaja con block_3
}
}

Mi pregunta es: alguien sabe una forma de escribir mi función print_block(no. de block) para no tener que poner un if en cada número de bloque, ya que mis bloques se llaman block_1[][], block_2[][] y block_3[][], y me encantaría poder llamarlos genericamente como print_block(1), donde el 1 sería el _1 de block.

O poder definir mis bloques como block(n), para así distinguirlos con una variable??

La cosa es que me gustaría trabajr dentro de mi función asi:

Código: [Seleccionar]
print_block(int8 no_block)
{
     block(no_block)
}

Gracias por adelantado a toda la ayuda que me puedan brindar.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #1 en: 10 de Noviembre de 2011, 19:19:20 »
Porque no lo creas asi:

Código: [Seleccionar]
int8 blocks[3][4] =
{
// cord.  tama.
  {1,1,     2,2},   // bloque 1
  {1,18,    3,3},  // bloque 2
  {2,6,     1,1}   // bloque 3
};

De esta forma, puedes acceder a cualquier de los 3 bloques. En tu ejemplo, harías así:
Código: [Seleccionar]
print_block(int8 no_block)
{
     block( blocks[no_block] );
}

En caso, en tu función, no lo puedas implementar así, creo que habría que hacer cosas con structuras. Exitos.
« Última modificación: 10 de Noviembre de 2011, 19:26:10 por jeremylf »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #2 en: 10 de Noviembre de 2011, 19:26:30 »
Igual tengo un error de concepto con las matrices ahora mismo, pero estás declarando matrices de 2 dimensiones y me da la impresión que solo estás iniciando una, tenia entendido que se iniciaban asó:

int8 block[2][3] = { {1,2,3} , {4,5,6} };

lo digo porque si no estás usando la segunda dimensión (y no estoy equivocandome) podrias iniciar todas tus coordenadas y tamaños en la misma matriz:

int block [3] [4] = { {1,1,2,2} , {1,18,3,3} , {2,6,1,1} };

donde con block [ñ] [y] , en "ñ" tendrias el bloque donde quieres trabajar y en (y = 0/1 coordenadas) (y = 2/3 tamaño)


Un saludo

EDIT, jeje se me adelantó jeremylf
« Última modificación: 10 de Noviembre de 2011, 19:29:47 por tannke »

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #3 en: 10 de Noviembre de 2011, 19:36:43 »
Muchas gracias por responder tán rapido Jeremylf y taanke, sus respuestas me son muy útiles.

Jeremylf, tienes razón! lo puedo hacer de la forma que tu comentas, lo más seguro es que lo haga de esa forma.

taanke, no comprendo por qué dices que inicilializo inadecuadamente, por que si tengo una matriz de 2x2, entonces debo inicializar 4 valores, cosa que si estoy haciendo, además así como lo tengo, mi programa está corriendo bien, y es que no es necesario poner entre corchetes cada fila de valores, también se pueden poner de corrido con comas.

De nuevo gracias por su tiempo muchachos!
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #4 en: 10 de Noviembre de 2011, 19:43:09 »
 :oops: jeje, ya andaba yo con la mosca detrás de la oreja y por eso dije lo del error de concepto. Entonces perfecto, una cosa que no sabía y ya se. Un saludo.

por otro lado, y con una matriz de 3 dimensiones??
« Última modificación: 10 de Noviembre de 2011, 19:52:18 por tannke »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #5 en: 10 de Noviembre de 2011, 19:46:20 »
O utilizando punteros, eso si, si es en CCS, punteros a constantes no se puede. Digo, porque en el caso de ser valores que nunca cambian, para que tenerlos en la RAM  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #6 en: 10 de Noviembre de 2011, 19:57:32 »
:oops: jeje, ya andaba yo con la mosca detrás de la oreja y por eso dije lo del error de concepto. Entonces perfecto, una cosa que no sabía y ya se. Un saludo.

por otro lado, y con una matriz de 3 dimensiones??

No hay problema, si quieres una de 3 dimensiones, la declaras de igual forma, teóricamente, el C no tiene límites en las dimensiones de tus matrices, claro que en la práctica, el límite te lo da la memoria de tu micro.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #7 en: 10 de Noviembre de 2011, 19:59:23 »
O utilizando punteros, eso si, si es en CCS, punteros a constantes no se puede. Digo, porque en el caso de ser valores que nunca cambian, para que tenerlos en la RAM  :mrgreen:

Gracias por tu respuesta Suky, también podría ser, solo que la verdad en este momento no me imagino que técnica se puede utilizar para realizarlo por punteros, me podrías dar un ejemplo por favor?
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #8 en: 11 de Noviembre de 2011, 12:01:48 »
:oops: jeje, ya andaba yo con la mosca detrás de la oreja y por eso dije lo del error de concepto. Entonces perfecto, una cosa que no sabía y ya se. Un saludo.

por otro lado, y con una matriz de 3 dimensiones??

No hay problema, si quieres una de 3 dimensiones, la declaras de igual forma, teóricamente, el C no tiene límites en las dimensiones de tus matrices, claro que en la práctica, el límite te lo da la memoria de tu micro.

Srry, me expresé mal, a lo que me refería era con lo de las 3 dimensiones era para aplicarlo en tu codigo, utilizar "la 1ª para indicar el bloque" y las otras "2" como las estabas usando hasta ahora.

Un saludo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Función genérica para usar variables con el mismo nombre ejem: n_1, n_2, n_3
« Respuesta #9 en: 11 de Noviembre de 2011, 12:39:43 »
A ver. algo rápido:

Código: C
  1. typedef struct{
  2.      char a;
  3.      char b;
  4.      char x;
  5.      char y;
  6. }VAL_BLOCK;
  7.  
  8.  
  9. VAL_BLOCK Blocks[10]={{1,1,2,2},{1,18,3,3},{2,5,1,1}};
  10.  
  11. print_block(VAL_BLOCK *Data){
  12.  
  13.      posicionX=Data->x;
  14.      //  .....
  15. }
  16.  
  17.  
  18. for(k=0;k<10;k++){
  19.      print_block(&Blocks[k]);
  20. }


Saludos!
No contesto mensajes privados, las consultas en el foro