Avatar billede _et Praktikant
17. maj 2002 - 13:35 Der er 10 kommentarer og
2 løsninger

Compilerings fejl

Jeg er C++ Newbie!!

Jeg er ved at lære C, ved at læse en bog af Ivor Horton

Problemet er at jeg at skrevet et eksempel af fra bogen, men når jeg compilere det kommer C med denne fejl
---------------------------------------
C:\cpp_test\ofwin\OFWIN.cpp(48) : error C2447: missing function header (old-style formal list?)

---------------------------------------
Problemet er at jeg ikke ved hvad den betyder??

Hvis der er en der vil kigge på koden og forklare mig hvad problemet drejer sig om, så ville jeg være glad?

// OFWIN.cpp: implementation of the OFWIN class.
//
//////////////////////////////////////////////////////////////////////

#include "windows.h"

long WINAPI WindowProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam);

//WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS WindowClass;
    static char szAppName[] = "OFWin";
    HWND hWnd;
    MSG msg;

    WindowClass.style = CS_HREDRAW | CS_VREDRAW;
    WindowClass.lpfnWndProc = WindowProc;
    WindowClass.cbClsExtra = 0;
    WindowClass.cbWndExtra = 0;
    WindowClass.hInstance = hInstance;
    WindowClass.hIcon = LoadIcon(0, IDI_APPLICATION);
    WindowClass.hCursor = LoadCursor(0, IDC_ARROW);
    WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
    WindowClass.lpszClassName = szAppName;

    RegisterClass(&WindowClass);
    hWnd = CreateWindow(szAppName, "C++ mødom", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);

    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);

    //Message loop

    while(GetMessage(&msg, 0, 0, 0) == TRUE)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

   


long WINAPI WindowProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam);
{   
// Jeg mener at det må være herfra og ned problemet er??
    HDC hDC;
    PAINTSTRUCT PaintSt;
    RACT aRect;

    switch(message)
    {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &PaintSt);

        GetClientRect(hWnd, &aRect);

        SetBkMode(hDC, TRANSPARENT);

        DrawText(hDC, "Dette er bare en Test", -1, &aRect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);

        EndPaint(hWnd, &PaintSt);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    default:
        return DefWindowProc(hWnd, message, vParam, lParam);
    }
}

_____________________________________________________
Bogen nævner noget med at nogle klasser er blevet erstattet med nyere klasser, kan det være årsagen??
Avatar billede jpk Nybegynder
17. maj 2002 - 13:48 #1
For MS VC++ (fra MSDN)

Compiler Error C2447
missing function header (old-style formal list?)

An open curly brace ({) was found at global scope without a corresponding function header.

This error can be caused by using the old-style C-language formal list.

Check that the function being defined has an appropriate function declaration.

The following is an example of this error:

int c;
{}      // error
Avatar billede _et Praktikant
17. maj 2002 - 14:36 #2
Det var problemet!! et semikolon efter functionen + 2 små slå fejl.

Nu kan programmet compilere, men jeg får denne fejl, lige inden programmet starter.

"Unhandled exception in ofwin.exe (USER32.DLL): 0xC0000005: Access Violation."

I Dissasembly viser den denne linje: "77E2FE4F  repne scas  byte ptr [edi]", men jeg forstår ikke denne type kode.

Kan du give et hint?
Avatar billede _et Praktikant
17. maj 2002 - 14:37 #3
Husk svar!
Avatar billede jpk Nybegynder
17. maj 2002 - 14:43 #4
Udfra ovenstående kan jeg ikke sige hvor fejlen ligger, men den kommer oftest fordi der tilgås noget hukommelse der ikke er initialiseret rigtigt.
Avatar billede jpk Nybegynder
17. maj 2002 - 14:49 #5
Du kan prøve at debugge koden.

Forudsat at du bruger MS VC++???

Sæt fx et break point i første linie af WinMain (placér cursoren på linien og tryk F9).
Tryk så F5 for at starte en debug session.
Programmet skulle gerne stoppe ved første linie med et break point.
Udfør koden én linie ad gangen ved at trykke F10 og se hvor det går galt..!
Avatar billede chries Nybegynder
17. maj 2002 - 15:02 #6
der er noget galt med:
WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));

den får funktionkaldet:
RegisterClass(&WindowClass);
til at fejle.

hvis du udkommenter:
WindowClass.hbrBackground...
kører det
Avatar billede _et Praktikant
17. maj 2002 - 15:31 #7
/chries - Du har ret i det med at det er RegisterClass(&WindowClass); der fejler, men hvis jeg udkommentere "Background" linjen, så "starter" programmet, men der er intet program.(intet windue)

Der kommer desuden disse "fejl" i debug vinduet
Loaded 'C:\WINNT\System32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\USER32.DLL', no matching symbolic information found.
Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found.
Loaded 'C:\WINNT\system32\GDI32.DLL', no matching symbolic information found.
Avatar billede _et Praktikant
17. maj 2002 - 15:38 #8
Når jeg kigger på joblisten, så kører programmet under processer, men hvor er vinduet/programmet??
Avatar billede mbulow Nybegynder
17. maj 2002 - 22:57 #9
Æhh... Kig lige på din definition af:
    WindowProc

Der har du også et ; stående til sidst i linjen...
Det minder mistænkeligt meget om en copy-paste af din WindowProc-declaration, så slet lige det ;, så det ser sådan her ud:

long WINAPI WindowProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)
{   
// Jeg mener at det må være herfra og ned problemet er??
    HDC hDC;
.....
Avatar billede mbulow Nybegynder
17. maj 2002 - 22:59 #10
Argh... Det er for længe siden jeg har været aktiv i det her forum...
Jeg må se at læse indlæggene ordentligt igennem inden jeg svarer... Sorry

Bare ignorer mit indlæg
Avatar billede mbulow Nybegynder
17. maj 2002 - 23:09 #11
Meeen... Alligevel kunne det komme noget fornuftigt ud af mig ;) hehehe

Det der giver dine fejl med RegisterClass(&WindowClass), er at du har glemt at tildele en værdi til en af variablene i WNDCLASS-strukturen...
Du skal huske lpszMenuName:

    WindowClass.lpszMenuName = NULL;


Hvis ikke du sætter den til NULL (eller 0), vil den ha en tilfældig værdi, og RegisterClass til derfor prøve at gøre noget fornuftig med en eller anden menu som ikke eksisterer...


PS!!! Det var ihvert fald det eneste jeg skulle ændre for at det virkede her (Ud over dine slåfejl, som du selv havde pointeret)
Avatar billede _et Praktikant
19. maj 2002 - 18:48 #12
-->mbulow
Så kom der alligevel noget fornuftigt ud af dig !! ;-))

Det virker perfekt..

Tak til jer begge.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester