Android - Page 3

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Re: Android


Quoted text here. Click to load it

Ja to wiem i ty to wiesz ale czemu oddaje pamięć przed końcem funkcji? tfu
metody i to jeszcze "likely" :-)


Re: Android
On Wed, 9 Feb 2011 21:35:20 +0100,  Lelek@ wrote:
Quoted text here. Click to load it

Przed koncem ? Raczej powinna przed poczatkiem - jak rozumiem to
getBytes alokuje nowy bufor na odpowiedz.

Przy odrobinie optymalizacji moze nawet nie alokuje wtedy gdy wyraznie
piszesz new ..

J.




Re: Android


Quoted text here. Click to load it


byte buf[] = Tak 256 razy. Nie wiem co
to zmieni, bo samego byte buf[256] sie nie da w javie.
Nie rozumiem różnicy.


Re: Android

Quoted text here. Click to load it

Ktoś na pl.comp.programming zapodał żeby zadeklarować  ten buf[] jako final
hmmm. Czyżby w javie można tym zakazać wtrącać się w tę tablicę ? To i ma w
pewnym stopniu sens. Zaraz sprawdzę :-)


Re: Android
W dniu 2011-02-09 19:59 Lelek@ napisał(a):

Quoted text here. Click to load it
[...]
Quoted text here. Click to load it

Hmmm, coś chyba ściemniasz. Skopiowałem twój przykładowy kod i odpaliłem
w emulatorze 2.2. Na głównej aktywności mam kontrolkę edycyjną o nazwie
"editText1". Tak wygląda cała metoda (podpiąłem jej wywołanie pod
naciśnięcie dodatkowego przycisku):

public void test() {
    EditText editText = (EditText) findViewById(R.id.editText1);
    String fromEditText = editText.getText().toString();

    byte buf[] = new byte[256];
    int bfx[] = new int[256];
    int i, len;

    try {
        buf = fromEditText.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return;
    }

    len = buf.length;

    for (i = 0; i < len; i++) {
        bfx[i] = ((int)buf[i] & 0xFF);
        Log.d("TEST", "BYTE: " + bfx[i]);
    }
}

Znajduje się tu wszystko, co przytoczyłeś plus dodatkowy kod na początku
do odczytania ciągu znaków z kontrolki edycyjnej. Początkowe
zaalokowanie bufora buf nie ma znaczenia bo metoda getBytes() i tak
zwraca tablicę bajtów i zmienna buf zostanie nadpisana. Prościej jest
nie deklarować tej zmiennej na początku tylko dopiero gdy jest
potrzebna, np:
    byte buf[] = fromEditText.getBytes("UTF-8");

W każdym razie uruchomienie daje spodziewane rezultaty. Gdy kontrolka
jest pusta to nic się nie wywala, metoda getBytes() zwraca pustą tablicę
a nie null, w zmiennej len mamy wartość 0 i nic się nie wypisuje.

Natomiast gdy do kontrolki edycyjnej wpiszę jakiś tekst to także
powyższy kod działa zgodnie z oczekiwaniami. Na debugu (to ten magiczny
LogCat, w Eclipse możesz go pokazać wybierając z menu: Window/Show
view/Other/Android/LogCat albo prościej naciskając Ctrl+3 i wpisując
"logcat") jest to pokazywane:

02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 97
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 100
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 97
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 109

Chyba nie unikniesz pokazania większego kawałka kodu aby ustalić co się
wywala właściwie. Możesz spakować cały projekt i wrzucić gdzieś na sieć?

--
Adam Dybkowski
               http://dybkowski.net /

We've slightly trimmed the long signature. Click to see the full one.
Re: Android

Quoted text here. Click to load it



Mam dokładnie tak jak ty masz.
Moja metoda nazywa sie

public void Button1Click(View view) {

}
I w niej to samo.co ty

W XML-u layoutu jest
android:onClick="Button1Click"
I to wszystko.
Z tym sprawdzeniem zera działa jak tego obaj oczekujemy. Wszystko gra.
Sorki ale całości ciężko by było pokazać :-) Wiesz jak jest :-)


Re: Android

No to chyba się wyjasniło

Quoted text here. Click to load it
Tutaj buf jest referencją do twojej tablicy...

Quoted text here. Click to load it
Ale tutaj już buf jest referencją do obiektu zwróconego przez
FromEditText.getBytes(). Wskazanie do tablicy, która zaalokowałeś
zostało stracone i przydzieloną pamięcią zajmie się przy najbliższej
okazji garbage collector.
Powyższy kod jest równoważny takiej linijce:

byte buf[] = FromEditText.getBytes("UTF-8");

Ja bym twój kod przepisał do takiej postaci:

byte buf[] = FromEditText.getBytes("UTF-8");
int bfx[] = nil;
if(buf.length>0)
{
   bfx[] = new int[buf.length];
   for (i = 0; i < buf.length; i++)
   {
     //elementy buf mają po 8 bitów, więc maskowanie 0xff
     //jest trochę bez sensu
     bfx[i] = ((int)buf[i] & 0xFF);
   }
}

if(bfx!=nil)
{
   //robimy cos z bfx
}

Bardzo ważne jest alokowanie pamięci na bfx po odczytaniu zawartości
buf. Przy alokowaniu bfx o stałej długości, dopóki FromEditText.getBytes
zwróci tablicę mniej niż 256 bajtów, program będzie działał poprawnie.
Ale jeśli buf będzie dłuższe niż długość bfx, program wywali się z
błędem dostępu do pamięci przy próbie zapisu pierwszego elementu, który
się nie mieści w bfx.


BTW. próbowałeś przechwytywać wyjątki?

pzdr.
j.

Re: Android


Quoted text here. Click to load it

 if(buf.length>0)  <----------- on tego nie rozumie

dla niego ten buf nie istnieje. Trzeba go zadeklarować globalnie w funkcji

Quoted text here. Click to load it

To nie jest aż tak bez sensu, bo casting signed byte to sign integer kopiuje
8-my bit do 31-go a właściwie rozszerza np (int)0x80 -> FFFFFF80 bo signed a
nie 0x80 :-)


Re: Android
Quoted text here. Click to load it
Zadeklaruj buf tak, żeby był widoczny wszędzie gdzie występują odwołania
do niego. Z kodu, który zacytowałeś wynikało że buf jest deklarowany na
tym samym poziomie zagłębienia co odwołanie do FromEditText.getBytes().
A ifie brakuje jeszcze jednego warunku:
if((buf != nil ) && (buf.length>0))


Quoted text here. Click to load it
A fakt. Zasugerowałem się typem buf i przyjąłem że bfx też jest typu byte :)

pzdr.
j.

Re: Android


Quoted text here. Click to load it

Ta Java to jeden wielki shit :-) Jak się operuje na strumieniach danych
binarnych to w kółko trzeba konwerować to co zwracają funkcje w byte signed
do signed int ale wymaskowywać je. Idiotyzm.

Nie wiem, na razie działa z tym testem czy len jest 0 czy nie, twoich rad
nie umiem zastosować. Nie rozumiem jak mam deklarować ten sam bufor wiele
razy :-) Przeglądam od 10 dni już to co ludzie piszący w javie wyprawiają.
Dokładnie robia to jakby zaczynali progframować w bascomie i nie rozumieją
co czynią :-)
Z tego co się dowiedziałem to Java powstała bo ludzie nie rozumieli
wskaźników i zapominali o zwalnianiu zaalokowanych zasobów :-)


Re: Android
Quoted text here. Click to load it

Shit bo nie umiesz się nią posłużyć. Napisałem w javie dobrych
kilkadziesiąt tysięcy linii i uważam że jest to całkiem przyjemny język.
Inne języki też znam, więc mam porównanie.

 > binarnych to w kółko trzeba konwerować to co zwracają funkcje w byte
 > signed do signed int ale wymaskowywać je. Idiotyzm.

Nie bardzo wiem o co chodzi, ale mam wrażenie że usiłujesz zrobić coś na
około.

Quoted text here. Click to load it
Jak powiesz czego nie rozumiesz, to może będę mógł Ci pomóc. Na razie
widzę że walczysz z samą ideą obiektów.
Bufora nie deklarujesz kilka razy. Samą zmienna buf deklarujesz raz, w
takim miejscu żeby była widoczna ze wszystkich miejsc w których musisz
się do niej odwoływać (ale bez przesady. Najprawdopodobniej wystarczy ze
zadeklarujesz ją lokalnie w funkcji).
Buf w twoim przypadku przechowuje nie sam obiekt, a referencję do niego
(referencja działa troszkę podobnie jak wskaźniki w C, choć to nie do
końca jest to samo). Funkcja FromEditText.getBytes() sama alokuje pamięć
na tablicę zawierającą wynik i zwraca Ci wskazanie na nią. Ta referencja
jest wpisywane do zmiennej buf. Jeśli przed wywołaniem funkcji było w
niej coś innego, poprzednia wartość jest tracona, a w jej miejsce jest
wpisywana wartość zwracana przez przez getBytes. Nie następuje tam żadne
przepisywanie tablic (dlatego nie trzeba wcześniej alokować pamięci).

Wszelkie operacje jakie wykonasz na zmiennej buf po wpisaniu do niej
wartości zwróconej przez getBytes będą wykonywane nie na twojej tablicy,
a na tablicy zaalokowanej wewnątrz funkcji.
Sprawdzanie warunku buf.length jest potrzebne po to, żeby nie tworzyć
tablicy o zerowej długości (przypisanej do bfx).

Quoted text here. Click to load it
Może to ci, którzy przesiadają się na jave z bascoma :) Ja też widziałem
dużo śmieci, ale też bardzo dużo kodu bardzo dobrej jakości.

Quoted text here. Click to load it
Nie tyle zapominali, co woleli się skupić na rozwiązaniu problemu
zamiast babrać się z gospodarką pamięcią. Operując na wskaźnikach bardzo
łatwo z prostego programu stworzyć koszmarek - java stara się do tego
nie dopuścić (a przynajmniej nie przez jeżdżenie po pamięci). Mając do
dyspozycji dużo wolnego ramu, nie trzeba się martwić żeby jak
najszybciej zwolnić przydzielony a nieużywany obszar. Ręczna gospodarka
przydzielaną pamięcią w bardziej skomplikowanych projektach może
przypominać chodzenie po polu minowym. Nic dziwnego że nawet najlepszym
i najbardziej uważnym programistom zdarza się popełnić głupie błędy,
typu nie zwalnianie czegoś czy wielokrotne zwalnianie.
Mechanizm odzyskiwania nieużywaniej pamięci jest implementowany w wielu
językach wysokiego poziomu. Java jest tylko jednym z nich.

pzdr.
j.


Re: Android
Quoted text here. Click to load it

Sam się śmiejesz że Java to takie C ale nie rozumiesz, że robisz
w tej Javie coś w stylu:

char data[100]="abcedefghijklmnoprstuwz";
char * buf = (char*)malloc(100);

a potem robisz coś na kształt:

buf = data;

zamiast

strcpy(buf, data);

I dziwisz się, że nie masz tam tego, co zwróciło malloc(). Pomyśl chwilkę...


Site Timeline