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

C言語なら俺に聞け! Part 112

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0899デフォルトの名無しさん2005/08/27(土) 00:04:53
ここでCString::Formatですよ。

と言いたかったがここはCスレ(´・ω・`)ショボーン
0900デフォルトの名無しさん2005/08/27(土) 00:05:22
printfか。文字列をそのまま出力するだけでも、何でもprintfを使うのは頭が固いんじゃないか。
効率が良いとは言えないんじゃないか。プログラムサイズも大きくする原因になるし、任意の
文字列をchar の配列で取得して、第一引数にそのまま渡すだけなら%があると正常に出力できな
いだけでなく、セキュリティ面の問題もあるそうだな。

putsを使ったり、最後に改行を追加したくないならfputsやprintf("%s", "文字列"); を使ったり
しないものなのかいな。
0901デフォルトの名無しさん2005/08/27(土) 00:10:13
そして、printf("\n"); のコードを見ると、putchar('\n');でいいじゃないかと思う。
0902デフォルトの名無しさん2005/08/27(土) 00:11:43
puts("");
0903デフォルトの名無しさん2005/08/27(土) 00:12:58
>>901
それはある。効率が悪いよね。
0904デフォルトの名無しさん2005/08/27(土) 00:15:10
>>903
何で?
0905デフォルトの名無しさん2005/08/27(土) 00:18:07
ただの数値ですむか、
文字列として確保されてしまうか、
かな
0906デフォルトの名無しさん2005/08/27(土) 00:20:41
どうせデバッグ用でしか使わないのに
効率も何もない希ガス。
0907デフォルトの名無しさん2005/08/27(土) 00:29:04
>>904
printf()だと文字列に対して%の書式指定がないか検索が行われるから。
0908デフォルトの名無しさん2005/08/27(土) 00:31:28
とりあえず、printfを読んだこと無い奴は嫁よ
0909デフォルトの名無しさん2005/08/27(土) 00:31:33
別に今のPCならその程度のオーバーヘッドなんて十分に無視できる希ガス

そりゃ無いに越したことはないけどさ
0910デフォルトの名無しさん2005/08/27(土) 00:34:12
そこでSystem.String.Formatメソッドですよ。

と言いたかったがここはCスレ(´・ω・`)ショボーン
0911デフォルトの名無しさん2005/08/27(土) 00:34:41
printf("先生、パーセントなどの書式指定の文字がこの第一引数の文字列の中にあるか、順番に見ていきます。\n");
printf("先生、93バイトの文字列を先頭から順に調べましたが、パーセント文字は一つもありませんでした。\n");
printf("全く、何だよ。忙しいというのに余計な手間を掛けさせあがって。\n");
printf("puts()で書いてくれないと無駄な時間をロスして仕事が遅れるじゃないか\n");
0912デフォルトの名無しさん2005/08/27(土) 00:36:05
>909
とはいえ、そういうところにも気がまわるようになるべきだと思う。
無意識のうちに printf("\n") ではなく putchar('\n')を選択できるようにね。

計算機にできることは、計算機にやらせるべきというのも正しいけど、
無駄なコードは一行たりとも書かんという気概でいてほしい。
0913デフォルトの名無しさん2005/08/27(土) 00:38:12
末尾の \0 検索でキャッシュに入るし、
毎回検索に失敗してたら分岐予測が効くから、
いう程は低速化しない希ガス。
0914デフォルトの名無しさん2005/08/27(土) 00:43:28
>>911
>>908
0915デフォルトの名無しさん2005/08/27(土) 00:46:48
>>909
>別に今のPCならその程度のオーバーヘッドなんて十分に無視できる希ガス
×今のPCなら
○IO自体の低速さに比べたら
0916デフォルトの名無しさん2005/08/27(土) 00:47:16
漢字ROM搭載したら速いよ!!
0917デフォルトの名無しさん2005/08/27(土) 01:14:45
まあ、本来の目的を達成することに比べて、枝葉末節なことに目を向けて問題視しすぎてる
ように思えるだろう。揚げ足を取ってるようにも思えるだろう。そして、それにこだわりす
ぎて前に進めないということもあるだろう。
プログラムの学習の一番初めのときから既に、無駄を省くことばかり知恵を働かせるように
してるが。
0918デフォルトの名無しさん2005/08/27(土) 01:23:57
プログラムを作ることで重要なのは速度よりもバグの無さ
0919デフォルトの名無しさん2005/08/27(土) 01:30:48
移植性だろ
0920デフォルトの名無しさん2005/08/27(土) 01:33:04
>>919
それはWindowsの馬鹿プログラマには関係ない
0921デフォルトの名無しさんNGNG
>>919
いやバグのなさだろ。
移植以前にまともに動かないと。
0922デフォルトの名無しさん2005/08/27(土) 01:37:21
有用性
0923デフォルトの名無しさん2005/08/27(土) 01:37:24
お前マジデいってるのか?
バグがないコードだと思うのか?
バグの無いコードは重要以前の問題だろ
0924デフォルトの名無しさん2005/08/27(土) 01:38:18
一番大切なのは美しさだ。
プログラミングはアートだ。
0925デフォルトの名無しさん2005/08/27(土) 01:38:32
お前マジデいってるのか?
バグのないコード?
そんなのどこにある
0926デフォルトの名無しさん2005/08/27(土) 01:38:57
バグの無いプログラムは存在しない。
バグを無しに近づけることが重要。
0927デフォルトの名無しさん2005/08/27(土) 01:43:06
俺バグなんて出したことないよ。
なんかレベル低いねこのスレ。
0928デフォルトの名無しさん2005/08/27(土) 01:44:34
#include <stdio.h>
int main(void)
{
puts("何言ってんだ");
return 0;
}
------------------------
上は「何言ってんだ」を標準出力するプログラムです。
バグはありません。
0929デフォルトの名無しさん2005/08/27(土) 01:49:01
レベル低いのかw
いやそう思うならそれでもいいけど
0930デフォルトの名無しさん2005/08/27(土) 01:49:19
コンパイラのバグとかはこのスレでは関係ないしね
0931デフォルトの名無しさん2005/08/27(土) 01:52:51
何するスレだっけ?
0932デフォルトの名無しさん2005/08/27(土) 01:55:30
C言語を俺に聞くスレ
0933 ◆i6G.jsz.NY 2005/08/27(土) 01:55:47
stdio.cにバグが無いことは保証されてんの?
0934デフォルトの名無しさん2005/08/27(土) 01:55:54
>>930
コンパイラがCで書いてあって、具体的なバグについての議論ならOK。
0935デフォルトの名無しさん2005/08/27(土) 01:56:39
基準は、Cで書いてあるか、具体的か、という2点。
0936デフォルトの名無しさん2005/08/27(土) 01:58:10
そもそも>>917が重要そうに見える一人言を
0937デフォルトの名無しさん2005/08/27(土) 02:16:07
>>928
バグがない事を証明してください
0938デフォルトの名無しさん2005/08/27(土) 02:41:24
>>937
面白くないよ
09399372005/08/27(土) 02:48:47
いや、面白がらせようとして書いたわけではない。
「バグの不在は(少なくとも現実的な手間では)証明出来ない」
ということを知らない人がいるみたいだから。
0940デフォルトの名無しさん2005/08/27(土) 03:00:31
あるよ馬鹿。
すべての入力に対して正しい出力が得られればそれは正しい。
そしてそのすべての対応をチェック可能であればバグ無しが証明できる。
0941デフォルトの名無しさん2005/08/27(土) 03:12:31
そもそも俺らは数学者ではないわけで。
0942 ◆i6G.jsz.NY 2005/08/27(土) 03:31:12
全てとは無限であり
無限のものを有限である我々は証明できない

このくらいはわかりましょう
0943デフォルトの名無しさん2005/08/27(土) 03:51:04
>>942
無限くらい証明できるんじゃない?
0944デフォルトの名無しさん2005/08/27(土) 03:57:28
プログラムに哲学を持ち出す馬鹿のいるスレはここですか?
0945デフォルトの名無しさん2005/08/27(土) 03:58:14
バグってのは仕様に対しての不都合だろ。
仕様にかかれていない範囲での入力に対して、出力に不都合があっても、
それはバグではない

仕様上、入力が有限なら、バグのないことを証明することも可能だ。
といってみるテスト
0946デフォルトの名無しさん2005/08/27(土) 04:14:43
禿同
0947デフォルトの名無しさん2005/08/27(土) 04:20:52
じゃあお前は、使用に載ってないからバグじゃないと言い張って
修正しないのかと
0948デフォルトの名無しさん2005/08/27(土) 04:33:49
文意読めてるのか?というか仕様の意味わかってるのか?

たとえば外部デバイスから送られる数値の範囲が仕様で0〜255って決まってたら、
数値が-1や256だったときの動作まで保証する責任はない。
0949デフォルトの名無しさん2005/08/27(土) 04:36:38
こういうプログラマもいるんだ
0950デフォルトの名無しさん2005/08/27(土) 04:36:53
printf("%s\n", "abc");
を
puts("abc");
に最適化するコンパイラもあるというのに……
0951デフォルトの名無しさん2005/08/27(土) 04:38:11
全くいみの違うことをしたらならんだろ
0952デフォルトの名無しさん2005/08/27(土) 04:40:45
適当に予想でいったんだろ
0953デフォルトの名無しさん2005/08/27(土) 04:41:57
少なくともCygwin版のgccはそういう最適化をするよ。
#最初見たときは目が点になったw
0954デフォルトの名無しさん2005/08/27(土) 04:46:56
printf()をputchar()にしろとか言ってる奴って
システムの設計能力なさそう
0955デフォルトの名無しさん2005/08/27(土) 05:22:25
>>953
手元のもそうなった
gccすげーな
gccのGはGNUじゃなくてGodなんじゃないか?
0956デフォルトの名無しさん2005/08/27(土) 06:17:02
>>955
この業界、なにかとgccマンセーな雰囲気があるが、
商用コンパイラと比べると見劣りすることも多々あるよ。

たとえば、gccはARMプロセッサ向けのコンパイルでは、
IARやARMのコンパイラと比べて、サイズは馬鹿でかくなるし実行速度も遅い。
組み込み向けの資源が厳しい環境で、これは致命的。
0957デフォルトの名無しさん2005/08/27(土) 08:42:20
>>896
ハゲドウ!
0958デフォルトの名無しさん2005/08/27(土) 10:46:03
>>939
一般的なプログラムは無理だけれど、特殊なプログラムはできる。
あなた、数理論理学をまともに勉強したこと、本当にあるの?
0959デフォルトの名無しさん2005/08/27(土) 10:46:23
>>954
言ってない奴に限って
「M...N の総和を求めろ」
をループで組んだりするんだが…
0960デフォルトの名無しさん2005/08/27(土) 10:46:43
>>956
組み込みの世界ではCが使えるだけでも満足すべきだ!
0961デフォルトの名無しさん2005/08/27(土) 10:51:52
>>959
使い方によっては、ループの方が速かったりして。
0962デフォルトの名無しさん2005/08/27(土) 11:42:41
質問します。
x回ループする時に、進行状況を1%、2%と表したいのですが、%が整数の時だけを見極める方法を教えて下さい。
0963デフォルトの名無しさん2005/08/27(土) 11:44:40
>>962
i 回目のループで i * 100 / x %
0964デフォルトの名無しさん2005/08/27(土) 11:44:44
>>896
ごめん、正規表現ライブラリの前にはかすんで見える。
0965デフォルトの名無しさん2005/08/27(土) 11:54:53
じゃぁ、Ruby 最強ってことで。
0966デフォルトの名無しさん2005/08/27(土) 12:00:26
ところで、低水準ファイル入出力関数は使っとるか。
数十MBや100MB以上のファイルを扱うのでreadやwriteは必須だな。
09679622005/08/27(土) 12:04:40
>>963
ぴったり整数になる時だけ判定できないでしょうか?
0968デフォルトの名無しさん2005/08/27(土) 12:06:40
何の判定?
0969デフォルトの名無しさん2005/08/27(土) 12:07:03
>>967
判定する必要無いんじゃないの?
0970デフォルトの名無しさん2005/08/27(土) 12:07:29
剰余が0であればいいんだろ
0971デフォルトの名無しさん2005/08/27(土) 12:08:31
整数になるかどうかの判定を、整数のときだけやるなら無駄だなw
0972デフォルトの名無しさん2005/08/27(土) 12:11:06
>>970
6%2は0だけど、2/6は33.33...%ジャマイカ
0973デフォルトの名無しさん2005/08/27(土) 12:14:53
で、その判定というのは、進捗状況の百分率の整数部が変化したときだけの判定
ということにはならんだろ。
下手をすれば、0と100%のときだけしか表示しないことになるんじゃないか。
0974デフォルトの名無しさん2005/08/27(土) 12:21:11
>>972
先に100倍なんじゃないか
0975デフォルトの名無しさん2005/08/27(土) 12:22:49
こんなのどう?

int main(void)
{
int i, x = 6;
int b = -1;

for (i = 1; i <= x; i++) {
if (b != i*100/x) {
printf("%d\n",i*100/x);
b = i*100/x;
}
}
return 0;
}
0976デフォルトの名無しさん2005/08/27(土) 12:26:45
いや、1回目の処理をする前(0回目の時点)での進捗を表示するなら0%は表示するが、
1回目の後の時点から表示するなら、完了したときの100%の表示だけしか表示しない
ことが起こりうるな。
0977デフォルトの名無しさん2005/08/27(土) 12:27:54
ようするに>>962は、整数の時だけ処理をしたいが、整数かどうかの判定はしたくないってことだろ?
0978デフォルトの名無しさん2005/08/27(土) 12:35:05
>>967
整数だけで計算すればどうせ結果も整数になるし、そうでなくてもキャストでもすれば整数にできる。
09799622005/08/27(土) 12:49:27
私は大きな勘違いをしていたようです。
整数になる時では無く、

普通に百分率を求めると、

1%
1%
1%
2%
2%
2%
3%
3%
3%
・
・
・

となる所を、
1%
2%
3%

としたかったんです。
0980デフォルトの名無しさん2005/08/27(土) 12:52:11
すいません、質問です

#include <stdio.h>
#include <windows.h>
#include <process.h>

unsigned __stdcall mythread(void *);

int main ()
{
 DWORD thID;
 HANDLE hTh;

 hTh = (HANDLE)_beginthread(
  NULL, 0, mythread, NULL, 0, &thID);

 return 0;
}

上のプログラムで、ビルドだけしようとすると、なぜか
_beginthread' : 定義されていない識別子です。
と出てしまいます。
引数のポップアップとかはちゃんと出るので、定義されてないわけないと思うのですが・・
アフォな質問ですみませんが、どなたかお願いします m(__)m

ツールは VC++6.0 です。
0981デフォルトの名無しさん2005/08/27(土) 12:53:11
float型からint型にキャストすればいいだけの話ではないんですか。
0982デフォルトの名無しさん2005/08/27(土) 12:55:49
>>979
#include <stdio.h>
int main()
{
  int x, end = 123, cur = 0, tmp;
  for(x = 0; x <= end; ++x)
  {
    tmp = x * 100 / end;
    if( cur != tmp )
    {
      cur = tmp;
      printf("%d %%\n", cur);
    }
  }
  return 0;
}
09839802005/08/27(土) 13:21:23
すいません、>>980は自己解決しました m(__)m
コンパイラの設定の問題だったようです。
考えてくださった人、ありがとー。
0984デフォルトの名無しさん2005/08/27(土) 14:00:12
何だ、低水準ファイル入出力関数使っとるやつはおらんのかな。
DOSのFINDコマンドをよく使うが、巨大なサイズのファイルだったり大量のファイルを検索
したりするから、極限まで高速化したいんでread関数で一気に読んで、出力ために必要とな
る、行単位として扱うための処理をコーディングしたりした。検索はstrstr任せだ。
もっと高速にできるならしたいんだが、どうしようかな。アセンブリ言語を学習してカリカリ
にチューニングするべきかな。
0985デフォルトの名無しさん2005/08/27(土) 14:02:29
>>984
ここは標準Cのスレで、低水準ファイル入出力は標準ライブラリに含まれていないからスレ違い。
0986デフォルトの名無しさん2005/08/27(土) 14:20:13
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0987デフォルトの名無しさん2005/08/27(土) 14:23:41
それ前にもどこかに書いてたな。
0988デフォルトの名無しさん2005/08/27(土) 14:27:42
急速にスレの質が低下してまいりました
0989デフォルトの名無しさん2005/08/27(土) 14:42:38
http://pc8.2ch.net/test/read.cgi/tech/1123918075/
0990デフォルトの名無しさん2005/08/27(土) 14:43:29
(*c++)*=(*s++);
ってどういう意味ですか??
0991デフォルトの名無しさん2005/08/27(土) 14:47:01
*c = *c * *s;
c++;
s++;
なんじゃないか。
0992デフォルトの名無しさん2005/08/27(土) 14:47:18
c[0] = c[0] * s[0];
c = &c[1];
s = &s[1];

って意味。
0993デフォルトの名無しさん2005/08/27(土) 15:02:10
にゃるほど!ありがとー!
0994デフォルトの名無しさん2005/08/27(土) 15:04:15
C言語をはじめたばかりであまりわからないのですが、
次スレは立てないのですか?
0995デフォルトの名無しさん2005/08/27(土) 15:14:18
次スレではprintfの話題禁止
0996デフォルトの名無しさん2005/08/27(土) 15:32:16
次スレは fprintfとsprintfについて語ろう。
0997デフォルトの名無しさん2005/08/27(土) 15:33:13
>>990
そういうのやめて欲しいよな…
まだ括弧付けてるだけましだけどさ。
0998デフォルトの名無しさん2005/08/27(土) 15:33:56
またお前か
レス数が950を超えています。1000を超えると書き込みができなくなります。