Calculadora con Interfaz Grafica (C/SDL) !!

Iniciado por Fire544, 6 Agosto 2012, 05:23 AM

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

Fire544

Hola a todos!! Desarrolle una calculadora, el objetivo del software es animar a los programadores iniciados/avanzados en C , ya que veo muchas dudas sobre con cual API para GUI necesitan, si QT, o GTK soporta perifericos, si es facil, etc. Muchas dudas, que me hicieron codear este ejemplo, esta hecho en puro C del estandar ANSI, claro la GUI la implemente con SDL, es multiplataforma, solo tienen que compilar en GNU/Linux o cualquier otro S.O y no necesita modificacion de codigo.

Tiene algunos errores, luego se daran cuenta, y tambien le falta los efectos cuando accionamos encima de los botones, pero si tienen los de acciones pulsados, y luego para la version 1.1 de este mismo ejemplo, les traere todo completo. Al que se animen a criticar y ayudar con el desarrollo de la libreria no hay problemas, esta todo el codigo, ejecutable, fonts, jpg, libs y makefile, generado por SDL.

Critiquen, posteen, desahogo total !!!  ;-)

Aqui les dejo el link de descarga:

Codigo: 2m1bdemf

http://uploading.com/files/get/2m1bdemf/Proyecto_Calc_C_SDL.rar
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

avesudra

#1
Está muy bien teniendo en cuenta que es con SDL , una cosa ¿porque solo puedo poner números con el numpad? Gracias por el aporte y por el código.
PD: De momento yo la llamaría sumadora jajaja.
¡Un saludo!
Regístrate en

Foxy Rider

#2
En principio habría que sacarle todas esas DLLs que tiene ahí, incluído el compilado ... o debería ir a un directorio aparte.
Pensá que en un proyecto se separa por un lado el código, por otro los resources (como los JPG y fuentes TrueType), y por otro los compilados.

Un esquema muy común es el de:
Citarsrc/
include/
resources/
bin/

etc ... mientras no se mezclen todas las cosas en un directorio, cualquier esquema vale.
Siguiendo en las líneas de los ficheros, también hay que señalar que las extensiones son de C++ (cpp) y no de C (.c), pero no sólo eso ... el uso de una extensión diferente, altera el comportamiento del compilador, que usualmente se pasa a un modo C++ y muchas cosas cambian (pero C99 puede perdonarlas), siendo la más visible la de los comentarios de una sóla línea (C99 creo que los incorpora, pero son originarios de C++), por lo que te aconsejo compilar usando una extensión válida, y si te animás, el flag -ansi.

Otra cosa que "se vé feo" es incluir cpp, uno diferencia ficheros fuente (.c, .cpp, .cxx, .cc, etc ... siendo .c de C, y todo lo demás de C++)  de los ficheros de encabezado (.h, .hh, .hpp, etc .. siendo .h de C, y todo lo demás C++) por que tienen diferentes funciones ... pero es una convención más que un requisito (a pesar de ser convención informal, se puede alterar el comportamiento del compilador)

Tendrías que repasar tus textos en cuanto a eso.
Revisar definición, declaracion, etc (acá tenés una ayuda) .... y entender que en  los encabezados van las declaraciones y los .c van las definiciones (en general)

Entendido eso, como lectura sugerida te daría este texto → http://www.thegeekstuff.com/2011/10/c-program-to-an-executable/
Para que vayas conectando las piezas en tu cabeza y veas uno de los "porqué" de esta convención.

Pasemos a compilar:
Citaralex@Sylbit:~/Downloads/Calculadora_con_SDL_puro_C$ clang Untitled1.cpp
Untitled1.cpp:3:10: fatal error: 'SDL.h' file not found
#include <SDL.h>
        ^
1 error generated.

En mi caso, el encabezado SDL.h está en /usr/include/SDL, así que tengo que cambiarlo a esto:

#include <SDL/SDL.h>

Como verás, el código no es portable ... báh, el código y el sistema con el que se compila (no lo hay), por lo que deberías usar un IDE que lidie con el tema de los encabezados y ajuste eso o mejor, usar algo como cmake que es mucho más configurable y multiplataforma .... pero pensá de este párrafo como algo opcional que sumaría mucho a la calidad del paquete, pero que no es obligatorio.

Citaralex@Sylbit:~/Downloads/Calculadora_con_SDL_puro_C$ clang Untitled1.cpp  -lSDL -lSDL_ttf -lSDL_image

Genial, compila !!! (compilado como código C puro  .... no compila)
En principio sería eso, la sumadora está bien ... no opiné sobre el código fuente por que se hace muy denso (memory leaks, identado, nombrado de variables y funciones, valores sin inicializar,  uso abusivo de else if en vez de switchs, falta despedazar algunas funciones en otras más chicas y así así así así ) y largo esto, pero tratá de corregir lo que señalé acá primero

Saludos.

Fire544

#3
Hola buenas, Alex Mtx : Si comprendo perfectamente, pierde portabilidad por los linkeos y la inclusion de las libs, por no poner enfasis en su uso "SDL\SDL.h, etc".  Pero si te fijas solo tienes que linkear y ya esta, muy bien la correccion, sobre el uso de "else if" si tengo que optar por el uso de "switch" a si optimizo mas el codigo, tambien las declaraciones de variables abusivas dentro del mismo "main.c" hace el codigo imposible de leer, en el caso de las variables no inicializadas eso si lo tube en cuenta lo unico que se me paso, sobre la distribucion de ficheros incluyendo "libs, T Fonts, .jpg, .h, .c y .exe" si deberian ir, en directorios a partes. Muy buena tu correccion gracias Alex Mtx  ;-)

EI: juntando mensajes.

Cita de: avesudra en  6 Agosto 2012, 14:12 PM
Está muy bien teniendo en cuenta que es con SDL , una cosa ¿porque solo puedo poner números con el numpad? Gracias por el aporte y por el código.
PD: De momento yo la llamaría sumadora jajaja.
¡Un saludo!

Hola avesudra: Si tienes razon, no gestiona los eventos del teclado numerico secundario (teclado numerico por debajo de las teclas F0-F12), esto pasa por que aun no gestiono, esos tipos de eventos, pero ya para otras versiones estara completo. Gracias por tu observacion avesudra  ;-)
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

Foxy Rider

CitarHola buenas, Alex Mtx : Si comprendo perfectamente, pierde portabilidad por los linkeos y la inclusion de las libs
En realidad desde que tenés que tipear el comando para compilar ... SDL es bastante multiplataforma como para que robe portabilidad :D
El hecho de tener que tipear un comando, roba comodidad y portabilidad .... pero que no tengas algo que lidie con que si es SDL.h o SDL/SDL.h es algo que también roba portabilidad (los otros .h están bajo SDL/ también), depende de cómo lo veas, es un proyecto chiquito igual, no es tanto drama ... pero la idea es que te agarres costumbre con la "forma correcta" para cuando te toquen proyectos más grandes :)

CitarMuy buena tu correccion gracias Alex Mtx

Así se aprende, programando y mirando código de otros !!
Seguí programando, programando y programando ... compartí tu código y vamos a ir limando asperezas.

Suerte y no desanimes !

Saludos.

P.S → Agregar los otros eventos y otros operadores es un segundito, lo "más importante" ya está.

Fire544

#5
He aqui la version 1.1 del software (tipo: Calculadora suma), esta ya incorporada con la gestion de eventos (teclado numerico numpad) ya que la version 1.0 solo tenia knumpad, ahora todo organizado con respecto a la inundacion de ficheros que abian, las libs .h, .c, .jpg, .fonts, etc, bien distribuidas no olviden copiar los .dll a c:\windows\system32\, es una compilacion multiarchivo y no olviden tener las carpetas en un mismo directorio.

No utilice la funcion "switch" por que se complica mas la gestion de eventos, ya que cada vez que gestiono un evento, tambien se tiene que verificar si se dejo de pulsar la tecla, pero luego optimizare mas el codigo, para lograr esto de la gestion con "switch".

Con relacion a los includes tambien para una implementacion del codigo, intentare hacer una programacion condicional, dicho a si "Todos los ficheros cabeceras, se incluiran en la ejecucion, de a cuerdo con la plataforma corrida (S.O)".

Puede ser algo como esto:

#ifdef __UNIX__
#include <usr/lib/.h> || include <lib/.h>
else
#include <lib/.h> //siendo lib el directorio original de SDL
#endif


Salvedad:La carpeta bin, no va en los directorios borrar por favor antes de ejecutar/compilar y otras cosa. Si quieres modificar el tamaño de los botones intenta de no pasarte de un rango de dimensiones 114 x 39, ya que el tamaño de los botones es independiente del codigo, pero no de modificaciones no soportadas por este rando, ya intentare implementar la libreria components.h para que soporte todo esto. Fue muy buena colaboracion de todos, sigan colaborando y aprenderemos mas aun !!  ;-)


Aqui en link con el software actualizado a 1.1  ;-)

codigo: bc29d5f8

http://uploading.com/files/get/bc29d5f8/Proyecto_Calc_C_SDL.rar
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

dato000

Cita de: Fire544 en  6 Agosto 2012, 19:23 PM
Aqui en link con el software actualizado a 1.1  ;-)

codigo: bc29d5f8

http://uploading.com/files/get/bc29d5f8/Proyecto_Calc_C_SDL.rar


Perdonen la pregunta, soy novato comparado con uds, pero como hago para abrir esto en linux sin tener que copiar cada archivo??



Fire544

#7
Cita de: dato000 en  7 Agosto 2012, 01:29 AM
Perdonen la pregunta, soy novato comparado con uds, pero como hago para abrir esto en linux sin tener que copiar cada archivo??

Hola dato000: Primeramente tendrias que especificar sobre que distribucion GNU\Linux andas, y claro su version. Pero lo normal es que sea alguna distro Linux mas usual, la compilacion normal con GCC bajo la terminal, o cualquier IDE que utilize el compilador GCC, lo unico que tienes que añadirle a tu compilacion seria un linkeo precedido de -l si esta en el directorio actual, en este caso no es asi, entonces se recurre a -L usr\lib SDL, cuando me refiero a "lib" es el directorio donde se encuentran los lib.o/a de tu libreria SDL.

Ejemplo:

gcc main.c -o salida -L usr/lib/sdl/sdl.h -L usr/lib/sdl/sdl_ttf.h -L usr/lib/sdl/sdl_image.h -L usr/lib/sdl/sdl_main.h


Salvedad: Tienes que primero instalar los libs de SDL, al igual que sus libs auxiliares como lo son: SDL_image, SDL_ttf, etc, con ayuda de sudo apt-get install xxx o algun otro repositorio de instalacion !!
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

dato000

Cita de: Fire544 en  7 Agosto 2012, 04:56 AM
Hola dato000: Primeramente tendrias que especificar sobre que distribucion GNU\Linux andas, y claro su version. Pero lo normal es que sea alguna distro Linux mas usual, la compilacion normal con GCC bajo la terminal, o cualquier IDE que utilize el compilador GCC, lo unico que tienes que añadirle a tu compilacion seria un linkeo precedido de -l si esta en el directorio actual, en este caso no es asi, entonces se recurre a -L usr\lib SDL, cuando me refiero a "lib" es el directorio donde se encuentran los lib.o/a de tu libreria SDL.

Ejemplo:

gcc main.c -o salida -L usr/lib/sdl/sdl.h -L usr/lib/sdl/sdl_ttf.h -L usr/lib/sdl/sdl_image.h -L usr/lib/sdl/sdl_main.h


Salvedad: Tienes que primero instalar los libs de SDL, al igual que sus libs auxiliares como lo son: SDL_image, SDL_ttf, etc, con ayuda de sudo apt-get install xxx o algun otro repositorio de instalacion !!

Si señor, uso gcc en linux mint debian. Ummm no me ha servido de mucho...

Citar
root@datohost:/home/dato000/Documentos/c++/calculadora/calculadora# gcc main.c -o salida -L usr/lib/sdl/sdl.h -L usr/lib/sdl/sdl_ttf.h -L usr/lib/sdl/sdl_image.h -L usr/lib/sdl/sdl_main.h
gcc: error: main.c: No existe el fichero o el directorio
gcc: fatal error: no input files
compilation terminated.

Como instalo las librerias si no es mucho pedir???



Fire544

Cita de: dato000 en  7 Agosto 2012, 05:01 AM
Si señor, uso gcc en linux mint debian. Ummm no me ha servido de mucho...

Como instalo las librerias si no es mucho pedir???

Mira estas especificando el archivo de entrada para gcc con el mismo ejemplo, cambia main.c por el nombre de tu .c principal, si aun conservas los mismos nombres de el .c en el proyecto de la calculadora, entonces intenta gcc Untitled1.c -o salida.exe luego los linkeos !! Suerte  :laugh:
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".