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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: [1] 2 3 4 5
1  Programación / Programación C/C++ / Re: Llamar a PHP desde C en: 14 Junio 2015, 01:54 am
Puedes usar la librería openssl: http://stackoverflow.com/a/10324904/1794803
2  Programación / Programación C/C++ / Re: Llamar a PHP desde C en: 13 Junio 2015, 21:48 pm
Aunque lo correcto es tirar por lo que ha dicho `engel lex` (buscar una librería), si estás en linux al menos, siempre puedes hacer una llamada a `system` con un script PHP utilizando el `she-bang`:

Código
  1. #!/usr/bin/php + opciones que sean necesarias.
  2.  
  3. // tus llamadas a md5()
  4.  
  5. // guardar el valor en un fichero
  6.  

Y luego tu código C++:

Código
  1. system("./script-php");
  2.  
  3. // Leemos el fichero escrito por el script

O también podrías crear un fichero temporal, y en la llamada a `system` redirigir la salida estándar de dicho script php a dicho fichero temporal. También puedes buscar algún wrapper de PHP para C++. O utilizar una librería para lanzar un proceso en vez de llamar a `system` (para hacer a la aplicación independiente de la plataforma), y utilizar sockets para comunicar PHP con C.

En fin... no se me ocurre nada más.
3  Programación / Programación C/C++ / Re: Pasar string a time. Número de días entre dos fechas en: 2 Junio 2015, 11:46 am
Tienes razón en lo del carácter fin de línea. Mi solución es, quizás, más adecuada para cadenas recibidas como parámetro (`sscanf`), que para comprobar directamente la entrada. De todas formas, ¿no es ésta una solución más sencilla?

Código
  1. /* Con barras invertidas para que tenga más "pinta" de fecha :)
  2. leidos = scanf("%2u/%2u/%4u%c", &dia, &mes, &anno, &truco);
  3.  
  4. if (leidos < 3)
  5.     exit(EXIT_FAILURE);
  6.  
  7. if (leidos > 3 && truco != '\n'))
  8.    exit(EXIT_FAILURE);

De ésta forma, solo permitimos una fecha seguida inmediatamente por un salto de línea. No creo que haga falta comprobar todo lo que venga detrás, sencillamente, con obligar al usuario a escribir la fecha y luego justo después, pulsar "Intro", sería suficiente.
4  Programación / Programación C/C++ / Re: ayuda con operaciones a nivel de bits y mascaras en: 2 Junio 2015, 11:17 am
Sí, lo sé. Pero estoy convencido de que debe haber una solución no iterativa al problema, y el no encontrarlo me está sacando de quicio, jeje. Cuando tenga más tiempo lo intentaré de nuevo.
5  Programación / Programación C/C++ / Re: ¿c++ es orientado a objetos? en: 31 Mayo 2015, 17:37 pm
Es orientado a objetos porque el uso de objetos forman el núcleo del lenguaje... pero, también acepta muchos otros tipos de programación, sobre todo gracias a la plantillas: programación funcional (contenedores, functores y algoritmos basados en rango), cómputo basado en tipos (metaprogramación), estructurada (estilo C), etc. Pero tu característica más fundamental (aunque no la más potente para mi gusto xD), es la orientación a objetos.
6  Programación / Programación C/C++ / Re: ayuda con operaciones a nivel de bits y mascaras en: 31 Mayo 2015, 17:29 pm
Pues yo he intentado hacer una versión no iterativa (ni recursiva, claro), de éste algoritmo, con alguna cadena finita de operaciones binarias... y casi pierdo la cabeza.

Primero "duplicaba" la máscara (por ejemplo, 0x6) para que tuviera mismo ancho que el `unsigned` con el que me comparo (por ejemplo, 0x66666666), y luego realizaba el XOR con el número original.

Como el XOR lo que hace es filtrarte los bits diferentes, estuve intentando construir otra máscara con un AND (para obtener los bits "iguales"), y luego, con algún tipo de resta y AND entre ambas máscaras, conseguir que los bits que han superado ambos test, se "sumen" (que deben estar exclusivamente encerradas en las cuartetas que no sean 0x6), de modo que al aplicar ésta máscara final con el número original, solo se hagan a cero las cuartetas oportunas.

¡Pero no hay forma! Os reto a que lo intentéis (una versión no interativa de éste problema --excepto quizás para construir una máscara original). De verdad, me parece increíble que algo tan trivial sea tan escurridizo.

 
7  Programación / Programación C/C++ / Re: |Lo que no hay que hacer en C/C++. Nivel basico| en: 30 Mayo 2015, 21:56 pm
Eso de los namespace si que esta prácticamente prohibido al programar librerías , porque el código de la librería podría entrar en conflicto con la del usuario. Pero no entiendo porque un programa sencillo no se puede usar eso...

De hecho, como bien dices, yo lo uso en código de usuario, y si hubiese un conflicto con una librería que no utilice yo directamente (librería utiliza indirectamente por las librerías que yo he añadido conscientemente), siempre puedo "evitar el conflicto con `::mivariable`, para indicar que la variable `mivariable` está en el espacio de nombres global.

En código de librería también estoy de acuerdo contigo en que no se debería usar, pero con un matiz: sólo en ficheros de cabecera. En ficheros de implementación (los `.cpp` de la librería), sí que creo que se podría utilizar sin problemas.

Aunque yo no domino mucho los matices de los espacios de nombres, he visto que muchas librerías importantes (sí, a veces me enfado tanto con los errores de ejecución que a veces me embarco en la horrorosa aventura de mirar el código fuente de una librería), utilizan nombres de espacio anónimos en los `.cpp`, porque los espacios de nombres anónimos hacen que todos los símbolos en él tenga enlazado estático, lo que significa que desde otras unidades de compilación no se puedan acceder a ellos:

Código
  1. // libreria.hpp
  2. namespace libreria {
  3.  
  4.    class loquesea {
  5.    public:
  6.         void fun1();
  7.         void fun2();
  8.    };
  9. }
  10.  
  11. // libreria.cpp
  12. #include "libreria.hpp"
  13.  
  14. namespace {
  15.   using namespace std; // Al fin y al cabo, ahora el usuario es el implementador de la librería.
  16.  
  17.   // Clases y funciones auxiliares que realmente hacen el trabajo.
  18. }
  19.  
  20. namespace libreria {
  21.  
  22.    void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
  23.    void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
  24.  
  25. }

De ésta forma, todo aquello que vaya más allá de la interfaz pública con el usuario, es innacesible desde fuera, debido a que los símbolos del espacio de nombres anónimo tienen enlazado estático, y por tanto, pertenecen solamente a "ésta unidad" de compilación, como cuando declaras una función externa "static". Incluso los símbolos de la `std`, como se han "introducido" dentro de un espacio de nombres anónimo, desde fuera tampoco están visibles, y el usuario final (a no ser que escriba `using namespace std` en su código), no tendrá conflictos ni con la librería, ni con la `std`.

Es una forma se reduce muchísimo la cantidad de símbolos que el enlazador tiene que buscar.
8  Programación / Programación C/C++ / Re: Ayuda en C que estoy reloco en: 28 Mayo 2015, 14:11 pm

Hay tantas situaciones que no creo que exista ningún libro lo suficientemente bueno, y para los detalles "de nivel medio", cualquiera te puede valer.

Lo más importante es saber "qué está pasando" en tu programa, y conocer bien `printf` es un buen comienzo, así que repasa todas sus opciones con detalle. ¡O utilizar un debuggeador como `gdb`!
9  Programación / Programación C/C++ / Re: No puedo sobrecargar el operador ostream en: 28 Mayo 2015, 04:07 am
Pero no te enfades xD (sé que en realidad no te enfadas). Y perdona, a veces soy muy precipitado... cosas del dormir poco.
10  Programación / Programación C/C++ / Re: Volcar cadena de fichero binario en C en: 27 Mayo 2015, 23:22 pm
Ok. ¿Y no puedes "ver" qué devuelve la función `escritura`? ¿Qué devuelve, un fichero temporal?

De todas formas, como esa función `escritura()` devolverá un `FILE*` (sea el fichero temporal o no), sencillamente, haz una copia de ese fichero en disco y ponle un nombre. Añade el siguiente código justo después de llamar a dicha función `escritura()`:

Código
  1. // Es decir, justo despues de que obtengas el fichero para que lo leas.
  2. FILE* fichero = escritura();
  3.  
  4. FILE* copia = fopen("micopia.txt", "w+");
  5.  
  6. long pos = ftell(fichero); // Guardamos la posicion actual de `fichero`.
  7.  
  8. char buff[100]; // Buffer para leer de 100 en 100 caracteres.
  9. unsigned leidos; // Si leidos == 0 (valor devuelto por `fread`) es que hemos llegado al final del fichero.
  10.  
  11. // Copiamos todo en el fichero "micopia.txt"
  12. while ((leidos = fread(buff, sizeof(char), 100, fichero) != 0)
  13.    fwrite(buff, sizeof(char), leidos, copia);
  14.  
  15. fseek(fichero, pos); // Dejamos el fichero original como estaba.
  16. fclose(copia); // Cerramos nuestro fichero copia.
  17.  
  18. // Resto de tu programa.

Y con ésto, capturaras el fichero y crearás una copia ("micopia.txt") que puedes ver con un editor de texto cualquiera para saber qué devuelve.
Páginas: [1] 2 3 4 5
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines