Microsoft KB Archive/155047

= PRB: A2041 Initializing a Large STRUCT =

Article ID: 155047

Article Last Modified on 10/22/2003

-

APPLIES TO


 * Microsoft Macro Assembler 6.0 Standard Edition
 * Microsoft Macro Assembler 6.1 Standard Edition
 * Microsoft Macro Assembler 6.11 Standard Edition

-



This article was previously published under Q155047



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.



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
 * 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 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
 * 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.
 * 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.
 * 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.
 * 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 KB155047

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.