elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calculadora en Win API no imprime el resultado
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calculadora en Win API no imprime el resultado  (Leído 3,490 veces)
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Calculadora en Win API no imprime el resultado
« en: 11 Septiembre 2011, 18:33 pm »

Buenas, en mis avances con la API de windows he conseguido hacer una calculadora muy básica con interfaz, sin embargo no me imprime el resultado, asi que después de varios días dándole vueltas y de habérselo planteado a un par de conocidos que no han encontrado el fallo lo posteo aqui:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. //ID´s
  6. enum {ID_LABEL, ID_EDIT, ID_BOTONIGUAL, ID_BOTONSUMAR, ID_BOTONRESTAR, ID_BOTONMULTIPLICAR, ID_BOTONDIVIDIR, ID_BOTONCOMA, ID_BOTONSIGNO, ID_BOTONCERO, ID_BOTON1, ID_BOTON2, ID_BOTON3, ID_BOTON4, ID_BOTON5, ID_BOTON6, ID_BOTON7, ID_BOTON8, ID_BOTON9};
  7.  
  8.  
  9. //Prototipos
  10. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  11.  
  12. void imprimirEdit (int i);                                                  //Funcion que concatena los numeros al hacer clic en los botones
  13. double calcular (double primer_num, double segundo_num, int operacion);     //Funcion que realiza las operaciones
  14.  
  15. HINSTANCE estancia;
  16. HWND label;
  17. HWND edit;
  18. //Botones->Numeros
  19. HWND boton1;
  20. HWND boton2;
  21. HWND boton3;
  22. HWND boton4;
  23. HWND boton5;
  24. HWND boton6;
  25. HWND boton7;
  26. HWND boton8;
  27. HWND boton9;
  28. HWND boton0;
  29. HWND botonComa;
  30. HWND botonSigno;
  31. //Botones->Operadores
  32. HWND botonIgual;
  33. HWND botonSumar;
  34. HWND botonRestar;
  35. HWND botonMultiplicar;
  36. HWND botonDividir;
  37.  
  38.  
  39.  
  40. /*  Make the class name into a global variable  */
  41. char szClassName[ ] = "CodeBlocksWindowsApp";
  42.  
  43. int WINAPI WinMain (HINSTANCE hThisInstance,
  44.                     HINSTANCE hPrevInstance,
  45.                     LPSTR lpszArgument,
  46.                     int nCmdShow)
  47. {
  48.    HWND hwnd;               /* This is the handle for our window */
  49.    MSG messages;            /* Here messages to the application are saved */
  50.    WNDCLASSEX wincl;        /* Data structure for the windowclass */
  51.  
  52.    estancia = hThisInstance;
  53.  
  54.    /* The Window structure */
  55.    wincl.hInstance = hThisInstance;
  56.    wincl.lpszClassName = szClassName;
  57.    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  58.    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
  59.    wincl.cbSize = sizeof (WNDCLASSEX);
  60.  
  61.    /* Use default icon and mouse-pointer */
  62.    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  63.    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  64.    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  65.    wincl.lpszMenuName = NULL;                 /* No menu */
  66.    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  67.    wincl.cbWndExtra = 0;                      /* structure or the window instance */
  68.    /* Use Windows's default colour as the background of the window */
  69.    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  70.  
  71.    /* Register the window class, and if it fails quit the program */
  72.    if (!RegisterClassEx (&wincl))
  73.        return 0;
  74.  
  75.    /* The class is registered, let's create the program*/
  76.    hwnd = CreateWindowEx (
  77.           0,                   /* Extended possibilites for variation */
  78.           szClassName,         /* Classname */
  79.           "Calculadora",       /* Title Text */
  80.           WS_OVERLAPPEDWINDOW, /* default window */
  81.           CW_USEDEFAULT,       /* Windows decides the position */
  82.           CW_USEDEFAULT,       /* where the window ends up on the screen */
  83.           544,                 /* The programs width */
  84.           375,                 /* and height in pixels */
  85.           HWND_DESKTOP,        /* The window is a child-window to desktop */
  86.           NULL,                /* No menu */
  87.           hThisInstance,       /* Program Instance handler */
  88.           NULL                 /* No Window Creation data */
  89.           );
  90.  
  91.    /* Make the window visible on the screen */
  92.    ShowWindow (hwnd, nCmdShow);
  93.  
  94.    /* Run the message loop. It will run until GetMessage() returns 0 */
  95.    while (GetMessage (&messages, NULL, 0, 0))
  96.    {
  97.        /* Translate virtual-key messages into character messages */
  98.        TranslateMessage(&messages);
  99.        /* Send message to WindowProcedure */
  100.        DispatchMessage(&messages);
  101.    }
  102.  
  103.    /* The program return-value is 0 - The value that PostQuitMessage() gave */
  104.    return messages.wParam;
  105. }
  106.  
  107.  
  108. /*  This function is called by the Windows function DispatchMessage()  */
  109.  
  110. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  111. {
  112.    //Variables
  113.    char cadenaEditMain [35];
  114.    static int operacion;
  115.    static double primer_num, segundo_num, resultado;
  116.  
  117.    PAINTSTRUCT ps;
  118.    HDC hdc;
  119.  
  120.  
  121.    switch (message)
  122.    {
  123.        case WM_CREATE:
  124.        {
  125.            label = CreateWindow ("Static","Texto", WS_CHILD | WS_VISIBLE, 20, 20, 175, 25, hwnd, 0, estancia, 0);
  126.            edit = CreateWindowEx (WS_EX_CLIENTEDGE, "edit", 0, ES_RIGHT | ES_NUMBER | WS_BORDER | WS_CHILD | WS_VISIBLE, 20, 50, 175, 25, hwnd, (HMENU)ID_EDIT, estancia, 0);
  127.  
  128.            boton1 = CreateWindow ("Button", "1", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0);
  129.            boton2 = CreateWindow ("Button", "2", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 65, 90, 40, 25, hwnd, (HMENU) ID_BOTON2, estancia, 0);
  130.            boton3 = CreateWindow ("Button", "3", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 110, 90, 40, 25, hwnd, (HMENU) ID_BOTON3, estancia, 0);
  131.            boton4 = CreateWindow ("Button", "4", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 120, 40, 25, hwnd, (HMENU) ID_BOTON4, estancia, 0);
  132.            boton5 = CreateWindow ("Button", "5", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 65, 120, 40, 25, hwnd, (HMENU) ID_BOTON5, estancia, 0);
  133.            boton6 = CreateWindow ("Button", "6", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 110, 120, 40, 25, hwnd, (HMENU) ID_BOTON6, estancia, 0);
  134.            boton7 = CreateWindow ("Button", "7", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 150, 40, 25, hwnd, (HMENU) ID_BOTON7, estancia, 0);
  135.            boton8 = CreateWindow ("Button", "8", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 65, 150, 40, 25, hwnd, (HMENU) ID_BOTON8, estancia, 0);
  136.            boton9 = CreateWindow ("Button", "9", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 110, 150, 40, 25, hwnd, (HMENU) ID_BOTON9, estancia, 0);
  137.            boton0 = CreateWindow ("Button", "0", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 180, 40, 25, hwnd, (HMENU) ID_BOTONCERO, estancia, 0);
  138.            botonComa = CreateWindow ("Button", ",", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 65, 180, 40, 25, hwnd, (HMENU) ID_BOTONCOMA, estancia, 0);
  139.            botonSigno = CreateWindow ("Button", "+/-", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 110, 180, 40, 25, hwnd, (HMENU) ID_BOTONSIGNO, estancia, 0);
  140.            botonSumar = CreateWindow ("Button", "+", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 165, 90, 40, 25, hwnd, (HMENU) ID_BOTONSUMAR, estancia, 0);
  141.            botonRestar = CreateWindow ("Button", "-", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 165, 120, 40, 25, hwnd, (HMENU) ID_BOTONRESTAR, estancia, 0);
  142.            botonMultiplicar = CreateWindow ("Button", "*", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 165, 150, 40, 25, hwnd, (HMENU) ID_BOTONMULTIPLICAR, estancia, 0);
  143.            botonDividir = CreateWindow ("Button", "/", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 165, 180, 40, 25, hwnd, (HMENU) ID_BOTONDIVIDIR, estancia, 0);
  144.            botonIgual = CreateWindow ("Button", "=", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 220, 40, 25, hwnd, (HMENU) ID_BOTONIGUAL, estancia, 0);
  145.        }
  146.  
  147.        case WM_PAINT:
  148.        {
  149.            hdc = BeginPaint(hwnd, &ps);
  150. EndPaint(hwnd, &ps);
  151. return 0;
  152.        }
  153.  
  154.        case WM_COMMAND:
  155.        {
  156.            switch (wParam)
  157.            {
  158.                case ID_BOTON1:                  //Al presionar el boton 1 se llama a la funcion "imprimirEdit" y se le envia el valor "1" que es lo que queremos que se concatene a lo que ya haya en el edit
  159.                {
  160.                    imprimirEdit (1);
  161.                    break;
  162.                }
  163.                case ID_BOTON2:
  164.                {
  165.                    imprimirEdit (2);
  166.                    break;
  167.                }
  168.                case ID_BOTON3:
  169.                {
  170.                    imprimirEdit (3);
  171.                    break;
  172.                }
  173.                case ID_BOTON4:
  174.                {
  175.                    imprimirEdit(4);
  176.                    break;
  177.                }
  178.                case ID_BOTON5:
  179.                {
  180.                    imprimirEdit(5);
  181.                    break;
  182.                }
  183.                case ID_BOTON6:
  184.                {
  185.                    imprimirEdit(6);
  186.                    break;
  187.                }
  188.                case ID_BOTON7:
  189.                {
  190.                    imprimirEdit(7);
  191.                    break;
  192.                }
  193.                case ID_BOTON8:
  194.                {
  195.                    imprimirEdit(8);
  196.                    break;
  197.                }
  198.                case ID_BOTON9:
  199.                {
  200.                    imprimirEdit(9);
  201.                    break;
  202.                }
  203.                case ID_BOTONCERO:
  204.                {
  205.                    imprimirEdit(0);
  206.                    break;
  207.                }
  208.                case ID_BOTONCOMA:
  209.                {
  210.                    break;
  211.                }
  212.                case ID_BOTONSUMAR:
  213.                {
  214.                    operacion = 1;                                    //Cambia el valor de "operacion" para indicar que se va a sumar
  215.                    GetWindowText (edit, cadenaEditMain, 34);         //Obtiene el numero ingresado en el edit
  216.                    primer_num = atof (cadenaEditMain);               //Transforma la cadena obtenida en un double y lo guarda en "primer_num"
  217.                    SetWindowText (edit, "");                         //Limpia el edit
  218.                    break;
  219.                }
  220.                case ID_BOTONRESTAR:
  221.                {
  222.                    operacion = 2;                                    //Cambia el valor de "operacion" para indicar que se va a restar
  223.                    GetWindowText (edit, cadenaEditMain, 34);
  224.                    primer_num = atof (cadenaEditMain);
  225.                    SetWindowText (edit, "");
  226.                    break;
  227.                }
  228.                case ID_BOTONMULTIPLICAR:
  229.                {
  230.                    operacion = 3;                                    //Cambia el valor de "operacion" para indicar que se va a multiplicar
  231.                    GetWindowText (edit, cadenaEditMain, 34);
  232.                    primer_num = atof (cadenaEditMain);
  233.                    SetWindowText (edit, "");
  234.                    break;
  235.                }
  236.                case ID_BOTONDIVIDIR:
  237.                {
  238.                    operacion = 4;                                    //Cambia el valor de "operacion" para indicar que se va a dividir
  239.                    GetWindowText (edit, cadenaEditMain, 34);
  240.                    primer_num = atof (cadenaEditMain);
  241.                    SetWindowText (edit, "");
  242.                    break;
  243.                }
  244.                case ID_BOTONIGUAL:
  245.                {
  246.                    GetWindowText (edit, cadenaEditMain, 34);         //Obtiene el numero ingresado en el edit
  247.                    segundo_num = atof (cadenaEditMain);              //Transforma la cadena obtenida en un double y lo guarda en "segundo_num"
  248.                    resultado = calcular (primer_num, segundo_num, operacion); //El resultado se obtiene apartir de la funcion "calcular", a esta funcion se le envian las variables "primer_num", "segundo_num" y "operacion"
  249.                    sprintf (cadenaEditMain, "%f", resultado);        //Se transforma el double obtenido en una cadena y se guarda en "cadenaEditMain"
  250.                    SetWindowText (edit, cadenaEditMain);             //Se imprime en el edit la cadena donde se encuentra el resultado
  251.                    break;
  252.                }
  253.  
  254.                break;
  255.            }
  256.            break;
  257.        }
  258.  
  259.        case WM_DESTROY:
  260.            PostQuitMessage (0);
  261.            break;
  262.        default:
  263.            return DefWindowProc (hwnd, message, wParam, lParam);
  264.    }
  265.  
  266.    return 0;
  267. }
  268.  
  269. void imprimirEdit (int i)                        //Funcion que concatena los numeros al hacer clic en los botones
  270. {
  271.    char cadenaEdit [35];                        //Variable donde se guardara lo que hay en el edit (no es la misma variable que cadenaEditMain)
  272.    char numero [2];                             //Variable donde se guardara el numero de la tecla presionada
  273.    sprintf (numero, "%i", i);                   //Se transforma el numero (i) del tipo entero a una cadena
  274.  
  275.    GetWindowText (edit, cadenaEdit, 34);        //Se obtiene lo que hay en el edit y se guarda en "CadenaEdit"
  276.    strcat (cadenaEdit, numero);                 //Se une lo que hay en "CadenaEdit" y lo que hay en "numero" (es decir, se une lo que habia en el edit y el numero de la tecla presionada) y se queda guardada la nueva cifra en "cadenaEdit"
  277.    SetWindowText (edit, cadenaEdit);            //Se imprime el nuevo numero en el edit
  278. }
  279.  
  280. double calcular (double primer_num, double segundo_num, int operacion)   //Funcion que realiza las operaciones
  281. {
  282.    double resultado;                                                    //Variable donde se guardara el resultado (sera lo que se retorne)
  283.  
  284.    switch (operacion)                                                   //Ver lo que hay en la variable "operacion"
  285.    {
  286.        case 1:                                                          //En caso de que sea "1" se suma el primer numero al segundo
  287.        {
  288.            resultado = primer_num + segundo_num;
  289.            break;
  290.        }
  291.        case 2:                                                          //En caso de que sea "2" se resta el primer numero al segundo
  292.        {
  293.            resultado = primer_num - segundo_num;
  294.            break;
  295.        }
  296.        case 3:                                                          //En caso de que sea "3" se multiplica el primer numero por el segundo
  297.        {
  298.            resultado = primer_num * segundo_num;
  299.            break;
  300.        }
  301.        case 4:                                                          //En caso de que sea "4" se divide el primer numero entre el segundo
  302.        {
  303.            resultado = primer_num / segundo_num;
  304.            break;
  305.        }
  306.        default:                                                         //Si no se realiza ninguna operacion se imprime en el edit un mensaje, con esto sabriamos si ha habido algun error
  307.        {
  308.            SetWindowText (edit, "No se ha realizado ninguna operacion.");
  309.            break;
  310.        }
  311.    }
  312.  
  313.    return resultado;                                                    //Devuelve el resultado
  314. }
  315.  

El fallo está en que al darle al signo igual, en vez de imprimir el resultado, manda el segundo número introducido. Todas las funciones y procesos van comentados.

Gracias por adelantado, saludos.

EDITO: El code está corregido, le faltan cosas como borrar números, limpiar el edit o cambiar de signo, pero lo que lleva por ahora funciona bien.


« Última modificación: 11 Septiembre 2011, 19:28 pm por Alien-Z » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Calculadora en Win API no imprime el resultado
« Respuesta #1 en: 11 Septiembre 2011, 19:08 pm »

El propio VC++ te indica el problema al compilar:
.cpp(248) : warning C4700: uninitialized local variable 'operacion' used
.cpp(248) : warning C4700: uninitialized local variable 'primer_num' used


Esas variables son LOCALES a la funcion WindowProcedure, es decir que su ambito es la ejecucion de la funcion, cada vez que se ejecute se inicializara con un valor indeterminado y este se perdera al terminar la funcion.

Podes agregarle static antes de las variables o sacarlas fuera de la funcion, asi su ambito se convierte en global.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: Calculadora en Win API no imprime el resultado
« Respuesta #2 en: 11 Septiembre 2011, 19:23 pm »

El propio VC++ te indica el problema al compilar:
.cpp(248) : warning C4700: uninitialized local variable 'operacion' used
.cpp(248) : warning C4700: uninitialized local variable 'primer_num' used


Esas variables son LOCALES a la funcion WindowProcedure, es decir que su ambito es la ejecucion de la funcion, cada vez que se ejecute se inicializara con un valor indeterminado y este se perdera al terminar la funcion.

Podes agregarle static antes de las variables o sacarlas fuera de la funcion, asi su ambito se convierte en global.

Correcto, ya va a la perfección, en Code::Blocks no me avisa del fallo pero estás en lo cierto. Corrijo el code del primer post por si le sirve a alguien.

Gracias por tu tiempo. Saludos.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Calculadora en Win API no imprime el resultado
« Respuesta #3 en: 11 Septiembre 2011, 19:38 pm »

De nadas  ::)

VC++ rules  >:D
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: Calculadora en Win API no imprime el resultado
« Respuesta #4 en: 12 Septiembre 2011, 10:47 am »

Aprovecho el mismo tema para preguntar otra cosilla:

Como he comentado uso Code::Blocks para compilar, y dentro del proyecto (en la carpeta bin/debug) me deja el exe de la aplicación. El caso es que he pasado este exe a otro PC con Windows 7 (el PC con el que he compilado la aplicación lleva Windows XP), cuando le doy doble clic se ejecuta, pero faltan algunos botones y no realiza las operaciones.

Supongo que será algo sobre la compatibilidad pero el code solo lleva C++ con Win API con lo cual debería funcionar en cualquier SO de Microsoft. Otra cosa que se me ha ocurrido es que en el exe no vayan incluidas las librerías, entonces si en el otro PC no tengo dichas librerías no va a funcionar (¿cuál sería la solución en este caso?, la idea es que vaya bien en cualquier PC sin necesidad de instalar el compilador con las librerías).

Pero bueno solo son suposiciones mias, a ver si alguien puede aclararme a qué se debe que si me vaya en un Windows XP (el que he usado para compilar) y no en un Windows 7 (no lleva ningún IDE o compilador).

Gracias por adelantado. Saludos.
« Última modificación: 12 Septiembre 2011, 10:50 am por Alien-Z » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Calculadora en Win API no imprime el resultado
« Respuesta #5 en: 12 Septiembre 2011, 11:22 am »

Yo lo probe en Windows 7 asi que no te sabria decir pero igual siempre tenes que usar la version de Release para distribuir.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: Calculadora en Win API no imprime el resultado
« Respuesta #6 en: 12 Septiembre 2011, 11:49 am »

Yo lo probe en Windows 7 asi que no te sabria decir pero igual siempre tenes que usar la version de Release para distribuir.

Vaya, me ha funcionado con la versión Release, aunque no entiendo por qué si en principio va el mismo code que en Debug.

Gracias de nuevo. Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Por que no me imprime en mi fichero?
Java
negux 3 3,301 Último mensaje 13 Diciembre 2010, 20:01 pm
por .mokk.
No puedo mostrar los resultado correctos en mi calculadora « 1 2 »
.NET (C#, VB.NET, ASP)
DanielPy 12 7,867 Último mensaje 6 Mayo 2013, 21:20 pm
por engel lex
No Imprime
Programación C/C++
hzre 6 4,015 Último mensaje 24 Noviembre 2020, 08:06 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines