Jump to content

Uma dica rápida...


fredericopissarra

Recommended Posts

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 to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...