• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bertolo

bug bueda estranho! preciso de ajuda

2 mensagens neste tópico

/*lista em q em cada estructura reside o nome da marca e as respectivas equivalencias separadas por ,*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TNETE 200 /*tnete=tamanho normal das equivalencias todas encadeadas*/

struct marca {
char *nome; /*vai conter todas as peças iguais*/
struct marca *prox;
};

/********************************************************************************/
/********************************************************************************/

void inicialista(struct marca **ap)
{
*ap=NULL;
return ;
}



int compara(char *a,char *b) /*vai achar uma string dentro de outra string*/
{
int i,VALORDEVOLVIDO;
int o,p,RES,tamanhodofor;
tamanhodofor=strlen(a)-strlen(b);
RES=0;VALORDEVOLVIDO=0;

for(i=0; i<=tamanhodofor;i++)
{
if(a[i]==b[0])
{
for(p=i+1,o=1;b[o]!='\0';p++,o++)	
{	

if(a[p]==b[o])
{		
RES++;
if(RES==strlen(b)-1)
VALORDEVOLVIDO=1;
}	
else	
{		
RES=0;break;
	}	
}	
}
}
return VALORDEVOLVIDO;
}



void imprime(char *a) /*a e um vector com nomes e virgulas a separalos, e necessario imprimir os nomes sem as virgulas*/
{
int i;
for(i=0;a[i]!='\0';i++)
{
if(a[i]==',')
printf("\n");
else
printf("%c",a[i]);
}
printf("\n");
}

/********************************************************************************/
/********************************************************************************/

int main (void)
{
struct marca *ap,*base;
FILE *f;
int aux,i,CONTROL=0;
char *nomeaux,menu;

/*abertura do ficheiro*/
f = fopen ("marcasequiv","r");
if(f == NULL)
{
fprintf(stdout, "\7ERRO: na abertura do ficheiro.\n");
return 0;	
}


/*construcão da lista*/


inicialista(&ap);
/*vai percorrer a lista*/
inicialista(&base);
/*vai ficar com o inicio da lista so e alterado uma vez*/
i=0;
/*i serve para construir o inicio*/
do
{
nomeaux=(char *)calloc(TNETE,sizeof(char));
aux=fscanf(f,"%s",nomeaux);

/*CONTROLAR TAMANHO DE EQUIVALENCIAS DE MODO A EVITAR SEG FAULTS*/
CONTROL=strlen(nomeaux);
if(CONTROL>=TNETE)
{
printf("\n\n\7ERRO:EQUIVALENCIA DEMASIADO EXTENSA\n\n\n");
return 0;
}



if(i==1 && aux==1) /*construção do corpo da lista*/
{
ap->nome=(char *)malloc(strlen(nomeaux));
strcpy(ap->nome,nomeaux);
ap->prox=(struct marca *)calloc(1,sizeof(struct marca));
ap=ap->prox;
}

if(i==0 && aux==1) /*inicio da lista*/
{
ap=(struct marca *)calloc(1,sizeof(struct marca));
ap->nome=(char *)malloc(strlen(nomeaux));
strcpy(ap->nome,nomeaux);
ap->prox=(struct marca *)calloc(1,sizeof(struct marca)); /*cria a proxima estrutura na lista*/
base=ap;/*mete a base a apontar para o sitio certo*/
ap=ap->prox;/*actualiza ap*/
i=1;
}
}while(aux==1);
/*LISTA CONSTRUIDA*/


/*MENU*/
printf("\nUtiliza apenas os números para seleccionar as opcções.\n");
do{
printf("\n1-PROCURA EQUIVALENCIA\n2-AJUDA\n3-SAIR\n\n");
printf("Opção:");
scanf("%c",&menu);
while(getchar()!='\n');
switch(menu)
{

case '1':
printf("\n\n1-PROCURA EQUIVALENCIA\n\n");
printf("Introduz Peça:");
nomeaux=(char *)calloc(TNETE,sizeof(char));
scanf("%s",nomeaux);
nomeaux=(char *)realloc(nomeaux,strlen(nomeaux));
ap=base;
do{
aux=compara(ap->nome,nomeaux);
if(aux==1)
	{
	imprime(ap->nome);
	break;
	}
ap=ap->prox;
}while(ap->prox!=NULL);
if(aux==0)
	printf("\n\7ERRO:Equivalencia não encontrada!");
while(getchar()!='\n');printf("\n\n");break;

case '2':

printf("\n2-AJUDA\n\n");
printf("O que faz?\nO Programa faz associações/equivalencias de conjuntos de caracteres até A caracteres numa só linha. Para alterar o número de caracteres por associação/equivalencia abre-se o ficheio do código e alterar-se o A na linha que diz #define TNERTE A, algures no inicio.Na versão original do programa A=300. Caso o número de caracteres por equivalencia exceda 300 o programa poderá \"crashar\".");
printf("\nComo Acrescentar Equivalencias?\nA lista de nomes que o programa usa para fazer associações está organizada da seguinte forma:em cada linha está uma equivalencia de nomes, sendo estes separados por virgulas. Para completar as equivalencias e só acrescentar no final da linha uma virgula e o respectivo nome.");

while(getchar()!='\n');printf("\n\n");break;


case '3':
return 0;


default:printf("\n\n\7ERRO:OPCÇÃO INVÁLIDA!");while(getchar()!='\n');printf("\n\n");break;

}}while(1);



fclose(f);
return 0;

}

Este é o código. O objectivo ta ai escrito no printf do help. Acontece que ja esteve a funcionar o prgrama ate que me deparo com um bug bueda estranho, sempre que fazia 1-procurar e escrevia a palavra MECA-xxxxx dava erro, para todas as outras palavras nao dava, sempre que escrevia a palavra MECA na string q uso para fazer os compares o programa punha mais uns caracteres malucos.Isto acontecia na unica linha do programa que tem realloc,ainda pensei ser culpa deste ultimo, apagueio, a linha chegou a ficar vazia e dava o mesmo erro estranho com a palavra MECA.Isto deve ser provavelmente más praticas....

gostava de ouvir a vossa opiniao e se possivel uma soluçao.

NOTA:MECA-EHC8500 nomeadamente. se quiserem meto ai o ficheiro q tenho agregado, mas penso q nao sera necessario

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora