Qual o Equivalente em java para Ponteiro * em C++

17 respostas
JavaX_JavaX

Bom dia !

Pessoal preciso de uma ajudinha de você

tenho a seguinte variavel conforme demonstrada Abaixo que esta em C++

int imgsize = wid*hgt;

e preciso passar isso para Java como poderia fazer isso , como poderia implementar esse Metodo em java.

sei que o asterisco em C++ se trata de um ponteiro , porem o asterisco esta entre duas variaveis wid*hgt qual esta sendo referenciada como ponteiro?

e como poderia transforma isso em codigo java

Grato a Todos

Att JavaX

17 Respostas

drsmachado

Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

JavaX_JavaX

drsmachado:
Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

drsmachado

Bom dia!

perdoa-me a ignorancia

mais poderia me explicar melhor

Att JavaX

ViniGodoy

Esse asterisco é uma multiplicação, não um ponteiro.

O número de pixels de uma imagem é igual a altura (width) * largura (height).

drsmachado

JavaX_JavaX:
drsmachado:
Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

drsmachado

Bom dia!

perdoa-me a ignorancia

mais poderia me explicar melhor

Att JavaX


Vamos voltar à velha e boa matemática.
Quando você tem um operador de igualdade, pode entender que o que está à direita é exatamente igual ao que está à esquerda.
Assim sendo, podemos dizer que

Certo?
Em java a idéia é a mesma, visto que, o operador = torna-se um operador de atribuição.
Desta forma, o que está à direita do = será passado para o que está à esquerda.
Como à esquerda do = temos

int imgsize =

Conclui-se que do outro lado, à direita do =, temos, não um ponteiro, mas, um resultado int.
Entendeu ou quer que desenhe?

ViniGodoy

Ah sim, e respondendo a pergunta do título.

O mais próximo que se tem em java de ponteiros são as variáveis de referência, que apontam para objetos. Entretanto, não é possível fazer aritmética de ponteiros com referências.

No C++, existem também as variáveis de referências, que são similares as referências do Java, mas não podem valer null, nem trocar de valor.

JavaX_JavaX

ViniGodoy:
Esse asterisco é uma multiplicação, não um ponteiro.

O número de pixels de uma imagem é igual a altura (width) * largura (height).

Primeiramente Valeu por ter respondido Vini

bom tem algo muito estranho que não estou conseguindo identificar

porque quando dou um debug em C++

o conteudo das variaveis seguintes sao

imgsize = -858993460

wid = 1391

hgt = 1030

e quando dou debug em Java

imgsize 1432730

wid =1391

hgt = 1030

segue abaixo o codigo em java

public void Snapshot(){
  ArtemisHandle hCam = ConexaoDll() ;
  ArtemisHSC driver =  carregarDrivers() ;
  int ExposureDuration = 100;                                                   // exposure time in milliseconds
  int nImgBuf=0;                                                                // allocated size of buffer
  short[] pImgBuf = null;
  
  
  // Ensure we're connected
	if (hCam == null){
         JOptionPane.showMessageDialog(null, "Erro Camera não está conectando", "Atenção", JOptionPane.ERROR_MESSAGE, null);
	} else {
         JOptionPane.showMessageDialog(null, "Camera Conectada com Sucesso", "Confirmação", JOptionPane.INFORMATION_MESSAGE, null);
        }
	// Don't switch amplifier off for short exposures
        driver.ArtemisSetAmplifierSwitched(hCam, ExposureDuration > 2.5f);

	// Start the exposure
	driver.ArtemisStartExposure(hCam, ExposureDuration*0.001f);

        Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
        
	// Wait until it's ready, or ESC is pressed.
	// A more polished app would not use this method!
	
        while(!driver.ArtemisImageReady(hCam)){

         // 27 Cogigo Tecla Esc
         if (KeyEvent.KEY_PRESSED == 27){
          System.out.println("Saiu do while");
           driver.ArtemisAbortExposure(hCam);
           break;
	 }
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(FuncoesCamera.class.getName()).log(Level.SEVERE, null, ex);
        }
	}

	// We'll keep a local copy of the image so we can refresh the display even if
	// the original copy is lost.

        
        // Get dimensions of image
	IntByReference xRef = new IntByReference(); 
        IntByReference yRef = new IntByReference();
        IntByReference widRef = new IntByReference();
        IntByReference hgtRef = new IntByReference();
        IntByReference binxRef = new IntByReference();
        IntByReference binyRef = new IntByReference();
	// Get dimensions of image
	int x,y,wid = 0,hgt = 0,binx,biny;
	
        driver.ArtemisGetImageData(hCam, xRef, yRef, widRef, hgtRef, binxRef, binyRef);

        x = xRef.getValue();
        y = yRef.getValue();
        wid = widRef.getValue();
        hgt = hgtRef.getValue();
        binx = binxRef.getValue();
        biny = binyRef.getValue();

        Pointer pimg= driver.ArtemisImageBuffer(hCam);
        
        System.out.println("pimg "+pimg); 
	if (pimg != null){
		// make sure we have enough space to store the image
	
            int imgsize = wid*hgt;
       
            System.out.println("imgsize "+imgsize+" "+wid+" "+hgt); 

                
                if (nImgBuf < imgsize){
                 //delete[] pImgBuf;                                              //delete em C++ Serve Para Fazer Limpeza de Memoria no java Não e necessario visto que ele ja faz a limpeza
		 nImgBuf = imgsize;
                 pImgBuf = new short[nImgBuf];
                }
               /*
		memcpy(pImgBuf, pimg, imgsize*2);
                imgW=wid;
		imgH=hgt;
		InvalidateRect(hWnd, NULL, FALSE);
               */ 

 }
	
        Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);

 }    
}

o que poderia ser

Att JavaX

E

O número esquisito ( -858993460 ) é em hexadecimal CCCC CCCC, ou seja, indica que você está rodando em modo “debug” e que, ao atingir o ponto do código que você está debugando, essa variável ainda não foi inicializada com o valor da multiplicação.

JavaX_JavaX

entanglement

Valeu mesmo amigo desculpe a ignorancia , e que estou abrindo o codigo em c++ no Visual estudio

e não tenho afinidade com o debugador , grato mesmo

Att Javax

E

Experimente executar essa linha e visualizar o valor. Vai ver que o valor correto será posto nessa linha.

JavaX_JavaX

é isso mesmo eu tinha testado e deu certo

Valeu mesmo

Att Javax

JavaX_JavaX

drsmachado:
JavaX_JavaX:
drsmachado:
Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

drsmachado

Bom dia!

perdoa-me a ignorancia

mais poderia me explicar melhor

Att JavaX


Vamos voltar à velha e boa matemática.
Quando você tem um operador de igualdade, pode entender que o que está à direita é exatamente igual ao que está à esquerda.
Assim sendo, podemos dizer que

Certo?
Em java a idéia é a mesma, visto que, o operador = torna-se um operador de atribuição.
Desta forma, o que está à direita do = será passado para o que está à esquerda.
Como à esquerda do = temos

int imgsize =

Conclui-se que do outro lado, à direita do =, temos, não um ponteiro, mas, um resultado int.
Entendeu ou quer que desenhe?

drsmachado

Bom quando fiz a pergunta inicial minha duvida era se em C++ o * se tratava de um ponteiro ou um multiplicador

bastava responder multiplicador , sem precisar desenha , como nossos amigos Vini e entanglement fizeram

mesmo assim fico grato pela ajuda.

Att JavaX

E

Bom, de qualquer forma, a sua dúvida não é tão assim trivial, porque você poderia ter algo como:

int x = 10;
int *p = &x;
int q = x ** p;

O que quer dizer o primeiro “" e o segundo "” ? (Dica: C não é Fortran; em Fortran, “**” é usado para exponenciação. Eu sinto falta desse operador em Java porque você é obrigado a usar Math.pow … )

E

A propósito, esse é um exemplo de “aliasing” em C - isso é uma das coisas que atrapalha a otimização de programas em C, porque uma mesma área de memória pode ser compartilhada por duas variáveis. Vamos continuar o exemplo:

int x = 10;  
    int *p = &x;  
    int q = x ** p;  
    printf ("1) %d\n", q); /* o que vai ser impresso aqui? */
    x = 20;
    q  = x ** p; 
    printf ("2) %d\n", q); /* o que vai ser impresso aqui? */
    *p = 30;
    q  = x ** p; 
    printf ("3) %d\n", q); /* o que vai ser impresso aqui? */
JavaX_JavaX

entanglement:
Bom, de qualquer forma, a sua dúvida não é tão assim trivial, porque você poderia ter algo como:

int x = 10;
int *p = &x;
int q = x ** p;

O que quer dizer o primeiro “" e o segundo "” ? (Dica: C não é Fortran; em Fortran, “**” é usado para exponenciação. Eu sinto falta desse operador em Java porque você é obrigado a usar Math.pow … )

Obrigado pela compreensão , estou vendo C++ afundo pela primeira vez , e realmente essa questão do * ser ponteiro e multiplicado e meio confusa

Grato pela ajuda de Todos

E

De fato, “" é a multiplicação se for um operador binário. "” é usado para referenciar ponteiros se for um operador unário. E “*”, em declarações, modifica um tipo , para indicar um ponteiro para esse tipo.

“&” é o endereço se for um operador unário. “&” é “AND” binário se for um operador binário. Em declarações, “&” indica (em C++, não em C) a modificação do tipo, para indicar uma referência para esse tipo.

gomesrod

JavaX_JavaX:
drsmachado:

Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

Vamos voltar à velha e boa matemática.
Quando você tem um operador de igualdade, pode entender que o que está à direita é exatamente igual ao que está à esquerda.
Assim sendo, podemos dizer que

Certo?
Em java a idéia é a mesma, visto que, o operador = torna-se um operador de atribuição.
Desta forma, o que está à direita do = será passado para o que está à esquerda.

bastava responder multiplicador , sem precisar desenha , como nossos amigos Vini e entanglement fizeram


A questão era sobre o significado do operador * . Pela sua resposta supõe-se que a existência do operador de igualdade deixa tudo bastante óbvio, mas isso não é verdade:

int a = *ptr;   // De-referenciando o ponteiro e atribuindo à variável
int b = a * x;  // Multiplicando e atribuindo resultado à variável

Em ambas as sentenças existe um = , e mesmo assim os * tem significados diferentes.
Ou pegando emprestado o exemplo do entaglement, podem ter até dois * juntinhos, cada um com um significado:q = x ** p;

E só para desfazer a confusão, o = do Java (e do C) não é o mesmo que o = da matemática . Em matemática o sinal expressa uma igualdade já existente, não existe uma atribuição (“movimentação”) de valores entre um lado e outro. Talvez seja mais apropriado comparar com o operador ==

JavaX_JavaX

gomesrod:
JavaX_JavaX:
drsmachado:

Notou uma coisinha que muda tudo?
Veja o que existe antes do operador =…

Vamos voltar à velha e boa matemática.
Quando você tem um operador de igualdade, pode entender que o que está à direita é exatamente igual ao que está à esquerda.
Assim sendo, podemos dizer que

Certo?
Em java a idéia é a mesma, visto que, o operador = torna-se um operador de atribuição.
Desta forma, o que está à direita do = será passado para o que está à esquerda.

bastava responder multiplicador , sem precisar desenha , como nossos amigos Vini e entanglement fizeram


A questão era sobre o significado do operador * . Pela sua resposta supõe-se que a existência do operador de igualdade deixa tudo bastante óbvio, mas isso não é verdade:

int a = *ptr;   // De-referenciando o ponteiro e atribuindo à variável
int b = a * x;  // Multiplicando e atribuindo resultado à variável

Em ambas as sentenças existe um = , e mesmo assim os * tem significados diferentes.
Ou pegando emprestado o exemplo do entaglement, podem ter até dois * juntinhos, cada um com um significado:q = x ** p;

E só para desfazer a confusão, o = do Java (e do C) não é o mesmo que o = da matemática . Em matemática o sinal expressa uma igualdade já existente, não existe uma atribuição (“movimentação”) de valores entre um lado e outro. Talvez seja mais apropriado comparar com o operador ==

valeu mesmo tudo que eu puder saber sobre c++ esta sendo valido

Att JavaX

Criado 24 de maio de 2013
Ultima resposta 24 de mai. de 2013
Respostas 17
Participantes 5