DOCUMENT:Q155047 04-MAY-2001 [masm] TITLE :PRB: A2041 Initializing a Large STRUCT PRODUCT :Microsoft Macro Assembler PROD/VER::6.0,6.1,6.11 OPER/SYS: KEYWORDS:kberrmsg ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Macro Assembler (MASM), versions 6.0, 6.1, 6.11 ------------------------------------------------------------------------------- SYMPTOMS ======== Attempting to initialize a structure causes one or more of the following assembly errors: error A2041: string or text literal too long error A2039: line too long CAUSE ===== MASM 6.x has a 255-character line limit. Even when the initialization spans multiple lines, the entire structure initialization is considered one line and is subject to the 255-character limit. RESOLUTION ========== The following sample illustrates three possible workarounds: - Remove white space, comments, line-continuation characters, and so on, in an effort to reduce the total initialization string to less than 255 characters. - Break up the STRUCT into helper STRUCTS defining and initializing the sub-STRUCTs. Precede this by a label of the type of the original STRUCT. - Define a label of the type of the STRUCT and follow this with the individual definition and initialization of each STRUCT member. MORE INFORMATION ================ Sample Code ----------- ; Assemble /c /Fl and examine list file to verify output. ; To test each case, set the following EQU. Set to 0 to ; demonstrate the A2041 error. Set to 1, 2, 3 to test ; each workaround in turn. WorkaroundA2041 EQU 0 .MODEL SMALL, C .NOLIST INCLUDE WIN.INC .LIST ;--------------------------------------------------------- ; Example structure adapted from WINDOWS.H OPENFILENAME STRUCT 1t lStructSize DWORD ? hwndOwner HWND ? hInstance HINSTANCE ? lpstrFilter LPCSTR ? lpstrCustomFilter LPSTR ? nMaxCustFilter DWORD ? nFilterIndex DWORD ? lpstrFile LPSTR ? nMaxFile DWORD ? lpstrFileTitle LPSTR ? nMaxFileTitle DWORD ? lpstrInitialDir LPCSTR ? lpstrTitle LPCSTR ? Flags DWORD ? nFileOffset UINT ? nFileExtension UINT ? lpstrDefExt LPCSTR ? lCustData LPARAM ? lpfnHook FARPROC ? lpTemplateName LPCSTR ? OPENFILENAME ENDS IF WorkaroundA2041 EQ 2 ;--------------------------------------------------------- ; helper STRUCTs derived by breaking up the original ; OPENFILENAME STRUCT OPENFILENAME_1 STRUCT 1t lStructSize DWORD ? hwndOwner HWND ? hInstance HINSTANCE ? lpstrFilter LPCSTR ? OPENFILENAME_1 ENDS OPENFILENAME_2 STRUCT 1t lpstrCustomFilter LPSTR ? nMaxCustFilter DWORD ? nFilterIndex DWORD ? lpstrFile LPSTR ? OPENFILENAME_2 ENDS OPENFILENAME_3 STRUCT 1t nMaxFile DWORD ? lpstrFileTitle LPSTR ? nMaxFileTitle DWORD ? lpstrInitialDir LPCSTR ? OPENFILENAME_3 ENDS OPENFILENAME_4 STRUCT 1t lpstrTitle LPCSTR ? Flags DWORD ? nFileOffset UINT ? nFileExtension UINT ? OPENFILENAME_4 ENDS OPENFILENAME_5 STRUCT 1t lpstrDefExt LPCSTR ? lCustData LPARAM ? lpfnHook FARPROC ? lpTemplateName LPCSTR ? OPENFILENAME_5 ENDS ENDIF .DATA IF WorkaroundA2041 EQ 0 ;--------------------------------------------------------- ; This STRUCT definition and initialization generates: ; error A2041: string or text literal too long ; error A2039: line too long ofn OPENFILENAME { SIZEOF(OPENFILENAME), ; lStructSize DWORD NULL, ; hwndOwner HWND NULL, ; hInstance HINSTANCE NULL, ; lpstrFilter LPCSTR NULL, ; lpstrCustomFilter LPSTR 0, ; nMaxCustFilter DWORD 0, ; nFilterIndex DWORD NULL, ; lpstrFile LPSTR 0, ; nMaxFile DWORD NULL, ; lpstrFileTitle LPSTR 0, ; nMaxFileTitle DWORD NULL, ; lpstrInitialDir LPCSTR NULL, ; lpstrTitle LPCSTR 0, ; Flags DWORD 0, ; nFileOffset UINT 0, ; nFileExtension UINT NULL, ; lpstrDefExt LPCSTR 0, ; lCustData LPARAM NULL, ; lpfnHook FARPROC NULL } ; lpTemplateName LPCSTR ENDIF IF WorkaroundA2041 EQ 1 ;--------------------------------------------------------- ; This STRUCT definition and initialization will assemble ; due to keeping the total character count down - removing ; comments, white space, line continuation characters, etc. ofn OPENFILENAME { SIZEOF(OPENFILENAME), NULL, NULL, NULL, NULL, 0, 0, NULL, 0, NULL, 0, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL } ENDIF IF WorkaroundA2041 EQ 2 ;--------------------------------------------------------- ; This STRUCT definition and initialization will assemble ; by breaking up the original STRUCT and declaring the ; STRUCTs derived from this breakup. This is preceded by ; defining a LABEL to refer to the entire region of memory. ; ofn LABEL OPENFILENAME OPENFILENAME_1 { SIZEOF(OPENFILENAME), ; DWORD lStructSize NULL, ; hwndOwner HWND NULL, ; hInstance HINSTANCE NULL } ; lpstrFilter LPCSTR OPENFILENAME_2 { NULL, ; lpstrCustomFilter LPSTR 0, ; nMaxCustFilter DWORD 0, ; nFilterIndex DWORD NULL } ; lpstrFile LPSTR OPENFILENAME_3 { 0, ; nMaxFile DWORD NULL, ; lpstrFileTitle LPSTR 0, ; nMaxFileTitle DWORD NULL } ; lpstrInitialDir LPCSTR OPENFILENAME_4 { NULL, ; lpstrTitle LPCSTR 0, ; Flags DWORD 0, ; nFileOffset UINT 0 } ; nFileExtension UINT OPENFILENAME_5 { NULL, ; lpstrDefExt LPCSTR 0, ; lCustData LPARAM NULL, ; lpfnHook FARPROC NULL } ; lpTemplateName LPCSTR ENDIF IF WorkaroundA2041 EQ 3 ;--------------------------------------------------------- ; This STRUCT definition and initialization will assemble ; by defining a LABEL to refer to a region of memory ; followed by explicitly declaring data for each of the ; members of the STRUCT. ofn LABEL OPENFILENAME DWORD SIZEOF(OPENFILENAME) ; lStructSize HWND NULL ; hwndOwner HINSTANCE NULL ; hInstance LPCSTR NULL ; lpstrFilter LPSTR NULL ; lpstrCustomFilter DWORD 0 ; nMaxCustFilter DWORD 0 ; nFilterIndex LPSTR NULL ; lpstrFile DWORD 0 ; nMaxFile LPSTR NULL ; lpstrFileTitle DWORD 0 ; nMaxFileTitle LPCSTR NULL ; lpstrInitialDir LPCSTR NULL ; lpstrTitle DWORD 0 ; Flags UINT 0 ; nFileOffset UINT 0 ; nFileExtension LPCSTR NULL ; lpstrDefExt LPARAM 0 ; lCustData FARPROC NULL ; lpfnHook LPCSTR NULL ; lpTemplateName ENDIF END Additional query words: 6.00 6.10 kbdsh ====================================================================== Keywords : kberrmsg Technology : kbMASMsearch kbAudDeveloper kbMASM600 kbMASM610 kbMASM611 Version : :6.0,6.1,6.11 ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.