Ir ao conteúdo
  • Cadastre-se

C Função com struct linguagem C


Arkcanjou

Posts recomendados

Usando essa struct como exemplo

typedef struct
{
    char    nome[15];
    char    sobrenome[15];
    int     idade;     
} Pessoa;

 

Digamos que dado Pessoa lista_pessoas[5];

 

como posso fazer uma função no qual lista_pessoas recebe o valor que esta lista_pessoas[i+1] ?

 

Eu tentei da seguinte forma, mas não funcionou
 

void Remover(Pessoa *p[], int i){
	(*p)[i].nome = (*p)[i+1].nome
}

 

Mas ele retorna um erro "a expressão deve ser um lvalue modificável".

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, Arkcanjou disse:

Digamos que dado Pessoa lista_pessoas[5];

 

como posso fazer uma função no qual lista_pessoas recebe o valor que esta lista_pessoas[i+1]

 

Não pode. lista_pessoas é um array com 5 structs do tipo Pessoa.

 

lista_pessoas[i+i] é uma struct do tipo Pessoa. Um não pode receber o valor do outro.

 

void Remover(Pessoa *p[], int i){
	(*p)[i].nome = (*p)[i+1].nome
}
2 horas atrás, herbertbahia disse:

para a string nome você tem uma coleção de 15 caracteres então não pode usar o simbolo de atribuição '=' deve utilizar o comando strcpy

 

Sim, nome é char[15] então não pode atribuir diretamente. Mas o problema é maior.

typedef struct
{
    char    nome[15];
    char    sobrenome[15];
    int     idade;
} Pessoa; 

Pessoa é uma struct. Se declarou 

Pessoa lista_pessoas[5];

então tem um array com 5 delas.

 

No entanto declarou

void Remover(Pessoa  *p[], int i);

e está errado. Isso vem muito da mania de alguns autores e professores --- e depois os pobres alunos --- escreverem as declarações como escreveu, usando

int    *a ;


ao invés de 
 

int*    a;


Quando você está declarando 'a'. Entenda que está declarando uma variável, e no caso da sua função é 'p'

 

E é difícil mudar um hábito... Mas sugiro que mude. Escrevendo como expliquei torna muito mais claro o que está de fato declarando: um ponteiro para uma struct. É óbvio de *p é do tipo Pessoa, mas isso não é a declaração: é a consequência da declaração.

 

Devia ter escrito

	void Remover( Pessoa*         p[], int i);

E talvez tivesse entendido melhor o que está fazendo. O que é 'p' nesse caso?
 

As declarações em C e outras linguagens devem ser lidas da direita para a esquerda. Então em Pessoa*    p[]

  • [  ]  quer dizer que é um array
  • 'p' é o nome da variável
  • Pessoa* é o tipo dela: um ponteiro para um tipo Pessoa

    Só que não é isso que você quer... Espero que tenha entendido. Mas vou explicar mais.

O que você queria escrever:

void Remover(Pessoa p[], int i)
{
    p[i] = p[i + 1];
}

Afinal vai passar um array de Pessoa. E pode copiar direto uma Pessoa para outra, já que Pessoa não tem ponteiros para nada. São só valores estáticos. Isso é o que se chama shallow copy nos livros.

 

Como funcionaria do jeito que escreveu?

 

Teria que montar um vetor de ponteiros para pessoa. Assim

    Pessoa* p_p[5];
    l[0].idade = 1;
    l[0].nome[0] = '0';
    p_p[0] = &l[0];
    p_p[1] = &l[3];
    printf("[0] Idade: %d Inicial: %c\n", l[0].idade, l[0].nome[0]);
    printf("[3] Idade: %d Inicial: %c\n", l[3].idade, l[3].nome[0]);
    RemoverA(p_p, 0);
    printf("[0] Idade: %d Inicial: %c\n", l[0].idade, l[0].nome[0]);

De todo modo entenda que não está de fato removendo nada: apenas copiando um elemento sobre o anterior.

 

Veja esse resultado

[3] Idade: 12 Inicial: a
[3] Idade: 120 Inicial: x
[0] Idade: 1 Inicial: 0
[3] Idade: 120 Inicial: x
[0] Idade: 120 Inicial: x

Desse programa

#include <stdio.h>

typedef struct
{
    char    nome[15];
    char    sobrenome[15];
    int     idade;
} Pessoa; 

void Remover(Pessoa p[], int i)
{
    p[i] = p[i + 1];
}

void RemoverA(Pessoa* p[], int i)
{
    *p[i] = *p[i+1];
}

int main(void)
{
    Pessoa l[5];
    l[3].idade = 12;
    l[3].nome[0] = 'a';
    l[4].idade = 120;
    l[4].nome[0] = 'x';
    printf("[3] Idade: %d Inicial: %c\n", l[3].idade, l[3].nome[0]);
    Remover(l, 3);
    printf("[3] Idade: %d Inicial: %c\n", l[3].idade, l[3].nome[0]);

    Pessoa* p_p[5];
    l[0].idade = 1;
    l[0].nome[0] = '0';
    p_p[0] = &l[0];
    p_p[1] = &l[3];
    printf("[0] Idade: %d Inicial: %c\n", l[0].idade, l[0].nome[0]);
    printf("[3] Idade: %d Inicial: %c\n", l[3].idade, l[3].nome[0]);
    RemoverA(p_p, 0);
    printf("[0] Idade: %d Inicial: %c\n", l[0].idade, l[0].nome[0]);
}

 

Espero que ajude a entender.

 

Se achar confuso, entenda que é assim mesmo: confuso. Mas é muito poderoso e muito rápido. C foi escrita para manipular essas coisas.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!