ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4442149
Jetzt (Chat):
14 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Schlüsselwörter im Detail
GepinntSeite: 1 2 3 >
AutorThema
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
168040415 einfachkrank@gmx.de Einfachkrank666
Schlüsselwörter im DetailNach oben.
Hi,

kann mir jemand mal die folgenden Schlüsselwörter wirklich im Detail erklären:
1. Virtual
2. Union
3. Inline
4. Const
5. Void
6. Operator
7. und wenns geht, dann die wichtigsten von diesen #ifndef - Dingern.

Ich möchte diese Schlüsselwörter mal wirklich im Detail kennen und deren sinnvollste Anwendung, denn im groben Detail kenn ich sie auch, aber immer wieder begegnen die mir in der professionellen Programmierung in total unterschiedlichen Zusammenhänge.

MFG Einfachkrank
07.12.2002, 15:25:40 Uhr
Einfachkranks kleines Reich
ReliefpfeileR Offline
ZFX'ler


Registriert seit:
23.10.2002

Bayern
Re: Schlüsselwörter im DetailNach oben.
Ich kann dir zwar nicht alle erklären aber mit ein paar vielleicht.
Das Schlüsselwort Inline verwendest du vor Funktionen die direkt in deinen Sourcecode kopiert werden sollen.
Damit spart man sich die Zeit einen Sprung zur Addresse der Funktion auszuführen indem der Compiler einfach die Zeilen der Funktion in den laufenden Sourcecode einfügt.
Das macht aber nur bei sehr kurzen Funktionen(1 oder 2 Zeilen) sinn ,da sonst das kopieren mehr Zeit in anspruch nimmt als das verzweigen.

Const sagt lediglich, dass der Wert,der damit versehen wird, nicht verändert werden darf.
Auf Deutsch eine Konstante.

wie der Name Void schon sagt ist ein "nichts".
damit gibt man an, dass der Rückgabewert einer Funktion ein "nichts" ist. Also keinen Rückgabewert besitzt. Wenn du dich mit Delphi etwas auskennst:
eine Funktion die void zurückgibt ist mit procedure vergleichbar; eine Funktion die eine Datenstruktur zurückgibt ist mit function vergleichbar.

Ich hoffe diese Infos stimmen alle

Wer will kann mich gerne verbessern.
07.12.2002, 16:07:09 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
1. Virtual: könnte man einen Roman drüber schreiben, weil du die grobe Bedeutung kennst, überlasse ich weitere Erklärungen den Polymorphie Cracks.
2. Union bedeutet dass sich mehrere Variablen den gleichen Speicherplatz teilen, d.h. immer nur eine von ihnen gleichzeitig benutzt werden kann. Stroustrup nennt als Beispiel eine Symboltabelle, wo ein Wert entwerder char oder int, aber nie beides sein kann. Gehört glaube ich nicht zu den Sachen, die man umbedingt beherrschen muss.
4. Const kann etwas mehr, als nur #define ersetzten. Wenn du z.B. eine Referenz wegen Speed benutzen willst, und nicht, weil du die übergebenen Daten ändern willst, sollte sie const sein. Ist eine Methode const, kann sie die Klasse nicht ändern.
5. void wird (wurde) AFAIK auch als "Universalzeigertyp" für unbekannte Datentypen verwendet. Sollte man aber nicht.
6.operator token() die Definition eines Operators halt.
7. Präprozessor
Code:
#define NAME // wohl klar

#ifdef NAME // ist NAME definiert
// code der nur bedingt kompiliert wird
#endif

#undef NAME  // NAME ist nicht mehr definiert
#ifndef NAME // wenn NAME nicht definiert ist
//code für bedingte kompilierung
#endif

Tu es nicht! Präprozessor Hacks und Makros sind böse! Include-Guards sollten möglichst die einzige Anwendung sein.
07.12.2002, 17:45:05 Uhr
Work in Progress
Marshal Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
72217084
Re: Schlüsselwörter im DetailNach oben.
@Mastermind
Naja, so schlimm ist es doch wohl nicht. Man sollte schon ein bischen aufpassen aber das define "Zeug" kann wirklich sehr nützlich sein.
Gerade was debuggen angeht sind so typische Anweisungen wie #ifdef DEBUG ziemlich nützlich.

Man kann allerdings schon ziemlich Blödsinn damit anstellen. Gerade erst kürzlich hab ich sowas gesehen:

#define public protected

*lol*

Sowas sollte man eigentlich wirklich unterlassen.


Zu virtual:
Während meiner Lernzeit habe ich folgendes Miniprog zur Polymorphie geschrieben:
Headerfile:
Code:
class Fahrzeug{
public:
    virtual void fahren()=0;
};

class Auto : public Fahrzeug
{
public:
    virtual void fahren();
};

class Dreirad : public Fahrzeug
{
public:
    virtual void fahren();
};

class Fahrrad : public Fahrzeug
{
public:
    virtual void fahren();
};

class Motorrad : public Fahrzeug
{
public:
    virtual void fahren();
};


cpp file:
Code:
#include 

void
Auto::fahren(){
    cout << \".... tuet tuet\" << endl;
}

void
Dreirad::fahren(){
    cout << \".... fahren fahren fahren\" << endl;
}

void
Fahrrad::fahren(){
    cout << \".... kling kling\" << endl;
}

void
Motorrad::fahren(){
    cout << \".... maeaehhhh\" << endl;
}


und die Hauptdatei:
Code:
void main(void){
    Auto auto1, auto2;
    Dreirad rolfsRad;
    Fahrrad blechEsel;
    Motorrad tummorad;

    auto1.fahren();
    rolfsRad.fahren();
    blechEsel.fahren();
    tummorad.fahren();
    auto2.fahren();
}


Was hier passiert ist Folgendes: In der .h File erstelle ich die Klasse Fahrzeug, die eine virtuelle Methode enthält, die abstrakt ist (=0) und somit die ganze Klasse quasi ein Interface ist.
Von dieser Klasse leite ich mehrere Klassen ab, in der ich die virtuelle (!) fahren Methode implementiere.
Im Hauptprogramm erstelle ich von jeder Klasse ein oder mehrere Instanzen und rufe jeweils die fahren Methode auf.
Das Programm weiß durch die Polymorphie selber, welche fahren Methode welcher Klasse aufgerufen werden muß, also welche Methode zu welchem Objekt gehört. "virtual" gibt einfach an, daß etwas Polymorph sein soll.
Eigentlich ganz einfach.

Das ist die Ausgabe:
.... tuet tuet
.... fahren fahren fahren
.... kling kling
.... maeaehhhh
.... tuet tuet
07.12.2002, 21:22:05 Uhr
scalar Offline
ZFX'ler


Registriert seit:
11.08.2002

USA
Re: Schlüsselwörter im DetailNach oben.
Zitat:
Ich möchte diese Schlüsselwörter mal wirklich im Detail kennen


Schon mal dran gedacht, Dir einfach ein Buch zur Hand zu nehmen und es zu lesen?
08.12.2002, 07:45:03 Uhr
Atem Offline
ZFX'ler


Registriert seit:
04.12.2002

Niedersachsen
Re: Schlüsselwörter im DetailNach oben.
Hallo Einfachkrank,

zu virtual:
Virtual verwendet man für Funktionen, die zu einer bestimmten Klasse gehören. Du schreibst "virtual" vor eine Funktion. Das macht zuerst einmal garnichts. Das gewinnt erst an Bedeutung, wenn du eine neue Klasse von der alten Klasse ableitest. In der neuen Klasse kannst du die alte Funktion wieder neu definieren. Das kannst du aber auch machen, wenn du in der alten Klasse nicht "virtual" vor die Funktion geschrieben hättest. Auch das macht zuerst also garnichts. Aber nun definierst du eine Funktion, die ein Objekt der alten Klasse übergeben bekommt. Dieser Funktion schickst du einfach ein Objekt der neuen Klasse, die ja von der alten abgeleitet ist. Sonst könntest du es der Funktion garnicht senden. Diese Funktion ruft deine virtual Funktion des Objektes auf. Dann wird die Funktion der neuen Klasse aufgerufen, obwohl die aufrufende Funktion ein Objekt der alten Klasse erwartet.

zu Union:
Union verwendest du in Strukturen. In einer Struktur sind mehrere Variablen untereinander geschrieben. Jede Variable verwendet einen Speicherplatz. Mit Union sagst du, daß zwei (oder mehr) Variablen den gleichen Speicherplatz verwenden sollen. Das machst du, wenn du weißt, daß entweder die eine Variable verwendet wird oder die andere, aber nie beide gleichzeitig. Das spart Speicherplatz.

zu Inline:
Du schreibst Inline vor eine Funktion. Damit sagst du dem Linker, daß er die Funktion an die stellen des Programms kopieren soll, an denen sie aufgerufen werden. Das sparrt Rechenzeit für Aufrufe, verbraucht aber Speicher. Deswegen schreibt man Inline vor kleinen Funktionen, die sehr oft aufgerufen werden.

zu Const:
Const kannst du für verschiedene Dinge verwenden.
Wenn du eine Funktion definierst, so bekommt sie zum Beispiel einen Pointer auf eine Struktur übergeben. In der Funktionsdefinition kannst du vor diesen Parameter const schreiben. Dann sagst du dem Compiler, daß der Inhalt der Struktur in deiner Funktion nicht verändert wird. Das macht erstmal keinen Sinn, warum du das machen solltest. Aber wenn du vieler solcher Funktionen definiert hast, so wirst du sehen, daß der Compiler dir garnicht erlaubt, daß du die Struktur aus deiner Funktion zu einer Funktion sendest, die die Struktur ändern könnte. Das ist sowas wie eine Sicherheitsmaßnahme, damit du nicht ausversehen Inhalte veränderst, obwohl du angenommen hattest, daß du sie nie verändern wirst.

zu Void:
Void steht vor einer Funktionsdefinition. Damit sagst du dem Compiler, daß die Funktion keinen Wert zurückgibt.

zu Operator:
Du kannst +, -, *, / usw für eine Klasse umdefinieren. Falls du zwei Objekte der Klasse mit + verknüpfst, dann wird die Funktion der Klasse aufgerufen, die du mit Operator definiert hast. Jedoch sehen die meisten Operator-Funktionen ein wenig anders aus, so daß du dir genau ansehen mußt, wie zum Beispiel + definiert wird. Du wirst sehen, daß in jeder Definition das Wort "operator" auftaucht.

zu #ifndef:

#ifndef HALLO

#endif

* wird nur aufgerufen, wenn HALLO definiert ist. Du definierst HALLO so:

#define HALLO irgendetwas


Viele Grüße,
Atem
08.12.2002, 13:31:23 Uhr
Marshal Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
72217084
Re: Schlüsselwörter im DetailNach oben.
@Atem
Das Hallo muß er aber nur so definieren:
#define HALLO

Es muß es nur geben, daß genügt.
08.12.2002, 13:44:03 Uhr
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
168040415 einfachkrank@gmx.de Einfachkrank666
Re: Schlüsselwörter im DetailNach oben.
Hi,

@scalar
ja würde ich ja machen, aber meins hab ich einem Freund ausgeliehen, der gerade am studieren ist und deswegen ist es gerade schwer, an mein Buch zu kommen

Aber vielen Dank an den Rest! ! !

MFG Einfachkrank
08.12.2002, 14:57:59 Uhr
Einfachkranks kleines Reich
ChrisM Offline
ZFX'ler


Registriert seit:
16.03.2002

Rheinland Pfalz
65348179
Re: Schlüsselwörter im DetailNach oben.
Nachdem der Thread ja schon sticky ist (find ich aber unnötig), verbesser ich die Aussagen noch etwas.

Zitat:
Virtual verwendet man für Funktionen, die zu einer bestimmten Klasse gehören. Du schreibst "virtual" vor eine Funktion. Das macht zuerst einmal garnichts.

Doch, die Klasse bekommt dadurch einen VTABLE-Zeiger.

Zitat:
Du schreibst Inline vor eine Funktion. Damit sagst du dem Linker, daß er die Funktion an die stellen des Programms kopieren soll, an denen sie aufgerufen werden.

Er kann die Funktion an die Stelle des Aufrufes expandieren, muss aber nicht! Inline ist nur ein Vorschlag an den Compiler!

Ansonsten schließe ich mich Scalar an. Allein über Polymorphismus, Const Correctness und Operatorenüberladung könnte man wahrscheinlich ein großes Buch schreiben.

ChrisM
08.12.2002, 15:35:48 Uhr
ChrisMs Baustelle
Marshal Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
72217084
Re: Schlüsselwörter im DetailNach oben.
btw:
Es gibt noch ein "__forceinline" Keyword. Damit hat man 100%ig eine inline Funktion.
09.12.2002, 01:44:46 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schlüsselwörter im DetailNach oben.
Sorry, war ein Repost...

Gruss Kimmi
09.12.2002, 10:02:40 Uhr
Kurzer Weblog
TGGC Offline
ZFX'ler


Registriert seit:
09.10.2002

Sachsen-Anhalt
Re: Schlüsselwörter im DetailNach oben.
RTFM
09.12.2002, 10:17:22 Uhr
TNG-Soft
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schlüsselwörter im DetailNach oben.
Was bedeutet "RTFM", lasst mich bitte nicht dumm sterben...

Gruss Kimmi
09.12.2002, 10:43:02 Uhr
Kurzer Weblog
CodeFreak Offline
ZFX'ler


Registriert seit:
02.12.2002

Nordrhein-Westfalen
312940053
Re: Schlüsselwörter im DetailNach oben.
Zitat:
btw:
Es gibt noch ein "__forceinline" Keyword. Damit hat man 100%ig eine inline Funktion.


Falsch. Aus der MSDN:

Zitat:
Even with __forceinline, the compiler cannot inline code in all circumstances. The compiler cannot inline a function if:

The function or its caller is compiled with /Ob0 (the default option for debug builds).


The function and the caller use different types of exception handling (C++ exception handling in one, structured exception handling in the other).


The function has a variable argument list.


The function uses inline assembly, unless compiled with /Og, /Ox, /O1, or /O2.


The function returns an unwindable object by value, when compiled with /GX, /EHs, or /EHa.


The function receives a copy-constructed object passed by value, when compiled with /-GX, /EHs, or /EHa.


The function is recursive and not accompanied by #pragma(inline_recursion, on). With the inline_recursion pragma, recursive functions can be inlined to a depth of eight calls, or as determined by the inline_depth pragma (see below).


The function is virtual.


The program takes the address of the function.
If the compiler cannot inline a function declared with __forceinline, it generates a level 1 warning (4714).



@Kimmi: (R)ead (T)he (F)ucking (M)anual
09.12.2002, 11:12:00 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schlüsselwörter im DetailNach oben.
Thx
09.12.2002, 11:15:30 Uhr
Kurzer Weblog
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Zitat:
Was bedeutet "RTFM", lasst mich bitte nicht dumm sterben...

Gruss Kimmi


Read the fucking Manual!

(Er hat im Prinzip recht)

EDIT: sry hab unter dem Riesigen Zitat übersehen dass die Antwort da schon stand.
09.12.2002, 17:14:55 Uhr
Work in Progress
Marshal Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
72217084
Re: Schlüsselwörter im DetailNach oben.
@CodeFreak

Ah, cool, wußte ich nicht. Wenn mir das nächste Mal jemand sowas erzählt, dann schau ich lieber erst mal nach, bevor ich irgendwas weitergebe.

Thx für die konstruktive Kritik.
09.12.2002, 18:48:42 Uhr
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
168040415 einfachkrank@gmx.de Einfachkrank666
Re: Schlüsselwörter im DetailNach oben.
Hi,

ich hab noch mal ne kleine Frage zu den #ifdef Befehlen. Das sind ja quasi Anweisungen an den Präprozessor oder so ähnlich, der dann weiß ob dieser Teil des Codes mit compiled werden soll oder nicht, je nach dem ob das Ding definiert ist oder nicht. So weit richtig?

Jetzt meine Frage, falls das so weit stimmt -> Wie kann ich im Code Sachen definieren, die abhängig sind von der Programmeinstellung. Beispiel: In nem Game soll die eine Option zur Verfügung stehen, mit der man Schatteneffekte ein und ausschalten kann. Jetzt möchte ich, falls sie ausgeschaltet sind, einen State nicht definieren, der dann die Codeteil auslässt, welche für die Projektion von Schatten zuständig wären.(und anders herum solls natürlich auch funzen )

Ich hoffe das war klar und deutlich

MFG Einfachkrank
09.12.2002, 21:29:37 Uhr
Einfachkranks kleines Reich
VirtualLabs2000 Offline
ZFX'ler


Registriert seit:
26.02.2002

Hessen
91620025
Re: Schlüsselwörter im DetailNach oben.
Jo, das mit den Einstellungen für ein Game kann man so sicherlich nicht über den Präprozessor lösen. Der Präpozessor ist so ne Art Vorstufe vom eigentlichen Compiler der AFAIK whitespaces entfernt und die #-direktiven auflöst.
Das heißt also auch, dass wenn du mit #ifdef arbeitest und der Ausdruck nicht definiert ist, der damit umschlossene Codeteil in der späteren Exe-Datei nicht vorhanden ist.
Um dann z.B. Schatteneffekte wieder mit rein zu nehmen, müsstest du also alles nochmal neu compilieren und dann halt vorher z.B. #define SCHATTEN schreiben.

Für solche Sachen wie bestimmte Einstellungen die man noch nach dem compilieren ändern kann wirst du wohl um if-Abfragen nicht drumrum kommen.
09.12.2002, 21:50:48 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
oder um es kurz zu sagen

#ifdef // bedingte kompilierung

im Gegensatz zu

if() //bedingte Ausführung
09.12.2002, 22:09:17 Uhr
Work in Progress
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
168040415 einfachkrank@gmx.de Einfachkrank666
Ich schon wiederNach oben.
Hi,

jetzt bin ich auf der Suche nach zwei Befehlen -> für Ganzzahldivision! Einmal den, mit dem ich bei einer Division wie 10 / 3 = 3 bekommen würde und dann noch seinen Gegenspieler, bei dem der Rest rauskommt: 10 / 3 = 1

Wer sich mit Delphi auskennt oder mit Objekt Pascal, dem sind die Stichwörter div und mod wahrscheinlich ein Begriff, genau die brauch ich für C/C++

MFG Einfachkrank
11.12.2002, 18:47:41 Uhr
Einfachkranks kleines Reich
Marshal Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
72217084
Re: Schlüsselwörter im DetailNach oben.
Ganz einfach, wenn du zwei int-Zahlen nimmst (z.B. 10 und 3) und
10 / 3 berechnen läßt, kommt 3 heraus (nach dem Komma wird abgebrochen).
10 % 3 (Modulodivision) ergibt 1.
11.12.2002, 20:16:12 Uhr
Tanubi Offline
ZFX'ler


Registriert seit:
25.02.2002

Baden-Württemberg
Re: Schlüsselwörter im DetailNach oben.
Es gibt auch die Funktion div. Die gibt dir auf einen schlag den ganzzahligen Quotienten und den Rest. Musst mal in der Hilfe schaun. Der Typ, der dazu benötigt wird, heißt glaub ich div_t.

blutigerAnfaenger
11.12.2002, 21:01:10 Uhr
Unknown GER Offline
ZFX'ler


Registriert seit:
09.01.2003

Deutschland
Re: Schlüsselwörter im DetailNach oben.
zu union:
Man kann mehr als nur eine Variable in einer union gleichzeitig verwenden.

Beispiel:

Code:
union
{
   WORD x;
   BYTE l, h;
};


l und h befinden sich im gleichen Speicherbereich wie x. Man kann also über diese Variablen gezielt das höhere und niedere Byte von x verändern.
11.01.2003, 00:37:49 Uhr
CodeFreak Offline
ZFX'ler


Registriert seit:
02.12.2002

Nordrhein-Westfalen
312940053
Re: Schlüsselwörter im DetailNach oben.
Falsch. l und h belegen ebenfalls den gleichen Speicher.
Code:
union
{
    char y[2];
    short x;
};

So würde es stimmen.
11.01.2003, 17:58:58 Uhr
GepinntSeite: 1 2 3 >


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel