Thread: struct help

  1. #1
    Registered User
    Join Date
    Dec 2007
    Posts
    930

    struct help

    I dont understand the syntax of 'struct' in this program.
    struct structure_name
    {
    data_members
    };
    How come it doesnt have a name?
    And why the data_members defined in two different curly braces?
    And why devcaps [] hasnt got a type?

    /
    Code:
    *---------------------------------------------------------
       DEVCAPS1.C -- Device Capabilities Display Program No. 1
                     (c) Charles Petzold, 1998
      ---------------------------------------------------------*/
    
    #include <windows.h>
    
    #define NUMLINES ((int) (sizeof devcaps / sizeof devcaps [0]))
    
    struct
    {
         int     iIndex ;
         TCHAR * szLabel ;
         TCHAR * szDesc ;
    }
    devcaps [] =
    {
         HORZSIZE,      TEXT ("HORZSIZE"),     TEXT ("Width in millimeters:"),
    } ;
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("DevCaps1") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
         
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
         
         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         
         hwnd = CreateWindow (szAppName, TEXT ("Device Capabilities"),
                              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 int  cxChar, cxCaps, cyChar ;
         TCHAR       szBuffer[40] ;
         HDC         hdc ;
         int         i  ;
         PAINTSTRUCT ps ;
         TEXTMETRIC  tm ;
         
         switch (message)
         {
         case WM_CREATE:
              hdc = GetDC (hwnd) ;
              
              GetTextMetrics (hdc, &tm) ;
              cxChar = tm.tmAveCharWidth ;
              cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
              cyChar = tm.tmHeight + tm.tmExternalLeading ;
              
              ReleaseDC (hwnd, hdc) ;
              return 0 ;
              
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
              
              for (i = 0 ; i < NUMLINES ; i++)
              {
                   TextOut (hdc, 2, cyChar * i,
                            devcaps[i].szLabel,
                            lstrlen (devcaps[i].szLabel)) ;
                   
                   TextOut (hdc, 14 * cxCaps, cyChar * i,
                            devcaps[i].szDesc,
                            lstrlen (devcaps[i].szDesc)) ;
                   
                   SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
                   TextOut (hdc, 14 * cxCaps + 35 * cxChar, cyChar * i, szBuffer,
                            wsprintf (szBuffer, TEXT ("&#37;5d"),
                                 GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
                   
                   SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
                   
              }
              
              EndPaint (hwnd, &ps) ;
              return 0 ;
              
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    Using Windows 10 with Code Blocks and MingW.

  2. #2
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,677
    That is what's called a "anonymous struct", which essentially means that it's never used anywhere other than in that one declaration of one or more instances of the type.

    If you don't need the struct further in the code, there's no need to give it a name.

    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

  3. #3
    Jack of many languages Dino's Avatar
    Join Date
    Nov 2007
    Location
    Chappell Hill, Texas
    Posts
    2,332
    As matsp said, this is the whole declaration for devcaps:
    Code:
    struct
    {
         int     iIndex ;
         TCHAR * szLabel ;
         TCHAR * szDesc ;
    }
    devcaps [] =
    {
         HORZSIZE,      TEXT ("HORZSIZE"),     TEXT ("Width in millimeters:"),
    } ;
    The type for devcaps is the anonymous struct.

    Good question.

    Todd
    Mainframe assembler programmer by trade. C coder when I can.

  4. #4
    Unregistered User Yarin's Avatar
    Join Date
    Jul 2007
    Posts
    2,158
    I don't see how that has any practical use.

  5. #5
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Location
    Inside my computer
    Posts
    24,654
    It has a use if you only need one instance of the struct.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  6. #6
    Jack of many languages Dino's Avatar
    Join Date
    Nov 2007
    Location
    Chappell Hill, Texas
    Posts
    2,332
    Quote Originally Posted by Yarin View Post
    I don't see how that has any practical use.
    I think it's quite handy, actually. A nice, one-off structured layout without the headache of a formal definition and additional includes.

    And by the way, Yarin, you're a programming master. How the hell do you know everything?
    Mainframe assembler programmer by trade. C coder when I can.

  7. #7
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Location
    Inside my computer
    Posts
    24,654
    Are we playing thief and catch here?
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  8. #8
    Jack of many languages Dino's Avatar
    Join Date
    Nov 2007
    Location
    Chappell Hill, Texas
    Posts
    2,332
    Not sure what "thief and catch" is, but I'm getting a lot of laughs out of it! I think it's great!
    Mainframe assembler programmer by trade. C coder when I can.

  9. #9
    Unregistered User Yarin's Avatar
    Join Date
    Jul 2007
    Posts
    2,158
    And by the way, Yarin, you're a programming master. How the hell do you know everything?
    Why thank you so very much.

  10. #10
    Jack of many languages Dino's Avatar
    Join Date
    Nov 2007
    Location
    Chappell Hill, Texas
    Posts
    2,332
    I knew you would do that! I knew it, I knew it, I knew it!
    Mainframe assembler programmer by trade. C coder when I can.

  11. #11
    Registered User
    Join Date
    Dec 2007
    Posts
    930
    Thanks for the explanations!
    Using Windows 10 with Code Blocks and MingW.

  12. #12
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Location
    Inside my computer
    Posts
    24,654
    Quote Originally Posted by Todd Burch View Post
    Not sure what "thief and catch" is, but I'm getting a lot of laughs out of it! I think it's great!
    The thief is Yarin and "the catch" means that you're abusing Yarin's signature to quote something you don't really mean...
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  13. #13
    Registered User
    Join Date
    Nov 2002
    Posts
    319
    woudent saying return 0; in the wndproc end the whole program ? or is that just for the wndproc function

  14. #14
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Location
    Inside my computer
    Posts
    24,654
    Not WndProc, no.
    WndProc returns a return value depending on the message. Typically it means processed or not processed. But can mean other things.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

  15. #15
    Unregistered User Yarin's Avatar
    Join Date
    Jul 2007
    Posts
    2,158
    THaNkS ElYsIa. YoU'Re a PrOgRaMmInG mAsTeR! HoW tHe HeLl Do YoU kNoW eVeRy ThInG?

    Does that one count?

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 1
    Last Post: 12-03-2008, 03:10 AM
  2. Global Variables
    By Taka in forum C Programming
    Replies: 34
    Last Post: 11-02-2007, 03:25 AM
  3. Replies: 10
    Last Post: 05-18-2006, 11:23 PM
  4. What's wrong with my search program?
    By sherwi in forum C Programming
    Replies: 5
    Last Post: 04-28-2006, 09:57 AM
  5. Tutorial review
    By Prelude in forum A Brief History of Cprogramming.com
    Replies: 11
    Last Post: 03-22-2004, 09:40 PM