Matriz multidimensional con diferentes columnas por fila

A pesar de llevar días tras el tema no he encontrado aún la solución.

Necesito realizar una matriz de números enteros (int) que se construya con un número determinado de filas, pero donde el número de columnas pueda diferir de una fila a otra. Tal que así:

Int matriz = {{37,681,45} , {21,9} , {84}}

El problema que me encuentro es que el compilador me pide que defina obligatoriamente el número de columnas, por lo que tengo que poner según el ejemplo anterior un 3. Pero de esta forma cuando solicito los datos con un bucle for, aquellas filas que tienen menos columnas me muestra los datos con ceros. Y yo lo que necesito es que me muestre únicamente los datos que existan en esa fila.

¿Cómo lo podría programar?
¿Alguna sugerencia?

Pero eso no es una matriz.
No vas a encontrar solución a lo que propones.

ademas no puedes asignar esto int matrix a lo que luego le dices aunque sean con filas y columnas correctas.
Te falta indicar las dimensiones de la matriz.

int matrix[3][3]; por ejemplo.

Es correcto lo que dices.

Yo podría definir el número de filas, pero necesito que el número de columnas sea variable como mostraba en el ejemplo.

Int matriz[7]=.......

Pero me da error de compilación.

Mira un ejemplo de cómo debería ser la programación sería así:

for (int i=0; i < matriz.length; i++) {
       for (int j=0; j < matriz[i].length; j++) {
           System.out.print(matriz[i][j]+"\t");
       }
       System.out.println("");
   }

Pero es en lenguaje C (creo), y arduino no lo acepta.

Moderador
Por favor edita tu post usando etiquetas de código.
Normas del foro

Al obligarme el compilador a definir las columnas, cuando realizo una impresión de los datos con bucle for obtengo lo siguiente:

Int matriz [3] = {{37,681,45} , {21,9} , {84}}

37,681,45
21,9,0
84,0,0

Es decir me rellena con ceros los datos de las filas con columnas menores de tres.

Porque fuerza a una matriz 3x3.
Ya te expliqué que no hay manera de hacer lo que quieres.

Planteemos las cosas al revés. Porque no explicas que quieres hacer, por qué necesitarías algo asi. Los datos a qué pertenecen.

Considera que una matriz con datos en 0 tmb sería una solución para lo que planteas porque simplemente al mostrar la información si encuentras un 0 lo descartas y listo
Si el 0 fuera un valor que te interesa podrías usar otro número para descartarlo.

Tampoco le ve mucho sentido a lo que intentas hacer, pero si es solo un problema estético y no quieres imprimir ceros, puedes declarar una matriz auxiliar del mismo tamaño y en cada posición que tengas un dato valido le asignas un uno, de esa manera en el FOR recorres ambas matrices y si en auxiliar hay un 1 imprimes el dato.

Saludos.

Lo que planteas es para mi tan trivial que no vale la pena perder mas tiempo.
Asigna como te dije un número que no sea relevante, como dije un 0 o un 1 o un -1 o lo que gustes.

int delimitador = -1; // elige el que gustas

if (matriz[i][j] == deliminator) {
   // hacer lo que quieres o consulta por !=
}

Gracias a los dos por los comentarios.

Efectivamente el uso de un delimitador es una solución válida, pero no es tan limpia como la que se puede hacer en otros lenguajes de programación tal y como mostraba más arriba.

La disposición de los datos aunque pudiera parecer caprichosa se debe a la recepción por bluetooth de la programación de encendido y apagado de un dispositivo la cual se realiza desde una aplicación Android hecha con app inventor. Dichos datos son gestionados como lista de listas los que permite generar matrices de diferentes columnas por filas y almacenarlos en una base de datos.

De ahí que en arduino se me genere la matriz de la forma señalada cuando son recibidos.

Entiendo entonces que deberé de forzar en el volcado de datos desde app inventor p.ej el valor -1 por cada una de las filas (listas) que envíe para que sea reconocido desde arduino cuando se ha llegado al final de la fila o lista.

Creo que el problema esta mal enfocado.

El array habra que definirlo segun sea su mayor extension prevista posible. Da igual que determinados espacios no los uses.

Tu problema no esta tanto en la dimension del array sino en lo que quieres mostrar.

Pues bien, define el codigo para que determinados valores no los muestre, por ejemplo no mostrar “0”.

Me podras decir que quizas no puedas porque “0” es un valor que algunas veces SI querras mostrar. Bien, entonces elige un numero que “no uses” y asimilalo a un valor nulo. Carga X en los espacios que no quieras mostrar de manera que a la hora de mostrar, las X no se muestren.

La X pueden ser “0”, “-1”, “99” o “32.767” o lo que mejor te venga :wink:

Gracias por ofrecerme tu opinión.

Ciertamente apuntas la misma solución que los compañeros, la cual me obligará a generar un valor delimitador para que arduino reconozca cuando ha llegado al final de la fila, ya que la utilización de sizeof no me arrojaría un valor válido al indicar siempre la longitud máxima de las columnas y no el número de datos reales de la fila en cuestión.

Efectivamente el uso de un delimitador es una solución válida, pero no es tan limpia como la que se puede hacer en otros lenguajes de programación tal y como mostraba más arriba

No estas en otros lenguajes, estas en Arduino y sus limitaciones o no.
Tal vez la limitación sea nuestra y tu ves algo que nosotros no vemos.

Podrías usar punteros y hacer una asignación de modo dinámico.

Esto seria un ejemplo asignando vectores de foma dinámica. De todos modos verás que no tienen tamaños dinámicos. Pero si puedes crear una matriz dinámica, del mismo modo que el vector.

// tmp es nuestro vector de enteros, en realidad un puntero 
uint16_t *tmp;

// Asigna memoria para almacenar 5 enteros sin signo
tmp = malloc(sizeof(uint16_t) * 5);

if(!tmp) {
  // No puedo asignar memoria
  return false;
}

No se como harías para conocer hasta donde llega cada vector, pero te lo dejo a ti ya que conoces de otros lenguajes.

Mi aproximación sería algo asi.

#include <Arduino.h>

void setup() {
  Serial.begin(9600);
  int length = 5;
  int **coordinates;
  
  coordinates = new int*[length];
  
  for (int i = 0; i < length; i ++) {
      coordinates[i] = new int[length-i];
      for (int j = 0; j < (length-i); j ++) 
          Serial.print(coordinates[i][j]);
      Serial.println();
  }
}

En principio me muestra bien los datos (todos 0) porque los imprimo convenientemente.
Abría que ver si además los almacena como tu esperas.

En lo personal no creo que este bien.

Arduino cuenta con pocos recursos para ciertas tareas ya que es un microcontrolador pensado mas que nada para recibir entradas, procesar esa información, almacenar datos proceduales que servirán para satisfacer al usuario y entregar finalmente resultados, su lenguaje de programación es de bajo nivel por lo que cuenta con desventajas a la hora de querer hacer cosas relacionadas con bases de datos dentro de el mismo pero si puede ser totalmente eficiente si tiene que consultarle o gestionar una base de datos por ejemplo almacenada en una tarjeta Micro-SD. Si lo que necesitas es almacenar mucha información y con cierta comodidad te recomiendo hacer eso. Puedes darte el gusto de guardar, recuperar y modificar información como necesites. Insisto, arduino en ocaciones no puede con todo el solo pero si es un buen intermediario haciendo que los demás módulos hagan su trabajo. Un saludo :slight_smile: