Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1394 | Дата выхода: | 09.12.2010, 10:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 223 / 66 | Вопросов / ответов: | 1 / 1 | Вопрос № 181100: Уважаемые эксперты! Помогите разработать программу, выполняющую циклическую обработку данных: вычисление значений функции Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) в зависимости от изменяющегося на определенный шаг (задается в качестве переменной) зна... Вопрос № 181100: Уважаемые эксперты! Помогите разработать программу, выполняющую циклическую обработку данных: вычисление значений функции Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) в зависимости от изменяющегося на определенный шаг (задается в качестве переменной) значения переменной "а". Исходные данные: начальное значение переменной "а", шаг изменения переменной, количество повторений цикла и значения констант ("b", "c", "d", "e") вводятся из текстового файла на носителе. Результат вычислений выводится на экран и в файл на носителе.
Часть программы написана на MASM32 v10.
Dialog.asm
Код: .486 .model fla t,stdcall ;модель памяти и соглашение о вызове параметров option casemap:none
include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm
;*********************** подключаю библиотеки************************************************* includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32 .lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\msvcrt.lib
;************************Прототипы функций***************************************************** WinMain proto :DWORD,:DWORD,:DWORD,:DWORD GetFileName PROTO :DWORD,:DWORD,:DWORD,:DWORD SaveFile PROTO :DWORD ;*********************************************************************** .data ;переменные со значениями ClassName db "DLGCLASS",0 MenuName db "MyMenu",0 DlgName db "MyDialog",0 szDisplayName db "Курсовая по СПО",0 TheTextExit db "Выход из программы",0 szFilterTXT db 'Текстовые Файлы (*.txt)',0,'*.txt',0,0 ;фильтр для выбора текстовых файлов szTitle db 'Введите имя открываемого файла',0 ;заголовок для диалога выбора файлов szTitleSave db 'Введите имя сохраняемого файла',0 ;заголовок для диалога выбора файлов szMessage db "Файл изменен, сохран ить?",0 ;сообщение, когда было изменение szDefault db 'default.txt',0 ;имя файла по-умолчанию fChange dd 0 ;флаг изменения текста в редакторе ;************************************************************************ .data? ;переменные без значений hInstance HINSTANCE ? CommandLine LPSTR ? buffer db 512 dup(?) hMemDC dd ? ;описатель совместимого контекста устройства (DC) szNameTXT db 256 dup (?) ;для хранения текущего имени txt-файла ;************************************************************************ .const ;константы IDC_EDIT equ 3000 ; гребаный эдит IDC_BUTTON equ 3001 IDC_EXIT equ 3002 IDM_OPEN equ 32000 IDM_SAVE equ 32001 IDM_EXIT equ 32003 IDM_CLEAR equ 32007 IDC_BCDE equ 3003 IDC_PROG equ 3008 IDC_Y equ 3004 IDM_SP equ 32005
;**************************************************************** ********* .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax ;************************************************************************** WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hDlg:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,DLGWINDOWEXTRA push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL mov hDlg,eax invoke GetDlgItem,hDlg,IDC_BCDE in voke SetFocus,eax INVOKE ShowWindow, hDlg,SW_SHOWNORMAL INVOKE UpdateWindow, hDlg .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke IsDialogMessage, hDlg, ADDR msg .if eax==FALSE INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .endif .ENDW mov eax,msg.wParam ret WinMain endp ;*************************************************************************** WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL fname :DWORD LOCAL patn :DWORD LOCAL dwCount:dword, \ ;младшее двойное слово длины файла dwHigh:dword ;старшее двойное слово длины файла .if uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_OPEN ;*******Открываю файл дл я чтения********************************************
invoke GetFileName,offset szNameTXT,offset szFilterTXT,GetOpenFileName,offset szTitle .if eax != 0 mov ebx, rv(CreateFile,offset szNameTXT,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) ;узнаем длину файла mov [dwCount], rv(GetFileSize, ebx, ADDR dwHigh) ;резервируем память под содержимое файла ;в конце добавим 1 байт для завершающего нуля lea edi, dwCount mov eax, [edi] inc eax ;esi - адрес буфера mov esi, rv(GlobalAlloc, GMEM_FIXED, eax) ;читаем файл ;edi - адрес переменной с длиной ;ebx - описатеь файла invoke ReadFile, ebx, esi, [edi], edi, 0 ;закрываем файл invoke CloseHandle, ebx ;читаем реальную длину файла mov eax, [edi] ;завершим нулем mov byte ptr [eax+esi], 0 ;получим описатель Edit-а на странице диалога invoke GetDlgItem, hWnd, IDC_BCDE ;и выведем в него invoke SetWindowText, eax, esi ;освободим память invoke GlobalFree, esi .endif
;*****************Сохраняю в файл******************************************* .ELSEIF ax==IDM_SAVE invoke SaveFile, hWnd ;*************************************************************************** ;*****************Очищаю Edit*********************************************** .ELSEIF ax==IDM_CLEAR invoke SetDlgItemText,hWnd,IDC_BCDE,NULL invoke SetDlgItemText,hWnd,IDC_PROG,NULL invoke SetDlgItemText,hWnd,IDC_Y,NULL invoke SetDlgItemText,hWnd,IDC_EDIT,NULL ;*************************************************************************** .ELSEIF ax==IDM_SP ShellAboutBox hWnd,NULL,\ "СПО: Проект",\ NULL .ELSEIF ax==IDM_EXIT invoke MessageBox,hWnd,ADDR TheTextExit,ADDR szDisplayName,MB_YESNO .if eax == IDNO return 0 .endif invoke DestroyWindow,hWnd .ENDIF .ELSE mov edx,wParam shr edx,16 ;*******************************Обработчик нажатия кнопки "выполнить&quo t;*********************** .IF dx==BN_CLICKED .IF ax==IDC_BUTTON .ENDIF .ENDIF ;******************************************************************************************** .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp ;*************************************************************************** GetFileName proc uses edi, pFName:dword, \ ;имя текущего файла pFilter:dword,\ ;фильтр fun:dword, \ ;функция, которая вызывается pTitle:dword ;заголовок диалога LOCAL ofn:OPENFILENAMEA
STRING szCurrPath,"." ;начальный путь - текущая папка lea edi, ofn mov ecx, (size OPENFILENAMEA) / 4 xor eax, eax rep stosd lea eax, [ofn] mov [(OPENFILENAMEA ptr [eax]).lStructSize], size OPENFILENAMEA m2m [(OPENFILENAMEA ptr [eax]).lpstrFile], pFName ;имя текущего фа йла mov [(OPENFILENAMEA ptr [eax]).nMaxFile], 256 ;его макс длина m2m [(OPENFILENAMEA ptr [eax]).lpstrFilter], pFilter ;фильтр m2m [(OPENFILENAMEA ptr [eax]).lpstrTitle], pTitle ;заголовок диалога mov [(OPENFILENAMEA ptr [eax]).lpstrInitialDir], offset szCurrPath ;текущий путь mov [(OPENFILENAMEA ptr [eax]).Flags], OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY push eax ;параметр - адрес структуры mov eax, [fun] ;адрес функции call dword ptr eax ;вызываем ret GetFileName endp ;*************************************************************************** ;сохранение файла SaveFile proc uses edi esi ebx, hwnd:DWORD local dwHiLen:dword ;для старшего dword-а длины ;запросим имя TXT-файла ;проверим, было ли введено имя файла .if [szNameTXT] == 0 ;первый байт == 0? lea edi, [szDefault] ;если да, то берем имя файла по-умолчанию .else lea edi, [szNameTXT] .endif ;ждем имя фа йла для записи invoke GetFileName,edi,offset szFilterTXT,GetSaveFileName,offset szTitleSave ;что-то ввели? .if eax != 0 push edi ;сохраним имя файла ;получим описатель Edit-а на странице диалога mov edi, rv(GetDlgItem, hwnd, IDC_Y) ;edi - описатель окна редактора mov ebx, rv(GetWindowTextLength, edi) ;ebx - длина содержимого inc ebx ;учтем завершающий 0 mov esi, rv(GlobalAlloc, GMEM_FIXED, ebx) ;esi - адрес памяти под данные invoke GetWindowText, edi, esi, ebx ;получим данные pop edi ;edi - имя файла ;создаем файл на запись со сбросом в 0, если он уже был mov edi, rv(CreateFile,edi,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) ;в edi - описатель открытого файла dec ebx ;последний 0 не пишем ;пишем файл invoke WriteFile, edi, esi, ebx, ADDR dwHiLen, 0
invoke CloseHandle, edi ;закрываем файл invoke GlobalFree, esi ;освобождаем память mov fChange, 0 ;сбросим флаг изменения .ENDIF ret SaveFile endp ;*************************************************************************** end start
rsrc.rc
Код: #include "\masm32\include\resource.h"
#define IDC_EDIT 3000 #define IDC_BUTTON 3001 #define IDM_OPEN 32000 #define IDM_SAVE 32001 #define IDM_EXIT 32003 #define IDM_SP 32005 #define IDC_STATIC3005 3005 #define IDC_STATIC3006 3006 #define IDC_STATIC3007 3007 #define IDC_STATIC3009 3009 #define IDM_CLEAR 32007 #define IDC_BCDE 3003 #define IDC_Y 3004 #define IDC_PROG 3008
MyMenu MENUEX DISCARDABLE BEGIN POP UP "Файл" BEGIN MENUITEM "Открыть",IDM_OPEN MENUITEM "Сохранить",IDM_SAVE MENUITEM " ", , 0x0800 /*MFT_SEPARATOR*/ MENUITEM "Очистить",IDM_CLEAR MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/ MENUITEM "Выход",IDM_EXIT END POPUP "Справка",32004 BEGIN MENUITEM "О программе",IDM_SP END END
MyDialog DIALOGEX 10,10,186,121 CAPTION "СПО" FONT 0,"" MENU MyMenu CLASS "DLGCLASS" STYLE 0x10ca0884 EXSTYLE 0x00000000 BEGIN CONTROL "",IDC_EDIT,"Edit",0x10010080,75,5,53,13,0x00000200 CONTROL "Выполнить",IDC_BUTTON,"Button",0x10000001,130,5,46,13,0x00000000 CONTROL "",IDC_BCDE,"Edit",0x50b10084,8,53,81,61,0x00000200 CONTROL "",IDC_Y,"Edit",0x50b100c4,103,53,76,61,0x00000200 CONTROL "Переменные b, c, d, e",IDC_STATIC3005,"Static",0x50000000,10,38,78,11,0x00000000 CONTROL "Y=",IDC_STATIC3006,"Stat ic",0x50000000,108,38,8,13,0x00000000 CONTROL "Переменная а",IDC_STATIC3007,"Static",0x50000000,10,5,51,11,0x00000000 CONTROL "",IDC_PROG,"Edit",0x50010080,123,20,53,13,0x00000200 CONTROL "Количество прогонов",IDC_STATIC3009,"Static",0x50000000,10,20,91,11,0x00000000 END
Отправлен: 04.12.2010, 09:19 Вопрос задал: Александр (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Александр! Вот Вам подправленная программа. Удачи!
Код: .486 .model flat,stdcall ;модель памяти и соглашение о вызове параметров option casemap:none
include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm
;***** ****************** подключаю библиотеки************************************************* includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\msvcrt.lib
;************************Прототипы функций***************************************************** WinMain proto :DWORD,:DWORD,:DWORD,:DWORD GetFileName PROTO :DWORD,:DWORD,:DWORD,:DWORD SaveFile PROTO :DWORD function PROTO ;*********************************************************************** .data ;переменные со значениями ClassName db 'DLGCLASS',0 MenuName db 'MyMenu',0 szDisplayName db 'Курсовая по СПО',0 TheTextExit db 'Выход из программы',0 szFilterTXT db 'Текстов ые Файлы (*.txt)',0,'*.txt',0,0 ;фильтр для выбора текстовых файлов szTitle db 'Введите имя открываемого файла',0 ;заголовок для диалога выбора файлов szTitleSave db 'Введите имя сохраняемого файла',0 ;заголовок для диалога выбора файлов szMessage db 'Файл изменен, сохранить?',0 ;сообщение, когда было изменение szDefault db 'default.txt',0 ;имя файла по-умолчанию ;форматы sFormat db 'a = %d',0dh,0ah ;строка формата для вывода значений db 'step = %d%',0dh,0ah ; всех параметров в окно параметров db 'count = %d',0dh,0ah db 'b = %d',0dh,0ah db 'c = %d',0dh,0ah db 'd = %d',0dh,0ah db 'e = %d',0 sErrorFormat db 'Error!!!',0dh,0ah ;строка формата для вывода ошибки db 'b = %d',0dh,0ah ; в окно параметров db 'd = %d',0dh,0ah ; (должно быть b!=0, d!=0, e!=0, db 'e = %d',0 ; иначе будет деление на 0) sFormatY db 'a = %d, Y = %d',0dh,0ah,0 ;строка формата для вывода в окно результата ;строки с именами параметров в файле параметров sA db 'a',0 sStep db 'step',0 sCount db 'count',0 sB db 'b',0 sC db 'c',0 sD db 'd',0 sE db 'e',0 sParms db 'parms',0 ;имя секции fMode dd 0 ;флаг режима: ; 0-ничего не ведено ; 1-введены данные ; 2-произведен расчет ;************************************************************************ .data? ;переменные без значений varA dd ? step dd ? count dd ? varB dd ? varC dd ? varD dd ? varE dd ? hInstance HINSTANCE ? CommandLine LPSTR ? buffer db 512 dup(?) hMemDC dd ? ;описатель совместимого контекста устройства (DC) szNameTXT db 256 dup (?) ;для хранения текущего имени txt-файла ;******************* ***************************************************** .const ;константы IDC_BUTTON equ 3001 IDC_BCDE equ 3003 IDC_Y equ 30 04 IDM_OPEN equ 32000 IDM_SAVE equ 32001 IDM_EXIT equ 32003 IDM_CLEAR equ 32007 IDM_SP equ 32005 MYDIALOG equ 100 MyMenu equ 200
;************************************************************************* .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax ;************************************************************************** WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hDlg:HWND mov wc.cbSize, SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, DLGWINDOWEXTRA push hInst pop wc.hInstance mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, MyMenu mov wc.lps zClassName, OFFSET ClassName invoke LoadIcon, NULL, IDI_APPLICATION mov wc.hIcon, eax mov wc.hIconSm, eax invoke LoadCursor, NULL, IDC_ARROW mov wc.hCursor, eax invoke RegisterClassEx, addr wc invoke CreateDialogParam, hInstance, MYDIALOG, NULL, NULL, NULL mov hDlg,eax invoke GetDlgItem, hDlg, IDC_BUTTON invoke SetFocus, eax INVOKE ShowWindow, hDlg, SW_SHOWNORMAL INVOKE UpdateWindow, hDlg .WHILE TRUE INVOKE GetMessage, ADDR msg, NULL, 0, 0 .BREAK .IF (!eax) invoke IsDialogMessage, hDlg, ADDR msg .if eax==FALSE INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .endif .ENDW mov eax,msg.wParam ret WinMain endp ;*************************************************************************** WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL fname:DWORD .if uMsg==WM_DESTROY invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_C OMMAND mov eax,wParam .IF ax==IDM_OPEN
;*******Читаем параметры из файла******************************************** ;используем функцию GetPrivateProfileInt с параметрами: ;1) имя секции в файле ;2) адрес имени параметра ;3) значение по-умолчанию, если параметр не будет найден ;4) адрес имени файла ;возвращает целое - значение параметра invoke GetFileName, offset szNameTXT, offset szFilterTXT, GetOpenFileName, offset szTitle .if eax != 0 mov varA, rv(GetPrivateProfileInt,addr sParms,addr sA,0,addr szNameTXT) mov step, rv(GetPrivateProfileInt,addr sParms,addr sStep,1,addr szNameTXT) mov count, rv(GetPrivateProfileInt,addr sParms,addr sCount,1,addr szNameTXT) mov varB, rv(GetPrivateProfileInt,addr sParms,addr sB,0,addr szNameTXT) mov varC, rv(GetPrivateProfileInt,addr sParms,addr sC,0,addr szNameTXT) mov varD, rv(GetPrivateProfileInt,addr sParms,addr sD,0,addr szNameTXT) mov varE, r v(GetPrivateProfileInt,addr sParms,addr sE,0,addr szNameTXT) ;проверим корректность параметров (чтобы не возникло деления на 0!) mov eax, varE or eax, varD or eax, varB .if eax !=0 mov fMode, 1 invoke wsprintf, addr buffer, addr sFormat, varA, \ step, count, varB, varC, varD, varE .else mov fMode, 0 invoke wsprintf, addr buffer, addr sErrorFormat, \ varB, varD, varE .endif ;получим описатель Edit-а на странице диалога invoke GetDlgItem, hWnd, IDC_BCDE ;и выведем в него введенные параметры invoke SetWindowText, eax, addr buffer .endif
;*****************Сохраняю в файл******************************************* .ELSEIF ax==IDM_SAVE .if fMode==2 ;сохраняем, только если был расчет invoke SaveFile, hWnd .endif
;*****************Очищаю Edit*********************************************** .ELSEIF ax==IDM_CLEAR invoke SetDlgItemText,hWnd,IDC_BCDE,NULL invoke SetDlgItemText,hWnd,IDC_Y,NULL mov fMode, 0
;********** ***************************************************************** .ELSEIF ax==IDM_SP ShellAboutBox hWnd,NULL,\ "СПО: Проект",\ NULL .ELSEIF ax==IDM_EXIT invoke MessageBox,hWnd,ADDR TheTextExit,ADDR szDisplayName,MB_YESNO .if eax == IDNO return 0 .endif invoke DestroyWindow,hWnd ;*******************************Обработчик нажатия кнопки "выполнить"*********************** .ELSEIF ax==IDC_BUTTON .if fMode==1 .if count!=0 ;при нулевом счетчике мы просто ничего не делаем mov eax, 32 mul count ;резервируем 32 байт на каждую строку mov esi, rv(GlobalAlloc, GMEM_FIXED, eax) ;esi - адрес памяти mov byte ptr [esi],0;в начале пустая строка mov ecx, count ;количество расчетов push esi ;сохраним адрес начала calc_loop: ;цикл формирования строки со всеми значениями push ecx mov ebx, r v(lstrlen, esi);длина ранее сформированной строки add ebx, esi ;ebx - адрес, куда добавляем новую строку invoke function ;считаем eax = Y invoke wsprintf, ebx, addr sFormatY, varA, eax ;добавим подстроку со значениями mov eax, step add varA, eax ;инкремент параметра A pop ecx loop calc_loop invoke GetDlgItem, hWnd, IDC_Y ;описатель окна редактора pop esi ;адрес сформированной строки invoke SetWindowText, eax, esi ;отправим в редактор "Y=" invoke GlobalFree, esi ;освободим память mov fMode, 2 ;пометим, что расчет сделан .endif .endif .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp ;*************************************************************************** GetFileName proc uses edi, pFName:dword, \ ;имя текущего файла pFilter:dword, \ ;фильтр fun:dword, \ ;функция, которая вызывается pTitle:dword ;заголовок диалога LOCAL ofn:OPENFILENAMEA
STRING szCurrPath,"." ;начальный путь - текущая папка lea edi, ofn mov ecx, (size OPENFILENAMEA) / 4 xor eax, eax rep stosd lea eax, [ofn] mov [(OPENFILENAMEA ptr [eax]).lStructSize], size OPENFILENAMEA m2m [(OPENFILENAMEA ptr [eax]).lpstrFile], pFName ;имя текущего файла mov [(OPENFILENAMEA ptr [eax]).nMaxFile], 256 ;его макс длина m2m [(OPENFILENAMEA ptr [eax]).lpstrFilter], pFilter ;фильтр m2m [(OPENFILENAMEA ptr [eax]).lpstrTitle], pTitle ;заголовок диалога mov [(OPENFILENAMEA ptr [eax]).lpstrInitialDir], offset szCurrPath ;текущий путь mov [(OPENFILENAMEA ptr [eax]).Flags], OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY push eax ;параметр - адрес структуры mov eax, [fun] ;адрес функции call dword ptr eax ;вызываем ret GetFileName endp ;** ************************************************************************* ;сохранение файла SaveFile proc uses edi esi ebx, hwnd:DWORD local dwHiLen:dword ;для старшего dword-а длины ;запросим имя TXT-файла ;проверим, было ли введено имя файла .if [szNameTXT] == 0 ;первый байт == 0? lea edi, [szDefault] ;если да, то берем имя файла по-умолчанию .else lea edi, [szNameTXT] .endif ;ждем имя файла для записи invoke GetFileName,edi,offset szFilterTXT,GetSaveFileName,offset szTitleSave ;что-то ввели? .if eax != 0 push edi ;сохраним имя файла ;получим описатель Edit-а на странице диалога mov edi, rv(GetDlgItem, hwnd, IDC_Y) ;edi - описатель окна редактора mov ebx, rv(GetWindowTextLength, edi) ;ebx - длина содержимого inc ebx ;учтем завершающий 0 mov esi, rv(GlobalAlloc, GMEM_FIXED, ebx) ;esi - адрес памяти под данные invoke GetWindowText, edi, esi, ebx ;получим данные pop edi ;edi - имя файла ;создаем файл на запись со сбросом в 0, если он уже был mov edi, rv(CreateFile,edi,GENERIC_WRITE,0,0,CREATE_ALWAY S,FILE_ATTRIBUTE_NORMAL,0) ;в edi - описатель открытого файла dec ebx ;последний 0 не пишем ;пишем файл invoke WriteFile, edi, esi, ebx, ADDR dwHiLen, 0
invoke CloseHandle, edi ;закрываем файл invoke GlobalFree, esi ;освобождаем память mov fMode, 0 ;сбросим флаг изменения .ENDIF ret SaveFile endp ;*************************************************************************** function proc ;расчет по формуле Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) mov eax, varE ;e imul varC ;e*c idiv varD ;e*c/d neg eax ;-e*c/d add eax, varA ;-e*c/d + a add eax, varB ;-e*c/d + a + b mov ecx, eax ;ecx = a + b - e*c/d
mov eax, varA ;a imul varE ;e*a idiv varB ;e*a/b neg eax ;-e*a/b add eax, varB ;-e*a/b + b add eax, varC ;-e*a/b + b + c add ecx, eax ;ecx = (a + b - e*c/d) + (b + c - a*e/b)
mov eax, varD ;d cdq idiv varE ;d/e neg eax ;-d/e add eax , varC ;-d/e + c add ecx, eax ;ecx = (a + b - e*c/d) + (b + c - a*e/b) - d/e + c mov eax, varA ;a imul varB ;a*b add eax, ecx ;eax = (a + b - e*c/d) + (b + c - a*e/b) - d/e + c + a*b ret function endp
end start Подправленный rsrc.rc
Код: #include "\masm32\include\resource.h"
LANGUAGE 0x19, 0x01 #pragma code_page(1251)
#define IDC_BUTTON 3001 #define IDM_OPEN 32000 #define IDM_SAVE 32001 #define IDM_EXIT 32003 #define IDM_SP 32005 #define IDM_CLEAR 32007 #define IDC_STATIC -1 #define IDC_BCDE 3003 #define IDC_Y 3004 #define MYDIALOG 100 #define MyMenu 200
MyMenu MENUEX DISCARDABLE BEGIN POPUP "Файл" BEGIN MENUITEM "Открыть",IDM_OPEN MENUITEM "Сохранить",IDM_SAVE MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/ MENUITEM "Очистить",IDM_CLEAR MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/ MENUITEM "Выход",IDM_EXIT END POPUP "Справка" BEGIN MENUITEM "О программе",IDM_SP END END
MYDIALOG DIALOGEX 10, 10, 186, 121 STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_VISIBLE | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU CAPTION "СПО" CLASS "DLGCLASS" MENU MyMenu BEGIN EDITTEXT IDC_BCDE, 8, 25, 81, 88, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_LEFT | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP, WS_EX_CLIENTEDGE EDITTEXT IDC_Y, 103, 25, 76, 88, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_LEFT | WS_VSCROLL | W S_HSCROLL | NOT WS_TABSTOP, WS_EX_CLIENTEDGE DEFPUSHBUTTON "Выполнить",IDC_BUTTON,133, 5, 46, 13, BS_CENTER | BS_VCENTER LTEXT "Переменные a,b,c,d,e",IDC_STATIC, 10, 14, 78, 9, NOT WS_GROUP LTEXT "Y=",IDC_STATIC, 105, 14, 8, 9, NOT WS_GROUP LTEXT "Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e)",IDC_STATIC, 8, 4, 125, 9, NOT WS_GROUP END Примерный файл c параметрами a.txt
Код: [parms] a=12 step=20 count=5 b=3 c=10 d=7 e=1
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 06.12.2010, 13:05 Номер ответа: 264549 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 264549 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий