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 |