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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 ... 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [50] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 ... 161
491  Programación / Programación C/C++ / Re: duda con malloc en: 26 Abril 2018, 00:56 am
En código de producción debes comprobar que malloc no ha devuelto NULL, que es su comportamiento cuándo no encuentra memoria suficiente, y resolver esa novedad. Pero para lo demás, ok. Incluso puedes eliminar eso de llevar a NULL los punteros si no los vas a usar más, pero es buena práctica eso de marcarlos con NULL.
492  Programación / Programación C/C++ / Re: duda con malloc en: 26 Abril 2018, 00:50 am
Muy bien.
493  Programación / Programación C/C++ / Re: Forma canonica en: 25 Abril 2018, 22:01 pm
No tengo linux para probar el código, pero debería ser una cosa así:
Código
  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <errno.h>
  9. #include <termios.h>
  10.  
  11. // Sacado de https://stackoverflow.com/questions/7469139/what-is-equivalent-to-getch-getche-in-linux
  12. static struct termios old, new;
  13.  
  14. /* Initialize new terminal i/o settings */
  15. void initTermios(int echo)  {
  16.    tcgetattr(0, &old); /* grab old terminal i/o settings */
  17.    new = old; /* make new settings same as old settings */
  18.    new.c_lflag &= ~ICANON; /* disable buffered i/o */
  19.    if (echo) {
  20.        new.c_lflag |= ECHO; /* set echo mode */
  21.    } else {
  22.        new.c_lflag &= ~ECHO; /* set no echo mode */
  23.    }
  24.    tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */
  25. }
  26.  
  27. /* Restore old terminal i/o settings */
  28. void resetTermios(void) {
  29.    tcsetattr(0, TCSANOW, &old);
  30. }
  31.  
  32. /* Read 1 character - echo defines echo mode */
  33. char getch_(int echo) {
  34.    char ch;
  35.    initTermios(echo);
  36.    ch = getchar();
  37.    resetTermios();
  38.    return ch;
  39. }
  40.  
  41. /* Read 1 character without echo */
  42. char getch(void) {
  43.    return getch_(0);
  44. }
  45.  
  46. /* Read 1 character with echo */
  47. char getche(void) {
  48.    return getch_(1);
  49. }
  50.  
  51. void SetTermNoCanon( struct termios *SavedTM) {
  52.    struct termios tm;
  53.  
  54.    tcgetattr(0, &tm);
  55.    tcgetattr(0, SavedTM);
  56.    tm.c_lflag &= ~(ICANON|ECHO);
  57.    tm.c_cc[VMIN]= 1;
  58.    tm.c_cc[VTIME]= 0;
  59.    tcsetattr(0, TCSANOW, &tm);
  60. }
  61.  
  62. int main(int argc, const char * argv[]) {
  63.    char c;
  64.    int f;
  65.    long file_end;
  66.    long file_pos;
  67.    char buff[BUFFER_TAMAINA];
  68.    FILE *f1;
  69.    struct stat stat1;
  70.  
  71.    // Voy a sustituir todos los write a stdout por printf o puts
  72.  
  73.    // Número de argumentos diferente al esperado
  74.    if (argc != 3) {
  75.        printf("Uso: %s [fichero] [posicion]", argv[0]);
  76.        return EXIT_FAILURE;
  77.    }
  78.  
  79.    file_pos = atol(argv[2]);
  80.  
  81.    // No se pueden los metadatos del archivo
  82.    if(stat(argv[1], &statl) == -1) {
  83.        puts("error, no se pueden recuperar datos del archivo");
  84.        return EXIT_FAILURE;
  85.    }
  86.  
  87.    // El argumento posición no es un número o es 0
  88.    if(file_pos < 1) {
  89.        puts("error, posicion debe ser un entero igual o mayor a 1");
  90.        return EXIT_FAILURE;
  91.    }
  92.  
  93.    f1 = fopen(argv[1], "r+");
  94.  
  95.    // El archivo no existe o no se puede abrir
  96.    if(!f1) {
  97.        puts("error, el fichero no existe");
  98.        return EXIT_FAILURE;
  99.    }
  100.  
  101.    //- Sustituyo todo esto
  102.    //   while(fgetc(f1)!=EOF) {
  103.    //       k++;
  104.    //   }
  105.    //   fclose(f1);
  106.    //- Por lo siguiente
  107.  
  108.    fflush(f1);
  109.    fseek(f1, 0, SEEK_END);
  110.    file_end = ftell(f1);
  111.  
  112.    // La posición entregada está fuera del archivo
  113.    if(file_pos>file_end) {
  114.        puts("error, la position es demasiado alta");
  115.        fclose(f1);
  116.        return EXIT_FAILURE;
  117.    }
  118.    fseek(f1, file_pos, SEEK_SET);
  119.  
  120.    SetTermNoCanon( &saved_tm );
  121.  
  122.    while(c=getche()!=27) {
  123.        putc(c, f1);
  124.    }
  125.  
  126.    printf("Información: %s\n", argv[1]);
  127.    printf("---------------------------\n");
  128.    printf("Tamaño: \t \t %d bytes\n", stat1->st_size);
  129.    printf("Links: \t%d\n", stat1->st_nlink);
  130.    printf("inode: \t \t %d\n", stat1->st_ino);
  131.  
  132.    fclose(f1);
  133.  
  134.    return EXIT_SUCCESS;
  135. }
  136.  
494  Programación / Programación C/C++ / Re: duda con malloc en: 25 Abril 2018, 17:39 pm
Código:
int *pi;
pi=malloc(sizeof(int));
*pi=5;
printf("%d\n",*pi);
Muy bien. Un puntero en memoria dinámica para un entero.

Código:
pi=5;
Aquí pierdes sizeof(int) bytes de memoria dinámica para el resto del programa. Has perdido el puntero antes de liberarlo y ahora apunta a la dirección de memoria 5.
¿Por qué funciona el programa? Porqué un puntero es un caso especial de dato entero sin signo así que le puedes dar cualquier número de esta clase que quieras.

Código:
printf("%d\n",pi);
Funciona porque le pides a pi que te dé su contenido como entero y eso es 5. Si le pidieras que te diera el contenido a la que apunta su puntero con *pi el S.O. te lo prohibiría por estar fuera del marco de memoria del programa.

Código:
char *cadena;
cadena=malloc(5*sizeof(char));
Muy bien. Un puntero en memoria dinámica para un entero.

Código:
cadena="hola";
Acabas de perder 5*sizeof(char) bytes de memoria dinámica al hacer que cadena apunte  a otro sitio sin haber liberado la memoria anterior. Ahora cadena apunta a la zona de sólo lectura donde el programa ha guardado la cadena 'hola'. No has copia 'hola' a cadena si eso es lo que pretendías; has modificado el puntero.
495  Programación / Programación C/C++ / Re: Forma canonica en: 24 Abril 2018, 17:15 pm
Repasa este par de stackoverflow. Lo explica.
https://stackoverflow.com/questions/7469139/what-is-equivalent-to-getch-getche-in-linux
496  Programación / Programación C/C++ / Re: Forma canonica en: 24 Abril 2018, 11:00 am
Eso depende del terminal, no hay una forma estándar para todo el mundo. Si tienes *nix se hace de una forma, en Windows de otra...
497  Programación / Programación C/C++ / Re: Error en una funcion con arreglos xc en: 22 Abril 2018, 10:06 am
La llamada está bien. A lo mejor te fallara la implementación.
498  Programación / Programación C/C++ / Re: Problema programación listas. en: 21 Abril 2018, 19:25 pm
En insertarPelicula, es lo que he visto así por encima y ya no he buscado más:

Declaras string x, sin inicializar ni darle valor alguno pero asignas el valor de ésta a otra variable y después la comparas. Insisto, sin haberle dado valor alguno. Tal vez por eso te de fallo.
499  Programación / Programación C/C++ / Re: imprimir en: 21 Abril 2018, 13:42 pm
Si las dos estructuras son del mismo tipo se copian igual que un dato normal, con solo el igual. C hace todo el trabajo por ti.
500  Programación / Programación C/C++ / Re: imprimir en: 20 Abril 2018, 20:19 pm
Cómo?
Como siempre, pasa el código.
Páginas: 1 ... 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [50] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines