Ir ao conteúdo

Posts recomendados

Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!