Tu puedes definir el tamaño máximo del array, digamos 50. Para controlar el número de datos por consulta, debes preguntar antes, cuántos números serán ingresados para el cálculo. De esta forma podrás controlar el tamaño de la muestra.
Lo que sigue es almacenar los datos en el array. Luego de finalizada la consulta, puedes optar por agregar una rutina para reiniciar el array en ceros para una nueva consulta o bien para repetir el cálculo de la última serie de datos.

De esta forma el array puede ser manipulado dato por dato.
#include <GDXT4X.h>
#define NMax 50
int ArrayNumeros[NMax];
int Cuadrados[NMax];
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";
int espera = 145;
int x;
char PresentaDatos[50];
int NDatosConsul=0;
int Consulta = 0;
int Valor =0;
int errorNDatos=0;
int Ingresa = 0;
int BaseDatos=0;
void setup()
{
GD.begin();
MP();
}
void loop(){}
void updateStr(int val)
{
if (stCurrentLen<20)
{
stCurrent[stCurrentLen]=val;
stCurrent[stCurrentLen+1]='\0';
stCurrentLen++;
}
}
void MP()
{
while(1)
{
GD.Clear();
GD.get_inputs();
GD.SaveContext();
GD.cmd_fgcolor(0x005000); GD.ColorRGB(0x000000);
GD.Tag(13); GD.cmd_button(50, 50, 380, 60, 29, 0, "No. de datos para consultar:"); GD.Tag(255);
GD.ColorRGB(0x005000); GD.cmd_number(50+380+50, 60, 30, 0, NDatosConsul);
if (Ingresa==1)
{
GD.cmd_fgcolor(0x505050); GD.ColorRGB(0x000000);
GD.cmd_button(50, 50, 380, 60, 29, 0, "No. de datos para consultar:");
GD.cmd_fgcolor(0x005000); GD.ColorRGB(0x000000);
GD.Tag(14); GD.cmd_button(50, 50+60+15, 380, 60, 29, 0, "Ingresa valores"); GD.Tag(255);
}
GD.RestoreContext();
if (Consulta==1)
{
Teclado(60,50+50+40);
}
if (Consulta==2)
{
if(BaseDatos>=NDatosConsul)
{
GD.ColorRGB(0x500000); GD.cmd_text(60+200, 480-20, 28, OPT_CENTER, "Limite alcanzado"); Consulta=3;
}
else{
Teclado(75,50+50+40+30);
}
}
if (Consulta==3)
{
for (int j = 0; j < NDatosConsul; j++)
{
Cuadrados[j]= ArrayNumeros[j]*ArrayNumeros[j];
sprintf(PresentaDatos,"Dato[%d] = %d %d", j, ArrayNumeros[j], Cuadrados[j]); GD.cmd_text(60+600, 75 + 25*(j+1), 28, OPT_CENTER, PresentaDatos);
}
if(BaseDatos>=NDatosConsul)
{
GD.SaveContext();
GD.cmd_fgcolor(0x500000); GD.ColorRGB(0xffffff);
GD.Tag(15); GD.cmd_button(50, 50+60+15, 380, 60, 29, 0, "Reiniciar base de datos"); GD.Tag(255);
GD.RestoreContext();
}
}
if (GD.inputs.tag==13)
{
delay(espera);
Consulta = Consulta + 1;
if(Consulta>=2){Consulta=0;}
}
if (GD.inputs.tag==14)
{
delay(espera);
Consulta = 2;
}
if (GD.inputs.tag==15)
{
delay(espera);
for (int j = 0; j < NDatosConsul; j++)
{
ArrayNumeros[j] = 0;
}
NDatosConsul=0;
Consulta = 0;
Valor =0;
errorNDatos=0;
Ingresa = 0;
BaseDatos=0;
}
GD.swap();
}
}
void Teclado(int PX, int PY)
{
// while(1)
// {
// GD.Clear();
// GD.get_inputs();
GD.SaveContext();
GD.cmd_fgcolor(0x505000); GD.ColorRGB(0x000000);
GD.Tag(1); GD.cmd_button(PX, PY, 120, 60, 29, 0, "1"); GD.Tag(255);
GD.Tag(2); GD.cmd_button(PX+120+10, PY, 120, 60, 29, 0, "2"); GD.Tag(255);
GD.Tag(3); GD.cmd_button(PX+120+10+120+10, PY, 120, 60, 29, 0, "3"); GD.Tag(255);
GD.Tag(4); GD.cmd_button(PX, PY+60+10, 120, 60, 29, 0, "4"); GD.Tag(255);
GD.Tag(5); GD.cmd_button(PX+120+10, PY+60+10, 120, 60, 29, 0, "5"); GD.Tag(255);
GD.Tag(6); GD.cmd_button(PX+120+10+120+10, PY+60+10, 120, 60, 29, 0, "6"); GD.Tag(255);
GD.Tag(7); GD.cmd_button(PX, PY+60+10+60+10, 120, 60, 29, 0, "7"); GD.Tag(255);
GD.Tag(8); GD.cmd_button(PX+120+10, PY+60+10+60+10, 120, 60, 29, 0, "8"); GD.Tag(255);
GD.Tag(9); GD.cmd_button(PX+120+10+120+10, PY+60+10+60+10, 120, 60, 29, 0, "9"); GD.Tag(255);
GD.Tag(10); GD.cmd_button(PX, PY+60+10+60+10+60+10, 120, 60, 29, 0, "C"); GD.Tag(255);
GD.Tag(11); GD.cmd_button(PX+120+10, PY+60+10+60+10+60+10, 120, 60, 29, 0, "0"); GD.Tag(255);
GD.cmd_fgcolor(0x005000); GD.ColorRGB(0xffffff);
GD.Tag(12); GD.cmd_button(PX+120+10+120+10, PY+60+10+60+10+60+10, 120, 60, 29, 0, "->"); GD.Tag(255);
GD.RestoreContext();
if (GD.inputs.tag==1)
{
delay(espera);
updateStr('1');
}
if (GD.inputs.tag==2)
{
delay(espera);
updateStr('2');
}
if (GD.inputs.tag==3)
{
delay(espera);
updateStr('3');
}
if (GD.inputs.tag==4)
{
delay(espera);
updateStr('4');
}
if (GD.inputs.tag==5)
{
delay(espera);
updateStr('5');
}
if (GD.inputs.tag==6)
{
delay(espera);
updateStr('6');
}
if (GD.inputs.tag==7)
{
delay(espera);
updateStr('7');
}
if (GD.inputs.tag==8)
{
delay(espera);
updateStr('8');
}
if (GD.inputs.tag==9)
{
delay(espera);
updateStr('9');
}
if (GD.inputs.tag==10)
{
delay(espera);
stCurrent[0]='\0';
stCurrentLen=0;
Valor =0;
}
if (GD.inputs.tag==11)
{
delay(espera);
updateStr('0');
}
if (GD.inputs.tag==12)
{
delay(espera);
if (stCurrentLen>0)
{
for (x=0; x<stCurrentLen+1; x++)
{
stLast[x]=stCurrent[x];
}
stCurrent[0]='\0';
stCurrentLen=0;
}
//Valor = atof(stLast); //número flotante
Valor = atol(stLast); //número entero
if(Consulta==1){
NDatosConsul = Valor;
if(NDatosConsul>=NMax)
{
errorNDatos =1;
}else{Consulta=0; Valor =0; errorNDatos =0; Ingresa=1; MP();
stCurrent[0]='\0';
stCurrentLen=0;
}
}
if(Consulta==2){
//NDatosConsul = Valor;
ArrayNumeros[BaseDatos]=Valor;
if(NDatosConsul>=NMax)
{
errorNDatos =1;
}else{Consulta=3; Valor =0; errorNDatos =0; Ingresa=1; BaseDatos =BaseDatos+1; MP();
stCurrent[0]='\0';
stCurrentLen=0;
}
}
}
GD.SaveContext();
for (int j = 0; j < NDatosConsul; j++)
{
Cuadrados[j]= ArrayNumeros[j]*ArrayNumeros[j];
sprintf(PresentaDatos,"Dato[%d] = %d %d", j, ArrayNumeros[j], Cuadrados[j]); GD.cmd_text(60+600, 75 + 25*(j+1), 28, OPT_CENTER, PresentaDatos);
}
if(errorNDatos==1){ GD.ColorRGB(0x500000); GD.cmd_text(PX+200, 480-20, 28, OPT_CENTER, "Por favor ingresa otro valor para consulta");}
GD.ColorRGB(0x505000); GD.cmd_text(PX+400, PY, 31, 0, stCurrent);
GD.RestoreContext();
// GD.swap();
// }
}
Puedes usar como base para procesar entradas numéricas desde un teclado, el ejemplo URTouch_ButtonTest.ino de la librería URTouch. En este caso lo ajusté para una pantalla FT813 de 5" con la libreria GDXT4X, una variante de la libreria para gameduino 23X, que estoy adaptando para placas teensy 4 y 4.1
