トップ «前の日記(2008-11-25) 最新 次の日記(2008-11-27)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|

ToDo:


2008-11-26

_ もんだい

struct structa1 {
    int f1;
    int f2;
};
struct structa1 s1;
s1.f1 = 1;
s1.f2 = 2;
t = 3;
printf("hoge: %d %d %d\n", s1.f1, s1.f1, t);
printf("hoge: %d %d %d\n", s1.f1, s1.f2, t);
printf("hoge: %d %d %d\n", s1.f2, s1.f1, t);
printf("hoge: %d %d %d\n", s1.f2, s1.f2, t);

hoge: 1 1 3
hoge: 1 2 2
hoge: 2 1 2
hoge: 2 2 2

となる理由を述べよ。

(01:44)

_ こたえ

コンパイラがバグってる。

(01:45)

_ ゴルフ会

http://shinh.skr.jp/m/?date=20081126#c02

今さっき思いついたんですが、 お忙しい方とか codegolf.com に参加してない方も 夜だけ参加とかどうでしょうか的な。

(23:56)

本日のツッコミ(全7件) [ツッコミを入れる]
_ kodera (2014-05-24 01:26)

t が float/double とかいう話かと思ったら、なんというオチw

_ shinh (2014-05-24 01:26)

正確には、実は x86-64 の話で、第4引数の RCX (3) をセットした後に第3引数の RDX (2) をセットするわけだけど、そのためのテンポラリの領域として RCX が使われてしまったとかいう、んなもんわかるかっていう話なのでした。

ところで kodera さんゴルフ会いかがでしょうか。 codegolf.com に参加されてないのは百も承知ですが、昼ネタバレ会→夜適当に宴会みたいな感じで考えてるので、夜だけ参加とか…

_ tako (2014-05-24 01:26)

面白そうなので再現してみたかったのですが、できませんでした(gcc,4.1.2,4.2.4)。差し支えなければ詳しいバージョン、コンパイル時の変数等をお願いします。

_ kodera (2014-05-24 01:26)

なるほど。浮動小数点数をFPUレジスタ渡しする様なアーキテクチャだと、型間違えると普通に起こりえちゃうバグなんですが、まぁ普通のバグの事をわざわざ書かないですよねw

ゴルフ会お誘いありがとうございます。codegolf.com、実はアカウントを作るところまでは行ったんですが…
宴会だけ参加とか、非常に魅力的ですね。
「でも、お若いんでしょう?」…というのはありますが、都合が付けば参加させて頂きたいです。
日程とかは既に決まっているのでしたっけ?

_ kodera (2014-05-24 01:26)

あれ、なんか嘘書いたかも。t の値が固定で連続実行してたら、
型違いで値がおかしくなっても変動する事は無さそうですね。
レジスタ渡しか否かは、このケースでは関係無さそうですし。

_ kodera (2014-05-24 01:26)

自信無くなったので確認したら、やっぱり嘘じゃなかったみたいです。うーむ。

_ shinh (2014-05-24 01:26)

> tako さん

まぎらわしいこと書いてすいません。手元で TCC いじって遊んでて起きたバグを書いただけなので、どこにも存在しないコンパイラです。

> kodera さん

x86-64 も浮動小数をSSEレジスタ渡しするので、

int main() {
    /* 3 1.200000 */
    printf("%d %f\n", 1.2, 3);
}

とかなったりして面白かったりとかあります。 t が浮動小数だと何入ってるかわからんレジスタいじることになって、かつ、 s1.f1 と s1.f2 はたぶん処理が違うだろうから(オフセットがあるため)、使うレジスタが変わって変動するのもありそげなことかなという感じかと思います。

ゴルフ会は 12月6日 秋葉原で、昼は18:30終了ということになってるので19:00くらいから適当に宴会とかできればいいかなぁという感じです。もし興味がありましたらメールなどいただければ嬉しいです。次回などがある時もお誘いさせていただきたいですし。

年齢はたぶん20代後半が支配的な感じじゃないかなというくらいで、 z80 が青春という感じですと、まぁ気にならん程度じゃないでしょうか。

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2008年
11月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
1.shinh(2014-05-24 01:26) 2.kodera(2014-05-24 01:26) 3.kodera(2014-05-24 01:26)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h