Uso de un valor no inicializado de tamaño 8

Resuelto
rosate999 Mensajes publicados 5 Estado Miembro -  
fiddy Mensajes publicados 441 Fecha de registro   Estado Colaborador Última intervención   -
Hola,
Aquí está mi código, ¡no sé por qué da un error de segmentación!

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int i;
int j;
double c;
}punto;
typedef struct {
punto *a;
}tabla_t;

int myfunc( char *archivo){
int i, i1,i2, ind1, ind2;
double c,val;
double calcul;
punto **a;
FILE *matrizDistancia;
matrizDistancia = fopen("archivo.txt", "r");

for(i=0;i<6;i++) {
fscanf(matrizDistancia,"%d %d %lf", &i1,&i2, &val);
((*a)[i]).i=i1;
((*a)[i]).j=i2;
((*a)[i]).c=val;
printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);

}
tabla_t *tabla;
calcul=0;
a=tabla->a;
for(i=0;i<6;i++){
ind1=a[i]->i;
ind2=a[i]->j;
c=a[i]->c;
calcul=calcul+(*a)[i].c;

}
printf("%lf", calcul);
}

int main(int argc,char **argv){
char *matrizDistancia, tab;
tab=myfunc(matrizDistancia);
return 0;
}

el error de segmentación es el siguiente: Uso de un valor no inicializado de tamaño 8

espero que alguien pueda ayudarme.
Gracias de antemano

rosate999

3 respuestas

  1. ElementW Mensajes publicados 5690 Estado Colaborador 1 293
     
    Hola, por cierto: utiliza la etiqueta
    <code>
    para poner código en tus mensajes, así se mantiene la indentación y además tienes colores.

    Para empezar, el primer error que veo es que intentas acceder a un elemento de
    a
    sin haber asignado memoria, así que
    a
    es un puntero vacío, por lo tanto, es un fallo asegurado.
    Sabido que tu bucle trata un máximo de 6 líneas, hay que asignar 6 punteros de puntos:
    ... matrizDistancia = fopen("fichero.txt", "r"); a = calloc(sizeof(point *), 6); ...
    Ahora
    a
    podrá recibir 6 punteros de la estructura
    point
    .

    En segundo lugar, tu forma de acceder a los elementos de tu struct en el array es más que extraña, especialmente porque más abajo accedes correctamente:
    ((*a)[i]).i=i1; // WTF o_O? /* Se convierte en */ a[i]->i=i1; // Aquí está limpio
    Pero una vez más accedes a un puntero
    NULL
    , necesitas asignar memoria para tu punto:
    ... fscanf(matrizDistancia,"%d %d %lf", &i1,&i2, &val); a[i] = malloc(sizeof(point)); ...


    El último inconveniente es que no veo para qué sirve tu
    tabla_t *tabla;
    ya que no la usas, y haces esto
    a=tabla->a;
    y no está bien: vas a perder tu tabla de puntos, además de no liberar la memoria... Así que he comentado las 2 líneas citadas, y funciona.
    --
    from human import idiocy
    del idiocy
    2
    1. fiddy Mensajes publicados 441 Fecha de registro   Estado Colaborador Última intervención   1 847
       
      La asignación de "a" no es correcta en relación con su código. Es al revés ;-).
      0
  2. fiddy Mensajes publicados 441 Fecha de registro   Estado Colaborador Última intervención   1 847
     
    Hola,

    Además de los comentarios de gravgun,

    punto **a;
    a es un doble puntero. Según cómo lo uses, debes hacer:
     a=malloc(sizeof(point *)); *a=malloc(6*sizeof(point)); 

    O declarar "a" como puntero *a;
    Y no olvides los free() que corresponden.

    printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);
    printf("%lf", calcul);
    Mejor %f (y no %lf).
    Y finalmente, no olvides poner un '\n' en el último printf() para forzar la visualización, o bien fflush(stdout); antes del return 0; del main.

    Google es tu amigo.
    0
    1. ElementW Mensajes publicados 5690 Estado Colaborador 1 293
       
      'lut fiddy, en realidad mi enfoque es diferente al tuyo: tú haces de
      a
      un puntero a otro puntero único de una zona de memoria contigua de 6
      puntos
      , yo era un puntero a un array de diferentes punteros de
      puntos
      (distribución no contigua, por lo tanto), lo que hace que haya cambiado su forma de acceder al array; pero es cierto que después de observar,
      ((*a)[i]).i
      funciona con tu código.
      Para lo demás, bien visto ;)
      0
    2. fiddy Mensajes publicados 441 Fecha de registro   Estado Colaborador Última intervención   1 847
       
      Lo siento, no había visto que también habías cambiado su forma de acceder a la tabla.
      0
  3. rosate999 Mensajes publicados 5 Estado Miembro
     
    Gracias por sus respuestas.
    0