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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: 1 ... 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 [135] 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 ... 161
1341  Programación / Programación C/C++ / Re: Problema al pasar char* como parametro en: 17 Abril 2016, 00:52 am
Un array no es un puntero. Son dos tipos de objetos diferentes. C sabe el tamaño que tiene un array pues se lo has indicado pero un puntero puede apuntar a cualquier cosa y no hay información sobre lo que guarda. Por tanto el tamaño de un puntero tan solo te devolverá el tamaño de la palabra del procesador.

Así mientras tengas la declaración del array a la vista de sizeof éste sabrá que tamaño tiene, en cuánto lo referencies con un puntero habrás terminado con ese dato.

¿Qué quiere decir eso?
Si declaras el array de forma global, fuera de toda función, a partir de ese momento todo el programa conocerá el tamaño del array.
Si declaras el array de forma local, dentro de una función, únicamente dentro de esa función se sabrá el tamaño de ese array.
1342  Programación / Programación C/C++ / Re: cual es el mejor ide para programa en c++? en: 16 Abril 2016, 17:32 pm
Tienes Visual Studio Comunityt.
Tienes Mono Develop.
Tienes QtCreator.
1343  Programación / Programación C/C++ / Re: Duda solo ingresar numeros en: 16 Abril 2016, 16:00 pm
Solución para Linux en compilador GCC, posiblemente funcione em MINGW para Windows ya que es un port de GCC.

El corazón del programa es la función getnum que sólo recibe números decimales (del 0 al 9) desde el teclado y devuelve un entero (int) con el valor igual al número introducido.

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <termios.h>
  4.  
  5. static struct termios old, new;
  6.  
  7. void init_terminal() {
  8.    tcgetattr(0, &old); /* old <- configuración actual del terminal
  9.                          * el 0 en el primer argumento es el descriptor
  10.                          * de archivo de stdin.
  11.                          */
  12.    new = old;          /* new copia el terminal original */
  13.    new.c_lflag &= ~ICANON;      /* Modo no canónico: la entrada se acepta
  14.                                   * caracter a caracter en vez de línea a
  15.                                   * línea.
  16.                                   */
  17.    new.c_lflag &= ~ECHO;        /* No hay eco del carácter introducido */
  18.    tcsetattr(0, TCSANOW, &new); /* Se guarda el nuevo comportamiento
  19.                                   * del terminal para usarlo a partir
  20.                                   * de ya.
  21.                                   */
  22. }
  23.  
  24. void reset_terminal() {
  25.    tcsetattr(0, TCSANOW, &old); /* Se vuelve al comportamiento original */
  26. }
  27.  
  28. int getnum() {
  29.    int num = 0;
  30.    int pos = 0;
  31.    int negative = 0;
  32.    char c;
  33.  
  34.    init_terminal(0);
  35.    while((c = getchar()) != '\n') {
  36.        if(pos == 0 && c == '-') {
  37.            putchar('-');
  38.            negative = 1;
  39.            ++pos;
  40.        }
  41.        if(c == 127 && pos) { /* 127 es la tecla retroceso */
  42.            num /= 10;
  43.            putchar('\b');
  44.            putchar(' ');
  45.            putchar('\b');
  46.            --pos;
  47.        }
  48.        if(isdigit(c)) {
  49.            putchar(c);
  50.            num *= 10;
  51.            num += c - '0';
  52.            ++pos;
  53.        }
  54.    }
  55.    if(negative)
  56.        num = -num;
  57.    reset_terminal();
  58.    putchar('\n');
  59.    return num;
  60. }
  61.  
  62. int main()
  63. {
  64.    int num;
  65.    printf("Introduzca un número: ");
  66.    num = getnum();
  67.    printf("%i", num);
  68.  
  69.    return 0;
  70. }
1344  Programación / Programación C/C++ / Re: Algoritmo en dos dimensiones en: 16 Abril 2016, 14:48 pm
Pues si estoy en casi lo correcto busca un juego, lo más sencillo que encuentres, del juego de la vida de Conway.
Trabajas de la siguiente forma:
Tienes un array que es tu mundo en el presente, en el momento T.
Tienes un array que representa tu mundo en el momento T+1.
Para rellenar éste último array lo que haces es a cada partícula de T aplicas los cálculos de física sobre todos sus vecinos en el momento T. A la partícula actualizada la guardas en el array de T+1.
Finalizadas todas las partículas copias T+1 a T, o mediante punteros (será más rápido) conviertes el array T+1 en el array T y el que era el T servirá para situar los datos de T+1, y lo presentas por pantalla, o lo que sea que tengas que hacer para representar los datos.
Vuelves a empezar.
1345  Programación / Programación C/C++ / Re: Algoritmo en dos dimensiones en: 16 Abril 2016, 08:36 am
A ver si entiendo el concepto que estás intentando realizar.
Tienes un conjunto de particulas en un entorno tridimensional, un cubo.
Por lo que veo en la definición de sus propiedades,  estas partículas van a interactuar entre sí unas con otras.
Has guardado tus partículas en un array, contienen la información en el momento t
Quieres otro array para que te guarde todas las partículas otra ves pero actualizadas al momento t+1.
1346  Programación / Programación C/C++ / Re: AYUDA Reserva de vuelos en C en: 15 Abril 2016, 15:10 pm
Veo que C no es tu primer lenguaje.
Yo veo una tabla de structs
con datos definidos del siguiente estilo:
Un char[] con el tamaño suficiente como para contener una cadena de 3 caracteres, que contendrá el nombre del asiento. <-- Esto está mal. En su lugar debe poner:
Un char[] con el tamaño suficiente como para contener un DNI con su letra.
Un int usado como bool (soy de la vieja escuela) para saber si el asiento está ocupado.
No pondría el nombre del asiento en el struct porqué no lo veo útil. Lo que haría es una función que traduzca el nombre del asiento a un puntero hacia el elemento de la tabla a la que pertenece el asiento.



Editado, razón en el mensaje principal.
1347  Programación / Programación C/C++ / Re: SQLite3 Amalgamation y C: Visor de Archivos y URLs al Azar en: 15 Abril 2016, 07:26 am
Esto es porque lo quieres compilar con C++. C, no se queja tanto por la igualdad en tipos de datos, C++ es muy estricto en eso.
malloc, calloc, realloc devuelven void*. C al ver esto se fija en el tipo de dato del lvalue y si puede hacer la conversión, la hace; en cámbio C++ no hace ese paso y entiende que el programador, al no hacer el cast explícito, se ha equivocado.
Código:
int *p = malloc (sizeof (int));
Funciona en C pero en C++ necesita
Código:
int *p = (int*) malloc (sizeof(int)); 
1348  Programación / Programación C/C++ / Re: AYUDA Reserva de vuelos en C en: 15 Abril 2016, 07:11 am
Entiendo que el código que has pasado no se puede tocar más que para introducir la funcionalidad del DNI.
1349  Programación / Programación C/C++ / Re: Problema basico con listas en C en: 14 Abril 2016, 21:51 pm
Muy bien, veo que lo has entendido.
Ahora recuerda que es mala práctica abusar de typedef, y más si typedef esconde detrás punteros. Debe usarse para esclarecer el código, no ofuscarlo. Muchas veces es mejor, para un tercero, saber que un tipo de dato es un puntero; a no ser que sea intención tuya una ocultación expresa de los interiores del tipo de dato en cuestión, simulando a lo que se hace con la programación orientada a objetos.
1350  Programación / Programación C/C++ / Re: Problema basico con listas en C en: 14 Abril 2016, 20:19 pm
Son fallos básicos de punteros pero a los que se pierde rápidamente la pista cuándo no se está acostumbrado. Con práctica los irás solucionando.

Tienes razón al escribir
Código:
void push(listaPTR listp, int value)
pues necesitas variar la dirección contenida en lista si esta apunta a NULL, pero fallas cuándo escribes
Código:
e = &listp;
por el hecho de que ahora e apunta a la dirección de listp.

*** Dando una vuelta de tuerca al tratamiento de la memoria en C ***
listp debe considerarse una variable local de la función push por lo que obtener su dirección no hará que apuntes a la lista original sino a una parte de la pila de la función a la que estás.
Lo que debes obtener es el valor que hay guardado en listp que será la dirección en la que se guarda la lista.
Sé que es complicado dicho así, pero si lo llegas a entender se acabarán los problemas con los punteros. Como regla nemotécnica piensa en que vas a sacar un asterisco a tu puntero. Algo así:
Tu tienes **listaPTR
Dentro tienes *lista
Como ves hay que quitarse un asterisco de encima para obtener *lista.
En el código
Código:
node *e
haces un puntero a node. Es lo mismo que hacer
Código:
lista e
ya que node * es lo mismo que lista.
Ahora viene cuando sacamos un asterisco **listaPTR. Para ello, durante la asignación cogemos ese asterisco, lo sacamos de **listaPTR y lo dejamos a su izquierda. En código queda así:
Código:
e = *list
Ahora los dos objetos son del mismo tipo y se respeta la igualdad.

Bien. Pasemos a los argumentos de llamada de la función push.
Hemos creado nuestra lista, l, y su tipo es *lista pero el argumento espera que le entreguemos la dirección de memoria donde se guarda ésta. Otra vez podemos hacer uso de una regla nemotécnica: debemos pensar que queremos incluir un asterisco a esa variable y para ello cogemos y, ni cortos ni perezosos, se lo escribimos a mano con el símbolo & a su izquierda. De hecho & parece como si quisiéramos escribir un asterisco de forma rápida y sin levantar el lápiz del papel.
En código queda así:
Código:
push(&l,20);
Así *lista con un asterisco más digievoluciona a **listaPTR.

Tu código funcional quedaría de la siguiente forma:
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4.  
  5. typedef struct nodo_t {
  6.    int value;
  7.    struct nodo_t* next;
  8. } node, *lista, **listaPTR;
  9.  
  10.  
  11. lista new_node(int value){
  12.    node * n = (node *) malloc(sizeof(node));
  13.    n->value = value;
  14.    n->next = NULL;
  15.    return n;
  16. }
  17.  
  18. lista new_lista(){
  19.    return NULL;
  20. }
  21.  
  22.  
  23. void print_list(lista head){
  24.    node *prev;
  25.  
  26.    prev =  head;
  27.    while (prev)
  28.    {
  29.        printf("%d\n", prev->value);
  30.        prev = prev->next;
  31.    }
  32. }
  33.  
  34.  
  35. void push(listaPTR list, int value)
  36. {
  37.    node *e,*prev,*n;
  38.    int v; /* v no se usa */
  39.  
  40.    // camino hasta el final de la list (poco eficiente, mejor tener puntero al final)
  41.    e = *list;
  42.    while (e){
  43.        prev = e;
  44.        e = e->next;
  45.    }
  46.  
  47.    // creo nodo
  48.    n = new_node(value);
  49.  
  50.    if (*list == NULL)
  51.    {
  52.        *list = n;
  53.        //printf("Elem: %d\n",list->value);
  54.        //printf("Elementos: %d\n",count(list));
  55.    }
  56.    else
  57.        // inserto al final
  58.        prev->next = n;
  59. }
  60.  
  61.  
  62. int main() {
  63.    lista l = new_lista();
  64.    push(&l,20);
  65.    push(&l,40);
  66.    print_list(l);
  67. }
Páginas: 1 ... 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 [135] 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines