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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


  Mostrar Temas
Páginas: 1 [2] 3
11  Programación / Programación C/C++ / No se añade elemento nuevo en una lista enlazada en: 22 Abril 2013, 11:23 am
Buenas, mi problema es el siguiente. Tengo una lista simplemente enlazada que la inicializo con los elementos de un array generados aleatoriamente. Esos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.

La estructura:

Código
  1. typedef struct lista{
  2. int numero;
  3. struct lista *siguiente;
  4. }LISTA;

La función para crear la lista
Código
  1. LISTA *crearLista(int num)
  2. {
  3. LISTA *lista;
  4.  
  5. lista = (LISTA*) malloc( sizeof(LISTA) );
  6.  
  7. lista->numero= num;
  8. lista->siguiente= NULL;
  9.  
  10. return lista;
  11. }
La función de añadir un elemento:

Código
  1. LISTA *anyadirElementoAlPrincipio(int num, LISTA *lista)
  2. {
  3. LISTA *nodo_nuevo;
  4.  
  5. nodo_nuevo= (LISTA*) malloc( sizeof(LISTA) );
  6. if(nodo_nuevo == NULL)
  7. printf("\nNo hay sitio para más números.\n");
  8.  
  9.        else
  10.        {
  11.        nodo_nuevo->numero = num;
  12.        nodo_nuevo->siguiente= lista;
  13.        }
  14.  
  15. return nodo_nuevo;
  16. }
  17.  

La función de ver la lista entera:

Código
  1. void mostrarLista(LISTA *lista)
  2. {
  3. printf("%d\n", lista->numero);
  4.  
  5. if(lista->siguiente != NULL)
  6. mostrarLista(lista->siguiente);
  7. }

En el main el uso de la función de añadir un elemento es exactamente igual con los elementos del array y con el introducido desde el teclado... Si ayudara en algo, decídmelo y lo pongo también.

Gracias de antemano y saludos.

PD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
12  Programación / Programación C/C++ / Incremento de punteros en: 29 Marzo 2013, 17:43 pm
Buenas, mi problema esta vez es el siguiente.

En realidad me gustaría que me explicarais el porqué de este resultado de este código.

El código:
Código
  1. #include <stdio.h>
  2.  
  3. #define MAXLINE 60
  4.  
  5. int main()
  6. {
  7. char *ptr;
  8. ptr = (char*) malloc(MAXLINE * sizeof(char) );
  9.  
  10. printf("Introduce una frase: ");
  11. fgets(ptr, MAXLINE+1, stdin);
  12.  
  13. printf("\n%p = %c", ptr,*ptr);
  14. ptr++;
  15. printf("\n%p = %c", ptr, *ptr);
  16.  
  17. printf("\n\n%p %p", ptr, ptr++);
  18.  
  19.  
  20. return 0;
  21. }

El resultado:


Mi duda es, ¿por qué hace el incremento "al revés"? Después de haber incrementado el puntero en uno para que apunte al segundo carácter (ahí en cambio no hay problema), luego en el printf no es la misma dirección de memoria.

Saludos y gracias de antemano.
13  Programación / Programación C/C++ / Problema con array de punteros en: 26 Marzo 2013, 20:00 pm
Buenas, mi ejercicio es el siguiente: tengo que guardar un string en un array, y luego decir cuál es la palabra que más se repite. Para ello, he pensado guardar cada palabra en un array de punteros, y luego hacer las comparaciones y tal.

El problema viene cuando intento copiar manualmente caracteres en los arrays de punteros. En el siguiente ejemplo:

Código
  1. void copiarPalabras(char *string, char *palabras[]);
  2. {
  3.         int  i = 0;
  4.         //Para las primeras 10 letras, por ejemplo
  5.         palabras[0] = (char*) malloc(10 * sizeof(char) );
  6.  
  7.        while( *(string+ i) != ' ' )   //Copiamos la primera palabra de la frase
  8.       {
  9.       *(palabras[0] + i) = *(string+ i);
  10.       i++;
  11.       }
  12. palabras[i] = '\0';
  13. }
Si, por ejemplo, guardo desde el teclado "hola que tal" en string, en palabras[0] no sólo no se copia "hola", sino basura (strlen me dice que hay 24 caracteres en total). Si compruebo las vueltas que ha dado el bucle, efectivamente son 4 , el número de letras, y además añado el '\0' al final. Funciona mal reserve el espacio que reserve con malloc.

PD: con calloc en lugar de malloc sí funciona correctamente, pero quiero saber qué es lo que hago mal en esa función como está.

Gracias y saludos.
14  Programación / Programación C/C++ / Función fread y saltos de línea en: 19 Marzo 2013, 00:25 am
Buenas a todos, mi problema es que no entiendo ciertas cosas sobre los ficheros, más concretamente la diferencia entre ficheros binarios y de texto, las funciones para cada tipo...

Por ejemplo, en un examen de otro día, teníamos en un archivo de extensión .dat (entiendo que es binario, así que lo abrí como tal). Se trataba de un censo con la información de los habitantes, y si cumplían ciertos requisitos, había que copiarlos a un fichero .txt. No se me ocurrió otra forma que hacerlo con fgets, para tener en cuenta los saltos de línea, asumiendo que cada habitante está en una línea (¿cómo puedo hacerlo con fread?). Y claro, lo hice mal (y éso que con fgets funciona sin problema). Por éso, no tengo nada claro por qué con una función sí y con otra no, y cómo usarla...

Gracias de antemano y saludos.
15  Programación / Programación C/C++ / Estructuras anidadas, funciones y punteros en: 17 Marzo 2013, 15:25 pm
Buenas a todos, tengo unas cuantas dudas y espero poder resolverlas con vosotros.

Tengo que coger un ejercicio de administración de hoteles, hecho anteriormente, y hacerlo, pero esta vez usando punteros.

Por ejemplo, las primeras líneas del .c con main, donde declaro la estructura y la inicializo:

Código
  1. HOTELES hotel[NUM_HOTELES];          //3 hoteles
  2.  
  3. /***************/
  4. HOTELES_inicializarHoteles(hotel); //Inicializamos el número de clientes de cada hotel a 0
 

Dicha función está definida así:

Código
  1. void HOTELES_inicializarHoteles(HOTELES hotel[])
  2. {
  3. int i;
  4.  
  5. for(i=0; i<NUM_HOTELES; i++)
  6. {
  7. hotel[i].numero_clientes = 0;
  8. }
  9. }

Como se trata de reescribir el programa usando punteros, me he limitado a cambiar el parámetro:

Código
  1. void HOTELES_inicializarHoteles(HOTELES *hotel)

Pero no consigo hacer nada. Me da error tanto si intento acceder a la posición del hotel con aritmética de punteros

Código
  1. *(hotel + i).numero_clientes = 0;

como accediendo a la estructura con el operador "->"

Código
  1. hotel[i]->numero_clientes = 0;

(Y haciendo ambas cosas juntas también de da error, claro).

En cambio, si en el parámetro de la función defino hotel como indirección doble, sí que debo emplear el operador "->". Pero bueno, que tampoco tengo del todo claro por qué hay que hacerlo así, lo he hecho un poco al tuntún. Además, así da error en ejecución...

Mi otra duda es si también debería modificar las estructuras anidadas, es decir, si en el primer ejercicio tengo una estructura dentro de otra de forma "simple", si ahora tengo que anidarlas usando punteros.

El tema de los punteros lo tengo claro, cómo y cuándo usar los operadores, direcciones de memoria, etc. Pero ahora con las estructuras no lo tengo nada claro.

Gracias de antemano, perdón por el tocho y saludos.
16  Programación / Programación C/C++ / Guardar cada línea de un fichero en una estructura en: 5 Marzo 2013, 19:56 pm
Hola, quiero hacer lo siguiente, pero no lo consigo.

En cada linea del fichero se supone hay un nombre, y cada uno de esos nombres quiero guardarlos en una estructura. Estaría definida así:

Código:
typedef struct{
nombre[20];
}ESTRUCTURA

Y en el main así:

Código:
ESTRUCTURA estruc[20]

Entonces, lo que yo quiero es guardar la primera línea del fichero en la primera posición, la segunda en la segunda, etc.

Para hacerlo, hago lo siguiente:
Código:
while( ! feof(fichero) )
    {
           fseek(fichero, pos_seek, SEEK_SET);
           fgets(estructura[i].nombre, 80, fichero);
           pos_seek += strlen(estructura[i].nombre);
           i++;
    }

Pero no funciona como debería.

Gracias de antemano.
17  Programación / Programación C/C++ / Duda sobre funciones que devuelven punteros en: 28 Febrero 2013, 20:15 pm
Hola, hemos empezado con punteros, y me ha surgido una duda, sobre el retorno de funciones.

Supongamos que quiero hacer una función que concatene dos cadenas de caracteres, un strcat "personalizado". La definición de la función la haría así:

Código:
void mi_strcat(char *s_dest, char *s_orig)

Pero veo que la función de string.h está definida de la siguiente forma:

Código:
char *strcat(char*s1, const char *s2)

Entonces, me gustaría saber cuál es la diferencia, ya que no entiendo por qué se especifica como retorno char si no "devuelve" (con la sentencia return) nada. Supongo que será por esclarecer el código, pero no estoy seguro, ya que a efectos prácticos no hay diferencia.

Saludos.
18  Programación / Programación C/C++ / ¿Por qué no funciona correctamente este programa? Ficheros inside en: 25 Febrero 2013, 18:38 pm
Tengo que hacer un programa que coja un fichero de texto y lo divida en otros varios archivos, de extensión .001, .002, etc. En cuántas partes quiere dividirlo, lo introduce el usuario. Mi programa funciona a veces sí, a veces no...

Os dejo el bucle principal del código:

Código:

cantidad_por_fich = fread( buffer, 1, sizeof(buffer), fichero_orig);
cantidad_por_fich /= num_partes;

for(i=0; i < num_partes; i++)
{
fichero_orig= fopen(fich_nombre, "r");
strcpy(fich_dest_nombre, fich_nombre);
sprintf(buffer_nombre, ".00%i", i);
strcat(fich_dest_nombre, buffer_nombre);

fichero_dest = fopen(fich_dest_nombre, "w");
while( ! feof(fichero_orig) )
{
fseek(fichero_orig, pos, SEEK_CUR);
fread( buffer, 1, sizeof(buffer), fichero_orig);

fwrite( buffer, 1, cantidad_por_fich, fichero_dest);
pos += num_partes;
}
fclose(fichero_orig);
}
19  Programación / Programación C/C++ / Sobre "rotar" una imagen en SDL en: 15 Enero 2013, 19:01 pm
Buenas, estoy en el proyecto del semestre y estamos haciendo un juego. Se trata del típico juego de motos de ir haciendo saltos. Y claro, en el aire se tendría que poder rotar la moto, ya que si no el juego no tiene ninguna gracia.

En principio hemos pensado en varias opciones. Serían estas:

-Insertar una imagen y rotarla. He estado buscando y al parecer la función "rotozoomSurface" permite hacerlo. El caso es que no sé cómo utilizarla.

-A partir de la primera imagen, crear varias imágenes, pero rotadas. Sería una implementación bastante cutre... Aparte de laboriosa, y los problemas que surgirían (ya sabéis, al rotar una imagen, se crea una de mayores dimensiones).

-Crear nosotros mismos una imagen píxel por píxel. Otra muy laboriosa... Además que no sabría si sabríamos implementarla.

La implementación física está prácticamente hecha (MRUA y tiro parabólico casi en su totalidad), ahora nos falta éso. Os agradecería mucho vuestra ayuda.

Gracias de antemano y saludos.
20  Programación / Programación C/C++ / Recibir un string del teclado de forma "segura" en: 3 Diciembre 2012, 21:56 pm
Buenas, mi duda es la siguiente: qué forma hay de trabajar con cadenas de caracteres de una forma segura con las funciones scanf() y/o gets()? Ya sabéis, a ceñirnos a los espacios en la memoria reservados para el array en cuestión. Sé qué existe la función gets_s(), pero me gustaría saber si se puede con las otras dos mencionadas al principio.

Gracias de antemano y saludos.
Páginas: 1 [2] 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines