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]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error!  (Leído 1,901 veces)
rodrigo_103

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Error!
« en: 7 Noviembre 2012, 22:41 pm »

Hola, ¿como les va?
estoy haciendo un programa para copiar una lista simplemente enlazada y imprimirla, la cuestion es que me tira 2 errores que deben ser sencillos, pero no logro resolverlos..

Agradeceria mucho su ayuda.

Citar
listas.c|62|error: expected '=', ',', ';', 'asm' or '__attribute__' before 's_copy'|
listas.c||In function 'main':|
listas.c|105|warning: assignment makes pointer from integer without a cast|
||=== Build finished: 1 errors, 1 warnings ===|


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct registro
  5. {
  6.    int valor;
  7.    struct registro *sig;
  8. };
  9.  
  10. typedef struct registro _nodo;
  11.  
  12. _nodo *crearlista(_nodo *apuntador)
  13. {
  14.    return (apuntador=NULL);
  15. }
  16.  
  17. _nodo *insertarEnLista(int numero, _nodo *apuntador )
  18. {
  19.    _nodo *registroNuevo, *apuntadorAuxiliar;
  20.  
  21.    registroNuevo = (_nodo*)/*casteo*/ malloc(sizeof(_nodo));
  22.  
  23.    if(registroNuevo!=NULL)
  24.    {/*lleno el nuevo nodo suelto*/
  25.        registroNuevo->valor=numero;
  26.        registroNuevo->sig=NULL;
  27.  
  28.        if(apuntador==NULL)
  29.            apuntador=registroNuevo;
  30.        else
  31.        {
  32.            apuntadorAuxiliar = apuntador;
  33.  
  34.            while(apuntadorAuxiliar->sig != NULL)
  35.                apuntadorAuxiliar = apuntadorAuxiliar->sig;
  36.  
  37.            apuntadorAuxiliar->sig = registroNuevo;
  38.        }
  39.    }
  40.  
  41.    return apuntador;
  42. }
  43.  
  44. void imprimirLista(_nodo *apuntador)
  45. {
  46.    _nodo *apuntadorAuxiliar;
  47.  
  48.    apuntadorAuxiliar=apuntador;
  49.  
  50.    printf("Contenido de la lista: inicioLista->");
  51.  
  52.    while(apuntadorAuxiliar != NULL)
  53.    {
  54.        printf("%d -> ", apuntadorAuxiliar->valor);
  55.        apuntadorAuxiliar = apuntadorAuxiliar->sig;
  56.    }
  57.    printf("NULL\n");
  58.  
  59.    return;
  60. }
  61.  
  62. _nodo *apuntador2 s_copy(_nodo *apuntador)
  63. {
  64.    _nodo *registroAuxiliar, _nodo *apuntador2 , *apuntadorAuxiliar , *apuntadorAuxiliar2;
  65.    apuntador2*=crearlista(*apuntador2);
  66.  
  67.  
  68.      if(apuntador==NULL)
  69.            printf("la lista que copio estaba vacia");
  70.            apuntador2=apuntador;
  71.  
  72.      else
  73.        {
  74.            apuntadorAuxiliar = apuntador;
  75.            apuntadorAuxiliar2 = apuntador2;
  76.  
  77.            while(apuntadorAuxiliar->sig != NULL)
  78.                {
  79.                    *apuntadorAuxiliar2=*apuntadorAuxiliar;
  80.  
  81.                    apuntadorAuxiliar2=apuntadorAuxiliar2->sig;
  82.                    apuntadorAuxiliar = apuntadorAuxiliar->sig;
  83.                }
  84.        }
  85.  
  86.        return apuntador2;
  87. }
  88.  
  89.  
  90. int main()
  91. {
  92.    _nodo *inicioLista;
  93.    _nodo *inicioLista2;
  94.  
  95.    inicioLista=crearlista(inicioLista);
  96.    inicioLista2=crearlista(inicioLista2);
  97.  
  98.  
  99.    inicioLista = insertarEnLista(5, inicioLista);
  100.    inicioLista = insertarEnLista(6, inicioLista);
  101.    inicioLista = insertarEnLista(7, inicioLista);
  102.    inicioLista = insertarEnLista(8, inicioLista);
  103.    inicioLista = insertarEnLista(9, inicioLista);
  104.  
  105.    inicioLista2 = s_copy(inicioLista);
  106.  
  107.    imprimirLista(inicioLista2);
  108.  
  109.  
  110.  
  111.    return EXIT_SUCCESS;
  112. }
  113.  
  114.  


En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Error!
« Respuesta #1 en: 7 Noviembre 2012, 23:02 pm »

_nodo *apuntador2 s_copy(_nodo *apuntador) {...}

Fíjate que tratas de devolver el tipo "_nodo * apuntador2" y eso no es ningún tipo. El tipo es _nodo *

De todas formas yo crearía el tipo tPosL (_nodo *) y el tipo tLista (tPosL) para que se lea mucho más claro.

Aquí te dejo el código corregidos los errores de sintaxis pero da segmentation fault, así que revisa la memoria:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct registro
  5. {
  6.    int valor;
  7.    struct registro *sig;
  8. };
  9.  
  10. typedef struct registro _nodo;
  11.  
  12. _nodo *crearlista(_nodo *apuntador)
  13. {
  14.    return (apuntador=NULL);
  15. }
  16.  
  17. _nodo *insertarEnLista(int numero, _nodo *apuntador )
  18. {
  19.    _nodo *registroNuevo, *apuntadorAuxiliar;
  20.  
  21.    registroNuevo = (_nodo*)/*casteo*/ malloc(sizeof(_nodo));
  22.  
  23.    if(registroNuevo!=NULL)
  24.    {/*lleno el nuevo nodo suelto*/
  25.        registroNuevo->valor=numero;
  26.        registroNuevo->sig=NULL;
  27.  
  28.        if(apuntador==NULL)
  29.            apuntador=registroNuevo;
  30.        else
  31.        {
  32.            apuntadorAuxiliar = apuntador;
  33.  
  34.            while(apuntadorAuxiliar->sig != NULL)
  35.                apuntadorAuxiliar = apuntadorAuxiliar->sig;
  36.  
  37.            apuntadorAuxiliar->sig = registroNuevo;
  38.        }
  39.    }
  40.  
  41.    return apuntador;
  42. }
  43.  
  44. void imprimirLista(_nodo *apuntador)
  45. {
  46.    _nodo *apuntadorAuxiliar;
  47.  
  48.    apuntadorAuxiliar=apuntador;
  49.  
  50.    printf("Contenido de la lista: inicioLista->");
  51.  
  52.    while(apuntadorAuxiliar != NULL)
  53.    {
  54.        printf("%d -> ", apuntadorAuxiliar->valor);
  55.        apuntadorAuxiliar = apuntadorAuxiliar->sig;
  56.    }
  57.    printf("NULL\n");
  58.  
  59.    return;
  60. }
  61.  
  62. _nodo * s_copy(_nodo *apuntador)
  63. {
  64.    _nodo *registroAuxiliar, *apuntador2 , *apuntadorAuxiliar , *apuntadorAuxiliar2;
  65.    apuntador2=crearlista(apuntador2);
  66.  
  67.  
  68.      if(apuntador==NULL) {
  69.            printf("la lista que copio estaba vacia");
  70.            apuntador2=apuntador;
  71.      }
  72.  
  73.      else
  74.        {
  75.            apuntadorAuxiliar = apuntador;
  76.            apuntadorAuxiliar2 = apuntador2;
  77.  
  78.            while(apuntadorAuxiliar->sig != NULL)
  79.                {
  80.                    *apuntadorAuxiliar2=*apuntadorAuxiliar;
  81.  
  82.                    apuntadorAuxiliar2=apuntadorAuxiliar2->sig;
  83.                    apuntadorAuxiliar = apuntadorAuxiliar->sig;
  84.                }
  85.        }
  86.  
  87.        return apuntador2;
  88. }
  89.  
  90.  
  91. int main()
  92. {
  93.    _nodo *inicioLista;
  94.    _nodo *inicioLista2;
  95.  
  96.    inicioLista=crearlista(inicioLista);
  97.    inicioLista2=crearlista(inicioLista2);
  98.  
  99.  
  100.    inicioLista = insertarEnLista(5, inicioLista);
  101.    inicioLista = insertarEnLista(6, inicioLista);
  102.    inicioLista = insertarEnLista(7, inicioLista);
  103.    inicioLista = insertarEnLista(8, inicioLista);
  104.    inicioLista = insertarEnLista(9, inicioLista);
  105.  
  106.    inicioLista2 = s_copy(inicioLista);
  107.  
  108.    imprimirLista(inicioLista2);
  109.  
  110.  
  111.  
  112.    return EXIT_SUCCESS;
  113. }
  114.  


En línea

Puede que desees aprender a programar desde 0: www.espascal.es
rodrigo_103

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Error!
« Respuesta #2 en: 8 Noviembre 2012, 00:11 am »

muchas gracias amigo, ya no me da mas ese problema, ahora solo obtengo la violacion de segmento de la que hablabas, en cuanto la solucione subo el codigo final, por si alguien lo precisa en el futuro. un saludo.
En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Error!
« Respuesta #3 en: 8 Noviembre 2012, 01:21 am »

Debo decir que la inserción de un elemento de la lista debería devolver un tipo booleano (int), no un puntero a un nodo.

En pseudocódigo sería (depende del tipo de lista y la inserción):

Código:
función insertar(lista, elemento, [posición]) -> lista, boolean

[posición], entre corchetes porque es opcional.

Siendo lista el puntero que apunta al primer nodo de la lista (en una lista simplemente enlazada)

Siendo elemento el elemento albergado en cada nodo de la lista

La función devuelve la lista modificada (si fue posible) y un valor booleano(int) para saber si se pudo realizar la inserción

Nota*: No podemos insertar un nuevo elemento cuando no hay memoria disponible.

Código:
Si ( punteroANuevoNodo = NULO) entonces Error de memoria - No se puede insertar
En línea

Puede que desees aprender a programar desde 0: www.espascal.es
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Error!
« Respuesta #4 en: 8 Noviembre 2012, 15:58 pm »

¡Buenas!

Código
  1. _nodo *insertarEnLista(int numero, _nodo *apuntador )
  2.  

No puedes modificar un puntero exterior si no tienes un doble puntero. Si cuando llamas a la funcion el puntero que usas en la llamada tiene el valor NULL, copiaras dicho valor en el parametro que utiliza la funcion internamente, pero anque cambies la direccion a la que apunta el puntero interno de la funcion, no estaras cambiando el externo, por lo tanto seguira siendo NULL cuando salga de la funcion:

Código
  1. #include <stdio.h>
  2.  
  3. void puntero(int *ptr)
  4. {
  5.    int d;
  6.  
  7.    ptr = &d;
  8. }
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.    int *ptr = NULL;
  13.  
  14.    puntero(ptr);
  15.  
  16.    printf("%p\n",ptr);
  17.  
  18.    return 0;
  19. }
  20.  

Si quieres cambiar el puntero tendras que mandar un puntero al puntero:

Código
  1. #include <stdio.h>
  2.  
  3. void puntero(int **ptr)
  4. {
  5.    int d;
  6.  
  7.    //accedemos al puntero exterior para poder modificarlo
  8.    (*ptr) = &d;
  9. }
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.    int *ptr = NULL;
  14.  
  15.    puntero(&ptr);
  16.  
  17.    printf("%p\n",ptr);
  18.  
  19.    return 0;
  20. }
  21.  

Por lo tanto el prototipo de tu nueva funcion es:
Código
  1. _nodo *insertarEnLista(int numero, _nodo **apuntador )
  2.  
Y tendras que modificar el resto del codigo para que funcione de forma correcta.

Y con esta funcion no se que quieres hacer, pero realmente no esta haciendo nada efectivo.
Código
  1.  
  2.  
  3. _nodo * s_copy(_nodo *apuntador)
  4. {
  5.    _nodo *registroAuxiliar, *apuntador2 , *apuntadorAuxiliar , *apuntadorAuxiliar2;
  6.    apuntador2=crearlista(apuntador2);
  7.  
  8.  
  9.      if(apuntador==NULL) {
  10.            printf("la lista que copio estaba vacia");
  11.            apuntador2=apuntador;
  12.      }
  13.  
  14.      else
  15.        {
  16.            apuntadorAuxiliar = apuntador;
  17.            apuntadorAuxiliar2 = apuntador2;
  18.  
  19.            while(apuntadorAuxiliar->sig != NULL)
  20.                {
  21.                    *apuntadorAuxiliar2=*apuntadorAuxiliar;
  22.  
  23.                    apuntadorAuxiliar2=apuntadorAuxiliar2->sig;
  24.                    apuntadorAuxiliar = apuntadorAuxiliar->sig;
  25.                }
  26.        }
  27.  
  28.        return apuntador2;
  29. }
  30.  

Si nos cuentas cual es tu intencion con esta funcion te podremos ayudar.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error!
« Respuesta #5 en: 8 Noviembre 2012, 17:17 pm »

Código
  1. _nodo *insertarEnLista(int numero, _nodo *apuntador )

No puedes modificar un puntero exterior si no tienes un doble puntero. Si cuando llamas a la funcion el puntero que usas en la llamada tiene el valor NULL, copiaras dicho valor en el parametro que utiliza la funcion internamente, pero anque cambies la direccion a la que apunta el puntero interno de la funcion, no estaras cambiando el externo, por lo tanto seguira siendo NULL cuando salga de la funcion
Correcto pero en esa función no es un error ya que el valor de retorno de la función es el puntero (actualizado) al primer nodo de la lista y mientras se realice la asignación:
Código
  1. inicioLista = insertarEnLista(5, inicioLista);
  2. inicioLista = insertarEnLista(6, inicioLista);
  3. inicioLista = insertarEnLista(7, inicioLista);
  4. inicioLista = insertarEnLista(8, inicioLista);
  5. inicioLista = insertarEnLista(9, inicioLista);
No habrá problemas.

El programa revienta debido a la cantidad de errores en la función "s_copy", para empezar no debe compilar (me refiero al programa original). Esa función es innecesariamente larga ya que se puede implementar utilizando su parámetro y la función "insertarEnLista", de esta forma:
Código
  1. _nodo *s_copy(_nodo *p)
  2. {
  3.   _nodo *copia = NULL;
  4.  
  5.   while (p != NULL){
  6.      copia = insertarEnLista(p->valor, copia);
  7.      p = p->sig;
  8.   }
  9.  
  10.   return copia;
  11. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Error!
« Respuesta #6 en: 8 Noviembre 2012, 17:22 pm »

Correcto pero en esa función no es un error ya que el valor de retorno de la función es el puntero (actualizado) al primer nodo de la lista y mientras se realice la asignación:
Código
  1. inicioLista = insertarEnLista(5, inicioLista);
  2. inicioLista = insertarEnLista(6, inicioLista);
  3. inicioLista = insertarEnLista(7, inicioLista);
  4. inicioLista = insertarEnLista(8, inicioLista);
  5. inicioLista = insertarEnLista(9, inicioLista);

Cierto. Estaba con el chip de usar el propio puntero a la raiz como parametro de entrada/salida y usar el valor de retorno para informar de posibles errores... :silbar:
« Última modificación: 8 Noviembre 2012, 17:26 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines