Ir para conteúdo

Uma dica rápida...


fredericopissarra

Posts Recomendados

Não sei se já postei isso por aqui, mas aqui vai uma dica rápida para aquelas funções que precisamos criara para comparações, usadas em funções como qsort() e bsearch(). Ambas têm o protótipo:

void qsort( void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *) );
void *bsearch( const void *key, const void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *) );

Esse ponteiro para a função de comparação espera uma função que retorne <0, 0 ou >0. No caso do qsort() poderemos ficar tentados a escrever uma rotina assim, para ordenação ascendente de um buffer contendo int's:

int mycomp( const void *a, const void *b )
{
  if ( *(const int *)a < *(const int *)b ) return -1;
  else if ( *(const int *)a > *(const int *)b ) return 1;
  else return 0;
}

Ou algo similar... É uma boa rotina, mas essa é melhor:

int mycomp( const void *a, const void *b )
{ return ( *(const int *)a > *(const int *)b ) - ( *(const int *)a < *(const int *)b ); }

Repare que todo resultado de expressão contendo comparações é sempre 0 ou 1 ( e do tipo int )... Ao comparar se (a > b) obtemos 0 ou 1. Mesma coisa para a comparação (a < b)... E, não parece, mas esse último código é um cadinho mais rápido (e menor) que o anterior... Se quiser fazer a rotina mais legível:

int mycomp( const void *a, const void *b )
{
  const int *a_ = a, *b_ = b;

  return ( *a_ > *b_ ) - ( *a_ < *b_ );
}

 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...