したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

422 ◆rCEzuNnL0g:2008/09/15(月) 21:26:50
SuperViewでGoogle Talkをやっているときにリンクをクリックして開くことが出来ないからである。

423 ◆rCEzuNnL0g:2008/09/15(月) 22:52:07
C++でstd::getline()という関数があるのだが、此れが一番行を取得するのが良さそう。
何故ならば、std::stringで一行の内容を取得できるからである。
因みにstringをインクルードしなければなりません。
多分此れがistreamクラスの所属になっていないのは、std::stringに依存するのはよろしくないと判断したんだろう。
だけれども、此れが無いとC++は使い物にならん!

424 ◆rCEzuNnL0g:2008/09/15(月) 23:02:19
std::basic_istreamを継承してるので、std::ifstreamとかstd::cinとか自分が作ったのでもいけるねえ。

425 ◆rCEzuNnL0g:2008/09/16(火) 18:29:26
Lunascapeトリプルエンジンキター

426 ◆rCEzuNnL0g:2008/09/16(火) 18:31:02
どうせ使わないけれども。
Sleipnirも焦れと。
取り敢えず他のプラグインの対応は後回しにして、中に詰め込め!

427 ◆rCEzuNnL0g:2008/09/16(火) 18:37:35
入れた、今から消す。

428 ◆rCEzuNnL0g:2008/09/16(火) 18:38:05
六分ぐらい使ってやめました。
Sleipnirも頑張ってください><

429 ◆rCEzuNnL0g:2008/09/16(火) 18:39:35
91.71MBもあってでかいなーと思ったけれども、
Sleipnirもそれくらいあった。

430 ◆rCEzuNnL0g:2008/09/16(火) 21:27:06
Visual C++の小技
http://hp.vector.co.jp/authors/VA000092/win32/vc-tech.html
---
>__declspec(naked) がポイントでした。これはコーリングコンベンションではなく、関数の実体を修飾するもので、プロローグ・エピローグのコードを全く生成しないようコンパイラに指示します。アセンブラで"ret"を書かないと、関数からのリターンもしないという徹底した仕様のようで(笑)。
-----
__declspec(naked)いいねえ。

431 ◆rCEzuNnL0g:2008/09/16(火) 21:31:00
うはwww
本当にretすら生成しないwwwww
これを利用すればラベルとか使わなくてもC/C++のように関数宣言出来るじゃん。
それに型とか明示できるし、とても少ない内容のソースコードならばインライン化してくれる筈。

432 ◆rCEzuNnL0g:2008/09/16(火) 21:32:17
駄目だ。
最適化してくれないorz...

433 ◆rCEzuNnL0g:2008/09/16(火) 21:37:38
普通にやれば良いという事に気づいた。
---
int GetLastError_(){
__asm{
mov eax, dword ptr fs:[00000018h]
mov eax, dword ptr [eax+34h]
}
}

434 ◆rCEzuNnL0g:2008/09/16(火) 22:51:50
MFC的なものを作りたいなあと勝手に思っていたり。
まあ、俺がMemoPanelでやったことみたいにすればいいかと。
全てのメッセージを網羅すれば、ジャンプテーブルになるだろうし。

435 ◆rCEzuNnL0g:2008/09/16(火) 22:58:28
簡単にすれば、MFC的なもので、全てのバーチャルな関数を呼び出すようにすればいいと思う。
まあ、その為にはインスタンスへのポインタを持たねばならないが、それは簡単にどうにかできるので良いや。
簡単なアセンブリは読めるし、書けるようになりますた。

436 ◆rCEzuNnL0g:2008/09/16(火) 22:58:41
!Microsoft IME Dictionary Tool
!Version:
!Format:WORDLIST
!User Dictionary Name: C:\Documents and Settings\Owner\Application Data\Microsoft\IMJP9_0\imjp9u.dic
!Output File Name: C:\Documents and Settings\Owner\
!DateTime: 2008年9月16日 22:54

あちゃー (ノ∀`) アチャー 名詞 AA
いい (・∀・)イイ!! 名詞 AA
いらね (゚⊿゚)イラネ 名詞 AA
えー ( ゚д゚) 名詞 AA
えー ('A`) 名詞 AA
おわた \(^o^)/オワタ 名詞 AA
きた キタ━━━━━━(゚∀゚)━━━━━━ !!!!! 名詞 AA
しゃきーん (`・ω・´) シャキーン 名詞 AA
しょぼーん (´・ω・`)ショボーン 名詞 AA
じゅうにこっき 十二国記 名詞
たーん ;y=ー( ゚д゚)・∵. ターン 名詞 AA
だっしゅ ――― 名詞
なかま (・∀・)人(・∀・)ナカーマ 名詞 AA
にやにや (・∀・)ニヤニヤ 名詞 AA
ばんざい ∩( ・ω・)∩バンジャーイ 名詞 AA
ばんじゃーい ∩( ・ω・)∩バンジャーイ 名詞 AA
ぷぎゃー m9(^Д^)プギャー! 名詞 AA
ぷっ ( ´,_ゝ`)プッ 名詞 AA
へー ( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー 名詞 AA
ぺっ ( ゚д゚)、ペッ 名詞 AA
ぽかーん ( ゚д゚)ポカーン 名詞 AA
まだー マダァ-? (・∀・ )っ/凵⌒☆チンチン 名詞 AA
() (笑) 名詞

437 ◆rCEzuNnL0g:2008/09/16(火) 23:01:51
!Microsoft((_space_))IME((_space_))Dictionary((_space_))Tool
!Version:
!Format:WORDLIST
!User((_space_))Dictionary((_space_))Name:((_space_))C:\Documents((_space_))and((_space_))Settings\Owner\Application((_space_))Data\Microsoft\IMJP9_0\imjp9u.dic
!Output((_space_))File((_space_))Name:((_space_))C:\Documents((_space_))and((_space_))Settings\Owner\
!DateTime:((_space_))2008年9月16日((_space_))22:54

あちゃー((_tab_))(ノ∀`)((_space_))アチャー((_tab_))名詞((_tab_))AA
いい((_tab_))(・∀・)イイ!!((_tab_))名詞((_tab_))AA
いらね((_tab_))(゚⊿゚)イラネ((_tab_))名詞((_tab_))AA
えー((_tab_))( ゚д゚)((_tab_))名詞((_tab_))AA
えー((_tab_))('A`)((_tab_))名詞((_tab_))AA
おわた((_tab_))\(^o^)/オワタ((_tab_))名詞((_tab_))AA
きた((_tab_))キタ━━━━━━(゚∀゚)━━━━━━((_space_))!!!!!((_tab_))名詞((_tab_))AA
しゃきーん((_tab_))(`・ω・´)((_space_))シャキーン((_tab_))名詞((_tab_))AA
しょぼーん((_tab_))(´・ω・`)ショボーン((_tab_))名詞((_tab_))AA
じゅうにこっき((_tab_))十二国記((_tab_))名詞
たーん((_tab_));y=ー(((_space_))゚д゚)・∵.((_space_))ターン((_tab_))名詞((_tab_))AA
だっしゅ((_tab_))―――((_tab_))名詞
なかま((_tab_))(・∀・)人(・∀・)ナカーマ((_tab_))名詞((_tab_))AA
にやにや((_tab_))(・∀・)ニヤニヤ((_tab_))名詞((_tab_))AA
ばんざい((_tab_))∩(((_space_))・ω・)∩バンジャーイ((_space_))((_tab_))名詞((_tab_))AA
ばんじゃーい((_tab_))∩(((_space_))・ω・)∩バンジャーイ((_tab_))名詞((_tab_))AA
ぷぎゃー((_tab_))m9(^Д^)プギャー!((_tab_))名詞((_tab_))AA
ぷっ((_tab_))(((_space_))´,_ゝ`)プッ((_tab_))名詞((_tab_))AA
へー((_tab_))(((_space_))・∀・)つ〃∩((_space_))ヘェーヘェーヘェーヘェーヘェー((_tab_))名詞((_tab_))AA
ぺっ((_tab_))( ゚д゚)、ペッ((_tab_))名詞((_tab_))AA
ぽかーん((_tab_))(((_space_))゚д゚)ポカーン((_tab_))名詞((_tab_))AA
まだー((_tab_))マダァ-?((_space_))(・∀・((_space_)))っ/凵⌒☆チンチン((_tab_))名詞((_tab_))AA
()((_tab_))(笑)((_tab_))名詞

438 ◆rCEzuNnL0g:2008/09/16(火) 23:03:56
兄が登録していたMS-IME用の辞書がとても邪魔だったので、全て消してみた。
取り敢えず、バックアップ用にテキストで出力して、
"\t" -> ((_tab_))
" " -> ((_space_))
と置き換えしておいた。
           全角の空白は連続していても消えないはずなので、そのまま。

439 ◆rCEzuNnL0g:2008/09/16(火) 23:05:44
だって、
「いいじゃん」を変換するのに「(・∀・)イイ!!じゃん」
と出るのはさすがにイラッと来る。
やっぱり初期状態が一番使いやすい。

440 ◆rCEzuNnL0g:2008/09/16(火) 23:15:35
>>434-435
うーん。
ライブラリ的なものは難しいなあ。
DLLにするのもなんだし。スタティックライブラリにしてみるか?
取り敢えず、最初は良く使うメッセージを中心に実装すれば良いと思った。

441 ◆rCEzuNnL0g:2008/09/17(水) 00:19:26
普通にクラス中にstaticな関数を入れればいいじゃん!
アホだ俺!

442 ◆rCEzuNnL0g:2008/09/17(水) 00:32:26
JavaScript1.7と1.8は勉強しなおす必要性があるようだ。
というか、初めから勉強していないのだが。

443 ◆rCEzuNnL0g:2008/09/17(水) 19:49:02
__thiscallは型変換が出来ないので、
一度メンバ関数ポインタで取得して、その後インラインアセンブリで取得すれば良い。
以下、実証コード。
------
#include <iostream>

class ISuper{
public:
virtual
~ISuper(){}

virtual
int Get1() = 0;
virtual
int Get2() = 0;
virtual
void Set1(int) = 0;
virtual
void Set2(int) = 0;
};

class CSub : public ISuper{
public:
CSub()
: x(), y()
{}

virtual
int Get1(){
return x;
}
virtual
int Get2(){
return y;
}
virtual
void Set1(int _x){
x = _x;
}
virtual
void Set2(int _y){
y = _y;
}

private:
int x, y;
};

int main(int argc, char **argv){
CSub x;
int (ISuper::*func1)();
void (ISuper::*func2)(int);
func1 = &ISuper::Get1;
func1 = &ISuper::Get2;
func2 = &ISuper::Set1;
func2 = &ISuper::Set2;

void *p;
__asm{
push eax
mov eax, func1
mov p, eax
pop eax
}

std::cout << p << std::endl;

int i;

__asm{
push ecx
lea ecx, x
call p
mov i, eax
pop ecx
}
}

444 ◆rCEzuNnL0g:2008/09/17(水) 21:20:12
ニコニコ動画とかに、大量のメッセージボックスを出して
うわあああああああああああああああああああ
という作品があるが、あれをリアルに再現するにはどうすればいいだろうか。
出来るだけMessageBox関数でやりたいがあれを利用すると閉じるまで処理が止まるので、
スレッド+MessageBoxでいいと思う。
という事で、五十個ぐらいMessageBoxを出すプログラムでも作る。

445 ◆rCEzuNnL0g:2008/09/17(水) 21:31:05
#include <iostream>
#include <vector>
#include <windows.h>
#include <process.h>

unsigned int __stdcall thread(void *){
MessageBox(NULL, L"うああああああああああああああ", L"うわああああああああああああ", MB_OK);

return 0;
}

int main(int argc, char **argv){
std::vector<HANDLE> v;

for(int i = 0; i < 50; i++)
v.push_back((HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL));

WaitForMultipleObjects(v.size(), &v[0], FALSE, INFINITE);

for(int i = 0, len = v.size(); i < len; i++){
CloseHandle(v[i]);
}
}

446 ◆rCEzuNnL0g:2008/09/17(水) 21:33:15
後はタイミングにあわせて上手くbeginthreadすればいいと思う。
例えばSleep関数使うとか。

任意の位置で出したいのならば、その為にウィンドウを作れば良い。
今はそこまでかまっていられない。
音は・・・。どうすればいいんだろう。

447 ◆rCEzuNnL0g:2008/09/17(水) 21:37:07
MessageBeep(MB_ICONHAND);
で「ボン」というエラー音がだせるみたい。

448 ◆rCEzuNnL0g:2008/09/17(水) 21:40:43
和音はむりっぽいなあ。

449 ◆rCEzuNnL0g:2008/09/18(木) 01:40:43
うーん。
俺は何をしたいのだろうか。
何か方向性も持たぬまま、パソコンの前に座っていても何も起こるはずが無い。
取り敢えず、十一月に入るまではパソコンを出来るだけ触らないようにしよう。
そして、それまでに勉強の習慣を付けなければならない。
プログラミングはあくまでも趣味で嗜む程度であるから、本当に適当にやっていればいいんだ。
適当が一番勉強になる。

450 ◆rCEzuNnL0g:2008/09/18(木) 02:10:57
どうして__thiscallの関数のポインタは簡単に取得できないのだろうか。
いや、取得できてもC/C++の標準機能でどうしてvoid*とかにキャストできないのだろうか。
いや、俺は根本的に間違っていたのか。
確かC++にはC++の独自のキャストがあった筈だ。
それを試して駄目だったらもう寝よう。

451 ◆rCEzuNnL0g:2008/09/18(木) 02:15:10
試していないが、多分無理であろうという結論に達した。
という事で、そろそろ寝るか。
明日は補習もあるし。

452 ◆rCEzuNnL0g:2008/09/19(金) 18:33:55
絶対出来ない。
メンバ関数ポインタなんてもう嫌だ><

453 ◆rCEzuNnL0g:2008/09/19(金) 19:00:28
このアセンブリ読みたくないwww
-----
#include <iostream>

class CSuper{
public:
virtual
int
Get(){
return 0;
}
};

class CSub1 : virtual public CSuper{
public:
virtual
int
Get(){
return 1;
}
};

class CSub2 : virtual public CSuper{
public:
int
Get(){
return 2;
}
};

class CSubSub : public CSub1, public CSub2{
public:
virtual
int
Get(){
return 3;
}
};

int main(int argc, char **argv){
int (CSubSub::*func1)() = &CSuper::Get;
int (CSub1::*func2)() = (int (CSub1::*)())func1;
int (CSub2::*func3)() = (int (CSub2::*)())func1;
CSubSub c;
(c.*func1)();
(c.*func2)();
(c.*func3)();

std::cout << sizeof(func1) << std::endl;
}

454 ◆rCEzuNnL0g:2008/09/19(金) 20:34:31
MemoPanel更新した。
EditWindowExで編集したときに、編集が適用されないことがあった。
前書いた、物理の原稿が消えていることから発覚した。
いやあ、バグを見つける&作らないということは本当に難しい。

455 ◆rCEzuNnL0g:2008/09/19(金) 21:24:43
int main(int argc, char **argv){
00413C10 push ebp
00413C11 mov ebp,esp
00413C13 sub esp,154h
00413C19 push ebx
00413C1A push esi
00413C1B push edi
00413C1C lea edi,[ebp-154h]
00413C22 mov ecx,55h
00413C27 mov eax,0CCCCCCCCh
00413C2C rep stos dword ptr es:[edi]
int (CSubSub::*func1)() = &CSuper::Get;
00413C2E mov dword ptr [ebp-14Ch],offset CSuper::`vcall'{0}' (41122Bh)
00413C38 mov dword ptr [ebp-148h],0
00413C42 mov dword ptr [ebp-144h],4
00413C4C mov eax,dword ptr [ebp-14Ch]
00413C52 mov dword ptr [func1],eax
00413C55 mov ecx,dword ptr [ebp-148h]
00413C5B mov dword ptr [ebp-0Ch],ecx
00413C5E mov edx,dword ptr [ebp-144h]
00413C64 mov dword ptr [ebp-8],edx
int (CSub1::*func2)() = (int (CSub1::*)())func1;
00413C67 mov eax,dword ptr [func1]
00413C6A mov dword ptr [func2],eax
00413C6D mov ecx,dword ptr [ebp-0Ch]
00413C70 mov dword ptr [ebp-20h],ecx
00413C73 mov edx,dword ptr [ebp-8]
00413C76 mov dword ptr [ebp-1Ch],edx
int (CSub2::*func3)() = (int (CSub2::*)())func1;
00413C79 mov eax,dword ptr [func1]
00413C7C mov dword ptr [ebp-138h],eax
00413C82 mov ecx,dword ptr [ebp-8]
00413C85 neg ecx
00413C87 sbb ecx,ecx
00413C89 and ecx,4
00413C8C add ecx,0FFFFFFFCh
00413C8F add ecx,dword ptr [ebp-0Ch]
00413C92 mov dword ptr [ebp-134h],ecx
00413C98 mov edx,dword ptr [ebp-8]
00413C9B mov dword ptr [ebp-130h],edx
00413CA1 mov eax,dword ptr [ebp-138h]
00413CA7 mov dword ptr [func3],eax
00413CAA mov ecx,dword ptr [ebp-134h]
00413CB0 mov dword ptr [ebp-34h],ecx
00413CB3 mov edx,dword ptr [ebp-130h]
00413CB9 mov dword ptr [ebp-30h],edx
CSubSub c;
00413CBC push 1
00413CBE lea ecx,[c]
00413CC1 call CSubSub::CSubSub (41112Ch)
(c.*func1)();
00413CC6 mov eax,dword ptr [c]
00413CC9 add eax,dword ptr [ebp-8]
00413CCC mov ecx,dword ptr [eax]
00413CCE lea ecx,c[ecx]
00413CD2 add ecx,dword ptr [ebp-0Ch]
00413CD5 mov esi,esp
00413CD7 call dword ptr [func1]
00413CDA cmp esi,esp
00413CDC call @ILT+380(__RTC_CheckEsp) (411181h)
(c.*func2)();
00413CE1 lea eax,[c]
00413CE4 mov dword ptr [ebp-124h],eax
00413CEA mov ecx,dword ptr [ebp-124h]
00413CF0 mov edx,dword ptr [ecx]
00413CF2 mov eax,dword ptr [ebp-1Ch]
00413CF5 mov ecx,dword ptr [ebp-124h]
00413CFB add ecx,dword ptr [edx+eax]
00413CFE add ecx,dword ptr [ebp-20h]
00413D01 mov esi,esp
00413D03 call dword ptr [func2]
00413D06 cmp esi,esp
00413D08 call @ILT+380(__RTC_CheckEsp) (411181h)

456 ◆rCEzuNnL0g:2008/09/19(金) 21:24:57
(c.*func3)();
00413D0D lea eax,[c]
00413D10 test eax,eax
00413D12 je main+112h (413D22h)
00413D14 lea ecx,[c]
00413D17 add ecx,4
00413D1A mov dword ptr [ebp-154h],ecx
00413D20 jmp main+11Ch (413D2Ch)
00413D22 mov dword ptr [ebp-154h],0
00413D2C mov edx,dword ptr [ebp-154h]
00413D32 mov dword ptr [ebp-118h],edx
00413D38 mov eax,dword ptr [ebp-118h]
00413D3E mov ecx,dword ptr [eax]
00413D40 mov edx,dword ptr [ebp-30h]
00413D43 mov eax,dword ptr [ebp-118h]
00413D49 add eax,dword ptr [ecx+edx]
00413D4C add eax,dword ptr [ebp-34h]
00413D4F mov esi,esp
00413D51 mov ecx,eax
00413D53 call dword ptr [func3]
00413D56 cmp esi,esp
00413D58 call @ILT+380(__RTC_CheckEsp) (411181h)

std::cout << sizeof(func1) << std::endl;
00413D5D mov esi,esp
00413D5F mov eax,dword ptr [__imp_std::endl (4192A4h)]
00413D64 push eax
00413D65 mov edi,esp
00413D67 push 0Ch
00413D69 mov ecx,dword ptr [__imp_std::cout (41929Ch)]
00413D6F call dword ptr [MSVCP90D_NULL_THUNK_DATA (4192ACh)]
00413D75 cmp edi,esp
00413D77 call @ILT+380(__RTC_CheckEsp) (411181h)
00413D7C mov ecx,eax
00413D7E call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4192A8h)]
00413D84 cmp esi,esp
00413D86 call @ILT+380(__RTC_CheckEsp) (411181h)
}
00413D8B xor eax,eax
00413D8D push edx
00413D8E mov ecx,ebp
00413D90 push eax
00413D91 lea edx,[ (413DB4h)]
00413D97 call @ILT+155(@_RTC_CheckStackVars@8) (4110A0h)
00413D9C pop eax
00413D9D pop edx
00413D9E pop edi
00413D9F pop esi
00413DA0 pop ebx
00413DA1 add esp,154h
00413DA7 cmp ebp,esp
00413DA9 call @ILT+380(__RTC_CheckEsp) (411181h)
00413DAE mov esp,ebp
00413DB0 pop ebp
00413DB1 ret

457 ◆rCEzuNnL0g:2008/09/19(金) 21:27:05
>>453の逆アセンブリが>>455-456

458 ◆rCEzuNnL0g:2008/09/19(金) 23:51:06
因みにDebugでコンパイルしたから、最適化は一切無し。
どうでも良いけれども、ある関数の全ての動作をインライン化したいんだったら、
マクロで定義すればいいことに最近気が付いた。

459 ◆rCEzuNnL0g:2008/09/19(金) 23:52:53
遅くなるか早くなるかはどうかとして、そっちの方がある程度の難読化に繋がると思う。
つまり、最適化=難読化だと思っている。
まあ、そうであるといえないことも多々あるのだが。

460 ◆rCEzuNnL0g:2008/09/20(土) 22:53:12
MemoPanelにまたバグが見つかったので更新した。
此れでEditWindowExのバグは殆ど潰せたと思う。
他の部分も弄くったので、バグが増えてないといいが・・・

461 ◆rCEzuNnL0g:2008/09/20(土) 22:56:51
俺的には参照で渡すのは嫌いだ。
少なくとも俺が参照で渡すならば、const T&で渡す。
関数の中で値を変える場合は、ちゃんとポインタを渡して明示したい。
まあ、&演算子がオーバーロードされていたが困るのだが。

462 ◆rCEzuNnL0g:2008/09/20(土) 22:59:38
個人的には、参照があるのは、構造体を渡すときに普通に渡すととてもオーバーヘッドが大きいから、
それを防ぐためにあるのであると思っている。
std::stringを普通に渡すととてもオーバーヘッドが大きいが参照で渡せば、
大抵ポインタがスタックに詰まれるので、非常に早い。
だから、普通にスタックに積む代替策だと思っている。
だから、不用意にポインタの内容を書き換えないためにそうしたいと思っている。

463 ◆rCEzuNnL0g:2008/09/20(土) 23:01:03
#include <iostream>

class CSuper1{
public:
virtual
int
Get1(){
return 0;
}
};

class CSuper2{
public:
virtual
int
Get2(){
return 1;
}
};

class CSub1 : virtual public CSuper1{
public:
virtual
int
Get1(){
return 2;
}
};

class CSub2 : virtual public CSuper1, virtual public CSuper2{
public:
virtual
int
Get1(){
return 3;
}
virtual
int
Get2(){
return 4;
}
};

class CSub3 : virtual public CSuper2{
public:
int
Get2(){
return 5;
}
};

class CSubSub : public CSub1, public CSub2, public CSub3{
public:
virtual
int
Get1(){
return 6;
}
virtual
int
Get2(){
return 7;
}
};

int main(int argc, char **argv){
{
int (CSubSub::*func1)() = &CSuper1::Get1;
int (CSub1::*func2)() = (int (CSub1::*)())func1;
int (CSub2::*func3)() = (int (CSub2::*)())func1;
CSubSub c;
(c.*func1)();
(c.*func2)();
(c.*func3)();
}
{
int (CSubSub::*func1)() = &CSuper2::Get2;
int (CSub2::*func2)() = (int (CSub2::*)())func1;
int (CSub3::*func3)() = (int (CSub3::*)())func1;
CSubSub c;
(c.*func1)();
(c.*func2)();
(c.*func3)();
}
}

464 ◆rCEzuNnL0g:2008/09/20(土) 23:02:09
>>463はメンバ関数ポインタ検証用に作ったソース。
意味は無い。

465 ◆rCEzuNnL0g:2008/09/20(土) 23:07:24
普通に渡すとコピーコンストラクタを呼び出さなくてはいけなくなるので、最適化が行われない。

466 ◆rCEzuNnL0g:2008/09/20(土) 23:08:13
実際の逆アセンブルはこんな感じ。最適化は一切無し。
-----
print(str);
0041167E sub esp,20h
00411681 mov ecx,esp
00411683 mov dword ptr [ebp-100h],esp
00411689 mov esi,esp
0041168B lea eax,[ebp-34h]
0041168E push eax
0041168F call dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (4192ACh)]
00411695 cmp esi,esp
00411697 call @ILT+340(__RTC_CheckEsp) (411159h)
0041169C mov dword ptr [ebp-108h],eax
004116A2 call print (411050h)
004116A7 add esp,20h
printp(&str);
004116AA lea eax,[ebp-34h]
004116AD push eax
004116AE call printp (41100Ah)
004116B3 add esp,4
printr(str);
004116B6 lea eax,[ebp-34h]
004116B9 push eax
004116BA call printr (4111EFh)
004116BF add esp,4

467 ◆rCEzuNnL0g:2008/09/20(土) 23:09:51
ポインタと参照は全く同じ。
だけれども呼び出し方が違う。
もう面倒だから、自分で調べてね。勉強をしたい人は。

468774さん:2008/09/21(日) 22:23:00
取り敢えず、メンバ関数ポインタはsizeof(int)には等しくないということだ。

469774さん:2008/09/22(月) 23:31:31
今日はプログラミングについて何も研究しなかった。

470 ◆rCEzuNnL0g:2008/09/22(月) 23:50:56
さて、今からPEヘッダについて勉強するか

471 ◆rCEzuNnL0g:2008/09/23(火) 00:32:37
今度時間があったら、バイナリエディタでEXEを打ってみたい。
というか、世界最小のEXEを作りたかったりする。
一筋縄ではいかなさそうだが、面白そう。

472 ◆rCEzuNnL0g:2008/09/23(火) 00:35:34
アセンブラとPEフォーマットとマシン語の注入
http://ruffnex.oc.to/kenji/text/exe_inj/

473 ◆rCEzuNnL0g:2008/09/23(火) 00:37:54
>>472
ずらしたソースに、他のセクションへの相対ジャンプ命令があったら、不味いんじゃないかなと思う。
だけれども、全体をずらせばいいか。
.dataが最初にあれば、それごと全体を倍数倍だけずらして、コードを最初に入れて、最初にjmpすればいい。
という事で、今度作ってみよう。出来るならばね。

474 ◆rCEzuNnL0g:2008/09/23(火) 00:53:46
IOIの問題難しすぎ。
数学の問題なんだけれども、難しい。
という事で、一番最初の問題は解けるけれども、他は分かりませんということです。

475 ◆rCEzuNnL0g:2008/09/23(火) 13:20:30
#include <iostream>
#include <string>
#include <cstdlib>
#include <clocale>

std::wstring GetWStr(const char *str, const char *loc = "japanese"){
size_t size = std::mbstowcs(NULL, str, 0) + 1;

wchar_t *wc = new wchar_t[size];

std::mbstowcs(wc, str, size);

std::wstring wstr(wc);
delete wc;

std::setlocale(LC_ALL, loc);

return wstr;
}

std::wstring GetWStr(std::string str, const char *loc = "japanese"){
return GetWStr(str.c_str(), loc);
}

int main(int argc, char **argv){
std::wcout << GetWStr("testtest").c_str() << std::endl;
}

476 ◆rCEzuNnL0g:2008/09/24(水) 20:05:14
Brainfuckを実装してみた。まあ「,」は実装していないけれども。
-----
#include <iostream>
#include <string>

int main(int argc, char **argv){
static char test[10000];
register unsigned int ptr = 0;
memset(test, 0, sizeof(test));

std::wstring wstr;
std::getline(std::wcin, wstr);

for(unsigned int c = 0, size = wstr.length(); c < size; c++){
switch(wstr[c]){
case L'>': ptr++; break;
case L'<': ptr--; break;
case L'+': test[ptr]++; break;
case L'-': test[ptr]--; break;
case L'.': std::cout << test[ptr] << std::flush; break;
case L',': break; //TODO:
case L'[': if(!test[ptr]){while(wstr[++c] != L']');} break;
case L']': if(test[ptr]){c--; while(wstr[c--] != L'[');} break;
}
}
}

477 ◆rCEzuNnL0g:2008/09/24(水) 20:15:01
うまくうごいたー。
-----
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Owner>"C:\Documents and Settings\Owner\My Documents\Vi
sual Studio 2008\Projects\test_test\Release\test_test.exe"
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++
++++++.--------.+++.------.--------.>+.
Hello, world!
C:\Documents and Settings\Owner>

478 ◆rCEzuNnL0g:2008/09/24(水) 20:36:04
BrainCrashを実装してみた。あんまり代わってない。
-----
BrainCrash
http://cfs.maxn.jp/neta/BrainCrash.php
-----
#include <iostream>
#include <string>

int main(int argc, char **argv){
static unsigned char test[10000];
register unsigned int ptr = 0;
memset(test, 0, sizeof(test));
strcpy((char *)test, "Hello, world!");

std::wstring wstr;
std::getline(std::wcin, wstr);

for(unsigned int c = 0, size = wstr.length(); c < size; c++){
switch(wstr[c]){
case L'>': ptr++; break;
case L'<': if(ptr) ptr--; break;
case L'+': test[ptr]++; break;
case L'-': test[ptr]--; break;
case L'.': std::cout << test[ptr] << std::flush; break;
case L',': break; //TODO:
case L'[': if(!test[ptr]){while(wstr[++c] != L']');} break;
case L']': if(test[ptr]){c--; while(wstr[c--] != L'[');} break;
case L'|': test[ptr + 1] |= test[ptr]; ptr++; break;
case L'&': test[ptr + 1] &= test[ptr]; ptr++; break;
case L'~': test[ptr] = ~test[ptr];
case L'^': test[ptr + 1] ^= test[ptr]; ptr++; break;
}
}

while(test[ptr]){
std::cout << test[ptr] << std::flush;
ptr++;
}
}

479 ◆rCEzuNnL0g:2008/09/24(水) 20:41:54
MemoPanelにBrainfuckの機能を実装しよう!

480 ◆rCEzuNnL0g:2008/09/24(水) 21:14:59
あ、
BrainFuckもCrashも仕様どおりじゃないじゃん。
対応した括弧まで戻らなければいけないから此れじゃあ駄目ですね。
書き直さないと。
だけれども今日は早く寝る。

481 ◆rCEzuNnL0g:2008/09/24(水) 21:33:21
戻るときに]の数を数える。[についたら一つ減算して0の時に止まる。
また逆も然りだが、そういうことか。

482 ◆rCEzuNnL0g:2008/09/24(水) 21:33:43
東方むずい><

483 ◆rCEzuNnL0g:2008/09/25(木) 21:44:13
完全な実装にした。ついでにoperator[]は使わないようにした。
-----
#include <iostream>
#include <string>

int main(int argc, char **argv){
std::wstring wstr;
std::getline(std::wcin, wstr);
static unsigned char data[100000];
memset(data, 0, sizeof(data));
const wchar_t *pstr = wstr.c_str();
unsigned int ptr = 0, c = 0;
unsigned int length = wstr.length();

for(; c < length; c++){
switch(pstr[c]){
case L'>': ptr++; break;
case L'<': if(ptr) ptr--; break;
case L'+': data[ptr]++; break;
case L'-': data[ptr]--; break;
case L'.': std::cout << data[ptr] << std::flush; break;
case L'[':
if(!data[ptr]){
unsigned int m = 0;
while(1){
switch(pstr[++c]){
case L'[': m++; break;
case L']': if(!m--) goto out1;
}
}
out1:;
} break;
case L']':
if(data[ptr]){
unsigned int m = 0;
while(1){
switch(pstr[--c]){
case L'[': if(!m--) goto out2;
case L']': m++; break;
}
}
out2:;
} break;
case L',': break; //TODO:
}
}
}

484 ◆rCEzuNnL0g:2008/09/25(木) 22:35:31
あれ。
とまるしwwwwww

485 ◆rCEzuNnL0g:2008/09/26(金) 21:51:30
兄からデバッグを頼まれたのだが、全く分からん。
ちゃんとHTMLには反映されているのだが・・・

486 ◆rCEzuNnL0g:2008/09/26(金) 23:09:27
yui.innerHTML = yui.innerHTML;
とやると、ちゃんと表示された!

これはバグなのか・・・

487 ◆rCEzuNnL0g:2008/09/27(土) 16:07:44
他の実行ファイルに感染するEXEファイルでも作ってみようかと勝手に思っている。
取り敢えず、NASMの使い方を勉強する。多分。
でも眠いから今は寝る。

488 ◆rCEzuNnL0g:2008/09/27(土) 18:12:46
えっと、
寝るといってOS自作入門を読んで、逆に眠気が増えた。
でも作るのも面白そう。
ソース上での最適化の技術も面白いし、なんだかアセンブリ言語が書きたくなる本である。
取り敢えず、全部読み終わったので、CDを使ってそのOSで遊びたい。

それにしても
gccとかNASMとか勉強したい。
ついでにコマンドラインも本格的に使えるようになりたい。
Linuxコマンドもね。

489 ◆rCEzuNnL0g:2008/09/27(土) 23:27:19
Linuxコマンド
http://cyberam.dip.jp/linux_command/command/com_main.html
viを使い倒そう
http://www.linux.or.jp/JF/JFdocs/vi-user-usage.html

490 ◆rCEzuNnL0g:2008/09/28(日) 14:18:47
#include <iostream>
#include <string>
#include <sstream>

bool Brainfuck(std::basic_istream<wchar_t> &s, std::basic_ostream<char> &out, std::basic_istream<char> &in){
std::wstring wstr;
s >> wstr;

static unsigned char data[100000];
memset(data, 0, sizeof(data));
const wchar_t *pstr = wstr.c_str();
unsigned int ptr = 0, c = 0;
unsigned int length = wstr.length();

for(; c < length; c++){
switch(pstr[c]){
case L'>': ptr++; break;
case L'<': if(ptr) ptr--; break;
case L'+': data[ptr]++; break;
case L'-': data[ptr]--; break;
case L'.': out << data[ptr] << std::flush; break;
case L'[':
if(!data[ptr]){
unsigned int m = 0;
while(1){
switch(pstr[++c]){
case L'[': m++; break;
case L']': if(!m--) goto out1;
}
}
out1:;
} break;
case L']':
if(data[ptr]){
unsigned int m = 0;
while(1){
switch(pstr[--c]){
case L'[': if(!m--) goto out2;
case L']': m++; break;
}
}
out2:;
} break;
case L',': break; //TODO:
}
}

return true;
}

int main(int argc, char **argv){
std::wstring wstr;
while(1){
std::wstring buff;
std::getline(std::wcin, buff);
if(buff == L"end") break;
wstr += buff;
}
std::basic_istringstream<wchar_t> buff(wstr);
Brainfuck(buff, std::cout, std::cin);
}

491774さん:2008/09/28(日) 15:58:37
CreateProcess 関数
http://msdn.microsoft.com/ja-jp/library/cc429066.aspx
---
>>CreateProcess 関数は、新しいプログラムを実行するために使います。WinExec 関数や LoadModule 関数も利用できますが、これらは内部で CreateProcess 関数を呼び出す形で実装されています。
-----
な、なんだってー!

492774さん:2008/09/28(日) 16:02:40
あ。
LoadModuleとLoadLibraryを間違えていたwwww

493774さん:2008/09/28(日) 16:51:19
exit関数は内部でExitProcessを読み出しているんだなあ。
予想通り過ぎてつまらない。

494774さん:2008/09/28(日) 17:14:41
ホワイトハッカー道場:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070927/283156/?ST=csirt

495774さん:2008/09/30(火) 20:28:06 ID:CENbthlg0
本当の最近のSleipnirの更新はしょぼいので、もうちょっと頑張ってほしい。
ユーザーが楽しくない。

496774さん:2008/10/02(木) 19:40:12 ID:CENbthlg0
RFC1321のソース読んでた。
分からん。

497774さん:2008/10/02(木) 19:59:12 ID:CENbthlg0
なるほど。
MDInit

MD_CTX context;
を初期化。
MDUpdate (&context, buffer, len);
で、contextを更新。
で内部では、必要な分contextの中に溜まったら、実際に演算を行う。
それよりも少なかったら、バッファに溜める。
変換する文字列はbufferに、lenにはその長さ。
文字列とは限らないので、必要なのである。
で、最後に
MDFinal (digest, &context);
として、バッファに溜まった分と、その他の処理を行って、結果を(ここでは)digestに格納していると。
おおすげえ、此れならばワーキングメモリーはほぼバッファの分だけ。
他には今までに処理を行った文字数(64bitとMD5で決められている)の分だけであるw
すごい。此れがプロの犯行という奴か。

498774さん:2008/10/02(木) 20:21:09 ID:CENbthlg0
と、言うことで、此れを参考にしながら書いてみる。
まあ、殆どそのままコピペになりそうだけれどもw

499774さん:2008/10/02(木) 20:28:04 ID:CENbthlg0
おお、すげえええええ。
ちゃんとrol命令に最適化されている・・・

500774さん:2008/10/02(木) 20:43:14 ID:CENbthlg0
やっぱり時間があったときにしよう・・・

501774さん:2008/10/02(木) 21:35:06 ID:CENbthlg0
Amazon.co.jp: 実例で学ぶゲーム3D数学: Fletcher Dunn, Ian Parberry, 松田 晃一: 本
http://www.amazon.co.jp/exec/obidos/ASIN/4873113776/

502774さん:2008/10/02(木) 21:38:46 ID:CENbthlg0
map、filterなどを使う時の便利な関数(__noSuchMethod__) - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20081002/1222940338
----
bind

503774さん:2008/10/02(木) 21:40:04 ID:CENbthlg0
明後日ぐらいにはWizerd Bibleでるかな。

504774さん:2008/10/02(木) 21:40:40 ID:CENbthlg0
Wizard Bibleだた。。。

505774さん:2008/10/02(木) 23:41:43 ID:CENbthlg0
こんな風にすれば、百分の一度(degree)刻みで、sin/cosを
1/2^32の精度で得られるねえと。
-----
#include <iostream>
#include <cmath>

#define PI 3.141592653589793238462643383279

int main(int argc, char **argv){
unsigned int sinm[9000] = {0};
for(int i = 0; i < 9000; ++i){
sinm[i] = (int)(sin(((double)i / 100) / 180 * PI) * 0xFFFFFFFF);
}

unsigned int cosm[9000] = {0};
for(int i = 0; i < 9000; ++i){
cosm[i] = (unsigned int)(cos(((double)i / 100) / 180 * PI) * 0xFFFFFFFF);
}
}

506774さん:2008/10/02(木) 23:49:09 ID:CENbthlg0
少なくとも10^-9ぐらいの精度はあるようだ。
間違いなくこんな精密である必要性は無い。
こっちのソースの方が更にいいかな
-----
#include <iostream>
#include <cmath>

#define PI 3.141592653589793238462643383279

int main(int argc, char **argv){
unsigned int sinm[9000] = {0};
for(int i = 0; i < 9000; ++i){
sinm[i] = (unsigned int)(sin(((double)i / 100) / 180 * PI) * 0xFFFFFFFFU);
}

unsigned int cosm[9000] = {0};
for(int i = 0; i < 9000; ++i){
cosm[i] = (unsigned int)(cos(((double)i / 100) / 180 * PI) * 0xFFFFFFFFU);
}
}

507774さん:2008/10/02(木) 23:51:29 ID:CENbthlg0
こっちだと1/2^64の精度。
だけれども、ここまで行くとlong doubleの精度が追いついてない。
-----
#include <iostream>
#include <cmath>

#define PI 3.141592653589793238462643383279

int main(int argc, char **argv){
unsigned __int64 sinm[9000] = {0};
for(int i = 0; i < 9000; ++i){
sinm[i] = (unsigned __int64)(sin(((long double)i / 100) / 180 * PI) * 0xFFFFFFFFFFFFFFFFU);
}

unsigned __int64 cosm[9000] = {0};
for(int i = 0; i < 9000; ++i){
cosm[i] = (unsigned __int64)(cos(((long double)i / 100) / 180 * PI) * 0xFFFFFFFFFFFFFFFFU);
}
}

508774さん:2008/10/02(木) 23:53:33 ID:CENbthlg0
理論上10^-19ぐらいの精度があるようです。
どんな綿密なゲーム作る気だよwwwww

509774さん:2008/10/02(木) 23:56:11 ID:CENbthlg0
C++でシューティングゲーム、特に綺麗に弾を動かしたいんだったら、
起動時点の初期化ルーチンでarctanのマップを作っておいたほうが良いかもしれない。
sin/cosも良く使うから、それもあったほうが良いかもしれない。
tanは要らないと思う。

510774さん:2008/10/03(金) 00:02:02 ID:CENbthlg0
それと、普通に幾何学の中学ぐらいまでの知識は必須らしい。
まあ、三平方とか押さえておけば良いかと。
俺が思うに、全ての座標は2^16しておくと良いと思う。
だけれども出力の度に2^-16は手間かなあ・・・
だけれどもdoubleとかそのままで計算するよりかは早いと思うからお勧め。
二乗しても多分オーバーフローはしないと思う。

511774さん:2008/10/03(金) 00:04:31 ID:CENbthlg0
と、思ったら普通にしやがる。
まあ、2^5倍でも0.05以上の精度があるから、大丈夫だと思うけれども。
此れならば800px画面とってもオーバーフローしないね!

512774さん:2008/10/03(金) 00:11:09 ID:CENbthlg0
二乗するのは何故かって?
円形の当たり判定を持つ弾と自分の当たり判定には、ピタゴラスの定理しかないだろ。
ということです。
if(x^2 + y^2 < (自機の半径 + 弾の半径)^2){当たった!}
かな。
だけれどもx^2+y^2はオーバーフローするかもしれないので、右辺に移項したほうが良いかも。
もっと良い判別方法もあるのかな?
まあ、それより前に、かすり判定もしなきゃいけないけれども、右辺に適当な値を足せば良いと思う。

513774さん:2008/10/03(金) 17:56:45 ID:CENbthlg0
JavaScript と SVG で swf ファイルを再生する JSplash が凄すぎる件について - IT戦記
http://d.hatena.ne.jp/amachang/20081003/1223006976
-----
すげーなー。すげーなー。

514774さん:2008/10/03(金) 23:19:05 ID:CENbthlg0
どうでもいいけれども、
Cだったら何も起きないだろうと思うことでも、C++やJavaScript+DOMだったらあったりする。
それが仕様というものだ。

515774さん:2008/10/03(金) 23:22:55 ID:CENbthlg0
C++は、演算子のオーバーロードが可能である。
だから、
Class c;
c = c;
とか言う代入でも、副作用が発生する可能性がある。
JavaScript+DOMだったら、
a.href = a.href;
というのが、とても意味がある場合がある。
まあ、ここまで来ると、ハックというレベルになるのだろうw

516774さん:2008/10/03(金) 23:43:24 ID:CENbthlg0
今日のJOI:JOI2006年模擬試験1 問題1@C++(88) - 簡潔で覚えやすいタイトルを3秒で思いつく程度の能力
http://d.hatena.ne.jp/qnighy/20081003/1223038024
今日のJOI:JOI2006年模擬試験1 問題2@C++(87) - 簡潔で覚えやすいタイトルを3秒で思いつく程度の能力
http://d.hatena.ne.jp/qnighy/20081003/1223039382
今日のJOI:JOI2006年模擬試験1 問題3@C++(86) - 簡潔で覚えやすいタイトルを3秒で思いつく程度の能力
http://d.hatena.ne.jp/qnighy/20081003/1223041517

517774さん:2008/10/03(金) 23:54:51 ID:CENbthlg0
バーコードと二次元コードの知識
http://www.phoenix-denshi.co.jp/page/series.htm

518774さん:2008/10/03(金) 23:56:03 ID:CENbthlg0
QRコード - Wikipedia
http://ja.wikipedia.org/wiki/QR%E3%82%B3%E3%83%BC%E3%83%89

519774さん:2008/10/03(金) 23:58:19 ID:CENbthlg0
日本工業標準調査会:データベース-JIS詳細表示
http://www.jisc.go.jp/app/pager?id=110947
-----
QRコードの規格

520774さん:2008/10/04(土) 00:00:02 ID:CENbthlg0
>誤り訂正レベル (Error Correction Level)
>QRコードに汚れなどがあっても正確に読み取れるように、読み取り不能や読み取り間違いのモジュールを 修正するために付けられる誤り訂正語のデータ語に対する割合。下記の4レベルがある。
> レベルL - コード語の約7%が復元可能
> レベルM - コード語の約15%が復元可能
> レベルQ - コード語の約25%が復元可能
> レベルH - コード語の約30%が復元可能
レベルを高くして、適当なロゴマークとかを入れればQRコードにロゴマークが入れれるね。

521774さん:2008/10/04(土) 00:01:59 ID:CENbthlg0
携帯で確実に読み込めるのは、バージョン10までらしい。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板