Jump to content
LuisOliveira

Alocação de memoria dinâmica

Recommended Posts

LuisOliveira

Boa Tarde,

Tenho um trabalho escolar em mãos e estou a te rum problema. tenho uma estrutura de dados de um robot, onde guardo o nome, a sua posição actual e a sua "posição objectivo".

O numero de robots não é pedido ao utilizador, mas sim implementado logo 1 no inicio do programa e durante o correr do programa o utilizador pode inserir outro robot (ou mais).

No código que disponibilizo não sei se estou a cometer algum erro. Tenho uma estrutura que inicializa a memoria dinâmica e as respectivas posições. mas quando o utilizador pretende inserir mais um robot estou a voltar a chamar a mesma função, Será isto possível?

Código:

Robots* InicializaRobot(Quadricula *s, int nl, int nc, int n){
//alocar memoria
int posicao, xi, yi;
Robots *R = (Robots*)malloc(n*sizeof(Robots));
fflush(stdin);//limpar buffer
printf("Introduza o nome do robot:");
scanf("%2s", R->nome);
posicao = rand() % (nl*nc);

//falta verificar se o objectivo é um obstaculo
GetIJMatriz(posicao, nc, ξ, &yi);
R->x = xi;
R->y = yi;

//int x, y;//posição aleatória da matriz
R->bateria = 100; //Bateria a 100%
R->xob = 0;
R->yob = 0;
Contarobot++;
//mostrarrobot(R, Contarobot);
return R;
}
main:
Robots *robot = InicializaRobot(VD, linha, coluna, 1);
quando o utilizador pede para introduzir mais um robot:
robot = InicializaRobot(VD, linha, coluna, contarobot); //contarobot é variável global
Obrigado desde já,

Luís Oliveira

Share this post


Link to post
Share on other sites
vesperto

Se é possível usar a mm função? É. Se é possível reutilizar a mm variável para receber o retorno da função? Tb, mas se calhar não é isso que queres.

(PS: a lógica de um trabalho académico é aprenderes por ti...)

Share this post


Link to post
Share on other sites
LuisOliveira
PS: a lógica de um trabalho académico é aprenderes por ti

Tem razão claro, tive esta duvida e não consegui resolver, quando se tem duvidas tenta-se esclarece-las, e foi isso que tentei ao vir aqui e colocar a minha duvida. Como é óbvio não venho aqui pedir para me resolver o trabalho.

Obrigado a mesma :)

Share this post


Link to post
Share on other sites
HappyHippyHippo

só uma nota extra.

toda a memória alocada deverá de ser libertada.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
skipper234

Boas Noites, Luís Oliveira.

Ao analisar o teu código notei que pretendes alocar e criar os robots usando a mesma função é por isso é que não está a funcionar

Vou tentar explicar de uma maneira simple o que quero dizer:

Funcão de alocar robots

Robots* InicializaRobot(int n){
Contarobot = 0;
//alocar memoria
Robots *R = (Robots*)malloc(n*sizeof(Robots));
return R;
}

Funcão de criar robots

Void CriaRobot(Robots *R, Quadricula *s, int nl, int nc){
int posicao, xi, yi;
fflush(stdin);//limpar buffer
printf("Introduza o nome do robot:");
scanf("%2s", R[Contarobot].nome);
posicao = rand() % (nl*nc);

//falta verificar se o objectivo é um obstaculo
GetIJMatriz(posicao, nc, ξ, &yi);
R[Contarobot].x = xi;
R[Contarobot].y = yi;

//int x, y;//posição aleatória da matriz
R[Contarobot].bateria = 100; //Bateria a 100%
R[Contarobot].xob = 0;
R[Contarobot].yob = 0;
Contarobot++;
}

Chamar a função de alocar os robots:

Robots *robot = InicializaRobot(10);

Chamar a função de criar os robots:

InicializaRobot(robot,VD, linha, coluna);

Atenção: Eu não testei as funções, por isso deves rever o teu proprio código e ajusta-lo.

Cumprimentos,

Francisco Soares.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Boas Noites, Luís Oliveira.

Ao analisar o teu código notei que pretendes alocar e criar os robots usando a mesma função é por isso é que não está a funcionar

Vou tentar explicar de uma maneira simple o que quero dizer:

Funcão de alocar robots

Robots* InicializaRobot(int n){
 Contarobot = 0;
 //alocar memoria
 Robots *R = (Robots*)malloc(n*sizeof(Robots));
 return R;
}

Funcão de criar robots

Void CriaRobot(Robots *R, Quadricula *s, int nl, int nc){
 int posicao, xi, yi;
 fflush(stdin);//limpar buffer
 printf("Introduza o nome do robot:");
 scanf("%2s", R[Contarobot].nome);
 posicao = rand() % (nl*nc);

 //falta verificar se o objectivo é um obstaculo
 GetIJMatriz(posicao, nc, ξ, &yi);
 R[Contarobot].x = xi;
 R[Contarobot].y = yi;

 //int x, y;//posição aleatória da matriz
 R[Contarobot].bateria = 100; //Bateria a 100%
 R[Contarobot].xob = 0;
 R[Contarobot].yob = 0;
 Contarobot++;
}

Chamar a função de alocar os robots:

Robots *robot = InicializaRobot(1);

Chamar a função de criar os robots:

InicializaRobot(robot,VD, linha, coluna);

Atenção: Eu não testei as funções, por isso deves rever o teu proprio código e ajusta-lo.

Cumprimentos,

Francisco Soares.

não explicaste nada do que a tua alteração aborda e/ou resolve.

na realidade, a única coisa que parece acontecer é a simples separação de código, que a meu ver, até está mal realizada ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
skipper234

não explicaste nada do que a tua alteração aborda e/ou resolve.

na realidade, a única coisa que parece acontecer é a simples separação de código, que a meu ver, até está mal realizada ...

O que eu quero dizer é que se deve alocar a memória e só depois usar a função para inserir cada um dos robots, e sim e de facto li o meu comentário e não está correcto, da maneira que o luis está a fazer é alocar e retornar para um ponteiro que assim ele nunca vai ter mais de que um robot porque está sempre a alocar memória e depois perde os dados ao subestituir o valor do ponteiro.

A correcção do meu comentário:

alocar memória: (25 é o valor maximo de robots)

Robots *robot = InicializaRobot(25);

criar os robots:

CriaRobot(robot, VD, linha, coluna)

E já agora em relação a separação de código, podes ser mais especifico no que te estás a referir @HappyHippyHippo.

Cumprimentos,

Francisco Soares.

Edited by skipper234

Share this post


Link to post
Share on other sites
HappyHippyHippo

O que eu quero dizer é que se deve alocar a memória e só depois usar a função para inserir cada um dos robots

e é isso que o @LuisOliveira está a fazer

da maneira que o luis está a fazer é alocar e retornar para um ponteiro que assim ele nunca vai ter mais de que um robot porque está sempre a alocar memória e depois perde os dados ao subestituir o valor do ponteiro.

não podes saber o que é que ele faz com o ponteiro entre chamadas da função.

ou até mesmo que se o ponteiro é uma variável local a uma função de gestão de novos robots.

o

E já agora em relação a separação de código, podes ser mais especifico no que te estás a referir @HappyHippyHippo.

a separação de código deverá ser relativa a tipos de interacção com os objectos.

uma coisa é saber a informação a ser atribuída ao novo robot e outra é a sua criação/inserção em algum tipo de contentor.

o que quero dizer que a separação de código será:

- uma função que pede toda a informação ao utilizador do novo robot

- uma função que faz a alocação de memória e a sua subsequente inserção num contentor

de seguida, a primeira chama a segunda função.

(nota, não vou estar a explicar as vantagens deste tipo de separação)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
skipper234

não podes saber o que é que ele faz com o ponteiro entre chamadas da função.

ou até mesmo que se o ponteiro é uma variável local a uma função de gestão de novos robots.

Eu estou a tentar ajudar o Luis pois estou a fazer o mesmo trabalho que ele, e é por isso que depois de falar com ele por PM sei que o problema principal, e que ao adicionar os robots quando ele faz uma listagem só lhe aparece o ultimo, e é por isso que digo que ele está a substituir o ponteiro por outro e assim está a perder os dados.

Share this post


Link to post
Share on other sites
HappyHippyHippo

então estou descansado, visto ele estar a tirar duvidas exclusivamente com alguém que deverá ter o mesmo nível de conhecimento, ao invés de toda a comunidade de pessoas que se apresentam disponíveis para o ajudar.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
skipper234

então estou descansado, visto ele estar a tirar duvidas exclusivamente com alguém que deverá ter o mesmo nível de conhecimento, ao invés de toda a comunidade de pessoas que se apresentam disponíveis para o ajudar.

Pelo menos eu estou a tentar ajudá-lo da alguma maneira, eu tambem tenho de fazer o mesmo trabalho mas mesmo assim estoua fazer os possiveis para ajuda-lo. Mas ok vamos ver o que a "comunidade de pessoas" tem a dizer sobre o problema, com tão poucos dados que ele disponibilizou.

Share this post


Link to post
Share on other sites
HappyHippyHippo

Pelo menos eu estou a tentar ajudá-lo da alguma maneira, eu tambem tenho de fazer o mesmo trabalho mas mesmo assim estoua fazer os possiveis para ajuda-lo. Mas ok vamos ver o que a "comunidade de pessoas" tem a dizer sobre o problema, com tão poucos dados que ele disponibilizou.

como disse, o que ele deveria ter feito era falar para a comunidade.

e se é para responder à questão de abertura do tópico:

sim

pronto, está respondido


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Flinger

A resposta encontra-se na documentação das funções. Infelizmente perdeu-se o hábito de aconselhar a utilização deste recurso, provavelmente o melhor que vocês têm à vossa disposição...

Share this post


Link to post
Share on other sites
LuisOliveira

Muito obrigado a todos. o problema não se encontrava em alocar a memoria nem desalocar, mas sim na maneira de como fazer. os passos de resolução foram simples. reestruturar o programa inteiro e lá consegui.

Até a próxima,

Luís Oliveira

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.