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
     
    fpc -Mdelphi -vh -O3 mp.pas
    fpc -Mdelphi -vh -O3 mads.pas
    • 2:
       
      CommentAuthorbocianu
    • CommentTime18 Nov 2019 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
     
    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 zmieniony
     
    Nieskromnie polecę swoje skrypty ;) ->link<-
    • 5: CommentAuthorastrofor
    • CommentTime18 Nov 2019
     
    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 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 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
     
    @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 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 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 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 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
     
    uzywasz ->link<- ?
    • 14: CommentAuthorzbyti
    • CommentTime19 Nov 2019 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 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 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 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
     
    super wilkie dzieki , mads.pas nie ma gdzies na gicie ?
    • 19: CommentAuthorzbyti
    • CommentTime19 Nov 2019
     
    w tym samym miejscu tylko inne repo ;)
    • 20: CommentAuthorastrofor
    • CommentTime19 Nov 2019 zmieniony
     
    nie da sie usunac wpisu w aol ?
    • 21: CommentAuthorzbyti
    • CommentTime19 Nov 2019 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 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 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
     
    @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 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 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 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
     
    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 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 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 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
     
    [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 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 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 zmieniony
     
    ^ ptaszek ma znaczenie ;)

    ptaszek z lewej strony etykiety to wskaźnik
    • 36: CommentAuthorzbyti
    • CommentTime20 Nov 2019 zmieniony
     
    i ':' zamiat '='
    • 37: CommentAuthorastrofor
    • CommentTime20 Nov 2019 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 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
     
    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 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
     
    musze to sprawdzić - jestem przekonany, że juz takie rzeczy robiłem
    • 42: CommentAuthorzbyti
    • CommentTime20 Nov 2019
     
    • 43: CommentAuthorastrofor
    • CommentTime20 Nov 2019
     
    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 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 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 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 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 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
     
    Ja bym poczekał na @tebe a jak chcesz zrobić workaround to można zrobić to lepiej ;)
    • 50: CommentAuthorzbyti
    • CommentTime20 Nov 2019 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.