Ir ao conteúdo
  • Cadastre-se
guhbrj

C Acessar dados dentro de uma struct referenciada por ponteiro dentro de outra

Recommended Posts

Galera, boa noite ! 

Sou novato aqui. Saudações a todos .

Estou tentando acessar dados dentro de uma struct através de um ponteiro dentro de outra. Confuso, não ?

 

 

Abaixo segue código para análise.


 

// declaração das structs

typedef struct computador{
    int mp;
    int mc;
    int cbloco;
    int bcelula;
    int lconjunto;
    int bloco;
    int numero;
    }pc;

typedef struct pclista{     // lista encadeada
    
    int numpc;
    struct pclista *prox;
    struct pc *maquina;
        
}lista;



... 

na main tenho a declaração de um ponteiro do tipo lista que serve como nó cabeça para acessar a lista.



lista *inicio;

inicio = NULL;





...

insiro os dados do PC e, para exibir, tenho uma função que busca o pc:



void buscar(lista *inicio)

{

    int n;
    int sair=0, tag, indice;
    
    system("CLS");
    
    printf("Entre com o numero do computador: ");
    scanf("%d", &n);
    fflush(stdin);
    
    if(inicio==NULL)
    {
        printf("\nNao ha computador cadastrado.");
        Sleep(1500);
        
    }
    
    else
    {
        while((inicio!=NULL)&&(sair==0))
        {
            
            if(inicio->numpc==n)
            {
                printf("Achei a maquina!\n");
                
                
                
                
                tag = inicio->maquina->mp-inicio->maquina->mc; /* <---- nesta linha o DEV apresenta a seguinte mensagem de erro: 352    46    J:\conversaoPCS.c    [Error] dereferencing pointer to incomplete type */

                                
                sair=1;
                
                system("PAUSE");
            }
            else
            {
                inicio=inicio->prox;
            }
            



}

 

alguém saberia como ajudar  ? Agradeço a todos!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudaria muito se colocasse o código completo usando os botões <>.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>

typedef struct computador{
	int mp;
	int mc;
	int cbloco;
	int bcelula;
	int lconjunto;
	int bloco;
	int numero;
	}pc;

typedef struct pclista{
	
	int numpc;
	struct pclista *prox;
	struct pc *maquina;
		
}lista;


lista* novo(lista *inicio);
int calc_Mp(int mprincipal, int tam, int cont);
int calc_Mc(int mcache, int tam, int cont);
int calc_celula_bloco(int celbloc, int tam, int cont);
int calc_byte_celula(int bcel, int tam, int cont);
int calc_linha_conjunto(int linhaconj,int tam,int cont);
void exibir(lista *inicio);
void buscar(lista *inicio);


int main()

{
	lista *inicio;
	inicio = NULL;
	
	
	

	
	char opcao;
	do
	{
		
	system("CLS");
	printf("--------------MENU----------------\n");
	printf("|                                |\n");
	printf("|   Novo computador      [n]     |\n");
	printf("|   Editar computador    [e]     |\n");
	printf("|   Ver informações      [i]     | \n");
	printf("|   Apagar computador    [a]     |\n");
	printf("|   Exibir lista         [l]     |\n");
	printf("|   Sair do programa     [s]     |\n");
	printf("|                                |\n");
	printf("----------------------------------\n");
	printf("\nEntre com uma opcao: ");
	scanf("%c", &opcao);
	fflush(stdin);
	
	switch(opcao)
	{
		default :
		printf("\nOpcao invalida");
		Sleep(1000);
		break;
		
		case 'n':
			
		inicio = novo(inicio);
		break;
		
		case 'l':
		exibir(inicio);
		break;
		
		case 'i':
		buscar(inicio);
		break;
	}
	
	
	}while(opcao!='s');
	
	
}

lista* novo(lista *inicio)
{
	lista *auxLista;
	pc *auxPc;
	
	int numpc=1, tam=1, cont=0, numerador = 0;
	int cb, bc, lj, mprincipal, mcache, celbloc, bcel, linhaconj, bloc, ram , cache, aux;
	
	char umMp[3], umMc[3];
	
	system("CLS");
	
	printf("Entre com o tamanho da Memoria princial\nEx.: 8 Gb\nDigite: ");
	scanf("%d %s", &mprincipal, &umMp);
	fflush(stdin);
	
	printf("Entre com o tamanho da Memoria cache\nEx:. 2 Mb\nDigite: ");
	scanf("%d %s", &mcache, &umMc);
	fflush(stdin);
	
	printf("Entre com quantidade de celulas por bloco: ");
	scanf("%d", &celbloc);
	fflush(stdin);
	
	printf("Entre com quantidade de byte por celula: ");
	scanf("%d", &bcel);
	fflush(stdin);
	
	printf("Entre com a quantidade de linhas por conjunto: ");
	scanf("%d", &linhaconj);
	fflush(stdin);
	
	if((strcmp(umMp, "K")==0)||(strcmp(umMp, "k")==0))
	{
		ram = 0;
	}	
		if((strcmp(umMp, "kb")==0)||(strcmp(umMp, "Kb")==0)||(strcmp(umMp, "kB")==0)||(strcmp(umMp, "KB")==0))
		{
			ram = 10;
		}
			if((strcmp(umMp, "mb")==0)||(strcmp(umMp, "Mb")==0)||(strcmp(umMp, "mB")==0)||(strcmp(umMp, "MB")==0))
			{
				ram = 20;
			}
					if((strcmp(umMp, "gb")==0)||(strcmp(umMp, "Gb")==0)||(strcmp(umMp, "gB")==0)||(strcmp(umMp, "GB")==0))
					{
						ram = 30;
					}
							if((strcmp(umMp, "tb")==0)||(strcmp(umMp, "Tb")==0)||(strcmp(umMp, "tB")==0)||(strcmp(umMp, "TB")==0))
							{
								ram = 40;
							}
							//--------------------------------------------------------------------------cache----------------------------------------
								if((strcmp(umMc, "K")==0)||(strcmp(umMc, "k")==0))
									{
										cache = 0;
									}	
										if((strcmp(umMc, "kb")==0)||(strcmp(umMc, "Kb")==0)||(strcmp(umMc, "kB")==0)||(strcmp(umMc, "KB")==0))
										{
											cache = 10;
										}
											if((strcmp(umMc, "mb")==0)||(strcmp(umMc, "Mb")==0)||(strcmp(umMc, "mB")==0)||(strcmp(umMc, "MB")==0))
											{
												cache = 20;
											}
													if((strcmp(umMc, "gb")==0)||(strcmp(umMc, "Gb")==0)||(strcmp(umMc, "gB")==0)||(strcmp(umMc, "GB")==0))
													{
														cache = 30;
													}
															if((strcmp(umMc, "tb")==0)||(strcmp(umMc, "Tb")==0)||(strcmp(umMc, "tB")==0)||(strcmp(umMc, "TB")==0))
															{
																cache = 40;
															}

cb=calc_celula_bloco(celbloc, tam, cont);
bc=calc_byte_celula(bcel, tam, cont);
lj=calc_linha_conjunto(linhaconj, tam, cont);

ram+=calc_Mp(mprincipal, tam, cont);
cache+=calc_Mc(mcache, tam, cont);

aux = ram;
aux-=celbloc;
aux-=bcel;
bloc=aux; // < -- valor do bloco
				



printf("\nCelula/bloco   -> %d = 2^ %d", celbloc, cb);
printf("\nByte/celula    -> %d = 2^ %d", bcel, bc);
printf("\nLinha/conjunto -> %d = 2^ %d", linhaconj, lj);		
printf("\nMemoria RAM    -> %d %s = 2^ %d",mprincipal, umMp, ram);
printf("\nMemoria Cache  -> %d %s = 2^ %d",mcache, umMc, cache);	
printf("\nBloco (assoc)  -> %d\n\n", bloc);
		
system("PAUSE");

numerador ++;
//inserindo computador na lista

auxPc=malloc(sizeof(pc));
auxLista=malloc(sizeof(lista));

auxLista->maquina = auxPc; // <- salvei na lista o endereco onde a maquina esta
auxPc->bcelula = bc;
auxPc->bloco = bloc;
auxPc->cbloco = bc;
auxPc->lconjunto = lj;
auxPc->mc = cache;
auxPc->mp = ram;

printf("entre com um numero para o  computador: ");
scanf("%d", &numerador);


auxPc->numero = numerador;
auxLista->numpc = numerador;
auxLista->prox = inicio;



	
	return(auxLista);
}
int calc_celula_bloco(int celbloc, int tam, int cont)
{
	if(celbloc>tam)
	{

		return calc_Mp(celbloc, tam+tam, cont+1);
	}
	else
	{
		
		return cont;
	}
	
}

int calc_byte_celula(int bcel, int tam, int cont)
{
	if(bcel>tam)
	{

		return calc_Mp(bcel, tam+tam, cont+1);
	}
	else
	{
		
		return cont;
	}
		
}

int calc_linha_conjunto(int linhaconj,int tam,int cont)
{
	
	if(linhaconj>tam)
	{

		return calc_Mp(linhaconj, tam+tam, cont+1);
	}
	else
	{
		
		return cont;
	
	}
	
}


int calc_Mp(int mprincipal, int tam, int cont)
{
		
	if(mprincipal>tam)
	{

		return calc_Mp(mprincipal, tam+tam, cont+1);
	}
	else
	{
		
		return cont;
	}
			
}

calc_Mc(int mcache, int tam, int cont)
{
	if(mcache>tam)
	{
		
		return calc_Mp(mcache, tam+tam, cont+1);
	}
	else
	{
		
		return cont;
	}
	
}


void exibir(lista *inicio)
{
	
	system("CLS");
	
	printf("Lista de computadores:\n\n\n ");
	
	
		if(inicio==NULL)
		{
			printf("\nNada a listar");
			Sleep(1000);
		}
		
		else
		{
			while(inicio!=NULL)
			{
				printf("\nComputador %d ", inicio->numpc);
				inicio = inicio->prox;
			}	
			printf("\n");
			system("PAUSE");
		}
	}
	
void buscar(lista *inicio)
{
	int n;
	int sair=0, tag, indice;
	
	system("CLS");
	
	printf("Entre com o numero do computador: ");
	scanf("%d", &n);
	fflush(stdin);
	
	if(inicio==NULL)
	{
		printf("\nNao ha computador cadastrado.");
		Sleep(1500);
		
	}
	
	else
	{
		while((inicio!=NULL)&&(sair==0))
		{
			
			if(inicio->numpc==n)
			{
				printf("Achei a maquina!\n");
				
				
				
				
				tag = inicio->maquina->mp-inicio->maquina->mc;
				indice = inicio->maquina->bloco-tag;
								
				sair=1;
				
				system("PAUSE");
			}
			else
			{
				inicio=inicio->prox;
			}
			
		}
		
		
		
		
	}
	
	
}

 

adicionado 2 minutos depois
2 minutos atrás, guhbrj disse:

tag = inicio->maquina->mp-inicio->maquina->mc; indice = inicio->maquina->bloco-tag;

esse é o trecho problemático. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quer acessar o mc não pode fazer:

tag = inicio->maquina->mc;

Testei aqui e ao menos compilou, só não sei se faz o que você quer.

 

Esta linha também deu erro no meu compilador:

struct pc *maquina;

Tive que tirar o struct para compilar.

 

Eu uso o Code::Blocks, tive que fazer mais algumas mudanças para o código compilar.

 

Porém o seu código original compilou praticamente normal aqui.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado, gente, pela ajuda. Uso o Dev++ e, aqui no meu compilador, está exibindo esse erro:

 

352    26    G:\conversaoPCS.c    [Error] dereferencing pointer to incomplete type

 

conforme na imagem

erro no dev.PNG

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável tag é pra receber o quê na verdade?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, allanxd disse:

Ajudaria muito se colocasse o código completo usando os botões <>.

e aí, allan, poderia mandar email para contato? estou precisando fazer uma questão e não tenho a mínima ideia de como fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

allandxd, a variável tag deveria receber o conteúdo da variável mp - (operação de subtração) conteúdo da variável mc. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@WesleyT, já experimentou criar o seu tópico com a sua dúvida?

 

@guhbrj, veja isto https://stackoverflow.com/questions/2576554/c-programming-dereferencing-pointer-to-incomplete-type-error

É o mesmo erro que está enfrentando.

 

Eu uso C++, por isso que não deu nenhum erro porque o compilador sabe o que fazer, mas em C tem que ser na mão mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já, porém para isso tinha que ter pelo menos uma parte do código pronto. E como disse não sei começar. É um trabalho para segunda-feira, e vim procurar alguém que possa me ajudar. Se quiser até pago, o programa é um estoque de uma loja... 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@guhbrj, tente colocando 

typedef struct pc

em vez de computador e veja se resolve esse erro.

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

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

×