Nur Ärger mit Visual C++ ExpressEdition?
-
Platform SDK muß man extra runter laden, steht auch auf der Download-Seite von der Express Edtion bei. Nicht zu übersehen...
-
Na gut, das ich das PSDK auch runterladen muss, wusste ich nicht, ich dachte das wäre alles im ISO Image dabei... (Gibt´s das auch als solches, ohne das man da 16€ Versandkosten zahlen muss? Mit dem modem sind´s, selbst wenn ich nur das Development Enviroment für x84 Prozessoren auswähle, immernoch ein paar 100MB... Und ich hab mich schon über die 1,26mb große exe grefreut...)
Da ich gerade erst mit der EE angefangen habe, hab ich natürlich gleich mal den Fehler auf das geschoben, das neu ist und das man nicht ändern kann - die ExpressEdition eben
Also ist´s mein code der falsch ist, schade, ich hatte gehofft er wäre richtig... Woe kann ich dann aber die Quadratwurzel aus einer 8byte große Int zahl ziehen? (Wobei es hier dann doch eher ums Primzip geht, um zukünftige Fehler zu vermeiden)
Also hier der#include <cstdlib> #include <iostream> #include <math.h> using namespace std; typedef unsigned int long long numTyp; // eine 64bit int, max 20 stellen, numTyp PrimCheck(numTyp number); void PrimShow(numTyp number); numTyp PrimCheck(numTyp number) { numTyp teil=0; numTyp x,to; if(!(number%2) && number !=2) teil=2; for(x=3; x<sqrt(number)+1; x=x+2) { if(!(number%x)) // ungenauigkeiten bei fmod, da bei doubles gerundet wird und z.b. 2^61-1 == 2^61 { teil=x; break; } } return teil; } void PrimShow(numTyp number) { if(!(PrimCheck(number))) cout << number <<endl; if(!(number%2)) number++; do { if(!(PrimCheck(number))) cout << number <<endl; number=number+2; } while(1); } int main(int argc, char *argv[]) { numTyp zahl=23; numTyp teiler=0; cout << "***Primzahlen***\n"; cout << "(Geben sie 0 ein um alle Primzahlen ab einer Zahl ihrer Wahl anzuzeigen)"; while(1) { cout << "\nZahl eigeben:"; cin >> zahl; if(zahl) { teiler=PrimCheck(zahl); if(teiler==0) cout << "Primzahl\n"; else { cout << "Keine Primzahl\n"; cout << zahl << "="; while(teiler=PrimCheck(zahl)) { cout<<teiler<<"*"; zahl=zahl/teiler; } cout<<zahl; } } else { cout << "Alle Primzahlen ab "; cin >> zahl; PrimShow(zahl); } } //system("PAUSE"); return EXIT_SUCCESS;
Das das Programm sonst auch abgestürtzt wäre, könnte villeicht sein, ist aber schwer festzustellen, daher schloss ich auf´s naheliegende und gab dem neu installierten Visual Studio kurzerhand die Schuld...
-
Gibt es denn keine Möglichkeit für die Modulo Operation und Wurzel aus 8 Byte langen INTs?
Und nochetwas:
Dieses PSDK, ich hab da das hier gefunden:
http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&displaylang=en
Aber warum liegt dabei die betonung so auf Server 2003? Ist es das richtige?
The applications you develop with this edition of the SDK can run on the x86, x64 and Itanium-based versions of Windows Server 2003 SP1, Windows XP SP2, Windows XP x64 Pro Edition, and Windows 2000
stimmt mich zwar positiv, aber heißt das das damit programmierte läuft nicht unter 2000 oder 9x?
-
Da der WinServer 2003 das aktuellste MS-OS ist, ist das 2003er PSDK entsprechend das aktuelleste. Logisch, oder?
Die Programme laufen natürlich auch unter Win2000, hast du doch selbst das Zitat gepostet.
The applications you develop with this edition of the SDK can run on the x86, x64 and Itanium-based versions of Windows Server 2003 SP1, Windows XP SP2, Windows XP x64 Pro Edition, and Windows 2000
Dann noch was, ohne das ich mir deinen Code wirklich angeschaut habe, was mir aber gleich auffiel:
typedef unsigned int long long numTyp; // eine 64bit int, max 20 stellen,
Ehm, wer sagt denn, das unsigned int long long in Microsofts Compiler 64 bittig ist?
Keiner der nativen C++ Typen im MS-Compiler ist 64 bittig. MS hat eigentlich __int64 eingeführt, als 64 bittigen Typ. Den mußt du typedeffen.
-
Ehm, sehe gerade in dem von mir geposteten Link:
"long long" Equivalent to __int64.
-
typedef unsigned int long long numTyp; // eine 64bit int, max 20 stellen,
Muesste das nicht
typedef unsigned long long int numTyp;
heissen, wenn man das "int" unbedingt scheiben will?
-
auch das int hinten ran zu schreiben, oder es ganz wegzulassen oder alles mit __int64 zu ersetzen bringt nichts, scheibar sind für sqrt nur
c:\programme\microsoft visual studio 8\vc\include\math.h(581): kann 'long double sqrt(long double)' sein
c:\programme\microsoft visual studio 8\vc\include\math.h(533): oder "float sqrt(float)"
c:\programme\microsoft visual studio 8\vc\include\math.h(128): oder "double sqrt(double)"erlaubt...
-
Endlich hab ich das PSDK, ich hab´s auch installiert, aber es funktionieren immer noch keine Windows-Fenster
Ich hab auch schon SetEnv.Cmd ausgeführ, ja ich habe sogar die ganzen dateien aus include und libs des SDKs in die entsprechenden C++ Ordner kopiert - das einzige was ich dafür bekam waren folgende Linking Fehler:MS VC++ EE schrieb:
------ Build started: Project: API Test, Configuration: Debug Win32 ------
Compiling...
testsrc.cpp
Linking...
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ReleaseDC@8" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetTextMetricsA@8" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetDC@4" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__PostQuitMessage@4" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__EndPaint@8" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__TextOutA@20" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__BeginPaint@8" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__DefWindowProcA@16" in Funktion ""long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__DispatchMessageA@4" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__TranslateMessage@4" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetMessageA@16" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__UpdateWindow@4" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ShowWindow@8" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__CreateWindowExA@48" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__RegisterClassA@4" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetStockObject@4" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__LoadCursorA@8" in Funktion "_WinMain@16".
testsrc.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__LoadIconA@8" in Funktion "_WinMain@16".
C:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2005\Projects\API Test\Debug\API Test.exe : fatal error LNK1120: 18 nicht aufgelöste externe Verweise.
Build log was saved at "file://c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2005\Projects\API Test\API Test\Debug\BuildLog.htm"
API Test - 19 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========Falls es am Code liegen sollte, hier ist der
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "HalloWelt"; HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow( szAppName, // Klassenzugehörigkeit "Das erste Fenster", // Titelzeile WS_OVERLAPPEDWINDOW, // Fensterart CW_USEDEFAULT, // x-Wert der oberen linken Ecke CW_USEDEFAULT, // y-Wert der oberen linken Ecke CW_USEDEFAULT, // Breite des Fensters CW_USEDEFAULT, // Höhe des Fensters NULL, // Kinderfenster? NULL, // Menühandle hInstance, // Handle zur Instanz NULL ); // Parameter zur Weitergabe an WM_PAINT ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static int cxChar, cyChar, cxCaps; TEXTMETRIC tm; switch(message) { case WM_CREATE: hdc = GetDC(hwnd); GetTextMetrics (hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight + tm.tmExternalLeading; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; ReleaseDC(hwnd, hdc); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 5*cxChar, 2*cyChar, "Hallo Windows-Welt !", 20); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
-
benpicco schrieb:
ja ich habe sogar die ganzen dateien aus include und libs des SDKs in die entsprechenden C++ Ordner kopiert
Keine gute Idee. Sag der IDE, wo sie nach Headern und Libs zu suchen hat (Tools
Options
Projects and Solutions
VC++ Directories). Alles andere ist Unsinn.
Was die Fehler betrifft, das sind Linkerfehler. Das Kompilieren ansich war erfolgreich. Warum die Fehler auftreten, ist auch schnell erklärt. Irgendwo in deinem Code werden die entsprechenden Funktionen aufgerufen. Damit der Linker das richtig verknüpfen kann, also dass beim Aufruf auch zur entsprechenden Stelle gesprungen wird, muss er wissen, wo die Funktionen definiert sind. Das kannst du der Platform SDK Doku entnehmen. ReleaseDC ist zB in user32.lib zu finden. Und diese Bibliotheken gibst du deinem Linker mit. Project
Properties
Configuration Properties
Linker
Input
Additional Dependencies
-
Danke! Das funktioniert *juhu*!
Endlich ein funktionstüchtiges Fenster *freu*P.S.: Gibt es eigendlich auch ne Funktion, die die Libraries automatisch anhand der Befehle einbindet