Ir ao conteúdo

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


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Postado

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);
}

 

Postado

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.

  • Membro VIP
  • Solução
Postado

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
Postado

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);
}

 

  • Membro VIP
Postado

@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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!