Conocer el tamaño ocupado de un array

Hola a todos ... se que puedo hacer el uso de for para esto, aunque quiero saber si existe otro método con alguna función predefinida del ide. He declarado un array tipo char :

char ssid_inputhmi[32];

Ahora en ese array recibo datos seriales y depende de esa lectura pueden ocupar x posiciones del arreglo, lo que quiero hacer es conocer el tamaño ocupado por ejemplo :

ssid_inputhmi[0] = 0x56;
ssid_inputhmi[1] = 0x49;
ssid_inputhmi[2] = 0x4C;
ssid_inputhmi[3] = 0x4C;
ssid_inputhmi[4] = 0x41;
 

Ahora solo se están ocupando 5 posiciones del Arreglo que en ASCII significa "VILLA" ahora deseo saber el tamaño ocupado y no el tamaño del arreglo, es posible hacerlo sin FOR ? alguna función para esto ? muchas gracias por sus respuestas de antemano estoy muy agradecido.

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español .

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Si la hay no la conozco.

¿Por qué no usar el contador que usas de índice al guardar los datos en el array?

Gracias por responder, al parecer es la mejor opción, pero a veces es bueno preguntar por que aprendemos cosas nuevas ! :+1:

Hola a todos, he definido una variable del tipo char :

char ssid_inputhmi[32];

Esa variable toma valores del puerto serial pero en este ejemplo los asignare directamente :

ssid_inputhmi[0] = 0x56;
ssid_inputhmi[1] = 0x49;
ssid_inputhmi[2] = 0x4C;
ssid_inputhmi[3] = 0x4C;
ssid_inputhmi[4] = 0x41;
ssid_inputhmi[5] = 0x20;
ssid_inputhmi[6] = 0x38;
ssid_inputhmi[7] = 0x32;
ssid_inputhmi[8] = 0x34;

Lo que en ASCII seria "VILLA 824", ahora bien cargo ese array a un puntero char* :

char* puntero = ssid_inputhmi;

Con lo que al imprimir por el puerto serial se ve efectivamente "VILLA 824" :

Serial.print(puntero);

Mi pregunta es si puedo conocer el tamaño total de la variable char* puntero, estoy usando sizeof() y el valor no coincide con el tamaño por que "VILLA 824" ocuparía 9 bytes y en la salida imprime 4 ... Agradezco de antemano sus comentarios se que puedo estar consultando algo que pueda no tener sentido pero de esto se basa el aprendizaje ! y hoy de seguro aprenderé algo nuevo ! gracias !

Hola,
Vamos por partes:

char ssid_inputhmi[32];

Eso define un ARRAY de caracteres de 32 posiciones que van de la 0 a la 31 incluidas.
Son 32 variables tipo "char" que se encuentran en la misma zona de memoria.

ssid_inputhmi[0] = 0x56;
ssid_inputhmi[1] = 0x49;
...

Así asignas, correctamente, los valores a cada elemento del array.

char* puntero = ssid_inputhmi;

Aqui declaras un puntero a una variable y para que el compilador entienda de qué tipo es, apuntará a variable de carácter. Le dices que el valor del puntero es el primer caracter del array ssid_inputhmi (le asignas al puntero la dirección de memoria de la variable ssid_inputhmi)
Por ahora bien.

Serial.print(puntero);

Eso está mal. Ya se que te ha salido bien la impresión, pero está mal. ¿por qué? porque te ha salido bien impreso por que la casualidad de que detrás del último carácter que has definido (ssid_inputhmi[9]) vale un cero con lo que se lo toma como una cadena correctamente.
Para estar seguro que te funcione bien, has de definir el final de la cadena en el array para asegurarte que no te hace "cosas" raras. por ejemplo ssid_inputhmi[0]=0x00;

¿por que esto sale mal? sizeof(puntero) por que una variable de tipo puntero, sea a char, a string, a lo que sea, siempre ocupa 4 bytes. un puntero es un "enlace directo" o "acceso directo" a una variable y no una copia de la variable en sí.
Siempre valdrá 4 bytes.

Como se sabe cuánto vale puedes usar strlen. Te propongo este ejercicio:

char ssid_inputhmi[32];
void setup() {
  Serial.begin(9600);
  Serial.println("Inicio:");
  ssid_inputhmi[0] = 0x56;
  ssid_inputhmi[1] = 0x49;
  ssid_inputhmi[2] = 0x4C;
  ssid_inputhmi[3] = 0x4C;
  ssid_inputhmi[4] = 0x41;
  ssid_inputhmi[5] = 0x20;
  ssid_inputhmi[6] = 0x38;
  ssid_inputhmi[7] = 0x32;
  ssid_inputhmi[8] = 0x34;
  ssid_inputhmi[5]=0x00;
  char* puntero = ssid_inputhmi;
  Serial.print("La variable contiene:'");
  Serial.print(puntero);
  Serial.print("' y ocupa ");
  Serial.println(strlen(puntero));
  
  Serial.println("impresión, poco a poco, con puntero:");  
  while (*puntero)
  {
    Serial.print((char)*puntero);
    puntero++;
  }
  Serial.println("\nFin.");
}

void loop() {
}

Como ves hay una línea donde defino ssid_inputmi[5] con valor cero.
Y observa bien el bucle while: mientras donde apunte puntero tenga algún caracter que no sea nulo, imprimirá a qué caracter está apuntando y sumará 1 al valor donde apunta el puntero (que lio, lo siento).

Saludos.

2 Likes

Ostias que ha funcionado toó, creo que entendí perfectamente todo lo que has escrito, de nuevo mil gracias ojala pueda retornar todo este que me ayuda por que la verdad estoy en un proyecto muy interesante y esto que me has acabado de enseñar me hace avanzar mas en el proyecto ! :+1: :+1: :+1:

Moderador:
He cerrado tu publicación Manipulando arreglo de char
El doble posteo va en contra de las reglas del foro de Arduino.
La razón es que las publicaciones duplicadas hacen perder el tiempo a las personas que intentan ayudar. De hecho ha ocurrido, tienes dos respuestas.
Alguien ha pasado su tiempo investigando y escribiendo una respuesta detallada sobre tu tema, sin saber que alguien más ya lo había hecho en el otro tema y para colmo, lo hiciste en el foro en inglés. Otra falta.
La publicación cruzada repetida puede resultar en una suspensión del foro, comenzando por una baneo de 1 dia, siguiendo por 2, 4, 8, etc.
Por esta vez lo dejo pasar pero tienes una advertencia y si repites la falta no habra consideración.
En el futuro, crea solo un tema para cada tema distinto.
Esta es la etiqueta básica del foro, como se explica en Normas del foro.
Contiene mucha otra información útil.
Por favor léelo.
Gracias de antemano por tu cooperacion y espero no lo repitas.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.