Problem mit Visual C++ 2005 Express Edition
-
Hallo zusammen,
bin neu hier im Forum. Ich hoffe das ich hier die richtige Kategorie ausgesucht habe für mein kleines Problem.
Folgender Programm-Code lässt sich mit meinem VC++ 2005 EE nicht kompilieren:#include <iostream> using namespace std; int main(void) { unsigned char uc = 0 - 1; signed char sc = uc / 2; unsigned short int usi = 0 - 1; signed short int ssi = usi / 2; unsigned int ui = 0 - 1; signed int si = ui / 2; unsigned long int uli = 0 - 1; signed long int sli = uli / 2; unsigned long long int ulli = 0 - 1; signed long long int slli = ulli / 2; cout << "> Signed Char . . . . . " << sizeof(signed char) << " Byte; " << (short)((char)(sc + 1)) << " / " << (short)sc << endl; cout << "> Unsigned Char . . . . . " << sizeof(unsigned char) << " Byte; " << (short)uc << endl; cout << "> Signed Short Int . . " << sizeof(signed short) << " Byte; " << ssi << " / " << (short)(ssi + 1) << endl; cout << "> Unsigned Short Int . . " << sizeof(unsigned short) << " Byte; " << usi << endl; cout << "> Signed Int . . . . . " << sizeof(signed int) << " Byte; " << (int)(si + 1) << " / " << si << endl; cout << "> Unsigned Int . . . . . " << sizeof(unsigned int) << " Byte; " << ui << endl; cout << "> Signed Long Int . . . " << sizeof(signed long int) << " Byte; " << (long int)(sli + 1) << " / " << sli << endl; cout << "> Unsigned Long Int . . . " << sizeof(unsigned long int) << " Byte; " << uli << endl; cout << "> Signed Long Long Int " << sizeof(signed long long int) << " Byte; " << (long long int)(slli + 1) << " / " << slli << endl; cout << "> Unsigned Long Long Int " << sizeof(unsigned long long int) << " Byte; " << ulli << endl; cout << "> Float . . . . . . . . . " << sizeof(float) << " Byte;" << endl; cout << "> Double . . . . . . . . " << sizeof(double) << " Byte;" << endl; cout << "> Long Double . . . . . . " << sizeof(long double) << " Byte;" << endl; cout << "> Long Long Double . . . " << sizeof(long long double) << " Byte;" << endl; return 0; }
In der letzten Zeile "vor dem return 0;" wird das kompilieren gestoppt mit folgender Fehlermeldung:
limits.cpp(40) : error C2632: '__int64' gefolgt von 'double' ist unzulässig
Und das, obwohl der Code vollkommen in Ordnung ist.
Im Dev-C++ habe ich genau den gleichen Code eingegeben - und es liess sich problemlos kompilieren und ausführen.
Siehe hier->http://thesubhead.th.funpic.de/Limit.jpg
------------------------------------------------------------------Ich habe das VC++ 2005 EE upgedated mit SP 1 - PSDK hatte ich auch schon bereits installiert und alles nach der Anleitung von MSDN im VC++ 2005 eingerichtet.
Liegt es am Compiler von VC++? Kann man das auch irgendwie updaten, oder ein anderes dafür verwenden?
Ich würde mich über jede Hilfe wirklich sehr freuen!!!
Wollte noch hinzufügen das ich einen Athlon X2 64 Bit Prozessor habe und
Windows XP Professional x64 als Betriebssystem. Vielleicht ist da ein Zusammenhang. Sorry, das ist wirklich meine letzte Editierung!!!Mit freundlichen Grüssen
TheSubhead
-
TheSubhead schrieb:
Siehe hier->http://thesubhead.th.funpic.de/Limit.jpg
------------------------------------------------------------------Hm sieht irgendwie seltsam aus, das long double (12b) länger sein soll als long long double (8b), aber ich steh eh nicht so auf Längenvergleich...
Wollte noch hinzufügen das ich einen Athlon X2 64 Bit Prozessor habe und
Windows XP Professional x64 als Betriebssystem. Vielleicht ist da ein Zusammenhang.Ja vielleicht
Conroe6600 (jaja x86_64) auf nem anständigen OS :p (Ubuntu amd64)
> Signed Char . . . . . 1 Byte; -128 / 127 > Unsigned Char . . . . . 1 Byte; 255 > Signed Short Int . . 2 Byte; 32767 / -32768 > Unsigned Short Int . . 2 Byte; 65535 > Signed Int . . . . . 4 Byte; -2147483648 / 2147483647 > Unsigned Int . . . . . 4 Byte; 4294967295 > Signed Long Int . . . 8 Byte; -9223372036854775808 / 9223372036854775807 > Unsigned Long Int . . . 8 Byte; 18446744073709551615 > Signed Long Long Int 8 Byte; -9223372036854775808 / 9223372036854775807 > Unsigned Long Long Int 8 Byte; 18446744073709551615 > Float . . . . . . . . . 4 Byte; > Double . . . . . . . . 8 Byte; > Long Double . . . . . . 16 Byte; > Long Long Double . . . 8 Byte;
Scheints nütz es grad gar nichts, auf long long zu bauen *schulterzuck*
Mal ne Frage: Wieviele bytes resp. signifikante Stellen brauchst du???23
-
Hallo,
erstmals vielen Dank für die Antwort!
Mal ne Frage: Wieviele bytes resp. signifikante Stellen brauchst du???23
Gar keine! Das ist nur so zum testen. Ich bin gerade erst dabei C++ zu lernen.
Daher geht es mir eigentlich nicht darum was in der Konsole ausgegeben wird, sondern um die Tatsache, dass ein und der selbe Code (C++) auf einer IDE (DEV-C++) funktioniert und auf der anderen IDE (Visual C++ 2005 Express Edition) nicht.
Da ich gerne mit beiden IDE´s arbeiten möchte, wäre es mir ganz recht wenn auch beide einwandfrei funktionieren würden. Doch dank dieses Beispiels musste ich leider feststellen, dass dies bei meinem VC++ 2005 EE wohl nicht der Fall ist.
Daraufhin habe ich das SP1 update für VC++ 2005 EE installiert. Hat aber auch nichts gebracht. Wahrscheinlich liegt es am Compiler, welches VC++ 2005 EE benutzt.
Meine Frage ist eigentlich - gibt es jemanden hier im Forum, der sich wirklich gut mit dem VC++ 2005 EE auskennt? Wenn ja - gib mir bitte ein paar Tipps - wieso dieses Problem bei mir auftreten tut.
Ich wäre wirklich sehr dankbar. MSDN ist nämlich nicht wirklich hilfreich (meiner Meinung nach)!
Mit freundlichen Grüssen
TheSubhead
-
*schnauf* Also erstmal, kommt es mir so vor, als ob du generell Microsoft die Schuld gibst. Deine Frage, ob "es" (was auch immer, anscheinend ein Fehler?) am MSVC-Compiler liegt, deutet darauf hin, das du erstmal generell MS die Schuld gibst.
1. MSVC ist seit Version 2003 (7.1) mit der beste Compiler für die Windows-Plattform. Vorallem was die ISO-C++-konformität angeht.
2. Schon mal daran gedacht, das das Problem meistens vor dem Rechner sitzt?
Was ist bitte ein "long long double"? Ganz ehrlich: ich weiß nicht was das sein soll!? Vielleicht sagst du mir/uns erstmal, was das für ein Datentyp sein soll? Ich kenne entweder double oder long long. Wobei long long im MSVC "nur" ein typedef auf __int64 ist. Ich habe noch nie versucht einen "int float"-Typ für meine Variablen zu benutzen, somit verstehe ich analog dazu long long double auch nicht. Und ganz ehrlich? Ich vermute auch der Compiler stellt sich berechtigterweise diese Frage und spuckt einen Error aus. Und man sollte sich fragen, ob nicht evtl. DevCpp hier fehlerhaft ist, und MSVC richtig handelt?
Lektüre:
http://msdn2.microsoft.com/en-gb/library/ws579tt7(VS.80).aspx
-
Hallo Artchi,
ich hab halt leider so gut wie noch gar keine Ahnung, da ich mich erst seit ein paar Wochen damit beschäftige (Programmierung).
Wahrscheinlich habe ich deswegen Microsoft die Schuld gegeben, da der Code sich mit DEV-C++ kompilieren und ausführen lies und mit VC++ 2005 EE halt nicht.
Du bist nunmal wahrscheinlich ein erfahrener Programmierer, der sich ziemlich fett damit auskennt und sich dann natürlich frägt:"Was soll das denn sein?"
Also, wenn ich das richtig verstehe, ist der Code den ich in meinem ersten Posting eingefügt habe - in der letzten Zeile fehlerhaft bzw. Long Long Double gibt es also gar nicht?
Dieser Code hat mir einer in einem anderen Forum zum Download bereit gestellt.
Den habe ich ja nicht selbst geschrieben.Als ich gestern die letzte Zeile ausgeschnitten habe, und es dann anschliessend
erneut ausgeführt und ohne debuggen gestartet habe (VC++ 2005 EE) funktionierte
es ja dann auch!!!Wie gesagt - nur mit DEV-C++ liess sich dieser Code auf Anhieb kompilieren und ausführen. Deswegen dachte ich es sei ein Fehler des MSVC-Compilers.
Aber das was du geschrieben hast, klingt logisch. In meinem Buch konnte ich auch nichts über >Long Long Double< finden.
Verstehe ich das also richtig?
Mit freundlichen Grüssen
TheSubhead------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Okay - habe nun den Code geändert:
#include <iostream> using namespace std; int main(void) { unsigned char uc = 0 - 1; signed char sc = uc / 2; unsigned short int usi = 0 - 1; signed short int ssi = usi / 2; unsigned int ui = 0 - 1; signed int si = ui / 2; unsigned long int uli = 0 - 1; signed long int sli = uli / 2; unsigned long long int ulli = 0 - 1; signed long long int slli = ulli / 2; cout << "> Signed Char . . . . . " << sizeof(signed char) << " Byte; " << (short)((char)(sc + 1)) << " / " << (short)sc << endl; cout << "> Unsigned Char . . . . . " << sizeof(unsigned char) << " Byte; " << (short)uc << endl; cout << "> Signed Short Int . . " << sizeof(signed short) << " Byte; " << ssi << " / " << (short)(ssi + 1) << endl; cout << "> Unsigned Short Int . . " << sizeof(unsigned short) << " Byte; " << usi << endl; cout << "> Signed Int . . . . . " << sizeof(signed int) << " Byte; " << (int)(si + 1) << " / " << si << endl; cout << "> Unsigned Int . . . . . " << sizeof(unsigned int) << " Byte; " << ui << endl; cout << "> Signed Long Int . . . " << sizeof(signed long int) << " Byte; " << (long int)(sli + 1) << " / " << sli << endl; cout << "> Unsigned Long Int . . . " << sizeof(unsigned long int) << " Byte; " << uli << endl; cout << "> Signed Long Long Int " << sizeof(signed long long int) << " Byte; " << (long long int)(slli + 1) << " / " << slli << endl; cout << "> Unsigned Long Long Int " << sizeof(unsigned long long int) << " Byte; " << ulli << endl; cout << "> Float . . . . . . . . . " << sizeof(float) << " Byte;" << endl; cout << "> Double . . . . . . . . " << sizeof(double) << " Byte;" << endl; cout << "> Long Double . . . . . . " << sizeof(long double) << " Byte;" << endl; cout << "> Long Long . . . . . . . " << sizeof(long long) << " Byte;" << endl; return 0; }
Ergebnisse mit DEV-C++ und mit VC++ 2005 EE:
http://thesubhead.th.funpic.de/nice.jpgIst das so richtig?
Mit freundlichen Grüssen
TheSubhead
-
Meine Fragen waren teilweise ernst gemeint. Und nein, ich bin nicht fett in C++. Sicherlich habe ich schon 8 Jahre Erfahrung, aber beruflich bin ich in Java eingespannt. Meine Fragen waren also sowohl provokativ, als auch mit einer gewissen Frage nach dem Motto "Vielleicht habe ich in den 8 Jahren irgendwas verpasst?".
Aber generell wundert mich eines: integrale und fliessende Zahlentypen mischen finde ich merkwürdig. Habe ich aber schon gesagt. Gut, wer will, kann das ja gerne machen.
Was die "Richtigkeit" angeht: bei C++ gibt es kein Richtig, bzgl. der Byte-Breiten für Typen. Warum? Weil der ISO-C++-Standard z.B. nicht vorschreibt, wieviel Bytes ein int haben muß. Das kann von Compiler zu Compiler auf einer Plattform unterschiedlich ausfallen. Natürlich hat sich auf 32bit-Windows-System eingespielt, das praktisch alle Compiler int 4 Bytes groß darstellen. Aber wchar_t wird z.B. vom MSVC immer 2 Byte dargestellt, während MinGW wchar_t 4 Byte darstellt. Keines von beiden ist falsch oder richtig. Es ist eine Entscheidung des jeweiligen Compilerherstellers.
Übrigens, wchar_t fehlt in deiner Übersicht.
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_CRT_Long_Double.asp
Also, long double ist im MSVC in Wirklich keit nur ein double. long double ist nur noch aus Kompatibilitätsgründen im MSVC.
Und hier eine Übersicht, der C++-Datentypen und wie sie im MSVC dargestellt werden:
http://msdn2.microsoft.com/en-us/library/cc953fe1(VS.80).aspx
-
Hallo Artchi,
siehst du? Durch dich habe ich wieder was neues dazu gelernt. Und dafür bin ich dir auch wirklich sehr dankbar.
Was die "Richtigkeit" angeht: bei C++ gibt es kein Richtig, bzgl. der Byte-Breiten für Typen.......Keines von beiden ist falsch oder richtig. Es ist eine Entscheidung des jeweiligen Compilerherstellers.
Meine Frage: "Ist das so richtig? " habe ich beim letzten Posting falsch gesetzt.
Die Frage war auf den veränderten Programm-Code bezogen, und nicht auf die Ergebnisse. Sorry, mein Fehler.Nochmals vielen Dank für deine Hilfe & Hinweise.
Wirklich sehr nett!!!Mit freundlichen Grüssen
TheSubhead
-
Artchi schrieb:
Also, long double ist im MSVC in Wirklich keit nur ein double. long double ist nur noch aus Kompatibilitätsgründen im MSVC.
Wobei man das leicht missverstehen könnte. Der Datentyp selbst, also long double, ist immer noch ein eigenständiger Typ. Und dass der exisitiert hat auch nichts mit Kompatibilitätsgründen zu tun. Lediglich die Funktionen, welche long double benutzen, sind obselet, da long double beim MSC die gleiche interne Repräsentation hat wie double.
-
TheSubhead schrieb:
Hallo Artchi,
cout << "> Signed Long Long Int " << sizeof(signed long long int) << " Byte; " << (long long int)(slli + 1) << " / " << slli << endl; cout << "> Unsigned Long Long Int " << sizeof(unsigned long long int) << " Byte; " << ulli << endl; cout << "> Float . . . . . . . . . " << sizeof(float) << " Byte;" << endl; cout << "> Double . . . . . . . . " << sizeof(double) << " Byte;" << endl; cout << "> Long Double . . . . . . " << sizeof(long double) << " Byte;" << endl; cout << "> Long Long . . . . . . . " << sizeof(long long) << " Byte;"
long long
und
long long int
sind das gleiche
-
Hallo,
aha - also >long long< und >long long it< ist das gleiche?
Okay - das muss ich mir merken.Naja - ich arbeite mich gerade durch das Buch (C++ von A bis Z). Befinde mich aber noch ziemlich am Anfang des Buches, da ich mich parallel dazu, auch durch das Buch
(C von A bis Z) arbeite. Man kann zwar C++ auch unabhängig von C lernen, doch ich habe gemerkt, dass es einem doch wesentlich leichter fällt - wenn man sich auch mit C beschäftigt.Vielen Dank für eure nützlichen Tipps. Es ist wirklich ein sehr gutes Forum.
Mit freundlichen Grüssen
TheSubhead