TheMarcQ Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 W jaki sposob zrobic tak, zeby do pliku byly zapisywane liczby w postaci 2-bajtowej zamiast domyslnych liczb 8-bajtowych ktorych uzywa GM? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 Poczytaj o obsłudze plików binarnych (na końcu): https://gmclan.org/index.php?wiki=article&zm=56 I jeszcze o operatorach bitowych: https://gmclan.org/index.php?czytajart=72 I po prostu w jednym bajcie zapisuj 8 bitów liczby, a w drugim kolejne jej 8 bitów. Kolejny bajt to pierwsze 8 bitów kolejnej liczy i następny bajt to kolejne 8 bitów tej liczby. W ten sposób z każdej liczby zapisujesz tylko 16 bitów (2 bajty) zamiast wszystkich 64. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 Tak się składa, że jak zapiszesz sobie liczbę do pliku np. 2 To to zajmuje 1 bajt... nie 8. Każdy znak tekstowy zajmuje 1 bajt - 8 bitów. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 @pablo: pliki binarne Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 No to w takim razie ja nie widzę problemu, bo tu nigdzie nie jest napisane, żęby GM zapisywał odrazu 8 bajtowego zapisu. file_bin_write_byte(fileid,byte) Zapisuje bajt danych do pliku o podanym id. 1 bajt, więc co za problem? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 @pablo: GM zapisuje liczby w formacie long, czyli 8-bajtowe(64 bity) dzieki czemu moze zapisac bardzo duze liczby z zakresu <-9 223 372 036 854 775 808 - 9 223 372 036 854 775 807>, mi potrzebne sa liczby 2-bajtowe(16 bitow) z zakresu <-32 768 - 32 767> do edytora map do gry w javie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 No ale funkcja którą wkleiłem z tego artykułu mówi wyraźnie, że zapisuje tylko 1 bajt :/. Teraz tak się zastanawiam, jak "rozerwać" liczbę na 8 bitowe częśći... Hmmm zerkne jeszcze do tego artu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 juy mam roywiayanie: >> - przesunięcie w prawo Działanie niemal identyczne jak w przypadku poprzedniego operatora. Tutaj jednak wszystkie bity przesuwane są w prawo, a z lewej strony pozostają nam zera. 45 0101101 45 >> 3 0000101 wystarczy jako drogi zapisywany bajt podac zmienna z przesunietymi o 8 pozycji bitami E:* juz mam rozwiazanie, ctrl+shift to zuo! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 No właśnie to jest marne rozwiązanie bo taka liczba z GMa o ile rozumiem wygląda sobie tak: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 0000 0000 Czyli 64 bity Teraz jak sobie przesuniesz to o 8 miejsc w prawo to będzie 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 a GM i tak zapisze cały ten zaj****cie długi ciąg do pliku bo nigdzie nie jest powiedziane, że pierwsze zera pominie. Nie mam pojęcia jak to zrobić :D JAK wyciągnąć sobie to pierwsze 1100 0000 a później 0000 0000 i pozniej kolejne 0000 0000 z tej liczby :D. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 wlasnie chyba pominie, bo zapisze jedynie 8 ostatnich bitow(ostatnich?) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 To by nie miało żadnego logicznego sensu... Tutaj trzeba experta! Tymon!!! Dobrze by jeszcze było, żeby ktoś wyjaśnił co się podaje jako drugi argument w tej funkcji z zapisem bajta, bo przecież jak podasz sobie liczbę 103456 to to jest na więcej niż 1 bajcie :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 albo rozwiazania polubownego, narazie bede probowal to robic na wartosciach jedno bajtowych(przedzial 255 do -255) pozniej moze jak ktos bardziej to rozumiejacy(tymon wlasnie np.) cos sie rozwiaze ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 Więc, sam się bawiłem plikami binarnymi w GMie: Funkcja 'file_bin_write_byte' zapisuje tylko(!) 1 bajt(8 pierwszych bitów). Dobrze by jeszcze było, żeby ktoś wyjaśnił co się podaje jako drugi argument w tej funkcji z zapisem bajta, bo przecież jak podasz sobie liczbę 103456 to to jest na więcej niż 1 bajcie :DW drugim argumencie podaje się wartość dla 1 bajta (0-255...), jeśli więc podasz wartość wyższą niż pozwala na to 1 bajt, zapisane pozostaje tylko pierwszych 8 bitów(!) Zatem, aby zapisać 2 bajty do pliku, trzeba posłużyć się operatorami bitowymi: bajt1 = (wartosc >> 0) & $FF; bajt2 = (wartosc >> 8) & $FF; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 a po co jest & $FF; bo poza tym napisales to samo co ja 2posty temu Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Marca 2011 Administratorzy Udostępnij Opublikowano 26 Marca 2011 O to chodzi? GML f = file_bin_open('test.txt',1); liczba = 29876; file_bin_write_byte(f,liczba & $FF); file_bin_write_byte(f,(liczba >> 8) & $FF); file_bin_close(f); f = file_bin_open('test.txt',0); liczba = 0; liczba = file_bin_read_byte(f); liczba = liczba | (file_bin_read_byte(f) << 8 ); file_bin_close(f); show_message(string(liczba)); game_end(); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 @TheMarcQ: wartosciach jedno bajtowych(przedzial 255 do -255) Mylisz się. Od 0 do 255 lub od -127 do 128. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 dziala idealnie, dzieki wszystkim za pomoc :bye1: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 Dołączam się do pytania po co jest & $FF :D? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 To oznacza, że pobierze tylko 8 ostatnich bitów. l1 = 65467564 l2 = (l1 >> 8) & $FF (= 244) 11111001101111010010101100 l1 00000000111110011011110100 l1 >> 8 00000000000000000011111111 & $FF ------------------------ 00000000000000000011110100 l2 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 wystarczylo powiedziec jaka wartosc ma $ff, wiem co to iloczyn logiczny Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 Spytałeś, po co jest '& $FF'. Myślałem, że znasz system szesnastkowy. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Marca 2011 Administratorzy Udostępnij Opublikowano 26 Marca 2011 $FF to jest to samo co 0xFF, czyli zapis szesnastkowy liczby 255 - bo GM takowy obsługuje, chociaż w dokumentacji jest to w mało widocznym miejscu wspomniane. A & $FF to jest operacja and binarnie. Zgodnie z zasadami algebry Boole'a, aby w liczbie wyzerować jakieś pozycje, należy wykonać operację AND, wstawiając zera tam gdzie zerujemy, a jedynki tam gdzie nie chcemy nic zmieniać. Ze względu na to jak działa and, tam gdzie jest zero w liczbie czy w masce, zawsze pozostanie zero, więc jeśli zero przejdzie przez maskę jedynki nadal pozostanie zerem, a jeśli jedynka przez maskę zera, to stanie się zerem. W związku z tym jedynki przejdą tylko tam gdzie liczba i maska mają jedynkę, a zera nadal pozostaną zerami mimo jedynkowej maski. liczba 10101010 maska &00111100 wynik =00101000 Z kolei aby z jakiejś liczby przepisać jedynki do drugiej, wystarczy zrobić operację OR, czyli | - tam gdzie pojawi się jedynka której wcześniej nie było zostanie ona przepisana. liczba 10101010 maska |00111100 wynik =10111110 Edit: pewnie to wiecie, ale tłumaczenie to dla tych co nie wiedzą :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 . Myślałem, że znasz system szesnastkowy. znam i nie przyszlo mi do glowy ze to o niego chodzi, nigdy ie operowalem w kodzie szesnastkowym w GM Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 26 Marca 2011 Udostępnij Opublikowano 26 Marca 2011 System szesnastkowy przydaje się, gdy chce się zapisać kod jakiegoś koloru - zamiast jakichś trudnych do zapamiętania liczb masz ładnie zapisane w kodzie szesnastkowym. I tak: niebieski to $FF0000 zielony - $00FF00 czerwony - $0000FF I jest mnóstwo kombinacji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 26 Marca 2011 Autor Udostępnij Opublikowano 26 Marca 2011 wiem, stosuje to w php, css itp. a w gm wystarczaly mi zwyczajne c_black, c_whte, c_yellow itp 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ę