malloc



  • Hi Leute,

    ich hab ein kleines Problem.

    Und zwar möchte ich mit der Funktion melloc() die Länge der Var. BufferEdit2 ändern. Leider Bekomme ich beim compiling die Fehlermeldung "cannot convert from 'void *' to 'char *'"

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    .....

    char *BufferEdit2 = NULL;
    int iLength;

    iLength = GetWindowTextLength(hEdit2); <- hEdit2 ist der Handler zu nem Eingabefenster
    BufferEdit2 = (char*) malloc(iLength);
    GetWindowText(hEdit2, BufferEdit2, iLength+1);

    kann mir da wer helfen

    mfg Thunder 😕



    1. Zum ändern der "Länge" benutzt man realloc.
    2. In C++ benutzt man kein malloc, realloc oder free sondern new und delete! 💡


  • Sorry ich bin absoluter Neuling

    Wie würde das den aussehen wenn ich das mit new machen sollte

    😕

    mfg

    Thunder



  • So ist besser...

    #include <windows.h> 
    #include <cstdio> //<--
    #include <cstdlib> //<--
    
    //..... 
    
    int iLength = GetWindowTextLength(hEdit2);
    char* BufferEdit2 = new char[iLength]; //<--
    GetWindowText(hEdit2, BufferEdit2, iLength);
    


  • Achso, und um Himmels Willen das delete nachher nicht vergessen sonst gibts Memory-Leaks (Speicherlöcher).



  • anstatt da mit char arrays rumzuhantieren,
    könnte man auch gleich std::string nehmen...



  • OK so weit so gut aber wo muss das delete hin???

    muss Ici das unter WM_DESTROY reinschreiben oder wo sonst und wie muss ich das schreiben??

    delete BufferEdit2 oder so ähnlich

    Nochmals ich bin absoluter Neuling und versuche mit mit Tuturials durchsukämpfen

    mfg

    thunder



  • devil81 schrieb:

    anstatt da mit char arrays rumzuhantieren,
    könnte man auch gleich std::string nehmen...

    Ich denke es ist besser ihm zu zeigen wie man dynamischen Speicher verwendet anstatt ihm sofort std::string zu präsentieren und er benutzt weiter fleißig malloc.



  • @Thunder000019: Das delete machst du erst wenn du den Speicher nicht mehr brauchst.



  • Ich glaube bald werde ich lästig 😃

    aber wie der code für das delette aus zB. bei BufferEdit1 😕

    mfg
    Thunder



  • Ich poste lieber mal den gesamten code.

    #define STRICT
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "resource.h"
    
    #define USERNAME	1
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK NavProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK PassProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	HWND       hWnd;
    	MSG        msg;
    	WNDCLASS   wc;
    
    	wc.style			= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc		= WndProc;
    	wc.cbClsExtra		= 0;
    	wc.cbWndExtra		= 0;
    	wc.hInstance		= hInstance;
    	wc.hCursor			= LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon			= LoadIcon(NULL,IDI_APPLICATION);
    	wc.hbrBackground	= (HBRUSH) CreateSolidBrush(RGB(252,250,198));
    	wc.lpszClassName	= "Startfenster";
    	wc.lpszMenuName		= "IDR_HALLO";
    
    	RegisterClass(&wc);
    
    	wc.hbrBackground	= (HBRUSH) CreateSolidBrush(RGB(255,0,0));
    	wc.lpfnWndProc      = NavProc;
    	wc.lpszClassName    = "Navigation";
    	wc.lpszMenuName		= "NULL";
    
    	RegisterClass(&wc);
    
    	wc.hbrBackground	= (HBRUSH) CreateSolidBrush(RGB(252,250,198));
    	wc.lpfnWndProc      = PassProc;
    	wc.lpszClassName    = "Passwortabfrage";
    	wc.lpszMenuName		= "NULL";
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow("Startfenster", "Orthotherapia - Verwaltung V 1.0", WS_OVERLAPPED | WS_SYSMENU| WS_MINIMIZEBOX, 0, 0, 800, 600, NULL, NULL, hInstance, NULL);
    
    	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)
    {
    	static  HWND hNav, hPass;
    	static int LogedIn = 0;
    	HINSTANCE hInstance;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		{
    			hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
    			hNav = CreateWindow("Navigation", "", WS_CHILD | WS_VISIBLE, 0, 0, 150, 575, hWnd, NULL, hInstance, NULL);
    
    			if(LogedIn == 0)
    			{
    				hPass = CreateWindow("Passwortabfrage", "", WS_CHILD | WS_VISIBLE, 151, 0, 649, 575, hWnd, NULL, hInstance, NULL);
    			}
    
    			return 0;
    		}
    	case WM_PAINT:
    		{
    			UpdateWindow(hPass);
    			UpdateWindow(hNav);
    
    			return 0;
    		}
    
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    	}	
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK NavProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{	
    	case WM_PAINT:
    		{
    			return 0;
    		}
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK PassProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HWND hEdit1, hEdit2, hButton1;
    	static HBITMAP hBitmap ;
    	static BITMAP  bitmap;
    	static HINSTANCE hInstance;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		{
    
    			hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
    
    			hBitmap = (HBITMAP) LoadImage(hInstance, "Images/OrthoLogo.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    			GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;
    
    			hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, 50, 135, 120, 20, hWnd, NULL, hInstance, NULL);
    			SendMessage(hEdit1, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
    
    			hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_PASSWORD, 50, 180, 120, 20, hWnd, NULL, hInstance, NULL);
    			SendMessage(hEdit2, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
    
    			hButton1 = CreateWindow("button", "Anmelden", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 50, 210, 80, 20, hWnd, NULL, hInstance, NULL);
    			SendMessage(hButton1, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
    			return 0;
    		}
    	case WM_COMMAND:
    		{
    			if (lParam == (LPARAM)hButton1)
    			{
    				if (HIWORD(wParam) == BN_CLICKED)
    				{
    					char *BufferEdit1 = NULL;
    					char *BufferEdit2 = NULL;
    					char *Filename = NULL;
    					char *Passwort = NULL;
    					char Pfad[] = "Benutzer/";
    					int iLength;
    					long iFileSize;
    					FILE *fz;
    
    					iLength = GetWindowTextLength(hEdit1);
    					BufferEdit1 = new char[iLength];
    					GetWindowText(hEdit1, BufferEdit1, iLength+1);
    
    					iLength = GetWindowTextLength(hEdit2);
    					BufferEdit2 = new char[iLength];
    					GetWindowText(hEdit2, BufferEdit2, iLength+1);
    
    					iLength = strlen(BufferEdit1) + strlen(Pfad);
    					Filename = new char[iLength];
    					wsprintf(Filename, "%s%s.dat", Pfad, BufferEdit1);
    
                 		fz = fopen("Benutzer/Administrator.dat", "rb");
    					if(fz != NULL)
    					{
    						fseek(fz, 0, 2);
    						iFileSize = ftell(fz);
    						Passwort = new char[iFileSize];
    
    						fseek(fz, 0, SEEK_SET);
    						fread(Passwort, 1, iFileSize, fz);
    						fclose(fz);
    					}
    
    					MessageBox(0, Passwort, "Message", MB_OK);
    
    				}
    			}
    			return 0;
    		}
    
    	case WM_PAINT:
    		{
    			HDC hDC, hDCMem;
    			PAINTSTRUCT ps;
    			RECT rect;
    
    			GetClientRect(hWnd, &rect);
    
    			hDC = BeginPaint(hWnd, &ps);
    			{
    				hDCMem = CreateCompatibleDC (hDC) ;
    				SelectObject (hDCMem, hBitmap);
    
    				SetBkMode(hDC, TRANSPARENT);
    
    				SetTextColor(hDC, RGB(150,50,0));
    				rect.top = 10;
    				rect.left =+ 50;
    				rect.right = rect.right - 50;
    				char szText[] = "Willkommen bei der Orthotherapia - Verwaltung";
    				DrawText(hDC, szText, sizeof(szText)-1, &rect,DT_SINGLELINE | DT_CENTER);
    
    				SetTextColor(hDC, RGB(0,0,0));
    				rect.top = 80;
    				char szText2[] = "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein.";
    				DrawText(hDC, szText2, sizeof(szText2)-1, &rect,DT_SINGLELINE);
    
    				rect.top = 115;
    				char szText3[] = "Benutzername:";
    				DrawText(hDC, szText3, sizeof(szText3)-1, &rect,DT_SINGLELINE);
    
    				rect.top = 160;
    				char szText4[] = "Passwort: (min. 6 Zeichen)";
    				DrawText(hDC, szText4, sizeof(szText4)-1, &rect,DT_SINGLELINE);
    
    				BitBlt (hDC, 250, 120, bitmap.bmWidth, bitmap.bmHeight, hDCMem, 0, 0, SRCCOPY) ;
    			}
    			EndPaint(hWnd, &ps);
    
    			return 0;
    		}
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Vieleicht könnte mir wer meine Fehler aufzählen

    mfg
    Thunder



  • Deinen WinAPI-Code habe ich nicht gelesen, der gehört auch nicht in dieses Forum und ist sowieso tiefstfinsteres C.
    Erstens muss es aber, wenn überhaupt, delete[] BufferEdit2 heißen (weil new [] verwendet wurde), und zweitens solltest du lieber einen std::vector oder einen anderen Wrapper deiner Wahl nehmen, anstatt hier und da Zeiger rumschwirren zu lassen.

    #include <vector>
    ...
    std::vector<char> BufferEdit2;
    ...
    BufferEdit2.resize(iLength);
    GetWindowText(hEdit2, &BufferEdit2[0], iLength);
    


  • Achso, und Code-Tags gibt es in diesem Forum auch.



  • Da er schwerpunktmäßig C schreibt wäre es nicht besser in in das C-Forum zu verweisen, anstatt verzweifelt zu versuchen ihn zu C++
    zu bekehren?



  • Thunder000019 wenn du willst verschibe ich den thread ins c forum, die arbeiten da täglich mit malloc


Anmelden zum Antworten