Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   26 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
  • 0
hgter

Dostęp do tablicy w tablicy

Pytanie

hgter    5

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]

 

?

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

10 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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ą.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
ediepl    4
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ą

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
ediepl    4

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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.

 

 

 

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
gnysek    31

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...).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×