Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

c++ frage
Gehe zu Seite 1, 2, 3  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> c++ frage
 
Autor Nachricht
rumcajs007
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 22.06.2006
Beiträge: 606
Wohnort: Hinter den Bergen

BeitragVerfasst am: 17 Jan 2009 - 18:35:16    Titel: c++ frage

Code:
typedef char      INT8;
typedef unsigned char   UINT8;

typedef short      INT16;
typedef unsigned short   UINT16;

typedef long      INT32;
typedef unsigned long   UINT32;
         BOOL;
#define   FALSE      (0)
#define   TRUE      (!FALSE)

typedef INT32      R_CODE;
#define R_S      ((INT32)0) ???
#define R_F      ((INT32)1) usw.
#define R_B      ((INT32)2)
#define R_S_E                   ((INT32)3)

#define NULL       ((void *)0) ???

typedef UINT32      HANDLE;
#define   INVALID_HANDLE   ((HANDLE)0xFFFFFFFF) ???
typedef void*              VP;


hallo.
wäre jemand so nett und mit kurz erklären was diese klammern (bei ???) bedeuten. bekommen diese wete hex. oder dez. ? und was soll void* bedeuten.
danke. Razz
Armin Gibbs
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 06.02.2008
Beiträge: 992

BeitragVerfasst am: 17 Jan 2009 - 18:47:42    Titel:

Die Konstante "0" ist in C++ wohl ein int oder sowas. Durch die Klammern wird ein expliziter Typecast der 0 auf einen anderen Datentyp durchgeführt.

((INT32)0) -> 0 wird auf INT32 gecastet.

((void *)0) -> 0 wird auf einen void-Pointer gecastet.

Zitat:
The Pointer to Void is a special type of pointer that the programmer can use to point to any data type.
Calculus
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 02.01.2008
Beiträge: 5077
Wohnort: Bochum

BeitragVerfasst am: 17 Jan 2009 - 18:53:34    Titel:

Mittels (typ) kannst du einen Datentyp in einen anderen casten ("umwandeln"). Betrachte dazu folgendes Beispiel:
Code:
int main() {
    int zahl = 12345;
    double* pointer = (double*) &zahl;
    pointer = &zahl;                    //Fehler, cannot convert "int*" to "double*" in assignment
}

http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Operatoren#.28.29_.28explizites_Casting.29
rumcajs007
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 22.06.2006
Beiträge: 606
Wohnort: Hinter den Bergen

BeitragVerfasst am: 17 Jan 2009 - 19:16:20    Titel:

ah jetzt verstehe ich das mit dem casten, ist eigentlich ganz simpel.

was ich aber immer noch nicht verstehe was void* bedeuten sol, zeiger auf was bitte Question
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 18 Jan 2009 - 14:32:42    Titel:

void* ist ein "Trick" um in C anzugeben, das an der Speicherstelle theoretisch "alles" stehen kann. Vor Gebrauch der konkreten Daten an der Adresse, an die der void* zeigt muss natürlich auch gecastet werden.

Edit: In deinem Fall

Code:
#define NULL       ((void *)0) ???


wird der void*-Trick benutzt, damit du in jeder Art von Zuweisung oder Vergleich das Makro NULL benutzen kannst.
rumcajs007
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 22.06.2006
Beiträge: 606
Wohnort: Hinter den Bergen

BeitragVerfasst am: 18 Jan 2009 - 15:14:36    Titel:

vielen dank für die doch sehr hilfreiche aussage Laughing

ich dachte immer dass NULL gehört zu c/c++ syntax, uns do wie ich das verstehe ist NULL gleichwertig mit ner null, ok. verstehe aber eins nicht warum man auf null casted obwohl es kein datentyp ist und was das *(zeiger) zeichen da zu suchen hat. soll das ein zeiger sein oder ist das auch nur die syntax. in welchen zusammenhang könnte dieser code verwendet werden denn den effekt erkenne ich nicht Question

danke.
Armin Gibbs
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 06.02.2008
Beiträge: 992

BeitragVerfasst am: 18 Jan 2009 - 15:39:46    Titel:

Ein Zeiger in C entspricht auf Maschinenebene einem Speicherwort (DWORD, 32Bit), das eine Speicheradresse (Zahlenwert) enthält. Ein Integer (wie die Konstante 0) ist auf Maschinenebene auch nichts anderes als ein DWORD. Man kann zwischen den Typen also problemlos Zuweisungen machen. C erlaubt aber nicht die direkte Zuweisung, da dies eine Integritätsverletzung auf Hochsprachenebene darstellt. Die Datentypen sind abstrakt erstmal nicht kompatibel. Die Zuweisung muss mit der Brechstange (expliziter Typecast) erfolgen.

Zurück zu Zeigern: Die Speicheradresse 0 ist niemals als gültige Adresse anzunehmen und repräsentiert meist den Wert "nicht belegt" für Zeiger. Ein einfaches Beispiel wäre das Ende einer verlinkten Liste. Das letzte Element hat keinen Nachfolger und zeigt somit auf NULL. Es gibt sehr viele verschiedene Arten von Zeigern. Die Unterscheidung von Zeigertypen wird nicht auf Maschinenebene vollzogen sondern ist lediglich als Integritätsbedinung auf Compilerebene zu verstehen. Für jeden Zeigertyp (int*, double*, char*, ...) einen eigenen NULL-Wert einzuführen wäre zwar möglich aber nicht angemessen. Aus diesem Grund führt man NULL als Wert für den allgemeinsten Zeigertypen void* ein. Das hat zur Folge, dass jedem Zeigertyp (der als Spezialisierung von void* aufgefasst werden kann) der Wert NULL zugewiesen werden kann.

Beispiel:

Code:
int* p = NULL;


wird ersetzt durch

Code:
int* p = (void*)0;


Erklärung: 0 ist für den Compiler ein Integer und nicht kompatibel mit einem int-Pointer. Man castet 0 nun auf eine void-Pointer um, da void* der allgemeinster Pointer-Typ ist und implizit auf alle weiteren Pointertypen umgecastet werden kann.
rumcajs007
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 22.06.2006
Beiträge: 606
Wohnort: Hinter den Bergen

BeitragVerfasst am: 18 Jan 2009 - 16:48:31    Titel:

vielen dank für die mühe Smile

Zitat:
Ein Zeiger in C entspricht auf Maschinenebene einem Speicherwort (DWORD, 32Bit), das eine Speicheradresse (Zahlenwert) enthält. Ein Integer (wie die Konstante 0) ist auf Maschinenebene auch nichts anderes als ein DWORD. Man kann zwischen den Typen also problemlos Zuweisungen machen. C erlaubt aber nicht die direkte Zuweisung, da dies eine Integritätsverletzung auf Hochsprachenebene darstellt. Die Datentypen sind abstrakt erstmal nicht kompatibel.


das ist mir klar, zeiger besitzen im speicher ihre eigene adresse sowie die adresse der zugewiesenen variable, 'normale' variablen ihre eigene adr. und den wert. klar.

Zitat:
Die Zuweisung muss mit der Brechstange (expliziter Typecast) erfolgen.
im diesen zusammenhang verstehe ich das nicht.



Zitat:
Zurück zu Zeigern: Die Speicheradresse 0 ist niemals als gültige Adresse anzunehmen und repräsentiert meist den Wert "nicht belegt" für Zeiger. Ein einfaches Beispiel wäre das Ende einer verlinkten Liste. Das letzte Element hat keinen Nachfolger und zeigt somit auf NULL. Es gibt sehr viele verschiedene Arten von Zeigern. Die Unterscheidung von Zeigertypen wird nicht auf Maschinenebene vollzogen sondern ist lediglich als Integritätsbedinung auf Compilerebene zu verstehen. Für jeden Zeigertyp (int*, double*, char*, ...) einen eigenen NULL-Wert einzuführen wäre zwar möglich aber nicht angemessen. Aus diesem Grund führt man NULL als Wert für den allgemeinsten Zeigertypen void* ein. Das hat zur Folge, dass jedem Zeigertyp (der als Spezialisierung von void* aufgefasst werden kann) der Wert NULL zugewiesen werden kann.


kann void* als ein template interpretiert werden(platzhalter für ein variablentyp) ? warum hat man mit der hull so ein problem verstehe ich nicht, darf ein zeiger nicht explizit auf eine variable zeigen die null ist ?

Zitat:
Beispiel:

Code:
int* p = NULL;


wird ersetzt durch

Code:
int* p = (void*)0;


Erklärung: 0 ist für den Compiler ein Integer und nicht kompatibel mit einem int-Pointer. Man castet 0 nun auf eine void-Pointer um, da void* der allgemeinster Pointer-Typ ist und implizit auf alle weiteren Pointertypen umgecastet werden kann.


nun gut, void* steht einfach für int*, float* usw. für mich ergibt das aber irgendwie keinen sinn.

int *ip = (float *fp)0 , normal doch so : int *pointer= &ivaraible;

man castet doch werte zu typen wie int 20 zu float 20 und nicht zu einem wert Question
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 18 Jan 2009 - 16:55:00    Titel:

Du möchtest ja nicht, das der Pointer auf einen Speicherbereich zeigt, in dem eine 0 steht, sondern das der Pointer auf den Speicherbereich 0 zeigt.

Wink
Armin Gibbs
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 06.02.2008
Beiträge: 992

BeitragVerfasst am: 18 Jan 2009 - 17:04:28    Titel:

Zitat:
int *ip = (float *fp)0 , normal doch so : int *pointer= &ivaraible;


In beiden Fällen bekommt die Variable ip einen Zahlenwert zugewiesen. Im einen Fall die 0 im anderen Fall die Adresse der Variable "ivaraible" im Speicher. Die Variable könnte z.B. irgendwo bei 0x00400000 liegen, dann bekommt ip diese Zahl.

Eine Konstante (wie "0") hat nicht nur einen Wert sondern auch einen Typ. "10" ist ein Integer, "10.0" ist float, etc..

int *ip = 0 wäre also der Versuch, einem int-Pointer ein Integer zuzuweisen.
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> c++ frage
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum