atari-home.de - Foren
Software => Coding => Thema gestartet von: yalsi am Mi 22.10.2014, 00:20:25
-
Hallo in die Runde
Gerade spiele ich ein bisschen mit StPascal Plus Version 2 herum, nachdem Handbuch und Disks nun so lange herumstanden. Die Funktion GEMDOS() kennt aber anscheinend nur das Handbuch und nicht der Compiler- der sagt immer, der Bezeichner sei nicht verenbart. Da mache ich doch bestimmt einen Anfängerfehler, oder?
Gruss- Georg B. aus H.
-
Kleiner Denkanstoß:
{Externe Funktionen und Prozeduren}
{$I trixsubs.pas}
{$I gemsubs.pas}
{Interne Funktionen und Prozeduren}
function pexec(mode:integer;var name,kommandozeile,umgebung:cstring):long_integer;
gemdos($4b);
procedure dsetpath(var name:cstring);
gemdos($3b);
function dgetpath(var name:cstring;laufwerk:integer):integer;
gemdos($47);
function dsetdrv(lauferk:integer):integer;
gemdos($0e);
function dgetdrv:integer;
gemdos($19);
-
Kleiner Denkanstoß:
...nur in die falsche Richtung: in Version 2 sind dort nur noch GEM Funktionen drin, aber keine gemdos() Definition. Das Einbinden geht jetzt auch anders:
program xy;
const
{$I gemconst.pas}
type
{$I gemtype.pas}
{$I gemsubs.pas}
Die drei Dateien gibt es analog auch für Pastrix. Die Doku zu beiden Bibliotheken nennt übrigens gemdos() nicht. Das Buch "Atari ST Programmierpraxis ST Pascal" (übrigens grottenschlecht strukturiert) setzt Version 1.2 voraus und hat Beispiele mit gemdos() Aufrufen ohne Compller-Includes. Vielleicht passt Dein Beispiel zur Version 1?
Gruss- Georg B. aus H.
-
Das ist ein Auszug aus einem Programm, welches ich mal mit ST-Pascal Plus 2.02 entwickelt habe. Das Programm funktioniert jedenfalls.
Eltville, den 20.11.1987
Sehr geehrte Kunden,
auf der vorliegenden Diskette befindet sich die ST Pascal plus
Compiler-Version 2.02.
-
Es wird mysteriös: Dein Beispiel geht in meiner Installation einfach nicht und auch das vollständige Buchbeispiel will nicht. Meine Version ist auch die gleiche wie Deine... . In den Include Dateien ist übrigens keine "external" Definition für Gemdos enthalten- die Funktion muss irgendwo anders herkommen oder die Includes haben einen Fehler. Ich probiere am WE noch weiter... .
Gruss- Georg B. aus H.
-
Ein bischen mehr:
const {$I trixcons.pas}
{$I gemconst.pas}
type {$I trixtype.pas}
{$I gemtype.pas}
dann kommen meine Variablen-Deklarationen und dann anschließend der Code, den ich oben gepostet habe. Danach kommen die ganzen normalen Funktionen und Proceduren und schließlich main.
-
Genau das habe ich ja probiert. Hilft aber nix. Es muss ein anderes Problem bei mir sein.
-
Zeig mal deinen Code, vom Anfang bis zur ersten von dir erstellten Procedur/Funktion. Deine Variablendeklarationen kannst du evtl. ausklammern.
-
Das geht schon mit 'was ganz banalem nicht:
program taste;
CONST
{$I TRIXCONS.PAS}
{$I GEMCONST.PAS}
TYPE
{$I trixtype.pas}
{$I gemtype.pas}
VAR
l: integer ;
{$I trixsubs.pas}
{$I gemsubs.pas}
begin
l:=gemdos(7);
end.
Den Bezeichner gemdos() kennt der Compiler nicht. Und nochmal: In keinem der Include-Dateien ist er vereinbart, da liegt das Problem nicht. Wenn Du STPascal Plus installiert hast, compiliere das doch bitte mal und sage mir, was passiert.
Gruss- Georg B. aus H.
-
Mach mal vor die 7 ein $
l:=gemdos($7);
-
:o :o :o Das war's!
Nun geht's auch ohne die ganzen Includes! Ich hasse missverständliche Compilermeldungen >:(
Dankeschön- Georg B. aus H.
-
Hallo nochmal
Kurz zu früh gefreut, jetzt aber korrigiert:
function fnSAAReadkey:integer;
var iKey:long_integer;
function conin:long_integer;
gemdos($7);
begin
(* irgendwelcher code *)
iKey:=conin;
fnSAAReadkey:=iKey div 65534;
end;
gibt mir brav den Scancode einer Taste zurück. Mache ich das aber ohne Funktion:
function fnSAAReadkey:integer;
var iKey:long_integer;
begin
(* irgendwelcher code *)
iKey=gemdos($7);
fnSAAReadkey:=iKey div 65534;
end;
dann kennt der Compiler den Bezeichner gemdos nicht ::) Mir soll das so reichen, jetzt geht's ja... aber verstehen muss ich das nicht, oder?
Gruss- Georg B. aus H.
-
Nein, das verstehe ich jetzt gerade auch nicht.
-
Hallo,
es ist schon einige Zeit her, daß ich mehr mit ST Pascal+ gemacht hatte. Deshalb mußte ich mich erst mal wieder reindenken. Aber es ist ganz einfach verständlich:
gemdos() ist keine Funktion! Damit kannst man auch keinen Aufruf machen wie:
iKey:=gemdos($7);
Das würde tatsächlich einen unresolved external geben. gemdos ist ein Schlüsselwort für den Compiler wie begin, end, type, ... und sagt dem Compiler, daß die Funktion, die du vom Typ gemdos deklarierst, über den gemdos Trap mit den von dir angegebenen Parametern aufgerufen wird. Der Ausdruck
function conin:long_integer;
gemdos($7);
deklariert also eine Funktion mit dem Namen conin ohne Parameter mit einem Rückgabewert vom Type long_integer, die der Compiler über Trap 1 mit der Funktionsnummer 7 aufrufen soll, anstatt das man selbst den Code schreibt. Wäre gemdos() eine Funktion, wäre diese Deklaration nicht möglich.
Tschüß
Michael
-
OK, das verstehr ich jetzt wieder, vielen Dank für die Erklärung. Muss wohl doch dss Handbuch mal ausfūhrlich lesen... .
Gruss- Georg B. aus H.
-
Danke Michael für die Erklärung! Das leuchtet ein.