Determinar tamaño en un array de char

Hola.
Estoy tratando de crear un menú para un oled.
He creado un array multi dimensional de char:
[9] = menu pricipal. [6] submenus

char *menu[9][6] = {
      {"Menu 0","Sub 0 0","Sub 0 1"}, // sizeof = 2
      {"Menu 1","Sub 1 0","Sub 1 1","Sub 1 2"},
      {"Menu 2","Sub 2 0","Sub 2 1","Sub 2 2","Sub 2 3"},
      {"Menu 3","Sub 3 0"},
      {"Menu 4",""},
      {"Menu 5","Sub 5 0"}
    }; // sizeof =72

La cuestión es que no se cómo saber en e programa el número de elementos.
Por ejemplo si hago sizeof(menu) da 72..

Lo que necesito es:
1º que aunque lo he declarado con [9][6] de esos 9 elementos posible de la primera dimensión, cuales están con datos.
2º En la segunda dimensión(submenus), cuantos están con datos, como se ve, cada uno tiene un número distinto de submenus.

He visto que con sizeof no puedo saberlo.
¿ Alguna idea ?

.

Has declarado char *menu, que son punteros, o sea int. Declara char menu[][] y con sizeof tendrás las respuestas

saludos

@bosoft
Pues no me deja dice:
declaration of 'menu' as multidimensional array must have bounds for all dimensions except the first

La declaración es:

char menu[][] = {
      {"Menu 0","Sub 0 0","Sub 0 1"},
      {"Menu 1","Sub 1 0","Sub 0 1","Sub 0 2"},
      {"Menu 2","Sub 2 0","Sub 2 1","Sub 2 2","Sub 2 3"},
      {"Menu 3","Sub 3 0"},
      {"Menu 4",""},
      {"Menu 5","Sub 5 0"}
    };

Probé antes y me pasaba ese error

Claro. Ahí tienes 3 datos:
[9] menú principal (aunque solo veo 6)
[6] de submenus (aunque solo veo 4)
[] de longitud del char que son 7 + el nulo

Prueba char menu[9][6][] o [9][6][8]

Saludos

Perdonar que os de la tabarra.

Siguiento un enlace de un ejemplo de menu he sacado que el array bidimensional lleva un tercer parámetro: [16]
y que luego no se usa como menu[x][y]
¿ porqué se usa ? ¿ es para la logitud de alguna dimensión ? No encuentro mucha documentación al respecto.

char menu[9][6][16] = {
      {"Menu 0","Sub 0 0","Sub 0 1"}, // sizeof = 2

El 16 al que haces referencia es la longitud de cada elemento del array.

No se si uso los terminos correctos pero espero que se entienda...

Si quieres almacenar una sola palabra le pondrías solo una dimensión que representa la longitud de esa palabra, por ej.

char palabra[longitud];

Si almacenas una fila de palabras, entonces hay 2 dimensiones, una con el numero de items o elementos de la fila y otra con la longitud del item con mayor cantidad de caracteres

char fila[num.items][long.items];

Si almacenas filas y columnas tienes 3 dimensiones, número de filas, número de columnas y longitud de los elementos

char tabla[num.filas][num.cols][long.items];

En el ejemplo que refieres fijate que rellena las cadenas de 16 caracteres de longitud con espacios, lo hace así para que en el display (que casualmente es 16x2) se complete la fila y no le queden caracteres espurios (los espacios borrarían cualquier caracter de la impresión anterior que pudiese haber).

Agrego: Fijate también que en el ejemplo no usan punteros como lo haces tú en la declaración.
Usando puntero a char no tienes que usar la dimensión longitud porque el compilador se encarga de contar los caracteres y asignar el espacio necesario en memoria.

En resumen, si no esperas problemas de memoria lo usas de la forma "normal" y reservas tú el espacio necesario para almacenar las cadenas.
Si quieres ahorrar memoria porque las longitudes de las cadenas son diversas, usas punteros y que el compilador se encargue.

Pero ojo, si completas las cadenas con espacios como en el ejemplo, va a dar igual como declares los arrays porque, al fin y al cabo, cada elemento tendrá 16 caracteres.

Saludos

Muchas gracias gatul.

Me ha quedado perfectamente claro y entiendo porqué me daba error cuando no ponía la tercera dimensión(tamaño).

Lo del uso de punteros es porque vi un ejemplo y pensaba que ese tipo de arrays era así, ahora estoy estudiando mejor para conocerlo.

¿ me recomendáis algún libro bueno para este lenguaje c++ adaptado a Arduino ?
Yo soy programador de PHP y de python.

Saludos y gracias de nuevo por tu explicación.

Ah, estás igual que yo, sabemos que es lo hay que hacer pero no como hacerlo. :grin:

Mirá, yo voy leyendo en la red, no tengo un texto "de cabecera".

Prefiero ir viendo las soluciones cuando aparecen los problemas.
Como soy grandecito disfruto la ventaja tecnológica de no tener que ir a la biblioteca a leer medio libro para encontrar un tema puntual. Notarás que dije biblioteca...
¡La pucha que pasó el tiempo! Jejé

Saludos

jajaja Yo hago igual, pero eso a veces hace perder mucho tiempo.

Casi prefiero leer un libro sobre el lenguaje y así voy más directo. También evito preguntar demasiado en el foro.

Eso se resuelve mejor usando punteros o mejor dicho una matriz de punteros.
De todos modos creo que equivocas el enfoque.
Hay muchas librerías de menúes, es cuestión de buscarlas y ahorrarte el dolor de cabeza en el que estas ahora.

Un dia de busqueda es y será mas fructífero que el tiempo que llevas luchando con qué? como almancenar los submenúes.
y aun te falta ... bastante.

Mira, me llevó 2 o 3 minutos Arduino Menu OLED y hasta que di con uno mas o menos potable.

Arduino Menu/UI using OLED & Rotary Encoder

Vi que existern muchas mas opciones. Revisa la que mas se adecúe a tu proyecto.
De todos modos usar un enconder es muy cómodo para los menúes.
Giras y aceptas presionando. No hay nada que lo haga mas fácil.

EDITO:
Otra recomendación, Using an OLED Display with Arduino

surbyte:
Eso se resuelve mejor usando punteros o mejor dicho una matriz de punteros.
De todos modos creo que equivocas el enfoque.
Hay muchas librerías de menúes, es cuestión de buscarlas y ahorrarte el dolor de cabeza en el que estas ahora.
Otra recomendación, Using an OLED Display with Arduino

Genial. voy a mirar detenidamente.
Gracias por el consejo. También estoy buscando más información sobre punteros.

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