Ir ao conteúdo
  • Cadastre-se

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


guhbrj

Posts recomendados

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

Link para o comentário
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. 

Link para o comentário
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
Link para o comentário
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.

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