2ちゃんねる版 邪悪なCコードコンテスト

このエントリーをはてなブックマークに追加
527デフォルトの名無しさん:2006/10/10(火) 00:15:38
>>525
>配列の範囲をオーバーするアクセスは動作未定義。
マジで? きっちり定義されてたものだと思ったが・・・
528デフォルトの名無しさん:2006/10/10(火) 00:24:49
宣言された配列の範囲外はアウトだろうけど、
サイズ0の配列はmalloc()で割り当てるから問題ない。
529デフォルトの名無しさん:2006/10/10(火) 01:18:49
>>527

#include <stdio.h>
int main(void) {
volatile int i, arr[10];
for (i = 0; i < 20; i++) arr[i] = (int) main;
printf("Hello\n");
return 0;
}

うちの処理系(VC++2005)でこいつをコンパイルして実行したら、「Hello」がたくさん
表示された挙げ句に落ちた。これは定義された動作とは言えない。
ちなみにvolatileは最適化によるコードの消滅を回避するために必要。


>>528
ほとんどのコンパイラの実装だとまあ問題ないだろうが、それでも標準ではない。
VC++2005だとゼロ配列の定義は禁止されるし、構造体の末尾で宣言しても
非標準の拡張機能とやらで警告される。

万が一添え字を検査するような処理系があったとしたらmallocの余白が後方に
あろうが何だろうが容赦なく落とす可能性もある。
530デフォルトの名無しさん:2006/10/10(火) 01:33:56
>>529
それは落ちるでしょ。メモリ確保して無いんだから。アホですか。
サイズ0の配列定義は、共用体で真価を発揮するんだよ
531デフォルトの名無しさん:2006/10/10(火) 01:55:15
サイズ0については、C99で明確に使用可能となった。
C++でも出来た気がするが、処理系依存かもしれない(GCC等では、Cでも出来る)。

可変長構造体は、昔から使われているテクニック。
ファイルフォーマットがどうのというのは、本当のメリットではない。
(ヘッダとデータを別領域に置くやり方と大差ない)
本来は、例えば下のFAQの例において、namestrをポインタとして実体を別に持つことと比較して
mallocの呼び出しコストと管理領域(およびポインタ1つ分の領域)を節約するというのが
明らかなメリットを生かした使い方となる。

で、この可変長構造体と呼ばれるテクニックは、
C FAQにおいても、邪道ながら「全てのコンパイラで使える」と記されている。
http://www.kouno.jp/home/c_faq/c2.html#6
intのサイズを始め、ほとんどの「規格に明記されていない点」は
例外的な処理系をいくつも挙げているというのに。
532デフォルトの名無しさん:2006/10/10(火) 03:25:49
>>531が綺麗にまとめてくれた。
けど、まあ、やっぱりそれでも、普通に邪悪だよな。
むしろC99で認められたあたり、完全にプロ向けの言語仕様だから
故意的に使うなら構わないってことなのかもしらんけど、
はじめて見た時は目疑った。
533516:2006/10/10(火) 06:38:35
誰も、C言語の話ししてねーよ。
可変長構造体の話でもねーよ。

ArrayListの実装として、動的配列が使われていたりすると、
Length = 0で、当たり前の状況として、Size 0の配列ができあがるわけだが。
別に、ArrayListに限った話ではなく、生で使う場合でも、あるって話。
534デフォルトの名無しさん:2006/10/10(火) 06:45:52
不思議なのは、元々の話が「C言語での話」であって
その中で「サイズ0の配列」の話が出ているのに

一人だけが「誰もC言語の話じゃない」と叫んでいること。
535デフォルトの名無しさん:2006/10/10(火) 08:46:16
>>530
>>529は単に
>配列の範囲をオーバーするアクセスは動作未定義。
の簡単な例を挙げているだけに見えるのだが。そんなところに噛み(ry
と、どうでもいいところにつっこんでみるテスト
536デフォルトの名無しさん:2006/10/10(火) 11:31:54
>>534
しらねーよ。
オレ、C言語使いじゃないし
537デフォルトの名無しさん:2006/10/10(火) 12:29:49
でもこのスレC言語用なんだよね
538デフォルトの名無しさん:2006/10/10(火) 15:28:57
>>536
スレタイ100万回読め
539デフォルトの名無しさん:2006/10/10(火) 19:04:48
>>536
百万秒ROMってろ。
540デフォルトの名無しさん:2006/10/10(火) 21:06:30
>>536
習っとけよ。コンピュータ使いの一般教養なんだから。
541ぼるじょあ ◆yEbBEcuFOU :2006/10/10(火) 21:50:12
>>536
(・3・) エェー
542デフォルトの名無しさん:2006/10/10(火) 22:21:46
>>536の人気に嫉妬w
543デフォルトの名無しさん:2006/10/10(火) 23:04:32
>>536みたいなヤツって
友達だったら面白いヤツだけど、
会社の同僚だったら殺したいヤツだな。
544デフォルトの名無しさん:2006/10/10(火) 23:49:39
友達にしたってトイレに流すわ、こんな厨房。
545デフォルトの名無しさん:2006/11/07(火) 16:58:52
遅ればせながら、
ドヴォルザークの英語の綴りをググっている最中にここに辿り着きました。
546デフォルトの名無しさん:2006/11/07(火) 17:43:23
ドヴォルザークでなぜここにw
547デフォルトの名無しさん:2006/11/07(火) 23:06:04
ドヴォラック配列のことかー。
548デフォルトの名無しさん:2006/11/23(木) 14:12:26
>>539
それって、約11日半。
半年に満たない。
549デフォルトの名無しさん:2006/11/23(木) 19:27:02
>>548
だからもう書いてもいいんだよ。良かったね。
550デフォルトの名無しさん:2006/12/03(日) 09:13:45
main()
{
printf("ハングルい むぐるうなふ くとぅるぅ るるいえ ウリ=ナムル ダンクン\n");
}
551470:2006/12/24(日) 04:38:16
>>473
上連雀三平は、エロを通じて漫画の面白さを世に広めようとしてるんだよ。
アナルジャスティスも、となりの精液さんも、単なる通過点に過ぎない
と断言してもいい。

>>474
短編なら宇宙のよめがお勧め。
552デフォルトの名無しさん:2006/12/24(日) 16:10:49
ここは・・・
誤爆につっこむ奴が居ないほど
過疎っているのか……
553デフォルトの名無しさん:2006/12/24(日) 20:10:00
>>552
そうでもない。例えば>>552とかがつっこんでる。
554デフォルトの名無しさん:2006/12/28(木) 21:02:57
#define sizeof printf
#define long "%d %d\n", x??(10??), x??(11??)
main()
??<
int x??(100??);

x??(10??) = 2;
11??(x??) = 3;
printf("longのサイズ = %d\n", sizeof(long));
??>
555デフォルトの名無しさん:2007/01/12(金) 18:18:21
もっとも短いC言語ソースコード

P;
556デフォルトの名無しさん:2007/01/13(土) 03:37:35
>>555
もっと短いC言語ソースコード

;
557デフォルトの名無しさん:2007/01/13(土) 03:51:42
最高に短いC言語ソースコード

558デフォルトの名無しさん:2007/01/13(土) 05:38:32
>>555をコンパイルするためのコンパイルオプション

cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" \
  -DP="main(){X}" -DR="read(0,&c,1)" -DT="c!=015" \
  -DW="while(C)I" -DX="char c;W" file.c

というオチ
559デフォルトの名無しさん:2007/01/14(日) 00:24:31
2ちゃんのcgiをcで書いたら最適化と称してものすごく邪悪なコードになりそうだな
560デフォルトの名無しさん:2007/01/14(日) 01:00:13
既にcで書かれているわけだが
561デフォルトの名無しさん:2007/01/14(日) 01:17:52
read.cgiってcだったんだっけ
562デフォルトの名無しさん:2007/01/14(日) 07:12:41
read.cgiだけCだったかと。
563デフォルトの名無しさん:2007/01/14(日) 12:41:19
Cじゃなきゃ処理できないでしょ、リクエスト数的に。

UNIX板の連中が書き直したんじゃないっけね、第1次消滅危機のとき。
564デフォルトの名無しさん:2007/01/14(日) 16:43:24
ちぇっく
565デフォルトの名無しさん:2007/01/15(月) 02:50:02
80行ローグライク
http://www.asahi-net.or.jp/~KH4S-SMZ/roguelike/rogue80/index.html
これは恐らく、数々のRogueプレイヤかつプログラマにとって真に*邪悪*なコードに違いない!-more-
566デフォルトの名無しさん:2007/01/15(月) 11:48:39
>>565
すげええww
567デフォルトの名無しさん:2007/01/15(月) 12:03:21
でも80行という565の書き間違いは凄さを矮小化してるな。

80字*n行を目指してる、が正解な。
568デフォルトの名無しさん:2007/01/15(月) 21:51:24
17行かよw
怪 物 め
569デフォルトの名無しさん:2007/04/07(土) 19:28:09

int i;

void main(void)
{
hogehoge();
}







570デフォルトの名無しさん:2007/04/07(土) 19:40:17
とっくにあった
571デフォルトの名無しさん:2007/07/02(月) 07:56:57
checkprime(n,cand){n*n<=cand?(cand%n==0||checkprime(n+2,cand)):printf("%d\n",cand);}loop(num,max){checkprime(3,num),(num+2>max||loop(num+2,max));}main(){loop(3,1000);}

forとかwhileとかgotoとか使わずに素数を求めるプログラム。
572デフォルトの名無しさん:2007/07/02(月) 22:31:45
loopって関数使ってるやん(ノー`)
573デフォルトの名無しさん:2007/07/03(火) 07:47:51
ifも使ってないの名
574デフォルトの名無しさん:2007/07/05(木) 12:27:08
int table[10][10][10][10][10][10][10];

void init_table()
{
 for(int i=0; i<10; i++)
  for(int j=0; j<10; j++)
   for(int k=0; k<10; k++)
    for(int l=0; l<10; l++)
     for(int m=0; m<10; m++)
      for(int n=0; n<10; n++)
       table[i][j][k][l][m][n] = 0;
}
575デフォルトの名無しさん:2007/07/05(木) 15:20:04
>>574
エラーにならないか?
576デフォルトの名無しさん
一段すくねえよw