Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - avesudra

#1
Si puedes usar C++17, puedes utilizar std::filesystem y la función:

https://en.cppreference.com/w/cpp/filesystem/last_write_time

Con eso puedes mirar todos los archivos que tiene el directorio, sacar su última fecha de modificación y ordenarlos quedándote con el que te interese.

Si no puedes usar C++17, puedes usar la biblioteca boost:

https://www.boost.org/doc/libs/1_70_0/libs/filesystem/doc/reference.html

Que se parece mucho a la de C++17.

Saludos.
#2
Cita de: YreX-DwX en 23 Febrero 2019, 16:58 PM
Un pequeño apunte. Los objetos de tipo persona los estás creando dinámicamente:
Código (cpp) [Seleccionar]

Persona *personaA = new Persona();
Persona *personaB = new Persona();
// ...
delete personaA;
delete personaB;


Si los creas estáticamente no necesitas usar <new>:
Código (cpp) [Seleccionar]

Persona personaA; // ya llama al constructor sin parametros sin especificarlo nosotros
// ...
// no es necesario liberar memoria ya que no se ha reservado memoria dinamicamente


Cierto, se me ha pasado, el copy-paste....

Muchas gracias y saludos.
#3
[EDITO] : No había visto el post de YreX-DwX  :-(

Hola digimikeh,

Todo depende de cómo haya sido reservada la memoria a la que apunta el puntero "nombre". Tienes dos casos:


  • Que fuera reservada dinámicamente con new, en tal caso, debería liberarse en algún sitio, pero no necesariamente ahí.
  • Que fuera reservada estáticamente, en tal caso no es necesario que se libere. Un ejemplo podría ser un literal como:
Código (cpp) [Seleccionar]
const char* cadena = "hola"


En éste último caso la duración de esa memoria será hasta el fin de la ejecución de tu programa y no es necesario que la liberes.

Un ejemplo de ambos casos sería(fíjate que cadenaB se libera porque se reservó con new):
Código (cpp) [Seleccionar]

const char* cadenaA = "HOLA";
char* cadenaB = new char[5];
strncpy(cadenaB, cadenaA, 5);

Persona personaA = new Persona();
Persona personaB = new Persona();

personaA.IngresarNombre(cadenaA);

personaB.IngresarNombre(cadenaB);

delete[] cadenaB;


Saludos.
#4
Programación C/C++ / Re: no detecto el error
15 Diciembre 2016, 12:50 PM
Hola, tienes que vaciar el fichero stdout antes de llamar a la función sleep.

Mira aquí: http://stackoverflow.com/questions/13568388/c-sleep-function-not-working


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
   
    while(1){

        fflush(stdout);
        putchar('F');
        sleep(1);
        fflush(stdout);
        putchar('G');
        sleep(1);
    }

    return 0;
}
#5
Cita de: RevolucionVegana en  4 Diciembre 2016, 17:04 PM
Hola muchas gracias por responder Ivan eso es un juego en Java que estás haciendo verdad?

Este este el núcleo por así decirlo? https://github.com/ivancea/RogueLikeGame/blob/master/RogueLikeGame/src/es/hol/ivancea/RogueLikeGame.java

Y a ver yo no quiero estudiar al 100% metasploit simplemente he puesto ese ejemplo podría haber puesto cualquier otro pero es más que nada para saber donde se ubica normalmente el corazón del programa, y otra pregunta espero no ser muy pesado, yo ahora mismo mis programas en C++ llego y le pongo esto en la terminal para compilarlos:

g++ programa.cpp -o programa

Funciona de maravilla pero ahora me pregunto yo, y si en vez de un fichero (programa.cpp) fuesen muchos ficheros separados y en diferentes carpetas y todo eso como los compilo todos juntos para que funcione bien? O esto no es así? Muchas gracias a todos!!!! Aunque ahora pensándolo bien Metasploit no ha sido para nada el mejor ejemplo que podía haber puesto ya que según tengo entendido Ruby es un lenguaje interpretado no compilado,

Saludos!!

Para eso tienes un precioso fichero Makefile en la mayoría de los proyectos de C++.

De hecho si en la carpeta donde tienes el fichero "programa.cpp" creas el fichero "Makefile":

#Makefile prueba
all: prueba.o
g++ prueba.o -o prueba

prueba.o: prueba.cpp


Y luego abres una terminal y haces:
make

Seguramente te compilará el programa( si yo no me he equivocado escribiéndolo claro).

¿Y cómo sé manejar esa sintaxis? Pues léete el manual de make.

Pero vamos básicamente es:


regla1: dependencias
     cosa que hacer cuando se ejecuta la regla1

regla2: dependencias
     cosa que hacer cuando se ejecuta la regla2


Para ejecutar la regla1 puedes hacer:

make regla1

O simplemente make, pues si no pones nada, pilla la primera regla que haya en el fichero Makefile.

Para ejecutar la regla2 forzosamente tienes que poner:

make regla2
#6
Cita de: RevolucionVegana en  4 Diciembre 2016, 13:23 PM
Hola Orubatosu muchas gracias por responder esa parte ya la entendía pero la que no entiendo es que por ejemplo cojo entro aquí:

https://github.com/rapid7/metasploit-framework

Como puedo ver el primer archivo que programaron para ir enlazando todo y ver como se estructura viendo las librerías que importa y en que momento utiliza las funciones y todo eso, no se si me explico

Saludos
Eso está hecho en Ruby, lo que quiere decir que antes como mínimo deberías tener conocimiento medio de ese lenguaje. Hoy en día hay muchas herramientas para la automatización del despliege de las aplicaciones (proceso requerido para que éstas empiecen a funcionar), normalmente cada lenguaje tiene un conjunto de herramientas que te permiten hacerlo. Esas herramientas suelen tener archivos de configuración que te permiten ver cómo está estructurado ese proceso, algo que te puede aclarar mucho las cosas sobre dónde está el punto de entrada de las mismas.

De todas maneras lo que pides es complicado si no hay documentación de por medio o si el software es muy grande, en ese proyecto han contribuido 400 personas, como supongo que intuirás, habrá gente que no tiene ni idea de cómo está hecha otra parte de la aplicación. Si en el desarrollo de aplicaciones cada programador tuviera que saber cómo está implementado cualquier otro módulo, el desarrollo de software no sería factible, ni en tiempo, ni en coste. De hecho lo tuyo es aún más complicado, estás intentando entender la arquitectura de un software realizándole Ingeniería Inversa al código.

En C++ lo que más se usa son las https://es.wikipedia.org/wiki/GNU_build_system . Y por todo esto que te cuento es tan importante la Ingeniería del Software hoy día, poner de acuerdo a tantísima gente no es fácil.

No es por desanimarte, pero digo que para entender un software al completo te debes dedicar por completo a estudiarlo, y si no tienes a nadie que te introduzca en el tema y no hay documentación, puedes morir en el intento.

Además para cada lenguaje de programación, o ellos mismos u otras empresas establecen guías de estilo, que pueden ir desde convenciones para el nombrado de variables, métodos y clases hasta los nombres y la organización de las carpetas.

EDIT: De hecho se usan patrones de diseño de software, patrones para la arquitectura como el MVC (Modelo Vista Controlador) que está por todos lados. Aunque parezca que no, te aseguro que si metes a 20 personas en una habitación a trabajar conjuntamente en un software, únicamente picando código cada uno por su lado seguramente habrá un 99% de probabilidades de que la aplicación falle en su despliege.

Saludos.
#7
Hola Akumadie, podría ser porque tienes colocar las implementaciones de los métodos que usen programación genérica en el mismo fichero que su declaración (.hpp) o instanciar explícitamente las plantillas que vayas a usar en el ".cpp" en el que estás definiendo dichos métodos.

Por desgracia el enlazador no es capaz de realizar el enlace correctamente. Para ello se intentó incorporar la palabra reservada export en C++11, pero no se ha podido implementar correctamente y ha quedado como reservada pero en desuso. http://en.cppreference.com/w/cpp/keyword/export .

Si quieres más información:

http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file/495056#495056

Un saludo.
#8
Hola, el error que te da valgrind es claro, no inicializas la variable i cuando la declaras. Así que con esto debería arreglarse:
Código (cpp) [Seleccionar]
int comparar(int vector1[], int n1, int vector2[], int n2)
{
   int i = 0; //esto es lo que debes modificar
   if (n1 == 0 && n2 != 0)
       {
       return -1;
       }
   if  (n2 == 0 && n1 != 0)
       {
       return 1;
       }
   for(i=0;i<n1||i<n2;i++)
       {
       if(vector1[i]<vector2[i])
           {
           return -1;
           }
       if(vector1[i]>vector2[i])
           {
           return 1;
           }
       if(vector1[i]==vector2[i]&&n1==n2)
           {
           return 0;
           }
       }
   return 0;
}
#9
Cita de: omar-espanol en 19 Agosto 2016, 14:37 PM
podrian actualizar este tutorial yo instalo qcreator ultima version y arranco pero no me reconoce la libreria xmpp. Porque es importante compilar las librerias estaticamente???

Hola, actualmente no dispongo de tiempo para actualizarlo, pero seguramente en la página Qt habrá muchísima información en inglés para hacerlo.

Un saludo.
#10
Hola, sí se puede, pero sobrecargar el operador & para tal fin puede llevar a muchas confusiones. En la cabecera <memory> tienes la función genérica addressof (se agregó en C++11 para solucionar el problema que comentáis), que funciona de la misma manera que el operador unario &.

Te dejo la referencia http://en.cppreference.com/w/cpp/memory/addressof