▼スレッド
│
└◇1250:gcc for文の不具合 [koba] 06/13 17:16
├◇1252:Re:gcc for文の不具合 [MSだす。] 06/13
├◇1253:Re:gcc for文の不具合 [な] 06/13
└◇1254:Re:gcc for文の不具合 [やまもと] 06/13
└◇1262:Re[2]:gcc for文の不具合 [koba] 06/16 <
以下のプログラムのfor文が正しく実行されません。スレッド一覧
(上限が負の値になるので、一回も実行されないはずが、
無限ループのようになる)
これは、なぜでしょうか?gccのbugでしょうか?
bugの場合には、GNUに詳しい方がいらしたら、bug reportを
出していただけないでしょうか。
/* test_for.c */
#include <stdio.h>
main()
{
int i,m;
char name[128];
m = 10;
strcpy(name,"12345678901234567890123456");
printf("%s ",name);
for (i=0;i<24-strlen(name);i++) printf(".");
printf(" %d\n",m);
}
コンパイルとgcc(Cygwin version 2.340.2.5に入っていたもの)の情報は以下です。
135:/tmp>gcc test_for.c
136:/tmp>gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/3.2/specs
Configured with: /netrel/src/gcc-3.2-3/configure --enable-languages=c,c++,f77,java --enable-libgcj --enable-threads=posix --with-system-zlib --enable-nls --with
out-included-gettext --enable-interpreter --disablesjlj-exceptions --disable-version-specific-runtime-libs --enable-shared --build=i686-pc-linux --host=i686-pc-cygwin --target=i686-pc-cygwin --enable-haifa --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --includedir=/nonexistent/include --libexecdir=/usr/sbin
Thread model: posix
gcc version 3.2 20020927 (prerelease)
137:/tmp>
スレッド一覧
$ gcc -W test_for.c
test_for.c: In function `main':
test_for.c:10: warning: comparison between signed and unsigned
ソースコードのほうに問題があるようです。
$ gcc -Wall test_for.c
test_for.c:4: warning: return type defaults to `int'
test_for.c: In function `main':
test_for.c:8: warning: implicit declaration of function `strcpy'
test_for.c:10: warning: implicit declaration of function `strlen'
test_for.c:16: warning: control reaches end of non-void function
他にも書き直した方がいいところがあるかも。
何はともあれコンパイル時にはwarningを出しましょう。
MSだす。さんのコメントがすでについていますが、スレッド一覧
プログラムの問題です。
期待に反した動作であっても、ANSI Cの規約に従っており、
記述されたとおりに動作しています。
「整数 格上げ」「インテグラル プロモーション」などで
検索してみてください。
あるいは、C言語による最新アルゴリズム事典の
整数の項目を読んでください。
# 奥村晴彦, 1991, 技術評論社, ISBN4-87408-414-1
# 似たようなタイトルの本がありますが、
# 間違えずに奥村先生の本を選んでください。
# 類似品は有害なだけです。
やまもとと申します。スレッド一覧
strlenの戻値がunsignedになっているものと思われます。
そのため、2^32-2の大きな値になったものと思われます。
for文を下記に変更し、通常のintegerとして認識させてやればOKです。
for (i=0;i<(int)(24-strlen(name));i++) printf(".");
早々の返信ありがとうございます。スレッド一覧
string.hでstrlen()の戻り値の型を確認したら、size_tになっており、size_tは、stdio.hのなかで、unsigned intになっていました。strlen()の戻り値は、intだと思い込んでいました。
(私のCの教科書は、カーニハン&リッチー著なもので)