Ir ao conteúdo
  • Cadastre-se
GuhLelouch

Programa imprime endereços de memória ao invés de valores

Recommended Posts

Olá!

Estou fazendo um programa relativamente simples, que verifica se há mutações em um gene ou não. Funciona basicamente assim: pede para digitar o tamanho do gene. Usa esse número para alocar memória para duas strings com esse mesmo número de caracteres mais um. Lê o primeiro gene e o segundo gene, ou seja, duas strings. Essas duas strings são armazenadas nos vetores devidamente alocados. É feito um primeiro rastreio que verifica quantas mutações existem no total, comparando as duas strings. Esse número é usado depois para alocar memória para um terceiro vetor, que irá armazenas a posição das mutações. Então é feito um rastreio que copia para o terceiro vetor todos os números dos elementos das duas strings que não coincidem. Este vetor é, finalmente, impresso, mostrando as posições que ocorreram mutações, ou seja, que o conteúdo do elemento nas matrizes não coincide.

O problema é que quando ele vai imprimir, algumas posições ele mostra corretamente, mas em outras, ele simplesmente mostra um valor de memória (aparentemente) no lugar da posição. Fiz vários e vários testes, mas não consegui identificar o problema. Segundo os meus testes, é algum erro na função compara2 ou imprime.

Gostaria da ajuda de vocês para solucionar este problema. Abaixo está o código.

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

char *aloca (int tamanho);
int *aloca2 (int tamanho);
int leitura (char *gene, int tamanho);
int compara1 (char *gene1, char *gene2, int tamanho);
int compara2 (char *gene1, char *gene2, int tamanho1, int tamanho2, int *mutacoes);
int imprime (int *mutacoes, int tamanho);

int main ()
{
int tamanho1, tamanho2, *mutacoes;
char *gene1, *gene2;
printf("Insira o tamanho do seu gene: ");
scanf("%d", &tamanho1);
gene1 = aloca(tamanho1);
gene2 = aloca(tamanho1);
leitura(gene1, tamanho1);
leitura(gene2, tamanho1);
tamanho2 = compara1(gene1, gene2, tamanho1);
mutacoes = aloca2(tamanho2);
compara2(gene1, gene2, tamanho1, tamanho2, mutacoes);
free(gene1);
free(gene2);
imprime(mutacoes, tamanho2);
free(mutacoes);
}

char *aloca (int tamanho)
{
char *posicao;
posicao = (char *)malloc((tamanho + 1)*sizeof(char));
return posicao;
}

int *aloca2 (int tamanho)
{
int *posicao;
posicao = (int *)malloc((tamanho)*sizeof(int));
return posicao;
}

int leitura (char *gene, int tamanho)
{
printf("\n\nInsira a sequencia do gene:\n");
scanf("%s", gene);
if(strlen(gene) != tamanho)
{
printf("O tamanho da sequencia inserida nao coincide com o requerido!");
exit (0);
}
}

int compara1 (char *gene1, char *gene2, int tamanho)
{
int i, soma = 0;
for(i = 0; i < tamanho; i++)
{
if(gene1[i] != gene2[i])
soma++;
}
return soma;
}

int compara2 (char *gene1, char *gene2, int tamanho1, int tamanho2, int *mutacoes)
{
int i, j = 0;
for(i = 0; i < tamanho1; i++)
{
if(gene1[i] != gene2[i])
mutacoes[j] = i + 1;
if (j == tamanho2)
break;
j++;
}
}

int imprime (int *mutacoes, int tamanho)
{
int i;
if(tamanho == 0)
{
printf("\n\nNao foram encontradas mutacoes!\n\n");
return 0;
}
else
{
printf("\n\nForam encontradas mutacoes nas posições: ");
for(i = 0; i < tamanho; i++)
{
printf("%d, ", mutacoes[i]);
}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guh,

É na compara2():

int compara2 (char *gene1, char *gene2, int tamanho1, int tamanho2, int *mutacoes)
{
int i, j = 0;
for(i = 0; i < tamanho1; i++)
{
if (gene1[i] != gene2[i])
{
mutacoes[j] = i + 1;
j++;
}
}
}

Você estava incrementando j mesmo sem utilizar uma posição do vetor mutacoes.

Este teste if (j == tamanho2) agora também torna-se dispensável, pois você não tem mais o risco de extrapolar j (o número de diferenças é conhecido). Poderá remover este parâmetro int tamanho2 da função também.

Por favor, informe se funcionou.

:natal:

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, LNW.

Eu acabei percebendo este erro juvenil meu antes de ler a sua resposta. Mas mesmo assim, obrigado pela ajuda! Está funcionando tudo ok aqui.

Com relação ao teste if (j == tamanho2), eu o utilizo para quebrar as iterações assim que o vetor estiver preenchido, para aumentar um pouco a eficiência. O resultado é o mesmo, mas evita iterações desnecessárias.

Valeu, até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Guh,

Com relação ao teste if (j == tamanho2), eu o utilizo para quebrar as iterações assim que o vetor estiver preenchido, para aumentar um pouco a eficiência. O resultado é o mesmo, mas evita iterações desnecessárias.

Tem razão, Guh. Poderia fazer esse teste no próprio for, caso prefira:

for(j = 0, i = 0; i < tamanho1 && j < tamanho2; i++)

:natal:

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×