トップページ⇒tech
1001コメント273KB

C言語なら、俺に聞け! <27>

■ このスレッドは過去ログ倉庫に格納されています
0001日下部? ということにしたいのですね? :)NGNG
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<26> http://pc3.2ch.net/test/read.cgi/tech/1026048820/
<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
0002デフォルトの名無しさんNGNG
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html
0003デフォルトの名無しさんNGNG
今から考えると、僕の人生はvoidだった。
そう、何も作り出すことは出来なかった。
しかし、僕の中のstatic変数にはいろんな思い出がつまってる。
でももうダメだ。
いつの日からか発生したループは、スタックを食いつぶしながら
僕のメモリ領域をどんどん蝕んでいく。

もうダメだ・・・。

僕は決心して窓を開けた。

「このプログラムは不正な処理を行ったため・・・」
0004デフォルトの名無しさんNGNG
乙ー
0005デフォルトの名無しさんNGNG
>>1おつ〜。ん〜いい感じやね。
0006ていのーNGNG
セグメンテーション違反UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!
0007デフォルトの名無しさんNGNG
むしろ>>3におつかれ。。。
0008デフォルトの名無しさんNGNG
namespace {
>>3; //翻訳単位に隔離しますた
}
0009デフォルトの名無しさんNGNG
15 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html


0010デフォルトの名無しさんNGNG

25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html (予定)
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html (予定)
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html (予定)
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html


0011デフォルトの名無しさんNGNG
>>3
auto変数の方が、後に何も残らなくてよいかと。
0012デフォルトの名無しさんNGNG
新スレオメオツ
0013デフォルトの名無しさんNGNG
C言語なら、俺に聞け! <27>
↑
navi2ch ではこんな風に見えているのですが気のせいですか?
0014デフォルトの名無しさんNGNG
&lt;27&gt;

失敗。↑こんな風に。
0015デフォルトの名無しさんNGNG
く27ゝ

失敗。↑こんな風に。
0016名無しさん@Vim%ChaliceNGNG
Chalice なら問題なく表示されています。
0017デフォルトの名無しさんNGNG
>>13-15
済みません、意味がわかりません。
0018デフォルトの名無しさんNGNG
>>1
ちょっと!あなた余計なことしないでよ!!
0019デフォルトの名無しさんNGNG
>>18
むむっ。俺的には何の問題もないと思うが。
0020デフォルトの名無しさんNGNG
>>19
>>18は同人板から来たんだ。
1000を踏んだ奴だけ新スレをつくる権利がある。
それを知らない厨房がたたかれてた。
0021ピラコウNGNG
コンパイラー使わしてくれるサイトってないの?
0022デフォルトの名無しさんNGNG
うっさい
0023デフォルトの名無しさんNGNG
>>21
CでCGIを組みたいのか?
0024デフォルトの名無しさんNGNG
>>21
ttp://www.xrea.com/jp/
0025デフォルトの名無しさんNGNG
>>21
http://www.at-link.ad.jp/
0026デフォルトの名無しさんNGNG
>>21
お前にはない。
0027デフォルトの名無しさんNGNG
>>21
127..0.0.1
0028デフォルトの名無しさんNGNG
>>27
ネタを噛んでしまうと、見ていてとても痛いのですが…
0029デフォルトの名無しさんNGNG
>>21
どこか適当にハックしろ。
0030デフォルトの名無しさんNGNG
toktokかxreaは使わせてくれただろ。確か。
0031デフォルトの名無しさんNGNG
if( a(&num) == TRUE && b(num) == TRUE )

これって可能?
ちゃんと動作するかな?
0032デフォルトの名無しさんNGNG
>>31
TRUEの定義とその怪しげな関数たちによる。
0033デフォルトの名無しさんNGNG
a(&num),b(num)の順に実行されていくんですよね?
0034デフォルトの名無しさんNGNG
>>33
それは確実だったかと
0035デフォルトの名無しさんNGNG
>>31
キモイ
0036デフォルトの名無しさんNGNG
>>31
そんなソースは読みたくありません。
0037デフォルトの名無しさんNGNG
ハノイの塔のプログラムが理解できん
助けてくれ〜
0038デフォルトの名無しさんNGNG
>>34
順序は合ってるけど、常に b() が実行されるとは限らない。
0039デフォルトの名無しさんNGNG
バビル2世を呼んで来い
0040デフォルトの名無しさんNGNG
>>39
ビッグファイア様ですな。
0041デフォルトの名無しさんNGNG
>>37
君は無理
0042デフォルトの名無しさんNGNG
>>39
バビル二世をよぶCのソースはどういうかんじですか?
0043デフォルトの名無しさんNGNG
>>39

extern void Babel_II();

int main()
{
 Babel_II();
 return 0;
}
0044デフォルトの名無しさんNGNG
#include <stdio.h>
void hanoi(int n,int a,int b){
 int c = 6-a-b;
 if(n>1)hanoi(n-1,a,c);
printf("disk %d : %d -> %d\n",n,a,b);
 if(n>1)hanoi(n-1,c,b);
}

main(){
 hanoi(3, 1,2);
}
参考
ttp://web2.incl.ne.jp/yaoki/hanoi.htm
0045デフォルトの名無しさんNGNG
>>44
で、ロデムはどこに?
0046デフォルトの名無しさんNGNG
>>45
変身してるから見つけにくいと思うよ。
0047デフォルトの名無しさんNGNG
歩性丼は?
0048デフォルトの名無しさんNGNG
>47
それは海鮮丼とは違うのか?
0049デフォルトの名無しさんNGNG
(゚Д゚)鰻丼ウマーカッタ
(゚*゚)梅干しスッパー
0050デフォルトの名無しさんNGNG
ポセイドンもある意味海の幸
0051デフォルトの名無しさんNGNG
{ ←ロプロス
0052デフォルトの名無しさんNGNG
こ こ は ネ タ ス レ で す か ?
0053デフォルトの名無しさんNGNG
は い  そ う で す 。
0054デフォルトの名無しさんNGNG
とりあえず前スレより下にあるのはまずいだろ。
0055デフォルトの名無しさんNGNG
>51
(゚д゚)ウマー
ワラタ
0056デフォルトの名無しさんNGNG
変数の内容が整数かどうか確認するにはどうすればいいか教えてくだされ。
is***** ってな感じで関数があるの?
0057デフォルトの名無しさんNGNG
>>56
int char long shortとそのunsignedは整数。
0058デフォルトの名無しさんNGNG
>>56
なぜわざわざ確認する必要が?
0059デフォルトの名無しさんNGNG
>>58
Perl上がりなのでは?
006056NGNG
すみません、重要なところを書き忘れてました。
実数型変数の内容が整数かどうかを確認する方法です。
たとえば、3.1415と3.0000を振り分けるようなものがあるとありがたいんですが。
0061デフォルトの名無しさんNGNG
>>60
無い。 %すれば?
0062デフォルトの名無しさんNGNG
if (val == (int)val)
0063デフォルトの名無しさんNGNG
>>61
あるでしょ。
0064デフォルトの名無しさんNGNG
>>63
あったか?
0065デフォルトの名無しさんNGNG
if( num == ((double)((int)num)) )
とかダメかな?。。。ダメか。
0066デフォルトの名無しさんNGNG
>>65
つぅか比較ってできたっけ過?
006760NGNG
>66
いや、intにキャストしたら、小数点以下捨てられるから、それをdoubleに戻して。。。
最適化とかされるとマズいけど
006865NGNG
あ。。。67は65の間違いです。ゴメンナサイ
0069デフォルトの名無しさんNGNG
>>64
小数部だけ取り出す関数とかあるじゃん。
007062NGNG
(*´д`) 漏れのは議論の余地無しってこと?
007165NGNG
>62
やってることは一緒ですね。でも、警告でるかも?大丈夫かな?
0072デフォルトの名無しさんNGNG
>>69
さっさと関数名挙げな。
0073デフォルトの名無しさんNGNG
>>60
(val<ceil(val+0.5)+ε)&&(val>ceil(val+0.5)-ε)
0074デフォルトの名無しさんNGNG
>>73
何言語よ?
007556NGNG
>>62さん、>>65さん
ありがとうございます、どちらの方法でも期待した結果が得られました。
ちなみにMS-Cです(警告が出るかもとのことでしたので…)。
007665NGNG
>62
あ、大丈夫でした。アセンブリ見てみたけど何やってるかわかりません。
以下
int foo(double a) { return a == (int)a; }
を gcc -O2 -Wall -S foo.c でコンパイルしたもの。
誰か解読して!
_foo:
    pushl %ebp
    movl %esp,%ebp
    subl $24,%esp
    fldl 8(%ebp)
    fnstcw -2(%ebp)
    movw -2(%ebp),%dx
    orw $3072,%dx
    movw %dx,-4(%ebp)
    fldcw -4(%ebp)
    fistl -8(%ebp)
    movl -8(%ebp),%eax
    fldcw -2(%ebp)
    movl %eax,-8(%ebp)
    fildl -8(%ebp)
    fucompp
    fnstsw %ax
    andb $69,%ah
    cmpb $64,%ah
    sete %al
    movzbl %al,%eax
    movl %ebp,%esp
    popl %ebp
    ret
なんで、こんな複雑になるんだろ?(アセンブラスレ逝けっていわれそうw)
0077デフォルトの名無しさんNGNG
>>76
オペランドの意味わかれば猿でもわかるだろ。
007865NGNG
>77
キャストするアセンブリ(機械語)命令って無いみたいですね(あたりまえ?)。
アセンブリ言語は浮動小数点数つかったことないのでサッパリです。
0079デフォルトの名無しさんNGNG
>>74
εは適当な誤差精度の意

ていうか有理数を実装したほうがよい
typedef struct { int nume, int deno } rational ;
0080デフォルトの名無しさんNGNG
>>75 遅レスですが
double x,temp;
x=3.141592;
if(modf(x,&temp)==0)...
008165NGNG
>80
そんな関数あったんだ。。。用意されてるならそれ使ったほうがよさそう
。。。てか、勉強不足。。。鬱氏
0082デフォルトの名無しさんNGNG
>>72
土下座したら、教えてやるよ。
0083デフォルトの名無しさんNGNG
>>82
煽りはスピードが命。
0084デフォルトの名無しさんNGNG
もう終わってたか…
008580NGNG
蛇足ですが、単純に小数点以下の数値が0か非0かを
調べたい場合は、if(x == (double)(int)x) の方が速いです。
また、0か非0かではなく、73氏のようにイプシロン以下であるか
判定するのであれば、
if( fabs(fmod(x,&temp)) < e)...
になるでしょう。
0086デフォルトの名無しさんNGNG
>>85
>if(x == (double)(int)x)
は、xがintの範囲外の時おかしくなりません?
008773==79NGNG
相手にされなかった…
っていうかいいのかそれで?
0.1を十回足しても1にはならんのだぞ
0088デフォルトの名無しさんNGNG
>>87
実際引っかからんしな。
008980NGNG
>>86
スマソ、見落とし。
60での前提により、せいぜい int の範囲内と思いこんでました。
009065NGNG
>86
そんなでっかい値だったら、そもそも小数点以下まで保持されてないんじゃない?
0091デフォルトの名無しさんNGNG
>>90
だから、小数点以下はゼロと判定されるようでないとまずい
わけです。
009265NGNG
あ、手元の資料によるとdoubleの仮数部は52ビット。
32ビットマシンだとlong使わないとダメか。謝罪m(__)m
009365NGNG
えーと、だから、doubleに
11111....111(1が54個。2進数表現で)
という数字を入れようとしても
11111....11(1が53個)×2 = 11111....110
という値に丸められてしまうということです。
つまり、doubleだからといって必ずしも小数点以下まで保持されてるわけじゃないですよね?
0094デフォルトの名無しさんNGNG
>>87
浮動小数点数でも整数を表すときは
誤差は生まれないと思うんだけど、どうなんだろう。

if (x == (int)x)

は、xが整数で有効桁数内に収まっていれば必ず成立するんじゃないかと。
そもそも誤差って、小数点以下を2^-1, 2^-2, ... で表すから生まれるんだよね?
誰か詳しく知ってる人がいたら教えてください。
0095デフォルトの名無しさんNGNG
>>94
有効桁数におさまるなら当然誤差はない

int i;double sum=0;
for(i=0;i<10;i++)sum+=0.1;
ならばおそらくsum!=1というような話
0096デフォルトの名無しさんNGNG
>>95
誤差は無いですか。
ありがとうございます。
0097デフォルトの名無しさんNGNG
誤差はないといっても非常に近い実数とそれを区別する方法はないけどね
0098デフォルトの名無しさんNGNG
固定小数で以下略
0099 NGNG
>>98
固定小数でどうすれば誤差がなくなるのですか?
0100デフォルトの名無しさんNGNG
10進数の0.1を、16進で表すと、0.199999...になる。
(0.1 = 1/16+9/256+9/4096+9/65536...)
そのため、浮動小数点では、0.1を近似値としてしか表現できない。
固定少数点は、小数部に必要な桁数だけ下駄をはかせて、
整数であるかのように扱うため、上記の誤差は発生しない。

しかし、一般的に誤差といっても、浮動小数点形式に固有の誤差、
乗除算に伴う誤差、加減算に伴う誤差など多々あるので、
固定小数点を使えばすべての誤差がなくなるわけではない。
0101デフォルトの名無しさんNGNG
fflushがいまいちよくわかりません。
何かfflushの効果を一目で確認できるようなサンプルプログラムはありませんか?
■ このスレッドは過去ログ倉庫に格納されています