hgter Opublikowano 11 Lutego 2017 Udostępnij Opublikowano 11 Lutego 2017 Witajcie W gm mogę przechowywać tablicę w tablicy: GML t[0]=12 t[1]=13 t[2]=14 u[0]=45 u[1]=46 u[2]=47 q[0]=t q[1]=u Tylko jak potem odczytać zawartość? Wszystko poniżej nie działa: GML //chcę odczytać wartość 12 w=q[0][0] w=q[0].[0] w=q[0[0]] Czy jedyny sposób to: GML w=q[0] a=w[0] ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gibki Kaktus Opublikowano 11 Lutego 2017 Udostępnij Opublikowano 11 Lutego 2017 Tak, to jedyny sposób, nie rozumiem co chciałeś osiągnąć tym, co nie działa u Ciebie... A i btw: GML w=q[0] a=w[0] O ile tutaj w=q[0] podziała, to tyle a=w[0] już nie, ponieważ w nie jest tablicą. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 11 Lutego 2017 Udostępnij Opublikowano 11 Lutego 2017 Takie coś tylko na strukturach ds_ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 12 Lutego 2017 Autor Udostępnij Opublikowano 12 Lutego 2017 Tak, to jedyny sposób, nie rozumiem co chciałeś osiągnąć tym, co nie działa u Ciebie... No wiesz skoro gm pozwala przechowywać tablice w tablicach (a pozwala - w debugerze widać to dokładnie - w miejscu komórek 0 i 1 są tablice) to zakładałem, że jest bezpośrednia droga dostępu, analogicznie jak np. podczas przechowywania id obiektu w tablicy i odczytu jego zmiennych. Skoro pod q[0] tak naprawdę jest tablica, to odniesienia q[0[0]] i q[0][0] mogłyby być logiczne (tu drugie o ile się nie mylę działa np. w JavaScript w podobnej sytuacji). A gdy nie działały, użyłem metody dostępu takiej jak przy przechowywaniu id obiektu: q[0].[0] Wynikało to z tego, że gm pozwala to zapętlić: GML t[0]=12 t[1]=13 t[2]=14 u[0]=45 u[1]=46 u[2]=47 q[0]=t q[1]=u t[3]=q ///O dziwo to nie daje błędu!</span> Po tym mam tablicę t w tablicy q, która jest znowu w tablicy t i tak parę razy (nie w nieskończoność - około 4 razy). Czyli wygląda, że gdy damy tablicę w tablicy to przechowywane jest tylko odniesienie (bo się zapętla potem). Tym bardziej, że w debugerze przy tablicach jest kilku znakowy kod (nie wiem czy to id czy jakiś adres), który jest inny dla każdej utworzonej tablicy, ale przy takim "zapętleniu" tablice w niższych pętlach mają taki sam numer jak w wyższych. Stąd próba jak przy obiektach. O ile tutaj w=q[0] podziała, to tyle a=w[0] już nie, ponieważ w nie jest tablicą. Nie masz racji. To jak najbardziej działa. I po tym "w" staje się tablicą. I na końcu "a" ma wartość 12. Tyle, że chciałem prościej. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 12 Lutego 2017 Udostępnij Opublikowano 12 Lutego 2017 Nie masz racji. To jak najbardziej działa. I po tym "w" staje się tablicą. I na końcu "a" ma wartość 12. Tyle, że chciałem prościej.cooooo? Chyba niezbyt rozumiesz kod który napisałeś, nie przekazujemy w ten sposób adresu tablicy tylko jej aktualna wartość, a "w" nie staje się tablicą Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 12 Lutego 2017 Autor Udostępnij Opublikowano 12 Lutego 2017 cooooo? Chyba niezbyt rozumiesz kod który napisałeś, nie przekazujemy w ten sposób adresu tablicy tylko jej aktualna wartość, Tu masz oczywiście rację - jeżeli po wykonaniu w=q[0] zmienimy zawartość "w" to nie zmieni się "q". EDYCJA Okazało się to bardziej skomplikowane. Na końcu sam siebie poprawiam. EDYCJA Choć całość dziwnie się zachowuje przy zapętleniu. Serio danie t[3]=q powinno wygenerować błąd albo po prostu przypisać aktualny stan "q" do t[3] a nie tworzyć samozapętloną tablicę. I ponadto "t[3]=q" tworzy zapętloną tablicę także w "q"! Czyli działa tak jakby jednak przechowywany był adres a nie same wartości. Bo zmieniam "t", ale zmiana pojawia się w "q" (w dodatku zapętlona). Co więcej jeżeli przed "t[3]=q" zrobię kopię tablicy "q" np. dając "tt=q" to po "t[3]=q" zapętlenie pojawi się także w kopii. A jeżeli po tym wszystkim dam t[0]=999999 to wartość 999999 pojawi się we wszystkich miejscach (czyli w t,q i tt). Jeżeli to nie jest przechowywanie adresu a nie wartości to nie wiem co jest. EDYCJA Na końcu postu udało mi się to w końcu zrozumieć. EDYCJA a "w" nie staje się tablicą Już druga osoba mi to pisze więc może się rzeczywiście mylę. Ale powiedzcie mi gdzie. Wykonuję taki kod: GML t[0]=12 t[1]=13 t[2]=14 u[0]=45 u[1]=46 u[2]=47 q[0]=t q[1]=u q[2]=88 q[3]=99 Na końcu (patrzę w debugerze) mam zmienną q oznaczoną jako tablica, która po rozwinięciu w komórkach 0 i 1 ma tablice a w 2 i 3 wartości 88 i 99. Potem robię GML w=q[0] a=w[0] I pojawia mi się zmienna "w" która jest opisana jako tablica (array) i zawiera 3 komórki (o wartościach 12 13 i 14), oraz zmienna "a" o wartości 12. Dlaczego twierdzicie, że "w" nie jest tablicą? EDYCJA: Ale jak zmienię po wszystkim "t" to zmiana przeniesie się do "w". Natomiast wyzerowanie "t" już się nie przeniesie (podobnie jeżeli coś zmienie w "w"). Czyli rzeczywiście pierwotnie "w" nie jest tablicą tylko zawiera odniesienie do tablicy t (przechowywane w q[0]). Dopiero po zmianie jakiejś wartości w "w" albo usunięciu tablicy t tworzy się oddzielna kopia danych. Muszę przyznać, że dowiedziałem się czegoś nowego. Myślałem, że jeżeli mam tablicę "x' i zrobię "y=x" to w "y" pojawi się kopia tablicy "x" a nie tylko odniesienie do "x". A wychodzi na to, że dopiero jakaś zmiana wykonana na "y" tworzy oddzielną kopię. I to nie jest do końca tak, że po y=x po prostu x i y zawierają odniesienie do miejsca w pamięci. Bo zmiana x zmieni też y, ale zmiana y nie zmieni x. Teraz szukam o tym i znalazłem https://www.reddit.com/r/gamemaker/comments..._copying_works/ EDYCJA Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 12 Lutego 2017 Udostępnij Opublikowano 12 Lutego 2017 Mój błąd;) pomyliło mi się z C gdzie int Tab[3] = { 12, 13, 14 }; int Zmienna = Tab; Gdzie zieminna będzie zawierała pierwszy element Tab który nie zmieni się po zmianie wartości tablicy, dawno nie używałem Gm'a :D E: C w sumie też i nie jestem pewien czy zeczywiscie tak jest ;P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 12 Lutego 2017 Autor Udostępnij Opublikowano 12 Lutego 2017 Mój błąd;) pomyliło mi się z C gdzie int Tab[3] = { 12, 13, 14 }; int Zmienna = Tab; Gdzie zieminna będzie zawierała pierwszy element Tab który nie zmieni się po zmianie wartości tablicy, dawno nie używałem Gm'a biggrin.gif E: C w sumie też i nie jestem pewien czy zeczywiscie tak jest ;P Ech mam podobnie :D Nawyki z innych języków czasem dają śmieszne efekty. Najbardziej brakuje mi operacji na macierzach z matlaba. Coś nie mogę się do ds_ przekonać choć na chłodno wyglądają na bardzo przydatne. Ale walcząc z tym problemem teraz, przynajmniej nauczyłem się żeby bardzo uważać w gm z przypisywaniem tablic typu x=y. Można sobie zrobić cholerny problem masakrycznie trudny do znalezienia. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 12 Lutego 2017 Udostępnij Opublikowano 12 Lutego 2017 Wydaje mi się że żeby nie kopiowało tablicy to trzeba użyć akcessora '@' ale w sumie to tego nie używałem i nie wiem jak to dokładnie działa więc tylko wspomnę tutaj że coś takiego istnieje: http://docs.yoyogames.com/source/dadiospic.../accessors.html Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 13 Lutego 2017 Administratorzy Udostępnij Opublikowano 13 Lutego 2017 Pamiętajcie, że GMS2 pozwala na tablicę w tablicy. Bardzo mozliwe, że runner od GM1.4 też na to pozwala (nawet jeśli niektóre składnie GM zgłasza jako błędne), ponieważ runnery są współdzielone (ten od GMS1.4 prawdopodobnie obsługuje też layery...). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 13 Lutego 2017 Autor Udostępnij Opublikowano 13 Lutego 2017 Pamiętajcie, że GMS2 pozwala na tablicę w tablicy. Bardzo mozliwe, że runner od GM1.4 też na to pozwala (nawet jeśli niektóre składnie GM zgłasza jako błędne), ponieważ runnery są współdzielone (ten od GMS1.4 prawdopodobnie obsługuje też layery...). Dzięki za info. Rzeczywiście, za stroną New Functions List: arrays can be nested inside arrays such as var a = [1,2,[3,4]]; Ale nie mogę znaleźć tam informacji jak miałby wyglądać odczyt w takiej sytuacji. Jest może dostępna jakaś większa dokumentacja do gm2? I całkiem z ciekawości: czy to jest tak, że w gm2 doszły tablice w tablicach czy po prostu doszła nowa możliwość ich inicjowania? Bo nie mogę w dokumentacji gm1 nic znaleźć. Ponadto, skoro mówisz, że runner będzie ten sam, to czyli jeżeli udało się uzyskać dostęp do jakiejś nowych możliwości gm2 z poziomu gm1 (tak jak teoretycznie mi teraz z tymi tablicami w tablicach) to będą działać, ale nowe funkcje dostępne w gm2 nie będą możliwe do wywołania z poziomu gm1? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się