C言語なら俺に聞け(入門編)Part 109
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/10/17(水) 17:14:15.23★前スレ
C言語なら俺に聞け(入門編)Part 108
http://toro.2ch.net/test/read.cgi/tech/1348995216/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 159代目
http://toro.2ch.net/test/read.cgi/tech/1342966104/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
# サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2012/10/17(水) 18:13:04.110003デフォルトの名無しさん
2012/10/17(水) 20:31:39.260004デフォルトの名無しさん
2012/10/17(水) 20:38:19.120005デフォルトの名無しさん
2012/10/17(水) 20:59:35.780006デフォルトの名無しさん
2012/10/18(木) 00:19:47.740007デフォルトの名無しさん
2012/10/18(木) 00:23:16.690008デフォルトの名無しさん
2012/10/18(木) 17:48:24.070009sage
2012/10/18(木) 17:53:55.34私は、関数電卓を作っている者です。
文字列を構文解析し、現れたワードごとに演算を行うという簡単なプログラムです。
私は、ある問題に直面しました。
sin(n*M_PI)が0にならないのです。(nは整数です)
DBL_EPSILONを使った切り捨ては試しました。
しかしながら、nが大きくなると再び誤差が表示されてしまいます。
例 sin(1000000*M_PI)=誤差
この誤差はgoogle電卓でも現れました。
驚いたことに、市販の関数鵜電卓では、いっさいこの誤差が現れません。
C言語で、市販の関数電卓のように誤差をなくすにはどうしたらよいでしょうか?
詳しい方ご教授お願いします。
0010デフォルトの名無しさん
2012/10/18(木) 18:09:58.38|
|
|
/V\ ,J
/◎;;;,;,,,,ヽ
_ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0011デフォルトの名無しさん
2012/10/18(木) 18:16:38.57まず判定すりゃいいじゃん
0012デフォルトの名無しさん
2012/10/18(木) 18:30:11.580013デフォルトの名無しさん
2012/10/18(木) 18:50:05.67memcpy(wk, '\0', sizeof(wk));
なんて見つけたんだけど、なぜかコアは吐かないし同じ使い方してる本番アプリが他にもある
コンパイル調べたらなんか「NULL文字ポインタ」だとかで、
実験したら最大8192バイトまでヌルの配列が取れるようでカルチャーショックを受けました
でも書くならNULLだろ、'\0'は文字だろとか思ったけれど、俺はもう古い人間だってことでしょうか?
memcpy(wk, " ", sizeof(wk)); のほうはさすがに理解してないようですが
0014デフォルトの名無しさん
2012/10/18(木) 18:51:22.230015デフォルトの名無しさん
2012/10/18(木) 18:52:47.93日本語で
>書くならNULLだろ
残念ながらこの場合は http://www.kouno.jp/home/c_faq/c5.html#13 の「ASCIIのナル文字(NUL)」だ
書くなら 0 だ
>俺はもう古い人間だってことでしょうか?
古いだけでまったくわかっていない人間だってことだ、猛省しろ
0017デフォルトの名無しさん
2012/10/18(木) 19:18:10.390018sage
2012/10/18(木) 19:23:01.56>>12さん
返信ありがとうございます。double型でmodが使えるんですね。初めて知りました。
if(fmod(SINの中身,M_PI)<DBL_EPSILON && fmod(SINの中身,M_PI)>-DBL_EPSILON){
return 0;
}else{
return sin(SINの中身);
}
てなかんじですかね?
>>14さん
返事ありがとうございます
3.3727E-9です
0019デフォルトの名無しさん
2012/10/18(木) 19:27:14.43> 3.3727E-9です
つまり、整数*pi の時だけ特別扱いしてるってことだな
0020デフォルトの名無しさん
2012/10/18(木) 19:27:56.61memcpyの第2引数が何であるべきか調べてから書け
0022デフォルトの名無しさん
2012/10/18(木) 19:34:32.59>>13が言いたいのはmemcpy( void *dest, const void *src, size_t count )の引数srcはポインタなのに'\0'=0=NULLポインタを渡して大丈夫なのかという事だと思うの。
memset( void *dest, int c, size_t count )の引数cならintだからナル文字だけど、memcpyの場合はぬるぽと解釈されているはずだからね。
よく見ずにレスしちゃったんだね。猛省だね。
0024デフォルトの名無しさん
2012/10/18(木) 19:36:40.470025デフォルトの名無しさん
2012/10/18(木) 19:40:03.100026デフォルトの名無しさん
2012/10/18(木) 19:51:15.96変数だったらどうすんの?
sin(sin(pi/2)*2*pi)だったら?
0027デフォルトの名無しさん
2012/10/18(木) 19:58:13.31まず、このコードでcoreを吐くかどうかは、OS, アーキテクチャによるが、
一般にはcoreを吐きうる不正なプログラム。
次に、'\0' は整数の 0 とまったく区別はなく、
ポインタやポインタ引数に代入されたら NULL と同じになる。
0028デフォルトの名無しさん
2012/10/18(木) 20:05:17.20字句解析した時点で定数の型は分かるじゃん。
計算して求まる値は整数同士なら結果も整数とか決めておけばいいし、
変数は値を設定する時にどの型かわかるじゃん。
0029デフォルトの名無しさん
2012/10/18(木) 20:06:52.800030デフォルトの名無しさん
2012/10/18(木) 20:10:38.260031デフォルトの名無しさん
2012/10/18(木) 20:11:01.44memsetではなくmemcpyを使用するメリットが分からない。
紛らわしいだけでしょ、絶対にレビューでつつかれるわ。
>>13の検証によると8192バイトの制限まであるらしいし。
処理速度でも違うのかね?
0032デフォルトの名無しさん
2012/10/18(木) 20:12:24.42このサイトでは問題なく動くのだから受け入れます。ポインタに'\0'を使うのは違和感ありますが、慣れます
0033デフォルトの名無しさん
2012/10/18(木) 20:15:02.490034デフォルトの名無しさん
2012/10/18(木) 20:20:24.55> 慣れます
慣れずに、こんな糞コード書くな、正解はこうじゃ、って修正してやる気概が必要
0035デフォルトの名無しさん
2012/10/18(木) 20:23:48.28makeの詳細は理解していないのでこれ以上は解らない、参照でポインタを0から回したら8192で落ちます
0036デフォルトの名無しさん
2012/10/18(木) 20:27:14.830037sage
2012/10/18(木) 21:39:03.29様々な回答ありがとうございます。
整数の判断について調べていたところ
floor()==ceil()の条件式を使うと良いことがわかりました。
if (floor(x/PI)==ceil(x/PI)) {
return 0;
}else{
return sin(x);
}
コードはこのようになります。
これで希望の動作ができるようになりました。
調べていて、「処理理系によってはうまく働かないことがある」
という記述を見つけたので、少し不安ではありますが
これで様子をみてみます。
0038デフォルトの名無しさん
2012/10/18(木) 21:40:24.11そんなのになれたら阿寒。
0039デフォルトの名無しさん
2012/10/18(木) 21:58:31.92> 調べていて、「処理理系によってはうまく働かないことがある」
だろうな
0040デフォルトの名無しさん
2012/10/18(木) 23:11:51.530041デフォルトの名無しさん
2012/10/18(木) 23:15:13.34ちょっと古いけどK&R
0042デフォルトの名無しさん
2012/10/19(金) 00:10:46.51typedef int (*iarr10)[10]; // (2)
int a[10];
iarr aa1 = &a; // error
iarr10 aa2 = &a; // ok
うーん?
(1)の型は何処で出てくるんだ?
0044デフォルトの名無しさん
2012/10/19(金) 09:12:25.42独習、初めてのとか、本すれ見たら
0045デフォルトの名無しさん
2012/10/19(金) 13:01:31.02いえいえ
0046デフォルトの名無しさん
2012/10/19(金) 13:12:33.15それは古すぎるからやめとけ
つかそもそも本を買うなんてバカな真似はやめておきなさい
図書館で読んで自分に合ってそうなものを持ち帰って読む
重要なところは自分で書き写す
図書館に無ければ注文する
プログラムの勉強は自習するだけならこれで十分
たかが文字情報に金を払う必要は無い
あらゆる情報はすべての人にとって平等で無料かつ自由に扱えるもので有るべきだ
0047デフォルトの名無しさん
2012/10/19(金) 13:17:48.630048デフォルトの名無しさん
2012/10/19(金) 13:19:44.70本を買った方がいい人と、そうでない人がいる
0049デフォルトの名無しさん
2012/10/19(金) 13:29:30.81時間が大切だからこそ写しなんだよ
いつでもさっと検索してWebより密度の高い情報にアクセスできるという利益はなかなか代えが効くものではない
「あーあれなんだっけな調べよう…でも資料は家だ明日にまわすか」なんてことをしてるからお前らはゴミなんだ
それでもまだこの期に及んで書き写す手間が嫌だというなら機械にやらせれば良い
われわれはIT技術者なのだから物事を自分でやる必要は無い
たった一度の投資で図書館のすべての本が自分のものになるのだからやらない理由は無いぞ
0050デフォルトの名無しさん
2012/10/19(金) 13:30:28.73K&Rも読みこなせなかったのか?
0051デフォルトの名無しさん
2012/10/19(金) 13:32:56.62時代にそぐわないと言ったんだが、君の理解力大丈夫か?
0052デフォルトの名無しさん
2012/10/19(金) 13:50:22.210053デフォルトの名無しさん
2012/10/19(金) 14:07:50.50「焼く捨ててください」
0054デフォルトの名無しさん
2012/10/19(金) 17:28:19.520055デフォルトの名無しさん
2012/10/19(金) 17:48:00.170056デフォルトの名無しさん
2012/10/19(金) 17:59:33.670057デフォルトの名無しさん
2012/10/19(金) 18:16:46.830058デフォルトの名無しさん
2012/10/19(金) 18:33:41.18関数プロトタイプは重要
0059デフォルトの名無しさん
2012/10/19(金) 18:42:50.72今入手可能なK&R2には書いてあるから
0060デフォルトの名無しさん
2012/10/19(金) 18:58:09.20「C言語を256倍使う本」
今では不要となった技術がてんこ盛りだが
侍魂にも通じるフォントいじりがなされていて
読んでいてマのなんたるかを直接に面白おかしく知ることができる
0061デフォルトの名無しさん
2012/10/19(金) 19:27:39.96どんな本?ちょっとだけ教えて
0063デフォルトの名無しさん
2012/10/19(金) 20:11:19.82コンピュータ自体の初心者なら、ハードルが少し高いかもしれないが
0064デフォルトの名無しさん
2012/10/19(金) 20:12:19.340065デフォルトの名無しさん
2012/10/19(金) 20:32:31.71エキスパートCプログラミングは天才達の昔話が読み物としても面白いし、実用小ネタも多くていいよね。
変数や関数の宣言を読み解くフローは目から鱗だったわ。
0066デフォルトの名無しさん
2012/10/20(土) 12:21:50.630067デフォルトの名無しさん
2012/10/20(土) 14:44:29.850068デフォルトの名無しさん
2012/10/20(土) 15:00:15.50>変数や関数の宣言を読み解くフロー
K&R2 にのっているネタでは?
0069デフォルトの名無しさん
2012/10/20(土) 16:06:18.090071デフォルトの名無しさん
2012/10/20(土) 16:25:37.33どういう実装なの?
0072デフォルトの名無しさん
2012/10/20(土) 16:50:14.300073デフォルトの名無しさん
2012/10/20(土) 17:29:23.04え?
0074デフォルトの名無しさん
2012/10/20(土) 17:51:42.34そいつはこの板に粘着している技術力0のクズで、そいつのレスには1�oの
信ぴょう性もないからかまってはいけない。
0075デフォルトの名無しさん
2012/10/20(土) 18:41:36.460076デフォルトの名無しさん
2012/10/20(土) 19:45:33.560077デフォルトの名無しさん
2012/10/20(土) 20:45:40.930078デフォルトの名無しさん
2012/10/20(土) 20:47:28.95http://toro.2ch.net/test/read.cgi/tech/1316592884/270-271
>>74
零はちょっとかわいそうじゃないですか?0.57721566 くらいは恵んでくださいな
0079デフォルトの名無しさん
2012/10/20(土) 21:07:30.00線形リストもしらずに「K&R2の線形リストは糞実装」といってるクズだってわかっただろ。
相手にするだけ時間の無駄。
0080デフォルトの名無しさん
2012/10/20(土) 21:28:33.55バイナリツリーに言及している時点で線形リストは既知と判断するのが普通なのですけれども
K&R2 のその部分が初心者向けで終わっているとのはまぎれもない事実
読んだことないの?
0081デフォルトの名無しさん
2012/10/20(土) 21:49:19.210082デフォルトの名無しさん
2012/10/20(土) 23:01:13.640083デフォルトの名無しさん
2012/10/20(土) 23:44:09.840084デフォルトの名無しさん
2012/10/20(土) 23:49:41.92そこ(whileとかforやブロックの中身)変更すると実行結果が変わる時ってありますか?
printfチェックで
絶対そこの部分には行かないのに
変更すると実行結果が変わってしまいます。
0085デフォルトの名無しさん
2012/10/20(土) 23:52:21.47検査してみて
0086デフォルトの名無しさん
2012/10/20(土) 23:56:02.48さっさとその臭いソースを出せよ
お前のタコなソースなんて
オレ様がみりゃー
一発だよ
>>86 と同意見です。この手のバグとりは結構難解で、printf() デバッグではどうしようもなく、デバッガ出動に踏み切らざるを得ないと思います。
もしよろしければソースをみせていただけると何かヒントを提案できるかもしれません。
K&R2 6.5、手元の和訳ではp171とか。
おっとよくみると線形リストじゃなかったね。記憶が混同していました。
ともあれ、ここで終わっているのは非常に惜しい
0089デフォルトの名無しさん
2012/10/21(日) 00:13:12.91負け惜しみが笑えるww惜しいのはお前だよwwww
0090デフォルトの名無しさん
2012/10/21(日) 07:32:20.47かまわない方がいいって証明できただろ。>>71
0091デフォルトの名無しさん
2012/10/21(日) 12:44:19.690092デフォルトの名無しさん
2012/10/21(日) 13:42:57.29手元の原書だと
6.5 Self-referential Structures (P.139)
(ツリーを使って単語の出現数を出力するプログラム)
だけど合ってる?
何がクソなのか分からない
0093デフォルトの名無しさん
2012/10/21(日) 13:54:52.25void addtree(struct tnode **p, char *w) {
if (p == NULL) {
...
} else if ( ... ) { ... } else if (cond < 0)
addtree(&((*p)->left), w);
else
addtree(&((*p)->right), w);
}
あるいは
struct tnode *root;
addtree(&root,word);
まで踏み込みたかった。
root = addtree(root, word)
は実にムダにみえないか?
0094デフォルトの名無しさん
2012/10/21(日) 14:26:17.01whyを書けよアホ
自分の能力が低いから「みる」とかアバウトでアホでクズな単語使ってんだろ
そういうやつはお願いだからこのスレに書き込むなよテイノウ
0095デフォルトの名無しさん
2012/10/21(日) 14:35:04.24>>94
まあまあ、せっかくだから比較してみよう、ちょっと書いてみるわ
0096デフォルトの名無しさん
2012/10/21(日) 14:35:51.750097デフォルトの名無しさん
2012/10/21(日) 14:40:18.78009892
2012/10/21(日) 14:48:16.83つまり、addtree()の返り値の代入は、最初の一回以外ずっと同じ値の
コピーだからムダだ。ってこと?
分からんでもないけど、K&Rのコードのシンプルさ(分かりやすさ)の方が
入門書には合ってると思う。
ググったらこのページが見つかった
http://www.s.kyushu-u.ac.jp/~z7kh03in/maekawa/bintree/source.html
K&R 2ndの件のページと同じコードだと思う
0099デフォルトの名無しさん
2012/10/21(日) 15:24:35.93http://ideone.com/DmuaH6
>>98
シンプルにしておけ!この間抜けの原則だっけか。そうか、それがあったな。
0100デフォルトの名無しさん
2012/10/22(月) 06:19:24.02そうそう。
慣れてくると、メンバ変数のポインタを渡すほうがわかりやすかったりする。
>分からんでもないけど、K&Rのコードのシンプルさ(分かりやすさ)の方が
>入門書には合ってると思う。
入門書としては確かにそうだと思う。誰しも最初はこれからスタートする。
K&R は入門書だが、無理やりK&R を批評したかっただけかもしれませんね。
http://toro.2ch.net/test/read.cgi/tech/1313183984/403 に比較を書いてみました、基本書かないと理解できない体質です。
>>94
why そのものが書いてあるのにわからない?
みえる、という単語に反応し過ぎてみえなくなったのね
>>97
今後とも精進して参ります
0101デフォルトの名無しさん
2012/10/22(月) 06:25:16.95コテつけろよ。
returnするほうが明らかにわかりやすい。
0102デフォルトの名無しさん
2012/10/22(月) 06:28:14.040103デフォルトの名無しさん
2012/10/22(月) 13:54:58.330104デフォルトの名無しさん
2012/10/22(月) 14:29:22.160105デフォルトの名無しさん
2012/10/22(月) 18:44:55.97テメーがヘボなのを言語(Java)の所為にしないように。ゴミクズにレクチャーするのは無駄だからしないが。
0106デフォルトの名無しさん
2012/10/22(月) 19:07:34.22できないのね
0107デフォルトの名無しさん
2012/10/22(月) 19:14:11.280108デフォルトの名無しさん
2012/10/22(月) 19:21:35.95できないのね
0109デフォルトの名無しさん
2012/10/22(月) 19:41:50.680110デフォルトの名無しさん
2012/10/22(月) 20:29:49.23プログラムを分かりにくい状況にしているんじゃないですかね?
メモリ上では関数から関数を呼び出した時呼び出し側のデータがスタックに保持されて
帰ってきた時データをそのまま使えるけど構造は非常に複雑ですよね。
0111デフォルトの名無しさん
2012/10/22(月) 20:33:46.350112デフォルトの名無しさん
2012/10/22(月) 20:39:36.47それでプログラムがわかりにくい状況になってると感じるなら、
プログラミングという思考作業に対して、キミの知能が足りないだけ。
0113デフォルトの名無しさん
2012/10/22(月) 20:40:10.880114デフォルトの名無しさん
2012/10/22(月) 20:45:58.220115デフォルトの名無しさん
2012/10/22(月) 20:56:59.900116デフォルトの名無しさん
2012/10/23(火) 07:03:45.110117デフォルトの名無しさん
2012/10/23(火) 08:40:48.57main01_005_08_ret:
goto main01_005_09;
main01_005_09_ret1:
0118デフォルトの名無しさん
2012/10/23(火) 09:59:25.74とか仰っている御仁は
関数型プログラミングとかは
ましてやラムダなんとかやらは
絶対に理解できそうもないな
0119デフォルトの名無しさん
2012/10/23(火) 10:06:34.730120デフォルトの名無しさん
2012/10/23(火) 10:17:22.19デバッガ作る人にとっては複雑かもなあ。
アセンブリレベルで動作追うときにフレームポインタの間接参照見るのは面倒。
でも、この程度であって関数が基本リエントラントである恩恵の方がはるかに大きい。
0121デフォルトの名無しさん
2012/10/23(火) 10:35:06.560122デフォルトの名無しさん
2012/10/23(火) 10:38:06.170123デフォルトの名無しさん
2012/10/23(火) 10:39:30.66int a00000000002;
int axxxxxxxxxxx;
return(0)
}
0124デフォルトの名無しさん
2012/10/23(火) 13:11:05.50なんで関数の無い方がいいと思ったのやら
0125デフォルトの名無しさん
2012/10/23(火) 14:27:17.062段落目から推測すると「関数から関数を呼び出す」は再帰呼び出しを
意味していると思われる。
>>120が書かれた後で理解できてないお前も大して変わらない低レベル。
0126デフォルトの名無しさん
2012/10/23(火) 14:45:19.460127デフォルトの名無しさん
2012/10/23(火) 15:22:59.000128デフォルトの名無しさん
2012/10/23(火) 15:28:24.620129デフォルトの名無しさん
2012/10/23(火) 15:28:50.79やりたいことを考えた時に思い浮かんだやり方
思考が違うからなー
0130デフォルトの名無しさん
2012/10/23(火) 17:16:11.93バッチファイルもcall :label出来るし。黙ってた方が良かったね。
0131デフォルトの名無しさん
2012/10/23(火) 19:28:49.180132デフォルトの名無しさん
2012/10/23(火) 19:57:09.130133デフォルトの名無しさん
2012/10/23(火) 20:24:39.78int happy()
{
yes();happy();
}
int yes()
{
happy();
}
こうなったらスパゲティ以外の何者でもないでしょ...
図を書こうと思っても同じ関数のブロック何回も出てきて訳がわからなくなる
そりゃ階乗計算の再帰みたいに単純なのだといいけど....
0134デフォルトの名無しさん
2012/10/23(火) 20:32:52.360135デフォルトの名無しさん
2012/10/23(火) 20:33:22.850136デフォルトの名無しさん
2012/10/23(火) 20:34:38.760137デフォルトの名無しさん
2012/10/23(火) 20:41:48.280138デフォルトの名無しさん
2012/10/23(火) 20:43:55.93それはキミの知能がゾウリムシくらいしかないという証明。
0139デフォルトの名無しさん
2012/10/23(火) 20:50:52.23コールバックってjavaじゃなかったっけ?
0140デフォルトの名無しさん
2012/10/23(火) 20:56:30.86マジモンの無能がいるぞww
0141デフォルトの名無しさん
2012/10/23(火) 21:01:56.880142デフォルトの名無しさん
2012/10/23(火) 21:09:36.93入門じゃ重い部類かもしれぬ
0143デフォルトの名無しさん
2012/10/23(火) 21:10:24.950144デフォルトの名無しさん
2012/10/23(火) 21:37:46.250145デフォルトの名無しさん
2012/10/23(火) 22:04:22.22できないのもあるしね二方向以上の再帰とかね
0146デフォルトの名無しさん
2012/10/23(火) 22:06:44.65因子を処理中括弧の中は式に丸投げは再帰を使わないで書けとか罰ゲームとしか
0147デフォルトの名無しさん
2012/10/23(火) 22:27:24.59言語としてはドンドンあほになって行ってるじゃん
0148デフォルトの名無しさん
2012/10/23(火) 22:37:57.760149デフォルトの名無しさん
2012/10/23(火) 23:48:52.18つまりアセンブラ最強
0150デフォルトの名無しさん
2012/10/24(水) 01:01:43.09一応1カ月でスパルタされたポインタも怪しいにわかなんだが
0151デフォルトの名無しさん
2012/10/24(水) 02:10:47.660152デフォルトの名無しさん
2012/10/24(水) 10:02:55.810153デフォルトの名無しさん
2012/10/24(水) 10:57:51.150154デフォルトの名無しさん
2012/10/24(水) 12:42:24.810155デフォルトの名無しさん
2012/10/24(水) 13:33:14.200156デフォルトの名無しさん
2012/10/24(水) 13:53:19.74ポインタ理解するのに1か月もかかる池沼が世の中に存在するはずがない。
0157デフォルトの名無しさん
2012/10/24(水) 13:59:31.550158デフォルトの名無しさん
2012/10/24(水) 14:22:38.850159デフォルトの名無しさん
2012/10/24(水) 14:39:05.200160デフォルトの名無しさん
2012/10/24(水) 14:43:26.080161デフォルトの名無しさん
2012/10/24(水) 14:44:49.790162デフォルトの名無しさん
2012/10/24(水) 16:29:26.600163デフォルトの名無しさん
2012/10/24(水) 17:30:53.050164デフォルトの名無しさん
2012/10/24(水) 18:20:37.14double型の数値の小数点以下の桁数を求めるにはどうしたらよいでしょう
0165デフォルトの名無しさん
2012/10/24(水) 18:24:03.50無理
0166デフォルトの名無しさん
2012/10/24(水) 19:09:26.782進数でよければ仮数部を指数部でシフトして
もっとも右にある1を探す感じで出来る
0167デフォルトの名無しさん
2012/10/24(水) 19:38:47.4310進数もそれと同じ桁数になるんじゃね?
0.1(2) → 0.5(10)
0.01(2) → 0.25(10)
0.001(2) → 0.125(10)
0.0001(2) → 0.0625(10)
0168デフォルトの名無しさん
2012/10/24(水) 20:05:07.98そもそも精度の関係で例えば0.7のときに巧くいかない。
0169デフォルトの名無しさん
2012/10/24(水) 20:17:07.670.7とかdoubleで表現できない数値を扱う必要あんの?
0170デフォルトの名無しさん
2012/10/24(水) 20:23:12.320171150
2012/10/24(水) 20:34:59.41OSはUNIX
TCP通信マルチスレッドでC/S型の複数人チャットのソースは組めた
ここからP2P型に改造する予定だが、サーバのソースにクライアント部分の接続〜送信を加えたらP2P?
同じプログラムで通信するのがP2Pって思ってるんだけど、違う?
0172150
2012/10/24(水) 20:39:59.410173デフォルトの名無しさん
2012/10/24(水) 20:55:07.32> サーバのソースにクライアント部分の接続〜送信を加え
ここ意味わからん
ただ、
> 同じプログラムで通信するのがP2Pって思ってる
そんな定義はない。
(多数の)ピア同士が何か特定のホスト(サーバ)を
経由せずに通信できればP2Pだろ。
問題は、相手をIPアドレスやホスト名で指定せずに
済ませる方法がないと実用にならないし、
NAT越えも必要になる。
0174150
2012/10/24(水) 21:00:50.90>同じプログラム〜
ここは忘れてください、とち狂ってました
>サーバの〜
親スレでconnect〜send
子スレでソケットをbind→listen→acceptの無限ループ
孫スレでrecv→printfで接続元が切断するまでループ
これで説明になってるんだろうか
0175150
2012/10/24(水) 21:57:49.55多分自己解決しました
connectする時にNAT越えして相手のIPアドレス指定出来ればいいのかな…
0176デフォルトの名無しさん
2012/10/24(水) 22:23:45.160177デフォルトの名無しさん
2012/10/24(水) 22:29:59.380178デフォルトの名無しさん
2012/10/24(水) 22:40:12.740179デフォルトの名無しさん
2012/10/24(水) 22:40:52.360180デフォルトの名無しさん
2012/10/24(水) 23:18:35.940181デフォルトの名無しさん
2012/10/24(水) 23:43:33.650182デフォルトの名無しさん
2012/10/24(水) 23:56:54.73あと、以下のように自由にアクセスってできるんでしょうか?
a = ((char*)0)[10];
((char*)0)[31] = 0xFF;
0183デフォルトの名無しさん
2012/10/25(木) 00:00:08.320184デフォルトの名無しさん
2012/10/25(木) 02:15:49.09イベントが発生したら、指定したwordファイルを自動で印刷するようにしたいのですが
int StartDoc(
HDC hdc, // デバイスコンテキストのハンドル
CONST DOCINFO *lpdi // ファイル名を指定する
);
この場合lpdiにどのような値を入れたらいいですか?
0185デフォルトの名無しさん
2012/10/25(木) 02:57:44.04Win32API のスレで聞け
0186デフォルトの名無しさん
2012/10/25(木) 03:06:59.43たらいまわし役人根性乙
0187デフォルトの名無しさん
2012/10/25(木) 03:19:38.04http://beforeitsnews.com/japan-earthquake/2012/10/red-alert-fukushima-spent-fuel-pools-exploded-on-fire-now-radiation-levels-spiking-massively-2439520.html
福島では最悪のシナリオが絶賛進行中です。
福島から50マイルのところにいる研究者マイケル・エクスタインによれば、
過去4日間に、福島第一原子力発電所使用済み燃料プールにて
爆発および火事が発生し、現在、放射能レベルは急上昇しています。
使用済み燃料プールに含まれていた大量のプルトニウムが拡散するという最悪のシナリオです。
すなわちこれら放射能が大気中に気化、そして風により流出ことを意味します。
放射雲および放射線スパイクはおよぼ2週間以内に合衆国の西海岸を襲うと予想されます。
0188デフォルトの名無しさん
2012/10/25(木) 08:04:29.42MSDNを自分で読めよ。それでもわからなかったら教えてやる。
0189デフォルトの名無しさん
2012/10/25(木) 14:02:40.880190デフォルトの名無しさん
2012/10/25(木) 15:17:54.03教えるのはいいが、余所でやってくれ。
0191デフォルトの名無しさん
2012/10/25(木) 16:52:47.57charの例えば56と、fdをくっつけて、2バイトの変数に56fdとして代入したいんですが、どうやるのが最善でしょうか?
2バイトの変数を用意して、1バイトめを代入して、8ビットシフトし、2バイト目と0xFFのビット積をとって加えると出来るんですがまだるっこしい感じがします
0192デフォルトの名無しさん
2012/10/25(木) 17:16:00.05uint8_t bar = 0x56;
uint8_t baz = 0xfd;
uint16_t foo = bar << 8 | baz;
ってこと? 何が不満なんだ?
0193デフォルトの名無しさん
2012/10/25(木) 17:29:32.950194デフォルトの名無しさん
2012/10/25(木) 17:33:30.054byteだろう
0195デフォルトの名無しさん
2012/10/25(木) 17:40:39.18うーんまぁ、そんなもんですかね
foo = unite(bar, baz);
みたいな感じでサクッと結合出来ないかなーと思ったんですが
0196デフォルトの名無しさん
2012/10/25(木) 17:43:11.990197デフォルトの名無しさん
2012/10/25(木) 18:15:04.970198デフォルトの名無しさん
2012/10/25(木) 18:39:25.610199デフォルトの名無しさん
2012/10/25(木) 19:15:57.77共用体だとビッグエンディアン、リトルエンディアンを気にする必要があるね。
0200デフォルトの名無しさん
2012/10/25(木) 19:18:26.440201デフォルトの名無しさん
2012/10/25(木) 19:34:39.85http://www.youtube.com/watch?v=koxU4nWvWys
3/18 01:04JST, 1/20遅速再生
3分過ぎあたりからキノコ雲あがって流れている
0202デフォルトの名無しさん
2012/10/25(木) 22:04:53.330203デフォルトの名無しさん
2012/10/25(木) 22:14:14.740204デフォルトの名無しさん
2012/10/25(木) 22:26:24.93www
プゲラ
0205デフォルトの名無しさん
2012/10/25(木) 22:26:34.160206デフォルトの名無しさん
2012/10/25(木) 22:34:59.36ふっほっ
0207デフォルトの名無しさん
2012/10/25(木) 22:37:45.360208デフォルトの名無しさん
2012/10/25(木) 22:38:53.400209デフォルトの名無しさん
2012/10/25(木) 22:40:40.14放射能よりも害悪だ
0210デフォルトの名無しさん
2012/10/25(木) 22:48:48.62出荷基準は実質無意味だよ
自分で興味もって調べないと死ぬよ
0211デフォルトの名無しさん
2012/10/25(木) 22:50:26.240212デフォルトの名無しさん
2012/10/25(木) 22:57:01.9570歳以上くらいならただちに影響ないだろうけど
0213デフォルトの名無しさん
2012/10/25(木) 23:06:07.950214デフォルトの名無しさん
2012/10/25(木) 23:40:44.180215デフォルトの名無しさん
2012/10/26(金) 00:54:03.120216デフォルトの名無しさん
2012/10/26(金) 00:55:32.792〜1000の中から素数を出力するプログラム
http://codepad.org/7ab7zj65
のi%jの計算回数を出来る限り減らせという課題ですが、色々やってこうなりました。
http://codepad.org/4ubNQTvg
計算回数自体は減りましたが、9とか15とか合成数も出力されるようになってしまいました。
プログラムを変えてみた時の変化や高専編入者からのアドバイスが入っていますが、パラメータで制御するならどのようにすればよいでしょうか?
計算回数は経験者を見ている感じでは1500〜2200辺りになりそうですが、計算回数を減らす方法も何かいいものはありますか?
0217デフォルトの名無しさん
2012/10/26(金) 01:05:03.94これが正解ね
0218デフォルトの名無しさん
2012/10/26(金) 01:10:20.820219デフォルトの名無しさん
2012/10/26(金) 01:16:03.540220デフォルトの名無しさん
2012/10/26(金) 01:18:06.96候補の i = 3 5 7 9 11 13 15 ...
のうち、3回に1回は調べなくてもいいよね、とか。
で、それを押しすすめると、エラトステネスになって、
自分で実装しなくても剰余が不要になる。
0221デフォルトの名無しさん
2012/10/26(金) 01:19:24.44素数の整数倍にチェック付けて
チェックされてないヤツだけ余り調べる
0222デフォルトの名無しさん
2012/10/26(金) 02:04:19.100223デフォルトの名無しさん
2012/10/26(金) 02:50:16.960224デフォルトの名無しさん
2012/10/26(金) 03:39:23.300225デフォルトの名無しさん
2012/10/26(金) 07:03:14.25律儀に元の数字まで相手してる奴よくいるみたいだな
小さい方から調べていって2 3 5 7 11 13 17 19 ....と見つかっていくわけだが
jはそれまでに見つけた素数だけを入れれば無駄はなくせる
偶数は最初から無視するとして
3 5 7は決め打ちでいいな
9-23 (8個)なら3 -> 8
25-47 (12個)なら3 5 -> 24
49-119 (36個)なら3 5 7 -> 108
121-167 (24個)なら3 5 7 11 -> 96
169-287 (60個)なら3 5 7 11 13 -> 300
289-359 (36個)なら3 5 7 11 13 17 -> 216
361-527 (84個)なら3 5 7 11 13 17 19 -> 588
529-839 (156個)なら3 5 7 11 13 17 19 23 -> 1248
841-959 (60個)なら3 5 7 11 13 17 19 23 29 -> 540
961-1367 (1000までで20個)なら3 5 7 11 13 17 19 23 29 31 -> 200
でそれぞれ割り切れるものがあるかどうかを調べればいい
↑で9以上で3328になるな
前j-1回分のうちに割り切れたjを除外すれば多分どーんと減る
たとえば99の処理が3で終わるので101, 103では3を除外
0226デフォルトの名無しさん
2012/10/26(金) 07:49:10.20中小規模のアプリをさっと作るのに最適な言語を探してるんだが何がイイかな
欲しい条件は
・GUIの扱いが楽
・文字列の扱いが楽
・XMLパーサーなど便利なライブラリが充実してる事
・書きやすく読みやすく保守がしやすい事
・Win Linux Macの最新か一世代前のOSで安定する事
なんやけどどうでっしゃろ?
0227デフォルトの名無しさん
2012/10/26(金) 07:51:56.27保守に関してはブードゥーの呪文
ttp://www.kotono8.com/2008/12/21if-programming-languages-were-religions.html
> 上司があなたに金曜夜21時に緊急の仕事を命ずるときにしばしば使われる。
このようにスピードを重視した言語
0228216
2012/10/26(金) 08:33:16.91皆さんレスありがとうございます。
修正が少なくて%の演算回数が一番少ないのは>>218ですね。
エラトステネスなどはアルゴリズムに入るのか?ということで学科内では避けられています。
>>221>>225
素数の整数倍ですか、見た感じ一番効率よさそうですね。組んでみます。
0229デフォルトの名無しさん
2012/10/26(金) 08:41:25.38アルゴリズムじゃなきゃなんなんだよw
0230デフォルトの名無しさん
2012/10/26(金) 08:47:42.88そこから議論してるのか?
ヤヴァイ集団だぞそれ
おまいらはアルゴリズムとそうでないものの区別がつかないような集団で、
そしてあなたはその一員か?
アルゴリズムの定義ってなんだよ
素数とかそういう段階じゃネーゾソレ
ましてやプログラミングの早さを競う段階でもない
もっと根本的なことから勉強し直さないといけないような集団だろ
マジでヤバイものの一端を見た
教育や学生の頭脳が劣化してる、
そして何よりも、アルゴリズムか否かを多数決で決めてるフシがある
それが一番危険だ、
自分のアタマで判定してない
0231デフォルトの名無しさん
2012/10/26(金) 08:55:18.82しかしそんなもん、出題者に聞けば一発なのに。
0232デフォルトの名無しさん
2012/10/26(金) 09:01:44.22核実験時代の汚染が人々の遺伝子と脳を破壊し白痴が大量生産された
放射能汚染度の高い韓国の国民性をみればその恐ろしさが分かるだろう
Fukushimaによってばら撒かれた超汚染によって世界は韓国と同じレベルに収束する事もはやが約束されているのだ
0233デフォルトの名無しさん
2012/10/26(金) 10:04:51.390234デフォルトの名無しさん
2012/10/26(金) 10:20:15.98C のスレで質問するのもどうかと思うが
C 経験者にもおすすめなのは python
0235デフォルトの名無しさん
2012/10/26(金) 10:39:22.62C言語スレで他の言語を探してどうするよw
0236デフォルトの名無しさん
2012/10/26(金) 11:03:39.510237デフォルトの名無しさん
2012/10/26(金) 11:05:31.49論点が不明なのにそのように言い切ってしまうお前の知能の方が10000倍ヤバい。
0238デフォルトの名無しさん
2012/10/26(金) 11:37:01.32どんな論点で話し合った結果だったんだ?
0239デフォルトの名無しさん
2012/10/26(金) 11:54:55.17さあ? 傍観者のオレにはわからないが、「こういう理由で(オレらの定義の)アルゴリズム
じゃない」という説明がなされた途端に>>230の頭の悪さがはっきりとする。
0240デフォルトの名無しさん
2012/10/26(金) 13:22:40.73・馬鹿はどこにでも居る
・馬鹿は伝染る
・ある馬鹿が居なくなっても必ず別の馬鹿がどこかから現れる
0241デフォルトの名無しさん
2012/10/26(金) 14:17:39.280242デフォルトの名無しさん
2012/10/26(金) 14:17:40.290243デフォルトの名無しさん
2012/10/26(金) 18:33:21.530244デフォルトの名無しさん
2012/10/26(金) 19:31:17.310245デフォルトの名無しさん
2012/10/26(金) 19:42:02.110246デフォルトの名無しさん
2012/10/26(金) 19:54:47.190247デフォルトの名無しさん
2012/10/26(金) 19:58:39.370248デフォルトの名無しさん
2012/10/26(金) 20:07:17.43もう売ってなかった
だれか持ってない?
0249デフォルトの名無しさん
2012/10/26(金) 22:47:04.460250デフォルトの名無しさん
2012/10/26(金) 23:10:58.35fprintf(fp, "%2.2s\n", "123456789" + i*2 );
こんな感じで全角数字を順に1文字ずつ表示するプログラムがあったのですが理屈がよくわかりません。
%2.2sの意味と、文字列同士の加算のように後ろに数字がくっつく結果にならない理由辺りを中心に解説お願い致します。
0251デフォルトの名無しさん
2012/10/26(金) 23:12:35.44"123456" + i
の半角でまず試せ
次は
"123456"[5]
とかで一文字ずつ出力しろ
0252デフォルトの名無しさん
2012/10/26(金) 23:44:01.72"123456789"
は先頭から0バイト目が1, 2バイト目が2... と配置されている。
"123456789" + i*2
はiの値に応じて文字列"123456789"の先頭から
0バイト, 2バイト... のアドレスになる。
%2.2s は指定されたアドレスから2文字(2バイト)出力する。
0253デフォルトの名無しさん
2012/10/27(土) 00:49:36.50なるほど。ありがとうございます。
0254デフォルトの名無しさん
2012/10/27(土) 01:19:43.430255デフォルトの名無しさん
2012/10/27(土) 07:53:30.32char wk[11] = "1234567890";
fflush(stdout);fprintf(stdout, "s =[%s]\n",wk);
fflush(stdout);fprintf(stdout, "As =[%5s][%15s]\n",wk);
fflush(stdout);fprintf(stdout, "-As =[%-5s][%-15s]\n",wk);
fflush(stdout);fprintf(stdout, ".As =[%.5s][%.15s]\n",wk);
fflush(stdout);fprintf(stdout, "A.Bs =[%5.7s][%15.17s]\n",wk);
fflush(stdout);fprintf(stdout, "B.As =[%7.5s][%17.15s]\n",wk);
0256デフォルトの名無しさん
2012/10/27(土) 10:01:36.540257デフォルトの名無しさん
2012/10/27(土) 10:34:42.50実験するな。
ドキュメント読め。
0258デフォルトの名無しさん
2012/10/27(土) 11:10:57.51仕様を読んだうえで想定通り動くかの確認にすべき
0259デフォルトの名無しさん
2012/10/27(土) 13:55:21.41動作させられるなら、先に動作させてから仕様を確認したほうが効率的な場合が多い。
仕様書の文章が理解しやすい文章で書いているとは限らない。
0260デフォルトの名無しさん
2012/10/27(土) 14:49:19.140261デフォルトの名無しさん
2012/10/27(土) 14:57:27.300262デフォルトの名無しさん
2012/10/27(土) 16:26:59.570263デフォルトの名無しさん
2012/10/27(土) 17:47:45.110264デフォルトの名無しさん
2012/10/27(土) 18:44:18.41このコードを保存しとけばいいのに。
毎回こんなことやるのかw
0265デフォルトの名無しさん
2012/10/27(土) 21:37:48.790266デフォルトの名無しさん
2012/10/27(土) 22:08:34.64引数が足らないのはわざと?
0267デフォルトの名無しさん
2012/10/27(土) 23:32:17.290268デフォルトの名無しさん
2012/10/28(日) 13:09:21.28その通り
俺も若かりし頃に、言語仕様では「正常ならTRUE」を信じてコーディングして
しばらくハマったことがある
ここら辺で学ぶんだよな、実装ではどうなってるか確認する必要があると
あと、条件式は合致するケースの少ないものを書いた方がいいとも
※true : 0以外、false : 0
0269デフォルトの名無しさん
2012/10/28(日) 13:16:44.36「>>258
その通り」
のみ書いてあったとする。
だが実際の動作は
「俺も若かりし頃に、言語仕様では「正常ならTRUE」を信じてコーディングして
しばらくハマったことがある
ここら辺で学ぶんだよな、実装ではどうなってるか確認する必要があると
あと、条件式は合致するケースの少ないものを書いた方がいいとも」
で、仕様書とは真逆だったりする。
文章なんてそんなもの。
0270デフォルトの名無しさん
2012/10/28(日) 14:17:36.41引用するならまともな引用でたのむよ
俺のと君のが混ざっとる
0271デフォルトの名無しさん
2012/10/28(日) 14:35:58.620272デフォルトの名無しさん
2012/10/28(日) 18:48:37.100273デフォルトの名無しさん
2012/10/28(日) 19:22:12.520274デフォルトの名無しさん
2012/10/28(日) 19:25:05.240275デフォルトの名無しさん
2012/10/28(日) 19:33:15.14http://en.wikipedia.org/wiki/Sequence_point
0276デフォルトの名無しさん
2012/10/28(日) 19:58:13.690277デフォルトの名無しさん
2012/10/28(日) 20:26:52.21ちゃう、例えばVC++6ではTRUEを1って#defineできってたから、if文で
if(hogehoge(...) == TRUE)
などと書くと、hogehoge関数の戻り値が2,3辺りが返ってきてもelseに
なるんだわ
これ、実際の標準ライブラリで起きた話ね
0278デフォルトの名無しさん
2012/10/28(日) 20:29:45.60仕様通りだね
0279デフォルトの名無しさん
2012/10/28(日) 20:31:03.64それは TRUE なんか使うからだ
あるいは if(exp == 1) なんかやるからだ
仕様以前に文化を理解していないという問題かと
isalpha()とかみっちり使ったことがあれば回避できる問題、ライブラリの問題じゃない、C はそこまで親切じゃない
0280デフォルトの名無しさん
2012/10/28(日) 20:55:33.49データ本体(インスタンス)を指し示す変数自体は、どの型も同じ何で間違っていませんか?
*pにHoge型のポインタをセットした時、Hoge型ではなくint型で参照しに行くとおもいます。
つまり、int *pって書いた時の「int」はインスタンスを参照しに行く時に、どのデータ型で参照するかをコンパイラに教えているためだけに書いてある
けれども、実際には型がHogeなので落ちる
間違えてないでしょうか
0281デフォルトの名無しさん
2012/10/28(日) 21:12:11.41ポインタの型による違いは、pに対して加減算を行なった時の値が違うだけ。
p+1がp+sizeof(int)になるかp+sizeof(Hoge)になるかの違い。
0282デフォルトの名無しさん
2012/10/28(日) 21:14:22.49java の経験があるのかな?
だいたいあってる、
けれども落ちるとはかぎらない、だまって int のつもりでさっさと動いてしまうことも
0283デフォルトの名無しさん
2012/10/28(日) 21:15:13.90あってる
>実際には型がHogeなので落ちる
コンパイラが警告やエラーはだしてくれるだろうけど、動作時に落ちるかどうかは時と場合による
大抵は無理やり読み込んだ意図しない値で進んでしまいそうな気がする
0284デフォルトの名無しさん
2012/10/28(日) 21:20:30.45回答頂きありがとうございます
落ちるか落ちないかは時と場合によるんですね
.net系の職業PGですorz
C<--->.netの連携がさっぱりわからなくて、Cを勉強しようかなと
0285デフォルトの名無しさん
2012/10/28(日) 23:05:05.180286デフォルトの名無しさん
2012/10/28(日) 23:14:32.030287285
2012/10/28(日) 23:52:50.27学科の授業では教科書にK&R2 日本語訳が指定されてるんですが、各所レビューなど見ても分かる通り、仕様書としては良くても入門書としてはどうかなと思っています。
授業ではそれも踏まえて「くどく説明します」と言ってるのに、実際はどこかで詰まると置いてかれる授業です。
そんな訳で何か別に入門書が欲しいと思うんですが、皆さんはどの本から入りましたか?
因みに、友人が他学科の教科書になってる柴田望洋先生の本を貰ってて、いいと言ってました。
あと、授業で配られたこのプリントの出典が分かる人は教えてください。
http://www.imgur.com/ysf9V.jpg
0288デフォルトの名無しさん
2012/10/28(日) 23:58:24.81>>269
俺は>>268と>>277なんだが、始めに「若かりし頃」と書いてるように相当昔の話だよ、書いた件は
あとライブラリが悪いとも書いてない、どちらかというと実装と言語仕様の違いについて、こんな
ことあったよという話
0289デフォルトの名無しさん
2012/10/29(月) 00:01:43.49K&Rで全く問題無いと思うけど、
新版 明解C言語 入門編 http://www.amazon.co.jp/dp/4797327928/
とか
やさしいC 第4版 http://www.amazon.co.jp/dp/479737098X/
でいいんじゃないの。
あと、アルゴリズムも必要みたいだから、
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
http://www.amazon.co.jp/dp/4894712369
を読んでおくとか。
0290デフォルトの名無しさん
2012/10/29(月) 02:16:24.38要するに、TRUEという名前の定数があることを知ってたから
「真を返す」を書いてあった文章をTRUE値を返すと勘違いしたってだけだろ
TRUEを返すと書いてあって2とか3が返ったのならともかく、「真を返す」等の
記述だったなら勘違いしたお前が悪い
0291デフォルトの名無しさん
2012/10/29(月) 02:39:44.190292デフォルトの名無しさん
2012/10/29(月) 02:56:15.550293デフォルトの名無しさん
2012/10/29(月) 07:46:32.29いいたいことはわかる。
しかし、真偽と非零/零が対応することはいにしえのN-BASICからのやりかたであるし文化の問題であることは否めない。
まあ、今はうまくやっているんだろう?
0294デフォルトの名無しさん
2012/10/29(月) 08:16:28.40ん?C言語ってN-BASICより新しい言語だっけ?
C言語に慣習はよく聞くけど文化なんて聞いたことがない。
0295デフォルトの名無しさん
2012/10/29(月) 10:14:43.54どの言語仕様に「正常ならTRUE」と書いてあったんだ。そんなのがあるなら有害図書として殲滅しておけ。次世代につなぐな。
(アルツハイマーの症状が悪化しただけで、存在しないんだろうけど。)
0296デフォルトの名無しさん
2012/10/29(月) 10:30:01.090:真
-1:偽
だったと思う。
一方、Cは、
非0:真
0:偽
なのに、main() の戻り値は
0:成功
非0:失敗
を期待してるっぽいのが訳判らんくて混乱したな。
0297デフォルトの名無しさん
2012/10/29(月) 10:34:06.870:成功 非0:エラー、その値によりどういうエラーかの詳細も
真偽値
非0:真 0:偽
0298デフォルトの名無しさん
2012/10/29(月) 11:38:13.47そんなに必死でウソを書く、お前の原動力はいったい何なのだ?
>N-BASICは、
> 0:真
> -1:偽
>だったと思う。
ぎゃくだ。0:が偽、非0 が真だ。
10 print 1==1
を実行すると
-1
の結果を得る
0300デフォルトの名無しさん
2012/10/29(月) 12:31:26.32BASIC の一致比較は == でなくて = だと思うの
0301デフォルトの名無しさん
2012/10/29(月) 14:36:09.99この str の文字数を求めたいのですがうまくいきません。
【試した方法その1】
int length = strlen(str);
【試した方法その2】
int length;
for( length = 0; str[length] != '\0'; ++length ){
}
【結果】
いずれの方法でも length には 1 が代入されてしまいます。
0302デフォルトの名無しさん
2012/10/29(月) 14:43:49.57どちらも正しい
ttp://codepad.org/JZutIL4b
別の場所に問題があるはずだ
strを書き換えていないか?lengthは正しく確認しているか?
0303デフォルトの名無しさん
2012/10/29(月) 14:51:01.84原因はlengthを使う場所にありました…
素早い回答をありがとうございました。おかげさまですぐに解決しました
0304デフォルトの名無しさん
2012/10/29(月) 18:57:51.32負数:エラー
0以上の正数:正常処理
だっけ?
0305デフォルトの名無しさん
2012/10/29(月) 19:01:13.61多いし1冊じゃ足りないよね
0306デフォルトの名無しさん
2012/10/29(月) 19:10:51.78int *ip;
i = 5;
ip = &i;
printf("%p, %d\n",&i, i);
printf("%p, %d\n",ip, *ip);
とやったら、ポインタ変数ipのアドレス番地も変数iのアドレス番地も同じになりました。
ポインタ変数ipは具体的にどこかにアドレスがふられて変数として領域が確保される
のではないのですか?
0307デフォルトの名無しさん
2012/10/29(月) 19:15:07.96ipのアドレスは&ipでしょ。
ipが指すアドレスは&iだけど。
0308デフォルトの名無しさん
2012/10/29(月) 19:21:38.21なんとなく違和感が ...
0309デフォルトの名無しさん
2012/10/29(月) 19:26:50.100310デフォルトの名無しさん
2012/10/29(月) 19:29:00.310311デフォルトの名無しさん
2012/10/29(月) 19:29:51.100312デフォルトの名無しさん
2012/10/29(月) 19:34:53.47失礼しました。解決しました。
0313デフォルトの名無しさん
2012/10/29(月) 19:43:14.720314デフォルトの名無しさん
2012/10/29(月) 20:45:18.36p > q
でできるのですか?
>の記号で正当に定義されていますか?
それともlongとかintとかにみなされて比較されるのですか(それはまずいとおもう)
0315デフォルトの名無しさん
2012/10/29(月) 20:56:04.680316デフォルトの名無しさん
2012/10/29(月) 20:56:57.230317デフォルトの名無しさん
2012/10/29(月) 21:05:48.740318デフォルトの名無しさん
2012/10/29(月) 21:10:57.040319デフォルトの名無しさん
2012/10/29(月) 21:23:35.450320デフォルトの名無しさん
2012/10/29(月) 21:24:03.920321デフォルトの名無しさん
2012/10/29(月) 21:27:48.540322デフォルトの名無しさん
2012/10/29(月) 21:28:56.43どういう比較をして欲しいのかがわからん。
ポインタはアドレスなんだから32ビットの数値として比較されて当然。
大きくなると負数判定されるかもとか気にしてるの?
0323デフォルトの名無しさん
2012/10/29(月) 21:42:03.30hugeポインタを検索したら、16ビットの時代の話がでてくる
0324デフォルトの名無しさん
2012/10/29(月) 22:00:57.100325デフォルトの名無しさん
2012/10/29(月) 22:39:41.880326デフォルトの名無しさん
2012/10/29(月) 22:56:54.12使えないとのうわさがちらほら、far を自分で管理するのが吉
0327デフォルトの名無しさん
2012/10/29(月) 23:00:13.36末端+1までが合法だったっけ?
int foo[10];
int *p = foo + 9; /* 実体のある最後尾
int *q = foo + 10;
0328デフォルトの名無しさん
2012/10/29(月) 23:04:07.330329デフォルトの名無しさん
2012/10/29(月) 23:11:02.32少なくとも 0〜確保数+1 までは大小関係の維持が保障されてるのか
0330デフォルトの名無しさん
2012/10/29(月) 23:47:28.32p < p + nは、nが幾らだろうと(正の整数でね)保障されるんでないの?数値演算の結果でしかないんだから。
#include <stdio.h>
int main(){
int a[10];
int *p;
for(int i=0; i<15; i++){
if(!(i>= 3 && i<=8)){ // 途中は表示省略
p=a+i;
printf("p=a+%d : p = %p, p-a = %d, (int)p-(int)a = %d, a < p = %d\n", i, p, p-a, (int)p-(int)a, a < p);
}
}
return 0;
}
---実行結果---
p=a+0 : p = 0012FF4C, p-a = 0, (int)p-(int)a = 0, a < p = 0
p=a+1 : p = 0012FF50, p-a = 1, (int)p-(int)a = 4, a < p = 1
p=a+2 : p = 0012FF54, p-a = 2, (int)p-(int)a = 8, a < p = 1
p=a+9 : p = 0012FF70, p-a = 9, (int)p-(int)a = 36, a < p = 1
p=a+10 : p = 0012FF74, p-a = 10, (int)p-(int)a = 40, a < p = 1
p=a+11 : p = 0012FF78, p-a = 11, (int)p-(int)a = 44, a < p = 1
p=a+12 : p = 0012FF7C, p-a = 12, (int)p-(int)a = 48, a < p = 1
p=a+13 : p = 0012FF80, p-a = 13, (int)p-(int)a = 52, a < p = 1
p=a+14 : p = 0012FF84, p-a = 14, (int)p-(int)a = 56, a < p = 1
当然の結果になる。"大小関係"っていう認識が違ってるのだろうか?
0331デフォルトの名無しさん
2012/10/30(火) 00:52:19.910332デフォルトの名無しさん
2012/10/30(火) 01:08:36.94変態的なのが実際にあるのかは知らないけど。
0333デフォルトの名無しさん
2012/10/30(火) 04:07:32.50てことでしょ
0334デフォルトの名無しさん
2012/10/30(火) 07:17:59.300335デフォルトの名無しさん
2012/10/30(火) 10:23:06.39int size;
char hoge[0]; (または char hoge[1];)
};
struct Hage *hage = (struct Hage *)malloc(sizeof(struct Hage) + size);
hage->size = size;
で hage->hoge[n] (0 <= n < 1) じゃなくて (0 <= n < size)
ってアクセスすることがあるから >327-329 はおかしい
0336デフォルトの名無しさん
2012/10/30(火) 10:27:32.97規格書読んで出直しなさい
0337デフォルトの名無しさん
2012/10/30(火) 10:44:05.92mallocで思いっきり確保してるじゃん。
0338デフォルトの名無しさん
2012/10/30(火) 10:46:18.93そういう文法的に未定義の動作とされている書き方をやめさせるために
C99では0長配列メンバを構造体の一番最後に書けるようになった
char hoge[]; という具合
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
0339デフォルトの名無しさん
2012/10/30(火) 18:42:12.40http://www.kouno.jp/home/c_faq/c2.html#6
>Dennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。
どういう意味だろう?
0340デフォルトの名無しさん
2012/10/30(火) 19:25:38.09他人の心に土足で踏み込むっていう意味じゃないかな
0341デフォルトの名無しさん
2012/10/30(火) 19:36:11.850342デフォルトの名無しさん
2012/10/30(火) 19:44:55.890343デフォルトの名無しさん
2012/10/30(火) 20:26:55.00Cやっぱ難しいな............
0344デフォルトの名無しさん
2012/10/30(火) 20:28:41.150345デフォルトの名無しさん
2012/10/30(火) 20:30:25.810346デフォルトの名無しさん
2012/10/30(火) 20:50:14.91生まれつき頭悪いのは自分でも承知です
A[10]を例にして教えてくれませんか?
A[0]=1..........A[9]=10
0347デフォルトの名無しさん
2012/10/30(火) 21:30:36.900348デフォルトの名無しさん
2012/10/30(火) 22:15:48.79だから undefined behavior なんだって
鼻から悪魔
0349デフォルトの名無しさん
2012/10/30(火) 22:20:58.860350桃白白
2012/10/30(火) 22:25:55.61こんばんは桃白白です。
教えてやろうか? 教えてあげるよ? 聞きたいでしょ? 桃白白ひまだから教えてあげてもいいよ?
どうする? 教えてほしいでしょ? じゃあ教えちゃう。A[10]の意味がわからないのでそれは無視するけど。
AVL木の回転操作には一重回転と二重回転がある。
これが右方向への一重回転
http://uploda.cc/img/img508fcfd7ebf3e.png
回転後にトップノードとなるノード、この場合はBを変数にコピーして
Aの左にBの右の子を付けてやっちゃうわけ。そしてBの右の子にAをつけちゃえば回転完了。
これが右方向への二重回転
http://uploda.cc/img/img508fd26919772.png
まず子のノード(B)で一重回転を行って、そのあと親のノード(A)で一重回転を行う。
子のノードで回転後にトップノードとなるのはEなのでEを変数にコピーして
一重回転の要領で付け替える。Eは親のノードで一重回転したときにもトップノードとなる
ノードだったりしちゃうわけ。もういちどこんどは親のノードのところで一重回転の要領で
ノードを付け替えちゃったら回転完了。
プログラムはこんな感じ。
http://ideone.com/yAWgFX
一重回転のコードが4行、二重回転のコードが6行、簡単っしょ。
0351デフォルトの名無しさん
2012/10/30(火) 22:33:53.64ありがとう
要素の入れ替わりが激しくて
どこで回転してるのか分からない
何が回転なのかわからない.................................
ちなみに配列は単に木を保存してるだけです。
0352桃白白
2012/10/30(火) 22:55:21.30わからないわけないだろ、B、Dが右上に上がってA、Cが右下に下がってるだろ。
完全に回転してるだろ、これこそが回転だろ、まごうことなき回転だろ、これが回転なんだよ。
0353デフォルトの名無しさん
2012/10/30(火) 23:00:06.500354デフォルトの名無しさん
2012/10/30(火) 23:02:07.403が1から離れてるのとかアクロバティックすぎてよく分からん
割と本気で困ってる
0355桃白白
2012/10/30(火) 23:20:48.39わからないわけないだろ、なにがアクロバティックだ、あまりふざけたことぬかしてっと桃白白は
ドドンパを行使することも視野に入れる覚悟だ。AVL木は平衡二分探索木。
平衡二分探索木は左右の平衡を保つ二分探索木。二分探索木は、左の子が親の子より
小さくて右の子が親の子より大きい二分木。二分木は2つの子を持つ木。
回転したとき2が一番上に位置するだろ、3は2より大きいから2の右側にいなければいけない。
1は2より小さいから2の左側にいなければいけない。二分探索木の条件を崩さずに平衡を保つために
ノードを付け替える、それがAVL木における回転操作。
0356デフォルトの名無しさん
2012/10/30(火) 23:23:30.43ありがとう図付いてるし考えてみる
ただ計算量まで求めるとなるとお手上げ
ちなみに俺が持ってる回転のイメージは
1 2 3 4 5 → 5 1 2 3 4 → 4 5 1 2 3
こんな感じ
複雑な回転の仕方はイメージできないんだ
0357デフォルトの名無しさん
2012/10/30(火) 23:28:41.450358デフォルトの名無しさん
2012/10/30(火) 23:34:10.39それただ単に、
一次元の配列をrotateしただけ…
0360デフォルトの名無しさん
2012/10/30(火) 23:49:21.95A[0]
A[1]A[2]
A[3]A[4]A[5]A[6]
...................
こんなイメージですかね?
0361デフォルトの名無しさん
2012/10/30(火) 23:54:54.280362デフォルトの名無しさん
2012/10/30(火) 23:58:14.40いまの計算機、木構造をそのまま入れれんのか?
実質もクソもなんも
最終的なデータの形態なんてメモリにならんだビットのコマ切れじゃん
それが意味あるように見えてる、見せてるだけだろ……
0363デフォルトの名無しさん
2012/10/31(水) 00:00:44.98配列複数作ったほうがいいのか?
0364デフォルトの名無しさん
2012/10/31(水) 00:02:33.64ヒープは木の構造は配列サイズで確定されて、
操作が内容のスワップだけだから配列で表現できるってだけだろ。
AVLで同じことやろうとしたら、空き要素が大量にいるだけじゃなくて、
回転したとたんに要素の大移動しなきゃならん。
0365デフォルトの名無しさん
2012/10/31(水) 00:12:45.840367デフォルトの名無しさん
2012/10/31(水) 00:34:25.72じゃぁポインタ?
0368デフォルトの名無しさん
2012/10/31(水) 01:11:32.67もちろん一次元配列で平衡木は非現実的だよ
ヒープソートがどういう動きをしてるのか分からない人がいるのでちょっと触れてみた
0369デフォルトの名無しさん
2012/10/31(水) 15:10:34.51うん、だからわざわざ連続領域の配列に持たせる意味がないんだよね
0370デフォルトの名無しさん
2012/10/31(水) 18:47:31.98while(1){
x=getchar();
if(x==EOF) break;
printf("%d",x);
putchar(x);}
char型の理解を深めようと色々試していたところ
これの%dを%sにして出来たファイルを実行したらセキュリティーソフトからウィルス警告来たのですが
無視しても大丈夫ですか?
0371デフォルトの名無しさん
2012/10/31(水) 19:16:16.56ってのは冗談だが、"%s" に文字(char)とか整数(int)を与えちゃいかんよ。
いまどきのコンパイラなら警告オプションちゃんとつければ、
だめよって警告してくれるはず。
0372デフォルトの名無しさん
2012/10/31(水) 21:08:53.880373デフォルトの名無しさん
2012/11/01(木) 03:31:59.36下のコードを MinGW gcc 4.6.2 で -O2 オプションでコンパイルすると
ld がマルウェア作ったとかいってブロックされるwww
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d %d\n", a, b);
return 0;
}
0374デフォルトの名無しさん
2012/11/01(木) 06:28:00.03話は署で聞こうか
0375デフォルトの名無しさん
2012/11/01(木) 10:23:17.420376デフォルトの名無しさん
2012/11/01(木) 11:01:29.54使える条件が整えば便利に使えると思うよ
0377デフォルトの名無しさん
2012/11/01(木) 11:18:36.17それで得られるメリットがめんどくささを凌駕するならまだしもそんなこともないしな
0378デフォルトの名無しさん
2012/11/01(木) 11:19:57.170379デフォルトの名無しさん
2012/11/01(木) 11:33:34.870380デフォルトの名無しさん
2012/11/01(木) 11:48:23.76scanf は解釈に失敗した場合に巻き戻せないのが難点
sscanf ならバッファを書き換えない限りいけるので まだ融通が利く
0381デフォルトの名無しさん
2012/11/01(木) 11:53:19.660382デフォルトの名無しさん
2012/11/01(木) 11:59:12.35sscanf は入力行のチェックをしてから通す。常識。
0383デフォルトの名無しさん
2012/11/01(木) 12:54:04.04ungetc
0384デフォルトの名無しさん
2012/11/01(木) 13:06:15.02シーケンシャルアクセスだけですべて解決する問題なら気にしなくていいのだけどランダムアクセスしたい時に困ります
0385デフォルトの名無しさん
2012/11/01(木) 13:12:16.66POSIXにはoff_tで使えるfseeko(3)があるけど。
0386デフォルトの名無しさん
2012/11/01(木) 14:43:07.250387デフォルトの名無しさん
2012/11/02(金) 05:04:27.14拡張関数とかでお茶にごしてるけど。
0388デフォルトの名無しさん
2012/11/02(金) 05:34:39.47>>384 は long を必要分だけ拡張すれば済む話。
sizeof(int)=4 はいいとして
sizeof(long)=4 とした処理系が跋扈し、というかそれ以外の処理系とライブラリが主流にならなかった点に問題がある。
C の規格自体にはそのあたりに縛りはないから「時代にとらわれる」ということは基本ない
0389デフォルトの名無しさん
2012/11/02(金) 08:44:02.17外部設計を見直し、ランダムアクセス不要にする
0390デフォルトの名無しさん
2012/11/02(金) 10:16:18.61拡張こそ肝心で、これを妨げないことが標準の使命だ
0391デフォルトの名無しさん
2012/11/02(金) 10:21:30.890392デフォルトの名無しさん
2012/11/02(金) 20:15:39.410393デフォルトの名無しさん
2012/11/02(金) 23:39:09.97整数みたいに少なくとも幾つまでは安心して使える的な
0394デフォルトの名無しさん
2012/11/02(金) 23:44:22.690395デフォルトの名無しさん
2012/11/02(金) 23:48:58.28標準準拠だと何もできないなこの言語って
0396デフォルトの名無しさん
2012/11/02(金) 23:52:03.54実装の自由度が広いって事だ
言語ができた当時の環境やコンパクトな実装がC言語と名乗れなくなるだろ
0397デフォルトの名無しさん
2012/11/03(土) 00:10:16.680398デフォルトの名無しさん
2012/11/03(土) 00:56:37.440399デフォルトの名無しさん
2012/11/03(土) 01:13:57.770400デフォルトの名無しさん
2012/11/03(土) 02:01:19.490401デフォルトの名無しさん
2012/11/03(土) 02:23:47.410402デフォルトの名無しさん
2012/11/03(土) 03:29:32.30初めての質問です。
C言語で簡単な自己複製プログラムを作るにはどうすればいいでしょうか。
クワインのような自身のソースコードを出力するプログラムではなく、複製後実行までするプログラムです。
アセンブラやC言語の知識が必要だと思いここに書き込みました。
よろしくお願いします。
0403デフォルトの名無しさん
2012/11/03(土) 05:52:01.050404デフォルトの名無しさん
2012/11/03(土) 07:16:03.64宿題スレで回答できるくらいのレベルになればいいんじゃね?w
0405デフォルトの名無しさん
2012/11/03(土) 11:09:51.34} else if ( ..... ){
.... ;
} else {
... ;
}
for ( i=0; i<N; i++ );
printf ( "....\n" );
np = (HOGE *)malloc( sizeof(HOGE) );
などなど、皆さんは空白入れたり、入れなかったりどうしていますか?
0406デフォルトの名無しさん
2012/11/03(土) 11:11:25.380407デフォルトの名無しさん
2012/11/03(土) 11:15:03.410408桃白白
2012/11/03(土) 11:27:38.83if (0) {
} else if (a == a) {
hogehoge;
} else if (a == b) {
fugafuga;
} else if (a == c) {
taopaipai;
}
0409デフォルトの名無しさん
2012/11/03(土) 11:27:54.65K&Rスタイル
if (), while (), switch () と制御文のキーワードの後は空白を入れる
func() 関数の後には空白を入れない
関数の引数に関しては func(a, b, c) 引数の区切りの, の後ろにのみ空白をいれる
カンマ演算子以外は演算子の前後に空白があるようにする。カンマ演算子の場合は後ろに空白があるようにする
そんなところかなあ
0410デフォルトの名無しさん
2012/11/03(土) 11:29:11.780411デフォルトの名無しさん
2012/11/03(土) 11:40:45.48int x = looooooooooooooooooooooooooooooooooooooooong_type.functiooooooooooooooooooooooooooooooooooooooon
(a1, a3);
int x = looooooooooooooooooooooooooooooooooooooooong_type
.functiooooooooooooooooooooooooooooooooooooooon(a1, a3);
int x = looooooooooooooooooooooooooooooooooooooooong_type.
functiooooooooooooooooooooooooooooooooooooooon(a1, a3);
0412デフォルトの名無しさん
2012/11/03(土) 11:42:29.480413デフォルトの名無しさん
2012/11/03(土) 11:55:51.37末尾に || && 若しくは 行頭で || &&
0414デフォルトの名無しさん
2012/11/03(土) 13:54:35.64行頭で || &&
0415デフォルトの名無しさん
2012/11/03(土) 14:24:51.28コンパイラはVC++2010を使っています
#include <stdio.h>
#define MAX 30
#define COUNTBY 3
int main(void)
{
int i;
for(i=1; i<MAX; ++i)
if(i%COUNTBY==0)
printf("%d ",i);
return 0;
}
というソースなのですが、これではif文内が実行されません(実行されることを期待していた)
for(i=1; i<MAX; ++i)
if(i%COUNTBY==0){
printf("%d ",i);
}
若しくは、
for(i=1; i<MAX; ++i){
if(i%COUNTBY==0)
printf("%d ",i);
}
とすると実行されます。この理由がわかりません。元の文も一応大きく見て一つの文であると思うのですが
何故なのか分かり兼ねます。よろしければ、解説していただきたいのですが。
初歩的な質問で申し訳ありません
http://codepad.org/NZ3mx5Kd
実行されているようですよ。環境など別の理由がありそうですね。
0417デフォルトの名無しさん
2012/11/03(土) 14:44:08.663 6 9 12 15 18 21 24 27
でしょ。問題ない。
ただ、for文もif文も{ }でくくっておいた方がいいのでは?
どうしてもというスタイルにこだわりがなければ。
0418デフォルトの名無しさん
2012/11/03(土) 14:45:37.21単純にMSVCがCコンパイラとしてクズだってことじゃね
0419デフォルトの名無しさん
2012/11/03(土) 14:52:56.410420415
2012/11/03(土) 14:57:45.60>>417
>>418
>>419
質問に答えて頂いて、ありがとうございます
私は、普段ビルド後はデバッグで結果を確認しているのですが、
実行に問題無いということでしたので、試しにデバッグでは無くそのまま実行してみたところ
確かに問題なく、実行されました。つまり、VC++のデバッグ等がうまくいかない理由なのかもしれません
デバッグ時は、return 0;の位置にブレイクポイントをおいてデバッグしています。
やはり、こういった問題や、読みやすさを考えるなら、>>417さんの言うとおり、
for文、if文も{}で括ることが推奨されるのでしょうか
何にしても、普通に実行すれば問題は無かったのに、わざわざ皆さんの貴重な時間を割いてしまって申し訳ありません
感謝しております
0421デフォルトの名無しさん
2012/11/03(土) 14:58:11.780422デフォルトの名無しさん
2012/11/03(土) 15:04:35.14初心者にはありがちかも。
0423415
2012/11/03(土) 15:13:43.25>>422
確認してみましたが、タイプミスでは無いかと思います。
全く同じソースコードでも、通常実行時は問題がありませんが
デバッグ時は出力されません
0424デフォルトの名無しさん
2012/11/03(土) 15:21:57.66きっとバグってるんだね
頭とか
0425デフォルトの名無しさん
2012/11/03(土) 15:23:06.11単純にフラッシュされてないだけじゃね?
ブレポと標準出力は相性悪い気がする。
0426デフォルトの名無しさん
2012/11/03(土) 16:00:30.11vc2010のバグだね。
ループの終わりが↓になるけど、>>415の1番目でreturnにブレークポイント設定すると
(1)に設定される、2,3番めは(2)に設定される。
call dword ptr [__imp__printf (12E82D4h)]
add esp,8
cmp esi,esp
call @ILT+300(__RTC_CheckEsp) (12E1131h)
jmp main+27h (12E13D7h) <<< (1)
xor eax,eax <<< (2)
0427デフォルトの名無しさん
2012/11/03(土) 16:02:49.910428デフォルトの名無しさん
2012/11/03(土) 16:12:29.310429デフォルトの名無しさん
2012/11/03(土) 16:18:39.74これでかなり捗る。
0430デフォルトの名無しさん
2012/11/03(土) 16:39:05.00もしかして、hoge 嫌い?
chromeをチョロメとか言われたら気分を害すタイプか?
略語の方は関係ないと思うけどコテハンを読み飛ばすのは効果的ですね
0433デフォルトの名無しさん
2012/11/03(土) 18:37:34.81以下のような関数内でfloat型の変数の中身を文字列として使用したいのですが
PICのプログラム領域不足のためsprintfを使用することが出来ません。
何か代用になる関数等は無いでしょうか?
cMsgの中に1023を100%とした100分率の値を格納したいのです。
もしスレチでしたら誘導していただけるとありがたいです。
unsigned int giDuty;
void dispDuty(void){
float fDuty = 0;
unsigned char cMsg[16];
memset(cMsg, 0x00, sizeof(cMsg));
fDuty = giDuty / 1023 * 100;
sprintf(cMsg, "Heater:%3.1f %%\n", fDuty); ←これが大きすぎてコンパイルできない。
sb1602_cmd(0xC0); // カーソルを先頭に移動
sb1602_str(cMsg); // LCD表示
}
開発言語:C
コンパイラ:HITEC C
マイコン:PIC12F683
0434デフォルトの名無しさん
2012/11/03(土) 18:49:17.620435デフォルトの名無しさん
2012/11/03(土) 19:12:30.47それ以前にfDutyに整数しか入ってなくね?1023.0とか1023fとかにしないと
案としては434だろうね
int Duty = giDuty*1000/1023;
sb1602_int(Duty/10);
sb1602_str(".");
sb1602_int(Duty%10);
みたいなイメージか
0436デフォルトの名無しさん
2012/11/03(土) 19:32:14.72>>435
こんなやり方があるんですね。
ちょっと試してきます!
0437デフォルトの名無しさん
2012/11/03(土) 21:35:12.150438デフォルトの名無しさん
2012/11/03(土) 22:20:49.42そういうプラットフォームでprintf系の関数を使ったり、掛け算や割り算、ましてや浮動小数点を使うなんてバカなの?
0439デフォルトの名無しさん
2012/11/03(土) 22:37:23.07って釣り?
0440デフォルトの名無しさん
2012/11/03(土) 22:43:15.900441デフォルトの名無しさん
2012/11/03(土) 23:12:08.180442デフォルトの名無しさん
2012/11/03(土) 23:30:58.30え、違う?
0443デフォルトの名無しさん
2012/11/03(土) 23:44:19.170444デフォルトの名無しさん
2012/11/04(日) 00:27:36.15そういうプラットフォームとか言うが、PIC も色々あるぞ。
printf( ) 系のライブラリとか浮動小数点あたりはまだ同意するけど、
掛け算、割り算まで使うなとか言う 8bit 時代から進化できない爺は
早くリタイアしてくれないかなぁ。
0445433
2012/11/04(日) 02:29:35.21>>435
遅くなりましたが今確認とれました。
無事動作しました。
ありがとうございました。
マイコン使うなんて初めてで標準関数がこんなに重いものだとは思いませんでした。
使えなくなって初めて有り難味がわかるものですね。
>>439
>>442
リンク中かもしれません。
確かpicc.exeプログラム領域が足りないって怒られてました。
もうログ流れちゃったので具体的な文は出せないですが。
0446433
2012/11/04(日) 03:01:14.02>>444
試しに別な関数の乗算をシフト演算でやってみましたがプログラム領域は変わりませんでした。
コンパイラが最適化してくれてるんですかね。
乗算のままの方が読みやすいのでそのままにしておきます。
0447デフォルトの名無しさん
2012/11/04(日) 10:04:16.75意味が変わるっていうか、コンパイルエラー吐くだろ?
いまは違うんか?
0448デフォルトの名無しさん
2012/11/04(日) 10:32:09.660449デフォルトの名無しさん
2012/11/04(日) 13:18:07.26;
エラーにならない例。
0450デフォルトの名無しさん
2012/11/04(日) 13:47:39.13コンパイルエラーだろ
0451デフォルトの名無しさん
2012/11/04(日) 13:50:51.170452デフォルトの名無しさん
2012/11/04(日) 15:25:42.71構造体で個体情報を保持し、リストで管理するようなプログラムです。
(実際はもっとごちゃごちゃしてますが大体ということで)
1.main内で構造体変数のポインタを宣言し、
2.それを関数に渡します(参照渡し)
3.関数内でポインタに、構造体変数の実体を保持したポインタを代入します。
これだけのプログラムですが、うまくいきません。
関数内では、割り当て元のPも割り当てた後のP(引数で受けたもの)も
きちんとアドレス参照で確認できます。
けれど、mainに戻って、渡したポインタから数値を確認すると、きちんと代入されていません。
もう少し具体的に書くと
1.main()内 → struct STRUCT *p; 構造体へのポインタ宣言
2.void func(struct STRUCT *p)関数へ引き渡し(func(p);)
3.関数内での代入 p=ptmp;
4.一応関数内での確認 printf("kakuninn %d %g \n", p->value1, p->value2);
5.mainにもどって同じように確認すると、めちゃくちゃ。
コンパイラはgccです。
ポインタへのポインタとか、そのあたりの認識ミスだと思うのですが、
自分なりに考えても、これであってると思うので手詰まりです。
お願いします。
0453452
2012/11/04(日) 15:38:58.12その方向で一度書き直してみます。
もし間違ってたらアドバイスを……
0454デフォルトの名無しさん
2012/11/04(日) 15:45:25.100455デフォルトの名無しさん
2012/11/04(日) 15:49:30.02一番簡単なのは、
>3.関数内での代入 p=ptmp;
のところで、
*p = *ptmp
とすれば多分オケ
0456デフォルトの名無しさん
2012/11/04(日) 15:56:00.440457デフォルトの名無しさん
2012/11/04(日) 16:11:29.350458デフォルトの名無しさん
2012/11/04(日) 16:13:41.06すまぬ、領域の確保までしたいのか
よく見てなかったわ
すると、ダブルポインタしかないね
0459デフォルトの名無しさん
2012/11/04(日) 16:29:25.19ソースがあればはっきりするが、関数から戻った時に、ptempの内容が破壊されてるんでは?
0460デフォルトの名無しさん
2012/11/04(日) 16:37:42.58プログラムが大きいので部分的にしか導入できてませんが、
void func(struct STRUCT **p)に変更し、
関数への引渡しはfunc(&p)、
関数内での処理はp=&ptmp
となるでしょうか。
これで一応回りそうなのですが。
0461デフォルトの名無しさん
2012/11/04(日) 16:43:03.85ローカル変数のアドレスを外に返したらあかん。
0462デフォルトの名無しさん
2012/11/04(日) 16:44:19.810463デフォルトの名無しさん
2012/11/04(日) 16:57:10.56関数内のpは、目的ポインタのアドレス確保のためのポインタですので、
p=&ptmpでいいのではないでしょうか
>>461
実体部のアドレスに書き直しました
0464452
2012/11/04(日) 17:02:29.74*p=ptmpではエラーが出ず
p=&ptmpではエラーが出る
0465デフォルトの名無しさん
2012/11/04(日) 17:04:54.50それなら >>462 は大嘘で *p = ptmp かな。
0466デフォルトの名無しさん
2012/11/04(日) 17:07:32.54とりあえず*p=ptmpで通りました
0467デフォルトの名無しさん
2012/11/04(日) 17:09:39.340468デフォルトの名無しさん
2012/11/04(日) 17:09:42.93ありがとうございました
0469デフォルトの名無しさん
2012/11/04(日) 17:10:38.40こうか?
#include <stdio.h>
struct STRUCT {
int value1;
double value2;
};
struct STRUCT ptmp;
void func(struct STRUCT **p);
void func(struct STRUCT **p)
{
ptmp.value1=123;
ptmp.value2=456;
*p=&ptmp;
printf("kakuninn %d %g ¥n", (*p)->value1, (*p)->value2);
}
int main()
{
struct STRUCT *p;
func(&p);
printf("kakuninn %d %g ¥n",p->value1, p->value2);
return 0;
}
0470デフォルトの名無しさん
2012/11/04(日) 17:17:48.050471デフォルトの名無しさん
2012/11/04(日) 18:24:48.73一番早い。
0473デフォルトの名無しさん
2012/11/04(日) 19:09:16.49おまえ ioccc に出てみないか?
コードがキモさの素質で漲ってるぞ
0474デフォルトの名無しさん
2012/11/04(日) 19:09:40.02この辺とかあんまりだろw
0475デフォルトの名無しさん
2012/11/04(日) 19:18:38.32初心者の学習意欲を削ぐようなことを言うなや。
0477デフォルトの名無しさん
2012/11/05(月) 01:33:28.59数値の範囲指定なんですがどのように書けば良いのでしょうか?
例えば0以上〜8未満、5以上7以下と言う感じです
入門書を見てるのですがいまいちわからないもので・・・よろしくお願いします
0478デフォルトの名無しさん
2012/11/05(月) 01:37:48.85xが0以上かつ8未満
x>=0 && x<8
xが5以上かつ7以下
x=>5 && x<=7
みたいな?
0479デフォルトの名無しさん
2012/11/05(月) 01:38:54.340 <= x && x < 8
0480478
2012/11/05(月) 01:39:18.75x>=5 && x<=7
0481デフォルトの名無しさん
2012/11/05(月) 02:30:54.70こちらで質問させてください。
http://codepad.org/bCnoXDJM
上記のようなコードで、構造体のポインタを戻り値で返す説明をしているのですが、
struct Jugyoin* GetJugyoin() の構造体の関数で、なぜポインタにする必要があるのでしょうか?
0482ビル・ジョブス
2012/11/05(月) 02:46:48.56でもポインタなら4バイトとかでstaticな構造体のアドレスだけ返して高速、
ポインタじゃないとstaticな構造体のコピーを返すから低速、と言うかコンパイラが自動生成するコピーコードと受け側で実体分のメモリを確保する必要があるからこの場合無駄だらけかと。
0483デフォルトの名無しさん
2012/11/05(月) 02:47:20.23その本の質題の意図がわからないので、そのコードをだけを踏まえた一般論ですが、パフォーマンスでしょう。
ポインタなら大抵4〜8バイトのコピーで済みます。
0484デフォルトの名無しさん
2012/11/05(月) 02:50:15.320485ビル・ジョブス
2012/11/05(月) 02:57:23.83struct Jyugyoin* GetJyugoin();
ではなく、
struct Jyugyoin* getTanaka();
だろ
0486デフォルトの名無しさん
2012/11/05(月) 03:02:32.000487デフォルトの名無しさん
2012/11/05(月) 03:39:58.73ありがとうございます!お陰でなんとか形になりました
あと、もう一つ質問したいんですが少数第二位まで判定する場合はどのようにすれば良いのでしょうか?
x>=5.0 && x<=7.0 と書いているのですが7.5など入力すると切り捨てで7の扱いになってしまいます・・・
0488デフォルトの名無しさん
2012/11/05(月) 03:41:33.470489ビル・ジョブス
2012/11/05(月) 03:51:02.30if (f > 7.5f && f < 7.9f)・・・
とかでダメなの?
ちなみに変数fとリテラルの最後のfは無関係だから
0490デフォルトの名無しさん
2012/11/05(月) 08:10:05.900491デフォルトの名無しさん
2012/11/05(月) 10:53:08.41そんなもん人の勝手だろう
ましてやただのコード片にセンスも糞も必要なわけない
0492デフォルトの名無しさん
2012/11/05(月) 11:12:25.640493デフォルトの名無しさん
2012/11/05(月) 11:45:50.45そこでケチってマルチスレッドで泣くパターン
関数呼び出しをスレッドで排他すればかわせるけどね
0494デフォルトの名無しさん
2012/11/05(月) 11:57:25.530495デフォルトの名無しさん
2012/11/05(月) 12:21:17.04自分ではいいプログラム組めないもんだからさ
0496デフォルトの名無しさん
2012/11/05(月) 12:24:23.760497デフォルトの名無しさん
2012/11/05(月) 13:18:52.75構造体をコピーして返しても、このコードならロックは不要。
マルチスレッドにしても何の問題もない。
シロートは知ったかぶりしないで余計な口出ししない方がいいぞ。
0498デフォルトの名無しさん
2012/11/05(月) 13:33:05.590499デフォルトの名無しさん
2012/11/05(月) 22:23:18.360500デフォルトの名無しさん
2012/11/05(月) 22:30:38.930501デフォルトの名無しさん
2012/11/05(月) 23:11:05.870502デフォルトの名無しさん
2012/11/05(月) 23:23:36.830503デフォルトの名無しさん
2012/11/06(火) 13:07:14.02char matsui[1]; //ろくに使えない
0504デフォルトの名無しさん
2012/11/06(火) 16:44:01.05{ for(;*str;str++){
if(*str==c)
return ((char*)str);}
return NULL;
}
int main(void)
{ char uletter[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
char str[10],*p;�@
printf("英大文字を入力してください。:");
scanf("%s",str);
p=str_chr(uletter,str[0]);�A
puts(p);
return 0;
}
一文字入力してそれを関数に送るということで�@をchar str�Aを(,str)と書いたらダメでした。
上記の通りに配列で宣言して配列の先頭アドレスを引数にしないと停止するのですが何故なのでしょうか?
0505デフォルトの名無しさん
2012/11/06(火) 16:57:27.11実入力が1文字しかなくても文字列として読み込みますよ
char str[10];
scanf("%s", str);
char str;
scanf("%c", &str);
0506デフォルトの名無しさん
2012/11/06(火) 17:09:51.74答えようがない。
0507デフォルトの名無しさん
2012/11/06(火) 17:31:13.19>>504の�@�Aに書いてあるようにして実行すると、
セグメンテーション違反が起きる。
0508デフォルトの名無しさん
2012/11/06(火) 17:38:51.20コード見てわからない無能は答えようとしてくれなくて結構です
0509デフォルトの名無しさん
2012/11/06(火) 17:54:24.90しかも & なしで str だけ渡したら不定じゃハゲ
# 無能さんすごい!
0510デフォルトの名無しさん
2012/11/06(火) 18:01:54.59str(ポインタ)を渡したら動かないのは当然。
0511デフォルトの名無しさん
2012/11/06(火) 22:33:13.20str_charの第二引数はint型なのにchar型を渡そうとしてるからint→charに引数はへんこうしたらいいよ
scanfで文字を一つ入力するのに%sではエリア破壊を引き起こすから、getcでいいんじゃね?
str_charの戻り値はnullであることもあるので(この例ではエラーにはならんとおもうが)判定くらいは
した方がいいね。
0512デフォルトの名無しさん
2012/11/06(火) 23:05:45.60>str_charの第二引数はint型なのにchar型を渡そうとしてるからint→charに引数はへんこうしたらいいよ
>scanfで文字を一つ入力するのに%sではエリア破壊を引き起こすから、getcでいいんじゃね?
getcharを使ったら?それならstr_charの第二引数はint型と辻褄合うし。
int main(void)
{
char uletter[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
char *p;
int ch;
printf("英大文字を入力してください。:");
ch = getchar();
p = str_chr(uletter, ch);
puts(p);
return 0;
}
0513504
2012/11/06(火) 23:37:53.84自分の書いたプログラムと回答の差異である宣言と呼び出しにばかり注目してscanfの問題に気づきませんでした。
char型は%sと短絡的に考えていて、文字列として読み込むことを意識していなかったようです。
>>511
一文字入力にはgetcがありましたね。scanfばかり使うので、入力はscanfで頭が固まっていました。
int型については私も疑問に思っていましたが(本にintと書いてあるので)、指摘があると言うことは何かのテクニックではないようですね。
0514デフォルトの名無しさん
2012/11/06(火) 23:57:56.680515デフォルトの名無しさん
2012/11/07(水) 00:40:22.500516デフォルトの名無しさん
2012/11/07(水) 00:52:27.740517デフォルトの名無しさん
2012/11/07(水) 03:12:17.82while ( 条件 );
while ( 条件 )
;
while ( 条件 ){
;
}
0518デフォルトの名無しさん
2012/11/07(水) 03:18:40.77#include <conio.h>
getchar(); や kbhit();
があって、楽なんですけどね。
Linuxではどうすればいいのか…。
ところで余談かつ、散々既出だと思うけど、
char str[10];
scanf("%s", str);
で半角10文字以上入力するとバッファがあふれるので、
文字列の入力は
fgets(str, sizeof(str)-1, stdin);
などを使いましょう。
0519デフォルトの名無しさん
2012/11/07(水) 03:21:01.76私は、明示的に3番目の書き方します。
0520デフォルトの名無しさん
2012/11/07(水) 04:00:27.89{
Sleep(300);
}
0521デフォルトの名無しさん
2012/11/07(水) 04:01:50.75fgets(str, sizeof(str), stdin);
0522デフォルトの名無しさん
2012/11/07(水) 04:16:29.50訂正
×> #include <conio.h>
> getchar(); や kbhit();
> があって、楽なんですけどね。
○> #include <conio.h>
> getch(); や kbhit();
> があって、楽なんですけどね。
>>521
ああ、そちらが正解ですね。
fgetsは終端を考慮していますね。
訂正ありがとう。
>kbhit();
>Linuxではどうすればいいのか…。
http://hibari.2ch.net/test/read.cgi/tech/1289715349/320
http://codepad.org/WfSnugZg
0524デフォルトの名無しさん
2012/11/07(水) 05:11:48.68出来ました。
ありがとうございます。
fcntl();でgetchar();を制御するのかな。
もっと精進します。
0525デフォルトの名無しさん
2012/11/07(水) 08:46:26.07散々既出だと思うけど、
char str[10];
scanf("%9s", str);
で、バッファオーバーランは防げる。
http://d.hatena.ne.jp/eel3/20090720/1248017333
scanfは他にも問題あるから薦めないけど。
0526デフォルトの名無しさん
2012/11/07(水) 08:55:53.71東京理一、大阪医学部→レギュラー
早慶理工、新潟医学部→補欠
駅弁医学部、秋田医学部→二軍
その他→死刑、生きる価値なし
0527デフォルトの名無しさん
2012/11/07(水) 09:23:23.95処理ないなら書かないだろ
0528デフォルトの名無しさん
2012/11/07(水) 11:05:10.180529デフォルトの名無しさん
2012/11/07(水) 12:09:21.24他の言語だとキーの入力くらいは安全かつ便利なライブラリが存在しているのが普通だと思いますが、
どうしてC言語にはそのようなライブラリがないのでしょうか?これだけの利用者がいるのなら既にそういったノウハウが蓄積されたライブラリがあってもおかしくないと思うんですが
0530デフォルトの名無しさん
2012/11/07(水) 12:15:53.92処理系ごとの独自拡張ライブラリを使うのがいい。
0531デフォルトの名無しさん
2012/11/07(水) 12:52:17.16boost
0532デフォルトの名無しさん
2012/11/07(水) 12:54:02.79>どうしてC言語にはそのようなライブラリがないのでしょうか?
OS というかハードウェアによるから
そういうのは標準には入れないだけで
標準にこだわらなければライブラリは在る
0533デフォルトの名無しさん
2012/11/07(水) 13:01:25.55ncurses
0534デフォルトの名無しさん
2012/11/07(水) 13:31:11.29いやいや、scanf()でも"%c"もあるけどな。
"%s"の代わりに"%9s"を使えばバッファオーバフローの問題もないけどな。
>>処理なし
私は自分のコード内では1番目、他人もメンテナンスする前提のコード内では3番目。
>>仮引き数の型のchar
昔のプロトタイプ宣言のない時代のCではcharを渡そうとしてもintに昇格せざるを得なかったから、
charの引き数は敬遠されたと言う経緯はあるね。
0535デフォルトの名無しさん
2012/11/07(水) 14:19:34.11その程度のものなら一回書いたら終わりだから。
0536デフォルトの名無しさん
2012/11/07(水) 14:55:32.10後ろから改行が見つかるまでシークして一行読み込み、と泥臭く栗返すしか無いのでしょうか
0537デフォルトの名無しさん
2012/11/07(水) 14:59:08.06記憶列を逆順に、後ろから1行づつ喰いたいとしている処理へ渡す
0538デフォルトの名無しさん
2012/11/07(水) 15:01:35.950539デフォルトの名無しさん
2012/11/07(水) 16:54:36.13なるほど
tailのソース読んでパクればいいのか
GPLには要注意だけどBSD版もあるし
0540デフォルトの名無しさん
2012/11/07(水) 20:43:08.61他の敵陣の様子は見れないのにも関わらず、いつのまにか繁栄してたりすることあるけど
これはc言語におけるマルチスレッドが関係してるの?
0541デフォルトの名無しさん
2012/11/07(水) 20:47:13.640542デフォルトの名無しさん
2012/11/07(水) 21:09:06.27tacじゃないかな。
0543デフォルトの名無しさん
2012/11/07(水) 21:37:02.98int data[10];
int* p = data;
printf("p:%d, data:%d, p-data:%d\n", p, data, p - data);
p++;
printf("p:%d, data:%d, p-data:%d\n", p, data, p - data);
return 0;
}
0544デフォルトの名無しさん
2012/11/07(水) 21:37:42.51$ ./a.exe
p:2280624, data:2280624, p-data:0
p:2280628, data:2280624, p-data:1
p-data:1のとこがなんでp-data:4にならないんですか
0545デフォルトの名無しさん
2012/11/07(水) 21:38:35.12int* だから
0546デフォルトの名無しさん
2012/11/07(水) 22:00:30.760547デフォルトの名無しさん
2012/11/07(水) 22:35:36.630548デフォルトの名無しさん
2012/11/07(水) 23:58:18.78シークは、おそい。リストをつかったら、はやくなる。
最後に追加した行から、順によみとる
0549デフォルトの名無しさん
2012/11/08(木) 00:02:58.430550デフォルトの名無しさん
2012/11/08(木) 00:55:51.29fseek()をつかったプログラムより、はやかった。よくおぼえてる。
0551デフォルトの名無しさん
2012/11/08(木) 10:35:12.550552デフォルトの名無しさん
2012/11/08(木) 10:36:38.78インクリメントと読み取りは分けた方がよい設計に思えるのですが?
0553デフォルトの名無しさん
2012/11/08(木) 10:40:22.48みつを
0554デフォルトの名無しさん
2012/11/08(木) 10:52:22.93その設計でAPI作って、ちょっとしたプログラム書いてみてよ
0555デフォルトの名無しさん
2012/11/08(木) 11:32:07.910556デフォルトの名無しさん
2012/11/08(木) 11:39:23.080557デフォルトの名無しさん
2012/11/08(木) 11:50:07.410558デフォルトの名無しさん
2012/11/08(木) 11:50:10.88それをCに期待するのは筋違いと言うものだ。
0559デフォルトの名無しさん
2012/11/08(木) 11:52:50.90だから、君の考えるAPIを使って既存の読み込み処理を書き換えてご覧よ。
0560デフォルトの名無しさん
2012/11/08(木) 12:02:20.96ネットワークから流れてくるデータなんかもストリーム。
0561デフォルトの名無しさん
2012/11/08(木) 12:07:14.65終わりがあるのかないのか、次がいつ流れてくるのか、そう言う事には左右されない抽象的な概念。
ベクターをストリームとして扱う事はできるけど、逆は無理。
0562デフォルトの名無しさん
2012/11/08(木) 15:06:27.670563デフォルトの名無しさん
2012/11/08(木) 15:35:14.550564デフォルトの名無しさん
2012/11/08(木) 15:53:34.230565デフォルトの名無しさん
2012/11/08(木) 16:07:36.040566デフォルトの名無しさん
2012/11/08(木) 17:24:37.170567デフォルトの名無しさん
2012/11/08(木) 17:27:26.320568デフォルトの名無しさん
2012/11/08(木) 17:50:00.060569デフォルトの名無しさん
2012/11/08(木) 18:23:59.200570デフォルトの名無しさん
2012/11/08(木) 19:36:33.56いま SSD が人気だね
0571デフォルトの名無しさん
2012/11/08(木) 19:56:12.450572デフォルトの名無しさん
2012/11/08(木) 21:21:21.39int型とdouble型の話なのですが、
#include <stdio.h>
int main(void){
double d1, d2, d3, d4;
d1 = 5 / 2; d2 = 5.0 / 2.0;
d3 = 5.0 / 2; d4 = 5 / 2.0;
printf("d1 = %f\n", d1);
printf("d2 = %f\n", d2);
printf("d3 = %f\n", d3);
printf("d4 = %f\n", d4);
return(0);
}
実行結果が
d1 = 2.000000
d2 = 2.500000
d3 = 2.500000
d4 = 2.500000
となるのですが、なぜd1は
計算的には5.0/2.0と同じなのに
int型のように小数点以下が切り捨てられたのでしょうか?
d3とd4も小数点がどちらか片方ありませんが、
小数点以下が計算されています。なぜでしょうか?
0573デフォルトの名無しさん
2012/11/08(木) 21:32:42.590574デフォルトの名無しさん
2012/11/08(木) 21:33:32.180575デフォルトの名無しさん
2012/11/08(木) 21:54:53.69異なる数型の演算ではpromotion(日本語だと昇格だっけか?)というものが行われる。
d1 = 5 / 2;では5/2をintで行った結果の2がdoubleにpromoteされて代入される。
d3 = 5.0 / 2;は 2がdoubleにpromoteされて5.0 / 2.0が計算される
整数の演算にもpromoteはあるから規格書を読んで理解しておくといい。
0576デフォルトの名無しさん
2012/11/08(木) 22:08:05.06ありがとうございます。
d1はdoubleという変数の箱に入る前に整数で計算しているから
そうなるんですね。
本には格上げと書いてありましたが、
どのタイミングで処理されるかわからず混乱してました。
0577デフォルトの名無しさん
2012/11/08(木) 23:53:42.68表示させた5つ数字の平均値をもとめるプログラムなのですが
for分の中にscanfを突っ込むのは合理的ですか?
5回繰り返せばいいという安直な考えなのですが
その5回分足す作業をどこに書けばいいのかよくわかりません。
さしつかえなければ、参考までに書いていただけないでしょうか?
ちなみに数学的教養がほとんどないです。
特に一番自分がやばいなと思うのが一体変数が
いくつ必要なのか自分でなかなか考えれないということです。
これはどう解決すべきですか?
0578デフォルトの名無しさん
2012/11/09(金) 00:04:33.420にしておいた変数に1回足す
またそれに1回足す
またそれに1回足す
またそれに1回足す
またそれに1回足す
だ。
0579デフォルトの名無しさん
2012/11/09(金) 00:10:53.65合理的です。
scanfを5つ書くのはマヌケです。
0580デフォルトの名無しさん
2012/11/09(金) 00:20:53.97予測してもあんまり意味ないよ
個数の話じゃなくて、何を変数とすべきかという意味なら、
最初はまごついて当然なんで、たくさん書いて早く慣れろとしか言えない
0581デフォルトの名無しさん
2012/11/09(金) 00:47:11.99最初の頃はやりたいことをそのまま、例えば入力→加算の処理を5回書いてみて、
「あれ?これ同じ文の繰り返しじゃん」と思ったらforにまとめてみるような流れでおk。
変数も同じ。出来上がった後に、この変数{必要 or 不要}じゃね?と思ったら追加・統合・削除していく。
慣れたら最初からそれらを考慮できるようになる、はず。
#include <stdio.h>
int main(){
int iSum = 0;
int iInput = 0;
int iLoop;
for(iLoop = 0; iLoop < 5; iLoop++){
printf("%d : input >", iLoop+1);
scanf("%d", &iInput);
iSum += iInput;
}
printf("sum = %d\n", iSum);
return 0;
}
0582デフォルトの名無しさん
2012/11/09(金) 00:54:51.60最初はそうもいかんのよ。
scanf("%d", &v1);
scanf("%d", &v2);
scanf("%d", &v3);
scanf("%d", &v4);
scanf("%d", &v5);
sum = v1+v2+v3+v4+v5;
となって、繰返しにできずに行きづまる。
0583581
2012/11/09(金) 01:05:37.47おうふwww
>>577
ごめん要件見落としてた。入力個数が決まってて平均ならこうだわ。5を定数化して、整数変数を実数変数に。合計表示はついで。
#include <stdio.h>
#define INPUTNUM 5
int main(){
double dSum = 0;
double dInput = 0;
int iLoop;
for(iLoop = 0; iLoop < INPUTNUM; iLoop++){
printf("%d : input >", iLoop+1);
scanf("%lf", &dInput);
dSum += dInput;
}
printf("sum = %f, average = %f\n", dSum, dSum / INPUTNUM);
return 0;
}
0585デフォルトの名無しさん
2012/11/09(金) 01:55:16.090586デフォルトの名無しさん
2012/11/09(金) 02:05:43.010587デフォルトの名無しさん
2012/11/09(金) 02:33:42.48#include <stdlib.h>
#include <time.h>
#define N (5963)
#define KOSUU ( 10)
int main()
{
int i, r[KOSUU];
// 乱数初期化
srand(time(NULL));
// 乱数生成
for (i = 0; i < KOSUU; i++) r[i] = rand() % (N + 1);
// 生成された乱数で行う処理(例)
for (i = 0; i < KOSUU; i++) printf("[%d] %d\n", i, r[i]);
// 付録
printf ("\nrand関数が生成する値の範囲(処理系により異なる) = 0 〜 %d\n", RAND_MAX);
return 0;
}
つhttp://www.kouno.jp/home/c_faq/c13.html#16
0589587
2012/11/09(金) 03:31:05.35なるほど。
rand();の下位ビットはあまりあてにならないのですね。
初めて知りました。
> rand() % (N + 1);
↓
> (int)((double)rand() / ((double)RAND_MAX + 1) * (N + 1));
とすれば良いですね。
0590デフォルトの名無しさん
2012/11/09(金) 04:08:55.05ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/rand.3.html
の「注意」の項によると、
精度の高い乱数が必要なアプリケーションではrand()関数は使用してはいけない。
代わりにrandom()、srandom()を使うこと。
なお、Linux C Libraryのrand()の中身はrandom()なので大丈夫。
…とのことだけど、Windowsでもrandom()は安心なのだろうか。
それともrand_s()
ttp://msdn.microsoft.com/ja-jp/library/vstudio/sxtz2fa8.aspx
を使うべきなのかな?
それこそ>>586を使うべきかな。
0591デフォルトの名無しさん
2012/11/09(金) 04:15:06.45乱数について考える
ttp://uni.2ch.net/test/read.cgi/informatics/1308204278/
疑似乱数2
ttp://toro.2ch.net/test/read.cgi/tech/1192628099/
使用した乱数生成器を問われることもあるので自前で実装するのはどう?
http://toro.2ch.net/test/read.cgi/tech/1347156509/666,689
0593デフォルトの名無しさん
2012/11/09(金) 10:30:36.32本当に乱数が欲しいなら、random()使うより/dev/randomを使うといい
0594デフォルトの名無しさん
2012/11/09(金) 10:33:15.580595デフォルトの名無しさん
2012/11/09(金) 10:47:20.05「擬似」乱数だって理解して使うなら桶
それはそうだ。
意図しているのは「どんな乱数生成器を使ったかを明示するために」既存のコードを自分で書いておく、というもの。
knuth の例の成書や奥村さんのものから引用するなりしてね。
/dev/random を使うより MT を明示するほうが説得力があると思う。
で訳しておいたけれども AVX の乱数って実際どうなんだろうね
0598デフォルトの名無しさん
2012/11/09(金) 12:42:47.550599デフォルトの名無しさん
2012/11/09(金) 12:56:27.87バカ丸出し↓
「最強のMT エイッ」
0600デフォルトの名無しさん
2012/11/09(金) 13:09:44.372要素ずつ取り出しつつランダムに時々1要素間引いてやるだけで、
当初の規則性は現れなくなる。
0601デフォルトの名無しさん
2012/11/09(金) 13:25:47.140602デフォルトの名無しさん
2012/11/09(金) 13:29:31.690603デフォルトの名無しさん
2012/11/09(金) 13:45:24.250604デフォルトの名無しさん
2012/11/09(金) 13:45:57.48http://www.isus.jp/forum/forum_inteltool/%E7%AC%AC%E4%B8%89%E4%B8%96%E4%BB%A3core%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%83%BC%E3%83%BB%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%83%BC%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6/
0605デフォルトの名無しさん
2012/11/09(金) 13:49:34.510606デフォルトの名無しさん
2012/11/09(金) 13:53:27.900607デフォルトの名無しさん
2012/11/09(金) 13:57:33.02「ランダムは個体」
が何か、みんな合意できてるのか?
0608デフォルトの名無しさん
2012/11/09(金) 14:04:52.92C FAQは20年以上前の情報だから。
いまどき下位ビットだから極端に周期が短い処理系とかない。
逆に、変に工夫してバグってる例を見かけるから素直に rand() % N でいいよ。
0609デフォルトの名無しさん
2012/11/09(金) 14:15:57.080610デフォルトの名無しさん
2012/11/09(金) 14:22:01.940611デフォルトの名無しさん
2012/11/09(金) 14:26:37.04なんでrand()の下位ビット使うなだけ生き残ってるんだろうな。
0612デフォルトの名無しさん
2012/11/09(金) 14:28:50.47http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa379942%28v=vs.85%29.aspx
0613デフォルトの名無しさん
2012/11/09(金) 14:45:27.23新たに書くコードならrand()の代わりにrandom()を使えという事になってると思う。
0614デフォルトの名無しさん
2012/11/09(金) 14:49:19.20floatは遅いからdouble使えみたいな
GPGPU使うとグラボによってはfloatだけ圧倒的に速かったり
0615デフォルトの名無しさん
2012/11/09(金) 14:51:54.430616デフォルトの名無しさん
2012/11/09(金) 14:56:18.67やっぱdouble精度が欲しくなる
0617デフォルトの名無しさん
2012/11/09(金) 14:59:44.77これ使えばいいじゃん
0618デフォルトの名無しさん
2012/11/09(金) 15:09:30.510619デフォルトの名無しさん
2012/11/09(金) 15:53:43.15どんな実装なのか調べるより下位ビット使わないように書く方が楽。
0620デフォルトの名無しさん
2012/11/09(金) 15:56:39.970621デフォルトの名無しさん
2012/11/09(金) 16:02:36.32他のライブラリだってそれなりの品質だって信用して、いちいちソース見ないでしょ。
0622デフォルトの名無しさん
2012/11/09(金) 16:20:25.26> 他のライブラリだってそれなりの品質だって信用して、いちいちソース見ないでしょ。
はあ? お前バカだろ。バグと実装上の問題を混同するな。
0623デフォルトの名無しさん
2012/11/09(金) 16:30:22.08要はプロセッサが何に対応しているか
一時期はdoubleしか対応してなかった
0624デフォルトの名無しさん
2012/11/09(金) 16:49:59.52なんで混同してることになるんだろ。
いまどき下位ビットだから極端に周期が短い実装とかないでしょって話。
0625デフォルトの名無しさん
2012/11/09(金) 17:16:59.96rand()はobsoleteだから代わりにrandom()使ってちょうだいよ、
とマニュアルに書いてある事が多い。
0626デフォルトの名無しさん
2012/11/09(金) 17:26:17.82そういう環境もあるだろうけどrand()は標準関数で、そのrandom()だと環境依存になるからね。
rand()を使うならって前提の話ね。
0627デフォルトの名無しさん
2012/11/09(金) 17:38:41.300628デフォルトの名無しさん
2012/11/09(金) 17:49:02.170629デフォルトの名無しさん
2012/11/09(金) 17:57:45.100630デフォルトの名無しさん
2012/11/09(金) 18:05:42.64試してみた
http://codepad.org/Ybp472vR
VC++ 2005 の rand() なら遜色なかった
0631デフォルトの名無しさん
2012/11/09(金) 18:08:06.50ネットだと乱数の下位ビットを取ってるからだって話が氾濫したけど、たぶん、実際は
乱数ルーチンを自作して自爆だろうね。
xboxの開発環境はMSのコンパイラみたいだし単純に、rand() % Nだったらそんなことにななって
なかったはず。
MTを使った一様分布の確率変数を使用しましたが、なにか?
無論、正解はhttp://toro.2ch.net/test/read.cgi/tech/1347156509/753,685 であることは認めるし認めているが、それはそうとこの方式を「完全なる一様分布関数」と呼ぶのには抵抗があるねえ。
一様分布って確率の世界の言葉でしょう?
あとhttp://toro.2ch.net/test/read.cgi/tech/1347156509/685のような出し惜しみも気色悪いし
ところがどっこい、線形合同法は今でも現役なのです。
http://en.wikipedia.org/wiki/Linear_congruential_generator
knuth の例の聖書にはいっぱい書いてありますよ
0636デフォルトの名無しさん
2012/11/09(金) 18:27:25.02線形合同法だけど、単純に前回の値に掛けたり足したりしてそのまま返すって
処理じゃないから大丈夫。
VCの場合だと下位ビットでも周期は6万以上。
0637デフォルトの名無しさん
2012/11/09(金) 18:35:00.10その表だとVB6は最下位ビットは0と1が交互にくるような実装になってるのかな。
.NETじゃないVB使ってゲームとか作ってる人は要注意だな。
0638デフォルトの名無しさん
2012/11/09(金) 18:55:34.16>>632のときもバカ相手にさらにずれた論理で話があさっての方向にずれてたし
0639デフォルトの名無しさん
2012/11/09(金) 19:25:44.46乱数はこうやってつくってるんだよ
http://www.nicovideo.jp/watch/sm9153259
0640デフォルトの名無しさん
2012/11/09(金) 19:28:19.58そうですね。
掛けて足した後の結果は保持しておきますが、公開するのはその途中のビット、すなわちすでに下位桁を削っていることになるわけですね。
つまり C-FAQ を汲んで変更が加えられているわけです。
線形合同も C-FAQ も今でも十分に現役であり、>>608「C FAQは20年以上前の情報だから。」は少々乱暴。
>>633 をみると下位桁を削らずに公開している例もある。
0642デフォルトの名無しさん
2012/11/09(金) 20:50:33.55シェルのオートコンプリート機能でタブキーを押すと文字補完で、文字が勝手に出力?されますよね?
標準出力で出すとあんな感じに、削除できたり、そのまま入力文字として使えたりしませんが、あれってどうやったら実現できるのでしょうか?
分かる方解答お願いします。
0643デフォルトの名無しさん
2012/11/09(金) 20:52:22.74いや、C FAQは今となっては古い情報も含まれてるよ。
rand()どうこうもそのひとつ。
>>633 の表のまずい奴は古い環境で最近のメジャーな奴なら大丈夫。
0644デフォルトの名無しさん
2012/11/09(金) 20:59:57.63readlineでも使えばいんじゃね
>最近のメジャーな奴
具体的に
0646デフォルトの名無しさん
2012/11/09(金) 21:20:13.59readlineですか
ありがとうございます。調べてみます
0647デフォルトの名無しさん
2012/11/09(金) 21:20:22.51もうこの話やめときます。
メジャーの基準とか揚げ足取りの話になるとつまらんから。
具体的な話ができない、いやそもそもない、ということですね、よくわかります
0649デフォルトの名無しさん
2012/11/09(金) 21:47:20.95演算結果を含めて素性の良い乱数か悪い乱数か一度は調べておきましょうね
0650デフォルトの名無しさん
2012/11/09(金) 21:55:03.88質の低いものだって思ってたような人と話をしても、こっちは一方的に教えてあげるだけで
得るものもないしね。
「教えてください」みたいな態度ならまだしも、わかってるよな口ぶりで挑発して、相手から
発言を引き出して、その場その場でググって自分の浅はかさがばれてないって思ってる
ような人がよくいるけど、もうそういうのもうんざりだし。
0651デフォルトの名無しさん
2012/11/09(金) 22:00:06.61____
/⌒ ⌒\ ホジホジ
/( ●) (●)\
/::::::⌒(__人__)⌒::::: \ はいはい
| mj |ー'´ |
\ 〈__ノ /
ノ ノ
この話題、part79 ですでに既出。
http://hibari.2ch.net/test/read.cgi/tech/1297728426/383
|rand()の下位ビットは乱数性が悪いのでRAND_MAX / 2との
|大小で偶奇を決めるのが普通。
http://hibari.2ch.net/test/read.cgi/tech/1297728426/384
|そんな実装依存の使い方が「普通」であってたまるか
|高品質の乱数が欲しければ探すか作れとしか言いようがないだけだ
http://hibari.2ch.net/test/read.cgi/tech/1297728426/399
|>>383 は結局 http://www.kouno.jp/home/c_faq/c13.html#16 と同値。この話題は c-faq の昔からいわれていたこと。
http://hibari.2ch.net/test/read.cgi/tech/1297728426/408
|問題のある乱数でも速くて大量に乱数を生成できるという特性があるなら、それを買って使う場面もあるでしょうね。
|そういうときに、(int)((double)rand() / ((double)RAND_MAX + 1) * N) とするのは普通のやりかた。
|処理系によってはrand() が線形合同である可能性も否定できない。
|>そんな実装依存の使い方が「普通」であってたまるか
|実装依存でもないし、普通なんです、昔から。
http://hibari.2ch.net/test/read.cgi/tech/1297728426/411
|> 速くて
|具体的に何 bps を保証するんですか
|> 大量に
|循環周期と確率分布の保証は?
|わけわかんねえ「なら」につきあってられるか ぼけ
|そう言ったのが >>384 だよ
http://hibari.2ch.net/test/read.cgi/tech/1297728426/412
|しかし、http://en.wikipedia.org/wiki/Linear_congruential_generator をみると、結構な数の処理系で rand() の実装が線形合同だったりするわけで
0653デフォルトの名無しさん
2012/11/09(金) 22:29:14.20#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int count[26];/*これがグローバル変数でなけれなならない理由が分かりません*/
int main(int argc,char *argv[])
{
FILE *fp;
int i;
char ch;
if(argc!=2){
printf("ファイル名の指定がありません\n");
exit(1);
}
if((fp=fopen(argv[1],"r"))==NULL){
printf("ファイルを開くことができません\n\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF){
ch=toupper(ch);
if(ch>='A' && ch<='Z')
count[ch-'A']++;
}
fclose(fp);
for(i=0; i<26; ++i)
printf("%c は %d 回\n",'A'+i,count[i]);
return 0;
}
0654デフォルトの名無しさん
2012/11/09(金) 22:35:42.740655デフォルトの名無しさん
2012/11/09(金) 22:43:44.84ローカルにしますと、結果が変わってしまいました
例
グローバルの時
A は 7 回
B は 4 回
C は 2 回
D は 5 回
E は 3 回
F は 10 回
G は 4 回
H は 6 回
I は 3 回
J は 3 回
K は 7 回
以下略
ローカルの時
A は 4201583 回
B は 516 回
C は 1638146 回
D は 4199438 回
E は 515 回
F は 1638178 回
G は 4208752 回
H は 518 回
I は 4239363 回
J は 8 回
K は 4241083 回
以下略
0656デフォルトの名無しさん
2012/11/09(金) 22:44:57.62そこにかくと、0に初期化されるね
0657デフォルトの名無しさん
2012/11/09(金) 22:45:32.53ローカルの時は自分でゼロに初期化しないとダメだべ。
int count[26] = {0};
とかしとけばいいんじゃないの?
0658デフォルトの名無しさん
2012/11/09(金) 22:46:36.77ああそうなの。
線形合同法のrand()だとC FAQに書いてるように下位ビットは周期が極端に短くなるって
つい>>633まで思ってたのに、ログを読んでそうでないって学べてよかったね。
0659デフォルトの名無しさん
2012/11/09(金) 22:46:39.620660デフォルトの名無しさん
2012/11/09(金) 22:52:13.22>>657
>>659
>>654
お答え頂きありがとうございます
解決いたしました
グローバル変数では、0に初期化されますが
ローカル変数の時は、自分で0に初期化しなければならないのですね
配列の初期化という事が、頭から完全に抜けていました
大変ありがとうございます
C言語なら俺に聞け(入門編)Part 79
http://hibari.2ch.net/test/read.cgi/tech/1297728426/412
412 名前: ◆QZaw55cn4c [sage] 投稿日:2011/02/22(火) 20:06:57.69
>>411
しかし、http://en.wikipedia.org/wiki/Linear_congruential_generator をみると、結構な数の処理系で rand() の実装が線形合同だったりするわけで。
0662デフォルトの名無しさん
2012/11/09(金) 23:16:09.54> char ch;
…
> while((ch=fgetc(fp))!=EOF){
これって、正しくEOF判定される保証ありましたっけ?
int ch;
なら分かるけど。
EOFが入力されたら問題なく終了されると思う
でも 0xFF が入力されても終了されてしまうと思う
0664デフォルトの名無しさん
2012/11/09(金) 23:21:56.91もう少し頑張れ
0665デフォルトの名無しさん
2012/11/09(金) 23:24:49.920666デフォルトの名無しさん
2012/11/09(金) 23:25:31.21線形合同法が使われてるというのを知ってるってのはそれでわかるけど、それは反論になってないのでは。
線形合同法の乱数では周期が短いと>>633まで思ってて、必ずしもそうでないと知ったのは>>641だというのは
確認できますね。
あと、たとえば、こちらは「線形合同を使ってない」とか言ってないのに「線形合同がつかわれてますねー」とか
変な反論してきたりとか、そういう微妙にずらしてるのはわざとですかね。
あんまりこのスレ見てないけど、あなたいつもそういう論法でやってるの?
0667デフォルトの名無しさん
2012/11/09(金) 23:47:02.80ありがとうございます。
while((ch=fgetc(fp))!=EOF){
は、書き換えると
while((ch=(char)fgetc(fp)) != (char)EOF){
ですね。
つまり、EOFは
#define EOF (-1)
なので、
int fgetc(); の戻り値がEOFだったら判定は
(char)EOF != (char)EOF!
といった具合に「真」になるので大丈夫…と。
0668デフォルトの名無しさん
2012/11/09(金) 23:49:29.81全然大丈夫じゃない。
ファイルの途中に0xFFがあったらそこでwhileループ抜けて、
それ以降の文字を読まない。
0670デフォルトの名無しさん
2012/11/10(土) 00:21:22.64int x;
scanf("%d", &x):
if( x % 5 );
puts("5で割りきれない数字");
のようにifの条件式の中で
x % 5 > 0;
と書かなくても成り立つのはなぜでしょうか?
0671デフォルトの名無しさん
2012/11/10(土) 00:32:56.240672デフォルトの名無しさん
2012/11/10(土) 00:38:31.31x = 15;a = (x % 5 > 0);printf("(%d %% 5 > 0) = %d\n", x, a);
x = 11;a = (x % 5 > 0);printf("(%d %% 5 > 0) = %d\n", x, a);
の実行結果も見てみたら、理解が深まるかな。
ちなみに、
> if( x % 5 ); // ←「;」はいらない
> puts("5で割りきれない数字");
0673デフォルトの名無しさん
2012/11/10(土) 00:40:28.630674デフォルトの名無しさん
2012/11/10(土) 00:42:22.270かそれ以外で判別してることを初めて知りました。
投稿後にセミコロン気づきました。申し訳ございません。
0675デフォルトの名無しさん
2012/11/10(土) 00:44:35.38if( ■ )
while( ■ )
for( … ; ■ ; … )
の ■ の部分はどれも真偽値だね
過去ログを参照していただければお分かりになると思いますが、
http://hibari.2ch.net/test/read.cgi/tech/1297728426/412 の時点で、http://en.wikipedia.org/wiki/Linear_congruential_generator の内容は確認しており、
また http://toro.2ch.net/test/read.cgi/tech/1192628099/421(これは過去ログになっていないよね)の時点でも線形合同法の亜流を認識しています。
したがって >>633 よりもはるかに前に >>641 の事実は認識しているのですけれどもね。
>>608「いまどき下位ビットだから極端に周期が短い処理系とかない。」→「線形合同は今でも現役、実装によっては下位ビットに問題あり」
>>636「単純に前回の値に掛けたり足したりしてそのまま返すって処理じゃないから」→「ライブラリ関数側で勝手に下位ビットを切っているだけ、C-FAQに根本的な誤りはない。」
>>608「C FAQは20年以上前の情報だから」→「今でも十分に有用で、古い情報はほとんどない、というかお前は100回嫁」
0677デフォルトの名無しさん
2012/11/10(土) 00:52:48.18>の ■ の部分はどれも真偽値だね
じゃなくて式。評価結果の真偽値によって動作が変わる。
forの第2式は省略可能なので、if, whileとはちょっと違うかな。
>こちらは「線形合同を使ってない」とか言ってないのに「線形合同がつかわれてますねー」とか変な反論してきたりとか、
下位ビットに問題のない線形合同法の実装は存在しないからね。
「今の処理系では下位ビットの周期が短くない」と主張すれば、それは、「今の処理系は線形合同ではない」といっているのとほとんど同じなのでは?
ライブラリ側で下位ビットを切って返す実装(javaとかはそうですね)でない実装も多々ありますから
>>608 「素直に rand() % N でいいよ。」とは口がさけてもいえない。
私は以前はM系列法を愛用していましたね。
ひとつ発展形をおしらせしておきましょうか。
char 型で書いていてもコンパイル後のコードは char 型で比較するコードになっていなくて、int 型に格上げされて比較に供するコードになります。
これを integral promotion / integer pormotion といいます。
今回の事例では直接には関係ありませんが、しかし >>667 は厳密には正しくない。
余力と暇ができたら考えてみてください
0680デフォルトの名無しさん
2012/11/10(土) 02:02:20.73charが符号無しだと255になってEOFとは等しくならない。
0681669
2012/11/10(土) 03:53:59.08なるほど。
>>667の
char ch;
while((ch=fgetc(fp)) != EOF){
は、
while((ch=(char)fgetc(fp)) != (char)EOF){
ではなく、
while((int)(ch=(char)fgetc(fp)) != (int)EOF){
ということですね。
また、
int ch;
であれば、
while((int)(ch=fgetc(fp)) != (int)EOF){
となり、特に問題ない。
そして、
unsigned char ch;
としてしまうと、
while((int)(ch=(unsigned char)fgetc(fp)) != (int)EOF){
となり、ファイル終端でfgetc()からEOFが返ってきたとしても、
比較は「0x000000FF != 0xFFFFFFFF」(intが32bitとして)
となり、whileはいつまで経っても抜けられない(無限ループ)。
ありがとうございます。
0682デフォルトの名無しさん
2012/11/10(土) 03:57:33.620683デフォルトの名無しさん
2012/11/10(土) 04:04:45.740684デフォルトの名無しさん
2012/11/10(土) 04:07:32.72テキストファイルを想定しているんだろうから、
ファイル中に0xffがあることを考慮していないだけ
なんじゃないかな。
0685デフォルトの名無しさん
2012/11/10(土) 08:05:21.43理解が深まるものじゃね?
0686デフォルトの名無しさん
2012/11/10(土) 08:38:32.480687デフォルトの名無しさん
2012/11/10(土) 09:59:16.25宿題なら宿題スレへ。
入門用ならなおさら
int fgetc(FILE *)
の返り値を char で受けるのがそもそもおかしいのでは?
0689デフォルトの名無しさん
2012/11/10(土) 10:17:48.520691デフォルトの名無しさん
2012/11/10(土) 10:33:42.29#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
unsigned count;
if (argc != 2) {
printf("ファイル名の指定がありません\n");
exit(1);
}
if ((fp = fopen(argv[1], "rb")) == NULL) {
printf("ファイルを開くことができません\n");
exit(1);
}
count = 0;
while (!feof(fp)) {
fgetc(fp);
if (ferror(fp)) {
printf("ファイルエラー\n");
exit(1);
}
count++;
}
printf("ファイルのバイト数は %u です", count - 1);
fclose(fp);
return 0;
}
のprintfのcount - 1は何を一つ引いているのかよくわかりません。
\0とかでしょうか
0692デフォルトの名無しさん
2012/11/10(土) 10:42:46.890693デフォルトの名無しさん
2012/11/10(土) 10:59:24.86ループの最後はfgetc()でEOFが読めてるはずなので。
0694デフォルトの名無しさん
2012/11/10(土) 11:00:02.69countがファイルのバイト数だということは理解してるよね?
EOFを読み取るまでfgetcで1バイトずつ読み込んでcountを++している。
ということは while(!feof(fp)){ } のループを抜けた時点では、countの値は
ファイルサイズ +1 になっているということ。
つまり余計な +1 を引いて正しいファイルサイズにしているだけ。
非常に悪いサンプルコードではあるが。
0695デフォルトの名無しさん
2012/11/10(土) 11:07:48.69>>694
ありがとうございます
納得いたしました
つまり、EOFを読み取る分までカウントしているので
無駄なカウントを引いているということでしたか
ありがとうございます
0696デフォルトの名無しさん
2012/11/10(土) 11:13:26.19だからいくら謝罪したところで疑われるんだよこの人
まあキャラ的には面白いんだけど
0697デフォルトの名無しさん
2012/11/10(土) 11:58:19.320698デフォルトの名無しさん
2012/11/10(土) 12:01:51.99fgetcをcharで受けてる件といい、その本はゴミ箱に直行した方がいいと思う。
ブックオフに売るのは2次被害拡大につながるので禁止。
0699デフォルトの名無しさん
2012/11/10(土) 12:22:00.620700デフォルトの名無しさん
2012/11/10(土) 13:54:33.72まったく同感。もしかしたら林 晴比古の著作なんじゃないかな。
面白いとお感じになっているのなら幸いです。別のネタスレの方もどうかお引き立てを。
>打算計算が露骨に表に出すぎ
むしろそういったものからもっとも遠い人だと自身を考えていたんですが、外からはそうみえないんですか。まことに不思議ですね。
確認ですが、 http://toro.2ch.net/test/read.cgi/tech/1192628099/421 は >>633 よりも前にポストされていたことは認めてくださりますよね。
であれば、>>666
>線形合同法の乱数では周期が短いと>>633まで思ってて、
>必ずしもそうでないと知ったのは>>641だというのは確認できますね。
は命題として偽であることは自明でしょう。
まあはるか過去に今日のこの日を仕組まれたみたいで私も嫌な感じがしますけれども。
0702デフォルトの名無しさん
2012/11/10(土) 18:23:30.16そのスレの685だけど、バカにもわかるように偏りを数字で出してやっただけで何かを出し惜しみしたつもりはないんだけど、
何をもって出し惜しみだと思ったのか知りたい
うん、着目点は正解だと思います。
その時点では理解できなかった私に知恵が足りなくて http://toro.2ch.net/test/read.cgi/tech/1347156509/753で初めて理解したわけです。
そのとき、「コードが書いてあったらよかったのに」って思っただけです。
まあ
>>632
>出し惜しみも気色悪いし
は言い過ぎですね。その程度の人間と捨ててください。
0704デフォルトの名無しさん
2012/11/10(土) 18:53:07.470705デフォルトの名無しさん
2012/11/10(土) 19:10:46.30クズ中のクズだな。お前二度と現れるな。
0706デフォルトの名無しさん
2012/11/10(土) 19:14:15.76林晴比古って悪いのか?
新訂 新 C言語入門シニア編 で勉強してるんだが
そうお考えなのならばそうなんでしょうね。
>>705
早く出していただければなあ、と思っただけですが、まあ書きようによっては下衆の勘ぐりですわな、気をつけます。
これからも出現しますので、よろしければどうかご指導ください。
0708デフォルトの名無しさん
2012/11/10(土) 20:09:12.32goto を嫌う理由でバファリンがどうのという説明を見た日から不信感もってる
コンパイラも読者も科学的なのに、非科学的なのはこいつだけだと思った
0709デフォルトの名無しさん
2012/11/10(土) 20:38:23.61ふざんけんな。
この板の会話に参加するだけの能力も技術もないんだから、テメーは一生ROMってろ。
↓確率分布を語る資格のないバカのタワゴト(理由は教えてやらん)
> それはそうとこの方式を「完全なる一様分布関数」と呼ぶのには抵抗があるねえ。
私なら「定義域に対する値域の対応の偏り具合」と完全に確率の世界から離脱した文言を使いますけれどもね。
>(理由は教えてやらん)
馬鹿を黙らせる一番の方法は論理を完全公開することですよ。
http://toro.2ch.net/test/read.cgi/tech/1347156509/753 がいい例でこの問題は一気に終息しました。
詰碁とかしたことありません?
0711デフォルトの名無しさん
2012/11/10(土) 21:02:30.45> 私なら「定義域に対する値域の対応の偏り具合」と完全に確率の世界から離脱した文言を使いますけれどもね。
http://toro.2ch.net/test/read.cgi/tech/1347156509/753はもう一人のバカを黙らせるために書いた。
お前のようなクズのためには書かない。
0712デフォルトの名無しさん
2012/11/10(土) 21:40:15.14みたいなもんだよ。
ものすごいとんちんかんな内容の本を出している。
例を挙げると「C プリプロセッサパワー」という本がそれ。
絶対にまねしちゃいけない例の集大成。
0713デフォルトの名無しさん
2012/11/10(土) 22:51:16.930714デフォルトの名無しさん
2012/11/11(日) 01:45:58.63そうか?
なら、memsetの第二引数がintなのにも違和感を覚えるクチかい?
負の数がかならずしも2の補数とはかぎらないこと+char がデフォでは signed か unsigned かが処理系依存であること
への配慮じゃないの?
0716デフォルトの名無しさん
2012/11/11(日) 02:26:27.31ポインタに関する書籍を購入して読んで理解すればいいですか。
でもそれだと時間がかかるので、C言語のもととなるアセンブラを先に学習したほうが、
ポインタを理解する最短ルートなのではと思うのです。
ポインタを完ぺきに理解するのにお勧めのサイト、本があればご教授いただきたいです。
よろしくお願いします。
0717デフォルトの名無しさん
2012/11/11(日) 02:35:17.43お前の今のレベルは?
0718デフォルトの名無しさん
2012/11/11(日) 02:50:28.81最初の難題にぶつかったのは、scanfの引数に&をつけること。
&をつける理由が、ちんぷんかんぷんでどうにもならなかった。
しかし、ポインタの概念や簡単な使い方をマスターすることで、いまではなぜscanfに&を付与するのか、
その理由を説明できる程度です。
あえて正解いわせてもらうと、scanf自体が、受け取る値が参照渡しになっているためである。
scanの中で処理し、その結果を引数に返すんだってことを理解している。
ここまであっていますか。
0719デフォルトの名無しさん
2012/11/11(日) 02:50:56.47目で見るのも大切だけど、手や口も動かそう。
具体的には、
・メモリイメージを紙に書いてみる
・理解したことを、ポインタを知っている人や知らない人に説明できるようになる
ことが、実は凄く効果的。
それと、そのうち覚える事になるかもしれないけど、
「関数ポインタ」は中身は変数のポインタの応用だけど、
表記方法がちょっと例外的なので、それはそういうもんだと思って
踏まえておくこと。
0720デフォルトの名無しさん
2012/11/11(日) 03:03:48.51ことが、実は凄く効果的。
こういうことはすごく大切なことなんだなぁと思う。
話それるが、本の内容を理解して頭の中に入れるんだがそれが必要な時に取り出せなければいけません。
そして取り出したものを行動に生かす(たとえば人に説明することが一つの例に当てはまる)ことができる。
それができてこお、読書経験は私生活・仕事に生かすことができるのです。
手っ取り早い話読んだ内容を人に説明することが一番効果的なわけだが、本の内容を頭に入れる工夫も
考えないといけないです。記憶した内容は時間の経過とともに薄れていくので、
それを防ぐ意味で物事を長期的に記憶するようなテクニックが必要です。
完全に話がそれましたけど、、。
0721デフォルトの名無しさん
2012/11/11(日) 03:09:10.39理解できなくていいから入門レベルやってからCに戻る。
なんでポインタなんてものが出来たかが少しは理解できるようになる。
0722デフォルトの名無しさん
2012/11/11(日) 03:13:04.62あってません
0723デフォルトの名無しさん
2012/11/11(日) 03:15:08.71ポインタ完全制覇でも買え
javaもc#もPHPも、現在主流の言語はどれも参照渡しで副作用あるよ
構造体やクラスを値渡しするのが珍しいほう
そして、はやく教員免許か公務員試験を受けろ。
間に合わなくなっても知らないぞ
0724デフォルトの名無しさん
2012/11/11(日) 03:16:55.65gdbつかって目ぼしいポインタの型を調べりゃ良い
0725デフォルトの名無しさん
2012/11/11(日) 03:23:59.73javaには参照渡し(call by reference)はない。あるのは「参照の値渡し。」
0726デフォルトの名無しさん
2012/11/11(日) 03:25:29.20へー。知らなかった。
参照渡しと参照の値渡しで、どんな挙動の違いあるんだっけ?
0727デフォルトの名無しさん
2012/11/11(日) 03:25:55.43ポインタのインクリメントで悩むことがあるぞ
アセンブラとCで進み方が違う
0728デフォルトの名無しさん
2012/11/11(日) 03:30:31.65問題集みたいなのもあればなお良い。
私はBASIC→Z80のアセンブラからプログラムを始めたので、
Cを覚えるに当たって特にポインタではつまづかなくて
ポインタ学習向けの具体的な書籍は知りませんが…。
あと、IDE(統合環境)もあると良いですね。
Windowsだと、無料のVC++Expressがありますね。
Cのソースコード上で、
命令を1行ずつ実行して変数の値を見たり編集したり、
(ポインタ変数の加減算で変数値の変化を確認したり)
ポインタ変数の示すアドレスの先のメモリを見たり編集したり、
そういうのが出来るの。
Linuxではどういうツールを使えば良いのか知りませんが。。
0729725
2012/11/11(日) 03:30:40.71>>725 はコピペネタらしいんだけれども、それはともかく。
java がいうところの参照は new で確保したポインタと等価。
new で確保するようなオブジェクトは、new で確保する以外に確保する手段がない。(ごめんいってることがわかりにくい)
したがって、-> 演算子はドット演算子に置き換わって、-> 演算子はなくなった。
参照の値渡しってたんにポインタを渡しているのと等しく考えていいみたい。
0730デフォルトの名無しさん
2012/11/11(日) 04:31:42.041.*がついたりつかなかったり、よくわからん。
2.ポインタはアドレス
int a = 5; int *p;
でアドレス演算子(&)
p = &a;
で紐付け、間接演算子(*)でアドレスが指し示す内容を操作できる。
*p = 10;
printfでaを表示しても、aも10。ふむふむ。
3.ポインタと配列
int a[10]; int *pa;
pa = a;
あれ、アドレス演算子はつかないの? 配列名はアドレス? []は?
そのうち文字列をコピーする関数を習作でやってみましょうとかで
char *StrCpy ( char *dst, char *src );
なんか*ばっかりなんですけどでさっぱりに。
0731デフォルトの名無しさん
2012/11/11(日) 05:04:28.51それとポインタにも型があるってことを意識したら多次元配列名のポインタ演算の意味が分かった
0732デフォルトの名無しさん
2012/11/11(日) 05:04:44.37viで同じことが出来る。
しかも高速に。
0733デフォルトの名無しさん
2012/11/11(日) 05:15:59.12典型的な初心者の躓きですね。
ポインタ変数宣言時の*と、参照時の*は全く関係がない。
宣言は、それがポインタ変数であるとわかればよいのだから
本当は*でない別の記号、またはpointerなどのキーワードで
よかったのであるが、言語設計者が手抜きしたのである。
このたった一文字の手抜きがもたらした弊害は非常に大きく、
設計者は批判されてしかるべきであるが、既に故人である。
0734デフォルトの名無しさん
2012/11/11(日) 05:35:47.16計算機の仕組みが理解できていないとポインタはわからない
BIOSってわかるか?
わからないだろ
そんなんじゃダメだ
Linuxがわかればポインタなどわからなくても問題ない
0735デフォルトの名無しさん
2012/11/11(日) 05:48:38.26Anjuta, Eclipse, KDevelop, Qt Creator, WideStudio
とかかな。
あと
NetBeansIDE
ttp://ja.netbeans.org/
(ページ内のリンクを開くと英語になったりするけど
右上のChoose page LanguageでJapaneseを選べば大丈夫)
どれも使ったことが無いのでアドバイスは出来ないけど、
IDEがあるとCの理解が早まるのは間違いないと思う。
0736デフォルトの名無しさん
2012/11/11(日) 06:16:25.32http://kohada.2ch.net/test/read.cgi/prog/1244310984/
0737デフォルトの名無しさん
2012/11/11(日) 07:50:50.46>アセンブラとCで進み方が違う
うそを言うな
0738デフォルトの名無しさん
2012/11/11(日) 09:12:13.31int* p = a;
で、p = p + 1; ってやったら、(多くの処理系で) 4 とか進むことを言ってるんだろ。
それぐらい理解してやれや。
0739デフォルトの名無しさん
2012/11/11(日) 09:12:39.61わかりにくくなる要因に「char *a」と書くから、というのがあるように思う
「char* a」と書いて「char*」と「a」を視覚的に分けてやると、視点的にも「char型のポインタ型」と
受け取ってもらいやすいんじゃないかな?
「*a」だと、その後の「実体を指す」という書き方とかぶって
しまって理解を妨げるんだと思う
まぁ、これは俺の過去の実体験だが、昔はこう書く本もあった
0740デフォルトの名無しさん
2012/11/11(日) 09:42:55.960741デフォルトの名無しさん
2012/11/11(日) 10:01:14.67PCHAR pa, pb;
とする
0742デフォルトの名無しさん
2012/11/11(日) 10:04:07.44アセンブラでもword,dword,qwordは認識してインクリメントするだろ。
0743デフォルトの名無しさん
2012/11/11(日) 10:21:50.47あーたしかに
俺も無意識に>>741みたくするから忘れてたわ
0744デフォルトの名無しさん
2012/11/11(日) 10:31:50.61それはアセンブラをやったゆえの弊害ではなく
C言語自体の問題では?
0745デフォルトの名無しさん
2012/11/11(日) 10:56:35.70これからはLinuxの時代
0746デフォルトの名無しさん
2012/11/11(日) 10:59:10.020747デフォルトの名無しさん
2012/11/11(日) 11:20:49.86fgets なら != NULL
で while の終了判定しているプログラムを多くみます
素人が見ると feof だけで良いような気がするのですが
使い分けてる理由はなんでしょう?
0748デフォルトの名無しさん
2012/11/11(日) 11:26:15.73書式がわかりづらいのはK&Rの最初の設計がまずい。
だからtypedefなんてものが必要になった。
0749デフォルトの名無しさん
2012/11/11(日) 11:26:26.16Cの問題でもアセンブラの問題でもなく、単にそれぞれの仕様というだけじゃないかな。
Cはどこの処理系でも同じく
char*pa;pa++;は1bytes分のアドレス増加、
long*pb;pb++;は4bytes分のアドレス増加
と統一。
アセンブラは良く分からないけど、CPUによって違うのかな。
0750デフォルトの名無しさん
2012/11/11(日) 11:27:05.120751デフォルトの名無しさん
2012/11/11(日) 11:50:41.22void Load(LPSTR FileName)
{
//ここでFileNameの文字数が知りたい
}
void Init()
{
Load("a.bmp");
}
0752デフォルトの名無しさん
2012/11/11(日) 11:52:34.13取得したいなら数えるしかない。
0753デフォルトの名無しさん
2012/11/11(日) 11:54:01.41使い分けているというか、fgets();は文字列に特化している便利関数。
内部的にfread();やfeof();の処理が含まれているような。
fgets();は例えるならprintf();みたいに、中ではintやdoubleを文字列に変換して
putc();したりする便利関数のようなもの。
0754デフォルトの名無しさん
2012/11/11(日) 12:06:45.62その例だとFileNameは文字列なので、Load();の中で
strlen(FileName);
とすれば要素数(文字数)が求められる。
FileNameのために確保されているバッファのサイズ=配列の個数(配列のサイズ)
をLoad();の中で知るのは>>752の言う通り、C言語では、出来ない。
知りたければ、
void Load(LPSTR FileName, DWORD n);
などとして、バッファのサイズを引数などで与える。
0756デフォルトの名無しさん
2012/11/11(日) 12:22:49.77strlenで出来ました。ありがとうございます
0757デフォルトの名無しさん
2012/11/11(日) 13:00:51.91確保してるメモリのサイズはシステム内部で管理されてるはず
本当はポインタを介してどうにかしてサイズを知ることができるのではないのか
0758デフォルトの名無しさん
2012/11/11(日) 13:10:16.73ただやり方が処理系によって異なると言うだけのこと。
0759デフォルトの名無しさん
2012/11/11(日) 13:10:59.75malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報の痕跡も
残っているかも知れないね。mallocの実装に依存するけど。
グローバル変数ならsizeof()で分かるけど、ローカル変数の場合は不可能に近いんじゃないかな。
スタックに確保されているとして、スタックのどこがバッファのために確保されたところなのか。
0760759
2012/11/11(日) 13:13:43.59誤
> malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報の痕跡も
> 残っているかも知れないね。mallocの実装に依存するけど。
正
> malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報も
> あるかも知れないね。mallocの実装に依存するけど。
0761デフォルトの名無しさん
2012/11/11(日) 13:23:44.790762デフォルトの名無しさん
2012/11/11(日) 13:31:32.00知りたいのは、「確保してるメモリのサイズ」だよ。
0763デフォルトの名無しさん
2012/11/11(日) 13:50:35.690764デフォルトの名無しさん
2012/11/11(日) 14:02:23.59fgets と feof を混ぜて使うとバグるよ
0765デフォルトの名無しさん
2012/11/11(日) 14:05:34.74Load(hoge);
この場合は処理系によってはLoad側でhogeの確保されたサイズが判ることがあるが
char hoge[] = "a.bmp";
Load(hoge);
とかだったら判らないでしょ
0766デフォルトの名無しさん
2012/11/11(日) 14:10:59.30確保するのはライブラリで、ユーザープログラムが指定してた通りに確保するかどうかは、
実装とその時の状況に依存する。
0767デフォルトの名無しさん
2012/11/11(日) 14:12:43.77判るかどうかは、処理系による。
0768デフォルトの名無しさん
2012/11/11(日) 14:30:19.53しねーよ。知ったかぶるのは止めとけ。
0769デフォルトの名無しさん
2012/11/11(日) 14:30:33.65領域が確定している変数だけ。
0770デフォルトの名無しさん
2012/11/11(日) 14:44:07.44教えてもらうIFにしなさい
0771デフォルトの名無しさん
2012/11/11(日) 14:45:45.12聞きたいのはfread, fgetsの違いじゃなくてfgetc, fgetsの違いじゃないのか?
> fread なら !feof
で判定しているプログラムがそんなに多いとは思えない。
0772デフォルトの名無しさん
2012/11/11(日) 15:04:11.10参照先を抜き出すときは byte ptr や word ptr 等の修飾子で大きさを指定できるけど
ポインタに相当するレジスタのインクリメントは文意によらず1加算だよね?
0773デフォルトの名無しさん
2012/11/11(日) 15:08:05.38> > fread なら !feof
> で判定しているプログラムがそんなに多いとは思えない。
ランダムリードで fread() を使うときは、feof() を使わないけど、
終端までのシーケンシャルリードだと終端の判定に ferror() と feof() の
組み合わせを普通に使うんじゃないか。
あらかじめサイズを取得して、読み込み量を計算して、、というのは無駄では。
0774デフォルトの名無しさん
2012/11/11(日) 15:10:08.40それは全てのCPUアーキテクチャ共通なのかどうなのか
0775デフォルトの名無しさん
2012/11/11(日) 15:15:33.34そう言われるととても自信が無いw
ポインタ特化のインクリメント命令セット(1加算 2加算 4加算 etc)を持つものがあるならゴメンだ
0776デフォルトの名無しさん
2012/11/11(日) 15:16:41.61最近はそうでもないかも。
0777デフォルトの名無しさん
2012/11/11(日) 15:20:17.68ダウト
sizeof "abcdef" とかもできる。
0778デフォルトの名無しさん
2012/11/11(日) 15:22:16.13それはめちゃめちゃ静的だろ...
0779デフォルトの名無しさん
2012/11/11(日) 15:29:01.85作れば出来るので非存在の証明は不可能。それの存在を主張するやつが実例を示せ。
x86のstring命令はそれに近いが。
0780デフォルトの名無しさん
2012/11/11(日) 15:29:37.84> 領域が確定している変数だけ。
~~~~~~~~~~~~~
0781デフォルトの名無しさん
2012/11/11(日) 15:33:03.660782デフォルトの名無しさん
2012/11/11(日) 15:34:46.050783デフォルトの名無しさん
2012/11/11(日) 15:35:43.520784デフォルトの名無しさん
2012/11/11(日) 15:43:24.93そういう奴がいるかと思って、わざと p++ じゃなくて p = p + 1 って書いている。
さすがに、レジスタが指している先の型を認識して足される数を変えるプロセッサはないだろ。
0785デフォルトの名無しさん
2012/11/11(日) 15:45:16.310786デフォルトの名無しさん
2012/11/11(日) 15:55:42.380787デフォルトの名無しさん
2012/11/11(日) 15:55:49.76重箱の隅のようだけど
初心者が見落としやすく(「知らない」ではなく「知っているつもりだったが見落とす」)、
動作への影響も大きく、デバッグでハマりやすい。
(エンディアンも知らないとハマるね)
0788デフォルトの名無しさん
2012/11/11(日) 15:57:25.500789デフォルトの名無しさん
2012/11/11(日) 16:54:27.87fgetsではeof/error判定しなくて、freadはする根拠ないよね。
両方するあるいは両方しないなら良いけど。
> あらかじめサイズを取得して、読み込み量を計算して、、というのは無駄では。
あらかじめサイズがわかっているn個以下のレコードを読むのがfreadなんだけど。
0790デフォルトの名無しさん
2012/11/11(日) 17:23:57.1110MBくらいのバイナリファイルを読んでデータ変換して別ファイルに書き出すプログラムで、
64kBまでしかmalloc()できないバッファでfread()〜データ変換〜fwrite()を
繰り替えす処理を書いたときにfeof()とferror()を使ったような記憶が。。
0791デフォルトの名無しさん
2012/11/11(日) 17:37:27.92LSI-C86試食版だった。
そして、64kB制限はコードとデータの合計だったかな。
確かにmalloc()は32kBくらいまでしか指定しなかった記憶が。。
チラ裏ごめん
0792デフォルトの名無しさん
2012/11/11(日) 17:45:44.24vla のサイズは静的に確定しないぞ
0793デフォルトの名無しさん
2012/11/11(日) 18:35:13.16整数A、整数Bの全ての和を出す際にその範囲の整数全てを表示させたいのですがどうすればいいのでしょうか?
例えば整数A:25、整数B:18なら18,19,20,21,22,23,24,25の全てを足した和は%dである。
と言った感じです。
整数A、Bの和を出す事は出来たのですが、足す整数を表示する方法がわからなくて・・・よろしくお願いします。
0794デフォルトの名無しさん
2012/11/11(日) 18:46:30.52そういうときは低水準 read() を使ったほうがいい。feof() とか ferror() とか正直いらない
0796デフォルトの名無しさん
2012/11/11(日) 19:07:06.79ありがとうございます。
出来れば整数A,Bも実行画面に表示したいのですが、その場合はどのようにすれば宜しいのでしょうか?
質問ばかりですみません
0797デフォルトの名無しさん
2012/11/11(日) 19:11:56.240798デフォルトの名無しさん
2012/11/11(日) 19:14:09.40だっせー
0799デフォルトの名無しさん
2012/11/11(日) 19:15:26.170800デフォルトの名無しさん
2012/11/11(日) 19:16:40.180801デフォルトの名無しさん
2012/11/11(日) 19:19:42.830802デフォルトの名無しさん
2012/11/11(日) 19:32:32.10何度もありがとうございます。
もう一度質問させて頂きたいのですがA:25,B:18で実行する場合にはどのようにすれば宜しいのでしょうか?
if、whileを使うのだろうと言うのはわかるのですがどのように挿し込めばいいのかわからなくて・・・
#include <stdio.h>
int main()
{
int a,b;
int n,t=0;
puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d",&a);
printf("整数2:"); scanf("%d",&b);
//scanf("%d%d", &a, &b);
for (n = a; n <= b; n++) {
printf("%d,", n);
t += n;
}
printf("の全てを足した和は%dである。\n", t);
return 0;
}
0803デフォルトの名無しさん
2012/11/11(日) 19:40:34.630804デフォルトの名無しさん
2012/11/11(日) 19:41:14.55ttp://codepad.org/0FrBsBZF
0805デフォルトの名無しさん
2012/11/11(日) 21:10:52.62while ( 条件 )
NULL;
0806デフォルトの名無しさん
2012/11/11(日) 22:09:00.700807デフォルトの名無しさん
2012/11/12(月) 01:05:30.87遅くなりましたが無事出来ました!
本当にありがとうございました
0808デフォルトの名無しさん
2012/11/12(月) 01:22:00.15「文字列をインプレイスで反転させる」を作ってみたのですが、
この著者?の方が求めるコードってこんな感じなのでしょうか。
ポインタ演算使うの?って思って。
1 #include <stdio.h>
2 #include <string.h>
3
4 void reverse(const char* c)
5 {
6 int len;
7 len = strlen(c);
8
9 while(len != -1){
10 printf("%c",*(c+len));
11 len--;
12 }
13 }
14
15 int main()
16 {
17 char *str = "This is a pen.";
18 puts(str);
19
20 reverse(str);
21 printf("\n");
22
23 return 0;
24 }
0810デフォルトの名無しさん
2012/11/12(月) 01:53:42.04char *p = c;
while(*p!='\0')p++;
while(p>c)putchar(*--p);
}
0811デフォルトの名無しさん
2012/11/12(月) 02:20:41.60>かつて私はO(n)であるべきstrrevのアルゴリズムがO(n^2)になってしまっているアルゴリズムを目にした事がある。
>彼らは繰り返しの strlen をループの中で呼んでしまっていたのだ。
どっかのバカもこうういクソコード書いてたな
まあまあ、勘弁してやってくだしゃあ。
時々油断してしまうんです。今はしないように気をつけています。
0813デフォルトの名無しさん
2012/11/12(月) 03:45:50.450814デフォルトの名無しさん
2012/11/12(月) 08:07:14.87char str[] = "This is a pen."; って何が違うん?
そなんですか?ああ、再帰的記述を優先したときの話ね、あそこまで再帰厨だともう再起不能レベルか?
でも、それもあとで書き直したんですけれどもね。
http://toro.2ch.net/test/read.cgi/tech/1335517816/726,753,797
おおざっぱにいって、
"This is a pen."
が格納される領域が異なります。
またこの格納領域の属性も異なる場合があります。
0817デフォルトの名無しさん
2012/11/12(月) 08:21:55.34このスレで質問するときは「Qzは回答禁止」と書いておくこと、回答する能力がないのに
見当はずれのレスつけてひっかきまわすだけだから。
こっちばOK
char *str = "This is a pen.";
...
str = "You is a big fool man.";
こっちばだめ
char str[] = "This is a pen.";
...
str = "You is a big fool man.";
0819デフォルトの名無しさん
2012/11/12(月) 08:41:04.03char str[] = "This is a pen.";
...
strcpy(str, "You is a big fool man.");
0820デフォルトの名無しさん
2012/11/12(月) 08:41:23.54http://pc12.2ch.net/test/read.cgi/tech/1274827528/273
0821デフォルトの名無しさん
2012/11/12(月) 08:42:44.02やめろw
0822デフォルトの名無しさん
2012/11/12(月) 08:45:32.740823デフォルトの名無しさん
2012/11/12(月) 08:51:36.93strncpy 〜 n文字指定のstrcpy
みたいなもんじゃないかな。
0824デフォルトの名無しさん
2012/11/12(月) 08:54:38.32strncmpi 〜 n文字指定かつignore(大小文字区別無し)のstrcmp
0825デフォルトの名無しさん
2012/11/12(月) 08:55:27.420826デフォルトの名無しさん
2012/11/12(月) 08:56:10.390827デフォルトの名無しさん
2012/11/12(月) 09:08:38.740828デフォルトの名無しさん
2012/11/12(月) 09:22:03.35どう使い分けるのが正しい?
0829デフォルトの名無しさん
2012/11/12(月) 11:01:49.80大抵stricmpかstrcasecmpだ
0830デフォルトの名無しさん
2012/11/12(月) 11:02:32.28環境次第。
0831デフォルトの名無しさん
2012/11/12(月) 12:27:56.920832デフォルトの名無しさん
2012/11/12(月) 13:05:24.30stricmp: ISO
0833デフォルトの名無しさん
2012/11/12(月) 18:33:10.400834デフォルトの名無しさん
2012/11/12(月) 18:40:46.360835デフォルトの名無しさん
2012/11/12(月) 18:57:10.03これでは Abc にならない
"abc"[0] = 'A';
puts("abc");
アクセス先の同一性を保証させるためには
ポインタが必要になるだろ
char *p = "abc";
p[0] = 'A';
puts(p);
そんなつまらんことせんでもほれ
static char p[] = "abc";
煮るなり焼くなり犯すなり
0836デフォルトの名無しさん
2012/11/12(月) 19:01:04.030837デフォルトの名無しさん
2012/11/12(月) 19:34:54.920838デフォルトの名無しさん
2012/11/12(月) 19:38:59.800839デフォルトの名無しさん
2012/11/12(月) 19:46:12.960840デフォルトの名無しさん
2012/11/12(月) 19:51:19.180841デフォルトの名無しさん
2012/11/12(月) 19:55:22.84これがmancoとか出力する可能性が出てくるんだぞ。
0842デフォルトの名無しさん
2012/11/12(月) 19:57:42.890843デフォルトの名無しさん
2012/11/12(月) 20:06:40.38コンパイラは同一の文字列リテラルの実体をひとつにまとめてもよい。
0844デフォルトの名無しさん
2012/11/12(月) 20:12:18.440845デフォルトの名無しさん
2012/11/12(月) 22:40:48.580846デフォルトの名無しさん
2012/11/12(月) 23:24:00.00スレ違いだったらすみません。
0847デフォルトの名無しさん
2012/11/12(月) 23:28:05.80pipeシステムコール
0848846
2012/11/12(月) 23:33:15.160849デフォルトの名無しさん
2012/11/12(月) 23:40:24.220851デフォルトの名無しさん
2012/11/13(火) 00:35:06.020852デフォルトの名無しさん
2012/11/13(火) 00:41:14.56標準ライブラリだけで出来るが、複雑な構造のデータを渡すならば
標準じゃないライブラリの検討もした方がいい。
0853デフォルトの名無しさん
2012/11/13(火) 02:27:43.70共有メモリと排他も参考にするといいよ
0854デフォルトの名無しさん
2012/11/13(火) 05:36:55.600855デフォルトの名無しさん
2012/11/13(火) 06:26:56.730856デフォルトの名無しさん
2012/11/13(火) 07:55:47.170857デフォルトの名無しさん
2012/11/13(火) 08:54:14.210858デフォルトの名無しさん
2012/11/13(火) 09:55:10.480859デフォルトの名無しさん
2012/11/13(火) 09:57:51.810860デフォルトの名無しさん
2012/11/13(火) 11:59:39.65コンパイラはどんな仕組みで実行ファイルにソースを埋め込んでいるのですか?
あれと同じようなことを自分の関数でもやってみたいです
0861デフォルトの名無しさん
2012/11/13(火) 12:11:03.670862デフォルトの名無しさん
2012/11/13(火) 13:03:26.28本当にありがとうございました
0863デフォルトの名無しさん
2012/11/13(火) 14:28:00.340864デフォルトの名無しさん
2012/11/13(火) 16:47:25.690865デフォルトの名無しさん
2012/11/13(火) 18:20:23.61C言語を用いて配列を使ってスタックの実装を行う課題が出されました。
要素はchar型です。
push,popの実装は特に問題ないのですがtopという
『スタックの先頭要素を参照する。返値の型はchar。
スタックが空の時どうするかは,データが7bitしか使わないことに着目して工夫すること。』
という関数を実装するよう指示がありました。
char型がデータを7bitしか使わないことを利用して工夫するということが
どのようなことか見当がつかないので、どなたかにご教授お願いしたいです。
0866桃白白
2012/11/13(火) 18:33:06.67桃白白の国語辞典能力をフル活用して考えた結果、7bitしか使わないというのは
7bitは少ない数値であると評価する意思があることを示すものであるわけだから、
つまり、あれだろ、そういうことなんじゃないか、余分なデータをなんかあれしとくんじゃね。
0867デフォルトの名無しさん
2012/11/13(火) 18:34:49.410868デフォルトの名無しさん
2012/11/13(火) 18:35:35.530869デフォルトの名無しさん
2012/11/13(火) 18:35:59.17http://toro.2ch.net/test/read.cgi/tech/1349527750/
0870デフォルトの名無しさん
2012/11/13(火) 18:38:11.55・スタックが空じゃない 0〜127
・スタックが空 -1
0871デフォルトの名無しさん
2012/11/13(火) 19:20:13.950872デフォルトの名無しさん
2012/11/13(火) 20:42:14.710873デフォルトの名無しさん
2012/11/13(火) 20:47:54.150874デフォルトの名無しさん
2012/11/13(火) 21:36:22.19例えば
if(x==1)printf("山");
else if(x==2)printf("谷");
って可能じゃん。
対応付けられるじゃん。
0875デフォルトの名無しさん
2012/11/13(火) 21:37:40.970877デフォルトの名無しさん
2012/11/14(水) 07:56:28.78Cで作られたスクリプト言語では
要素数上限なしのリストなどの機能が実現できているのは
どういうからくりなのでしょうか。
0878デフォルトの名無しさん
2012/11/14(水) 07:58:20.360879デフォルトの名無しさん
2012/11/14(水) 11:33:17.41まずこの認識が間違ってるよ!
0880デフォルトの名無しさん
2012/11/14(水) 11:38:14.760881デフォルトの名無しさん
2012/11/14(水) 11:43:51.46C でもリストを作れば要素数上限なしになるぞ
# 上限なしつってもメモリ空間がそもそも有限なのは置いといて
0882デフォルトの名無しさん
2012/11/14(水) 11:50:01.120883デフォルトの名無しさん
2012/11/14(水) 11:54:38.590884デフォルトの名無しさん
2012/11/14(水) 16:58:07.52動的に確保した領域をポインタ経由で配列的に使うのなら
また話は違うけど。
0885デフォルトの名無しさん
2012/11/14(水) 17:42:04.84勝手に拡大解釈するな
0886デフォルトの名無しさん
2012/11/14(水) 18:07:19.33Cの配列のインデックスは整数のみですが
Cで作られたスクリプト言語では
連想配列などの機能が実現できているのは
どういうからくりなのでしょうか。
という
0887デフォルトの名無しさん
2012/11/14(水) 18:14:23.87hashの衝突回避についても勉強汁
0888デフォルトの名無しさん
2012/11/14(水) 20:36:38.71for(1000回)
for(100回){1万回+1万回+1万回}
くらいだとやっぱり1分以上実行にかかっちゃう?
0889デフォルトの名無しさん
2012/11/14(水) 20:42:11.90処理内容によるだろJK
30億回だから並列化とかも考えると1秒〜くらいとしか言えない
0890デフォルトの名無しさん
2012/11/14(水) 21:02:40.380891デフォルトの名無しさん
2012/11/14(水) 22:22:28.940892デフォルトの名無しさん
2012/11/14(水) 23:01:06.84�@
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
cnt ++;
}
と
�A
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
i=i+1;
}
は違いますよね?
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
}
だけでは回りませんよね?
0893デフォルトの名無しさん
2012/11/14(水) 23:05:55.150894デフォルトの名無しさん
2012/11/14(水) 23:09:03.96i=i+1;を追加したらちゃんと動作したんですが、なんなんでしょうか?
0895デフォルトの名無しさん
2012/11/14(水) 23:11:43.94int i, n = 6, work;
int data[] = {10, 3, 8, 2, 6, 7};
for(i = 0; i<n; i++) {
work = data[i];
data[i] = data[n-1-i];
data[n-1-i] = work;
i=i+1;
}
for(i = 0; i < n; i++) {
printf(" %d", data[i]);
}
puts("");
return 0;
}
7.6.2.8.3.10と逆順に表示させるわけなのですが
i=i+1;をいれたらそういう風に表示されました。
0896デフォルトの名無しさん
2012/11/14(水) 23:20:08.16たまたま上手く動いてるように見えてるだけだね
紙に書き出してみればすぐわかるよ
ヒントは、半分でOK
0897デフォルトの名無しさん
2012/11/14(水) 23:31:08.56work = data[i];
data[i] = data[n-1-i];
data[n-1-i] = work;
がうまくいってないってことですよね?
ゆえにprintfで配列の順番順にただただ表示されてしまう。
10と7、3と6、8と2を交換するようにすればいいんでしょうか?
0898デフォルトの名無しさん
2012/11/14(水) 23:56:24.30いや、そこは正しいよ
交換は、インデックスの半分まで実行すれば良いと言う事に気付くかがポイント
後ろ半分を実行しちゃうと、前半で交換した内容を、元に戻してしまうのだね
つまり、forの継続条件は i<n/2 が正しいんだな
0899デフォルトの名無しさん
2012/11/15(木) 00:12:40.94前半で交換した内容を、元に戻してしまうのはどこで指示してるんですか?
0900デフォルトの名無しさん
2012/11/15(木) 00:14:24.060901デフォルトの名無しさん
2012/11/15(木) 00:24:09.99だから、書き出して見ろっての
頭で理解できなきゃ、体を動かせ
data[] = {10, 3, 8, 2, 6, 7};
i=0: 7,3,8,2,6,10
i=1: 7,6,8,2,3,10
i=2: 7,6,2,8,3,10
これでわからんか?
>>900
同じ様に、forの各回の最終結果をかいてみればすぐわかる
書くのがめんどくさければ、毎回data[]全てprintfしてみ
0902デフォルトの名無しさん
2012/11/15(木) 00:40:38.790と5、1と4、2と3をいれかわる動きだったのですか?
正直workって何の為にあるかのもわからずに考えていました。
書き出していましたが
6-1-0=No5
6-1-1=NO4
6-1-2=No5の順に並ぶものだと思っていたので
0903デフォルトの名無しさん
2012/11/15(木) 00:46:48.70あっ…っごっめーん
俺が見間違えてたわ
てへっ(赤面逃亡
0904デフォルトの名無しさん
2012/11/15(木) 00:50:33.93そうだよ
iの動きとn-1-iも書き出してみれば、もうわかるよね
>>903
ちょっ、おまっ、何言っている?
0905デフォルトの名無しさん
2012/11/15(木) 01:03:17.51例えば
○×△□という配列で
<先頭にこいよ、□
□「分かりました、○さん交代しましょう」
○「いいよ」
みたいなことですよね?
個人的にはひとつひとつの値に順番を指定するものだと思っていました。
0906デフォルトの名無しさん
2012/11/15(木) 03:14:54.630907デフォルトの名無しさん
2012/11/15(木) 07:49:36.15自分も忘れる時在るけど、i < n / 2ってしないと一周してもとの位置に戻ってるんだよ
0908デフォルトの名無しさん
2012/11/15(木) 07:56:36.16i >= n-1-i から せっかく交換したものをまた交換して元に戻しちゃってる
0909デフォルトの名無しさん
2012/11/15(木) 08:13:32.030910デフォルトの名無しさん
2012/11/15(木) 08:38:03.88for(int i = 5; i >= 0; i--)
printf("%d\r\n", data[i]):
ではいかんのか?
0911デフォルトの名無しさん
2012/11/15(木) 09:09:03.470912デフォルトの名無しさん
2012/11/15(木) 09:34:35.540913デフォルトの名無しさん
2012/11/15(木) 10:33:40.59最初に書く時はじっくり考えながら書くので間違い少ないけど、違う言語に移植する時とか、ウッカリミス多くならないか?
0914デフォルトの名無しさん
2012/11/15(木) 13:16:14.79X
>for(int i = 5; i >= 0; i--)
>printf("%d¥r¥n", data[i]):
O
>for(int i = 5; i--; )
>printf("%d¥r¥n", data[i]):
0915デフォルトの名無しさん
2012/11/15(木) 13:25:22.39>for(int i = 4; i >= 0; i--)
>printf("%d¥r¥n", data[i]):
>>914
リーダブルコード読めよ。読者に考えさせるコードは駄目なコードだ
0916デフォルトの名無しさん
2012/11/15(木) 13:30:44.14for(int i = 5; --i >= 0; )
printf("%d\r\n", data[i]):
0917デフォルトの名無しさん
2012/11/15(木) 13:31:02.910918デフォルトの名無しさん
2012/11/15(木) 13:34:41.08>915 だけ見て脊髄反射してもうた
0919デフォルトの名無しさん
2012/11/15(木) 14:46:50.41そういうときは 6-1 と書くんだ
0920デフォルトの名無しさん
2012/11/15(木) 15:08:42.240921デフォルトの名無しさん
2012/11/15(木) 15:10:06.820922デフォルトの名無しさん
2012/11/15(木) 15:49:13.53みたいなコード書くよりも
if(int i = strlen(str); --i >= 0; ) hogehoge
のが速いというのは本当ですか?
0923デフォルトの名無しさん
2012/11/15(木) 16:59:55.09strlen の実行回数が全然ちがう
0924デフォルトの名無しさん
2012/11/15(木) 17:47:15.960925デフォルトの名無しさん
2012/11/15(木) 17:58:28.07if (int i = 0; i < len; i++) hogehoge;
としとくのが妥当だろうな
0926デフォルトの名無しさん
2012/11/15(木) 18:01:06.05ウソの場合もある。
最近のコンパイラ(たとえばVC2010)はhogehogeの内容によるがstrlen呼ばずに
直接strを参照するコードを生成できる。
> if(int i = 0; i < strlen(str); i++) hogehoge
0927デフォルトの名無しさん
2012/11/15(木) 18:09:12.061回に最適化されてしまうことがあるね。gccでもそう。
あと、0以外の定数との比較より0との比較の方が速いというアーキテクチャは存在する。
変数(レジスタ)との比較より正負判定の方が速いというアーキテクチャも存在する。
x86じゃ有意な差は出ないと思うけど。
0928デフォルトの名無しさん
2012/11/15(木) 19:29:12.190929デフォルトの名無しさん
2012/11/15(木) 20:26:15.49http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1497248299
0930デフォルトの名無しさん
2012/11/15(木) 20:42:41.120931デフォルトの名無しさん
2012/11/15(木) 20:45:31.310932デフォルトの名無しさん
2012/11/15(木) 20:54:56.24http://stackoverflow.com/questions/13375021/how-to-authentication-league-of-legends-pvp-net-xmpp-help
これ
これ答えてください
my @result=$con->AuthSend(
username=>'[email protected]',
password=>'AIR_PASSWORD',
resource=>'xiff',
);
print @result;
@resultの結果が返ってきません 誰かこれ@resultの結果がokになるまでがんばってください
0933デフォルトの名無しさん
2012/11/15(木) 21:00:21.23スレタイ1000回音読してきえろ
0934デフォルトの名無しさん
2012/11/15(木) 21:00:53.08グロ注意
0935デフォルトの名無しさん
2012/11/15(木) 22:37:29.59挫折した。いくら時間があっても足りないわ。
分かりやすい本って本当に無いな。
0936デフォルトの名無しさん
2012/11/15(木) 22:43:34.74これまで学んだ言語は?
0937デフォルトの名無しさん
2012/11/15(木) 23:09:10.58これまでに学んだ言語はC言語とJavaだけ
Javaは継承とか多様性までは理解できたけど
ジェネリクスとか内部クラスとかシンクロナイズドあたりから
ほとんど意味が分からなくなって勉強が頓挫した
でCに戻ったけどスレッドを勉強して意味が分からなくなって
挫折した
0938デフォルトの名無しさん
2012/11/15(木) 23:11:31.93これじゃ辞めたほうがいいかな 単位だけ取れたらいいか
0939デフォルトの名無しさん
2012/11/15(木) 23:18:59.120940デフォルトの名無しさん
2012/11/15(木) 23:27:36.100941デフォルトの名無しさん
2012/11/15(木) 23:29:56.070942デフォルトの名無しさん
2012/11/15(木) 23:32:29.220との比較は自分自身とのAND比較に最適化されるから
普通どのアーキテクチャでも速いんじゃね
0943デフォルトの名無しさん
2012/11/15(木) 23:40:10.32比較すら必要ないでしょ。
68系みたいに、ロードするだけでフラグ立つプロセサもあるし。
0944デフォルトの名無しさん
2012/11/15(木) 23:41:41.290945デフォルトの名無しさん
2012/11/15(木) 23:53:55.67スタックのような使い方に限られてしまってそうな。
0946デフォルトの名無しさん
2012/11/15(木) 23:55:37.02わろす
0947デフォルトの名無しさん
2012/11/15(木) 23:56:21.580948デフォルトの名無しさん
2012/11/15(木) 23:57:54.04スーパースカラーでそんな1命令くらいふっとぶんじゃね?
0949デフォルトの名無しさん
2012/11/16(金) 00:42:28.71http://codepad.org/zpyvlaSF
http://codepad.org/wVl9wJF3
それぞれのアセンブリ言語出力(gas用なので向き注意)
http://codepad.org/13zUCrOV
http://codepad.org/jcfLdEd9
どちらも5.74秒
gcc 4.2 -O2, gcc 4.7 -O2
0950デフォルトの名無しさん
2012/11/16(金) 00:44:04.970951デフォルトの名無しさん
2012/11/16(金) 05:44:33.670952デフォルトの名無しさん
2012/11/16(金) 08:19:23.520953デフォルトの名無しさん
2012/11/16(金) 08:34:03.520954デフォルトの名無しさん
2012/11/16(金) 08:50:29.56http://codepad.org/cP6sT86c
とすると
http://codepad.org/vW9QkStN
になった
つまり、
movl $1, %eax
subl %ecx, %eax
subq $1, %rdx
movl %eax, %ecx
jne .L2
で、1引いた結果が0かどうかでの分岐になるけど、
時間変わらず
スーパースカラーの威力
x86なら気にすんなってこと
0955デフォルトの名無しさん
2012/11/16(金) 21:06:49.81これ、テストの過去問なんだが、↓であってる?
1: printf 6:5*a*a+2*a*b+b*b 11: if
2: scanf 7: 5×%d+2×%d+%d 12: v<-8.5 || 8.5<=v
3: %d\n 8: a*a,a*b,b*b 13: printf("エラー")
4: &a 9: %f\n 14: else
5: &b 10:&v 15: -8.5<=v && v<0.0
16: printf("-1.3×vの値") 21: i++ 26: sum+=i
17: printf("1.3×vの値") 22: printf("*") 27: i++
18: for 23: i=1 28: sum
19: i=1 24: sum=0
20: i<=10 25: sum<=10
2-a:
int n,a;
a=1;
printf("正の整数:");
scanf("%d\n",&n);
while(n>=a){
printf("%d " a);
a+=2
}
0956デフォルトの名無しさん
2012/11/16(金) 21:11:53.53にわかチャンネラーだから許してくれ
スペースを_に直してやってみた。
ズレんのも承知だが・・・
2chの先生方よろしくたのむー
1: printf_______6:5*a*a+2*a*b+b*b________11: if
2: scanf________7: 5×%d+2×%d+%d______12: v<-8.5 || 8.5<=v
3: %d\n_________8: a*a,a*b,b*b___________13: printf("エラー")
4: &a___________9: %f\n__________________14: else
5: &b___________10:&v____________________15: -8.5<=v && v<0.0
16: printf("-1.3×vの値")____21: i++___________26: sum+=i
17: printf("1.3×vの値")_____22: printf("*")___27: i++
18: for______________________23: i=1___________28: sum
19: i=1______________________24: sum=0
20: i<=10____________________25: sum<=10
0957デフォルトの名無しさん
2012/11/16(金) 22:23:14.23(3)は"%d"、あとは俺は見る時間ない。
ちなみに、&ampとか出ているけど、ギコナビなら
ttp://anago.2ch.net/test/read.cgi/software/1350168418/64-
> レスエディタのメニューから特殊文字変換の下の「Space/Tab→&nbsp;」のチェックを外してください
0958デフォルトの名無しさん
2012/11/16(金) 22:41:48.32さんきゅ、
(3)はキーボードで打つ時にエンター押すから、「\n」はいらん訳ね。
&ampとかしっかり勉強しま
0959デフォルトの名無しさん
2012/11/17(土) 00:24:23.58powを使うと実行時に局所的ではなく全体に影響を及ぼすエラーが
出るんですが.......
0960デフォルトの名無しさん
2012/11/17(土) 00:27:22.07説明が意味不明。
そもそも「全体に影響を及ぼす現象」の原因がpowだということを
何を根拠に判断したのか?
0961デフォルトの名無しさん
2012/11/17(土) 00:32:06.100962デフォルトの名無しさん
2012/11/17(土) 00:34:04.84勘違いしました。
すいません。
0963デフォルトの名無しさん
2012/11/17(土) 00:36:57.91pow(-1, 0.5);
とかやったの?
0964デフォルトの名無しさん
2012/11/17(土) 00:39:45.090965デフォルトの名無しさん
2012/11/17(土) 12:07:13.03下記のようなコードを見せられました。
#include <stdio.h>
int main ( void )
{
int i;
if ( ( i = printf ( "Hello World\n" ) ) > 0 ){
printf ( "成功:%d文字\n", i );
}
return 0;
}
実行すると、
Hello World
成功:12文字
printfが画面に文字を出力するのは戻り値というか、そういうものではないのですか?
うまく言えませんが、何か変な感じがして・・・
0966デフォルトの名無しさん
2012/11/17(土) 12:11:48.06画面に文字を表示するのはprintfの副作用。
0967デフォルトの名無しさん
2012/11/17(土) 12:24:21.48while終了後値が変わっているんですが原因は何が考えられますか?
KOUZOUTAI[10]
KOUZOUTAIは要素にint a と double bを持ちます。
初期値として全てのKOUZOUTAI[i].bを1.0にしてprintfでwhile文の前に
確かめたら1.0と表示されます。
whileの中で書く文は単にKOUZOUTAI[i].bを表示するだけの命令です。
ところがwhileを抜けた途端0.0になってしまいます。
何故でしょう?
0968デフォルトの名無しさん
2012/11/17(土) 12:29:40.99すみません、その副作用とはなんでしょうか。
0969デフォルトの名無しさん
2012/11/17(土) 12:29:56.820970デフォルトの名無しさん
2012/11/17(土) 12:32:47.50書式指定のミス
不正なポインタ操作
のいずれか
現象が再現する最小のコードを作ってうp!
ありがとうございます。例えば
KOU[0].IN[1][1]はいじられたくないんですよ。
KOU[0].IN[x][y]をwhileでx=1,y=1を避けるように
計算したら何故かKOU.IN[1][1]が書き加えられてます。
計算はKOU.HAI[X][Y]=KOU.HAI[X][Y]+1000;です。
X[TEN]={0,2,3,4,5,6,7,8,9,10,11}
Y[TEN]={0,2,3,4,5,6,7,7,8,10,11}で与えています。
でX[TEN]とY[TEN]は必ず{1,1}を排除するようにしてるのです。
つまり
KOU[0].IN[X[w]][Y[w]]=KOU[0].IN[X[w][[Y[w]]+1000
をしてもKOU[0].IN[1][1]は変わらないと思うのですが......
for(w=0; w<=9 w++)
{
printf("[%d %d]\n",X[w],Y[w]);
KOU[0].IN[X[w]][Y[w]]=KOU[0].IN[X[w][[Y[w]]+1000
}
としています。
そうすると
[0,0] [2,2] [3,3] [4,4 ]..............
と[1,1]は排除されています。
しかしKOU.HAI[1][1]は書き換わっています。
0974デフォルトの名無しさん
2012/11/17(土) 13:13:02.47配列の範囲外にアクセスしてるんじゃないの?
hoge_type IN[10][10];
の変数があるときに
IN[0][11]=hoge_value;
みたいにしてるとか
0975デフォルトの名無しさん
2012/11/17(土) 13:17:43.60>>969
0976デフォルトの名無しさん
2012/11/17(土) 13:19:27.93コードは意図したとおりではなく、書かれたとおりに動く。
>KOU[0].IN[1][1]はいじられたくないんですよ。
あなたの意図はそうかもしれないが、コードはいじるようになっているんでしょ。
とにかく再現する最小のコードを作ってアップしてみなよ。
再現するコードを作っている段階でバグに気づくなんて、よくあることだ。
0977デフォルトの名無しさん
2012/11/17(土) 13:20:30.07int x;
int foo(void)
{
x = 100;
return 200;
}
で、xの値が書き換わってしまうのはfooの副作用。
int bar(void)
{
printf("%d\n", 300);
return 400;
}
で、数字が表示されてしまうのはbarの副作用。
ありがとうございます。
エラーが出る範囲で簡略化してみようと思います。
少しお待ちください。
0979デフォルトの名無しさん
2012/11/17(土) 13:42:07.78うーん、return で返す値以外は、関数にやらせることが"副作用"なんですかね。
引数void戻り値なしなら、関数の処理は全部、"副作用"?
magi は「int の C 」らしいですよ、誰がそういってたっけ?
0981デフォルトの名無しさん
2012/11/17(土) 14:08:18.34>引数void戻り値なしなら、関数の処理は全部、"副作用"?
そのとおり
あんまり関係ないが、グローバル変数ばかりで引数戻り値voidの関数ばかりのコードを見たときは
悪い意味で衝撃を受けた
0982デフォルトの名無しさん
2012/11/17(土) 14:36:24.96*a = *a + 1;
}
を副作用って言うのは、正直微妙な気がする。
int main(void)
{
struct kou{double in[10][3];};
int i;
struct kou out[10];
i=0;
printf("%.30f\n",out[0].in[1][0]);
while(i<=1)
{
out[0].in[0][3]=out[0].in[1][3]+1;
i=i+1;
}
printf("%.30f\n",out[0].in[1][0]);
return 0;
}
これです...
1増えてしまっています。
0984デフォルトの名無しさん
2012/11/17(土) 14:56:12.91範囲外に書き込んでるからだろw
ちょwwww
自己解決しましたw
3が原因ですか...
左の10に注意してるだけで右忘れてた.....
ありがとうございます....
1日考えて分からなかったのがばかばかしく思えてきた......
0986デフォルトの名無しさん
2012/11/17(土) 15:11:03.920987デフォルトの名無しさん
2012/11/17(土) 15:13:01.49まあ一人で入れ込むバグなんてえてしてそんな程度だよね
0988デフォルトの名無しさん
2012/11/17(土) 15:13:30.930989デフォルトの名無しさん
2012/11/17(土) 17:20:14.02A,B,C.cという3本のソースファイルがあります。
この3本はそれぞれマイコンメーカから提供されるツールによって
吐き出されるヘッダファイル(DEV.h)を取り込みます。
※DEV.hは頻繁に変更される。
このDEV.hの中に以下の様な変数を初期化している箇所があり、
複数のソースファイルでインクルードすると「multiple define」のエラーがでます。
data[] = {初期値};
仕方ないのでB,C.cではDEV.hをインクルードせず、DEV.hに変更がある度に、
DEV.hから必要なdefineをコピペしています。
このコピペの操作を無くしたいのですが何か良い方法はないでしょうか?
0990デフォルトの名無しさん
2012/11/17(土) 17:25:11.50ラッパーを作って
DEV.h に依存するファイルを一つだけにしてしまう
0991デフォルトの名無しさん
2012/11/17(土) 17:45:30.180992デフォルトの名無しさん
2012/11/17(土) 17:57:36.52#ifndef DEV_H_INCLUDED
#define DEV_H_INCLUDED
#include DEV.h
#endif
0993デフォルトの名無しさん
2012/11/17(土) 18:24:50.48>>991が正解。
0994デフォルトの名無しさん
2012/11/17(土) 18:24:54.71いみねーよ
A, B, C は最終的にリンクして一つの実行ファイルにまとめるのですか?
であれば >>991 が正解、というかしかたがないので、DEV.h の該当部分をコメントアウトして、data[] = { .. } をA, B, C のなかの一箇所だけにかいておくようにするしかないですね。
0996デフォルトの名無しさん
2012/11/17(土) 18:37:01.36そんな阿呆メーカのファイルに依存するものを三箇所に分散させた馬鹿に文句を言うべき。
でないと、今後もメーカが修正したときにも修正を強いられることになりかねない。
0997デフォルトの名無しさん
2012/11/17(土) 18:39:13.340998デフォルトの名無しさん
2012/11/17(土) 18:46:30.860999デフォルトの名無しさん
2012/11/17(土) 19:01:53.08使うことを強いられているなら>>991でメーカ側を矯正すべき
1000デフォルトの名無しさん
2012/11/17(土) 19:04:27.4410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。