Problem mit malloc



  • Ich habe ein Problem, ich bin dabei C++ zu lernen und habe mir deshalb einige Tutorials besorgt. Das Problem: im Code ist scheinbar ein Fehler, das macht sich natürlich nicht gut, wen man davon lernen will...
    Dummerweise ist das darin gezeigte sehr interessant, ich würde daher gerne wissen, wie es richtig heißt. Es geht eigentlich um die WinAPI, aber da da nicht das problem liegt, glaube ich hier schon richtig zu sein 😉
    Das Problem sind scheinbar die Dateifunktioen. Nicht nur das Visual Studio 2005 die Funktion fopen als veraltet kritisiert (dabei hat sie mir doch so gefallen, weil ich sie schon von php kannte :(), nein, es meckert auch bei buffer = malloc(iFileSize);, wobei char *buffer=NULL; Sollte das nicht eigentlich den pointer des reservierten Speichers auf buffer legen, sosass man dan einen String von der Länge iFileSize hat? Und warum ist das nicht einfach mit char buffer[iFileSize] möglich? Was ist die "neue" Version von fopen? 😕
    Achja, hier der code:

    #define _CRT_SECURE_NO_DEPRECATE //VC++ 2005 mag scheinbar kein fopen :(
    
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
        HWND     hWnd;
        MSG      msg;
        WNDCLASS wc;
    
        const char szAppName[] = "Editcontrol Tutorial";
    
        wc.style          = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc    = WndProc;
        wc.cbClsExtra     = 0;
        wc.cbWndExtra     = 0;
        wc.hInstance      = hInstance;
        wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground  = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
        wc.lpszMenuName   = NULL;
        wc.lpszClassName  = szAppName;
    
        RegisterClass(&wc);
    
        hWnd = CreateWindow( szAppName,
                             "Editcontrol Tutorial",
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             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 hEdit;
    
        switch(message)
        {
        case WM_CREATE:
            {            
    			FILE *fz;
                char *buffer = NULL;
                int iFileSize;
    
                fz = fopen("text.txt", "rb");
                if(fz != NULL)
                {
                    fseek(fz, 0, SEEK_END);
                    iFileSize = ftell(fz);
                    buffer = malloc(iFileSize);//'void *' kann nicht in 'char *' konvertiert werden
    
                    fseek(fz, 0, SEEK_SET);
                    fread(buffer, 1, iFileSize, fz);
                    fclose(fz);
                }
    			            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                                       "edit",
                                       buffer, 
                                       WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
                                                  ES_AUTOVSCROLL,
                                       0, 0, 0, 0,
                                       hWnd,
                                       NULL,
                                       ((LPCREATESTRUCT) lParam) -> hInstance,
                                       NULL);
    
                free(buffer);
    
                return 0;
            }
        case WM_SIZE:
            {
    			MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                return 0;
            }
        case WM_CLOSE:
            {
    			FILE *fz;
    
    			char *buffer = NULL;
                int iLength;
    
                iLength = GetWindowTextLength(hEdit);
    
                buffer = malloc(iLength);//'void *' kann nicht in 'char *' konvertiert werden
    
                GetWindowText(hEdit, buffer, iLength+1);
    
                fz = fopen("text.txt", "wb");
                fwrite(buffer, 1, iLength, fz);
                fclose(fz);
    
                free(buffer);
    
                DestroyWindow(hWnd);
                return 0;
            }
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Danke schonmal für die Hilfe.



  • buffer = malloc(iFileSize);//'void *' kann nicht in 'char *' konvertiert werden
    

    sollte so aussehen

    buffer = (char*)malloc(iFileSize);//'void *' kann nicht in 'char *' konvertiert werden
    

    da die funktion malloc ein void* zurückgibt must du es nach char* casten..

    außerdem ist das was du hier codest C und kein C++ - schau dir mal String Streams an -> http://www.cppreference.com/cppio/index.html

    mfg blan



  • Danke, es funktioniert :).


Anmelden zum Antworten