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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9
41  Programación / Programación C/C++ / Re: Problema para pasar una lista a fichero con Fwrite en: 18 Febrero 2011, 14:05 pm
Discúlpame, es que al ser un archivo binario decidí guardarlo en un .dat en vez de un .txt en teoría es lo mismo, así que supongo no habría problemas por eso.
En la estructura tengo datos insertados, los he comprado mostrándolo por pantalla, luego la función que tengo para guardar la estructura en el fichero es la que puse anteriormente y función que tengo para cargar los datos del fichero en la estructura es esa que puse ahora.
¿Tengo que reservar memoria para guardar los datos del archivo en la lista?
Un saludo y muchas gracias.
42  Programación / Programación C/C++ / Re: Problema para pasar una lista a fichero con Fwrite en: 18 Febrero 2011, 13:05 pm
Muchas gracias por la respuesta.
Tengo una función para leerlo, lo siento se me olvido adjuntarla, la pongo aqui, pero me da fallos, igual es la función la que esta mal:

Código
  1. int leer_fic(pacientes *first){
  2. FILE *fp;
  3. pacientes *aux;
  4.  
  5. fp = fopen("pacientes.dat","r+b");
  6.  
  7. fread(&first,sizeof(pacientes),1,fp);
  8. fclose (fp);
  9.  
  10. aux = first;
  11. printf("%d",aux->dni);
  12. }
43  Programación / Programación C/C++ / Problema para pasar una lista a fichero con Fwrite en: 18 Febrero 2011, 02:30 am
Saludos.
Tengo el siguiente problema, quiero pasar una lista a un fichero, la lista tiene datos que yo previamente le he introducido y los he mostrado para verificar que los datos son correctos, el caso es que cuando intento pasar dicha lista un fichero de la siguiente forma con fwrite, solo me mete basura en el fichero.
Dejo el código a ver si podéis ayudarme:

Esta es la estructura de la lista:

Código
  1. typedef struct nodo_pacientes{
  2.         int dni;
  3.         int fecha;
  4.         int edad;
  5.         int medico;
  6.         struct nodo_pacientes *next;
  7.        }pacientes;
  8.  

Esta es la función que uso para escribir en el fichero a la cual le paso un puntero por referencia al primer elemento de la lista:

Código
  1. int list_fic(pacientes **primero){
  2. FILE *fp;
  3. pacientes *aux;
  4.  
  5. int b = 0;
  6. fp = fopen("pacientes.txt","wb");
  7. aux = *primero;
  8.  
  9. while(aux != NULL){
  10.  b = fwrite(&aux,sizeof(pacientes),1,fp);
  11.  aux = aux->next;
  12. }
  13.  
  14. fclose (fp);
  15. printf("\n\n %d",b);
  16. }

Un saludo, espero que podáis ayudarme.
44  Programación / Programación C/C++ / Anidar una lista enlazada dentro de otra en C. en: 25 Enero 2011, 18:44 pm
Hola muy buenas.
Tengo una duda sobre si es posible anidar listas enlazadas, es decir una lista enlazada por cada nodo que cree de otra lista enlazada.
He hecho un código, parece funcionar, pero solo me muestra el ultimo nodo insertado, dejo el código aquí puesto por si podeís ayudarme a corregir los posibles errores que pueda a ver o si no es posible anidar una lista dentro de otra.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Articulo {
  5.       int numero;
  6.       int numero2;
  7.       struct Articulo *sig;
  8.      }TLista;
  9.  
  10. typedef struct nodo_art {
  11.         int codigo;
  12.         TLista *primero;
  13.         struct nodo_art *sig;
  14.        }lista;
  15.  
  16. int add_nod(lista **first,int a,int b,int c){
  17. lista *nuevo,*aux;
  18. TLista *nuevonum,*aux2;
  19. nuevo = (lista *) malloc (sizeof(lista));
  20. nuevonum = (TLista *) malloc (sizeof(TLista));
  21. nuevo->codigo = a;
  22. nuevo->sig = NULL;
  23. nuevo->primero = NULL;
  24.  
  25.  
  26. nuevonum->numero = b;
  27. nuevonum->numero2 = c;
  28. nuevonum->sig = NULL;
  29.  
  30.   if(nuevo->primero == NULL){
  31.             nuevo->primero = nuevonum;
  32.            } else {
  33.               aux2 = nuevo->primero;
  34.               while(aux2->sig != NULL){
  35.                 aux2 = aux2->sig;
  36.                }
  37.               aux2->sig = nuevonum;
  38.              }
  39.  
  40. if(*first == NULL){
  41.             *first = nuevo;
  42.            } else {
  43.               aux = *first;
  44.               while(aux->sig != NULL){
  45.                 aux = aux->sig;
  46.                }
  47.               aux->sig = nuevo;
  48.              }
  49. }
  50.  
  51.  
  52. int see_list(lista *first){
  53. lista *aux;
  54.  
  55. if(first == NULL){return -1;}
  56. while(aux != NULL){
  57.  printf("%d- %d %d\n",aux->codigo,aux->primero->numero,aux->primero->numero2);
  58.  aux = aux->sig;
  59. }
  60. }
  61.  
  62.  
  63. int main(){
  64.    lista *first;
  65.    first = NULL;
  66.  
  67.    add_nod(&first,5,3,5);
  68.    add_nod(&first,3,2,7);
  69.  
  70.    add_nod(&first,4,3,2);
  71.    see_list(first);
  72.    getchar();
  73. }
  74.  
  75.  
Un saludo y gracias por todo.
45  Programación / ASM / Re: ¿Dudas sobre si aprender primero ASM del pic o del microprocesador? en: 21 Enero 2011, 10:07 am
Muchas gracias por la respuesta me ha sido de utilidad : ) Empezare primero con ASM del microcontrolador y luego me pasare al del microprocesador, ya que este primero me hace mas falta que el segundo ahora mismo.
Un saludo.
46  Programación / ASM / ¿Dudas sobre si aprender primero ASM del pic o del microprocesador? en: 20 Enero 2011, 00:12 am
Saludos a todos.
El caso es que quiero aprender ensamblador, pero me interesaría aprender tanto el ensamblador de los microcontroladores, en principio el del pic 16f84 aunque por lo que tengo el ensamblador de ese pic es muy parecido al de otros pics de la familia de microchips.
Quiero aprender también ensamblador del microprocesador de los ordenadores actuales, el caso es que no se por cual empezar, no se si es mejor empezar por el ensamblador de los pic y luego pasar al de los microprocesadores o por el contrario aprender primero el del microprocesador y luego pasar al del microcontrolador.
¿es muy diferente uno de otro?¿el hecho de aprender uno, hace que el otro sea mas fácil de aprender?
Espero que podaís ayudarme.
Un saludo.
47  Programación / Programación C/C++ / Re: ¿Errores en los enunciados de un examen de C? en: 19 Enero 2011, 23:42 pm
Ya ves jaja se encuentra uno con cada profesor… bueno si se puede llamar eso jeje
oye pues es genial todo lo que sabes de C y solo estas en la segundaria, has aprendido de forma autodidacta, ¿no?

Citar
Con respecto a la estructura cola, la parte positiva de tener declarado el tipo de dato nodcola es la posibilidad de retornar ese tipo (aunque no declares más de una variable de ese tipo)

Muchísimas gracias por el ejemplo. Ahora veo mejor la utilidad que dices.

Sobre el tema de las estructuras globales, es cierto lo que dices, lo he probado en mi codigo, el caso es que ya se que me paso, tenía tal cacao mental en mi cabeza que pasaba los parámetros por valor, y luego tenía problemas para modificarlos, hay pase a pasarselos por referencia y funcionaba correctamente, pero eso no hacía falta, ya que Cola.principio y Cola.final eran variables globales.
Tu aclaración ha servido para darme cuenta de mi error. Muchas gracias.

Muchísimas gracias por la aclaración de las referencias, ya me parecia raro definir de esa forma los parámetros, pero pense que se podía hacer. Gracias lo tendre en cuenta en un futuro.

Sobre el malloc ahora me ha quedado mas claro todo, mira he puesto otro post, te lo enlazo aquí creo que hay un problema con malloc como dices, pero he probado a modificarlo de la forma que me has dicho en este post pero sigo teniendolo, si le puedes echar un vistazo al problema que planteo te lo agradecería mucho, ya que no consigo ver donde esta el error de funcionamiento.
Este es el otro post publicado: http://foro.elhacker.net/programacion_cc/fallo_de_segmentacion_al_agregar_mas_nodos_en_una_lista-t317205.0.html
Un saludo y muchísimas gracias por todo de veras.
48  Programación / Programación C/C++ / Fallo de segmentación al agregar mas nodos en una lista. en: 19 Enero 2011, 15:08 pm
Saludos, tengo un problemita a ver si podéis ayudarme a solucionarlo, tengo el siguiente programa que lo que hace es meter datos en una cola, en este caso serian códigos de articulo, y luego mediante una función de comparación  extraigo los datos de la cola y agrego esos datos en otra lista de manera que solo haya un nodo por cada código de articulo y la cantidad de dicho articulo.
El programa me compila y me funciona, pero el caso es que cuando agrego más de un determinado número de nodos el programa da errores y se produce fallo de segmentación.
Los nodos en la cola los agrego mediante la función add_nod().

He dejado el código con el fallo de segmentación si quitáis una llamada a la función add_nod el programa funciona y no da errores.
He usado el entorno de programación Dev C++ y estoy en Windows XP.

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct nodo_art {
         int Codigo;
         struct nodo_art *sig;
        }lista;

typedef struct Articulo {
       int Codigo,Cant_Pedida;
       struct Articulo *sig;
      }TLista;

/* Agrega nodos a la cola */

int add_nod(lista **first,lista **ultimo,int Codigo){
 lista *nuevo;
 nuevo = (lista *) malloc (sizeof(lista));
 nuevo->Codigo = Codigo;
 nuevo->sig = NULL;     
 if(*first == NULL){
             *first = nuevo;
             *ultimo = nuevo;
            } else {
                   (*ultimo)->sig = nuevo;
                   *ultimo = nuevo;
              }
}
/* Extrae nodos de la cola */
int ext_nod(lista **first,lista **ultimo){
     lista *aux;
     int v;
     
     aux = *first;
     if(aux == NULL){return -1;}
     *first = (*first)->sig;
     v = aux->Codigo;
     free(aux);
     if(*first == NULL)
      *ultimo = NULL;
     return v;
    }

   
/* Funcion para agregar nodos a lista de Articulos, las llamadas a esta función las hace la función lol */
void add_tnod(TLista **primero,int Codigo,int Cantidad){
 TLista *nuevo,*aux;
 nuevo = (TLista *) malloc (sizeof(TLista));
 nuevo->Codigo = Codigo;
 nuevo->Cant_Pedida = Cantidad;
 nuevo->sig = NULL;     
 if(*primero == NULL){
             *primero = nuevo;
            } else {
                   aux = *primero;
                   while(aux->sig != NULL){
                   aux = aux->sig;
              }
             aux->sig = nuevo;
             }
}

/* Función de comparación, lo que hace es si un articulo esta en la cola pero no esta en la lista, lo extrae
   de la cola y lo inserta en la lista, si el articulo ya se encuentra en la lista, lo extrae de la cola
   e incrementa en 1 el campo Cantidad del articulo en cuestión dentro de la lista */
int lol(lista **primero,lista **ultimo,TLista **tprimero){
     lista *aux;
     TLista *aux2;
     int v,a;
     v = 0;
     a = 0;

     aux = *primero;
     while(aux != NULL){
      aux2 = *tprimero;
      if(aux2 == NULL){
         v = ext_nod(primero,ultimo);     
         add_tnod(tprimero,v,1);
         aux2 = *tprimero;
         aux = *primero;
        }
          while(aux2 != NULL){
           if(aux->Codigo == aux2->Codigo){
            a = aux2->Cant_Pedida;
            aux2->Cant_Pedida = a+1;
            ext_nod(primero,ultimo);
            aux = *primero;
            }else{
                   add_tnod(tprimero,aux->Codigo,1);
                   ext_nod(primero,ultimo);
                   aux = *primero;
                  }         
            aux2 = aux2->sig;
         }
     }
}

/* Función para visualizar la lista */
int see_tlist(TLista *tprimero){
      TLista *auxiliar;
       
      auxiliar = tprimero;
      if (auxiliar == NULL) {printf( "La lista esta vacia!!\n" ); return 0; }
      while (auxiliar!=NULL) {
             printf("Codigo:%d Cantidad:%d\n",auxiliar->Codigo,auxiliar->Cant_Pedida);             
             auxiliar = auxiliar->sig;
            }
     }

int main(){
  lista *primero,*ultimo;
  TLista *tprimero;
  primero = NULL;
  ultimo = NULL;
  tprimero = NULL;
 
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,2334);
  add_nod(&primero,&ultimo,111223);
  add_nod(&primero,&ultimo,8989);
  add_nod(&primero,&ultimo,2122);
  add_nod(&primero,&ultimo,2122);
  add_nod(&primero,&ultimo,2233);
  lol(&primero,&ultimo,&tprimero);
  see_tlist(tprimero);
  system("pause");
}

49  Programación / Programación C/C++ / Re: ¿Errores en los enunciados de un examen de C? en: 19 Enero 2011, 14:54 pm
Muchísimas gracias por las respuestas.
Sobre esto:
Citar
Porque... para qué quieres declarar el tipo de estructura Cola, si sólo necesitas una variable de ese tipo?

Realmente no lo se, en el primer post que publique esta el enunciado del examen copiado, mi profesor dio una estructuras de datos ya hecha y pretendía de que implementáramos las funciones a partir de dicha estructura, pero el no hace lo siguiente:
Código:
struct {Puntero principio, final} Cola
Ni declara una variable de la plantilla cola, por lo tanto daba error al compilar, por eso yo cree una variable de estructura, realmente es mejor usar eso que dices, o simplemente definir los punteros fuera de una estructura, si solo voy a trabajar con una lista de ese tipo.
Gracias por la corrección.

Sobre el tema de las variables globales y lo que hacía, creo que ya lo he entendido, seria algo así:
Aunque la estructura que contiene los punteros principio y final esté declarada fuera del main, siguen siendo locales a la estructura en los que fueron declarados y por eso los paso por referencia, ¿no?
Eso era lo que no entendía, realmente si sabía que se los pasaba por referencia, pero no tenía muy claro el por que lo hacía, ya que la estructura estaba declarada fuera del main y eso me ha liado.
Y gracias por el consejo a la hora de probar algo cuando no me funcione, realmente suelo hacer lo que dices, pero basándome en ideas que se me ocurren, quiero decir, que no me lió a poner símbolos a loco, si no que intento razonar que puede estar pasando.. normalmente claro, por que hay otros días que ya por perdición me lió a poner cosas sin saber que hago jeje.

Citar
Te explico el funcionamiento de malloc, porque creo que la utilizas mal
El problema de malloc creo que lo veo pero no se como solucionarlo, se que lo que le estoy pasando es un puntero al operador sizeof y no en si un tipo de dato, ese sería el problema, ¿no? Si me puedes dar una ayudita mas, se lo agradecería mucho.
Citar
En la función ext_nod cuando haces:
Cierto, disculpa, se me paso ese error por delante y no me di cuenta. Muchísimas gracias por la corrección.
Citar
Tan preocupado estás por el código de un exámen? y te acuerdas del código perfectamente de dicho exámen? Espero que ésto no sea una tarea, pués sería contrario a las reglas del foro... En cualquier caso en mis explicaciones no doy el código resuelto, sino indicaciones de que hacer para enmendar tus errores...
Tranquilo es normal que sospeches, veras le explico, el caso es que es un examen practico, y la hoja del examen me la pude llevar, teníamos que hacerlo en la clase y enviarlo por correo, el caso de que me complique tanto por ese ejercicio que ya hice y entregue, es por que los enunciados podían tener errores algo que me resultaba bastante raro que un maestro cometa errores a la hora de plantear un examen, ya que de por si, el tema de las estructuras de datos y colas es bastante lioso para un principiante si el enunciado contiene errores sería aún peor.
Lo cierto, es que ya entregue el ejercicio, tenía fallos, a mi profesor le da igual que compilen o no, simplemente quiere el código, realmente para lo que hemos dado lo ha liado bastante el examen,  por ejemplo definiendo los punteros de primero y ultimo dentro de una estructura, nadie de la clase llego a hacerlo.
Aún así quería aprender por mi cuenta y me he puesto a investigar sobre lo que hice para de esa forma  resolver mis dudas que me surgieron a causa de ese examen, de hay todas las preguntas jeje.

Un saludo y muchísimas gracias por todo. Si me puedes explicar un poco mejor lo de malloc lo agradecería muchísimo, Creo que ahora tengo mas claro la implementación de TDA con estructuras de datos.
Muchas gracias.




50  Programación / Programación C/C++ / Re: ¿Errores en los enunciados de un examen de C? en: 16 Enero 2011, 20:46 pm
Hola, saludos, muchísimas gracias por la respuesta, la primera parte la tengo clara, cuando llego aquí:
Código:
Struct Cola { Puntero principio, final; };

El único problema que habría es que mi profesor declaro la plantilla de estructura pero no declaro una variable de esa plantilla de estructura.
Por eso el compilador me daba error, yo le expuse este problema en el examen pero me dijo que no, que el código estaba bien…
Yo declararía la siguiente estructura, por ejemplo:
Código:
Struct Cola Cola1
Haciendo esto, ya me compilaba, pero tenía errores en el código que he solucionado pero no tengo muy clara la idea de como lo he solucionado, a ver si me puedes echar una mano a entenderlo todo mejor, expongo el código funcionando:

Código:
#include <stdio.h>
#include <stdlib.h>

struct Componente {
        int dato;
        struct Componente *next;
       };
typedef struct Componente *Puntero;
struct nodcola{Puntero principio,final;};
struct nodcola Cola;


int add_nod(Puntero *first,Puntero *ultimo,int dato){
 Puntero nuevo;
 nuevo = (Puntero) malloc (sizeof(Puntero));
 nuevo->dato = dato;
 nuevo->next = NULL;     
 if(*first == NULL){
             *first = nuevo;
             *ultimo = nuevo;
            }else {
                   (*ultimo)->next = nuevo;
                   *ultimo = nuevo;
              }
}

int ext_nod(Puntero *first,Puntero *ultimo){
     Puntero aux;
     int v;
     
     aux = *first;
     if(aux == NULL){return -1;}
     *first = (*first)->next;
     v = aux->dato;
     free(aux);
     if(*first == NULL)
      ultimo = NULL;
     return v;
    }
   
int main(){
 Cola.principio = NULL;
 Cola.final = NULL;
 
 add_nod(&Cola.principio,&Cola.final,6);
 add_nod(&Cola.principio,&Cola.final,8);
 add_nod(&Cola.principio,&Cola.final,3);
     printf("%d\n",ext_nod(&Cola.principio,&Cola.final));
     printf("%d\n",ext_nod(&Cola.principio,&Cola.final));
     printf("%d\n",ext_nod(&Cola.principio,&Cola.final));
     printf("%d\n",ext_nod(&Cola.principio,&Cola.final));
 system("pause");
 
}

Yo defino una variable de estructura de la siguiente manera struct nodcola Cola; pero a las funciones add_nod y ext_nod no les paso Cola.principio, les paso la variable por referencia, esto no entiendo por que es, ya que la variable de estructura Cola es una variable global por lo tanto debería ser accesible por todas las funciones (pero si no lo hago así el programa no funciona correctamente).
Esa sería mi única duda ahora mismo.
Un saludo y gracias por todo de nuevo.
Páginas: 1 2 3 4 [5] 6 7 8 9
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines