struct help

This is a discussion on struct help within the Windows Programming forums, part of the Platform Specific Boards category; I dont understand the syntax of 'struct' in this program. struct structure_name { data_members }; How come it doesnt have ...

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

    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) ;
    }
    Compiler MSVC++ 2013 with Code::Blocks.

  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
    Katy, Texas
    Posts
    2,309
    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
    Mac and Windows cross platform programmer. Ruby lover.

    Quote of the Day
    12/20: Mario F.:I never was, am not, and never will be, one to shut up in the face of something I think is fundamentally wrong.

    Amen brother!

  4. #4
    Unregistered User Yarin's Avatar
    Join Date
    Jul 2007
    Posts
    1,691
    I don't see how that has any practical use.
    A class that doesn't overload all operators just isn't finished yet. -- SmugCeePlusPlusWeenie
    A year spent in artificial intelligence is enough to make one believe in God. -- Alan J. Perlis

  5. #5
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Posts
    23,027
    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
    Katy, Texas
    Posts
    2,309
    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?
    Mac and Windows cross platform programmer. Ruby lover.

    Quote of the Day
    12/20: Mario F.:I never was, am not, and never will be, one to shut up in the face of something I think is fundamentally wrong.

    Amen brother!

  7. #7
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Posts
    23,027
    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
    Katy, Texas
    Posts
    2,309
    Not sure what "thief and catch" is, but I'm getting a lot of laughs out of it! I think it's great!
    Mac and Windows cross platform programmer. Ruby lover.

    Quote of the Day
    12/20: Mario F.:I never was, am not, and never will be, one to shut up in the face of something I think is fundamentally wrong.

    Amen brother!

  9. #9
    Unregistered User Yarin's Avatar
    Join Date
    Jul 2007
    Posts
    1,691
    And by the way, Yarin, you're a programming master. How the hell do you know everything?
    Why thank you so very much.
    A class that doesn't overload all operators just isn't finished yet. -- SmugCeePlusPlusWeenie
    A year spent in artificial intelligence is enough to make one believe in God. -- Alan J. Perlis

  10. #10
    Jack of many languages Dino's Avatar
    Join Date
    Nov 2007
    Location
    Katy, Texas
    Posts
    2,309
    I knew you would do that! I knew it, I knew it, I knew it!
    Mac and Windows cross platform programmer. Ruby lover.

    Quote of the Day
    12/20: Mario F.:I never was, am not, and never will be, one to shut up in the face of something I think is fundamentally wrong.

    Amen brother!

  11. #11
    Registered User
    Join Date
    Dec 2007
    Posts
    817
    Thanks for the explanations!
    Compiler MSVC++ 2013 with Code::Blocks.

  12. #12
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Posts
    23,027
    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
    Posts
    23,027
    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
    1,691
    THaNkS ElYsIa. YoU'Re a PrOgRaMmInG mAsTeR! HoW tHe HeLl Do YoU kNoW eVeRy ThInG?

    Does that one count?
    A class that doesn't overload all operators just isn't finished yet. -- SmugCeePlusPlusWeenie
    A year spent in artificial intelligence is enough to make one believe in God. -- Alan J. Perlis

Page 1 of 2 12 LastLast
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, 04:25 AM
  3. Replies: 10
    Last Post: 05-19-2006, 12:23 AM
  4. What's wrong with my search program?
    By sherwi in forum C Programming
    Replies: 5
    Last Post: 04-28-2006, 10: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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21