atarionline.pl MAD-Pascal - Początki - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthorzbyti
      • CommentTime18 Nov 2019 21:11
       
      fpc -Mdelphi -vh -O3 mp.pas
      fpc -Mdelphi -vh -O3 mads.pas
      • 2:
         
        CommentAuthorbocianu
      • CommentTime18 Nov 2019 21:11 zmieniony
       
      pobierz paczki wgetem:
      wget ht tp://mads.atari8.info/mads_210.7z
      wget ht tp://mads.atari8.info/mp_162.7z

      (musiałem dać spacje w ht tp bo AOL zamienia na >link< :D )

      jak nie masz 7zip to zainstaluj:
      sudo apt-get install p7zip-full

      rozpakuj:
      7z e archiwum.7z

      skompiluj zgodnie z instukcją:

      ->link<-
      • 3: CommentAuthortebe
      • CommentTime18 Nov 2019 21:11
       
      fpc -Mdelphi -v -O3 plik.pas

      pod 'plik.pas' podstaw 'mads.pas' a potem 'mp.pas'

      potem stwórz pliki bash które uruchomią kolejno mp z parametrem a na końcu mads-a, Bocianu w instrukcji do Geany to opisywał

      ->link<-
      • 4: CommentAuthorzbyti
      • CommentTime18 Nov 2019 21:11 zmieniony
       
      Nieskromnie polecę swoje skrypty ;) ->link<-
      • 5: CommentAuthorastrofor
      • CommentTime18 Nov 2019 22:11
       
      Bardzo dziekuje za pomoc. Mam plan zeby calosc z dowolnego srodowiska odpalac jedna komenda :
      docker run --rm -it -v $(pwd):/source ktostam/madpascal compile plik.pas

      trzeba do dockerhuba wrzucic cos co instaluje fpc (np: cmplopes/alpine-freepascal) potem dorzucić stuff o którym mi pisaliście. Powinno dzialac.
      • 6: CommentAuthorzbyti
      • CommentTime18 Nov 2019 22:11 zmieniony
       
      @astrofor nie chcę się wymądrzać bo ostatni raz pracowałem z tym 3 lata temu a kontenery przygotowywali sysopi ale nie wydaje mi się Twoje podejście właściwe.

      Jeszcze raz skorzystaj z mojej rady. Przygotuj kontener z Ubuntu. Możesz z niego robić później przenośny image.

      Jak koniecznie chcesz się pobawić możesz zmodyfikować dockerfile tak by się instalowało co potrzeba jako kolejne warstwy na Ubuntu, nawet z tym co Ci @bocianu napisał i mieć od razu kontener z mads i mp.

      Na końcu będziesz sobie tylko podmotowywał katalog ze źródłami i kompilował.

      Tak jak ty chcesz robić to ja nie wiem ja to się będzie linkować?!

      O ile pamiętam kompilacja źródeł musiała być w kontekście kontenera a nie po za nim jak to ty chcesz zrobić.

      Ale może zrobisz tak jak chcesz i będzie Ci wygodnie? ;) Pobawię się chwilę dockerem.
      • 7: CommentAuthorzbyti
      • CommentTime18 Nov 2019 23:11 zmieniony
       
      @astrofor a może Ci się jednak uda? :D

      Mad Pascala skompilowałem Twoją metodą:

      ➜  docker run --rm -v `pwd`:/tmp frolvlad/alpine-fpc fpc -Mdelphi -v -O3 /tmp/mp.pas 
      Free Pascal Compiler version 3.0.4 [2017/10/03] for x86_64
      Copyright (c) 1993-2017 by Florian Klaempfl and others
      Target OS: Linux for x86-64
      Compiling /tmp/mp.pas
      mp.pas(346,51) Note: Values in enumeration types have to be ascending
      mp.pas(597,5) Note: Local variable "i" is assigned but never used
      mp.pas(19627,16) Note: Local variable "AllocElementType" is assigned but never used
      mp.pas(19628,5) Note: Local variable "NumAllocElements" is assigned but never used
      mp.pas(23719,5) Note: Local variable "NumAllocElements" is assigned but never used
      mp.pas(23953,22) Note: Local variable "AllocElementType" is assigned but never used
      mp.pas(23955,1) Warning: Function result variable does not seem to initialized
      mp.pas(29262,3) Note: Local variable "NumAllocTypes" not used
      Linking /tmp/mp
      /usr/bin/ld: warning: link.res contains output sections; did you forget -T?
      31056 lines compiled, 8.6 sec
      1 warning(s) issued
      7 note(s) issued
      • 8: CommentAuthorastrofor
      • CommentTime18 Nov 2019 23:11
       
      @zbyti: No ja wlasnie chce tak zrobic jak mowisz. chce zmodyfikowac dockerfile bazujacego na linuxie FROM alpine:3.7 albo ubuntu
      i udostepnic go z dockerhuba.
      • 9: CommentAuthorzbyti
      • CommentTime18 Nov 2019 23:11 zmieniony
       
      @atstrofor kto bogatemu zabroni? :D

      Ale to może zamiast ciągnąc mp i mads za pomocą wget to bierz od razu git-em źródła?

      Jednak po za linuxem docker wszędzie stoi na wirtualnej maszynie, więc puszczenia tego z palca za każdym razem trochę było by nieefektywne.

      Ja bym jednak miał uruchomiony kontener z podmontowanym katalogiem na którym pracuję.

      A dobra, pewnie jak się wgryżiesz w temat to zrobisz jak Ci się marzy ;)
      • 10: CommentAuthorastrofor
      • CommentTime18 Nov 2019 23:11 zmieniony
       
      @zbyti: zachecam do eksperymentow: sciagamy ->link<-
      jako starter zapisujemy lokalnie , i odpalamy: docker build .
      Ze mnie to jest zaden sysop i takie rzeczy ida mi jak krew z nosa .

      Moim zdaniem to nie musi byc szybkie. Calosc ma za zadanie raz na jakis czas kompilowac plik pascala. Jezeli chodzi o instalacje to kazdy blok RUN sie cash-uje.


      Ale ubuntu jest sporo większy. Ale jak znam zycie to itak bede musial zaminic, bo bedzie sporo pakietow do instalacji, a ubuntu ma o wiele wieksze zasoby apt-install.
      • 11: CommentAuthorzbyti
      • CommentTime18 Nov 2019 23:11 zmieniony
       
      Kiedyś się bawiłem ;)

      Może bym i to ogarnął tylko po co?

      Taka rada (coś kojarzę jakie zalety ma alpine, że mały i szybki) robił bym na definicji kontenera Ubuntu ;)

      A dobra, zrobię w ramach treningu, ty rób na alpine ja na Ubuntu LTS ;)
      • 12: CommentAuthorzbyti
      • CommentTime18 Nov 2019 23:11 zmieniony
       
      @astrofor po za fpc nic nie będziesz potrzebował ;) Dobra, podejmuję wyzwanie robię na alpine :D

      EDIT: żartowałem ;)
      • 13: CommentAuthorastrofor
      • CommentTime19 Nov 2019 00:11
       
      uzywasz ->link<- ?
      • 14: CommentAuthorzbyti
      • CommentTime19 Nov 2019 00:11 zmieniony
       
      @astrofor nie, nie używam, dobra jutro to ogarnę, czas uderzyć w kimono :)

      I może załóżmy osobny wątek bo szkoda tu spamować.
      • 15: CommentAuthorzbyti
      • CommentTime19 Nov 2019 01:11 zmieniony
       
      @astrofor jak sobie jeszcze tego nie zrobiłeś to możesz dokończć ;) ja już mam obraz alpine ze skompilowanym Mad Pascalem ;) Czyli dołożenie reszty to banał.

      Kod poniższy można oczywiście uporządkować, pobrane źródła wyrzucić etc. ale to przecież umiesz zrobić, logika jak to robić dalej myślę, że jest widoczna ;)

      Dockerfile
      FROM alpine:3.7

      MAINTAINER Carlos Lopes "cmplopes67@gmail.com"

      ENV FPC_VERSION="3.0.4" \
      FPC_ARCH="x86_64-linux"

      RUN apk add --no-cache binutils git && \
      cd /tmp && \
      wget "ftp://ftp.hu.freepascal.org/pub/fpc/dist/${FPC_VERSION}/${FPC_ARCH}/fpc-${FPC_VERSION}.${FPC_ARCH}.tar" -O fpc.tar && \
      tar xf "fpc.tar" && \
      cd "fpc-${FPC_VERSION}.${FPC_ARCH}" && \
      rm demo* doc* && \
      \
      # Workaround musl vs glibc entrypoint for `fpcmkcfg`
      mkdir /lib64 && \
      ln -s /lib/ld-musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 && \
      \
      echo -e '/usr\nN\nN\nN\n' | sh ./install.sh && \
      find "/usr/lib/fpc/${FPC_VERSION}/units/${FPC_ARCH}/" -type d -mindepth 1 -maxdepth 1 \
      -not -name 'fcl-base' \
      -not -name 'rtl' \
      -not -name 'rtl-console' \
      -not -name 'rtl-objpas' \
      -exec rm -r {} \; && \
      rm -r "/lib64" "/tmp/"*

      RUN apk add --no-cache bash bash-doc bash-completion

      RUN cd /tmp && \
      git clone ->link<- && \
      cd Mad-Pascal && \
      fpc -Mdelphi -v -O3 mp.pas && \
      cp mp /bin/

      WORKDIR /source

      CMD mp -iV

      ➜  docker images
      REPOSITORY TAG IMAGE ID CREATED SIZE
      <none> <none> 9703b2fc9a12 21 minutes ago 109MB

      ➜ docker run --rm -v `pwd`:/tmp 9703b2fc9a12 mp
      Mad Pascal Compiler version 1.6.3 [2019/11/19] for 6502
      Syntax: mp <inputfile> [options]
      -d Diagnostics mode
      -define:symbol Defines the symbol
      -ipath:<x> Add <x> to include path
      -code:address Code origin hex address
      -data:address Data origin hex address
      -stack:address Software stack hex address (size = 64 bytes)
      -zpage:address Variables on the zero page hex address (size = 24 bytes)

      Czyli wszystko cyka ;)

      EDIT: no to parę przydatnych poleceń jakie kiedyś sobie zanotowałem ;) 2 polecenia w 2 rożnych zapisach jak się nabałagani to można użyć ;)

      docker rm $(docker ps -qa)
      docker container rm $(docker ps -qa)
      docker rmi $(docker images -q)
      docker image rm $(docker images -q)
      • 16: CommentAuthorMADRAFi
      • CommentTime19 Nov 2019 04:11 zmieniony
       
      po 1 catalina bardzo ladnie uzywa fpc i da sie kompilowac. Mam to postawione na swoim mac :)
      po 2 sugeruje uzywac podmana zamiast dockera :)
      niby to samo ale podman jest uzywany w najlepszych dystrubucjach, czyli opartych na RH :)
      • 17: CommentAuthorzbyti
      • CommentTime19 Nov 2019 07:11 zmieniony
       
      @MADRAFi zaznaczaj proszę, że odpowiadasz @astrofor bo zaspany już zacząłem Ci odpisywać, że na kiego mi ten podman skoro od 2 tyg już mi wszystko działa na Ubuntu :D
      • 18: CommentAuthorastrofor
      • CommentTime19 Nov 2019 11:11
       
      super wilkie dzieki , mads.pas nie ma gdzies na gicie ?
      • 19: CommentAuthorzbyti
      • CommentTime19 Nov 2019 11:11
       
      w tym samym miejscu tylko inne repo ;)
      • 20: CommentAuthorastrofor
      • CommentTime19 Nov 2019 16:11 zmieniony
       
      nie da sie usunac wpisu w aol ?
      • 21: CommentAuthorzbyti
      • CommentTime19 Nov 2019 16:11 zmieniony
       
      Skąd pewność, że Mad Pascal będzie szukał potrzebnych mu bibliotek tam gdzie wskazałeś?

      Dla mnie prościej jest trzymać to w jakimś folderze jako całość i zrobić link symblioczny, np:

      RUN cd /root && \
      git clone ->link<- && \
      cd Mad-Pascal && \
      fpc -Mdelphi -v -O3 mp.pas && \
      ln -s /root/Mad-Pascal/mp /bin/mp

      WORKDIR /source

      CMD mp -iV

      Wtedy wszystko gra:

      docker run --rm -v `pwd`:/tmp acb25c894b1e mp /tmp/80col.pas
      Mad Pascal Compiler version 1.6.3 [2019/11/19] for 6502
      Compiling /tmp/80col.pas
      /root/Mad-Pascal/lib/graph.inc (672) Warning: lo/hi(dword/qword) returns the upper/lower word/dword
      /root/Mad-Pascal/lib/graph.inc (673) Warning: lo/hi(dword/qword) returns the upper/lower word/dword
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8235 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8240 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8245 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8250 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8255 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8260 must be between 0 and 65535)
      /tmp/80col.pas (36) Warning: Range check error while evaluating constants (8265 must be between 0 and 65535)
      /tmp/80col.pas (37) Warning: Range check error while evaluating constants (8270 must be between 0 and 65535)
      /tmp/80col.pas (63) Warning: Comparison might be always true due to range of constant and expression
      /tmp/80col.pas (32) Note: Local const 'CHAR_SPACE' not used
      81 lines compiled, 1.00 sec, 11111 tokens, 1064 idents, 305 blocks, 6 types
      11 warning(s) issued
      1 note(s) issued


      EDIT: no i skasowałeś co napisałeś i teraz nie wiadomo o co chodziło ;P
      • 22: CommentAuthorastrofor
      • CommentTime19 Nov 2019 18:11 zmieniony
       
      Ok ku memu zdziwieniu udalo mi sie zapakowac wszystko w jedna linie. Wystarczy miec zainstalowanego dockera no i oczywiscie gre starydom.pas :
      opdalamy:
      docker run --rm -v `pwd`:/tmp astrofor/madpascal starydom
      i powinniśmy dostać starydom.xex w obecnym katalogu.

      @zbyti: przepraszam, skasowalem bo sam rozwiazalem problem. Mialem zle scieżki wpisane
      • 23: CommentAuthorzbyti
      • CommentTime19 Nov 2019 18:11 zmieniony
       
      @astrofor no i pięknie, gratuluję! :)

      To milej zabawy :]

      EDIT 1: to jeszcze zrób sobie alias do tego wywołania dockera i zamiast 'run' daj 'start' by ci się za każdym razem nie tworzył nowy kontener, czy jak to tam działało ;)

      EDIT 2: a teraz sprawdź czy nie miałem racji na samym początku, pisząc, że możesz mieć problem z budowaniem czegoś bardziej złożonego. Do kontenera przekazujesz sobie tylko plik.pas. Nie powinno to umieć szukać plików inkludowanych czy własnych unitów. Jeżeli mam rację to wróć do koncepcji podmontowywania folderu ze źródłami. Do przetestowania mój projekt w załączniku. Obstawiam, żę Ci się nie zbuduje ;)
      • 24: CommentAuthorastrofor
      • CommentTime19 Nov 2019 19:11
       
      @zbyti : dzieki -v `pwd`:/tmp mapujemy current directory z podkatalogami do tmp w dockerze. Dzieki temu dziala wszystko cacy, chessboard sie skompilowal i odpalil (ps. fajnie ten chessboard wyglada)
      • 25: CommentAuthorzbyti
      • CommentTime19 Nov 2019 19:11 zmieniony
       
      Faktycznie, pwd wypluwa current directory, przyklejałem i nie patrzyłem co :D

      No to jak Ci wszystko cyka to naprzód. Za miesiąc widzę Stary Dom 2 :D
      • 26: CommentAuthorastrofor
      • CommentTime19 Nov 2019 21:11 zmieniony
       
      czy w mad pascalu mozna zdefiniowac tablice struktur ? cos jak(przyklad nie dziala ):
      motocykl = record
      marka : string;
      symbol : string[10];
      predkoscmax : integer;
      END;
      garaz = array[0..2] of motocykl;

      edit: ok da sie zrobic tak :
      A, B, C, D :motocykl;
      To powinno wystarczyc.

      Edit:

      Nie no lipa potrzebuje tablicy a dostaje : Error: Only Array [0..2] of ^RECORD supported
      • 27: CommentAuthorzbyti
      • CommentTime19 Nov 2019 21:11 zmieniony
       
      @astrofor ja obszedłem ten problem jak robiłem tablicę tablic.

      Rekord jest wskaźnikiem, więc zapewne można:

      garaz = array[0..2] of word;
      • 28: CommentAuthorastrofor
      • CommentTime19 Nov 2019 23:11
       
      Chcialem troche to obejsc i zrobic cos takigo jak w phppie - $$a = 1; Ale doczytalem ze w paskalu nie ma dynamicznych nazw zmiennych , wiec jedyne co pozostaje to tablica rekordow, ktorej nie umiem zainicjalizowac.
      • 29: CommentAuthorzbyti
      • CommentTime19 Nov 2019 23:11 zmieniony
       
      1. ->link<-

      2. ->link<-

      Spróbuj tego, pisałem wyżej.

      W moim kodzie chessboad masz jak sobie zrobiłem tablicę elementów własnego typu i jak się po niej poruszałem. Jak to robić w ostatniej wersji niedawno napisał @tebe.

      Czy ten wątek czytasz od początku? Może warto, może już padały pytania które chcesz zadać?
      • 30: CommentAuthorastrofor
      • CommentTime19 Nov 2019 23:11 zmieniony
       
      To nie jest to o co mi chodzi. Bo tworzac tablice tablic jestem ograniczony do pojedynczego typu danych drugiej tablicy. Np same integery , a ja potrzebuje rekordu.
      Zaimplementowalem to tak, ale nie jestem dumny z tego kodu :
      var
      p1,p2,p3,p4,currentplayer:player;
      currentplayerindex:shortInt;

      type
      player = record
      inventory, weaponName: TString;
      x, y: byte; // player position
      currentLocation: byte;
      weapon, wounds: shortInt;
      gold: smallInt;
      score: cardinal;
      strength, energy: real;
      END;

      procedure switchCurrentPlayerVar;
      begin
      case currentplayerindex of // dla zmiennej A typu CHAR
      0: begin currentplayer := p1 end;
      1: begin currentplayer := p2 end;
      2: begin currentplayer := p3 end;
      3: begin currentplayer := p4 end;
      end;
      // tutaj bedzie cyklicznie
      currentplayerindex := currentplayerindex+1;
      end;

      edit: jak się wrzuca w komentarzu kod mad pascala ?
      • 31: CommentAuthorzbyti
      • CommentTime20 Nov 2019 00:11 zmieniony
       
      W pamięci rekord reprezentowany jest przez wskaźnik (POINTER).

      ->link<-

      Co oznacza, że możesz sobie podstawiać pod zmienną typu record to co wyjmiesz z tablicy typu word.

      Dobra, nie podejmuję się wyjaśniać dalej, kombinuj, skoro wiesz, że to Ci nie pomoże.

      Poczytaj o BB code ->link<-
      • 32: CommentAuthortebe
      • CommentTime20 Nov 2019 00:11
       
      [code]
      Array [0..2] of ^RECORD
      [code]
      to oznacza że można tworzyć tablicę ale tylko ze wskaźnikami do rekordu, pod RECORD podstaw nazwę swojego rekordu

      dostęp do takiej tablicy jest tak samo szybki jak do 'array [0..x] of word'
      • 33: CommentAuthorastrofor
      • CommentTime20 Nov 2019 00:11 zmieniony
       
      @tebe: No wlasnie to nie dziala
      motocykl = record
      marka : string;
      symbol : string[10];
      predkoscmax : integer;
      END;
      garaz = array[0..2] of motocykl;


      @zbyti: dzięki!
      • 34: CommentAuthorzbyti
      • CommentTime20 Nov 2019 01:11 zmieniony
       
      a co Ci nie działa? Mi się kompiluje ;)

      program hello;
      uses crt;

      type
      motocykl = record
      marka : string;
      symbol : string[10];
      predkoscmax : integer;
      END;

      var
      garaz : array[0..2] of ^motocykl;

      begin
      Writeln('Hello ATARI!');
      ReadKey;
      end.

      Czytaj co ci kompilator pisze ;)

      garaz = array[0..2] of motocykl;

      No ten zapis nie zadziała i to z 2 powodów.
      • 35: CommentAuthortebe
      • CommentTime20 Nov 2019 01:11 zmieniony
       
      ^ ptaszek ma znaczenie ;)

      ptaszek z lewej strony etykiety to wskaźnik
      • 36: CommentAuthorzbyti
      • CommentTime20 Nov 2019 01:11 zmieniony
       
      i ':' zamiat '='
      • 37: CommentAuthorastrofor
      • CommentTime20 Nov 2019 11:11 zmieniony
       
      type
      player = record
      gold: smallInt;
      score: cardinal;
      END;
      var
      players : array[0..3] of ^player;
      begin
      players[0].gold := 3;
      players[1].gold := 4;
      writeln('1p,players[0].gold);
      writeln('2p',players[1].gold);
      end.

      Wydaje mi się że każdy element tablicy wskazuje ten sam pointer. Bo
      players[0].gold i players[1].gold maja wartosc 4, jak to naprawic aby:
      players[0].gold = 3, players[0].gold = 4 ?
      • 38: CommentAuthorzbyti
      • CommentTime20 Nov 2019 11:11 zmieniony
       
      program hello;
      uses crt;

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      players : array[0..3] of ^player;
      playerOne : player;
      PlayerTwo : player;

      begin
      playerOne.gold := 2;
      playerTwo.gold := 7;

      players[0] := @playerOne;
      players[1] := @playerTwo;

      writeln('1p gold = ', players[0].gold);
      writeln('2p gold = ', players[1].gold);

      ReadKey;
      end.

      Poczytaj ->link<-
      • 39:
         
        CommentAuthorbocianu
      • CommentTime20 Nov 2019 12:11
       
      Ja bym to tak zrobił :)

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      player0 : player;
      Player1 : player;
      Player2 : player;
      Player3 : player;
      players : array[0..3] of ^player = (@player0, @player1, @player2, @player3);

      • 40: CommentAuthorzbyti
      • CommentTime20 Nov 2019 12:11 zmieniony
       
      @bocianu testowałem ten manewr przy swoim chessboard.

      Twoja konstrukcja (chociaż wydaje się sensownie zapisana) da Error: Illegal expression.

      Można tak robić gdy player0 jest stałą a tablica jest typu word wtedy nie trzeba @.
      • 41:
         
        CommentAuthorbocianu
      • CommentTime20 Nov 2019 13:11
       
      musze to sprawdzić - jestem przekonany, że juz takie rzeczy robiłem
      • 42: CommentAuthorzbyti
      • CommentTime20 Nov 2019 13:11
       
      • 43: CommentAuthorastrofor
      • CommentTime20 Nov 2019 14:11
       
      mam jeszcze jedno pytanie :
      program hello;
      uses crt;

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      players : array[0..3] of ^player;
      playerOne : player;
      PlayerTwo : player;
      currentplayer: ^player;

      begin


      players[0] := @playerOne;
      players[1] := @playerTwo;

      currentplayer := players[0];
      currentplayer.gold := 3;
      currentplayer := players[1];
      currentplayer.gold := 4;

      writeln('1p gold = ', players[0].gold);
      writeln('2p gold = ', players[1].gold);

      ReadKey;
      end.



      czemu 1p gold = 4 a 2p gold = 0 ?
      • 44: CommentAuthorzbyti
      • CommentTime20 Nov 2019 14:11 zmieniony
       
      Jako przyczynek do zadumy zamieszczam :D Chyba pokazuje kierunek i w czym problem ;)

      writeln(word(@currentplayer)) pomaga kompilatorowi :D

      program hello;
      uses crt;

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      players : array[0..3] of ^player;
      playerOne : player;
      PlayerTwo : player;
      currentplayer : ^player;

      begin
      players[0] := @playerOne;
      players[1] := @playerTwo;

      currentplayer := players[0];
      currentplayer.gold := 1;
      writeln(word(@currentplayer));

      currentplayer := players[1];
      currentplayer.gold := 8;
      writeln(word(@currentplayer));

      writeln('1p gold = ', players[0].gold);
      writeln('2p gold = ', players[1].gold);

      ReadKey;
      end.
      • 45: CommentAuthorzbyti
      • CommentTime20 Nov 2019 15:11 zmieniony
       
      Zwiększanie wskaźnika przez INC zwiększy go o rozmiar typu na jaki wskazuje. Zmniejszenie wskaźnika przez DEC zmniejszy go o rozmiar typu na jaki wskazuje. Jeśli typ jest nieokreślony, wówczas domyślną wartością zwiększania/zmniejszanie będzie 1.

      ->link<-

      program hello;
      uses crt;

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      players : array[0..3] of ^player;
      playerOne : player;
      PlayerTwo : player;
      currentplayer : ^player;

      begin
      players[0] := @playerOne;
      players[1] := @playerTwo;

      currentplayer := players[0];
      currentplayer.gold := 1;

      Inc(currentplayer);
      currentplayer.gold := 8;

      writeln('1p gold = ', players[0].gold);
      writeln('2p gold = ', players[1].gold);

      ReadKey;
      end.

      Teraz tylko połączyć kropki i rozwiązanie gotowe ;)
      • 46: CommentAuthorastrofor
      • CommentTime20 Nov 2019 16:11 zmieniony
       
      Ok zaduma średni wyszła. Odkryłem że fix do mojego programu to writeln(word(@currentplayer)); bez tego program zle dziala. Nie bardzo rozumiem czemu rzutować ^player(wskażnik) na word, na pewno coś to naprawia.
      Czy word(@currentplayer) stale zmienia typ currentplayer na word (chyba tak)? czy tylko na potrzeby writeln ?

      edit: ok rozumiem o co chodzi z inc dla wskaznikow. I ze twoje rozwiazanie dziala - zmienia wskaznik na nastepny element tablicy, ale na chlopski rozum currentplayer := players[1]; tez powinno dzialac.

      W skrucie rozumiem rozwiazanie z posta 45, ale nie rozumim zupelnie z 44
      • 47: CommentAuthorzbyti
      • CommentTime20 Nov 2019 16:11 zmieniony
       

      astrofor:

      Odkryłem że fix do mojego programu to writeln(word(@currentplayer));

      Sam na to wpadłeś? Czy mój kod pomógł? ;) Według mnie to w jakiś sposób naprowadza kompilator. @tebe będzie wiedział dlaczego przypadkiem tak jest.

      word(@currentplayer) - nie zmienia typu, tym bardziej na stałe. Proszę przeczytaj na spokojnie dokumentację jaką napisał @tebe.

      Co do reszty to @tebe nam przewodnikiem ;) trzeba poczekać, aż się wypowie dlaczego intuicyjna konstrukcja nie działa.

      EDIT: podawanie nr. postów to też ryzykowna sprawa, jak ktoś napisał coś do Ciebie na priv to zalogowany masz inną numerację etc. Ja dopiero wylogowany zobaczyłem o co Ci chodzi :D
      • 48: CommentAuthorastrofor
      • CommentTime20 Nov 2019 19:11 zmieniony
       
      @zbyti: Sam na to wpadłeś?
      Pewnie że sam, przecież to oczywiste że żeby zadziałało currentplayer.gold := 8; trzeba najpierw użyć  writeln(word(@currentplayer)) ;) , a wlasnie zeby nie drukowac smieci to zastapilem to :
      if(word(@currentplayer)=word(@currentplayer))then  write('');
      moze ktos zna prostszy fix ?
      • 49: CommentAuthorzbyti
      • CommentTime20 Nov 2019 20:11
       
      Ja bym poczekał na @tebe a jak chcesz zrobić workaround to można zrobić to lepiej ;)
      • 50: CommentAuthorzbyti
      • CommentTime20 Nov 2019 21:11 zmieniony
       
      @astrofor wszystko jest OK, po prostu źle piszemy. @tebe już mi to tłumaczył ->link<- prawidłowo powinno być tak:

      program hello;
      uses crt;

      type
      player = record
      gold : smallInt;
      score : cardinal;
      end;

      var
      players : array[0..3] of ^player;
      playerOne : player;
      PlayerTwo : player;
      currentplayer : ^player;

      begin
      players[0] := @playerOne;
      players[1] := @playerTwo;

      currentplayer := players[0];
      currentplayer^.gold := 1;

      currentplayer := players[1];
      currentplayer^.gold := 8;

      writeln('1p gold = ', players[0].gold);
      writeln('2p gold = ', players[1].gold);

      ReadKey;
      end.