Autor Tema: Tamano de una matriz  (Leído 5378 veces)

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Tamano de una matriz
« en: 05 de Septiembre de 2008, 11:11:35 »
Hola.

Acudo a uds muchachos para que me ayuden en los siguiente.

Tengo el siguiente arreglo:
Código: [Seleccionar]
const in8 data[][*] = {"opcion1", "opcion2", "opcion3", "opcion4", "opcion5" };

y quiero saber como obtener el tamano del vector data. Lo intente con la funcion sizeof, pero solo obtuve el tamano de la variable, es decir un int:

Código: [Seleccionar]
value = sizeof(&data);// value toma el valor de 2, correspondiente al espacio que ocupa la variable

Hay alguna manera de obtener el numero 5 ??, es decir el tamano del vector data?

Saludos
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tamano de una matriz
« Respuesta #1 en: 05 de Septiembre de 2008, 12:18:03 »
Hola, intenta de esta manera:
Código: [Seleccionar]
#define ASIZE(x) ( sizeof(x) / sizeof( x[0] ))

Y aplicandola en tu ejemplo:
Código: [Seleccionar]
int8 Elements = ASIZE( data );

El primer sizeof devuelve el valor de toda la matriz, como por definición todos los elementos de la matriz son iguales, la división del largo total x el tamaño de un elemento te da la cantidad de elementos.

En el ejemplo que pusiste
Citar
Código: [Seleccionar]
value = sizeof(&data);// value toma el valor de 2, correspondiente al espacio que ocupa la variable

Al sizeof le estas pasando un puntero, por eso te devuelve 2 ya que es el tamaño del puntero...

Saludos !
« Última modificación: 05 de Septiembre de 2008, 12:22:00 por RICHI777 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #2 en: 05 de Septiembre de 2008, 12:40:16 »
Hola.

 :( No resulta, da siempre 1.

El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #3 en: 05 de Septiembre de 2008, 13:11:37 »
Hola.

Listo!!! solo hay que tener cuidado en la definicion del vector!!!  :-/ :-/ Al definirlo de la forma en que yo lo hago, el maximo tamano es de 256 o lo que es lo mismo 0xFF  :lol:.

Saludos y gracias.
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Tamano de una matriz
« Respuesta #4 en: 05 de Septiembre de 2008, 17:30:40 »
data de por si ya es un puntero... no hace falta el &
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tamano de una matriz
« Respuesta #5 en: 05 de Septiembre de 2008, 19:02:00 »
Hola MLO, tuve problemas al probar tu ejemplo con la macro que te pase en varios compiladores, sobre todo en Win32. La solución que encontré para todos y por ende para generar código más portable es esta:

Código: [Seleccionar]
#define ASIZE(x) ( sizeof(x) / sizeof( (x)[0]))

const int8 *data[] = { "pepe123", "juan", "pedro" };
...
int8 Elements = ASIZE( data );
...

De esta manera el código queda más portable, en ANSI C la declaración que vos pusiste:
Código: [Seleccionar]
data[][*]

No es permitida, el tamaño de uno de los indices debe estar definido. Con la declaración que puse ahora para ANSI C es válido definir un array de N elementos que apuntan a un tipo char pointer.

Saludos ! y estuvo bueno refrescar algunos conceptos :D

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #6 en: 05 de Septiembre de 2008, 19:35:07 »
Hola.

data de por si ya es un puntero... no hace falta el &

No estoy muy seguro de que sea un puntero  :? voy a revisar mas a fondo, ya que para mi es un array de caracteres que almaceno en la ROM, es decir son datos solo de lectura, tengo entendido que el puntero es una variable que guarda la direccion de otra variable.

Y si RICHI777, no es ANSI C, es para el C del CCS, el cual si permite asignar de esa manera la constante de strings, de esa manera no me preocupo si debo agregar mas strings a la cadena, al colocar el * toma el por default el numero mayor posible que es 256 (por eso me devolvia 2 cuando apuntaba a esa direccion),  pero para el MikroC es valida la que colocas despues, ya que el MikroC si es ANSI C.

Saludos
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Tamano de una matriz
« Respuesta #7 en: 05 de Septiembre de 2008, 20:42:39 »
por eso mismo... en C, un array es un puntero al primer elemento. Osea, si tenes
Código: [Seleccionar]
const in8 data[][*] = {"opcion1", "opcion2", "opcion3", "opcion4", "opcion5" };entonces data es un puntero al primer elemento del arreglo.
Entonces si haces
Código: [Seleccionar]
sizeof(data);te da el tamaño de todo el arreglo. Ya que sizeof pide como parametro un puntero, y como dijimos, data es un puntero.
Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #8 en: 05 de Septiembre de 2008, 21:35:27 »
Ok. Gracias por la aclaracion Gera

Saludos
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Tamano de una matriz
« Respuesta #9 en: 05 de Septiembre de 2008, 21:52:23 »
de nada ;)
te funciono? porq yo lo probe en al compu, pero no se si es igual el C estandar al CCS

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #10 en: 06 de Septiembre de 2008, 01:18:10 »
Hola.

El CCS no es ANSI C. Y no funciono  con la declaracion sizeof(data)/sizeof(data[0]), (declarandolo como int8 const data[][ * ]=....), ya que en los dos casos retorna el valor que ocupa todo el string. En la segunda declaracion (la de ANSI C, *data[]=...) tampoco funciona, ya que, al no colocar el numero correspondiente al arreglo, el compilador lo toma como el maximo, en este caso 0xFF, por lo que la funcion sizeof retorna es el numero de bytes que ocuparian 3 variables de 256 es decir 768, y la funcion sizeof(data[0]) si retorna el numero de bytes que ocupa el string, en este caso 8, por lo que la hacer la operacion el resultado seria 96 que no es lo correcto.

Pero teniendo en cuenta que se tiene un valor fijo en el tamaño del string, se puede obtener el valor de string's que hay, como lo dije antes, solo hay que tener en cuenta como se define el vector.

Saludos

« Última modificación: 06 de Septiembre de 2008, 01:40:40 por MLO__ »
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tamano de una matriz
« Respuesta #11 en: 06 de Septiembre de 2008, 17:57:51 »
Hola, lastima que no funcione la declaración ANSI probe en casa con otro compilador y funciono ok. Igual joya que lo hiciste funcionar :-)

Saludos !

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Tamano de una matriz
« Respuesta #12 en: 06 de Septiembre de 2008, 20:03:49 »
Hola.

Pues si RICHI777, lastimosamente es problema del CCS, ya que en C si que funciona bien. Otra cosa  :( si uso la definicion *data[]=... y quiero "volcar" el string hacia la LCD por ejemplo, no deja!!! sale vacio  :( :( , pero si uso la definicion data[][ * ]=... si sale  :shock: ... segun he leido ( la verdad no se mucho de C ) depende del compilador, asi que esta vez es por capricho del CCS  :x :x Pero para otros compiladores que si son ANSI C como el de microchip o el MikroC, la definicion que me diste si que va bien amigo.

Gracias por las ayudas.

Saludos
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tamano de una matriz
« Respuesta #13 en: 07 de Septiembre de 2008, 21:25:00 »
Hola amigo, no uso CCS, lo que se es los compiladores oficiales de MicroChip ( C18, etc ) solo son para los micros mas grandes, MickroC sirve para la gama baja de MicroChip ?

Saludos !

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Tamano de una matriz
« Respuesta #14 en: 08 de Septiembre de 2008, 00:26:40 »
La verdad q no se q significa data[][ * ]... las definiciones q me suenan son
int *data[]
int **data
int data[][]
las tres son lo mismo, un puntero de puntero. Pero la de arriba no me suena :S

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein