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 -
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
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
-
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 dea
sin haber asignado memoria, así quea
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); ...Ahoraa
podrá recibir 6 punteros de la estructurapoint
.
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 punteroNULL
, 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 tutabla_t *tabla;
ya que no la usas, y haces estoa=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 -
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.-
'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 6puntos
, yo era un puntero a un array de diferentes punteros depuntos
(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 ;) -
-
-