C言語なら俺に聞け(入門編)Part 109

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレッドです。

★前スレ
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/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2012/10/17(水) 18:13:04.11
< `∀´> ニダー
3デフォルトの名無しさん:2012/10/17(水) 20:31:39.26
/* NOTREACHED */
4デフォルトの名無しさん:2012/10/17(水) 20:38:19.12
/* FALLTHROUGH */
5デフォルトの名無しさん:2012/10/17(水) 20:59:35.78
lint厨か
6デフォルトの名無しさん:2012/10/18(木) 00:19:47.74
え?lint 使える環境まだあるの?kwsk
7デフォルトの名無しさん:2012/10/18(木) 00:23:16.69
BSD系
8デフォルトの名無しさん:2012/10/18(木) 17:48:24.07
小学校の先生とプログラマってどっちがデスクワーク多い?
9sage:2012/10/18(木) 17:53:55.34
みなさま、お知恵をお貸しください。

私は、関数電卓を作っている者です。

文字列を構文解析し、現れたワードごとに演算を行うという簡単なプログラムです。

私は、ある問題に直面しました。

sin(n*M_PI)が0にならないのです。(nは整数です)
DBL_EPSILONを使った切り捨ては試しました。

しかしながら、nが大きくなると再び誤差が表示されてしまいます。
例 sin(1000000*M_PI)=誤差

この誤差はgoogle電卓でも現れました。
驚いたことに、市販の関数鵜電卓では、いっさいこの誤差が現れません。

C言語で、市販の関数電卓のように誤差をなくすにはどうしたらよいでしょうか?

詳しい方ご教授お願いします。
10デフォルトの名無しさん:2012/10/18(木) 18:09:58.38
                |
                |
                |
                |
     /V\        ,J
    /◎;;;,;,,,,ヽ
 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
11デフォルトの名無しさん:2012/10/18(木) 18:16:38.57
nが整数かどうかを
まず判定すりゃいいじゃん
12デフォルトの名無しさん:2012/10/18(木) 18:30:11.58
SINの中にM_PIが入ってたら2M_PIでmodするようにすれば?
13デフォルトの名無しさん:2012/10/18(木) 18:50:05.67
10年ぶりにunixCの開発に関わって、修正差分見ていたら
memcpy(wk, '\0', sizeof(wk));
なんて見つけたんだけど、なぜかコアは吐かないし同じ使い方してる本番アプリが他にもある
コンパイル調べたらなんか「NULL文字ポインタ」だとかで、
実験したら最大8192バイトまでヌルの配列が取れるようでカルチャーショックを受けました

でも書くならNULLだろ、'\0'は文字だろとか思ったけれど、俺はもう古い人間だってことでしょうか?

memcpy(wk, " ", sizeof(wk)); のほうはさすがに理解してないようですが
14デフォルトの名無しさん:2012/10/18(木) 18:51:22.23
その市販関数電卓で sin(0.1)-sin(1000000*PI+0.1) を計算させてみてほしい
15デフォルトの名無しさん:2012/10/18(木) 18:52:47.93
>>13
日本語で
16 ◆QZaw55cn4c :2012/10/18(木) 19:11:12.27
>>13
>書くならNULLだろ
残念ながらこの場合は http://www.kouno.jp/home/c_faq/c5.html#13 の「ASCIIのナル文字(NUL)」だ
書くなら 0 だ

>俺はもう古い人間だってことでしょうか?
古いだけでまったくわかっていない人間だってことだ、猛省しろ
17デフォルトの名無しさん:2012/10/18(木) 19:18:10.39
え?いいの?
18sage:2012/10/18(木) 19:23:01.56
>>11さん
>>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です
19デフォルトの名無しさん:2012/10/18(木) 19:27:14.43
>>18
> 3.3727E-9です
つまり、整数*pi の時だけ特別扱いしてるってことだな
20デフォルトの名無しさん:2012/10/18(木) 19:27:56.61
>>16
memcpyの第2引数が何であるべきか調べてから書け
21sage:2012/10/18(木) 19:30:47.41
>>19さん
そのようです。
はずかしながら、私は整数の判別法が思いつきません。
キーを監視するしかないのでしょうか?
22デフォルトの名無しさん:2012/10/18(木) 19:34:32.59
>>16
>>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の場合はぬるぽと解釈されているはずだからね。
よく見ずにレスしちゃったんだね。猛省だね。
23 ◆QZaw55cn4c :2012/10/18(木) 19:36:30.92
>>20
memset() と思い込んでいた。

>>16
古いだけでまったくわかっていない人間だったのは俺だった。猛省する。
24デフォルトの名無しさん:2012/10/18(木) 19:36:40.47
トークンが実数か整数かなんて文字列的にわかりそうなもんだけど
25デフォルトの名無しさん:2012/10/18(木) 19:40:03.10
許してやるよ
26デフォルトの名無しさん:2012/10/18(木) 19:51:15.96
>>24
変数だったらどうすんの?
sin(sin(pi/2)*2*pi)だったら?
27デフォルトの名無しさん:2012/10/18(木) 19:58:13.31
>>13
まず、このコードでcoreを吐くかどうかは、OS, アーキテクチャによるが、
一般にはcoreを吐きうる不正なプログラム。

次に、'\0' は整数の 0 とまったく区別はなく、
ポインタやポインタ引数に代入されたら NULL と同じになる。
28デフォルトの名無しさん:2012/10/18(木) 20:05:17.20
>>26
字句解析した時点で定数の型は分かるじゃん。
計算して求まる値は整数同士なら結果も整数とか決めておけばいいし、
変数は値を設定する時にどの型かわかるじゃん。
29デフォルトの名無しさん:2012/10/18(木) 20:06:52.80
整数同士を足したら結果も整数、とか
30デフォルトの名無しさん:2012/10/18(木) 20:10:38.26
ごめんやっぱ嘘でw
31デフォルトの名無しさん:2012/10/18(木) 20:11:01.44
というか、指定した1文字(この場合'\0')で領域を初期化することに対して、
memsetではなくmemcpyを使用するメリットが分からない。
紛らわしいだけでしょ、絶対にレビューでつつかれるわ。
>>13の検証によると8192バイトの制限まであるらしいし。
処理速度でも違うのかね?
32デフォルトの名無しさん:2012/10/18(木) 20:12:24.42
携帯から稚拙な文で失礼しました、一般には不正な文と見て良いようで安心しました。
このサイトでは問題なく動くのだから受け入れます。ポインタに'\0'を使うのは違和感ありますが、慣れます
33デフォルトの名無しさん:2012/10/18(木) 20:15:02.49
たまたま0番地から8Kゼロなページがマップされてる環境なのでは
34デフォルトの名無しさん:2012/10/18(木) 20:20:24.55
>>32
> 慣れます
慣れずに、こんな糞コード書くな、正解はこうじゃ、って修正してやる気概が必要
35デフォルトの名無しさん:2012/10/18(木) 20:23:48.28
Oracle関係のらしく ccに-v /(忘れた)/[email protected] 付けたら落ちない、付けないとコアです
makeの詳細は理解していないのでこれ以上は解らない、参照でポインタを0から回したら8192で落ちます
36デフォルトの名無しさん:2012/10/18(木) 20:27:14.83
>>23みたいにmemsetとmemcpyをとりちがえて、たまたま動いて、そのままってケースかな
37sage:2012/10/18(木) 21:39:03.29
みなさま
様々な回答ありがとうございます。

整数の判断について調べていたところ
floor()==ceil()の条件式を使うと良いことがわかりました。

if (floor(x/PI)==ceil(x/PI)) {
return 0;
}else{
return sin(x);
}

コードはこのようになります。
これで希望の動作ができるようになりました。

調べていて、「処理理系によってはうまく働かないことがある」
という記述を見つけたので、少し不安ではありますが
これで様子をみてみます。
38デフォルトの名無しさん:2012/10/18(木) 21:40:24.11
マヌケな古いプログラムを救済するために0番地から8Kメモリが割り当てられてるだけだろ。
そんなのになれたら阿寒。
39デフォルトの名無しさん:2012/10/18(木) 21:58:31.92
>>37
> 調べていて、「処理理系によってはうまく働かないことがある」
だろうな
40デフォルトの名無しさん:2012/10/18(木) 23:11:51.53
C言語初心者にオススメの書籍を教えてください
41デフォルトの名無しさん:2012/10/18(木) 23:15:13.34
>>40
ちょっと古いけどK&R
42デフォルトの名無しさん:2012/10/19(金) 00:10:46.51
typedef int (*iarr)[]; // (1)
typedef int (*iarr10)[10]; // (2)

int a[10];

iarr aa1 = &a; // error
iarr10 aa2 = &a; // ok

うーん?
(1)の型は何処で出てくるんだ?
4340:2012/10/19(金) 07:52:13.75
>>41
ありがとうございます!買ってみます
44デフォルトの名無しさん:2012/10/19(金) 09:12:25.42
>>40
独習、初めてのとか、本すれ見たら
45デフォルトの名無しさん:2012/10/19(金) 13:01:31.02
>>43
いえいえ
46デフォルトの名無しさん:2012/10/19(金) 13:12:33.15
>>43
それは古すぎるからやめとけ
つかそもそも本を買うなんてバカな真似はやめておきなさい
図書館で読んで自分に合ってそうなものを持ち帰って読む
重要なところは自分で書き写す
図書館に無ければ注文する
プログラムの勉強は自習するだけならこれで十分
たかが文字情報に金を払う必要は無い
あらゆる情報はすべての人にとって平等で無料かつ自由に扱えるもので有るべきだ
47デフォルトの名無しさん:2012/10/19(金) 13:17:48.63
そんな労力使うくらいなら買った方が安上がりだなwww
48デフォルトの名無しさん:2012/10/19(金) 13:19:44.70
時間の価値は人によって違うからな
本を買った方がいい人と、そうでない人がいる
49デフォルトの名無しさん:2012/10/19(金) 13:29:30.81
お前らはわかってない
時間が大切だからこそ写しなんだよ
いつでもさっと検索してWebより密度の高い情報にアクセスできるという利益はなかなか代えが効くものではない
「あーあれなんだっけな調べよう…でも資料は家だ明日にまわすか」なんてことをしてるからお前らはゴミなんだ

それでもまだこの期に及んで書き写す手間が嫌だというなら機械にやらせれば良い
われわれはIT技術者なのだから物事を自分でやる必要は無い
たった一度の投資で図書館のすべての本が自分のものになるのだからやらない理由は無いぞ
50デフォルトの名無しさん:2012/10/19(金) 13:30:28.73
>>46
K&Rも読みこなせなかったのか?
51デフォルトの名無しさん:2012/10/19(金) 13:32:56.62
>>50
時代にそぐわないと言ったんだが、君の理解力大丈夫か?
52デフォルトの名無しさん:2012/10/19(金) 13:50:22.21
時代にそぐうお前に合ってたすばらしい本挙げてけよ
53デフォルトの名無しさん:2012/10/19(金) 14:07:50.50
「窓から捨ててください」
「焼く捨ててください」
54デフォルトの名無しさん:2012/10/19(金) 17:28:19.52
C言語初心者にK&Rはない
55デフォルトの名無しさん:2012/10/19(金) 17:48:00.17
それしかない時代もあったんだから問題ない。
56デフォルトの名無しさん:2012/10/19(金) 17:59:33.67
問題ないね
57デフォルトの名無しさん:2012/10/19(金) 18:16:46.83
CってK&Rじゃ対応できないほど新しいこと増えた?
58デフォルトの名無しさん:2012/10/19(金) 18:33:41.18
>>57
関数プロトタイプは重要
59デフォルトの名無しさん:2012/10/19(金) 18:42:50.72
>>58
今入手可能なK&R2には書いてあるから
60デフォルトの名無しさん:2012/10/19(金) 18:58:09.20
読み物として面白いのは

「C言語を256倍使う本」
今では不要となった技術がてんこ盛りだが
侍魂にも通じるフォントいじりがなされていて
読んでいてマのなんたるかを直接に面白おかしく知ることができる
61デフォルトの名無しさん:2012/10/19(金) 19:27:39.96
東海道中膝栗毛なみの本だな
62 ◆QZaw55cn4c :2012/10/19(金) 20:09:28.86
>>60
どんな本?ちょっとだけ教えて
63デフォルトの名無しさん:2012/10/19(金) 20:11:19.82
Cの初心者ならK&RとエキスパートCプログラミングあたりでいいだろう
コンピュータ自体の初心者なら、ハードルが少し高いかもしれないが
64デフォルトの名無しさん:2012/10/19(金) 20:12:19.34
ans = 'C'<<8;
65デフォルトの名無しさん:2012/10/19(金) 20:32:31.71
>>63
エキスパートCプログラミングは天才達の昔話が読み物としても面白いし、実用小ネタも多くていいよね。
変数や関数の宣言を読み解くフローは目から鱗だったわ。
66デフォルトの名無しさん:2012/10/20(土) 12:21:50.63
目から鱗だったね
67デフォルトの名無しさん:2012/10/20(土) 14:44:29.85
桜庭ななみ
68デフォルトの名無しさん:2012/10/20(土) 15:00:15.50
>>65
>変数や関数の宣言を読み解くフロー
K&R2 にのっているネタでは?
69デフォルトの名無しさん:2012/10/20(土) 16:06:18.09
うん、載ってるよ
70 ◆QZaw55cn4c :2012/10/20(土) 16:19:19.93
結論:K&R2 でほぼ十分
反例:K&R2の線形リストは糞実装
71デフォルトの名無しさん:2012/10/20(土) 16:25:37.33
>>70
どういう実装なの?
72デフォルトの名無しさん:2012/10/20(土) 16:50:14.30
自分で嫁馬鹿野郎
73デフォルトの名無しさん:2012/10/20(土) 17:29:23.04
>>71
え?
74デフォルトの名無しさん:2012/10/20(土) 17:51:42.34
>>71
そいつはこの板に粘着している技術力0のクズで、そいつのレスには1oの
信ぴょう性もないからかまってはいけない。
75デフォルトの名無しさん:2012/10/20(土) 18:41:36.46
talloc使ってたやつか?
76デフォルトの名無しさん:2012/10/20(土) 19:45:33.56
桜庭ななみ
77デフォルトの名無しさん:2012/10/20(土) 20:45:40.93
桜バナナ実
78デフォルトの名無しさん:2012/10/20(土) 20:47:28.95
>>71
http://toro.2ch.net/test/read.cgi/tech/1316592884/270-271

>>74
零はちょっとかわいそうじゃないですか?0.57721566 くらいは恵んでくださいな
79デフォルトの名無しさん:2012/10/20(土) 21:07:30.00
>>71
線形リストもしらずに「K&R2の線形リストは糞実装」といってるクズだってわかっただろ。
相手にするだけ時間の無駄。
80デフォルトの名無しさん:2012/10/20(土) 21:28:33.55
>>9
バイナリツリーに言及している時点で線形リストは既知と判断するのが普通なのですけれども
K&R2 のその部分が初心者向けで終わっているとのはまぎれもない事実

読んだことないの?
81デフォルトの名無しさん:2012/10/20(土) 21:49:19.21
うん、ないよ
82デフォルトの名無しさん:2012/10/20(土) 23:01:13.64
で、その「クソな実装の線形リスト」はK&Rのどこに載ってるんだ?
83デフォルトの名無しさん:2012/10/20(土) 23:44:09.84
カンカンカンカンカン、終了〜
84デフォルトの名無しさん:2012/10/20(土) 23:49:41.92
そこの処理には絶対行かないのに
そこ(whileとかforやブロックの中身)変更すると実行結果が変わる時ってありますか?

printfチェックで
絶対そこの部分には行かないのに
変更すると実行結果が変わってしまいます。
85デフォルトの名無しさん:2012/10/20(土) 23:52:21.47
それはメモリ破壊してます
検査してみて
86デフォルトの名無しさん:2012/10/20(土) 23:56:02.48
絶対行かないとかホザいてるアホは
さっさとその臭いソースを出せよ
お前のタコなソースなんて
オレ様がみりゃー
一発だよ
87 ◆QZaw55cn4c :2012/10/21(日) 00:04:08.53
>>84
>>86 と同意見です。この手のバグとりは結構難解で、printf() デバッグではどうしようもなく、デバッガ出動に踏み切らざるを得ないと思います。
もしよろしければソースをみせていただけると何かヒントを提案できるかもしれません。
88 ◆QZaw55cn4c :2012/10/21(日) 00:09:59.86
>>82
K&R2 6.5、手元の和訳ではp171とか。
おっとよくみると線形リストじゃなかったね。記憶が混同していました。

ともあれ、ここで終わっているのは非常に惜しい
89デフォルトの名無しさん:2012/10/21(日) 00:13:12.91
またQZの敗北かw

負け惜しみが笑えるww惜しいのはお前だよwwww
90デフォルトの名無しさん:2012/10/21(日) 07:32:20.47
線形リストを知らずに「K&R2の線形リストは糞実装」といってたクズ。
かまわない方がいいって証明できただろ。>>71
91デフォルトの名無しさん:2012/10/21(日) 12:44:19.69
秘密だよ
92デフォルトの名無しさん:2012/10/21(日) 13:42:57.29
>>88
手元の原書だと
6.5 Self-referential Structures (P.139)
(ツリーを使って単語の出現数を出力するプログラム)
だけど合ってる?
何がクソなのか分からない
93デフォルトの名無しさん:2012/10/21(日) 13:54:52.25
>>92
void 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)
は実にムダにみえないか?
94デフォルトの名無しさん:2012/10/21(日) 14:26:17.01
見える見えないじゃねーんだよ
whyを書けよアホ
自分の能力が低いから「みる」とかアバウトでアホでクズな単語使ってんだろ
そういうやつはお願いだからこのスレに書き込むなよテイノウ
95デフォルトの名無しさん:2012/10/21(日) 14:35:04.24
>>93
>>94
まあまあ、せっかくだから比較してみよう、ちょっと書いてみるわ
96デフォルトの名無しさん:2012/10/21(日) 14:35:51.75
ビット演算が8進数wwwww
97デフォルトの名無しさん:2012/10/21(日) 14:40:18.78
クズは他人のものにケチつけるより、自分のコードからムダを省くよう努力しろよw
9892:2012/10/21(日) 14:48:16.83
>>93
つまり、addtree()の返り値の代入は、最初の一回以外ずっと同じ値の
コピーだからムダだ。ってこと?

分からんでもないけど、K&Rのコードのシンプルさ(分かりやすさ)の方が
入門書には合ってると思う。

ググったらこのページが見つかった
http://www.s.kyushu-u.ac.jp/~z7kh03in/maekawa/bintree/source.html
K&R 2ndの件のページと同じコードだと思う
99デフォルトの名無しさん:2012/10/21(日) 15:24:35.93
結構違った
http://ideone.com/DmuaH6

>>98
シンプルにしておけ!この間抜けの原則だっけか。そうか、それがあったな。
100デフォルトの名無しさん:2012/10/22(月) 06:19:24.02
>>98
そうそう。
慣れてくると、メンバ変数のポインタを渡すほうがわかりやすかったりする。

>分からんでもないけど、K&Rのコードのシンプルさ(分かりやすさ)の方が
>入門書には合ってると思う。
入門書としては確かにそうだと思う。誰しも最初はこれからスタートする。
K&R は入門書だが、無理やりK&R を批評したかっただけかもしれませんね。
http://toro.2ch.net/test/read.cgi/tech/1313183984/403 に比較を書いてみました、基本書かないと理解できない体質です。

>>94
why そのものが書いてあるのにわからない?
みえる、という単語に反応し過ぎてみえなくなったのね

>>97
今後とも精進して参ります
101デフォルトの名無しさん:2012/10/22(月) 06:25:16.95
>>100
コテつけろよ。
returnするほうが明らかにわかりやすい。
102デフォルトの名無しさん:2012/10/22(月) 06:28:14.04
バイナリーツリーを必死こいて実装するようなやつが慣れとかw
103デフォルトの名無しさん:2012/10/22(月) 13:54:58.33
ふっふっ
104デフォルトの名無しさん:2012/10/22(月) 14:29:22.16
へっへっ
105デフォルトの名無しさん:2012/10/22(月) 18:44:55.97
>>100
テメーがヘボなのを言語(Java)の所為にしないように。ゴミクズにレクチャーするのは無駄だからしないが。
106デフォルトの名無しさん:2012/10/22(月) 19:07:34.22
>>105
できないのね
107デフォルトの名無しさん:2012/10/22(月) 19:14:11.28
ああ、バカにレクチャーするのは完璧なる無駄だから、出来ねーな。
108デフォルトの名無しさん:2012/10/22(月) 19:21:35.95
>>107
できないのね
109デフォルトの名無しさん:2012/10/22(月) 19:41:50.68
ああ、バカにレクチャーするのは完璧なる無駄だから、出来ねーな。
110デフォルトの名無しさん:2012/10/22(月) 20:29:49.23
思ったんだけど関数から関数を呼び出せたりするというC言語の機能が
プログラムを分かりにくい状況にしているんじゃないですかね?

メモリ上では関数から関数を呼び出した時呼び出し側のデータがスタックに保持されて
帰ってきた時データをそのまま使えるけど構造は非常に複雑ですよね。

111デフォルトの名無しさん:2012/10/22(月) 20:33:46.35
関数から関数を呼び出せなかったら困るのでは
112デフォルトの名無しさん:2012/10/22(月) 20:39:36.47
それはC言語に固有の機能ではない。
それでプログラムがわかりにくい状況になってると感じるなら、
プログラミングという思考作業に対して、キミの知能が足りないだけ。
113デフォルトの名無しさん:2012/10/22(月) 20:40:10.88
プログラムの構造が理解できなくなる
114デフォルトの名無しさん:2012/10/22(月) 20:45:58.22
お前がゴミだから仕方ない
115デフォルトの名無しさん:2012/10/22(月) 20:56:59.90
ならメイン関数のみで1万行を超えるプログラムを書いてみろよ
116デフォルトの名無しさん:2012/10/23(火) 07:03:45.11
たやすいことさ
117デフォルトの名無しさん:2012/10/23(火) 08:40:48.57
goto main01_005_08;
main01_005_08_ret:
goto main01_005_09;
main01_005_09_ret1:
118デフォルトの名無しさん:2012/10/23(火) 09:59:25.74
関数が
とか仰っている御仁は
関数型プログラミングとかは
ましてやラムダなんとかやらは
絶対に理解できそうもないな
119デフォルトの名無しさん:2012/10/23(火) 10:06:34.73
C言語の関数とそのての関数は違うべさ
120デフォルトの名無しさん:2012/10/23(火) 10:17:22.19
ローカル変数をスタックに置いてるから複雑になってるという主張かな。
 デバッガ作る人にとっては複雑かもなあ。
 アセンブリレベルで動作追うときにフレームポインタの間接参照見るのは面倒。
でも、この程度であって関数が基本リエントラントである恩恵の方がはるかに大きい。
121デフォルトの名無しさん:2012/10/23(火) 10:35:06.56
entry
122デフォルトの名無しさん:2012/10/23(火) 10:38:06.17
int main(){
123デフォルトの名無しさん:2012/10/23(火) 10:39:30.66
int a00000000001;
int a00000000002;

int axxxxxxxxxxx;

return(0)
}
124デフォルトの名無しさん:2012/10/23(火) 13:11:05.50
いまどき関数の無い言語ってバッチファイルぐらいでしょ
なんで関数の無い方がいいと思ったのやら
125デフォルトの名無しさん:2012/10/23(火) 14:27:17.06
>>124
2段落目から推測すると「関数から関数を呼び出す」は再帰呼び出しを
意味していると思われる。
>>120が書かれた後で理解できてないお前も大して変わらない低レベル。
126デフォルトの名無しさん:2012/10/23(火) 14:45:19.46
再帰できなかったらスタックをよういせにゃならんのでしょ、そっちのほうが複雑じゃん
127デフォルトの名無しさん:2012/10/23(火) 15:22:59.00
末尾再帰
128デフォルトの名無しさん:2012/10/23(火) 15:28:24.62
末尾再帰じゃないものを末尾再帰に変形するのもまた複雑
129デフォルトの名無しさん:2012/10/23(火) 15:28:50.79
あたえられたコード読むのと
やりたいことを考えた時に思い浮かんだやり方
思考が違うからなー
130デフォルトの名無しさん:2012/10/23(火) 17:16:11.93
>>124
バッチファイルもcall :label出来るし。黙ってた方が良かったね。
131デフォルトの名無しさん:2012/10/23(火) 19:28:49.18
ふっふっ
132デフォルトの名無しさん:2012/10/23(火) 19:57:09.13
へっへっ
133デフォルトの名無しさん:2012/10/23(火) 20:24:39.78
お互い呼び合うとか構造理解できないでしょ。
int happy()
{
yes();happy();
}
int yes()
{
happy();
}

こうなったらスパゲティ以外の何者でもないでしょ...
図を書こうと思っても同じ関数のブロック何回も出てきて訳がわからなくなる
そりゃ階乗計算の再帰みたいに単純なのだといいけど....
134デフォルトの名無しさん:2012/10/23(火) 20:32:52.36
詩ね
135デフォルトの名無しさん:2012/10/23(火) 20:33:22.85
そんなんあるか?
136デフォルトの名無しさん:2012/10/23(火) 20:34:38.76
コールバック関数
137デフォルトの名無しさん:2012/10/23(火) 20:41:48.28
min-max法とか再帰で書くとこうなるよね
138デフォルトの名無しさん:2012/10/23(火) 20:43:55.93
>>133
それはキミの知能がゾウリムシくらいしかないという証明。
139デフォルトの名無しさん:2012/10/23(火) 20:50:52.23
>>136
コールバックってjavaじゃなかったっけ?
140デフォルトの名無しさん:2012/10/23(火) 20:56:30.86
オイ
マジモンの無能がいるぞww
141デフォルトの名無しさん:2012/10/23(火) 21:01:56.88
お互い呼び出すとか異次元スパゲティだわな
142デフォルトの名無しさん:2012/10/23(火) 21:09:36.93
構文解析なんかは 式、項、因子の3つを相互再帰するが。。。
入門じゃ重い部類かもしれぬ
143デフォルトの名無しさん:2012/10/23(火) 21:10:24.95
再帰下降パーサとか習ったことない土方か。土方はphpでも使って炉。
144デフォルトの名無しさん:2012/10/23(火) 21:37:46.25
ふっほっ
145デフォルトの名無しさん:2012/10/23(火) 22:04:22.22
>>128
できないのもあるしね二方向以上の再帰とかね
146デフォルトの名無しさん:2012/10/23(火) 22:06:44.65
>>142
因子を処理中括弧の中は式に丸投げは再帰を使わないで書けとか罰ゲームとしか
147デフォルトの名無しさん:2012/10/23(火) 22:27:24.59
そりゃ一番難しいところがプログラミングの初期に全部掘り起こされて
言語としてはドンドンあほになって行ってるじゃん
148デフォルトの名無しさん:2012/10/23(火) 22:37:57.76
へっほっ
149デフォルトの名無しさん:2012/10/23(火) 23:48:52.18
>>147
つまりアセンブラ最強
150デフォルトの名無しさん:2012/10/24(水) 01:01:43.09
ここってP2Pチャットのプログラムに関する質問も受け付けてる?
一応1カ月でスパルタされたポインタも怪しいにわかなんだが
151デフォルトの名無しさん:2012/10/24(水) 02:10:47.66
とりあえず投げてみるのも一興
152デフォルトの名無しさん:2012/10/24(水) 10:02:55.81
エィ
153デフォルトの名無しさん:2012/10/24(水) 10:57:51.15
やー
154デフォルトの名無しさん:2012/10/24(水) 12:42:24.81
一ヶ月でポインタも怪しいって、教える方がよっぽど馬鹿じゃなきゃ見込みないから諦めるべきだな。
155デフォルトの名無しさん:2012/10/24(水) 13:33:14.20
さらばポインタ厨
156デフォルトの名無しさん:2012/10/24(水) 13:53:19.74
Cの経験1か月でポインタはスパルタ受けたという意味だろう。
ポインタ理解するのに1か月もかかる池沼が世の中に存在するはずがない。
157デフォルトの名無しさん:2012/10/24(水) 13:59:31.55
長くとも30分で理解出来ないとこの業界にいるのはキツイね
158デフォルトの名無しさん:2012/10/24(水) 14:22:38.85
キツイね
159デフォルトの名無しさん:2012/10/24(水) 14:39:05.20
30分では無理だ
160デフォルトの名無しさん:2012/10/24(水) 14:43:26.08
何年経験してても、ポインタ関連のデバッグは、たいへん
161デフォルトの名無しさん:2012/10/24(水) 14:44:49.79
恐れず侮らず
162デフォルトの名無しさん:2012/10/24(水) 16:29:26.60
ふぅ
163デフォルトの名無しさん:2012/10/24(水) 17:30:53.05
デバッグは大変、ならわかるが
164デフォルトの名無しさん:2012/10/24(水) 18:20:37.14
みなさま教えてください

double型の数値の小数点以下の桁数を求めるにはどうしたらよいでしょう
165デフォルトの名無しさん:2012/10/24(水) 18:24:03.50
>>164
無理
166デフォルトの名無しさん:2012/10/24(水) 19:09:26.78
>>162
2進数でよければ仮数部を指数部でシフトして
もっとも右にある1を探す感じで出来る
167デフォルトの名無しさん:2012/10/24(水) 19:38:47.43
>>166
10進数もそれと同じ桁数になるんじゃね?

0.1(2) → 0.5(10)
0.01(2) → 0.25(10)
0.001(2) → 0.125(10)
0.0001(2) → 0.0625(10)
168デフォルトの名無しさん:2012/10/24(水) 20:05:07.98
>>167
そもそも精度の関係で例えば0.7のときに巧くいかない。
169デフォルトの名無しさん:2012/10/24(水) 20:17:07.67
え、doubleから(おそらく10進数での)小数点下桁数を求めよってお題でしょ
0.7とかdoubleで表現できない数値を扱う必要あんの?
170デフォルトの名無しさん:2012/10/24(水) 20:23:12.32
0.7の近似値の桁数になるだけ。問題なく求められる。
171150:2012/10/24(水) 20:34:59.41
P2P式の複数人用のチャットアプリなんだが、P2Pの概念がよくわからん
OSはUNIX
TCP通信マルチスレッドでC/S型の複数人チャットのソースは組めた
ここからP2P型に改造する予定だが、サーバのソースにクライアント部分の接続〜送信を加えたらP2P?
同じプログラムで通信するのがP2Pって思ってるんだけど、違う?
172150:2012/10/24(水) 20:39:59.41
同じプログラムじゃねえ、ダイレクトに相手IPアドレスでアクセスしてるし、これでP2Pなのかなって
173デフォルトの名無しさん:2012/10/24(水) 20:55:07.32
>>171
> サーバのソースにクライアント部分の接続〜送信を加え
ここ意味わからん

ただ、
> 同じプログラムで通信するのがP2Pって思ってる
そんな定義はない。

(多数の)ピア同士が何か特定のホスト(サーバ)を
経由せずに通信できればP2Pだろ。

問題は、相手をIPアドレスやホスト名で指定せずに
済ませる方法がないと実用にならないし、
NAT越えも必要になる。
174150:2012/10/24(水) 21:00:50.90
>>173
>同じプログラム〜
ここは忘れてください、とち狂ってました

>サーバの〜
親スレでconnect〜send
子スレでソケットをbind→listen→acceptの無限ループ
孫スレでrecv→printfで接続元が切断するまでループ
これで説明になってるんだろうか
175150:2012/10/24(水) 21:57:49.55
なんか支離滅裂になってるorz
多分自己解決しました
connectする時にNAT越えして相手のIPアドレス指定出来ればいいのかな…
176デフォルトの名無しさん:2012/10/24(水) 22:23:45.16
さあ
177デフォルトの名無しさん:2012/10/24(水) 22:29:59.38
C言語の質問はいつ出てくるんだ?
178デフォルトの名無しさん:2012/10/24(水) 22:40:12.74
明日
179デフォルトの名無しさん:2012/10/24(水) 22:40:52.36
明後日
180デフォルトの名無しさん:2012/10/24(水) 23:18:35.94
明後後日
181デフォルトの名無しさん:2012/10/24(水) 23:43:33.65
――そして一年が過ぎた
182デフォルトの名無しさん:2012/10/24(水) 23:56:54.73
WindowsプログラムでPC(レジスタ)を直接書き換えることってできるんでしょうか?
あと、以下のように自由にアクセスってできるんでしょうか?
a = ((char*)0)[10];
((char*)0)[31] = 0xFF;
183デフォルトの名無しさん:2012/10/25(木) 00:00:08.32
それはC言語の範囲ではないので適したスレで聞いてください
184デフォルトの名無しさん:2012/10/25(木) 02:15:49.09
プリンタへの出力でわからないことがあるので教えて下さい
イベントが発生したら、指定したwordファイルを自動で印刷するようにしたいのですが
int StartDoc(
HDC hdc, // デバイスコンテキストのハンドル
CONST DOCINFO *lpdi // ファイル名を指定する
);

この場合lpdiにどのような値を入れたらいいですか?
185デフォルトの名無しさん:2012/10/25(木) 02:57:44.04
>>184
Win32API のスレで聞け
186デフォルトの名無しさん:2012/10/25(木) 03:06:59.43
>>185
たらいまわし役人根性乙
187デフォルトの名無しさん:2012/10/25(木) 03:19:38.04
こんな記事みつけた
http://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週間以内に合衆国の西海岸を襲うと予想されます。
188デフォルトの名無しさん:2012/10/25(木) 08:04:29.42
>>184
MSDNを自分で読めよ。それでもわからなかったら教えてやる。
189デフォルトの名無しさん:2012/10/25(木) 14:02:40.88
読んだけどわかりませんでした!!
190デフォルトの名無しさん:2012/10/25(木) 15:17:54.03
>>188-189
教えるのはいいが、余所でやってくれ。
191デフォルトの名無しさん:2012/10/25(木) 16:52:47.57
すみません
charの例えば56と、fdをくっつけて、2バイトの変数に56fdとして代入したいんですが、どうやるのが最善でしょうか?
2バイトの変数を用意して、1バイトめを代入して、8ビットシフトし、2バイト目と0xFFのビット積をとって加えると出来るんですがまだるっこしい感じがします
192デフォルトの名無しさん:2012/10/25(木) 17:16:00.05
>>191
uint8_t bar = 0x56;
uint8_t baz = 0xfd;
uint16_t foo = bar << 8 | baz;
ってこと? 何が不満なんだ?
193デフォルトの名無しさん:2012/10/25(木) 17:29:32.95
不満点を上げるとすればまだるっこしいのあたり。
194デフォルトの名無しさん:2012/10/25(木) 17:33:30.05
>>191
4byteだろう
195デフォルトの名無しさん:2012/10/25(木) 17:40:39.18
>>192
うーんまぁ、そんなもんですかね
foo = unite(bar, baz);
みたいな感じでサクッと結合出来ないかなーと思ったんですが
196デフォルトの名無しさん:2012/10/25(木) 17:43:11.99
#define unite(x, y) ((uint8_t)(x) << 8 | (uint8_t)(y))
197デフォルトの名無しさん:2012/10/25(木) 18:15:04.97
ふっほっ
198デフォルトの名無しさん:2012/10/25(木) 18:39:25.61
共用体でやったことある
199デフォルトの名無しさん:2012/10/25(木) 19:15:57.77
>>198
共用体だとビッグエンディアン、リトルエンディアンを気にする必要があるね。
200デフォルトの名無しさん:2012/10/25(木) 19:18:26.44
200
201デフォルトの名無しさん:2012/10/25(木) 19:34:39.85
>>187
http://www.youtube.com/watch?v=koxU4nWvWys
3/18 01:04JST, 1/20遅速再生
3分過ぎあたりからキノコ雲あがって流れている
202デフォルトの名無しさん:2012/10/25(木) 22:04:53.33
きのこは素人には判別不可能
203デフォルトの名無しさん:2012/10/25(木) 22:14:14.74
お、お、おれのワライタケを判別してもらおうか
204デフォルトの名無しさん:2012/10/25(木) 22:26:24.93
(笑)
www
プゲラ
205デフォルトの名無しさん:2012/10/25(木) 22:26:34.16
いつからエノキダケがワライダケという名前になったんだよ
206デフォルトの名無しさん:2012/10/25(木) 22:34:59.36
>>205
ふっほっ
207デフォルトの名無しさん:2012/10/25(木) 22:37:45.36
ここだけの話、野生のきのこはまだ放射能があぶないらしい
208デフォルトの名無しさん:2012/10/25(木) 22:38:53.40
一応、基準以上は出荷停止してるんじゃないのか?
209デフォルトの名無しさん:2012/10/25(木) 22:40:40.14
このスレも基準以下のは出荷停止の書き込み禁止にしてほしいな
放射能よりも害悪だ
210デフォルトの名無しさん:2012/10/25(木) 22:48:48.62
キノコはやばいよ
出荷基準は実質無意味だよ
自分で興味もって調べないと死ぬよ
211デフォルトの名無しさん:2012/10/25(木) 22:50:26.24
「野生のきのこ」だよ、出荷されてるかどうかはしらね
212デフォルトの名無しさん:2012/10/25(木) 22:57:01.95
さすがに関東〜東北で野生のきのこ食う奴なんていないだろ
70歳以上くらいならただちに影響ないだろうけど
213デフォルトの名無しさん:2012/10/25(木) 23:06:07.95
露地栽培だって同じようなもん、それを出荷しようと企むテロリストがいるから困る。
214デフォルトの名無しさん:2012/10/25(木) 23:40:44.18
C言語と関係ない話はやめろ
215デフォルトの名無しさん:2012/10/26(金) 00:54:03.12
ほっほっ
216デフォルトの名無しさん:2012/10/26(金) 00:55:32.79
茸の話してるところすみませんがC言語の方でお願いします。
2〜1000の中から素数を出力するプログラム
http://codepad.org/7ab7zj65
のi%jの計算回数を出来る限り減らせという課題ですが、色々やってこうなりました。
http://codepad.org/4ubNQTvg
計算回数自体は減りましたが、9とか15とか合成数も出力されるようになってしまいました。
プログラムを変えてみた時の変化や高専編入者からのアドバイスが入っていますが、パラメータで制御するならどのようにすればよいでしょうか?
計算回数は経験者を見ている感じでは1500〜2200辺りになりそうですが、計算回数を減らす方法も何かいいものはありますか?
217デフォルトの名無しさん:2012/10/26(金) 01:05:03.94
自分でMOD実装すれば組み込みの剰余は0回で済むよ
これが正解ね
218デフォルトの名無しさん:2012/10/26(金) 01:10:20.82
if(j > (int)sqrt(i))
219デフォルトの名無しさん:2012/10/26(金) 01:16:03.54
220デフォルトの名無しさん:2012/10/26(金) 01:18:06.96
この方式で剰余をさらに減らそうというなら、
候補の i = 3 5 7 9 11 13 15 ...
のうち、3回に1回は調べなくてもいいよね、とか。

で、それを押しすすめると、エラトステネスになって、
自分で実装しなくても剰余が不要になる。
221デフォルトの名無しさん:2012/10/26(金) 01:19:24.44
>>216
素数の整数倍にチェック付けて
チェックされてないヤツだけ余り調べる
222デフォルトの名無しさん:2012/10/26(金) 02:04:19.10
223デフォルトの名無しさん:2012/10/26(金) 02:50:16.96
224デフォルトの名無しさん:2012/10/26(金) 03:39:23.30
225デフォルトの名無しさん: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を除外
226デフォルトの名無しさん:2012/10/26(金) 07:49:10.20
日々の雑務を自動化する為に
中小規模のアプリをさっと作るのに最適な言語を探してるんだが何がイイかな
欲しい条件は
・GUIの扱いが楽
・文字列の扱いが楽
・XMLパーサーなど便利なライブラリが充実してる事
・書きやすく読みやすく保守がしやすい事
・Win Linux Macの最新か一世代前のOSで安定する事
なんやけどどうでっしゃろ?
227デフォルトの名無しさん:2012/10/26(金) 07:51:56.27
perl/tk
保守に関してはブードゥーの呪文
ttp://www.kotono8.com/2008/12/21if-programming-languages-were-religions.html
> 上司があなたに金曜夜21時に緊急の仕事を命ずるときにしばしば使われる。
このようにスピードを重視した言語
228216:2012/10/26(金) 08:33:16.91
>>217-225
皆さんレスありがとうございます。

修正が少なくて%の演算回数が一番少ないのは>>218ですね。
エラトステネスなどはアルゴリズムに入るのか?ということで学科内では避けられています。
>>221>>225
素数の整数倍ですか、見た感じ一番効率よさそうですね。組んでみます。
229デフォルトの名無しさん:2012/10/26(金) 08:41:25.38
>エラトステネスなどはアルゴリズムに入るのか?ということで学科内では避けられています。
アルゴリズムじゃなきゃなんなんだよw
230デフォルトの名無しさん:2012/10/26(金) 08:47:42.88
その方法がアルゴリズムかどうか、
そこから議論してるのか?

ヤヴァイ集団だぞそれ
おまいらはアルゴリズムとそうでないものの区別がつかないような集団で、
そしてあなたはその一員か?

アルゴリズムの定義ってなんだよ
素数とかそういう段階じゃネーゾソレ
ましてやプログラミングの早さを競う段階でもない
もっと根本的なことから勉強し直さないといけないような集団だろ

マジでヤバイものの一端を見た
教育や学生の頭脳が劣化してる、
そして何よりも、アルゴリズムか否かを多数決で決めてるフシがある
それが一番危険だ、
自分のアタマで判定してない
231デフォルトの名無しさん:2012/10/26(金) 08:55:18.82
好意的に解釈すれば、この課題で認められた範疇かどうかってことじゃね?

しかしそんなもん、出題者に聞けば一発なのに。
232デフォルトの名無しさん:2012/10/26(金) 09:01:44.22
人類の知能低下は物理的な必然なんだよ
核実験時代の汚染が人々の遺伝子と脳を破壊し白痴が大量生産された
放射能汚染度の高い韓国の国民性をみればその恐ろしさが分かるだろう
Fukushimaによってばら撒かれた超汚染によって世界は韓国と同じレベルに収束する事もはやが約束されているのだ
233デフォルトの名無しさん:2012/10/26(金) 10:04:51.39
アルゴリズム学ばないCマも多数活躍しています。
234デフォルトの名無しさん:2012/10/26(金) 10:20:15.98
>>226
C のスレで質問するのもどうかと思うが
C 経験者にもおすすめなのは python
235デフォルトの名無しさん:2012/10/26(金) 10:39:22.62
>>226
C言語スレで他の言語を探してどうするよw
236デフォルトの名無しさん:2012/10/26(金) 11:03:39.51
C言語と関係ない話はやめろ
237デフォルトの名無しさん:2012/10/26(金) 11:05:31.49
>>230
論点が不明なのにそのように言い切ってしまうお前の知能の方が10000倍ヤバい。
238デフォルトの名無しさん:2012/10/26(金) 11:37:01.32
>>237
どんな論点で話し合った結果だったんだ?
239デフォルトの名無しさん:2012/10/26(金) 11:54:55.17
>>238
さあ? 傍観者のオレにはわからないが、「こういう理由で(オレらの定義の)アルゴリズム
じゃない」という説明がなされた途端に>>230の頭の悪さがはっきりとする。
240デフォルトの名無しさん:2012/10/26(金) 13:22:40.73
ぼくが2ちゃんでまなんだこと

・馬鹿はどこにでも居る
・馬鹿は伝染る
・ある馬鹿が居なくなっても必ず別の馬鹿がどこかから現れる
241デフォルトの名無しさん:2012/10/26(金) 14:17:39.28
伝染るというか最初から最後まで一人じゃない?
242デフォルトの名無しさん:2012/10/26(金) 14:17:40.29
・他人から見ると自分も馬鹿
243デフォルトの名無しさん:2012/10/26(金) 18:33:21.53
卒業したら戦闘機に乗りたいと言う奴にまずバイク免許取れと言うような感じ
244デフォルトの名無しさん:2012/10/26(金) 19:31:17.31
卒業したらメジャーに行きたいと言う奴にまず日本のプロ野球に入れと言うような感じ
245デフォルトの名無しさん:2012/10/26(金) 19:42:02.11
桜庭ななみ
246デフォルトの名無しさん:2012/10/26(金) 19:54:47.19
先週のプレイボ〜イのななみちゃんはエロくて良かった
247デフォルトの名無しさん:2012/10/26(金) 19:58:39.37
エロいの最高!
248デフォルトの名無しさん:2012/10/26(金) 20:07:17.43
買いそびれた
もう売ってなかった
だれか持ってない?
249デフォルトの名無しさん:2012/10/26(金) 22:47:04.46
女優板で聞いてみたら?
250デフォルトの名無しさん:2012/10/26(金) 23:10:58.35
for ( i = 0; i < 9; i++ )
fprintf(fp, "%2.2s\n", "123456789" + i*2 );

こんな感じで全角数字を順に1文字ずつ表示するプログラムがあったのですが理屈がよくわかりません。
%2.2sの意味と、文字列同士の加算のように後ろに数字がくっつく結果にならない理由辺りを中心に解説お願い致します。
251デフォルトの名無しさん:2012/10/26(金) 23:12:35.44
いやらしいやり方だな

"123456" + i
の半角でまず試せ

次は
"123456"[5]
とかで一文字ずつ出力しろ
252デフォルトの名無しさん:2012/10/26(金) 23:44:01.72
そのシステムで全角数字は2バイトで表現されている。
"123456789"
は先頭から0バイト目が1, 2バイト目が2... と配置されている。

"123456789" + i*2
はiの値に応じて文字列"123456789"の先頭から
0バイト, 2バイト... のアドレスになる。

%2.2s は指定されたアドレスから2文字(2バイト)出力する。
253デフォルトの名無しさん:2012/10/27(土) 00:49:36.50
>>251-252
なるほど。ありがとうございます。
254デフォルトの名無しさん:2012/10/27(土) 01:19:43.43
いえいえ
255デフォルトの名無しさん:2012/10/27(土) 07:53:30.32
こういうのを書いて試すようになると色々解って楽しくなるからオススメ。 10年以上やってても色々実験する
char 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);
256デフォルトの名無しさん:2012/10/27(土) 10:01:36.54
10年もやっててそんなミスするのかよ
257デフォルトの名無しさん:2012/10/27(土) 10:34:42.50
>>255
実験するな。
ドキュメント読め。
258デフォルトの名無しさん:2012/10/27(土) 11:10:57.51
動作だけで判断すると後で後悔する
仕様を読んだうえで想定通り動くかの確認にすべき
259デフォルトの名無しさん:2012/10/27(土) 13:55:21.41
動作させることで仕様の理解が深まることがある。
動作させられるなら、先に動作させてから仕様を確認したほうが効率的な場合が多い。
仕様書の文章が理解しやすい文章で書いているとは限らない。
260デフォルトの名無しさん:2012/10/27(土) 14:49:19.14
printfのフォーマットの仕様くらい、読んで理解できない池沼は向いていない。
261デフォルトの名無しさん:2012/10/27(土) 14:57:27.30
バグも含めて仕様です。(キリッ
262デフォルトの名無しさん:2012/10/27(土) 16:26:59.57
仕様ですね
263デフォルトの名無しさん:2012/10/27(土) 17:47:45.11
うん(キリッ
264デフォルトの名無しさん:2012/10/27(土) 18:44:18.41
>>255
このコードを保存しとけばいいのに。
毎回こんなことやるのかw
265デフォルトの名無しさん:2012/10/27(土) 21:37:48.79
どこかでみたぞ
266デフォルトの名無しさん:2012/10/27(土) 22:08:34.64
>>255
引数が足らないのはわざと?
267デフォルトの名無しさん:2012/10/27(土) 23:32:17.29
えっ
268デフォルトの名無しさん:2012/10/28(日) 13:09:21.28
>>258
その通り

俺も若かりし頃に、言語仕様では「正常ならTRUE」を信じてコーディングして
しばらくハマったことがある
ここら辺で学ぶんだよな、実装ではどうなってるか確認する必要があると
あと、条件式は合致するケースの少ないものを書いた方がいいとも

※true : 0以外、false : 0
269デフォルトの名無しさん:2012/10/28(日) 13:16:44.36
例えば、仕様書に
>>258
その通り」
のみ書いてあったとする。

だが実際の動作は
「俺も若かりし頃に、言語仕様では「正常ならTRUE」を信じてコーディングして
しばらくハマったことがある
ここら辺で学ぶんだよな、実装ではどうなってるか確認する必要があると
あと、条件式は合致するケースの少ないものを書いた方がいいとも」
で、仕様書とは真逆だったりする。

文章なんてそんなもの。
270デフォルトの名無しさん:2012/10/28(日) 14:17:36.41
>>269
引用するならまともな引用でたのむよ
俺のと君のが混ざっとる
271デフォルトの名無しさん:2012/10/28(日) 14:35:58.62
通常、引用は引用符でくくられている。
272デフォルトの名無しさん:2012/10/28(日) 18:48:37.10
言語仕様じゃなくて、誰かの作った関数の仕様に誤記があっただけじゃないの?
273デフォルトの名無しさん:2012/10/28(日) 19:22:12.52
つまり、関数設計者は誤記するが、言語設計者は誤記しないと。
274デフォルトの名無しさん:2012/10/28(日) 19:25:05.24
いや、誤記というよりも、何を書いているのか曖昧な仕様書なら動作確認したほうが内容の理解が早いって話
275デフォルトの名無しさん:2012/10/28(日) 19:33:15.14
言語仕様が曖昧な例
http://en.wikipedia.org/wiki/Sequence_point
276デフォルトの名無しさん:2012/10/28(日) 19:58:13.69
ok by japanese.
277デフォルトの名無しさん:2012/10/28(日) 20:26:52.21
>>272
ちゃう、例えばVC++6ではTRUEを1って#defineできってたから、if文で
if(hogehoge(...) == TRUE)
などと書くと、hogehoge関数の戻り値が2,3辺りが返ってきてもelseに
なるんだわ

これ、実際の標準ライブラリで起きた話ね
278デフォルトの名無しさん:2012/10/28(日) 20:29:45.60
>>277
仕様通りだね
279デフォルトの名無しさん:2012/10/28(日) 20:31:03.64
>>277
それは TRUE なんか使うからだ
あるいは if(exp == 1) なんかやるからだ

仕様以前に文化を理解していないという問題かと
isalpha()とかみっちり使ったことがあれば回避できる問題、ライブラリの問題じゃない、C はそこまで親切じゃない
280デフォルトの名無しさん:2012/10/28(日) 20:55:33.49
int *pって書くとint型のポインタって奴になるですよね
データ本体(インスタンス)を指し示す変数自体は、どの型も同じ何で間違っていませんか?
*pにHoge型のポインタをセットした時、Hoge型ではなくint型で参照しに行くとおもいます。

つまり、int *pって書いた時の「int」はインスタンスを参照しに行く時に、どのデータ型で参照するかをコンパイラに教えているためだけに書いてある
けれども、実際には型がHogeなので落ちる

間違えてないでしょうか
281デフォルトの名無しさん:2012/10/28(日) 21:12:11.41
別に落ちないけど。

ポインタの型による違いは、pに対して加減算を行なった時の値が違うだけ。
p+1がp+sizeof(int)になるかp+sizeof(Hoge)になるかの違い。
282デフォルトの名無しさん:2012/10/28(日) 21:14:22.49
>>280
java の経験があるのかな?
だいたいあってる、
けれども落ちるとはかぎらない、だまって int のつもりでさっさと動いてしまうことも
283デフォルトの名無しさん:2012/10/28(日) 21:15:13.90
>どのデータ型で参照するかをコンパイラに教えているためだけに書いてある
あってる

>実際には型がHogeなので落ちる
コンパイラが警告やエラーはだしてくれるだろうけど、動作時に落ちるかどうかは時と場合による
大抵は無理やり読み込んだ意図しない値で進んでしまいそうな気がする
284デフォルトの名無しさん:2012/10/28(日) 21:20:30.45
>>281-283
回答頂きありがとうございます
落ちるか落ちないかは時と場合によるんですね

.net系の職業PGですorz
C<--->.netの連携がさっぱりわからなくて、Cを勉強しようかなと
285デフォルトの名無しさん:2012/10/28(日) 23:05:05.18
参考書の質問ってここで大丈夫ですか?
286デフォルトの名無しさん:2012/10/28(日) 23:14:32.03
はい。C言語なら。
287285:2012/10/28(日) 23:52:50.27
どうも。それなら

学科の授業では教科書にK&R2 日本語訳が指定されてるんですが、各所レビューなど見ても分かる通り、仕様書としては良くても入門書としてはどうかなと思っています。
授業ではそれも踏まえて「くどく説明します」と言ってるのに、実際はどこかで詰まると置いてかれる授業です。
そんな訳で何か別に入門書が欲しいと思うんですが、皆さんはどの本から入りましたか?
因みに、友人が他学科の教科書になってる柴田望洋先生の本を貰ってて、いいと言ってました。
あと、授業で配られたこのプリントの出典が分かる人は教えてください。
http://www.imgur.com/ysf9V.jpg
288デフォルトの名無しさん:2012/10/28(日) 23:58:24.81
>>278
>>269
俺は>>268>>277なんだが、始めに「若かりし頃」と書いてるように相当昔の話だよ、書いた件は
あとライブラリが悪いとも書いてない、どちらかというと実装と言語仕様の違いについて、こんな
ことあったよという話
289デフォルトの名無しさん:2012/10/29(月) 00:01:43.49
>>287
K&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
を読んでおくとか。
290デフォルトの名無しさん:2012/10/29(月) 02:16:24.38
>>288
要するに、TRUEという名前の定数があることを知ってたから
「真を返す」を書いてあった文章をTRUE値を返すと勘違いしたってだけだろ

TRUEを返すと書いてあって2とか3が返ったのならともかく、「真を返す」等の
記述だったなら勘違いしたお前が悪い
291デフォルトの名無しさん:2012/10/29(月) 02:39:44.19
BOOLは後付けで決まった仕様だからね
292デフォルトの名無しさん:2012/10/29(月) 02:56:15.55
えっ
293デフォルトの名無しさん:2012/10/29(月) 07:46:32.29
>>288
いいたいことはわかる。
しかし、真偽と非零/零が対応することはいにしえのN-BASICからのやりかたであるし文化の問題であることは否めない。
まあ、今はうまくやっているんだろう?
294デフォルトの名無しさん:2012/10/29(月) 08:16:28.40
>>293
ん?C言語ってN-BASICより新しい言語だっけ?
C言語に慣習はよく聞くけど文化なんて聞いたことがない。
295デフォルトの名無しさん:2012/10/29(月) 10:14:43.54
>>288
どの言語仕様に「正常ならTRUE」と書いてあったんだ。そんなのがあるなら有害図書として殲滅しておけ。次世代につなぐな。
(アルツハイマーの症状が悪化しただけで、存在しないんだろうけど。)
296デフォルトの名無しさん:2012/10/29(月) 10:30:01.09
N-BASICは、
 0:真
 -1:偽
だったと思う。
一方、Cは、
 非0:真
 0:偽
なのに、main() の戻り値は
 0:成功
 非0:失敗
を期待してるっぽいのが訳判らんくて混乱したな。
297デフォルトの名無しさん:2012/10/29(月) 10:34:06.87
エラーコード
 0:成功 非0:エラー、その値によりどういうエラーかの詳細も
真偽値
 非0:真 0:偽
298デフォルトの名無しさん:2012/10/29(月) 11:38:13.47
>>296
そんなに必死でウソを書く、お前の原動力はいったい何なのだ?
299 ◆QZaw55cn4c :2012/10/29(月) 12:25:48.11
>>296
>N-BASICは、
> 0:真
> -1:偽
>だったと思う。

ぎゃくだ。0:が偽、非0 が真だ。
10 print 1==1
を実行すると
-1
の結果を得る
300デフォルトの名無しさん:2012/10/29(月) 12:31:26.32
>>299
BASIC の一致比較は == でなくて = だと思うの
301デフォルトの名無しさん:2012/10/29(月) 14:36:09.99
char* str = "1234567890";
この str の文字数を求めたいのですがうまくいきません。

【試した方法その1】
int length = strlen(str);

【試した方法その2】
int length;
for( length = 0; str[length] != '\0'; ++length ){
}

【結果】
いずれの方法でも length には 1 が代入されてしまいます。
302デフォルトの名無しさん:2012/10/29(月) 14:43:49.57
>301
どちらも正しい
ttp://codepad.org/JZutIL4b

別の場所に問題があるはずだ
strを書き換えていないか?lengthは正しく確認しているか?
303デフォルトの名無しさん:2012/10/29(月) 14:51:01.84
>>302
原因はlengthを使う場所にありました…
素早い回答をありがとうございました。おかげさまですぐに解決しました
304デフォルトの名無しさん:2012/10/29(月) 18:57:51.32
DOSのファンクションコールの戻り値は基本
負数:エラー
0以上の正数:正常処理
だっけ?
305デフォルトの名無しさん:2012/10/29(月) 19:01:13.61
Javaの参考書とCの参考書のページ数比べたら圧倒的にJavaの方が
多いし1冊じゃ足りないよね

306デフォルトの名無しさん:2012/10/29(月) 19:10:51.78
int i;
int *ip;

i = 5;
ip = &i;

printf("%p, %d\n",&i, i);
printf("%p, %d\n",ip, *ip);

とやったら、ポインタ変数ipのアドレス番地も変数iのアドレス番地も同じになりました。
ポインタ変数ipは具体的にどこかにアドレスがふられて変数として領域が確保される
のではないのですか?
307デフォルトの名無しさん:2012/10/29(月) 19:15:07.96
>>306
ipのアドレスは&ipでしょ。
ipが指すアドレスは&iだけど。
308デフォルトの名無しさん:2012/10/29(月) 19:21:38.21
「アドレスがふられて変数として領域が確保される 」

なんとなく違和感が ...
309デフォルトの名無しさん:2012/10/29(月) 19:26:50.10
違和感を感じる
310デフォルトの名無しさん:2012/10/29(月) 19:29:00.31
感じるね
311デフォルトの名無しさん:2012/10/29(月) 19:29:51.10
感じないけど
312デフォルトの名無しさん:2012/10/29(月) 19:34:53.47
>>307
失礼しました。解決しました。
313デフォルトの名無しさん:2012/10/29(月) 19:43:14.72
いえいえ
314デフォルトの名無しさん:2012/10/29(月) 20:45:18.36
ポインタの大小比較は、
p > q
でできるのですか?
>の記号で正当に定義されていますか?
それともlongとかintとかにみなされて比較されるのですか(それはまずいとおもう)
315デフォルトの名無しさん:2012/10/29(月) 20:56:04.68
ただの32ビットのデータ
316デフォルトの名無しさん:2012/10/29(月) 20:56:57.23
それはマズイな
317デフォルトの名無しさん:2012/10/29(月) 21:05:48.74
ポインタは64bit
318デフォルトの名無しさん:2012/10/29(月) 21:10:57.04
少なくとも、同じ配列内を指すポインタの大小比較はちゃんと出来るはず。
319デフォルトの名無しさん:2012/10/29(月) 21:23:35.45
出来るはずだね
320デフォルトの名無しさん:2012/10/29(月) 21:24:03.92
同じ配列内でポインタの大小比較は、禁止されていないわけですね
321デフォルトの名無しさん:2012/10/29(月) 21:27:48.54
まあね
322デフォルトの名無しさん:2012/10/29(月) 21:28:56.43
>>314
どういう比較をして欲しいのかがわからん。
ポインタはアドレスなんだから32ビットの数値として比較されて当然。
大きくなると負数判定されるかもとか気にしてるの?
323デフォルトの名無しさん:2012/10/29(月) 21:42:03.30
Cの規格としては、32ビットとかぎらないでしょ
hugeポインタを検索したら、16ビットの時代の話がでてくる
324デフォルトの名無しさん:2012/10/29(月) 22:00:57.10
でてくるの?
325デフォルトの名無しさん:2012/10/29(月) 22:39:41.88
hageポインタ
326デフォルトの名無しさん:2012/10/29(月) 22:56:54.12
>>325
使えないとのうわさがちらほら、far を自分で管理するのが吉
327デフォルトの名無しさん:2012/10/29(月) 23:00:13.36
>>320
末端+1までが合法だったっけ?
int foo[10];
int *p = foo + 9; /* 実体のある最後尾
int *q = foo + 10;
328デフォルトの名無しさん:2012/10/29(月) 23:04:07.33
foo < foo + 11 まで保証
329デフォルトの名無しさん:2012/10/29(月) 23:11:02.32
d
少なくとも 0〜確保数+1 までは大小関係の維持が保障されてるのか
330デフォルトの名無しさん:2012/10/29(月) 23:47:28.32
宣言したサイズのアドレス外の値を参照するなら問題だけど、ポインタの比較なら確保数とか関係ないでしょ。
p < 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
当然の結果になる。"大小関係"っていう認識が違ってるのだろうか?
331デフォルトの名無しさん:2012/10/30(火) 00:52:19.91
確保数+1 まではオーバーフローしない位置に配置してポインタとする ってことでしょ
332デフォルトの名無しさん:2012/10/30(火) 01:08:36.94
変態的なアーキテクチャでも一定の範囲では大小比較を保証するよ、みたいな意味かと思った。
変態的なのが実際にあるのかは知らないけど。
333デフォルトの名無しさん:2012/10/30(火) 04:07:32.50
4kページングとかで struct a{char a[4096-(管理情報領域)];};をmallocしたときにfault出さないようコンパイラ側に2ページ確保する責任がある
てことでしょ
334デフォルトの名無しさん:2012/10/30(火) 07:17:59.30
アクセスは保証する必要がないから、確保しなくてもいいんじゃないの?
335デフォルトの名無しさん:2012/10/30(火) 10:23:06.39
struct Hage {
 int 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 はおかしい
336デフォルトの名無しさん:2012/10/30(火) 10:27:32.97
>>335
規格書読んで出直しなさい
337デフォルトの名無しさん:2012/10/30(火) 10:44:05.92
>>335
mallocで思いっきり確保してるじゃん。
338デフォルトの名無しさん:2012/10/30(火) 10:46:18.93
>>335
そういう文法的に未定義の動作とされている書き方をやめさせるために
C99では0長配列メンバを構造体の一番最後に書けるようになった

char hoge[]; という具合

http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
339デフォルトの名無しさん:2012/10/30(火) 18:42:12.40
不定長構造体はわりとよく知られていたCFAQにもあるくらいだ
http://www.kouno.jp/home/c_faq/c2.html#6
>Dennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。

どういう意味だろう?
340デフォルトの名無しさん:2012/10/30(火) 19:25:38.09
おまいらがいつもよくやってる
他人の心に土足で踏み込むっていう意味じゃないかな
341デフォルトの名無しさん:2012/10/30(火) 19:36:11.85
合意がないのに女子中学生にチンコ入れるお前のことだろ
342デフォルトの名無しさん:2012/10/30(火) 19:44:55.89
入れる気満々で先っぽだけって言ってるようなもんだからな。
343デフォルトの名無しさん:2012/10/30(火) 20:26:55.00
AVL木の回転の操作方法が全然分からん
Cやっぱ難しいな............
344デフォルトの名無しさん:2012/10/30(火) 20:28:41.15
そりゃお前の頭が悪いだけだ
345デフォルトの名無しさん:2012/10/30(火) 20:30:25.81
Cは全く関係ない
346デフォルトの名無しさん:2012/10/30(火) 20:50:14.91
>>344
生まれつき頭悪いのは自分でも承知です

A[10]を例にして教えてくれませんか?

A[0]=1..........A[9]=10
347デフォルトの名無しさん:2012/10/30(火) 21:30:36.90
どこがAVL木?
348デフォルトの名無しさん:2012/10/30(火) 22:15:48.79
>>339
だから undefined behavior なんだって
鼻から悪魔
349デフォルトの名無しさん:2012/10/30(火) 22:20:58.86
Cで悪魔召喚プログラムの書き方を教えてください
350桃白白:2012/10/30(火) 22:25:55.61
>>346
こんばんは桃白白です。
教えてやろうか? 教えてあげるよ? 聞きたいでしょ? 桃白白ひまだから教えてあげてもいいよ?
どうする? 教えてほしいでしょ? じゃあ教えちゃう。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行、簡単っしょ。
351デフォルトの名無しさん:2012/10/30(火) 22:33:53.64
>>350
ありがとう
要素の入れ替わりが激しくて
どこで回転してるのか分からない
何が回転なのかわからない.................................

ちなみに配列は単に木を保存してるだけです。
352桃白白:2012/10/30(火) 22:55:21.30
>>351
わからないわけないだろ、B、Dが右上に上がってA、Cが右下に下がってるだろ。
完全に回転してるだろ、これこそが回転だろ、まごうことなき回転だろ、これが回転なんだよ。
353デフォルトの名無しさん:2012/10/30(火) 23:00:06.50
魔界の転送屋と悪魔召喚の契約をした後、魔界銀行のある口座に代金を振り込む。すると転送サービスを通じて人間界に悪魔が転送される。
354デフォルトの名無しさん:2012/10/30(火) 23:02:07.40
>>352
3が1から離れてるのとかアクロバティックすぎてよく分からん
割と本気で困ってる
355桃白白:2012/10/30(火) 23:20:48.39
>>354
わからないわけないだろ、なにがアクロバティックだ、あまりふざけたことぬかしてっと桃白白は
ドドンパを行使することも視野に入れる覚悟だ。AVL木は平衡二分探索木。
平衡二分探索木は左右の平衡を保つ二分探索木。二分探索木は、左の子が親の子より
小さくて右の子が親の子より大きい二分木。二分木は2つの子を持つ木。

回転したとき2が一番上に位置するだろ、3は2より大きいから2の右側にいなければいけない。
1は2より小さいから2の左側にいなければいけない。二分探索木の条件を崩さずに平衡を保つために
ノードを付け替える、それがAVL木における回転操作。
356デフォルトの名無しさん:2012/10/30(火) 23:23:30.43
>>355
ありがとう図付いてるし考えてみる
ただ計算量まで求めるとなるとお手上げ


ちなみに俺が持ってる回転のイメージは

1 2 3 4 5 → 5 1 2 3 4  → 4 5 1 2 3

こんな感じ


複雑な回転の仕方はイメージできないんだ
357デフォルトの名無しさん:2012/10/30(火) 23:28:41.45
だれかすまんが、なんで木が1次元配列になってんのか説明してくれ
358デフォルトの名無しさん:2012/10/30(火) 23:34:10.39
>>356
それただ単に、
一次元の配列をrotateしただけ…
359桃白白:2012/10/30(火) 23:35:28.43
>>357
大丈夫だ問題ない、桃白白にもそれはわからない。
360デフォルトの名無しさん:2012/10/30(火) 23:49:21.95
>>357

A[0]
A[1]A[2]
A[3]A[4]A[5]A[6]
...................

こんなイメージですかね?
361デフォルトの名無しさん:2012/10/30(火) 23:54:54.28
Heapなんかも1次元配列だけど実質木構造だしな
362デフォルトの名無しさん:2012/10/30(火) 23:58:14.40
マジで言ってんのかよ……
いまの計算機、木構造をそのまま入れれんのか?

実質もクソもなんも
最終的なデータの形態なんてメモリにならんだビットのコマ切れじゃん
それが意味あるように見えてる、見せてるだけだろ……
363デフォルトの名無しさん:2012/10/31(水) 00:00:44.98
木作る時は
配列複数作ったほうがいいのか?

364デフォルトの名無しさん:2012/10/31(水) 00:02:33.64
>>361
ヒープは木の構造は配列サイズで確定されて、
操作が内容のスワップだけだから配列で表現できるってだけだろ。
AVLで同じことやろうとしたら、空き要素が大量にいるだけじゃなくて、
回転したとたんに要素の大移動しなきゃならん。
365デフォルトの名無しさん:2012/10/31(水) 00:12:45.84
ならねーよカス
366287:2012/10/31(水) 00:25:55.53
>>289
返事遅くなりましたが、ありがとうございます
明解C言語はすぐにでも試し読みできそうなので、見てみたいと思います
367デフォルトの名無しさん:2012/10/31(水) 00:34:25.72
>>364
じゃぁポインタ?
368デフォルトの名無しさん:2012/10/31(水) 01:11:32.67
>>364
もちろん一次元配列で平衡木は非現実的だよ
ヒープソートがどういう動きをしてるのか分からない人がいるのでちょっと触れてみた
369デフォルトの名無しさん:2012/10/31(水) 15:10:34.51
>>362
うん、だからわざわざ連続領域の配列に持たせる意味がないんだよね
370デフォルトの名無しさん:2012/10/31(水) 18:47:31.98
int x;

while(1){
x=getchar();
if(x==EOF) break;
printf("%d",x);
putchar(x);}
char型の理解を深めようと色々試していたところ
これの%dを%sにして出来たファイルを実行したらセキュリティーソフトからウィルス警告来たのですが
無視しても大丈夫ですか?
371デフォルトの名無しさん:2012/10/31(水) 19:16:16.56
ウイルス作成罪キター


ってのは冗談だが、"%s" に文字(char)とか整数(int)を与えちゃいかんよ。
いまどきのコンパイラなら警告オプションちゃんとつければ、
だめよって警告してくれるはず。
372デフォルトの名無しさん:2012/10/31(水) 21:08:53.88
セキュリティソフトってハッシュで確認するだけのもんだと思ってたわ
373デフォルトの名無しさん:2012/11/01(木) 03:31:59.36
入門用のコード書いてコンパイルしたらAvast!に隔離されちゃうことがあるな

下のコードを 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;
}
374デフォルトの名無しさん:2012/11/01(木) 06:28:00.03
>>370
話は署で聞こうか
375デフォルトの名無しさん:2012/11/01(木) 10:23:17.42
scanfは糞
376デフォルトの名無しさん:2012/11/01(木) 11:01:29.54
一律に糞扱いして思考停止するんじゃなくて、
使える条件が整えば便利に使えると思うよ
377デフォルトの名無しさん:2012/11/01(木) 11:18:36.17
条件確認して慎重にコーディングしなきゃダメな時点でクソだろ
それで得られるメリットがめんどくささを凌駕するならまだしもそんなこともないしな
378デフォルトの名無しさん:2012/11/01(木) 11:19:57.17
sscanf()はけっこう使う
379デフォルトの名無しさん:2012/11/01(木) 11:33:34.87
まぁ、sscanf()も入力が想定できるケース以外では出番が減るけどね。
380デフォルトの名無しさん:2012/11/01(木) 11:48:23.76
バッファ突破の話とは別で
scanf は解釈に失敗した場合に巻き戻せないのが難点
sscanf ならバッファを書き換えない限りいけるので まだ融通が利く
381デフォルトの名無しさん:2012/11/01(木) 11:53:19.66
実務では結局他のパーサー使うんでスキャンエフの出番はないです
382デフォルトの名無しさん:2012/11/01(木) 11:59:12.35
scanf は糞。論外。
sscanf は入力行のチェックをしてから通す。常識。
383デフォルトの名無しさん:2012/11/01(木) 12:54:04.04
>>380
ungetc
384デフォルトの名無しさん:2012/11/01(木) 13:06:15.02
ところで標準のファイルストリームで扱えるサイズを超える巨大ファイルをOSのAPIなしに扱うにはどうすればいいんすか?
シーケンシャルアクセスだけですべて解決する問題なら気にしなくていいのだけどランダムアクセスしたい時に困ります
385デフォルトの名無しさん:2012/11/01(木) 13:12:16.66
longが32bitのシステムでfseek(3)じゃ足りないってこと?
POSIXにはoff_tで使えるfseeko(3)があるけど。
386デフォルトの名無しさん:2012/11/01(木) 14:43:07.25
fseek64 とか
387デフォルトの名無しさん:2012/11/02(金) 05:04:27.14
Cの仕様が時代についていけなくなりつつあるね。
拡張関数とかでお茶にごしてるけど。
388デフォルトの名無しさん:2012/11/02(金) 05:34:39.47
C の仕様というよりは処理系の実装上の問題では?
>>384 は long を必要分だけ拡張すれば済む話。

sizeof(int)=4 はいいとして
sizeof(long)=4 とした処理系が跋扈し、というかそれ以外の処理系とライブラリが主流にならなかった点に問題がある。

C の規格自体にはそのあたりに縛りはないから「時代にとらわれる」ということは基本ない
389デフォルトの名無しさん:2012/11/02(金) 08:44:02.17
>>384
外部設計を見直し、ランダムアクセス不要にする
390デフォルトの名無しさん:2012/11/02(金) 10:16:18.61
標準関数はおまけに過ぎない
拡張こそ肝心で、これを妨げないことが標準の使命だ
391デフォルトの名無しさん:2012/11/02(金) 10:21:30.89
普通にfseekoじゃないのか
392デフォルトの名無しさん:2012/11/02(金) 20:15:39.41
うん
393デフォルトの名無しさん:2012/11/02(金) 23:39:09.97
少なくとも何バイトのファイルを扱えるみたいなルール決まってないの?
整数みたいに少なくとも幾つまでは安心して使える的な
394デフォルトの名無しさん:2012/11/02(金) 23:44:22.69
C言語としては、それを決めてはいけない側だ
395デフォルトの名無しさん:2012/11/02(金) 23:48:58.28
なら一キロのファイルも開けない環境があってもいいわけか
標準準拠だと何もできないなこの言語って
396デフォルトの名無しさん:2012/11/02(金) 23:52:03.54
なんでそうなる
実装の自由度が広いって事だ
言語ができた当時の環境やコンパクトな実装がC言語と名乗れなくなるだろ
397デフォルトの名無しさん:2012/11/03(土) 00:10:16.68
言語けなしたって自分は偉くならないよ
398デフォルトの名無しさん:2012/11/03(土) 00:56:37.44
Qzとかいうクズに言ってやれ。
399デフォルトの名無しさん:2012/11/03(土) 01:13:57.77
Qが言語をけなしたことがあるとでも?
400デフォルトの名無しさん:2012/11/03(土) 02:01:19.49
うん、そうだよ
401デフォルトの名無しさん:2012/11/03(土) 02:23:47.41
単に事実を述べただけでは?
402デフォルトの名無しさん:2012/11/03(土) 03:29:32.30
こんばんは。
初めての質問です。
C言語で簡単な自己複製プログラムを作るにはどうすればいいでしょうか。
クワインのような自身のソースコードを出力するプログラムではなく、複製後実行までするプログラムです。
アセンブラやC言語の知識が必要だと思いここに書き込みました。
よろしくお願いします。
403デフォルトの名無しさん:2012/11/03(土) 05:52:01.05
>>402 使ってるCコンパイラは何?どこの?
404デフォルトの名無しさん:2012/11/03(土) 07:16:03.64
>>402
宿題スレで回答できるくらいのレベルになればいいんじゃね?w
405デフォルトの名無しさん:2012/11/03(土) 11:09:51.34
if ( ...... ){
} else if ( ..... ){
.... ;
} else {
... ;
}
for ( i=0; i<N; i++ );
printf ( "....\n" );
np = (HOGE *)malloc( sizeof(HOGE) );

などなど、皆さんは空白入れたり、入れなかったりどうしていますか?
406デフォルトの名無しさん:2012/11/03(土) 11:11:25.38
好きにしています。
407デフォルトの名無しさん:2012/11/03(土) 11:15:03.41
else と if の間の空白は取ると意味が変わるから入ってるときは入れたままにしなきゃだめ
408桃白白:2012/11/03(土) 11:27:38.83
桃白白はこうだな、とにかく条件式の場所をそろえるべきだと思うの。

if (0) {
} else if (a == a) {
  hogehoge;
} else if (a == b) {
  fugafuga;
} else if (a == c) {
  taopaipai;
}
409デフォルトの名無しさん:2012/11/03(土) 11:27:54.65
>>405
K&Rスタイル
if (), while (), switch () と制御文のキーワードの後は空白を入れる
func() 関数の後には空白を入れない
関数の引数に関しては func(a, b, c) 引数の区切りの, の後ろにのみ空白をいれる
カンマ演算子以外は演算子の前後に空白があるようにする。カンマ演算子の場合は後ろに空白があるようにする

そんなところかなあ
410デフォルトの名無しさん:2012/11/03(土) 11:29:11.78
おおこれは斬新
411デフォルトの名無しさん:2012/11/03(土) 11:40:45.48
識別子が長くなってしまった場合はどこで改行してる?

int x = looooooooooooooooooooooooooooooooooooooooong_type.functiooooooooooooooooooooooooooooooooooooooon
(a1, a3);

int x = looooooooooooooooooooooooooooooooooooooooong_type
.functiooooooooooooooooooooooooooooooooooooooon(a1, a3);

int x = looooooooooooooooooooooooooooooooooooooooong_type.
functiooooooooooooooooooooooooooooooooooooooon(a1, a3);
412デフォルトの名無しさん:2012/11/03(土) 11:42:29.48
どれか選べといわれたら演算子の後で改行かな
413デフォルトの名無しさん:2012/11/03(土) 11:55:51.37
jf 内の条件式が || && の連結で長くなる時にどこで改行するかスタイル
末尾に || && 若しくは 行頭で || &&
414デフォルトの名無しさん:2012/11/03(土) 13:54:35.64
続きであることが一目瞭然になるため
行頭で || &&
415デフォルトの名無しさん:2012/11/03(土) 14:24:51.28
C学習中のものですが、質問です
コンパイラは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);
}
とすると実行されます。この理由がわかりません。元の文も一応大きく見て一つの文であると思うのですが
何故なのか分かり兼ねます。よろしければ、解説していただきたいのですが。

初歩的な質問で申し訳ありません
416 ◆QZaw55cn4c :2012/11/03(土) 14:40:58.42
>>415
http://codepad.org/NZ3mx5Kd
実行されているようですよ。環境など別の理由がありそうですね。
417デフォルトの名無しさん:2012/11/03(土) 14:44:08.66
>>415
3 6 9 12 15 18 21 24 27
でしょ。問題ない。
ただ、for文もif文も{ }でくくっておいた方がいいのでは?
どうしてもというスタイルにこだわりがなければ。
418デフォルトの名無しさん:2012/11/03(土) 14:45:37.21
>>415
単純にMSVCがCコンパイラとしてクズだってことじゃね
419デフォルトの名無しさん:2012/11/03(土) 14:52:56.41
VC 2010でコピペして実行したが>>417の結果が出たぞ
420415:2012/11/03(土) 14:57:45.60
>>416
>>417
>>418
>>419

質問に答えて頂いて、ありがとうございます
私は、普段ビルド後はデバッグで結果を確認しているのですが、
実行に問題無いということでしたので、試しにデバッグでは無くそのまま実行してみたところ
確かに問題なく、実行されました。つまり、VC++のデバッグ等がうまくいかない理由なのかもしれません

デバッグ時は、return 0;の位置にブレイクポイントをおいてデバッグしています。

やはり、こういった問題や、読みやすさを考えるなら、>>417さんの言うとおり、
for文、if文も{}で括ることが推奨されるのでしょうか

何にしても、普通に実行すれば問題は無かったのに、わざわざ皆さんの貴重な時間を割いてしまって申し訳ありません
感謝しております
421デフォルトの名無しさん:2012/11/03(土) 14:58:11.78
じゃあ、ただのtypoだな
422デフォルトの名無しさん:2012/11/03(土) 15:04:35.14
例えば、for の行末や、if の行末にセミコロンがあったとかな。
初心者にはありがちかも。
423415:2012/11/03(土) 15:13:43.25
>>421
>>422

確認してみましたが、タイプミスでは無いかと思います。
全く同じソースコードでも、通常実行時は問題がありませんが
デバッグ時は出力されません
424デフォルトの名無しさん:2012/11/03(土) 15:21:57.66
>>423
きっとバグってるんだね
頭とか
425デフォルトの名無しさん:2012/11/03(土) 15:23:06.11
>>420
単純にフラッシュされてないだけじゃね?
ブレポと標準出力は相性悪い気がする。
426デフォルトの名無しさん:2012/11/03(土) 16:00:30.11
>>423
vc2010のバグだね。
ループの終わりが↓になるけど、>>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)
427デフォルトの名無しさん:2012/11/03(土) 16:02:49.91
バカっぽい略語(ブレポ)使う奴の回答は信頼性が低いという現象がまた観測されてしまった。
428デフォルトの名無しさん:2012/11/03(土) 16:12:29.31
2chで信頼性とか
429デフォルトの名無しさん:2012/11/03(土) 16:18:39.74
バカっぽい略語つかう奴とクソなコテハンの回答は読み飛ばす。
これでかなり捗る。
430デフォルトの名無しさん:2012/11/03(土) 16:39:05.00
>>429
もしかして、hoge 嫌い?
chromeをチョロメとか言われたら気分を害すタイプか?
431 ◆QZaw55cn4c :2012/11/03(土) 17:03:19.10
>>429
略語の方は関係ないと思うけどコテハンを読み飛ばすのは効果的ですね
432415:2012/11/03(土) 18:03:47.54
>>426
バグでしたか

回避策としては、{}を付けるか、ブレークポイントろ使わないということになりそうですね
433デフォルトの名無しさん: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
434デフォルトの名無しさん:2012/11/03(土) 18:49:17.62
10倍にしてintに入れて1ケタづつ表示してはどう?
435デフォルトの名無しさん:2012/11/03(土) 19:12:30.47
>fDuty = giDuty / 1023 * 100;
それ以前にfDutyに整数しか入ってなくね?1023.0とか1023fとかにしないと

案としては434だろうね
int Duty = giDuty*1000/1023;
sb1602_int(Duty/10);
sb1602_str(".");
sb1602_int(Duty%10);
みたいなイメージか
436デフォルトの名無しさん:2012/11/03(土) 19:32:14.72
>>434
>>435
こんなやり方があるんですね。
ちょっと試してきます!
437デフォルトの名無しさん:2012/11/03(土) 21:35:12.15
うん、いいよ
438デフォルトの名無しさん:2012/11/03(土) 22:20:49.42
>>433
そういうプラットフォームでprintf系の関数を使ったり、掛け算や割り算、ましてや浮動小数点を使うなんてバカなの?
439デフォルトの名無しさん:2012/11/03(土) 22:37:23.07
コンパイルは出来るだろ

って釣り?
440デフォルトの名無しさん:2012/11/03(土) 22:43:15.90
そんなこまかい事を
441デフォルトの名無しさん:2012/11/03(土) 23:12:08.18
釣りだな
442デフォルトの名無しさん:2012/11/03(土) 23:30:58.30
ターゲットをPICに設定していたら、xxxx.objができませんみたくなるんじゃね?
え、違う?
443デフォルトの名無しさん:2012/11/03(土) 23:44:19.17
うん、違うよ
444デフォルトの名無しさん:2012/11/04(日) 00:27:36.15
>>438
そういうプラットフォームとか言うが、PIC も色々あるぞ。

printf( ) 系のライブラリとか浮動小数点あたりはまだ同意するけど、
掛け算、割り算まで使うなとか言う 8bit 時代から進化できない爺は
早くリタイアしてくれないかなぁ。
445433:2012/11/04(日) 02:29:35.21
>>434
>>435
遅くなりましたが今確認とれました。
無事動作しました。
ありがとうございました。
マイコン使うなんて初めてで標準関数がこんなに重いものだとは思いませんでした。
使えなくなって初めて有り難味がわかるものですね。

>>439
>>442
リンク中かもしれません。
確かpicc.exeプログラム領域が足りないって怒られてました。
もうログ流れちゃったので具体的な文は出せないですが。
446433:2012/11/04(日) 03:01:14.02
>>438
>>444
試しに別な関数の乗算をシフト演算でやってみましたがプログラム領域は変わりませんでした。
コンパイラが最適化してくれてるんですかね。
乗算のままの方が読みやすいのでそのままにしておきます。
447デフォルトの名無しさん:2012/11/04(日) 10:04:16.75
>>407
意味が変わるっていうか、コンパイルエラー吐くだろ?
いまは違うんか?
448デフォルトの名無しさん:2012/11/04(日) 10:32:09.66
やってみればすぐ判ることを
449デフォルトの名無しさん:2012/11/04(日) 13:18:07.26
elseif(x == 0)
;
エラーにならない例。
450デフォルトの名無しさん:2012/11/04(日) 13:47:39.13
>>449
コンパイルエラーだろ
451デフォルトの名無しさん:2012/11/04(日) 13:50:51.17
コンパイルでは警告どまりで、そのあとリンクエラーじゃね?
452デフォルトの名無しさん: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です。
ポインタへのポインタとか、そのあたりの認識ミスだと思うのですが、
自分なりに考えても、これであってると思うので手詰まりです。
お願いします。
453452:2012/11/04(日) 15:38:58.12
やっぱりポインタへのポインタなのかな
その方向で一度書き直してみます。

もし間違ってたらアドバイスを……
454デフォルトの名無しさん:2012/11/04(日) 15:45:25.10
どうみてもポインタのポインタです
455デフォルトの名無しさん:2012/11/04(日) 15:49:30.02
>>452
一番簡単なのは、
>3.関数内での代入 p=ptmp;
のところで、
*p = *ptmp
とすれば多分オケ
456デフォルトの名無しさん:2012/11/04(日) 15:56:00.44
それじゃ *p をたぐった時に死ぬんじゃないの?
457デフォルトの名無しさん:2012/11/04(日) 16:11:29.35
これはひどい
458デフォルトの名無しさん:2012/11/04(日) 16:13:41.06
>>456
すまぬ、領域の確保までしたいのか
よく見てなかったわ

すると、ダブルポインタしかないね
459デフォルトの名無しさん:2012/11/04(日) 16:29:25.19
>>452
ソースがあればはっきりするが、関数から戻った時に、ptempの内容が破壊されてるんでは?
460デフォルトの名無しさん:2012/11/04(日) 16:37:42.58
>>452です

プログラムが大きいので部分的にしか導入できてませんが、

void func(struct STRUCT **p)に変更し、
関数への引渡しはfunc(&p)、
関数内での処理はp=&ptmp

となるでしょうか。
これで一応回りそうなのですが。
461デフォルトの名無しさん:2012/11/04(日) 16:43:03.85
>>460
ローカル変数のアドレスを外に返したらあかん。
462デフォルトの名無しさん:2012/11/04(日) 16:44:19.81
あと、*p = &ptmp
463デフォルトの名無しさん:2012/11/04(日) 16:57:10.56
>>462
関数内のpは、目的ポインタのアドレス確保のためのポインタですので、
p=&ptmpでいいのではないでしょうか

>>461
実体部のアドレスに書き直しました
464452:2012/11/04(日) 17:02:29.74
あれ

*p=ptmpではエラーが出ず
p=&ptmpではエラーが出る
465デフォルトの名無しさん:2012/11/04(日) 17:04:54.50
あ、ptmp は元々ポインタなのか。
それなら >>462 は大嘘で *p = ptmp かな。
466デフォルトの名無しさん:2012/11/04(日) 17:07:32.54
なんかいろいろ整理できてないですね

とりあえず*p=ptmpで通りました
467デフォルトの名無しさん:2012/11/04(日) 17:09:39.34
まあ、本能の赴くままに書けばいいよ...
468デフォルトの名無しさん:2012/11/04(日) 17:09:42.93
整理できてないのは自分の説明です。
ありがとうございました
469デフォルトの名無しさん:2012/11/04(日) 17:10:38.40
>>452
こうか?
#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;
}
470デフォルトの名無しさん:2012/11/04(日) 17:17:48.05
イクルオネルスオブヌン
471デフォルトの名無しさん:2012/11/04(日) 18:24:48.73
論よりソース。日本語でぐだぐだ説明するよりソースを出すのが
一番早い。
472 ◆QZaw55cn4c :2012/11/04(日) 19:07:51.12
たしかに。
473デフォルトの名無しさん:2012/11/04(日) 19:09:16.49
>>469
おまえ ioccc に出てみないか?
コードがキモさの素質で漲ってるぞ
474デフォルトの名無しさん:2012/11/04(日) 19:09:40.02
>struct STRUCT ptmp;

この辺とかあんまりだろw
475デフォルトの名無しさん:2012/11/04(日) 19:18:38.32
まあまあ、押さえて押さえて。
初心者の学習意欲を削ぐようなことを言うなや。
476472:2012/11/04(日) 19:24:54.29
>>473
joccc だったらいいところまでいきそうですね<私
477デフォルトの名無しさん:2012/11/05(月) 01:33:28.59
初歩的な質問ですみません
数値の範囲指定なんですがどのように書けば良いのでしょうか?
例えば0以上〜8未満、5以上7以下と言う感じです
入門書を見てるのですがいまいちわからないもので・・・よろしくお願いします
478デフォルトの名無しさん:2012/11/05(月) 01:37:48.85
>>477

xが0以上かつ8未満

x>=0 && x<8


xが5以上かつ7以下

x=>5 && x<=7




みたいな?
479デフォルトの名無しさん:2012/11/05(月) 01:38:54.34
>>477
0 <= x && x < 8
480478:2012/11/05(月) 01:39:18.75
訂正

x>=5 && x<=7
481デフォルトの名無しさん:2012/11/05(月) 02:30:54.70
「C++ クラスと継承」という本のC言語の復習パートで疑問があり、
こちらで質問させてください。

http://codepad.org/bCnoXDJM

上記のようなコードで、構造体のポインタを戻り値で返す説明をしているのですが、
struct Jugyoin* GetJugyoin() の構造体の関数で、なぜポインタにする必要があるのでしょうか?
482ビル・ジョブス:2012/11/05(月) 02:46:48.56
別にポインタでなくてもいいよ。
でもポインタなら4バイトとかでstaticな構造体のアドレスだけ返して高速、
ポインタじゃないとstaticな構造体のコピーを返すから低速、と言うかコンパイラが自動生成するコピーコードと受け側で実体分のメモリを確保する必要があるからこの場合無駄だらけかと。
483デフォルトの名無しさん:2012/11/05(月) 02:47:20.23
>>481
その本の質題の意図がわからないので、そのコードをだけを踏まえた一般論ですが、パフォーマンスでしょう。
ポインタなら大抵4〜8バイトのコピーで済みます。
484デフォルトの名無しさん:2012/11/05(月) 02:50:15.32
88バイトコピーするのいやだし
485ビル・ジョブス:2012/11/05(月) 02:57:23.83
しかし、関数名にセンスの欠片も無いな
struct Jyugyoin* GetJyugoin();
ではなく、
struct Jyugyoin* getTanaka();
だろ
486デフォルトの名無しさん:2012/11/05(月) 03:02:32.00
矢沢 久雄の本か
487デフォルトの名無しさん:2012/11/05(月) 03:39:58.73
>>478-480
ありがとうございます!お陰でなんとか形になりました
あと、もう一つ質問したいんですが少数第二位まで判定する場合はどのようにすれば良いのでしょうか?
x>=5.0 && x<=7.0 と書いているのですが7.5など入力すると切り捨てで7の扱いになってしまいます・・・
488デフォルトの名無しさん:2012/11/05(月) 03:41:33.47
少数第一位でしたすみません
489ビル・ジョブス:2012/11/05(月) 03:51:02.30
float f;
if (f > 7.5f && f < 7.9f)・・・

とかでダメなの?
ちなみに変数fとリテラルの最後のfは無関係だから
490デフォルトの名無しさん:2012/11/05(月) 08:10:05.90
xが浮動小数点型じゃないオチ
491デフォルトの名無しさん:2012/11/05(月) 10:53:08.41
>>485
そんなもん人の勝手だろう
ましてやただのコード片にセンスも糞も必要なわけない
492デフォルトの名無しさん:2012/11/05(月) 11:12:25.64
どうせ突っ込むなら Jyugyoin じゃなくて Employee とかでしょ。
493デフォルトの名無しさん:2012/11/05(月) 11:45:50.45
>>484
そこでケチってマルチスレッドで泣くパターン
関数呼び出しをスレッドで排他すればかわせるけどね
494デフォルトの名無しさん:2012/11/05(月) 11:57:25.53
何かしらケチつけないと気が済まないって感じ
495デフォルトの名無しさん:2012/11/05(月) 12:21:17.04
ケチつけるしか出来ないんじゃないの?
自分ではいいプログラム組めないもんだからさ
496デフォルトの名無しさん:2012/11/05(月) 12:24:23.76
他人を貶めて自分が偉くなったような錯覚に浸る頭の悪い奴ってことだな
497デフォルトの名無しさん:2012/11/05(月) 13:18:52.75
>>493
構造体をコピーして返しても、このコードならロックは不要。
マルチスレッドにしても何の問題もない。
シロートは知ったかぶりしないで余計な口出ししない方がいいぞ。
498デフォルトの名無しさん:2012/11/05(月) 13:33:05.59
またおかしなのが出た
499デフォルトの名無しさん:2012/11/05(月) 22:23:18.36
先輩はすーぐ最後の一行を書きたがるねー
500デフォルトの名無しさん:2012/11/05(月) 22:30:38.93
はじめの2行もおかしい気がするけど
501デフォルトの名無しさん:2012/11/05(月) 23:11:05.87
>>493 が毎回田中を初期化する仕組みを改善しないのが悪い。
502デフォルトの名無しさん:2012/11/05(月) 23:23:36.83
昔から田中と畳は新しいほうがいいっていうよ
503デフォルトの名無しさん:2012/11/06(火) 13:07:14.02
extern char *tanaka; //何やってるかわからない
char matsui[1]; //ろくに使えない
504デフォルトの名無しさん:2012/11/06(火) 16:44:01.05
char *str_chr(char *str,int c)
{ 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 strAを(,str)と書いたらダメでした。
上記の通りに配列で宣言して配列の先頭アドレスを引数にしないと停止するのですが何故なのでしょうか?
505デフォルトの名無しさん:2012/11/06(火) 16:57:27.11
scanf の %s は文字列を入力しますよ
実入力が1文字しかなくても文字列として読み込みますよ

char str[10];
scanf("%s", str);

char str;
scanf("%c", &str);
506デフォルトの名無しさん:2012/11/06(火) 17:09:51.74
ダメでしたの具体的に何がどうダメなのかが伝わらないので
答えようがない。
507デフォルトの名無しさん:2012/11/06(火) 17:31:13.19
>>506

>>504の@Aに書いてあるようにして実行すると、
セグメンテーション違反が起きる。
508デフォルトの名無しさん:2012/11/06(火) 17:38:51.20
>>506
コード見てわからない無能は答えようとしてくれなくて結構です
509デフォルトの名無しさん:2012/11/06(火) 17:54:24.90
char に %s したらあかんやろ
しかも & なしで str だけ渡したら不定じゃハゲ

# 無能さんすごい!
510デフォルトの名無しさん:2012/11/06(火) 18:01:54.59
str_chr()関数の第二引数にintを受け取るのに
str(ポインタ)を渡したら動かないのは当然。
511デフォルトの名無しさん:2012/11/06(火) 22:33:13.20
>>504
str_charの第二引数はint型なのにchar型を渡そうとしてるからint→charに引数はへんこうしたらいいよ

scanfで文字を一つ入力するのに%sではエリア破壊を引き起こすから、getcでいいんじゃね?

str_charの戻り値はnullであることもあるので(この例ではエラーにはならんとおもうが)判定くらいは
した方がいいね。
512デフォルトの名無しさん:2012/11/06(火) 23:05:45.60
>>504>>511
>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;
}
513504:2012/11/06(火) 23:37:53.84
皆さん解説ありがとうございます。
自分の書いたプログラムと回答の差異である宣言と呼び出しにばかり注目してscanfの問題に気づきませんでした。
char型は%sと短絡的に考えていて、文字列として読み込むことを意識していなかったようです。

>>511
一文字入力にはgetcがありましたね。scanfばかり使うので、入力はscanfで頭が固まっていました。
int型については私も疑問に思っていましたが(本にintと書いてあるので)、指摘があると言うことは何かのテクニックではないようですね。
514デフォルトの名無しさん:2012/11/06(火) 23:57:56.68
Cで関数にcharを渡すと、自動的にintを渡すことに解釈される。
515デフォルトの名無しさん:2012/11/07(水) 00:40:22.50
といいますと?
516デフォルトの名無しさん:2012/11/07(水) 00:52:27.74
いけえ!インテグラルプロモオショオオオオンンッ!!!
517デフォルトの名無しさん:2012/11/07(水) 03:12:17.82
処理なしは、どの書き方をしてます?

while ( 条件 );

while ( 条件 )
;

while ( 条件 ){
;
}
518デフォルトの名無しさん:2012/11/07(水) 03:18:40.77
Windowsだったら
#include <conio.h>
getchar(); や kbhit();
があって、楽なんですけどね。
Linuxではどうすればいいのか…。

ところで余談かつ、散々既出だと思うけど、
char str[10];
scanf("%s", str);
で半角10文字以上入力するとバッファがあふれるので、
文字列の入力は
fgets(str, sizeof(str)-1, stdin);
などを使いましょう。
519デフォルトの名無しさん:2012/11/07(水) 03:21:01.76
>>517
私は、明示的に3番目の書き方します。
520デフォルトの名無しさん:2012/11/07(水) 04:00:27.89
while(b)
{
 Sleep(300);
}
521デフォルトの名無しさん:2012/11/07(水) 04:01:50.75
char str[10];
fgets(str, sizeof(str), stdin);
522デフォルトの名無しさん:2012/11/07(水) 04:16:29.50
>>518
訂正
×> #include <conio.h>
  > getchar(); や kbhit();
  > があって、楽なんですけどね。
○> #include <conio.h>
  > getch(); や kbhit();
  > があって、楽なんですけどね。

>>521
ああ、そちらが正解ですね。
fgetsは終端を考慮していますね。
訂正ありがとう。
523 ◆QZaw55cn4c :2012/11/07(水) 04:37:00.66
>Windowsだったら
>kbhit();
>Linuxではどうすればいいのか…。

http://hibari.2ch.net/test/read.cgi/tech/1289715349/320
http://codepad.org/WfSnugZg
524デフォルトの名無しさん:2012/11/07(水) 05:11:48.68
>>523
出来ました。
ありがとうございます。

fcntl();でgetchar();を制御するのかな。
もっと精進します。
525デフォルトの名無しさん:2012/11/07(水) 08:46:26.07
>518
散々既出だと思うけど、
char str[10];
scanf("%9s", str);
で、バッファオーバーランは防げる。
http://d.hatena.ne.jp/eel3/20090720/1248017333
scanfは他にも問題あるから薦めないけど。
526デフォルトの名無しさん:2012/11/07(水) 08:55:53.71
東京理三、慶応医学部→エース
東京理一、大阪医学部→レギュラー
早慶理工、新潟医学部→補欠
駅弁医学部、秋田医学部→二軍
その他→死刑、生きる価値なし
527デフォルトの名無しさん:2012/11/07(水) 09:23:23.95
>>517
処理ないなら書かないだろ
528デフォルトの名無しさん:2012/11/07(水) 11:05:10.18
釣られないぞ
529デフォルトの名無しさん:2012/11/07(水) 12:09:21.24
素朴な疑問なんですが、>>518みたいな典型的な問題について悩まなくても簡単に解決してくれるライブラリは存在しないのですか?
他の言語だとキーの入力くらいは安全かつ便利なライブラリが存在しているのが普通だと思いますが、
どうしてC言語にはそのようなライブラリがないのでしょうか?これだけの利用者がいるのなら既にそういったノウハウが蓄積されたライブラリがあってもおかしくないと思うんですが
530デフォルトの名無しさん:2012/11/07(水) 12:15:53.92
Cの標準関数は歴史的な経緯で問題の残る仕様があったりする。
処理系ごとの独自拡張ライブラリを使うのがいい。
531デフォルトの名無しさん:2012/11/07(水) 12:52:17.16
>529
boost
532デフォルトの名無しさん:2012/11/07(水) 12:54:02.79
>>529
>どうしてC言語にはそのようなライブラリがないのでしょうか?

OS というかハードウェアによるから
そういうのは標準には入れないだけで
標準にこだわらなければライブラリは在る
533デフォルトの名無しさん:2012/11/07(水) 13:01:25.55
>>529
ncurses
534デフォルトの名無しさん:2012/11/07(水) 13:31:11.29
>>一連の文字入力
いやいや、scanf()でも"%c"もあるけどな。
"%s"の代わりに"%9s"を使えばバッファオーバフローの問題もないけどな。

>>処理なし
私は自分のコード内では1番目、他人もメンテナンスする前提のコード内では3番目。

>>仮引き数の型のchar
昔のプロトタイプ宣言のない時代のCではcharを渡そうとしてもintに昇格せざるを得なかったから、
charの引き数は敬遠されたと言う経緯はあるね。
535デフォルトの名無しさん:2012/11/07(水) 14:19:34.11
>>529
その程度のものなら一回書いたら終わりだから。
536デフォルトの名無しさん:2012/11/07(水) 14:55:32.10
ファイルの後ろから一行ずつ読み込みしたい、という場合に使う関数はC言語には用意されてないのでしょうか?
後ろから改行が見つかるまでシークして一行読み込み、と泥臭く栗返すしか無いのでしょうか
537デフォルトの名無しさん:2012/11/07(水) 14:59:08.06
頭から1行単位で全部読む+記憶する
記憶列を逆順に、後ろから1行づつ喰いたいとしている処理へ渡す
538デフォルトの名無しさん:2012/11/07(水) 15:01:35.95
つ[/bin/tail]
539デフォルトの名無しさん:2012/11/07(水) 16:54:36.13
>>536ではないけど
なるほど
tailのソース読んでパクればいいのか
GPLには要注意だけどBSD版もあるし
540デフォルトの名無しさん:2012/11/07(水) 20:43:08.61
RSTみたいに自分の陣地の様子は見れるのに
他の敵陣の様子は見れないのにも関わらず、いつのまにか繁栄してたりすることあるけど
これはc言語におけるマルチスレッドが関係してるの?
541デフォルトの名無しさん:2012/11/07(水) 20:47:13.64
普通に無限ループでぐるぐる回りながら自分の陣地と敵の陣地で毎回処理が実行されてるだけだと思うが
542デフォルトの名無しさん:2012/11/07(水) 21:09:06.27
>>538
tacじゃないかな。
543デフォルトの名無しさん:2012/11/07(水) 21:37:02.98
int main(void) {
  int 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;
}
544デフォルトの名無しさん: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にならないんですか
545デフォルトの名無しさん:2012/11/07(水) 21:38:35.12
>>544
int* だから
546デフォルトの名無しさん:2012/11/07(水) 22:00:30.76
ポインタ同士の引き算は、その間の要素の個数を返す
547デフォルトの名無しさん:2012/11/07(水) 22:35:36.63
1足したのに差が1っておかしい、4にならない!ってどんなわがままか。
548デフォルトの名無しさん:2012/11/07(水) 23:58:18.78
>>536
シークは、おそい。リストをつかったら、はやくなる。
最後に追加した行から、順によみとる
549デフォルトの名無しさん:2012/11/08(木) 00:02:58.43
ファイルが何GBあっても?
550デフォルトの名無しさん:2012/11/08(木) 00:55:51.29
初心者のとき、おれがリストをつかってかいたプログラムが、
fseek()をつかったプログラムより、はやかった。よくおぼえてる。
551デフォルトの名無しさん:2012/11/08(木) 10:35:12.55
ファイル形式やサイズ、どう読み取るのか、実行環境のスペックなどによるとしか言えないな
552デフォルトの名無しさん:2012/11/08(木) 10:36:38.78
なんでストリームはひとつ読み取ると次の要素に進んでしまうんですか?
インクリメントと読み取りは分けた方がよい設計に思えるのですが?
553デフォルトの名無しさん:2012/11/08(木) 10:40:22.48
ストリームだもの
         みつを
554デフォルトの名無しさん:2012/11/08(木) 10:52:22.93
>>552
その設計でAPI作って、ちょっとしたプログラム書いてみてよ
555デフォルトの名無しさん:2012/11/08(木) 11:32:07.91
ベクターみたいなインターフェイスでストリームにアクセスしたいです
556デフォルトの名無しさん:2012/11/08(木) 11:39:23.08
ストリームってのは流れだから
557デフォルトの名無しさん:2012/11/08(木) 11:50:07.41
今時テープを再現する意味はないのでは?
558デフォルトの名無しさん:2012/11/08(木) 11:50:10.88
>>555
それをCに期待するのは筋違いと言うものだ。
559デフォルトの名無しさん:2012/11/08(木) 11:52:50.90
>>557
だから、君の考えるAPIを使って既存の読み込み処理を書き換えてご覧よ。
560デフォルトの名無しさん:2012/11/08(木) 12:02:20.96
>>557
ネットワークから流れてくるデータなんかもストリーム。
561デフォルトの名無しさん:2012/11/08(木) 12:07:14.65
キーボードから人間が入力する文字の流れもストリーム。
終わりがあるのかないのか、次がいつ流れてくるのか、そう言う事には左右されない抽象的な概念。
ベクターをストリームとして扱う事はできるけど、逆は無理。
562デフォルトの名無しさん:2012/11/08(木) 15:06:27.67
fseek は 512 の整数倍を指定しないと遅くなるお
563デフォルトの名無しさん:2012/11/08(木) 15:35:14.55
試してみたいからベンチマーク用のプログラムください
564デフォルトの名無しさん:2012/11/08(木) 15:53:34.23
512じゃなくてBUFSIZの倍数じゃないの?
565デフォルトの名無しさん:2012/11/08(木) 16:07:36.04
MS-DOS時代以前の話だがな
566デフォルトの名無しさん:2012/11/08(木) 17:24:37.17
言語仕様じゃなくて完全に実装依存の話だな。
567デフォルトの名無しさん:2012/11/08(木) 17:27:26.32
コンパイラの実装の話でさえない
568デフォルトの名無しさん:2012/11/08(木) 17:50:00.06
しかもいまどきはディスクみたいな遅いデバイスにはキャッシュが乗っているから有意差が出ない。
569デフォルトの名無しさん:2012/11/08(木) 18:23:59.20
バッファが幾重にも積み重なっていてもはや処理速度がどうこうとか関係ないレベル実測して確かめれ
570デフォルトの名無しさん:2012/11/08(木) 19:36:33.56
>>568
いま SSD が人気だね
571デフォルトの名無しさん:2012/11/08(木) 19:56:12.45
おまえらそろそろ言語のことを聞け
572デフォルトの名無しさん:2012/11/08(木) 21:21:21.39
明解C言語 入門編で勉強し始めたのですが、疑問があったので質問させていただきます。
int型と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も小数点がどちらか片方ありませんが、
小数点以下が計算されています。なぜでしょうか?
573デフォルトの名無しさん:2012/11/08(木) 21:32:42.59
d1 = (double)5 / 2;
574デフォルトの名無しさん:2012/11/08(木) 21:33:32.18
d1 = 5f / 2f;
575デフォルトの名無しさん:2012/11/08(木) 21:54:53.69
>>572
異なる数型の演算ではpromotion(日本語だと昇格だっけか?)というものが行われる。
d1 = 5 / 2;では5/2をintで行った結果の2がdoubleにpromoteされて代入される。
d3 = 5.0 / 2;は 2がdoubleにpromoteされて5.0 / 2.0が計算される

整数の演算にもpromoteはあるから規格書を読んで理解しておくといい。
576デフォルトの名無しさん:2012/11/08(木) 22:08:05.06
>>575
ありがとうございます。
d1はdoubleという変数の箱に入る前に整数で計算しているから
そうなるんですね。
本には格上げと書いてありましたが、
どのタイミングで処理されるかわからず混乱してました。
577デフォルトの名無しさん:2012/11/08(木) 23:53:42.68
ずぶのトーシロです。
表示させた5つ数字の平均値をもとめるプログラムなのですが
for分の中にscanfを突っ込むのは合理的ですか?
5回繰り返せばいいという安直な考えなのですが
その5回分足す作業をどこに書けばいいのかよくわかりません。
さしつかえなければ、参考までに書いていただけないでしょうか?
ちなみに数学的教養がほとんどないです。
特に一番自分がやばいなと思うのが一体変数が
いくつ必要なのか自分でなかなか考えれないということです。
これはどう解決すべきですか?
578デフォルトの名無しさん:2012/11/09(金) 00:04:33.42
5回足すとは
0にしておいた変数に1回足す
またそれに1回足す
またそれに1回足す
またそれに1回足す
またそれに1回足す
だ。
579デフォルトの名無しさん:2012/11/09(金) 00:10:53.65
> for分の中にscanfを突っ込むのは合理的ですか?

合理的です。
scanfを5つ書くのはマヌケです。
580デフォルトの名無しさん:2012/11/09(金) 00:20:53.97
変数がいくついるかなんて設計前に完全に予測するのは無理だし、
予測してもあんまり意味ないよ

個数の話じゃなくて、何を変数とすべきかという意味なら、
最初はまごついて当然なんで、たくさん書いて早く慣れろとしか言えない
581デフォルトの名無しさん:2012/11/09(金) 00:47:11.99
>>577
最初の頃はやりたいことをそのまま、例えば入力→加算の処理を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;
}
582デフォルトの名無しさん:2012/11/09(金) 00:54:51.60
>>581
最初はそうもいかんのよ。

scanf("%d", &v1);
scanf("%d", &v2);
scanf("%d", &v3);
scanf("%d", &v4);
scanf("%d", &v5);
sum = v1+v2+v3+v4+v5;

となって、繰返しにできずに行きづまる。
583581:2012/11/09(金) 01:05:37.47
>>582
おうふ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;
}
584 ◆QZaw55cn4c :2012/11/09(金) 01:29:46.46
>dSum
>dInput
>iLoop
システムハンガリアンはそろそろやめたほうが
585デフォルトの名無しさん:2012/11/09(金) 01:55:16.09
0〜Nまでのランダムは個体を10個作成したいのですが、どのような関数にすればいいのですか?
586デフォルトの名無しさん:2012/11/09(金) 02:05:43.01
CryptGenRandom();
587デフォルトの名無しさん:2012/11/09(金) 02:33:42.48
#include <stdio.h>
#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;
}
588 ◆QZaw55cn4c :2012/11/09(金) 03:10:32.96
589587:2012/11/09(金) 03:31:05.35
>>588
なるほど。
rand();の下位ビットはあまりあてにならないのですね。
初めて知りました。

> rand() % (N + 1);
  ↓
> (int)((double)rand() / ((double)RAND_MAX + 1) * (N + 1));

とすれば良いですね。
590デフォルトの名無しさん:2012/11/09(金) 04:08:55.05
Linux Documentation Projectのrand()のマニュアルページ
ttp://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を使うべきかな。
591デフォルトの名無しさん: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/
592 ◆QZaw55cn4c :2012/11/09(金) 07:43:02.05
>>590
使用した乱数生成器を問われることもあるので自前で実装するのはどう?
http://toro.2ch.net/test/read.cgi/tech/1347156509/666,689
593デフォルトの名無しさん:2012/11/09(金) 10:30:36.32
乱数生成などは素人が自前で作らない方がいい
本当に乱数が欲しいなら、random()使うより/dev/randomを使うといい
594デフォルトの名無しさん:2012/11/09(金) 10:33:15.58
素人でもぐぐりゃすぐ作れる
595デフォルトの名無しさん:2012/11/09(金) 10:47:20.05
初心者は初心者らしく
「擬似」乱数だって理解して使うなら桶
596 ◆QZaw55cn4c :2012/11/09(金) 12:32:56.01
>>593
それはそうだ。
意図しているのは「どんな乱数生成器を使ったかを明示するために」既存のコードを自分で書いておく、というもの。
knuth の例の成書や奥村さんのものから引用するなりしてね。
/dev/random を使うより MT を明示するほうが説得力があると思う。
597 ◆QZaw55cn4c :2012/11/09(金) 12:37:35.08
http://toro.2ch.net/test/read.cgi/tech/1192628099/337
で訳しておいたけれども AVX の乱数って実際どうなんだろうね
598デフォルトの名無しさん:2012/11/09(金) 12:42:47.55
引用元があるなら自分で書く意味ないやん
599デフォルトの名無しさん:2012/11/09(金) 12:56:27.87
あの場合は、完全なる一様分布関数を作成してダメアルゴリズムであることを指摘するのが正しい。

バカ丸出し↓
「最強のMT エイッ」
600デフォルトの名無しさん:2012/11/09(金) 13:09:44.37
2要素ずつ順番に取り出すから規則性が現れてしまうんであって、
2要素ずつ取り出しつつランダムに時々1要素間引いてやるだけで、
当初の規則性は現れなくなる。
601デフォルトの名無しさん:2012/11/09(金) 13:25:47.14
その代わり、間引くのに使う乱数の規則性の影響を受けた規則性が現れると。
602デフォルトの名無しさん:2012/11/09(金) 13:29:31.69
/dev/random
603デフォルトの名無しさん:2012/11/09(金) 13:45:24.25
うききっ
604デフォルトの名無しさん:2012/11/09(金) 13:45:57.48
605デフォルトの名無しさん:2012/11/09(金) 13:49:34.51
/dev/randomってエントロピーが足りないとブロックするんだな
606デフォルトの名無しさん:2012/11/09(金) 13:53:27.90
どの乱数を使うかより、乱数を使ってどう書くかのほうがよっぽど重要
607デフォルトの名無しさん:2012/11/09(金) 13:57:33.02
ところで
「ランダムは個体」
が何か、みんな合意できてるのか?
608デフォルトの名無しさん:2012/11/09(金) 14:04:52.92
>>589
C FAQは20年以上前の情報だから。
いまどき下位ビットだから極端に周期が短い処理系とかない。
逆に、変に工夫してバグってる例を見かけるから素直に rand() % N でいいよ。
609デフォルトの名無しさん:2012/11/09(金) 14:15:57.08
それつかえないよ
610デフォルトの名無しさん:2012/11/09(金) 14:22:01.94
乱数の話をしてるとrand君を思い出す
611デフォルトの名無しさん:2012/11/09(金) 14:26:37.04
20年以上前は、へんなバッドノウハウみたいのいっぱいあったけど
なんでrand()の下位ビット使うなだけ生き残ってるんだろうな。
612デフォルトの名無しさん:2012/11/09(金) 14:28:50.47
613デフォルトの名無しさん:2012/11/09(金) 14:45:27.23
rand()は大抵は全部のビットが使える実装に置き換わってるけど、
新たに書くコードならrand()の代わりにrandom()を使えという事になってると思う。
614デフォルトの名無しさん:2012/11/09(金) 14:49:19.20
>>611
floatは遅いからdouble使えみたいな
GPGPU使うとグラボによってはfloatだけ圧倒的に速かったり
615デフォルトの名無しさん:2012/11/09(金) 14:51:54.43
だが float を維持したままでの演算コードを書くのは辛い
616デフォルトの名無しさん:2012/11/09(金) 14:56:18.67
グラボにマンデルブロ描かせると一瞬なんだけど
やっぱdouble精度が欲しくなる
617デフォルトの名無しさん:2012/11/09(金) 14:59:44.77
618デフォルトの名無しさん:2012/11/09(金) 15:09:30.51
iPhoneなんかはCPUでもfloatの方が速い。
619デフォルトの名無しさん:2012/11/09(金) 15:53:43.15
>>611
どんな実装なのか調べるより下位ビット使わないように書く方が楽。
620デフォルトの名無しさん:2012/11/09(金) 15:56:39.97
rand_s()
621デフォルトの名無しさん:2012/11/09(金) 16:02:36.32
>>619
他のライブラリだってそれなりの品質だって信用して、いちいちソース見ないでしょ。
622デフォルトの名無しさん:2012/11/09(金) 16:20:25.26
>>621
> 他のライブラリだってそれなりの品質だって信用して、いちいちソース見ないでしょ。
はあ? お前バカだろ。バグと実装上の問題を混同するな。
623デフォルトの名無しさん:2012/11/09(金) 16:30:22.08
>>618
要はプロセッサが何に対応しているか
一時期はdoubleしか対応してなかった
624デフォルトの名無しさん:2012/11/09(金) 16:49:59.52
>>622
なんで混同してることになるんだろ。
いまどき下位ビットだから極端に周期が短い実装とかないでしょって話。
625デフォルトの名無しさん:2012/11/09(金) 17:16:59.96
今時ダメな実装があるかないかはどうでも良くて、
rand()はobsoleteだから代わりにrandom()使ってちょうだいよ、
とマニュアルに書いてある事が多い。
626デフォルトの名無しさん:2012/11/09(金) 17:26:17.82
>>625
そういう環境もあるだろうけどrand()は標準関数で、そのrandom()だと環境依存になるからね。
rand()を使うならって前提の話ね。
627デフォルトの名無しさん:2012/11/09(金) 17:38:41.30
まあPOSIXもアウトだっていうならそうね。
628デフォルトの名無しさん:2012/11/09(金) 17:49:02.17
ググると古くて化石みたいな情報にヒットするのが厄介
629デフォルトの名無しさん:2012/11/09(金) 17:57:45.10
rand() の実装を random() にすりゃ良いのに
630デフォルトの名無しさん:2012/11/09(金) 18:05:42.64
>>612
試してみた
http://codepad.org/Ybp472vR
VC++ 2005 の rand() なら遜色なかった
631デフォルトの名無しさん:2012/11/09(金) 18:08:06.50
以前カルドセプトってゲームでダイスの目が偶数と奇数が交互にでるってバグが話題になって、
ネットだと乱数の下位ビットを取ってるからだって話が氾濫したけど、たぶん、実際は
乱数ルーチンを自作して自爆だろうね。
xboxの開発環境はMSのコンパイラみたいだし単純に、rand() % Nだったらそんなことにななって
なかったはず。
632 ◆QZaw55cn4c :2012/11/09(金) 18:21:38.82
>>599
MTを使った一様分布の確率変数を使用しましたが、なにか?

無論、正解はhttp://toro.2ch.net/test/read.cgi/tech/1347156509/753,685 であることは認めるし認めているが、それはそうとこの方式を「完全なる一様分布関数」と呼ぶのには抵抗があるねえ。
一様分布って確率の世界の言葉でしょう?
あとhttp://toro.2ch.net/test/read.cgi/tech/1347156509/685のような出し惜しみも気色悪いし
633 ◆QZaw55cn4c :2012/11/09(金) 18:23:13.09
>>608
ところがどっこい、線形合同法は今でも現役なのです。
http://en.wikipedia.org/wiki/Linear_congruential_generator
634 ◆QZaw55cn4c :2012/11/09(金) 18:23:52.39
>>611
knuth の例の聖書にはいっぱい書いてありますよ
635 ◆QZaw55cn4c :2012/11/09(金) 18:25:05.44
636デフォルトの名無しさん:2012/11/09(金) 18:27:25.02
>>633
線形合同法だけど、単純に前回の値に掛けたり足したりしてそのまま返すって
処理じゃないから大丈夫。
VCの場合だと下位ビットでも周期は6万以上。
637デフォルトの名無しさん:2012/11/09(金) 18:35:00.10
>>633
その表だとVB6は最下位ビットは0と1が交互にくるような実装になってるのかな。
.NETじゃないVB使ってゲームとか作ってる人は要注意だな。
638デフォルトの名無しさん:2012/11/09(金) 18:55:34.16
完全な乱数関数があったとしてもQZみたいなバカには豚に真珠
>>632のときもバカ相手にさらにずれた論理で話があさっての方向にずれてたし
639デフォルトの名無しさん:2012/11/09(金) 19:25:44.46
おまえら嘘ばっかり言うな
乱数はこうやってつくってるんだよ
http://www.nicovideo.jp/watch/sm9153259
640デフォルトの名無しさん:2012/11/09(金) 19:28:19.58
グロ中尉
641 ◆QZaw55cn4c :2012/11/09(金) 20:42:16.89
>>636
そうですね。
掛けて足した後の結果は保持しておきますが、公開するのはその途中のビット、すなわちすでに下位桁を削っていることになるわけですね。
つまり C-FAQ を汲んで変更が加えられているわけです。
線形合同も C-FAQ も今でも十分に現役であり、>>608「C FAQは20年以上前の情報だから。」は少々乱暴。
>>633 をみると下位桁を削らずに公開している例もある。
642デフォルトの名無しさん:2012/11/09(金) 20:50:33.55
質問です。
シェルのオートコンプリート機能でタブキーを押すと文字補完で、文字が勝手に出力?されますよね?
標準出力で出すとあんな感じに、削除できたり、そのまま入力文字として使えたりしませんが、あれってどうやったら実現できるのでしょうか?
分かる方解答お願いします。
643デフォルトの名無しさん:2012/11/09(金) 20:52:22.74
>>641
いや、C FAQは今となっては古い情報も含まれてるよ。
rand()どうこうもそのひとつ。
>>633 の表のまずい奴は古い環境で最近のメジャーな奴なら大丈夫。
644デフォルトの名無しさん:2012/11/09(金) 20:59:57.63
>>642
readlineでも使えばいんじゃね
645 ◆QZaw55cn4c :2012/11/09(金) 21:00:58.55
>>643
>最近のメジャーな奴
具体的に
646デフォルトの名無しさん:2012/11/09(金) 21:20:13.59
>>644
readlineですか
ありがとうございます。調べてみます
647デフォルトの名無しさん:2012/11/09(金) 21:20:22.51
>>645
もうこの話やめときます。
メジャーの基準とか揚げ足取りの話になるとつまらんから。
648 ◆QZaw55cn4c :2012/11/09(金) 21:39:07.41
>>647
具体的な話ができない、いやそもそもない、ということですね、よくわかります
649デフォルトの名無しさん:2012/11/09(金) 21:47:20.95
分布の偏りや単純な規則性があると致命的ならば
演算結果を含めて素性の良い乱数か悪い乱数か一度は調べておきましょうね
650デフォルトの名無しさん:2012/11/09(金) 21:55:03.88
ついさっきまで線形合同法を使ってるrand()は、返す値はC FAQに載ってるような
質の低いものだって思ってたような人と話をしても、こっちは一方的に教えてあげるだけで
得るものもないしね。

「教えてください」みたいな態度ならまだしも、わかってるよな口ぶりで挑発して、相手から
発言を引き出して、その場その場でググって自分の浅はかさがばれてないって思ってる
ような人がよくいるけど、もうそういうのもうんざりだし。
651デフォルトの名無しさん:2012/11/09(金) 22:00:06.61
 
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \  はいはい
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
652 ◆QZaw55cn4c :2012/11/09(金) 22:28:34.72
>>650
この話題、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() の実装が線形合同だったりするわけで
653デフォルトの名無しさん:2012/11/09(金) 22:29:14.20
質問お願いします(行がギリギリなので、コメント内にて質問)。独習C第4版より
#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;
}
654デフォルトの名無しさん:2012/11/09(金) 22:35:42.74
別にグローバルじゃなくてもいいべ。
655デフォルトの名無しさん:2012/11/09(金) 22:43:44.84
>>654
ローカルにしますと、結果が変わってしまいました



グローバルの時       
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 回
以下略
656デフォルトの名無しさん:2012/11/09(金) 22:44:57.62
>>653
そこにかくと、0に初期化されるね
657デフォルトの名無しさん:2012/11/09(金) 22:45:32.53
>>655
ローカルの時は自分でゼロに初期化しないとダメだべ。
int count[26] = {0};
とかしとけばいいんじゃないの?
658デフォルトの名無しさん:2012/11/09(金) 22:46:36.77
>>652
ああそうなの。
線形合同法のrand()だとC FAQに書いてるように下位ビットは周期が極端に短くなるって
つい>>633まで思ってたのに、ログを読んでそうでないって学べてよかったね。
659デフォルトの名無しさん:2012/11/09(金) 22:46:39.62
初期化した?
660デフォルトの名無しさん:2012/11/09(金) 22:52:13.22
>>656
>>657
>>659
>>654
お答え頂きありがとうございます
解決いたしました

グローバル変数では、0に初期化されますが
ローカル変数の時は、自分で0に初期化しなければならないのですね

配列の初期化という事が、頭から完全に抜けていました

大変ありがとうございます
661 ◆QZaw55cn4c :2012/11/09(金) 23:11:16.19
>>658
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() の実装が線形合同だったりするわけで。
662デフォルトの名無しさん:2012/11/09(金) 23:16:09.54
>>653を見て思ったけど、
> char ch;
  …
> while((ch=fgetc(fp))!=EOF){

これって、正しくEOF判定される保証ありましたっけ?

int ch;

なら分かるけど。
663 ◆QZaw55cn4c :2012/11/09(金) 23:20:39.45
>>662
EOFが入力されたら問題なく終了されると思う
でも 0xFF が入力されても終了されてしまうと思う
664デフォルトの名無しさん:2012/11/09(金) 23:21:56.91
>>663
もう少し頑張れ
665デフォルトの名無しさん:2012/11/09(金) 23:24:49.92
今日は一時間かかってchar (*p)[n]の意味を理解しました
666デフォルトの名無しさん:2012/11/09(金) 23:25:31.21
>>661
線形合同法が使われてるというのを知ってるってのはそれでわかるけど、それは反論になってないのでは。

線形合同法の乱数では周期が短いと>>633まで思ってて、必ずしもそうでないと知ったのは>>641だというのは
確認できますね。

あと、たとえば、こちらは「線形合同を使ってない」とか言ってないのに「線形合同がつかわれてますねー」とか
変な反論してきたりとか、そういう微妙にずらしてるのはわざとですかね。

あんまりこのスレ見てないけど、あなたいつもそういう論法でやってるの?
667デフォルトの名無しさん:2012/11/09(金) 23:47:02.80
>>663
ありがとうございます。
while((ch=fgetc(fp))!=EOF){
は、書き換えると
while((ch=(char)fgetc(fp)) != (char)EOF){
ですね。

つまり、EOFは
#define EOF (-1)
なので、
int fgetc(); の戻り値がEOFだったら判定は
(char)EOF != (char)EOF!
といった具合に「真」になるので大丈夫…と。
668デフォルトの名無しさん:2012/11/09(金) 23:49:29.81
ああっ
全然大丈夫じゃない。

ファイルの途中に0xFFがあったらそこでwhileループ抜けて、
それ以降の文字を読まない。
669662:2012/11/09(金) 23:53:06.59
int ch;
にしたら全部読んで正常終了した。

>>662=>>667=>>668
です。一人でうろたえてすみませんでした。
670デフォルトの名無しさん:2012/11/10(土) 00:21:22.64
if文の質問です。

int x;
scanf("%d", &x):

if( x % 5 );
puts("5で割りきれない数字");

のようにifの条件式の中で
x % 5 > 0;
と書かなくても成り立つのはなぜでしょうか?
671デフォルトの名無しさん:2012/11/10(土) 00:32:56.24
0か否かを判定してるから
672デフォルトの名無しさん:2012/11/10(土) 00:38:31.31
int a, x;
x = 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で割りきれない数字");
673デフォルトの名無しさん:2012/11/10(土) 00:40:28.63
条件式の値が 0 なら偽、それ以外はなんでも真なの。
674デフォルトの名無しさん:2012/11/10(土) 00:42:22.27
皆さんありがとうございます。

0かそれ以外で判別してることを初めて知りました。

投稿後にセミコロン気づきました。申し訳ございません。
675デフォルトの名無しさん:2012/11/10(土) 00:44:35.38
ちなみに
if( ■ )
while( ■ )
for( … ; ■ ; … )

の ■ の部分はどれも真偽値だね
676 ◆QZaw55cn4c :2012/11/10(土) 00:50:50.79
>>666
過去ログを参照していただければお分かりになると思いますが、
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回嫁」
677デフォルトの名無しさん:2012/11/10(土) 00:52:48.18
>>675
>の ■ の部分はどれも真偽値だね
じゃなくて式。評価結果の真偽値によって動作が変わる。
forの第2式は省略可能なので、if, whileとはちょっと違うかな。
678 ◆QZaw55cn4c :2012/11/10(土) 01:01:29.87
>>666
>こちらは「線形合同を使ってない」とか言ってないのに「線形合同がつかわれてますねー」とか変な反論してきたりとか、

下位ビットに問題のない線形合同法の実装は存在しないからね。
「今の処理系では下位ビットの周期が短くない」と主張すれば、それは、「今の処理系は線形合同ではない」といっているのとほとんど同じなのでは?

ライブラリ側で下位ビットを切って返す実装(javaとかはそうですね)でない実装も多々ありますから
>>608 「素直に rand() % N でいいよ。」とは口がさけてもいえない。

私は以前はM系列法を愛用していましたね。
679 ◆QZaw55cn4c :2012/11/10(土) 01:45:09.38
>>669
ひとつ発展形をおしらせしておきましょうか。
char 型で書いていてもコンパイル後のコードは char 型で比較するコードになっていなくて、int 型に格上げされて比較に供するコードになります。
これを integral promotion / integer pormotion といいます。
今回の事例では直接には関係ありませんが、しかし >>667 は厳密には正しくない。

余力と暇ができたら考えてみてください
680デフォルトの名無しさん:2012/11/10(土) 02:02:20.73
charが符号付きなら0xffは格上げされたとき-1でEOFと等しくなるけど、
charが符号無しだと255になってEOFとは等しくならない。
681669:2012/11/10(土) 03:53:59.08
>>679-680
なるほど。

>>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はいつまで経っても抜けられない(無限ループ)。

ありがとうございます。
682デフォルトの名無しさん:2012/11/10(土) 03:57:33.62
本に出てるソースでも結構ひどいのがあるもんだな。
683デフォルトの名無しさん:2012/11/10(土) 04:04:45.74
進行形で本のコードに悩まされてる
684デフォルトの名無しさん:2012/11/10(土) 04:07:32.72
>>653のコードはASCIIまたはShift-JIS文字の
テキストファイルを想定しているんだろうから、
ファイル中に0xffがあることを考慮していないだけ
なんじゃないかな。
685デフォルトの名無しさん:2012/11/10(土) 08:05:21.43
そも、入門用として動きをまずは覚えるのに0xffがーとかってもうちょいあとに
理解が深まるものじゃね?
686デフォルトの名無しさん:2012/11/10(土) 08:38:32.48
左右の論理シフトと四則演算だけでビットANDやビットORを作るにはどうするのが効率良いのか?
687デフォルトの名無しさん:2012/11/10(土) 09:59:16.25
>>686
宿題なら宿題スレへ。
688 ◆QZaw55cn4c :2012/11/10(土) 10:09:18.87
>>685
入門用ならなおさら
int fgetc(FILE *)
の返り値を char で受けるのがそもそもおかしいのでは?
689デフォルトの名無しさん:2012/11/10(土) 10:17:48.52
intの戻り値をcharで受けてる時点で違和感を覚えないとだめだな。
690 ◆QZaw55cn4c :2012/11/10(土) 10:23:46.97
>>689
たしかに >>680 の時点ではきづかなかった、rand()が線形合同がよりもはるかに絶好の突っ込み場所だったのに逃してしまったのは返す返すも口惜しい
691デフォルトの名無しさん: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とかでしょうか
692デフォルトの名無しさん:2012/11/10(土) 10:42:46.89
左右の論理シフトは無くて四則演算だけでビットANDやビットORを作るにはどうするのか?
693デフォルトの名無しさん:2012/11/10(土) 10:59:24.86
>>691
ループの最後はfgetc()でEOFが読めてるはずなので。
694デフォルトの名無しさん:2012/11/10(土) 11:00:02.69
>>691
countがファイルのバイト数だということは理解してるよね?
EOFを読み取るまでfgetcで1バイトずつ読み込んでcountを++している。
ということは while(!feof(fp)){ } のループを抜けた時点では、countの値は
ファイルサイズ +1 になっているということ。
つまり余計な +1 を引いて正しいファイルサイズにしているだけ。
非常に悪いサンプルコードではあるが。
695デフォルトの名無しさん:2012/11/10(土) 11:07:48.69
>>693
>>694
ありがとうございます
納得いたしました

つまり、EOFを読み取る分までカウントしているので
無駄なカウントを引いているということでしたか

ありがとうございます
696デフォルトの名無しさん:2012/11/10(土) 11:13:26.19
打算計算が露骨に表に出すぎw
だからいくら謝罪したところで疑われるんだよこの人
まあキャラ的には面白いんだけど
697デフォルトの名無しさん:2012/11/10(土) 11:58:19.32
今日本に来てる韓国の男性アイドルよりよっぽどイケメンだった
698デフォルトの名無しさん:2012/11/10(土) 12:01:51.99
feofのサンプルコードだろうけどサイズを求め事をお題としているのが致命的にセンスが悪い。
fgetcをcharで受けてる件といい、その本はゴミ箱に直行した方がいいと思う。

ブックオフに売るのは2次被害拡大につながるので禁止。
699デフォルトの名無しさん:2012/11/10(土) 12:22:00.62
正規表現ってパッと見じゃあ理解できない魔法の記号だからな。
700デフォルトの名無しさん:2012/11/10(土) 13:54:33.72
>>698
まったく同感。もしかしたら林 晴比古の著作なんじゃないかな。
701 ◆QZaw55cn4c :2012/11/10(土) 17:16:20.25
>>696
面白いとお感じになっているのなら幸いです。別のネタスレの方もどうかお引き立てを。

>打算計算が露骨に表に出すぎ
むしろそういったものからもっとも遠い人だと自身を考えていたんですが、外からはそうみえないんですか。まことに不思議ですね。

確認ですが、 http://toro.2ch.net/test/read.cgi/tech/1192628099/421 は >>633 よりも前にポストされていたことは認めてくださりますよね。
であれば、>>666
>線形合同法の乱数では周期が短いと>>633まで思ってて、
>必ずしもそうでないと知ったのは>>641だというのは確認できますね。
は命題として偽であることは自明でしょう。

まあはるか過去に今日のこの日を仕組まれたみたいで私も嫌な感じがしますけれども。
702デフォルトの名無しさん:2012/11/10(土) 18:23:30.16
>>632
そのスレの685だけど、バカにもわかるように偏りを数字で出してやっただけで何かを出し惜しみしたつもりはないんだけど、
何をもって出し惜しみだと思ったのか知りたい
703 ◆QZaw55cn4c :2012/11/10(土) 18:45:02.61
>>702
うん、着目点は正解だと思います。
その時点では理解できなかった私に知恵が足りなくて http://toro.2ch.net/test/read.cgi/tech/1347156509/753で初めて理解したわけです
そのとき、「コードが書いてあったらよかったのに」って思っただけです。

まあ
>>632
>出し惜しみも気色悪いし
は言い過ぎですね。その程度の人間と捨ててください。
704デフォルトの名無しさん:2012/11/10(土) 18:53:07.47
それをコードが書かれなきゃ理解できないバカが乱数について語るのは滑稽だとは思わないのか
705デフォルトの名無しさん:2012/11/10(土) 19:10:46.30
そのスレの753(!=685)だけど、出し惜しみしたとゲスの勘ぐりしたってわけか。
クズ中のクズだな。お前二度と現れるな。
706デフォルトの名無しさん:2012/11/10(土) 19:14:15.76
>>700
林晴比古って悪いのか?
新訂 新 C言語入門シニア編 で勉強してるんだが
707 ◆QZaw55cn4c :2012/11/10(土) 19:17:17.04
>>704
そうお考えなのならばそうなんでしょうね。
>>705
早く出していただければなあ、と思っただけですが、まあ書きようによっては下衆の勘ぐりですわな、気をつけます。
これからも出現しますので、よろしければどうかご指導ください。
708デフォルトの名無しさん:2012/11/10(土) 20:09:12.32
>>706
goto を嫌う理由でバファリンがどうのという説明を見た日から不信感もってる
コンパイラも読者も科学的なのに、非科学的なのはこいつだけだと思った
709デフォルトの名無しさん:2012/11/10(土) 20:38:23.61
> これからも出現しますので、よろしければどうかご指導ください。
ふざんけんな。
この板の会話に参加するだけの能力も技術もないんだから、テメーは一生ROMってろ。

↓確率分布を語る資格のないバカのタワゴト(理由は教えてやらん)
> それはそうとこの方式を「完全なる一様分布関数」と呼ぶのには抵抗があるねえ。
710 ◆QZaw55cn4c :2012/11/10(土) 20:57:23.82
>>709
私なら「定義域に対する値域の対応の偏り具合」と完全に確率の世界から離脱した文言を使いますけれどもね。

>(理由は教えてやらん)
馬鹿を黙らせる一番の方法は論理を完全公開することですよ。
http://toro.2ch.net/test/read.cgi/tech/1347156509/753 がいい例でこの問題は一気に終息しました。
詰碁とかしたことありません?
711デフォルトの名無しさん:2012/11/10(土) 21:02:30.45
↓確率分布を語る資格のないバカのタワゴト(理由は教えてやらん)
> 私なら「定義域に対する値域の対応の偏り具合」と完全に確率の世界から離脱した文言を使いますけれどもね。

http://toro.2ch.net/test/read.cgi/tech/1347156509/753はもう一人のバカを黙らせるために書いた
お前のようなクズのためには書かない。
712デフォルトの名無しさん:2012/11/10(土) 21:40:15.14
林 晴比古はプログラム技術本著者におけるお笑い芸人
みたいなもんだよ。

ものすごいとんちんかんな内容の本を出している。
例を挙げると「C プリプロセッサパワー」という本がそれ。
絶対にまねしちゃいけない例の集大成。
713デフォルトの名無しさん:2012/11/10(土) 22:51:16.93
そんなに悔しかったのか
714デフォルトの名無しさん:2012/11/11(日) 01:45:58.63
>>689
そうか?
なら、memsetの第二引数がintなのにも違和感を覚えるクチかい?
715 ◆QZaw55cn4c :2012/11/11(日) 02:21:53.16
>>714
負の数がかならずしも2の補数とはかぎらないこと+char がデフォでは signed か unsigned かが処理系依存であること
への配慮じゃないの?
716デフォルトの名無しさん:2012/11/11(日) 02:26:27.31
C言語のポインタを理解するにはどうしたらいいですか。
ポインタに関する書籍を購入して読んで理解すればいいですか。
でもそれだと時間がかかるので、C言語のもととなるアセンブラを先に学習したほうが、
ポインタを理解する最短ルートなのではと思うのです。
ポインタを完ぺきに理解するのにお勧めのサイト、本があればご教授いただきたいです。
よろしくお願いします。
717デフォルトの名無しさん:2012/11/11(日) 02:35:17.43
>>716
お前の今のレベルは?
718デフォルトの名無しさん:2012/11/11(日) 02:50:28.81
大学の講義で初めてポインタについて学習していたときに、
最初の難題にぶつかったのは、scanfの引数に&をつけること。
&をつける理由が、ちんぷんかんぷんでどうにもならなかった。
しかし、ポインタの概念や簡単な使い方をマスターすることで、いまではなぜscanfに&を付与するのか、
その理由を説明できる程度です。
あえて正解いわせてもらうと、scanf自体が、受け取る値が参照渡しになっているためである。
scanの中で処理し、その結果を引数に返すんだってことを理解している。
ここまであっていますか。
719デフォルトの名無しさん:2012/11/11(日) 02:50:56.47
>>716
目で見るのも大切だけど、手や口も動かそう。
具体的には、
・メモリイメージを紙に書いてみる
・理解したことを、ポインタを知っている人や知らない人に説明できるようになる
ことが、実は凄く効果的。

それと、そのうち覚える事になるかもしれないけど、
「関数ポインタ」は中身は変数のポインタの応用だけど、
表記方法がちょっと例外的なので、それはそういうもんだと思って
踏まえておくこと。
720デフォルトの名無しさん:2012/11/11(日) 03:03:48.51
>理解したことを、ポインタを知っている人や知らない人に説明できるようになる
ことが、実は凄く効果的。
こういうことはすごく大切なことなんだなぁと思う。
話それるが、本の内容を理解して頭の中に入れるんだがそれが必要な時に取り出せなければいけません。
そして取り出したものを行動に生かす(たとえば人に説明することが一つの例に当てはまる)ことができる。
それができてこお、読書経験は私生活・仕事に生かすことができるのです。
手っ取り早い話読んだ内容を人に説明することが一番効果的なわけだが、本の内容を頭に入れる工夫も
考えないといけないです。記憶した内容は時間の経過とともに薄れていくので、
それを防ぐ意味で物事を長期的に記憶するようなテクニックが必要です。
完全に話がそれましたけど、、。
721デフォルトの名無しさん:2012/11/11(日) 03:09:10.39
アセンブラをやる。
理解できなくていいから入門レベルやってからCに戻る。
なんでポインタなんてものが出来たかが少しは理解できるようになる。
722デフォルトの名無しさん:2012/11/11(日) 03:13:04.62
>>718
あってません
723デフォルトの名無しさん:2012/11/11(日) 03:15:08.71
>>718
ポインタ完全制覇でも買え
javaもc#もPHPも、現在主流の言語はどれも参照渡しで副作用あるよ
構造体やクラスを値渡しするのが珍しいほう
そして、はやく教員免許か公務員試験を受けろ。
間に合わなくなっても知らないぞ
724デフォルトの名無しさん:2012/11/11(日) 03:16:55.65
K&Rのポインタ、派生型の項目で十分だろ
gdbつかって目ぼしいポインタの型を調べりゃ良い
725デフォルトの名無しさん:2012/11/11(日) 03:23:59.73
>>723
javaには参照渡し(call by reference)はない。あるのは「参照の値渡し。」
726デフォルトの名無しさん:2012/11/11(日) 03:25:29.20
>>725
へー。知らなかった。
参照渡しと参照の値渡しで、どんな挙動の違いあるんだっけ?
727デフォルトの名無しさん:2012/11/11(日) 03:25:55.43
>>721
ポインタのインクリメントで悩むことがあるぞ
アセンブラとCで進み方が違う
728デフォルトの名無しさん:2012/11/11(日) 03:30:31.65
ポインタを使った応用例について詳しく書いてある本が良いですね。
問題集みたいなのもあればなお良い。
私はBASIC→Z80のアセンブラからプログラムを始めたので、
Cを覚えるに当たって特にポインタではつまづかなくて
ポインタ学習向けの具体的な書籍は知りませんが…。

あと、IDE(統合環境)もあると良いですね。
Windowsだと、無料のVC++Expressがありますね。
Cのソースコード上で、
命令を1行ずつ実行して変数の値を見たり編集したり、
(ポインタ変数の加減算で変数値の変化を確認したり)
ポインタ変数の示すアドレスの先のメモリを見たり編集したり、
そういうのが出来るの。
Linuxではどういうツールを使えば良いのか知りませんが。。
729725:2012/11/11(日) 03:30:40.71
>>726
>>725 はコピペネタらしいんだけれども、それはともかく。

java がいうところの参照は new で確保したポインタと等価。
new で確保するようなオブジェクトは、new で確保する以外に確保する手段がない。(ごめんいってることがわかりにくい)
したがって、-> 演算子はドット演算子に置き換わって、-> 演算子はなくなった。

参照の値渡しってたんにポインタを渡しているのと等しく考えていいみたい。
730デフォルトの名無しさん:2012/11/11(日) 04:31:42.04
ポインタでつまづく
1.*がついたりつかなかったり、よくわからん。

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 );
なんか*ばっかりなんですけどでさっぱりに。
731デフォルトの名無しさん:2012/11/11(日) 05:04:28.51
自分は最近やっと理解できたけどint *aとかよりint* aみたいな考え方のほうが分かるかも
それとポインタにも型があるってことを意識したら多次元配列名のポインタ演算の意味が分かった
732デフォルトの名無しさん:2012/11/11(日) 05:04:44.37
>>728
viで同じことが出来る。
しかも高速に。
733デフォルトの名無しさん:2012/11/11(日) 05:15:59.12
>>730
典型的な初心者の躓きですね。
ポインタ変数宣言時の*と、参照時の*は全く関係がない。
宣言は、それがポインタ変数であるとわかればよいのだから
本当は*でない別の記号、またはpointerなどのキーワードで
よかったのであるが、言語設計者が手抜きしたのである。
このたった一文字の手抜きがもたらした弊害は非常に大きく、
設計者は批判されてしかるべきであるが、既に故人である。
734デフォルトの名無しさん:2012/11/11(日) 05:35:47.16
そういう初心者はLinuxのインストールから始めないと
計算機の仕組みが理解できていないとポインタはわからない
BIOSってわかるか?
わからないだろ
そんなんじゃダメだ
Linuxがわかればポインタなどわからなくても問題ない
735デフォルトの名無しさん:2012/11/11(日) 05:48:38.26
GUIならWikipediaで「統合開発環境」を検索したら色々出てくるけど、
Anjuta, Eclipse, KDevelop, Qt Creator, WideStudio
とかかな。

あと
NetBeansIDE
ttp://ja.netbeans.org/
 (ページ内のリンクを開くと英語になったりするけど
  右上のChoose page LanguageでJapaneseを選べば大丈夫)

どれも使ったことが無いのでアドバイスは出来ないけど、
IDEがあるとCの理解が早まるのは間違いないと思う。
736デフォルトの名無しさん:2012/11/11(日) 06:16:25.32
IDE(統合開発環境) vs emacs(テキストエディタ)
http://kohada.2ch.net/test/read.cgi/prog/1244310984/
737デフォルトの名無しさん:2012/11/11(日) 07:50:50.46
>727
>アセンブラとCで進み方が違う

うそを言うな
738デフォルトの名無しさん:2012/11/11(日) 09:12:13.31
int a[10];
int* p = a;

で、p = p + 1; ってやったら、(多くの処理系で) 4 とか進むことを言ってるんだろ。
それぐらい理解してやれや。
739デフォルトの名無しさん:2012/11/11(日) 09:12:39.61
>>731
わかりにくくなる要因に「char *a」と書くから、というのがあるように思う

「char* a」と書いて「char*」と「a」を視覚的に分けてやると、視点的にも「char型のポインタ型」と
受け取ってもらいやすいんじゃないかな?
「*a」だと、その後の「実体を指す」という書き方とかぶって
しまって理解を妨げるんだと思う

まぁ、これは俺の過去の実体験だが、昔はこう書く本もあった
740デフォルトの名無しさん:2012/11/11(日) 09:42:55.96
「*」を「char*」のように買いても、「char* pa, pb」とは書けないから結局・・・
741デフォルトの名無しさん:2012/11/11(日) 10:01:14.67
typedef char * PCHAR;
PCHAR pa, pb;

とする
742デフォルトの名無しさん:2012/11/11(日) 10:04:07.44
>>738
アセンブラでもword,dword,qwordは認識してインクリメントするだろ。
743デフォルトの名無しさん:2012/11/11(日) 10:21:50.47
>>740
あーたしかに
俺も無意識に>>741みたくするから忘れてたわ
744デフォルトの名無しさん:2012/11/11(日) 10:31:50.61
>727
それはアセンブラをやったゆえの弊害ではなく
C言語自体の問題では?
745デフォルトの名無しさん:2012/11/11(日) 10:56:35.70
C言語なんて時代遅れ
これからはLinuxの時代
746デフォルトの名無しさん:2012/11/11(日) 10:59:10.02
「マイコン技術なんて時代遅れ」
747デフォルトの名無しさん:2012/11/11(日) 11:20:49.86
fread なら !feof
fgets なら != NULL
で while の終了判定しているプログラムを多くみます
素人が見ると feof だけで良いような気がするのですが
使い分けてる理由はなんでしょう?
748デフォルトの名無しさん:2012/11/11(日) 11:26:15.73
ポインタの理屈を理解するには神に書いて勉強するのが早いね。
書式がわかりづらいのはK&Rの最初の設計がまずい。
だからtypedefなんてものが必要になった。
749デフォルトの名無しさん:2012/11/11(日) 11:26:26.16
>>744
Cの問題でもアセンブラの問題でもなく、単にそれぞれの仕様というだけじゃないかな。

Cはどこの処理系でも同じく
char*pa;pa++;は1bytes分のアドレス増加、
long*pb;pb++;は4bytes分のアドレス増加
と統一。
アセンブラは良く分からないけど、CPUによって違うのかな。
750デフォルトの名無しさん:2012/11/11(日) 11:27:05.12
神じゃねぇ紙だw
751デフォルトの名無しさん:2012/11/11(日) 11:50:41.22
以下のLoad関数に要素数を渡さず引数のLPSTR(char*)型配列の要素数を取得する方法はありますか?

void Load(LPSTR FileName)
{
//ここでFileNameの文字数が知りたい
}
void Init()
{
Load("a.bmp");
}
752デフォルトの名無しさん:2012/11/11(日) 11:52:34.13
C/C++に「配列の要素数を取得する」という言語仕様はない。
取得したいなら数えるしかない。
753デフォルトの名無しさん:2012/11/11(日) 11:54:01.41
>>747
使い分けているというか、fgets();は文字列に特化している便利関数。
内部的にfread();やfeof();の処理が含まれているような。

fgets();は例えるならprintf();みたいに、中ではintやdoubleを文字列に変換して
putc();したりする便利関数のようなもの。
754デフォルトの名無しさん:2012/11/11(日) 12:06:45.62
>>753
その例だとFileNameは文字列なので、Load();の中で
strlen(FileName);
とすれば要素数(文字数)が求められる。

FileNameのために確保されているバッファのサイズ=配列の個数(配列のサイズ)
をLoad();の中で知るのは>>752の言う通り、C言語では、出来ない。

知りたければ、
void Load(LPSTR FileName, DWORD n);
などとして、バッファのサイズを引数などで与える。
755754:2012/11/11(日) 12:07:32.72
>>754>>751へのレス
756デフォルトの名無しさん:2012/11/11(日) 12:22:49.77
>>752 >>754
strlenで出来ました。ありがとうございます
757デフォルトの名無しさん:2012/11/11(日) 13:00:51.91
freeすると確保した分を正しく解放するわけだから
確保してるメモリのサイズはシステム内部で管理されてるはず
本当はポインタを介してどうにかしてサイズを知ることができるのではないのか
758デフォルトの名無しさん:2012/11/11(日) 13:10:16.73
もちろん可能。
ただやり方が処理系によって異なると言うだけのこと。
759デフォルトの名無しさん:2012/11/11(日) 13:10:59.75
>>757
malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報の痕跡も
残っているかも知れないね。mallocの実装に依存するけど。

グローバル変数ならsizeof()で分かるけど、ローカル変数の場合は不可能に近いんじゃないかな。
スタックに確保されているとして、スタックのどこがバッファのために確保されたところなのか。
760759:2012/11/11(日) 13:13:43.59
かぶったし、先走ってしまった。


> malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報の痕跡も
> 残っているかも知れないね。mallocの実装に依存するけど。


> malloc→freeに関しては、確保された時のアドレスの近くにサイズ情報も
> あるかも知れないね。mallocの実装に依存するけど。
761デフォルトの名無しさん:2012/11/11(日) 13:23:44.79
ブロック毎にサイズを記録してると仮定しても、ぴったりmalloc()に指定したサイズだけ確保されてるとは限らないじゃん。
762デフォルトの名無しさん:2012/11/11(日) 13:31:32.00
それはそうだが、誰もそんなことを話題にしてない。

知りたいのは、「確保してるメモリのサイズ」だよ。
763デフォルトの名無しさん:2012/11/11(日) 13:50:35.69
プログラムが「確保してるメモリのサイズ」はmalloc()に指定したサイズでしょ。
764デフォルトの名無しさん:2012/11/11(日) 14:02:23.59
>>753
fgets と feof を混ぜて使うとバグるよ
765デフォルトの名無しさん:2012/11/11(日) 14:05:34.74
char *hoge = (char *)malloc(...);
Load(hoge);
この場合は処理系によってはLoad側でhogeの確保されたサイズが判ることがあるが
char hoge[] = "a.bmp";
Load(hoge);
とかだったら判らないでしょ
766デフォルトの名無しさん:2012/11/11(日) 14:10:59.30
>>763
確保するのはライブラリで、ユーザープログラムが指定してた通りに確保するかどうかは、
実装とその時の状況に依存する。
767デフォルトの名無しさん:2012/11/11(日) 14:12:43.77
>>765
判るかどうかは、処理系による。
768デフォルトの名無しさん:2012/11/11(日) 14:30:19.53
>>742
しねーよ。知ったかぶるのは止めとけ。
769デフォルトの名無しさん:2012/11/11(日) 14:30:33.65
sizeofでサイズが取得できるのはコンパイル時に静的に
領域が確定している変数だけ。
770デフォルトの名無しさん:2012/11/11(日) 14:44:07.44
というか自分で確保したんなら自分がわかってるし、誰かが確保したんなら
教えてもらうIFにしなさい
771デフォルトの名無しさん:2012/11/11(日) 14:45:45.12
>>747
聞きたいのはfread, fgetsの違いじゃなくてfgetc, fgetsの違いじゃないのか?

> fread なら !feof
で判定しているプログラムがそんなに多いとは思えない。
772デフォルトの名無しさん:2012/11/11(日) 15:04:11.10
>>742
参照先を抜き出すときは byte ptr や word ptr 等の修飾子で大きさを指定できるけど
ポインタに相当するレジスタのインクリメントは文意によらず1加算だよね?
773デフォルトの名無しさん:2012/11/11(日) 15:08:05.38
>>771
> > fread なら !feof
> で判定しているプログラムがそんなに多いとは思えない。

ランダムリードで fread() を使うときは、feof() を使わないけど、
終端までのシーケンシャルリードだと終端の判定に ferror() と feof() の
組み合わせを普通に使うんじゃないか。
あらかじめサイズを取得して、読み込み量を計算して、、というのは無駄では。
774デフォルトの名無しさん:2012/11/11(日) 15:10:08.40
>>772
それは全てのCPUアーキテクチャ共通なのかどうなのか
775デフォルトの名無しさん:2012/11/11(日) 15:15:33.34
>>774
そう言われるととても自信が無いw
ポインタ特化のインクリメント命令セット(1加算 2加算 4加算 etc)を持つものがあるならゴメンだ
776デフォルトの名無しさん:2012/11/11(日) 15:16:41.61
>>769
最近はそうでもないかも。
777デフォルトの名無しさん:2012/11/11(日) 15:20:17.68
>>769
ダウト

sizeof "abcdef" とかもできる。
778デフォルトの名無しさん:2012/11/11(日) 15:22:16.13
>>777
それはめちゃめちゃ静的だろ...
779デフォルトの名無しさん:2012/11/11(日) 15:29:01.85
>>774
作れば出来るので非存在の証明は不可能。それの存在を主張するやつが実例を示せ。
x86のstring命令はそれに近いが。
780デフォルトの名無しさん:2012/11/11(日) 15:29:37.84
>>778
> 領域が確定している変数だけ。
             ~~~~~~~~~~~~~
781デフォルトの名無しさん:2012/11/11(日) 15:33:03.66
sizeof 1.5 とか sizeof 'a' とかも問題なくできるな
782デフォルトの名無しさん:2012/11/11(日) 15:34:46.05
68Kのポストインクリメントとかはバイトかワードかロングワードかで足される数が変わる。
783デフォルトの名無しさん:2012/11/11(日) 15:35:43.52
ほとんど禅問答だな。
784デフォルトの名無しさん:2012/11/11(日) 15:43:24.93
>>782
そういう奴がいるかと思って、わざと p++ じゃなくて p = p + 1 って書いている。
さすがに、レジスタが指している先の型を認識して足される数を変えるプロセッサはないだろ。
785デフォルトの名無しさん:2012/11/11(日) 15:45:16.31
おまえら引っ掛け問題みたいの大好きだな。
786デフォルトの名無しさん:2012/11/11(日) 15:55:42.38
ぶっ掛けるのも好きだよ
787デフォルトの名無しさん:2012/11/11(日) 15:55:49.76
>>785
重箱の隅のようだけど
初心者が見落としやすく(「知らない」ではなく「知っているつもりだったが見落とす」)、
動作への影響も大きく、デバッグでハマりやすい。
(エンディアンも知らないとハマるね)
788デフォルトの名無しさん:2012/11/11(日) 15:57:25.50
今日も大漁ですね。
789デフォルトの名無しさん:2012/11/11(日) 16:54:27.87
>>773
fgetsではeof/error判定しなくて、freadはする根拠ないよね。
両方するあるいは両方しないなら良いけど。

> あらかじめサイズを取得して、読み込み量を計算して、、というのは無駄では。
あらかじめサイズがわかっているn個以下のレコードを読むのがfreadなんだけど。
790デフォルトの名無しさん:2012/11/11(日) 17:23:57.11
そういえば昔、DOSのLSI-C試食版だったかな。
10MBくらいのバイナリファイルを読んでデータ変換して別ファイルに書き出すプログラムで、
64kBまでしかmalloc()できないバッファでfread()〜データ変換〜fwrite()を
繰り替えす処理を書いたときにfeof()とferror()を使ったような記憶が。。
791デフォルトの名無しさん:2012/11/11(日) 17:37:27.92
>>790
LSI-C86試食版だった。
そして、64kB制限はコードとデータの合計だったかな。
確かにmalloc()は32kBくらいまでしか指定しなかった記憶が。。

チラ裏ごめん
792デフォルトの名無しさん:2012/11/11(日) 17:45:44.24
>>769
vla のサイズは静的に確定しないぞ
793デフォルトの名無しさん:2012/11/11(日) 18:35:13.16
質問させて下さい
整数A、整数Bの全ての和を出す際にその範囲の整数全てを表示させたいのですがどうすればいいのでしょうか?
例えば整数A:25、整数B:18なら18,19,20,21,22,23,24,25の全てを足した和は%dである。
と言った感じです。
整数A、Bの和を出す事は出来たのですが、足す整数を表示する方法がわからなくて・・・よろしくお願いします。
794デフォルトの名無しさん:2012/11/11(日) 18:46:30.52
795 ◆QZaw55cn4c :2012/11/11(日) 18:50:52.99
>>790
そういうときは低水準 read() を使ったほうがいい。feof() とか ferror() とか正直いらない
796デフォルトの名無しさん:2012/11/11(日) 19:07:06.79
>>794
ありがとうございます。
出来れば整数A,Bも実行画面に表示したいのですが、その場合はどのようにすれば宜しいのでしょうか?
質問ばかりですみません
797デフォルトの名無しさん:2012/11/11(日) 19:11:56.24
798デフォルトの名無しさん:2012/11/11(日) 19:14:09.40
> 25,の
だっせー
799デフォルトの名無しさん:2012/11/11(日) 19:15:26.17
800デフォルトの名無しさん:2012/11/11(日) 19:16:40.18
#include <studio.h>
801デフォルトの名無しさん:2012/11/11(日) 19:19:42.83
802デフォルトの名無しさん:2012/11/11(日) 19:32:32.10
>>801
何度もありがとうございます。
もう一度質問させて頂きたいのですが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;
}
803デフォルトの名無しさん:2012/11/11(日) 19:40:34.63
ほとんど答え出てるじゃん
804デフォルトの名無しさん:2012/11/11(日) 19:41:14.55
いくつか方法はあるが
ttp://codepad.org/0FrBsBZF
805デフォルトの名無しさん:2012/11/11(日) 21:10:52.62
>>517
while ( 条件 )
NULL;
806デフォルトの名無しさん:2012/11/11(日) 22:09:00.70
CPUのファンがうるさくなるでしょ
807デフォルトの名無しさん:2012/11/12(月) 01:05:30.87
>>804
遅くなりましたが無事出来ました!
本当にありがとうございました
808デフォルトの名無しさん:2012/11/12(月) 01:22:00.15
このWeb(http://japanese.joelonsoftware.com/Articles/Interviewing.html)を読んで、
「文字列をインプレイスで反転させる」を作ってみたのですが、
この著者?の方が求めるコードってこんな感じなのでしょうか。
ポインタ演算使うの?って思って。

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 }
809 ◆QZaw55cn4c :2012/11/12(月) 01:36:09.28
810デフォルトの名無しさん:2012/11/12(月) 01:53:42.04
void reverse(const char* c){
char *p = c;
while(*p!='\0')p++;
while(p>c)putchar(*--p);
}
811デフォルトの名無しさん:2012/11/12(月) 02:20:41.60
>?関数の実行速度は充分速いか? strlen を何回呼ぶ事になるのか考えてみよう。
>かつて私はO(n)であるべきstrrevのアルゴリズムがO(n^2)になってしまっているアルゴリズムを目にした事がある。
>彼らは繰り返しの strlen をループの中で呼んでしまっていたのだ。

どっかのバカもこうういクソコード書いてたな
812 ◆QZaw55cn4c :2012/11/12(月) 03:37:33.54
>>811
まあまあ、勘弁してやってくだしゃあ。
時々油断してしまうんです。今はしないように気をつけています。
813デフォルトの名無しさん:2012/11/12(月) 03:45:50.45
油断じゃなくて、それがいい書き方だと思ってたじゃねーかw
814デフォルトの名無しさん:2012/11/12(月) 08:07:14.87
char *str = "This is a pen."; と
char str[] = "This is a pen."; って何が違うん?
815 ◆QZaw55cn4c :2012/11/12(月) 08:10:28.96
>>813
そなんですか?ああ、再帰的記述を優先したときの話ね、あそこまで再帰厨だともう再起不能レベルか?
でも、それもあとで書き直したんですけれどもね。
http://toro.2ch.net/test/read.cgi/tech/1335517816/726,753,797
816 ◆QZaw55cn4c :2012/11/12(月) 08:11:42.93
>>814
おおざっぱにいって、
"This is a pen."
が格納される領域が異なります。
またこの格納領域の属性も異なる場合があります。
817デフォルトの名無しさん:2012/11/12(月) 08:21:55.34
>>814
このスレで質問するときは「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.";
818 ◆QZaw55cn4c :2012/11/12(月) 08:32:32.52
>>817
うん、たしかに >>816 はねじれた回答でしたね。失礼いたしました。
819デフォルトの名無しさん:2012/11/12(月) 08:41:04.03
こっちばOK
char str[] = "This is a pen.";
...
strcpy(str, "You is a big fool man.");
820デフォルトの名無しさん:2012/11/12(月) 08:41:23.54
821デフォルトの名無しさん:2012/11/12(月) 08:42:44.02
>>819
やめろw
822デフォルトの名無しさん:2012/11/12(月) 08:45:32.74
snprintfのnってどういう意味?何の略?
823デフォルトの名無しさん:2012/11/12(月) 08:51:36.93
snprintf 〜 n文字指定のsprintf
strncpy 〜 n文字指定のstrcpy

みたいなもんじゃないかな。
824デフォルトの名無しさん:2012/11/12(月) 08:54:38.32
strcmpi, stricmp 〜 ignore(大小文字区別無し)のstrcmp
strncmpi 〜 n文字指定かつignore(大小文字区別無し)のstrcmp
825デフォルトの名無しさん:2012/11/12(月) 08:55:27.42
Write formatted output to a character array, up to a given maximum number of characters
826デフォルトの名無しさん:2012/11/12(月) 08:56:10.39
_vstprintf_s の出番か
827デフォルトの名無しさん:2012/11/12(月) 09:08:38.74
variable string text print formatted - secure
828デフォルトの名無しさん:2012/11/12(月) 09:22:03.35
stricmp と strcmpi は
どう使い分けるのが正しい?
829デフォルトの名無しさん:2012/11/12(月) 11:01:49.80
strcmpiって使ってるの見たことないなぁ
大抵stricmpかstrcasecmpだ
830デフォルトの名無しさん:2012/11/12(月) 11:02:32.28
>>828
環境次第。
831デフォルトの名無しさん:2012/11/12(月) 12:27:56.92
strcmpiはstricmpを使ったマクロだからstricmpだけ使えば良いよ。
832デフォルトの名無しさん:2012/11/12(月) 13:05:24.30
strcmpi: posix
stricmp: ISO
833デフォルトの名無しさん:2012/11/12(月) 18:33:10.40
そもそも文字列リテラルを書き換えられないようにしてるコンパイラの設計がおかしい
834デフォルトの名無しさん:2012/11/12(月) 18:40:46.36
そこはリテラルっていうくらいだし…
835デフォルトの名無しさん: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";
煮るなり焼くなり犯すなり
836デフォルトの名無しさん:2012/11/12(月) 19:01:04.03
べつにstaticはいらないような
837デフォルトの名無しさん:2012/11/12(月) 19:34:54.92
書き換えられたら困るだろ。
838デフォルトの名無しさん:2012/11/12(月) 19:38:59.80
せやな
839デフォルトの名無しさん:2012/11/12(月) 19:46:12.96
せやろか
840デフォルトの名無しさん:2012/11/12(月) 19:51:19.18
せやせや
841デフォルトの名無しさん:2012/11/12(月) 19:55:22.84
printf("aho\n");
これがmancoとか出力する可能性が出てくるんだぞ。
842デフォルトの名無しさん:2012/11/12(月) 19:57:42.89
なんでよ
843デフォルトの名無しさん:2012/11/12(月) 20:06:40.38
異なるところに出現した文字列リテラルが別々の実体をもつことは規格上要求されていない。
コンパイラは同一の文字列リテラルの実体をひとつにまとめてもよい。
844デフォルトの名無しさん:2012/11/12(月) 20:12:18.44
どれがどれに対する突っ込みなのかぜんぜんわからんw
845デフォルトの名無しさん:2012/11/12(月) 22:40:48.58
おパンティー殿
846デフォルトの名無しさん:2012/11/12(月) 23:24:00.00
システムコールについてですが、子プロセスで端末から標準入力した値を親プロセスで使うプログラムが書けません。
スレ違いだったらすみません。
847デフォルトの名無しさん:2012/11/12(月) 23:28:05.80
>>846
pipeシステムコール
848846:2012/11/12(月) 23:33:15.16
fork, waitのみではできないのでしょうか?
849デフォルトの名無しさん:2012/11/12(月) 23:40:24.22
出来ない。何らかのIPCを使わないとダメ。
850846:2012/11/12(月) 23:42:33.62
>>849
ありがとうございます。また詰まったら質問にきます。
851デフォルトの名無しさん:2012/11/13(火) 00:35:06.02
そういうの標準ライブラリだけで出来るんですか?
852デフォルトの名無しさん:2012/11/13(火) 00:41:14.56
IPCはOSが提供している。
標準ライブラリだけで出来るが、複雑な構造のデータを渡すならば
標準じゃないライブラリの検討もした方がいい。
853デフォルトの名無しさん:2012/11/13(火) 02:27:43.70
>>846
共有メモリと排他も参考にするといいよ
854デフォルトの名無しさん:2012/11/13(火) 05:36:55.60
Inter Planet Communication
855デフォルトの名無しさん:2012/11/13(火) 06:26:56.73
iPC
856デフォルトの名無しさん:2012/11/13(火) 07:55:47.17
ips
857デフォルトの名無しさん:2012/11/13(火) 08:54:14.21
標準ライブラリ使いたいなら、ファイル経由で
858デフォルトの名無しさん:2012/11/13(火) 09:55:10.48
dupしてforkだろ
859デフォルトの名無しさん:2012/11/13(火) 09:57:51.81
dupフwwwwwwwwwwforkヌポゥwwwwwwwwwwww
860デフォルトの名無しさん:2012/11/13(火) 11:59:39.65
assert()で偽のときに実行時にソースコードの一部が表示されますが
コンパイラはどんな仕組みで実行ファイルにソースを埋め込んでいるのですか?
あれと同じようなことを自分の関数でもやってみたいです
861デフォルトの名無しさん:2012/11/13(火) 12:11:03.67
assertはマクロ。定義を見ればわかるが#つかって式を文字列化している。
862デフォルトの名無しさん:2012/11/13(火) 13:03:26.28
できました
本当にありがとうございました
863デフォルトの名無しさん:2012/11/13(火) 14:28:00.34
いえいえ
864デフォルトの名無しさん:2012/11/13(火) 16:47:25.69
うちうち
865デフォルトの名無しさん:2012/11/13(火) 18:20:23.61
質問スレ……、で合ってますよね?
C言語を用いて配列を使ってスタックの実装を行う課題が出されました。
要素はchar型です。
push,popの実装は特に問題ないのですがtopという
『スタックの先頭要素を参照する。返値の型はchar。
スタックが空の時どうするかは,データが7bitしか使わないことに着目して工夫すること。』
という関数を実装するよう指示がありました。
char型がデータを7bitしか使わないことを利用して工夫するということが
どのようなことか見当がつかないので、どなたかにご教授お願いしたいです。
866桃白白:2012/11/13(火) 18:33:06.67
>>865
桃白白の国語辞典能力をフル活用して考えた結果、7bitしか使わないというのは
7bitは少ない数値であると評価する意思があることを示すものであるわけだから、
つまり、あれだろ、そういうことなんじゃないか、余分なデータをなんかあれしとくんじゃね。
867デフォルトの名無しさん:2012/11/13(火) 18:34:49.41
-1でも返しとけ
868デフォルトの名無しさん:2012/11/13(火) 18:35:35.53
スタックが空なら負号を返せってことじゃね
869デフォルトの名無しさん:2012/11/13(火) 18:35:59.17
C/C++の宿題片付けます 160代目
http://toro.2ch.net/test/read.cgi/tech/1349527750/
870デフォルトの名無しさん:2012/11/13(火) 18:38:11.55
top関数の戻り値
・スタックが空じゃない 0〜127
・スタックが空 -1
871デフォルトの名無しさん:2012/11/13(火) 19:20:13.95
最上位ビットっていうとエルメスとかララァとかと関係ありますか?
872デフォルトの名無しさん:2012/11/13(火) 20:42:14.71
語源は一緒だね。
873デフォルトの名無しさん:2012/11/13(火) 20:47:54.15
くりあがるとファンネルになります。
874デフォルトの名無しさん:2012/11/13(火) 21:36:22.19
C言語でも文字列型って実装可能なんじゃないか?
例えば

if(x==1)printf("山");
else if(x==2)printf("谷");

って可能じゃん。
対応付けられるじゃん。
875デフォルトの名無しさん:2012/11/13(火) 21:37:40.97
でっていう
876865:2012/11/13(火) 21:39:55.97
>>866-870
把握しました。回答ありがとうございます!
877デフォルトの名無しさん:2012/11/14(水) 07:56:28.78
Cの配列は要素数固定ですが
Cで作られたスクリプト言語では
要素数上限なしのリストなどの機能が実現できているのは
どういうからくりなのでしょうか。
878デフォルトの名無しさん:2012/11/14(水) 07:58:20.36
領域が足りなくなったら動的に確保して増やしてるから
879デフォルトの名無しさん:2012/11/14(水) 11:33:17.41
>Cの配列は要素数固定ですが

まずこの認識が間違ってるよ!
880デフォルトの名無しさん:2012/11/14(水) 11:38:14.76
正しいだろ。C99の可変長配列でも要素数の増減は出来ない。
881デフォルトの名無しさん:2012/11/14(水) 11:43:51.46
>>877
C でもリストを作れば要素数上限なしになるぞ

# 上限なしつってもメモリ空間がそもそも有限なのは置いといて
882デフォルトの名無しさん:2012/11/14(水) 11:50:01.12
置いといてね
883デフォルトの名無しさん:2012/11/14(水) 11:54:38.59
馬鹿には無理
884デフォルトの名無しさん:2012/11/14(水) 16:58:07.52
変数を配列として宣言する前提なら要素数は固定だね。
動的に確保した領域をポインタ経由で配列的に使うのなら
また話は違うけど。
885デフォルトの名無しさん:2012/11/14(水) 17:42:04.84
配列っていったら純粋な配列のことだけだと思え
勝手に拡大解釈するな
886デフォルトの名無しさん:2012/11/14(水) 18:07:19.33
次にお前は
Cの配列のインデックスは整数のみですが
Cで作られたスクリプト言語では
連想配列などの機能が実現できているのは
どういうからくりなのでしょうか。
という
887デフォルトの名無しさん:2012/11/14(水) 18:14:23.87
連想配列はキーをhashで整数に変換した配列だと思えば良い
hashの衝突回避についても勉強汁
888デフォルトの名無しさん:2012/11/14(水) 20:36:38.71
計算量についてなんだが
for(1000回)
for(100回){1万回+1万回+1万回}
くらいだとやっぱり1分以上実行にかかっちゃう?
889デフォルトの名無しさん:2012/11/14(水) 20:42:11.90
>>888
処理内容によるだろJK

30億回だから並列化とかも考えると1秒〜くらいとしか言えない
890デフォルトの名無しさん:2012/11/14(水) 21:02:40.38
それをアンロールするコンパイラって具体的にどれだ?
891デフォルトの名無しさん:2012/11/14(水) 22:22:28.94
なぜ急にアンロール
892デフォルトの名無しさん:2012/11/14(水) 23:01:06.84
いまいちfor文が回る条件が分からないのですが
@
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
cnt ++;
}

A
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
i=i+1;
}
は違いますよね?
for(i=0; i<10 ; i++){
〜〜〜〜
〜〜〜〜
}
だけでは回りませんよね?
893デフォルトの名無しさん:2012/11/14(水) 23:05:55.15
だけでブンブン回るよ!
894デフォルトの名無しさん:2012/11/14(水) 23:09:03.96
やっぱりそうなんですか?
i=i+1;を追加したらちゃんと動作したんですが、なんなんでしょうか?
895デフォルトの名無しさん:2012/11/14(水) 23:11:43.94
なんどもすいません、これです
int 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;をいれたらそういう風に表示されました。
896デフォルトの名無しさん:2012/11/14(水) 23:20:08.16
>>895
たまたま上手く動いてるように見えてるだけだね
紙に書き出してみればすぐわかるよ
ヒントは、半分でOK
897デフォルトの名無しさん:2012/11/14(水) 23:31:08.56
そもそも

work = data[i];
data[i] = data[n-1-i];
data[n-1-i] = work;
がうまくいってないってことですよね?
ゆえにprintfで配列の順番順にただただ表示されてしまう。
10と7、3と6、8と2を交換するようにすればいいんでしょうか?
898デフォルトの名無しさん:2012/11/14(水) 23:56:24.30
>>897
いや、そこは正しいよ

交換は、インデックスの半分まで実行すれば良いと言う事に気付くかがポイント
後ろ半分を実行しちゃうと、前半で交換した内容を、元に戻してしまうのだね
つまり、forの継続条件は i<n/2 が正しいんだな
899デフォルトの名無しさん:2012/11/15(木) 00:12:40.94
すいません意味がわかりません。
前半で交換した内容を、元に戻してしまうのはどこで指示してるんですか?
900デフォルトの名無しさん:2012/11/15(木) 00:14:24.06
あと何故i=i+1でもどうような事がおこったのでしょうか?
901デフォルトの名無しさん:2012/11/15(木) 00:24:09.99
>>899
だから、書き出して見ろっての
頭で理解できなきゃ、体を動かせ

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してみ
902デフォルトの名無しさん:2012/11/15(木) 00:40:38.79
これ例えば012345を543210にするのではなく
0と5、1と4、2と3をいれかわる動きだったのですか?
正直workって何の為にあるかのもわからずに考えていました。
書き出していましたが
6-1-0=No5
6-1-1=NO4
6-1-2=No5の順に並ぶものだと思っていたので
903デフォルトの名無しさん:2012/11/15(木) 00:46:48.70
>>902
あっ…っごっめーん
俺が見間違えてたわ
てへっ(赤面逃亡
904デフォルトの名無しさん:2012/11/15(木) 00:50:33.93
>>902
そうだよ
iの動きとn-1-iも書き出してみれば、もうわかるよね

>>903
ちょっ、おまっ、何言っている?
905デフォルトの名無しさん:2012/11/15(木) 01:03:17.51
すいません、自動的に入れ替わるのは配列の特性でしょうか?
例えば
○×△□という配列で
<先頭にこいよ、□
□「分かりました、○さん交代しましょう」
○「いいよ」
みたいなことですよね?

個人的にはひとつひとつの値に順番を指定するものだと思っていました。
906デフォルトの名無しさん:2012/11/15(木) 03:14:54.63
自動的に入れ替わったりはしない
907デフォルトの名無しさん:2012/11/15(木) 07:49:36.15
>>895
自分も忘れる時在るけど、i < n / 2ってしないと一周してもとの位置に戻ってるんだよ
908デフォルトの名無しさん:2012/11/15(木) 07:56:36.16
i < n-1-i の間はやりたい交換をおこなってる
i >= n-1-i から せっかく交換したものをまた交換して元に戻しちゃってる
909デフォルトの名無しさん:2012/11/15(木) 08:13:32.03
いや、これは忘れるとかいう問題じゃないだろ。お前ら向いていない。
910デフォルトの名無しさん:2012/11/15(木) 08:38:03.88
なぜ

for(int i = 5; i >= 0; i--)
printf("%d\r\n", data[i]):

ではいかんのか?
911デフォルトの名無しさん:2012/11/15(木) 09:09:03.47
forで変数宣言すんな
912デフォルトの名無しさん:2012/11/15(木) 09:34:35.54
> forで変数宣言すんな
913デフォルトの名無しさん:2012/11/15(木) 10:33:40.59
>>909
最初に書く時はじっくり考えながら書くので間違い少ないけど、違う言語に移植する時とか、ウッカリミス多くならないか?
914デフォルトの名無しさん:2012/11/15(木) 13:16:14.79
>>910

X
>for(int i = 5; i >= 0; i--)
>printf("%d&yen;r&yen;n", data[i]):

O
>for(int i = 5; i--; )
>printf("%d&yen;r&yen;n", data[i]):
915デフォルトの名無しさん:2012/11/15(木) 13:25:22.39
標準的イディオム
>for(int i = 4; i >= 0; i--)
>printf("%d&yen;r&yen;n", data[i]):

>>914
リーダブルコード読めよ。読者に考えさせるコードは駄目なコードだ
916デフォルトの名無しさん:2012/11/15(木) 13:30:44.14
正解
for(int i = 5; --i >= 0; )
printf("%d\r\n", data[i]):
917デフォルトの名無しさん:2012/11/15(木) 13:31:02.91
n=6だからn-1である5から始まってるんだけど
918デフォルトの名無しさん:2012/11/15(木) 13:34:41.08
ああごめん
>915 だけ見て脊髄反射してもうた
919デフォルトの名無しさん:2012/11/15(木) 14:46:50.41
>>917
そういうときは 6-1 と書くんだ
920デフォルトの名無しさん:2012/11/15(木) 15:08:42.24
配列のケツ側から順に何かするのは好きじゃない。
921デフォルトの名無しさん:2012/11/15(木) 15:10:06.82
その必要があることもある
922デフォルトの名無しさん:2012/11/15(木) 15:49:13.53
if(int i = 0; i < strlen(str); i++) hogehoge
みたいなコード書くよりも
if(int i = strlen(str); --i >= 0; ) hogehoge
のが速いというのは本当ですか?
923デフォルトの名無しさん:2012/11/15(木) 16:59:55.09
釣りだろうけど
strlen の実行回数が全然ちがう
924デフォルトの名無しさん:2012/11/15(木) 17:47:15.96
釣り認定厨乙
925デフォルトの名無しさん:2012/11/15(木) 17:58:28.07
int len = strlen(str);
if (int i = 0; i < len; i++) hogehoge;
としとくのが妥当だろうな
926デフォルトの名無しさん:2012/11/15(木) 18:01:06.05
>>922
ウソの場合もある。
最近のコンパイラ(たとえばVC2010)はhogehogeの内容によるがstrlen呼ばずに
直接strを参照するコードを生成できる。

> if(int i = 0; i < strlen(str); i++) hogehoge
927デフォルトの名無しさん:2012/11/15(木) 18:09:12.06
副作用のない関数だと、同じ引数を与えて何回も呼び出すコードは、
1回に最適化されてしまうことがあるね。gccでもそう。

あと、0以外の定数との比較より0との比較の方が速いというアーキテクチャは存在する。
変数(レジスタ)との比較より正負判定の方が速いというアーキテクチャも存在する。
x86じゃ有意な差は出ないと思うけど。
928デフォルトの名無しさん:2012/11/15(木) 19:29:12.19
この場合、副作用は i++ であって strlen は哀れな被害者
929デフォルトの名無しさん:2012/11/15(木) 20:26:15.49
930デフォルトの名無しさん:2012/11/15(木) 20:42:41.12
グロ注意
931デフォルトの名無しさん:2012/11/15(木) 20:45:31.31
ばぶー
932デフォルトの名無しさん:2012/11/15(木) 20:54:56.24
これ答えてください
http://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になるまでがんばってください
933デフォルトの名無しさん:2012/11/15(木) 21:00:21.23
>>932
スレタイ1000回音読してきえろ
934デフォルトの名無しさん:2012/11/15(木) 21:00:53.08
>>932
グロ注意
935デフォルトの名無しさん:2012/11/15(木) 22:37:29.59
結局色んな専門書読んだけど日本語のレベルで意味が分からなかったから
挫折した。いくら時間があっても足りないわ。
分かりやすい本って本当に無いな。
936デフォルトの名無しさん:2012/11/15(木) 22:43:34.74
何読んだ?
これまで学んだ言語は?
937デフォルトの名無しさん:2012/11/15(木) 23:09:10.58
>>936
これまでに学んだ言語はC言語とJavaだけ
Javaは継承とか多様性までは理解できたけど
ジェネリクスとか内部クラスとかシンクロナイズドあたりから
ほとんど意味が分からなくなって勉強が頓挫した

でCに戻ったけどスレッドを勉強して意味が分からなくなって
挫折した
938デフォルトの名無しさん:2012/11/15(木) 23:11:31.93
関数ポインタという概念を理解するのに1週間もかかったのに
これじゃ辞めたほうがいいかな 単位だけ取れたらいいか
939デフォルトの名無しさん:2012/11/15(木) 23:18:59.12
きも
940デフォルトの名無しさん:2012/11/15(木) 23:27:36.10
えらく抽象度の違うものを一気に勉強しようとしすぎだな
941デフォルトの名無しさん:2012/11/15(木) 23:29:56.07
ちょっと難しくなると理解できた試しがない
942デフォルトの名無しさん:2012/11/15(木) 23:32:29.22
>>927
0との比較は自分自身とのAND比較に最適化されるから
普通どのアーキテクチャでも速いんじゃね
943デフォルトの名無しさん:2012/11/15(木) 23:40:10.32
て言うか、大抵のプロセサで演算結果が 0 かどうかでフラグ立つから、
比較すら必要ないでしょ。

68系みたいに、ロードするだけでフラグ立つプロセサもあるし。
944デフォルトの名無しさん:2012/11/15(木) 23:41:41.29
ああ、そりゃそうだな・・・
945デフォルトの名無しさん:2012/11/15(木) 23:53:55.67
0との比較は速いといっても、配列の方が要素の数が固定か
スタックのような使い方に限られてしまってそうな。
946デフォルトの名無しさん:2012/11/15(木) 23:55:37.02
>>942-943
わろす
947デフォルトの名無しさん:2012/11/15(木) 23:56:21.58
x86じゃロードで0フラグ立たないのよ
948デフォルトの名無しさん:2012/11/15(木) 23:57:54.04
イマドキのアーキテクチャなら、
スーパースカラーでそんな1命令くらいふっとぶんじゃね?
949デフォルトの名無しさん:2012/11/16(金) 00:42:28.71
ためした
http://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
950デフォルトの名無しさん:2012/11/16(金) 00:44:04.97
ちなみに、0と比較せずに、-1と比較しやがったw
951デフォルトの名無しさん:2012/11/16(金) 05:44:33.67
つまり、0との比較に拘る必要がないんだな、x86は。
952デフォルトの名無しさん:2012/11/16(金) 08:19:23.52
953デフォルトの名無しさん:2012/11/16(金) 08:34:03.52
954デフォルトの名無しさん:2012/11/16(金) 08:50:29.56
ついでに
http://codepad.org/cP6sT86c
とすると
http://codepad.org/vW9QkStN
になった

つまり、
movl $1, %eax
subl %ecx, %eax
subq $1, %rdx
movl %eax, %ecx
jne .L2
で、1引いた結果が0かどうかでの分岐になるけど、
時間変わらず

スーパースカラーの威力
x86なら気にすんなってこと
955デフォルトの名無しさん:2012/11/16(金) 21:06:49.81
http://i.imgur.com/E1yrk.gif
これ、テストの過去問なんだが、↓であってる?

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: &amp;a 9: %f\n 14: else
5: &amp;b     10:&amp;v 15: -8.5<=v &amp;&amp; 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",&amp;n);

while(n>=a){
printf("%d " a);
a+=2
}
956デフォルトの名無しさん: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: &amp;a___________9: %f\n__________________14: else
5: &amp;b___________10:&amp;v____________________15: -8.5<=v &amp;&amp; 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
957デフォルトの名無しさん:2012/11/16(金) 22:23:14.23
>>956
(3)は"%d"、あとは俺は見る時間ない。

ちなみに、&ampとか出ているけど、ギコナビなら
ttp://anago.2ch.net/test/read.cgi/software/1350168418/64-
> レスエディタのメニューから特殊文字変換の下の「Space/Tab→&amp;nbsp;」のチェックを外してください
958デフォルトの名無しさん:2012/11/16(金) 22:41:48.32
>>957
さんきゅ、
(3)はキーボードで打つ時にエンター押すから、「\n」はいらん訳ね。

&ampとかしっかり勉強しま
959デフォルトの名無しさん:2012/11/17(土) 00:24:23.58
powがプログラム全体にエラー引き起こす可能性ってありえますか?
powを使うと実行時に局所的ではなく全体に影響を及ぼすエラーが
出るんですが.......
960デフォルトの名無しさん:2012/11/17(土) 00:27:22.07
>>959
説明が意味不明。
そもそも「全体に影響を及ぼす現象」の原因がpowだということを
何を根拠に判断したのか?
961デフォルトの名無しさん:2012/11/17(土) 00:32:06.10
エスパーーーッ
962デフォルトの名無しさん:2012/11/17(土) 00:34:04.84
>>960
勘違いしました。
すいません。
963デフォルトの名無しさん:2012/11/17(土) 00:36:57.91
>>959
pow(-1, 0.5);
とかやったの?
964デフォルトの名無しさん:2012/11/17(土) 00:39:45.09
エヴァの制御系もC言語で書かれてるんですか?
965デフォルトの名無しさん:2012/11/17(土) 12:07:13.03
printfはint型の戻り値があると聞いて、
下記のようなコードを見せられました。

#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が画面に文字を出力するのは戻り値というか、そういうものではないのですか?
うまく言えませんが、何か変な感じがして・・・
966デフォルトの名無しさん:2012/11/17(土) 12:11:48.06
純粋に関数としてみると、printfは書き込まれた文字数を返す関数。

画面に文字を表示するのはprintfの副作用。
967デフォルトの名無しさん:2012/11/17(土) 12:24:21.48
whileの中で値をいじってないのに
while終了後値が変わっているんですが原因は何が考えられますか?

KOUZOUTAI[10]

KOUZOUTAIは要素にint a と double bを持ちます。
初期値として全てのKOUZOUTAI[i].bを1.0にしてprintfでwhile文の前に
確かめたら1.0と表示されます。
whileの中で書く文は単にKOUZOUTAI[i].bを表示するだけの命令です。

ところがwhileを抜けた途端0.0になってしまいます。
何故でしょう?
968デフォルトの名無しさん:2012/11/17(土) 12:29:40.99
>>966
すみません、その副作用とはなんでしょうか。
969デフォルトの名無しさん:2012/11/17(土) 12:29:56.82
ごちゃごちゃ書いてないで、コード晒せよ。
970デフォルトの名無しさん:2012/11/17(土) 12:32:47.50
>>967
書式指定のミス
不正なポインタ操作
のいずれか

現象が再現する最小のコードを作ってうp!
971 ◆JWhSl75IiON1 :2012/11/17(土) 13:06:05.47
>>970
ありがとうございます。例えば
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;です。
972 ◆JWhSl75IiON1 :2012/11/17(土) 13:08:10.76
ちなみにちょっと変わった事をしていてXとYは X[TEN] Y[TEN]で
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]は変わらないと思うのですが......
973 ◆JWhSl75IiON1 :2012/11/17(土) 13:12:28.74
書き換えられてないかチェックのために
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]は書き換わっています。
974デフォルトの名無しさん:2012/11/17(土) 13:13:02.47
>>972
配列の範囲外にアクセスしてるんじゃないの?
hoge_type IN[10][10];
の変数があるときに
IN[0][11]=hoge_value;
みたいにしてるとか
975デフォルトの名無しさん:2012/11/17(土) 13:17:43.60
976デフォルトの名無しさん:2012/11/17(土) 13:19:27.93
◆JWhSl75IiON1

コードは意図したとおりではなく、書かれたとおりに動く。

>KOU[0].IN[1][1]はいじられたくないんですよ。
あなたの意図はそうかもしれないが、コードはいじるようになっているんでしょ。

とにかく再現する最小のコードを作ってアップしてみなよ。
再現するコードを作っている段階でバグに気づくなんて、よくあることだ。
977デフォルトの名無しさん:2012/11/17(土) 13:20:30.07
>>968
int x;
int foo(void)
{
x = 100;
return 200;
}

で、xの値が書き換わってしまうのはfooの副作用。

int bar(void)
{
printf("%d\n", 300);
return 400;
}

で、数字が表示されてしまうのはbarの副作用。
978 ◆JWhSl75IiON1 :2012/11/17(土) 13:28:04.23
>>976
ありがとうございます。
エラーが出る範囲で簡略化してみようと思います。
少しお待ちください。
979デフォルトの名無しさん:2012/11/17(土) 13:42:07.78
>>977
うーん、return で返す値以外は、関数にやらせることが"副作用"なんですかね。
引数void戻り値なしなら、関数の処理は全部、"副作用"?
980 ◆QZaw55cn4c :2012/11/17(土) 13:58:48.64
>>964
magi は「int の C 」らしいですよ、誰がそういってたっけ?
981デフォルトの名無しさん:2012/11/17(土) 14:08:18.34
>>979
>引数void戻り値なしなら、関数の処理は全部、"副作用"?
そのとおり

あんまり関係ないが、グローバル変数ばかりで引数戻り値voidの関数ばかりのコードを見たときは
悪い意味で衝撃を受けた
982デフォルトの名無しさん:2012/11/17(土) 14:36:24.96
void func(int *a){
 *a = *a + 1;
}

を副作用って言うのは、正直微妙な気がする。
983 ◆JWhSl75IiON1 :2012/11/17(土) 14:55:32.40
#include<stdio.h>
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増えてしまっています。
984デフォルトの名無しさん:2012/11/17(土) 14:56:12.91
>>983
範囲外に書き込んでるからだろw
985 ◆JWhSl75IiON1 :2012/11/17(土) 15:02:06.71
>>984
ちょwwww
自己解決しましたw

3が原因ですか...
左の10に注意してるだけで右忘れてた.....
ありがとうございます....
1日考えて分からなかったのがばかばかしく思えてきた......
986デフォルトの名無しさん:2012/11/17(土) 15:11:03.92
自己解決?
987デフォルトの名無しさん:2012/11/17(土) 15:13:01.49
自己解決してねージャン
まあ一人で入れ込むバグなんてえてしてそんな程度だよね
988デフォルトの名無しさん:2012/11/17(土) 15:13:30.93
2回同じ部分を指摘されてようやく「自己解決」ってんだから触らないほうが良い
989デフォルトの名無しさん:2012/11/17(土) 17:20:14.02
基本的な事を教えて下さい。
A,B,C.cという3本のソースファイルがあります。
この3本はそれぞれマイコンメーカから提供されるツールによって
吐き出されるヘッダファイル(DEV.h)を取り込みます。
※DEV.hは頻繁に変更される。

このDEV.hの中に以下の様な変数を初期化している箇所があり、
複数のソースファイルでインクルードすると「multiple define」のエラーがでます。
data[] = {初期値};

仕方ないのでB,C.cではDEV.hをインクルードせず、DEV.hに変更がある度に、
DEV.hから必要なdefineをコピペしています。
このコピペの操作を無くしたいのですが何か良い方法はないでしょうか?
990デフォルトの名無しさん:2012/11/17(土) 17:25:11.50
>>989
ラッパーを作って
DEV.h に依存するファイルを一つだけにしてしまう
991デフォルトの名無しさん:2012/11/17(土) 17:45:30.18
ヘッダに実体書くなよバーカバーカってマイコンメーカに言う
992デフォルトの名無しさん:2012/11/17(土) 17:57:36.52
DEV_Include.h

#ifndef DEV_H_INCLUDED
#define DEV_H_INCLUDED
#include DEV.h
#endif
993デフォルトの名無しさん:2012/11/17(土) 18:24:50.48
>>989
>>991が正解。
994デフォルトの名無しさん:2012/11/17(土) 18:24:54.71
>>992
いみねーよ
995 ◆QZaw55cn4c :2012/11/17(土) 18:30:33.96
>>989
A, B, C は最終的にリンクして一つの実行ファイルにまとめるのですか?
であれば >>991 が正解、というかしかたがないので、DEV.h の該当部分をコメントアウトして、data[] = { .. } をA, B, C のなかの一箇所だけにかいておくようにするしかないですね。
996デフォルトの名無しさん:2012/11/17(土) 18:37:01.36
>>989
そんな阿呆メーカのファイルに依存するものを三箇所に分散させた馬鹿に文句を言うべき。
でないと、今後もメーカが修正したときにも修正を強いられることになりかねない。
997デフォルトの名無しさん:2012/11/17(土) 18:39:13.34
強いられているんだ!!!
998デフォルトの名無しさん:2012/11/17(土) 18:46:30.86
ume
999デフォルトの名無しさん:2012/11/17(土) 19:01:53.08
そもそもそんなメーカのマイコン使うなよ
使うことを強いられているなら>>991でメーカ側を矯正すべき
1000デフォルトの名無しさん:2012/11/17(土) 19:04:27.44
static付けとけ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。