import std.c.stdio; import std.c.stdlib; import std.c.time; int main(char[][] args) { int q; if (args.length == 2) { sscanf((char*)args[1],"%d",&q); } else { printf("Usage: pi [precision]\n"); exit(55); } // 計算 CPiCalc picalc = new CPiCalc(q); int startime, endtime; std.c.time.time(&startime); picalc.calc(); std.c.time.time(&endtime); // 表示 picalc.print(); printf("%ld seconds to compute %d digits of pi\n",endtime-startime,q); return 0; } class CPiCalc { this(int q) // 桁数設定してチョ { q++; // 1桁多めに保持 p = new byte[q]; t = new byte[q]; this.q = q; } void calc() // 円周率計算 { arctan(2); arctan(3); mul4(); } void print() // 円周率表示 { printf("pi = %d.",p[0]); for(int i=1;i<q-1;++i) printf("%d",p[i]); printf("\n"); } //--- 以下円周率計算のための関数 void arctan(int s) { int n; t[0] = 1; div(s); /* t[] = 1/s */ add(); n = 1; do { mul(n); div(s * s); div(n += 2); // if (((n-1) / 2) % 2 == 0) if (((n-1) & 2) == 0) add(); else sub(); } while (!tiszero()); } void add() { // 足し合わせは下位桁から足し合わせる for (int j = q-1; j >= 0; j--) { if (t[j] + p[j] > 9) { p[j] += t[j] - 10; if (j!=0) p[j-1] ++; } else p[j] += t[j]; } } void sub() { for (int j = q-1; j >= 0; j--) if (p[j] < t[j]) { p[j] -= t[j] - 10; if (j!=0) p[j-1] --; } else p[j] -= t[j]; } void mul(int multiplier) { int b; int i; int carry = 0, digit = 0; for (i = q-1; i >= 0; i--) { b = (t[i] * multiplier + carry); digit = b % 10; carry = b / 10; t[i] = digit; } } /* t[] /= l */ void div(int divisor) { int quotient, remainder = 0; foreach(inout byte n;t){ int b = (10 * remainder + n); quotient = b / divisor; remainder = b % divisor; n = quotient; } } void div4() { int c = 0, d = 0; foreach(inout byte n;p) { c = (10 * d + n) / 4; d = (10 * d + n) % 4; n = c; } } void mul4() { int i, c = 0, d = 0; for (i = q-1; i >= 0; i--) { d = (p[i] * 4 + c) % 10; c = (p[i] * 4 + c) / 10; p[i] = d; } } bool tiszero() { foreach(byte n;t) if (n != 0) return false; return true; } private: byte p[]; byte t[]; int q; } |
/**********************************************************/ // 以下、windows用のスタートアップコード /* \dmd\src\phobos\dmain2.dにある コンソール版のD言語のスタートアップコードと比較してみてください。 .defファイルとして、最低限以下のことを書いたファイルを用意して コンパイル時に、そのdefファイルを指定してください。 EXETYPE NT SUBSYSTEM WINDOWS */ extern (C) void gc_init(); extern (C) void gc_term(); extern (C) void _minit(); extern (C) void _moduleCtor(); extern (C) void _moduleUnitTests(); extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result; gc_init(); // initialize garbage collector _minit(); // initialize module constructor table try { _moduleCtor(); // call module constructors _moduleUnitTests(); // run unit tests (optional) result = user_start(); // ユーザーコードはここに入れる } catch (Object o) // catch any uncaught exceptions { MessageBoxA(null, (char *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // failed } gc_term(); // run finalizers; terminate garbage collector return result; } |
/* コンパイルは以下の方法で。 dmd wintest gdi32.lib wintest.def wintest.defについては、 EXETYPE NT SUBSYSTEM WINDOWS と書いたファイルを用意すればok。 dmd -L/EXET:NT -L/SU:windows source.d ... のように、リンカに直接指定しても良いようです。 */ import std.c.windows.windows; import std.c.stdio; const int IDC_BTNCLICK = 101; const int IDC_BTNDONTCLICK = 102; extern(Windows) int WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_BTNCLICK: if (HIWORD(wParam) == BN_CLICKED) MessageBoxA(hWnd, "Hello, world!", "こんにちは", MB_OK | MB_ICONINFORMATION); break; case IDC_BTNDONTCLICK: if (HIWORD(wParam) == BN_CLICKED) { MessageBoxA(hWnd, "わざとメモリ保護違反を出します", "メモリ保護違反出すよー", MB_OK | MB_ICONEXCLAMATION); *(cast(int*) null) = 666; } break; } break; } case WM_PAINT: { static char[] text = "D言語はWindowsも出来る"; PAINTSTRUCT ps; HDC dc = BeginPaint(hWnd, &ps); RECT r; GetClientRect(hWnd, &r); HFONT font = CreateFontA(80, 0, 0, 0, FW_EXTRABOLD, FALSE, FALSE, FALSE, /*ANSI_CHARSET*/ SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS明朝"); HGDIOBJ old = SelectObject(dc, cast(HGDIOBJ) font); SetTextAlign(dc, TA_CENTER | TA_BASELINE); TextOutA(dc, r.right / 2, r.bottom / 2, text, text.length); SelectObject(dc, old); EndPaint(hWnd, &ps); break; } case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProcA(hWnd, uMsg, wParam, lParam); } int user_start() { // ここにメインプログラムを書く HINSTANCE hInst = GetModuleHandleA(null); WNDCLASS wc; wc.lpszClassName = "DWndClass"; wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = &WindowProc; wc.hInstance = hInst; wc.hIcon = LoadIconA(cast(HINSTANCE) null, IDI_APPLICATION); wc.hCursor = LoadCursorA(cast(HINSTANCE) null, IDC_CROSS); wc.hbrBackground = cast(HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = null; wc.cbClsExtra = wc.cbWndExtra = 0; assert(RegisterClassA(&wc)); HWND hWnd, btnClick, btnDontClick; hWnd = CreateWindowA("DWndClass", "Just a window", WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, HWND_DESKTOP, cast(HMENU) null, hInst, null); assert(hWnd); btnClick = CreateWindowA("BUTTON", "Click Me", WS_CHILD | WS_VISIBLE, 0, 0, 100, 25, hWnd, cast(HMENU) IDC_BTNCLICK, hInst, null); btnDontClick = CreateWindowA("BUTTON", "DON'T CLICK!", WS_CHILD | WS_VISIBLE, 110, 0, 100, 25, hWnd, cast(HMENU) IDC_BTNDONTCLICK, hInst, null); MSG msg; while (GetMessageA(&msg, cast(HWND) null, 0, 0)) { TranslateMessage(&msg); DispatchMessageA(&msg); } return 1; } |
void switchThread(){ asm { naked; // このnakedは有効 // naked functionならばEAXにはthisが入っていると仮定して良いらしい // それなら、[EAX+8]がこのクラスで宣言されているの一つ目の変数 // (register_esp_)だと仮定していい push EBX; push EBP; push ESI; push EDI; xchg ESP,[EAX+8]; pop EDI; pop ESI; pop EBP; pop EBX; ret; } } |
import lua; import lualib; import lauxlib; import std.stream; import std.string; extern (C) int printNum(lua_State lua) { int n = lua_gettop(lua); if (n != 1) throw new Error("dame dayo"); double val = lua_tonumber(lua, 1); stdout.writeLine(std.string.toString(val)); lua_pushnumber(lua, cast(lua_Number)(val+1)); return 1; } int main() { lua_State lua = lua_open(); lua_baselibopen(lua); luaL_loadfile(lua, "luatest.lua"); lua_register(lua, "printNum", &printNum); lua_pcall(lua, 0, 0, 0); return 0; } |
implib /system SDL_image.lib SDL_image.dll |
implib -a SDL_image.lib SDL_image.dll |
dumpbin /exports libguide40.dll >libguide40.temp ここで生成されたtempファイルをdefファイルに加工。VC7のlib.exeを使って、 lib /DEF:libguide40.def (mspdb70.dllが無いと言われるので、検索でVC7のフォルダ C:\Program Files\Microsoft Visual Studio .NET を探すと出てくるのでlib.exeと同じフォルダにコピー) |
Microsoft (R) COFF/PE Dumper Version 7.00.9466 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file libguide40.dll File Type: DLL Section contains the following exports for libguide40.dll 00000000 characteristics 3E9F0C51 time date stamp Fri Apr 18 05:19:29 2003 0.00 version 1 ordinal base 1745 number of functions 273 number of names ordinal hint RVA name 1725 0 0000B680 KMP_CALLOC 1726 1 0000B940 KMP_FREE Summary 228000 .data 3000 .data1 5000 .rdata 4000 .reloc 1000 .rsrc 1B000 .text |
LIBRARY libguide40 DESCRIPTION 'libguide40 DLL' EXPORTS _KMP_CALLOC _KMP_FREE |