Neues Problem [run-time check failure 3]
-
Hallo erstmal
Ich habe mal wieder
Also ich hab mich jetzt mal durch die ersten tutorials durchgearbeitet und bin jeztzt beim 4ten Tutorial angekommen in dem es darum geht eine überschrift zu possitionieren und Darunter alle ASCII Zeichen + den ASCII Code ausgeben naja jetzt bekomm ich aber denRun-Time Check Failure #3 - The variable 'szTexter' is being used without being initialized.
ich weis leider nicht was damit gemeint ist da die Variable ja eig schon initiallisiert wurde hier mal mein ausschnitt aus dem quellcode
switch (message) // Welche Nachricht hat uns Windows oder ein anderes Fenster geschickt { case WM_SIZE: { rect.left = 0; //Koordinatensystem mitte == links oben im Fenster rect.top = 0; rect.right = LOWORD(lParam); //in dem Word des lParam ist die Breite des Anwendungsbereiches gespeichert rect.bottom = HIWORD(lParam); //in dem Word des lParam ist die Höhe des Anwendungsbereiches gespeichert return 0; } case WM_PAINT: //Wenn wir diese Nachricht hier nicht bearbeiten würden, würde DefWindowProc das übernehmen und nichts weiter tun, als den ungültigen Bereich wieder als gültig erklären. { PAINTSTRUCT ps; //Um auf windows zeichnen zu können muss man sich Anmelden das geht mit PAINTSTRUCT HDC hDC; //Handle auf unseren Zeichenbereich const LPWSTR szTexit = L"Epischer Text :O"; //<- EPISCHER TEXT :O hDC = BeginPaint(hWnd, &ps); // Sagt Windows Das wir in unserem Anwendungsbereich Zeichnen möchten { // 1. Param. legt fenster fest in dem wir zeichnen wollen // 2. Param Zeiger auf unserer Paintstructur Funktion int iXPos = iRand; //aktuelle horizontale Position int iYPos = 2 * iRand; //aktuelle vertikale Position int i = 0; //Schleifenzähler LPWSTR szTexter; //In szText wird jeder einzelne ASCII Code mit dem dazugehörigen Zeichen formatiert zwischengespeichert int iStrLen = 0; //länge unseres Aktuellen Strings SIZE size; //size ist eine Instanz der Struktur SIZE, welche benutzt wird um Größen zu speichern. Die Struktur hat nur zwei Elementvariablen cx und cy, welche die Größe in X und Y Koordinaten speichern (c steht für count). DrawText(hDC,szTexit,lstrlen(szTexit),&rect, DT_SINGLELINE | DT_CENTER); /* DrawText = Text Formatiert ausgeben * 1.handle zu Device Context 2.Zeiger auf Auszugebenden Text 3.Länge des Textes * 4.Zeiger auf RECT Structur ->DrawText wird den Text innerhalb dieses Rechteckes ausrichten * 5.Formatierung des Textes */ for (; i < 128; ++i) //Berechnung der Position jedes einzelnen ASCII Zeichens ->Ausgabe mit TextOut { iStrLen = wsprintf(szTexter, L"%i: %c", i, (char)i);// Gibt die Länge des Geschriebenen Wertes zurück und speichert ihn in iStrLen GetTextExtentPoint32(hDC,szTexter, iStrLen, &size); /*Bestimmung der Maße eines bestimmten Textes -> 1. Device Context 2.Text dessen Masse bestimmt werden soll 3. Länge des Strings 4.Zeiger auf die SIZE Struktur, in der dann die Maße des Textes gespeichert werden*/ if (rect.right <= (iXPos + size.cx + iRand)) // { //Wenn die Breite des Textes über den rechten Rand hinausgehen würde, machen wir einen iXPos = iRand; //Zeilenvorschub. Setzen also iXPos auf den linken Rand zurück und erhöhen iYPos um eine Zeile iYPos += size.cy + iVSpace; //plus den Zeilenabstand. } TextOut(hDC, iXPos, iYPos, szTexter, iStrLen); //Zeichnen -> Text 1.Handle auf Zeichenbereich 2/3. x,y 4. länge der Zeichenkette iXPos += size.cx + iSpace; } } EndPaint(hWnd,&ps); //gibt kontext wieder frei return 0; }
Ich hoffe ihr könnt mir Weiterhelfen
-
Die Variable wird in Zeile 26 angelegt, aber nicht initialisiert, d.h. sie erhält einen undefinierten Wert. Die erste Verwendung ist in Zeile 38 als Ziel für wsprintf() - dort wird aber erwartet, daß sie auf einen brauchbaren Speicherbereich zeigt.
Lösung: Verwende anstelle des Zeigers lieber ein Array.
-
okey danke bei mir hat des davor auch mit arrays versucht aber i-wie hats net feklappt hab das problem jetzt gefunden
hab einfach typecasten müssen um die arrays in die methoden zu bringen
-
phileman schrieb:
okey danke bei mir hat des davor auch mit arrays versucht aber i-wie hats net feklappt hab das problem jetzt gefunden
hab einfach typecasten müssen um die arrays in die methoden zu bringen
Wenn Du casten musstest, dann hast Du einen Fehler gemacht... Außer bei SendMessage und einigen wenigen Windows Funktionen sollten Casts die absolute Ausnahme sein.
-
Okey dan hab ich leider aber keinerlei ahnung woran das liegt ich kann dir ja mal den kompletten quelltext zeigen
#include <Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /* *1. Parameter = Handle zu dem Fenster für das für unsere Nachricht bestimmt ist *2. Parameter = Enthällt die kennziffer der Nachricht *3./4. Parameter = ?? Für alle Nachrichten sind in winuser.h Konstanten deklariert. Die nächsten beiden Parameter enthalten je nach Nachricht verschiedene Daten. */ const LPCTSTR szAppName = L"Fenster"; const int iRand = 20; const int iSpace = 8;// um den Rand, den horizontalen Abstand zwischen zwei Codes und den vertikalen Abstand zwischen zwei Zeilen festzulegen. const int iVSpace = 2; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; // Handel MSG msg; // wnd nachrichten abholen und bearbeiten WNDCLASS wndcl; // typ der fensterklasse wndcl.style = CS_HREDRAW | CS_VREDRAW; //Horizontal Vertikal Zeichnen wndcl.lpfnWndProc = WndProc; //Zeiger auf Adresse der Fkt die Nachrichtenbearbeitung übernimmt wndcl.cbClsExtra = 0 ; wndcl.cbWndExtra = 0; wndcl.hInstance = hInstance; // Übergabe des Handels auf unsere Programminstanz das nur unser Programm diese Fensterklasse Nutzen kann wndcl.hCursor = LoadCursor(NULL,IDC_ARROW); // CursorTyp -> Cursor Laden wndcl.hIcon = LoadIcon(NULL,IDI_APPLICATION); // Icon -> Icon Laden wndcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // Hintergrund -> (HBRUSH)ist ein Typecast der in c++ den Rückgabewerttyp ändern muss wndcl.lpszClassName = szAppName; // Fensterklassenname wndcl.lpszMenuName = NULL; // MenÜ -> keins RegisterClass(&wndcl); //registriert bzw. meldet unsere Fensterklasse beim Fenstermanager von Windows an hWnd = CreateWindow(szAppName, //Name der Fensterklasse L"Hack :O", //Text in Titelleiste WS_OVERLAPPEDWINDOW, //Stil des Fensters CW_USEDEFAULT, //X-Position auf dem Monitor CW_USEDEFAULT, //Y-Position auf dem Monitor CW_USEDEFAULT, //Fensterbreite CW_USEDEFAULT, //Fensterhöhe NULL, NULL, hInstance, //damit man das Fenster unserem Programm zuordnen kann NULL); ShowWindow(hWnd, iCmdShow); //zeigt Fenster -> 2ter prameter legt fest wie das fenster angezeigt werden soll geht z.B. auch (SW_SHOW) UpdateWindow(hWnd); //lässt den Anwendungsbereich, also den freien Fensterbereich, sofort nach dem Start neu zeichnen. // Schleife -> Warten auf aktivität des benutzers wenn etwas passiert informiert und windows über eine nachricht while(GetMessage(&msg,NULL,0,0)) //GetMessage -> Solange Rückgabewert != NULL -> NULL = Wenn Programm durch den Aufruf von PostQuitMessage beendet werden soll wenn keine nachricht vorhanden wartet unsere schleife einfach { //GetMessage -> 1. Parameter Hier wird die nachricht gespeichert // 2. Parameter ??? Im zweiten Parameter können wir uns auf das Abholen von Nachrichten für nur ein Fenster beschränken. Wenn wir dies wollten, müssten wir hier den Handle des Fensters eintragen. Jedoch würde dann unser Programm nicht korrekt beenden, da zum Beispiel die Nachricht, die PostQuitMessage sendet nicht für unser Fenster bestimmt ist, da dies ja schon zerstört wurde. // 3.u 4. Parameter welche art der nachrichten abgeholt wird Alle nachriten zwischen parameter 3 und 4 auser bei 0 0 da werden alle abgeholt TranslateMessage(&msg); // Verarbeitung von Tasterturnachrichten DispatchMessage(&msg); // verteilt die Nachrichten an die jeweilige Windows Prozdeur auch WndProc } return msg.wParam; // wParam = die letzte nachricht die GetMessage bearbeitet hat } LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam) //bearbeitet alle Nachrichtenfür unsere Fensterklasse { static RECT rect; //speichern wir die Maße unseres Anwendungsbereiches. switch (message) // Welche Nachricht hat uns Windows oder ein anderes Fenster geschickt { case WM_SIZE: { rect.left = 0; //Koordinatensystem mitte == links oben im Fenster rect.top = 0; rect.right = LOWORD(lParam); //in dem Word des lParam ist die Breite des Anwendungsbereiches gespeichert rect.bottom = HIWORD(lParam); //in dem Word des lParam ist die Höhe des Anwendungsbereiches gespeichert return 0; } case WM_PAINT: //Wenn wir diese Nachricht hier nicht bearbeiten würden, würde DefWindowProc das übernehmen und nichts weiter tun, als den ungültigen Bereich wieder als gültig erklären. { PAINTSTRUCT ps; //Um auf windows zeichnen zu können muss man sich Anmelden das geht mit PAINTSTRUCT HDC hDC; //Handle auf unseren Zeichenbereich const LPWSTR szTexit = L"Epischer Text :O"; //<- EPISCHER TEXT :O hDC = BeginPaint(hWnd, &ps); // Sagt Windows Das wir in unserem Anwendungsbereich Zeichnen möchten { // 1. Param. legt fenster fest in dem wir zeichnen wollen // 2. Param Zeiger auf unserer Paintstructur Funktion int iXPos = iRand; //aktuelle horizontale Position int iYPos = 2 * iRand; //aktuelle vertikale Position int i = 0; //Schleifenzähler char szTexter[30]; //In szText wird jeder einzelne ASCII Code mit dem dazugehörigen Zeichen formatiert zwischengespeichert int iStrLen = 0; //länge unseres Aktuellen Strings SIZE size; //size ist eine Instanz der Struktur SIZE, welche benutzt wird um Größen zu speichern. Die Struktur hat nur zwei Elementvariablen cx und cy, welche die Größe in X und Y Koordinaten speichern (c steht für count). DrawText(hDC,szTexit,lstrlen(szTexit),&rect, DT_SINGLELINE | DT_CENTER); /* DrawText = Text Formatiert ausgeben * 1.handle zu Device Context 2.Zeiger auf Auszugebenden Text 3.Länge des Textes * 4.Zeiger auf RECT Structur ->DrawText wird den Text innerhalb dieses Rechteckes ausrichten * 5.Formatierung des Textes */ for (; i < 128; ++i) //Berechnung der Position jedes einzelnen ASCII Zeichens ->Ausgabe mit TextOut { iStrLen = wsprintf((LPWSTR)szTexter, L"%i: %c", i, (char)i);// Gibt die Länge des Geschriebenen Wertes zurück und speichert ihn in iStrLen GetTextExtentPoint32(hDC,(LPCWSTR)szTexter, iStrLen, &size); /*Bestimmung der Maße eines bestimmten Textes -> 1. Device Context 2.Text dessen Masse bestimmt werden soll 3. Länge des Strings 4.Zeiger auf die SIZE Struktur, in der dann die Maße des Textes gespeichert werden*/ if (rect.right <= (iXPos + size.cx + iRand)) // { //Wenn die Breite des Textes über den rechten Rand hinausgehen würde, machen wir einen iXPos = iRand; //Zeilenvorschub. Setzen also iXPos auf den linken Rand zurück und erhöhen iYPos um eine Zeile iYPos += size.cy + iVSpace; //plus den Zeilenabstand. } TextOut(hDC, iXPos, iYPos, (LPCWSTR)szTexter, iStrLen); //Zeichnen -> Text 1.Handle auf Zeichenbereich 2/3. x,y 4. länge der Zeichenkette iXPos += size.cx + iSpace; } } EndPaint(hWnd,&ps); //gibt kontext wieder frei return 0; } case WM_DESTROY: //Wenn die Nachricht vom Typ WM_DESTROY is { // Parameter von PostQuitMessage wird später als Rückgabewert der WinMain Funktion benutzt PostQuitMessage(0); // senden wir mithilfen von PostQuitMessage die Nachricht WM_QUIT -> GetMessage Funktion Beendet das Programm return 0; //Wenn wir eine nachricht bearbeitet haben beenden wir die WndProc Fkt mit dem wert 0 } default: return DefWindowProc(hWnd, message, wParam, lParam); // alle Nachrichten werden mit einer standard Bearbeitung behandelt übergabe der WndProc Fkt in die DefWindowProc } return 0; }