home *** CD-ROM | disk | FTP | other *** search
- _______________ _____ _____ _________ ___________________
- \. /________ |. /_____:o | /. \/|___/_ \ /
- \___ _____/|. / \|| /|. |: |// ______/·|. / ______ \ ___/
- /. /_/· || / \: \|| |· |/ / \ \/ || /_______ \/+ /
- // ____/ || \ \ \ \: ¯¯¯ | / / / || \ /·\ / \ __/_
- // / // |+ \ \ \ \___/ | \___/ / |· \/ \/ / /
- /· / \\ / \ / |: | / / / /
- \___/ \________/_____|\___/: |_____|_______/\________/_______/______/
- l_____|·MBB·
-
-
- _ ___ \ _
- ___|__________/\______\//\________________________________________________ _
- \___ / ___/ \_____\//\______________ /\ ______/ _______/ ___ _
- | _/ \ _ \_ \/ | ___)_/_ ___/_/_ ___)_\______ \______
- | \ \/ / || | \ | \ | \ / / /
- _ __| \__________/____|| |____ |__ |__ _____/ ___ _
- `----' `-----' `------' `------' `---------' `------'
-
- [hOMELESS÷bBS!]
-
- [bIRDHOUSE^pROJECTS eUROPEAN hQ][mYTH! gERMAN hQ][aRT-cORE! fUN hQ]
-
- [sYSdOODE: -sLIME!^bIRDHOUSE÷pROJECTS-lEADER^mYTH!]
- [cOdOODES: mOGUe!/sCX^aC! pRIMUS!/bP!-lEADER]
- [MR.VAiN/bNZ^aC! wHIRLWIND/mYTH!]
-
- [uPLOADER:GeNeRaTioN ][oF:[+] PRODIGY '95 [+]]
- [uPLOAD tIME:13:52:39][uPLOAD dATE:03-Jan-95]
-
- _ ___ \ _
- ___|__________/\______\//\________________________________________________ _
- \___ / ___/ \_____\//\______________ /\ ______/ _______/ ___ _
- | _/ \ _ \_ \/ | ___)_/_ ___/_/_ ___)_\______ \______
- | \ \/ / || | \ | \ | \ / / /
- _ __| \__________/____|| |____ |__ |__ _____/ ___ _
- `----' `-----' `------' `------' `---------' `------'
-
-
-
-
- «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
- . . . . : · .
- ____/¦__ ___/¦____ __/¦___________/¦__ ¦ ¦___/¦__ !
- _ ____ \__\____ _// _____\_________ \ | | ____ \__ _:/\__
- /· |____//· | \\_____ ·\| | | \\| |/· |____/ \ Oo /
- // | \ | \ l \\ | | ·\_ // | \ /_--_\
- \__________\________/________/___j___j / \__________\ :\/
- -------------------------------------l____/ :----------- ¡
- · ·
- . : · . . . .
- ! _ ____/¦__ ¦ ¦____¦\____ ____/¦__ ___/¦____ __/¦_____ __
- _:/\__ _ _ ____ \__| |______ \ _ ____ \__\_ | _// _____ __ _
- \ Oo / /· |____/| |/· __ __/ /· |____//· | \\_____ ·\
- /_--_\ // | \| // | \_// | \ l \ l \\
- :\/ \__________\ \____j /\__________\________/________/
- ¡ -----------· :----l____/-------------------------------
- · ·
- <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
-
- Upload Date: [01-03-95] «» Upload Time: [07:18:11]
-
- «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
-
- .__ _ r
- : __tHIS fILE wAS D/L fROM I
- _ _02-Jan-95_________________________: N
- _| \/ | G
- \/ T¾R¾S¾I LEADER H¾Q \\ ² tRISTAR & rED
- \ sECTOR
- ö . |_/\________/\__.___ _/\_______ | W
- /\ |\ ._ \ \ \ ____)² iNC.
- . \/\------------|/ |/____/ \ / __)__!---------------.
- |\/ / ² / | \ \ 4nODEZ |
- | \_____| \_____²_____/___________/ !_
- |ö | | /_/\
- | _/\__.___ !/\_._/\________/\________/\______! _/\______ \_\/
- | \ \ \___!\ ._ \ ._ \ ____) \ . \ |
- 00:12:49 \ / |/ |/ / |/ / __)__ / | \_/¹
- / | \ | / / / / \ | \
- \_____²_____/____²_________/_________/___________/_____²_____/ö2Fö
- ² ²
- _!/\__ |__
- \ Oo / +49 p¾R¾I¾V¾A¾T¾E¾! ___| /
- eLITE gUYS /_--_\ \ //
- wILL gET ²\/ tHE hOLY mASTER iS \/|
- iNVITED hERE ! mClOUD ²
- ² aND hIS hELPING hAND iS mARIO :
- :
- ¾ aSK fOR nUMBER aND sYSPW/nUP
-
-
- @BEGIN_FILE_ID.DIZFREQUENTLY ASKED QUESTIONS ABOUT `C`
- -German Edition-
- 3-10
- @END_FILE_ID.DIZ
- /Teil 3
-
- Q1.12 Was bedeutet portabel?
-
-
- Ein Programm ist portabel, wenn es sich auf verschiedenen
- Rechnern, Betriebssystemen und Compilern ohne Änderung über-
- setzen läßt (und funktioniert). C ist eine portable Program-
- miersprache, d.h. sie ermöglicht es durch ihre präzise Defi-
- nition, Programme zu schreiben, die auf den unterschiedlichsten
- Rechnern ohne Änderungen laufen. Allerdings ist es ebenso
- möglich, unportable Programme, die möglicherweise schon nach
- einem Compiler-Update auf demselben Rechner nicht mehr laufen,
- zu schreiben.
- Begriffe 11
- ---------------------------------------------------------------
-
- Es gibt verschiedene Kriterien, anhand derer die Portabilität
- eines Programms bestimmt werden kann. Das stärkste davon ist
- die strikte Konformität ("strictly conforming"), die bedeutet,
- daß ein Programm sich garantiert auf allen denkbaren ANSI-C-
- Systemen ohne Probleme übersetzen läßt und auf dieselbe Weise
- funktioniert. Allerdings lassen sich in der Praxis nur sehr
- wenige Programme strikt konform halten, da sie keine Funktionen
- des Betriebssystems verwenden dürfen.
-
- Portable Programme in der Praxis sind daher normalerweise nur
- in einem gewissen Umfeld portabel, z.B. auf Systeme, auf denen
- die portable Betriebssystemschnittstelle POSIX zur Verfügung
- steht (u.a. viele Unix-Systeme) oder die ein und dieselbe gra-
- fische Benutzeroberfläche verwenden.
-
- Der Preprozessor kann oft verwendet werden, um Programme
- portabel zu machen, obwohl einzelne Programmteile unportabel
- formuliert werden müssen:
-
- #if UNIX
- # if SYSV
- /* Code fuer Unix System 5 */
- # elif BSD
- /* Code fuer BSD-Unix */
- # else
- # error "Unbekanntes Unix"
- # endif
- #elif TOS
- /* Code fuer Atari TOS */
- #elif MSDOS
- /* Code fuer MSDOS */
- #else
- # error "Unbekanntes Betriebssystem"
- #endif
-
- Für die portable Programmierung ist es von größter Wichtigkeit,
- genau zu wissen, was in C definiert, was undefiniert und was
- implementierungsdefiniert ist, um abschätzen zu können, ob das
- Programm, wenn es auf einem Rechner läuft, auch auf anderen
- laufen wird. Normalerweise werden Programme nämlich auf einem
- Rechner entwickelt und getestet und erst hinterher auf andere
- Rechner portiert.
-
- Die bei einer Portierung auftretenden Probleme können viel-
- fältig sein, und häufig werden Fehler erst beim Portieren
- bemerkt. So kann z.B. bei
-
- int a;
- int x[3];
- int b;
-
- a = 1;
- b = 2;
- x[3] = 0;
-
- durch die fehlerhafte Zuweisung x[3]=0 auf einem Rechner a, auf
- einem anderen Rechner b und auf einem dritten Rechner gar
- nichts überschrieben werden. (wr)
- 12 Begriffe
- ---------------------------------------------------------------
-
- Q1.13 Was bedeutet portierbar?
-
-
- Eigentlich gar nichts; die Definition von "portierbar" daher
- aus istProgramm wird als portierbar bezeichnet, wenn es sich
- auf andere Rechner portieren läßt. Z.B. ist es für die meisten
- Unix-Programme möglich, sie (unter Verwendung spezieller
- Libraries) auf einem Atari ans laufen zu kriegen, nachdem man
- sie entsprechend angepaßt hat. Der Aufwand solcher Anpassungen
- kann durchaus beträchtlich sein und gehört zu den unter C-
- Programmierern am meisten verabscheuten Tätigkeiten.
-
- Zum Beispiel müssen Programme, die davon ausgehen, mit einem
- Aufruf von malloc() mehr als 64 KB anfordern zu können, bei der
- Portierung auf MS-DOS (wo size_t nur 16 Bits groß ist, also
- maximal 64 KB ansprechen kann) in weiten Teilen umgeschrieben
- werden.
-
- Da man mit hinreichender Anstrengung jedes C-Programm auf fast
- jedem System ans laufen kriegen kann, ist so gut wie jedes C-
- Programm portierbar. Natürlich gibt es Ausnahmen; Programme mit
- grafischer Benutzeroberfläche sind nicht auf Microcontroller,
- die interaktionslos arbeiten, portierbar, und Programme, die
- mehr als 64 KB an statischen Variablen brauchen, sind nicht auf
- MS-DOS portierbar. (wr)
-
-
- Q1.14 Was ist robuste Programmierung?
-
-
- Robuste Programmierung bedeutet, ein Programm so zu formu-
- lieren, daß es möglichst viele Änderungen toleriert, ohne auf-
- zuhören zu funktionieren. Beispiel:
-
- int *ptr;
- ptr = calloc(sizeof(int),10);
-
- Wird irgendwann das Programm geändert, so daß ptr vielleicht
- kein int*, sondern ein double* ist, dann wird (falls ein double
- größer als ein int ist) das calloc() zuwenig Speicher anfor-
- dern, falls es nicht mitgeändert wurde. Die einfache Änderung
- des Typen von ptr würde also in diesem Fall das Programm
- kaputtmachen. Schreibt man stattdessen
-
- ptr = calloc(sizeof(*ptr),10);
-
- so kann das Programm durch die einfache Änderung des Typs von
- ptr nicht beschädigt werden. Das Programm ist dann also robust-
- er gegen die Änderung.
-
- Robuste Programmierung ist von großer Wichtigkeit, da außer in
- der ersten Entwicklungsphase kaum jemand eine Änderung an dem
- Programm vornimmt, der das gesamte Programm gelesen hat und so
- alle Abhängigkeiten und Auswirkungen von Änderungen beurteilen
- kann.
-
- Weitere Beispiele:
- Begriffe 13
- ---------------------------------------------------------------
-
- - Folgendes
-
- struct {
- char string[100];
- /* ... */
- } s;
- char t[100];
- /* ... */
- strcpy(s.string,t);
-
- kann schiefgehen, sobald die Größe von s.string, aber
- nicht die von t geändert wird. Besser:
-
- char t[sizeof(s.string)];
-
- - Folgendes
-
- for(i=0;i!=10;i++)
-
- geht schief, sobald die Schleife so geändert wird, daß i
- einen Wert > 10 annehmen kann. Besser:
-
- for(i=0;i<10;i++)
-
- Zur robusten Programmierung gehört natürlich auch, daß man kein
- undefiniertes oder implementierungsdefiniertes Verhalten
- ausnutzt, die Funktionsweise des Programms von Compiler-
- Einstellungen abhängig macht o.ä.
-
- Um sicherzustellen, daß Bedingungen, von denen das Funk-
- tionieren eines Programms abhängt, nicht geändert werden, kann
- man auch den Preprozessor verwenden.
-
- #define MINSIZE 10
- #define MAXSIZE 100
- /* ... */
- #if ! (MINSIZE < MAXSIZE)
- #error "MINSIZE muss immer kleiner als MAXSIZE sein"
- #endif
-
- Obiges setzt selbstverständlich einen ANSI-Preprozessor
- voraus. (wr)
-
-
- Q1.15 Was ist defensive Programmierung?
-
-
- Defensive Programmierung ist eine Vorgehensweise bei der Pro-
- grammierung, die schon beim Entwurf eines Programms beginnt.
- Ziel ist es, in instabilen Umgebungen brauchbare Ergebnisse zu
- erzielen. Mit instabilen Umgebungen sind Verhältnisse gemeint,
- in denen man z.B. das fertige Programm nur schwer bis gar nicht
- und/oder nur sehr umständlich testen kann, wo man mit fehler-
- haften Compilern arbeiten muß, wo der ECLG-Zyklus (siehe Q1.17)
- sehr aufwendig ist, wo das Betriebssystem jeglichen Schwachsinn
- produziert usw.
- 14 Begriffe
- ---------------------------------------------------------------
-
- Zum Instrumentarium der defensiven Programmierung gehört u.a.
- robuste Programmierung, der Verzicht auf exotische C-Konstrukte
- (und natürlich auf alle mit undefiniertem Verhalten), exzes-
- sives Testen aller an Funktionen übergebenen Werte (z.B. auch,
- ob Pointer in gewissen Bereichen liegen), Plausiblitätstest
- aller Rückgabewerte von Betriebssystem-Aufrufen usw. Kurz und
- gut, man vermeidet alles, was nur im Entferntesten nach Ärger
- riechen könnte. Das ganze wird häufig noch mit größeren Mengen
- Debugging-Code verziert, der so geschrieben ist, daß er fein
- granuliert zur Laufzeit ein- und ausgeschaltet werden
- kann. (tw)
-
-
- Q1.16 Was ist ein "String-Literal"?
-
-
- Einfach ein konstanter String. Beispiel:
-
- puts("Hallo Welt");
-
- In diesem Fall ist "Hallo Welt" das String-Literal. String-
- Literale werden als '\0'-terminierte Arrays von chars abgelegt,
- d.h. das String-Literal "xyz" entspricht dem Array
-
- char array[4] = { 'x', 'y', 'z', '\0' };
-
- Anders als bei einem solchen Array darf ein String-Literal al-
- lerdings nicht verändert werden. Folgendes
-
- "abc"[0] = 'x';
-
- oder
-
- char *p = "hallo";
- *p = 'H';
-
- oder
-
- strcpy("Hallo","Welt");
-
- ist also verboten und führt zu undefiniertem Verhalten. Der
- Grund dafür ist, daß es dem Compiler so möglich ist,
- Stringliterale in einem schreibgeschützten Speicherbereich
- (vielleicht im ROM) abzulegen, oder in einem Speicherbereich,
- der von mehreren Prozessen (gleichzeitig laufenden Programmen)
- gemeinsam benutzt ("shared") wird. Ein Schreibversuch in ein
- solches String-Literal kann zum Abbruch des Programms oder zu
- einem Signal führen. Außerdem ist es dem Compiler erlaubt, das
- sogenannte "String Merging" durchzuführen: bei
-
- char *p = "Hallo";
- puts("Hallo");
-
- braucht das String-Literal "Hallo" nur einmal im Speicher
- abgelegt zu werden, bei
-
- char *p = "abcd";
- char *q = "bcd";
- Begriffe 15
- ---------------------------------------------------------------
-
- kann q==p+1 gelten. Schreibversuche in String-Literale können
- in diesem Fall zu unvorhersehbaren Ergebnissen führen, zum
- Beispiel könnte mit
-
- FILE *fp;
- char *p = "r";
- p[0] = 'w';
- fp = fopen(very_important_file,"r");
-
- die Datei überschrieben statt gelesen werden (weil durch die
- Änderung des String-Literals, auf das p zeigt, auch das
- String-Literal geändert wird, das als zweiter Parameter an
- fopen() übergeben wird). (wr)
-
-
- Q1.17 Was ist der ECLG-Zyklus?
-
-
- Edit, Compile, Link, Get pissed... (wr)
-
- Edit, Compile, Link, Go. (tw)
- 16 Begriffe
- ---------------------------------------------------------------
- Preprozessor 17
- ---------------------------------------------------------------
-
-
- Kapitel 2
-
- Preprozessor
-
-
- Q2.1 Wie unterscheidet sich ein K&R- von einem ANSI-
- Preprozessor?
-
-
- Der Vergleich zwischen den beiden Preprozessoren ist gar nicht
- so einfach. Eigentlich sind nur alle Eigenschaften des ANSI-
- Preprozessors definiert. K&R-Preprozessoren sind im Prinzip
- Reiser-Preprozessoren (dessen Eigenschaften eh nirgendwo 100%ig
- definiert sind), jedoch spendiert fast jeder Compilerbauer
- seinem K&R-Preprozessor ein paar Erweiterungen.
-
- Ein ANSI-Preprozessor arbeitet prinzipiell anders als ein K&R-
- Preprozessor. Meist ist ein ANSI-Preprozessor gar kein eigen-
- ständiges Programm/Compilermodul (muß es auch nicht sein), da
- bei ANSI C schon während des Preprocessings der Sourcecode in
- Tokens zerlegt werden muß. Ein K&R-Preprozessor hingegen macht
- praktisch einen 1:1 Textersatz.
-
- Neben Änderungen im Details leistet der ANSI-Preprozessor (bzw.
- die ANSI Preprocessing-Phase) mehr als ein K&R-Preprozessor. Im
- folgenden sind die wichtigsten Unterschied zwischen den beiden
- Preprozessor-Arten aufgeführt:
-
- 1. Token-Pasting
-
- ANSI C führt für Token-Pasting den '##'-Operator ein.
- Damit wird eine undokumentierte (aber durchaus häufiger
- verwendete) Eigenschaft des Reiser-Preprozessors endlich
- standardisiert.
-
- Bei einem Reiser-Preprozessor schreibt und verwendet man
- ein Makro, das z.B. einen Funktionsnamen mit einem
- Prefix 'fkt_' erzeugen soll, wie folgt:
-
- #define MK_NAME(p) fkt_/**/p() /* K&R */
-
- int MK_NAME(a); /* wird zu "int fkt_a();" */
- int MK_NAME(b); /* wird zu "int fkt_b();" */
-
- Dies funktioniert deshalb, da ein Reiser-Preprozessor
-
- a. zuerst die Makro-Argumente ersetzt und dann erst
- Kommentare beseitigt und
-
- b. einen Kommentar der Form '/**/' nicht (wie jeden
- anderen Kommentar) durch ein White-Space, sondern
- 18 Preprozessor
- ---------------------------------------------------------------
-
- - entgegen der K&R-Sprachdefinition(!) - durch
- nichts ersetzt.
-
- Die Verwendung von '/**/' ist eine ziemlich wilde Sache.
- Bei einigen K&R-Preprozessoren kann man '/**/' wie folgt
- umgehen:
-
- #define IDENT(x) x
- #define MK_NAME(p) IDENT(fkt_)p()
-
- Da man mit beide Lösungen nicht gerade einen Schönheits-
- preis gewinnen kann, wurde für ANSI C ein anderer Weg
- gewählt. Ein ANSI-Preprozessor besitzt den wohldefinier-
- ten Operator '##':
-
- #define MK_NAME(p) fkt_##p() /* ANSI */
-
- int MK_NAME(a); /* wird zu "int fkt_a();" */
- int MK_NAME(b); /* wird zu "int fkt_b();" */
-
- /Ende von Teil 3/
-
- Keep hacking
- Wolfram
-
-
-
-
- «------------------[ eLITE gUYS wILL gET iNVITED hERE ]------------------»
- . . . . : · .
- ____/¦__ ___/¦____ __/¦___________/¦__ ¦ ¦___/¦__ !
- _ ____ \__\____ _// _____\_________ \ | | ____ \__ _:/\__
- /· |____//· | \\_____ ·\| | | \\| |/· |____/ \ Oo /
- // | \ | \ l \\ | | ·\_ // | \ /_--_\
- \__________\________/________/___j___j / \__________\ :\/
- -------------------------------------l____/ :----------- ¡
- · ·
- . : · . . . .
- ! _ ____/¦__ ¦ ¦____¦\____ ____/¦__ ___/¦____ __/¦_____ __
- _:/\__ _ _ ____ \__| |______ \ _ ____ \__\_ | _// _____ __ _
- \ Oo / /· |____/| |/· __ __/ /· |____//· | \\_____ ·\
- /_--_\ // | \| // | \_// | \ l \ l \\
- :\/ \__________\ \____j /\__________\________/________/
- ¡ -----------· :----l____/-------------------------------
- · ·
- <*> pRODIGY gHQ <*> nEUTRON wHQ <*> iLLUSION eHQ <*> dYNAMIX gHQ <*>
-
- Upload Date: [01-03-95] «» Upload Time: [07:18:11]
-
- «-------------------[ aSK eLITE fOR SYS-PW & NUMBA ! ]-------------------»
-
- [-AquaAdder v1.0-]
-
-
-
-
-
-
- -sLiME!^bP·LEADER^mTH!
- mOGUe!^aC! pRIMUS!/bP·lEADER
- wHIRLWIND/mTH! MR.VAIN/BNZ^sXi^aC!
-
- -- --- ---- pHUKKIN' fAST aMIGA ^ wORLD'S lARGEST cHIPTUNE aREA ---- --- --
- ____
- ___| |_____________ __________________ ____________________________
- _/ _| | ._________\/__________ \ _/___\______ \ _____/ _____/
- \ \. | l/ / \/ | _____/_ l / _____/\____ _/\____ \_
- \___| |________/____||-Mo!|________________/_______\ _______\ ________/
- l____| l____| \/ \/
-
- -- --- ---- aMI-eX fREE-lEECH ^ bIG aSCII bASE © bY aC! ---- --- --
-
- -- mYTH! gHQ - -÷- - bIRDHOUSE pROJECTS! eHQ - -÷- - aRT-cORE! eHQ --
-
- _______________ _____ _____ _________ ___________________
- \. /________ |. /_____:o | /. \/|___/_ \ /
- \___ _____/|. / \|| /|. |: |// ______/·|. / ______ \ ___/
- /. /_/· || / \: \|| |· |/ / \ \/ || /_______ \/+ /
- // ____/ || \ \ \ \: ¯¯¯ | / / / || \ /·\ / \ __/_
- // / // |+ \ \ \ \___/ | \___/ / |· \/ \/ / /
- /· / \\ / \ / |: | / / / /
- \___/ \________/_____|\___/: |_____|_______/\________/_______/______/
- l_____|·MBB·
-
-