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 den

    Run-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 😃


  • Mod

    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;
    }
    

    😕


Anmelden zum Antworten