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 - K-YreX

#221
En primer lugar, si estás seguro de que la has liberado, la memoria se habrá liberado. Otra cosa es que no lo sepas y quieras comprobarlo.
En el segundo caso tienes este tema: https://foro.elhacker.net/programacion_cc/memoria_sin_liberar_c-t505697.0.html muy reciente además en el que se trata el mismo tema.

Antes de crear un nuevo tema para preguntar algo, no viene mal echar un vistazo al foro por si esa duda ya se ha resuelto en otro tema. Puedes usar el buscador en la parte superior (Buscar) para hacer una búsqueda de palabras clave en los foros que quieras y filtrarlos/ordenarlos por diferentes criterios.
#222
Java / Re: Iniciandome en Java
9 Julio 2020, 20:29 PM
Las aplicaciones Java corren bajo una "máquina virtual" (lo pongo entre comillas porque no tiene nada que ver con software del tipo VirtualBox o VMWare) llamada JVM (Java Virtual Machine). Esto es lo que permite que una aplicación Java sea multiplataforma (no importa el sistema operativo mientras tengas instalada la JVM correspondiente).

La JVM viene incluida en el JRE (Java Runtime Environment) que es lo que necesitas instalar para correr aplicaciones Java. Si además quieres desarrollar tu propio código Java necesitas el JDK (Java Development Kit) que integra el JRE además de otras herramientas necesarias.

En tu caso como quieres modificar código Java y tendrás que volver a compilarlo, etc; necesitarás instalar un JDK.
#223
Cita de: EmaTomA en  9 Julio 2020, 12:46 PM


Aqui tienes la solucion a tu problema  ;D



MOD: Imagen redimensionada al tamaño permitido

Te sugiero los siguientes cambios para ese código:
  • No utilizar fflush(stdin) para limpiar el buffer de entrada. Ya lo comenté en el otro mensaje.
  • No utilizar funciones de adorno como system("cls"). Además del gasto de recursos que conlleva hacer llamadas al sistema, al incluir un comando propio del sistema operativo, el programa pierde portabilidad (una forma de mantener la portabilidad es incluir muchos saltos de línea para limpiar la pantalla)
  • No utilizar system("pause") para hacer la pausa final. En C se recomienda usar getchar() (de <stdio.h>) y en C++, cin.get() (de <iostream>).
  • La implementación del bucle no me parece la mejor... Un condicional con un do-while() infinito dentro que tiene un break dentro de otro condicional para salir...

    Mi solución, con las recomendaciones anteriores sería:

    #include <stdio.h>

    const int CLAVE = 123;

    int main(){
        int clave_usuario;
        int clave_correcta; // se puede usar bool incluyendo la cabecera <stdbool.h>
        do {
            printf("Introduce la contrasena: ");
            scanf("%d", &clave_usuario);
            while(getchar() != '\n'); // limpieza de buffer
            clave_correcta = (CLAVE == clave_usuario);
            if(!clave_correcta) {
                printf("** La contrasena es incorrecta **\n");
            }
        while(!clave_correcta);
        printf("** La contrasena es correcta **\n");
        getchar(); // pausa para que no se cierre la consola si se ejecuta el exe directamente
        return 0;
    }


    PD: Los códigos mejor entre etiquetas de Código GeSHi  :rolleyes:
#224
Programación C/C++ / Re: Juego de dados [C]
7 Julio 2020, 03:42 AM
No reabrir temas antiguos
Para consultar dudas nuevas, crea un nuevo tema. Y ya te adelanto que si quieres ayuda, no pongas únicamente el enunciado de tu programa. Tienes que mostrar tus avances. Estamos para ayudar, no para hacer tareas.

Tema cerrado.
#225
Cita de: guero en  6 Julio 2020, 05:50 AM
Gracias por responder!
Claro, conozco Valgrind pero mi idea era (para un trabajo de la escuela) poder mostrarle con un throw que confirme que se liberó toda la memoria.
Desconozco si existe alguna manera de mostrar eso tal y como quieres pero la verdad me extraña que exista. Al final al que le importa que se libere la memoria no es al usuario sino al desarrollador y éste último tiene a su alcance herramientas externas para comprobar que la memoria está liberada ante cualquier finalización del programa.

Cita de: Meta en  6 Julio 2020, 16:47 PM
¿Cómo puedes saber que no se liberó memoria y cuando se se liberó?
Cuando se habla de liberar memoria se hace referencia a la que se reserva de manera dinámica usando funciones como: malloc()/realloc()/calloc() (en C) o new() (en C++). Esta memoria tiene que ser liberada de forma manual con: free() (en C) o delete() (en C++).
Por ejemplo puedes usar herramientas como valgrind (en Linux) y ejecutar:

$ gcc free_memory.c -o free_memory
$ valgrind ./free_memory

Y se ejecutará tu programa de manera normal para después indicarte si ha quedado memoria no liberada:

==11393== Command: ./free_memory
==11393== HEAP SUMMARY:
==11393==     in use at exit: 10 bytes in 1 blocks
==11393==   total heap usage: 3 allocs, 2 frees, 2,058 bytes allocated
==11393==
==11393== LEAK SUMMARY:
==11393==    definitely lost: 10 bytes in 1 blocks
==11393==    indirectly lost: 0 bytes in 0 blocks
==11393==      possibly lost: 0 bytes in 0 blocks
==11393==    still reachable: 0 bytes in 0 blocks
==11393==         suppressed: 0 bytes in 0 blocks
==11393== Rerun with --leak-check=full to see details of leaked memory
==11393==
==11393== For counts of detected and suppressed errors, rerun with: -v
==11393== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Como te indica ahí, puedes usar otros parámetros para la ejecución de valgrind para obtener más información.

La salida del mismo programa liberando la memoria dinámica con free():

==11457== HEAP SUMMARY:
==11457==     in use at exit: 0 bytes in 0 blocks
==11457==   total heap usage: 3 allocs, 3 frees, 2,058 bytes allocated
==11457==
==11457== All heap blocks were freed -- no leaks are possible
==11457==
==11457== For counts of detected and suppressed errors, rerun with: -v
==11457== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
#226
Existen opciones como valgrind (para Linux) que te permiten ejecutar un programa y al finalizar te muestra información entre la que se encuentra la cantidad de memoria sin liberar o los errores que se hayan producido durante la ejecución.
Con esto puedes probar tu programa y ver que no queda memoria sin liberar antes de su finalización.

Pero obviamente estas herramientas no están destinadas a ser usadas por el usuario final sino por el desarrollador. Debes ser tú quien pruebe tus programas con alguna herramienta del estilo para ver que no queda memoria sin liberar.
#227
La solución que busques dependerá un poco de las necesidades de tu programa.

Si por ejemplo, es un programa que estás haciendo para aprender a manejar cadenas o para hacer llamadas al sistema, lo más seguro es que no compense centrar tus esfuerzos en la longitud exacta de las cadenas. Es por esto que normalmente se emplean cadenas char estáticas con tamaños superiores a los necesarios (siempre que la cantidad de memoria no sea un problema).

Si quieres hacerlo con más precisión podrías utilizar memoria dinámica para que cada cadena tenga el largo justo y necesario o utilizar la función strlen() para obtener el largo de una cadena y realizar las cuentas necesarias para calcular de antemano la longitud que necesitas.
#228
El problema más gordo está en la línea 38. No puedes pasar la cadena concatenada sin antes guardarla en una variable. Es por esto que se corrompe la pila y te sale ese error.

Además de eso, cuidado con la longitud para la IP. Utilizas una longitud de 15 porque la ip más larga es de 15 caracteres pero no estás teniendo en cuenta el caracter de fin de cadena ('\0'). Cuando utilizas fgets() e indicas SIZE_IP, la función guarda hasta un máximo de (SIZE_IP - 1) caracteres; puesto que el último lo reserva para el de fin de cadena.

Y para las cadenas evita usar scanf(), fscanf() y similares. Es preferible usar siempre fgets(). Además fflush(stdin) no es la manera correcta de limpiar el buffer de entrada. Esa función solo está definida para limpiar el de salida (fflush(stdout)).

Te dejo una variante que funciona (está probada en Linux):

printf("Introduce el nombre del fichero con las direcciones IP: ");
fgets(file_name, SIZE_NAME, stdin);
        // Eliminar el salto de linea del final y limpiar el buffer de entrada
if(file_name[strlen(file_name)-1] == '\n') file_name[strlen(file_name)-1] = '\0';
else while(getchar() != '\n');

file = fopen(file_name, "r");

while(fgets(ip, SIZE_IP, file)){
printf("IP address to ping: %s", ip);
getchar();
strcpy(command, "ping -c 4 ");
strcat(command, ip);
system(command);
}



#229
Programación C/C++ / Re: Pin y contraseña
26 Junio 2020, 02:48 AM
Como ya te han dicho, estás accediendo a posiciones de memoria desconocidas. Además el número aleatorio que generas no está entre 0 y 35 sino entre 0 y 49. Tendrías que hacer que el número aleatorio esté entre 0 y 9 mediante: (rand() % 10).

Otro problema a tener en cuenta es que no generas 4 dígitos mediante el bucle for() sino 5. Desde i = 0 hasta i <= 4 son: {0,1,2,3,4} 5 repeticiones.

Y un consejo extra: no utilices system("pause") para hacer una pausa en el programa. Utiliza getchar() que pertenece a la biblioteca <stdio.h>.
#230
Te corrijo sobre tu propio mensaje. Te he puesto en mayúsculas los errores y en minúscula las sugerencias o avisos.

Para otros códigos que pongas, utiliza las etiquetas de Código GeSHi.

Cita de: Damariis en 18 Junio 2020, 20:38 PM
Código (cpp) [Seleccionar]

#include <iostream> // Esta cabecera es para usar entrada/salida estandar de C++ (cout y cin). No la usas para nada
#include <stdio.h> // Cabecera para printf() y scanf(). Esta es tipica de C, no de C++.

// Es mejor que las variables las declares de forma local en la funcion main()

unsigned int num1;

int num=1 // FALTA EL ;. AQUI ESTA EL PROBLEMA. Ademas no usas esta variable.

int main(){

printf("Quedate en casa"); // Deberias poner algun salto de linea "\n" para que no salga todo seguido
printf("Dime un numero:");
scanf(%u,&num1); // EL PRIMER ARGUMENTO VA ENTRE COMILLAS DOBLES "%u"
if (num1==1){
              // Aqui tambien deberias poner saltos de linea
printf("***COMO PROTEGERNOS AL SALIR DE CASA ***");
printf("1.coja la mascarilla");
printf("2.coloquese en su boca");
printf("3.pongase  atras de las orejas las tiras");
printf("4.Coja unos guantes con mucho cuidado");
printf("5.Si fuera posible utilizar un traje de proteccion ");
printf("6.coloqueselos en las manos que cubra toda la mano ");
printf("7.Evitar tocar manijas o culaquier cosa fuera de casa,no tocarse la cara ");
printf("8.Mantener la distancia de por lo menos un metro de distancia");
printf("9.Si es posible lavarse las manos frecuentemente");
printf("***ASI ESTARA MAS PROTEGIDO CUANDO SALGA DE CASA***");
}
else { // Esto no tiene mucho sentido. Directamente comprueba si es un 1 o un 2 pero sin pedir otro numero.
printf Dime otro numero ; // FALTAN PARENTESIS Y COMILLAS
printf "Escribe otro numero"; // FALTAN PARENTESIS
scanf(%u,&num2); // FALTAN COMILLAS DOBLES. Y num2 NO ESTA DECLARADO EN NINGUN SITIO
if (num2==2){
                       // Aqui tambien pondria unos saltos de linea en cada mensaje
printf("***COMO PROTEGERNOS AL ENTRAR A CASA***");
printf ("1.Colocar un tapete con desinfectante para desinfectar los zapatos");
printf ("2.Tener un desinfectante para desinfectarnos la ropa,manos,mascarilla,de preferencia todo el cuerpo");
printf ("3.Tambien desinfectar las cosas que traigamos con nosotros comida,etc ");
printf ("4.Si es posible sacarnos la ropa e ir a dejar inmediatamente a lavar ");
printf ("5.Lavarnos las manos minimo 20 segundos con aabundante agua y jabon ");
printf ("6.Si fuera posible ir a darnos un baño para luego entrar a casa");
printf ("7.Los alimentos tienen que estar bien cocidos y lavados ");
printf ("***ASI ESTAREMOS MAS PROTEGIDOS AL ENTRAR A CASA ***");
else
printf "Error"; // FALTAN PARENTESIS
}
return 0;
}
}