Presentación i dudas de c++

Buenos días
Me llamo Toni.

Mi duda es de C++ básico (mi nivel es muy bajo)
En otros lenguajes (basic, etc.. se como hacer-lo, pero no lo consigo con c).
soy autodidacta, por tanto mis códigos distan de ser elegantes (básicamente son copy paste)
El problema que tengo (voy a intentar explicarlo) es :
Tengo una matriz de 4 * 7 donde pongo unos valores
para recorrer la matriz para acceder a los valores lo hago con dos bucles for (hasta aquí no creo que lo haga mal.)

El problema es que no se asignar una variable que dependa de los bucles i repito la instrucción 28 veces.
me duele verlo así cuando se que con una o dos líneas se puede hacer.

Se que es un problema de C básico pero no he llegado ha encontrar la solución, alguien me puede ayudar

Gracias

 uint32_t zq = 0;
  uint32_t Numeral = 0;
  for ( uint32_t y = 0; y <= 3; y ++) // recorre zones
  {
    for ( uint32_t i = 0; i <= 6; i ++) // recorre dies setmana
    {
      Numeral = (10 * (y + 1)) + i;
      zq = Dsetm[y][i];

      if (Numeral == 10) {d10.setValue(zq);}
      if (Numeral == 11) {d11.setValue(zq);}
      if (Numeral == 12) {d12.setValue(zq);}
      if (Numeral == 13) {d13.setValue(zq);}
      if (Numeral == 14) {d14.setValue(zq);}

Lo que necesitas es aprender a usar matrices o arrays como deberías buscar mas información en Internet.
Te estaba explicando pero nada mejor que un tutorial al respecto que lo haré mejor y mas gráfico para que lo comprendas.
Tu palabra clave es array, busca Arduino array y aparece el mundo que ahora desconoces.

No entiendo lo que intentas hacer (en tu caso)
(10 * (y + 1)) + i solo puede ser 10 si y = 0 e i = 0
(10 * (y + 1)) + i solo puede ser 11 si y = 0 e i = 1
(10 * (y + 1)) + i solo puede ser 12 si y = 0 e i = 2
(10 * (y + 1)) + i solo puede ser 13 si y = 0 e i = 3
(10 * (y + 1)) + i solo puede ser 14 si y = 0 e i = 4

así que por qué no lo haces

d10.setValue (Dsetm[0][0]);
d11.setValue (Dsetm[0][1]);
d12.setValue (Dsetm[0][2]);
d13.setValue (Dsetm[0][3]);
d14.setValue (Dsetm[0][4]);

no hay necesidad de los 2 bucles for

gracias por la información.

seguramente el problema parte que hago un mal uso de la array

de hecho esta solo contiene valores 1, 0 según si esta activado o no.
seguramente hacerlo así es un desperdicio de recursos el procesador.
mi problema es
que la lectura o escritura de los datos los hago recorriendo uno por uno todas la posiciones del array (no importa porque los leo pantalla táctil.
de la manera que lo tengo hecho funciona.
pero la vedad es que me fastidia i me duele repetir las líneas 28 veces.

yo quería decir como podría hacer algo parecido ha esto para hacerlo solo con una instrucción

d[i][y].setValue(zq)

donde la "variable" d cambia en los bucles.

de esta marera con una solo instrucción funcionaría tendría sentido los dos bucles

igual es un sin sentido y entendidos les puede dar hasta vergüenza ajena.

pero es lo mejor que se me ha ocurrido.

JML

gracias
tienes toda la razón. pero mi problema es que mi primer intención era hacerlo con una sola instrucción. (quede bloqueado y hice esto que es totalmente ilogico)
pero dada mi incapacidad en hacer que la variable d[i][y]
se quedo así a la espera de la inspiración divina (la cual no me ha llegado)
por esto recurro al foro después de leer muchos códigos y manuales no he sabido aplicarlo.

seguro que se puede hacer y es sencillo.
pero el lenguaje C me puede.

No termino de entender la idea porque, al menos a mi no me queda clara tu explicación, pero por qué d10, d11, etc., no pueden ser items de una array y acceder a través de d[n]?

Por otro lado, si tu array solo almacena valores 1 ó 0, tranquilamente podrías usar solo 4 bytes y setear y consultar el estado de cada bit.
En tu caso almacenas 28 estados, con 4 bytes (o sea, 32 bits) los guardas tranquilamente.

porque no sabía de la existencia del array o como manejar los índices.

Gracias por vuestro tiempo y ayuda.

Hago otro intento de explicarme.

Las variables que pongo en el array provienen de 28 variables (pantalla táctil nextion)

he ajustado el nombre de las variables de la pantalla para que sean d10,d11,d12,...d40, d41
hasta d46
esto lo hice así para que coincidieran con los subíndices del array (claro me olvide que el primero del array es 0,0 eso lo corregí sumando 1)

el problema es que volcar las variables d10 .. d46 al array tengo que hacer 28 líneas de código (en este caso son pocas -28- y lo resolví repitiendo las líneas) pero si fueran 100 o 1000?
mi idea era hacer que el nombre de la variable tuviera una parte fija "d" y una variable "10", "11" ... "46"
este es problema que tengo como hacer que la variable, sea la suma de "d"+ numero
espero que se entienda
si no es así, gracias por vuestra ayuda y tiempo
dejare el código tal cual porque me funciona

¿Por qué no pones tus variables de nextion en una matriz?

#include <Nextion.h>
NexText d[] = {
  {0,  0, "d10"},
  {0,  1, "d11"},
  {0,  2, "d12"},
  {0,  3, "d13"},
  {0,  4, "d14"},
  {0,  5, "d15"},
  // ...
  {0, 44, "d44"},
  {0, 45, "d45"},
  {0, 46, "d46"},
};
const byte dCount = sizeof d / sizeof d[0];

char tmpBuffer[100];

void setup() {
  Serial.begin(115200);
  for (byte i = 0; i < dCount; i++) {
    d[i].getText(tmpBuffer, sizeof(tmpBuffer));
    Serial.println(tmpBuffer);
  }
}

void loop() {}

Esto no se me ha ocurrido.

muchas gracias lo intentare

solo un alclaracion
el primer campo seria la pantalla nextion
el segundo el id
i el tercero el objname
{screen,id,objname},
...

si es así, al cambiar en la pantalla se actualizaría el array? o tendría que refrescar?

cuanto me falta por aprender

saludos

¿Cómo define su NexText en el código existente?

Este es el sistema que vi en el tutorial de nextion (a parte de leer directamente del Serial)

#include "NexButton.h"
#include "NexText.h"
#include "NexCheckbox.h"
... 
NexTouch *nex_Listen_List[] = {  &gosset  &sethour,  .... }
NexButton goset =    NexButton   (0, 11, "goset");
NexText sethour =  NexText(2, 2, "sethour1");

Podría hacer diferentes matrices, por pantallas i/o tipo de datos?

Saludos

¿Cómo se define hoy d10 .. d46?

NexCheckbox d10 = NexCheckbox(3, 13, "c0");
NexCheckbox d11 = NexCheckbox(3, 14, "c1");
NexCheckbox d12 = NexCheckbox(3, 15, "c2");
NexCheckbox d13 = NexCheckbox(3, 16, "c3");
NexCheckbox d14 = NexCheckbox(3, 17, "c4");
NexCheckbox d15 = NexCheckbox(3, 18, "c5");
NexCheckbox d16 = NexCheckbox(3, 19, "c6");`

Gracias a tu ayuda, ya se que quieres decir.
lo que no se si puedo hacer varias lecturas a la pantalla nextion
Tipo:
NextTouch botones1 [.] = { &bt1, &bt2, .........};
NextText Textos[.] = { &text1, &text2, .....};
esto seria de gran ayuda (tengo que probarlo) Sabes si se puede hacer? tiene limitaciones? (todos tienen que ser del mismo tipo)

El problema mas grande que encuentro, es que casi todos los valores que entrega la pantalla nextion son uint32.
lo encuentro un despropósito si son checkbox que solo tienen 2 valores

si puedo hacerlo depurare mucho mi codigo

y sobre mi duda inicial a final he visto la luz (gracias a vosotros)
yo estaba empeñado en traducir literalmente del BASIC
algo parecido a esto

for i=1 to 4
for y=1 to 7
"D"&((i*10 )+y)="valor"
next
next

esto era para hacer las variable D11, D12, D13, .....
cuando lo suyo
era tan sencillo
D[i][y]=

La verdad es que estoy muy agradecido.
espero que la web y los colaboradores tengan un gran futuro.

Sí, todos deben ser del mismo tipo en una matriz. Pero no es necesario declararlos individualmente, lo importante es que se cree la instancia.

NexCheckbox dchk[] = {
 {3, 13, "c0"},
 {3, 14, "c1"},
 {3, 15, "c2"},
 {3, 16, "c3"},
 {3, 17, "c4"},
 {3, 18, "c5"},
// ...
};

➜ ponemos los parámetros del constructor entre {} para cada instancia.

también puede hacer una matriz 2D si lo desea. por ejemplo, si quisiera un 2 x 3 (observe el {})

NexCheckbox dchk[][3] = {
 {{3, 13, "c0"}, {3, 14, "c1"}, {3, 15, "c2"}},
 {{3, 16, "c3"}, {3, 17, "c4"}, {3, 18, "c5"}},
};

muchas gracias

como tengo muchos checkbox en la pantalla.
me aconsejarías intentar modificar la librería nextion, para que el checkbox devuelva un bool y no un uint32
esto seria para intentar reducir el tamaño de las variables globales del programa en el arduino (no se si funcionaria).

Saludos y gracias por tu tiempo, Jackson, he aprendido muchísimo

No, creo que deberías mantener el uin32_t ya que este es un tipo uniforme
se sabe que la biblioteca oficial es de mala calidad ...

hay otras bibliotecas que quizás estén más optimizadas, podrías explorar

ver también