reinterpret_cast
-
Das hätte ich auch gerne Mal erklärt.
MfG Eisflamme
-
Tolles Zitat.
-
Ok nochmal eine Erklärung:
In der ODBC-API gibt es Funktionen, um bsp. Verbindungsparameter zu setzen. Die Attribute an sich sind Integer, sie können als Wert jedoch entweder einen Integer oder eine Zeichenkette besitzen.
Das ganze sieht dann ca. so aus:
// Funktionsdeklaration int SQLFunction(int attribute, void* value);
Somit muss ich nach int casten, wenn attribute einen Integer will und nach char*, wenn es einen char* will.
Danke für Eure Hilfe.
-
#phoenix# schrieb:
Sollte int nicht auf jeder Platform die grösse eines Zeigers haben?
Nein.
-
Wollte eigentlich nur wissen, ob man die Warnung ignorieren kann
-
simon.phoenix schrieb:
Ok nochmal eine Erklärung:
In der ODBC-API gibt es Funktionen, um bsp. Verbindungsparameter zu setzen. Die Attribute an sich sind Integer, sie können als Wert jedoch entweder einen Integer oder eine Zeichenkette besitzen.
Das ganze sieht dann ca. so aus:
// Funktionsdeklaration int SQLFunction(int attribute, void* value);
Somit muss ich nach int casten, wenn attribute einen Integer will und nach char*, wenn es einen char* will.
Danke für Eure Hilfe.
jo, und nie nach void*
-
Irgendwie stehe ich total auf dem Schlauch. Natürlich muss in nach void* casten, wenn du Funktion void* erwartet?!?
-
simon.phoenix schrieb:
Wollte eigentlich nur wissen, ob man die Warnung ignorieren kann
Nein.
Mal 'ne andere Frage. Was sagt denn die SQL Doku zu der Funktion? Kann es sein, dass die Funktion vielmehr eine Referenz (nicht verwechseln mit &) auf den Wert erwartet? Also eher sowas
reinterpret_cast<void*>(ein_string) reinterpret_cast<void*>(&ein_int)
-
Genau so mache ich das ja.
Allerdings verstehe ich Folgendes nicht:
reinterpret_cast<void*> (intvalue)
- Keine Compilerwarnung
- Funktion schlägt fehl (ungültiges Argument)reinterpret_cast<void*> (&intvalue)
- Compilerwarnung
- Funktion klappt einwandfreiDokumentation schrieb:
Depending on the value of Attribute, ValuePtr will be a 32-bit unsigned integer value or will point to a null-terminated character string.
Danke für die Hilfe!
-
reinterpret_cast<void*> (&intvalue)
Gibt bei mir keine Warnung.
reinterpret_cast<void*> (intvalue)
Gibt bei mir eine Warnung.
Also genau umgekehrt wie du es sagst.
Visual C++ 2003 .NET, 64-Bit Warnungen an.
-
diese funktion hier?
SQLRETURN SQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
Ich vermute, du bekommst keine Probleme, wenn du statt int und void* gleich SQLPOINTER bzw. SQLUINTEGER verwendest; diese sollten bereits so definiert sein, dass die Umwandlung funktioniert. Deshalb gibt es sie ja.
-
simon.phoenix schrieb:
reinterpret_cast<void*> (&intvalue)
- Compilerwarnung
Unwahrscheinlich. Bist du dir sicher, dass intvalue wirklich vom Typ int ist? Welchen Compiler hast du denn?
Zudem war im ersten Beitrag davon die Rede, dass folgendesreinterpret_cast<void*>(intvalue)
die Warnung verursacht.
-
Oh sorry, habe das verwechselt. Auf jeden Fall ist es so, dass das Funktionierende ( reinterpret_cast<void*>(intvalue) ) eine Warnung verursacht.
camper schrieb:
diese funktion hier?
SQLRETURN SQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
Ich vermute, du bekommst keine Probleme, wenn du statt int und void* gleich SQLPOINTER bzw. SQLUINTEGER verwendest; diese sollten bereits so definiert sein, dass die Umwandlung funktioniert. Deshalb gibt es sie ja.
Genau das ist die Funktion.
sqltypes.h schrieb:
typedef unsigned long SQLUINTEGER; // ... #define SQLULEN SQLUINTEGER // ... typedef void* SQLPOINTER; // ...
Ob void* oder SQLPOINTER ist somit egal. Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.
Ich will eigentlich nur einen int in void* ohne Warnung konvertieren :(.
-
simon.phoenix schrieb:
Ob void* oder SQLPOINTER ist somit egal. Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.
Ich will eigentlich nur einen int in void* ohne Warnung konvertieren :(.
Das geht nicht - es sei denn, du deaktivierst diese spezielle warnung (ist ja eine 64bit warnung). Ich gehe aber davon aus, das in einer 64bit implementation (oder 32bit mit address extension, also far-pointern) die typedefs für SQLPOINTER/SQLUINTEGER anders aussehen (so dass es dann funktioniert) - DAS ist der grund, warum du sie benutzen solltest.
-
camper schrieb:
Das geht nicht - es sei denn, du deaktivierst diese spezielle warnung (ist ja eine 64bit warnung). Ich gehe aber davon aus, das in einer 64bit implementation (oder 32bit mit address extension, also far-pointern) die typedefs für SQLPOINTER/SQLUINTEGER anders aussehen (so dass es dann funktioniert) - DAS ist der grund, warum du sie benutzen solltest.
D.h. wäre es sehr dumm von mir in einem ODBC-API-WRAPPER diese Typen (auch SQLCHAR) etc nicht zu benutzen?
-
genau. niemand verbietet dir nat., aus bequemlichkeit eigene typedefs zu benutzen, die auf diesen typen basieren. aber der schlechte stil, der sich hinter dieser kontextabhängigen interpretation des arguments als pointer oder integer verbirgt, ist nicht deine schuld und sollte möglichst auch nicht dein problem sein
-
simon.phoenix schrieb:
Ob void* oder SQLPOINTER ist somit egal.
Mit Abstrichen.
simon.phoenix schrieb:
Und die Umwandlung mi SQLUINTEGER ist letztendlich die gleiche wie mi einem unsigned int.
Nicht ganz. 'unsigned long' ist immer noch was anderes als 'unsigned int'.
-
Ok, ich denke die Sache ist geklärt.
Danke vielmals für eure Hilfe