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:18][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:07]
-
- «-------------------[ 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:35 \ / |/ |/ / |/ / __)__ / | \_/¹
- / | \ | / / / / \ | \
- \_____²_____/____²_________/_________/___________/_____²_____/ö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-
- 2-10
- @END_FILE_ID.DIZ
- /Teil 2 von 10/
-
- Q1.6 Was ist 'Alignment'?
-
-
- Alignment, zu deutsch "Ausrichtung", ist ein Zugeständnis von C
- an die Eigenheiten mancher Prozessoren, die nicht in der Lage
- sind, alle Daten an allen Adressen des Speichers abzulegen.
- Betrachten wir die Struktur:
-
- struct {
- int i1;
- char c;
- int i2;
- } s;
-
- Gehen wir davon aus, daß ein int 16 Bits und ein char 8 Bits
- groß ist und daß wir es mit einem Rechner mit linearem Spei-
- cheraufbau zu tun haben (siehe auch Q6.1.1). Sagen wir, s soll
- am Adresse 10 im Speicher abgelegt werden. Das bedeutet, daß
- s.i1 an Adresse 10 liegt (ANSI verlangt, daß die erste
- Komponente einer Struktur immer an derselben Adresse liegt wie
- die Struktur selber), also die Speicherzellen 10 und 11
- einnimmt. Danach kommt s.c (weil die Reihenfolge der Struktur-
- definition beibehalten werden muß) an Adresse 12 und s.i2 an
- Adresse 13 (belegt also Speicherzellen 13 und 14). Soweit
- sogut... aber leider gibt es Prozessoren, auf denen das nicht
- so einfach geht. Der MC68000 z.B. ist nicht in der Lage, auf
- ints an ungeraden Adressen zuzugreifen; der Versuch führt zur
- Auslösung eines "Traps" (was für das C-Programm den Absturz
- oder das Eintreffen eines Signals bedeuten dürfte). Andere Pro-
- zessoren brauchen für int-Zugriffe an ungeraden Adressen
- wesentlich länger als für solche an geraden Adressen. In obigem
- Beispiel würde aber s.i2 an einer ungeraden Adresse abgelegt.
-
- Aus diesem Grund ist es dem Compiler erlaubt, Füllbytes in der
- Struktur einzufügen. Er würde also s.i2 statt an Adresse 13 an
- Adresse 14 ablegen und Adresse 13 unbenutzt lassen. Dieses Ein-
- fügen von Füllbytes bezeichnet man als Alignment.
-
- Die Tatsache, daß es dem Compiler freisteht, innerhalb von
- Strukturen an (fast) beliebiger Stelle unbenutzte Löcher einzu-
- fügen, hat einige Konsequenzen:
-
- - Da die Werte der Füllbytes nicht vorhersehbar sind, ist
- es nur selten möglich, Strukturen als ganzes zu ver-
- gleichen. Das ist einer der Gründe, warum man Strukturen
- zwar mit "=" zuweisen, aber nicht mit "==" vergleichen
- kann. Das bedeutet auch, daß bei:
- Begriffe 7
- ---------------------------------------------------------------
-
-
- struct {
- char c;
- int i;
- } s,t;
- s.c = t.c = 'A';
- s.i = t.i = 123;
-
- ein memcmp(&s, &t, sizeof(s)) nicht unbedingt 0 liefern
- muß.
-
- - Die mit sizeof ermittelte Größe einer Struktur muß nicht
- mit der Summe der Größen der Komponenten übereinstimmen.
- Bei o.a. Struktur ergibt sich rechnerisch die Größe 5
- Bytes (2 ints zu je 2 Bytes plus ein char von einem
- Byte), aber wenn, wie beschrieben, nach c ein Füllbyte
- eingefügt wird, ist die mit sizeof ermittelte Größe der
- Struktur 6 Bytes. Es kann durchaus vorkommen, daß am
- Ende gefüllt wird, damit Arrays der Struktur korrekt
- ausgerichtet sind, daß also bei
-
- struct s {
- char c;
- }
-
- sizeof(struct s) nicht 1, sondern 2 oder 4 ergibt.
-
- - Bei manchen Rechnern sind Zugriffe auf ungerade Adressen
- möglich, aber langsam. Bei anderen Rechnern sind Zu-
- griffe auf Adressen, die ein Vielfaches von 4 sind, noch
- schneller. Wenn der Compiler alle Strukturkomponenten
- auf 4-Byte-Adressen ausrichten würde, ließe sich dadurch
- der Zugriff beschleunigen, allerdings würde dadurch viel
- Platz verschenkt. Solche Compiler überlassen die
- Entscheidung, ob platz- oder geschwindigkeitsoptimiert
- ausgerichtet werden soll, häufig dem Programmierer (z.B.
- über Kommandozeilen-Option oder #pragma). (wr)
-
- - Direktes Schreiben oder Lesen von Strukturen u.ä. in
- oder aus Dateien, z.B. mittels
-
- struct s {
- char c;
- int i;
- } a = { 'A', 4711 };
- fwrite(&a, sizeof(a), 1, fp);
-
- ist höchst unportabel, da schon aufgrund des Alignments
- niemand so genau garantieren kann, wie denn nun die ge-
- schriebenen/gelesenen Daten wirklich aussehen. (tw)
-
-
- Q1.7 Was ist ein Sequence-Point?
-
-
- Ein Sequence-Point ist ein imaginärer Punkt im Programm, an dem
- garantiert wird, daß alles, was davor steht, vollständig aus-
- gewertet wurde, bevor das, was dahinter steht, in Angriff
- genommen wird. "Ausgewertet" bedeutet dabei, daß alle Rech-
- 8 Begriffe
- ---------------------------------------------------------------
-
-
- nungen abgeschlossen, alle Funktionen aufgerufen, alle Seiten-
- effekte durchgeführt sind usw. Sequence-Points - und nur sie -
- erzwingen eine Links-nach-Rechts-Auswertung, legen also die
- Auswertungsreihenfolge fest.
-
- Sequence-Points stehen:
-
- - hinter jedem Statement, d.h. beim ';'
-
- - zwischen Auswertung der Argumente und dem Aufruf einer
- Funktion
-
- - am Komma-Operator
-
- - am ? des Fallunterscheidungsoperators (a?b:c)
-
- - bei && und ||
-
- - bei der schließenden Klammer von if(), while() usw.
-
- Insbesondere ist der Zuweisungsoperator '=' kein Sequence-
- Point.
-
- Zwischen zwei Sequence-Points finden alle Auswertungen in
- undefinierter Reihenfolge statt. Der Ausdruck
-
- y = (y=2) + y;
-
- enthält nur einen Sequence-Point, nämlich den am Ende (beim
- ';'), deswegen ist die Auswertungsreihenfolge undefiniert (es
- ist also nicht festgelegt, ob zuerst das erste oder das zweite
- Argument des + ausgewertet wird) und damit der gesamte Wert des
- Ausdrucks. Hingegen ist
-
- y = (y=2,y+y);
-
- definiert, da der Komma-Operator einen Sequence-Point dar-
- stellt, wodurch garantiert ist, daß zuerst y=2 und dann y+y
- ausgewertet wird.
-
- Aus demselben Grund ist
-
- int i = 0;
- printf("%d %d %d",i++,i++,i++);
-
- undefiniert: in der printf()-Zeile befinden sich zwei
- Sequence-Points, einer nach der Auswertung aller Parameter und
- vor dem Aufruf von printf(), und einer bei dem ';' am Ende. In
- welcher Reihenfolge die drei i++ ausgewertet und wann die ++
- durchgeführt werden, ist undefiniert. Ein Compiler könnte zum
- Beispiel:
-
- - Erst dreimal den Wert von i ermitteln, die Werte auf den
- Stack legen, dann i dreimal inkrementieren und danach
- printf() aufrufen. Dadurch würde sich die Ausgabe "0 0
- 0" ergeben.
- Begriffe 9
- ---------------------------------------------------------------
-
-
- - Dreimal nacheinander den Wert von i ermitteln, auf den
- Stack
- legen und danach jeweils i inkrementieren, das würde die
- Ausgabe von 0, 1 und 2 in irgendeiner Reihenfolge
- ergeben (da nicht festgelegt ist, in welcher Reihenfolge
- die Funktionsargumente ausgewertet werden).
- Wahrscheinlich würde "0 1 2" oder "2 1 0" ausgegeben.
-
- - Mit einer Fehlermeldung "undefined behaviour"
- terminieren.
-
- Wohldefiniert ist allerdings
-
- x = (a++ ? ++a : a++);
-
- da das ? einen Sequence-Point darstellt (desweiteren ist
- festgelegt, daß immer genau einer der beiden durch ':' ge-
- trennten Ausdrücke ausgewertet wird). Ebenso ist
-
- if (a++) a--;
-
- wohldefiniert. (wr)
-
-
- Q1.8 Was ist der Unterschied zwischen Formal- und Aktual-
- Parametern?
-
-
- Mit Formal-Parametern bezeichnet man die Parameter, die eine
- Funktion - entsprechend ihrer Deklaration - erwartet. So
- besitzt z.B. die Funktion
-
- double funk(int i, double d) { return i * d; }
-
- genau zwei Formal-Parameter: einen Parameter mit dem Namen 'i'
- vom Typ Integer und einen mit dem Namen 'd' vom Typ Double.
-
- Aktual-Parameter sind die Parameter, die beim Aufruf einer
- Funktion übergeben werden. Wird beispielsweise obige Funktion
- mit
-
- a = funk(2 * 10, x);
-
- aufgerufen, so handelt es sich bei den Aktual-Parameter um die
- Werte von '2 * 10' und 'x'. (tw)
-
-
- Q1.9 Was bedeutet "undefiniert", "undefiniertes Verhalten"?
-
-
- Undefiniert bzw. undefiniertes Verhalten sind Begriffe, die im
- ANSI-Standard definiert sind. Sie bezeichnen die Reaktion eines
- C-Compilers bei gewissen Sprachkonstrukten.
-
- Besitzt ein Sprachkonstrukt undefiniertes Verhalten, bedeutet
- dies nicht, daß ein ANSI C-Compiler dieses nicht übersetzen
- darf (er muß auch keine Warnung ausgeben), sondern, daß das
- fertige Programm ziemlicher Murks sein kann. Ebenso ist prak-
- 10 Begriffe
- ---------------------------------------------------------------
-
-
- tisch jegliches andere Verhalten, von der Ausgabe einer Warnung
- über den Abbruch der Compilierung bis dahin, daß kleine grüne
- Krokodile aus dem Laufwerksschacht kriechen :-), zulässig.
-
- In Programmen Konstrukte mit undefiniertem Verhalten zu ver-
- wenden, ist im Normalfall keine gute Idee. (tw)
-
-
- Q1.10 Was heißt "implementierungsdefiniert"?
-
-
- Ein Verhalten, das der ANSI-Standard nicht für alle Implemen-
- tierungen festlegt, das aber von einer Implementierung auf
- irgendeine Weise definiert werden muß, wird als "implementie-
- rungsdefiniert" bezeichnet. Der Compilerbauer muß sich also
- entscheiden, wie er solche Fälle realisiert, und sich dann
- daran halten. Implementierungsdefiniert sind z.B. die Größen
- der einzelnen Datentypen (z.B. ob ein int 16, 32 oder mehr Bits
- groß ist) und ob ein char normalerweise signed oder unsigned
- ist.
-
- Es ist eine gute Idee, auf die Ausnutzung implementierungs-
- definierter Eigenschaften ebenso zu verzichten, als ob sie
- undefiniert wären. So sollte man z.B. immer sizeof(int) schrei-
- ben, wenn die Anzahl der Bytes in einem int gewünscht ist, und
- nicht 2 oder 4 oder was auch immer, oder explizit signed char
- oder unsigned char verwenden, wenn der Unterschied eine Rolle
- spielt. (wr)
-
-
- Q1.11 Was bedeutet "unspezifiziert", "unspezifiziertes
- Verhalten"?
-
-
- Es gibt ein paar Lücken im Standard, d.h. Dinge, über die der
- Standard nichts aussagt - weder ob und wie sie definiert sind,
- noch daß sie undefiniert sind. Diese Lücken sind durch den
- Standard "unspezifiziert". Dabei handelt es sich allerdings nur
- um Spitzfindigkeiten oder Details, die in der normalen Pro-
- grammierpraxis keine große Rolle spielen.
-
- Im alten K&R-C war z.B. unspezifiziert, ob ein Kommentar
- ersatzlos gelöscht oder (wie es in ANSI-C gemacht wird) durch
- ein Leerzeichen ersetzt wird. (wr)
-
-
- /Ende von Teil 2/
-
- 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:07]
-
- «-------------------[ 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·
-
-