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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 2 [3]
21  Informática / Software / Re: Cursos "Guias "Libros Y Manuales De Todo Tipo En Descarga Directa Aqui!!!! en: 7 Marzo 2012, 09:09 am
Impresionante aporte. Te felicito, es impresionante que tu post ya lleve 102 paginas. La verdad que de muchísima ayuda. Gracias y saludos.
22  Programación / Programación C/C++ / Re: ayuda con lista doblemente enlazada en: 7 Marzo 2012, 07:47 am
No hay problema, espero yo, no haberte atormentado. A todos nos pasan esos errores bobos cuando empezamos, cuando estamos a la mitad y cuando terminamos, por despitaos, jeje. Saludos.
23  Programación / Programación C/C++ / Re: ayuda con lista doblemente enlazada en: 7 Marzo 2012, 07:29 am
gibi77 me puse a revisar tu código. Y tengo un par de sugerencias, y una para arreglar tu error de ejecución.
Las sugerencias:

La primera:
Cuando defines e implementas la función LeeValor(int) lo haces asi
Código
  1. char LeeValor(int)
  2. //(LA IMPLEMENTACION)
  3. char CLDL::LeeValor(int que){
  4.   char Valor[30];
  5.   printf("Escriba el valor a %s \n",que?"Eliminar":"Dar de alta");
  6.   scanf("%s",Valor);
  7.   return Valor[30];
  8.  
  9. }
  10.  
¿Porque char LeeValor(int)? deberia ser char* LeerValor(int) al igual que en la implementación, ya que lo que supuse que tu querías devolver era una cadena de caracteres no un solo caracter.

Segunda sugerencia:
Siempre que uses scanf utiliza fflush para asegurarte que el buffer de entrada se limpie.

Tercera sugerencia:
Código
  1. return Valor[30];
  2.  
Estarías devolviendo el caracter en la posición 30. Deberias hacerlo asi
Código
  1. return Valor;
  2.  
Aunque igual este erroneo porque estas pasando un puntero de una variable que se va destruir en seguida termine. Sabiendo que utilizas C++ usa string de la STL para no complicarte con los punteros, aunque igual se puede con chars.

Cuarta sugerencia:
Nunca te olvides de inicializar todos los miembros privados de tus clases, aunque a veces de igual, otras es crucial. Asi que mejor siempre hacerlo a menos que el lenguaje te lo haga por ti pero este no es el caso, con los punteros, por ejemplo, si no le pones un constructor a NodoLDL (la unica función que se le puede poner a los constructores, si mal no recuerdo) para que SIG y ANT marquen NULL al igual que Ini y Act (que se que los pusiste como NULL o 0 que es lo mismo).Eso te sirve ademas para comprobar si hay siguiente, si hay anterior, ya que si no tienen NULL no se sabe.

Quita sugerencia:
Para la funcion AltaLDL que tambien le pusiste como argumento char debiendo ser char*
Nunca compies una cadena a sangre fria así. Jeje
Código
  1. NVO->Renglon[30]=Valor;
  2.  
Si quisieras copiar un caracter eso esta bien, pero no es lo que supongo que querías ya que la estructura NodoLDL tiene a renglon como cadena no como caracter. Yo lo haria así. Dime si me equivoco.
Código
  1. strcpy(NVO->Renglon,Valor)
  2.  

Sexta sugerencia:
En la misma función AltaLDL
Código
  1. NodoLDL*NVO= new NodoLDL;
  2. if(!NVO)return;
  3. NVO->Renglon[30]=Valor;
  4. NVO->SIG=Act->SIG;
  5. NVO->ANT=Act;
  6. Act->SIG->ANT=NVO;
  7. Act->SIG=NVO;
  8. Act=NVO;
  9.  
Salta el error en ejecucion ahi porque estas intentando modificar el contenido de una porcion de la memoria que no tiene nada asignado. Estoy hablando de Act cuando recien ejecutas el programa Act tiene NULL y no tiene una estructura NodoLDL asignada ni nada. Por eso es que cuando haces Act->SIG finaliza, porque no tiene la estructura en esa porcion de memoria para referirse ni a un SIG ni a un ANT. Y despues hay un par de errores como no fijarte justamente eso, si la lista esta vacía, si esta vacía tienes que proceder de otra forma para insertar un nodo. Bueno en fin te pongo como yo lo escribi.
Código
  1. void CLDL::AltaLDL(char Valor[30]) {
  2.    NodoLDL*NVO=new NoodoLDL;
  3.    ///ACA TENDRIAS QUE EN REALIDAD MANDAR UN MENSAJE DE ERROR PERO COMO DIJISTE QUE NO LO TERMINASTE, NO HAY PROB
  4.    if(!NVO) return;
  5.    strcpy(NVO->Renglon,Valor);
  6.    //esto,nada para volver al primer nodo
  7.    if(Act) while(Act->ANT) Act = Act->ANT;
  8.    //Lo que te decia, fijate si existe el primer nodo
  9.    if(!Act) {
  10.        NVO->ANT = NULL;
  11.        NVO->SIG = Act;
  12.        Act = NVO;
  13.   } else {
  14.        NVO->SIG = Act->SIG;
  15.        Act->SIG=NVO;
  16.        NVO->ANT=Act;
  17.        Act = NVO;
  18.        if(NVO->SIG) NVO->SIG->ANT = NVO;
  19.   }
  20. }
  21.  
Lo podrías escribir mejor pero yo lo hice así no más, en cuanto a la ejecucion me fije si no se interrumpia y no se interrumpio, pero en cuanto al funcionamiento no me fije mucho. Ah, y me olvide algo te conviene que cuando rebobinas el puntero actual
trabajes con una copia para devolverlo a su lugar luego.

Espero haberte ayudado, disculpá si mi comentario fue muy largo, es que cuando tengo sueño redundo, jeje. Siento si me fije en todo,  :-X soy muy obsesivo. Debería irme a dormir. Bueno, en fin saludos.
Páginas: 1 2 [3]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines