Пожалуйста распишите что значат строчки.Буду очень благодарен. #include <stdio.h> #include <malloc.h> #include <math.h> int main() { FILE *f,*g; unsigned n,e,i,j,k; char name1[50], name2[50]; printf("Name of the input file? "); gets(name1); if((f=fopen(name1,"r"))==NULL) { printf("\nThe program can not find this file \n"); getchar(); exit(1); } printf("Name of the output file? "); gets(name2); g=fopen(name2,"w"); n=0; while(!feof(f)) { fscanf(f,"%u",&e); j=2; i=round(sqrt(e)); while(e%j&&j<=i)j++; if(j>i&&i>1) { n++; fprintf(g,"%u ",e); } } fclose(f); fclose(g); unsigned *a=(unsigned *)malloc(n*sizeof(unsigned)); g=fopen(name2,"r"); for(j=0;j<n;j++) fscanf(g,"%u",&a[j]); fclose(g); for(i=1;i<n;i++) for(j=1;j<n;j++) if(a[j]>a[j-1]) { k=a[j-1];a[j-1]=a[j];a[j]=k; } g=fopen(name2,"w"); for(j=0;j<n;j++) fprintf(g,"%u ",a[j]); free(a); fclose(g); return 0; }
GRRRL Power, к чему эти слова? Скомпилируйте код, предоставленный maked0n, и скомпилируйте с "моим бредом", а потом будете говорить. Я очень редко советую "на глаз". Если вам удастся вывести окно без моего ret, я сниму перед вами шляпу. Как вы могли заметить, перед ret, в который вы формально ткнули меня носом, стоит очистка регистра eax (xor eax,eax), а значит результат функции DefWindowProc просто затрется нулем. Прежде чем делать такие заявления, пожалуйста, проверяйте на практике. Code: WndProc proc hWnd:DWORD, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSE invoke DefWindowProc,hWnd, uMsg, wParam, lParam ret .ENDIF [COLOR=Red][B]xor eax, eax[/B][/COLOR] Ret WndProc EndP
GRRRL Power, вы абсолютно не правы, и сейчас попросту пытаетесь показать меня с плохой стороны. Я повторюсь, проверяйте на практике. Попробуйте убрать xor eax,eax и ret после. Code: WndProc proc hWnd:DWORD, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSE invoke DefWindowProc,hWnd, uMsg, wParam, lParam ret .ENDIF WndProc EndP и при закрытии окна вы получите ошибку, т.е. программа завершится некорректно. xor eax,eax и ret там обязательны ровно так же, как и ret после функции DefWindowProc. Это стандартный шаблон процедуры обработки окна. Нарушение этого минимума приведет к ошибке.
Sams, успокойся, все уже поняли, что ты эталон для любого человека, который программирует на ассемблере. Знания других меркнут в свете твоих и каждая твоя фраза является беспрекословной абсолютной истиной. Но ты ведь растрачиваешь свой талант попусту, общаясь на этом форуме со всякой "чернью", которые не в состоянии постичь и доли твоих великих знаний. Бросай это недостойное занятие и продолжай творить божественный код вне стен этого форума, собравшиеся здесь обречены на вечные безуспешные попытки постичь величественную простоту и эффективность твоих решений и высказываний.
Вообще-то вы утверждали, что я поставил лишний ret, а не что надо просто убрать xor eax,eax. Если вы считаете, что там лишний xor eax,eax, то тут вам надо спорить с туториалам Iczelion'a, а еще книгой "Самоучитель Ассемблер" Александр Крупник. Они решили именно так, и я не думаю, что зря. После завершения процедуры обработки окна, выполняется кусок кода Code: invoke ExitProcess,eax значит есть ситуации, в которых в eax может оказаться какая нибудь ерунда, по этому и делают обнуление. Я думаю не стоит развивать столь мизерную тему. Во всех книгах стандартный шаблон процедуры обработки окна выглядит именно так, как я написал. Если хотите делать иначе - пожалуйста. Просто не стоит критиковать других. Я лишь указал человеку на его ошибку так, как это изложил Iczelion, потому что именно по этому материалу он и изучал. А вы бы в свою очередь могли выложить свой вариант, чего вы не сделали, а раскритиковали мой работоспособный вариант, в котором возможно и написано 3 байта лишнего кода. Очень умно.
еще вопрос) почему не отображается меню? что я пропустил в коде? просто окно без меню( .asm: Code: .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ClassName db "WINDOW",0 AppName db "MASM",0 MenuName db "First menu", 0 Test_string db "You selected test menu item", 0 Hello_string db "Hello, my friend!", 0 Goodbye_string db "See you again, bye", 0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? hMenu HMENU ? .CONST IDM_TEST equ 1 IDM_HELLO equ 2 IDM_GOODBYE equ 3 IDM_EXIT equ 4 .CODE start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_COMMAND mov eax, wParam .IF ax==IDM_TEST invoke MessageBox,NULL, ADDR Test_string, OFFSET AppName, MB_OK .ELSEIF ax==IDM_HELLO invoke MessageBox,NULL, ADDR Hello_string, OFFSET AppName, MB_OK .ELSEIF ax==IDM_GOODBYE invoke MessageBox,NULL, ADDR Goodbye_string, OFFSET AppName, MB_OK .ELSE invoke DestroyWindow,hWnd .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd: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,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+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 LoadMenu,hInst, OFFSET MenuName mov hMenu, eax invoke CreateWindowEx,NULL,\ ADDR ClassName,\ ADDR AppName,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ hMenu,\ hInst,\ NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp end start .rc: Code: #define IDM_TEST 1 #define IDM_HELLO 2 #define IDM_GOODBYE 3 #define IDM_EXIT 4 FirstMenu MENU { POPUP "&PopUp" { MENUITEM "&Say hello", IDM_HELLO MENUITEM "Say &goodbye", IDM_GOODBYE MENUITEM SEPARATOR MENUITEM "E&xit", IDM_TEST } MENUITEM "&Test", IDM_TEST }
хм..... ну я через WinAsm Studio жму SHIFT+F7) вот вроде в свойствах нашел: /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0
можешь скачать мою mini IDE тут на ачате.надо создавать файл ресурсов с помощью rc.exe (тоесть с rc делаем res) и линковщиком его прилинковывать. в моей проге есть такое. выглядит примерно так poasm.exe srcfile.asm rc. exe /v rsrc.rc polink.exe /subsystem:windows srcfile.obj rsrc.res я пользуюсь pelle's macro assembler-ом
но у меня же в моей среде пашетпопробуй сначала.Если не хочешь так,создай просто батник как я выше написал.
буду очень благодарен за перезаливку куда-нибудь, а то letitbit error выдает, а та ссылка на zalil.ru здохла( а как у тебя в среде прилинковать?