| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2006 13:56:41
|
arianrp
Entusiasta Java
![[Avatar]](/images/avatar/7dd11ae2d5ed34925bdbdc9b01866349.jpg)
Membro desde: 22/07/2005 09:33:02
Mensagens: 22
Offline
|
Ok pessoal,
vc estão falando de passagem por referência dentro da própria linguagem : de Java para Java , de C/C++ para C/C++.
E se for Java para C/C++???
Eu tenho a seguinte situação:
eu quero acessar objetos no Java pelo C via JNI usando passagem por referência pois o volume de dados pode ser imenso e eu não quero ter que fazer a JVM duplicar minhas variáveis na memória passando parâmetros por valor pra lá e pra cá.
O que acontece é que temos uma DLL desenvolvida em C e ela é utilizada em uma linguagem que aceita acesso direto a ponteiros, o que fazemos então é fornecer para a DLL os endereços dos valores a serem calculados e depois é só pegar os resultados.
Estamos estudando a migração do sistema para Java, vamos continuar usando essa DLL até que se tenha tempo e dimdim pra migrar toda o código.
Com JNI eu consigo acessar objetos Java e seus atributos,mas acho que ainda assim é por valor.
Vejam nesse código :
Se para modificar uma variavel em uma classe java eu preciso usar o metodo SetXXXField isso cheira a passagem por valor. Na verdade só pode ser passagem por valor.
Na própria assinatura de um método JNI em C temos o parâmetro que referencia o ponteiro da estrutura JNIEnv, que faz referência ao endereço na memória a uma estrutura com as funções JNI da JVM. Isso é uma prova de que é possível utilizar passagem por referência entre Java e C.
Ta certo que é a própria implementação da JVM, é muito baixo nível, mas por mais baixo nível que seja, deve haver uma forma disponível para referenciar um endereço de memória.
Eu vi em algum lugar que isso se faz utilizando-se arrays, mas ainda não encontrei nenhum material esclarecedor que falasse sobre isso.
alguém manja???
|
SCJP, SCJA, ACE Flex 3
http://blog.arianpasquali.com
http://twitter.com/arianpasquali |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2006 14:04:55
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
A semântica da passagem de parâmetros não varia se você usa código nativo (public native etc...) ou não.
A passagem de objetos do Java para o Java, ou para o JNI/C++ é sempre passar uma referência por valor.
Não há cópia ou clonagem de objetos (passagem do OBJETO por valor).
Algo que é possível em C# mas não em Java, por exemplo, é passar uma referência por referência:
Mas em Java só é possível passar essa referência por valor:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2006 16:36:00
|
cesarse
Thread.start()
Membro desde: 25/02/2005 11:22:51
Mensagens: 46
Offline
|
Eu vi em algum lugar que isso se faz utilizando-se arrays, mas ainda não encontrei nenhum material esclarecedor que falasse sobre isso
Aqui tem algo. Basicamente, você tem que passar um array de tamanho 1 (se você passar um tipo primitivo, não consegue mudar o valor dentro da biblioteca em C, se passar um array, pode - eu acho isso gambiarra, mas funciona bem).
Nesse exemplo, você tem uma classe java que dobra o valor da variável:
E agora, o código da biblioteca:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 16:12:32
|
klein
Smalltalk
Membro desde: 27/02/2008 14:51:50
Mensagens: 2
Localização: Nova Santa Rita / Rio Grande do Sul / Brasil
Offline
|
Olha, sou novo do mundo do Java e já abandonei o C/C++, porem uma das vantagens que me lembro em relação ao uso de ponteiros em C/C++ era na passagem de parâmentros para algu método. Ponteiros deixava a tarefa mais rápida, visto que não era necessário passsar todo o "pacote" para o método. Mas e em Java como fica. Por exemplo: caso eu tenha que passar uma lista emcadeada com 500 nodos para um método, como faço???
Abraço a todos!!!
OBS: Essa postagem não é uma crítica a qualquer um dos envolvidos no diálogo. Apenas pergunto porque repito, sou novo no mundo do Java e tenho algumas dúvidas.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 16:20:13
|
feltraco
JavaEvangelist
![[Avatar]](/images/avatar/0ed83ca5894f30aed6da389d630d89a3.png)
Membro desde: 17/08/2007 14:22:17
Mensagens: 372
Localização: Foz do Iguaçu
Offline
|
Essa discussão denovo
NNNNÃÃÃÃÃÃÃOOOOO....
rs rs rs rs
|
Juliano Feltraco
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 16:24:54
|
klein
Smalltalk
Membro desde: 27/02/2008 14:51:50
Mensagens: 2
Localização: Nova Santa Rita / Rio Grande do Sul / Brasil
Offline
|
Sei que não devo "remexer o passado", mas minha dúvida ainda não foi respondida!!!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 17:32:23
|
qmx
JavaGuru
Membro desde: 14/02/2007 10:49:14
Mensagens: 212
Localização: Sampa
Offline
|
vc tá passando só a referencia do objeto que está dentro do heap da vm
pode continuar a dormir tranquilo
e chega de ressuscitar posts!!!
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 17:40:49
|
danieldestro
Moderador
![[Avatar]](/images/avatar/a5bfc9e07964f8dddeb95fc584cd965d.png)
Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline
|
Ele só passa uma cópia do valor se o argumento for do tipo primitivo.
Mesmo que seja passado um array de primitivos, ele passa referência, pois um array é um objeto.
|
gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2008 19:11:57
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
De modo geral, se você pensar bem como é que o Java funciona, ele trabalha mais com ponteiros que o próprio C++. Estranho? Não. É que em C++ é possível você passar objetos por valor:
E isso não é possível em Java - você só pode passar , por valor, uma referência a um objeto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/01/2009 12:07:27
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Mesmo sendo esse um tópico bem antigo faço questão de dar minha opinião.
No contexto de linguagens de programação, ponteiro é uma variável capaz de armazenar o endereço de outra variável.
Entrando no contexto de C++, ponteiro é também uma variável capaz de armazenar o endereço de outra variável E que permite a conhecida artimética de ponteiros.
Pensando dessa forma, analise a seguinte frase:
Java tem ponteiros que não permitem aritmética de ponteiros.
O que tem de errado nisso tudo?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2010 21:54:32
|
Plig
What is classpath?
Membro desde: 18/09/2009 00:12:12
Mensagens: 7
Offline
|
Oh... Não é sobre as conversas de antes de todos. Mas posto aqui neste post, pois vejo que mesmo o post estando antigo, temos várias cabeças com várias opiniões interessantes que já deram a este, um grande conteúdo em conhecimento sobre o assunto.
Vocês mais velhos na linguagem, entendem melhor sobre a linguagem. DE NOVO: Eu não tô aqui para reviver a MESMA QUESTÃO que foi iniciada neste post, estou aqui para aproveitar o grande conteúdo deste, e adicionar algo mais.
Estou ciente de que posts antigos não devem ser revividos. Mas pensem neste papilo antigo como conhecimento. Um conhecimento que foi discutido durante tempos e tempos por profissionais de todas as áreas e muitos que conhecem a essência da linguagem de programação. Então não vejo motivo para não aproveitar este caderninho de anotações e incrementar alguma coisa nele. Acredito que conhecimento não deve ser jogado fóra assim, de maneira tão "crua". Por isso não acho necessidade em criar um novo post sobre isso. Provavelmente iam vir falando: "lá vem de novo outro com a mesma *2$¨*". Então também foi por isso.
Mas antes que alguém venha com argumentos contra os meus, peço logo desculpa por estar sendo talvez um ignorante e ter achado que poderia aproveitar isso.
------------------------ MINHA DÚVIDA -------------------------
Acredito que muitos aqui já leram o livro "Java como programar 6ª edição" da editora Deitel. Eu estava começando a estudar o uso da classe RandomAccessFile e notei que na página 526, a classe de nome WriteRandomFile, na linha 84, tem um comando que de acordo com o livro (o autor e, não eu) fala que este comando tem um ponteiro ou uma espécie de ponteiro (eu não sei o que ele quis dizer, essa é minha dúvida. Afinal eu não entendo de ponteiros muito bem). Eu não entendi pois deus e o mundo diz que não existem ponteiros em Java. Eu concordo (pelos argumentos apresentados aqui por todos), mas, eu gostaria de entender qual a intenção do livro de dizer isso por exemplo:
"O aplicativo nas figuras 14.26-14.27 grava os dados em um arquivo que é aberto com o modo rw (para leitura e gravação). Ele utiliza o método seek RandomAcessFile para posicionar a localização exata no arquivo em que um registro das informações é armazenado. O método seek configura o ponteiro de posição no arquivo, como um local específico no arquivo relativo ao começo do arquivo, e o método RandomAcessAccountRecord write gera saída dos dados na posição atual no arquivo. O programa supõe que o usuário não insere números de conta duplicados."
Depois no segundo parágrafo da página 528, ele diz isso:
"As linhas 84-85 chamam o método RandomAcessFile seek para posicionar o ponteiro de posição no arquivo na localização do objeto output de acordo com o byte calculado por (accountNumber - 1) * RandomAccessAccountRecord.SIZE. Os números de conta nesse programa estão no intervalor de 1-100. Subtraímos um do número de conta ao calcular a localização de bytes do registro."
Olha eu não tô querendo colocar o código da classe toda pois acredito que vocês têm esse livro. Mas eu vou colocar como está a linha 84:
output é um objeto RandomAcessFile.
accountNumber é uma variável criada que receberá um número de 1 a 100 do usuário que deseja criar uma conta.
RandomAcessAccountRecord é uma classe criada anteriormente cujo sua função é ler um registro e/ou armazenar dados ao arquivo (que é gerado depois).
Eu no começo pensei que ele multiplicava, já não tinha entendido. Mas quando ele mencionou a palavra ponteiro, aí piorou...
Se alguém puder me ajudar, eu ficaria realmente feliz e grato. Tô aqui para tirar dúvida, não gerar brigas e etc...
Obrigado pela atenção de todos.
This message was edited 2 times. Last update was at 04/02/2010 21:58:56
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 08:27:59
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline
|
saoj wrote: Java tem ponteiro sim, só que aqui o nome é referencia. Vc só não tem acesso direto ao endereço de memória que ele representa, e por isso vc não pode manipular esse endereço. A sun pode, através da class sun.misc.Unsafe.
A sun podia liberar isso para nós...
This message was edited 1 time. Last update was at 05/02/2010 08:48:49
|
www.citrox.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 09:53:46
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Plig wrote:
Eu no começo pensei que ele multiplicava, já não tinha entendido. Mas quando ele mencionou a palavra ponteiro, aí piorou...
Troque a palavra "ponteiro" (a tradução é realmente infeliz) por "cursor" ou "índice". Você fica mais à vontade?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 09:57:50
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline
|
entanglement wrote:
Plig wrote:
Eu no começo pensei que ele multiplicava, já não tinha entendido. Mas quando ele mencionou a palavra ponteiro, aí piorou...
Troque a palavra "ponteiro" (a tradução é realmente infeliz) por "cursor" ou "índice". Você fica mais à vontade?
Acho que apontador seria mais indicado.
|
www.citrox.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 16:37:19
|
Plig
What is classpath?
Membro desde: 18/09/2009 00:12:12
Mensagens: 7
Offline
|
entanglement wrote:
Plig wrote:
Eu no começo pensei que ele multiplicava, já não tinha entendido. Mas quando ele mencionou a palavra ponteiro, aí piorou...
Troque a palavra "ponteiro" (a tradução é realmente infeliz) por "cursor" ou "índice". Você fica mais à vontade?
Oh! Com certeza! Brigado pela ajuda entanglement!!! Tipo, bem... Eu acho que entendi... Na verdade ele meio que estaria escolhendo a posição de cada registro no arquivo? Seria isso?
E qual o motivo dele ter multiplicado todo aquele fuzoê ali? Ele diminuiu o número da conta do usuário por um, e logo em seguida, multiplicou isso por 72 (SIZE tem como valor 72). Um amigo meu me disse que esse 72 serve como valor máximo de cada registro. O livro diz que isso serve como consulta rápida e que os registros ficam melhor organizados e mais fáceis de serem achados em um arquivo (O assunto é Arquivo de acesso aleatório). Mas novamente, não entendi o cálculo que ele fez. De acordo com isso, o resultado seria x - 1 * 72 (onde x está entre 1 e 100. 100 é o máximo número de usuários que podem existir). Juro que não entendi o motivo deste cálculo. Perdão se for algo besta que eu não tenha prestado atenção. Mas eu não entendi.
OBS: Estou num exemplo em que ele cria registro e tenta colocar em um arquivo.dat. Ele utiliza várias classes para manipular este arquivo.
Mais uma vez, agradeço a atenção de todos, de coração mesmo.
Abraços!
|
|
|
 |
|
|