Action! Pointer


Action! Pointer

von FlorianD » Mo 20. Mär 2017, 10:15
hat nicht so direkt mit Programmierungsfragen zu tun...
gestern das erste mal "unfallfrei" eine komplizierte Anwendung von POINTERn in Action! hingekriegt. Wenn man das dann endlich mal kapiert hat, ist es eine riesige Hilfe beim Programmieren. Z.B. Weitergabe von Variablen über mehrere PROC/FUNCs ist simpel möglich. Werde beizeiten mal ein paar Beispiele einstellen.

Re: Action! Pointer

von eda70 » Mi 22. Mär 2017, 11:48
Ich nutze Pointer gerne um Daten direkt im Bildschirmspeicher zu schreiben oder zu manipulieren.
Hier eine Funktion, die in einem auf dem Bildschirm dargestellten Zahlenraster, bestimmte Zahlen durch Invertieren markiert. Da die Zahlen zweistellig ausgegeben werden, werden auch immer beide Ziffern invertiert.
Zuerst wird die Position der Zahl ermittelt, dann diese mittels Pointer angesprochen:
Code: Alles auswählen
Proc markieren()
BYTE y,z
CARD POINTER PBS
  CRSIN=1
  FOR X=1 TO 6
  DO
    Z=LZAHLEN(X) MOD 7
    Y=LZAHLEN(X)/7
    IF Z=0 THEN
      Z=7
      Y=Y-1
    fi
    PBS=AD+Z*3+Y*80+160 ; Adresse ermitteln
    PBS^== XOR $8080 ; Invertieren
    POSITION(X*3,19)
    PrintB(lzahlen(X))
  OD
  CRSIN=0
RETURN

Das gesamte Listing ist hier weiter unten auf der Seite zu finden...

Re: Action! Pointer

von FlorianD » Sa 16. Sep 2017, 17:13
Code: Alles auswählen
PROC MAIN()
 BYTE POINTER P
 BYTE I
 BYTE A=[3 4 5 6 7 8]
 BYTE B=[10 20 30 40 50 60]
 ;
 P=A ;INHALT P IST NUN GLEICH INHALT VON A, IN DIESEM FALL DIE ERSTE STELLE VON A
 PRINTCE(P)
 P=@A ;JETZT ZEIGT P AUF DIE ADR VON A. @ IST DER "ADRESSOPRATOR"
 PRINTCE(P) ;ADR DRUCKEN
 PRINTCE(P^) ;INHALT DER ADRESSE VON A DRUCKEN, ^ IST DER INHALTSOPERATOR

 PRINTE("HIER KOMMEN ALLE A'S")
 P=@A ;POINTER AUF ADRESSE VON A SETZEN
 FOR I=1 TO 6 DO
  PRINTBE(P^) ;PRINTE DEN INHALT VON ADRESSE A, ALSO DAS AUF WAS DER POINTER P ZEIGT
  P==+1 ;POINTER 1 ERHOEHEN (ALSO EINE ADRESSE WEITERSCHALTEN)
 OD

 PRINTE("NUN KOMMEN DIE B'S")
 P=@B
 FOR I=1 TO 6 DO
  PRINTB(P^) ; INHALT ZEIGEN DER STELLE AUF DIE P ZEIGT
  PRINT(" ")
  P^==+1 ; INHALT DER ADRESSE, AUF DIE P ZEIGT UM 1 ERHOEHEN
  PRINTBE(P^) ; NOCHMAL INHALT DER STELLE AUF DIE P ZEIGT ANZEIGEN
  P==+1 ; EINE ADRESSE WEITERSCHALTEN
 ; MAN BEACHTE DEN UNTERSCHIED ZWISCHEN "P^==+1" UND "P==+1" !
 OD
   
RETURN

Re: Action! Pointer

von slx » So 1. Okt 2017, 07:27
Sollte das nicht
Code: Alles auswählen
 BYTE ARRAY A=[3 4 5 6 7 8]
 BYTE ARRAY B=[10 20 30 40 50 60]
sein?

Freue mich jedenfalls auf Beispiele mit Pointern als Parameter bzw. Return-Werte!

Das Fehlen von (mehr) Beispielcode war damals für mich als Teenager und vermutlich auch für viele andere ein Grund, nicht mehr mit Action! zu machen, da ich einige Konzepte von BASIC kommend einfach nicht kapiert habe.

P.S.: Kann man in einem Code-Segment im Forum eigentlich was hervorheben?

Re: Action! Pointer

von FlorianD » So 1. Okt 2017, 18:00
Hallo,

nein, das ist Absicht. Ich will da nur Bytes ablegen, kein Array. Daher die Definition
Code: Alles auswählen
BYTE
, dann eine Variable (die dann die Adresse darstellt) und dann in eckigen Klammern die Werte.

Ich hatte auch erst gedacht, da müßte ein ARRAY hin, habe das dann aber in den Beispielen von Peter Finzel im ATARI Magazin so gesehen.

Re: Action! Pointer

von FlorianD » Mi 27. Jun 2018, 21:47
so geht es, mehrere Rückgabewerte aus einer Funktion wieder rauszubekommen
I,J sind Bytevariablen
AP,BP sind Pointer darauf


Code: Alles auswählen
PROC TEST(BYTE POINTER A,B)
A^=99
B^=55
RETURN

PROC MAIN()
BYTE POINTER AP,BP
BYTE I,J

I=3
J=4 ; i und j initialisieren
PRINTBE(I)
PRINTBE(J) ; Werte von I,J anzeigen ("3" und "4")
AP=@I
BP=@J ; Pointer aus I,J setzen

TEST(AP,BP) ; Prozedur mit Pointern aufrufen. Achtung: Pointer als Argumente, nicht die Variablen direkt
PRINTBE(I)
PRINTBE(J) ; Werte von I,J anzeigen ("99" und "55")
RETURN

Re: Action! Pointer

von FlorianD » Mi 27. Jun 2018, 22:04
geht auch micht Strings

Code: Alles auswählen
PROC STRTEST(CHAR POINTER A)
A^="ABBUC"
RETURN

PROC MAIN()
CHAR ARRAY STRING="HALLO"
CHAR POINTER CP
;
PRINTE(STRING)
CP=@STRING
STRTEST(CP)
PRINTE(STRING)
RETURN