C言語なら俺に聞け 144

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 838a-3nWA)
垢版 |
2017/12/23(土) 19:33:43.89ID:dghfoRy20
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.5ch.net/test/read.cgi/tech/1509107288/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/01/05(金) 16:41:35.06ID:YLrUpulc0
char * const と const char * の違い
73デフォルトの名無しさん (ワッチョイ 1fd6-2A+B)
垢版 |
2018/01/05(金) 17:54:32.46ID:SpC7EOR80
>>71
ブーメランおいしい?www
74デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/05(金) 18:07:43.83ID:T2NhU/kFa
そういや前にどこにconst入れるとどこが定数扱いになるか色々やって調べたことあるなあ。
2018/01/05(金) 18:28:56.45ID:/3vfwTzea
const char *p; と char const *p; は p が指す先が定数で char * const p; は p 自体が定数なんだよね。
76デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/05(金) 19:10:23.97ID:T2NhU/kFa
まあしかしコンパイラには char *p = "..."; の宣言で *p に書き込みアクセスするような記述を見つけたら警告ぐらい出して欲しいところだな。
実際に(少なくともデフォルトでは)動かないコード吐くわけだし。
2018/01/05(金) 20:16:53.14ID:q5xsNlvVd
ポインタである以上なんでも指せるし、
どう使うかは完全に自己責任では?
2018/01/05(金) 20:55:22.53ID:/8+f7RxD0
ま、確かに。他の所を指すように使い回せるけどね。うーん。
2018/01/05(金) 21:56:39.58ID:IkbAePsg0
>>70に加えて、
const char* const p = "aiueo"; // p も *p も const
も使い分ければいいだけだろ。

つってもこの書き方、非標準なのか?以下ページ以外では見あたらない。
https://qiita.com/pink_bangbi/items/a36617bf1d5923743d69
80デフォルトの名無しさん (ワッチョイ 1fd6-5YeV)
垢版 |
2018/01/06(土) 08:11:50.88ID:9HgF2CnS0
>>79
ISO/IEC 9899:2011 A.2.2に書いてあるんだが、おまえさんには見えないのか?

7.3) type-qualifier:
const
restrict
volatile
_Atomic

7.6) pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer

7.6) type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier
2018/01/06(土) 11:14:58.36ID:3YD8ke1c0
char **pをconstするとそんな感じにならなかったけ?
82デフォルトの名無しさん (アウアウウー Sa8f-hL1C)
垢版 |
2018/01/06(土) 16:50:26.91ID:Dhtt7sCWa
あ、こういう問題作れるね。

・ それぞれの違いについて説明せよ。

const char **p
char const **p
char * const *p
char ** const p
char * const *p
char * const * const p
char const * const * const p
char const ** const p
2018/01/06(土) 18:52:18.14ID:0jo5cy8h0
>>82
悪問だけどな。結局の所、
・constは複数回指定できる
・constの右側の固まり全体が定数と見なされる
だけだし。逆に言えば、それらを別物/良問として認識するような奴は上達しないのだと思う。
(記憶の前処理としてabstractionする癖がない)

だからこれまでそんな馬鹿げた問題を出す奴はC界隈には居なかったし、今後も多分そうだ。
CodeIQの広告でその手の問題をよく見るが、あれじゃ「馬鹿です」と自己紹介して居るも同然だし。
まあ所詮リクルート(コード書いてない連中)だからそんなもんだが。
とはいえ、何らかのテストで簡単にそいつの実力を把握できる事が出来るのなら、役立つのも確かだが。

そしてそれ以前にconstが大して役に立たないからなあ。
2018/01/06(土) 19:00:28.28ID:BwjYxRoc0
>>83
> ・constの右側の固まり全体が定数と見なされる

え? これ違わない? というのは

const char *p = "...";

の場合は p は p++ できたりして const じゃないから右側の塊ではない。
2018/01/06(土) 19:13:55.66ID:0jo5cy8h0
>>84
お前は上達しないタイプだね
2018/01/06(土) 19:53:29.84ID:BwjYxRoc0
いやあ、それほどでも。
2018/01/06(土) 20:34:46.10ID:qhltNRsR0
>>84
>const char *p = "...";
は char const *p = "":
に等しい、例外みたいなもんじゃないか?
2018/01/06(土) 20:41:46.13ID:a2JToFVw0
変数型宣言と初期化を同時に記述してっからそうなるんだろ?
2018/01/06(土) 20:49:46.88ID:A2dnXNCo0
>>82
1: const char **p
2: char const **p
3: char * const *p
4: char ** const p
5: char * const *p
6: char * const * const p
7: char const * const * const p
8: char const ** const p

1と2、3と5は同じ
char **pとchar const * const *pのパターンがない

こういう奴はプログラマーに向いてない
90デフォルトの名無しさん (ワッチョイ 0b9f-hL1C)
垢版 |
2018/01/06(土) 21:08:00.94ID:BwjYxRoc0
キリッ
2018/01/06(土) 22:07:37.32ID:0jo5cy8h0
>>87
例外ではない。
char部分はCでは常にcons扱い(=int等に変更できない)だから
constが修飾する対象に仕様上なり得ないだけ。
だからその2つは結果的に同じ意味になる。

というかCは文法例外はほぼ無いはず。
2018/01/07(日) 00:49:57.01ID:8rHqhWQu0
c++と勘違いしてね?
93デフォルトの名無しさん
垢版 |
2018/01/07(日) 06:32:55.29
自分流に解釈して覚えるのはいいけど、それが世界の真実かのように講釈するのは恥ずかしいから控えた方がいいよ
まあこのスレではいいけど、リアルの人間関係では陰で馬鹿にされるだけだよ
94デフォルトの名無しさん (ワッチョイ 0bbb-2A+B)
垢版 |
2018/01/07(日) 19:53:30.95ID:8XJu4dlo0
>>91
charがintに変更できないのがconstだからだと?
おまえさん char c; *(int*)&c = 1; が許されないことと勘違いしているのか?
95デフォルトの名無しさん (ワッチョイ 0bbb-2A+B)
垢版 |
2018/01/07(日) 19:54:10.54ID:8XJu4dlo0
いかん、間違えた
おまえさん char c; (int)c = 1; が許されないことと勘違いしているのか?
96デフォルトの名無しさん
垢版 |
2018/01/07(日) 20:44:34.88
ほらね、共通語をしゃべらないから話が発散する
2018/01/08(月) 15:01:42.36ID:3+trBLI4M
>>95
これってcをintに拡張して1を代入してcをcharに戻すの?
98デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 15:27:35.06ID:u4QX+fVn0
>>97
当たらずといえども遠からず
自分で言ってて無理を感じるなら
それが正解だ
99デフォルトの名無しさん
垢版 |
2018/01/08(月) 15:31:40.17
>>97
んなこたあない
>>94の書いてるコードと同義で、cの先頭アドレスからint分の領域に代入するだけで、cを拡張したり戻したりしてるわけではない
gcc 3.xやVC++2008では通ったが今のgccではコンパイルエラーになる記法
2018/01/08(月) 15:33:23.37ID:xTC/W6bpp
思いっきりメモリーリークして実行時に大暴走する悪寒しかしない。
101デフォルトの名無しさん (ワッチョイ 2bb3-RrJ/)
垢版 |
2018/01/08(月) 16:09:19.72ID:eKvnY0O/0
(int)cって右辺値じゃないの?
102デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 17:43:28.20ID:u4QX+fVn0
>>101
そうだよ
だけど一部の(まずいことに大手の)コンパイラが
左辺値としての用法を古くから許していた
2018/01/08(月) 17:56:03.73ID:YTvuEBugM
>>98
俺は初見ではcはcharのまま代入されて代入後の値がintとして評価されると見たんだが
2018/01/08(月) 18:25:44.79ID:8LuLzpAV0
>>102
Cは95のコードを書く池沼は死んでよし、って言語なんだよ。
だからそんなのは問題にもならない。
94はよく見るが、95は見たこと無いぞ。
105デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 19:03:01.62ID:u4QX+fVn0
若造が見たことないのは仕方ないよ
活発に議論されていたのがC89制定を目指していた頃のことだから
2018/01/08(月) 19:11:59.23ID:tyeiJEzF0
おじいちゃん、若い人いじめちゃだめだよ
2018/01/08(月) 19:14:15.10ID:RVv57Yq50
>>84,87,91,95 の流れがよくわからん

const <type> *p = ... が <type> const *p = ... と等価となる理由が例外ではなく
p を左辺値と解釈する隙間があるから ってこと?
108デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 19:26:48.32ID:u4QX+fVn0
>>106
一児の父だが孫はまだいねえよ
2018/01/08(月) 19:45:48.59ID:8LuLzpAV0
>>107
例外じゃないって立場は俺しか居ないのか?
その場合、お前らはこれを整合性よく説明できない馬鹿共だということになるが、それで良いか?

逆に考えてみろ。
君がそれを「例外」だとしているのなら、つまり「例外」でなければ君は
const <type> *p = ... // (A)
<type> const *p = ... // (B)
で意味が違うべきだというわけだ。
その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか?
2018/01/08(月) 19:52:07.48ID:RVv57Yq50
少なくとも俺は そういうもんだと覚えてるだけで説明はできない
2018/01/08(月) 20:23:19.52ID:7hYpzMEE0
こんなの決め事なんだからもしそう言うのがあったとしても
> その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか?
は、作った奴に聞くしかないだろ
112デフォルトの名無しさん
垢版 |
2018/01/08(月) 20:24:38.73
例外でもなんでもなく、単にC言語の標準規格がそうなっているからとしか言いようがないけどな。

宣言指定子 (declaration specifier) は以下の3要素から構成されている (順不同)。
・記憶クラス指定子 (storage class specifier) : auto, register, static, extern, typedef
・型指定子 (type specifier) : void, char, short, int, long, float, double, signed, unsigned, struct/union指定子, enum指定子、typedef名
・型修飾子 (type qualifier) : const, volatile

ポインタ宣言子 (pointer) は以下の2要素から構成されている。
・*
・型修飾子 (type qualifier) リスト

いろいろ省略してるので細部は不正確かもしれないがC89ではだいたいこんな感じ。
参考: C11のYacc文法 http://www.quut.com/c/ANSI-C-grammar-y.html

で、なぜそうなっているかを自分流に解釈して自分の中で整合性を取るのはいいけど、それを他人に押しつけるなってことだね。
113デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 20:24:45.15ID:u4QX+fVn0
ちゃんと理詰めで理解できるやつもいれば
暗記するしかないやつもいる

世の中、人それぞれだな
114デフォルトの名無しさん
垢版 |
2018/01/08(月) 20:39:32.52
>>113
別に太陽が地球の周りを公転していると解釈してもいいんですよ?
結果さえ合っていればね。
ただその自分流の解釈を他人に講釈したら恥をかきますよって話。
2018/01/08(月) 20:54:58.77ID:7hYpzMEE0
>>113
> ちゃんと理詰めで理解できるやつもいれば
アホなの?
理詰めで説明できると言うならして見せろよ
116デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 21:18:47.34ID:u4QX+fVn0
             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ
2018/01/08(月) 21:37:19.02ID:7hYpzMEE0
敗北宣言かよ w
118デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 21:43:42.37ID:u4QX+fVn0
無知なやつには
恥をかかせるよりも
教えないことが最も堪えるからな
2018/01/08(月) 21:47:27.34ID:7hYpzMEE0
何を教えるつもりなんだろう...
俺が思う正解は>>111に書いてあるんだが w
120デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 21:51:24.43ID:u4QX+fVn0
悪党の泣き声は言い響きだ
何を教えるつもりなのか聞き出したいんだなあwww
2018/01/08(月) 21:56:08.87ID:7hYpzMEE0
どうせなにも出てこないのは既にわかってる
って>>115みりゃわかると思うんだが w
2018/01/08(月) 21:58:13.44ID:F+Qn6y7R0
正直なところ

const int x

int const x
は同等、

というのは、決め事でいいと思うよ、何もかも原理原則で理解できる(までに細かくパースできる)人にはどうでもいいのかもしれないが。

‥えっと、細かい人にとって、この場合どうでもいいのか、どうでもよくないのか、どっちだったっけ??
2018/01/08(月) 21:58:47.99ID:0mTJv+h60
知らないし、相手が嫌いだから教え(られ)ない
2018/01/08(月) 22:04:03.83ID:t4bSGeIh0
同等も何も、修飾する主体が変数だけなんだから、何をどう変えろと?
対象がポインタなのかポインタの内容なのかって話に意味の無い例を挙げてどうしたいんだ?
125デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 22:17:28.76ID:u4QX+fVn0
収穫ゼロ
 ざ ま あ www
2018/01/08(月) 22:43:40.28ID:8LuLzpAV0
>>116
>>125
禿同

というかいい加減、知らない奴が煽るとか止めろよドアホ共。それは長期的にスレを毀損する。
なお、俺は知っている奴が馬鹿を糞味噌に貶すのを止めはしない。
馬鹿なこと言わなきゃいいだけだし、
逆に、これが出来ないのがID制フォーラムが腐る原因だと思っているから。

ヒントは既に書いたし、それ以前にC流の文法解釈をすれば特段不自然でもないし。
「例外」だと言いつつ(A)≠(B)を妥当とする根拠もないのはただの自己矛盾だと気付け。
そしてK&RはCの作者によって書かれているんだが、それも知らないのか?
Cしかなかった昔ならともかく、今お前らみたいな馬鹿がCやる理由は無いと思うんだがなぁ。
127デフォルトの名無しさん
垢版 |
2018/01/08(月) 23:14:54.65
>>126
で、K&Rのどの記述からconstに関する解釈(constの右側の固まり全体が定数と見なされる)を読み取ったの?
128デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 23:16:56.57ID:u4QX+fVn0
K&Rにconstはねえな
constの設計は髭と禿の合作だが
2018/01/08(月) 23:27:43.34ID:8LuLzpAV0
>>128
ここに来て堂々と嘘をつくとか、お前も死んだ方がいいな。
K&Rが手元にあるのなら、目次見てみろよ。
130デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 23:28:56.73ID:u4QX+fVn0
おまえの手元のK&RってISBNはいくつだ?
131デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 23:40:40.21ID:u4QX+fVn0
眠い・・・落ちるぞ
2018/01/09(火) 00:38:27.40ID:zckyAnL00
緑色のK&Rを読破するのに20年かかったわ
2018/01/09(火) 05:02:03.58ID:/Jm0Q1+w0
煽ることしかできないアホ ⇒ ID:u4QX+fVn0, ID:8LuLzpAV0
134デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/09(火) 09:57:35.67ID:2pt0JvoIa
人の事はどうでもいい。Cの話を書け。
2018/01/09(火) 09:59:26.50ID:cELqpMaXd
おまえもなー
136デフォルトの名無しさん (ワッチョイ 0bf6-5YeV)
垢版 |
2018/01/09(火) 10:17:45.46ID:BapSTNU/0
constがないK&Rが本のことだと思ったアフォはもう死んじまったのか?
2018/01/09(火) 12:48:57.63ID:TNcFjeMv0
家のは、4-320-02145-2だけど、constは無いな
2018/01/09(火) 13:34:20.42ID:IJNuACex0
プログラミング言語Cの第2版(白本)は初版(緑本)と違ってANSI規格準拠
型修飾子や型指定子の項目にconstは存在する
というかconstとvolatileはANSI標準で新設されたものと明言されてる
一般には同一著者なので第2版まで含めてK&R本と呼ばれているから紛らわしい
2018/01/09(火) 13:44:26.69ID:TNcFjeMv0
緑は初版じゃ無いよ。
初版は白。だから紛らわしいの。
2018/01/09(火) 13:50:33.71ID:IJNuACex0
あ、そうか
第2版の翻訳訂正前の表紙が緑だったっけ?
現在発売中のものの表紙は白だよ
https://www.amazon.co.jp/dp/4320026926
2018/01/09(火) 14:03:02.91ID:TNcFjeMv0
プレンティスホール版で言う所の「ANSI DRAFT」の斜線入り
に相当する版が緑色だったかと。

4.xBSDやOS-9がこの前の版のCなので、未だに残っているんでしょうね
2018/01/09(火) 19:00:39.00ID:7lOmzbTzM
>>141
そう言えば最後にK&Rスタイルで書いたのはOS/9-68Kだったな
もう25年ぐらい前の話だが
2018/01/09(火) 21:51:12.35ID:BapSTNU/0
        ゴガギーン
             ドッカン
         m    ドッカン
  =====) ))         ☆
      ∧_∧ | |         /          / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (   )| |_____    ∧_∧   <  おらっ!出てこいOgju
     「 ⌒ ̄ |   |    ||   (´Д` )    \___________
     |   /  ̄   |    |/    「    \
     |   | |    |    ||    ||   /\\
     |    | |    |    |  へ//|  |  | |
     |    | |    ロ|ロ   |/,へ \|  |  | |
     | ∧ | |    |    |/  \  / ( )
     | | | |〈    |    |     | |
     / / / / |  /  |    〈|     | |
    / /  / / |    |    ||      | |
   / / / / =-----=--------     | |
2018/01/10(水) 15:16:41.95ID:Gpgf6C5da
おまいらはとにかく優しくない
145デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/10(水) 15:34:00.74ID:Y4Jjv91Na
つまり君は愛を求めてここに来たんだね。
2018/01/10(水) 15:51:40.83ID:4q6sC60X0
お笑いぐさだな
147デフォルトの名無しさん (ワッチョイ 4f23-ldot)
垢版 |
2018/01/10(水) 18:12:49.28ID:b0jd81470
openじゃなくてfopenみたいに、ファイルの存在確認のaccess関数に
対応するちょっと上位の標準関数ってある?
148デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/10(水) 18:24:05.75ID:lfXyh+0pa
>>147
stat()とfstat()なんかどうだ?

まあでもopen(), fopen()の関係とは違うけどな。
open()はシステムコールだがfopen()はライブラリ関数だ。
(UNIX系OSの話ではあるが)。
2018/01/10(水) 19:13:04.16ID:7FV5Lym6a
俺の希望は、たいしたやりたくもないけど、
ちょっとやってみたら?とか丁寧に教えるからやってみなよ!
とかさ、そういう感じで優しく接してもらってだな、で、出来も悪いからなかなか覚えないけどそれでも教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して育てる環境というのかな。とにかく頼むよまじ
2018/01/10(水) 19:26:07.53ID:b0jd81470
>>148
stdio.hにaccess()の偉いやつあるのかなー と思ったのだよ
無いならまあいいけど
151デフォルトの名無しさん
垢版 |
2018/01/10(水) 20:01:31.67
>>149
授業料ももらってないのに優しく教える理由なんかないわな
5chなんて煽り合いと罵り合いの場だよ
2018/01/10(水) 20:07:35.30ID:s9KBVpbq0
>>149
日本語でおk
そして死ね

> 出来も悪いからなかなか覚えないけど
なら覚えるまで何度でも読み返せ

> 教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して
教わる側が1mmも努力せず、教える側に全責任をなすりつけるのは典型的ゆとり。死ね。

というかな、はっきり言えば昔より格段に環境は良くなっている。
当然教える側のノウハウも蓄積されてるし、
本も大量に出版され、良書以外は淘汰されてるし、
Webにも情報があふれ、ここみたいな掲示板やフォーラムもあるし、
無料でIDEも使えるし。

だから昔の環境で手こずった奴も、今なら楽勝で学んでいける。
問題は、昔だったら(=IDE無しでは)お話にならない馬鹿にもプログラミングさせようとしていることであって、
俺はこれに関してはもう諦めた方がいい=手取り足取り教えないと出来ない奴は死ねでいい、と思っている。
自分の為に他人に無償の努力を強いるその姿勢が根本的に間違っている。
つかマジで、ゆとりのノリでやりたいなら、C以外のゆとり用言語を使え。Javaとか。新しいのならGoとか。


そしてこれとは別に、俺は2chとは別の掲示板を立ち上げようとしているのだが、
君はこれについて興味あるか?
追える限りでの発言を確認したが、君は煽るだけの無能ではないらしい。
俺は今の2chのシステムでは行けるところまで行っている(既に飽和している)と見ているから、
これ以上の物を求めるのなら何かしら新しい機能が必要だと考えている。
今はそれのアイデア出し中だ。何かあれば是非。
153デフォルトの名無しさん (ワッチョイ 9fb0-hg+r)
垢版 |
2018/01/10(水) 20:09:47.69ID:aFHgFo+Q0
漠然とした質問で失礼します。
私は最近c言語の勉強を始めたところでギリギリポインタ等も理解できたところです。
そこで、アルゴリズムとデータ構造の勉強をしようと思い本を何冊か買ってきたのですが、
スタックなどのデータ構造の仕組みがよくわかりません。。
どの参考書でも、「スタックとは後入れ先出しで…」という説明の後、「それではc言語でスタックを
実装してみましょう」といって意味不明なコード(長い)が書かれているパターンが王道のようです。
このパターンは線形リストとかでも同じです(諸兄にはいうまでもないでしょうが…)。
どのような実益があってこのようなデータ構造を生成する必要があるのでしょうか。
python等でいうところのリストに相当するデータ構造をc言語で作成するためということ?
また、実際のプログラムにおいては、データ構造の定義だけでかなりコード長くなると思われるのですが、
よく利用される手法なのでしょうか。
2018/01/10(水) 20:20:45.75ID:wz9ZVGEfd
ん?
statとかfstat?
2018/01/10(水) 20:21:25.37ID:4q6sC60X0
>>152
で、constはどこにあったの?
2018/01/10(水) 20:26:57.23ID:s9KBVpbq0
>>153
std::stack相当の話?
なら大して使わないから、とりあえず読み飛ばしていい。

つか、最初から全部キッチリ理解しようとせず、
まずは分かる範囲で組み、その後、自分の出来る範囲を広げていくようにした方がいい。
(1度読んで全部理解して捨てる、ではなく、最初から5回読む前提で分かるところから読み進める)
そのうち、stackを使うべき用途に遭遇したら、なるほどと理解できるようになる。
157デフォルトの名無しさん (ワッチョイ 9fd7-r3wo)
垢版 |
2018/01/10(水) 20:34:17.56ID:01jIFW0g0
>>153
直近のご要望としては、スタックの使い所を知りたいって事かな?

ほとんどの実行環境において、C言語の関数呼び出しなんかの実現に使われてるよ。
呼び出した側の状態を保存する場合にpush、呼び出され側から戻るときにpop的な。
2018/01/10(水) 20:35:33.51ID:P2Ck3R5y0
>>149
幾ら出す?
2018/01/10(水) 20:43:06.09ID:M55Gu+ZEa
>>153
どのような実益?そうだなあ。スタックといえば以前PerlでXMLの階層構造を
SAX使ってRDBに全て入れる時に使ったなあ。まあ、それだけでなく先入先出に
するとやりやすくなる処理はあるよ。再起処理でも使われるし(スタックに積まれて
いるとあまり意識する必要ないかもしれないが)。

リストは例えば長さが可変長のファイルからデータ取得してメモリ上に置いておく
時に使えるかな。

まあしかしライブラリにあるならそれ使った方が楽だよ。毎回書くのは阿保らしい。
160デフォルトの名無しさん (ワッチョイ 9fb0-hg+r)
垢版 |
2018/01/10(水) 20:49:01.77ID:aFHgFo+Q0
>>156
とりあえずソートアルゴリズムのが理解したいと思い勉強をしていたのですが、複雑なものになってくると
各種データ構造の理解が必須!みたいになってきまして、データ構造の方にも手を出したみたわけです。
ヒープとかの方が簡単そうな気がしますし、とりあえずスタック関連は後回しにします。

>>157
はい、なんかそのようなことも本に書いてあったのです。
しかしこれが、「スタックとはプログラミング言語内においても既に設計されている基本構造なのだ。以上終わり。」
であれば、スッキリするのですが、
「それでは、これをc言語で実装してみましょう」といって、スタックをc言語のプログラムで作り出すことの意義
が今一つわからないというか。
2018/01/10(水) 20:55:29.77ID:P2Ck3R5y0
>>150
filenoとfdopen覚えた方が楽だけどね
162デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/10(水) 21:00:10.17ID:lfXyh+0pa
それ用途が違うよね。
163デフォルトの名無しさん (ワッチョイ 9fb0-hg+r)
垢版 |
2018/01/10(水) 21:00:44.51ID:aFHgFo+Q0
>>159
難しすぎます!
おそらく当分使えるようにはならなさそうです!
2018/01/10(水) 22:13:09.56ID:s9KBVpbq0
>>160
> とりあえずソートアルゴリズムのが理解したいと思い勉強をしていたのですが
アルゴリズムとデータ構造をソートで学ぶのは昔流で、今はそれをこの段階でやる必要はない。
今はとりあえず次の章に行ってしまって、for/while/if等を使いこなせるようになった方がいい。

> 「それでは、これをc言語で実装してみましょう」といって、スタックをc言語のプログラムで作り出すことの意義
仕様を説明する必要がないからだよ。

「じゃんけんゲームを作ってみましょう」なら仕様は大体分かり、説明が省ける。
「オレオレゲームを作ってみましょう」なら、「オレオレゲームとか何か」から詳しく正確に説明しないといけない。
その本は「スタックとは何か」を当然知っているという前提で書かれているんだよ。
Cプログラマがスタック構造を知らないというのもあり得ないからね。
ただ、スタック知らなくてもプログラムなんて組めるし、実際Web系の連中は知らんと思う。

とはいえこれが一方的に悪い訳でもなくて、逆に言えば、
スタック構造を知っていることがプログラミングの本質ではない、ということなんだよ。
だから君みたいな初心者は、分からないところは飛ばして分かるところから読み進めればいいんだよ。
というか、今、君のレベルの初心者がCから始める意味は無いし、
無駄に遠回りになるだけだが、それ分かってやってるか?
165デフォルトの名無しさん (ワッチョイ 2bb3-IKYq)
垢版 |
2018/01/10(水) 22:17:21.44ID:3INPjtq00
>>160
ハノイの塔のパズルを解くプログラムを書いてみて。
スタックを使う場合と使わない場合の2パターン描いてみて。
で、どちらが少ない行数で書けるか、どちらが実行速度が速いか、
どちらが理解しやすい美しいコードか、さまざまな観点で比較してみて。
2018/01/10(水) 23:08:24.25ID:s9KBVpbq0
>>153
と思ったが、Pythonに言及しているところからすると、既にPythonを使いこなせるのか?
だとすると、「アルゴリズムとデータ構造」をガッツリやる意味はある。

スタックが何故使われるかと言えば、スタックで対応できる場合に最速だからだよ。
だからCは実行方式からしてスタックべったりだ。
逆に言えば、それくらいしかメリットないし、
通常の配列にメソッド生やしてスタックにするのも簡単だから、他言語では大体そうしてるでしょ。

以下見れば分かるが、
https://cpprefjp.github.io/reference.html
Pythonのリストに当たる物は
array, deque, forward_list, list, queue, stack, vector の7種類あり、
Cはこれらを使い分けて最速コードを得る為の言語なんだよ。
勿論それ以外の物が良ければ自作しろ、という文化だし。
逆に、Python等は、グダグダ考えずに全部リストでやれ、それの方が分かりやすいし、という文化だろ。
167デフォルトの名無しさん (ワッチョイ 9fb0-hg+r)
垢版 |
2018/01/10(水) 23:39:41.13ID:aFHgFo+Q0
>>165
ほうほう。ありがとうございます。
かなり難しそうですがやってみます。

>>166
スプリクト言語の方が簡単、pythonやrubyでプログラミングというものをはじめましたが、そもそも詳しい人だけが
簡単に思えるだけで、基礎的知識なしでは相当にきついんでないの?と感じてcを始めました。
というわけでpythonが使いこなせるということはありません。
cに関しては教科書一通り一周して、とにかく制御をマスターしたかったので制御文を使いまくるであろうソートアルゴリズムに手を付けたんです。
制御文もアルゴリズムも理解できたら一石二鳥かなと思って。
「定本cプログラマのためのアルゴリズム〜」に「リスト」の説明があり、
・要素の挿入 ・要素の削除 ・要素の読み書き ・探索
・複数のリストをまとめる ・リストの分割 ・リストの複製 ・要素の数を求める
とあり、「あら、pythonのリストと全く同じ構造だ」とおどろいたわけです。
cはとりあえずarray, deque, forward_list, list, queue, stack, vectorといったものを「なんとかして」pythonのリストやまた
それ以外のデータ構造を自分で作成するということですか。
168デフォルトの名無しさん (ワッチョイ 1bd0-fRwE)
垢版 |
2018/01/10(水) 23:52:55.49ID:Klfu8N/c0
どうでもいいけどプログラミングなんて10年後オワコンじゃない?
コード共有サイト行けば書きたかったコード見つかるしコピペすればおk
世界で既に誰かが書いてるもの二回三回書く必要性はない
この流れが自動化されれば終わるだろうな
2018/01/11(木) 00:03:59.43ID:P2yp909q0
>>168
1から1000 までを全部掛けた答えを出す共有サイトのコードを見せてください
170デフォルトの名無しさん (ワッチョイ 11d0-EKU2)
垢版 |
2018/01/11(木) 00:13:19.12ID:pXQSKlgS0
>>169
なに言ってんだこいつ
調べれば1000000億%出るから自分で調べろよ
まさかgithubも使ったことないのかい?
2018/01/11(木) 00:21:59.15ID:zDr2JTOQ0
>>167
> cはとりあえずarray, deque, forward_list, list, queue, stack, vectorといったものを「なんとかして」pythonのリストやまた
> それ以外のデータ構造を自分で作成するということですか。
違う。
Pythonのリストというのは抽象データ型で、要するに「万能」に作ってある。
この方がソースコードは分かりやすいから。(知識が少なくても読める)
逆に、「万能」なら限界ぎりぎりの速度を追求できないから、
Cでは別々にして使い分けろ、必要なら自作しろ、ということ。

> スプリクト言語の方が簡単、
これは実際にそう。
pythonやrubyでプログラミングというものをはじめましたが、
これも正しい。
> そもそも詳しい人だけが簡単に思えるだけで、
> 基礎的知識なしでは相当にきついんでないの?と感じてcを始めました。
ここはちょっと違う。

要するに、「動けばいい」プログラムでCを使う意味なんて無いんだよ。
逆に、最速のコードが欲しいときにはC/C++以外に現実的な選択肢はない。
だからほとんどのOS/ブラウザ/処理系(PythonやRubyも)はCで出来ているし、
Cが基礎だっていうのも間違いではないんだが、
プログラミングにCの知識が必要かというと、そうでもないんだよ。
Python/Rubyで済むのなら、Python/Rubyで済ませるべきであってね。
そして初心者はまず、「動けばいい」からスタートすべきであって、
それ以外に色々知識が必要なCはズブの初心者向きではないんだよ。

ただまあ、話を聞く限り、君が「アルゴリズムとデータ構造」をやるのは悪くはない。
とはいえ、現実的にソートのアルゴリズム知ってても大して意味はないし、
直接目標に向かった方がいいと思うが。
例えば、ゲームを作りたいのなら、何でもいいからとりあえず動くゲームを作ってみろ、ということ。
どうせこの最中にいろいろな問題にぶち当たることになるから。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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