Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DA KILLER en 25 Febrero 2012, 05:14 am



Título: Error al definir array char en DEV-CPP
Publicado por: DA KILLER en 25 Febrero 2012, 05:14 am
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
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. void Cls();
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.  
  11.    int i, size;
  12.  
  13.    size = ((sizeof argv[1]) - 1);
  14.  
  15.    char current[size] = argv[1];
  16.  
  17.    i = 0;
  18.    // Animación del texto...
  19.    loop:
  20.    Cls(); // Para no utilizar system("Cls");
  21.    current[size] = current [0];
  22.    for ( i = 0; i < size; i++ )
  23.                               {
  24.                               cout << current[i];
  25.                               if (i != size)
  26.                                            { current[i]= current[i+1]; }
  27.                               }
  28.  
  29.    goto loop;
  30.  
  31. return 0; // En realidad nunca termina (por ahora)
  32. }
  33.  
  34. void Cls()
  35.  
  36. {
  37.     int i;
  38.     i = 0;
  39.     for ( i = 0; i < 2000; i++ )
  40.                                {cout << " ";}
  41. }
  42.  

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!


Título: Re: Error al definir array char en DEV-CPP
Publicado por: x64core en 25 Febrero 2012, 05:37 am
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


Título: Re: Error al definir array char en DEV-CPP
Publicado por: naderST en 25 Febrero 2012, 15:44 pm
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.


Título: Re: Error al definir array char en DEV-CPP
Publicado por: satu en 25 Febrero 2012, 21:52 pm
Hola

Otra cosa SÚPER IMPORTANTE NO UTILIZAR GOTO.

Casi se me caen los ojos.

Y tampoco está bien hacer esto:

Código
  1. int size;
  2. size = ((sizeof argv[1]) - 1);
  3. char current[size] = argv[1];
  4.  

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
  1. int size;
  2. char *current;
  3. size = ((sizeof argv[1]) - 1);
  4. current = new char[size];
  5.  

Saludos


Título: Re: Error al definir array char en DEV-CPP
Publicado por: armizh en 25 Febrero 2012, 23:18 pm
Para limpiar la pantalla puedes hacer algo mas o menos asi:
Código
  1. #ifdef __WIN32__ || __MSDOS__
  2. system("cls");
  3. #endif
  4. #ifdef __unix__
  5. system("clear");
  6. #endif
Claro que no sera tan portable, pero __unix__ abarca muchos sistemas operativos por lo que puede servir.
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
  1.    while(1) {
  2.        Cls(); // Para no utilizar system("Cls");
  3.        current[size] = current [0];
  4.        for ( i = 0; i < size; i++ ) {
  5.            cout << current[i];
  6.            if (i != size) current[i]= current[i+1];
  7.        }
Simplemente espera a que 1 sea igual a 0 lo cual jamas ocurrira ;D O tambien se puede hacer:
Código
  1.    for(;;) {
  2.        Cls(); // Para no utilizar system("Cls");
  3.        current[size] = current [0];
  4.        for ( i = 0; i < size; i++ ) {
  5.            cout << current[i];
  6.            if (i != size) current[i]= current[i+1];
  7.        }
Punto importante: si un while, for, o lo que sea solo contiene una instruccion, mejor que no pongas los parentesis.
Ejemplo:
Código
  1. if(a<b) {
  2.    std::cout << "Hola!" << std::endl;
  3. } //Esto queda un poco raro y aveces ilegible, ademas de usar espacio de mas
  4. if(a<b)
  5.    std::cout << "Hola!" << std::endl;
  6. //ocupa mucho menos espacio


Título: Re: Error al definir array char en DEV-CPP
Publicado por: DA KILLER en 27 Febrero 2012, 01:44 am
Primero que nada gracias a todos por sus respuestas.

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.

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

Código
  1. int size;
  2. char *current;
  3. size = ((sizeof argv[1]) - 1);
  4. current = new char[size];
  5.  

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 ;)


Título: Re: Error al definir array char en DEV-CPP
Publicado por: satu en 27 Febrero 2012, 13:39 pm
Hola

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 (http://es.wikipedia.org/wiki/Programaci%C3%B3n_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