Ir ao conteúdo
  • Cadastre-se

Sobrecarga de funcoes


Visitante

Posts recomendados

Boa noite, tenho um menu que está chamando funções muito parecidas e queria saber se tem alguma forma de eu não precisar definir todas. Sou iniciante e não estou entendendo muito bem os textos que achei sobre isso na internet. 

Vou colocar só parte do código porque está muito grande e incompleto:

 

	cout << "\n1 - Busca por titulo" << endl;
	cout << "\n2 - Busca por AUTOR " << endl;
	cout << "\n3 - Busca por CODIGO" << endl;
	cout << "\n4 - Voltar" << endl;
	cin >> op;

(...)

int buscaTitulo(dLivros l[], string titulo, int q){
	for(int i=0; i<q; i++){
		if(titulo == l[i].titulo){ //ISSO TEM QUE SER VARIAVEL QUE MUDAR DE ACORDO COM O MEMBRO DA STRUCT
			return i;
		}
	}
	return -1;
}

int buscaAutor()

 

Tem como eu criar só uma função e, através dos argumentos, mudar o membro da struct comparado (título, autor, código)?

Link para o comentário
Compartilhar em outros sites

O ponteiro da struct é o ponteiro do primeiro byte de dados contido nela, se converte a struct para o tipo byte (char) é possível se mover pelos campos como se fosse um vetor de bytes (char)

/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>
#define PRIMEIRO 0
#define DO_MEIO 20
#define ULTIMO (DO_MEIO + 25)

struct nome {
    char primeiro[20];  //Tamanho 20 bytes
    char domeio[25];    //Tamanho 25 bytes
    char ultimo[20];    //Tamnho  20 bytes
    int  idade;         //Tamanho 04 bytes total 69 bytes.
};

void show(const struct nome* base, const unsigned point);

/** Função principal que abre o programa */
int main(void)
{
    struct nome meunome = {"Fulano", "Beltrano", "de Tal", 20};

        show(&meunome, PRIMEIRO);
        show(&meunome,  DO_MEIO);
        show(&meunome,   ULTIMO);

        printf("Idade: %d\n", *( 68 + ((char*)&meunome)));
        printf("Idade: %d\n", meunome.idade);
        return 0;
}

void show(const struct nome* base, const unsigned point)
{
        printf("Aparti de point: %s\n\n", point + ((char*)base));
        return;
}

Ainda sim o companheiro @MassakiMsk nos deu um solução bem mais simples.

Link para o comentário
Compartilhar em outros sites

 

O ponteiro da struct é o ponteiro do primeiro byte de dados contido nela, se converte a struct para o tipo byte (char) é possível se mover pelos campos como se fosse um vetor de bytes (char)


/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>
#define PRIMEIRO 0
#define DO_MEIO 20
#define ULTIMO (DO_MEIO + 25)

struct nome {
    char primeiro[20];  //Tamanho 20 bytes
    char domeio[25];    //Tamanho 25 bytes
    char ultimo[20];    //Tamnho  20 bytes
    int  idade;         //Tamanho 04 bytes total 69 bytes.
};

void show(const struct nome* base, const unsigned point);

/** Função principal que abre o programa */
int main(void)
{
    struct nome meunome = {"Fulano", "Beltrano", "de Tal", 20};

        show(&meunome, PRIMEIRO);
        show(&meunome,  DO_MEIO);
        show(&meunome,   ULTIMO);

        printf("Idade: %d\n", *( 68 + ((char*)&meunome)));
        printf("Idade: %d\n", meunome.idade);
        return 0;
}

void show(const struct nome* base, const unsigned point)
{
        printf("Aparti de point: %s\n\n", point + ((char*)base));
        return;
}

Ainda sim o companheiro @MassakiMsk nos deu um solução bem mais simples.

 

 

@Mauro Britivaldo Ja existe uma função para isso... se chama offsetof

#include <stdio.h>     
#include <stddef.h>     /* offsetof */

typedef struct{
    char a;
    char b[10];
    char c;
}foo;

int main () {
    foo bar = {'f', "Ola", 'x'};
    unsigned char* pbar = (void*)& bar; // ponteiro a bar
    
    printf ( "offsetof(struct foo,a) is %d\n", ( int ) offsetof ( foo, a ) );
    printf ( "offsetof(struct foo,b) is %d\n", ( int ) offsetof ( foo, b ) );
    printf ( "offsetof(struct foo,c) is %d\n", ( int ) offsetof ( foo, c ) );
    
    printf ( "%s\n", ( char* ) (pbar+offsetof ( foo, b )) ); //pbar+offset do membro b
    
    return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

@MassakiMsk Sim, eu poderia inclusive passar a variável op que estou usando pra "sustentar" o menu. O problema é que pra cada tipo de busca, eu informo um argumento diferente ( string titulo, string autor, int codigo).

 

A única solução que estou vendo é passar a string e o int como opcional:

 

int busca(dLivros l[], string str = "default", int op, int cod = 0); 

//e aí dentro da função eu trato isso...

 

Parece BEM feio e errado.

Link para o comentário
Compartilhar em outros sites

 

@MassakiMsk Sim, eu poderia inclusive passar a variável op que estou usando pra "sustentar" o menu. O problema é que pra cada tipo de busca, eu informo um argumento diferente ( string titulo, string autor, int codigo).

 

A única solução que estou vendo é passar a string e o int como opcional:

 

int busca(dLivros l[], string str = "default", int op, int cod = 0); 

//e aí dentro da função eu trato isso...

 

Parece BEM feio e errado.

Um função de busca que seja global busca byte por byte,

pode ser assim:

/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>

//Estrutura de Dados
struct book {
    char snome[50];
    unsigned ucodigo;
};

//Protótipos de Função
int fun_busca_byte(const char* base, const char* obj, const unsigned lim);



/** Função principal que abre o programa */
int main(void)
{
    struct book sclube[2] =
    {   {"Clube do Hardware", 100},
        {"Clube do Hardware", 101}   };

        char snome[] = "Clube do Hardware"; //Dados do tipo char STRING
        printf("Achou? %i\n\n", 
          fun_busca_byte(sclube[0].snome, snome, sizeof snome));

        unsigned ucodigo = 100;//Dados do tipo int INTEIRO
        printf("Achou? %i\n\n", 
          fun_busca_byte((char*)&sclube[0].ucodigo, (char*)&ucodigo, 4));
        return 0;
}

int fun_busca_byte(const char* base, const char* obj, const unsigned lim)
{
    int bytes = 0;
        while( bytes < lim)
        {
            if(*base - *obj) return 0;

            obj++;
            base++;
            bytes++;
        }
        return 1;
}

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...