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:
4396321
Jetzt (Chat):
12 (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
Unknown GER Offline
ZFX'ler


Registriert seit:
09.01.2003

Deutschland
Re: Schlüsselwörter im DetailNach oben.
Eine union belegt den Speicherplatz der GRÖßTEN VARIABLE und representiert quasi die Adresse auf diesen Speicherplatz. Die andern Variablen sind im Prinzip Adressen auf Bereiche innerhalb des Speicherplatzes.

Bei mir funktioniert es jedenfalls!
11.01.2003, 18:39:43 Uhr
BlackDragon Offline
ZFX'ler


Registriert seit:
07.09.2002

Österreich
104664727
Re: Schlüsselwörter im DetailNach oben.
Moment, *altes c buch rauskram*
ahja das ist ein cooles Beispiel für unions,
"Overlay-Technik zur unterschiedlichen Interpretation von Daten"
(Das ist jetzt reiner "C" Code also nix mit cout, also nich aufregen :)
Code:
#include 
#include 

union zahl {
  float f;
  double d;
  struct {
    unsigned long hex1;
    unsigned long hex2;
  } long_format;
};

union zahl z;

void dual_ausgabe(unsigned long zahl, int strich1, int strich2)
{
  int i;
  for(i=31; i>=0; i--)
    printf(\"%ld%s\", (zahl>>i)&i, (i==strich1 || i==strich2)?(\" | \":\"\");
}

void main(void)
{
  int wahl;

  while(1) {
    do {
      printf(\"f=float, d=double, e=ende: \");
      wahl = tolower(getchar());
      fflush(stdin);
    } while( wahl!='f' && wahl!='d' && wahl!='e');
    if(wahl == 'f') {
      printf(\"Gib eine float zahl ein: \");
      scanf(\"%f\", &z.f);
      dual_ausgabe(z.long_format.hex1, 31, 23);
    } else if(wahl == 'd') {
      printf(\"Gib eine double zahl ein: \");
      scanf(\"%lf\", &z.d);
      dual_ausgabe(z.long_format.hex2, 31, 20);
      dual_ausgabe(z.long_format.hex1, -1, -1);
    } else break;
  }
}
11.01.2003, 19:35:53 Uhr
BlackMagic-Soft
CodeFreak Offline
ZFX'ler


Registriert seit:
02.12.2002

Nordrhein-Westfalen
312940053
Re: Schlüsselwörter im DetailNach oben.
@Unknown GER: Aha. Bei mir nicht. Wenn ich dein Beispiel nehme und erst l auf 5 und dann h auf 10 setze, ist beim ausgeben der Wert aller drei Variabeln natürlich 10. Denk mal bitte nach. Die Adressen aller drei Variablen ist gleich, deshalb heisst es union. Nur weil du l und h in einer Zeile deklarierst, ändert sich das nicht . Mit einem Array ist das etwas anderes, da hier wirklich das zweite Element direkt nach dem ersten kommt. Alles klar?
12.01.2003, 01:57:31 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Mal abgesehen davon, dass unions bestimmt nicht geschaffen wurden um das höher- oder niederwertige byte gezielt zu bearbeiten, auch wenn das geht.
12.01.2003, 12:29:25 Uhr
Work in Progress
Unknown GER Offline
ZFX'ler


Registriert seit:
09.01.2003

Deutschland
Re: Schlüsselwörter im DetailNach oben.
War die reg-Struktur (Repräsentiert die Prozessorregister) in irgend einer Standardheaderfile von C nicht wie folgt definiert(?):

Code:
struct reg {
  WORD ax;
  union {
    BYTE al;
    BYTE ah;
  }
  ...
13.01.2003, 15:18:52 Uhr
CodeFreak Offline
ZFX'ler


Registriert seit:
02.12.2002

Nordrhein-Westfalen
312940053
Re: Schlüsselwörter im DetailNach oben.
Kann sein, keine Ahnung. Hat jedenfalls in dieser Form nichts mit deinem Beispiel oben zu tun, da die "große" () Variable ax außerhalb der union steht .
15.01.2003, 03:17:02 Uhr
Unknown GER Offline
ZFX'ler


Registriert seit:
09.01.2003

Deutschland
Re: Schlüsselwörter im DetailNach oben.
.. man aber auf den höher nd niederwertigen selben Speicherbereich wie ax zugreifen kann. Sonst wäre es ja sinnlos eine solche Struktur zu definieren.
15.01.2003, 13:39:59 Uhr
Aglarion Offline
ZFX'ler


Registriert seit:
13.01.2003

Hessen
Re: Schlüsselwörter im DetailNach oben.
Zitat:
War die reg-Struktur (Repräsentiert die Prozessorregister) in irgend einer Standardheaderfile von C nicht wie folgt definiert(?):

Code:
struct reg {
  WORD ax;
  union {
    BYTE al;
    BYTE ah;
  }
  ...


Ich hab zwar noch nie was mit Union gemacht, aber allein aufgrund der Logik dessen, was ich hier gelesen habe, kommt mir das unlogisch vor.
Code:
union reg {
    WORD ax;
    struct {
        BYTE al;
        BYTE ah;
    };
};

Käme mir logischer vor, aber wie gesagt, ich kenne mich damit nicht so gut aus...
15.01.2003, 20:51:57 Uhr
The Planetarians Homepage
scalar Offline
ZFX'ler


Registriert seit:
11.08.2002

USA
Re: Schlüsselwörter im DetailNach oben.
Aglarion hat recht.
15.01.2003, 23:09:46 Uhr
Unknown GER Offline
ZFX'ler


Registriert seit:
09.01.2003

Deutschland
Re: Schlüsselwörter im DetailNach oben.
Hab nochmal nachgeguckt (dos.h):

Code:
struct WORDREGS
{
  unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};

struct BYTEREGS
{
  unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};

union REGS
{
  struct WORDREGS x;
  struct BYTEREGS h;
};
16.01.2003, 13:19:48 Uhr
CptStone Offline
ZFX'ler


Registriert seit:
26.01.2003

Hamburg
Re: Schlüsselwörter im DetailNach oben.
Hi!

Jetzt ich auch noch!

Reliefpfeiler schrub:
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.

Dies klingt gut, nur daß der Code natürlich nicht zur Laufzeit des Programms kopiert wird, sondern .. zur Kompilierzeit. Etwas anders könnte es bei C-Interpretern sein. Doch kenne ich leider keine. Aber ich schweife ab...

Deswegen sind die obigen Bemerkungen zu inline richtig: FALLS inline vom compiler umgesetzt wird, wird der Code größer, das Programm (1. evtl. 2. ein bißchen) schneller. Weil mein Compiler mir nicht verrät (die dumme sau), ob er inline compiliert hat, verwende ich es nur ab und zu, um die Götter milde zu stimmen. Früher dachte ich mal, es macht einen großen Unterschied ob man eine Funktion mit inline segnet. Aber ich fürchte es ist nur bei inner loops meßbar.

Besten Gruß

26.01.2003, 20:38:18 Uhr
Homepage
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

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

ich hätte da noch was, was mich interessiert. Und zwar: Für was isn "namespace" gut?

MFG Einfachkrank
08.02.2003, 21:15:31 Uhr
Einfachkranks kleines Reich
scalar Offline
ZFX'ler


Registriert seit:
11.08.2002

USA
Re: Schlüsselwörter im DetailNach oben.
Fuer das gleiche, fuer das Java Packages gut sind
08.02.2003, 22:30:29 Uhr
TheCoder Offline
ZFX'ler


Registriert seit:
01.04.2002

Deutschland
Re: Schlüsselwörter im DetailNach oben.
Irgendwie versteh ich nicht warum das was Unknown GER gesagt hat nicht richtig sein soll, ich eigentlich keine Ahnung wie union genau funktioniert, aber bei DirectX wurde die Matrix auch so definiert
Code:
struct _MATRIX{
   union {
    struct {
        float    _11,_12,_13,_14;
        float    _21,_22,_23,_24;
        float    _31,_32,_33,_34;
        float    _41,_42,_43,_44;
    };
   float    m[4][4];
   }
} MATRIX;

und das funktioniert einwandtfrei?

EDIT:Ohh tschuldigung, hab jetzt gerade gesehen, das es eigentlich doch richtig war was Aglarion geschrieben hat, die Union ist hier nur in der Struktur beschrieben und nicht global
09.02.2003, 10:26:53 Uhr
Einfachkrank Offline
ZFX'ler


Registriert seit:
12.05.2002

Deutschland
168040415 einfachkrank@gmx.de Einfachkrank666
Re: Schlüsselwörter im DetailNach oben.
Zitat:
Fuer das gleiche, fuer das Java Packages gut sind

Na toll!
Und was mache ich mit Java Packages?
09.02.2003, 12:56:37 Uhr
Einfachkranks kleines Reich
CodeFreak Offline
ZFX'ler


Registriert seit:
02.12.2002

Nordrhein-Westfalen
312940053
Re: Schlüsselwörter im DetailNach oben.
Du bringst mehrere Klassen in einem Namensbereich (namespace ) unter. Beispiel STL: das Teil von MS hat namespace std, die STL Port verwendet _STL. Du kannst also quasi einmal std::cout und einmal _STL::cout verwenden... öhm... ja... in etwa so
09.02.2003, 15:10:57 Uhr
Johannes Offline
ZFX'ler


Registriert seit:
20.04.2002

Deutschland
174187922
Re: Schlüsselwörter im DetailNach oben.
Da gibts noch ein paar nützliche Präprozessor-Dinger:
So weit ich weis nur für MSVC++

#error "Fehler"

Dadurch hört der Compiler auf zu compilern und gibt "Fehler" als Fehlermeldung aus.
Da gibts aber noch so was, das gibt nur eine Meldung aus:

#pragma message("Das hier ist eine Message")

Und dann gibts noch eins, womit du eine Lib dazulinken kannst:

#pragma comment(lib, "d3d9.lib")

Da gibts bestimmt noch mehr...
04.03.2003, 12:04:08 Uhr
Meine HP (noch nicht fertig)
link Offline
ZFX'ler


Registriert seit:
21.11.2002

Schweiz
Re: Schlüsselwörter im DetailNach oben.
Noch ein Anwendungsbeispiel zu #ifndef.
Für die Header-Fies (Egal ob OO oder Strukturiert), um Linker-Fehler zu vermeiden:

Code:
//File xyz.h

#ifndef __xyz.h__
#define __xyz.h__

void xyz_Anzeigen(int i);
BOOL x_gresser_alsy(void);
//usw

#endif
29.03.2003, 18:32:23 Uhr
Sefiroth Offline
ZFX'ler


Registriert seit:
17.11.2002

Nordrhein-Westfalen
69490471
Re: Schlüsselwörter im DetailNach oben.
zu virtual:

Eine Funktion einer Klasse als virtual zu deklarieren, macht die Klasse polymorph. Das tut zunächst einmal gar nichts. Wenn du allerdings von dieser Klasse mit einer virtual Funktion eine Ableitung erstellst kommt der Polymorphismus erst zum tragen. C++ erstellt eine virtuelle Tabelle an hand dessen eine jede Klasse eindeutig erkannt werden kann. Dies geschieht schon, wenn mindestens eine Funktion virtual ist. Alle Vorzüge davon hier aufzuzählen wäre sicher zu lang aber ich möchte dir ein kleines Beispiel geben, das dir sicher die Sache verdeutlichen wird, wenn du dich ein wenig mit Klassen auskennst.

class Form
{
public:
virtual void Zeichnen() = 0;
};

/* Hier haben wir zunächst einmal eine abstrakte Basisklasse. Dass sie abstrakt ist, ist in dem Falle nicht so wichtig. Also lass dich dadurch nicht verwirren, aber es ist wichtig, dass wir eine Basisklasse haben, die die Funktion Zeichnen anbietet und diese als virtual deklariert ist. */

class Circle : public Form
{
public:
void Zeichnen(); // überschreibt Form::Zeichnen
};

class Rectangle : public Form
{
public:
void Zeichnen(); // überschreibt Form::Zeichnen
};

Wir haben zunächst eine einfache Klassehierarchie.
Und zwar die Klasse Form, die selber nicht Zeichnen aufrufen kann, da sie abstrakt ist. Dann haben wir zwei Klassen, die von Form abgeleitet sind und selber wieder eine Zeichnen Methode anbieten, die allerdings definiert werden müssen. Anstatt die Funktionen Form::Zeichnen und zB Circle::Zeichnen parallel existieren zu lassen, überschreibt Circle::Zeichnen Form::Zeichnen.
Was nun wichtig ist, ist, dass C++ selber eine Typprüfung von den Klassen vornehmen kann, eben durch die virtuelle Tabelle.
zb:

Wir wollen nun 500 Circles erstellen. Allerdings benutzen wir eine verkettete Liste, die nur mit void Zeigern arbeitet. Wir benutzen die .Add Methode um so einen Zeiger hinzuzufügen.

LinkedList ll;
Circle *circle;

for(int i = 0; i < 500; i++)
{
circle = new Circle;
ll.Add(circle);
}

Wir wollen aber noch zusätzlich 500 Rectangles in der verketteten Liste speichern.

Rectangle* rectangle;
for(int i = 0; i < 500; i++)
{
rectangle = new Rectangle;
ll.Add(rectangle);
}

Wir wissen ab jetzt nicht mehr welches Objekt in der verketteten Liste ein rectangle ist und welches ein Circle ist. Wenn wir beispielsweise durch die Methode .Get ein Item auslesen könnten und es dann zeichnen lassen wollten könnten wir folgendes tun:

Form* form;

form = static_cast(ll.Get(500));
form->Zeichnen();

Hier ist es völlig egal, auf was form tatsächlich zeigt. C++ stellt durch die virtuelle Tabelle die Typprüfung sicher und wird für das 500. Element, egal ob es Circle oder Rectangle ist, die korrekte Zeichenfunktion aufrufen!
01.04.2003, 14:38:48 Uhr
Imperator_Boot Offline
ZFX'ler


Registriert seit:
23.04.2003

Brandenburg
Re: Schlüsselwörter im DetailNach oben.
also ich wollt mal fragen was ein Algorithmus ist.
weil ich hör den begriff hier ziemlich oft. ich habs schon in meinem buch gesucht aber nirgends en erklärung dafür gefunden.
02.05.2003, 17:44:47 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
ähm... ich kenn die wissenschaftliche Definitíon nicht aber ich würde es als allgemeinen Lösungsansatz für ein Problem sehen, d.h. eine Reihe von Schritten, die auf ein bestimmtes Problem angewandt immer zu einer Lösung führen.
z.B. der Gauß Algorithmus zur Lösung von LGS (Gaussian Elimination)
02.05.2003, 21:56:01 Uhr
Work in Progress
Imperator_Boot Offline
ZFX'ler


Registriert seit:
23.04.2003

Brandenburg
Re: Schlüsselwörter im DetailNach oben.
thanks
03.05.2003, 20:11:23 Uhr
scones Offline
ZFX'ler


Registriert seit:
11.05.2003

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


nein, hat man nicht. das letzte wort hat der compiler und das ist gut so
30.06.2003, 22:53:49 Uhr
asm68k.org
WOOLPH Offline
ZFX'ler


Registriert seit:
03.05.2002

Österreich
Re: Schlüsselwörter im DetailNach oben.
1. Virtual - Nur in Klassen die vererbt werden nötig. Eine genaue Erläuterung der Möglichkeiten würde zu lange dauern, darum kann ich nur auf Fachliteratur verweisen! (Im Kurzen können völlig identische (auch in Art und Anzahl der Parameter) Funktionen in abgeleiteten Klassen neu definiert werden. Der Kompiler sucht sich dann den für die Klasse richtigen Code. Folge: Sehr elegante Lösungswege)

2. Union - ? was ich weiss dem wohlbekannten struct ähnlich

3. Inline - Definiert eine Funktion deren Code nicht einmal im Speicher abgelegt wird und von dort aus ausgeführt, sondern kopiert den gesamten Code an die Stelle, wo er aufgerufen wird. Folge: Code ist schneller (keine Sprünge nötig) aber benötigt mehr Speicherplatz.
Code:
inline int GetRandom(void){
//Code
}

Achtung bei Rekursiven Funktionen wird inline nicht beachtet (nicht vorhersehbar wo oft der Code kopiert werden muss (legt sich erst während der Laufzeit fest))

4. Const
Code:
const int x=5; //Konstante Wert nicht änderbar

class Klassenname{
const void BlaBLa(void);//Methode verändert Werte der Klasse nicht
}

void strcpy(char *Ziel,const char* Quelle); //Verändert Wert des Parameters nicht

5. Void
Code:
size_t ZeroMemory(void*Block,... //Typenloser Zeiger

class ...{
const void BlaBLa(void);//Keine Parameterliste
}

void strcpy(char *Ziel,const char* Quelle); //Kein Rückgabewert

6. Operator - Ist zum Überladen von Operatoren vorhanden. Wird häufig in Klassen verwendet.
Code:
class BlaBla{
public:
BlaBla operator=(BlaBla& Objekt){//=Operator überladen
//Code
};
}

//Aufruf
BlaBla Obj1,Obj2;
Obj1=Obj2;
11.08.2003, 13:19:52 Uhr
Eisflamme Offline
ZFX'ler


Registriert seit:
26.05.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
[quote]const void BlaBLa(void);[/code]
Was hat das const hier für einen Zweck?

2. Union:

Mit struct zu tun?
Naja, wie mans nimmt.
Alles was in eienm union ist, wird mit einem Speicher belegt:

Code:
union A
{
int n;
char c;
A() : n(0), c(0) {}
};

A a;
a.n = 100;

Würde man jetzt c ausgeben wäre es nicht 0.

MfG MAV
11.08.2003, 13:25:55 Uhr
Mihahome Revolution 2.0
GepinntSeite: < 1 2 3 >


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