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/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
2017/08/10(木) 20:21:23.44ID:hEocmkh50148デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 23:14:00.57ID:Uz0lh6nE0149デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/29(火) 23:17:01.52ID:/SLQJmZn0 > コンパイルを通すだけの為に苦労したりするが、
> あんなのは完全に時間と手間の無駄だ。
そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
> あんなのは完全に時間と手間の無駄だ。
そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
150デフォルトの名無しさん (ワッチョイ ad7f-vgeI)
2017/08/29(火) 23:31:56.37ID:pPJ906sN0 「今の流れってこうだよね」
「俺の欲しいものは違う」
会話にならねぇ。
「俺の欲しいものは違う」
会話にならねぇ。
151デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 23:53:00.65ID:Uz0lh6nE0 >>150
そうとしか取れないのは君が未熟だからだね。
「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
そうとしか取れないのは君が未熟だからだね。
「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
152デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/29(火) 23:57:29.58ID:+Y8D6iZy0 >>139,146
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね
>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ
>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?
あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね
>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ
>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?
あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
153デフォルトの名無しさん (ワッチョイ 2a89-GW8T)
2017/08/30(水) 00:01:54.97ID:3iEZIBUv0154デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 00:53:26.35ID:F1WQhw000 >>152
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。
> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。
要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。
俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。
> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。
> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。
> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。
要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。
俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。
> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。
> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
155デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 00:58:09.18ID:ry+Kms2n0156デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 01:17:46.58ID:ry+Kms2n0 型どうこうで考えるべきは依存関係なんだが
静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん
しかもデザパタで実現できる疎結合は完全じゃないからね
静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん
しかもデザパタで実現できる疎結合は完全じゃないからね
157デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 01:56:29.11ID:F1WQhw000 >>156
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。
しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。
しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
158デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/30(水) 02:00:40.60ID:vF4qFgfn0 >>154
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ
>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが
>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ
>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし
新しい言語はそこら辺かなり解決されてる
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ
>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが
>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ
>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし
新しい言語はそこら辺かなり解決されてる
159デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 02:07:48.34ID:ry+Kms2n0160デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/30(水) 02:25:01.52ID:vF4qFgfn0 >>154
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか
根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか
根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
161デフォルトの名無しさん (ワッチョイ e96f-oKtA)
2017/08/30(水) 06:22:36.60ID:dAnuHQ8p0 早く夏休み終わらないかな…
162デフォルトの名無しさん (ワッチョイ b500-2x4P)
2017/08/30(水) 07:01:40.06ID:AqkMSzAW0 いや終わらなくていいよ
電車混むし
電車混むし
163デフォルトの名無しさん (スップ Sdca-CsPo)
2017/08/30(水) 08:10:07.81ID:Li+Lo8rKd 大学生のは未だ続くで
164デフォルトの名無しさん (エーイモ SEb2-dmBu)
2017/08/30(水) 13:51:14.27ID:AB0hyKA3E すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
165デフォルトの名無しさん (アウアウカー Sa85-HImR)
2017/08/30(水) 13:58:51.95ID:1qHN72hha GUIないならgccでも問題ない
166デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 14:33:39.82ID:BJd10UjW0 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なんかがいるんで適宜追加しる
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なんかがいるんで適宜追加しる
167デフォルトの名無しさん (ドコグロ MM45-62g8)
2017/08/30(水) 18:06:52.31ID:S+MvNVsbM Windows版のgccある?
168デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 18:24:32.41ID:BJd10UjW0169デフォルトの名無しさん (ドコグロ MM45-62g8)
2017/08/30(水) 18:31:00.76ID:S+MvNVsbM mingw 入ってない環境だとバイナリ使えないよね。
コンパイルして実行したいだけなのに。
コンパイルして実行したいだけなのに。
170デフォルトの名無しさん (ワッチョイ cd11-oKtA)
2017/08/30(水) 18:43:05.43ID:LRl1+/WB0 実行ファイルの配布の意図?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
171デフォルトの名無しさん (ワッチョイ 096f-pmc4)
2017/08/30(水) 19:17:06.22ID:58Rp2mqQ0172デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 19:17:51.85ID:BJd10UjW0 あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
173デフォルトの名無しさん (ワッチョイ 0951-TBjh)
2017/08/30(水) 19:21:14.37ID:qx/wlZ6S0174デフォルトの名無しさん (ワッチョイ 86e3-2x4P)
2017/08/30(水) 20:36:36.61ID:ViOUv0iA0175デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 20:41:41.90ID:BJd10UjW0 >>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
176デフォルトの名無しさん (ワッチョイ 1932-RHs9)
2017/08/30(水) 20:52:42.57ID:t1uAI5x90 こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い
windowsで開発するなら、VCさえあれば十分
windowsで開発するなら、VCさえあれば十分
177デフォルトの名無しさん (ワッチョイ ca1e-62g8)
2017/08/30(水) 21:46:54.45ID:1xtdX2a20 コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。
関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
178デフォルトの名無しさん (ドコグロ MM72-62g8)
2017/08/30(水) 22:05:25.61ID:AIW55pOFM179デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:02:07.68ID:F1WQhw000 >>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。
ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。
C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。
ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。
C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
180デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:03:09.90ID:F1WQhw000 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++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
理由は、
・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。
・関数はどこにでも書ける。
から。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++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
181デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:04:03.99ID:F1WQhw000 > コールバックの処理が適切なことはテストとかで保証するとか考えると
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。
「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。
>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。
自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。
「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。
>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。
自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
182デフォルトの名無しさん (ワッチョイ 096f-pmc4)
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0 ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
183デフォルトの名無しさん (スフッ Sdea-NYHg)
2017/08/30(水) 23:55:33.72ID:FdjUx67gd 最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
184デフォルトの名無しさん (アウアウカー Sa07-6oPJ)
2017/08/31(木) 00:01:55.43ID:B2+zi4Baa 最後に¥0を付けてないとか
185デフォルトの名無しさん (ワッチョイ a34b-hEpb)
2017/08/31(木) 00:06:31.32ID:M/UQy7Jt0 >>183
malloc/free使ってる?
malloc/free使ってる?
186デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:15:15.17ID:AFctto/wd187デフォルトの名無しさん (ワッチョイ cfe3-X0kF)
2017/08/31(木) 00:22:21.25ID:Mr6ZzHeH0 配列サイズを越えて代入しているとか
188デフォルトの名無しさん (ワッチョイ b36f-r+mQ)
2017/08/31(木) 00:28:32.21ID:K0ByhO+S0 つかソース晒せないの?
189デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:28:58.33ID:AFctto/wd 配列の代入とは関係ないところで死んでるっぽいこともあるんだけど、それでも配列の範囲外アクセスとかあるものかなあ……
190デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:31:52.88ID:AFctto/wd >>188
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
191デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:32:55.14ID:AFctto/wd よく考えたらそんな状態で相談することが間違いか
やっぱり撤回します。スレ汚しすいませんでした
やっぱり撤回します。スレ汚しすいませんでした
192デフォルトの名無しさん (ワッチョイ a34b-hEpb)
2017/08/31(木) 00:34:49.91ID:M/UQy7Jt0 >>190
メモリリークをチェックしてみたら
メモリリークをチェックしてみたら
193デフォルトの名無しさん (ワッチョイ a323-X0kF)
2017/08/31(木) 02:33:47.40ID:KfXpPD/x0 最適化の有無で変わった事と言うと、この前こんなことがあった。
(以下の 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 のように重なってしまっておかしくなったと。
(以下の 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 のように重なってしまっておかしくなったと。
194デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 03:22:36.47ID:IR3nOS0l0 >>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
195デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 03:58:43.17ID:IR3nOS0l0 >>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず
コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな
>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
コンパイルエラーじゃなくてテストで保証するとになればなおさら変
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず
コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな
>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
コンパイルエラーじゃなくてテストで保証するとになればなおさら変
196デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 04:15:22.77ID:IR3nOS0l0 >>181
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ
コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ
コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
197デフォルトの名無しさん (ブーイモ MMa7-yL/R)
2017/08/31(木) 05:12:55.38ID:egwbmqN8M スタックフレームの破壊は明白なんだから関数内で宣言してる配列全部の
範囲チェック入れてみな
範囲チェック入れてみな
198デフォルトの名無しさん (ワッチョイ 430d-b8Mh)
2017/08/31(木) 11:26:29.57ID:e5ym4hpC0 やりそうなこと
□ 要素数 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 が配列ではなくポインタだった為
処理したい要素数が渡っていない
□ 要素数 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 が配列ではなくポインタだった為
処理したい要素数が渡っていない
199デフォルトの名無しさん (ワッチョイ fff0-6h2J)
2017/08/31(木) 13:55:57.05ID:wUqC2S3T0 >>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
200デフォルトの名無しさん (スプッッ Sddf-b5LN)
2017/08/31(木) 16:11:13.20ID:aZ9Rj489d 創業当時から継ぎ足した秘伝のソース
201デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/08/31(木) 16:17:00.98ID:JYM1pg890 半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね
アボガドロ定数の逆数くらいに薄まるよね
202デフォルトの名無しさん (スプッッ Sddf-b5LN)
2017/08/31(木) 16:47:29.73ID:aZ9Rj489d 何か、酵母とか菌糸とか入ってて熟成されるんよ。ただ混ざるだけじゃないんよ。
203デフォルトの名無しさん (ワッチョイ 6323-6h2J)
2017/08/31(木) 22:53:34.07ID:F9uWTtxD0 >>194
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
204デフォルトの名無しさん (ワッチョイ 6323-6h2J)
2017/08/31(木) 22:54:02.64ID:F9uWTtxD0 >>195
> ローカル関数で変数をキャプチャできるぞ
ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが)
JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ)
入れ子になっていても破綻せずに分解して展開出来るんだよ。
C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。
> コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
> それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
これは通説だが、俺はこれが嘘だと思ってるんだよね。
JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で入れ子で書いている。
それよりawaitの方が見やすいってのは、上から順に読める形式だから。
でも>>180に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、
その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない)
つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。
C#やC++はレキシカルスコープがないからawaitが必要なだけ。
だからここら辺は実は文法との相性もあるんだよ。
C++はそんなのお構いなしに何でもかんでも入れてる感じだが。
(とはいえ、選択肢が増えること自体は悪いことではない)
> char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
そりゃconstの有無をテストで落とすのは無理だろうさ。
まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。
(ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか)
そもそも君はどこまでconstを使っているんだ?
C++のconstは「定数」ではなく「再代入禁止」だ。
現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。
これをやっているのか?
やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。
> ローカル関数で変数をキャプチャできるぞ
ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが)
JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ)
入れ子になっていても破綻せずに分解して展開出来るんだよ。
C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。
> コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
> それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
これは通説だが、俺はこれが嘘だと思ってるんだよね。
JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で入れ子で書いている。
それよりawaitの方が見やすいってのは、上から順に読める形式だから。
でも>>180に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、
その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない)
つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。
C#やC++はレキシカルスコープがないからawaitが必要なだけ。
だからここら辺は実は文法との相性もあるんだよ。
C++はそんなのお構いなしに何でもかんでも入れてる感じだが。
(とはいえ、選択肢が増えること自体は悪いことではない)
> char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
そりゃconstの有無をテストで落とすのは無理だろうさ。
まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。
(ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか)
そもそも君はどこまでconstを使っているんだ?
C++のconstは「定数」ではなく「再代入禁止」だ。
現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。
これをやっているのか?
やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。
205デフォルトの名無しさん (ワッチョイ 6323-6h2J)
2017/08/31(木) 22:54:22.15ID:F9uWTtxD0 >>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)に対しての副作用を持たないことを保証)することは出来ないでしょ。
コードを流用するとね、
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)に対しての副作用を持たないことを保証)することは出来ないでしょ。
206デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/01(金) 02:04:57.35ID:2msaHTP30 >>204
ん、C++のconstは、Cのconstよりも「定数」だぞ
int const a = 1;
switch(1) [
case a: ; //valid in C++, invalid in C
}
ん、C++のconstは、Cのconstよりも「定数」だぞ
int const a = 1;
switch(1) [
case a: ; //valid in C++, invalid in C
}
207デフォルトの名無しさん (スップ Sd1f-wHLy)
2017/09/01(金) 08:48:03.58ID:5GGRc0nid >>206
すまん、そのコードの意味がわからん
すまん、そのコードの意味がわからん
208デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/01(金) 09:06:42.83ID:2msaHTP30 typoしとるな
[は{
[は{
209デフォルトの名無しさん (ワッチョイ 430d-b8Mh)
2017/09/01(金) 09:55:02.84ID:kxCoop1y0 case ラベルに const な変数の変数名
C++ ならばリテラルと等価となりセーフ
C は変数のままの扱いでアウト
C++ ならばリテラルと等価となりセーフ
C は変数のままの扱いでアウト
210デフォルトの名無しさん (ワッチョイ 53db-aQR2)
2017/09/01(金) 11:36:56.59ID:IGPoCkp90 Cのconstは変更不可なオブジェクトだからな
211デフォルトの名無しさん (ドコグロ MMdf-6Nl5)
2017/09/01(金) 13:20:08.84ID:JSZHio/AM C++は使える範囲を広くしただけでconstの意味はCといっしょ
constによる最適化の話には関係しない
constによる最適化の話には関係しない
212デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/01(金) 15:37:25.51ID:2msaHTP30 違う
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている
213デフォルトの名無しさん (ワッチョイ c300-X0kF)
2017/09/01(金) 16:51:03.36ID:dkwAUCjz0 volatileについてもkwsk
214デフォルトの名無しさん (ワッチョイ fff0-6h2J)
2017/09/01(金) 17:40:42.98ID:XJwe5Q/Z0 ttps://regmedia.co.uk/2011/02/18/dennis-richie-and-brian-kernighan-pdp-11.jpg
こういう時代の揮発性のメモリ
揮発しないメモリもあるんですよ
こういう時代の揮発性のメモリ
揮発しないメモリもあるんですよ
215デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/01(金) 18:43:10.50ID:2msaHTP30 ビットフェードとvolatileは関係ないぞ
216デフォルトの名無しさん (ワッチョイ e311-b8Mh)
2017/09/01(金) 18:59:13.16ID:dXFBhBz10 コード中の文意では変わってなくても、他の要因で変わる可能性あるような
割り込みやマルチスレッド等で共有してる変数とか
割り込みやマルチスレッド等で共有してる変数とか
217デフォルトの名無しさん (ワッチョイ cf23-Gmm8)
2017/09/03(日) 03:14:53.65ID:GCfgdhr+0 > C++のconstは「定数」ではなく「再代入禁止」だ
代入と初期化を混同してませんか
代入と初期化を混同してませんか
218デフォルトの名無しさん (ワッチョイ c300-X0kF)
2017/09/03(日) 08:56:24.33ID:72Px+h1e0 staticについてもkwsk
219デフォルトの名無しさん (ワッチョイ a323-wVzx)
2017/09/03(日) 11:44:42.91ID:jl0cf3RS0 性的な
220デフォルトの名無しさん (ワッチョイ e311-b8Mh)
2017/09/03(日) 12:14:41.26ID:9dM4T0NO0 外からは見えないように、そして、なくさないようにするエロ本
221デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 17:40:32.30ID:jXGwZqzU0 一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ
222デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
2017/09/03(日) 17:45:54.60ID:5WRYI1ZX0 static に背負わせすぎな気がする
関数内変数の static
関数スコープ外の static
C++ ならばクラスメソッドのstatic
クラス変数の static もあったかな‥多すぎだ‥
関数内変数の static
関数スコープ外の static
C++ ならばクラスメソッドのstatic
クラス変数の static もあったかな‥多すぎだ‥
223デフォルトの名無しさん (ワッチョイ a34b-hbUo)
2017/09/03(日) 18:29:43.87ID:fyDk5FSQ0 予約語を減らす涙ぐましい努力
224デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/03(日) 18:47:29.02ID:jXGwZqzU0 C99以後、仮引数のstaticもあるしな
225デフォルトの名無しさん (ワッチョイ ffea-pNuo)
2017/09/04(月) 00:43:28.93ID:QxIkVb9z0 ポインタ関連で*と&の記号を使っているのも
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに
226デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
2017/09/04(月) 01:05:35.63ID:IeE+YITL0 >>225
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
>>225
C# の ref 宣言のように,宣言だけでなく呼び出し側でも ref が必要だという文法はあってもよかったかな
C# の ref 宣言のように,宣言だけでなく呼び出し側でも ref が必要だという文法はあってもよかったかな
228デフォルトの名無しさん (ワッチョイ a323-X0kF)
2017/09/04(月) 02:45:48.86ID:tVodzhFi0 >>224
え?そんなのあった?
え?そんなのあった?
229デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/09/04(月) 08:55:10.34ID:pd3pCmCq0 >>228
ISO/IEC9899:1999
6.7.5.3 Function declarators (including prototypes)
21 EXAMPLE 5
void f(double a[restrict static 3][5]);
ISO/IEC9899:1999
6.7.5.3 Function declarators (including prototypes)
21 EXAMPLE 5
void f(double a[restrict static 3][5]);
230デフォルトの名無しさん (ワッチョイ a323-wVzx)
2017/09/05(火) 00:59:51.51ID:2RdPD3ce0 >>229
ああ。そういう使い方か。
ああ。そういう使い方か。
231デフォルトの名無しさん (アウアウウー Sa47-ktFK)
2017/09/07(木) 15:42:36.42ID:zsD50ajta 以下の三つの操作に違いはありますか
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);
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);
232デフォルトの名無しさん (ワッチョイ b323-QlH+)
2017/09/08(金) 04:19:51.29ID:LlnxN/9E0 >>231
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
233デフォルトの名無しさん (エーイモ SE5a-w7pF)
2017/09/08(金) 22:13:19.23ID:Hco6il2OE 兄貴すいません
アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください
#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;
}
アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください
#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;
}
234デフォルトの名無しさん (ワッチョイ 3e6c-xkdj)
2017/09/08(金) 22:41:39.10ID:R6JsR04N0235デフォルトの名無しさん (ワッチョイ 8311-QyhX)
2017/09/09(土) 01:43:06.63ID:DK1wXlQ90 struct User {
char *name;
int age;
};
int main()
{
struct User st = { "hoge", 10 };
struct User *u = &st;
if (u->name != NULL) {
......
char *name;
int age;
};
int main()
{
struct User st = { "hoge", 10 };
struct User *u = &st;
if (u->name != NULL) {
......
236デフォルトの名無しさん (ワッチョイ 1af0-x/0H)
2017/09/09(土) 12:01:06.79ID:KEHxH6tI0 >>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;
}
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;
}
237デフォルトの名無しさん (アウアウウー Sa47-ktFK)
2017/09/09(土) 12:54:39.58ID:Ii5yjdZLa238デフォルトの名無しさん (ワッチョイ b7e4-hwHx)
2017/09/09(土) 16:17:54.34ID:qJRB74Th0 >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の比較じゃ意味ねーと思うんだわ
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の比較じゃ意味ねーと思うんだわ
239デフォルトの名無しさん (ワッチョイ b323-xkdj)
2017/09/10(日) 04:20:42.87ID:3lFSiHDa0 >>237
大丈夫だと思う。
大丈夫だと思う。
240デフォルトの名無しさん (アウアウカー Sa43-OnxZ)
2017/09/10(日) 09:19:13.64ID:bduAIVLIa >>238
なんか色々間違ってねーか?
なんか色々間違ってねーか?
241デフォルトの名無しさん (ワッチョイ ba89-l0Z7)
2017/09/10(日) 10:12:13.09ID:3KJHgwTr0242デフォルトの名無しさん (アウアウカー Sa43-+qdT)
2017/09/10(日) 11:46:48.72ID:uI7cAZFMa 暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。
これって趣味にできる?
これって趣味にできる?
243デフォルトの名無しさん (スププ Sdba-uTHE)
2017/09/10(日) 11:52:24.67ID:igLJE8zId できる
244デフォルトの名無しさん (ワッチョイ b323-xkdj)
2017/09/10(日) 13:39:43.37ID:3lFSiHDa0 そして趣味が高じて仕事にw
245デフォルトの名無しさん (アウアウカー Sa43-+qdT)
2017/09/10(日) 13:42:12.95ID:uI7cAZFMa 今本屋なんだけどどの本で学ぶのがいい?
てかphytonとか他の言語の方が良かったりする?
てかphytonとか他の言語の方が良かったりする?
246デフォルトの名無しさん (アウアウカー Sa43-+qdT)
2017/09/10(日) 13:45:14.25ID:uI7cAZFMa ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない
247デフォルトの名無しさん (ワッチョイ b339-xWDE)
2017/09/10(日) 13:50:00.90ID:SyCSejr00 幅広くエロエロやると上達早いで
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化 過去10年間に使用のメールアドレスや電話番号等も [Hitzeschleier★]
- 【中国外務省】日本への渡航自粛を再度呼びかけ 今度は「地震発生」を理由に [ぐれ★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★3 [Hitzeschleier★]
- 【おこめ】「有能だったんじゃ」おこめ券で批判殺到の鈴木農水大臣…ネットでは前任の“進次郎再評価” [ぐれ★]
- 【芸能】デパートで見つけたランドセルが衝撃価格! つまみ枝豆「どこかで規制しないと」に共感の声殺到 「全て同感」「高すぎます」★2 [冬月記者★]
- 【速報】年収の壁の自民案判明、26年は168万円 [蚤の市★]
- 日本人、世界で最もブランドに興味なし🇯🇵 [462275543]
- 【悲報】鈴木農水大臣、国民から「こいつひょっとしてアホなんじゃね?」と思われ始めてしまうwww [793117252]
- 【悲報】たぬかなが渡邊渚を壮絶バッシング 「グラビア出したあたりから臭いな~と思ってたが激臭になってたわ。中居は悪くない」 [455031798]
- 【高市速報】 防衛省公式X、このタイミングで日本の防衛兵器や攻撃ミサイルを動画で宣伝wwww [197015205]
- 自閉症児の父親「中絶しておけば良かった。 家族が欲しかったのに、手に入れたのは人間たまごっち」 [777114754]
- 「ミニトマトがボウルに入ってるから使ったら残りはラップして輪ゴムしといてー」👉アスペ系旦那、とんでもない行動に出てしまう [242521385]
