atari-home.de - Foren

Software => Coding => Thema gestartet von: yalsi am Mi 22.10.2014, 00:20:25

Titel: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag 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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Mi 22.10.2014, 08:14:30
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);
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Mi 22.10.2014, 21:32:44
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Mi 22.10.2014, 21:39:52
Das ist ein Auszug aus einem Programm, welches ich mal mit ST-Pascal Plus 2.02 entwickelt habe. Das Programm funktioniert jedenfalls.

Zitat
                                        Eltville, den 20.11.1987

        Sehr geehrte Kunden,

        auf der vorliegenden Diskette befindet sich die ST Pascal plus
        Compiler-Version 2.02.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Do 23.10.2014, 00:11:30
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Do 23.10.2014, 00:39:19
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Do 23.10.2014, 07:23:39
Genau das habe ich ja probiert. Hilft aber nix. Es muss ein anderes Problem bei mir sein.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Do 23.10.2014, 08:20:58
Zeig mal deinen Code, vom Anfang bis zur ersten von dir erstellten Procedur/Funktion. Deine Variablendeklarationen kannst du evtl. ausklammern.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Fr 24.10.2014, 21:32:33
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Fr 24.10.2014, 21:43:01
Mach mal vor die 7 ein $

l:=gemdos($7);
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Fr 24.10.2014, 21:50:28
 :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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am Fr 24.10.2014, 23:51:34
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am Sa 25.10.2014, 12:40:16
Nein, das verstehe ich jetzt gerade auch nicht.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: ST-Oldie am So 26.10.2014, 12:28:53
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
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: yalsi am So 26.10.2014, 15:33:03
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.
Titel: Re: STPascal Plus 2.00 kennt GEMDOS() nicht
Beitrag von: 1ST1 am So 26.10.2014, 16:39:23
Danke Michael für die Erklärung! Das leuchtet ein.