Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kikian94 en 24 Noviembre 2013, 09:40 am



Título: paso de parametros a la funcion main y archvos pbm
Publicado por: kikian94 en 24 Noviembre 2013, 09:40 am
hola, tengo que hacer un programa que cree una imagen en formato pbm a traves de una secuencia de caracteres que se le pase mediante la funcion main, de forma:
nombreprograma.exe secuenciadigital
donde secuencia digital es una secuencia de unos y ceros de 32 caracteres como maximo, y dependiendo de si es un uno o un cero añadira a la imagen una o otra cosa de esta forma:

http://subefotos.com/ver/?0af5e21ed0cbbeddb34934e327b6f513o.png (http://subefotos.com/ver/?0af5e21ed0cbbeddb34934e327b6f513o.png)

hasta ahi todo bien, defino dos matrices multidireccionales, una para el 0 y otra para el uno, para que cada vez que haya un uno o un cero se cree cada fragmento, el problema es que no se como almacenar la cadena que me pasan, por ejemplo si me pasan 01001 tendria que verificar si es 0 o 1 el primer elemento y imprimirlo en una nueva matriz, con el segundo elemnto igual con el tercero lo mismo y asi hasta el ultimo, pero no se como se hace con los valores que son pasados como parametros a main.
alguen me echa una mano, gracias


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: fary en 24 Noviembre 2013, 12:21 pm
Código
  1. int main(int argc, char **argv)

Esos son los parámetros que se le pasan al main, y puedes trabajar con ellos como si fuera otra variable cualquiera.

un saludo!


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: kikian94 en 24 Noviembre 2013, 13:40 pm
pero lo que no entiendo es como acceder a cada uno de los caracteres de la secuencia que me pasan, quiero decir, el archivo del programa sera argc[0] y la secuencia argc[1] y a su vez argc[1] es una cadena de caracteres, como accedo a cada uno de esos valores de la cadena?


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: fary en 24 Noviembre 2013, 14:30 pm
Con un puntero, ej.

Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char **argv)
  4. {
  5.    char * puntero = argv[1];
  6.  
  7.    printf("Primer caracter de la cadena: %c y tercer caracter : %c\n",puntero[0],puntero[2]);
  8.    return 0;
  9. }
  10.  


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: xiruko en 24 Noviembre 2013, 14:35 pm
argc te dice el número de argumentos pasados al programa. El mismo nombre del programa cuenta como un argumento, por lo que si no le pasas ninguno más tendrá el valor 1.

argv es un array de cadenas con cada uno de los argumentos pasados. La primera es el mismo nombre del programa y a partir de ahí cada uno de los argumentos pasados.

Por ejemplo, imagínate que llamas a tu programa así:
Código:
./miprograma argumento1 argumento2

Entonces en tu programa los valores de esas dos variables serían:
Código:
argc=3
argv[0]="./miprograma"
argv[1]="argumento1"
argv[2]="argumento2"

Si no te queda aun muy claro, ejecuta este programa jugando un poco pasándole diversos números de parámetros.
Código
  1. #include <stdio.h>
  2. int main(int argc, char **argv)
  3. {
  4.     int i;
  5.     for (i=0; i<argc; i++) printf("Argumento %d: %s\n", i, argv[i]);
  6.     return 0;
  7. }

edito: Después de lo que dijo mDrinky, también puedes acceder a cada uno de los carácteres añadiendo un índice más a argv. Por ejemplo para acceder al primer y tercer carácter del primer argumento pasado al programa sería:
Código:
argv[1][0]     // primer caracter del primer argumento
argv[1][2]     // tercer caracter del primer argumento
argv[3][1]     // segundo caracter del tercer argumento

Saludos.


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: kikian94 en 24 Noviembre 2013, 17:18 pm
entonces para realizar la imagen tendria que verificar con un while si el caracter es un uno o un cero
Código
  1. while(argv[1][i]=='1' && argv[1][i]=='0')
y si es asi imprimir la parte de la imagen correspondiente no?


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: rir3760 en 24 Noviembre 2013, 17:35 pm
Casi. Debes utilizar el operador lógico OR para verificar si el carácter en turno es '1' o '0':
Código
  1. while (argv[1][i] == '1' || argv[1][i] == '0'){
  2.   /* ... */
  3. }
También puedes utilizar un bucle for para tener ahí la inicializacion del contador y su incremento después de cada iteración:
Código
  1. for (i = 0; argv[1][i] == '1' || argv[1][i] == '0'; i++){
  2.   /* ... */
  3. }

Un saludo


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: xiruko en 24 Noviembre 2013, 17:37 pm
No sé que es el formato pbm pero para hacer el programa que pides deberías seguir más o menos algo así:

1. primero verificar que el programa solo tenga 1 argumento y que éste solo esté compuesto por 1s y 0s.
2. para cada caracter del argumento, comprobar si es un 1 o un 0 y hacer lo que quieras hacer con eso.


Código
  1. // verificar que haya un solo argumento
  2. if (argc!=2)
  3. {
  4.    // manejas el error
  5.    return 1;
  6. }
  7.  
  8. // verificar que solo sean 1s y 0s
  9. for (i=0; argv[1][i]!='\0'; i++)
  10. {
  11.    if (argv[1][i]!='1' && argv[1][i]!='0')
  12.    {
  13.         // manejas el error
  14.         return 1;
  15.    }
  16. }
  17.  
  18. // procesas el argumento
  19. for (i=0; argv[1][i]!='\0', i++)
  20. {
  21.    if (argv[1][i]=='1')
  22.    {
  23.        // procesas los 1s
  24.    }
  25.    else
  26.    {
  27.        // procesas los 0s
  28.    }
  29. }

Saludos.


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: fary en 24 Noviembre 2013, 18:00 pm
Código
  1. // verificar que haya un solo argumento
  2. if (argc!=2)
  3. {
  4.   // manejas el error
  5.   return 1;
  6. }

@xiruko
Seria que no sea mayor a uno... si le paso 3 parametros que?   :rolleyes:


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: xiruko en 24 Noviembre 2013, 18:13 pm
@mDrinky Si le pasas 3 parámetros entonces entrará en el if y habrá que manejar el error, donde luego se acabará el programa con el return. Para continuar con el programa no se debería entrar en ese if, y la única condición para que no entre ahí es que tan solo haya 1 argumento (argc igual a 2), que es lo que el user pide.

kikian94 Ahora que me fijo me dejé la comprobación de que sean máximo 32 carácteres, aunque bueno para eso solo bastaría poner un contador dentro del bucle en el que verificas que solo hayan 1s y 0s y luego con un if comprobar que ese contador no sea mayor a 32; o sino también usando la función strlen().

Saludos.


Título: Re: paso de parametros a la funcion main y archvos pbm
Publicado por: kikian94 en 24 Noviembre 2013, 18:26 pm
esto es lo que llevo pero no consigo hacerlo funcionar
Código
  1. #include<stdio.h>
  2.  
  3. #define FILA 121
  4. #define COLUMNA 180
  5.  
  6. int main(int argc,char *argv[]){
  7.  
  8. char cero [FILA][COLUMNA];
  9. int i,j;
  10.  
  11. char uno [FILA][COLUMNA];
  12. int x,y;
  13.  
  14.  
  15. int z=0;
  16. int bit;
  17.  
  18. //Patron del bit 0
  19. for(i=0;i<115;i++)
  20. for(j=0;j<COLUMNA;j++)
  21. cero[i][j]='0';
  22. for(i=115;i<118;i++)
  23. for(j=0;j<COLUMNA;j++)
  24. cero[i][j]='1';
  25. for(i=118;i<FILA;i++)
  26. for(j=0;j<COLUMNA;j++)
  27. cero[i][j]='0';
  28.  
  29. //Patron del bit 1
  30.  
  31. for(x=0;x<115;x++)
  32. for(y=0;y<COLUMNA;y++)
  33. cero[x][y]='0';
  34. for(x=115;x<118;x++)
  35. for(y=0;y<COLUMNA;y++)
  36. cero[x][y]='1';
  37. for(x=118;x<FILA;x++)
  38. for(y=0;y<COLUMNA;y++)
  39. cero[x][y]='0';
  40.  
  41. if(argc>1){
  42. printf("ejecute de nuevo el programa");
  43. }else{
  44.  
  45.  
  46. while(argv[1][z]=='1' && argv[1][z]=='0'){
  47. if(argv[1][z]=='1'){
  48. for(x=0;x<115;x++)
  49. for(y=0+bit;y<COLUMNA+bit;y++)
  50. printf("%c ",cero[x][y]);
  51. for(x=115;x<118;x++)
  52. for(y=0+bit;y<COLUMNA+bit;y++)
  53. printf("%c ",cero[x][y]);
  54. for(x=118;x<FILA;x++)
  55. for(y=0+bit;y<COLUMNA+bit;y++)
  56. printf("%c ",cero[x][y]);
  57. }
  58. if(argv[1][z]=='0'){
  59. for(i=0;i<115;i++)
  60. for(j=0+bit;j<COLUMNA+bit;j++)
  61. printf("%c ",uno[i][j]);
  62. for(i=115;i<118;i++)
  63. for(j=0+bit;j<COLUMNA+bit;j++)
  64. printf("%c ",uno[i][j]);
  65. for(i=118;i<FILA;i++)
  66. for(j=0+bit;j<COLUMNA+bit;j++)
  67. printf("%c ",uno[i][j]);
  68. }
  69.  
  70. bit=bit+COLUMNA;
  71. z++;
  72. }
  73.  
  74.  
  75.  
  76. }
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84. return 0;
  85. }
  86.