• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Virtual Void

memoria dinamica

21 mensagens neste tópico

boas. gostava de saber como fazer para alocar memoria dinamicamente por exemplo para um array. ou seja o equivalente do java  para o malloc.

tipo

             int *point;
             point=malloc(sizeof(int)*5);
             point=realloc(point,sizeof(int)*10);

como posso fazer uma cena parecida em java? obrigado

e ja agr como e k posto o codigo aki no forum com highlights?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a alocação de memoria em Java é feita pela VM sem interferência do programador se a ideia é fazer arrays de tamanho dinâmico o Java tem a class Vector que é muito boa :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

             int *point;
             point=malloc(sizeof(int)*5);
             point=realloc(point,sizeof(int)*10);

int [] point=new int[5];
int [] tmp=new int[10];
for (int i=0; i<5; ++i) tmp[i]=point[i];
point=tmp;

Para teres código highlighted, na tag code metes à frente a linguagem que é. Isto:

[code=java]

int x;

[/code]

dá isto:

int x;

Ou então utilizas o editor completo. Tens um tutorial mais completo aqui

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok. obrigado. é que estou a aprender java e ainda nao me deparei kom nada para fazer cenas dinamicas e ja estava a estranhar....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não existe o conceito de memória dinâmica em Java, não faz sentido. Tudo em Java são referências, para um programador de C podemos dizer que "tudo em Java são ponteiros" mas esta frase não está correcta porque as referências não se comportam como ponteiros na maioria das acções.

O exemplo apresentado pelo TheDark não está correcto, na verdade não faz sentido. No código dele, point e temp são dois objectos diferentes enquanto que no exemplo de C o ponteiro é o mesmo, apenas "aponta" para zonas de memória diferentes. Em Java as referências referenciam, ou apontam, para objectos, não para zonas de memória. Toda a memória é gerida pela JVM e nunca pelo programador.

Não digo que o código não compile, apenas que não tem a mesma lógica que o exemplo em C, simplesmente não é a alternativa porque não existe alternativa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A alternativa é essa, só não existe realloc.

O alocamento de memória com o new é dinâmico na mesma.

A diferença mais importante entre um ponteiro e uma referência, é que o ponteiro traz a responsabilidade sobre gestão de memória, ou seja, o owner do ponteiro tem a responsabilidade de libertar memória. Em java a responsabilidade da gestão está no GC, logo o programador não tem que gerir memória, nem faz sentido existir ponteiros. Mas a memória é alocada dinâmicamente na mesma, tem grande semelhança ao new do C++. 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A memória em Java não é alocada dinâmicamente no mesmo sentido em que é em C/C++, e as referências possuem bem mais diferenças que apenas colocar o peso da sua gestão no programador.

Digo que não é alternativa porque não faz sentido comparar os dois pedaços de código, até porque não houve uma realocação, houve apenas a criação de dois objectos, e a mudança do valor da referência.

Dizer que código Java é alternativa ao exemplo de C é demasiado redutor para as referências e pode induzir um programador novo a não perceber bem como funciona a memória numa aplicação Java.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O realloc pode retornar uma nova zona de memória. Nesse sentido é que fiz o código Java. É a única maneira que conheço de emular o que foi pedido. Se conheceres outra, fica à vontade de a mostrar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao resumindo nao me é possivel criar por exemplo um array com crescimento dinamico?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só da maneira que eu fiz, em que crias o espaço numa variável temporária e depois o atribuis à variável inicial.

Digo eu, no meu (pouco) conhecimento de Java.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok. obrigado. De qualquer maneira vou fazer uams pesquisas e se encontrar alguma cea de geito posto aki

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
entao resumindo nao me é possivel criar por exemplo um array com crescimento dinamico?

Não, nunca! Por isso é que disse que não é alternativa. Simplesmente não existe alternativa.

Se queres usar um array com tamanho dinâmico usa o a classe Array.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Espero que me entendam. A memória em Java nada tem a ver com o que acontece em C. O exemplo que colocaste faz todo o sentido em C mas ao passares para Java, apesar do resultado ser o mesmo o conceito e o que acontece nos bastidores é completamente diferente.

Se quiserem insistir, então, sim é uma alternativa, mas se eu disser isso vou induzir em erro fazendo parecer que a memória em Java funciona da mesma maneira que em C ou que a função malloc pode ter o seu comportamente emulado em Java. O resultado, podem, comprovar, é o mesmo. Pior, esse tipo de programação não está optimizado, é um enorme peso na performance da tua aplicação fazeres um for desse género.

Por isso é que o Java possui métodos próprios, optimizados, para copiar arrays, que é basicamente o que se está a fazer, apesar de ser uma shallow copy.

A única coisa que quero que fique clara é que o conceito de memória alocada dinâmicamente não faz qualquer sentido em Java, seja qual for o exemplo que coloquem é sempre uma comparação de "alhos com bugalhos".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Knitter.

O que dizes em relação ao código Java faz sentido, não é de forma alguma correcto.

Mas alocação de memória dinâmica em java é efectuada pelo operador new. O mais natural é mesmo que o proprio operador new esteja a utilizar as funções de alocação dinâmica em C. Esta por sua vez terão de usar funções de "system call" para alocação dinâmica de forma a criar espaço na "heap". É ai que tudo começa, e basicamente, alocação dinâmica é a alocação de espaço na "heap", logo alocação dinâmica faz sentido em qualquer processo do SO. E faz sentido em Java. So não existe é a realocação tipo "renew"/"realloc".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tenho noção de como funciona a memória em Java. Aliás, foi à custa de muitos erros que aprendi como ela funciona. O facto de ter estudado máquinas virtuais (menos do que devia ;)) este semestre também ajudou. Sei que a filosofia em Java (ou .NET, que foi o que estudei) é completamente diferente da de C/C++ (embora C++ tenha uma implementação de Garbage Collection, mas não é nativa à linguagem).

Mas também sei que aquilo que escrevi funciona (embora nem tenha testado). O que faz é copiar as referências de um array para o outro. Podem haver algoritmos mais eficientes do que o que fiz (há de certeza; como disse, não estou totalmente à vontade em Java, e não conheço a linguagem a fundo). Mas provavelmente o que a classe Array faz é semelhante ao que propus, embora possa ser mais eficiente.

Não há magia; as referências para os objectos têm que ser copiadas de um array para o outro.

Só não gosto de matar moscas com canhões... se tiver paciência, um dia hei-de experimentar comparar o código que propus com o uso da classe Array.

Mas é preciso que tenha paciência...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em Java a memória é pré-alocada. O operador new não reserva memória no mesmo sentido em que a função malloc. A função malloc é uma função optimista de retorno rápido, o operador new não é optimista. O operador new faz mais que reservar espaço para o objecto, uma dessas acções, talvez a menos importante de todas é realmente a obtenção de uma referência para o espaço de memória ocupado pelo objecto, mas o mecanismo é bem mais complexo e não deve ser reduzido ao que acontece em C sob pena de não se perceber correctamente como funciona o mecanismo de memória.

Mas enfim, assumam que a alternativa está correcta e que sim, as coisas funcionam assim, é tarde estou cansado para estar a discutir isto ;)

Não digo que não funcione, muito pelo contrário, até já disse que no fim o resultado acaba por ser o mesmo, mas vamos ver se entendem o meu ponto de vista. Estamos a tentar ensinar alguém, não acho que ir lá por atalhos seja a melhor maneira, dizer a um programador novo em POO que muitas vezes é mais fácil usar um simples if que um conjunto de objectos leva a que ele use naturalmente o if e não perceba correctamente o mecanismo de POO, do mesmo modo, dizer que este ou aquele pedaço de código funciona da mesma maneira a alguém que não sabe como funciona a memória é formatar-lhe a forma de pensar.

Mas enfim, o tópico já está mais que extenso e o assunto já está mais que batido. Podemos continuar isto noutra altura ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

POO não tem a ver com isto. Ninguém está a falar de criação de classes, ou de heranças ou polimorfismo. O simples uso de objectos (leia-se classes) não é POO.

Estamos a falar de gestão de memória. E dado que programo mais em C++ do que em C, posso comparar o new de Java ao new de C++.

E mesmo o malloc não se limita a encontrar espaço contíguo suficiente para alojar o que pretendemos; se assim fosse, o free teria que receber mais parâmetros.

Claro que o mecanismo de GC complica as coisas relativamente ao new do C++; mas pela tua ordem de ideias, também não poderíamos dizer que em C++ existe alocação dinâmica de memória, uma vez que não existe um renew/realloc.

Mas para usos simples, em que não há necessidade de grandes usos de memória, prefiro um código simples e directo como o que fiz, do que utilizar uma classe pré-definida. Pode ser a minha veia de C++ a falar, mas como disse não gosto de matar moscas com canhões, ou bazucas, nem mesmo pistolas...

E é provavelmente por isso que não gosto de Java, parece que já vem tudo mastigado e é só engolir, não se percebe o que se passa realmente no hardware. E digo Java como poderia dizer qualquer outra linguagem do género.

E vou ficar por aqui, já defendi a minha ideia e a partir daqui ia estar só a repetir o que já disse.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
POO não tem a ver com isto.

Era um exemplo, uma analogia :)

Claro que o mecanismo de GC complica as coisas relativamente ao new do C++; mas pela tua ordem de ideias, também não poderíamos dizer que em C++ existe alocação dinâmica de memória, uma vez que não existe um renew/realloc.

Eu tenho estado a falar de alocação não de realocaçõa, realloc nada tem a ver com o caso.

De tudo o que foi dito, a ideia com que fico é que realmente passaram de C para Java sem perceberem as diferenças.

Mas para usos simples, em que não há necessidade de grandes usos de memória, prefiro um código simples e directo como o que fiz, do que utilizar uma classe pré-definida. Pode ser a minha veia de C++ a falar, mas como disse não gosto de matar moscas com canhões, ou bazucas, nem mesmo pistolas...

Afinal o que estamos a discutir, código mais rápido ou mais correcto, eu tenho estado a defender o mais correcto, e tenho plena consciência de que não é o melhor, mas para explicar primeiro ensinam-se as regras depois ensinam-se como quebrá-las.

Acho que a discussão se perdeu a alguns tópicos atrás, eu estou a falar de umas coisas, voçês já começam a falar de outras ;)

E é provavelmente por isso que não gosto de Java, parece que já vem tudo mastigado e é só engolir, não se percebe o que se passa realmente no hardware. E digo Java como poderia dizer qualquer outra linguagem do género.

Infelizmente aqui tenho de afirmar que a culpa é de quem te ensinou que não o fez correctamente. Em Java, tal como em C, sabes tudo o que se passa, basta ires ler as especificações, da mesma maneira que tens de ler as especificações do compilador e das bibliotecas de C ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei que disse que não ia dizer mais nada, mas parece-me que o assunto já é outro :D

Eu tenho estado a falar de alocação não de realocaçõa, realloc nada tem a ver com o caso.

Mas a ideia do 1º post era realocação, isto é, fazer crescer o array.

Afinal o que estamos a discutir, código mais rápido ou mais correcto, eu tenho estado a defender o mais correcto, e tenho plena consciência de que não é o melhor, mas para explicar primeiro ensinam-se as regras depois ensinam-se como quebrá-las.

Eu gosto de começar pelo mais simples, e aos poucos adicionar complexidade. São gostos :;)

Infelizmente aqui tenho de afirmar que a culpa é de quem te ensinou que não o fez correctamente. Em Java, tal como em C, sabes tudo o que se passa, basta ires ler as especificações, da mesma maneira que tens de ler as especificações do compilador e das bibliotecas de C ;)

Não me ensinaram Java. Nas aulas ensinavam Java, mas eu praticamente não fui lá :) Já tinha umas luzes, e a ideia que tenho de Java ganhei-a através de auto-aprendizagem.

No entanto tenho colegas que foram às aulas e enquanto uns gostaram do que aprenderam (aqueles que acham que C/C++ e principalmente apontadores são uma seca), outros estão na mesma posição que eu (os que gostam de apontadores). Enfim, são gostos ;)

Em Java não podes dizer "ah e tal, quero escrever neste endereço de memória", porque o gestor de memória trata disso. Ok, agora vou-me esticar um bocado: tenta programar um 8051 em Java. Não há compiladores sequer, e porquê? Porque não há gestor de memória de Java que aguente uma plataforma com 256 bytes de RAM, ou no máximo 64K de memória externa. E pronto acabei de me esticar.

Now I sleep!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora