Error al definir array char en DEV-CPP

Iniciado por DA KILLER, 25 Febrero 2012, 05:14 AM

0 Miembros y 1 Visitante están viendo este tema.

DA KILLER

Saludos gente, como andan, perdón por no pasar pero estoy muy ocupado, es más casi ni he programado últimamente, y al volver me encontré con una laguna:

¿Cómo hago para pasar el valor de un argumento pasado al programa a un array char (string)?

Utilizo el compilador DEV-CPP 4.9.9.2 (Me ví obligado a hacerlo :'()

No recuerdo si era con un puntero o como era, era algo parecido a pasar un pointer a un valor de una estructura (creo).

Dejo el source, no hay apuro puesto que sólo es algo que se me dío por hacer, pero no me acuerdo :$

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

void Cls();

int main(int argc, char *argv[])
{

    int i, size;
   
    size = ((sizeof argv[1]) - 1);
   
    char current[size] = argv[1];

    i = 0;
    // Animación del texto...
    loop:
    Cls(); // Para no utilizar system("Cls");
    current[size] = current [0];
    for ( i = 0; i < size; i++ )
                               {
                               cout << current[i];
                               if (i != size)
                                            { current[i]= current[i+1]; }
                               }

    goto loop;
   
return 0; // En realidad nunca termina (por ahora)
}

void Cls()

{
     int i;
     i = 0;
     for ( i = 0; i < 2000; i++ )
                                {cout << " ";}
}


Desde ya gracias y saludos a todos!

PD: Si saben de alguna alternativa más veloz y portable a mi void Cls(); les estaré doblemente agradecido, como siempre las críticas son bienvenidas, bytes!
.: DA KILLER :.



x64core

creo entender :P pasas un argumento a un programa luego lo quieres obtener, pues veo que vas bien
solo que para copiarlo tengo entendido que puede usar la funcion memcpy para copiar los datos

naderST

Recuerda que en C/C++ no se pueden asignar arreglos, es decir, no puedes hacer esto arreglo1 = arreglo2 (NO COMPILA) en este caso deberías usar memcpy como te habían mencionado. Otra cosa creo que sizeof() lo estás usando creyendo que hace lo mismo que strlen(). sizeof() no devuelve la longitud de una cadena, devuelve el tamaño en bytes de un tipo específico de datos.

PD: No se por qué estás usando "C++" si lo único que usas es cout. Yo en tu caso utilizaría C.

satu

Hola

Otra cosa SÚPER IMPORTANTE NO UTILIZAR GOTO.

Casi se me caen los ojos.

Y tampoco está bien hacer esto:

Código (cpp) [Seleccionar]

int size;
size = ((sizeof argv[1]) - 1);
char current[size] = argv[1];


es un fallo común, pero no está bien reservar memoria de esa forma en tiempo de ejecución. Para hacerlo de esa forma utiliza

Código (cpp) [Seleccionar]

int size;
char *current;
size = ((sizeof argv[1]) - 1);
current = new char[size];


Saludos
Breakbeat como forma de vida

armizh

Para limpiar la pantalla puedes hacer algo mas o menos asi:
Código (cpp) [Seleccionar]
#ifdef __WIN32__ || __MSDOS__
system("cls");
#endif
#ifdef __unix__
system("clear");
#endif

Claro que no sera tan portable, pero __unix__ abarca muchos sistemas operativos por lo que puede servir.
Cita de: satu en 25 Febrero 2012, 21:52 PM
Otra cosa SÚPER IMPORTANTE NO UTILIZAR GOTO.
goto es un problema solo cuando es mal utilizado, puede que muchas veces hayan opciones mucho mas eficientes (while, for, do...while) pero en ciertos casos hay que utilizarlo.
Pero en este caso no lo veo necesario xd. Si por ahora quiere que no se detenga nunca puede hacer esto:
Código (cpp) [Seleccionar]
    while(1) {
        Cls(); // Para no utilizar system("Cls");
        current[size] = current [0];
        for ( i = 0; i < size; i++ ) {
            cout << current[i];
            if (i != size) current[i]= current[i+1];
        }

Simplemente espera a que 1 sea igual a 0 lo cual jamas ocurrira ;D O tambien se puede hacer:
Código (cpp) [Seleccionar]
    for(;;) {
        Cls(); // Para no utilizar system("Cls");
        current[size] = current [0];
        for ( i = 0; i < size; i++ ) {
            cout << current[i];
            if (i != size) current[i]= current[i+1];
        }

Punto importante: si un while, for, o lo que sea solo contiene una instruccion, mejor que no pongas los parentesis.
Ejemplo:
Código (cpp) [Seleccionar]
if(a<b) {
    std::cout << "Hola!" << std::endl;
} //Esto queda un poco raro y aveces ilegible, ademas de usar espacio de mas
if(a<b)
    std::cout << "Hola!" << std::endl;
//ocupa mucho menos espacio
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

DA KILLER

Primero que nada gracias a todos por sus respuestas.

Cita de: naderST en 25 Febrero 2012, 15:44 PM
PD: No se por qué estás usando "C++" si lo único que usas es cout. Yo en tu caso utilizaría C.

Porque tengo entendido que C++ es mejor para lo que es OOP, como sólo conozco las bases (iteración, selección, asignación, &c.) aún no me hace mucha diferencia, pero voy a tenerlo en cuenta.

Cita de: satu en 25 Febrero 2012, 21:52 PM
Otra cosa SÚPER IMPORTANTE NO UTILIZAR GOTO.

A muchos no les gusta el goto y no encuentro una razón válida para ello, se me quedó pegado del batch xD

Cita de: satu en 25 Febrero 2012, 21:52 PM
Código (cpp) [Seleccionar]

int size;
char *current;
size = ((sizeof argv[1]) - 1);
current = new char[size];


Sabía que por ahí era la cosa xD, muchísimas gracias! ;-)

Gracias armizh, pero no tengo claro todavía como funcionan esas definiciones, lo intentaré, tampoco sabía lo de el while(1) y por más que sea una única línea en los bucles for utilizo las llaves porque normalmente le voy agregando más código, y me parece más estructurado.

En fin gracias a todos y pueden cerrar el post ;)
.: DA KILLER :.



satu

Hola

Cita de: armizh en 25 Febrero 2012, 23:18 PM
goto es un problema solo cuando es mal utilizado, puede que muchas veces hayan opciones mucho mas eficientes (while, for, do...while) pero en ciertos casos hay que utilizarlo.

Estás equivocado, C/C++ son lenguajes de programación estructurados y el GOTO rompe la programación estructurada.


Cita de: Wikipedia
C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos).


Programación estructurada
Cita de: Wikipedia

La programación estructurada es una técnica para escribir programas (programación de computadora) de manera clara. Para ello se utilizan únicamente tres estructuras: secuencia, selección e iteración; siendo innecesario el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN).

Saludos
Breakbeat como forma de vida