TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MLO__ 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:
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:
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
-
Hola, intenta de esta manera:
#define ASIZE(x) ( sizeof(x) / sizeof( x[0] ))
Y aplicandola en tu ejemplo:
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
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 !
-
Hola.
:( No resulta, da siempre 1.
-
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.
-
data de por si ya es un puntero... no hace falta el &
saludos!
-
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:
#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:
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
-
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
-
por eso mismo... en C, un array es un puntero al primer elemento. Osea, si tenes
const in8 data[][*] = {"opcion1", "opcion2", "opcion3", "opcion4", "opcion5" };entonces data es un puntero al primer elemento del arreglo.
Entonces si haces
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!
-
Ok. Gracias por la aclaracion Gera
Saludos
-
de nada ;)
te funciono? porq yo lo probe en al compu, pero no se si es igual el C estandar al CCS
-
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
-
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 !
-
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
-
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 !
-
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
-
Hola.
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 ?
Si, si sirven para pic 16 y 12 y 18 :mrgreen:
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
Esa declaracion la encontre en la ayuda del CCS ... es valida para ese compilador unicamente ... para mcc18 y mikroc no sirven.
saludos
-
Gracias MLO x la data del MikroC , con respecto a la declaración es una lastima del CCS que permita estas cosas, porque atenta justamente con una de las mejores caracateristicas del C que es la portabilidad.
Saludos !
-
Hola.
Pues si, pero ellos advierten claramente que no es ANSI C :( , y hay cosas (como las que comente arriba que no deja usar los strings cuando se declara la variable como deberia ser) que lo enredan mucho mas a uno a la hora de migrar de un compilador a otro. De todas maneras, no esta demas refrescar los conceptos!! gracias amigos.
Saludos
-
Y bueno es lo que hay, como decia una amigo mio.
Saludos y nos estamos leyendo !
-
por eso mismo... en C, un array es un puntero al primer elemento. Osea, si tenes
const in8 data[][*] = {"opcion1", "opcion2", "opcion3", "opcion4", "opcion5" };entonces data es un puntero al primer elemento del arreglo.
Entonces si haces
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!
Para leer la longitud de cadenas en MikroC debes utilizar la funcion unsigned strlen(char *s); que retornara la longitud de la cadena
Ejemplo:
longitud=strlen("cadena); // longitud sera igual a 6
Espero que les sirva