C言語なら俺に聞け 141 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/07/17(月) 21:06:47.63ID:J4JGo3XO
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/


http://mevius.2ch.net/test/read.cgi/tech/1494508803/
http://www.geocities.jp/c_cpp_cs/about_c/
2017/07/29(土) 08:53:25.58ID:ULoSSJ2b
>>365
ふん、それはCを知らないといっているようなものだよ‥
>>360を書けばわかる
2017/07/29(土) 08:54:11.31ID:TpFswTs0
> そこそこ行けるしね
と書くとアンダーラインになるのか?
2017/07/29(土) 08:55:16.84ID:TpFswTs0
マクロでもそこそこ行けるしね

そこそこ行けるしね

行けるしね
2017/07/29(土) 09:20:46.96ID:zJVnUUbX
>>366
続きってなんだよ w
2分木なら双方向リストと同じだぞ w
struct List_t {
struct List_t *Left;
struct List_t *Right;
double Data;
};
2017/07/29(土) 09:21:39.47ID:zJVnUUbX
>>368
アンダーライン w
2017/07/29(土) 09:28:06.03ID:14mINgXT
ん?
二分木なら3個とつながってるから、
普通3個リンクを張る
2017/07/29(土) 09:29:28.03ID:dTbBo9oQ
>>364
お、標準ライブラリのソート全否定か?
Cではちょいちょい捨てるよちょいちょいね
常に型を保存したかったらC++使うしかない
2017/07/29(土) 09:29:42.67ID:14mINgXT
あと、色情報も普通はつける
2017/07/29(土) 09:43:22.80ID:N+YJafLA
>>364>>370 も、何の構造?

親をたどれないとポインタを一個進めることも出来ない

C++でいうsetの話をしたわけじゃないの?
2017/07/29(土) 09:43:31.26ID:zJVnUUbX
>>372, >>374
赤黒とかの前に2分木の基礎からやり直せ
2017/07/29(土) 09:45:52.74ID:zJVnUUbX
>>373
> お、標準ライブラリのソート全否定か?
>> 安易に捨てるのは
の意味もわからないアホ w
2017/07/29(土) 09:49:09.48ID:zJVnUUbX
>>375
>>364 に対して親とか知ったかが背伸びするなよ w
根や親を各ノードに持つか別に管理するかは要件次第
2017/07/29(土) 09:54:12.77ID:N+YJafLA
ポインタを進めたり戻したりする必要がなければ
親にリンクを張らなくてもいいけどさ

std::setと同等なものをイメージしたけど、
まったく違うものが突然出てきたわけね
2017/07/29(土) 09:59:21.62ID:N+YJafLA
>>364はそもそも二分木では無いのか

>>357のリストの中にリストっていうのはそういう意味なのか?
2017/07/29(土) 09:59:54.86ID:N+YJafLA
おれの読解力が無さすぎるのか、
説明がなさすぎるのか、
2017/07/29(土) 10:08:25.24ID:RY+TGg1x
>>381
>>286 >>287 にある通り、previousとnextと書いてると、大抵は双方向リストを意味してるものだと取る
ここがleftとrightと書いてると、意味上は全く同じなんだけれども、単語の上からはまずは二分木を連想する
next一つだけだと、一番単純な連結リストであることを期待する
2017/07/29(土) 10:11:31.61ID:dTbBo9oQ
>>377
それいうならリストの中身void*にするのもそこまで安易な選択ってわけでもあるまいに
2017/07/29(土) 10:14:10.31ID:gxbujSGs
>>379
君以外はみんな「リスト」の話をしている。
君もそうだったのだがなぜか勝手に君だけsetだと言い出してる。

>>380
「リストの中のリスト」ってのは、配列で言うとジャグ配列、
つまりジャグリスト。(という言い方は普通しないが)

>>381
君の頭が悪すぎるだけ。
君以外はみんな噛み合っている。つまり、必要十分な説明はなされている。
つか、>>364,370を読めない奴が議論参加するな、という話でしかないが。

個人的には>>364でunionは使わない。マクロで量産だね。(手動テンプレート)
2017/07/29(土) 10:17:23.70ID:N+YJafLA
>>286は、
双方向を利用して作ったから名前が変なのかと思った
でも、追加したのが Child なのはどっちみち変だな
2分木だとしたら

>>370は2分木だろうけど、
これで何をしたいのかわからん
双方向と2分木が同じ発言の意味も不明
2017/07/29(土) 10:20:56.53ID:N+YJafLA
>>370で二分木の話が出た
もっと上ではsetの話が出ている
2017/07/29(土) 10:22:31.80ID:N+YJafLA
>>357
リストの中のリストって
list < list < int > >
こういう意味かと思ったけどこれも違うのね
2017/07/29(土) 10:26:44.77ID:N+YJafLA
まあいずれにしろ、>>289 は無いな
2017/07/29(土) 10:31:03.43ID:zJVnUUbX
>>383
ソート使うのにmalloc/freeは要らんだろ
2017/07/29(土) 10:35:15.55ID:dTbBo9oQ
>>389
リストなんてどうせmalloc/free使って運用するし別によくね?
2017/07/29(土) 10:36:49.65ID:gxbujSGs
>>385
>>286は「双方向リスト」だぞ。名前もかなり妥当。
つか、君だけまったく付いて来れてないが。

> 双方向と2分木が同じ発言の意味も不明
抽象化して「ポインタの数」という意味で捉えると同じ、ってことだよ。
これについてこれてないのは、「抽象思考出来ない馬鹿」だね。最近はよく見かけるが。

>>387
いや、そういう意味だぞ。


ふむ、なるほど、君は「リスト」を作れない馬鹿のようだ。君は何言語使いなんだ?
C言語使いなら、ド頭>>230でも否定されている通り、普通はリスト程度ならサクッと作れる。
(ただしそもそもリストなんて使わないが)
2017/07/29(土) 10:37:38.60ID:zJVnUUbX
>>384
> 個人的には>>364でunionは使わない。マクロで量産だね。(手動テンプレート)
ん?
ノードに値とリストのどちらかを入れられるリストと言う要件だと思ったが?
2017/07/29(土) 10:37:49.78ID:N+YJafLA
>>289
intのリストに1, 2, 3, ... , 10 を追加
するだけでもイヤになる
2017/07/29(土) 10:39:22.96ID:N+YJafLA
>>392
なんだ、結局おれ以外も会話が通じてないんじゃん
2017/07/29(土) 10:40:24.22ID:zJVnUUbX
>>390
まあお前がいいと思うならそうすればいいんじゃね?
2017/07/29(土) 10:41:41.06ID:N+YJafLA
>>391
あ、ごめん
>>385の一行目は >>364 の間違い
2017/07/29(土) 10:42:46.56ID:N+YJafLA
>>391の真ん中
>>364のコードはそうなってない
2017/07/29(土) 10:47:50.62ID:N+YJafLA
>>391の上半分

トポロジーがまったく違う
よって必要な処理もまったく違う
ポインタの数も、普通は2分木は3方向にリンクを張る
2017/07/29(土) 10:48:39.76ID:N+YJafLA
「普通は」とか書くと反論がくるのかな
「多くは」くらいにしておくか
2017/07/29(土) 10:58:06.68ID:N+YJafLA
>>370
結局これで何をしたいのかわからん

親へのリンクが無い、色が無い
って時点で汎用化とは程遠い
2017/07/29(土) 11:00:17.42ID:gxbujSGs
>>392
> ノードに値とリストのどちらかを入れられるリストと言う要件だと思ったが?
いや、そう明示されているわけではないよな?
次に、それが要件だったとして、或いは汎用化するために void* だろってのが皆の意見だ。
ここについては俺はいちいちキャストがウザいからデータはめ込み派(君と同じ)だが。
2017/07/29(土) 11:09:28.10ID:VkCqDRe3
Cばかり使っていると頭がこんなんなっちゃいます。
2017/07/29(土) 11:11:38.53ID:N+YJafLA
void* の問題はキャストもそうだけど
外部でメモリを管理する必要があるってところが大きいかと

多重リストだろうがunionだろうが
マクロでどうにでもなるんで
わざわざ不便な作りにする必要は無いかと
2017/07/29(土) 11:13:16.21ID:N+YJafLA
>>402
C++が使える環境なら素直にC++を使えって話だけど
いまだにCしか使えない環境ってのもあってね
2017/07/29(土) 11:14:41.46ID:eThbJX9n
(単方向)リストは先頭から終端の方向へ順にポインタを辿る、逆方向のポインタは無くても可(逆方向があるのは双方向リスト)
二分木は根から葉の方向へ再帰でポインタを辿る、親方向のポインタは無くても可(むしろ無いのが普通)
2017/07/29(土) 11:16:39.02ID:gxbujSGs
>>398
何度も言っているが君だけ付いて来れてない。いちいち全部なので端折るが、

> ポインタの数も、普通は2分木は3方向にリンクを張る
これについては既に回答済みで、引用すると、
> 根や親を各ノードに持つか別に管理するかは要件次第 (>>378)
で、全くその通りだ。

俺は君が何故これを理解出来ないのかもわかるが、
君は俺の質問に答える気がないようだから、教えてやらないことにする。
馬鹿のままで死ね。
2017/07/29(土) 11:16:58.24ID:N+YJafLA
Cってパフォーマンスを落としてまで汎用化するような使い方ってあまりしないしね
基本組み込み用

リストも片方向で済むなら片方向にするし、
そもそもリスト構造自体頻繁に使うようなものじゃない
2017/07/29(土) 11:18:34.04ID:N+YJafLA
だから、
Cで挫折する理由が「リスト」とかいう主張、
まったくチンプンカンプンで
2017/07/29(土) 11:19:32.62ID:zJVnUUbX
>>401
> いや、そう明示されているわけではないよな?
で、君は
> 連結リストの中に連結リストとか自由にやりたい
をどう解釈してマクロでやるって言ってるの?

> 次に、それが要件だったとして、或いは汎用化するために void* だろってのが皆の意見だ。
皆の意見? w
2017/07/29(土) 11:21:33.18ID:N+YJafLA
>>406
要件次第で変わるのに「同じ」と言ってしまう
2017/07/29(土) 11:23:02.49ID:N+YJafLA
>>406
>>400
2017/07/29(土) 11:26:20.62ID:gxbujSGs
>>409
俺なら型ごとにstructを用意、つまりテンプレートと同じことをする、ということ。

ただしvoid*にしろって言う意見も分かるし、C的にはそれもありだと思うぞ。
ここら辺は好みの範囲だとは思うが。
2017/07/29(土) 11:30:42.93ID:N+YJafLA
>>405
無いのが普通って
世の中を知らなすぎる

汎用のコンテナとしての2分木で
そういう実装な例があるなら
示していただけると
出来れば有名どころで

親がないと、ポインタを一個進めるのもコストがかかる
挿入した時に左右のバランスを保つのにもコストがかかる

もちろん、そういう処理がいらない
コンテナとして使わないような
特殊用途の2分木ならいくらでもあるだろうけど
今はコンテナの話だよね
2017/07/29(土) 11:30:53.18ID:zJVnUUbX
>>412
マクロの話がよくわからんがまあいいや
あんたが要件どう解釈したかもわからんからどうしようもないしな
2017/07/29(土) 11:32:58.28ID:N+YJafLA
例えばstd::setの実装はすべて親へのリンクがある
2017/07/29(土) 11:36:13.86ID:gxbujSGs
>>414
インラインマクロでゴリゴリに対応するのではなくて、
structの宣言部分をマクロ化して、
MyList(MyListDouble, double)
MyList(MyListInt, int)
で量産する、ということ。つまりテンプレートだろこれは。
2017/07/29(土) 11:44:36.57ID:N+YJafLA
コードサイズが大きい時は、
名前と型をdefineしてからinclude
とか良くやる
defineやincludeは上のMyListみたいなマクロで
2017/07/29(土) 11:59:50.67ID:ODSH1Ehs
>>416
ごめん意味わからん
union の代わりになるって言うことなんだよね?
2017/07/29(土) 12:00:47.71ID:EGnuLLJd
いつからコンテナの話になったんや
2017/07/29(土) 12:09:46.80ID:14mINgXT
>>418
型ならなんでも良い
2017/07/29(土) 12:10:50.91ID:14mINgXT
>>419
最初からずっと
2017/07/29(土) 12:13:39.65ID:14mINgXT
ていうか
コンテナじゃない2分木はあるけど、
コンテナじゃないリストなんて無いだろ

初期化リストか?
2017/07/29(土) 12:22:33.90ID:EGnuLLJd
コンテナの定義に詳しくないんだけど、Lispのリストはコンテナなん?
424デフォルトの名無しさん
垢版 |
2017/07/29(土) 12:24:27.13ID:vlC06Wfm
このスレは1000までリストの話で埋まりそうだね。物凄いスピードで。
2017/07/29(土) 12:35:38.98ID:gxbujSGs
>>418
俺は>>286派だって事。(>>370もあり。)
>>364は無し。てかどうでもいいところでunion使ってもろくな事にならないし。
void*も無し。主にキャストが面倒だから。でもunionよりはvoid*を選ぶ。

とはいえここら辺は好みの問題でしかないが。
俺なら、型固定>void*>unionだね。
2017/07/29(土) 12:48:00.97ID:TYuY3Yui
>>420
単にunion使わずに(メモリー気にせずに)struct使うって話?
2017/07/29(土) 12:51:34.43ID:QBDV3ETd
あんなあおまいら・・
これ、コレクションをライブラリとして持てという
あるいはそれをどう作るかという話なんだわ
例をあげれば、AppleのCFMutableArray
Win32ならなんだ?
2017/07/29(土) 13:02:32.44ID:14mINgXT
>>426
型ごとに作るってこと
2017/07/29(土) 13:09:06.48ID:TYuY3Yui
>>425
> 俺は>>286派だって事。(>>370もあり。)
> >>364は無し。
要件違うものを持ってきてそんなことを言われてもなぁ

> てかどうでもいいところでunion使ってもろくな事にならないし。
> void*も無し。主にキャストが面倒だから。でもunionよりはvoid*を選ぶ。
unionになんかトラウマでもあるのか?
まあ好みの問題と言うのには同意する
2017/07/29(土) 13:09:40.87ID:14mINgXT
MyList(MyListDouble, double)
MyList(MyListMyListDouble, MyListDouble)
2017/07/29(土) 13:11:30.55ID:gxbujSGs
>>427
C的には、
> コレクションをライブラリとして持て
いらんわ
> あるいはそれをどう作るか
必要なら自分で作るし苦労もしない

だと思うぞ。もちろんC++使ってもいいし、今更だろ。
ただそれ以前に、現実として、動的キー(辞書)が必要な用途はあまりないだろ。
Cの担当範囲なら、ほぼ全ての場合で構造体(静的キー)と配列で間に合う。(鶏と卵ではあるが)
もちろんこれら含めて汎用化したほうが楽だが、その分遅いのがLL言語な訳で。
2017/07/29(土) 13:17:05.76ID:QBDV3ETd
>>431
まあC++使えば済む話でもあるからな
2017/07/29(土) 13:27:26.48ID:gxbujSGs
>>429
> unionになんかトラウマでもあるのか?
いやお前少しは他言語もやれよ。
unionは他言語では廃止されている。理由はいろいろまずいから。
ググれば出て来るからやってみ。

まあそれ以前に君はunionの使い方を間違っている。
あれは、リード/ライトで型が違うときに使うものであって、
型違いだがサイズが同じだから突っ込む、という為の物ではない。
というか後者ならvoid*で受けていちいちキャストするというのが正しい。
しかしこれだと型チェックできなくなるからテンプレートにしろというのがC++だ。
2017/07/29(土) 13:29:31.36ID:N+YJafLA
形別 > union > void*

こうだな
もちろんサイズにもよるが
2017/07/29(土) 13:30:38.44ID:N+YJafLA
>>433
goto嫌いと同じにおいが
2017/07/29(土) 13:32:15.53ID:N+YJafLA
何度も書くけど、
外でメモリ確保解放強制はあり得ない
2017/07/29(土) 13:33:45.21ID:N+YJafLA
>>433
サイズが同じ?
2017/07/29(土) 13:34:53.52ID:N+YJafLA
unionの使い方は1つじゃないよ
2017/07/29(土) 13:41:10.88ID:gxbujSGs
>>432
Cは大前提としてそれがあるんだよ。
不満があればC++で大体事足り、それがbetterCだ。(俺の認識では)
つまり、リストが欲しいけど自分で作るのは面倒、だったらここだけC++使うか、って場合。
2017/07/29(土) 13:53:49.23ID:E5EEKRTu
>>433
> あれは、リード/ライトで型が違うときに使うものであって、
> 型違いだがサイズが同じだから突っ込む、という為の物ではない。
まあ確かにお前はunion使わない方がいいわ w
一応言っておくけど読み書きで型が違ったら値は保証されないよ
2017/07/29(土) 13:54:39.36ID:YB2Y7dkJ
union なくなると XEvent 困るだろう
2017/07/29(土) 14:04:10.84ID:uK1pt60X
unionて、メモリを節約できるのとそのメンバが同時に使われないってことがわかりやすいくらいだよな。
>>364もべつにunion使わなくてもいいわけだし。
2017/07/29(土) 14:11:28.22ID:gp3BUyJn
バズワード使うだけあってレベル低すぎる。>>433
2017/07/29(土) 14:20:45.06ID:gxbujSGs
>>440
> 一応言っておくけど読み書きで型が違ったら値は保証されないよ
値の保証はされてるだろ。
処理系に依存する(エンディアンが見えることが多い)というだけで。

いずれにしても、これが問題だと思う>>440のような馬鹿はunionを使うべきではない。
こんなの当たり前だろ、と理解できる奴だけがunionを使っていい。
そして現実として、unionを使わなければならない機会はほぼ無いから他言語では廃止されてる。
例えば、>>441とかは今なら継承で実装される。
2017/07/29(土) 14:21:28.04ID:ULoSSJ2b
union を使ったら見通しよく書けるのか?そうなのか?不思議な気分だ
よかったらサンプルコードを書いてほしい
2017/07/29(土) 14:51:40.09ID:E5EEKRTu
>>444
> 値の保証はされてるだろ。
されないよ、鼻から悪魔
2017/07/29(土) 14:58:48.36ID:E5EEKRTu
>>445
お前さんがどう思うかは知らんが>>364みてサンプルコードがが思い付かないならunionなんて使わない方がいい
2017/07/29(土) 15:15:38.90ID:ULoSSJ2b
>>447
それだけではわからないよ、実際に union の Child や Double の値を設定するところを見たいものだ
個人的にはうまくいかないと思っている
たぶんマクロを使うことになるし、マクロを使うんだったら共用体なんか使わないほうがよかった、という結果になりそう
2017/07/29(土) 15:26:51.26ID:14mINgXT
何がわからないかわからない
2017/07/29(土) 15:35:05.11ID:14mINgXT
unionは、
普通に同時使用しないメンバに対して使われることもあるが
実際に使う環境を把握した上で
同じアドレスに対して複数のアクセス方法を
用いる場合にも良く使われる

一番あるのが、レジスタの定義
チップメーカーなどがヘッダとして提供したりする
ビットフィールドアクセスやワードアクセスなど、
複数のアクセス方法を使えるようにするため
あとは複数の型へのポインタをunionで定義したり
2017/07/29(土) 15:36:30.30ID:14mINgXT
>>364は環境に依存しない、
普通の排他メンバの使い方
2017/07/29(土) 15:41:58.78ID:14mINgXT
メモリをケチる為のunionは
時代とともに使う頻度は減っているが

複数のアクセス方法の為のunionは普通に使われる
もちろん環境依存コード
例えばWindows APIのLARGE_INTEGERも
この使い方のunion
2017/07/29(土) 15:46:20.38ID:gp3BUyJn
アセンブラじゃ共用が当たり前。だからCにある。それだけ。
x86のレジスタはまんま共用体。ワイヤー数、バス幅に制限があるんだから共用して当たり前。
本来、ハードの仕様を実装するためのもの。
2017/07/29(土) 16:09:53.11ID:N+YJafLA
なんか違う
2017/07/29(土) 16:11:44.21ID:gxbujSGs
>>449
まず大前提としてコードを再利用する仮定だ。
ベタにコピペした場合は関係ない。

>>364のunionは今なら継承で実装されることが多いはずだ。
当然Dataはテンプレート化され、
Previous,Nextへの書き込みは基底クラス、Dataへの書き込みは派生クラスに配置される。
これがC++的解決。

unionだと一見何でも書けるように見えるが、
実際は派生型を手動で扱っているのと同等なので、
共通書き込みルーチンを用意できない。これが>>448の言う、
> 個人的にはうまくいかないと思っている
で、俺もそう思う。
マクロを強引に使えば出来るかもしれんが、それなら上記C++的解決の方がマシ。

>>452
> メモリをケチる為のunionは
> 時代とともに使う頻度は減っているが
これって>>364の使い方、ということでいいのか?
それならC++的に言えば、
糞だからクラステンプレートと継承で対応できるようにして廃止した、というところだろう。

> 複数のアクセス方法の為のunionは普通に使われる
多分これ以外のunionは必要ない。
そして俺はこれについてはリート/ライトで型が違っても値が保証されていると認識している。
(一応言っておくが同じ値が読めるという意味ではない。《>>446の馬鹿は多分この勘違い》
プログラマから見て値が確定的、という意味だ。)
仕様に詳しい奴がいればよろしく。
456デフォルトの名無しさん
垢版 |
2017/07/29(土) 16:26:09.19ID:mj0H/MXI
初期化リストの話は終わったのか?
2017/07/29(土) 16:38:11.08ID:Y1dtbxTh
>>456
今union、次extern
2017/07/29(土) 16:51:08.52ID:ULoSSJ2b
>>453
たしかに遥か昔の DOS コールラッパではそうしていたけれども…なんか違うきがしないでもない
共用体の適切な使い方はおもいつかないね…
2017/07/29(土) 17:00:18.71ID:ULoSSJ2b
>>449 全部がわからない:−)
>>364 の方針で >>357 を書いてくれる人はいないものか
ちょっと想像がつかないんだ

void *data 派であるけれどもマクロの方はわかる、工藤智行氏の書籍にてさんざんやっていたからね https://www.amazon.co.jp/dp/4774100544/
2017/07/29(土) 17:05:21.12ID:zJVnUUbX
>>455
よく知らないなら黙ってりゃいいのに w
2017/07/29(土) 17:05:34.42ID:EGnuLLJd
共用体なんて使うとしたら、sdl_eventと同じように、enumとセットだろ〜?
462デフォルトの名無しさん
垢版 |
2017/07/29(土) 17:29:39.44ID:Xv3aO8mX
トリコロシ
2017/07/29(土) 17:35:09.29ID:CXR2+t0L
COBOLだとレベル番号で同じことが出来るね
2017/07/29(土) 17:35:29.83ID:zJVnUUbX
>>461
まあそうだね
もっと早くにその突っ込み入るかと思ったけどunionをとうとうと語る奴とか低レベルすぎて笑うしかない状態なのよ w
2017/07/29(土) 17:37:42.13ID:14mINgXT
>>364は自由な型じゃない
doubleのリスト
doubleのリストのリスト
doubleのリストのリストのリスト
...


他の型が必要ならunionに追加する
2017/07/29(土) 17:41:42.52ID:gxbujSGs
>>461
その場合も今は継承で実装されるのが普通で、それで何も問題ないだろ。
だからもう共用体は古いんだよ。それが俺の言った、
> JavaやC#の方が簡単だから。
> その後出てきた言語はCの駄目なところを改善している。(>>251)
であって、JavaもC#も共用体は廃止済み。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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