Autor Tema: Array multidimensional CCS  (Leído 16904 veces)

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

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Array multidimensional CCS
« en: 09 de Febrero de 2010, 17:38:45 »
Hola compañeros:

Ultimamente no sé que me pasa que empiezo a odiar el CCS en tema de punteros...alguien sabe como se podría solucionar el sigiuente programa que lo único que hace es intentar guardar la columna de una matriz...el código es cortito y fácilmente entendible  ;-)

La variable bit_pict, si lo debugeamos saca en el bucle for 1000000 cuando debería de ser 1111111... :5]

Código: [Seleccionar]
#include <18F24K20.h>
#fuses HS, H4, NOWDT, NOPROTECT, NOLVP
#use delay(clock=48M)

static int1 smille[7][10]={
(1,1,1,1,1,1,1,1,1,1),
(1,1,0,0,1,1,0,0,1,1),
(1,1,0,0,1,1,0,0,1,1),
(1,1,1,1,1,1,1,1,1,1),
(1,0,1,1,1,1,1,1,0,1),
(1,1,0,0,0,0,0,0,1,1),
(1,1,1,1,1,1,1,1,1,1)
};

int getColPicture(int1 picture[7][10], int col);

void main(void) {
int t;

   setup_oscillator(OSC_64MHZ);
   delay_ms(100);

t=getColPicture(smille,0);
}

int getColPicture(int1 picture[7][10], int col)
{
int i;
int col_data=0;
int1 bit_pict;
//int bit_pict;

for(i=0;i<7;i++)
{
bit_pict=picture[i][col];
}
return col_data;//No le hagais caso
}

Un saludete y muchas gracias foreros.
« Última modificación: 09 de Febrero de 2010, 18:15:07 por c4_esp_VR »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #1 en: 09 de Febrero de 2010, 18:14:33 »
Tambien he intentado lo siguiente, poner la matriz como un vector y nada de nada  :5] :5] :5]

Código: [Seleccionar]
#include <18F24K20.h>
#fuses HS, H4, NOWDT, NOPROTECT, NOLVP
#use delay(clock=48M)

static int1 smille2[70]={(1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1)};

int getColPicture2(int1 *picture, int col);

void main(void) {
   int t;

      setup_oscillator(OSC_64MHZ);
      delay_ms(100);

   t=getColPicture2(smille2,0);
}

int getColPicture2(int1 *picture, int col)
{
int i;
int col_data=0;
int1 bit_pict;
//int bit_pict;
int index;

for(i=0;i<7;i++)
{
bit_pict=0;
index=((7*col)+i);
bit_pict=picture[index];
col_data = col_data + bit_pict;
}
return col_data;
}

Y saca por pantalla lo mismo, es decir La variable bit_pict, si lo debugeamos saca en el bucle for 1000000 cuando debería de ser 1,1,0,0,1,1,1...que son los 7 primeros bit de smille2... :5]

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Array multidimensional CCS
« Respuesta #2 en: 09 de Febrero de 2010, 18:25:17 »
Prueba cambiando el parentesis por corchetes en el primero y eliminando los parentesis en el segundo..


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Array multidimensional CCS
« Respuesta #3 en: 09 de Febrero de 2010, 18:43:30 »
tienen que ser llaves:

int mat[2][2]={{1,2},{3,4}};

saludos.
.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #4 en: 09 de Febrero de 2010, 18:58:42 »
Hola compañeros, gracias por contestar, os dejo los resultados de vuestras ideas  :-/

Citar
Prueba cambiando el parentesis por corchetes en el primero y eliminando los parentesis en el segundo..
En ambos casos el compilador traga como un cosaco, en el primero con los cambios que me has comentado no varía en absoluto, en el segundo caso tiene como salida 1101111...

Citar
tienen que ser llaves:

int mat[2][2]={{1,2},{3,4}};

saludos.
Tambien se lo traga, y su salida es 1101110...

En ninguno de los casos funciona correctamente, pero aún así el desgraciado del compilador traga lo que sea...que no hay...este CCS con punteros se nos lia...

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Array multidimensional CCS
« Respuesta #5 en: 09 de Febrero de 2010, 19:42:40 »
segun la ayuda del ccs:

Arrays of bits are not permitted

Arrays may not be of SHORT INT.  Arrays of Records are permitted but the record size is always rounded up to the next byte boundary.

Me parece que vas a tener que implementarlo de otra forma.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #6 en: 09 de Febrero de 2010, 19:55:21 »
Citar
segun la ayuda del ccs:

Arrays of bits are not permitted

Arrays may not be of SHORT INT.  Arrays of Records are permitted but the record size is always rounded up to the next byte boundary.

Me parece que vas a tener que implementarlo de otra forma.

Me imaginaba algo de esto...pues que desperdicio de memoria si sólo quieres almacenar un bit...No habrá algún truquillo...para no desperdiciar tanta memoria...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Array multidimensional CCS
« Respuesta #7 en: 09 de Febrero de 2010, 19:59:36 »
El tema de los arreglos de bits ya se ha tratado en el foro, puedes usar el buscador para encontrarlo.

http://www.todopic.com.ar/foros/index.php?topic=15810.0

http://www.todopic.com.ar/foros/index.php?topic=15860.0

En las versiones recientes de CCS sí es posible declarar arreglos de bits, sólo que no encuentro alguna referencia... (ya se me olvidó dónde lo publiqué)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Array multidimensional CCS
« Respuesta #8 en: 09 de Febrero de 2010, 21:21:57 »
Mas allá que no permita los arrays de bit. ¿No hay error en esta parte del código?

for(i=0;i<7;i++)
   {
      bit_pict=picture[col];
   }


Si dentro de la función bit_pict esta definida como int1 (yo leo int uno -lo pongo en letras para que se entienda-, a no ser que este leyendo mal que no lo descarto), es decir un bit, nunca te va a poder tomar toda la columna.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #9 en: 10 de Febrero de 2010, 07:58:52 »
Citar
El tema de los arreglos de bits ya se ha tratado en el foro, puedes usar el buscador para encontrarlo.

http://www.todopic.com.ar/foros/index.php?topic=15810.0

http://www.todopic.com.ar/foros/index.php?topic=15860.0

En las versiones recientes de CCS sí es posible declarar arreglos de bits, sólo que no encuentro alguna referencia... (ya se me olvidó dónde lo publiqué)

Les he echado un vistazo y veo que al final tienes que almacenar 8 bits (1 byte) de todas todas...algunos piensan que las versiones nuevas de CCS hacen arreglos de bits pero no es así, en este caso la v4.104 no lo hace...¿¿Esto es propio del compilador u otros compiladores como Hitec o C18 si lo permiten???

Citar
Mas allá que no permita los arrays de bit. ¿No hay error en esta parte del código?

for(i=0;i<7;i++)
   {
      bit_pict=picture[col];
   }


Si dentro de la función bit_pict esta definida como int1 (yo leo int uno -lo pongo en letras para que se entienda-, a no ser que este leyendo mal que no lo descarto), es decir un bit, nunca te va a poder tomar toda la columna.

Es sólo para visualizarlo en modo debug  ;-)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Array multidimensional CCS
« Respuesta #10 en: 10 de Febrero de 2010, 10:01:14 »
Ah, güeno.... diría Don Inodoro  :)
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Array multidimensional CCS
« Respuesta #11 en: 10 de Febrero de 2010, 14:27:00 »
Aquí está la prueba de que CCS sí lo permite... yo ya había usado bit arrays... son ineficientes en cuanto a velocidad de código pero funcionan.

http://www.ccsinfo.com/content.php?page=bitarray

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #12 en: 10 de Febrero de 2010, 14:55:07 »
Citar
Aquí está la prueba de que CCS sí lo permite... yo ya había usado bit arrays... son ineficientes en cuanto a velocidad de código pero funcionan.

http://www.ccsinfo.com/content.php?page=bitarray

Y aquí esta la prueba de que son unos chapuzeros...no permite hacer punteros a bits con lo que si quieres pasar el valor de un array de bit a una función como parámetro no podrás hacerlo por referencia ya que no puedes usar punteros con lo que tendrás que pasarlo por valor y esto significa que cada vez que quieras operar con ella necesitas el doble de tamaño en el micro...así que han puesto un parche rápido...para muestra un colín...


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Array multidimensional CCS
« Respuesta #13 en: 10 de Febrero de 2010, 16:43:36 »
Hola, no sé que sea un "chapuzero" pero en el link que te puse arriba claramente dice que no se permiten apuntadores a arreglos de bits.

Citar
Bit Arrays

You can create an array of bits (or booleans). You cannot create a pointer to an array of bits or to a bit.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Array multidimensional CCS
« Respuesta #14 en: 10 de Febrero de 2010, 16:57:58 »
Citar
Hola, no sé que sea un "chapuzero" pero en el link que te puse arriba claramente dice que no se permiten apuntadores a arreglos de bits.

Citar
Bit Arrays

You can create an array of bits (or booleans). You cannot create a pointer to an array of bits or to a bit.

Yo nunca he dicho lo contrario migsantiago, que me lleve el diablo si digo que una persona con tu experiencia es un chapucero...faltaría más. A lo que me refiero que la programación en C está pensada para el uso de punteros, de echo un array por definición es un puntero

Citar
No es una referencia bibliográfica pero menos da una piedra...http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays

The interaction of pointers and arrays can be confusing but here are two fundamental statements about it:

    * A variable declared as an array of some type acts as a pointer to that type. When used by itself, it points to the first element of the array.
    * A pointer can be indexed like an array name.

 y no poder apuntar a un array...pues la verdad eso es una chapuza...o un parche para la siguinte versión  :D :D :D