Hallo,
da ich durch jahrelange Nichtbeschäftigung mein Know-How dafür großteils verloren habe muß ich hier aus gegebenem Anlaß einmal etwas nachfragen.
Normalerweise definiert man eine Prozedur wie zum Beispiel
PROC PRINT(BYTE X)
Ich bin nun auf eine damals von mir erstellte Prozedur gestoßen, die mit
PROC PRINT=(BYTE ARRAY X)
erstellt wurde.
Es geht hier um das Gleichheitszeichen. Das hat eine besondere Bewandnis, aber ich weiß nicht mir welche.
Und nein, es ist nicht
PROC PRINT=*(BYTE ARRAY X)
gemeint.
ACTION! eine Frage
Moderator: Rockford
-
Erhard
- Beiträge: 1244
- Registriert: 04.11.2021 15:52
- Has thanked: 148 times
- Been thanked: 389 times
- Kontaktdaten:
ACTION! eine Frage
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
- 24sumo
- Beiträge: 248
- Registriert: 17.08.2021 08:53
- Has thanked: 119 times
- Been thanked: 54 times
- Kontaktdaten:
Re: ACTION! eine Frage
Das meint die KI dazu:
Was bedeutet das = zwischen Print und der Parameterübergabe?
In der Programmiersprache Action! hat das Gleichheitszeichen (=) in einer Prozedur-Definition eine ganz spezifische Bedeutung, die sich von modernen Sprachen wie C oder Java unterscheidet.
Es dient dazu, den Beginn der Parameterliste zu markieren.
Die Bedeutung des =
In Action! trennt das = den Namen der Prozedur von ihren Eingabevariablen. Man könnte es fast wie ein "besteht aus" oder "benötigt" lesen.
Syntax: PROC <Name> = ( <Parameter> )
Es sagt dem Compiler: "Die Prozedur mit diesem Namen verwendet die folgenden Variablen im Speicher."
Vergleich mit anderen Sprachen
Um es verständlicher zu machen, hier der Vergleich, wie man denselben Kopf definieren würde:
Sprache Syntax
Action!: PROC Print = (BYTE ARRAY x)
C / C++: void Print(unsigned char *x)
Pascal: procedure Print(x: array of byte);
Was bedeutet das = zwischen Print und der Parameterübergabe?
In der Programmiersprache Action! hat das Gleichheitszeichen (=) in einer Prozedur-Definition eine ganz spezifische Bedeutung, die sich von modernen Sprachen wie C oder Java unterscheidet.
Es dient dazu, den Beginn der Parameterliste zu markieren.
Die Bedeutung des =
In Action! trennt das = den Namen der Prozedur von ihren Eingabevariablen. Man könnte es fast wie ein "besteht aus" oder "benötigt" lesen.
Syntax: PROC <Name> = ( <Parameter> )
Es sagt dem Compiler: "Die Prozedur mit diesem Namen verwendet die folgenden Variablen im Speicher."
Vergleich mit anderen Sprachen
Um es verständlicher zu machen, hier der Vergleich, wie man denselben Kopf definieren würde:
Sprache Syntax
Action!: PROC Print = (BYTE ARRAY x)
C / C++: void Print(unsigned char *x)
Pascal: procedure Print(x: array of byte);
-
Erhard
- Beiträge: 1244
- Registriert: 04.11.2021 15:52
- Has thanked: 148 times
- Been thanked: 389 times
- Kontaktdaten:
ACTION! eine Frage
.
Wie ich in meinem ersten Beitrag angeführt hatte werden Parameter für eine Prozedur ja auch ohne das Gleichheitszeichen definiert:
PROC TEST(BYTE X,Y CARD ADR INT ID)
Hier werden nach meiner Erinnerung die Werte für die Variablen in Speicherzellen abgelegt, die im Arbeitsspeicher vor dem Programmcode der Prozedur liegen.
Bei PROC TEST=*(...) fällt der JMP Befehl vor der Prozedur weg, womit die Adresse der Prozedur nicht mehr durch das Programm geändert werden kann.
Bei PROC TEST=(...) könnte es sein, daß die an die Variablen übergebenen Werte statt in Speicherzellen vor der Prozedur in den CPU-Registern A,X,Y sowie den Speicherzellen $A3-$AF abgelegt werden - aber da bin ich mir nicht mehr sicher.
Vielen Dank für Deine Antwort, aber ich meine, daß das was die KI meint falsch ist.
Wie ich in meinem ersten Beitrag angeführt hatte werden Parameter für eine Prozedur ja auch ohne das Gleichheitszeichen definiert:
PROC TEST(BYTE X,Y CARD ADR INT ID)
Hier werden nach meiner Erinnerung die Werte für die Variablen in Speicherzellen abgelegt, die im Arbeitsspeicher vor dem Programmcode der Prozedur liegen.
Bei PROC TEST=*(...) fällt der JMP Befehl vor der Prozedur weg, womit die Adresse der Prozedur nicht mehr durch das Programm geändert werden kann.
Bei PROC TEST=(...) könnte es sein, daß die an die Variablen übergebenen Werte statt in Speicherzellen vor der Prozedur in den CPU-Registern A,X,Y sowie den Speicherzellen $A3-$AF abgelegt werden - aber da bin ich mir nicht mehr sicher.
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
- DjayBee
- Beiträge: 1178
- Registriert: 17.08.2021 04:02
- Has thanked: 901 times
- Been thanked: 463 times
- Kontaktdaten:
Re: ACTION! eine Frage
Laut Handbuch dient das "=" dazu, die Adresse der PROCedure zu definieren. Dein Beispiel sieht dahingehend aber irgendwie sinnlos aus, weil die Variablenliste die Adresse ist.
Ausschnitt aus GoodbyteXLs deutscher Übersetzung:
Ausschnitt aus GoodbyteXLs deutscher Übersetzung:
Code: Alles auswählen
PROC CIO=$e456(BYTE areg,xreg)
;*** Declaring the OS procedure CIO. 'xreg' will
;contain the iocb number times 16, and 'areg' is a
;filler, so the number won't go into register A
;(CIO expects it in X reg.)-
Erhard
- Beiträge: 1244
- Registriert: 04.11.2021 15:52
- Has thanked: 148 times
- Been thanked: 389 times
- Kontaktdaten:
ACTION! eine Frage
Dann muß ich wohl gelegentlich eine kleine Testroutine in den 3 Versionen kompilieren und mir den Arbeitsspeicher mit einem Debugger angucken, um da vielleicht wieder einen Hinweis zu bekommen, was da passiert.
Echt schade, daß ich damals, als ich intensiv damit gearbeitet hatte, das Thema nicht zu Ende verfolgen konnte.
Ich hatte mit ACTION! Reference Cards angefangen wo für jedes Ding grundsätzliche Erläuterungen und Anwendungsbeispiele drin sind.
Aber die sind nur zu einem kleinen Teil angefangen und da wo was drin steht ist es nicht immer vollständig, wie eben bei PROC.
Vielleicht bin ich aber auch nur auf fehlerhafte alte Notizen von mir gestoßen. Das wäre dann ein bissl blöd ...
Echt schade, daß ich damals, als ich intensiv damit gearbeitet hatte, das Thema nicht zu Ende verfolgen konnte.
Ich hatte mit ACTION! Reference Cards angefangen wo für jedes Ding grundsätzliche Erläuterungen und Anwendungsbeispiele drin sind.
Aber die sind nur zu einem kleinen Teil angefangen und da wo was drin steht ist es nicht immer vollständig, wie eben bei PROC.
Vielleicht bin ich aber auch nur auf fehlerhafte alte Notizen von mir gestoßen. Das wäre dann ein bissl blöd ...
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
- cas
- Beiträge: 1199
- Registriert: 18.06.2021 21:01
- Wohnort: Solar System
- Has thanked: 349 times
- Been thanked: 861 times
- Kontaktdaten:
Re: ACTION! eine Frage
Wie schon oben gesagt definiert das Gleichheitszeichen die Speicherstelle der Prozedur im Speicher.
Gibt es vielleicht ein "BYTE ARRAY X" im Programm an anderer Stelle, in welchem das BYTE ARRAY X mit Maschinensprache-Befehlen gefüllt wird?
Das wäre dann eine Variable "X" als BYTE ARRAY, mit dem Inhalt einer Maschinenspracheroutine. Und die Prozedur verweist dann auf dieses BYTE ARRAY X, so das der Maschinencode in Variable "X" über den Namen der Prozedur aufgerufen werden kann.
Gibt es vielleicht ein "BYTE ARRAY X" im Programm an anderer Stelle, in welchem das BYTE ARRAY X mit Maschinensprache-Befehlen gefüllt wird?
Das wäre dann eine Variable "X" als BYTE ARRAY, mit dem Inhalt einer Maschinenspracheroutine. Und die Prozedur verweist dann auf dieses BYTE ARRAY X, so das der Maschinencode in Variable "X" über den Namen der Prozedur aufgerufen werden kann.
-
Erhard
- Beiträge: 1244
- Registriert: 04.11.2021 15:52
- Has thanked: 148 times
- Been thanked: 389 times
- Kontaktdaten:
ACTION! eine Frage
Wie gesagt, es geht ja nicht um das Festlegen einer Adresse:
PROC CIO=$e456(BYTE areg,xreg)
sondern um sowas:
PROC TEST=(BYTE X,Y)
und vielleicht gibt es das gar nicht und ich habe das nur falsch notiert und es lautet (und muß lauten)
PROC TEST=*(BYTE X,Y)
PROC CIO=$e456(BYTE areg,xreg)
sondern um sowas:
PROC TEST=(BYTE X,Y)
und vielleicht gibt es das gar nicht und ich habe das nur falsch notiert und es lautet (und muß lauten)
PROC TEST=*(BYTE X,Y)
Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.
- cas
- Beiträge: 1199
- Registriert: 18.06.2021 21:01
- Wohnort: Solar System
- Has thanked: 349 times
- Been thanked: 861 times
- Kontaktdaten:
Re: ACTION! eine Frage
Doch, es legt die Adresse fest. Auch
PROC TEST=*(BYTE X,Y)
legt die Adresse fest, auf "*", das ist der aktuelle Compile-Pointer (also die Adresse des nächsten freien Speicherplatzes im Programm an dieser Stelle).
Um Licht in die Sache zu bekommen:
1) Kompiliert der Code?
2) An welche Speicherstelle wird die PROC Funktion kompiliert?
3) Was für ein Code steht an dieser Stelle?
4) Kannst Du den Quellcode des ganzen Programms posten?
Wer ist online?
Mitglieder in diesem Forum: Bing [Bot] und 1 Gast