Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
nanquinote

Sobrecarga de funcoes

Recommended Posts

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)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poderia colocar um novo parametro que indica qual membro ser comparado, e na função fazer um switch.

Tipo, manda um int e para cada membro você define um valor.

  • Curtir 1

Compartilhar este post


Link para o post
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.

  • Curtir 1

Compartilhar este post


Link para o post
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;
}

 

 

Editado por vangodp

Compartilhar este post


Link para o post
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.

Editado por nanquinote

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp obrigado, pois eu não sabia!

 

 

  • Curtir 1

Compartilhar este post


Link para o post
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;
}

 

Editado por Mauro Britivaldo
  • 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






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

×