Autor Wątek: Wskaźnik na typ liczbowy czy możliwy ?  (Przeczytany 3220 razy)

Offline prociomen007

  • Użytkownik

# Styczeń 29, 2013, 10:04:40
Witam, szukam informacji ( i nic konkretnego nie mogę ustalić ) czy w tym języku da się zrobić wskaźnik na typ liczbowy np. Float. Ogólnie chodzi mi o następującą sytuację.

Mamy jakąś klasę nazwijmy ją Vector3 która posiada trzy składowe typu Float x,y,z; Z tej klasy tworzymy sobie wektor danych w sposób Vector<Vector3> dane; Następnie dane z takiego wektora dodatkowo przepisujemy do jakiejś tablicy Float. Czyli Float[] tablica; Chciałbym teraz aby po zmianie jakiegoś elementu w Vector dane automatycznie dana zmieniała mi się w tablicy. W C++ można zrobić to bardzo prosto używając wskaźników. Tutaj kombinuje na wszelkie sposoby i niestety wartość zmieniona w "vector dane" nie skutkuje automatycznie zmianą w talbicy.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

# Styczeń 29, 2013, 10:26:41
Float, Int i rodzina są immutable. Twoim problemem jest nie tyle "wskaźnik" (bo to jest możliwe, nawet Ci się udało :)) tylko "zmiana wartości" - a to już możliwe nie jest. Kiedy przypisujesz zmiennej typu Float nową wartość, tak naprawdę zmieniasz wskaźnik na nowy obiekt typu Float.

Pewnie chciałbyś mieć pola dane.x, dane.y, dane.z, prawda? No to klopsik, Java Ci tego raczej nie pozwoli... ale jeśli zdecydujesz się na metody dane.getX(), dane.setX(), to już da się zrobić :)

Liosan

Offline Xion

  • Moderator
    • xion.log

# Styczeń 29, 2013, 10:40:24
Zgaduję, że to czego potrzebujesz to tak naprawdę:
public class Vector3 {
    private float x, y, z;

    public float[] toArray() {
        return new float[] { x, y, z };
    }
}
Jeśli koszt tworzenia takiej tablicy jest nie do przyjęcia... wróć... jeśli zmierzyłeś że czas tworzenia tej tablicy jest wąskim gardłem, to pewnie musisz napisać Vector3 jako "widok" kawałka istniejącej tablicy, tj.:
public class Vector3 {
    private float[] array;
    private int offset;

    public Vector3(float[] array, int offset) { ... }

    public float getX() {
        return array[offset];
    }
    public float getY() {
        return array[offset + 1];
    }
    // ...
}

Offline Liosan

  • Redaktor

# Styczeń 29, 2013, 10:55:03
Zgaduję, że to czego potrzebujesz to tak naprawdę:
Hm, ja spodziewałem się raczej, że to jest jakaś implementacja VBO albo czegoś podobnego - że nie sama wydajność kopiowania wartości jest problemem, ale potrzeba "widoku" na większą tablicę. Coś w stylu array-of-structures (jak w C, w ciągłym kawałku pamięci), z aktualizacjami działającymi de facto w dwie strony. Wtedy tylko drugie rozwiązanie ma sens.

Liosan

Offline prociomen007

  • Użytkownik

# Styczeń 29, 2013, 11:56:57
Rzeczywiście chodzi tu o VBO i aktualizację wierzchołków. W C tak jak wspominałem mogę utworzyć wektor z niego dane przypisać do tablicy VBO i jeśli trzeba coś aktualizować wystarczy że zmieniam dane w wektorze a tablica sama się aktualizuje ( bo defakto wskazuje na to samo ). Tutaj muszę wszystko przepisywać od nowa i dzieje się to dużym kosztem dla procesora. Jeśli będzie powiedzmy 200 wierzchołków ( co jest śmiesznie małą ilością ) to jeśli renderuje obraz z prędkością 60 klatek na sekundę wychodzi że muszę w ciągu sekundy przepisać 12000 wierzchołków. A operacja w rzeczywistości jest zbędna bo nic nowego nie wnosi z tond szukam możliwości wskazywania na tą tablicę.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +1
# Styczeń 29, 2013, 12:55:00
Cytuj
że nie sama wydajność kopiowania wartości jest problemem
Ale czasem bywa. :)

Offline owyn

  • Użytkownik

# Styczeń 29, 2013, 13:12:38
W Javie nie ma wskaźników na typy prymitywne, więc takie coś jak w C++ nie przejdzie. Można opakować floata we własną klasę, np.:
class MutableFloat {
public float value;
}
Jeśli użyjesz tablicy takich obiektów, możesz to osiągnąć. Nie sądzę aby było to bardzo wydajne (utworzysz w ten sposób wiele obiektów w pamięci), ale jeśli dobrze zrozumiałem pierwszy post i używasz obecnie tablicy Floatów, to i tak to robisz.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 29, 2013, 13:43:30
Cytuj
Jeśli użyjesz tablicy takich obiektów, możesz to osiągnąć.
W Javie nie ma tablic obiektów, więc nie możesz tego osiągnąć.

Offline Xender

  • Użytkownik

# Styczeń 29, 2013, 14:26:50
Mowa o OpenGL-owym VBO czy o czymś jedynie konceptalnie podobnym? Jeśli chodzi o OpenGL, to przecież np. JOGL ma klasy reprezentujące bufory i implementuje glMapBuffer, więc po co pisać własne?
« Ostatnia zmiana: Styczeń 29, 2013, 21:20:32 wysłana przez olo16 »

Offline deadeye

  • Użytkownik

# Luty 23, 2013, 16:04:33
Rzeczywiście chodzi tu o VBO i aktualizację wierzchołków. W C tak jak wspominałem mogę utworzyć wektor z niego dane przypisać do tablicy VBO i jeśli trzeba coś aktualizować wystarczy że zmieniam dane w wektorze a tablica sama się aktualizuje ( bo defakto wskazuje na to samo ). Tutaj muszę wszystko przepisywać od nowa i dzieje się to dużym kosztem dla procesora. Jeśli będzie powiedzmy 200 wierzchołków ( co jest śmiesznie małą ilością ) to jeśli renderuje obraz z prędkością 60 klatek na sekundę wychodzi że muszę w ciągu sekundy przepisać 12000 wierzchołków. A operacja w rzeczywistości jest zbędna bo nic nowego nie wnosi z tond szukam możliwości wskazywania na tą tablicę.

Możesz zrobić coś takiego http://pastebin.com/pAjPwy2c

Oczywiście do CreateForArray przekazujesz tablicę która ma już docelową wielkość, czyli wielokrotność 3. Same Vectory nie przechowują danych, są tylko widokiem na elementy w głównej tablicy - dzięki czemu zmiany wartości działają w obie strony.