segmentation fault ?! LOL!!!

0

cos jest chyba nie tak z funkcja load :/ ale nie wiem co, program kompiluje sie pod gcc(cygwin) jest w main odhashowana jest linia printf("case s\n"); // WTF !??!?!?!?!?! ;D;D

} else if
			(strcmp(argv[i],"-s")==0) {
			printf("case s\n"); //   WTF !??!?!?!?!?!
			datahold=load("pl");		
			show("pl",datahold);

jesli jej nie ma to program rowniez sie kompiluje ale przy uruchomieniu z opcja -s wywala segmentation fault
po prostu kosmos ...
ktos moze ma jakis pomysl co jest nie tak ?

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

typedef struct data_ {
	char* word;
	int tcount;
	char lan[3];
	char** trans;
	struct data_* next;
	struct data_* prev;
} data;

//wksaz=malloc(n*sizeof(plpoint*))
//void del(data** datahold);
data* load(const char* lan);
int save(const char* lan, data* datahold);
int add(const char* lan, const char* wo, const char* tr, data** datahold);
int show(const char* lan, const data* datahold);

int main(int argc, char* argv[]) {
	//char test[] = {'c','o'};
	//printf("%d \n",sizeof(test));
	data* datahold = NULL;
	int i;
	char c;

	if (argc == 1) {
		printf("Dict Usage:\n\n"); 
		printf("dict [options] [word] [translation] \n\n");
		printf("-pl translation into polish\n");
		printf("-en translation into English\n");
		printf("-a adds entries\n");
		printf("-r removes entries\n");
		printf("-s views statistics\n");
		printf("-u magical option for online update, requires internet connection");
	} else {
	
	for (i=1;i<argc;i++) {
		if (strcmp(argv[i],"-a")==0) {
			if ((strcmp(argv[i-1],"-pl")==0)||(strcmp(argv[i+1],"-pl")==0)) {
				printf("add PL:%s -> EN:%s to dictionary database? y/n\n",argv[3],argv[4]);
				//printf("%s,%s\n",argv[i+2],argv[i+3]);
				scanf("%s",&c);
				if ((c=='y')||(c=='Y')) {
					add("pl",argv[3],argv[4],&datahold);
					save("pl",datahold);
					//del(&datahold);
				}
				break;
			}
			if ((strcmp(argv[i-1],"-en")==0)||(strcmp(argv[i+1],"-en")==0)) {
				printf("add EN:%s -> PL:%s to dictionary database? y/n\n",argv[3],argv[4]);
				scanf("%s",&c);
				if ((c=='y')||(c=='Y')) {
					add("en",argv[3],argv[4],&datahold);
					save("en",datahold);
				}
				break;
			}
			// printf("case a\n");
			// add("pl","cos","something",&datahold);
		} else if
			(strcmp(argv[i],"-s")==0) {
			printf("case s\n"); //   WTF !??!?!?!?!?!
			datahold=load("pl");		
			show("pl",datahold);
			//del(&datahold);
			//show("pl",datahold);
		} else if 
			(strcmp(argv[i],"-r")==0) {
			if ((strcmp(argv[i-1],"-pl")==0)||(strcmp(argv[i+1],"-pl")==0)) {
				printf("rem pl\n");
				break;
			}
			if ((strcmp(argv[i-1],"-en")==0)||(strcmp(argv[i+1],"-en")==0)) {
				printf("rem en\n");
				break;
			}
			printf("case r remove entries\n");
		} else if 
			(strcmp(argv[i],"-u")==0) {
			printf("case u do magic\n");
		} else if 
			(strcmp(argv[i],"-pl")==0) {
			printf("trans into pl\n");
		} else if 
			(strcmp(argv[i],"-en")==0) {
			printf("trans into en\n");
		}
	}
	}

	return 0;
}
//void del(data** datahold) {
//	data* tmp;
//	for (;*datahold!=NULL;*datahold=tmp) {
//		tmp=*datahold->next;
//		free(*datahold);
//	}
//	return;
//}

data* load(const char* lan) {
	data* tmp;
	data* datahold;
	FILE* storage;
	char tmp_fname[7]; 
	char *tmpc;
	int tcount,i=0;
	
	sprintf(tmp_fname, "%s.dat", lan); 
	storage = fopen(tmp_fname,"r");
	datahold = NULL;
	tmp = NULL;

	while(feof(storage)!=1) {
		fgets(tmpc,255,storage);
			tmpc[strlen(tmpc)-1]='\0';
		
		if (strcmp(tmpc,"+")==0) {			
			fgets(tmpc,255,storage);
			tmpc[strlen(tmpc)-1]='\0';
			tmp=(data*)malloc(sizeof(data));	
			tmp->word=(char*)malloc(strlen(tmpc)+1);
			strcpy(tmp->word,tmpc);
			fgets(tmpc,255,storage);
			tmpc[strlen(tmpc)-1]='\0';
			tcount=atoi(tmpc);						
			strcpy(tmp->lan,lan);
			tmp->trans=(char**)malloc(tcount*sizeof(char*));	
			
			for (i;i<=tcount;i++) {
				fgets(tmpc,255,storage);
					tmpc[strlen(tmpc)-1]='\0';
				tmp->trans[i]=(char*)malloc(strlen(tmpc)+1);
				strcpy(tmp->trans[i],tmpc);
			}
			i=0;			
			tmp->prev=datahold;		
			datahold=tmp;
		}
	}
				
	fclose(storage);
	return datahold;
}


int save(const char* lan, data* datahold) {
	FILE* storage;
	char fd,tmp_fname[7]; 
	int i=0;
	sprintf(tmp_fname, "%s.dat", lan); 
	
	if (fopen(tmp_fname,"r")!=NULL){
		printf("apending\n");
		storage = fopen(tmp_fname,"a+");
	} else {
		printf("creating new one\n");
		storage = fopen(tmp_fname,"w");
	}
	while (datahold != NULL) {
	//	fwrite(datahold,1,sizeof(data),storage);
		fprintf(storage,"+\n",datahold->word);
		fprintf(storage,"%s\n",datahold->word);
	//	fprintf(storage,"=\n",datahold->word);
		fprintf(storage,"%d\n",datahold->tcount);
	//	printf("%d\n",datahold->tcount);
//		fputs("+",storage);
//		fputs(datahold->word,storage);
//		fputs("=",storage);
//		fd=(char)datahold->tcount;
//		fputs(fd,storage);
		for (i;i<=datahold->tcount;i++){
			printf("zapisuje translacje\n");
		//	if (i<datahold->tcount) 
				fprintf(storage,"%s\n",datahold->trans[i]);
		//	else 
		//		fprintf(storage,"%s",datahold->trans[i]);
		//	fputs(datahold->trans[i],storage);
		}
		//fprintf(storage,"\n");
		datahold=datahold->prev;
	}
	
}

int add(const char* lan, const char* wo, const char* tr, data** datahold) {
	data* tmp;	
	int tcount=1;
	
	tmp=(data*)malloc(sizeof(data));
	tmp->word=(char*)malloc(strlen(wo)+1);
	strcpy(tmp->word,wo);
	strcpy(tmp->lan,lan);
	//printf("jojo add\n");
	tmp->tcount=0;
	tmp->trans=(char**)malloc(tcount*sizeof(char*));
	tmp->trans[tmp->tcount]=(char*)malloc(strlen(tr)+1);
	strcpy(tmp->trans[tmp->tcount],tr);
	
	tmp->prev=*datahold;
	*datahold=tmp;
	//printf("in add %s\n",(*datahold)->word);
	return 0;	
}

int show(const char* lan, const data* datahold) {
	printf("show on\n");
	while (datahold != NULL) {
	//	printf("show function\n");
		printf("show function %s \n",datahold->word);
		datahold=datahold->prev;
	}
	return 0;
}
0

calosc wydaje sie wysypywac na

while(feof(storage)!=1) {
		fgets(tmpc,255,storage);

w funkcji load
jakis fflush ? moze ? tylko jaki i gdzie ? eh

0

Sprawdź no Mentisie, czy storage nie jest równe NULL po fopen.

0

NULL Tomku NULL ;D
thx!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1