[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 04:06 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

gotoを恐れず使う兵共がfinallyや多重breakを語るスレ



1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/

730 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:02:24 ]
>>729
せいかい^^

731 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:19 ]
ごとーさんがお怒りですよ

732 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:35:00 ]
>>731
だれ?

733 名前:GOTO mailto:sage [2008/02/16(土) 23:56:15 ]


734 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:18:43 ]
見やすかったらどっちでもいいよ

735 名前:デフォルトの名無しさん [2008/02/17(日) 03:32:45 ]
>>719 でけた。TRY〜END_TRYの中からreturn出来ないけど。
typedef struct ex_handler_rec_ ex_handler_rec_;
struct ex_handler_rec_ {
    ex_handler_rec_ *volatile prev_;
    jmp_buf jbuf_;
    const char *volatile ex_type_;
    void *volatile ex_data_;
};
ex_handler_rec_ *volatile current_handler_ = NULL;

#define EX_ABBREV(x) x
#define TRY { \
ex_handler_rec_ EX_ABBREV(ex_handler_); \
int EX_ABBREV(need_rethrow_) = 0; \
if (0) BREAK_TRY; /* mandate finally clause */ \
EX_ABBREV(ex_handler_).prev_ = current_handler_; \
current_handler_ = &EX_ABBREV(ex_handler_); \
if (setjmp(EX_ABBREV(ex_handler_).jbuf_) == 0) {

#define BREAK_TRY goto EX_ABBREV(break_entry_)
#define RETHROW goto EX_ABBREV(rethrow_entry_)

#define CATCH(extype) \
} else if (!extype || !strcmp(extype, EX_ABBREV(ex_handler_).ex_type_)) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;
#define CATCH_ALL \
} else if (1) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;

736 名前:デフォルトの名無しさん [2008/02/17(日) 03:33:37 ]
#define FINALLY \
} else { \
   if (0) goto EX_ABBREV(rethrow_entry_); /* supress warning */ \
EX_ABBREV(rethrow_entry_): \
   EX_ABBREV(need_rethrow_) = 1; \
} \
EX_ABBREV(break_entry_):; \
if (current_handler_ == &EX_ABBREV(ex_handler_)) /* no exception */ \
   current_handler_ = EX_ABBREV(ex_handler_).prev_; \
{

#define END_TRY } \
if (EX_ABBREV(need_rethrow_)) \
   throw_exception(EX_ABBREV(ex_handler_).ex_type_, EX_ABBREV(ex_handler_).ex_data_); \
    }

void throw_exception(const char *ex_type, void *ex_data) {
    ex_handler_rec_ *handler = current_handler_;
    current_handler_ = handler->prev_;
    handler->ex_type_ = ex_type;
    handler->ex_data_ = ex_data;
    printf("throw_exception %s\n", ex_type);
    longjmp(handler->jbuf_, 1);
}

737 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:40:13 ]
こういう風に使う。EX_ABBREVマクロを再定義することでTRYのネストができる。
TRY {
#undef EX_ABBREV
#define EX_ABBREV(x) a_##x
    TRY {
        if (cond)
            BREAK_TRY;
        throw_exception("hoge", cond2 ? "abc" : NULL);
    } CATCH("fuga") {
        if (a_ex_data) /* throw_exceptionの第二引数はEX_ABBREV(ex_data)に入る */
            printf("%s fuga\n", (char *)a_ex_data);
        else
            RETHROW;
    } FINALLY {
        printf("inner finally\n");
    } END_TRY;
#undef EX_ABBREV
#define EX_ABBREV(x) x
} CATCH("fuga") {
    printf("fuga %s\n", ex_data);
} FINALLY {
    printf("outer finally\n");
} END_TRY;

738 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:46:42 ]
きめぇぇぇぇ



739 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:21:39 ]
具体例なんて、普及しているオープンソースのコードを引っ張ってきて
grep goto すりゃ見つかるだろ。


740 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:25:13 ]
return 時に実行してくれない finallyに何の意味がある?
あと、for,whileなどのループ内では、このマクロは使えないね。
(BREAK_TRY のあと、ループ脱出条件を再度判定してbreak文を実行しなきゃならない:二度手間)

741 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:47:21 ]
>>725
2chは行数制限があるから実用されているコードを貼るのは無理だね。
アンカーではなくポインタは示すので、あとは自分で調べて。
# apache が実務的なコードでないという奴はいないよな?

$ grep -r -n goto httpd-2.2.8/server
httpd-2.2.8/server/vhost.c:717: goto bad;
httpd-2.2.8/server/vhost.c:747: goto bad;
httpd-2.2.8/server/vhost.c:754: goto bad;
httpd-2.2.8/server/vhost.c:904: goto found;
httpd-2.2.8/server/vhost.c:916: goto found;
httpd-2.2.8/server/mpm/netware/mpm_netware.c:421: goto got_listener;
httpd-2.2.8/server/mpm/winnt/child.c:954: goto shutdown;
httpd-2.2.8/server/mpm/winnt/mpm_winnt.c:871: goto die_now;
httpd-2.2.8/server/mpm/experimental/event/event.c:1140: goto worker_pop;
httpd-2.2.8/server/mpm/worker/worker.c:882: goto worker_pop;
httpd-2.2.8/server/mpm/prefork/prefork.c:614: goto got_fd;
httpd-2.2.8/server/mpm/beos/beos.c:560: goto got_a_black_spot;
httpd-2.2.8/server/mpm/beos/beos.c:562: goto got_fd;
httpd-2.2.8/server/util_xml.c:58: goto read_error;
httpd-2.2.8/server/util_xml.c:79: goto read_error;
httpd-2.2.8/server/util_xml.c:88: goto read_error;
httpd-2.2.8/server/util_xml.c:93: goto parser_error;


742 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:54:58 ]
>>741
おいおい、今さら提示しても遅いって。>>723
> -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
とか
> なんら実務面の利点を示しているわけではない。
とか書いた時点で、じゃあgotoの実用的かつ正しい使い方というのは
どんな具体例があったんだよって話なんだから。

743 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:55:01 ]
goto肯定派曰く「何も考えずにgotoを使う奴などいない」
goto否定派曰く「全てのgotoが駄目だという奴などいない」

であれば、肯定派否定派など互いにレッテルを貼っているだけで不毛な言い合いだな。
「どういう場合にgotoを使うのか、使わないのか」という具体的な議論にこそ意味があると思うが。


744 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:59:38 ]
>>742
linuxカーネルの話は723よりも前に出ている。

ま、くだらない貶しあいには興味がないので具体例で。
vhost.cの最初の3つはこういう構造。

static void fix_hostname(request_rec *r) {
 ...
 if (rv != APR_SUCCESS || scope_id) { goto bad; }
 ...
 if (r->hostname[0] != '[') {
  for (dst = host; *dst; dst++) {
   if (apr_islower(*dst)) { ... }
   else if (*dst == '.') { ...; goto bad; }
   else ...
  }
 }
 ...
 return;
bad:
 ...
 return;
}


745 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:03:07 ]
自分は>>744のgotoの使い方は特に問題がないと思う。見やすい。

gotoを使わずにより良いコードを書ける人は代案をよろしく。
「744のように端折られると詳細がわからないから書けない」という言い訳はなしな。

「本物」のコードへのポインタは>>741にある。必要なら本物を見てくれ。


746 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:05:30 ]
それから、一つだけ。

抽象的な言い合いの間は散々吠えておいて、
こういう流れにされると何もいえなくなる人へ。

「お前はgotoを使うな」

747 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:22:04 ]
vhost.cの下2つ(L904, L916)はこの関数。

static void check_hostalias(request_rec *r) {
 処理
 for (ループ条件) {
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
 }
 return;
found:
 r->server = s; // この一文のみ
}

これはごく単純なgotoの例。多重ループでも何でもないが、使わない人フラグを立ててbreak?
r->server=s; return;を二箇所に書くという書き方も、二箇所程度ならありかもね。

748 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:24:39 ]
>>744
bad:
...
return;
な部分をマクロにしちゃえばgotoなんて使う必要ないんじゃ?



749 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:27:08 ]
mpm_netware.cでの使われ方

for (ループ条件) {
処理
do {
処理
if (条件) goto got_listener;
処理
} while (ループ条件);
continue;
got_listener:
処理
}


750 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:32:07 ]
>>749
goto got_listenerが一箇所なら
if (条件) {処理; break;}で済む問題だな。
複数箇所なら処理をstatic関数にすればいい。
そもそも「処理」ってくくれるぐらいまとまってるんだろ?

751 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:33:27 ]
ちなみにこうやって具体的なコード片で議論しても
全体の構造うんぬんの話の検証にはならない。
というか、むしろ局所的な制御しか考えてないと
goto慎重派に言われても仕方ないことになるが。

752 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:37:26 ]
このパターンは条件がどんどん後付けされるのでは?
過去何度かあったろ。いいかげん気付け。

753 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:41:45 ]
今度のパターンは条件を後付けする必要ありません。
次から次へのgrep gotoした結果がタレ流されるパターンです。
1つの例にレスがついたらその議論を先にするのが礼儀というものだが
このスレのgoto厨は無視してひたすらgrepを続けます。
それがgotoクオリティ。

754 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:41:58 ]
>>750
>そもそも「処理」ってくくれるぐらいまとまってるんだろ?

いや。got_listenerの後の処理は長い。
do whileで条件を満たせなかった場合はcontinueするという意図のコード。

>>751
そうか。

>>752
ならばコードを読め。>>741参照。

755 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:49:46 ]
>>748
マクロは意図するところが十分に明確で、かつ処理が短い場合は良いアイデア。
今回の実際のコードではreturnを入れて3文なので悪くはないかも。
(r->statusに代入、ログ吐き、return)

ただしマクロの濫用もコードの可読性を落とすので避けるべき。
vhost.cはマクロについては単純なものしか使っていないので、ポリシーの違いだろうね。

756 名前:デフォルトの名無しさん [2008/02/17(日) 07:52:51 ]
正解は753でしたw

757 名前:デフォルトの名無しさん [2008/02/17(日) 07:54:54 ]
バカが浮き彫り

758 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:55:28 ]
>>754
いや、俺が言ってる「まとまってる」のは長さじゃなくて、
使う変数の依存関係が閉じた傾向にあるという意味。




759 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:58:17 ]
goto肯定派は実用的なコードから
「ここはこうgotoを使えばもっと綺麗になるのに」
という例を出すつもりはないのかね。

いつでもgoto慎重派にコードを書かせるのは
フェアじゃないと思うのだが?

760 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:04:27 ]
今、>>759 が良い事を言った!
さあ「gotoを恐れずに使う兵共」の腕の見せ所だ!

761 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:23:27 ]
>>758
そうか。閉じた傾向とか何ともいえないのでソースを読んで。

>>759
それこそ全然フェアじゃない。
・「Cで書かれた実用的なプログラムでgotoを一切使っていないもの」が一つも出されていない。
・「ここはこう」の「ここ」を見つけるために、相手にそのプログラム全体を全て読めと?

相手にコードを書かせようと思うなら、題材くらい自分で出せ。


762 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:26:54 ]
ていうか、プログラマとして非常にガッカリなのは、

情報として>>741が出されて、それを題材にしているにも関わらず、
実際にhttpdのソースをダウンロードして自分でソースを追ってみた人が、
ここで議論している人の中に誰もいなそうってところだな。

コードリーディングしない人には、コードを語る資格も能力もないよ。

763 名前:デフォルトの名無しさん [2008/02/17(日) 08:40:57 ]
具体論になると机上の空論と違って盛り上がらないねえ

764 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:43:08 ]
>>762>>748>>750は無視ということか。

grep するだけなら楽でいいもんな。プ

765 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:46:32 ]
>>764
750は明らかに749しか読んでいないと思われ。

実際のコードに当たったらこんな発言が疑問形で出るわけがない。

>そもそも「処理」ってくくれるぐらいまとまってるんだろ?

そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。


766 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:47:34 ]
強調するが、ここが重要ね。

  そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。


767 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:48:47 ]
そういう>>765は手あたり次第grepしただけ。
そうじゃないと言うのなら、
「ここはこうgotoを使えばもっと綺麗になるのに」
という例があるはずだから、それを提示しろ。

できないなら、コード読まない厨認定な。

768 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:49:28 ]
煽ったり議論したりする暇はあるんだから、ついでにちょっとコードも読めばいいのにね。

と思うよ俺は。




769 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:50:04 ]
>>763
一方的に「コード読め」「改善策を出せ」と言うばかりの香具師がいるからな

770 名前:デフォルトの名無しさん [2008/02/17(日) 08:50:15 ]
悪魔の証明を知らない人w

771 名前:デフォルトの名無しさん [2008/02/17(日) 08:50:37 ]
>>768 オマエガナー wwwwwwwwwwwwwwwwwwwwwwwwww

772 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:52:10 ]
>>770
そうそう。grep厨はコードの断片を見せるだけで
議論は永遠に続くことになるんだよな。アフォらし。

773 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:02:40 ]
強調するが、ここが重要ね。

  そこに気付かない>>766自身も、他人を煽るだけで自分はコードを読んでいない。



774 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:08:42 ]
こういうスレを読んでいると感じるけど
2chって「馬鹿しか得るものがない」場所だよね。

何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。
教える側は何故か相手に罵倒されながら一方的に情報を提供して自分は何一つ得るものがない。

なので普通の人は嫌になってすぐに去り
2chに残るのは自己犠牲精神に満ち溢れた聖人と馬鹿だけ。

775 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:24:50 ]
>>774
> 何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。

goto厨のことだね。
goto慎重派はちゃんと改善例を提示しているのに
goto厨は文句を言うばかりで何の改善例も提示しない。

776 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:33:40 ]
>>774
たかがgrepしただけでそこまで上から目線で言える根性が気に入った。

>>775
goto肯定派もコード出してるよ。>>469とか。目が腐りそうな糞コードだけど。
ちなみに>>469>>485という形でgotoを使わずに可読性が上がったね。

777 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:35:56 ]
485=774=grepした人=744以降でコード断片を出した人=普通の人なので去ります

778 名前:デフォルトの名無しさん [2008/02/17(日) 09:38:20 ]
と言いつつキリ番ゲットした>>777、オメ。



779 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:56:30 ]
777が去った今このスレの運命は776の手腕にかかっている

780 名前:653 mailto:sage [2008/02/17(日) 10:11:45 ]
6.8
自動記憶域期間をもつオブジェクトの初期化子、(略)は、
文の場合と同じく実行中に宣言に到達するたびにこれを評価し、
値をそのオブジェクトに格納する。

とあるので、gotoで宣言(と初期化)をまたぎこしていると、
初期化はされないとすべきのようです。

また、C99では「可変修飾型をもつオブジェクトの宣言を飛び越しては
ならない」という制限が加わってますね。なるほど。

781 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 10:37:43 ]
>>776
goto否定派もコード出してるよ。>>267とか。目が腐りそうな糞コードだけど。
ちなみに>>267>>263という形でgotoを使って可読性が上がったね。


782 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:07:56 ]
一人で頑張ってる嫌goto厨。
後輩に得意になって言っちゃったの?
gotoは使うなって。

783 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:12:38 ]
異議あり!代案なーし!
異議あり!代案なーし!
異議あり!代案なーし!


784 名前:デフォルトの名無しさん [2008/02/17(日) 11:16:33 ]
>>263>>379で否定されたがね。

  if (A_init() != 0) goto FAILED;
  if (B_init() != 0) 80+0; FAILED:
  if (C_init() != 0) goto FAILED;
  if (D_init() != 0) goto FAlLED;

FAlLED:

しかしまいったね。
・・


785 名前:デフォルトの名無しさん [2008/02/17(日) 11:17:33 ]
アホなレス乞食ががんばっていますね

786 名前:デフォルトの名無しさん [2008/02/17(日) 11:18:12 ]
>>783
代案?
すべての法律がダメだけどそれを国会議員200人ぽっちで作れるわけないだろ。
社会保険庁ですら数万人いるのに。


787 名前:735 mailto:sage [2008/02/17(日) 11:18:51 ]
>>735-736はバグってた。
CATCH節の中でthrow_exceptionするとFINALLYが走らない。
こりゃ結構恥ずかしい。インデントも崩れてるし。

788 名前:デフォルトの名無しさん [2008/02/17(日) 11:19:23 ]
ほお。

あなたに悪意を持つプログラマが goto を 80+0 と書いて
嫌がらせをするかもしれないから goto を使うべきではない

と。

ヴァァァァァァァァァァァ
ァァァァァァァァァァァ
ァァァァァァァァァァァァァァァァァァァァァァ
ァァァァァァァァァァァカ
じゃねーの?wwwwwwwwwwwwwwwwwwwww



789 名前:デフォルトの名無しさん [2008/02/17(日) 11:20:41 ]
どうでもいいけどダイクストラが言ってから今年で40周年か

見事な釣り師だな

790 名前:デフォルトの名無しさん [2008/02/17(日) 11:23:18 ]
>>788
森田さんこんなところにいたんですか。

ちなみに80+0と書き換えた森田さんは日常的に2ch語を上司に向かって話す極めつけの2chネラで、
バカジャネーノってAA使いまくりな人。

生まれは九州は福岡のとある会社の社長の息子。


791 名前:デフォルトの名無しさん [2008/02/17(日) 11:23:28 ]
「gotoを使うな」の釣り糸一本で
40年間、たぶん何百万人という単位のプログラマを釣りあげてる
恐るべしダイクストラ


792 名前:デフォルトの名無しさん [2008/02/17(日) 11:25:34 ]
>>791
大工さんはWhileをgotoで書くなと言っただけじゃね?

goto使いだってwhile使えるところでgotoとか使わないだろ。


793 名前:デフォルトの名無しさん [2008/02/17(日) 11:28:53 ]
sage不可能な良スレ

794 名前:デフォルトの名無しさん [2008/02/17(日) 11:30:33 ]
>>790
『福岡人はgoto禁止』でいいんじゃね?

795 名前:デフォルトの名無しさん [2008/02/17(日) 11:31:49 ]
違うか。森田さんは80+0って書いただけでgotoは書いてないもんな。
『福岡人と仕事するときはgoto禁止』?
いや『福岡人は面接で落とせ』?

796 名前:デフォルトの名無しさん [2008/02/17(日) 11:32:40 ]
福岡禁止

797 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:05:02 ]
80+0なんてキーワードハイライトがあれば容易に見抜けないか?
あと、0に斜線が入ったフォント使うとか(0とoのような個別の事例にしか使えないけど)。

798 名前:デフォルトの名無しさん [2008/02/17(日) 13:26:42 ]
>>797
いやそれがね、うちの会社、ウィルスバスターが更新しないように、インストーラーに手を加えた上でウィルス感染させやがるんですよ。
イントラネット管理者の統括してる本人がやるから信用しちゃうでしょ。
福岡に本社のある東京一部上場企業なんだけど。

だからエディタにキーワード追加くらい簡単にやってのけるよ。




799 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:39:04 ]
もはや798が質の悪い吊りだと見抜く方が容易

800 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:41:59 ]
>>797
つうか字形が違いすぎてしばらく話の流れが全く理解できなかったよ

801 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:10:20 ]
じゃあ次、コンパイラで使われていないラベルに対して警告を出すようにする。

802 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:58:28 ]
>>798
電子計算機損壊等業務妨害 で告訴しろ。
(告訴状作って会社の法務部に送りつけるだけでも効果あるぞ)

803 名前:デフォルトの名無しさん [2008/02/17(日) 15:07:57 ]
>>802
人事部に電話したら、「会社の方針でお前を監視してるんだから逆らうな」って言われたから。
人事部長と直接話したいって言ったけど無視された。
会社クビにされるときに人事部長を名乗る人が来たけど、なんと創価学会の池田先生に瓜二つ。

804 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:16:56 ]
>>803
こちらへどうぞ
ttp://pc11.2ch.net/test/read.cgi/prog/1197192900/

805 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:26:19 ]
>>803
「他人にいたずらされている」という妄想を抱いて、「なら反撃で、いたずら
し返さなければ」とイタズラして、会社側から疑いをかけられて監視されて、
あげくのはてにイタズラしていたことがバレてクビになった。

としか、文章からは読み取れない。

806 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:58:23 ]
むしろメンヘル逝きをお勧めしたい。

807 名前:デフォルトの名無しさん [2008/02/17(日) 16:30:11 ]
結局大工は釣りだとかいう観念論しかできないんだねw

808 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:20:45 ]
いくら上げても技術要素0%のレスで火は起こせないか



809 名前:645 mailto:sage [2008/02/17(日) 20:42:55 ]
気になったので、gccでやってみた

void bar(int);
int func(int arg)
{
if(arg == 0)
goto foo;

{
int i;
i = arg*2;
foo:
bar(i);
}

}


810 名前:645 mailto:sage [2008/02/17(日) 20:43:39 ]
.file "gototest.cpp"
.text
.align 2
.globl __Z4funci
.def __Z4funci; .scl 2; .type 32; .endef
__Z4funci:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
cmpl $0, 8(%ebp)
jne L2
jmp L3
L2:
movl 8(%ebp), %eax
addl %eax, %eax
movl %eax, -4(%ebp)
L3:
movl -4(%ebp), %eax
movl %eax, (%esp)
call __Z3bari
leave
ret
.def __Z3bari; .scl 2; .type 32; .endef

こうなる。
やはりiは確保されません。

811 名前:デフォルトの名無しさん [2008/02/17(日) 20:48:02 ]
>>810
goto使うなっての以上に、ブロックで変数定義するなってのもある。


しかし、オブジェクトはその場所で作るしかないんだな。


812 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:33:13 ]
だからレジスタに割り当てられてるんじゃないの?

813 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:44:22 ]
>>812
たった4つの32ビットレジスタで計算しないといけないのにそんな無駄なことできないでしょ。
少なくとも何かをするとしたらレジスタを使う。
やるとしても小さいループのループカウンタくらいか。


814 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:47:27 ]
goto fooすりゃi=arg*2が実行されないのは当然ダロ
何を期待してんのかわからn

815 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:58:11 ]
>>813
内側のブロックで宣言できないとしたら、
外側のブロックで宣言するだけ。
実態としては何も変わらない。

816 名前:645 mailto:sage [2008/02/17(日) 22:02:54 ]
>>814
ああ、テキトーに作った例だから、実際の動作は気にしないでくれ。
問題は、ブロックの中で定義した変数の領域が確保されていないのに、関数呼び出しに使われてしまうという事実ね。
多分、foo: の後にi = i+argなんてやってもダメだと思う。

817 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:03:51 ]
>>816
ヒント: jne L2 が実行された場合は L2 のどこで「領域が確保」されていますか?


818 名前:645 mailto:sage [2008/02/17(日) 22:04:03 ]
809のiの定義の後でiに代入してるのはコンパイラにiの定義をスルーさせないように、それらしい仕事をさせたかったから。



819 名前:645 mailto:sage [2008/02/17(日) 22:04:41 ]
>>817
ああ、別にされてないね。


820 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:26:56 ]
データフロー解析ぐらいは最近のコンパイラなら当たり前だよ?
ガチガチにソースコードに対応するようなコードを吐いて欲しいなら
-O0 を付けるとか...してもそこまでガチガチなコードが出るかどうか。

821 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:28:40 ]
>>820
そういう問題じゃない。出ているコードは綺麗にソースに対応している

822 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:46:57 ]
スタックフレームが
>subl $8, %esp
で8バイト確保されていて
iが
>-4(%ebp)
なら、関数の先頭で「確保」されてるんじゃね?

823 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:48:59 ]
>>822
正解

824 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:57:19 ]
>>811
>goto使うなっての以上に、ブロックで変数定義するなってのもある。

いやこれはするだろ。
あれ、みんなしない派?

825 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 03:21:11 ]
俺は、近くで定義したい派。
ブロック内で変数定義することはある。
ただ、外の変数と名前がかぶらないほうがいいかなぁ〜、くらいは気を使う。

826 名前:デフォルトの名無しさん [2008/02/18(月) 08:18:56 ]
普通は最小スコープ(内側のスコープ)で定義するのが常識

827 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:06:07 ]
それ厳密に適用するととんでもないことに

828 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:25:19 ]
手続き的にやろうとするから、変数を外のスコープにひっぱり出すとかが
必要になる。関数的に、なんでも再帰あちこちでreturnな書き方をすれば
それでうまくいく。



829 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:26:48 ]
>なんでも再帰あちこちでreturn
吊り?

830 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 16:00:57 ]
>>813
そんな特定のアーキテクチャに依存した話を突然持ち出されてもねえ、、、






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef