1 名前:デフォルトの名無しさん mailto:sage [2012/12/09(日) 23:18:13.67 ] C言語の入門者向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 110 toro.2ch.net/test/read.cgi/tech/1353148538/ ★過去スレ 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++の宿題片付けます 161代目 toro.2ch.net/test/read.cgi/tech/1354070278/ ★C++言語については避けてください。C++対応明記スレへどうぞ。 ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。 # サイズが大きい場合はアップローダ等を利用してください。 codepad.org/ ideone.com/ ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2 名前:デフォルトの名無しさん mailto:sage [2012/12/09(日) 23:32:24.75 ] 乙〜
3 名前:デフォルトの名無しさん mailto:sage [2012/12/09(日) 23:35:22.70 ] 1乙。 日本のC言語底辺教育の総本山だ。 大事に使ってね。仲良く使ってね。
4 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 00:28:26.45 ] >>1 乙 前スレ > 986 名前:デフォルトの名無しさん [sage]: 2012/12/09(日) 20:24:53.93 > >>977 > 文字列反転関数 > void strrev(char *d) > { > int i; > int len = strlen(d); > char tmp; > for (i = len / 2 - 1; i >= 0; i--) { > tmp = d[i]; > d[i] = d[len - i - 1]; > d[len - i - 1] = tmp; > } > } > これは、"1234"を"4321"に変換する > > 987 名前:デフォルトの名無しさん [sage]: 2012/12/09(日) 22:06:01.62 > 副作用かっこわるい 副作用?何?と思ったが分かった。 char* strrev(char *d) { int i, len = strlen(d); char tmp; for (i = len / 2 - 1; i >= 0; i--) { tmp = d[i]; d[i] = d[len - i - 1]; d[len - i - 1] = tmp; } return &d[0]; } なら良いのだな。 ところで、XORを利用したswapもあるんだね。 ttp://www8.cs.umu.se/~isak/snippets/strrev.c
5 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 01:13:18.61 ] >>4 前スレ987が勘違いしてる。 関数型言語でいう副作用排除なら、別エリアに編集する方法もある。
6 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 04:20:49.17 ] 初心者なんだろうけど、いろいろと気持ち悪いコードだな
7 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 11:48:54.44 ] うん
8 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 12:25:55.24 ] 何を返そうと、入力を破壊的に変更したら副作用だべ
9 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 12:39:29.02 ] 前スレ986,987共に、引数はchar*だけなので、入力書き換えじゃなくて、引数から参照した先の状態書き換え。 C初学者が間違いやすい所。
10 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 12:50:14.68 ] Cには値渡しかないから、ポインタを参照渡しの代用にしてるんじゃないの。 なんにしても関数の外にあるものを変更したらそれは副作用だけども。
11 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 13:04:48.07 ] strdup()してから反転して返しても副作用と言うんかい?
12 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 13:12:00.32 ] 関数内でstrdup()したなら、それをどういじくってから返そうと副作用じゃないのでは。 ヒープからメモリが確保される事も副作用と考えるならダメだけど。
13 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 13:16:08.30 ] ダメだけどね
14 名前:12 mailto:sage [2012/12/10(月) 13:43:03.70 ] 調子にのってました ごめんなさい!
15 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 13:47:08.41 ] うむ、分かればよろしい
16 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 14:38:29.05 ] C言語なら俺に聞け(入門編)Part 109 toro.2ch.net/test/read.cgi/tech/1350461655/ 966 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/17(土) 12:11:48.06 純粋に関数としてみると、printfは書き込まれた文字数を返す関数。 画面に文字を表示するのはprintfの副作用。 968 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/17(土) 12:29:40.99 >>966 すみません、その副作用とはなんでしょうか。
17 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 14:39:32.30 ] 977 名前:デフォルトの名無しさん[sage] 投稿日: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の副作用。
18 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 14:40:03.28 ] 979 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/17(土) 13:42:07.78 >>977 うーん、return で返す値以外は、関数にやらせることが"副作用"なんですかね。 引数void戻り値なしなら、関数の処理は全部、"副作用"? 981 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/17(土) 14:08:18.34 >>979 >引数void戻り値なしなら、関数の処理は全部、"副作用"? そのとおり 982 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/17(土) 14:36:24.96 void func(int *a){ *a = *a + 1; } を副作用って言うのは、正直微妙な気がする。
19 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 14:46:56.19 ] 微妙、じゃなくて この計算機工学界隈での定義であり用語だろ
20 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 15:14:41.51 ] そうだけど、何か?
21 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 16:10:07.70 ] 用語が実態と乖離してるのを微妙に感じるってことだろ
22 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 16:22:46.22 ] 副作用ってのはその関数においてローカルでもstaticでもない変数に書き込みを加えることを指すわけで、 returnだの引数だのといった説明は的外れ。
23 名前:22 mailto:sage [2012/12/10(月) 16:24:55.70 ] 間違えた。訂正。 副作用ってのはその関数が終了してもメモリ上に残るような変数に書き込みを加えることを指すわけで、
24 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 16:49:05.95 ] 副作用の事は入門レベルじゃないが、Cは状態依存(Statefull)で、副作用を積極利用してる言語だからな。 計算モデルでの、宣言的プログラミングとは違うモデル(ハードがStatefullなんだからしょうが無い)。 入門レベルをクリアしたら、CTMCP(コンピュータプログラミングの概念・技法・モデル)とかで違いが判る。
25 名前:デフォルトの名無しさん [2012/12/10(月) 19:04:57.92 ] うんこ
26 名前:デフォルトの名無しさん [2012/12/10(月) 19:08:28.71 ] ちんこ
27 名前:デフォルトの名無しさん [2012/12/10(月) 19:12:22.98 ] ちんこ
28 名前:デフォルトの名無しさん [2012/12/10(月) 19:29:11.66 ] ちんこ
29 名前:デフォルトの名無しさん [2012/12/10(月) 19:31:12.98 ] ちんこ
30 名前:デフォルトの名無しさん [2012/12/10(月) 19:53:55.84 ] ちんこ
31 名前:デフォルトの名無しさん [2012/12/10(月) 19:56:23.11 ] ちんこ
32 名前:デフォルトの名無しさん [2012/12/10(月) 20:00:19.70 ] いんぽ
33 名前:デフォルトの名無しさん [2012/12/10(月) 20:02:23.27 ] ちんちん
34 名前:デフォルトの名無しさん [2012/12/10(月) 20:05:52.99 ] ちんちん
35 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 20:16:18.71 ] C言語とちんこ言語どっちが難易度高いですか?
36 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 20:22:37.93 ] ちんこ言語って知らないけど、とりあえずCはそれほど難しくないからちんこのほうじゃね
37 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 20:34:05.04 ] グローバルの時代にクーラー効いた部屋でC言語プログラミング 時代錯誤にも程があるカスがwwww
38 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 20:53:10.15 ] #include <math.h> を書いて数学関数を使うプログラムを書いたのですがコンパイルでエラーになりました。 gccに-lmオプションをつけたらやっとコンパイルが通ったのですが、Cの教科書には-lmオプションのことなんか一言も書いて有りませんでした。 本当にありがとうございました。
39 名前:デフォルトの名無しさん [2012/12/10(月) 20:54:35.07 ] うんこー
40 名前:デフォルトの名無しさん [2012/12/10(月) 20:56:45.22 ] ちんこー
41 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 20:57:49.17 ] >>38 コンパイルは通ってリンクでエラーになってたんだろ。
42 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 21:31:49.74 ] うん、こ
43 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:24:48.34 ] printf関数を使う時ってstdio.hをインクルードして使うじゃないですか てことはstdio.hでprintf関数が定義&宣言されてると思ってたんですよ けれど detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1331505108 のベストアンサーを見てみたら >printf関数をコールするにはstdio.hと言うヘッダーファイルを#includeでインクルードします。 >そしてprintf関数が入ったライブラリファイルをコンパイルにリンクするように追加します。 って記述があったんです これってprintf関数はstdio.hじゃぁなくてライブラリファイルで定義されてて stdio.hでは宣言しかされてないってことなんですか?
44 名前:デフォルトの名無しさん [2012/12/10(月) 22:27:43.60 ] ちんこ
45 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:28:49.57 ] * ゚・*:.。.:*・゜+ d(*´∀`)b そうです +.:*・゜゚・*:. *
46 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:28:59.22 ] おまえはきっとライブラリファイルがテキストファイルだと思ってんだろ
47 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:29:56.02 ] 返信アリャシャス すっきりしました
48 名前:デフォルトの名無しさん [2012/12/10(月) 22:30:24.40 ] ちんこ
49 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:30:36.13 ] テキスト以外はバイナリだとおそわりました
50 名前:デフォルトの名無しさん [2012/12/10(月) 22:33:19.27 ] ちんこ
51 名前:デフォルトの名無しさん [2012/12/10(月) 22:39:16.47 ] tinko
52 名前:デフォルトの名無しさん [2012/12/10(月) 22:42:05.04 ] ちんぽいんぽ
53 名前:デフォルトの名無しさん [2012/12/10(月) 22:44:25.71 ] いんきんたむし
54 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 22:54:39.71 ] >>43 まぁ、そんな感じでいい
55 名前:デフォルトの名無しさん [2012/12/10(月) 22:56:04.81 ] ちんこくさい
56 名前:デフォルトの名無しさん [2012/12/10(月) 22:58:11.42 ] 皮でちんちんを包む
57 名前:デフォルトの名無しさん [2012/12/10(月) 23:02:19.27 ] ちんちんがぁ?
58 名前:デフォルトの名無しさん [2012/12/10(月) 23:06:54.55 ] ちんちんのぉ?
59 名前:デフォルトの名無しさん [2012/12/10(月) 23:10:38.14 ] 金玉がソファーにはりついて気持ち良い
60 名前:デフォルトの名無しさん [2012/12/10(月) 23:12:48.13 ] ちんちん
61 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 23:16:28.23 ] >>54 ありがとうございます…
62 名前:デフォルトの名無しさん [2012/12/10(月) 23:16:42.99 ] 床オナはちんちんの事をこれっぽっちも考えてない
63 名前:デフォルトの名無しさん [2012/12/10(月) 23:29:26.61 ] ちんぽこりん
64 名前:デフォルトの名無しさん [2012/12/10(月) 23:31:44.13 ] ぽこちん祭り
65 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 23:36:46.19 ] mallocしたメモリは関数の呼び出し元・呼び出し先のどちらでfreeするのがいいのでしょうか? 普通に考えれば呼び出し先で、freeすることはほとんど無いはずなのですが GUIのWindowみたいにいつ終わるかわからないものは、呼び出し先でfreeするのがベストかと思います。
66 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 23:54:06.07 ] >>65 巣からでてくんな main以外★mallocの後にfree不要と言うバカいるの? toro.2ch.net/test/read.cgi/tech/1352812333/
67 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 00:02:45.66 ] 山ほどあるcで書かれたコード嫁
68 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 00:26:52.67 ] 後片付けは自分でしなさいとこだわる人もいるだろうけど、 手紙なら読んだ人が処分するよね。 相手が読むのだけを待って、読み終えたら自分で片付けなくては いけないなんて効率悪いと思う。 ただ、誰が片付けるかは明確にしておかないといけないけど。
69 名前: ◆QZaw55cn4c mailto:sage [2012/12/11(火) 00:59:33.94 ] >>37 >グローバルの時代に 聞くからに、とっても悲惨な時代だと、どーしても思うのですが
70 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 22:20:56.06 ] てs
71 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 22:23:22.11 ] てすと
72 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:28:07.76 ] #include <stdio.h> int uruu(int year); int main(void) { int a,b; int lastdays=0; int i; scanf("%d %d ",a,b); for(i=a;i<b;i++){ if(uruu(i)==1){ lastdays+=366; } else{ lastdays+=365; } printf("%d",lastdays); } int uruu(int year){ if(year%400==0){ return 1; } else if(year%100==0){ return 0; } else if(year%4==0){ return 1; } else{ return 0; } }
73 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:28:43.89 ] ↑ごめんインデントが汚いけれど 何がいけないの?
74 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:30:19.25 ] >>73 何がやりたいのか書かれてないのがいけない
75 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:32:44.96 ] ごめん 年度二つ入力して閏年考慮した上で、その間の日数を求めたい。 これはそのひな形。 とりあえず、動かないんだ。
76 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:33:55.62 ] scanfに整数わたしてる
77 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:34:10.21 ] >>75 scanf &
78 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:35:37.89 ] ごめん、それも忘れたたけど まだ動かない
79 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:36:37.18 ] どうなることを期待して、何が出るかくらい書け
80 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:38:30.82 ] インデントつけないのが悪いな。{ } が合ってない。
81 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:38:38.98 ] 例えば 2000、2007といれると 2000=閏年=366 2001=平年=366+365 みたいになることを期待してるんだけど
82 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:41:26.01 ] その期待に対して、何が出るか聞いてんだよ
83 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:48:17.40 ] for(i=a; i<=b;i++)
84 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 23:50:47.46 ] if(year%400==0){ ↓ if((year%400) == 0) %と=どっちが優先か忘れたけど
85 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 00:02:49.12 ] その前に、main()の } が足りないみたいだけど、コンパイル通るのか
86 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 00:06:34.15 ] ごめん、出来た。 けど、結局何がいけなかったのか分からない。
87 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 00:22:04.32 ] さっきのと比較しろや
88 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 08:38:08.83 ] int ndays(int y,int m) { int days; int month; int data[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; days=month[m]; if(uruu(y)==1 && m==2) { days+=1; } return days; } この関数なのですが、何か問題がありますか? プロトタイプ宣言もしてあるのですが、動作しません。
89 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 08:42:14.92 ] >>88 >days=month[m]; わからんけど、ここな気がする
90 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 08:43:17.40 ] days=data[m]; こうじゃね?
91 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 09:00:03.38 ] 「動作しない」と「コンパイルできない」くらい区別してくれ
92 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 11:36:21.71 ] time_tに変換してdifftime()すればいいものを。 課題とか実験とかなら判るけど、馬鹿に限って手を抜くことをしないからなぁ。
93 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 11:47:03.49 ] 入門編でしか暴れられない奴が言ってもなあ。
94 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 12:26:49.69 ] difftimeを知ってるならもう中級者
95 名前:デフォルトの名無しさん [2012/12/12(水) 14:01:42.04 ] 数字の末尾が2,4,6,8であるかどうかの確認ってどうするんでしたっけ?
96 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 14:11:13.33 ] わからない
97 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 14:32:35.90 ] お年玉葉書か。
98 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 14:34:24.52 ] >>95 bool isLastDigit2468(int value) { char foo[20]; char digit = foo[sprintf(foo, "%d", value) - 1]; return digit == '2' || digit == '4' || digit == '6' || digit == '8'; }
99 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 14:38:57.74 ] >>95 i%10&&!(i%2)
100 名前:デフォルトの名無しさん [2012/12/12(水) 14:45:35.40 ] 今日からC言語を覚えます! みんなよろしく\(^o^)/
101 名前:デフォルトの名無しさん mailto:sage [2012/12/12(水) 15:26:00.55 ] やだ