• Domingo 17 de Noviembre de 2024, 12:19

Autor Tema:  Cómo Poner Varios Espacios Seguidos  (Leído 4642 veces)

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Cómo Poner Varios Espacios Seguidos
« en: Viernes 25 de Junio de 2004, 15:33 »
0
Hola.

He hecho un pequeño programa que lee un fichero de C++ y genera la sintaxis coloreada usando los tags del foro, para que quede el código bien claro. El problema es que si pongo varios espacios seguidos (porque las tabulaciones las convierto en espacios) al postearlo en el foro desaparecen, y pierdo la justificación del código. ¿Hay alguna manera de conservar los espacios sin usar el tag CODE (porque no me deja colorear CODE)?

Muchas gracias.

Ruben3d

PD: Si consigo sulocionar lo de los espacios haré una versión para Pascal.

PD2: Dejo un ejemplo de lo que genera el programa con un fichero de prueba. Se puede ver cómo todos los grupos de uno o más espacios son reducidos a uno al ser mostrado por el foro:


//
// ejcpp.cpp
//

/*

Fichero C++ de ejemplo

todo] Introducir más cosas

*/


#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>

using namespace std;

// Directiva multilinea
#define ASSERT(x)    if (!(x))    \
                    {            \
                        cout << "La condicion \"" << #x << "\" ha fallado en " << __FILE__ << ":" << __LINE__ << endl;    \
                        abort();    \
                    }


/*
    CLASE CEscritor
    Escribe el texto que se le asigne.
*/

class CEscritor
{
public:
    CEscritor(string str) : m_str(str) {}

    // Escribe el texto asignado mediante el constructor o asignar()
    void escribir();

    // Le asigna un texto que se escribirá mediante asignar()
    void asignar(string &str);

private:
    std::string m_str;
};

void CEscritor::escribir()
{
    for (int i=0; i<5; i++)
        cout << m_str << endl;
}

void CEscritor::asignar(string &str)
{
    m_str = str;
}

/* Punto de entrada del programa */
int main(int argc, char **argv[])
{
    CEscritor *pEscritor = new CEscritor(string("Este texto tiene \"comillas dobles\""));
    ASSERT(pEscritor != NULL);            // Comprueba que nada haya fallado.
    pEscritor->escribir();
    delete pEscritor;                    // Libera la memoria
    char c = '\'';
    char ch = '\xA2';
    printf("El valor de 'c' es: %c.\n", c);
    printf("Un float: %02.2f.\n", 4.2356f);
    double d = 3.675;
    unsigned short int usi = 0xA2;
    getchar();
    return 0;
}

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #1 en: Viernes 25 de Junio de 2004, 15:51 »
0
Bueno. He llegado a una solución provisional poniendo el carácter '·' de color amarillo, de forma que se ve poco. Lo ideal sería tener un tag como el PRE de HTML para que la gente pudiera copiar y pegar el código sin tener que quitar los puntos que hacen de espacio. De esta manera queda así:


//
//·ejcpp.cpp
//

/*

Fichero·C++·de·ejemplo

todo:·Introducir·más·cosas

*/


#include·<iostream>
#include·<string>
#include·<cstdio>
#include·<cstdlib>

using·namespace·std;

//·Directiva·multilinea
#define·ASSERT(x)····if·(!(x))····\
····················{············\
························cout·<<·"La·condicion·\""·<<·#x·<<·"\"·ha·fallado·en·"·<<·__FILE__·<<·":"·<<·__LINE__·<<·endl;····\
························abort();····\
····················}


/*
····CLASE·CEscritor
····Escribe·el·texto·que·se·le·asigne.
*/

class·CEscritor
{
public:
····CEscritor(string·str)·:·m_str(str)·{}

····//·Escribe·el·texto·asignado·mediante·el·constructor·o·asignar()
····void·escribir();

····//·Le·asigna·un·texto·que·se·escribirá·mediante·asignar()
····void·asignar(string·&str);

private:
····std::string·m_str;
};

void·CEscritor::escribir()
{
····for·(int·i=0;·i<5;·i++)
········cout·<<·m_str·<<·endl;
}

void·CEscritor::asignar(string·&str)
{
····m_str·=·str;
}

/*·Punto·de·entrada·del·programa·*/
int·main(int·argc,·char·**argv[])
{
····CEscritor·*pEscritor·=·new·CEscritor(string("Este·texto·tiene·\"comillas·dobles\""));
····ASSERT(pEscritor·!=·NULL);············//·Comprueba·que·nada·haya·fallado.
····pEscritor->escribir();
····delete·pEscritor;····················//·Libera·la·memoria
····char·c·=·'\'';
····char·ch·=·'\xA2';
····printf("El·valor·de·'c'·es:·%c.\n",·c);
····printf("Un·float:·%02.2f.\n",·4.2356f);
····double·d·=·3.675;
····unsigned·short·int·usi·=·0xA2;
····getchar();
····return·0;
}

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #2 en: Viernes 25 de Junio de 2004, 18:56 »
0
Tiene muy buena pinta el código coloreado.

Una pregunta: el único problema que has encontrado es el de los espacios o hay alguno más? Por ejemplo, si tienes una línea de código del tipo

Código: Text
  1. cadena[i] = 'a';
  2.  

¿convertirá el texto en cursiva desde el = en adelante o has encontrado algún truquillo para que no lo convierta?

Un saludo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #3 en: Viernes 25 de Junio de 2004, 19:03 »
0
Horror, no me lo había planteado. Sólo se me ocurre meter un espacio después de cada '[' de manera sistemática, para evitar que coincida con algún tag, aunque puede quedar un poco feo si no meto otro delante de los ']'. A no ser que exista alguna manera de poner un [ i ] u otros tags sin que lo interprete como tag, pero me da que no.

Un saludo.

Ruben3d

EDIT: Bueno, parece que no queda tan mal con el invento de los espacios. Un poco espacioso, pero bueno. Pongo una comparación con cómo se vería con el tag CODE.

Código: Text
  1. // test.cpp
  2.  
  3. void funcion()
  4. {
  5.   char array[256];
  6.  
  7.   for (int i=0; i&#60;256; i++)
  8.   {
  9.     array[i] = i;
  10.   }
  11. }
  12.  

//·test.cpp

void·funcion()
{
····char·array[ 256 ];

····for·(int·i=0;·i<256;·i++)
····{
········array[ i ]·=·i;
····}
}

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #4 en: Viernes 25 de Junio de 2004, 19:15 »
0
Creo que lo mejor será crear un tag nuevo, que sea como el CODE pero que reconozca el tag COLOR. Aparte del COLOR utilizas alguno más?

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #5 en: Viernes 25 de Junio de 2004, 19:17 »
0
Uso COLOR para los colores y FONT, para establecer Courier. ¡Muchas gracias por el interés! Cuando tenga la versión de Pascal lo pondré en la sección de Código Fuente o Utilidades (van los dos juntos en el mismo programa y se selecciona el lenguaje por parámetro).

Un saludo.

Ruben3d

vradok

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #6 en: Viernes 25 de Junio de 2004, 19:17 »
0
Si te preocupa el espacio siempre puedes poner un solo espacio , (aunque asi quiza el codigo sea menos legible  :( ). Me explico:

Código: Text
  1. posicion[ i]='c'
  2.  

Un saludo
********************************************************
                  ladrones

vradok

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #7 en: Viernes 25 de Junio de 2004, 19:19 »
0
Por cierto , espero con interes la version en Pascal. Tu idea me ha parecido muy buena
********************************************************
                  ladrones

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #8 en: Viernes 25 de Junio de 2004, 19:27 »
0
Vale, te respondí sin ver lo que habías añadido. No queda mal aunque el problema es lo que decías del copiar y pegar código porque luego hay que ir quitando los espacios.

Este fin de semana estoy liado pero la semana que viene lo investigaré a fondo. Lo del cambio de fuente a Courier se hará automático al poner el tag, así solo nos preocupamos por cambiar los tags COLOR, vale?

Un saludo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #9 en: Viernes 25 de Junio de 2004, 19:35 »
0
De acuerdo. Gracias de nuevo. Por otro lado, este programilla es una modificación de otro que ya tengo hecho que genera la salida en HTML. Cuando genero para Pascal lo hago con el fondo negro y con colores parecidos a los de FreePascal, aunque ya veré cómo adapto los colores para fondo claro.

Un saludo.

Ruben3d

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #10 en: Martes 29 de Junio de 2004, 13:42 »
0
Esto es una prueba.

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->//
// ejcpp.cpp
//

/*

Fichero C++ de ejemplo


todo: Introducir más cosas

*/


#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>


using namespace std;

// Directiva multilinea
#define ASSERT(x)    if (!(x))    \
                    {            \
                        cout << "La condicion \"" << #x << "\" ha fallado en " << __FILE__ << ":" << __LINE__ << endl;    \
                        abort();    \
                    }


/*
    CLASE CEscritor
    Escribe el texto que se le asigne.
*/

class CEscritor
{
public:
    CEscritor(string str) : m_str(str) {}

    // Escribe el texto asignado mediante el constructor o asignar()
    void escribir();

    // Le asigna un texto que se escribirá mediante asignar()
    void asignar(string &str);

private:
    std::string m_str;
};

void CEscritor::escribir()
{
    for (int i=0; i<5; i++)
        cout << m_str << endl;
}

void CEscritor::asignar(string &str)
{
    m_str = str;
}

void funcion()
{
    char array[256];
    for (int i=0; i<256; i++)
    {
        array[i] = i;
    }
}


/* Punto de entrada del programa */
int main(int argc, char **argv[])
{
    CEscritor *pEscritor = new CEscritor(string("Este texto tiene \"comillas dobles\""));
    ASSERT(pEscritor != NULL);            // Comprueba que nada haya fallado.
    pEscritor->escribir();
    delete pEscritor;                    // Libera la memoria
    char c = '\'';
    char ch = '\xA2';
    printf("El valor de 'c' es: %c.\n", c);
    printf("Un float: %02.2f.\n", 4.2356f);
    double d = 3.675;
    unsigned short int usi = 0xA2;
    getchar();
    return 0;
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #11 en: Martes 29 de Junio de 2004, 14:00 »
0
Bueno, creo que ya sale bien :) Puedes probarlo usando el tag XCODE

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #12 en: Martes 29 de Junio de 2004, 14:03 »
0
¡Gracias! Voy a acabar la versión de Pascal y lo subo a la sección de Código fuente.

Un saludo.

Ruben3d

iron man

  • Administrador
  • ******
  • Mensajes: 1137
  • Nacionalidad: es
    • Ver Perfil
    • http://www.solocodigo.com/
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #13 en: Martes 29 de Junio de 2004, 14:29 »
0
Gracias a ti por la aportación :yes:

Un saludo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #14 en: Martes 29 de Junio de 2004, 14:41 »
0
La versión de Pascal ya parece que funciona bien, no se ve tan bien como en HTML pero no está mal. No pongo el archivo entero, sólo un fragmento para que se vea.

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
(* --- FRAGMENTO --- *)

BEGIN { **** PROGRAMA PRINCIPAL **** }

  { Este es el valor de las variables, a no ser que las sobreescriba el CFG }
  r_ScreenWidth := 640;
  r_ScreenHeight := 480;
  r_VideoMode := 2; { 640x480 }
  r_DrawMode := 0; { Solo caras }
  r_LightMode := 2; { Posicion de luz omni }
  r_NormalizarColor := False; { Por defecto apagado }
  r_MostrarFPS := True;
  r_MostrarInfoObjeto := True;
  r_MostrarInfoRender := True;
  m_RotarObjeto := False; { Por defecto no se rota }
  fichero := 'nudo.geo'; { Por defecto abre este archivo }


  { Cuerpo del programa }
  { =================== }
    if cargarAplicacion then
      motor3d;
  { =================== }
  { Fin del programa    }

  { Libera la mem. de las pantallas virtuales. }
  kill_VW(r_Pantalla);
  kill_VW(r_Borrador);
  kill_VW(r_ZBuffer);

  { Descarga el objeto }
  objeto.done;

  { Se cierra el modo grafico }
  kill_graph;

  { Se chequea la memoria. }
  CHECKMEMORY;

  { Se da de baja la clase y se termina. }
  TERMINATE;

END.

<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Cómo Poner Varios Espacios Seguidos
« Respuesta #15 en: Martes 29 de Junio de 2004, 14:48 »
0
Y la versión de C++ funciona también bien. Voy a juntar todo y subirlo.

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->

#include <stdio.h>
#define N 8

void llenar_vector(int v[])
{
    int i;
    for (i=0; i<N; i++)
     {
        printf ("ingresa elemento v[%d]: ", i);
        // Fijate, le paso la dir. de memoria con '&'
        scanf ("%d", &v[i]);
    }
}

void mostrar_vector(int v[])
{
    int i;
    for (i=0; i<N; i++)
     {
        printf ("Elemento v[%d]: %d\n", i, v[i]);
    }
}

int main (int argc, char **argv)
{
    int notas[N];
    llenar_vector(notas);
    mostrar_vector(notas);
    
    // Para que se pause antes de acabar
    fflush(stdin);
    getchar();

    return(0);
}

<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->