C, ¿Cómo sería usando un FOR?

YA ESTÁ SOLUCIONADO, Gracias por haberte interesado ;)
Mira más abajo para encontrar la solución.

¿Cómo podría poner este código usando FOR(s) en C++?

   scrline[44].text = scrline[43].text;
   scrline[43].text = scrline[42].text;
   scrline[42].text = scrline[41].text;
   scrline[41].text = scrline[40].text;
   scrline[40].text = scrline[39].text;
   scrline[39].text = scrline[38].text;
   scrline[38].text = scrline[37].text;
   scrline[37].text = scrline[36].text;
   scrline[36].text = scrline[35].text;
   scrline[35].text = scrline[34].text;
   scrline[34].text = scrline[33].text;
   scrline[33].text = scrline[32].text;
   scrline[32].text = scrline[31].text;
   scrline[31].text = scrline[30].text;
   scrline[30].text = scrline[29].text;
   scrline[29].text = scrline[28].text;
   scrline[28].text = scrline[27].text;
   scrline[27].text = scrline[26].text;
   scrline[26].text = scrline[25].text;
   scrline[25].text = scrline[24].text;
   scrline[24].text = scrline[23].text;
   scrline[23].text = scrline[22].text;
   scrline[22].text = scrline[21].text;
   scrline[21].text = scrline[20].text;
   scrline[20].text = scrline[19].text;
   scrline[19].text = scrline[18].text;
   scrline[18].text = scrline[17].text;
   scrline[17].text = scrline[16].text;
   scrline[16].text = scrline[15].text;
   scrline[15].text = scrline[14].text;
   scrline[14].text = scrline[13].text;
   scrline[13].text = scrline[12].text;
   scrline[12].text = scrline[11].text;
   scrline[11].text = scrline[10].text;
   scrline[10].text = scrline[9].text;
   scrline[9].text = scrline[8].text;
   scrline[8].text = scrline[7].text;
   scrline[7].text = scrline[6].text;
   scrline[6].text = scrline[5].text;
   scrline[5].text = scrline[4].text;
   scrline[4].text = scrline[3].text;
   scrline[3].text = scrline[2].text;
   scrline[2].text = scrline[1].text;
   scrline[1].text = scrline[0].text;
   scrline[0].text = textoutput;
   PA_OutputText(1, 0, 0, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", scrline[23].text, scrline[22].text, scrline[21].text, scrline[20].text, scrline[19].text, scrline[18].text, scrline[17].text, scrline[16].text, scrline[15].text, scrline[14].text, scrline[13].text, scrline[12].text, scrline[11].text, scrline[10].text, scrline[9].text, scrline[8].text, scrline[7].text, scrline[6].text, scrline[5].text, scrline[4].text, scrline[3].text, scrline[2].text, scrline[1].text, scrline[0].text);


Aclaración:
  • PA_Outputtext es una función de una librería de NDS, equivalente a PRINTF de C, pero con algunas variantes.
  • scrline es un typedef que almacena un *char en text.
  • El "textoutput" es un char que se tiene que almacenar en "scrline[0].text"
  • Sólo se imprime en pantalla 24 líneas, pero se tiene que almacenar en memoria 45.
  • Por más que lo he intentado no funciona bien usando ordenes FOR. :(


Para que entendáis un poco el programa. Es para hacer un "efecto" a "la consola de comandos". Que conforme vaya escribiendo una línea en pantalla muestre las anteriores en líneas superiores a la última.

GRACIAS POR CUALQUIER AYUDA QUE ME PUEDAN OFRECER.
No programo para ds y menos para palib pero en principio podría quedar algo así...
notese que podríamos ganar eficiencia reduciendo los riesgos generados por la predicción de saltos dividiendo en dos for distintintos así nos ahorraríamos la condición de salto en el 50% de las instrucciones más o menos.
está sin compilar pero bueno

int i;

for ( i=43;i==0;i--){//recorremos el bucle al reves
    scrline[i+1].text = scrline[i].text;
    if(i<23)
         PA_OutputText(1, 0, 0, "%s\n",scrline[i].text);//como se imprime un retorno de carro en cada linea es igual que ponerlo todos juntos
}
scrline[0].text = textoutput; //realizamos la última asignación
PA_OutputText(1, 0, 0, "%s\n",scrline[0].text);//imprimimos la última asignación

Muchas gracias saulotmalo por la ayuda ;).

Tengo ahora mismo esto, pero sigue sin mostrar ningún mensaje si uso FOR(s).

Aclaro que SCRBUFFER es un DEFINE con valor 45, y SCRLINES es otro DEFINE con valor 23. También aclarar que "%c0" es para especificar como salida el color blanco al texto. Y el último FOR, es para asignar a "i" la línea (eje y, la primera línea tiene valor 0) donde va a imprimir el texto.

void output_screen(char *textoutput)
{
   // Thanks saulotmalo (EOL) to help me with this void!
   int i;
   for (i=SCRBUFFER-2;i==0;i--)
   {
       scrline[i+1].text = scrline[i].text;
   }
   scrline[0].text = textoutput;
   for (i=0;i>SCRLINES;i++)
   {
      PA_OutputText(1, 0, i, "%c0%s",scrline[SCRLINES-i].text);
   }
}


¿Qué estoy haciendo mal?
pues a ver.. lo que veo así a primera vista es que estas imprimiendo las lineas en orden inverso, aunque no sé si ese puede ser el problema, en tu ejemplo las imprimias primero el 23,22,21... y ahora lo haces al reves 0,1,2....
Gracias por la ayuda. Creo que es una limitación de las PALib, así que lo dejo parado durante un tiempo todo el tema de la scene.
void output_screen(char *textoutput)
{
// Thanks saulotmalo (EOL) to help me with this void!
int i;
for (i=SCRBUFFER-2;i==0;i--)
{
scrline[i+1].text = scrline[i].text;
}
scrline[0].text = textoutput;
for (i=0;i>SCRLINES;i++)
{
PA_OutputText(1, 0, i, "%c0%s",scrline[SCRLINES-i].text);
}
}

----------------------------

Sinceramente no he leido los primeros posts, aunque sí los últimos, pero ha sido suficiente para darme cuenta de que estás fallando en la manera de expresar la condición de realizar iteración en los bucles... tienes la lógica totalmente cambiada :-)

Como ves, te he resaltado en negrita las dos condiciones de realización de bucle que tienes escritas y que están, como digo, mal.

Sustitúyelas por las siguientes:

i==0 --> i>=0
i>SCRLINES --> i<=SCRLINES

y la función te quedará así:

void output_screen(char *textoutput)
{
  int i;
  for (i=SCRBUFFER-2;i>=0;i--)  scrline[i+1].text = scrline[i].text;
  scrline[0].text = textoutput;
  for (i=0;i<=SCRLINES;i++) PA_OutputText(1, 0, i, "%c0%s",scrline[SCRLINES-i].text);
}


Ya me cuentas.
TODO PERFECTO!! :D, ahora sí funciona todo bien!! ^^.
Gracias Wonder_Boy, y a saulotmalo por intentarlo ;).

Al final queda de la siguiente manera:
void output_screen(char *textoutput)
{
   // Thank to saulotmalo and Wonder_Boy (you make it possible), they help me with this void
   int i;
   for (i=SCRBUFFER-2;i>=0;i--)  scrline[i+1].text = scrline[i].text;
   scrline[0].text = textoutput;
   clear_screen();
   for (i=0;i<=SCRLINES;i++) PA_OutputText(1, 0, i, "%c0%s",scrline[SCRLINES-i].text);
}
A mí también me alegra mucho haberte sido de ayuda.
;-)
Humm, aparte de la correccion que te hn dicho, hay otro bug:

PA_OutputText(1, 0, i, "%c0%s",scrline[SCRLINES-i].text);

En la cadena "%c0%s" estas solicitando DOS parametros, uno de caracter y otro de cadena, pero yo solo veo que le pasas un parametro, scrline[SCRLINES-i].text
%c0 es para pintar en color blanco así que no necesita argumento.

por cierto!!! increible xDDD como pude poner eso? xD y luego acarreando el fallo hasta la saciedad... xD pa matarme xD
9 respuestas