home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / mac / 0700 / CCE_0708.ZIP / CCE_0708.PD / GFAHILFE / L_D_GRAU.TXT next >
Text File  |  1993-04-23  |  29KB  |  525 lines

  1. @(#) bugs.txt, Fehler in GFABASIC 3.x - Uwe Ohse, 15.4.93
  2.  
  3.  
  4.                Liste des Grauens - willkommen im Land der Bugs!
  5.  
  6.  
  7.      Dieser Text führt die mir bekannten fehlerhaften oder prinzipiell nicht
  8.      zukunftssicheren Befehle im GFABASIC 3.6. Er ist nicht als vollständig zu
  9.      betrachten! Die Anzahl mir unbekannter Fehler im GFABASIC 3.6 ist mög-
  10.      licherweise sehr hoch.
  11.  
  12. Diese Liste darf, mit Ausnahme der Verwendung in kommerziellen Produkten, frei
  13. kopiert werden. Für die Verwendung in kommerziellen Produkten ist die schrift-
  14. liche Genehmigung des Autors (E-Mail-Adresse: Uwe Ohse @PB2.MAUS.DE) einzuholen.
  15. Updates zu diesem Text gibt es ausschließlich in der Quark-Box Paderborn.
  16.  
  17. 1. Die GFA-Fensterverwaltung.
  18.    Die einfache Fensterverwaltung mit OPENW, CLOSEW usw. ist in früheren
  19.    Versionen fehlerhaft gewesen. Wie es heute aussieht, weiß ich nicht, da ich
  20.    schon lange auf direkte AES-Aufrufe umgestiegen bin.
  21.    Prinzipiell jedoch ist ein gravierender Mangel nicht beseitigt worden: Es
  22.    können mit den GFA-Fensterbefehlen nur bis zu vier Fenster verwaltet werden,
  23.    was in Zukunft ein ernsthafter Mangel werden dürfte.
  24.    Auch ist die GFA-Fensterverwaltung recht unflexibel.
  25.    Die GFA-Fensterverwaltung kann übrigens mit großen Fensterhandles (WINX,
  26.    MultiTOS) umgehen.
  27.  
  28. 2. Die Dateifunktionen unter Multitasking
  29.    Tritt bei OPEN ein Fehler auf, z.B. weil gerade ein anderer Prozess die
  30.    Datei gesperrt hat, so meldet GFABASIC sofort einen Fehler. Damit sind
  31.    die gesamten I/O-Operationen unter MTOS/MiNT ziemlich unsicher, und es
  32.    ist nicht möglich, z.B. zwei Bugsicprogramme auf denselben Datenbestand
  33.    loszulassen.
  34.    Für dieses Problem gibt es bisher keine Lösung außer der Verwendung des
  35.    GFA-nach-C-Konverters (gut, aber für den Hobbygebrauch etwas teuer) oder
  36.    einer selbstgeschriebenen Ein/Ausgabelibrary auf GEMDOS()-Basis. Letztere
  37.    verlangsamt das Programm recht stark, falls sie nicht in Assembler
  38.    realisiert wird.
  39.  
  40. 3. Bekannte Bugs, die nicht auf einen speziellen Befehl beschränkt sind
  41.    3.1 Allgemein
  42.    - GFABASIC verläßt sich darauf, daß VDI-Aufrufe den Inhalt von
  43.      CONTROL(6) (das Handle der Workstation) nicht verändern. Dies ist eine
  44.      undokumentierte Eigenschaft einiger VDI-Versionen, die andere Versionen
  45.      nicht teilen. Mit anderen Worten: Möglicherweise steht nach dem
  46.      Aufruf einer VDI-Funktion etwas ganz anderes in Control(6) als vorher.
  47.      Und beim nächsten Aufruf stimmt das Handle nicht -> im schlimmsten
  48.      Falle Crash!
  49.      Abhilfe: Nach _jedem_ VDI-Aufruf CONTROL(6) setzen, z.B. mit V~H=xxx.
  50.      (was definitiv zuviel verlangt ist, ich weiß)
  51.    - Außerdem unterscheidet sich die Syntax einiger VDI-Aufrufe (rund um
  52.      das Öffnen und Schließen von virtuellen oder physikalischen Workstations)
  53.      stark von der in anderen Sprachen gebräuchlichen.
  54.    3.2 Compiler
  55.    - Bitte "kommentieren" Sie mal einen Block oder eine Zeile in ihrem
  56.      Programm mit "IF FALSE" und "ENDIF" aus und compilieren sie es dann.
  57.      In vielen Fällen stürzt der Compiler während der Arbeit bombenwerfend
  58.      ab.
  59.    - Konstruktionen wie "IF exist(datei$)" können unter Umständen im
  60.      compilierten Programm falsch ausgewertet werden. Verwenden Sie besser
  61.      "IF exist(datei$)<>FALSE".
  62.      Dieser unangenehme Effekt ist mehr oder weniger unbekannt und nicht
  63.      beliebig reproduzierbar. Eines meiner Programme findet aber erst seit
  64.      der Änderung der EXIST-Bedingungen seine sämtlichen Dateien wieder.
  65.      Auch ein beim Mailboxprogramm Q_MAIL aufgetretener Effekt ist nur so
  66.      erklärbar gewesen. Eine Programmteil der Form
  67.      IF EXIST(zugriffsliste$)
  68.        [lesen der Liste]
  69.      ELSE
  70.        [neuanlegen der Liste]
  71.      ENDIF
  72.      führte ab und zu (wenn auch selten) dazu, daß eine existierende Liste
  73.      gegen die Defaultliste "ersetzt wurde".
  74.      Ähnliches für alle anderen "Vergleiche irgendwas" Bedingungen, also
  75.      auch für WHILE und UNTIL. Die Probleme lassen sich nicht vernünftig
  76.      reproduzieren (und schon gar nichts in ein paar Zeilen), sind aber
  77.      mittlerweile von genügend anderen Leuten bestätigt worden.
  78.    - in einem relativ großen Programm (undokumentiert 250 K) ist es
  79.      vorgekommen, daß der Compiler Funktionen nicht gefunden hat, wenn sie
  80.      hinter den Funktionen standen, aus denen sie aufgerufen wurden. Abhilfe
  81.      brachte es, die in der Hierarchie niedrigeren Funktionen vor den anderen
  82.      zu plazieren.
  83.    - TT? führt auf Geräten ohne Cookiejar zum Absturz, da hier einfach
  84.      unterstellt wird, daß eine FPU vorhanden ist.
  85.    3.3 Interpreter
  86.    - Der Interpreter greift in starkem Maße auf LineA zu. Schaltet man z.B.
  87.      unter NVDI das LineA ab, funktioniert der Interpreter nicht mehr.
  88.    - Er verbiegt auch Systemvektoren ohne die dafür vorgesehene Betriebs-
  89.      systemfunktion setexc zu verwenden. Damit ist er unter MiNT und MultiTOS
  90.      nicht mehr lauffähig. (Es sei denn, man patcht ihn. Siehe unten).
  91.    3.4 Linker
  92.    - Das Anlegen von Symboltabellen sollte man bei längeren Programmen
  93.      unterlassen. Der Linker kann abstürzen.
  94.    3.5 Speicherverwaltung in Interpreter und Compiler
  95.    - RESERVE arbeitet unter TOS 3.06 und MiNT nur unzureichend. Es kann den
  96.      einmal freigegebenen Speicher nicht wieder vergrößern. Dies war GFA
  97.      vor der Auslieferung von Bugsic 3.6 bekannt und ist nicht behoben
  98.      worden. Man denke darüber, wie man will.
  99.      Die einzige Abhilfe ist, auf eine dynamische Speicherverwaltung mit
  100.      Malloc umzusteigen. Leider unterstützt GFABASIC dies in keiner Weise.
  101.      Unter MultiTOS wird die damit erzwungene starre Speicherverwaltung
  102.      ärgerlich werden.
  103.    - Die Speicherverwaltung ist nicht nur unflexibel, sondern auch
  104.      fehlerhaft. Mit freundlicher Erlaubnis von Christoph Conrad @ AC3:
  105.  
  106.        Probieren Sie mal folgendes (danach neu booten):
  107.        ' Compilerversion mit $m statt RESERVE
  108.        RESERVE 1000
  109.        $m 4711
  110.        ' RESERVE damit's etwas schneller abstürzt, aber eigentlich unnötig.
  111.        ' Die (**) Zeilen braucht man beim Interpreter, damit nach dem RESERVE
  112.        ' auch wirklich (FRE() MOD 16) == 0 gilt
  113.        ' minus 4: wegen Backtrailer bei rest16$ beim Compiler falls $m XXXX
  114.        ' mit (XXXX MOD 16)<>0
  115.        rest16%=(FRE(0) MOD 16)-4   ! **
  116.        IF rest16%<0                ! **
  117.          ADD rest16%,16            ! **
  118.        ENDIF                       ! **
  119.        rest16$=STRING$(rest16%,0)  ! **
  120.        ' (FRE() MOD 16) == 0 jetzt erfüllt
  121.        str$="AHAH"
  122.        DO
  123.          @crash(str$)
  124.        LOOP
  125.        PROCEDURE crash(str$)
  126.          str$="OHOH"
  127.        RETURN
  128.  
  129.        ' (Der Bug ist nicht auf jedem Rechner zu jeder Zeit reproduzierbar,
  130.        '  z.B. tritt er auf meinem TT nicht auf, auf dem STE aber schon. Uwe)
  131.    - Ein weiterer Bug in der internen Speicherverwaltung tritt unter noch
  132.      selteneren Umständen auf, es ist mir bisher nicht gelungen, ihn in
  133.      kleineren Programmen zu reproduzieren. Er tritt im Zusammenhang mit der
  134.      Übergabe lokaler Variablen als Parameter an eine Prozedur oder
  135.      Funktionen besonders gerne auf, wenn man dabei Call-by-Reference- und
  136.      Call-by-Value-Parameter mischt und nach Möglichkeit auch Felder
  137.      übergibt.
  138.      Die Folgen reichen von kompletten Systemhängern bis zu einigermaßen
  139.      zivilisierten, aber vollkommen falschen Fehlermeldungen des Interpre-
  140.      ters.
  141.      Abhilfe: CbV- und CbR-Parameter nach Möglichkeit nicht mischen, Felder
  142.      nach Möglichkeit nur eine Prozedur tief hinunterreichen (?).
  143.  
  144.      Nachtrag:
  145.       PROCEDURE test
  146.         LOCAL a&
  147.         '
  148.         adr%=V:a&            !Adresse von a& vorher
  149.         PRINT adr%
  150.         '
  151.         a&=@zahl             !Funktion aufrufen
  152.         '
  153.         PRINT a&             !a& => falsch <= ERROR hier!
  154.         '
  155.         PRINT V:a&           !Adresse von a& nachher = verschoben!!
  156.         PRINT WORD(adr%)     !An der alten Adresse steht es
  157.       RETURN
  158.       FUNCTION zahl
  159.         DIM a$(10)           !Hier verschiebt sich die Adresse von a& !
  160.         RETURN 10
  161.       ENDFUNC
  162.       Ausgabe beispielsweise:
  163.       1000000 (beliebige, noch korrekte Adresse)
  164.       42      (irgendeine Zahl)
  165.       2000000 (beliebige Adresse ungleich der obigen)
  166.       10
  167.  
  168.       In anderen Fällen treten solche Probleme in der Funktion "zahl" auf,
  169.       wenn dort z.B. die Variable a benutzt wird.
  170.  
  171.      Konsequenz daraus: Vorsicht mit lokal deklarierten Feldern! (u.a.)
  172.  
  173. 4. Diverse fehlerhafte oder unbrauchbare Befehle:
  174. Im folgenden bedeutet LA LINE-A!
  175. ACHAR:       ruft LA (Textblt) auf. Abhilfe: TEXT
  176. ACLIP:       ruft LA auf. Abhilfe: CLIP.
  177. AFTER:       hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe
  178.              bieten die AES-Events (EVNT_TIMER, EVNT_MULTI) oder zur Not auch
  179.              ON MENU.
  180. ALINE:       ruft LA (Arbitrary line) auf. Abhilfe: LINE
  181. APOLY:       ruft LA (Filled polygon) auf. Abhilfe. POLYLINE
  182. ARECT:       ruft LA (Filled rectangle) auf. Abhilfe: PBOX
  183. ATEXT:       ruft LA (TextBlt) auf. Abhilfe: TEXT
  184. BITBLT:      Die Varianten
  185.                    BITBLT adresse%
  186.              und
  187.                    BITBLT ein_feld%()
  188.              benutzen LA (Bitblt) und sind deshalb unsauber. Als Abhilfe
  189.              bietet sich die Benutzung von
  190.                    BITBLT q%(),z%(),d%()
  191.              an. Hier wird das VDI benutzt.
  192.              Anmerkung: Leider ist dies der einzige saubere
  193.              Rasterkopierbefehl, den Bugsic bietet.
  194. CALL:        Funktioniert im Interpreter nicht. Abhilfe bietet folgender
  195.              Patch von Christoph Conrad: (3.6 D TT - Groesse 104770)
  196.              Byte:
  197.                Dateioffset $34AC. Dort sollten die Bytes $48 $ E7 $ 00 $ 0A
  198.                zu finden sein.
  199.                Das $0A in $0E umpatchen, das wars.
  200. CRSCOL:      greift auf LA-Variablen zu. Abhilfe: Keine. Es sollte aber nicht
  201.              schwierig sein, sich die Cursorposition zu merken!
  202. CRSLIN:      greift auf LA-Variablen zu. Siehe CRSCOL.
  203. DEFMOUSE:    greift auf LA zu, um die Mausform sofort zu ändern. Schaltet man
  204.              unter NVDI das LA ab, wird die Mausform erst bei der nächsten
  205.              Mausbewegung geändert. Abhilfe: GRAF_MOUSE() (ist sowieso
  206.              sauberer).
  207. EVERY:       hängt von $I+ ab und sollte vermieden werden. Abhilfe: Siehe
  208.              AFTER.
  209. EXEC:        Modus 4 funktioniert offenbar nur zufällig.
  210. FILESELECT:  schaltet die Maus mit LA ab. Abhilfe: FSEL_(EX)INPUT benutzen.
  211. GET:         in einen String passen nur 32K, und das reicht schon unter
  212.              Overscan u.U. nicht mehr aus. Man sollte sich auch nie
  213.              darauf verlassen, daß 100*100 Pixel in den String passen: Es
  214.              könnte z.B. eine TrueColor-Karte laufen. Weiterhin benutzt
  215.              GET die LineA-Variable M_HID_CT und Logbase (XBios(3)).
  216.              Abhilfe: VDI-BITBLT.
  217. HIDEM:       ruft LA (Hide mouse) auf. Abhilfe: GRAF_MOUSE()
  218. HLINE:       ruft LA (Horizontal line) auf. Abhilfe: LINE.
  219. INPUT:       greift u.U. auf LA-Variablen zu. Leider hilft es auch nicht, CON:
  220.              zum Lesen zu öffnen und INPUT # zu benutzen: So schlau ist Bugsic
  221.              leider. Abhilfe: In GEM-Programmen Dialoge benutzen oder gleich in
  222.              Fenstern arbeiten, in TOS-Programmen GEMDOS(10,...) (=Cconrs)
  223.              benutzen.
  224.              Nachtrag: Es hilft auch, mit INPUT # von "STD:" zu lesen, diese
  225.              Variante benutzt kein LA und ermöglicht auch eine I/O-Umlenkung.
  226.              In GEM-Programme passt sie allerdings nicht (dasselbe gilt
  227.              allerdings auch für INPUT).
  228. INP?:        benutzt LA. Abhilfe: BIOS(1,device)
  229. INSTR:       Die Varianten INSTR("xyz","xyz",2) und INSTR(2,"xyz","xyz")
  230.              liefern 1 zurück, obwohl "xyz" in "yz" nicht vorhanden ist.
  231. KEYDEF:      hängt von $I+ ab und ist deshalb zu meiden. Abhilfe: in
  232.              GEM-Programmen simpel, bei Eintreffen eines Tastaturereignisses
  233.              statt der Funktionstaste die entsprechenden Strings verarbeiten.
  234.              In TOS-Programmen wird es schwieriger, ich persönlich glaube auch
  235.              nicht, daß die benutzung der Funktionstasten in reinen
  236.              TOS-Programmen schön ist und gebe hierzu konsequenterweise
  237.              keinen Tip.
  238. L~A:         die Basisadresse der LA-variablen persönlich. Sozusagen der
  239.              Teufel selbst. Für die allermeisten Zwecke braucht man sowieso
  240.              keinen Zugriff darauf. Wenn doch, tja, dann muß man halt.
  241. MOUSE,
  242. MOUSEX,
  243. MOUSEY,
  244. MOUSEK:      greifen auf LA-Variablen zu. Abhilfe bietet mal wieder das AES,
  245.              wenn man auf Mausereignisse abfragt (EVENT_MULTI, EVENT_BUTTON,
  246.              EVENT_MOUSE) oder (einfacher) GRAF_MKSTATE verwendet.
  247. POS():       benutzt zwar kein LA, ist aber trotzdem unbrauchbar, da es ganz
  248.              einfach "Anzahl der seit dem letzten Carriage Return ausgegebenen
  249.              Zeichen modulo 256" zurückzugibt und nicht die tatsächliche
  250.              Cursorposition!
  251. PRINT:       gibt normalerweise über das BIOS aus. Arbeitet man aber mit
  252.              PRINT#x, wenn x mit OPEN "O",x,"STD:" geöffnet ist, wird über
  253.              die Standardausgabe ausgegeben. Diese Variante ist für Tools,
  254.              bei denen eine Ein/Ausgabeumlenkung denkbar ist, vorzuziehen!
  255.              PRINT auf Bildschirm oder STD: Hat in GEM-Programmen zu nichts
  256.              zu suchen!
  257. PSET:        ruft LA (Put pixel) auf. Abhilfe: PLOT
  258. PTST:        ruft LA (Get pixel) auf. Abhilfe: POINT()
  259. PUT:         Da GET nicht ausreichend verläßlich arbeitet, ist auch PUT nicht
  260.              zu gebrauchen.
  261. RC_COPY:     ruft LA (BltBlt) auf. Abhilfe: Siehe BITBLT.
  262. RESERVE:     ist fehlerhaft. Unter TOS 3.06 und MiNT kann RESERVE den Speicher
  263.              nicht wieder vergrößern. Abhilfe: Möglichst nur einen RESERVE
  264.              benutzen, nämlich den zum Verkleinern des Arbeitsspeichers, oder
  265.              diese Option zumindest unter MiNT/TOS3.06 anbieten, oder auf
  266.              dynamische Speicherverwaltung mittels MALLOC umsteigen.
  267. RESUME:      hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe:
  268.              RESUME label. Auch hier heißt es aufpassen, da bei RESUME label
  269.              der GFA-interne Stack inkonsistent wird. Ein Rücksprung (RETURN)
  270.              aus einem Unterprogramm ist deshalb nicht sicher möglich, der
  271.              RESUME label sollte also in eine Prozedur führen, die nicht wieder
  272.              verlassen werden muß, z.B. das Hauptprogramm.
  273.              (Ich erbitte mir Tips hierzu!)
  274. RESUME NEXT: hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe:
  275.              Siehe RESUME.
  276. SETCOLOR:    benutzt das XBIOS. Getreu der Regel, daß man Betriebssystemaufrufe
  277.              unterschiedlicher Ebenen nicht mischt, sollte man stattdessen
  278.              VSETCOLOR verwenden, wenn man mit den VDI-Aufrufen zeichnet.
  279. SETMOUSE:    ändert LA-Variablen.  Abhilfe: APPL_TPLAY, leider deutlich
  280.              komplizierter.
  281. SGET:        in einen String passen nur 32K, und das reicht schon unter
  282.              Overscan ganz sicher nicht aus. Abhilfe: VDI-BITBLT.
  283. SPUT:        Wenn SGET nicht zu gebrauchen ist, fällt auch SPUT aus.
  284. SHOWM:       ruft LA (Show mouse) auf. Abhilfe: GRAF_MOUSE
  285. SPRITE:      ruft LA (Draw sprite, Undraw sprite) auf. Abhilfe: viel
  286.              Mehrarbeit. Im allgemeinen benötigt man Sprites sowieso nur in
  287.              Spielen, und für die gelten andere Regeln.
  288. STE?:        Arbeitet grob fehlerhaft: Ist kein Cookiejar angelegt, so ange-
  289.              nommen, das Programm liefe auf einem ST, sonst wird der Cookie
  290.              _SND abgefragt, ob das Bit für Stero/DMA-Sound gesetzt ist.
  291.              Somit macht Bugsic von der Soundhardware abhängig, auf welcher
  292.              Maschine das Programm läuft. Was passiert auf dem Falcon? Mög-
  293.              licherweise alles schlechte der Welt.
  294.              Abhilfe: Den _MCH-Cookie selbst abfragen.
  295. STICK:       sollte vermieden werden. Unter MultiTOS dürfte es sehr unschön
  296.              sein, wenn eine Applikationen den Mausport als Joystick schaltet.
  297. STICK():     Benutzt KbdvBase = XBios(34) und Bconout(Ikbdsys) = Bios(3,4,...),
  298.              und schaltet die Maus auf die Hardwarenaheste Weise ab. Damit
  299.              sollte die Funktion unter MultiTOS nicht mehr genutzt werden.
  300. STRIG():     Siehe STICK().
  301. TT?:         arbeitet fehlerhaft und führt unter bestimmten Umständen zum
  302.              Absturz des Programms (fehlender Cookiejar, bzw. fehlender
  303.              Cookie). btw: Wie arbeitet TT? eigentlich genau? _FPU, _CPU?
  304.              Außerdem überschreibt TT? Teile des Programmcodes, ein
  305.              Verfahren, das nun wirklich schmutzig ist. Selbstmodifizierende
  306.              Programme sind MEGA-OUT!
  307.              Verschiedentlich wurde auch berichtet, daß bei Benutzung von TT?
  308.              größere Teile des Programmes überschrieben wurden. Nach kurzem
  309.              Debuggen des entsprechenden Routine kann ich das weder
  310.              ausschließen noch erhärten.
  311. VDIBASE:     Die Funktion liefert m.W. seit TOS 1.02 keine vernünftigen Werte
  312.              zurück. Abhilfen: Work_out-Feld, vqt_extend().
  313. XBIOS():     XBIOS(2 ... 5) sollten nicht mehr genutzt werden. Die Abfrage und
  314.              das Setzen der Bildschirmadresse kann auf diversen Graphikkarten
  315.              nicht funktionieren, XBIOS(4) ist nur für die Standardauflösungen
  316.              definiert.
  317. _C,
  318. _X,
  319. _Y:          Liefern im compilierten Programm 0 zurück. Abhilfe: In
  320.              GEM-Programmen entweder die Werte aus dem WORT_OUT-Feld
  321.              benutzen oder, besser noch, den Bereich des Hintergrundfensters
  322.              mit WIND_GET erfragen. Die Anzahl der Farbebenen kann man z.B.
  323.              dem AES-Globalfeld entnehmen.
  324.              Übrigens ist dieser Fehler (wie auch diverse andere) GFA seit
  325.              über einem Jahr bekannt.
  326.  
  327. Hinweis a): Mir ist klar, daß STICK und STRIG für Spiele durchaus noch eine
  328.    Existenzberechtigung haben. Unter GEM jedoch sollte man darauf verzichten!
  329. Hinweis b): Auch wenn man keine LA-Befehle verwendet, rufen sowohl der
  330.    Interpreter als auch der Compiler LA auf. Abhilfe schafft nur ein Patch,
  331.    siehe dazu unter Punkt 7.
  332.  
  333. 5. Compileroptionen:
  334. - $B+  "Fängt Bombenfehler ab"
  335.   Hierfür werden diverse Vektoren verbogen. Die Anwendung dieser Option in
  336.   Accessoires verbietet sich also von selbst ("Accessoires should not steal
  337.   vectors"), sonst hagelt es Abstürze beim Auflösungswechsel.
  338.   Es ist eigentlich überflüssig zu bemerken, daß selbstverständlich weder XBRA
  339.   noch SETEXC verwenden wird. Also darf diese Option unter MiNT nicht verwendet
  340.   werden, oder der Absturz unter MiNT (und MultiTOS) ist nur eine Frage von
  341.   Millisekunden.
  342. - $I+ "Interruptroutinen einschalten"
  343.   verbiegt Kbdvbase()->ikbdsys. Verbietet sich in Accessoires also ebenfalls.
  344.   Auch hier wird natürlich weder XBRA noch setexc benutzt, und unter MiNT
  345.   lauffähig sind Programme, die mit dieser Option compiliert wurden, auch
  346.   nicht. Diese Option sollte man also ebenfalls besser nicht setzen.
  347.   Aber: Das Setzen von $I- führt zu einigen Nebenwirkungen:
  348.   -- Every und After können nicht mehr benutzt werden. Im Ernstfall kann man
  349.      sie aber über EVNT_TIMER() nachbilden.
  350.   -- CTRL/ALT/SHIFT funktioniert nicht mehr (kein Verlust, ist unter MiNT
  351.      sowieso nicht zu gebrauchen)
  352.   -- RESUME und RESUME NEXT werden unbenutzbar. Einzig RESUME marke kann noch
  353.      verwendet werden, löscht aber den bugsicinternen Stack und sollte nur ins
  354.      Hauptprogramm oder eine Prozedur, die garantiert nicht per RETURN
  355.      verlassen wird, führen.
  356. -- $m Speicherbedarf festlegen
  357.   $m bestimmt den Speicherplatz, den das compilierte Programm für Variablen
  358.   und als Stack etc. verwenden soll. Nicht dazu zählt der Platz für
  359.   Programmcode und Konstanten (Strings, Festzahlen ...). Ein $m5000
  360.   beschränkt also den Platz im BSS-Segment auf 5000 Bytes und sorgt auch
  361.   dafür, daß das compilierte Programm nicht noch weiteren Speicher mit Malloc
  362.   an sich reißt.
  363.   Sehr sinnvoll ist diese Option für Programme, die unter Multitos laufen
  364.   sollen oder Accessoires. [Siehe außerdem RESERVE]
  365.  
  366.   Es gibt keine Möglichkeit, aus Bugsic herauszukitzeln, wieviel Speicher ein
  367.   Programm denn benötigt. Die Mühe muß man sich leider selbst machen.
  368.   - Man könnte im Interpreter in einer mit EVERY "kleiner Zeitabschnitt"
  369.     aufgerufenen Funktion das Maximum gleichzeitig belegten Speichers
  370.     bestimmen.
  371.   - Natürlich kann man sich diesen Wert auch berechnen. In der Praxis ist das
  372.     relativ einfach, da man sein Programm ja schließlich ordentlich
  373.     vorbereitet hat und dabei natürlich aus der Programmdokumentation den
  374.     Umfang aller Variablen und Strukturen sowie ihre Lebenszeit entnehmen
  375.     kann ;-)
  376.   Auf jeden Fall sollte man eine ausreichende Sicherheitsspanne dazurechnen,
  377.   denn aufgrund von Speichermangel entstehende Fehler können sehr schwer zu
  378.   finden sein.
  379.  
  380.   Faustformel:
  381.    Der benötigte Arbeitsspeicher ist
  382.       "maximaler Speicherverbrauch aller Variablen und Felder"
  383.       plus "Stackplatz"
  384.       plus "sonstiger Verwaltungskram"
  385.       plus "IO-Puffer"
  386.       plus "Sicherheitsreserve".
  387.  
  388.    Speicherverbrauch der Variablen und Felder: Kann nur abgeschätzt werden
  389.    (mankann aber auch mal mit EVERY danach forschen).
  390.    Stackplatz: Sollte man recht hoch ansetzen, wenn man ein tief
  391.    verschachteltesoder gar rekursives Programm hat. In letzterem Fall sollte
  392.    man auch noch mal genauer über den Speicherbedarf der lokalen Variablen
  393.    nachdenken!
  394.    Sonstiger Verwaltungskram: Was Bugsic halt so braucht, z.B. den Platz für
  395.    AES- und VDI-Parameterfelder. 5K reichen aber locker.
  396.    IO-Puffer: Für jedes mit OPEN geöffnete File braucht Bugsic 4K Speicher.
  397.    Reserve: Ein Sicherheitsabstand von ein paar K sollte für den Fall, daß mal
  398.    mehr Speicher benötigt wird, als man gedacht hat, immer eingeplant werden.
  399.  
  400.    Der Speicherplatz für Resourcen wird mit "Malloc" alloziert, er braucht für
  401.    $m also nicht berechnet zu werden. Denke aber daran, daß Resourcen bei ACC's
  402.    frühzeitig geladen werden müssen - wie auch alle Mallocs am Programmstart
  403.    getätigt werden müssen (erste AES-Aktion am Programmbeginn:
  404.    WIND_UPDATE(BEG_UPDATE), RSC_LOAD(), MALLOC(), WIND_UPDATE(END_UPDATE)).
  405.  
  406.    Inlines stehen übrigens im Programmtext und brauchen also nicht berechnet
  407.    zu werden.
  408.  
  409. 6. Verschiedenes:
  410. - das INTIN-Array ist auf 120 Elemente begrenzt. Daraus ergibt sich, daß
  411.   der Befehl TEXT nur Zeichenketten mit bis zu 120 Zeichen ausgeben kann, der
  412.   Rest wird abgeschnitten.
  413.   Ähnliches gilt für POLYLINE.
  414.   Generell gilt dies für alle Befehle, die viele Koordinaten an das VDI
  415.   übergeben. Das ist kein Bug, nur eine Beschränkung.
  416.  
  417. 7. Hinweise auf weitere Quellen in rein zufälliger Reihenfolge:
  418. - Von Karsten Isakovic (Maus Berlin) kreist ein Text mit Tips über
  419.   auflösungsunabhängiges Programmieren durch die Mailboxen. Unbedingt
  420.   empfehlenswert!!!
  421.   Er liegt zum Beispiel in der Quark Paderborn im Brett "Textfiles allgemein"
  422.   als "PRG_TIPS.LZH".
  423. - Von Christoph Conrad (Maus Aachen 3) stammt eine Anleitung zum Patch des
  424.   Compilers (genauer der Lib.) und Interpreters 3.6. Damit gelinkte
  425.   Programme rufen keine LineA mehr auf, wenn der Programmierer die
  426.   im Abschnitt 2 angegebenen LA-aufrufenden Befehle nicht verwendet.
  427.   Auf der Grundlage dieser Anleitung habe ich ein Programm geschrieben, das
  428.   die Patches an Interpreter und Compiler selbst durchführt. Es liegt als
  429.   Buglafix.Zoo im Brett ST-Tools in der Quark Paderborn (05251/71409,
  430.   Gastdownload frei).
  431. - Dann ist da noch die Professional-GEM-Serie von Tim Oren, die in vielen
  432.   Mailboxen als PROGEM.LZH oder PRO_GEM.LZH zu finden ist. So unter anderem
  433.   in der Quark Paderborn im Brett Textfiles Allgemein.
  434.   Tim Oren ist einer der GEM-Programmierer, schon alleine deshalb ist der
  435.   Text lesenswert. Er enthält allerhand wertvolle Tips.
  436. - Um den Interpreter unter MiNT zum Laufen zu bekommen, habe ich einen
  437.   Patch der Kategorie "brutal und wirksam" geschrieben. Zumindest auf
  438.   meinem TT funktioniert er, wenn auch prinzipbedingt deutlich instabiler
  439.   als ein ungepatchter Interpreter. (Quark PB, Brett ST-TOOLS,
  440.   Bugmntfx.zoo).
  441. - Um den Interpreter auch auf Graphikkarten wenigstens grundsätzlich zum
  442.   Laufen zu bekommen, hat Frank Baumgart ein Tool geschrieben, das die
  443.   diversen setscreens abfängt. Es liegt als BUGSSFIX.LZH im Brett ST-Tools in
  444.   der Quark Paderborn.
  445.  
  446.   Falls jemand glaubt, ich mache Werbung für die Quark PB: So ist es :-)
  447.  
  448. 8. Programmierung von Accessoires
  449.   - Wie oben schon erwähnt: Die Benutzung von $B+ und $I+ ist verboten und
  450.     führt beim Auflösungswechsel zum Absturz.
  451.   - Das Beispiel-ACC im Handbuch zu Version 3.0 auf den Seiten 52 bis 53 ist
  452.     fehlerhaft, der Block
  453.       CASE 22,41
  454.         CLOSEW#1
  455.         exit!=TRUE
  456.     sollte ersetzt werden in
  457.       CASE 22
  458.         CLOSEW#1
  459.         exit!=TRUE
  460.       CASE 41
  461.         exit!=TRUE
  462.     Bei Eintreffen der Message 41 (AC_CLOSE) ist das Fenster schon
  463.     geschlossen!
  464.   - RESERVE ist im ACC's VERBOTEN! Ebenso muß man mit Malloc vorsichtig sein,
  465.     da vom ACC's allozierter Speicher dem Hauptprogramm zugerechnet wird, und
  466.     bei Beendigung der Applikation freigegeben wird.
  467.     Wenn aber das allozieren von Speicher unbedingt notwendig ist, sollte man
  468.     aber den WIND_UPDATE-Trick von Laurenz Prüßner verwenden.
  469.   - Accessoires haben keine vollständige Basepage. Man sollte sich auf die
  470.     Werte darin nicht verlassen.
  471.   - Accessoires sind keine echten GEMDOS-Prozesse. Daraus ergeben sich eine
  472.     Reihe unerfreulicher Folgen, eine davon haben wir oben schon kennen-
  473.     gelernt (das Speicherproblem). Weitere Probleme:
  474.     - die DTA (benutzt für FSFIRST/FSNEXT/EXIST) ist defaultmäßig dieselbe,
  475.       die das laufende Hauptprogramm benutzt. Chaos kann die Folge sein!
  476.       In Accessoires sollte es üblich sein, vor allen DTA-Operationen die
  477.       DTA zu setzen!
  478.     - ACCs können (ohne größeren Aufwand und schmutzige Tricks) keine
  479.       Programme starten.
  480.  
  481. 9. Programmierung MiNT- und MultiTOS-fester Programme
  482.   - $I+ und $B+ sind unter MiNT tödlich
  483.   - RESERVE kann nur einmal zum Verkleinern des Speichers benutzt werden,
  484.     $m ist vorzuziehen
  485.   - man darf keineswegs auf fremden Speicher zugreifen
  486.   - Es ist nicht gesagt, daß zwei direkt nacheinander geMALLOCte
  487.     Speicherblöcke im direkt aufeinander folgen
  488.   - Fensterhandles können größer als nur 7 werden (MTOS)
  489.   - Fensterelemente können auch im Hintergrund bedient werden.
  490.   Programmiertip: Wird ein Pfeil oder ein Scrollbalken eines im Hintergrund
  491.   liegenden Fensters betätigt, kann man die neuzuzeichnenden Teile des
  492.   Fensters aus der Rechteckliste holen.
  493.  
  494. 10. disclaimer: Ich, Uwe Ohse, übernehme keine Verantwortung für Korrektheit
  495.   oder Vollständigkeit dieser Tips. Sollte sich durch ihre Anwendung irgendein
  496.   Problem ergeben, bin ich, egal welches Art es ist und wie schlimm es auch
  497.   sein mag, in keiner Weise dafür verantwortlich.
  498.  
  499. 11. Dieser Text ist auf Grundlage meines heutigen Wissens entstanden. Ich bin
  500.   gerne bereit, ihn zu korrigieren und zu ergänzen. Dazu brauche ich
  501.   natürlich Mitarbeit!
  502.   Die jeweils aktuellste Version dieser Mängelliste wird immmer im  Brett 120
  503.   (Textfiles allgemein) in der Quark Paderborn liegen.
  504.  
  505. 12. Alternativen:
  506.   - Pure C (sehr schnell Compiler, sehr guter Debugger, sehr gute Onlinehilfe)
  507.   - Lattice C (sehr gute Bibliotheken, schneller Compiler, hoch portabel,
  508.     Weiterentwicklung fraglich)
  509.   - GNU C (sehr gute Bibliotheken, langsamer Compiler, hoch portabel,
  510.     kostenlos, alle Sourcen erhältlich, kein funktionierender Debugger, C++ )
  511.   - Hänisch Modula II (schnell, Onlinehilfe, sehr gute Libs, für Modula
  512.            sehr portabel)
  513.   - Pure Pascal (Turbo 6.0 kompatibel, sehr guter Debugger, Onlinehilfe,
  514.            sehr schnell, Oberfläche Gift für MTOS)
  515.   - GFA 4.0, sobald es fertig ist, könnte eine werden.
  516.  
  517.   Für die C-Compiler gibt es mittlerweile eine Unzahl von Librarys, mit denen
  518.   man fast alle Probleme erschlagen kann. U.A. gibt es die MiNTLib, die eine
  519.   MiNT-Unterstützung liefert, ohne daß die Programmierer etwas daran tun
  520.   müßte, und auch garantiert, daß das Programm unter reinem TOS lauffähig ist.
  521.   Der erzeugte Code ist bei allen oben genannten Systemen gut bis sehr gut.
  522.  
  523.  
  524. Gruß und viel Spass, Uwe
  525.