Segmentation Fault(Core dumped), C

LoRTH

Hola, estoy aqui programando, y buffff me da un Segmentation fault. Tamos con el tema punteros, y no encuentro por ninguna lado el error, debe ser una chorrada, lo supongo...

Me falla solo la primera funcion, el resto no. A ver si me podeis ayudar.

Este es el codigo:

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

typedef struct {
char *titol;
int platea;
int amfiteatre;
int galliner;
}Obra;

Obra * DemamaMemoriaIOmple(FILE *f, int *q){
Obra *T;
int num,i,entrades;
char zona,aux;
char nomo[50];

fscanf(f,"%d",q);
T=(Obra *)malloc(sizeof(Obra)*num);
fgets(nomo,50,f);
nomo[strlen(nomo)-1]='\0';
T[0].titol=(char *)malloc(sizeof(char)*strlen(nomo));
if(T[0].titol==NULL){
	printf("Error al demanar espai per al titol.");
}else{
	fscanf(f,"%d",&entrades);
	fscanf(f,"%c",&aux);
	fscanf(f,"%c",&zona);
	if(zona=='A'){
		T[0].amfiteatre=T[0].amfiteatre+entrades;
	}else{
		if(zona=='P'){
			T[0].platea=T[0].platea+entrades;
		}else{
			T[0].galliner=T[0].galliner+entrades;
		}
	}
	fgets(nomo,50,f);
	while(!feof(f)){
		nomo[strlen(nomo)-1]='\0';
		for(i=1;i<num;i++){	
			if(strcmp(T[i].titol,nomo)!=0){
				T[i].titol=(char *)malloc(sizeof(char)*strlen(nomo));
				strcpy(T[i].titol,nomo);
			}
		}
		fscanf(f,"%d",&entrades);
		fscanf(f,"%c",&aux);
		fscanf(f,"%c",&zona);
		if(zona=='A'){
			T[i].amfiteatre=T[i].amfiteatre+entrades;
		}else{
			if(zona=='P'){
				T[i].platea=T[i].platea+entrades;
			}else{
				T[i].galliner=T[i].galliner+entrades;
			}
		}
		fgets(nomo,50,f);
	}
}
    }

}

void ConsultaLocalitats(Obra *T, int q){
int i;
char noma[30];

    printf ("Nom de l'obra? ");
    gets (noma);
    for(i=0;i<q;i++){
            if (strcmp(noma,T[i].titol)==0){
                    printf("Reserves a Platea: %d\n",&T[i].platea);
                    printf("REserves a Amfiteatre: %d\n",&T[i].amfiteatre);
                    printf("Reserves a Galliner: %d\n",&T[i].galliner);
            }
    }

}

void AlliberaMemoria(Obra *T, int q){
int i;
for(i=0;i<q;i++){
free(T.titol);
}
free ;
T=NULL;
}


void main () {
Obra *T;
FILE *f;
int q;

f=fopen("servicaixa","r"); 
if (f==NULL) { 
	printf("Ni hi ha ServiCaixa!\n"); 
}else { 
	T=DemamaMemoriaIOmple(f,&q); 
	ConsultaLocalitats(T,q); 
	AlliberaMemoria(&T,q); 
	fclose(f); 
} 

}

GRACIAS

maRc

T=(Obra )malloc(sizeof(Obra)num);

"num" no lo has inicializado.

Y si pones el fichero servicaixa, a lo mejor podemos sacar más fallos ;)

LoRTH

Marca, canvie eso por, pero sigue fallando:
T=(Obra )malloc(sizeof(Obra)(*q));

El archivo es:

4
El mètode Grönholm
2 G
Mar i Cel
1 P
El mètode Grönholm
2 A
Sit
3 G
Mikado
1 P
Mikado
1 G
El mètode Grönholm
1 G
El mètode Grönholm
3 P
Mar i Cel
5 A
Mikado
1 A
El mètode Grönholm
1 P

Leemos nombre, y segun la letra, es la posicion de las entradas.

maRc

Los fscanf los puedes meter todos en uno solo, no copias el título de la obra en cada miembro del vector de estructuras, no inicializas los campos de las estructuras, cada vez que lees del scanf, se queda un caracter '\n' por ahí en medio, así que a la siguiente vez que lees con el fgets, solo lees este...

Usuarios habituales

  • maRc
  • LoRTH