Błąd kompilacji programu w CodeBlocks

0

Witam, mam pytanie czysto teoretyczne ponieważ dopiero zaczynam swoją przygodę z programowaniem i aktualnie uczę się w praktyce z tutorialami na yt. Ale do rzeczy, dlaczego pracując w CodeBlocks nie mogę skompilować programu który jest żywcem przekopiowany z tutorialu z którego się uczę i tam program się kompiluje a u mnie nie?

#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)

{
    WNDCLASSW wc = (0);

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpfnWndProc = WindowProcedure;

    if(!RegisterClassW(&wc));
        return -1;

    CreateWindowW(L"myWindowClass", L"My Window",WS_OVERLAPPEDWINDOW | WS_VISIBLE,100,100,500,500,
                  NULL,NULL,NULL,NULL);

    MSG msg = (0);

    while (GetMessage(&msg,NULL,NULL,NULL));
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProcedure(hwnd hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
        case WM_DESTROY;
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProcW(hWnd,msg,wp,lp);
    }
}

W załączniku błąd który wyświetla kompilator.

4

Code::Blocks to IDE, nie kompilator, jakiego kompilatora używasz?

Nie wklejaj tekstu jako obrazków - Dlaczego nie należy zamieszczać kodu w postaci obrazków

Sam problem jest zapewne spowodowany tym, ​że patrzysz na tutorial C, a kompilujesz C++. Chociaż ta inicjalizacja zerem mi śmierdzi i tu i tu.

1

Coś nie do końca jest poprawnie. Jak dla mnie powinieneś zmienić tutek, bo ten tak średnio nadaje się do tego.

Microsoft na swoich stronach zaleca nieco inną składnię dla C++:

https://docs.microsoft.com/en-us/windows/win32/learnwin32/creating-a-window

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

Ewentualnie można zrobić to klasycznie w stylu C, czyli użyć https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)

0

Myślałem, że ta wersja posiada już wbudowany kompilator, przy tworzeniu nowego projektu jako kompilator mam niby ustawiony GNU GCC Compiler ale nic oddzielnego nie pobierałem bo do tej pory nie był mi potrzebny.

0

W takim razie jaki pobrać kompilator żebym nie miał problemów z kompilowaniem programu?

2

@Later tu raczej nie chodzi o kompilator, ale dziką składnię którą proponuje twórca tutka. Spróbuj zamienić:

WNDCLASSW wc = (0);

na:

WNDCLASS wc = { };

i zobacz jaki będzie wynik. Bo kompilator jasno mówi, że nie wie jak zamienić inta na WNDCLASS Bo i taka operacja jest dziwna.

0

linia 8 i 21: używasz ( ) zamiast { }
linia 15: średnik po if (do usunięcia)
linia 18: nie sprawdzasz wyniku wywołania funkcji
linia 23: średnik po while (do usunięcia)

0

Tak dzięki, w tym był błąd bo nie zagłębiłem się bardziej w ten kod od początku do końca, kontynuując swoją pracę nad tym projektem natrafiłem na jeszcze jeden błąd którego nie mogę rozwiązać a mianowicie po utworzeniu dwóch text boxów w linijkach 13 i 15 w które chciałbym wpisać liczby które będą np dodawane, program od razu się zamyka gdy na nie nacisnę.
Przy zastosowaniu w drugim elemencie nawiasu L"" oraz NULL nadal działa tak samo, gdy dam 0 znika całe okno i nie mogę znaleźć co jest przyczyną braku możliwości wprowadzania znaków. Macie jakiś pomysł jak to rozwiązać?

#define ID_CMD 1
#define ID_EDIT 2

static HWND hwndcmd;
static HWND hwndedit;

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)          
    {
    case WM_CREATE:

        hwndedit = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER, 50,50,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);

        hwndedit = CreateWindowW(L"EDIT", L"", WS_VISIBLE | WS_CHILD | WS_BORDER, 350,50,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);


        hwndcmd = CreateWindowW(L"BUTTON",L"+",WS_VISIBLE | WS_CHILD,210,100,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"-",WS_VISIBLE | WS_CHILD,210,150,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"/",WS_VISIBLE | WS_CHILD,210,200,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"*",WS_VISIBLE | WS_CHILD,210,250,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        break;

    case WM_COMMAND:

        if(LOWORD(wParam) == ID_CMD)
        {
            MessageBox(hwnd,"Wynik dzialania to:", "Rozwiazanie", MB_OK);
        }


        case WM_DESTROY:
            PostQuitMessage (0);   
            break;
        default:            
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

4

Nie masz break w case WM_COMMAND, więc przechodzi do WM_DESTROY i kończy działanie.

0

Racja nie zauważyłem, teraz wszystko działa tak jak powinno. Dodałem jeszcze możliwość wpisywania tylko cyfr w textboxach i chyba taki szkielet tego co chciałem uzyskać wizualnie mam.
I tu nasuwają się kolejne pytania, w jaki sposób pobrać wpisane w textboxie cyfry i później uzyskany wynik wyświetlić w stworzonym okienku które wyświetla rozwiązanie gdy nacisnę przycisk który odpowiada danej operacji matematycznej?

#define ID_CMD 1
#define ID_EDIT 2

static HWND hwndcmd;
static HWND hwndedit;

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)              
    {
    case WM_CREATE:

        hwndedit = CreateWindowW(L"Static",L"Wprowadź liczbę 1", WS_CHILD | WS_VISIBLE | WS_BORDER, 50,20,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);


        hwndedit = CreateWindowW(L"EDIT", L"", ES_NUMBER | WS_CHILD | WS_VISIBLE | WS_BORDER, 50,50,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);


        hwndedit = CreateWindowW(L"Static",L"Wprowadź liczbę 2", WS_VISIBLE | WS_CHILD | WS_BORDER, 350,20,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);

        hwndedit = CreateWindowW(L"EDIT", L"", ES_NUMBER | WS_VISIBLE | WS_CHILD | WS_BORDER, 350,50,150,25,hwnd,(HMENU) ID_EDIT,NULL,NULL);


        hwndcmd = CreateWindowW(L"BUTTON",L"+",WS_VISIBLE | WS_CHILD,210,100,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"-",WS_VISIBLE | WS_CHILD,210,150,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"/",WS_VISIBLE | WS_CHILD,210,200,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        hwndcmd = CreateWindowW(L"BUTTON",L"*",WS_VISIBLE | WS_CHILD,210,250,125,25,hwnd,(HMENU) ID_CMD,NULL,NULL);

        break;

    case WM_COMMAND:

        if(LOWORD(wParam) == ID_CMD)
        {
            MessageBox(hwnd,"Wynik dzialania to:", "Rozwiazanie", MB_OK);
        }
        break;

        case WM_DESTROY:
            PostQuitMessage (0);      
            break;
        default:                     
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Z tym żeby pobrane zawartości ustawić pod konkretne przyciski myślę, że jakoś sobie poradze ale najpierw musze je jakoś pobrać z tego textboxa. Macie jakieś pomysły? Albo przykład w którym jest to fajnie opisane bo z tego co przeglądałem to mało kalkulatorów działa na zasadzie wpisywania, a prawie kazdy działa jedynie na przyciskach.

0
Later napisał(a):

Z tym żeby pobrane zawartości ustawić pod konkretne przyciski myślę, że jakoś sobie poradze ale najpierw musze je jakoś pobrać z tego textboxa. Macie jakieś pomysły? Albo przykład w którym jest to fajnie opisane bo z tego co przeglądałem to mało kalkulatorów działa na zasadzie wpisywania, a prawie kazdy działa jedynie na przyciskach.

Ambitnie.... ;)
Rozwiązaniem Twojej bolączki będzie te funkcja https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta

No i ogólnie skoro chcesz programować za pomocą WinAPI w C, to chyba musiałbyś przestudiować tego klasyka https://www.charlespetzold.com/pw5/ Ale uwaga cofamy się tu do internetu sprzed stuleci... Jednak lepszej książki do nauki WinAPI nie znajdziesz.

0

Męczę się z tym od wczoraj i nadal nie rozwiązałem tego jak pobrać wpisaną liczbę za pomocą tej funkcji i jak wrzucić do rozwiązania.
Macie pomysł jak tu dorzucić samo dodawanie z pobranymi liczbami? Wtedy z resztą pójdzie mi już łatwo i tak myślę, że chyba łatwiej będzie mi zastąpić messageboxa statycznym polem które będzie wyswietlało wynik a messageboxa zostawie jedynie na wyświetlenie błędu jeśli jedna z wpisanych liczb będzie zerem w przypadku dzielenia.

1

GetWindowText wypełnia ci bufor c-stringiem z tekstem, musisz to przekonwertować na inta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1