Jump to content
JoaoNascimento

Aceder a valor de um certo endereço!

Recommended Posts

JoaoNascimento

Ola pessoal,

pessoal é o seguinte tenho uma determinada variável que a certa altura guarda a posição de memorial e uma estrutura de dados, como consigo depois aceder a essa estrutura usando esses valores?

Share this post


Link to post
Share on other sites
daj

Não percebo muito bem a tua dúvida. É isto que queres?

struct A {
  int a1;
  int a2;
};

void func() {
  struct A a = { 1, 2 };

  struct A *pa = &a;

  printf("%d, %d\n", (*pa).a1, pa->a2); /* Duas formas de fazer o mesmo (o operador -> é uma simplificação sintáctica) */
}

Share this post


Link to post
Share on other sites
JoaoNascimento

Vou ver se me consigo explicar melhor, tenho as seguintes duas estruturas:

typedef struct livro
{
char autor[50];
char titulo[50];
unsigned char Estado;
}livros;

typedef struct socio
{
char socio[50];
int numero;
livros *requesitado;
}socios;

Como se vê o campo requesitado da estrutura é um apontador para um livro!

Tenho de ler a informação de dois ficheiro:

livros.txt;

socios.txt;

As funções que uso para ler são:

int lerLivros(livros *l) //a) pronto
{
int i = 0;
FILE *fp;
fp = fopen("livros.txt","r");

while(!feof(fp))
{
	fscanf(fp,"%[^\t]\t%[^\t]\t%d\n", l[i].titulo, l[i].autor, &l[i].Estado);
	printf("%s\t%s\t%d\n", l[i].titulo, l[i].autor, l[i].Estado);
	i++;
}
//printf("%d",i);

fclose(fp);
return i;
}

int lerSocios(socios *s, livros *l, int tamanhoLivros) //a) pronto
{
int i = 0;
livros h[MaxLivros];
int j=0;
FILE *pf;
pf = fopen("socios.txt","r");

while(!feof(pf))
{
	fscanf(pf,"%[^\t]\t%d\t%[^\t]\t%[^\n]",s[i].socio, &s[i].numero, h[i].titulo, h[i].autor);
	printf("%s\t%d\t%s\t%s\n",s[i].socio, s[i].numero, h[i].titulo, h[i].autor);
	for(j=0; j<tamanhoLivros; j++)
	{
		if( strcmp(h[i].titulo,l[j].titulo)==0 )
		{
			s[i].requesitado=&l[i];
			printf("%d\n",&l[i]);
		}
	}
	i++;
}

fclose(pf);
return i;
}

Estou a pensar mal nesses algoritmos?

Share this post


Link to post
Share on other sites
daj

Com o código que apresentas imagino que terás um array para guardar livros, um apontador para o qual passas ao lerLivros() para preencher com os dados do ficheiro. Deverás ter também um array para guardar sócios, sendo que cada cada sócio só pode ter um livro requisitado (ou nenhum). O array de sócios é preenchido no lerSocios(), invocado depois do lerLivros().

Sendo assim, parece-me que a variável local h em lerSocios() não precisa de ser um array. Bem, nem precisava ser um livro porque na realidade não representa um livro mas sim dados para efectuar a pesquisa na colecção de livros.

        livros h;
        int j=0;
        FILE *pf;
        pf = fopen("socios.txt","r");

        while(!feof(pf))
        {
                fscanf(pf,"%[^\t]\t%d\t%[^\t]\t%[^\n]",s[i].socio, &s[i].numero, h.titulo, h.autor);
                printf("%s\t%d\t%s\t%s\n",s[i].socio, s[i].numero, h.titulo, h.autor);
                for(j=0; j<tamanhoLivros; j++)
                {
                        if( strcmp(h.titulo,l[j].titulo)==0 && strcmp(h.autor,l[j].autor)==0 )
                        {
                                s[i].requesitado=&l[i];
                                printf("%s requisitou %s escrito por %s\n", s[i].socio, s[i].requesitado->titulo, s[i].requesitado->autor);
                        }
                }
                i++;
        }

Não sei é se estou a resolver a tua dúvida... :-)

Share this post


Link to post
Share on other sites
daj

Sim, porque nesse momento s[ i ].requisitado não aponta para nada ou, dito de outra forma, o valor que lá está é um endereço qualquer que não aponta para uma área válida de memória. É por isso que o programa termina de forma anormal, com uma falha de acesso à memória.

Mais para a frente no programa atribuis um endereço válido, na instrução

s[i].requesitado=&l[i];

e a partir daqui já podes usar o apontador para chegar a um livro.

De qualquer das maneiras, não fazia sentido a leitura dessa forma porque tu queres que o livro associado ao sócio seja um da colecção de livros lida do outro ficheiro e não é um qualquer. Daí guardares os dados de pesquisa em variáveis locais e usares esses dados para encontrar o livro na colecção.

Share this post


Link to post
Share on other sites
daj

Já agora, convém atribuir um valor ao apontador requesitado para quando o sócio não tem livro nenhum requisitado. Por exemplo:

        while(!feof(pf))
        {
                fscanf(pf,"%[^\t]\t%d\t%[^\t]\t%[^\n]",s[i].socio, &s[i].numero, h.titulo, h.autor);
                s[i].requesitado = NULL;
                // ...
         }

Posteriormente, sempre que quiseres mostrar os dados do sócio, só segues o apontador se este não for NULL.

Para além disso, podes terminar o ciclo assim que encontras o livro a associar ao sócio.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.