home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tc20 / helpme.doc < prev    next >
Text File  |  1988-10-13  |  22KB  |  514 lines

  1.         TURBO C 2.0: ANTWORTEN AUF ALLGEMEINE FRAGEN
  2.  
  3.  
  4.  I n s t a l l a t i o n    u n d    S t a r t
  5.  ----------------------------------------------------------------------
  6.  F. Wie wird Turbo C auf meinem System installiert?
  7.  A. Legen Sie die Diskette 1 ("INSTALL/HELP") in das Laufwerk A:
  8.     Ihres Computers, setzen Sie dieses Laufwerk mit dem Befehl
  9.  
  10.       A: <RETURN>
  11.  
  12.     auf der DOS-Kommandoebene als Standard und geben Sie dann den
  13.     Befehl
  14.  
  15.       INSTALL <RETURN>
  16.  
  17.     INSTALL fragt nun als erstes zurück, von welchem Disketten-
  18.     laufwerk die Dateien gelesen werden sollen. Tippen Sie
  19.  
  20.       A: <RETURN>
  21.  
  22.     Als nächstes erscheint nun das Menüsystem von INSTALL, wobei
  23.     der untere Bildschirmrand grundsätzlich Erläuterungen zum
  24.     jeweils gewählten Punkt enthält. Folgen Sie diesen Anweisungen.
  25.  
  26.  F. Wie wird Turbo C nach der Installation gestartet?
  27.  A. Setzen Sie das Directory als Standard, das Sie auch bei
  28.     der Installation mit INSTALL angegeben haben und geben
  29.     Sie dann (auf der DOS-Kommandoebene) den Befehl
  30.  
  31.     TC <RETURN>
  32.  
  33.     Das Kapitel 2 des Benutzerhandbuchs zeigt schrittweise,
  34.     wie es von diesem Punkt an weitergeht.
  35.  
  36.  F. Wo liegen die Unterschiede zwischen TC.EXE und TCC.EXE?
  37.  A. Das Turbo C-Programmierpaket enthält zwei voneinander unabhängige
  38.     Compiler: die integrierte Entwicklungsumgebung (TC.EXE) und die
  39.     Kommandozeilen-Version TCC.EXE.
  40.       Bei ersterer handelt es sich um einen "Programmverbund" aus
  41.     Compiler, Editor, Debugger, kontextbezogener Hilfestellung usw., wobei
  42.     die einzelnen Funktionen über ein Menüsystem miteinander verbunden sind;
  43.     bei zweiterem um einen reinen Compiler, der durch die Eingabe
  44.     einer Kommandozeile (von der DOS-Kommandoebene aus) gestartet wird
  45.     und während der Bearbeitung eines C-Quelltextes keine weitere
  46.     Interaktion mit dem Benutzer ausführt.
  47.  
  48.  F. Was ist eine "Konfigurationsdatei"?
  49.  A. Über eine Konfigurationsdatei wird Turbo C mitgeteilt, welche
  50.     Einstellungen (Compiler-Schalter, Optionen usw.) als Standard ver-
  51.     wendet werden sollen und in welchen Directories sich Include-
  52.     Dateien bzw. Bibliotheken befinden.
  53.       TC.EXE - die integrierte Entwicklungsumgebung - sucht beim
  54.     Start nach einer Datei namens TCCONFIG.TC; TCC.EXE - die
  55.     Kommandozeilen-Version des Compilers - nach einer Datei namens
  56.     TURBOC.CFG.
  57.  
  58.  F. Wie werden Konfigurationsdateien erzeugt?
  59.  A. Von der integrierten Entwicklungsumgebung aus: durch die
  60.     Auswahl von Options/Save options. Turbo C speichert hier
  61.     sämtliche Daten, die von den durch Borland gesetzten
  62.     Vorgaben abweichen, in einer Datei, die standardmäßig
  63.     den Namen TCCONFIG.TC trägt.
  64.       Für die Kommandozeilen-Version: entweder durch
  65.     Konvertierung der Datei TCCONFIG.TC mit dem Programm
  66.     TCCONFIG.EXE (siehe Referenzhandbuch, Seite 45) oder
  67.     durch die direkte Eingabe mit einem ASCII-Editor (siehe
  68.     Referenzhandbuch, Anhang C).
  69.  
  70.  I n t e g r i e r t e   E n t w i c k l u n g s u m g e b u n g
  71.  ----------------------------------------------------------------------
  72.  F. Anscheinend findet Turbo C meine mit #include <...> angegebenen
  73.     Dateien nicht. Wieso?
  74.  A. Der Compiler sucht Include-Dateien in den Directories, die über
  75.     Options/Directories/Include directories angegeben sind. Das Pro-
  76.     gramm INSTALL trägt hier das Directory ein, in das auch die
  77.     *.H-Dateien von den Originaldisketten kopiert wurden.
  78.       Wenn Sie eigene Include-Dateien erstellen und diese Dateien
  79.     in einem anderen Verzeichnis speichern, müssen Sie den Eintrag
  80.     in O/D/Include directories entsprechend erweitern.
  81.  
  82.  F. Ich erhalte die Meldung 'Linker error: Unable to open
  83.     input file 'C0x.OBJ'' ab. Wieso?
  84.  A. Der Linker sucht den Startcode und die Laufzeitbibliotheken in den
  85.     Directories, die über Options/Directories/Library directories an-
  86.     gegeben sind. Das Programm INSTALL trägt hier das Directory ein,
  87.     in das auch die *.LIB und *.OBJ-Dateien von den Originaldisketten
  88.     kopiert wurden.
  89.  
  90.  F. Wie kriege ich den Compiler dazu, meine eigenen Bibliotheken anstelle
  91.     der Standardbibliotheken einzubinden? Wie sieht es mit mehreren
  92.     Quelltexten für ein Programm aus?
  93.  A. Siehe Benutzerhandbuch, Kapitel 3.
  94.  
  95.  
  96.  F. Der Linker beharrt darauf, Funktionen wie initgraph() nicht zu
  97.     kennen. Wieso?
  98.  A. Setzen Sie den Schalter Options/Linker/Graphics Library auf ON oder
  99.     definieren Sie eine .PRJ-Datei, die graphics.lib explizit aufführt.
  100.  
  101.  F. Bei der Compilierung eines ganz gewöhnlichen Programms reagiert der
  102.     Compiler auf die Zeile #include <stdio.h> mit der Meldung
  103.     "'Unable to open include file 'stdarg.h'".
  104.  A. Aller Wahrscheinlichkeit nach wurde die Maximalzahl von Dateien
  105.     überschritten, die DOS gleichzeitig offen halten kann. Fügen
  106.     Sie Ihrer Datei CONFIG.SYS die Zeile
  107.  
  108.         FILES=20
  109.  
  110.     hinzu - danach reserviert DOS genügend Platz, um bis zu 20
  111.     Dateien gleichzeitig bearbeiten zu können.
  112.       ACHTUNG: Die Datei CONFIG.SYS wird nur beim Start des Systems
  113.     ausgewertet - Sie müssen den Computer also neu starten, damit
  114.     Ihre Änderungen wirksam werden.
  115.  
  116.  F. Die Farben der Menüs von Turbo C passen *absolut* nicht zu meinem
  117.     Schreibtisch. Was tun?
  118.  A. Benutzen Sie TCINST.EXE zur Verwirklichung Ihrer eigenen Vorstellungen.
  119.  
  120.  
  121.  F. Wie läßt sich ein Quelltext am einfachsten auf den Drucker bringen?
  122.  A. Aktivieren Sie den Editor von Turbo C, laden Sie den Quelltext und
  123.     geben sie den Tastenbefehl Ctrl-K-P. Dieser Befehl sendet entweder
  124.     den momentan (mit Ctrl-K-B und Ctrl-K-K markierten) Block zum Drucker
  125.     - oder, falls überhaupt kein Block markiert ist, die gesamte Datei.
  126.  
  127.  F. Beim Aufruf von MAKE, Run oder bei der Aktivierung des Debuggers
  128.     übersetzt der Compiler manchmal verschiedene Teile meines Programms
  129.     von neuem - obwohl die einzelnen Module wirklich bereits auf dem
  130.     letzten Stand der Dinge sind.
  131.  A. MAKE orientiert sich ausschließlich an Datum und Uhrzeit
  132.     der einzelnen Dateien. Wenn Sie beispielsweise mit setfattr() expe-
  133.     rimentiert und einem Ihrer Quelltexte ein "Zukunftsdatum" verpaßt
  134.     haben, dann wird die entsprechende .OBJ-Datei für MAKE bis zum
  135.     tatsächlichen Erreichen dieses Zeitpunkts immer "älter" sein.
  136.     Diese und ähnliche Probleme lassen sich mit TOUCH lösen - einem
  137.     Programm, das sämtlichen angegebenen Dateien die momentane System-
  138.     zeit gibt.
  139.  
  140.  
  141.  K o m m a n d o z e i l e n - V e r s i o n
  142.  ----------------------------------------------------------------------
  143.  F. Anscheinend findet Turbo C meine mit #include <...> angegebenen
  144.     Dateien nicht. Wieso?
  145.  A. Der Compiler sucht Include-Dateien in den Directories, die über
  146.     den Parameter -I angegeben sind. Das Programm INSTALL erzeugt eine
  147.     Konfigurationsdatei (TURBOC.CFG), die von TCC.EXE automatisch gelesen
  148.     wird und in der das Directory eingetragen ist, in das auch die
  149.     *.H-Dateien von den Originaldisketten kopiert wurden.
  150.  
  151.  F. Ich erhalte die Meldung "Linker error: Unable to open
  152.     input file 'C0x.OBJ'". Wieso?
  153.  A. Der Linker sucht den Startcode und die Laufzeitbibliotheken in den
  154.     Directories, die über den Parameter -L der Konfigurationsdatei
  155.     TURBOC.CFG angegeben sind. Das Programm INSTALL trägt hier das
  156.     Directory ein, in das auch die *.LIB und *.OBJ-Dateien von den
  157.     Originaldisketten kopiert wurden.
  158.       Hinweis: Bei einem direkten Aufruf von TLINK müssen Sie den Such-
  159.     weg für Bibliotheken und Startcode explizit angeben - TLINK liest
  160.     die Konfigurationsdatei TURBOC.CFG *nicht*.
  161.  
  162.  F. Der Linker beharrt darauf, Funktionen wie initgraph() nicht zu
  163.     kennen. Wieso?
  164.  A. TCC sucht die Grafik-Bibliothek (graphics.lib) nur nach expliziter
  165.     Anweisung ab. Zur Compilierung von BGIDEMO ist beispielsweise die
  166.     folgende Kommandozeile notwendig:
  167.  
  168.     TCC BGIDEMO.C GRAPHICS.LIB <RETURN>
  169.  
  170.      Hinweis: Hier wurde vorausgesetzt, daß eine Konfigurationsdatei
  171.      TURBOC.CFG mit den Suchwegen für Bibliotheksdateien existiert.
  172.  
  173.  
  174.  E i n -   u n d   A u s g a b e
  175.  ----------------------------------------------------------------------
  176.  F. Die Befehle  cprintf("Hello\n"); cprintf("world\n"); ergeben
  177.  
  178.        Hello
  179.         world
  180.  
  181.     Woran liegt das?
  182.  A. cprintf() arbeitet in der Version 2.0 von Turbo C so, wie
  183.     es eigentlich von Anfang an vorgesehen war - '\n' wird nicht
  184.     (wie bei printf) in eine CR/LF-Kombination "übersetzt", sondern
  185.     tatsächlich als einzelnes LF-Zeichen ausgegeben.
  186.       Wenn Sie den Cursor nicht nur eine Zeile tiefer, sondern auch
  187.     noch wieder in die Spalte 1 dieser Zeile setzen wollen, müssen Sie
  188.     das CR-Zeichen beim Aufruf von cprintf() direkt angeben: Die Befehls-
  189.     folge cprintf("Hello\n\r"); cprintf("world\n\r"); erzeugt das gewünschte
  190.     Ergebnis (wobei es keine Rolle spielt, ob '\r' vor '\n' oder danach
  191.     angegeben wird).
  192.  
  193.  F. Wie kann ich mit einem Programm Ausgaben auf dem Drucker erzeugen?
  194.  A. Ab der Version 1.5 von Turbo C ist eine FILE-Variable namens stdprn
  195.     in der Datei stdio.h definiert, die beim Start des Programms auto-
  196.     matisch geöffnet wird. Ein Beispiel dazu:
  197.  
  198.     #include <stdio.h>
  199.     main()
  200.     { fprintf(stdprn, "Hello, world\n");
  201.     }
  202.  
  203.     Die meisten Drucker arbeiten übrigens mit einer zeilenweisen Pufferung -
  204.     tatsächlich gedruckt wird also erst nach dem abschließenden '\n'.
  205.  
  206.  F. Bei der Bearbeitung einer Binärdatei scheint sich Merkwürdiges zu tun,
  207.     wenn die Werte 0x0D und 0x0A gelesen oder geschrieben werden. Was tun?
  208.  A. Wahrscheinlich haben Sie die Datei ohne den Zusatz "b" geöffnet -
  209.     die Routinen zur Dateibearbeitung gehen dann von einer Textdatei aus
  210.     und übersetzen die Bytefolge 0x0D 0x0A als "CR/LF" in ein einzelnes LF beim
  211.     Lesen bzw. erweitern den Wert 0x0A als "LF" auf eine CR/LF-Folge beim
  212.     Schreiben.
  213.       Öffnen Sie die Datei explizit im Binärmodus, wie es das folgende
  214.     Beispiel zeigt:
  215.  
  216.       #include <stdio.h>
  217.       main()
  218.       {  FILE *binary_fp;
  219.          char buffer[100];
  220.  
  221.          binary_fp = fopen("MYFILE.BIN", "rb");
  222.  
  223.          fread(buffer, sizeof(char), 100, binary_fp);
  224.  
  225.                     :
  226.       }
  227.  
  228.  
  229.  F. Wieso weigern sich printf() und puts(), farbige Zeichen zu erzeugen?
  230.  A. Weil diese beiden Funktionen mit Standardattributen arbeiten. Für
  231.     bunte Ausgaben und andere Spezialitäten des IBM PC sind die Routinen
  232.     cprintf() und cputs() vorgesehen:
  233.  
  234.       #include <conio.h>
  235.       main()
  236.       {
  237.       textcolor(BLUE);
  238.       cprintf("Ich bin blau.");     /* Hick! */
  239.       }
  240.  
  241.  
  242.  F. Wie wird ein long-Wert mit printf ausgegeben?
  243.  A. Mit "%ld":
  244.  
  245.       long int l = 70000L;
  246.       printf("%ld", l);
  247.  
  248.  
  249.  F. Wie wird ein Wert im Format long double (= Extended) ausgegeben?
  250.  A. Mit "%Lf":
  251.  
  252.       long double ldbl = 1E500;
  253.       printf("%Lf", ldbl);
  254.  
  255.  
  256.  B e i s p i e l p r o g r a m m e
  257.  ----------------------------------------------------------------------
  258.  F. Wie wird MCALC compiliert?
  259.  A. Siehe Benutzerhandbuch, Anhang G.
  260.  
  261.  
  262.  F. Wie wird BGIDEMO compiliert und gestartet?
  263.  A. 1. Die folgenden Dateien müssen sich im momentan gesetzten Directory
  264.        befinden:
  265.  
  266.          BGIDEMO.C
  267.      *.BGI       <- die Grafiktreiber
  268.      *.CHR       <- die Zeichensätze
  269.  
  270.     2. Starten Sie TC mit dem Befehl
  271.  
  272.     TC bgidemo <RETURN>
  273.  
  274.     3. Geben Sie den Tastenbefehl Ctrl-F9.
  275.  
  276.  
  277.  F. Wie läßt sich mit Turbo C eine .COM-Datei erzeugen?
  278.  A. Zusammen mit den DOS-Versionen bis (inklusive) 3.2 wird ein Programm
  279.     namens EXE2BIN ("EXE to Binary") ausgeliefert, über das sich
  280.     .EXE-Programme des Speichermodells TINY ins .COM-Format umwandeln
  281.     lassen.
  282.       Wenn Sie EXE2BIN nicht ihr eigen nennen: der zur Kommandozeilen-
  283.     Version von Turbo C gehörige Linker läßt sich bei der Compilierung
  284.     von TINY-Programmen mit dem neuen Parameter /t aufrufen und spart
  285.     den Umweg über eine .EXE-Datei. Der Aufruf von TCC mit
  286.  
  287.      tcc -mt -lt hello
  288.  
  289.     compiliert HELLO.C und erzeugt dann die Datei HELLO.COM. (Das "-l" im
  290.     Parameter "-lt" steht für "direkte Weitergabe des folgenden Befehls" -
  291.     also "t" - an den Linker, vgl. Referenzhandbuch, Anhang D).
  292.  
  293.     Hinweis: die mathematische Bibliothek von Turbo C arbeitet wegen des
  294.     Emulators in jedem Modell mit mehreren Segmenten. TINY-Programme, die
  295.     Fließkommazahlen und -routinen benutzen, lassen sich deshalb auch mit
  296.     TLINK nicht im .COM-Format speichern.
  297.  
  298.  
  299.  G r a f i k
  300.  ----------------------------------------------------------------------
  301.  F. Mein Programm endet bei der ersten Grafikfunktion mit der Meldung
  302.  
  303.        BGI Error: graphics not initialized (use 'initgraph')
  304.  
  305.     - und das, obwohl initgraph() definitiv vorher aufgerufen wurde.
  306.  A. initgraph() hat seine Funktion aus irgendeinem Grund (höchstwahr-
  307.     scheinlich: Grafiktreiber nicht im momentan gesetzten Directory)
  308.     nicht erfüllen können. Fügen Sie nach dem Aufruf von initgraph() eine
  309.     Prüfung des Ergebnisses von graphresult() ein und ermitteln Sie auf
  310.     diese Weise den Fehlerstatus des Grafikpakets:
  311.  
  312.       #include <graphics.h>
  313.       main()
  314.       { int gerr;   /* für das Ergebnis von graphresult() */
  315.         int gdriver = DETECT, gmode;
  316.  
  317.     /* Initialisierung des Grafikpakets über die automatische
  318.        Prüfung der Hardware. .BGI- und .CHR-Dateien werden im
  319.        Directory C:\TURBOC gesucht:
  320.     */
  321.     initgraph(&gdriver, &gmode, "C:\\TURBOC");  /* "\\" ! */
  322.  
  323.         if ((gerr = graphresult()) != grOk)
  324.     {   printf("Fehler : %s\n", grapherrormsg(gerr));
  325.             exit(1);
  326.         }
  327.  
  328.      /* ..... */
  329.       }
  330.  
  331.  
  332.  M a t h e m a t i s c h e s
  333.  ----------------------------------------------------------------------
  334.  F. Die mathematischen Bibliotheksfunktionen liefern völlig unsinnige
  335.     Ergebnisse.
  336.  A. Vor der Verwendung von Funktionen wie cos() und tan() *müssen*
  337.     Sie math.h mit #include in ihr Programm aufnehmen - ansonsten
  338.     nimmt der Compiler an, daß diese Routinen den (Standard-)Ergebnistyp
  339.     int haben und codiert entsprechende Zuweisungen. Da die meisten
  340.     mathematischen Routinen Werte vom Typ double liefern, sind die
  341.     Ergebnisse tatsächlich recht wunderlich. Beispiel:
  342.  
  343.     /* FUNKTIONIERT NICHT */           /* O.K. */
  344.                                           #include <math.h>
  345.         main()                            main()
  346.         {                                 {
  347.           printf("%f", cos(0));             printf("%f", cos(0));
  348.         }                                 }
  349.  
  350.  
  351.  F. Lassen sich Fließkomma-Fehler durch ein Programm abfangen?
  352.  A. Die Funktion signal() ist unter anderem für die Behandlung von
  353.     Fehlerbedingungen des Emulators und des 8087 bei direkten Befehlen
  354.     vorgesehen; die Funktion matherr() für Bereichsüberschreitungen und
  355.     unzulässige Argumente bei Routinen der Laufzeitbibliothek. Die ent-
  356.     sprechenden Beschreibungen finden Sie im Referenzhandbuch.
  357.  
  358.  
  359.  L i n k e r
  360.  ----------------------------------------------------------------------
  361.  F. Was hat die Meldung "Linker Error: Unable to open input file 'C0x.OBJ'"
  362.     zu bedeuten?
  363.  A. Siehe "Integrierte Entwicklungsumgebung" in dieser Datei.
  364.  
  365.  
  366.  F. Welchen Grund hat die Meldung "Linker Error: Undefined symbol '_main'
  367.     in module C0"?
  368.  A. *Jedes* C-Programm muß genau eine Funktion mit dem Namen main
  369.     definieren. Diese Funktion wird als "Hauptprogramm" durch den Start-
  370.     code aufgerufen.
  371.     (Daß der Linker dem Namen _main hier einen Unterstrich voranstellt,
  372.     liegt an den allgemeinen Regeln zur Namensgebung in C - main ist
  373.     ein global gültiges Symbol).
  374.  
  375.  F. Wieso beharrt der Linker darauf, daß die Funktionen des Grafikpakets
  376.     "undefiniert" sind?
  377.  A. Siehe "Integrierte Entwicklungsumgebung" und "Kommandozeilen-Version"
  378.     in dieser Datei.
  379.  
  380.  F. Was bitte ist ein 'Fixup overflow'?
  381.  A. Siehe Benutzerhandbuch, Anhang D.
  382.  
  383.  F. Ich habe versucht, eigene Maschinenroutinen in mein C-Programm ein-
  384.     zubinden - mit dem Ergebnis, daß diese Routinen für den Linker
  385.     sämtlich "undefiniert" sind.
  386.  A. Wahrscheinlich haben Sie einen der beiden folgenden Punkte übersehen:
  387.  
  388.     ■ C stellt jedem externen Bezeichner einen Unterstrich voran. Eine
  389.       Routine, die im C-Quelltext als MyFunc deklariert ist, muß
  390.       im Assembler-Quelltext als _MyFunc erscheinen.
  391.     ■ Die meisten Assembler arbeiten ohne Unterscheidung zwischen Groß-
  392.       und Kleinschreibung, solange sie nicht mit einem entsprechenden
  393.       Zusatzparameter (für MASM und TASM: /MX) aufgerufen werden - und
  394.       für den Linker von Turbo C sind _MYFUNC und _MyFunc zwei völlig
  395.       verschiedene Dinge.
  396.     Weitere Details finden Sie in Kapitel 12 des Benutzerhandbuchs.
  397.  
  398.  
  399.  D i v e r s e s
  400.  ----------------------------------------------------------------------
  401.  F. Wie läßt sich die Standardgröße des Stacks (4096 Bytes) ändern?
  402.  A. Die Größe des Bereichs, den Turbo C für den Stack reserviert, wird
  403.     zur Laufzeit des Programms durch den Wert der globalen Variablen
  404.     _stklen festgelegt. Die folgende Deklaration legt beispielsweise
  405.     fest, daß der Stack einen Umfang von 10000 Bytes haben soll:
  406.  
  407.       extern unsigned _stklen = 10000;
  408.  
  409.     Achtung: diese Anweisung darf sich nicht innerhalb einer Funktions-
  410.     definition befinden.
  411.  
  412.  F. Mein Programm bricht mit der Meldung 'Stack Overflow!' ab. Was tun?
  413.  A. Eine Möglichkeit besteht in einer Vergrößerung des Stacks (siehe
  414.     oben); eine weitere in der Deklaration statischer anstelle
  415.     dynamischer lokaler Variablen:
  416.  
  417.          main()                        main()
  418.      { char x[5000];               { static char x[5000];
  419.     /* belegt 5000 Bytes auf    /* belegt 5000 Bytes im Datensegment */
  420.        dem Stack */
  421.          }                             }
  422.  
  423.     ACHTUNG: "Speicherung im Datensegment" bedeutet hier auch: diese Variablen
  424.     werden bei Rekursion nicht erneut kopiert.
  425.  
  426.  F. Mein Programm gibt nach seinem (anscheinend ordnungsgemäßen) Ende
  427.     die beunruhigende Meldung 'Null pointer assignment' aus.
  428.  A. Das bedeutet, daß Ihr Programm entweder eine Zuweisung über einen
  429.     (vermutlich nicht initialisierten) Zeiger mit dem Wert NULL ausge-
  430.     führt oder den Anfang seines Datensegments auf andere Art und Weise
  431.     durcheinander gebracht hat.
  432.       Hinweis: Die entsprechende Prüfung (nämlich einen Vergleich vor dem
  433.     Rücksprung zu DOS, ob die Konstante 'Copyright Borland International'
  434.     am Anfang des Datensegments unversehrt geblieben ist), findet nur in
  435.     den Modellen SMALL und COMPACT statt. Bei Verwendung eines anderen
  436.     Speichermodells erscheint die Meldung also plötzlich nicht mehr -
  437.     was aber nur bedeutet, daß der Programmierfehler nicht automatisch
  438.     entdeckt werden konnte.
  439.  
  440.  F. Wieso sind die mit TC.EXE erzeugten .EXE-Dateien größer als bei
  441.     einer Compilierung durch die Kommandozeilen-Version?
  442.  A. Die integrierte Entwicklungsumgebung bringt standardmäßig
  443.     Informationen zur Fehlersuche mit dem integrierten Debugger in der
  444.     .EXE-Datei unter (was auf die Ausführungsgeschwindigkeit übrigens
  445.     keinen Einfluß hat). Diese zusätzlichen Informationen lassen sich
  446.     mit Debug/Source debugging..None unterdrücken.
  447.  
  448.  F. Der Compiler meldet sich nach einem #include <dos.h> mit
  449.     "Declaration syntax error".
  450.  A. Sie haben O/C/Source/ANSI keywords only auf ON gesetzt. Dieser Schalter
  451.     muß bei Verwendung von DOS.H auf OFF bleiben, weil diese Datei einige
  452.     reservierte Wörter enthält, die nicht dem ANSI-Standard entsprechen.
  453.  
  454.  F. Ich habe ein Programm mit dynamischer Speicherverwaltung via malloc()
  455.     und/oder calloc() geschrieben, das in den kleinen Datenmodellen
  456.     (TINY, SMALL und MEDIUM) anstandslos funktioniert. Wenn ich aber
  457.     eines der "großen" Modelle (COMPACT, LARGE oder HUGE) verwende,
  458.     hängt sich das System auf.
  459.  A. In diesen Modellen liefern malloc(), calloc() usw. FAR-Zeiger zurück -
  460.     und deshalb *müssen* Sie die Datei ALLOC.H mit in Ihr Programm
  461.     aufnehmen. Ansonsten erwartet der Compiler den (Standard-)Ergebnistyp
  462.     int (= NEAR-Zeiger).
  463.  
  464.  F. Beim Einbinden eines selbstgeschriebenen Maschinenprogramms moniert
  465.     der Linker die entsprechenden Symbole als "undefiniert".
  466.  A. Siehe "Linker" in dieser Datei.
  467.  
  468.  F. Kann ich mehr als 64 KByte globaler Variablen deklarieren?
  469.  A. In allen Modellen außer HUGE dürfen globale und statische Variablen
  470.     des *gesamten* Programms maximal 64 KByte belegen. Im Modell HUGE
  471.     kann jedes *Modul* bis zu 64 KByte Daten definieren.
  472.  
  473.  F. Wie läßt sich ein Array deklarieren, das mehr als 64 KByte Gesamt-
  474.     umfang hat?
  475.  A. Arrays mit einem Umfang von mehr als 64 KByte müssen zur Laufzeit
  476.     des Programms dynamisch belegt und über HUGE-Zeiger adressiert werden,
  477.     sind aber in jedem der "großen Datenmodelle" möglich (d.h. nicht nur
  478.     im Modell HUGE). Ein Array, das man normalerweise als
  479.  
  480.        char array[1024][128];
  481.  
  482.     deklarieren würde, wird hier folgendermaßen formuliert:
  483.  
  484.       #include <alloc.h>
  485.  
  486.       char (huge *array)[128];  /* ein HUGE-Zeiger auf ein Array mit
  487.                    128 Zeigerelementen */
  488.       main()
  489.        {
  490.           array = farcalloc(sizeof(*array), 1024);
  491.        }
  492.  
  493.     Der Aufruf von farcalloc belegt für jedes der 128 Elemente des
  494.     Arrays 1024 Bytes Platz auf dem Heap. Nach dieser Initialisierung
  495.     läßt sich das Array in derselben Weise wie eine statische Variable
  496.     adressieren. Eine Zuweisung wie
  497.  
  498.     i = array[30][56];
  499.  
  500.     setzt die Variable i auf den Wert des 31. Elements des 57. Arrays.
  501.  
  502.  
  503.  F. Wie lassen sich mit Turbo C geschriebene Routinen in ein Turbo Pascal-
  504.     Programm einbinden?
  505.  A. Siehe CPASDEMO.PAS und CPASDEMO.C auf der Originaldiskette 6 in der
  506.     Datei EXAMPLES.ARC. (Diese Datei wird von INSTALL via UNPACK auto-
  507.     matisch ins "Turbo directory" ausgepackt).
  508.  
  509.  F. Wie lassen sich mit Turbo C geschriebene Routinen in ein Clipper-
  510.     Programm einbauen?
  511.  A. Falls sich dabei irgendwelche Probleme ergeben sollten, müssen wir
  512.     auf die Hotline der Firma Nantucket verweisen (von der dieser dBASE-
  513.     Compiler stammt).
  514.