Ir ao conteúdo
  • Cadastre-se
Maria_epbn

C# RESOLVIDO Função que retorna o maior elemento de um vetor

Recommended Posts

Meu programa esta dando falha de segmentação nessa função. 

 

Uma função que recebe dois vetores, o seu tamanho e uma variável ponteiro. A função deve achar o maior elemento do vetor v1 e o menor elemento do vetor v2. A função deve retornar o valor do maior elemento de v1.

void *MaiorMenor (float *vet1, float *vet2, int tam, float *maior)
{   float *menor;
    int i;

  maior = (float*)malloc(tam * sizeof(float));
   
    for(maior=0; maior<tam; maior++)
    { for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    }
  menor = (float*)malloc(tam * sizeof(float));
    for(menor=0; menor<tam; menor++)
    { for(i=0; i<tam; i++)
      {  if(*(vet2+(tam-i-1)) < *menor) 
         {  *menor = *(vet1+(tam-i-1));
         }
      }
    }
  return (maior);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse problema acontece quando a função / ou / o programa acessa locais que não estão reservados para o processo atual. Agora encontrar ordem em meio a essa bagunça é osso. Parece aqueles quartos desarrumados que só o dono sabe onde fica as cuecas, calcinhas no teu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Sobre:

8 horas atrás, Maria_epbn disse:

    for(maior=0; maior<tam; maior++)
    { for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    }

 

 

Para que seria esse primeiro for?

 

Mas em fim... você está utilizando a variável maior tanto para controlar esse for, tanto para receber o "maior valor". Não me faz sentido... além do mais, como é um quantidade fixa de loops, assim como foi feito no segundo for, poderia utilizar um int comum.

 

RESUMINDO:
Apague o primeiro for e deixe apenas o segundo. Não precisa de "um for dentro do outro". Simplesmente irá "comparar o maior com a primeira até a última posição".

 

 

Obs.: como existe um if que compara o valor de maior, se faz necessário garantir que esta variável tenha algum valor logo na primeira comparação. Perceba que você apenas alocou a memória para o maior, mas não definiu valor para ele. Uma solução boa para inicializar os "maiores" e "menores" costumam ser atribuindo o primeiro valor a eles, ou seja, após as variáveis estarem prontas para o uso, defini o maior e menor como sendo o primeiro, daí, o for já começará da segunda posição em diante (posição 1).

 

 

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tinha razão aquele primeiro for estava errado.

Agora ficou assim a função e não está mais dando erro.

Muito obrigada pela ajuda!

void *MaiorMenor (float *vet1, float *vet2, int tam, float *maior)
{   float *menor;
    int i;

  maior = (float*)malloc(tam * sizeof(float));
  maior = (vet1+0);

      for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    
  menor = (float*)malloc(tam * sizeof(float));
  menor = (vet2+0);

      for(i=0; i<tam; i++)
      {  if(*(vet2+(tam-i-1)) < *menor) 
         {  *menor = *(vet1+(tam-i-1));
         }
      }
    
  return (maior);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Maria_epbn, são dois vetores? um verificará o maior do primeiro e o outro verificar o menor do segundo?

 

Outra coisa: o i deve começar a partir da posição 1 (segunda posição), pois maior e menor já estão com o valor da posição 0 (primeira posição), ou seja, estará comparando um valor com ele mesmo desnecessariamente (vejo como erro de lógica).

 

Mais outra coisa:

Eu não manjo de C#, mas se o método é void, provavelmente ele não tem retorno, logo aquele return estaria errado. Pelo que suponho, o retorno dos valores vem pelo próprio parâmetro... inclusive provavelmente esse deve ser o motivo de usar ponteiros... além do mais, o método trás duas resposta!!! porque daria "privilégio" para o maior? no caso, em vez de retornar na próprio função, os valores serão retornados pelo parâmetro.

 

 

RESUMINDO:

- comece os for a partir da segunda posição (1);

- remova esse return "solto" ai, pois o método é void.

 

No aguardo.

  • Curtir 1

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

×