Консультация № 181100
04.12.2010, 09:19
56.51 руб.
06.12.2010, 13:07
0 5 1
Уважаемые эксперты!
Помогите разработать программу, выполняющую циклическую обработку данных: вычисление значений функции Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) в зависимости от изменяющегося на определенный шаг (задается в качестве переменной) значения переменной "а". Исходные данные: начальное значение переменной "а", шаг изменения переменной, количество повторений цикла и значения констант ("b", "c", "d", "e") вводятся из текстового файла на носителе. Результат вычислений выводится на экран и в файл на носителе.

Часть программы написана на MASM32 v10.

Dialog.asm
[code h=200]
.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
;***********************************************************************
.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
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
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
;*******************************Обработчик нажатия кнопки "выполнить"***********************
.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

[/code]

rsrc.rc
[code h=200]#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
POPUP "Файл"
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,"Static",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

[/code]

Обсуждение

давно
Посетитель
7438
7205
05.12.2010, 17:44
общий
Здравствуйте.
Несколько вопросиков:
1) Как Вы предполагаете вводить шаг изменения переменной "a"?
2) Каков предполагаемый формат текстового файла (с переменными "b", "c", "d", "e")?
3) В задании сказано, что "начальное значение переменной "а", шаг изменения переменной, количество повторений цикла и значения констант ("b", "c", "d", "e") вводятся из текстового файла". Т.е., по идее, в файле должны быть и "а" и шаг. А у Вас "а" вводится в отдельном поле
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
05.12.2010, 18:25
общий
Я бы предложил убрать с диалога запрос "a" и количество шагов
Все вводить из файла в виде
a=123
step=2
count=10
b=23423
...

Еще один вопрос: числа целые или вещественные?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
05.12.2010, 23:39
общий
Числа целые. Можно все из файла.
давно
Посетитель
7438
7205
06.12.2010, 13:05
общий
это ответ
Здравствуйте, Александр!
Вот Вам подправленная программа.
Удачи!
[code h=200].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 3004
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.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, 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_COMMAND
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, rv(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, rv(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_ALWAYS,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[/code]
Подправленный rsrc.rc
[code h=200]#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 | WS_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[/code]
Примерный файл c параметрами a.txt
Код:
[parms]
a=12
step=20
count=5
b=3
c=10
d=7
e=1
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.12.2010, 13:22
общий
Спасибо Вам огромное
Форма ответа