C言語なら俺に聞け 147

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/08/16(木) 23:36:02.22ID:fOCSKLtw
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 146
https://mevius.5ch.net/test/read.cgi/tech/1525031257/
2018/08/17(金) 02:03:10.65ID:itWjjCCs
>>1
乙なんだな
2018/08/17(金) 04:59:04.13ID:xjFqJl5K
>>1
乙ってんね
2018/08/17(金) 07:32:18.55ID:TtX4VAeH
前スレ992
https://mevius.5ch.net/test/read.cgi/tech/1525031257/992

ちょっと何言ってるかわからん
983はナマポと何の関係があるのかと聞いているんだが??
2018/08/17(金) 09:26:07.17ID:VdqNpuZ9
>>1
おC
6デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:07:35.20ID:hKcJGgnp
>>1
乙curry
2018/08/17(金) 20:50:45.41ID:dgg8VvhO
>>4
ちょっとはググって言え。

使い道のないはずのイテレータをC++ではどう活用してるのか、
何故そんなことになるのか、考えてみろ。
2018/08/17(金) 20:54:30.35ID:dgg8VvhO
というかこのスレワッチョイ外されているんだな。
最近この手の荒らし多いな。

俺はワッチョイ無しのスレは気に入らないから、
>>4の疑問について、ワッチョイ無しのスレ(=このスレ)では答えないことにする。
まあもうヒントは十分に与えたし、馬鹿でなければ辿り着けるはずだが。
2018/08/17(金) 21:23:33.04ID:oMyhNvCc
イテレータへのこだわりは確かに謎。結局ローレベルな話なんだよね。
foreachという切り口だとイキるのが難しいということか。
2018/08/17(金) 21:26:26.11ID:2ZlVaol+
ナマポとプログラム言語の関係性はさっぱりわからない
2018/08/17(金) 21:41:35.78ID:zrmK36kH
アホ? list<T>::iteratorがナマポ撲滅のためとか本気で言ってるのか?
2018/08/18(土) 00:42:04.17ID:JHZyD4lZ
改めて明解C読んだけどどう考えても入門者向けじゃねえなこれ
これ最初に読んだせいで挫折した人多そう
2018/08/18(土) 01:38:53.00ID:MBfkrj0T
その教科書は教師を再生産するための商品
独学でどうにかするアイテムじゃあない

教科書の肝心のところに教師から教えてもらうフェイズがひっそりとしのばせてある
だから教師の関与が深い
補助の人間が必要な物品だよ
教科書を誰が買うかっていうと、先生がより先生っぽい演技・活躍を出来るアイテムを買うだろ
だから教師の再生産をするためのアイテムを教師が生徒に買わせるんだよ

教科書は生徒が買うんじゃなくて先生が買う、
そのフェイズでは教師の介在があってはじめて理解できるようなひっかけがなくちゃあならない、
だから「入門者向けじゃねえ」になる
2018/08/19(日) 16:42:31.78ID:Gtfg19Vf
C言語の入門書を読み終えて文法をある程度理解したところなんですけどこの次はどうしたらいいんでしょうか・・・
2018/08/19(日) 16:48:10.98ID:mbogTHsz
何かを作って見る
何を作るかは自分で決める
決められないときは、みんなに相談してみる
2018/08/19(日) 16:58:14.33ID:PTySIHXJ
>>14
アルゴリズムとデータ構造の本を一冊買って勉強しとけ
もちろんコードを書くんだ
コードを書かないならそんな本は買わなくてよろしい
2018/08/19(日) 17:25:20.88ID:ko+uHAy8
>>14
標準ライブラリの関数の仕様を調べつつ、自分で実装してみる
2018/08/19(日) 18:06:47.62ID:WWHW9JqB
printf と scanf のフォーマット処理は勘弁してください
2018/08/19(日) 18:41:28.69ID:vfinpyXk
ありがとうございますとりあえずアルゴリズムとやらの本を買います
20デフォルトの名無しさん
垢版 |
2018/08/19(日) 21:04:33.17ID:FQWxbBlW
これどう?初心者だとちょっと難しいかも知れないが。

[改訂新版]C言語による標準アルゴリズム事典 Software Technology https://www.amazon.co.jp/dp/B07CG4RMT5/ref=cm_sw_r_cp_taa_xEvEBbAEA1JNT
2018/08/19(日) 21:44:56.14ID:inem1Ikz
だめでしょ。
アルゴリズムイントロダクションがいいよ
2018/08/19(日) 22:58:10.05ID:akAD1DPm
事典は事典。最小限の解説読んであぁなるほどねって思える人用。
2018/08/19(日) 23:13:09.55ID:wM6XArJ0
詳説 Cポインタ、2013、オライリー・ジャパン

ポインターだけで1冊、本が書けるw
2018/08/19(日) 23:22:19.21ID:lk0ey+5M
引数に配列をとるとき
f(int* data)とf(int data[])の両方が有りだということは分かったのですが、基本的に後者の書き方をしてるコードはほとんど無くて大体前者な気がします。
これはなんででしょうか。後者の方がはっきり配列だとわかります。前者は配列を求められているのかただのint型のポインターを求められてるのか判断つかないと思うんです
2018/08/19(日) 23:23:37.77ID:mbogTHsz
ポインターってそんなに難しかったっけ?
2018/08/19(日) 23:26:29.60ID:6TZ29Z92
ポインタ本ならこっちの方がいい

新・標準プログラマーズライブラリ
C言語 ポインタ完全制覇 大型本
前橋 和弥 (著) 2017/12/7
2018/08/19(日) 23:55:12.29ID:wM6XArJ0
>>24
[ ] は、サイズが変わらない

* は、単なる先頭アドレスで、サイズが変わるかも知れない
2018/08/20(月) 00:01:28.25ID:FDfJ6Eqh
>>24
配列表記はアドレス表記のエイリアスだから区別するという発想がそもそもない
配列アクセスするコードならアドレスと配列のサイズを引数で渡す
2018/08/20(月) 00:03:41.14ID:OvqDIJZn
関数の引数としては配列であろうがポインタであろうが、ただのアドレスとしての意味しかない
2018/08/20(月) 00:12:09.78ID:V9a8ZDkH
>>29
配列でもポインタでも同じってことは分かってるでしょ
それでも元が配列なら配列で受けたほうが分かりやすいのでは?
という疑問だと思う

>>24
ぶっちゃけ、Cに慣れてくるとどっちでもたいして変わらない
配列で受けたいのならそうすればいい。
実際のところ、両方それなりに使われてる。
例えば、main() は int *argv[] にすることが多いんじゃないかな
多分だけど
2018/08/20(月) 00:19:11.88ID:houfzDz0
>>24
配列っぽい表記に惑わされて、sizeofして長さを求めようとしたというバグを何度か見ました。
2018/08/20(月) 00:26:25.44ID:ftO9aq8g
 
f(int data[100]) なんて渡し方だと、どう?
2018/08/20(月) 01:02:08.56ID:houfzDz0
そんな文法はない。
宣言としては有効かな。でも意味はないだろうね。ただのポインタ。
2018/08/20(月) 01:20:33.12ID:ftO9aq8g
>>33
じゃあ、これをポインタ表記に置き換えて見てください、お願い
2018/08/20(月) 03:08:45.92ID:k5zLgYIW
>>24
なるほど、じゃあ君は
void swap_int(int lhs[], int rhs[]);
と書いてもらえれば判断つきやすいんだな
36デフォルトの名無しさん
垢版 |
2018/08/20(月) 04:14:23.20ID:GHO1XUgy
なんというか、Cならではの問題かな。
Javaもちょっと似てるか。
2018/08/20(月) 06:23:59.34ID:W9GZumqR
下のようなコードを書くとコンパイルエラーになるでしょ。
int ary[100];
int val;
val = ary++;
このaryは配列だから、ary自体の値を変化させる操作は出来ない。
それの類推で関数の仮引数はポインタで受けるんじゃないかな。
関数の中でポインタ風に使う変数はポインタの形で宣言。

関数内で値を変化させず [] によるインデクスだけでアクセスするなら
仮引数を配列の形で宣言するのも分かりやすい書き方かも。

後は歴史的な事情。
配列風に書くとインデクス計算に掛け算を使われて遅かった名残り。


>>30 俺はmainの引数は main(int argc, char *argv[]) だな。
保守的だけど、こんな場面で独自色出すことないしね。
2018/08/20(月) 07:23:53.30ID:iMQAgpc+
>>24
あんたの感覚は正しいと思う
同じだと言ってる奴もいるけど
foo(int a[]){
a = … /* エラー */
とか微妙に違う
ただそこまで気にする人があまりいないだけ
2018/08/20(月) 07:29:22.22ID:OvqDIJZn
関数の引数では配列の要素数は無視されるだけ
変数としての配列とポインタは別物だけど、関数の引数では全く同じもの
2018/08/20(月) 08:10:21.73ID:iwav6OWh
理由は既出だけど、C言語では配列とポインタは明確に違うよ。
相互変換可能なだけ。
2018/08/20(月) 09:01:16.78ID:KJZ73X54
ぶっちゃけ、相互変換可能ならその二つは同じじゃねえか?
数学的に
2018/08/20(月) 09:09:43.44ID:zNROsdOB
同じ点もあるし違う点もある
同じ点を強調したいときに「同じ」
違う点を強調したいときに「違う」
と言うだけ

具体的に語らないと何の意味もない
2018/08/20(月) 09:30:29.85ID:W9GZumqR
>>38
そのコード片、エラーになるかな?
仮引数のa(intへのポインタ)に
関数内で値を代入することは許されるはずだけど。
2018/08/20(月) 10:24:22.53ID:B6E8iGMG
代入ではエラーにならんと思うよ。
lvalueとして使えると思う。配列っぽく書けるがあくまでポインタ。
2018/08/20(月) 10:37:33.39ID:iMQAgpc+
>>43-44
すまん、お前らの言う通りだ
なんか勘違いしていたみたい
2018/08/20(月) 11:31:29.94ID:mV0yla1z
>>20
パクリで儲かる成功例
2018/08/20(月) 11:46:22.27ID:B6E8iGMG
引数の配列がホンモノだとすると、非NULLが保証されてないとあかん。
というか構造体渡しと同様の配列渡しが必要だな。まあ使わんか。
2018/08/20(月) 13:08:43.61ID:k5zLgYIW
>>37
その例は
void func(int ary[100])
{
int val;
val = ary++;
}
との違いを示そうとしているのだとしたら
int *val; じゃないとおかしいだろ

>>37
[]で書くべきと主張するんなら
char argv[][]にしなきゃねえ
もちエラーだけどw
49デフォルトの名無しさん
垢版 |
2018/08/20(月) 13:28:58.98ID:HLNtX2wQ
>>47
ま、必要なら構造体の中に入れて渡すと。
2018/08/20(月) 16:12:09.36ID:K5YeoIjy
配列をパラメータにするのは
サイズが決まってる時にそれを明示したい場合くらいだな

ポインタの方が汎用性が高いから
2018/08/20(月) 16:14:24.46ID:K5YeoIjy
構造体みたいに
値渡しやコピーもあると(たまには)便利
2018/08/21(火) 07:18:10.26ID:gERn4ySS
>>50
void func(int ary[100]); これと
void func(int *ary); これが
意味が違うと思っているのか?
2018/08/21(火) 07:20:36.44ID:hlK4Wy69
設計意図を示すコメント的な意味ならあると思う
中身は同じだけど
2018/08/21(火) 07:38:47.67ID:Xgm2Pp2D
初心者に対して誤解を与えるだけじゃね?
必ずそのサイズで呼ばれると保証されるわけでもないし。
2018/08/21(火) 08:20:07.94ID:FuTngql1
>>52
意味は違うね

要素が100個以外の時に前者を使ってるコードを見たら気持ち悪いだろ?
そういうこと

コンパイラによってはary[1000]にアクセスすれば警告が出る
2018/08/21(火) 08:40:04.69ID:ZsMFgi2m
ほんとに警告出るのか?
サイズ指定に意味がないというのが規格だし、コメント程度の役割しか持たせたらあかんという気が
2018/08/21(火) 08:48:21.68ID:Y1HyydAv
gcc8でもclang6でも警告でなかったょ…
2018/08/21(火) 09:13:57.61ID:GIXT+l9b
お高い静的解析ツールだと警告出るかもね。
やってないから知らんけど。

そういう環境で開発できるならコメント以上の意味はあるかも。
仮定で申し訳ない。
2018/08/21(火) 09:28:29.44ID:gERn4ySS
>>55
おまえの主観は聞いてない
プログラムの実行結果が違ってくる例を示せ
2018/08/21(火) 09:30:24.31ID:Y6yN+LUK
>>59
屁理屈乙
2018/08/21(火) 09:31:42.61ID:hk/Hf9fq
>>48
多次元配列なら
void func(int ary{}[100])
{
}
とか
void func(int (*ary){}[100])
{
}
2018/08/21(火) 09:35:21.28ID:hk/Hf9fq
>>61
間違えた

void func(int ary[][100])
{
}
とか
void func(int (*ary)[100])
{
}
2018/08/21(火) 10:40:22.58ID:gERn4ySS
>>60
もう一度言う、おまえの主観は聞いてない
正論か屁理屈かはおまえの主観だ
客観的事実を示せ、理屈はそれからだ
2018/08/21(火) 10:57:00.63ID:vnB4usre
>>63
だれも機械の解釈の違いには言及してない定期
2018/08/21(火) 10:59:30.05ID:gERn4ySS
>>62
void func(int ary[][100]); これはできるのに
int func(void)[][100] これはできない
{
int ary[][100]; これもできない
ary = 0;
return ary;
}
extern int ary[][100]; と
extern int (*ary)[100]; は意味が違う
結局、[]で書くべきなんて主張は
通用しないところが多すぎる戯れ言だ
2018/08/21(火) 11:01:09.20ID:gERn4ySS
>>64
プログラム言語は機械に解釈させるためのものだ
自明なことを誰も言ってないなんてことこそ屁理屈そのものだろうが
2018/08/21(火) 11:01:29.60ID:+F/9g7TB
>>66
糖衣構文
2018/08/21(火) 11:02:23.89ID:gERn4ySS
>>67
全然関係ねえぜ
暑さで気が触れたか?
2018/08/21(火) 11:05:05.84ID:eIEuxTun
>>68
機械の解釈が同じでも人間には違う意味に見えるのはあるよな?
2018/08/21(火) 11:55:44.43ID:gERn4ySS
>>69
void func(int ary[100]); これのどこが
void func(int *ary); これの構文糖衣なんだ?
書いた奴の頭を疑わせる以外にどんな意味があるんだよ
2018/08/21(火) 11:56:39.26ID:gERn4ySS
サイズが100でなければならない関数なら
void func(int (*ary)[100]); こう書いて
int ary[100];
func(&ary); こう渡せよボンクラ
2018/08/21(火) 12:10:27.14ID:QteKsmYB
まあ多次元配列を引数にするのは良くないと思うわ
2018/08/21(火) 12:28:57.33ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
2018/08/21(火) 12:29:15.96ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
2018/08/21(火) 12:47:09.71ID:EQ4qcC3V
>>72
なぜ?
2018/08/21(火) 12:53:55.98ID:gERn4ySS
>>73
ここがム板ってことを忘れたか?
技術的な話で来い
77デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:54:14.69ID:m1oFA/yA
多次元配列の型は typedef で型名作っておけば楽なのでは?
2018/08/21(火) 12:56:41.15ID:Fhw28p93
>>68
>>76
この書き込みのどこが技術的な話なんだw
単にイキってるだけじゃん。
2018/08/21(火) 13:04:39.72ID:gERn4ySS
>>78
構文糖衣の話をしたんだが
構文糖衣と書いてないと読めないオツムなのか?
アホw バカwww
2018/08/21(火) 13:05:57.10ID:gERn4ySS
さて、買い物に行くぜ
妻子の夕飯を作らにゃならん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況