home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaDemoCD2.iso / ASCII / TEXTE / SCENE / FAQ-LISTS / cfaq_6.txt < prev    next >
Encoding:
Text File  |  1995-01-03  |  18.9 KB  |  449 lines

  1. _______________          _____      _____   _________       ___________________
  2. \.            /________ |.   /_____:o    | /.        \/|___/_       \         /
  3.  \___   _____/|.   /   \||  /|.    |:    |//   ______/·|.   / ______ \    ___/
  4.    /.   /_/·  ||  /     \:  \||    |·    |/   /   \ \/ ||  /_______ \/+    /
  5.   //  ____/   ||  \   \  \   \:   ¯¯¯    |   /    / /  ||  \ /·\  /  \  __/_
  6.  //   / //    |+   \   \      \  \___/   |   \___/ /   |·   \/  \/   /      /
  7. /·   /  \\         /    \     /    |:    |        /         /       /      /
  8. \___/    \________/_____|\___/:    |_____|_______/\________/_______/______/
  9.                              l_____|·MBB·
  10.  
  11.  
  12. _ ___                  \ _
  13.   ___|__________/\______\//\________________________________________________ _
  14.   \___   /  ___/  \_____\//\______________      /\   ______/  _______/  ___ _
  15.      | _/   \ _    \_   \/     |   ___)_/_  ___/_/_  ___)_\______   \______
  16.      | \     \/     /   ||     |   \      | \      | \          /    /    /
  17.  _ __|  \__________/____||     |____      |__      |__         _____/    ___ _
  18.      `----'              `-----'   `------' `------' `---------'  `------'
  19.                                                                          
  20.                               [hOMELESS÷bBS!]
  21.  
  22.     [bIRDHOUSE^pROJECTS eUROPEAN hQ][mYTH! gERMAN hQ][aRT-cORE! fUN hQ]
  23.  
  24.             [sYSdOODE: -sLIME!^bIRDHOUSE÷pROJECTS-lEADER^mYTH!]
  25.                [cOdOODES: mOGUe!/sCX^aC! pRIMUS!/bP!-lEADER]
  26.                      [MR.VAiN/bNZ^aC! wHIRLWIND/mYTH!]
  27.  
  28.             [uPLOADER:GeNeRaTioN      ][oF:[+] PRODIGY '95 [+]]
  29.                [uPLOAD tIME:13:53:40][uPLOAD dATE:03-Jan-95]
  30.  
  31. _ ___                  \ _
  32.   ___|__________/\______\//\________________________________________________ _
  33.   \___   /  ___/  \_____\//\______________      /\   ______/  _______/  ___ _
  34.      | _/   \ _    \_   \/     |   ___)_/_  ___/_/_  ___)_\______   \______
  35.      | \     \/     /   ||     |   \      | \      | \          /    /    /
  36.  _ __|  \__________/____||     |____      |__      |__         _____/    ___ _
  37.      `----'              `-----'   `------' `------' `---------'  `------'
  38.  
  39.  
  40.  
  41.  
  42.   «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
  43.         .         .        .            .    :   ·    .
  44.    ____/¦__   ___/¦____ __/¦___________/¦__  ¦   ¦___/¦__         !
  45.    _ ____  \__\____  _//  _____\_________  \ |   | ____  \__     _:/\__
  46.     /·  |____//·  |   \\_____ ·\|   |   |  \\|   |/·  |____/     \ Oo /
  47.    //   |    \    |    \   l   \\   |   |   ·\_  //   |    \     /_--_\
  48.    \__________\________/________/___j___j     /  \__________\     :\/
  49.    -------------------------------------l____/   :-----------     ¡
  50.                                              ·   ·
  51.                     .     :   ·    .           .         .        .
  52.     !        _ ____/¦__   ¦   ¦____¦\____ ____/¦__   ___/¦____ __/¦_____ __
  53.    _:/\__    _ _ ____  \__|   |______   \ _ ____  \__\_  |  _//  _____ __ _
  54.    \ Oo /       /·  |____/|   |/· __  __/  /·  |____//·  |   \\_____ ·\
  55.    /_--_\      //   |    \|   //   |    \_//   |    \    l    \   l   \\
  56.     :\/        \__________\   \____j     /\__________\________/________/
  57.     ¡          -----------·   :----l____/-------------------------------
  58.                           ·   ·
  59.      <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
  60.  
  61.               Upload Date: [01-03-95] «» Upload Time: [07:18:26]
  62.  
  63.   «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
  64.  
  65.                     .__ _                                            r      
  66.                     :   __tHIS fILE wAS D/L fROM                     I      
  67.                  _ _02-Jan-95_________________________:              N      
  68.                    _|   \/                            |              G      
  69.                    \/       T¾R¾S¾I LEADER H¾Q     \\ ²  tRISTAR & rED      
  70.                     ­                               \ ­          sECTOR     
  71.     ö   .           |_/\________/\__.___   _/\_______ |              W      
  72.      /\             |\    ._    \   ­   \  \     ____)²             iNC.    
  73.    . \/\------------|/    |/____/        \ /     __)__!---------------.     
  74.      |\/            /     ²   /     |     \           \   4nODEZ      |     
  75.      |              \_____|   \_____²_____/___________/               !_    
  76.      |ö             |                                 |              /_/\   
  77.      |  _/\__.___   !/\_._/\________/\________/\______!  _/\______   \_\/   
  78.      |  \    ­   \  \___!\    ._    \   ._    \    ____) \    .   \   |     
  79.      00:13:39     \ /   |/    |/    /   |/    /    __)__ /    |    \_/¹     
  80.        /     |     \    |     /    /    /    /          \     |     \       
  81.        \_____²_____/____²_________/_________/___________/_____²_____/ö2Fö   
  82.                     ²                                 ²                     
  83.                    _!/\__                             |__                   
  84.                    \ Oo /   +49  p¾R¾I¾V¾A¾T¾E¾!   ___| /                   
  85.    eLITE gUYS      /_--_\                          \  //                    
  86.     wILL gET        ²\/      tHE hOLY mASTER iS     \/|                     
  87.   iNVITED hERE      !              mClOUD             ²                     
  88.                     ²  aND hIS hELPING hAND iS mARIO  :                     
  89.                     :                                                       
  90.                     ¾   aSK fOR nUMBER aND sYSPW/nUP
  91.  
  92.  
  93. @BEGIN_FILE_ID.DIZFREQUENTLY ASKED QUESTIONS ABOUT `C`
  94. -German Edition-
  95. 6-10
  96. @END_FILE_ID.DIZ
  97. /Teil 6/
  98.  
  99.           Q3.6  Warum kann ich "int f(int*,int*)" nicht als qsort()-
  100.                 Vergleichsfunktion benutzen?
  101.  
  102.  
  103.           Um einen Array von ints mit Hilfe von qsort() zu sortieren, ist
  104.           es  natürlich verlockend, die Vergleichsfunktion einfach so  zu
  105.           formulieren:
  106.  
  107.                int cmp(int *a,int *b)
  108.                {
  109.                     return *a - *b;
  110.                }
  111.  
  112.           Aber dabei handelt es  sich  um  einen  Typfehler, der zu einem
  113.           Compilerabbruch oder auch zu einem Absturz zur  Laufzeit führen
  114.           kann.
  115.                      Deklarationen, Definitionen, Prototypen           31
  116.           ---------------------------------------------------------------
  117.  
  118.  
  119.           Wenn qsort() mit  vollständigem Prototypen deklariert ist, d.h.
  120.           als
  121.  
  122.                void qsort(const void*, size_t, size_t,
  123.                     int (*)(void*,void*));
  124.  
  125.           dann ist es nicht möglich, obige Vergleichsfunktion  an qsort()
  126.           zu übergeben (ohne einen sehr häßlichen Cast, durch den es aber
  127.           auch nicht richtig würde),  weil  void*  und  int* inkompatible
  128.           Typen sind.
  129.  
  130.           Der  Grund  dafür  ist, daß ein void* durchaus größer sein darf
  131.           als  ein  int*  (was  auf  manchen Rechnern, z.B.  solchen  mit
  132.           wortadressierendem  Prozessor,  auch der Fall  ist).  Und  wenn
  133.           qsort() einen Array von ints  sortiert,  dann  übergibt  es der
  134.           Vergleichsfunktion zwar  Zeiger  auf  die  Array-Elemente, aber
  135.           nicht als int*, sondern als  void*.  (Woher  soll  qsort() auch
  136.           wissen, daß  ints  sortiert  werden  sollen?)  Die  Vergleichs-
  137.           funktion muß also ihre Parameter wieder umwandeln:
  138.  
  139.                int cmp(void *a,void *b)
  140.                {
  141.                     int *A = a;
  142.                     int *B = b;
  143.                     return *A - *B;
  144.                }
  145.  
  146.           oder
  147.  
  148.                int cmp(void *a,void *b)
  149.                {
  150.                     return *(int*)a - *(int*)b;
  151.                }
  152.  
  153.           Alles  andere  ist  fehlerhaft  und resultiert in undefiniertem
  154.           Verhalten.  (Dasselbe gilt auch für die Vergleichsfunktion  von
  155.           bsearch().)                                                (wr)
  156.           32           Deklarationen, Definitionen, Prototypen
  157.           ---------------------------------------------------------------
  158.                   Funktionen mit variabler Anzahl von Argumenten       33
  159.           ---------------------------------------------------------------
  160.  
  161.  
  162.                                      Kapitel 4
  163.  
  164.                   Funktionen mit variabler Anzahl von Argumenten
  165.  
  166.  
  167.           Q4.1  Wie programmiere ich eine Funktion mit variabler Anzahl
  168.                 von Argumenten?
  169.  
  170.  
  171.           Dies  hängt  zum  Teil vom verwendeten Compiler  ab.  Bei  K&R-
  172.           Compilern lehnen sich die Compilerbauer  im  Normalfall  an die
  173.           Unix-Technik an,  für  ANSI-Compiler  ist  der  Mechanismus  im
  174.           Standard beschrieben.
  175.  
  176.           Somit gilt für ANSI C:
  177.  
  178.                #include <stdarg.h> /* Standard-Header */
  179.  
  180.                /*
  181.                 * Laut ANSI muss die Funktion mindestens
  182.                 * ein nicht-variables Argument besitzen.
  183.                 * Hier ist es i.
  184.                 */
  185.                void funk(int i, ...)
  186.                {
  187.                     va_list ap;    /* Argument-Pointer definieren */
  188.                     int     j;     /* ein Zaehler                 */
  189.  
  190.                     /*
  191.                      * Der Argument-Pointer wird initialisiert.
  192.                      * Dazu wird das letzte nicht-variable Element
  193.                      * (hier i) benoetigt
  194.                      */
  195.                     va_start(ap, i);
  196.  
  197.                     /*
  198.                      * Mittels va_arg() und einer Typangabe kann man
  199.                      * nun die variablen Argumente nacheinander erhalten.
  200.                      * Wir nehmen hier an, dass 'i' Char-Pointer
  201.                      * uebergeben wurden
  202.                      */
  203.                     for(j = 0; j < i; j++)
  204.                          puts( va_arg(ap, char *) );
  205.  
  206.                     /*
  207.                      * Beendet wird der Zugriff mit va_end(), das man
  208.                      * nicht weglassen sollte!
  209.                      */
  210.                     va_end(ap);
  211.  
  212.                     /* weitere Operationen... */
  213.                }
  214.           34        Funktionen mit variabler Anzahl von Argumenten
  215.           ---------------------------------------------------------------
  216.  
  217.  
  218.           In K&R/Unix C schreibt man:
  219.  
  220.                #include <varargs.h>     /* Unix Header           */
  221.  
  222.                /*
  223.                 * K&R kennt kein '...'. Statt dessen wird das Makro
  224.                 * va_alist verwendet. Es ist nicht genau festgelegt,
  225.                 * ob mit einem nicht-variablen Argument begonnen werden
  226.                 * muss, wir lassen es...
  227.                 */
  228.                void funk(va_alist)
  229.                va_dcl              /* kein abschliessendes ';'!  */
  230.                {
  231.                     va_list ap;    /* Arg.-Pointer definieren    */
  232.                     int     i;     /* Anzahl Argumente           */
  233.                     int     j;     /* ein Zaehler                */
  234.  
  235.                     va_start(ap);  /* nur ein Argument           */
  236.  
  237.                     /*
  238.                      * Es wird angenommen, dass der erste Aktual-
  239.                      * Parameter ein Integer ist, der die Anzahl
  240.                      * der folgenden Parameter enthaelt
  241.                      */
  242.                     i = va_arg(ap, int);     /* Anzahl Argumente */
  243.  
  244.                     for(j = 0; j < i; j++)
  245.                          puts( va_arg(ap, char *) );
  246.  
  247.                     va_end(ap);
  248.  
  249.                     /* weitere Operationen... */
  250.                }
  251.  
  252.                                                                      (tw)
  253.  
  254.  
  255.           Q4.2  Wozu braucht man vprintf(), vsprintf() usw.?
  256.  
  257.  
  258.           Um selber Funktionen im printf()-Stil zu schreiben:
  259.  
  260.                #include <stdarg.h>
  261.                #include <stdio.h>
  262.  
  263.                void error(char *format, ...)
  264.                {
  265.                     va_list ap;
  266.  
  267.                     va_start(ap, format);
  268.                     fputs("ERROR: ", stderr);
  269.                     vfprintf(stderr, format, ap);
  270.                     va_end(ap);
  271.                }
  272.  
  273.           Obige Prozedur schreibt Fehlermeldungen nach stderr, wobei jede
  274.           Meldung mit "ERROR: " beginnt.                             (tw)
  275.                   Funktionen mit variabler Anzahl von Argumenten       35
  276.           ---------------------------------------------------------------
  277.  
  278.  
  279.           Q4.3  Wie übergebe ich ein float an eine Funktion mit variabler
  280.                 Anzahl von Argumenten? Wie ein short?
  281.  
  282.  
  283.           Das geht nur mit den direkt deklarierten, nicht  mit  den durch
  284.           '...' symbolisierten Argumenten. Die variablen Aktual-Parameter
  285.           werden "promoted": short zu Integer, float zu double.
  286.  
  287.           Ein Programm,  in  dem  sich  irgendwo  va_arg(ap,  short) oder
  288.           va_arg(ap, float) findet, gehört in den Mülleimer.         (tw)
  289.           36        Funktionen mit variabler Anzahl von Argumenten
  290.           ---------------------------------------------------------------
  291.                                Die main()-Funktion                     37
  292.           ---------------------------------------------------------------
  293.  
  294.  
  295.                                      Kapitel 5
  296.  
  297.                                 Die main()-Funktion
  298.  
  299.  
  300.           Q5.1  Wie lautet der Prototyp von main()?
  301.  
  302.                                               4
  303.           In  einem  sog.  Hosted  Environment  erlaubt der ANSI-Standard
  304.           genau zwei Arten der Definition von main():
  305.  
  306.                1. int main(int argc,char **argv)
  307.  
  308.           und
  309.  
  310.                2. int main(void)
  311.  
  312.           Identisch damit sind z.B. folgende Definitionen:
  313.  
  314.               -  mit anderen Namen der Formalparameter:
  315.  
  316.                       int main(int c, char **v)
  317.  
  318.               -  mit argv in Array-Schreibweise (identisch zu 1.):
  319.  
  320.                       int main(int argc, char *argv[])
  321.  
  322.               -  ohne Prototyp und mit implizitem  Rückgabetyp (identisch
  323.                  zu 2.):
  324.  
  325.                       main()
  326.  
  327.           Alle  anderen   Definitionen   von   main(),   incl.   das   in
  328.           Kurzprogrammen beliebte
  329.  
  330.                void main(void)
  331.  
  332.           oder das in manchen Betriebssystemen zulässige
  333.  
  334.                int main(int argc, char **argv, char **envp)
  335.  
  336.           sind laut ANSI "undefiniertes Verhalten" (siehe Q1.9).     (wr)
  337.  
  338.  
  339.           _____________
  340.  
  341.           4. Vereinfacht ausgedrückt:  Wenn  das  C-Programm  unter einem
  342.              Betriebssystem ausgeführt wird.
  343.           38                     Die main()-Funktion
  344.           ---------------------------------------------------------------
  345.  
  346.  
  347.           Im  Gegensatz  zum  Hosted  Environment kennt der ANSI-Standard
  348.                                            5
  349.           noch ein Freestanding Environment . Für ein solches  wird nicht
  350.           einmal  verlangt,  daß  eine  Funktion  mit  dem  Namen  main()
  351.           existiert oder  wie sie auszusehen hat. Allerdings ist es nicht
  352.           zulässig,  diesen   Freibrief   auf   Hosted   Environments  zu
  353.           übertragen.                                                (tw)
  354.  
  355.  
  356.           Q5.2  Was ist mit dem Rückgabewert von main()?
  357.  
  358.  
  359.           Der Wert, den main()  zurückgibt,  wird  an  die Aufrufumgebung
  360.           zurückgeliefert.  Startet man z.B. ein kompiliertes  C-Programm
  361.           mit  der  Funktion  system(),   so   ist   (normalerweise)  der
  362.           Rückgabewert von system() genau  der  Rückgabewert  der main()-
  363.           Funktion des Programms.
  364.  
  365.           Alternativ zu "return x;"  in  main()  kann man "exit(x);" ver-
  366.           wenden. Die Frage, welches davon besser ist, läßt sich objektiv
  367.           nicht  beantworten;  ANSI-C  garantiert,  daß   beide  dasselbe
  368.           machen.
  369.  
  370.           Welche Rückgabewerte von main() zulässig sind, hängt  stark vom
  371.           jeweiligen Betriebssystem ab. In jedem Fall wird  der Rückgabe-
  372.           wert 0  verstanden, um  eine  ordnungsgemäße  Terminierung  des
  373.           Programms zu markieren. Anstelle von 0  kann  auch EXIT_SUCCESS
  374.           verwendet werden. Für eine Terminierung  mit  Fehler  wurde der
  375.           Wert EXIT_FAILURE eingeführt.                              (wr)
  376.  
  377.  
  378.           _____________
  379.  
  380.           5. Z.B.  Microcontroller  ohne   eigenes   Betriebssystem  oder
  381.              Betriebssysteme selber.
  382.                                  Arrays & Pointer                      39
  383.           ---------------------------------------------------------------
  384.  
  385. /Ende von Teil 6/
  386.  
  387. Keep hacking
  388. Wolfram
  389.  
  390.  
  391.  
  392.  
  393.   «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
  394.         .         .        .            .    :   ·    .
  395.    ____/¦__   ___/¦____ __/¦___________/¦__  ¦   ¦___/¦__         !
  396.    _ ____  \__\____  _//  _____\_________  \ |   | ____  \__     _:/\__
  397.     /·  |____//·  |   \\_____ ·\|   |   |  \\|   |/·  |____/     \ Oo /
  398.    //   |    \    |    \   l   \\   |   |   ·\_  //   |    \     /_--_\
  399.    \__________\________/________/___j___j     /  \__________\     :\/
  400.    -------------------------------------l____/   :-----------     ¡
  401.                                              ·   ·
  402.                     .     :   ·    .           .         .        .
  403.     !        _ ____/¦__   ¦   ¦____¦\____ ____/¦__   ___/¦____ __/¦_____ __
  404.    _:/\__    _ _ ____  \__|   |______   \ _ ____  \__\_  |  _//  _____ __ _
  405.    \ Oo /       /·  |____/|   |/· __  __/  /·  |____//·  |   \\_____ ·\
  406.    /_--_\      //   |    \|   //   |    \_//   |    \    l    \   l   \\
  407.     :\/        \__________\   \____j     /\__________\________/________/
  408.     ¡          -----------·   :----l____/-------------------------------
  409.                           ·   ·
  410.      <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
  411.  
  412.               Upload Date: [01-03-95] «» Upload Time: [07:18:26]
  413.  
  414.   «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
  415.  
  416.                                                           [-AquaAdder v1.0-]
  417.  
  418.  
  419.  
  420.  
  421.  
  422.    
  423.                             -sLiME!^bP·LEADER^mTH!
  424.                          mOGUe!^aC! pRIMUS!/bP·lEADER
  425.                       wHIRLWIND/mTH! MR.VAIN/BNZ^sXi^aC!
  426.  
  427. -- --- ---- pHUKKIN' fAST aMIGA ^ wORLD'S lARGEST cHIPTUNE aREA ---- --- --
  428.       ____
  429.   ___|    |_____________  __________________   ____________________________
  430. _/  _|    |   ._________\/__________  \   _/___\______  \   _____/   _____/
  431. \   \.    |   l/    /   \/    |  _____/_  l     /  _____/\____  _/\____  \_
  432.  \___|    |________/____||-Mo!|________________/_______\ _______\ ________/
  433.      l____|              l____|                         \/       \/
  434.  
  435.     -- --- ---- aMI-eX fREE-lEECH ^ bIG aSCII bASE © bY aC! ---- --- --
  436.  
  437.    -- mYTH! gHQ - -÷- - bIRDHOUSE pROJECTS! eHQ - -÷- - aRT-cORE! eHQ --
  438.  
  439. _______________          _____      _____   _________       ___________________
  440. \.            /________ |.   /_____:o    | /.        \/|___/_       \         /
  441.  \___   _____/|.   /   \||  /|.    |:    |//   ______/·|.   / ______ \    ___/
  442.    /.   /_/·  ||  /     \:  \||    |·    |/   /   \ \/ ||  /_______ \/+    /
  443.   //  ____/   ||  \   \  \   \:   ¯¯¯    |   /    / /  ||  \ /·\  /  \  __/_
  444.  //   / //    |+   \   \      \  \___/   |   \___/ /   |·   \/  \/   /      /
  445. /·   /  \\         /    \     /    |:    |        /         /       /      /
  446. \___/    \________/_____|\___/:    |_____|_______/\________/_______/______/
  447.                              l_____|·MBB·
  448.  
  449.