1 名前:デフォルトの名無しさん [2017/08/10(木) 20:21:23.44 ID:hEocmkh50.net] C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ 前 mevius.2ch.net/test/read.cgi/tech/1500293207/ www.geocities.jp/c_cpp_cs/about_c/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
152 名前:デフォルトの名無しさん [2017/08/29(火) 23:17:01.52 ID:/SLQJmZn0.net] > コンパイルを通すだけの為に苦労したりするが、 > あんなのは完全に時間と手間の無駄だ。 そうだねえ 自分の考えがはっきりしてなくて筋が通らないのを コンパイラに突っ込まれ、そのたびに右往左往じゃ 下手の考え休むに似・・いや如かずってやつ
153 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 23:31:56.37 ID:pPJ906sN0.net] 「今の流れってこうだよね」 「俺の欲しいものは違う」 会話にならねぇ。
154 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 23:53:00.65 ID:Uz0lh6nE0.net] >>150 そうとしか取れないのは君が未熟だからだね。 「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。 君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。 それだけだね。
155 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 23:57:29.58 ID:+Y8D6iZy0.net] >>139 ,146 >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。 見てわかる程度の規模の場合は型無しでもよいだろうね >型検査がウザイだけの時も多いだろ どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ >どうでもいい型が氾濫 ジェネリックで型指定するだけだから氾濫しなくね? あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある const修飾されていれば大胆な最適化が可能な場合も多い
156 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 00:01:54.97 ID:3iEZIBUv0.net] >>151 俺も>>150 と同じように読めた。 自分の希望を大多数の希望だと決め付けるのは止めろよ。
157 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 00:53:26.35 ID:F1WQhw000.net] >>152 > >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。 > 見てわかる程度の規模の場合は型無しでもよいだろうね 規模にかかわらず、見ずにチェックするGUIなんて無いだろ。 > どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな おー、C#はやはり進んでいるというか、痒いところに手が届いているね。 要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、 ・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。 ・リフレクション時がかなり最悪。(C#なら問題ないが、 VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる) 以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。 ufcpp.net/study/csharp/sp4_dynamic.html#what 後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、 これ自体はあまり推奨されることではないね。 俺はJavaScriptで型をかかないことに慣れてしまったので、 再びVC++で型を書く時にウザくて仕方ない。 (ただしこれはVC++しかやってない時には全く感じなかった) 要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。 例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。 ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。 コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。 > ジェネリックで型指定するだけだから氾濫しなくね? C#は多分そうだね。C#では解決済みかも。 > const修飾されていれば大胆な最適化が可能な場合も多い この説はよく聞くが、具体的にどういうケースよ?
158 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 00:58:09.18 ID:ry+Kms2n0.net] >>141 こういうやつってユニットテストしらないのか? Cでも今時は書くだろ
159 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 01:17:46.58 ID:ry+Kms2n0.net] 型どうこうで考えるべきは依存関係なんだが 静的型言語はすぐに依存関係ができる そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん しかもデザパタで実現できる疎結合は完全じゃないからね
160 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 01:56:29.11 ID:F1WQhw000.net] >>156 それは型ではなくてラムダの利点だと思うが。 ただ、ラムダを積極活用すると型が邪魔だってのはあるし、 結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。 しかもデザパタって使い物にならんだろ。 というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、 他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、 なんで縛りプレイに付き合わないといけないの?っていうか、 だいたい説明自体もイミフなのが多いし。
161 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 02:00:40.60 ID:vF4qFgfn0.net] >>154 コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ >callbackでdelegateの型チェックがウザイ async/awaitがある言語だとコールバックを使うことはあまりないしなぁ どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが >リフレクション時がかなり最悪 VC++でリフレクションって、どの話だ >チェック用付加情報・二度手間がウザイ どうせドキュメントとかテストに書いてくんだから二度手間は避けられん 定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適 全参照を書き換えるリファクタとかもできるし 新しい言語はそこら辺かなり解決されてる
162 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 02:07:48.34 ID:ry+Kms2n0.net] >>157 酔ってんのか?Java?意味不明だ レス付けるなら何を話してんのか特定しろ
163 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 02:25:01.52 ID:vF4qFgfn0.net] >>154 constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・ hoge(&a,&b); c = a + b でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか 根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ javascriptにポインタが欲しいぐらいの不自然さ
164 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 06:22:36.60 ID:dAnuHQ8p0.net] 早く夏休み終わらないかな…
165 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 07:01:40.06 ID:AqkMSzAW0.net] いや終わらなくていいよ 電車混むし
166 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 08:10:07.81 ID:Li+Lo8rKd.net] 大学生のは未だ続くで
167 名前:デフォルトの名無しさん [2017/08/30(水) 13:51:14.27 ID:AB0hyKA3E.net] すいません Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが WindowsでCを書く場合はVC++を使うのが定番なのでしょうか? gccとclangを使うのはあんまりおすすめしないですか?
168 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 13:58:51.95 ID:1qHN72hha.net] GUIないならgccでも問題ない
169 名前:デフォルトの名無しさん [2017/08/30(水) 14:33:39.82 ID:BJd10UjW0.net] GUIあってもgcc使えるぞ gcc your_program.c -luser32 -mwindows -luser32ってのがインポートライブラリuser32.libを使う指定な 他に色々kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.libなんかがいるんで適宜追加しる
170 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 18:06:52.31 ID:S+MvNVsbM.net] Windows版のgccある?
171 名前:デフォルトの名無しさん [2017/08/30(水) 18:24:32.41 ID:BJd10UjW0.net] たとえばこんなのか? https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/
172 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 18:31:00.76 ID:S+MvNVsbM.net] mingw 入ってない環境だとバイナリ使えないよね。 コンパイルして実行したいだけなのに。
173 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 18:43:05.43 ID:LRl1+/WB0.net] 実行ファイルの配布の意図? mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
174 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 19:17:06.22 ID:58Rp2mqQ0.net] >>169 よくごっちゃにしてる人がいるけどそれはcygwinを使う場合 mingwはランタイムにmsvcrtを使うのでcygwin1.dllは不要
175 名前:デフォルトの名無しさん [2017/08/30(水) 19:17:51.85 ID:BJd10UjW0.net] あのなー・・・ cygwinがそういう批判を受けていたのを踏まえて 「本当のミニマリスト」を目指したのがmingwなんだよ それすらいやなら、あとはM$純正のbashくらいだぞ
176 名前:デフォルトの名無しさん [2017/08/30(水) 19:21:14.37 ID:qx/wlZ6S0.net] https://www.youtube.com/watch?v=VzylWELlUy4
177 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 20:36:36.61 ID:ViOUv0iA0.net] >>167 The Perl for MS Windowsって言うのがある。 これインストールすると、gccも入る 普通にコマンドラインで使える strawberryperl.com/
178 名前:デフォルトの名無しさん [2017/08/30(水) 20:41:41.90 ID:BJd10UjW0.net] >>168 だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
179 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 20:52:42.57 ID:t1uAI5x90.net] こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い windowsで開発するなら、VCさえあれば十分
180 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 21:46:54.45 ID:1xtdX2a20.net] コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。 関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
181 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 22:05:25.61 ID:AIW55pOFM.net] >>168 >>171 知らなかったです。 いいですね、MinGW
182 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 23:02:07.68 ID:F1WQhw000.net] >>158 > 引数の型を間違えたり変更時に修正漏れが出たり ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。 型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。 xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。 ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。 型検査は基本的にソース全体で辻褄が合っているかを検査する。 だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。 ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、 そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。 具体的には、 ・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない) ・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。 だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。 もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。 これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。 C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。 そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++) 漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript) ちまちま全修正するのが面倒だし危険だから、 受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、 みたいなのとは発想が逆だった。
183 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 23:03:09.90 ID:F1WQhw000.net] async/awaitはJavaScriptにもあるが、あれはC#とかで必要なのであって、JavaScriptでは要らないね。 理由は、 ・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。 ・関数はどこにでも書ける。 から。C的に関数毎に変数が完全に分離している時にはasync/awaitでないと変数が共有出来ないけど、 JavaScriptの文法だとcallbackでも変数共有出来るから、要らん。具体的には、文法は適当だが、 function someTask { var x = xxx; var a = await funcA(x); var b = await funcB(a,x); } みたいなのを、 function someTask { var x = xxx; var a, b; // 共有変数は上位で宣言しておく。これでクロージャから捕捉出来る。; function funcA(){} funcA(funcB); // funcBはcallback、funcA内でxは使える、aにも書ける function funcB(){} // funcB内でa,xは使える、bにも書ける } だからawait毎にぶった切ってcallbackしても、上から順に実行するだけの単純ソースにしかならない。 JavaScriptなら、どっちでもいいや位でしかないんだよ。 C#ではこれができないから、async/awaitが必要だってだけで。 ただ俺もcallbackと言ったがこれは間違いだった。VC++では非同期のcallbackはやってないわ。 ウザイと思ったのは関数ポインタを差し込む時に型チェックがあることだった。 上記の通り、JavaScriptでは関数ポインタでさえあれば引数の型と個数は関係なく呼んでくるので、 関数ポインタを差し込む時にいちいち考える必要がないんだよ。 そして機能追加は追加パスだけの変更で済む。 C++の型チェックだと変更がソース全体に及ぶしこれを断れない。 引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。 そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、 変更がソース全体に波及するのが危険でウザイって事。
184 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 23:04:03.99 ID:F1WQhw000.net] > コールバックの処理が適切なことはテストとかで保証するとか考えると どのみちテストはやらんと駄目でしょ。と言うか、逆に、 「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。 Haskellのキチガイ共はそういう思想らしいが。 「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、 処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。 それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、 俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。 とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。 >>160 多分、constで最適化ガーってのはやっぱり無いんだよ。 想定されるケースはそちらの挙げたとおりで、 void someFunc(){ // (A) hoge(&a, &b); // (B) // (C) } で、(B)で変更されないことを保証されれば、 (A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が (C)でも有効です、ってだけだが、そもそもこのケースがないだろ。 自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、 考えられるのはこのように他関数をまたいだケースなんだけど、 それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。 ((B)で変更されるから(C)は(B)の後ろなのであって)
185 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 23:14:59.21 ID:58Rp2mqQ0.net] ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと 最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
186 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 23:55:33.72 ID:FdjUx67gd.net] 最適化かけないと通るけど、最適化かけるとセグフォ プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる なんだこれ
187 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:01:55.43 ID:B2+zi4Baa.net] 最後に¥0を付けてないとか
188 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:06:31.32 ID:M/UQy7Jt0.net] >>183 malloc/free使ってる?
189 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:15:15.17 ID:AFctto/wd.net] >>185 一切使ってないっす…… 引数で配列の大きさ渡してるのがまずいのかもしれない
190 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:22:21.25 ID:Mr6ZzHeH0.net] 配列サイズを越えて代入しているとか
191 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:28:32.21 ID:K0ByhO+S0.net] つかソース晒せないの?
192 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:28:58.33 ID:AFctto/wd.net] 配列の代入とは関係ないところで死んでるっぽいこともあるんだけど、それでも配列の範囲外アクセスとかあるものかなあ……
193 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:31:52.88 ID:AFctto/wd.net] >>188 そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
194 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:32:55.14 ID:AFctto/wd.net] よく考えたらそんな状態で相談することが間違いか やっぱり撤回します。スレ汚しすいませんでした
195 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:34:49.91 ID:M/UQy7Jt0.net] >>190 メモリリークをチェックしてみたら
196 名前:デフォルトの名無しさん [2017/08/31(木) 02:33:47.40 ID:KfXpPD/x0.net] 最適化の有無で変わった事と言うと、この前こんなことがあった。 (以下の A, B は typedef された構造体) A *p = NULL; B *q = NULL; if (...) { A x; /* x の初期化などをする。 */ p = &x; } if (...) { B y; /* y の初期化などをする。 */ q = &y; } この後で p が NULL でなければ p の指す先を使おうとして死亡。 まあ、ブロック(というかスコープ)から外れた所で使ってるんだから当然と言えば当然ではあるが、 最適化しない場合は x, y はその他のブロック外の自動変数と同じようにスタックに領域が取られ ていて変化する事がなかった。そのため内容は保たれた。 しかし最適化したら A の領域は A のあるブロックから外に出たら破棄されたと解釈され、そして B のあるブロックの B の領域として上の A の領域を使用するようになっていた。そのため x と y の指す先は union のように重なってしまっておかしくなったと。
197 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 03:22:36.47 ID:IR3nOS0l0.net] >>179 いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね 少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
198 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 03:58:43.17 ID:IR3nOS0l0.net] >>180 ,181 C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ というかC++でもできるはず コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる それを解決するのがPromiseで、それを更に単純に記述するのがasync/await 新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな >関数ポインタを差し込む時にいちいち考える必要がない C++でどうやって実現すんの? char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ コンパイルエラーじゃなくてテストで保証するとになればなおさら変
199 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 04:15:22.77 ID:IR3nOS0l0.net] >>181 >最初から(A)(C)(B)の順に処理しろ 何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ コードは適当だけど、 void test(a,b) { hoge(&a,&b); piyo(a+b); } test(1,2) みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
200 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 05:12:55.38 ID:egwbmqN8M.net] スタックフレームの破壊は明白なんだから関数内で宣言してる配列全部の 範囲チェック入れてみな
201 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 11:26:29.57 ID:e5ym4hpC0.net] やりそうなこと □ 要素数 n=10 の配列 int array[10]; アクセス可能なのは array[0] 〜 array[n-1] まで なのに array[n] を利用してる □ 文字列による配列の初期化で 終端記号(\0)含んだ分の領域を用意してない × char text[3] = "123"; // 終端記号含めると 4要素の空間が必要なのに 3要素にしてる ○ char text[] = "123"; // コンパイラにおまかせで □ 要素数を求めるのに sizeof(a) / sizeof(a[0]) を使ってるけど そもそも論で a が配列ではなくポインタだった為 処理したい要素数が渡っていない
202 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 13:55:57.05 ID:wUqC2S3T0.net] >>183 研究室から出せない秘伝のソース、 なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
203 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:11:13.20 ID:aZ9Rj489d.net] 創業当時から継ぎ足した秘伝のソース
204 名前:デフォルトの名無しさん [2017/08/31(木) 16:17:00.98 ID:JYM1pg890.net] 半分使って、半分継ぎ足しを繰り返すと79回目あたりで アボガドロ定数の逆数くらいに薄まるよね
205 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:47:29.73 ID:aZ9Rj489d.net] 何か、酵母とか菌糸とか入ってて熟成されるんよ。ただ混ざるだけじゃないんよ。
206 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 22:53:34.07 ID:F9uWTtxD0.net] >>194 > 型あったほうが便利派 半分くらいはインテリセンス目当てだと思うぞ。 そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。 だからconstは使ってないし、関数ポインタの型検査もウザイ。 つーか、型を間違えること自体がほぼ無いだろ? 引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
207 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 22:54:02.64 ID:F9uWTtxD0.net] >>195 > ローカル関数で変数をキャプチャできるぞ ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが) JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ) 入れ子になっていても破綻せずに分解して展開出来るんだよ。 C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。 > コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる > それを解決するのがPromiseで、それを更に単純に記述するのがasync/await これは通説だが、俺はこれが嘘だと思ってるんだよね。 JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で
208 名前:入れ子で書いている。 それよりawaitの方が見やすいってのは、上から順に読める形式だから。 でも>>180 に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、 その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない) つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。 C#やC++はレキシカルスコープがないからawaitが必要なだけ。 だからここら辺は実は文法との相性もあるんだよ。 C++はそんなのお構いなしに何でもかんでも入れてる感じだが。 (とはいえ、選択肢が増えること自体は悪いことではない) > char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ そりゃconstの有無をテストで落とすのは無理だろうさ。 まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。 (ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか) そもそも君はどこまでconstを使っているんだ? C++のconstは「定数」ではなく「再代入禁止」だ。 現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。 これをやっているのか? やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。 [] [ここ壊れてます]
209 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 22:54:22.15 ID:F9uWTtxD0.net] >>196 コードを流用するとね、 void test(a,b) { // (A) hoge(&a,&b); // (B) piyo(a+b); // (C) } で、(B)をconst指定にした時のみ(C)で大胆な最適化を行えるケースは、 ・(B)が(C)に影響する副作用を持っていないと「const指定した時のみ」分かる 場合だけだが、これはconst指定ではどうにもならんだろ。 これはプログラマが上位の仕様(test関数の仕様)として規定するものであって。 例えば構造体配列で、(B)は[i]への書き込み、(C)は[j]からの読み出しで、i!=jが上位で保証されているとか。 この場合は、プログラマが最初から(A)(C)(B)の順に書けるんだよ。 そうではなくて、(B)が(C)に対しての副作用を持つ可能性がある場合、つまりi!=jが保証されていない場合、 当然(B)(C)の順にする必要があるけど、 これをconst指定で最適化(=(B)が(C)に対しての副作用を持たないことを保証)することは出来ないでしょ。
210 名前:デフォルトの名無しさん [2017/09/01(金) 02:04:57.35 ID:2msaHTP30.net] >>204 ん、C++のconstは、Cのconstよりも「定数」だぞ int const a = 1; switch(1) [ case a: ; //valid in C++, invalid in C }
211 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 08:48:03.58 ID:5GGRc0nid.net] >>206 すまん、そのコードの意味がわからん
212 名前:デフォルトの名無しさん [2017/09/01(金) 09:06:42.83 ID:2msaHTP30.net] typoしとるな [は{
213 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 09:55:02.84 ID:kxCoop1y0.net] case ラベルに const な変数の変数名 C++ ならばリテラルと等価となりセーフ C は変数のままの扱いでアウト
214 名前:デフォルトの名無しさん [2017/09/01(金) 11:36:56.59 ID:IGPoCkp90.net] Cのconstは変更不可なオブジェクトだからな
215 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 13:20:08.84 ID:JSZHio/AM.net] C++は使える範囲を広くしただけでconstの意味はCといっしょ constによる最適化の話には関係しない
216 名前:デフォルトの名無しさん [2017/09/01(金) 15:37:25.51 ID:2msaHTP30.net] 違う constはもともとC++発祥のもので、 Cでパクるにあたり微妙に改変した constは最適化に関係するが 今この流れでは最適化とは全く無関係の話をしている
217 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 16:51:03.36 ID:dkwAUCjz0.net] volatileについてもkwsk
218 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 17:40:42.98 ID:XJwe5Q/Z0.net] ttps://regmedia.co.uk/2011/02/18/dennis-richie-and-brian-kernighan-pdp-11.jpg こういう時代の揮発性のメモリ 揮発しないメモリもあるんですよ
219 名前:デフォルトの名無しさん [2017/09/01(金) 18:43:10.50 ID:2msaHTP30.net] ビットフェードとvolatileは関係ないぞ
220 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 18:59:13.16 ID:dXFBhBz10.net] コード中の文意では変わってなくても、他の要因で変わる可能性あるような 割り込みやマルチスレッド等で共有してる変数とか
221 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 03:14:53.65 ID:GCfgdhr+0.net] > C++のconstは「定数」ではなく「再代入禁止」だ 代入と初期化を混同してませんか
222 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 08:56:24.33 ID:72Px+h1e0.net] staticについてもkwsk
223 名前:デフォルトの名無しさん [2017/09/03(日) 11:44:42.91 ID:jl0cf3RS0.net] 性的な
224 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 12:14:41.26 ID:9dM4T0NO0.net] 外からは見えないように、そして、なくさないようにするエロ本
225 名前:デフォルトの名無しさん [2017/09/03(日) 17:40:32.30 ID:jXGwZqzU0.net] 一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ
226 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 17:45:54.60 ID:5WRYI1ZX0.net] static に背負わせすぎな気がする 関数内変数の static 関数スコープ外の static C++ ならばクラスメソッドのstatic クラス変数の static もあったかな‥多すぎだ‥
227 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 18:29:43.87 ID:fyDk5FSQ0.net] 予約語を減らす涙ぐましい努力
228 名前:デフォルトの名無しさん [2017/09/03(日) 18:47:29.02 ID:jXGwZqzU0.net] C99以後、仮引数のstaticもあるしな
229 名前:デフォルトの名無しさん [2017/09/04(月) 00:43:28.93 ID:QxIkVb9z0.net] ポインタ関連で*と&の記号を使っているのも 初心者を遠ざけているよな 素直にpointerとかrefとかの予約語作ればよかったのに
230 名前:デフォルトの名無しさん mailto:sage [2017/09/04(月) 01:05:35.63 ID:IeE+YITL0.net] >>225 もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
231 名前: mailto:sage [2017/09/04(月) 01:17:41.88 ID:rnM3x3Xp0.net] >>225 C# の ref 宣言のように,宣言だけでなく呼び出し側でも ref が必要だという文法はあってもよかったかな
232 名前:デフォルトの名無しさん mailto:sage [2017/09/04(月) 02:45:48.86 ID:tVodzhFi0.net] >>224 え?そんなのあった?
233 名前:デフォルトの名無しさん [2017/09/04(月) 08:55:10.34 ID:pd3pCmCq0.net] >>228 ISO/IEC9899:1999 6.7.5.3 Function declarators (including prototypes) 21 EXAMPLE 5 void f(double a[restrict static 3][5]);
234 名前:デフォルトの名無しさん [2017/09/05(火) 00:59:51.51 ID:2RdPD3ce0.net] >>229 ああ。そういう使い方か。
235 名前:デフォルトの名無しさん mailto:sage [2017/09/07(木) 15:42:36.42 ID:zsD50ajta.net] 以下の三つの操作に違いはありますか NはMと比べて十分大きいとします char s[M]; wchar_t ws[N]; mbstate_t state = {0}; // 1 scanf("%s", s); wbsrtowcs(ws, &s, N, &state); // 2 scanf("%ls", ws); // 3 wscanf(L"%ls", ws);
236 名前:デフォルトの名無しさん [2017/09/08(金) 04:19:51.29 ID:LlnxN/9E0.net] >>231 1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。 例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
237 名前:デフォルトの名無しさん [2017/09/08(金) 22:13:19.23 ID:Hco6il2OE.net] 兄貴すいません アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください #include <stdio.h> struct User { char name[5]; int age; }; int main() { struct User *u = { "hoge", 10 }; if (u->hoge != NULL) { printf("%d\n", 1); } else { printf("%d\n", 0); } return 0; }
238 名前:デフォルトの名無しさん mailto:sage [2017/09/08(金) 22:41:39.10 ID:R6JsR04N0.net] >>233 *uじゃなくてsにてもしてuに&sを入れてhogeをnameに変えれば動くけど これnameが実体だから100% 1が出るよね
239 名前:デフォルトの名無しさん mailto:sage [2017/09/09(土) 01:43:06.63 ID:DK1wXlQ90.net] struct User { char *name; int age; }; int main() { struct User st = { "hoge", 10 }; struct User *u = &st; if (u->name != NULL) { ......
240 名前:デフォルトの名無しさん mailto:sage [2017/09/09(土) 12:01:06.79 ID:KEHxH6tI0.net] >>233 mallocして中身を詰める #include <stdio.h> #include <stdlib.h> typedef struct{ char name[5]; int age; }User; User* new_user(const char* const name, const int age){ User* u = (User*)malloc(sizeof(User)); strcpy(u->name, name); u->age = age; return u; } int main(){ User* u = new_user("hoge", 10); if (u->name != NULL) { printf("%d\n", 1); } else { printf("%d\n", 0); } return 0; }
241 名前:デフォルトの名無しさん mailto:sage [2017/09/09(土) 12:54:39.58 ID:Ii5yjdZLa.net] >>232 なるほど ありがとうございます fgets(s, M, stdin); const char *p = s; mbsrtowcs(ws, &p, N, &state); でも1と同様の問題が起こりますか >>231 は関数名と実引数の型を間違えてました
242 名前:デフォルトの名無しさん [2017/09/09(土) 16:17:54.34 ID:qJRB74Th0.net] >233 int main(){ return !printf("%d\n",strlen( (&(struct User){.[0]name=0, .age=10, .name={'h','o','g','e'}})->name) 1: 0), 0; } char[5] nameとNULLの比較じゃ意味ねーと思うんだわ
243 名前:デフォルトの名無しさん [2017/09/10(日) 04:20:42.87 ID:3lFSiHDa0.net] >>237 大丈夫だと思う。
244 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 09:19:13.64 ID:bduAIVLIa.net] >>238 なんか色々間違ってねーか?
245 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 10:12:13.09 ID:3KJHgwTr0.net] >>238 >>233 のような初学者にそんな解読しにくいコードを提示しても意味ねーと思うんだわ
246 名前:デフォルトの名無しさん [2017/09/10(日) 11:46:48.72 ID:uI7cAZFMa.net] 暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。 これって趣味にできる?
247 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 11:52:24.67 ID:igLJE8zId.net] できる
248 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 13:39:43.37 ID:3lFSiHDa0.net] そして趣味が高じて仕事にw
249 名前:デフォルトの名無しさん [2017/09/10(日) 13:42:12.95 ID:uI7cAZFMa.net] 今本屋なんだけどどの本で学ぶのがいい? てかphytonとか他の言語の方が良かったりする?
250 名前:デフォルトの名無しさん [2017/09/10(日) 13:45:14.25 ID:uI7cAZFMa.net] ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない
251 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 13:50:00.90 ID:SyCSejr00.net] 幅広くエロエロやると上達早いで もしノイマン型コンピュータの基本知識が 無いのならどこかで学習する必要がある メモリ、アキュムレーター、インデックスレジスタ…etc
252 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 13:53:38.31 ID:rGvjr77j0.net] >>246 公認会計士の仕事にはなかなか結びつかないだろうけれども…ガンバレ C/C++ はどちらかというと原始的 python AI/機械学習で今はやり ゴルフでもなんでも最初は大変だから一定の覚悟が必要