BrunoMartins Posted January 31, 2013 at 02:26 AM Report #493681 Posted January 31, 2013 at 02:26 AM (edited) Boa noite, durante o estudo surgiu-me aqui um problema, a variável b fica a null, ou seja quando se vai fazer o strtok dá falha de segmentação,alguém me pode dizer o que pode ser? PRODUTO * ler_ficheiro(char *caminho) { FILE * produto; PRODUTO *L= NULL; PRODUTO * nv; produto = fopen("produto.txt","r"); char *a,*b,*c; char linha[25],linhab[25],linhac[25]; //char carac[15]; int id,stock; double preco; if (produto==NULL) //ficheiro vazio return(0); while (fgets(linha, 25, produto)!=NULL) { //se o ficheiro nao estiver vazio nv = makenode(); a=strtok(linha,";"); id=atoi(a); b=strtok(linhab,",");printf("b:%s\n",b); stock=atoi(b);//AQUI DA A FALHA DE SEGMENTAÇÂO c=strtok(linhac,"\n"); preco=atof(c); nv->id=id; nv->stock=stock; nv->preco=preco; printf("AHAHAHA:%d\n",stock); L=iserirarvore(L,nv); //printf("Balanciei a arvore\n"); //getchar(); //printf("_%s _%s\n",linha,linhab); //printf("BI:%s\n Caracteristicas:%s\n",a,b); }//while fclose(produto); L=balanceararvore(L); return(L); } Edited January 31, 2013 at 10:23 AM by pmg GeSHi
HappyHippyHippo Posted January 31, 2013 at 08:56 AM Report #493685 Posted January 31, 2013 at 08:56 AM b=strtok(linhab,","); o array linhab não foi inicializado, logo a função strtok, por acaso, não encontrou nenhum caracter 'n', o valor de NULL é retornado e atribuído à variável b http://linux.die.net/man/3/strtok The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
eatg75 Posted January 31, 2013 at 09:16 AM Report #493687 Posted January 31, 2013 at 09:16 AM Assim a primeira notei alguns erros e os identifiquei. PRODUTO* ler_ficheiro(char* caminho) { FILE* produto; // inicializa as tua variaveis PRODUTO* L = NULL; PRODUTO* nv = NULL; // seria uma boa pratica inicializares as teus ponteiros produto = fopen("produto.txt","r"); char* a, *b, *c; char linha[25],linhab[25],linhac[25]; // char carac[15]; int id, stock; // inicializa as tuas variaveis! double preco; // faz o mesmo aqui if (produto == NULL) //ficheiro vazio OU NAO EXISTE, NAO TENS PERMISSAO PARA O LER. return 0; // nao precisas de utilizar os parenteses aqui while (fgets(linha, 25, produto)!=NULL) { //se o ficheiro nao estiver vazio nv = makenode(); a = strtok(linha,";"); // atencao que o strtok() retorna NULL caso nao encontrar uma // token ao tentar partir a string pelo(s) delimitador(es) // como o strtok() pode retornar NULL deves sempre fazer a verificacao se a string // devolvida nao e NULL de forma a utilzares, ou fazer outra coisa caso for NULL. if (a) id = atoi(a); // b = strtok(linhab,","); // nao inicializaste a "linhab" // podes fazer isto b = strtok(NULL ,","); // nao inicializaste a "linhab" if (b) { printf("b:%s\n",b); stock = atoi(b); // possivelmente estas a utilizar uma variavel que esteja a NULL } // c = strtok(linhac,"\n"); // "linhac" nao esta inicializada c = strtok(NULL,"\n"); // "linhac" nao esta inicializada if (c) preco = atof(c); // penso que era isto que querias fazer. // estas a utilizar estas 3 variaveis sem as ter a inicializadas antes. // o que faz este teu while e os strtok(), e todo o resto que do codigo acima // sem sentido. nv->id = id; nv->stock = stock; nv->preco = preco; printf("AHAHAHA:%d\n", stock); // estas a utilizar uma variavel nao que nao utilizaste // O "L" nao foi inicializado ainda // se esta tua arvore for a responsavel por libertar memoria dos seus nos, poderas ter problemas // utilizando o L desta forma, nao posso dizer mais pois nao conheco a implementacao interna da // tua arvore. L = iserirarvore(L,nv); //printf("Balanciei a arvore\n"); //getchar(); //printf("_%s _%s\n",linha,linhab); //printf("BI:%s\n Caracteristicas:%s\n",a,b); } //while fclose(produto); L = balanceararvore(L); return L; } Podias disponibilizar a implentacao da tua arvore? 1 Report Victarion seized the dusky woman by the wrist and pulled her to him. Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see. Moqorro's dark eyes seemed to shine. Moqorro - I see dragons.
BrunoMartins Posted January 31, 2013 at 02:37 PM Author Report #493715 Posted January 31, 2013 at 02:37 PM O problema está resolvido era mesmo a questão das variáveis linhab e linhac no lugar delas substitui por null no strtok e já ficou a árvore como deve ser, posso disponibilizar a função de inserir na árvore se assim quiserem. Obrigado pela ajuda
eatg75 Posted January 31, 2013 at 03:07 PM Report #493721 Posted January 31, 2013 at 03:07 PM Nao o preciso para nada de especifico, estava apenas curioso sobre a implementacao da arvore. Se pudesses disponibilizar agradecia. Victarion seized the dusky woman by the wrist and pulled her to him. Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see. Moqorro's dark eyes seemed to shine. Moqorro - I see dragons.
BrunoMartins Posted January 31, 2013 at 03:48 PM Author Report #493727 Posted January 31, 2013 at 03:48 PM (edited) Ora aqui está ela 🙂 PRODUTO * iserirarvore(PRODUTO * arvore, PRODUTO * nodo){ if (arvore == NULL) { return(nodo); } if(nodo->id <= arvore->id) { if(arvore->esq != NULL) iserirarvore(arvore->esq, nodo); else arvore->esq = nodo; } else { if(arvore->dir != NULL) iserirarvore(arvore->dir, nodo); else arvore->dir = nodo; } /* if (nodo->bi < arvore->bi) arvore->esq = iserirarvore(arvore->esq, nodo); else arvore->dir = iserirarvore(arvore->dir, nodo);*/ return(arvore); } Edited January 31, 2013 at 03:58 PM by pmg GeSHi
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now