LuisOliveira Posted November 28, 2015 at 04:36 PM Report Share #590158 Posted November 28, 2015 at 04:36 PM 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 Link to comment Share on other sites More sharing options...
vesperto Posted November 28, 2015 at 05:14 PM Report Share #590159 Posted November 28, 2015 at 05:14 PM 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...) Link to comment Share on other sites More sharing options...
LuisOliveira Posted November 28, 2015 at 05:57 PM Author Report Share #590160 Posted November 28, 2015 at 05:57 PM 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 🙂 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 28, 2015 at 07:34 PM Report Share #590167 Posted November 28, 2015 at 07:34 PM só uma nota extra. toda a memória alocada deverá de ser libertada. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
skipper234 Posted November 28, 2015 at 09:19 PM Report Share #590169 Posted November 28, 2015 at 09:19 PM (edited) 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 November 28, 2015 at 10:40 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 28, 2015 at 09:32 PM Report Share #590172 Posted November 28, 2015 at 09:32 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
skipper234 Posted November 29, 2015 at 12:50 PM Report Share #590190 Posted November 29, 2015 at 12:50 PM (edited) 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 November 29, 2015 at 12:57 PM by skipper234 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 29, 2015 at 05:14 PM Report Share #590201 Posted November 29, 2015 at 05:14 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
skipper234 Posted November 29, 2015 at 05:32 PM Report Share #590203 Posted November 29, 2015 at 05:32 PM 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 29, 2015 at 05:34 PM Report Share #590204 Posted November 29, 2015 at 05:34 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
skipper234 Posted November 29, 2015 at 05:46 PM Report Share #590208 Posted November 29, 2015 at 05:46 PM 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 29, 2015 at 06:05 PM Report Share #590211 Posted November 29, 2015 at 06:05 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Flinger Posted December 2, 2015 at 11:33 AM Report Share #590296 Posted December 2, 2015 at 11:33 AM 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... man malloc Link to comment Share on other sites More sharing options...
LuisOliveira Posted December 9, 2015 at 10:32 PM Author Report Share #590511 Posted December 9, 2015 at 10:32 PM 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 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now