• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bertolo

ajuda needed

13 mensagens neste tópico

curso_desejado.c:31: error: request for member ‘univ’ in something not a structure or union

a que se deve este tipo de erros?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sem ver o código é difícil, mas estas a tentar aceder a um membro de uma estrutura ou união com os operadores (. ou ->) numa variável que não é nem uma coisa nem outra.

Isto acontece muito quando temos ponteiros para ponteiros para listas (por exemplo) e nos esquecemos que temos de colocar o * antes do ponteiro para aceder aos membros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

void construirlista(struct cursos **lista,char *u,char *c,char lm,char *d,unsigned int cr)
{
if(*lista==NULL)
{
*lista=(struct cursos *)malloc((sizeof(struct cursos)));
if(*lista==NULL)
	return ;
strcpy((*lista)->univ,u);
strcpy((*lista)->curso,c);
strcpy((*lista)->disciplina,d);
(*lista)->cred=cr;
(*lista)->moul=lm;
(**lista)->prox=NULL;
}

a estructura é:

struct cursos{
int cred;
char curso[21];
char univ[21];
char disciplina[21];
char moul;  /* é licenciatura ou mestrado*/
struct cursos *prox;
};

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou neste exemplo mais curto:

#include <stdio.h>

struct carro{
char p;
};

int main (void){
char a;
struct carro pol={'g'};
puts("mete:");
scanf("%c",&a);
(pol->p)=a;
printf("a:%c pol:%c\n",a,pol->p);
return 0;
}

RAIOS PARTAM ESTA M****  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o operador -> utiliza-se quando tens um ponteiro no segundo exemplo não tens logo devia ser

pol.p

no exemplo anterior tenta tirar os ( ) , fica só

strcpy(*lista->univ,u);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como codigo neste estado :

void construirlista(struct cursos **lista,char *u,char *c,char lm,char *d,unsigned int cr)
{
if(*lista==NULL)
{
*lista=(struct cursos *)malloc((sizeof(struct cursos)));
if(*lista==NULL)
	return ;
strcpy((*lista)->univ,u);
strcpy((*lista)->curso,c);
strcpy((*lista)->disciplina,d);
(*lista).cred=cr;
(*lista).moul=lm;
(**lista).prox=NULL;
}

da os seguintes erros:

curso_desejado.c: In function ‘construirlista’:

curso_desejado.c:34: error: request for member ‘cred’ in something not a structure or union

curso_desejado.c:35: error: request for member ‘moul’ in something not a structure or union

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Neste caso não podes utilizar o . pois tens ponteiros tens de utilizar o ->

tenta

void construirlista(struct cursos **lista,char *u,char *c,char lm,char *d,unsigned int cr)
{
if(*lista==NULL)
{
*lista=(struct cursos *)malloc((sizeof(struct cursos)));
if(*lista==NULL)
	return ;
strcpy(*lista->univ,u);
strcpy(*lista->curso,c);
strcpy(*lista->disciplina,d);
*lista->cred=cr;
*lista->moul=lm;
**lista->prox=NULL; /* esta linha nao faz muito sentido */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

rgcaldas...lol a linha q dizes q nao faz sentido e para fazer listas dinamicas. lol xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim mas **lista é um ponteiro para um ponteiro para uma estrutura

logo **lista não deve ter um membro prox, nem deve ter membro nenhum

posso estar a ver mal a cena :-)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lista é apontador para apontador para estrutura;

*lista é apontador para estrutura;

**lista é uma estrutura.

Além disso cuidado com as precedências dos operadores. -> é avaliado antes de *. Por isso, ou usas (**lista).prox (desreferência dupla obtém uma instância da struct), ou (*lista)->prox (desreferência simples obtém um apontador para uma instância da struct).

Fazer **lista->prox não faz sentido por duas razões:

- pela precedência dos operadores, é o mesmo que fazer **(lista->prox);

- mesmo que a precedência fosse ao contrário, **lista já é uma instância da struct, e não um apontador.

Resumindo:

Estas linhas

	(*lista).cred=cr;
(*lista).moul=lm;
(**lista).prox=NULL;

têm que ser

	(*lista)->cred=cr;
(*lista)->moul=lm;
(*lista)->prox=NULL;

ou

	(**lista).cred=cr;
(**lista).moul=lm;
(**lista).prox=NULL;

Ou qualquer mistura entre os dois.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim mas **lista é um ponteiro para um ponteiro para uma estrutura

logo **lista não deve ter um membro prox, nem deve ter membro nenhum

posso estar a ver mal a cena :-)

tás :confused: mas acertaste no erro...era o ->

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora