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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


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


Desconectado Desconectado

Mensajes: 1.309


Galletaaa!!!


Ver Perfil WWW
Error al crear punteros a estructuras.
« en: 5 Marzo 2015, 15:53 pm »

Buenas. Pretendo recordar más o menos cómo se trabaja en C, pero llevo tiempo sin tocarlo.
He hecho una estructura de un LinkedArray de una vieja práctica que tenía por ahí, pero la función crear creo que la tengo mal.
Ésta función tendría que crear el LinkedArray con todos los elementos con valor 0, tamaño tam (todos el mismo) y puntero al siguiente.
Pues si creo uno y justo después lo muestro me pone tal que así:
{0, 1966492712, 1966492712, 1966492712, 1966492712}

Tiene pinta de que el primero me lo hace bien, pero cuando entra al for usa punteros a la misma zona de memoria, pero esa parte la estoy haciendo sin punteros, por lo que no entiendo qué ocurre.
Espero me ayudeis.

Os paso el .h:
Código
  1. /*
  2.  * File:   main.h
  3.  * Author: NikNitro
  4.  *
  5.  * Created on 3 de marzo de 2015, 19:38
  6.  */
  7.  
  8. #ifndef MAIN_H
  9. #define MAIN_H
  10.  
  11. typedef struct Array* Primero;
  12. struct Array {
  13.    int valor;
  14.    int tam;
  15.    Primero* sig;
  16. };
  17.  
  18. void Crear(Primero* primero, int n);
  19. void Destruir(Primero* primero);
  20. void Obtener(Primero primero, int index, int *ok, int *valor);
  21. void Cambiar(Primero* primero, int index, int valor);
  22. void Mostrar(Primero primero);
  23.  
  24.  
  25. #endif /* MAIN_H */
  26.  
  27.  
  28.  

Y el .c

Código
  1. /*
  2.  * File:   main.c
  3.  * Author: NikNitro
  4.  *
  5.  * Created on 3 de marzo de 2015, 19:37
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include "main.h"
  11.  
  12. /*
  13.  *
  14.  */
  15.  
  16. void Crear(Primero* primero, int n) {
  17.     *primero = (Primero)malloc(sizeof(struct Array));
  18.     (*primero)->tam = n;
  19.     (*primero)->valor = 0;
  20.     (*primero)->sig = NULL;
  21.     Primero *ant = primero;
  22.     int i;
  23.     for(i=1; i<n; i++) {
  24.         Primero nuevo;
  25. //         (*nuevo) = (Primero)malloc(sizeof(struct Array));
  26.         nuevo->valor=0;
  27.         nuevo->tam = (*primero)->tam;
  28.         nuevo->sig = NULL;
  29.         (*ant)->sig = &nuevo;
  30.         ant = (*ant)->sig;
  31.     }
  32.  
  33. }
  34. void Destruir(Primero* primero) {
  35.    Primero ptr;
  36.    while (*primero != NULL) {
  37.        ptr=*(*primero)->sig;
  38.        free((void *)*primero);
  39.        *primero=ptr;
  40.    }
  41. }
  42. void Obtener(Primero primero, int index, int *ok, int *valor) {
  43.  
  44.    if((*valor)<primero->tam) {
  45.    int i;
  46.    Primero aux = primero;
  47.    for(i = 0; i < index; i++) {
  48.        aux = *(aux->sig);
  49.    }
  50.    (*valor)=aux->valor;
  51.    (*ok) = 1;
  52.    } else {
  53.        (*ok) = 0;
  54.    }
  55. }
  56. void Cambiar(Primero* primero, int index, int valor) {
  57.    int i;
  58.    Primero *aux = primero;
  59.    for(i = 0; i < valor; i++) {
  60.        aux = (*aux)->sig;
  61.        printf("%d\n", (*aux)->valor);
  62.        fflush(stdout);
  63.    }
  64.    (*aux)->valor = valor;
  65.  
  66. }
  67. void Mostrar(Primero primero) {
  68.    int ultimo = primero->tam;
  69.    int i;
  70.    printf("{");
  71.    for(i=0; i < ultimo-1; i++) {
  72.        printf("%d, ", primero->valor);
  73.    fflush(stdout);
  74.        primero = *(primero->sig);
  75.    }
  76.    printf("%d}", primero->valor);
  77.    fflush(stdout);
  78. }
  79.  
  80. int main() {
  81.    printf("Vamos a crear un array\n");
  82.    fflush(stdout);
  83.    Primero p;
  84.    Crear(&p, 5);
  85. //   int ok;
  86. //   int valor;
  87. //    Obtener(p, 3, &ok, &valor);
  88. //    printf("%d", valor);
  89. //   fflush(stdout);
  90. //    Cambiar(&p, 2, 1);
  91.    Mostrar(p);
  92.    return (EXIT_SUCCESS);
  93. }
  94.  
  95.  
  96.  

Gracias por adelantado gente.

Saludos ;)


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Error al crear punteros a estructuras.
« Respuesta #1 en: 5 Marzo 2015, 16:55 pm »

Código
  1. //         (*nuevo) = (Primero)malloc(sizeof(struct Array));

Debería ser

Código
  1.         nuevo = (Primero)malloc(sizeof(struct Array));

Si tienes esa línea comentada no se va a reservar memoria para los elementos que siguen al primero y eso solo puede resultar desastroso para tu programa.

Por otro lado, "Primero" no parece un nombre demasiado apropiado para un alias de "puntero a estructura".

Código complicado sin necesidad:

Código
  1. struct Array {
  2.   int valor;
  3.   int tam;
  4.   Primero* sig;
  5. };

"Primero", como hemos dicho, es un puntero. Dado que no es necesario que "sig" sea un puntero doble, se puede dejar únicamente como "Primero sig". Lo de "Primero" lo voy a respestar, aunque insisto que no es un nombre del que debas estar orgulloso :)

Código
  1. Primero *ant = primero;
  2.    int i;
  3.    for(i=1; i<n; i++) {
  4.        Primero nuevo;
  5.         (*nuevo) = (Primero)malloc(sizeof(struct Array));
  6.        nuevo->valor=0;
  7.        nuevo->tam = (*primero)->tam;
  8.        nuevo->sig = NULL;
  9.        (*ant)->sig = &nuevo;
  10.        ant = (*ant)->sig;
  11.    }

Otro puntero doble "ant" innecesario. Si le quitamos ese doble puntero el código queda más legible:

Código
  1. Primero ant = *primero;
  2.    int i;
  3.    for(i=1; i<n; i++) {
  4.        Primero nuevo = (Primero)malloc(sizeof(struct Array));
  5.        nuevo->valor=0;
  6.        nuevo->tam = (*primero)->tam;
  7.        nuevo->sig = NULL;
  8.        ant->sig = nuevo;
  9.        ant = ant->sig; // o ant = nuevo, como prefieras
  10.    }



En línea

NikNitro!


Desconectado Desconectado

Mensajes: 1.309


Galletaaa!!!


Ver Perfil WWW
Re: Error al crear punteros a estructuras.
« Respuesta #2 en: 5 Marzo 2015, 17:11 pm »

Muchas gracias eferion :)
Ya va todo perfecto :)

Lo de "Primero" era el nombre que venía en la práctica xD
Lo de los punteros a punteros si ha sido cosa mia que me lié.

Saludos y gracias de nuevo;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Estructuras y punteros a funciones
Programación C/C++
Amadeo Magnus 1 6,297 Último mensaje 13 Octubre 2010, 15:05 pm
por Karman
estructuras punteros programacion c
Programación C/C++
adexrn 4 3,818 Último mensaje 9 Abril 2012, 10:10 am
por adexrn
Estructuras anidadas, funciones y punteros
Programación C/C++
NathanD 9 10,821 Último mensaje 18 Marzo 2013, 08:56 am
por 85
Punteros a estructuras...???
Programación C/C++
Ja_90 4 2,655 Último mensaje 11 Noviembre 2014, 21:10 pm
por eferion
Estructuras con Punteros
Programación C/C++
jgonzalezo 1 1,841 Último mensaje 13 Abril 2015, 09:02 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines