gdc/01


gdc

1. main

libgphobosを使わないでやってみる

gcjではリンクをgcj経由でやらない場合はlibgcjがリンクされずに未定義参照が表面化したので、同じようにしてみる。

$ gcc a.d

配列の分析

エントリポイントを自前で用意するのは良いが、char[][]どうすんの? gcjみたいにC++との相互運用を前提にしたライブラリがないじゃん。 というわけで調査。

a.d

void dump(void* p)
{
	int* pp = cast(int*)p;
	printf("%p: %08x %08x %08x %08x\n", pp, pp[0], pp[1], pp[2], pp[3]);
}

int main(char[][] args) {
	dump(&args);
	for (int i = 0; i < args.length; i++)
	{
		printf("[%d] ", i);
		dump(&args[i]);
	}
	foreach (char[] arg; args)
	{
		dump(&arg);
	}
	return 0;
}

実行結果

$ gdc a.d
$ ./a
0x22ef00: 00000001 004d85f0 0022ef78 004013c7
[0] 0x4d85f0: 00000003 61822df8 00000000 00000409
0x22eee8: 00000003 61822df8 0022ef6c 00000001
$ ./a higepon
0x22ef00: 00000002 004d85f0 0022ef78 004013c7
[0] 0x4d85f0: 00000003 61822e18 00000007 61822e30
[1] 0x4d85f8: 00000007 61822e30 00000000 00000409
0x22eee8: 00000003 61822e18 0022ef6c 00000002
0x22eee8: 00000007 61822e30 0022ef6c 00000002

a.d

void dump(void* p)
{
	int* pp = cast(int*)p;
	printf("%p: len=%d \"", pp, *pp);
	char** c = cast(char**)(pp + 1);
	for (int i = 0; i < *pp; i++) printf("%c", (*c)[i]);
	printf("\"\n");
}

int main(char[][] args) {
	for (int i = 0; i < args.length; i++)
	{
		printf("[%d] ", i);
		dump(&args[i]);
	}
	return 0;
}

実行結果

$ gdc a.d
$ ./a
[0] 0x4d85f0: len=3 "./a"
$ ./a higepon
[0] 0x4d85f0: len=3 "./a"
[1] 0x4d85f8: len=7 "higepon"

dmain.cpp

分析結果に基づいて実装してみる。

#include <string.h>

template <class T> class DArray
{
public:
	int length;
	T* data;
	DArray() : length(0), data(NULL) {}
	DArray(int len) { alloc(len); }
	void alloc(int len) { length = len; data = new T[len]; }
	T& operator[](int index) { return data[index]; }
};

extern "C" int _Dmain(DArray<DArray<char> > args);

int main(int argc, char* argv[])
{
	DArray<DArray<char> > args(argc);
	for (int i = 0; i < argc; i++)
	{
		args[i].length = strlen(argv[i]);
		args[i].data = argv[i];
	}
	return _Dmain(args);
}

_d_array_bounds

a.dはそのままでコンパイルすると未定義参照が……

$ g++ a.d dmain.cpp
a.d: undefined reference to `_d_array_bounds'

実行結果

$ g++ a.d dmain.cpp
$ ./a
0x22ef70, 1
[0] 0x4b0240: len=3 "./a"
$ ./a higepon
0x22ef70, 2
[0] 0x4b0240: len=3 "./a"
[1] 0x4b0248: len=7 "higepon"

Monaでの実行例

01.png

ソース: file01.zip

MENU

now: 2

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2743, today: 1, yesterday: 0

添付ファイル: file01.zip 674件 [詳細] file01.png 466件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3766d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.089 sec.