トリッキーなコード
レス数が1000を超えています。これ以上書き込みはできません。
00011
NGNG大体トリッキーなコードを書く奴に限って
致命的なバグを出したりするんだけど、
書きたいもんはしょうがない。
00021
NGNG#define swap(a,b) a^=b^=a^=b
0003デフォルトの名無しさん
NGNGすげー! あ、いやまじで。メモッとこ
0004デフォルトの名無しさん
NGNG00051
NGNGそれと、以下のようなコードに注意
int a=9;
swap(a,a);
ASSERT(a==0);
0006デフォルトの名無しさん
NGNGif(!A) B; の代わりにA||B
0007デフォルトの名無しさん
NGNGPerlだと普通じゃない?
0008デフォルトの名無しさん
NGNGBは条件判断文じゃなくて
実行したい関数とか命令であることに注意
うちの会社でそんなコード書いたら書き直しだな
0009デフォルトの名無しさん
NGNGやっぱA or Bでしょう。
open(IN, "hoge.dat") or die;
日本語訳「hoge.datを開け、さもなくば逝ってよし」
00118
NGNGごめん宇津だし脳
0012デフォルトの名無しさん
NGNGASSERTの使い方については、
『Writing Solid Code』という本を読むといいよ。
001310
NGNGえーとswap(a,a)だとaが0になっちゃうってこと?
でaが0なもんでエラーになっちゃうってこと?
ちょっと実験してみます。
http://www.microsoft.com/japan/developer/library/vccore/_core_the_assert_macro.htm
とかですか? 他の言語でもきっと大差ないよね?
001413
NGNGswap(a,a)のように本マクロで同一変数を使用した場合、
a^a の結果が a に代入されるため、結果 a==0 になってしまう
Cって奥が深いぴょん
0015デフォルトの名無しさん
NGNG#define bitchack(a,b) (a>>b)&1
aのb番目(0〜)のbitが勃っていたら1、勃っていなかったら0
0016デフォルトの名無しさん
NGNG>>15
001715
NGNGbitcheckぴょん
ついでに出てきた駄作ぴょん
#define bitset(a,b) a|=(1<<b)
#define bitreset(a,b) a&=~(1<<b)
代入したくなかったら=を捨てるぴょん
00181
NGNG最近書いたもっともトリッキーなコードはswitch文かな。
default以外の各case毎に同じ2〜3行の処理をさせたいが、
だからといって関数を作るほどではない。
そういうときにあなたならどうする?ちょっと考えてみそ
一番あり得そうなのは、
switch(c)
{
case 0:
case 1:
switch(c)
{
case 0:
/*0*/
break;
case 1:
/*1*/
break;
}
/*0,1*/
....;
break;
default:
/*others*/
break;
}
これを綺麗に書くにはどうすれば?
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNGresult =
(n == 0 ? 0処理 :
n == 1 ? 1処理 :
n == 2 ? 2処理 :
デフォルト処理)
ってやつ。
見やすいけど条件文に不慣れな人には理解しにくいかも。
00211
NGNGあ、なるほど
?:の優先順位のバグがちょっと気になるけど、
簡単なswitchを書くならこちらの方が見やすいかもね。
効率が悪くなるのが残念だけど。
0022デフォルトの名無しさん
NGNGコンパイラの最適化を信じなさい(笑)
0023デフォルトの名無しさん
NGNGキボーンは、こんな感じでちゅか。
switch(c) {
case 0:
/* 0 */
....;
if (0)
case 1:
/* 1 */
....;
/* 0,1 */
....;
break;
default:
/* others */
break;
}
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNGいいから、なんか出せ!
0027デフォルトの名無しさん
NGNGFORTRANで、いかに短い行数(=パンチカードの枚数)で、万年カレンダー等の
プログラムを作れるかを競ってたなぁ〜。
結構ロジック・アルゴリズムの勉強にはなったよ。
00281
NGNGexactly!だだ出来ればブロックで囲むとなお可。
>>24
25の言うとおり、厨房ぶり満載のスレッド。
1で書いたけど、実際仕事でトリッキーなコードを書く奴に
ろくな奴がいないのは承知。でも書きたいんだよ
0029デフォルトの名無しさん
NGNG00301
NGNGそれと、N88BASICで1行プログラミングとかね。
0031名無しさん@お腹いっぱい。
NGNG1 end
0032デフォルトの名無しさん
NGNG申し訳ないけどif(0)のあたりが意味不明だぴょん
誰か解説お願いだぴょん
てゆーか、今まさにそのコードを使ってみたいぴょん
・・・あ、やっぱ四の五の言わずに実験してみるぴょん
0033デフォルトの名無しさん
NGNG実験しても、理解しにくいと思いまちゅ。
gotoだと見た目にトリッキーさに欠けるから、if(0)を使ってるだけでちゅ。
使うのは、砂場のお遊びまでにしといてくだちゃい。
003424
NGNGb = (ptr != NULL)
なんて書くところを
b = !!ptr
と書くのはどう?
トリッキーでもないけど読みやすさの点から結構気に入った書き方
00351
NGNGでも結局、gotoを使ってるんだよね。
switch文ってのがつまりgotoな訳で。
>>32
正規表現のメタキャラクタのエスケープを例にあげやう。
動作を追っていって理解してくれ
for(i=0;strSrc[i]!='\0';i++)
{
switch(strSrc[i])
{
case '$':
if(strSrc[i+1]!='\0' && strSrc[i+1]!='\n') break;
if(0)
case '^':
if(i!=0 && strSrc[i-1]!='\n') break;
case '.':
case '[':
case ']':
case '|':
case '*':
case '+':
case '?':
case '(':
case ')':
result+="\\";
}
result+=strSrc[i];
}
0036デフォルトの名無しさん
NGNGうわ、面白い!!
テストしてみよ、どう動くんだろう。
俺厨房。糞コードマンセー
003724
NGNGassert(i<N && "インデックス範囲外")
アサート発動時にコメントを付加する方法
でも全然トリッキーじゃねーな
0038デフォルトの名無しさん
NGNGn = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
0039デフォルトの名無しさん
NGNGトリッキなコードも書けないヤツはもっと厨房。
0040デフォルトの名無しさん
NGNG実務においてそれらを正しく避けることができるのだ。
とか言ってみるテスト
0041デフォルトの名無しさん
NGNG画面クリアをなんとか高速にできないか?とおもいZ80のインストラクション表をみながら
これなら16bit単位で書き込めて、メモリ書き込みとアドレス更新が一発じゃんと思ったのが
LD SP,xxxx
LD BC,0
PUSH BC
アドレスがディクリメントされていくのでケツからクリアされていくが
効果はあった。
でも後で気がついた話し。
DMAとめてクリアしてDMA再起動させたほうが早かったんだよね。
004236
NGNGやっぱ、書き直しか?
つーか、上司が糞だから通りそうで嫌だな。
00431
NGNGをを、目から鱗。
既に今の時代では使えないのがなおさらトリッキーでgood!
0044デフォルトの名無しさん
NGNG>>42
0045デフォルトの名無しさん
NGNGOh! FMで似たようなコード見た気がするよ。
もちろん6809だけど。
0046デフォルトの名無しさん
NGNGごめん。Pascalだとあんまりトリッキーなのは、書かせてもらえないの(藁
00471
NGNGif(0)で次の1文がとばせるんですが、
switchのcaseで飛んできたものは実行される、という訳です。
上から順次実行してきた場合はとばされるけど、
case宛にjumpしてきたコードは実行される。
言葉にすると難しいな。やっぱ42さんお願い
0048デフォルトの名無しさん
NGNG普通に>>35でわかりやすい例が挙がってるじゃん。読めよ
0049デフォルトの名無しさん
NGNGありがとうございました。
解かりました。
if(0)を FOR文等に変えてみてもトリッキ−な事できますね。
00501
NGNGまさにそれこそトリッキーだが、動くのかな?
動いたところで実用価値が無いがそこはそれ、トリッキーであれば許可。
誰かfor文の中にgotoするテストをしてみて。
予想では、初期化は実行されないが、終了条件などはチェックされそうだな。
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNGできました。
繰り返しが0だったらIf(0)と同じ効果ですね。
0053デフォルトの名無しさん
NGNGint main[] = {VAXのマシンコード};
0054デフォルトの名無しさん
NGNGベーマガの投稿プログラムかよ(ワラ
00551
NGNGそんな事出来るの?コンパイラ依存でなくて?
実験実験。ブルースクリーン出そうだが。
005653
NGNG最近のはデータセクションにコードは置けないだろうから。
0057デフォルトの名無しさん
NGNGたぶん、エントリーポインタ書き換えればいけるよъ( ゚ー^)
00581
NGNG考えてみればそうだね。
今エントリポイントを操作して頑張ってたけど、
どうあがいてもプログラムロード即死亡。
コードセクションにデータをおければいいんだが。
0059デフォルトの名無しさん
NGNG#define "debug.c"
debug.cの中にはデバッグ用のソースが入っている。
0060デフォルトの名無しさん
NGNG#include じゃなくて?
0061デフォルトの名無しさん
NGNG#include </dev/tty>
#elsif _DOS_
#include <con>
#endif
0062デフォルトの名無しさん
NGNG#define "始まり" main
#define "終わり" return
#define "表示" printf
"整数" "始まり"()
{
"表示"("%s" , "ハローCワールド");
"終わり" 0;
}
0063デフォルトの名無しさん
NGNG0064デフォルトの名無しさん
NGNG0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNGとりあえず動きました。
環境:Win98, VC++98
0068デフォルトの名無しさん
NGNGWin2kでは無理だろ。……多分だけど。
0069デフォルトの名無しさん
NGNG知る人ぞ知る、MAZE BATTLEみたいなもんか。
0070デフォルトの名無しさん
NGNGwin2000動作確認しました。
動いた。
0071デフォルトの名無しさん
NGNGerror C2007: #define の後に識別子が必要です。
0072デフォルトの名無しさん
NGNG隣家オプション求む
0073デフォルトの名無しさん
NGNGcygwin gcc on win98se でも動いた。
main=195;
の方がかっこいいかも。
0074デフォルトの名無しさん
NGNGむ、VC++6.0のデフォでOKだと思って、
新規で作ったら通らなくなった。
でも、古いプロジェクトファイルのほうはリンク通る。
ちと調べましゅ。
お馬鹿でスマン
0075デフォルトの名無しさん
NGNG鬱だ。
0076デフォルトの名無しさん
NGNG動いちゃったぴょん
Linuxならふつーに動くッぽいぴょん
0077デフォルトの名無しさん
NGNG自己書き換えだと思うけど、誰か本格的にやってる人いない?
0078デフォルトの名無しさん
NGNG2人とも、まだまだあま〜いじょ。
0クリアするコードも含めて0クリアして、はじめて
トリッキーと言えるのっ。 もちっと考えてみそっ!
0079デフォルトの名無しさん
NGNGfunc1() {
/* ... */
}
func2() {
/* ... */
}
/*
関数のサイズは、コンパイラが出力するMAPファイルやアセンブラ出力で関数の
位置関係から算出します。
この場合、func2のアドレスとfunc1のアドレスの差を関数のサイズとみなします。
*/
typedef (*tclosure)();
#define FUNCMAXSIZE 8192;
test() {
static char closure_code[FUNCMAXSIZE];
tclosure closure;
memcopy(closure_code, func1, (size_t)(func2 - func1));
closure = (closure_code)closure_code;
closure(); /* 実行 */
}
0080デフォルトの名無しさん
NGNG何に使うの。具体例を。
if ( 用途が無い ) return 屑コード;
008179
NGNGDOSのsmallモデルとかの、実行ファイルのサイズに制限のある環境で、
擬似的にオーバレイが可能になるとか。
他に利点無かったかな・・・
0082デフォルトの名無しさん
NGNG(゜∇゜) ピョピョ
( )
⊥⊥
008379
NGNGTEXTセグメントに納まらなくなった場合とかに、アセンブラで書いて小さくする手間が省ける。
アセンブラを直接弄らない事で、ある意味移植性は高くなる。(藁
0084デフォルトの名無しさん
NGNG((用途が無い?) '屑コード)
((実用にはならないけど面白い?) 'そうだね)
(else '何かあるの?))
0085デフォルトの名無しさん
NGNGfunc2()がfunc1()よりも後ろに置かれてるという保証はあるの?
008685
NGNG0087デフォルトの名無しさん
NGNG引き算したり比較したりしてうまいことやる。
if ( func1 < func2 )
{
...
}
else
{
...
}
008879
NGNGだからー、79で
>関数のサイズは、コンパイラが出力するMAPファイルやアセンブラ出力で関数の
>位置関係から算出します。
と書いてあるだろが。
ちゃんと読んでね。
0089デフォルトの名無しさん
NGNG(a < 0 != b < 0)
…この程度常識っすかね?
009079
NGNGゲームボーイなどの携帯ゲーム機ではいまだに有効な筈・・。
0091>89
NGNG非ゼロ同士が一致するかは保障されてない筈。
でも大抵の環境で有効かな?
アセンブラ出力見ればはっきりするけど。
0092デフォルトの名無しさん
NGNG面白い=トリッキーコード≠屑コード。
"The International Obfuscated C Code Contest"なんて
どこが面白いでちゅか?
0093>91
NGNG関係演算子の値は、常に0か1だ。
009491>93
NGNGしまん
0095デフォルトの名無しさん
NGNG#if defined(_MSC_VER)
# define for if(0);else for
#endif
0096デフォルトの名無しさん
NGNGprintfをあちこちに埋め込んでデバグ用出力をよくするんだけど
#ifdef DBG_FLG
printf("hoge:a=%d",a);
#endif
などとあちこちに書くのはとても面倒。そこで、マクロで
debug_printf("hoge:a=%d",a);
などと1行ですますマーベラスなアイディア、あります?
0097デフォルトの名無しさん
NGNGいつも使ってる奴のコピペ
ほんとはdprintf((式))一個だけでも良いんだけど、
引数チェック付きprintfということで・・
#ifdef DEBUG
#define dprintf(a) printf(a)
#define dprintf0(a) printf(a)
#define dprintf1(a,b) printf(a,b)
#define dprintf2(a,b,c) printf(a,b,c)
/* ... */
/* 条件付き出力 */
#define d1printf(t, a) do { if (t) {dprintf(a);} } while (0)
#define d1printf0(t, a) do { if (t) {dprintf(a);} } while (0)
#define d1printf1(t, a,b) do { if (t) {dprintf1(a,b);} } while (0)
#define d1printf2(t, a,b,c) do { if (t) {dprintf2(a,b,c);} } while (0)
/* ... */
#else
#define dprintf(a)
#define dprintf0(a)
#define dprintf1(a,b)
#define dprintf2(a,b,c)
/* ... */
#define d1printf(t, a)
#define d1printf0(t, a)
#define d1printf1(t, a,b)
#define d1printf2(t, a,b,c)
/* ... */
#endif
0098>96
NGNG#ifdef DEBUG
#define debug_printf printf
#else
#define debug_printf 1 ? (void) 0 : printf
#endif
009996
NGNGやはり、printfの引数の数が鬼門ですね・・・
引数の数にあわせてdefineを代えるのも面倒(ごめんなさい)。
ここをトリックで切り抜ける方法がなんかないもんでしょかね。
010097>99
NGNGdprintf(("p:%lx ->n:%lx\n", (long)p, (long)n));
010297>98
NGNG実行されないコードがコンパイラによって削除されるかが鍵だなー。
010397
NGNG0105デフォルトの名無しさん
NGNGCよちよちの初心者です。お世話になります。
#define d1printf(t, a)
上の','とaの間にある半角スペースは、ある種のトリックでしょうか。
「コピペ」の言葉が、ちょっと気になったものですから・・・。
010697>105
NGNGみたまんまのマクロです。
0107デフォルトの名無しさん
NGNG0108襴様
NGNG定説です。
0110外付けSCSI
NGNG#define DB(x)
#else
#define DB(x) x
0111デフォルトの名無しさん
NGNGうわーかっこいい!サイコーだぴょん。
ん?・・・ちょっと待つぴょん
#ifdef DEBUG
#define debug
#else
#define debug 1?(void)0:
#endif
とすると、printfだけじゃななくてもどんな関数
(一時的なロギング関数とか)でもオッケーだぴょん。
こんな感じだぴょん
debug hoge();
0112デフォルトの名無しさん
NGNG110さんのが、トリックを使わずに、可読性・汎用性も高く
副作用も少ない、すばらしい書き方の見本ではないのかな。
トリックをすべて否定している訳では無いよ。
0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNG括弧つけるのが面倒だぴょん
生意気言ってごめんだぴょん
0115デフォルトの名無しさん
NGNGデバッグ用のコードがシンプルでなければ・・・、
デバッグ用のコードのデバッグをやるはめになる恐れがある。
まーふぃー(嘘)
0116デフォルトの名無しさん
NGNGchar* GetHogehogeFilename()
{
static char filename[_MAX_PATH + 1];
.....(hoge hoge).....
return filename;
}
0117デフォルトの名無しさん
NGNGこれはトリックというのか?
リエントラントでないのでsage
0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG> リエントラントでないのでsage
うむ。でも便利。Windowsだと怖いが。
0120デフォルトの名無しさん
NGNGどんなOSだろうと使い方間違えればすぐにバグの原因になるコードだと
思うけど。
0121デフォルトの名無しさん
NGNGWindowsだと、いつリエントラントが要求されるようになるか
わからん。
DOSでリエントラントが要求されるケースはかなり特殊。
0122デフォルトの名無しさん
NGNGchar *a,*b;
a = GetHogeHogeFileName();
b = GetHogeHogeFileName();
fp = fopen(a,"r");
で動作保証されないよね?
使い方に注意する必要があるというのはそういうことです。
0123デフォルトの名無しさん
NGNG中身の保証が出来なくなってアウトってことだろ。
でもそれだけなら他のOSでも言える事だと思うけど・・・Windowsでは
何か違うの?
0124デフォルトの名無しさん
NGNG昔のstrtokとかいうのも、そんな実装じゃなかったっけ?
0125デフォルトの名無しさん
NGNGどなたか教えてください。
>>98さんの
#define debug_printf 1 ? (void) 0 : printf
>>111さんの
#define debug 1?(void)0:
の行と、
#define debug
の違いを詳しく。
0126125
NGNG#define debug
の違いを詳しく。
↓
#define debug_printf
#define debug
の違いを詳しく。
0127デフォルトの名無しさん
NGNG0129デフォルトの名無しさん
NGNG0130デフォルトの名無しさん
NGNGb=( a>0 ? 3 : 0 );
たとえばこれ、分かりますか?
多分Cの本には載ってるぴょん
0131125
NGNGそれはわかります。
Cの本で"プリプロセッサ”の章も調べた上でお聞きしているのです。
例えば、その本の中で、
グローバル変数の実体宣言と外部宣言のマクロを使った説明があるのですが、
(以下、引用)
#ifdef GLOBAL_VALUE_DEFINE
#define GLOBAL
#else
#define GLOBAL extern
#endif
でマクロ定義して、GLOBAL_VALUE_DEFINEの定義/未定義によって、
GLOBALの置換文字列を空文字列またはexternにします。(以下、略)
つまり、上記での「空文字列」のやり方と何が違うのかと。お願い致します。
0133デフォルトの名無しさん
NGNGあんまり変わらないぴょん
なんであんなふうになってるかというと
printfには引数があるからだぴょん
0136デフォルトの名無しさん
NGNG"//"自体が#define行のコメント子になっちゃうでしょ。
0138125
NGNGこれなら、どぉ?
#ifdef DEBUG
#define debug
#else
#define debug /##/
#endif
0139125
NGNG0140デフォルトの名無しさん
NGNG0141フォルトの名無しさん
NGNGVC++6.0ならこれでOKみたい。
#ifdef DEBUG
#define debug_printf printf
#else
#define debug_printf
#endif
0142>141
NGNGただし引数が評価されるために副作用があるけどな。
0143>138
NGNGこのようなコードでも、君の書いた通りには動くことだし。
if (...)
debug ...;
...;
0144デフォルトの名無しさん
NGNGbccでは
「エラー E2468 : void 型の値は許されない」
となってコンパイルが通りません。
なぜにああいう形にする必要があるのか知りたいです。
(だいたい、A?B:Cは BとCが同じ型の必要があると思うのだが・・・)
debug_printfの引数部分に副作用があるものがあるときには
>>141 のほうが評価されて正しい結果になると思います。
まあ、もしdebug_printfの返り値を使用していたり、
debug_printfの引数の評価順に依存した副作用とかがあると
141のやつでもだめだとは思いますが・・・
>>140
理由は良くわかりませんが、厳しいですね。。。
>>142
引数評価されたほうが、debug版との動作の差がなくなると思うのだが・・・
(なんの副作用もなければ最適化で消えると思うし)
0145デフォルトの名無しさん
NGNG#define debug
#else
#define debug 1? 0:
#endif
gccで問題なく実行できたぴょん
0146デフォルトの名無しさん
NGNG失敗は成功のおっぱいだぴょん
0147デフォルトの名無しさん
NGNGhttp://www.flipcode.com/cgi-bin/msg.cgi?showThread=Tip-MSVCFor&forum=totd&id=-1
0148デフォルトの名無しさん
NGNGトライアンドエラーもよいけど、
たまには言語の仕様とか勉強して
理論的にプログラム書こうね!
0149デフォルトの名無しさん
NGNGfor ( i = 0; ... )
{
}
と書けるようにするテクニックを紹介してるみたいだ。
0150デフォルトの名無しさん
NGNGfor (int i = 0; ...) でしょ.
Watcom もこれできないんだよな−
0151138>143
NGNG#ifdef DEBUG
#define debug
#else
#define debug if(0)
#endif
>>140
なんかすごいの出してくれたら、そうします。
0152デフォルトの名無しさん
NGNGすばらしいぴょん
それが正道っぽいぴょん
いつのまにかそんなにトリッキーじゃなくなってるぴょん・・・
0154デフォルトの名無しさん
NGNGなんだ、まだやってたのか。
この場合は三項演算子を使うのが定石であって、
それ以外の解は存在しないんだって。
151ではこれが正しく動かないだろ?
if (...)
debug printf(...);
else
...
0158デフォルトの名無しさん
NGNG#define debug if(1) ; else
0159151
NGNGまだ煮え切らないので。
if-else のネストだけが問題なら、
#define debug while(0)
で、だめ?
0160デフォルトの名無しさん
NGNGmoe ? printf("ハァハァ") : debug printf("逝ってよし!");
だめだめ。
0161デフォルトの名無しさん
NGNGdebug printf("ヽ(´ー`)ノ") , debug printf("やっぱり氏のう");
だめだめ。
0162!151
NGNG#define debug_printf 0 && printf
でどう?
0163デフォルトの名無しさん
NGNG0165151
NGNG#ifdef DEBUG
#define debug
#else
#define debug 0 &&
#endif
0167151
NGNGそれで、MS-DOS6.2 + TurboC 2.0 で検証しました。
>>143,>>154,>>160-161,>>163 は全てOKでした。
それより、
3項演算子を使うやり方で、>>163のパターンを検証すると、
#define DEBUG
#ifdef DEBUG
#define debug
#else
#define debug 1 ? (void)0 :
#endif
int i;
i = 1 + debug 3; /* error ! */
と書くと、/* error ! */の所で、コンパイラがエラーを返すんですけど・・・。
"Not an allowed type in function main"ってメッセージです。
環境のせいでしょうか。
0168151
NGNG上記、#define DEBUG の記述をコメントアウトしたときに、
コンパイラがエラーを返します。 ごめんなさい。
0169デフォルトの名無しさん
NGNG01701
NGNG仕方ないので新しいネタ。
自分自身をファイルなどで読み込むことなく、
自分自身を表示するプログラムを書いてみそ。
ちなみに「可能です」。
わからない人は下の答え(たぶんすぐ誰かが書くだろう)を見ないで、
しばらく考えてみてはどうでしょう。面白い(かもしれない)よ
ちなみにN88BASICなら
10 LIST
ですね。
01711
NGNG#include "hoge.h"
--hoge.h
int main(void){printf("#include \"hoge.h\"");return 0;}
こういうのはやめてね(涙)。
0172151
NGNG151は、これをもちまして永遠に2chから去ることとなりました。
ご迷惑をおかけしました皆様方には、お詫び申し上げます。さようなら。
0173デフォルトの名無しさん
NGNG> 10 LIST
system .... cat .... "What?" .... finish->face
0174好評なのに絶版
NGNG0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNG0177好評なのに絶版
NGNGこれって何か役に立つの?
取り立ててすごいわけでもなく、毒にも薬にもならない。
たとえば、自分の中の関数名一覧をとりだせちゃうとか、
そういうのだったらいろいろ応用(?)も効くと思う。
0178デフォルトの名無しさん
NGNGネタが高度すぎてだれも付いてこられないもよん。
0179デフォルトの名無しさん
NGNG子プロセスでシェルを起動して、ソースファイルを
typeとかcatに渡すってのは?
0180デフォルトの名無しさん
NGNGファイルを読んじゃ駄目ってんだから、たぶん反則だとおもうぴょん
01811
NGNG高度なパズルで、トリッキーなコードとは無関係だったからかも。
昔ソースコードに感染するウィルスを考えていたときに作ったんだけどね。
>>179
180さんの言われるとおり反則ですね〜。頑張って下さい。
0182デフォルトの名無しさん
NGNG0183デフォルトの名無しさん
NGNG昔、FORTRANですごいの見たことあるんだけど思い出せない。
0184デフォルトの名無しさん
NGNG{
func(...);
}
というような関数は実装できますか?
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNGだいたい出来るぴょん
0187デフォルトの名無しさん
NGNG関数ポインタ使え!
0188デフォルトの名無しさん
NGNGvoid mick( int a )
{ printf("%d\n",a); }
void jack( void b() ,int a)
{ b(a); }
main()
{ jack( mick, 8 ); }
もっとかっこよく実装できるはずだがそこは諸兄に任せるぴょん
01891
NGNG関数を引数に渡したくなったことはないけど、
もしかしたら綺麗にプログラミングするときに便利かもね
>>183
とりあえず文字コード(0x22とか)に頼らなくても作れます。
現在printfを使わないでやるのに挑戦中です。
(要するにcoutなどを使ってみる)
0190デフォルトの名無しさん
NGNG>関数を引数に渡したくなったことはないけど
基本的に関数に引渡す値は、構造体に入れておけば
引数を渡しまわせるので、実地においてその辺りで
悩むケースは稀だと思うぴょん
0192デフォルトの名無しさん
NGNG引数を渡すパターンも>>188で示してるつもりだぴょん
でも可変引数はこのパターンだと確かにちょっときついぴょん
トリッキーでも美しくもないのでsageるぴょん
0193デフォルトの名無しさん
NGNG>自分自身をファイルなどで読み込むことなく、
>10 LIST
ワラタヨ! イイカラスーパートリッキナコタエダシテミセロ サイテンシテヤッカラ
0194デフォルトの名無しさん
NGNG#define X(x) #x
char x[]=X(main(){puts(X(#define X(x) #x));printf(X(char x[]=)X(X(%s);),x);printf(X(%s),x);});main(){puts(X(#define X(x) #x));printf(X(char x[]=)X(X(%s);),x);printf(X(%s),x);}
0195デフォルトの名無しさん
NGNG#define X(x) #x
char x[]=X(main(){puts(X(#define X(x) #x));printf(X(char x[]=X(%s);%s),x,x);});main(){puts(X(#define X(x) #x));printf(X(char x[]=X(%s);%s),x,x);}
0196デフォルトの名無しさん
NGNGデタウンコ、マタコンパイルシテミタノカー
ウンコノゲンリョウト、コンペアシテミタノカー
..... < 10 LIST
0197デフォルトの名無しさん
NGNGイイカラ、ハヤクコタエダシテミセロ
0198Ken
NGNGhttp://www.acm.org/classics/sep95/
の Stage I なんか、どうだい?
0199デフォルトの名無しさん
NGNGヘイ!ケン ソンナノココニカクト スキールヨリモラールガオチール
02001
NGNGなるほど、文字列化演算子を使う方法ですか。思いつかなかった。
#xはコンパイラによってはサポートされていないんだけど、
ほとんどのコンパイラでコンパイルできるし、これくらいは可でしょう。
>>197
答えですか。そんじゃ文字コードに依存しない物を
int main(){char c='"',*text="int main(){char c='%c',*text=%c%s%c;printf(text,c,c,text,c);return 0;}";printf(text,c,c,text,c);return 0;}
0201デフォルトの名無しさん
NGNGイイヨ リカイシヤスイ イイコタエ
モスコシ トリッキナモンダイ ダシテクレ
02021
NGNG問題考えるの簡単じゃないんだよ。
もう少し引っ張れると良かったんですが。
アセンブラレベルとかだったらトリッキーなコード多そうだけど、
ついてこれない人が大部分だろうし。
ちょっと考えてみます。誰かネタふって(笑)
c=a++ + + + + + ++a;
02031
NGNGビット数を求める最短のプログラムを書け、ってのはどうでしょう。
32bitの問題として、例えば5ならビット数は2(0101)って感じです。
あ〜ちなみにこのスレッドは
「こんなトリッキーなコードを書いたよ」
とか、
「この冗長なコードをトリッキーに出来ないかな」
とか、そういった話題も大歓迎です。
本来はそっちが目的だったし。
0204デフォルトの名無しさん
NGNGSPMDプログラミングモデルで他ノードに対して関数呼び出しさせるときとか。
あ、クラスタなどでの並列プログラミングの話ね。
0205デフォルトの名無しさん
NGNGワルイコトシタ... スマンナ ジカンガ アレバ キョウリョクスル
c=a++ + + + + + ++a;
maximal munch ノ モンダイダナ
...ト コタエテシマウト マタワルイノデ オイトク
0207デフォルトの名無しさん
NGNGビット数って立っているビットの数? それとも任意の数を表すのに必要なビット数?
とりあえず両方出しておくよ。
int b; // 答えのビット数
DWORD d; // 入力データ
//立っているビットの数を求める(dが例えば5ならbに2を格納)
for(b=32;(int)d>=0&&b>0;b--,d=d<<1);
//任意の数を表すのに必要なビット数を求める(dが例えば5ならbに3を格納)
for(b=0;d!=0;b+=d&1,d=d>>1);
0208207
NGNG//任意の数を表すのに必要なビット数を求める(dが例えば5ならbに3を格納)
for(b=32;(int)d>=0&&b>0;b--,d=d<<1);
//立っているビットの数を求める(dが例えば5ならbに2を格納)
for(b=0;d!=0;b+=d&1,d=d>>1);
02091
NGNG立っているビットを想定していました。
言葉足らずですみません。
で、for文を使った一般的な方法だけれど、
それをトリッキーに書いてみてはどうでしょう。
有名なのに↓があります。
int numofbits(long bits)
{
bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}
これは自分で考えるとすると結構ハードだと思うのですが。
かくいう俺も独自で思いついたのはありません。
0210デフォルトの名無しさん
NGNG条件から「最短のプログラムを書け」を削除しなきゃ。
0211デフォルトの名無しさん
NGNGZ80アセンブラデ ジサツプログラムヲ ツクレ
メモリクウカンハ 0-FFFFh スベテ RAM
ソノルーチンヲ ヨブト RAMエリア スベテ 0クリア
ルーチンハ リロケータブル デアルコト
スグ コタエラレルヤツハ カクナ
Z80ナラ ニーモニックヒョウグライ ナントカナルダロ
0214デフォルトの名無しさん
NGNGz80だと00hがNOPなので全クリアでぐるぐる状態になるのですが
x86で00hって何の命令でしたっけ?
add [ebx+esi],alかな?
0215デフォルトの名無しさん
NGNG00hだけで完結する命令はないみたいね。
ちなみに add [ebx+esi],al のアセンブル結果は 00h,04h,33h
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNG16bitモードの時、[bx+si]のModR/Mが00だったので
32ビットモードだとレジスタに'e'が付くだけだと思い込んでました
鬱だ
02181
NGNGeaxとesiが0だったら、メモリを荒らすことなく
ずっとぐるぐる動き続けることができるのでは?
状況がわかりにくいので「自殺プログラム」って
何をするべきなのかわからないのですが。
0219デフォルトの名無しさん
NGNGint numofbits(unsigned int n)
{
static const int bits[] = {
0, 1, 1, 2,
(途中省略)
30, 31, 31, 32,
};
return bits[n];
}
すいません。くだんねーのでsageます。
0220デフォルトの名無しさん
NGNG自分のプログラムも含めてクリアする。つまり自殺。って事では。
>>219
一番最速!しかも、たぶん一番最小(34byte程度のテーブルなら)。
しかし、スレ趣旨から外れてるのは確かに。でもよく使うよね。
0221デフォルトの名無しさん
NGNGゴメソ。テーブルの数はまちがいじゃん。鬱・・・。
02221
NGNGいや素晴らしい、ワラタ
マジで最速ですな。
>>220
自分のプログラムをクリアするだけ?
他のアドレスもクリアするんでしょ?
自分自身を先のアドレスへコピーして、
今までの自分を0でクリアする、そういうプログラムの事なのかな?
この場合はメモリが循環していないと駄目だよね。むーん
0223デフォルトの名無しさん
NGNGint count(int a)
{
int ret=0;
for(;a;a>>=1)ret+=a&1;
return ret;
}
挑戦してみたぴょん。でももうちょっと削れそうだぴょん
0224223
NGNGでも秘密にしとくぴょん
0227デフォルトの名無しさん
NGNG気のせいか処理が長くなってる気がするぴょん
02281
NGNG最終案
do ret+=a&1;
while(a>>=1);
これだと可読性もあるし、ベストかもしれない。
テーブルもループも使わず、>>209の様な形で
かっこよくかつ短くビット数を得るトリッキーなコード
誰か考えてくれないかなぁ。
0229デフォルトの名無しさん
NGNG渋くて速くてかっこいいぴょん
で、答が落ち着いたところでデバッグしとくぴょん
int count( unsigned int a )
つーか、この時間たぶん誰も見てないぴょん・・・
0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG処理系依存の処理ってどこ?
っていうか何に対してコメントしてるの?
0232デフォルトの名無しさん
NGNGunsignedについてのコメントと思われるぴょん
右シフト時、処理系によって符号の扱いが違うかもしれない
ということ(0埋めか符号そのままか)だぴょん
unsignedにしとけば符号は関係ないので常に0埋めとなるぴょん
0233お手軽な奴をひとつ
NGNGreturn bits ? numofbits(bits / 2) + bits % 2 : 0;
}
02341
NGNGいいねぇ。いかにもfc.comp.lang.cっぽい書き方が通っぽい。
たかがbitcheckでスタックを結構喰うのが難点だけど、
読みやすくていいんじゃないでしょうか。
>>230
unsigned/signedの右シフトなら、ANSI-Cではしっかりと仕様が決まってます。
signedの場合、最上位ビットは必ずそのまま設定されるはずですよ。
0235デフォルトの名無しさん
NGNG0236デフォルトのアセンブラ屋さん
NGNG>>222
>他のアドレスもクリアするんでしょ?
Yes
>自分自身を先のアドレスへコピーして、
そんな事はしなくていいですよ。
>今までの自分を0でクリアする
一番最後にね。ヒント。
>この場合はメモリが循環していないと駄目だよね。
そう。処理中にNMI要求もない事が条件。
02371
NGNGなるほど、意外と複雑じゃ無いみたいですね。
書けないこともなさそう。98emuでも入れて、
その中で試しに書いてみようかな。
俺はx86系アセンブリをあまり書いたことがないから
トリッキーに美しく書くのは無理だろうけど。
俺はライフゲームの無限生成パターンみたいなのを
想像していて、例えば mov [next eip],code みたいに
次々と自分自身を変更するコードを考えてた。
0238デフォルトの名無しさん
NGNG>237
02391
NGNGだからPC-9801(というかdos)を想定してました。
(確かにeipという書き方で誤解を生みますね)
code/dataセグメントが分かれてしまう環境では
自殺プログラムって原理的に不可能ですよね?
自殺プログラムが作れる条件は多分
・メモリが巡回している
・全ての領域に書き込み可能
なんじゃないのかな?
0240デフォルトの名無しさん
NGNGWinだろうが別にdataセグメントにコード置いたってかまわないし
codeセグメントにwrite属性付けることも可能ですよ
0242デフォルトの名無しさん
NGNG>>209 を速くしたやつ。
02431
NGNGなるほど。同じアルゴリズムなのかな?後でチェックしてみよう。
209の可読性を失わせるなら、代入が減る分こちらの方が早いかも。
int numofbits(unsigned int bits)
{
bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
bits = (((bits >> 4) + bits) & 0x0f0f0f0f;
bits += bits >> 8;
return (bits + (bits >> 16)) & 0xff;
}
某本からの転載です
0244デフォルトの名無しさん
NGNG基本原理はおんなじっぽいぴょん
disasしたら0xaaaaaaaaとか出てきたから
割り算とかはこれらの数字を作るためのトリックっぽいぴょん
0245デフォルトの名無しさん
NGNGdo{
&nbsp;&nbsp;&nbsp;/* なんか処理する */
}while(!((終了条件) || (fputc(',', fp), 0)));
0246職人志願
NGNG#define END_B 0x102
#define STOP_C 0x103
というような定義文がたくさんあり、
stringという文字列を読み込んで
if(strcmp(string,"START")==0) hoge(START);
のようなif文を定義文の数だけずらっと並べてたんですが、
スマートに美しくコーディングできるでしょうか?
0247デフォルトの名無しさん
NGNGconstじゃなくて?
0248こういうのじゃ駄目ですか?
NGNGstruct _tbl { int id;
char* name;
} tbl[] = { {0,"START"},
{1,"END"},
{2,"STOP"},
{-1,""}};
for(int i=0;tbl[i].id != -1;i++){
if(strcmp(string,tbl[i].name)==0){
hoge(tbl[i].id)
break;
}
}
0249デフォルトの名無しさん
NGNGenumで定義しろ。enumで。
0250デフォルトの名無しさん
NGNG> constじゃなくて?
フツーでしょ。
constは、このデータはいじりません宣言でしかないだけでしょ。
定数宣言じゃないですよ。
と言うか、もしかして君、そうしてるの?
0251デフォルトの名無しさん
NGNGつか、普通は最適化で直埋めされるから速度も問題ないし…。
0252デフォルトの名無しさん
NGNG0253coder
NGNGwhile(0)
{
...
if (...) break;
...
if (...) break;
...
}
割と普通?
gotoは使わない!ってんじゃないけど、
インデント的に嫌いなもんで。
0254デフォルトの名無しさん
NGNG職人への道のりは、かなり遠く感じるぞ。
まずは言語より、考え方の勉強だな。
0255デフォルトの名無しさん
NGNGcoderさん、Pro? それともネタ?
0256coder
NGNG間違えた。
これじゃ何もしないじゃん。(苦笑)
じゃあ、こんな感じかな。
while(1) {
...
if (...)break;
...
break;
};
一応、Proです。^o^v
0257デフォルトの名無しさん
NGNGプロのcoderさんなので、お聞きします。
ネストが2重以上になった時のいい方法、教えて。
0258246
NGNGどうもすみません。
数字の部分は既に定義が決められているので
tbl[] = { {START_A,"START_A"},
{END_B,"END_B"},
{STOP_C,"STOP_C"},
としてやってみます。
>>254
すみません。精進します。
0259デフォルトの名無しさん
NGNG無限ループは危険だと思うぴょん。有限ループがいいと思うぴょん。
do{}while(0);とかはどうかぴょん。
0260coder
NGNGbreak(2);
ってやりたくなる時ですか?
基本的には2重以上にネストしないように見直しますが、
どうしても必要になったのなら、ためらいなくgotoを使います。
もしくは、ネストの内側でreturn。(←あまり薦められない)
あ、やっぱり別関数にするかな。
要するに状況に応じて対処します。(あたりまえ)
ちなみに、Proって言ってもGAME関係です。
納期・効率が優先される世界なので、一般的ではないかも。
#故に「トリッキー」に惹かれてきたわけですが。
0261デフォルトの名無しさん
NGNG全く内容のない書き込みなら、語尾だけで個性を表すことも仕方ないと
思いますが、わりと良い内容を書かれているだけに残念です。
老婆心によるお節介なので、sage。
0262coder
NGNGコードを見直してみたらそのようにやっていました。^_^;;
それで、while(0)って。。(恥&言い訳)
026379
NGNG(TurboC)
static char csetcode[] =
"\x55" /* push bp */
"\x8b\xec" /* mov bp,sp */
"\xb4\x02" /* mov ah,2 */
"\xb7\x00" /* mov bh,0 */
"\x8a\x76\x08" /* mov dh,[bp+8] */
"\x8a\x56\x06" /* mov dl,[bp+6] */
"\xcd\x10" /* int 10h */
"\x5d" /* pop bp */
"\xcb" /* retf */
/* "\xc3" */
;
typedef void (far *tcset)(int, int);
#define cset(x,y) (*(tcset)csetcode)(x,y)
/* test */
int main() {
cset(40,13);
return 0;
}
0264デフォルトの名無しさん
NGNG初心者ですが、・・・do{}while(0); は、有限ループなの?
do先に一回{}無条件実行、while(継続条件式)って思ってましたが。説明お願い。
0266デフォルトの名無しさん
NGNG回らない条件ループ。シュール。だったら、while(0)をタイプする意味はなあに?
>>261なんか無視していいよ。だってここは2chだもの みつを
0267259
NGNGwhile(0)を入れないとコンパイル通らないからだぴょん
てゆーかそもそも do{〜;}while() ってゆー構文だし、
一度だけ回るループとか思ってほしいぴょん
0268デフォルトの名無しさん
NGNG0269SAGE
NGNG…という突っ込みは無しですか?(^^;)
0270デフォルトの名無しさん
NGNGアセンブラの出力でも見れば?
0271デフォルトの名無しさん
NGNG{
case 0:
return TRUE;
break;
case 1:
return FALSE;
break;
}
return する場合でも break を入れる律儀な俺。
break 入れてる?
スレ違い?
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGこういうのってfar呼出しになるからDOSだと効率悪いね。
特にポインタ渡すような関数は。
コードをheapにコピーして置けばnearで呼べるかな?
0274デフォルトの名無しさん
NGNG素直にインラインアセンブラ使えばいいんでないの?
0275デフォルトの名無しさん
NGNGあと実行時に変更ができる?
まあ、inline-asmでもできるか。
0276デフォルトの名無しさん
NGNGbool f = false ;
:
if(pushed)
foo = !foo ;
:
マジでこれ仕事で使っていたが上司に「鳥キーな事してるね」
いわれたアル. フツーあるよね!?
02771
NGNG>>259
do{/*...*/}while(0);は覚えておきます。
俺知らなかったよ、内容あるじゃん(笑)>>261
>>246
コンパイラ依存だけれど、
#define HOGE(x) if(strcmp(string,#x)==0) hoge(x)
と定義して、
HOGE(START);
などとやれば、見た目はすっきりします。
しかし俺ならばstd::mapなどを使って書くだろうけど。
>>250
C++ではあまり普通ではないようですよ。
constで定義すると、コンパイラに正確に最適化される上に
型チェックも行えるので、最近はconstが主流です。
しかし、
#define XXX_xxx1 0x1
#define XXX_xxx1 0x2
#define XXX_xxx1 0x4
...
などとやる場合はdefineの方が素直です。
ここでconst、enumを使うのは邪道でしょうね。
02781
NGNGdataセクションに実行付加が付く可能性が高いので、
最近では危険でしょうね。TurboCでは大丈夫だと思うけど。
>>276
多分普通だと思います。boolでなくintの場合は
a=1-a;とやるのがgoodでしょう。ぱっと思いつきにくいよね。
>>277
自己レス。
#define XXX_xxx1 0x1
#define XXX_xxx2 0x2
#define XXX_xxx3 0x4
ですね
02791
NGNGスレと直接の関連が無いのでsageますが……
1:unionの効果的な使用法
昔は(PC98の)VRAMをint配列とunionしたりして
そこそこ意味があったけれど、最近は効果的な
使用法がいまいち思いつきません。例えば、
struct label{char tag[4];char dummy;char data[15];}
union{char raw[20];struct label x} abc;
などとやって、abc.rawに"SOME USAGE"を代入、とかかな?
2:protectedの継承の意味
C++での話です。動作はわかるんですが、どういう意味があるのか
どういう場面で使うのかさっぱりわかりません。
protectedを効率的に使ういい場面を知っている人は教えてください。
0280デフォルトの名無しさん
NGNGほとんどだから、それで正しいんじゃないかな。
0281デフォルトの名無しさん
NGNG02821
NGNGなるほど、C++に移行した結果残ったCの遺物と。
最近ハードに密着しなくなったのも原因かもしれないですね。
>>281
予想ですが、bool f=false;/*...*/f=!f;
というコードの話だと思います。
0283デフォルトの名無しさん
NGNG0x1, 0x2, 0x4の定義だけは#defineでって、そんなもんかね?
const でやっちゃうけど。なんかマズイことあったっけ?
Delphiなんかだと、集合型があってスマートにかけるんだけどねえ。
>>276
むしろBoolで、 f = 1 - f; とされることのほうがトリッキーだよ。
ちなみに、Pascal(またか)だとBoolean型は f := not f; とするしか選択がない(藁
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNG非公開メンバは普通 protected にする
private は身内にすら見せないから不便
0286=283=284なんで。
NGNG0287デフォルトの名無しさん
NGNGおまえC++も質問の意図もまったくわかってねえよ。
逝ってよし
0288デフォルトの名無しさん
NGNGprivate は身内にすら見せないから便利
0289デフォルトの名無しさん
NGNGtypo?
0290デフォルトの名無しさん
NGNG0291276
NGNG282さんの通り
bool f=false; /*...*/ f=!f;
でおます
トグル変数なんですな
さらにこれをかいた当時はCだったので
int f=false; /*...*/ f=!f;
としてトリッキーと見られたみたい
ついついくせでboolとしてしまったある
0292デフォルトの名無しさん
NGNGそれよか、お友達にはprivateな部分が見えちゃっていいのか?
って方が気になる > かみんぐあうとC++
0293デフォルトの名無しさん
NGNGそこらへん、Bjarneがどう考えていたのか興味あるね。
D&Eの邦訳って出てたっけ?
洋書は高いしなー。
0294デフォルトの名無しさん
NGNGループの継続条件は、変な番兵でやるより、番兵なしで、
i < sizeof tbl / sizeof *tbl の方がいいと思うぞ。
あと、線形探索よりも、テーブルをはじめにqsortしておいて、
bsearchで二分探索の方が普通だと思うな。
0295285=288=アホ
NGNGで、private継承とpublic継承は知ってるか?
285で反応している>>279の質問は、protected継承の話なんだが。
292もアホに反応するなよ。
0296デフォルトの名無しさん
NGNGprivate/protectedな継承は外部に対してスーパークラスの
インターフェイスを隠したい時に使えますね。(んなこた解ってるって?)
他の言語なら継承を用いずにコンポジションで実現しなければならない
場面で利用出来そうです。
JavaのStackクラスなんかは失敗例で、コンポジションを使うべき、
或いはprotectedな継承が使えれば良かったケース。
# 用語の使い方からC++屋じゃないことは明らか(藁
0297デフォルトの名無しさん
NGNGCとの互換性を保つために仕方がないと割りきったんじゃないかなぁ。
要は、スタックにオブジェクトを確保するためにデータメンバが必要で、
インラインで呼び出すために、privateメソッドのインターフェースも必要と。
0298デフォルトの名無しさん
NGNG多分、>>279はprivate継承の意義はその通りだと知っているはず。
でも、protected継承の意義が不明ということだと思う。
この辺は、Effective C++に詳しいね。
0299デフォルトの名無しさん
NGNG気が付かなかった。
Vectorのインタフェース丸見えですな。
0300297
NGNGうーむむ、俺も「friendにだけなら許す」という
アクセス属性が欲しいと思った事が何回かあるし。
別のキーワードを嫌った面もあるだろうけど、
特に、演算子のオーバーロードで多用される点からも、
「friendはメンバ関数の一種として扱え」って事かな?
0301デフォルトの名無しさん
NGNG03021
NGNGこういう腐ったことを考えるのこそ、まさにオタの厨房ですな。
>>298
tnx。早速本屋で立ち読みします
0303296
NGNGprotectedな継承なら、それをさらに継承したクラスからも外部には
非公開の親の親の機能を使えるじゃないですか。
通常のStackの外部インターフェイスとしてはinsertElementAt()
みたいなメソッドは不要なはずですが(だと思ってるけど)、Stackを
継承してStackの途中の要素に対してアクセスする何かを作る時、
privateな継承だとStackのpublic/protectedなインターフェイスしか
使えないっしょ。
だからといってprivate/protectedな継承がいいといっているわけじゃない。
コンポジションで代用出来るから敢えて必要な機能じゃないよね。
0304292
NGNGなんとなく反応しちまったよ。スマソ
0305デフォルトの名無しさん
NGNG0306296
NGNG0307デフォルトの名無しさん
NGNGしたときにその変数をprivate/protectedにするかの選択ができるように
private/protected継承ができるんじゃないの?
俺のトリッキーコード
既存のクラスライブラリがあって、そのライブラリのソースコードには触れられなくて
でもあるメンバ変数にアクセスしたかったとき
#define private public
#include <XXXXXXX.h>
とやったぞ
0309296
NGNG>publicじゃない継承はコンポジションみたいなもんなんだからコンポジション
>したときにその変数をprivate/protectedにするかの選択ができるように
>private/protected継承ができるんじゃないの?
そのとおり
>#define private public
>#include <XXXXXXX.h>
有名だよね。
でもそのクラスをさらに拡張しようとする人は泣くかもね(藁
元の設計意図は大事に&元の設計はきちんと(藁藁
このへんで抜けます。
0310本題外れまくりの298
NGNGあ、Effective C++に載っているのは
「public継承はis-aという意味である」
「private継承はhas-aの代替手段である」
「protected継承の意味は知らん」
って事だけです。
まあ、よほどの達人以外、買って損はしない本だと思うけど。
0312デフォルトの名無しさん
NGNGこゆのはどうよポン
time_t tt = time( NULL );
struct tm * ptm = localtime( &tt );
printf("今日は%.2s曜日ナリ〜","日月火水木金土"+ptm->tm_wday*2);
0313デフォルトの名無しさん
NGNG0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNGということで、減点
0316デフォルトの名無しさん
NGNGイスラム原典
ハンムラビ法典
信長の野望 (原典版)
0317デフォルトの名無しさん
NGNG.2s
っての初めてみました。
2文字までって事?
文字列引数の長さ調整ができたのか〜
03181
NGNG一般的にするにはこう言うのがいいのかもね。
string sample="今日は";
time_t tt = time( NULL );
struct tm * ptm = localtime( &tt );
sample+=&("日\0月\0火\0水\0木\0金\0土"[ptm->tm_wday*3])+string("曜日です");
全然トリッキーじゃないけど、参考までに
0319デフォルトの名無しさん
NGNGPerlだとこうなるな。
$str = "今日は";
$str .= ('日','月','火','水','木','金','土')[(localtime(time()))[6]];
$str .= "曜日です。";
0320トリッキーの1
NGNG素晴らしい。perlの方でより美しく書けてしまうのが悲しい。
かくいう俺もperlよく使うけど……。
なんとかCで
sample+=(char**)({"日","月","火","水","木","金","土"})[ptm->tm_wday];
みたいに書く方法無いかな?(ちなみに↑は無理ですよ)
0321デフォルトの名無しさん
NGNGsprintf( work, "今日は%2.2sです",&((short*)"日月火水木金土")[dayofweek])
short*はあんまり意味なし。+にすればもっと簡単。
0322トリッキーの1
NGNG標準関数だから使っても問題なしなんだけれど、
やはりオーバーヘッドなどを考えてしまう厨房な俺。
0323デフォルトの名無しさん
NGNG0324トリッキーの1
NGNG%sなどをサーチしてそこに文字列を代入する手間を考えると、
結構な労力が必要かと思われます。
暇を見て後でdisassembleしてみます。
0325トリッキーの1
NGNGstrcatを使って同様(>>318)のコードを書いて、
>>321のコードと簡易プロファイラ(QueryPerformance*)で比較した結果、
大体5:8という結果が出ました(両者最適化済)。
個人的な予想だと1:10位だったので、sprintfは全然overheadになってない感じです。
やっぱり実際profileを取ってみないと、本当のボトルネックはわかりませんね。
0326デフォルトの名無しさん
NGNGこれこそトリッキーなコードだと思いませんか?(笑
#!/usr/bin/perl -w
# 526-byte qrpff, Keith Winstein and Marc Horowitz <[email protected]>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$c=142;if((@a=unx"C*",$_)[20]&48){$h=5;
$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$d=
unxV,xb25,$_;$b=73;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=($t=255)&($d
>>12^$d>>4^$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9
,$_=(map{$_%16or$t^=$c^=($m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t
^=(72,@z=(64,72,$a^=12*($_%16-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271))
[$_]^(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
[Hot Wired - 7行でDVD暗号を解読するプログラム]
http://www.hotwired.co.jp/news/news/technology/story/20010308302.html
0327デフォルトの名無しさん
NGNG0328トリッキーの1
NGNGナイスネタ。
N88BASICと同様、1行にたくさん書いてあるのが逆に美しく感じられます。
evalっていかにもインタプリタって感じで、色々怪しい事が出来そうですね。
恥ずかしながら今まで知りませんでした。
1行80文字未満で7行以下。これを越えるのはRubyしか無理かな。
気合いの入ったRuby使いさん、チャレンジしてみませんか?(笑)
0329デフォルトの名無しさん
NGNG暗号を解除するプログラムが暗号ですね。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGこれって実用性あるのだろうか?
print pack"C*",split/\D+/,`echo "16iII*o\U@{$/=$z;[(pop,pop,unpack"H*",<>
)]}\EsMsKsN0[lN*1lK[d2%Sa2/d0<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<J]dsJxp"|dc`
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGsizeof(short) != 2 な処理系だと?
0334デフォルトの名無しさん
NGNGなんだかスゲー笑った。
あげー
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNGもぇっもぇっ、さくらたん、とか、アニメ落ち、とか
コメントに書いてあるのだろうか。
0337デフォルトの名無しさん
NGNGそうだよん
あとデバッグメッセージかな
OutputDebugString("こりすたん。。。ハァハァ")
0338335
NGNG0340デフォルトの名無しさん
NGNGちなみに、>>2のマクロはa==bの時はデータ異常になるという蟲持ち。
0344デフォルトの名無しさん
NGNG0345SAGE
NGNG手計算してみれ。
(a,b) =
・(0,0) -> (0,0) -> (0,0) -> (0,0)
・(0,1) -> (1,1) -> (1,0) -> (1,0)
・(1,0) -> (1,0) -> (1,1) -> (0,1)
・(1,1) -> (0,1) -> (0,1) -> (1,1)
0346デフォルトの名無しさん
NGNG0347デフォルトの名無しさん
NGNGxor eax, eax
0348デフォルトの名無しさん
NGNGそれは0になるが、それがどうした?
0349347
NGNGa^=b^=a^=b
も理解できるはず。
a==bの場合は大丈夫。
&a==&bのときは両方0
>>343としたのは間違い。
スマン
0350デフォルトの名無しさん
NGNGそして3は浮動小数点演算に上記のマクロを使用して氏んだ
0351優しい名無しさん
NGNG0353デフォルトの名無しさん
NGNG使うのはソートの時くらいじゃないの?
0354デフォルトの名無しさん
NGNG0355351
NGNGじゃ「1」と「10」なら、「0001」と「1010」で、、、えーっと・・・
(0001,1010)→(1011,1010)→(1011,0001)→(1010,0001)
お!す、すげーーー。さんすく。
#^=を、"x乗"のことかと思って、何のことかさっぱりわからんかった。。。
#知らなかったのは、俺だけ?それとも、質問できずに困ってた人、いない?
0356デフォルトの名無しさん
NGNGてゆーかー、
> (0001,1010)→(1011,1010)→(1011,0001)→(1010,0001)
の意味が不明。
1010 ^ 0001 = 1010
1011 ^ 0001 = 1010
とかいった表現にしてほしい。してほしい。。。。
0357デフォルトの名無しさん
NGNG>xor eax, eax
なつかしいね、これ。
代入で0クリアするよりも、何クロックか速いんだよね。
0358デフォルトの名無しさん
NGNG↑お前が間違っとるやんけ。
>>355 は (a,b) の変移を1行で書いたのだろ。
0359デフォルトは名無しさん
NGNG0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNG0362デフォルトの名無しさん
NGNG0363347
NGNG0364347
NGNG0365359
NGNG上司にはそのように報告し関数を一つ追加申請します。
ご協力ありがとうございました。
0366デフォルトの名無しさん
NGNGRGB各5bitの16bitピクセルデータc0とc1の半透明演算。
c = (c0 & c1) + (((c0 ^ c1) & 0x7bde) >> 1);
0367デフォルトの名無しさん
NGNGうーん。ちょっと方向が違うかも試練がラスターオペレーションコードも
奥が深いね。3項のヤツ。。。
0368デフォルトの名無しさん
NGNG古いネタなので再掲
>Z80アセンブラデ ジサツプログラムヲ ツクレ
> メモリクウカンハ 0-FFFFh スベテ RAM
> ソノルーチンヲ ヨブト RAMエリア スベテ 0クリア
> ルーチンハ リロケータブル デアルコト
> スグ コタエラレルヤツハ カクナ
誰も答えてないようなので・・・・・
LD BC,0
LD HL,0 ;なくてもよい
LD E,L
LD D,H
INC DE
LD (HL),0
LDIR
0369デフォルトの名無しさん
NGNGecho10回実行のシェルスクリプトってこう書くよね
#!/bin/sh
foo=1
while [ "$foo" -le 10 ]
do
echo hogehoge
foo=$(($foo+1))
done
これをスマートに出来るかな?
bashなんでrepeat命令は無しです
0370デフォルトの名無しさん
NGNGruby -e '10.times { print "hogehoge\n" }'
0371デフォルトの名無しさん
NGNG#!/bin/sh
echo hogehoge | head -10
0372デフォルトの名無しさん
NGNG#!/bin/sh
yes hogehoge | head -10
0373371
NGNG0374デフォルトの名無しさん
NGNGHLの初期値がLD (HL),0やLDIRを指してると失敗するぞ
まあ普通はそんなとこには置かんが‥
0375デフォルトの名無しさん
NGNG#!/bin/sh
for i in 0 1 2 3 4 5 6 7 8 9; do echo hogehoge; done
0376368
NGNGそっか、じゃあ
LD HL,LDIRの次
とすれば完璧!
0377デフォルトの名無しさん
NGNGコピペです。ちょっとすっきり
#!/bin/sh
for i in 'seq 10'; do echo hogehoge; done
0378デフォルトの名無しさん
NGNGwhile [ $# -gt 0 ]
do
処理 $1
:
shift
done
これって常識?
0379デフォルトの名無しさん
NGNGすでに前例があるのか知ってる人いない?
typedef struct DLList_
{
struct DLList_ *prev, *next;
} DLList;
void Ope(DLList *a, DLList *b)
{
b->prev->next = a->next;
a->next->prev = b->prev;
b->prev = a;
a->next = b;
}
/* 注:以下の説明で {12345} の様に表記されているものは
double linked list を意味する。つまり、5->next は 1 となる。*/
#define Merge(a, b) Ope(a, b)
/* A の要素 a の後ろに b を追加する。
引数: A={12345}, a=3, b={678}
結果: A=={12367845} */
#define Divide(a, b) Ope(b, a)
/* A の要素 a から b までを削除する。
引数: A={12345}, a=2, b=4
結果: A=={15}, a=={234} */
0380デフォルトの名無しさん
NGNG常識つーか、普通だと思うが。
0381デフォルトの名無しさん
NGNG一つの関数で、リストへの追加と削除を済ましてしまうという
ところがミソにゃのか!?
ただ、あらかじめprev,nextメンバは自分自身を指すようでない
とダメっぽいので
typedef struct DLList_
{
struct DLList_ *prev, *next;
DLList_(){
prev = next = this ;
}
} DLList;
とすると、より(他人が見て)分かりやすいにょ。(C++になるけど)
0382デフォルトの名無しさん
NGNGそーゆー事。
もちろん要素が単独の場合、それらの prev,next は自分自身を
指す事を想定しています。
0383381
NGNGやっぱりそーゆー事でしたか。
もう一回、見直したけどこれは安全に使える部類だあね。
例にもある通りマクロを使えば、一瞬意味不明に思える
コードも隠蔽できるし。。
これから作ろうとしてるプログラムでちょうどリンクどリスト
使う予定だったので、さっそく使って見るなりよ。
0384デフォルトの名無しさん
NGNG0386デフォルトの名無しさん
NGNG0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNGリダイレクトの向きが
0389デフォルトの名無しさん
NGNGhttp://mentai.2ch.net/test/read.cgi?bbs=prog&key=983059592&ls=50
デ キミ ノ サイノウ ヲ ジュウニブン ニ ハッキシテネ!
0390デフォルトの名無しさん
NGNGそれって半透明 の何? 飽和加算? 飽和減算?
ちなみに RGB全て 10000 と RGB全て 01111 を「半透明」すると
RGB全て 01111になるよーな…? 飽和加算でも飽和減算でもない…と思う。
どっか間違ってなければ。
0391デフォルトの名無しさん
NGNG透明度50%の半透明合成だろ。
要するに (c0+c1)/2 をRGBの各チャンネルで行っている。
0392デフォルトの名無しさん
NGNGあんがとさん
うかつだった>俺
そんなことやっても 1/2できるんだ…
そーいや俺 半々半透明 って
((c0 & mask) + (c1 & mask)) >> 1
しかやった事無かった。
0395デフォルトの名無しさん
NGNG0396デフォルトの名無しさん
NGNGint mod7(int x)
{
while( x >= 14 ) x = ( x>>3 )+( x&7 ) ;
if( x>=7 )x-=7;
return x;
}
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNG精度落ちるじゃん。
0399392
NGNGあぁっ 本当だ。
じゃー x86でアセンブラ使える人とかは
キャリフラグ使ってね、てことで…
だって もう半々半透明なんて使わないもん、俺。
0400デフォルトの名無しさん
NGNGvoid proc(int no)
{
struct except{
except(int no){
// 関数の実体をここに書く
}
~except(){ //例外が起きても必ず実行したい事を書く
}
}
} infunc(no);
}
0402392
NGNGあぁ、演算結果は5bitでも
「4bit同士の足し算」って所が問題なのか。
それはまったく そのとーりです。
0403弱い者の味方、
NGNGホームページを作ったものの、まったくアクセスが上がらな
くて悩んでいる人のためにお役に立ちましょう。
効率よく宣伝できる共有宣伝掲示板を18個設置しました。
全部宣伝して回ればなんと1,000以上の掲示板にカキコしたこ
とになり即、効果が期待できます。さらに共有掲示板の隠し
リンクを発見してそれらも全部宣伝して回ると計2,000以上の
掲示板にカキコしたことになり、さらにアクセスアップを期
待できます。もう、今日からアクセスが無くて悩むことは無
いです。今すぐここからアタックアタック!!
http://home9.highway.ne.jp/cym10262/
0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNGキャリーフラグがクリアされると思われ
0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNGこういうのどう?
0408デフォルトの名無しさん
NGNGすごいな。
どうやってこんなの考えられるんだろう・・・
ソースを貼り付けられないのが残念だ。
0409デフォルトの名無しさん
NGNG0410デフォルトの名無しさん
NGNG1シーケンスポイント内で複数の副作用が
起きているように見えるのは気のせいか?
0411410
NGNG余計な事書いたら一瞬にしてスレが沈んでしまった。
結構面白い(ものが出てくる可能性がある)スレだったのに・・・
もしかして俺って、スレ殺しの達人?
0412デフォルトの名無しさん
NGNGなるほど。級数展開をやってるのね。大きなAAほど
値が正確になっていくのか。
0413デフォルトの名無しさん
NGNGもったいないからあげておこっと
0414デフォルトの名無しさん
NGNGtypedef void (*VirtualFunc)(void*);
typedef struct {
VirtualFunc hello;
} Animal;
typedef struct {
VirtualFunc hello;
Animal* super;
} Cat;
void helloAnimal(void* self) { printf("...\n"); }
void helloCat(void* self) { printf("にゃお〜\n"); }
Animal* newAnimal() {
Animal* animal = (Animal*)malloc(sizeof(Animal));
animal->hello = helloAnimal;
return animal;
}
Cat* newCat() {
Cat* cat = (Cat*)malloc(sizeof(Cat));
cat->super = newAnimal();
cat->super->hello = cat->hello = helloCat;
return cat;
}
int main() {
Animal* pet = (Animal*)newCat();
pet->hello(pet);
return 0;
}
とかやってた人いない?
0415デフォルトの名無しさん
NGNG>>414
さすがにそこまではしないなぁ。
多態までCでやると手間とか可読性とかいろいろと。
構造体を作って、その構造体を第一引数に取るように関数をつくって
メンバ関数ちっくにするぐらいはやるけどね。
0416>414
NGNG継承、多態を実装する場合スタックに作れないのはいいんだけど。
Cでやる場合、
・自前でコンストラクタデストラクタ起動する手間。
・インスタンス毎にメソッド関数のポインタの領域が取られる。
(C++のvirtualの様にはいかない)
まあ関数テーブルをstaticな所に置いておけばいいんだけどね・・。
・自分しかメンテする人がいない。
言い換えれば、教える手間が掛かる(苦笑
C++嫌いでここまでやるなら、
Objective-Cのトランスレータ使った方がいいかも。
(スクリプト〜のスレにリンクあります)
0417416
NGNGマクロで変換したり色々楽する方法はあるけど、
純粋なCの使い方じゃないんだろうなあ・・
↑に追加するなら、あと、
・コンパイラが型保障してくれない。
これが痛い。どうしても(void*)使いまくる事になるからね。
0418416
NGNGメソッド関数の入り口で
if (self->classid == 〜)
とかする必要がある。
利点は
・OO(風)実装の質加減を自分で決定できる。
・Cは言語仕様が小さいので環境を選ばない。
・どうせ(void*)主体なのでC++の様な大掛かりなtemplateは必要ない。
ぐらいかな。
0419416
NGNG・インライン展開してくれない。(inlineキーワードが使えない)
アクセサとか、なにも考えずに定義できない。
gccやVisualC++ならCでも__inline__使えるので、
使えない処理系毎にマクロで切り分けるはめに・・
・本質と関係無いコードの量が多くなる。
モチベーションが低下する。しょうがないんだけど。
思考するための言語の使い方としては最悪。
だから純粋にOO可能な言語でプロトタイプ作って
C移行やるのがベストかも。(どうしてもやるなら)
0420416
NGNG(ありがちな問題として「純粋OO言語」のライブラリ群をどうやって
Cへ変換するるかだけど、それぐらい無かったら自分で作る。)
やっぱりCで自分で書くのは疲れるよ。無茶するのは健康に悪い。
0421416
NGNGtypedef enum {method1, method2, method3 ...} method_t;
static struct {
methodid_t id;
methodproc_t
} method_tbl {
method1, method1_proc
method2, method2_proc
:
};
dispatch(obj, method1, param...);
こんな風にメッセージの受け口は全部dispatchにするとか。
method探索の効率はhashとか使えばそれほど悪くならない。
必要ならマクロかなにかでdispatch->直呼びに変換する。
0422416
NGNGブロックの間だけ使用するインスタンス群の自動デストラクト
ヒープベースでのみ使用できる。
インスタンスのチェインを作る必要がある。
{
handle_t h = enter_scope(chain);
obj_t obj1 = newobj(chain, classid1);
obj_t obj2 = newobj(chain, classid2);
obj_t obj3 = newobj(chain, classid3);
;
leave_scope(chain, h); obj1/2/3の自動デストラクト
}
もちろんハンドルを保持すればデストラクトを持ち越す事ができる。
この辺は実際に使って有効だった手法。
0423414
NGNGLSI-C試食版でC++に憧れつつやってました(厨房だ
>>415
第一引数を構造体にするのは安上がりにC++気分が味わえて実用的ですよね。
0424414
NGNGぐわっ。なんかすごいです。ここまですれば実戦でつかってもメリット多かも
>>422 なんかはC++でもブロックを越えて、半自動的にヒープの
オブジェクトをデストラクトするのに便利かも、ですね
一般的には言語にない機能をカバーしようとしてトリッキーになってしまう
ことが多い気がします。
むかーしの雑誌で、例外未サポートのC++コンパイラ(ワラ)でTRY/CATCHマクロ
を実装する(大域jumpをつかう)記事が出てたけどトリッキーだった。
私はC++使ってるとgarbage collectionがないせいでトリッキーになることが
多々あります。頭悪いのかも。
自分で書いたcollection classにひたすら参照カウンタを上げ下げする
コードを追加してるとなんのクラスを書いてるのか分からなくなってきます。
0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG04271
NGNG多態って聞いたことないのですが、どんなのですか?
例示してもらえません?
0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNG似たようなことはできるけど、面倒。
もっとラクにdefine する方法ない?
0430デフォルトの名無しさん
NGNG自分でコンパイラを描く。
0431デフォルトの名無しさん
NGNG0432429
NGNG前はそれやってました
(自作プリプロセッサもどきでコンパイル前にマクロ置き換え)
でも、この間事故でえらい目にあったので
なるべく標準的な機能を使いたいんだ
0433デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNG他のdefineは目的によっては不可能じゃない?
0436429
NGNGありがとう。インターフェイスの勉強してきました。早速使ってみます。
トリッキーな手法があるかなーと思って期待してたんだけどね。
0437デフォルトの名無しさん
NGNG>>436
普通に定数使いたいんなら、finalで十分じゃない。
>>435 さんの方法が悪いって訳じゃないけど
めんどくさいからって、定数だらけのinterfaceを
implementsするってのは良くないと思うよ
# JavaCCがやってたけど
ttp://java-house.etl.go.jp/ml/archive/j-h-b/025751.html#body
0438デフォルトの名無しさん
NGNGバグが取り憑いたコードならいくらでもあるのだが。
0439デフォルトの名無しさん
NGNGa = 1 - a ;
などとやりますが、これを拡張して
a = 2 - a ;
としますと、 a=0または2 なら 2または0 になり、a=1 なら 維持します。
0440デフォルトの名無しさん
NGNGカンドーしたよ。こんど真似しよっと。
0441デフォルトの名無しさん
NGNGa=-a で済むし
0442439
NGNGすみません。そっちの方がかっこいいですね・・・
修行しなおしてきます。次は負けん!
0443デフォルトの名無しさん
NGNGアセンブラコードにしてみれば解ると思うけど
まあ、用途によっては a=2-a の方が便利な時もあるっしょ
0444デフォルトの名無しさん
NGNG0445デフォルトの名無しさん
NGNGそういえば前も書いたけど、それって立派なルール違反を犯しているんじゃないの?
トリッキー以前の話だろ。問題外。
0446デフォルトの名無しさん
NGNGそれって
http://www.ioccc.org/
↑ここのパクリじゃないの?
0447デフォルトの名無しさん
NGNG0448デフォルトの名無しさん
NGNG平均:a$=right$("00"+hex$(b),2)
WIZ :a$=right$(str$(100+b),2)
いまのVBならこうか
通常:a=format(b,"00")
0449デフォルトの名無しさん
NGNGアセンブラコードにしてみてもわからんのだけど、
xor a, 1 と sub 1, aで何か違う?
0450デフォルトの名無しさん
NGNGsub 1,a ってアセンブル出来んだろ。
0451デフォルトの名無しさん
NGNG3オペランドならできんこともない。
lui r0,r1,1
sub r1,r2,r2
0452デフォルトの名無しさん
NGNGそれじゃ意味ナイーン
0453デフォルトの名無しさん
NGNGどうちて?
lui r0,r1,1
xor r2,r1,r2
とコストは変わらんでしょ。
X86ならXORの圧勝だが。
0454デフォルトの名無しさん
NGNGパクリつーか、iocccに応募した本人みたいよ。
0455デフォルトの名無しさん
NGNG結果は 1 に代入されるんだろうか…これも時代かねえ
>>453
x86 ならじゃなくて逆に mips くらいなもんなんじゃないの?
0456デフォルトの名無しさん
NGNG大丈夫?
0457デフォルトの名無しさん
NGNG[a=1-a] ⇔ [a=a^1]
DEC EAX ⇔ XOR AL,1
NEG EAX
まあコンパイラがこんなコードを吐くとは思えんが
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNG0460デフォルトの名無しさん
NGNGおれも思った。
ところで、GoFのDesignPatternsがトリックの宝庫に思えてしまう
おれって厨房?
0461デフォルトの名無しさん
NGNGlocal($year, $mon, $day) = @_;
local($wday);
if ($month == 1 || $month == 2) {
$year--;
$month += 12;
}
$wday = int($year + int($year/4) - int($year/100) +int($year/400) + int((13*$month+8)/5) + $day) % 7;
return $wday;
}
メジャー過ぎてトリッキーに感じないけれど、Zellerの 公式(曜日の算出)
0462デフォルトの名無しさん
NGNG>((13*$month+8)/5) + $day) % 7
イカス!
これそんなにメジャーだったんだね。知らなかった。
0463デフォルトの名無しさん
NGNGIA-64でも同コスト
0464デフォルトの名無しさん
NGNG最近の RISC は大体そうなんかな?
ていうか、何に使われてるチップ?
0465IA-64
NGNG0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNG大域ジャンプと、スタック取得を使うと簡単な
マルチスレッドもどきが作れますよ。どこでも動いて
便利。組み込みスレでは当たり前だ!と叩かれたけど
AnsiCで書けるのは面白いと思うんだけどね。
0469デフォルトの名無しさん
NGNG> マルチスレッドもどきが作れますよ。
それって、co-routineすね。
POSIX Thread(pthread)を、
カーネルでthreadableじゃないOS(Unixとか)で実装する場合、
co-routineで実装するよね。
0470デフォルトの名無しさん
NGNGclass T {
static set<T*> instances;
public:
T() { instances.insert(this); };
~T() { instances.erase(instances.find(this)); };
};
0471デフォルトの名無しさん
NGNG意味的にANSI-Cでは書けないと思うけど。
0472デフォルトの名無しさん
NGNGもうちっとだけヒントください
0473デフォルトの名無しさん
NGNGつーかANSIの範囲で書けるなら書いてみてくれ
0474デフォルトの名無しさん
NGNGそれってどういう局面で必要になるの?
0475デフォルトの名無しさん
NGNGDOSとかでマルチスレッドもどき管理するとき。
スレッド切り替えは陽に呼んでやる必要があるんだけどね。
0476デフォルトの名無しさん
NGNGデバッグに役立ちそう。イタダキマス。
そんなにトリッキーでもないような。
0477475
NGNGint _cre_tsk( void (*)(void), int ); /* タスクの登録 */
void _sta_tsk( void ); /* タスクの起動 */
void _wai_tsk( void ); /* タスクの切換 */
0478475
NGNG#include <setjmp.h>
#include <malloc.h>
#include "rt.h"
#define LMTTASK 5
/************************************************************************/
/* タスクリスト構造体 */
/************************************************************************/
volatile struct TASKLIST {
jmp_buf buf; /* ジャンプバッファ */
int size; /* スタックサイズ */
int flg; /* タスク登録フラグ */
void (*name)(void); /* タスク登録関数 */
} tasklist[LMTTASK];
volatile int taskmax=1; /* 最大登録タスク数 */
volatile int crntid=0; /* 現在のタスク番号 */
/************************************************************************/
/* タスクの登録とジョブ制御 */
/************************************************************************/
_cre_tsk( void (*name)(void ), int size )
{
volatile int id;
tasklist[taskmax].name = name;
tasklist[taskmax].size = size;
crntid = ++taskmax;
id = setjmp( tasklist[0].buf );
/* タスクスケジューリング(ラウンドロビン^^) */
if( id ){
if( ++id >= taskmax ) id = 1;
crntid = id;
longjmp( tasklist[id].buf, 1 );
}
return( 0 );
}
0479475
NGNG/************************************************************************/
/* タスクのスタート */
/************************************************************************/
void
_sta_tsk()
{
alloca( --crntid ? tasklist[crntid].size : 1024);
if( crntid > 0 ){
//crntid -= 1;
tasklist[crntid].name();
}else{
crntid = 1;
longjmp( tasklist[1].buf,2 ); /* タスクの起動 */
}
}
/************************************************************************/
/* タスクスイッチャ */
/************************************************************************/
void
_wai_tsk()
{
if( setjmp( tasklist[crntid].buf ) ){
return;
}else if( tasklist[crntid].flg ) {
longjmp( tasklist[0].buf, crntid );
}
tasklist[crntid].flg = 1;
_sta_tsk();
}
0480475
NGNG#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include "rt.h"
int main( void );
void task1( void );
void task2( void );
void pr( int, int, char* );
main()
{
if( _cre_tsk( task1, 0x700 ) );
if( _cre_tsk( task2, 0x700 ) );
/* 開始ルーチン */
_sta_tsk();
return( 0 );
}
void
task1( void )
{
int i=0;
char work[10];
for(;;){
sprintf( work,"%d", i-- );
pr( 5,10,work );
_wai_tsk();
}
}
void
task2( void )
{
int i=0;
char work[10];
for(;;){
sprintf( work,"%d", i++ );
pr( 25,10,work );
_wai_tsk();
}
}
void pr( int x, int y, char *str ){
printf( "\x01b""[%d;%dH""\x01b""[0K%s" , y+1, x+1, str );
}
0481デフォルトの名無しさん
NGNG加減算でのスワップってがいしゅつ?
&a=&bだとだめだけど・・
0482デフォルトの名無しさん
NGNG必要ってわけじゃないけど、所有関係や参照関係すらない object を
数え上げることができるのがコード書くときに楽。あんまりトリッキー
じゃないのでスレ違いっぽいのは確か(可読性も高いよね)。
例えばドキュメント、ページ、その中の画像オブジェクト、というような
階層状の構造をもつ何かを編集するソフトで、特定の画像ファイルの消去等
の際には、ドキュメント→ページ→画像オブジェクト、アンドゥバッファ中
の画像オブジェクト、クリップボード上の画像オブジェクト、などいろんな
ところを見なくちゃならないでしょ。そういうときに「全ての画像オブジェ
クト」ってのを用意して手抜きするわけです。
0483デフォルトの名無しさん
NGNGa ^= b ^= ( a ^= b ) ;
整数型のスワップならこうだろう。
って、昔はアセンブラなんかでは良く使った手だな…。
0484デフォルトの名無しさん
NGNGアセンブラなら直接交換する命令を使ったが。
そんなのもないやつ?
0485デフォルトの名無しさん
NGNGレジスタペアには使えなかったりとか。
0487デフォルトの名無しさん
NGNG変換するのでトリッキーというか、分岐を起こさせずにやる
方法ありませんか(Cで)。
0488デフォルトの名無しさん
NGNG符号無しなら簡単だけどねえ
原理としては最初に16bit左シフトして、
あちこちシフトしながら or 繰り返せば
0か オール1になるから、 ORすればクリップ出来る
符号付きで同じ方式を使うとすると、 17+15に分けて
上位17bitがオールゼロか オール1なら 0に
でなければ MSBによって $7fffか$FFFFを作って
OR するという事で
シフトと論理演算だけで出来ない訳じゃないけど厳しいねえ
0489デフォルトの名無しさん
NGNG○最初に16bit右シフト
0490488
NGNG0491デフォルトの名無しさん
NGNGどういうことだかわからないんだけど、こうしたいっていう具体例を
挙げてもらえる?
0492488
NGNGshort clip16(int x)
{
short c;
_asm {
mov eax,x ;
cdq ;//edxに符号拡張して
sar eax,15 ;//桁溢れがあるかどうか
xor eax,edx;
add ax,0ffffh;
mov ax,0 ;//
adc ax,-1 ;//桁溢れがあれば0 でなければ-1
not ax
xor dx,0x7fff;//8000か7fffか
xor dx,word ptr x
and dx,ax
xor dx,word ptr x
mov c,dx
};
return c;
}
0493488
NGNGshort clip16(int x)
{
if(x> 0x7fff) return 0x7fff;
if(x<-0x7fff) return -0x8000;
reutnr x;
}
を 分岐を使わず書け なんだと思うのだが
0494デフォルトの名無しさん
NGNG491 さんの言う通り、いまいちわからんのぉ。
Cレベルで分岐しない・・・って事じゃないよね?
そうするとターゲットプロセッサとコンパイラ依存
の問題だから、環境書かないとダメですぞ。
たとえばこの問題、ARM とかならCで分岐使ってても、
コンパイル後は分岐無しになったりするし。
汎用的な答えとして、
・テーブル引く
ってのはあるけどね
0495デフォルトの名無しさん
NGNGif文なし、ならできるけど・・・
0496デフォルトの名無しさん
NGNGこんな感じ?検算してないけど。
条件文入ってるからダメか。
0497496
NGNGの間違いでした
0498494
NGNG内容の確認はしてないけど、その手なら MIPS でも分岐命令は
出なさそう。
出題者の意図次第ですが、>>492 さんの解答がいいところを突いて
る予感はします。これも内容確認してませんが(w
0499デフォルトの名無しさん
NGNG492はちっとなげーし、なによりインラインアセンブラは歓迎されねーだろ
0500488
NGNGshort clip163(int x)
{
int f=x>>31;
int w=( f ^ x )>>15;
w|=w<<16; w|=w>>8; w|=w>>4; w|=w>>2; w|=w>>1;
return (short)( ( ( (f^0x7fff)^x) & w) ^ x);
}
>>497 は残念だけど負数の時にうまくゆかないよ
絶対値はabsマクロが分岐無しに展開してくれるから
absは有りだよね
0501497
NGNGわりい。ちょっと直す。
result=(short)((h&0x7fff)|((h>>31)<<15)|(((h&0x7fffffff)>0x7fff)*0x7fff));
これでだいじょぶかな?
0502488
NGNGこれが c でもアセンブラ並なコードが出た
return (short)( ( ( ( (x>>31) ^ 0x7fff)^x)
& (-( abs(x) > 0x7fff)) )
^ x);
>>501 まだダメ 負数だとオーバー時 -1 になってしまうよ
クリップだから -$8000 にならないと
0503497
NGNGあはは。寝ぼけてた。ごめん。・・・旅に出ます。
0504488
NGNGは cが1なら a xor b xor b = a cが0なら b
という事でビット毎の代入パターン
( (x>>31) ^ 0x7fff は 0x7fff+(x<0)
0505494
NGNGじゃあ自分で、ってんで作ってみたぞ。
int clip (int a)
{
unsigned int b, res;
b = a + (a & 0x8000);
b = ((b >> 15) - 1) >> 31; // 0:over 1:not over
b ^= 1; // 1:over 0:not over
res = a | -b; // over なら 0xffffffff
res += (b << 15); // over なら 0x8000 加算 -> 0x00007fff
res ^= -(a >> 31 & b); // 元が負でoverなら 0xffffffff で xor -> 0xffff8000
return (int)res;
}
これも、もちろん内容の確認はしていない(w
くどい様だけど、条件次第だからねぇ。
abs がどう展開されるかもコンパイラ&プロセッサ次第。
たぶん、「算術&論理演算だけで片付ける」ってのが、
出題者の意図だとは思うが。
0506488
NGNGそれとも命令数を数えてコーデングしてて、分岐が入るとメンドクサイから
嫌だとか
条件によって代入とか 条件によって次命令スキップなんて
命令を備えてるCPUも多いんだけどね。
0507487
NGNGx86系でPCMのクリッピングに使います。
たしかにアセンブラレベルじゃMMXやcmovcc使えばいいし、
Cコンパイラでもgccとかは自動的にcmovcc使ってくれるのでよいのだが。
それとはちょっと別に「分岐を起こさせずに」ってのは、実質的な
意味よりも、>>505 の言うように「算術&論理演算だけで片付ける」
ってのでの方法をちょっと知ってみたかっただけなので・・・。
0508デフォルトの名無しさん
NGNG0509デフォルトの名無しさん
NGNG(short) ( ( ( ( (x>>31) ^ 0x7fff)^x ) & (-( abs(x) > 0x7fff)) ) ^ x)
これが一番綺麗だね
0510デフォルトの名無しさん
NGNGこいつが setcc al に展開される
その後 eaxを使うと パーシャルレジスタストール に引っかからないのかな?
まあパーシャルレジスタストールなんて数年したら
そんな事もあったなあなんてレベルの話なんだろうけど
0511デフォルトの名無しさん
NGNGいかにトリッキーかのスレなんだから
0512デフォルトの名無しさん
NGNGいや、いかにトリッキーかというのはあとから付いてくるものだよ。
なんつーか、「こんな方法があったのか!」っていうヒザポンな
解法をみんなで思いつくのが本来の趣旨 のような。
わき道にずれてごめんsage
0513デフォルトの名無しさん
NGNG1) 符号によって -1を作って
2) 1) XOR 元の値
3 2)−1)
の3命令に展開されるよね
CMOVccのような条件転送 があれば
1) 負数にして
2) 符号が負数なら元を代入
って2ステップで出来るけど
0514デフォルトの名無しさん
NGNGunsigned iabs(int a)
{ int f=a>>31;
return (a^f)-f;
}
だとすると -fが無くても1しか違わないから >>509は
int f= (x>>31);
(short) ( ( ( ( 0x7fff-f ) ^ x ) & (-( ( x ^f ) > 0x7fff)) ) ^ x)
0515デフォルトの名無しさん
NGNG//Selectの各bitが 1なら aを 選択 0 なら bを ビット単位に 選択
#define BitMask(a,b,Select) ( ( (a ^ b) & Select) ^b)
(short) BitMask( 0x7fff-f , x , -( ( x ^f ) > 0x7fff ) )
0516デフォルトの名無しさん
NGNGif(a*a+b*b==c*c) printf("三角形の秘密はね、");
0517デフォルトの名無しさん
NGNG0518487
NGNGあまり大きな数値や小さな数値は絶対に入ってこないので、
数値を最初に32768を足して、unsigned int 32->unsigned int 16 の
飽和変換を行ってからまた 32768 を引こうかと思ったんだけど
unsigned int 32->unsigned int 16 の飽和はどうしようか・・・
教えて君ですまんそ
0519487
NGNG0520デフォルトの名無しさん
NGNGshort clip16(int x) {
int f=(x>>31);
x ^= f;
x = (((-(x&-0x8000))>>31) | x) & 0x7FFF;
x ^= f;
return (short)x;
}
0521デフォルトの名無しさん
NGNGええとね、PCMのクリッピングで悩む必要はないよ。
44.1Kだから1秒に およそ9万回しかクリッピング処理は回って来ないからさ
それより、その処理本体で悩んだ方がいいと思う
0522デフォルトの名無しさん
NGNGフリーソフトの作家さんが、セミコロンを使わないでCのプログラムを
書いて遊んでいたのを思い出しました。
0523デフォルトの名無しさん
NGNGそんなことできるのかー。
Perlなら簡単そうだけど、Cで出来るのか。
0524デフォルトの名無しさん
NGNG0525デフォルトの名無しさん
NGNGすべての
式;
はif(式){}で置き換えられるとして
変数宣言はどうするんだ
0526デフォルトの名無しさん
NGNGvoid sub(char *msg)
{
if(msg = "Hello world!\n", printf(msg), 0) {}
}
int main()
{
if(sub(0), 0) {}
}
0527526
NGNGreturnが書けないのか・・・
まぁ関数から値を返すときは関数に変数のポインタを渡せばいいけど
mainにreturnが書けないのはイタイ
0528デフォルトの名無しさん
NGNGトリッキー、つーかただの嫌がらせだな(w
0529デフォルトの名無しさん
NGNG// コンストラクタを適用する例
class CADDR_INIT {
public:
// カスタマイズした new と delete
void *operator new(size_t size,void* addr){return addr;}
void operator delete(void* pMem,void* addr){}
// 通常の new と delete
void *operator new(size_t size){return ::operator new(size);}
void operator delete(void* pMem){::delete(pMem);}
};
class TA : public CADDR_INIT
{
int a,b;
public:
TA(){a = 1,b = 2;}
};
void func()
{
TA* p = (TA*)0x12345678;
new(p) TA; // p->a = 1、p->b = 2 になる
}
■どんな時に利用するか?
・ディスク媒体等から読み込んだデータにコンストラクタを適用したい時
・クラスオブジェクト配列の一部だけにコンストラクタを適用したい時
・メモリマップドIOをクラスオブジェクトに見立てて利用したい時
0530デフォルトの名無しさん
NGNG>>529 どこがトリッキーなんだ?
0531デフォルトの名無しさん
NGNG0532デフォルトの名無しさん
NGNGptr:
jmp 0xxxxh
0533デフォルトの名無しさん
NGNG0534デフォルトの名無しさん
NGNG0535デフォルトの名無しさん
NGNGVCだろ!
0536デフォルトの名無しさん
NGNGVCってなに?VirtualCall?
0537デフォルトの名無しさん
NGNGJECXZ LABEL
0538デフォルトの名無しさん
NGNGビタミンCにきまってるdaro!
0539デフォルトの名無しさん
NGNG0540デフォルトの名無しさん
NGNG0541
NGNGよくそんなニーモニック知ってるのぅ。
0542デフォルトの名無しさん
NGNGJZ LABEL
と較べてフラグを保存できる上、1バイト小さい。
0543デフォルトの名無しさん
NGNG0544デフォルトの名無しさん
NGNG無いでしょうか?(昔どこかでできるという様な話を聞いたんですが)
0545544
NGNG紐付き2分木の様なnullポインタを使う方法では無いらしいです。
どなたかご存じないでしょうか。
0546デフォルトの名無しさん
NGNGrootをarr[1]に入れて、arr[k]の左の子をarr[2k]、右の子をarr[2k+1]に
入れておいて arr[] を一気に舐める、というようなやり方のことかな?
0547546
NGNG置いてもいいんだけど、コードが読みにくくなっちゃうので
俺は546のように置いている。
0548544
NGNGいえ、配列を使う(実質スタックですよね?)のでは無く、
左右のどっちかのノードの書き換えのみで行なう様な感じだったと
思うのですが・・
普通にやると、片方のノードはループに書き換えられますが、
もう片方を辿る時に、例えば左辺を親ノードと入れ替えるとか、
そんな感じのコードになると予想しています。
理屈ではできそうなんですけど。
0549546
NGNGトラバースするときにえっちらおっちらコピーするわけじゃなくて、
最初から配列に組んじまえばいいんですよ。
(要素の数が劇的に変わったり、左右のバランスが悪いときには
メモリ効率が落ちるが)
左右の子へのポインタを2つとも持たなくていい分、効率がいいこともあるよ。
(要素へのポインタの配列で組むと、ポインタ一個分しか節約にならんけどね)
0550デフォルトの名無しさん
NGNG結局ヒープソートの基礎以上の内容ではなさげだが……?
0551デフォルトの名無しさん
NGNGノードをたどりながら印をつけ、そのノードを訪れたとして出力する。
ツリーの末端まできたらそのノードは削除する。
スタックが使えないのでバックトラックできないので、
その後ふたたびルートから繰り返す。
が、印のついていないノードにきた場合は印をつけ、
そのノードを訪れたとして出力する。
ノードが無くなったらトラバースの出力は終わり。
0552デフォルトの名無しさん
NGNGそのアルゴリズム、読んだ覚えがあるけど
どこで読んだか思い出せない・・・(鬱
確か goto をやたら使っていた様な気がするけど違うかなぁ。
0553552
NGNG0554デフォルトの名無しさん
NGNGんなのはトラバースとはいわんだろ。
0555544
NGNG>>549
子ノードが親ノードよりも後に生成される事が決まっていれば、単純に配列の
添え字の比較で済みそうですが、ここでは単純にポインタで繋がった2分木を
想定しています。
>>551
辿った要素にマークを付けていくという発想は近いかもしれません。
そうすると、全ての要素に対してマーク用にフラグが必要になるのが
嫌な感じですが・・。
>>552
なるほどクヌースの例の本に載ってるのかな。
図書館で調べてきます。
0556デフォルトの名無しさん
NGNG#include <stdio.h>
void main(void)
{
typedef struct { int i[5]; } INT_ARRAY;
INT_ARRAY a;
INT_ARRAY b = { { 50, 2, 139, 3049, 8 } };
a = b;
printf("%d %d %d %d %d\n", a.i[0], a.i[1], a.i[2], a.i[3], a.i[4] );
printf("%d %d %d %d %d\n", b.i[0], b.i[1], b.i[2], b.i[3], b.i[4] );
}
これで配列コピー。
上のレベルを見る限りあんまりトリッキーでもないかな...
がいしゅつだったらスマソ。
0557デフォルトの名無しさん
NGNGそれは単に、Cの代入演算子の挙動を理解(つーか誤解)した、という意味に過ぎないのでは?
0558デフォルトの名無しさん
NGNG0559デフォルトの名無しさん
NGNG{
__asm{
mov ebp, d
mov eax, [ebp]
mov ebx, [ebp+4]
mov ecx, [ebp+8]
mov edx, [ebp+12]
cmp eax, ebx
cmova eax, ebx
cmova ebx, [ebp]
cmp ecx, edx
cmova ecx, edx
cmova edx, [ebp+8]
mov esi, eax
cmp eax, ecx
cmova eax, ecx
cmova ecx, esi
mov esi, ebx
cmp ebx, edx
cmova ebx, edx
cmova edx, esi
mov esi, ebx
cmp ebx, ecx
cmova ebx, ecx
cmova ecx, esi
mov [ebp], eax
mov [ebp+4], ebx
mov [ebp+8], ecx
mov [ebp+12], edx
}
}
0561デフォルトの名無しさん
NGNG分岐ナシソートか。
0562デフォルトの名無しさん
NGNG0563556
NGNGありゃ、普通でした?
char配列の場合、なかなかトリッキーなstrcpyができるなぁと思ったんですが。
言われてみればたしかに代入演算子の挙動を理解(誤解なの?)したに過ぎないですね
0564544
01/08/28 00:54ID:w0po3FXwマークを付けていく方法でうまくいく様です。
(マークを付けない場合だと、ある構造ではうまく行く様に見えますが、
戻りなどで既に辿った部分に遭遇すると、無限ループになります。)
0565おれ
01/08/28 01:43ID:pVFk2nKIhttp://www.tuxedo.org/~esr/jargon/html/entry/Duff's-device.html
register n = (count + 7) / 8; /* count > 0 assumed */
switch (count % 8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
理解した時に世の中にはキチガイがいるもんだと実感した。
0566デフォルトの名無しさん
01/08/28 01:50ID:RxA.u.Us0567デフォルトの名無しさん
01/08/28 02:14ID:mHosmIv.そりゃー、昔のゴミ集めの連鎖辿りでは常套手段だったべさ。
>>2の手法で、一つのpointer fieldで双方向鎖の実装もあったべさ。
実記憶のみで総100Kbyteとかの時代の話だべ。
0568デフォルトの名無しさん
01/08/28 02:19ID:9IU/Y/5ocase文ってのがブロックのなかにあっても通用するってのが
目から鱗だったよ。
0569デフォルトの名無しさん
01/08/28 03:22ID:PVHMotjs0570デフォルトの名無しさん
01/08/29 01:34ID:GIhJkjc.こういうの聞いてると昔のコードって
みんなトリッキーなコードになるかも。
0571デフォルトの名無しさん
01/08/29 01:44ID:gasQtqoY0572デフォルトの名無しさん
01/08/29 01:47ID:Mf58huQg0573デフォルトの名無しさん
01/08/29 03:06ID:hol8O3eY書きたくなくても書かなければならない部類だと思う。
bcopyのsourceは、word境界に揃えたり軒並凄い事になっている。
i960のマニュアルに載っていたb*(), str*()のsample assemblerも面白かった。
0574a
01/08/29 09:41ID:UHzULLbQどうもコードを追う事が出来ない…
これをちゃんと構造化して書くとどうなるの?
0575a
01/08/29 09:48ID:UHzULLbQif (count % 8 > 0)
*from+=(count % 8);
do{
*to = *from+=8;
}while (--n>0);
コレじゃダメなの?
つーか、ループ内に直接ジャンプって許されるのか…
0576デフォルトの名無しさん
01/08/29 09:52ID:6wtO5bLAそれじゃ動作違う。
count要素、fromからtoに内容コピーするコードだったのに。
高速化のために8個づつにループを展開して
端数を最初に突入する位置を制御することで合わせてる。
アセンブラ的だな。
0577デフォルトの名無しさん
01/08/29 12:54ID:sxLoQ6awregister n = (count + 7) / 8; /* count > 0 assumed */
switch (count % 8)
{
case 0: *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}
do { /* loop unrolling */
*to = *from++; *to = *from++; *to = *from++; *to = *from++;
*to = *from++; *to = *from++; *to = *from++; *to = *from++;
} while (--n > 0);
0578デフォルトの名無しさん
01/08/29 15:54ID:ZdJjaq2Y0579デフォルトの名無しさん
01/08/29 16:03ID:sxLoQ6awしまったー!間違えたー!
do-whileじゃなくてwhileだー!
0580jjdd
01/08/29 16:54ID:zilLM4HU0581おれ
01/08/29 17:03ID:B1bFcds.n. Tom Duff がルーカスフィルム社にいたときに作った、史上もっともドラマチック
なCの落下(fall through)。彼は、データを出力ポートにシリアルにコピーする内側
のループからできるだけ命令をそぎ落とそうと(bum)して、そのループを展開する
ことにした。すると、展開したバージョンはswitch構造とループ構造を織り混ぜるこ
とで実現できるのがわかった。
これを初めて見たときは誰でもショックを受けると思うが、この仕掛け (device) は
現実にまったく合法的な C なのだ。C の case 文がデフォルトで落下する (fall
through) 仕様になっている点は、単独の機能としては昔からもっとも議論を巻き起
こしている部分だ。Duff は「あの論争で僕のコードも1つの論拠になるけど、それが
どっち側に有利な論拠になるかはわからない」と言っている。
[外側の中かっこのペアは実際には取り除けるので、そうすればもっとわかりづ
らくなる -- GLS]
#include <stdio.h>
void main(void){
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
switch (i)
if (j<4) {
case 0: putchar('0');
case 1: putchar('1');
case 2: putchar('2');
case 3: putchar('3');
} else {
case 4: putchar('4');
case 5: putchar('5');
case 6: putchar('6');
case 7: putchar('7');
}
}
0583デフォルトの名無しさん
01/08/29 21:17ID:MU40CPSsif の条件を変えても(例えば if(1) とかでも)、同じ結果が出るね…。
if の条件は無視されるけど {} のブロック構造は生きてて、
case の実行が止められるって事なんだろうな…。
582 が意図してた事とはちょっと違うのかもしれないけど、勉強になったよ。
0584デフォルトの名無しさん
01/08/30 00:12ID:C3TsWUikblockにlocal変数があると、compilerは面倒だなー。C++だと悲惨だ。
0585デフォルトの名無しさん
01/08/30 00:26ID:1Hb4haos0586デフォルトの名無しさん
01/08/30 00:36ID:MsZQr7Hgげ、マジでコンパイル通るね。
いい勉強になったよ。さんくす。
0587デフォルトの名無しさん
01/08/30 01:17ID:xkEeQIkgswitch (count % 8)
{
loop:
case 0: *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
if (--n > 0)goto loop;
}
0588デフォルトの名無しさん
01/08/30 08:08ID:wH4PBT6g{ } をなくすととたんに普通のコードに見えてくるなぁ(^^;
0589デフォルトの名無しさん
01/08/31 10:20ID:jo6IzfKs落下しないswitch case
#include <stdio.h>
#define SWITCH(a) switch(a) if(1)
#define CASE } else if(1) { case
int main(void)
{
int i;
for(i=0;i<3;i++) {
SWITCH(i) {
CASE 0: putchar('0');
CASE 1: putchar('1');
CASE 2: putchar('2');
}
}
return(0);
}
0590名無し
01/08/31 23:27ID:4J0FhXA6aの13bit目と、bの27bit目だけを交換する、という感じで。
ボトルネックになりかねないところなので
速度優先で行きたいんすけど、当方厨房なのでご教授願います。
0591デフォルトの名無しさん
01/08/31 23:39ID:7xETyOKMa = (a & ~0x2000) | ((b & 0x8000000) >> 14);
b:0000x000 00000000 00000000 00000000
a:00000000 00000000 00x00000 00000000
ベタ。てきとーに。
0592デフォルトの名無しさん
01/09/01 00:04ID:8UdnvL3Aどういう処理だったか思い出せません。
(たしか引き算とかand取ったりするやつです)
どなたか教えてくださると助かります。
既出っぽいですけど。
0593デフォルトの名無しさん
01/09/01 00:29ID:X4g2r2K6確か
n & (n - 1) == 0
じゃなかったっけ?
0594デフォルトの名無しさん
01/09/01 00:48ID:fRlPzhIUその公式つかって、二進数で数字を表したときの1の個数を
調べる方法あったよね。
かーにはん・りっちーの本に載ってたはずなんだが、
読んでも見つからないし、思い出せない。
だれかおしえてくらはい。
0595デフォルトの名無しさん
01/09/01 02:02ID:3D0QdnKMそれなら、ビット位置を引数に括り出して
typedef unsigned char bitpoint_t;
template <typename T>
inline bool
bit_p(const T num, const bitpoint_t bit)
{
assert(static_cast<T>(-1) > 0 && "call bit_p() with signed value");
return ((num & (static_cast<T>(1) << bit)) >> bit);
}
template <typename T>
inline void
bitswap(T& a, const bitpoint_t m, T& b, const bitpoint_t n)
{
assert(static_cast<T>(-1) > 0 && "call bitswap() with signed value");
const bool bit_a = bit_p(a, m);
const bool bit_b = bit_p(b, n);
a = (a & ~(static_cast<T>(1) << m)) | (static_cast<T>(bit_b) << m);
b = (b & ~(static_cast<T>(1) << n)) | (static_cast<T>(bit_a) << n);
}
こうかなぁ。ベタなコードだけど、m, n が定数の場合には、コンパイラが頑張って
最適化してくれるから、そこそこの出力が得られる。
アセンブラでガリガリ書くのは私の手に負えんので、できる人お願い。
0596デフォルトの名無しさん
01/09/01 11:22ID:nFNRRApEint bitcount(unsigned n)
{
int cnt;
for (cnt = 0; n; n &= n - 1)
cnt++;
return cnt;
}
0597デフォルトの名無しさん
01/09/01 15:31ID:4WaMM0ist = ((a>>an)^(b>>bn)) & 1;
a ^= t<<an;
b ^= t<<bn;
予めan=13,bn=27って分かっていれば
t = (a^(b>>14)) & (1<<13);
a ^= t;
b ^= (t<<14);
0599592
01/09/01 23:45ID:cxkeoCoY多分それです。
ありがとう
0600デフォルトの名無しさん
01/09/02 12:02ID:SHIZw3Bc>ちゃんと実行できますよ.
>このプログラムを実行すると, e^(引数の数)の値を表示します.
>このプログラムは以前 遊び半分で作ってみたコードです.
>初期値が main のアドレス値で, e の値に収束します.
#define EE main(x){double _=1,__=67;__=
#define ee ;printf("%lf\n",__);}
#define Ee _+x*(
#define eE )/--__
#define OO (int)main
EE Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee OO eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE eE eE eE
eE eE eE eE eE eE
eE eE eE eE eE
eE eE eE eE eE
eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE eE eE
eE eE eE eE eE ee
0601デフォルトの名無しさん
01/09/02 12:05ID:sAGvjp0gそれ、半角スペースがつぶれてちゃ意味無いよー。
0602デフォルトの名無しさん
01/09/02 12:10ID:SHIZw3Bc#define ee ;printf("%lf\n",__);}
#define Ee _+x*(
#define eE )/--__
#define OO (int)main
EE Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee Ee Ee Ee Ee Ee Ee Ee
Ee Ee Ee OO eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE eE eE eE
eE eE eE eE eE eE
eE eE eE eE eE
eE eE eE eE eE
eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE
eE eE eE eE eE eE eE eE eE eE
eE eE eE eE eE ee
0603デフォルトの名無しさん
01/09/03 06:50ID:nmjujq7g0604デフォルトの名無しさん
01/09/03 07:49ID:fdEwavAEバーヤ
0605てぃむぽ
NGNGlong chinpo;
chinpo++;
ちんぽプラプラ
0606デフォルトの名無しさん
NGNGみなさんも気を付けましょう。
0607デフォルトの名無しさん
NGNG0608デフォルトの名無しさん
NGNGチンポ(Chinpo)プラプラ(purapura)
0609デフォルトの名無しさん
NGNGチンポが長いんだ
0610デフォルトの名無しさん
NGNG誰かマクロ展開してくれ
わけわからん
0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
プリプロセッサ使えよ。
0613デフォルトの名無しさん
NGNGつべこべ言わずにやれったらやれ!
0614デフォルトの名無しさん
NGNGこのスレでの登場回数3回目だね!
0615デフォルトの名無しさん
NGNGだからプリプロセッサ使えって・・・
0616デフォルトの名無しさん
NGNGcpp ← C プリプロセッサ
cpp sample.c >> sample.txt
とすれば、展開後のソースが sample.txt で得られる。
0617デフォルトの名無しさん
NGNGVC++なら _RPTF系を使う。
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNG0620デフォルトの名無しさん
NGNG0621デフォルトの名無しさん
NGNG0622デフォルトの名無しさん
NGNG0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNG0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNG0627デフォルトの名無しさん
NGNG今大変な事が起きておる。
スレの危機だ。
今こそお前の出番だ。
スレを救うのだ。
age
0628デフォルトの名無しさん
NGNG↓ ドンキー任天ード
0629デフォルトの名無しさん
NGNG0630aeg
NGNG06317行の504
NGNG分からないと思うので、作者に代わって大意を述べると、
e=1+1/1!+1/2!+1/3!+1/4!+.....
=1+1*(1+1*(1+1*(1+ .... )/3)/2)/1
で、これを67!になるまでで打ち切って計算しているだけ。真中の(int)main
は最終的に67!で割り算されるから何であってもほぼ0とみなされる。
ただし、ひとつの式の中に複数の同じ変数に対する副作用を持つ式を
書いた場合は、ANSIやISO9899などでは結果は保証されないので、この
プログラムはANSIやISO9899ではないです。従って例えばIOCCCに投稿
しても不適合になります。カンマ演算子など、評価順序を決定する演算子
の前後に分かれていれば問題はないのですが...
例えば、int i=7;printf("%d",++i * ++i ); の出力が 64,72,81のどれに
なっても構わないし、厳密にはこれで異常終了するような実装でも
構わなかったはずです。
char Buf[128];
crlf[3]={13,10,0};
wsprintf(Buf,"Hello%sworld",crlf);
0633デフォルトの名無しさん
NGNG0634デフォルトの名無しさん
NGNGn &= n-1;
06351
NGNGhttp://www.f2.dion.ne.jp/~impact14/
0636デフォルトの名無しさん
NGNGトリッキーの1さんを利用するのは許せない
0637デフォルトの名無しさん
NGNGどういう意味があるの?
0638どこかで見つけたやつ
NGNGchar *ps, sz[] = "a\0bcde\0fgh\0";
while(sz[n])
n += strlen( (printf("%s\n", ps = &sz[n]), ps) ) + 1;
0639504 of 7行
NGNGLDIRを使う方法の場合
LD HL,LDIRの次
(LDDRを使う場合はLDDRの前になる)
は必須です。しかも問題の条件からこれをリロケータブルにやらないと
いけません。その部分もきちんと考えるとどうなります?
※LDIRの動作はLDIの動作の後、BCレジスタが0でなければ、PCをDECします。
(説明書などにはBC=0となるまでLDIの動作を繰り返す、のように記述されて
いるかも知れませんがそれは不正確です。ハードウエア的にトレースして
見れば分かります。)
よってHLレジスタの値が中途半端な所にある場合、LDIRの命令のところまで
消去したところで実行される命令がNOPになるので(Z80では書き換えられた
命令は即実行に影響します)その続きの命令が実行されてしまいます。
0640504 of 7行
NGNGLD BC,2
LD A,'RET'
LD (BC), A
DEC BC
LD A, 'PUSH HL'
LD (BC), A
DEC BC
LD A, 'POP HL'
CALL 0
ADDR1:
LD D, H
LD E, L
INC DE
ADD HL, ADDR2 - ADDR1 ; ADDRの引き算なのでリロケータブル
LD (HL),0
LDIR
ADDR2:
或いはSPがまともな値だったら、上記プログラムを逆順にPUSHして
RETでそこに飛ぶ、という方法のほうが確実かな。
LD HL, 'LDIR'
PUSH HL
LD HL, 'LD (HL),0'
PUSH HL
LD HL, 10
PUSH HL
LD HL, 'ADD HL'*256+'INC DE'
PUSH HL
………
RET
という具合。
0641デフォルトの名無しさん
NGNG0642*nix厨
NGNGhttp://pc.2ch.net/test/read.cgi/tech/984182993/589-593
1ソース多言語で"Happy 2ch world!"を出力する
・コンパイルのワーニングは無視してかまわない
・"Happy 2ch world!"以外はなるたけ出さない
・プログラムの長さは1レスまで
・実行可能な言語を示す
(DOS窓とMS系OSのコマンドラインなどは1つとして数える)
例:DOS窓+C言語
rem (){printf("Happy 2ch world!\n");return 0;} main(){ /*
echo Happy 2ch world!
rem */
rem ();return 0;}
元ネタ(f77,c,/bin/shの3つ)
http://www.ioccc.org/1986/applin.c
0643デフォルトの名無しさん
NGNGprint "Happy 2ch world!\n"
exit
=begin
#endif
#include<iostream>
int main()
{cout << "Happy 2ch world!" << endl; return 0;
}
#ifdef AAAAA
=end
#endif
0644デフォルトの名無しさん
NGNG<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- $_ if 0;
print "Happy 2ch world!\n";
#--><html><body>Happy 2ch world!<br></body></html>
0645デフォルトの名無しさん
NGNGprint "Happy 2ch world!\n";
0646デフォルトの名無しさん
NGNG0647デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGmes "Happy 2ch world!":stop
0649デフォルトの名無しさん
NGNG一個はsmalltalk?もう一個は?
06501
NGNGrem /*
echo Happy 2ch world!
exit
*/=3;
#ifdef 0
print "Happy 2ch world!"
exit
=begin
#endif
#include <stdio.h>
int main()
{
printf("Happy 2ch world!\n");return 0;
}
#ifdef 0
=end
#endif
0651デフォルトの名無しさん
NGNG* /= 3; って言う行があるけれど、Rubyは通らなかったんだけど。。
0652デフォルトの名無しさん
NGNG06531
NGNGPerl, C, DOSのつもりだったけど、
Perl, C通らないね ^^;
出直してきます
0654デフォルトの名無しさん
NGNG=begin
=end
じゃなくて、
=任意のアルファベットだけからなる文字列
=cut
だったはずっすよ。
06551
NGNGエラーメッセージを出してもいいなら出来るけど……
0656デフォルトの名無しさん
NGNG@goto =(BAT_MAIN)
__END__
:=(BAT_MAIN)
@echo Happy 2ch world!
あやしいけど、動いた。
0657デフォルトの名無しさん
NGNGrem (int tr/*//) if (0); $_=<<"EOS";
@echo Hello world
@goto END_OF_BAT
rem */) {printf("Hello world\n");return;} main () {rem(1); return 0;} /*
EOS
print "Hello, world";
__END__
:END_OF_BAT
rem */
0658トリッキーの1
NGNGお見事。
最初のremを@remにするのは不可能だよね(笑)
0659デフォルトの名無しさん
NGNG褒めてつかわす。
あげ
06607行の60です
NGNG>>659
(DEFINE /* (lambda () (display "Hello world")));*/)
(/*);*/){ printf("Hello world."); return 0; }
誉めて使わせ
0661660
NGNG0662660
NGNG(DEFINE /* (lambda () (display "Hello world")));*/)
(/*);*/){ printf("Hello world."); return 0; } main() { DEFINE(); return 0; }
06631
NGNGこちらこそどうもでした、また会いましょう(笑)
……というレスをはやく付けようと思っていたんですが、
このレスだけで書き込むと内容がスレ違いだし、
何か一緒に書き込むネタがないか…と考えていました(笑)。
結局思いつかなかったんですが。
C++のtemplateを使ってトリッキーな事が出来ないかな、とか考えていたんですが、
普通に書いても結構トリッキーになってしまうので、余り「これ!」っていうネタは
無いですね。
誰かテンプレートのトリッキーな使い方をしたことのある人はいませんか?
0664デフォルトの名無しさん
NGNGどこかのスレに、フィボナッチの数列を求めるサンプルがあったけど。
これってトリッキーかな
06651
NGNG例えばchar型やlong型で??
発想力がないのでtemplateの説明みたいなコードしか思い浮かばないけれど、
実物みたいですね。
0666デフォルトの名無しさん
NGNGおーい母さん今夜はリッキーだ!
0667デフォルトの名無しさん
NGNGなんでgoogleで調べない? ふぃぼなっちの綴りがわかんない
とかじゃないだろうな?
0668デフォルトの名無しさん
NGNGフィボナッチなtempleteってーとこの辺か。
0670デフォルトの名無しさん
NGNG誰もやらなさそうなMindで考えてみた…
だがつまらんものしか出来なかつた…いちおうMind+C
/*は "Happy 2ch world!"を 一行表示すること。
メインとは /*。
コンパイル抑止。
*/
#include <stdio.h>
int main(){ printf("Happy 2ch world!\n");}
0671デフォルトの名無しさん
NGNG#include <stdio.h>
main()
{
int a;
a=1+-+-+-+-+-+-+-+1;
printf("%d",a);
}
0672デフォルトの名無しさん
NGNGint main()
{
age("プラグインって結構トリッキー?");
return 0;
}
0673デフォルトの名無しさん
NGNG0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGトリッキーなのがプラグインなのだ。
ゲーテ
0676デフォルトの名無しさん
NGNG0677飽和演算
NGNG// 例えば、x が渡されて x = ( x > 255 ? 255 : x ) を計算
int x, y;
y = x - 255;
x = y & (y >> 31) + 255; // (y >> 31) は y >= 255 なら 0 、それ以外は -1
0678デフォルトの名無しさん
NGNGhttp://www.shudo.net/publications/klab-200106/slide13.JPG
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNG何やってんだこれ?
つーか、めちゃくちゃ危険なことやってる気がするぞ。
マクロの中にじかに変数名埋めるなんて正気の沙汰じゃねーな。
これ書いた奴誰だ?
こんなコード書く奴には仕事出したくないぞ
0681デフォルトの名無しさん
NGNGscanf("%d",&a);
a&&(b=100),(printf("a=%d\nb=%d\n",a,b));//論理演算子で条件文を表現
0682デフォルトの名無しさん
NGNGあふぉ。そーいうことを逝ってんじゃねーだろ。
0683デフォルトの名無しさん
NGNGつーか、サンプルの例が悪すぎ。
0684デフォルトの名無しさん
NGNGなんでだよ。
{
int pc;
void *jump_table[];
#define NEXT
...
#undef NEXT goto *jump_table[*pc++];
}
なら問題ねーだろ。
NEXTの書き方はへヴォだが。
0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNGhttp://www.pro.or.jp/~fuji/mybooks/cdiag/
取りあえずこれ読んどけ。いや読んでください。個人的に目黒寄生虫館物語と並ぶ名著と。
思わず吹き出してしまうと言う珍しいプログラミング関連書籍。スレ趣旨にもマッチ(藁
これ読んで笑えれば初級は脱却。
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG0689原点回帰
NGNG>>2 #define swap(a,b) a^=b^=a^=b ネタで、
b=a-b;a-=b;b+=a;
とか
b=a/b;a/=b;b*=a;
なんてのもあるね(藁
>>686 ネタなら、 ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html
マジすげー。唖然とした。
0690デフォルトの名無しさん
NGNGエディタの機能について言及してるが、この人は本当に
エディタを使いこなしテイルのだろうか?
今時これしきの字下げをマクロで組めないような
エディタを使っている時点で藤原氏の底も知れるな。
などと擁護してみるテスト。おれだってこんなソース見たら逃げるっちゅーの
0691デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
NGNGつーか、自ら
http://www.pro.or.jp/~fuji/mybooks/cdiag/appendix.b.htmlの「UNIX流Cプログラミング入門 」の書評で
> プログラミング言語の本は、コンピュータ関連の本の中では寿命の長い方ですが、それでも出版されてから5年程度が寿命です。
> いつ出版された本かは必ず確認して買いましょう。
と書いてる。
0693686
NGNGいや10年前の本だってう゛ぁ(藁 DOSならVzEditorとかの時代?
そういう意味からも鵜呑みには出来ないけど、
この本読んで面白がるのは中級者以上だから、ちゃんと情報の取捨選択は出来る筈。
あくまで読み物だからね。
つかトリッキーなコードってよりクソなコードだったっぽ。スマソ(藁
0694Trrykiy code
NGNG{
a:
goto b;
c:
goto a;
b:
goto c;
}
0695デフォルトの名無しさん
NGNG( ´Д`) 正直、C言語にビットローテート演算子がホスィ・・・
/ \ ついでにビットスキャン演算子もホスィ
_ | | ∬ | |_..∬
|\ ̄ ̄ ̄旦 ̄ ̄ 旦.\
./..\\ \
/ \|================|
\ ノ \
\ .\
\ ..\_
""""""""""""""""""″″′
0696デフォルトの名無しさん
NGNGローテートはマクロでどうにでもなるかと
ビットスキャンとは?
0697デフォルトの名無しさん
NGNGa &= 0x04;
0698デフォルトの名無しさん
NGNG1引いてもとの数とandを取る
0699デフォルトの名無しさん
NGNGいや、演算子として実装された方が、コンパイラが上手く最適化してくれるという意味。
> ビットスキャンとは?
ビットフィールドを順方向(または逆方向)に見ていって、最初に立つビット位置を見つけること。
i486以降だとbsf命令などに相当する。
つまり演算子として実装されていれば、
CPUネイティブのローテート命令やビットスキャン命令に変換してくれる可能性が高くなる。
0700デフォルトの名無しさん
NGNGWinじゃやりたくねーな・・・。
cp = i["string"];
0701デフォルトの名無しさん
NGNGif(strDate.match(new RegExp("((19(0[48]|[2468][048]|[13579][26])"
+ "|20([02468][048]|[13579][26]))\\/02\\/29"
+ "|(19|20)\\d{2}\\/((04|06|11)\\/(0[1-9]|[12]\\d|3[0])"
+ "|(0[13578]|10|12)\\/(0[1-9]|[12]\\d|3[01])"
+ "|(02\\/(0[1-9]|1\\d|2[0-8]))))"))) {
return true;
}
return false;
}
0702デフォルトの名無しさん
NGNG0703デフォルトの名無しさん
NGNG(bl,bhにそれぞれ演算したい値を入れておく)
add bl, bh
sbb bh, bh
or bl, bh
この応用で、8bit単位の32bit飽和演算等が可能
0704トリッキーの1
NGNGネタがなくて申し訳ないですが。
0705デフォルトの名無しさん
NGNGgccで作ってみた。x86限定。
/* saturate.h */
#ifndef saturate32
static inline unsigned char __saturate8_generic(unsigned char c1, unsigned char c2)
{
__asm__ __volatile__("addb %2,%1\n\t" "sbbb %2,%2\n\t" "orb %2,%0" : "=q"(c1) : "0"(c1), "q"(c2));
return c1;
}
#define __saturate8_constant(c1, c2) ((~(~0u << 8) - (c1) > (c2)) ? ((c1) + (c2)) : ~(~0u << 8))
static inline unsigned short __saturate16_generic(unsigned short c1, unsigned short c2)
{
__asm__ __volatile__("addw %2,%1\n\t" "sbbw %2,%2\n\t" "orw %2,%0" : "=q"(c1) : "0"(c1), "q"(c2));
return c1;
}
#define __saturate16_constant(c1, c2) ((~(~0u << 16) - (c1) > (c2)) ? ((c1) + (c2)) : ~(~0u << 16))
static inline unsigned int __saturate32_generic(unsigned int c1, unsigned int c2)
{
__asm__ __volatile__("addl %2,%1\n\t" "sbbl %2,%2\n\t" "orl %2,%0" : "=r"(c1) : "0"(c1), "r"(c2));
return c1;
}
#define __saturate32_constant(c1, c2) ((~0u - (c1) > (c2)) ? ((c1) + (c2)) : ~0u)
#define saturate8(__x, __y) ((__builtin_constant_p(__x) && __builtin_constant_p(__y)) ? \
__saturate8_constant((__x), (__y)) : __saturate8_generic((__x), (__y)))
#define saturate16(__x, __y) ((__builtin_constant_p(__x) && __builtin_constant_p(__y)) ? \
__saturate16_constant((__x), (__y)) : __saturate16_generic((__x), (__y)))
#define saturate32(__x, __y) ((__builtin_constant_p(__x) && __builtin_constant_p(__y)) ? \
__saturate32_constant((__x), (__y)) : __saturate32_generic((__x), (__y)))
#endif
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGVC6の/FAcで出力される.codファイルのコードダンプをプログラムから
メモリに取りこんで、そのまま実行とかはよくやる。
もうちょっと細分化して、スクリプト言語に取りこめたらいいな、
と思うけど疲れるだけなのでやらない。
0708デフォルトの名無しさん
NGNG0709デフォルトの名無しさん
NGNGint num;
int data[1];
} LIST;
LIST *p = (LIST*)data; /* 読み込んできたデータなど */
for( i=0; i<p->num; i++ )
printf("%d,",p->data[i]);
みたいに配列を故意にオーバーさせて使うのは一般的?
0710デフォルトの名無しさん
NGNGありがちって言うか、それを要求する Win32API が確かあったぞ
0711デフォルトの名無しさん
NGNG漏れにはトリッキーに思えた。
0712デフォルトの名無しさん
NGNG0713デフォルトの名無しさん
NGNGいい情報だ、ありがと
それ使うと実行中に自分自身のコードの位置を管理するプログラムがかけそうだね
0714デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNGlispやるとわかるでしょう。
0716( ´_ゝ`) <そしてプログラム板
NGNGリンクリストを扱うtemplateクラスを作って
item[-1]; // 前の要素
item[1]; // 次の要素
とか。
もちろん添字に当たる引数はsignedな型にしておく。
0717711
NGNGスマソ、ちとミスがあった。
#define HOGE(Funk,/*略*/) void Funk(){/*略*/}
例えば、こんな風な。
int a,b,c;
#define HOGE(Funk,Opr) void Funk(){c = a Opr b}
HOGE(Add,+)
HOGE(Del,-)
HOGE(Mul,*)
HOGE(Dev,/)
void (*pFunk[])() = {Add,Del,Mul,Dev};
0718デフォルトの名無しさん
NGNGさほどトリッキーに見えん
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNG0721デフォルトの名無しさん
NGNG結構驚いた。
なんでこうなるんだ?
0722デフォルトの名無しさん
NGNGHOGE(Add,+);
HOGE(Del,-);
HOGE(Mul,*);
HOGE(Dev,/);
よりも
void Add(){c = a + b;}
void Del(){c = a - b;}
void Mul(){c = a * b;}
void Dev(){c = a / b;}
のほうが少ないよん。メリット無しだね。
0723711
NGNG例で書いただけだかんね。実際に使う場合は、
#define HOGE(Funk,Opr) void Funk(){\
/*略*/
c = a Opr b;\
/*略*/
}
ってな具合に使うから、タイプ量が減る。
0724711
NGNG0725デフォルトの名無しさん
NGNG1+(-1) = 0
0726デフォルトの名無しさん
NGNG端折らないで途中も書いてー
0727デフォルトの名無しさん
NGNGa=1+( -( -( -(-(- ( - ( -1) ))))));
a=1+(-1)
0728デフォルトの名無しさん
NGNGそれ以外の+は消えちゃうわけですか・・・?
むむ・・・・あ、+-の間に0を補間していけばいいのか。
0729デフォルトの名無しさん
NGNGテンプレート使えばいいではないか
0730デフォルトの名無しさん
NGNGa=1+(-(+(-(+(-(+(-(+(-(+(-(+(-(+1))))))))))))));
かな
0731デフォルトの名無しさん
NGNG符号の場合は優先順位が右から左なんですか?
0732デフォルトの名無しさん
NGNG0733デフォルトの名無しさん
NGNGん?
単項演算子の結合方向は右から、2項が左から
優先順位は単項>2項
だよ
0734デフォルトの名無しさん
NGNG0735デフォルトの名無しさん
NGNG意味わかんない。
データエリアって何の事?
0736デフォルトの名無しさん
NGNG0737デフォルトの名無しさん
NGNGException eName=null;
try{
//なんか、Nullだとだめな必須の関数に詰め込む
MimeMessage msg = new MimeMessage();
msg.setSubject(request.getParameter("subject"), "ISO-2022-JP");
}catch(eName){
}
<body>
<input type="text" name="subject">
<%f
if(null != eName){
%>
ちゃんと入力してYO!
<%
}
%>
</body>
//--
入力チェクーをExceptionオブジェクトのインスタンスで判断すると言う横着
0738デフォルトの名無しさん
NGNG0739sage
NGNG0740デフォルトの名無しさん
NGNGトリッキーコーラ
0741デフォルトの名無しさん
NGNG0742デフォルトの名無しさん
NGNGospaceはトリッキーだな。
http://cm.bell-labs.com/cm/cs/who/dmr/primevalC.html
0743デフォルトの名無しさん
NGNGこれもトリッキー
http://www.konica.co.jp/showroom/goody/
0744デフォルトの名無しさん
NGNG笑った
0745デフォルトの名無しさん
NGNGhttp://k-tai.impress.co.jp/column/ippin/2000/07/07/
0746厨房
NGNGダウソロードしました
goto文を見つけてビクーリしました
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGUNIX の icode か?
0749デフォルトの名無しさん
NGNGいやgoto文ではなくて c00.c にある
ospace() {} /* fake */
に悶えろ。ospace は例えば c01.c の block() なんかで使っている。
漏れは Dennis Ritchie のコメントを読むまで何をやっているのか
解らなかった。
> ... astonishing peculiarity is
> the space allocation: temporary storage is allocated that
> deliberately overwrites the beginning of the program,
> smashing its initialization code to save space.
0750デフォルトの名無しさん
NGNGstruct Hoge
{
int i1,i2;
char pName[0];
};
size_t size = sizeof(Hoge) + strlen(pName) + 1;
Hoge*pHoge = (Hoge*)malloc(size);
pHoge -> i1 = i1;
pHoge -> i2 = i2;
strcpy(pHoge -> pName,pName);
VC++だとwarningだが、一応使える。
0752デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1011918364/96-99
0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNGBITMAPINFOなんかがそれですが、
ポインタじゃ無い理由って何でしょうか?
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNG0758デフォルトの名無しさん
NGNGじゃ、
struct Hoge
{
char pName[3];
};
でも、Hoge->pName[10]
とかって、アクセスするの?
0759デフォルトの名無しさん
NGNGそんなの無くても配列でアクセスできますよね?
0760デフォルトの名無しさん
NGNGchar pName;
pName[10] = 'a';
なんて書いてコンパイル通らんでしょ?
char pName[1];
pName[10] = 'a';
これならコンパイル通るでしょ?
0761デフォルトの名無しさん
NGNGたとえば、大抵の32bit環境で
struct X {
size_t size;
char ch[1];
};
|4byte size|ch[0] ・・・・・・|
struct Y {
size_t size;
char* ch;
};
|4byte size|4byte pointer| 〜 |ch[0]・・・・・|
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
NGNGchar pName[1];
};
struct HogeB {
char *pName;
};
両方とも
HogeA->pName[10];
HogeB->pName[10];
と言う風にアクセス出来ますよね?
0764デフォルトの名無しさん
NGNGstruct st { char c[size]; };\
*(struct st*)(dest) = *(struct st*)(src);\
}
0765デフォルトの名無しさん
NGNG構造体で包んでいるって事?
でも、
struct HogeA {
char pName[1];
};
の場合、コピーされるのは最初の1バイトだけだから、、、
0766デフォルトの名無しさん
NGNGお前は配列とポインタの違いが全然わかってないな…
出直してこい。
0767デフォルトの名無しさん
NGNG>struct HogeA {
> char pName[1];
>};
1バイト確保される。
>struct HogeB {
> char *pName;
>};
(Windows+VCとかなら)4バイト確保される。
0768デフォルトの名無しさん
NGNG(Cで言うところの)文の中のvar[x]という書き方はポインタの
シンタックスシュガーであり、宣言のものとは区別されます
>>767
charのサイズも処理系依存ですよ(9bitとか実際に存在する)
sizeof(char)は1であると規格で決まってますが、これで返ってきた
サイズがバイト数であるとはどこにも書かれてないですから
0769デフォルトの名無しさん
NGNG慣用的には8bits以外は1word と表現する場合が多い。
(12bits==1word っていうCPUも実在する)
だから、charが9bitsでも「1バイト」が必ずしも間違いではない。
でも、そういうの言い出したら…
0770デフォルトの名無しさん
NGNG知ったかぶりはやめましょう。
> 6.3.3.4 sizeof演算子
(中略)
> 意味規則 sizeof演算子の結果は、そのオペランドの(バイト数での)大きさとする。
0771デフォルトの名無しさん
NGNGISO/IEC 14882:1998 によると、
> [expr.sizeof] 5.3.3 Sizeof
> 1 The sizeof operator yields the number of bytes in the object representation of its operand. The operand
> is either an expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not
> be applied to an expression that has function or incomplete type, or to an enumeration type before all its
> enumerators have been declared, or to the parenthesized name of such types, or to an lvalue that designates
> a bit-field. sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the
> result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [Note: in par-ticular,
> sizeof(bool) and sizeof(wchar_t) are implementation-defined.69) ] [Note: See 1.7 for
> the definition of byte and 3.9 for the definition of object representation. ]
となっており、
> [intro.memory] 1.7 The C++ memory model
> 1 The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to con-tain
> any member of the basic execution character set and is composed of a contiguous sequence of bits, the
> number of which is implementation-defined. The least significant bit is called the low-order bit; the most
> significant bit is called the high-order bit. The memory available to a C++ program consists of one or more
> sequences of contiguous bytes. Every byte has a unique address.
> 2 [Note: the representation of types is described in 3.9. ]
となってます。
つまり、
1バイト=文字集合の要素を保持できるサイズ
charのサイズ=1バイト
というわけ。
知ったかぶりはお前の方だ。
0772デフォルトの名無しさん
NGNG0773デフォルトの名無しさん
NGNGハァ? >>768が
> sizeof(char)は1であると規格で決まってますが、これで返ってきた
> サイズがバイト数であるとはどこにも書かれてないですから
とか言ってるから書いてると>>770で指摘してるのに、なぜ私に向かって
> 1バイト=文字集合の要素を保持できるサイズ
> charのサイズ=1バイト
とか講釈たれるんですか? 言うなら>>768に対してでしょうが。
> 知ったかぶりはお前の方だ。
知ったかぶり以前に日本語読解力もないようですね。
0774デフォルトの名無しさん
NGNGlea eax, [eax * 2 + eax]
lea eax, [eax * 4 + eax]
lea eax, [eax * 8 + eax]
有名かな?
0775デフォルトの名無しさん
NGNGポインタ・・・サイヤ人
配列・・・・スーパーサイヤ人
0776デフォルトの名無しさん
NGNG配列ポインタ・・・・スーパーサイヤ人3
メンバ関数ポインタ・・・・スーパーサイヤ人4
0777デフォルトの名無しさん
NGNGpop
初めて見たときは感動した。
0778デフォルトの名無しさん
NGNGIPを得るにはほとんどこれしかないけどね
0779デフォルトの名無しさん
NGNGそれなに?
0780デフォルトの名無しさん
NGNG(E)IPレジスタの値を取得するコード。
アセンブリ言語ネタはいろいろ面白いのがあるね。
0781デフォルトの名無しさん
NGNG:
:
:
LD HL,LOOP
PUSH HL
JP SUB2
SUB2:
:
:
:
RET
0782デフォルトの名無しさん
NGNGデバッグ実行の時にはTrueを返信する。
Public Function IsDebug() As Boolean
On Error Resume Next
Err.Number = 0
Debug.Print 1 \ 0
IsDebug = (Err.Number <> 0)
End Sub
0783デフォルトの名無しさん
NGNG誰もツッコんでくれるなよ・・・・
0784ハゲしく突っ込んで欲しいみたいなんで…
NGNGアプする前にはちゃんと動作確認しろよ、ボケェ。
下らないところでミスタイプしてるぐらいだから、
他にもバグがある可能性大だろ。
0785デフォルトの名無しさん
NGNG0786アセンブラAX
NGNGデバッグログはくときに
#ifdef DEBUG
WriteLog(...);
#endif
って 毎回書くのが面倒なので
#ifdef DEBUG
#define WRITELOG(n) WriteLog(n)
#else
#define WRITELOG(n)
#endif
とヘッダに書いておくと
WRITELOG( "あぼ〜ん" );
って書くだけで OK
って 厨房ですか・・
0787デフォルトの名無しさん
NGNGってガイシュツですか?
0788デフォルトの名無しさん
NGNG0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNGWriteLog の引数が複数あるときに困るので、WRITELOG は引数なしで
定義するのが普通ですな。
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNG0793デフォルトの名無しさん
NGNGこのくらい普通ですよね?
0794デフォルトの名無しさん
NGNG三項演算子としては普通だけど、
エラーコードに応じたメッセージ取得関数を用意したほうがいいと思うぞ。
0795デフォルトの名無しさん
NGNG#include <stdio.h>
int main()
{
int atoi(int n);
int a;
:
本人は文字を整数に変換したいらしいのだが、明らかに atoi() の使い方が間違っている。
しかしエラーを解決する方法も学ばせようと思い、そのままビルドするよう指示。
すると何故かすんなり通ってしまい、ビクーリした。
# 何故エラーにならんのかは、帰宅中に気が付いた。
# 流石に1年ブランクあるから細かい仕様を忘れてる…
0796デフォルトの名無しさん
NGNG何をどうしたかったん
0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNG0799デフォルトの名無しさん
NGNG0800795
NGNGこうすることで、変数 n に収めた文字がコードに変換されると思ったらしい。
まぁC は初体験だったらしいので…(何だかエチ-表現だ)
>>799
おおむね正解。
ローカル関数っつーより、ローカル(な)プロトタイプ宣言と言った方が正しいかと。
0801795
NGNG#include <stdio.h>
int atoi(int n);
int main()
{
int a;
:
0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNG0805デフォルトの名無しさん
NGNG0806アセンブラAX
NGNG.....
Loop
なんてのがあって 切れました・・・
日本語に訳してみい
って 言いたかったです
「blnRet が 偽でない でない間 ループしろ・・・」
ある意味 トリッキー
0807デフォルトの名無しさん
NGNGって言われました。
こう言う事ですか。
#include <iostream.h>
class Piyo
{
public:
Piyo()
{
cout<<"Piyo"<<endl;
exit(0);
}
};
Piyo p;
int main;
0808デフォルトの名無しさん
NGNGお題:『16進表記の文字列に変換したときに何桁になるか』
Delphi:
function HexLength(a:Cardinal):Integer;
begin
a := a or 1;
a := a or (a shr 16);
a := a or (a shr 8);
a := a or (a shr 4);
a := a or (a shr 2);
a := (a or (a shr 1)) and $11111111;
a := a+(a shr 16);
a := a+(a shr 8);
a := a+(a shr 4);
Result:=( a and $f);
end;
c:
int HexLength(unsigned a)
{
a = a | 1;
a = a | (a >> 16);
a = a | (a >> 8);
a = a | (a >> 4);
a = a | (a >> 2);
a =(a | (a >> 1)) & 0x11111111;
a = a + (a >> 16);
a = a + (a >> 8);
a = a + (a >> 4);
return a & 0xf;
}
10進数を16進数に変える方法について
http://pc.2ch.net/test/read.cgi/tech/1007222280/
よりコピペ
0809デフォルトの名無しさん
NGNGなるほど、後半は >>209のやり方のアレンジかな
0810NIH3T3
NGNG0811デフォルトの名無しさん
NGNGint HexLength(unsigned a)
{
int b=1;
if(a&0xFFFF0000){b+=4;a>>=16;}
if(a&0xFF00){b+=2;a>>=8;}
if(a&0xF0){b+=1;}
return b;
}
0812デフォルトの名無しさん
NGNGごく普通にこれじゃだめなの?
0813デフォルトの名無しさん
NGNG0814デフォルトの名無しさん
NGNG0815デフォルトの名無しさん
NGNG面白くない、つーか、対数使うのは激しく外出。
0816デフォルトの名無しさん
NGNGいや、だからごく普通にアレじゃだめなんか?
って話で。別にトリッキーじゃないのは承知。
ただ、一般的な解決手法があるのに、わざわざトリッキーにするのは意味があるのか?
ってしつもんなんだが。
0817デフォルトの名無しさん
NGNG>わざわざトリッキーにするのは意味があるのか?
意味:面白い
0818デフォルトの名無しさん
NGNG>わざわざトリッキーにするのは意味があるのか?
理由:速い
0819デフォルトの名無しさん
NGNG>わざわざトリッキーにするのは意味があるのか?
意味:スレの趣旨
0820デフォルトの名無しさん
NGNGlibmath使いたくなかったんです。
0821デフォルトの名無しさん
NGNGnum が 0 の時どうすんの?
0822デフォルトの名無しさん
NGNG0823デフォルトの名無しさん
NGNG0824デフォルトの名無しさん
NGNG世の中色んな環境がありますし、要求があります。
浮動小数点をサポートしてない環境でも>>811は動きます
また、分岐命令は分岐予測に失敗すると十数命令分ペナルティを払うようなCPUだって
あるので、分岐命令を使わない>>808方が速かったりしますしね。
たとえば、マイクロ秒のタイマーが必要な場合に命令数を数えて時間を作ったりしますが
そんな時に実行時間が一定の関数があればそれを入れたり出来る事もあります
0825デフォルトの名無しさん
NGNGVCでコンパイルして実行してみたけど、きっちり1が帰ってきたYO!
ライブラリ関数内部で0ならリターンしてるんじゃない?
0826デフォルトの名無しさん
NGNGそんなに頻繁に必要桁数求めるかぁ?
0827デフォルトの名無しさん
NGNGそもそも必要無い関数と言い切ってしまえばそれまでですね。
ただ、問題解決には色んな方法があるわけで、
その方法の引き出しが多い方が楽しいでしょ?
0828デフォルトの名無しさん
NGNGよかったね、さすがVCだ。 パチパチ
BCC55でCPPだと例外が出るし
GCCだと負数の大きな数字になるから困ったもんだよね
0829デフォルトの名無しさん
NGNG浮動小数点のサポートのない組込みマイコンだとします。
1、 4*8 のセンサーが1ワードで入力されます このセンサーは8のレベルに分かれており
上位ビットが優先されます。 このワードデータを入力して 0〜8を返す関数を作れ!
例:0x01237000 なら7を返す
2、 4*8のセンサーは8つのグループに分かれており、一つのグループ内では一つでも
ONになれば1つと数え、いくつのグループがONになっているかを返せ
例:0x01237000 なら4を返す
0830デフォルトの名無しさん
NGNGつーか、逆にその条件から対数を使用する事を
思い付く奴の方が「神」。
0831デフォルトの名無しさん
NGNG必要の無いところでも最適化する奴は
必要なところでも最適化が出来る。
必要のないところだからといって最適化をしない奴は
必要なところなら最適化が出来る、とは限らない。
この差はけっこう大きい。
0832デフォルトの名無しさん
NGNG特殊命令があったりしないの?
0833デフォルトの名無しさん
NGNG0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNG0836昔のPC板より
NGNG8ビット×8ビット乗算にADD HL,DEを使うのは素人
132 :ナイコンさん :02/02/06 03:23
>>131
っつーか、そういう発想の出る>>131は素人。しかも丸だしの(w
133 :ナイコンさん :02/02/06 12:13
8ビット×8ビット乗算にADD HL,HLを使うのは素人
141 :ナイコンさん :02/02/07 20:24
被乗数:Ereg 乗数:Areg 結果:HLreg
PUSH DE
PUSH AF
LD D,0
LD H,D
LD L,D
SCF
ADC A,A
LOOP1:
JR NC,SKIP1
ADD HL,HL
ADD HL,DE
JR SKIP2
SKIP1:
ADD HL,HL
SKIP2:
ADD A,A
JR NZ,LOOP1
POP AF
POP DE
両方とも使いますが?>>131-133
0837836
NGNG8ビット加算&右シフトと、乗数と結果をLregで共有するのがポイント
テーブル使わないでもっとクロック削れるかな
; HL = H*L
XOR A
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
JR NC,$+3
ADD A,H
RRA
RR L
LD H,A
0838デフォルトの名無しさん
NGNG「必要の無いところでも最適化する」奴は使えん
「必要の無いところでも最適化できる」奴なら同意だが
0839836
NGNG>>211
>Z80アセンブラデ ジサツプログラムヲ ツクレ
> メモリクウカンハ 0-FFFFh スベテ RAM
> ソノルーチンヲ ヨブト RAMエリア スベテ 0クリア
> ルーチンハ リロケータブル デアルコト
> スグ コタエラレルヤツハ カクナ
>>640もいいのだが、残念ながら完全リロケータブルではない。
後の方もSPが自分自身の中を指してたら動作がおかしくなるという問題がある。
LD B,37h ;37h=SCFのコード
LOOP1:
INC HL
LD A,B
CP (HL)
JR NZ,LOOP1
XOR A
LD (HL),A
ADD1:
SCF
JR C,LOOP1
LD BC,ADD2-ADD1
ADD HL,BC
LD SP,HL
LD H,A
LD L,A
ADD2:
NOP
LOOP2:
PUSH HL
JR LOOP2
まずはSCF命令を探して0クリアする。もしそれがADD1のところのSCF命令だったらそこを
通過した時にキャリーが立たなくなるのでループから抜けるが、そうでなければもう1度
やり直す。いつかはADD1のSCF命令に行き当たるはず。
(どうせ全部消すから、他を書き換えてもかまわないという考え)
後はそれを元に初期アドレスを求め、SPにセットしてひたすら0をプッシュ。
延々プッシュしたらループのJR命令自身も消されるが、そうなればPUSH HL以外の命令は
全てNOPなので1回りしてきてもう1度実行、結局全てのコードがあぼーん。
っと、ここまで考えて問題点があることに気づいた。最初はBレジスタを使わず直接
LD A,37hと書いていたが、これではその37h自身を先に書き換えたらアウトではないか。
仕方がないのであらかじめ別のレジスタに入れて、そちらをロードすることにした。
(そちらが書き換えられても、もはや用済みなので関係ない)
0840デフォルトの名無しさん
NGNG必要が無いとわかってるならいいんじゃない?
必要性が判断できる奴なら問題ないよん
0841デフォルトの名無しさん
NGNGでも sense of wonderが感じられた方がいいんじゃないの?
0842デフォルトの名無しさん
NGNG0843デフォルトの名無しさん
NGNGROMとシリアルからブートロードするのだけど
その部分を1ワード読むのを CALL AR3 と間接コールにしてるのは当然だけど
このAR3の示す1番地前に RPTB 命令を置いて DEC するとこのサブルーチン
内でループするようにしている
0844デフォルトの名無しさん
NGNGごめん、面白そうなのによくわからない
アセンブラはx80系しかわからないんだけど、
そんな俺にも解りやすく説明できたらお願いします。
0845デフォルトの名無しさん
NGNGループ終了番地を指定してループを作る命令みたいだから、
ブートロードのコードってZ80ニーモニックもどきで書くとこんな感じかな?
MAIN:
:
LD HL,SUB
CALL SUB ; 1ワード嫁
:
LD B,100
LD HL,SUB
DEC HL
CALL SUB ; 100ワード嫁
:
;
;
RPTB ENDLOOP
SUB:
;ROM嫁
ENDLOOP:
RET
1つのコードを呼び出しで工夫して1バイト読みと
多バイト連続読み両方に使えるようにしてあるのか。
面白れー(w
#そういやTMS320C3xってDSPなのか。
0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNG0848845
NGNG誤:CALL SUB
正:CALL (HL)
0849デフォルトの名無しさん
NGNG0850デフォルトの名無しさん
NGNG0851age
NGNG0852デフォルトの名無しさん
NGNG{
age("保守保守");
case 1:
}
0853デフォルトの名無しさん
NGNG0854デフォルトの名無しさん
NGNG0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNG┌──┐
│┌─┼┐
││ ││
└┼─┘│
└──┘b
a+b. |a*b. |a^b.
┏━━┓ |┌──┐ |┏━━┓
┃┌─╋┓|│┏━╋┐|┃┏━╋┓
┃│ │┃|│┃ ┃│|┃┃未┃┃a,bの内、重なっていない所を選択
┗╋─┘┃|└╋━┛│|┗╋━┛┃(重なっているところは未選択)
┗━━┛| └──┘| ┗━━┛
↓こういう状態ね
┏━━━┓
┃llllllllllllllll┃
┃lllll┏━╋━┓
┃lllll┃ ┃lllll┃
┗━╋━┛lllll┃
┃llllllllllllllll┃
┗━━━┛
0857デフォルトの名無しさん
NGNGa. |
┌──┐|
│ │| ┌──┐
│ │| │ │
└―─┘| │ │
| └──┘b
a^=b
: aとbを重ね、aを「a,bの内、重なっていないところを選択したもの」にする。
: bはそのまま。
a. |b
┏━━┓ |
┃┏━╋┓| ┌──┐
┃┃未┃┃| │ |
┗╋━┛┃| │ |bは変更無し
┗━━┛| └──┘
b^=a
: 「変更後のa」とbを重ね、
. 「重なっていないところを選択」したものを改めてbとする。
: aはそのまま。
a. |b
┏━━┓ |┌──┐
┃┏━╋┓|│ |
┃┃未┃┃|│ |::::
┗╋━┛┃|└──┘:::: ( bが、「最初のa」の位置に移動した )
┗━━┛| ::::::::::::::
a^=b
: さらにaとbを重ね、「重なっていないところを選択」したものをaとする。
: bはそのまま。
a. |b
:::::::::::::: |┌──┐
: : ┌──┐|│ |
: : │ ||│ |::::
│ ||└──┘:::: ( aが、「最初のb」の位置に移動した )
└──┘| ::::::::::::::
0858デフォルトの名無しさん
NGNG分かりづらいだろうから、紙の上でやってね
0859デフォルトの名無しさん
NGNGイメージ的によくわかった。サンクス。
0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNG分かりやすい!
0862デフォルトの名無しさん
NGNGxor eax, ebx
xor ebx, eax
xor eax, ebx
0863デフォルトの名無しさん
NGNGmov ecx, eax
mov eax, ebx
mov ebx, ecx
ですが何か?
0864デフォルトの名無しさん
NGNGそれでは ecx が破壊されてしまうので面白味に欠ける。
0865デフォルトの名無しさん
NGNGpush ebx
pop eax
pop ebx
0866デフォルトの名無しさん
NGNGうむ。よく使ったテクだな。レジスタが少ないと仕方ない。
0867デフォルトの名無しさん
NGNG0868デフォルトの名無しさん
NGNGそれ(・∀・)イイ!!
0869デフォルトの名無しさん
NGNG0870デフォルトの名無しさん
NGNG0871デフォルトの名無しさん
NGNG求めます。(例えば 987654 => 988000 分かりにくい説明でスマソ)
long の場合、10億未満限定ですが。
long f(long data)
{
long bunbo = 1;
while(data/(1000*bunbo) > 0)
bunbo *= 10;
data += (bunbo >> 1);
return bunbo*(data/bunbo);
}
もっと効率のいい方法を考えているのですが・・・。
全然トリッキーでもなんでもないですね。すみません、逝ってきます。
0872デフォルトの名無しさん
NGNG「3桁の概数を求める」と言えば分かるぞ。
0873デフォルトの名無しさん
NGNG破壊
0874デフォルトの名無しさん
NGNG0875デフォルトの名無しさん
NGNG0876デフォルトの名無しさん
NGNGeax,ebxの順に入れて
eax,abxの順に取り出したら以下略
0877デフォルトの名無しさん
NGNG0878デフォルトの名無しさん
NGNG0879デフォルトの名無しさん
NGNGキカイダー
0880デフォルトの名無しさん
NGNGeaxとebxレジスタじゃないか?
0881デフォルトの名無しさん
NGNGちゃんと交換されるが。
0883デフォルトの名無しさん
NGNG0884デフォルトの名無しさん
NGNG0885デフォルトの名無しさん
NGNG0886デフォルトの名無しさん
NGNG/ 丶
/ ノ、
/ /ヽ丿彡彡彡彡彡ヽヽ
| 丿 ミ
| 彡 ____ ____ ミ/
ゝ_//| |⌒| |ヽゞ
|tゝ \__/_ \__/ | |
ヽノ /\_/\ |ノ _____
ゝ /ヽ───‐ヽ / /
ヽ ヽ──' / < ン?
\  ̄ ,/ \_____
/ ⌒\ \
| \ \\
| |\ v' ))
| /⌒ー'‖
| / イ ||
| / | ||
\_/ (__つ
0887デフォルトの名無しさん
NGNG0888赤っ恥873
NGNGそれなら納得。
0889デフォルトの名無しさん
NGNG0890デフォルトの名無しさん
NGNGlong f(long data) { return (data+500)/1000*1000; }
じゃだめなのか?
0891デフォルトの名無しさん
NGNG0892デフォルトの名無しさん
NGNG(...・.・.) <>>890 だめだハゲ-
0893デフォルトの名無しさん
NGNGlong f(long data) {
return (long)( round(data/1000.0)*1000);
}
0894デフォルトの名無しさん
NGNG>>871がやりたいのは
987654 => 988000
9876543 => 9880000
98765432 => 98800000
のようだが。
0895デフォルトの名無しさん
NGNGxor 3回よりも速い罠
mov 3回よりも速いみたいだが
push/popは勿論論外(w
0896デフォルトの名無しさん
NGNGlong f( long data ) {
return (long)((int)(data/(pow(10.0,(int)(log10(data)-2)))+0.5) * pow(10,(int)(log10(data)-2)));
}
or
long f(long data)
int base;
base = pow( 10, (int)(log10(data)-2));
return (long)( (int)(data/base+0.5) * base );
}
0897デフォルトの名無しさん
NGNGwhile(data / (1000*bunbo) > 0)
↓
while(data > 1000*bunbo)
だけで大分速くなりそう。
0898871
NGNG>>894
そうです、その通りなのです。
具体的には、dataが3桁以下ならそのまま出力で、4桁以上のものに
ついては、上位3桁のみを残して、4桁目を四捨五入するのが目的です。
説明不足でした、スマソ。もう一回逝ってきます。
>>896
なるほど、(int)log10で桁数求まりますね。高校数学忘れてる・・・ウツダ
一行コード・・・萌えるなぁ。
しかし浮動小数演算コストも伴う諸刃の剣・・・
0899871
NGNGうわ〜、むちゃくちゃ速くなりました。ありがとうございます!!
0900デフォルトの名無しさん
NGNG>>896との速度比較もしてみてよ。興味ある。
0901871
NGNGうちの環境(Athlon1333MHz,VC++6.0 Release,windows 2000)で
1億回ループさせた場合、
896 => 約44秒
897 => 約7秒
でした。やっぱり割り算や浮動小数点演算はコストかかりますね・・・。多謝!
//---------------------------------
#include <stdio.h>
#include <windows.h>
#include <math.h>
long f896(long data)
{
return (long)((int)(data/(pow(10.0,(int)(log10(data)-2)))+0.5) * pow(10,(int)(log10(data)-2)));
}
long f897(long data)
{
long bunbo = 1;
while(data > (1000*bunbo))
bunbo *= 10;
data += (bunbo >> 1);
return bunbo*(data/bunbo);
}
int main(int argc, char* argv[])
{
long x = 190742105;
long result = 0;
DWORD st=0,en=0;
st = GetTickCount();
for(int i = 0;i < 100000000;i++)
result = f896(x);
en = GetTickCount();
printf("f896() : %ld : %d.%03dms\n",result,(en-st)/1000,(en-st)%1000);
st = GetTickCount();
for(int j = 0;j < 100000000;j++)
result = f897(x);
en = GetTickCount();
printf("f897() : %ld : %d.%03dms\n",result,(en-st)/1000,(en-st)%1000);
return 0;
}
0902871
NGNG書き忘れてた、やっぱり逝こう。
0903逝って良しの1
NGNG0904age
NGNG0905デフォルトの名無しさん
NGNG口で言うだけなら誰でも出来る。
人にお題を出すなら、まず自分が回答例を
出してからでないと人は動いてくれないぞ。
増してや出題者が「逝って良しの1 」となると・・・(w
0906デフォルトの名無しさん
NGNGこうしたら andが1つ減ってるけど シフトが増えてるか
bits = (bits & 011111111111)
+ (bits>>1 & 011111111111)
+ (bits>>2 & 011111111111);
bits = (bits+(bits>>3)) & 030707070707;
bits += (bits>> 6) ;
bits += (bits>>12) ;
return (bits+(bits>>24)) &0x3f;
0907デフォルトの名無しさん
NGNGレスがいっぱいに見えるぞ。
0908デフォルトの名無しさん
NGNG0909デフォルトの名無しさん
NGNG#define GETLSBBIT(x) ((x) & (-(x))) /* いい名前が考えつかんが... */
例)
x = 10010
-x = 01110 ; 01101 + 1
x & -x = 00010
先輩伝授。勉強になったなー。(wai_flgで使える)
0910デフォルトの名無しさん
NGNG#include <iostream>
#include <functional>
#include <algorithm>
using namespace std;
template <unsigned int Val> struct UintType {
enum { value = Val };
};
template <bool Val> struct BoolType {
enum { value = Val };
};
template <unsigned int PrimeNum> struct GetPrime;
template <unsigned int PrimeCount> struct NextPrimeSub1;
template <unsigned int Rest> struct NextPrimeSub3 {
template <unsigned int PrimeCount, unsigned int Cand,
unsigned int PrimeNum> struct set_state
: NextPrimeSub1<PrimeCount - 1>
::template set_state<Cand, PrimeNum + 1> {};
};
template <> struct NextPrimeSub3<0> {
template <unsigned int PrimeCount, unsigned int Cand,
unsigned int PrimeNum> struct set_state
: NextPrimeSub1<PrimeNum + PrimeCount>
::template set_state<Cand + 2, 0> {};
};
template <bool Over> struct NextPrimeSub2 {};
template <> struct NextPrimeSub2<true> {
template <unsigned int PrimeCount, unsigned int Cand,
unsigned int PrimeNum> struct set_state
: UintType<Cand> {};
};
template <> struct NextPrimeSub2<false> {
template <unsigned int PrimeCount, unsigned int Cand,
unsigned int PrimeNum> struct set_state
: NextPrimeSub3<(Cand % GetPrime<PrimeNum>::value)>
::template set_state<PrimeCount, Cand, PrimeNum> {};
};
0911デフォルトの名無しさん
NGNGtemplate <unsigned int PrimeCount> struct NextPrimeSub1 {
template <unsigned int Cand, unsigned int PrimeNum> struct set_state
: NextPrimeSub2<(GetPrime<PrimeNum>::value * 3 > Cand)>
::template set_state<PrimeCount, Cand, PrimeNum> {};
};
template <> struct NextPrimeSub1<0> {
template <unsigned int Cand, unsigned int PrimeNum> struct set_state
: UintType<Cand> {};
};
template <unsigned int PrimeNum> struct GetPrime
: NextPrimeSub1<PrimeNum - 1>
::template set_state<GetPrime<PrimeNum - 1>::value + 2, 0> {};
template <> struct GetPrime<0> : UintType<2> {};
template <> struct GetPrime<1> : UintType<3> {};
#define PRIME(n) (GetPrime<n>::value)
static unsigned int prime_array[] = {
PRIME(0), PRIME(1), PRIME(2), PRIME(3), PRIME(4),
PRIME(5), PRIME(6), PRIME(7), PRIME(8), PRIME(9),
PRIME(10), PRIME(11), PRIME(12), PRIME(13), PRIME(14),
PRIME(15), PRIME(16), PRIME(17), PRIME(18), PRIME(19),
PRIME(20), PRIME(21), PRIME(22), PRIME(23), PRIME(24),
PRIME(25), PRIME(26), PRIME(27), PRIME(28), PRIME(29),
PRIME(30), PRIME(31), PRIME(32), PRIME(33), PRIME(34),
PRIME(35), PRIME(36), PRIME(37), PRIME(38), PRIME(39),
PRIME(40), PRIME(41), PRIME(42), PRIME(43), PRIME(44),
PRIME(45), PRIME(46), PRIME(47), PRIME(48), PRIME(49),
};
enum { n_prime_array = sizeof prime_array / sizeof *prime_array };
struct PutUint : unary_function<unsigned int, void> {
void operator()(unsigned int val) {
cout << val << endl;
}
};
int main() {
for_each(prime_array, prime_array + n_prime_array, PutUint());
return 0;
}
マクロアセンブラでこーゆーネタがあったらしいけど・・・。
0912デフォルトの名無しさん
NGNG0913デフォルトの名無しさん
NGNGASCIIのなんだったっけかな。
0914911
NGNG当時は洩れ自身は消防だったから(消防にすらなってなかったかも)、
実は何に載っていたのかは知らない。ちなみに、911はg++では通ったけど、
VC6やBCCでは通るかどうか。つーか、実験中に何回もコンパイラが死んだ・・・
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNG見た感じ小さいほうから素数を50個列挙するプログラムっぽいけど、
”小さいほうから50個”と静的に決まってるんだったら
unsigned int prime_array[] = { 2, 3, 5, 7, ... (省略), }
と書くのと変わらないと思う。
0917デフォルトの名無しさん
NGNG0918デフォルトの名無しさん
NGNG0919デフォルトの名無しさん
NGNG0920デフォルトの名無しさん
NGNG09211
NGNGゆっくり読ませていただきます。有難うございます>みなさま
0922デフォルトの名無しさん
NGNG過去に、ビット数をカウントする技がありましたが、
int right_shift(int n) //←signedに注目
{ return n>>1;}
signedの右シフトは
if (right_shift(-1) == -1)
が保証されるということでいいんでしょうか?
0923922
NGNG0924デフォルトの名無しさん
NGNG0925922
NGNGこの辺は言語仕様で決まってないのかな。
0926922
NGNGそうですか。といっても違うCPUなんて持ってないし。困った。
0927デフォルトの名無しさん
NGNG後でとんでもないことになりそう。
0928デフォルトの名無しさん
NGNGここ見ると、算術シフトとして保証されてるっぽいが。
0929デフォルトの名無しさん
NGNGhttp://www.ksworks.org/memo/references/cref.htm
>左シフト、右シフトは一方向シフト。 はみ出したビットは捨てられ、反対側には0がシフトインする。
>負の値は(たいていの処理系は)その符号を保持する算術シフトを用いる(処理系依存)
やっぱ処理系依存だそーです。
0930922
NGNGありがとうございます。
じゃあ、処理系毎に算術シフトになるかどうかの切り分けを
入れる必要がありますね。
0931デフォルトの名無しさん
NGNGそして、符号付整数の表現方法は 昔は別の表現もあったが 今は2の補数でないチップはまず無い
-a = not(a)+1 任意の負数は全ビットの1の補数に1を加算したもの=2の補数
でないチップは博物館か、よほど古いシステムでしか残っていない。
そんな環境ではC言語で右算術シフトなんてコ洒落たものは使えないだろう
0932デフォルトの名無しさん
NGNGif ((-1 >> n) == -1)
n:2〜31
0933デフォルトの名無しさん
NGNG0934デフォルトの名無しさん
NGNGunsignedの場合は決まってる。
0935デフォルトの名無しさん
NGNG0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG0938デフォルトの名無しさん
NGNG0939デフォルトの名無しさん
NGNGキタ━━━(゚∀゚)━━━!!
0940デフォルトの名無しさん
NGNG0941デフォルトの名無しさん
NGNGと、ゆー訳で、素数判別1行awkプログラム:
awk '{for(a=int(sqrt($1));$1%a>0;a--);print a-1?"N":"Y",a"*"$1/a}'
0942デフォルトの名無しさん
NGNG0943デフォルトの名無しさん
NGNG{ return !!(rand() % 2); }
0944デフォルトの名無しさん
NGNGすげー!って引数意味ねーじゃん!
0945月並みだが
NGNG(x-x1)*(x-x2)<=0 && (y-y1)*(y-y2)<=0
が真なら矩形内(境界線上含む)に点がある。
0946一応解説
NGNGx>x2 の時、 x-x1>0 かつ x-x2>0 より、(x-x1)*(x-x2)>0
x1<x<x2の時、 x-x1>0 かつ x-x2<0 より、 (x-x1)*(x-x2)<0
とりあえず単純に if 使うよりはトリッキーって事で。
0947デフォルトの名無しさん
NGNG全然トリッキーじゃないです。
それはこれでできます。
((x - x1) | (x2 - x) | (y - y1) | (y2 - y)) < 0
理由は符合ビットが立つかどうかを考えれば一目瞭然かと
0948947
NGNG0949デフォルトの名無しさん
NGNGそれは負数が2の補数表現じゃないと通用しないが
0950デフォルトの名無しさん
NGNG0951デフォルトの名無しさん
NGNG次スレ頼むわ
0953デフォルトの名無しさん
NGNG<, <=, >, >=
の演算を行わずに判定する方法はありますか?
0954953
NGNG0955デフォルトの名無しさん
NGNG0957デフォルトの名無しさん
NGNG0959デフォルトの名無しさん
NGNGドット単位で全走査。
0961デフォルトの名無しさん
NGNG0963デフォルトの名無しさん
NGNGa<bは、sign(a-b)!=0と同じ。
あとはもう自明なので述べない。
0964953
NGNGつーか、それって sign 自体が内部で(0との)大小比較を行っているだけ
だと思うが(メモリ上での操作は別として、意味的に)。。。
しかしコンピュータの中で動く以上、それもまた回答になるのだろう。
ま、こんな問題、あまり深く追求しても仕方ないか。
とりあえず付き合ってくれてありがと。
0965デフォルトの名無しさん
NGNG0966デフォルトの名無しさん
NGNG0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1038215563/
0970デフォルトの名無しさん
NGNG0971名無しさん
NGNGΛ_Λ | 君さぁ こんなスレッド立てるから |
( ´∀`)< 厨房って言われちゃうんだよ |
( ΛΛ つ >―――――――――――――――――――‐<
( ゚Д゚) < おまえのことを必要としてる奴なんて |
/つつ | いないんだからさっさと回線切って首吊れ |
\____________________/
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG0977いいかげん
NGNG0978デフォルトの名無しさん
NGNG0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNG0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG0986デフォルトの名無しさん
NGNG0987デフォルトの名無しさん
NGNG0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNG0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNG0992デフォルトの名無しさん
NGNG0993デフォルトの名無しさん
NGNG0994デフォルトの名無しさん
NGNG0995デフォルトの名無しさん
NGNG0996デフォルトの名無しさん
NGNG0997デフォルトの名無しさん
NGNG0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。