Ir ao conteúdo

Posts recomendados

Postado

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

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

Postado

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
Postado

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

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

Postado

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

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!