【初心者歓迎】C/C++室 Ver.102【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
2018/03/21(水) 20:23:31.47ID:NRxI71LE
>>321
お前のコードは無駄ばかり
コンパイラも無駄命令を吐く
そもそもCPUの動作自体が無駄ばかり
そのプログラムを作るのも無駄だったり

お前の存在は?
2018/03/21(水) 20:37:50.64ID:L8aCdycT
本スレでやれ
2018/03/21(水) 20:54:50.63ID:b8e3mX8M
手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない?
後置の方が保守性が高いとか可読性が高いならともかく、そうじゃないんだから天秤にかける必要さえない
2018/03/21(水) 20:59:28.52ID:CmybL5Dk
>>321
それで見やすくなるなら別にいんじゃね
2018/03/21(水) 22:35:08.33ID:TV3lE0eZ
効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる
2018/03/21(水) 22:37:05.71ID:D2465Z9C
どんなメリットがあるので?
2018/03/21(水) 22:39:19.66ID:MouF+uE4
ホントは最適化でだいぶん上手いことやってくれるんやけどな。
というか最適化でやるべきことだと思う。
細かいことまでいちいち配慮しなきゃならないのは最適化技術の敗北。
仕様に [[likely]] なんて入ったのは不格好な話だ。
2018/03/21(水) 23:03:06.41ID:TV3lE0eZ
イテレータの++や―に戻り値があること自体設計ミス
ポインタのと類似性そこまで要らんし
イテレータで *it++ とか書きたくて仕方ない人もそんなに居ないだろ
void型でよかった
2018/03/21(水) 23:08:57.12ID:52xrh1Hk
アセンブラの inc やdec 命令実行時のフラグ反映は不要?
高級アセンブラの名残じゃね?
2018/03/21(水) 23:14:08.41ID:MouF+uE4
>>329
逆じゃないかなぁ。
ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。
どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。
ちなみに operator++ の返却値を void にすることは出来ます。
2018/03/22(木) 00:37:09.57ID:2FEQ/Wa3
>>330
inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが
2018/03/22(木) 00:58:21.46ID:dLiR/Xt3
なぜポストインクリメントがよく使われるかは、
PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。
間接参照したあとにレジスタが増える。
オートデクリメントは逆にプレデクリメント。

あとinc,decでフラグが変化するのもPDP当時は当然の動作。
334デフォルトの名無しさん
垢版 |
2018/03/22(木) 06:11:13.57ID:I/iO4/8S
Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり
PCつかわないから、Ubuntuなんてプログラム環境は大体パッケージで手に入るし
スゲエ良いと思ってたんだけど、エロ動画配信サイトが今時は必ず専用の○○プレーヤーじゃないと
見れないんだな。たとえば、DMMプレーヤーとかそのサイトの専用の奴。なんでもDRMとかいう不正禁止のが
付いてて、普通のプレーヤーじゃ見れないのよ。スゲエ不便だからそれ専用にWindows10準備しちゃおうかな・・w

俺はプログラム言語でC++が一番すきです。 
2018/03/22(木) 07:05:57.55ID:C5Ula1AM
またイミフなレスしてるのか
336デフォルトの名無しさん
垢版 |
2018/03/22(木) 07:15:53.52ID:tiDItZ1f
C--があってもいいかもしれないな。
337デフォルトの名無しさん
垢版 |
2018/03/22(木) 09:44:57.12ID:Q2/ylW7b
C♭思い出した
2018/03/22(木) 10:24:04.20ID:HExEyyqO
>>336
ググればすぐにわかることだけど、有るよ。
2018/03/22(木) 17:42:41.78ID:Z5xjYgF/
unordered_setやunordered_mapは
reserve(size_type)はあるのにshrink_to_fit()がないのはなぜですか?
340デフォルトの名無しさん
垢版 |
2018/03/22(木) 18:14:23.23ID:tiDItZ1f
ハッシュだからじゃないの。
341デフォルトの名無しさん
垢版 |
2018/03/26(月) 20:46:12.70ID:qgnj+CJa
void DumpCode(const char* str) {
for (int i = 0; str[i] != '\0'; ++i) {
printf("%02X ", (unsigned char)str[i]);
}
cout << endl;
}

↑の文字コードを16進数で表示する関数ですが、なぜ

printf("%02X ", str[i]);

ではなく、

printf("%02X ", (unsigned char)str[i]);

とキャストしているのでしょうか?
2018/03/26(月) 20:52:31.38ID:Sl5sXtlN
0x80以上の時符号拡張されてマイナスになるから
2018/03/26(月) 20:55:55.86ID:qgnj+CJa
char型の値は 0 から 127 までであると本に書いてあるのですが。。。
2018/03/26(月) 20:58:30.32ID:Sl5sXtlN
>>343
その本は窓から投げ捨てろ。
ー128〜127が正解だ
2018/03/26(月) 21:01:09.95ID:qgnj+CJa
>>344

本にはそうは書かれていませんでした。申し訳ありません。間違っていました。

アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。
2018/03/26(月) 21:02:33.45ID:qgnj+CJa
>>344

何か不具合が起こる例を教えていただけると助かります。
2018/03/26(月) 21:06:19.73ID:42MV7MT1
>>346
char ch = 255;
printf("%d\n", ch);

C/C++では、オーバーフローは警告なく普通に起こる。
2018/03/26(月) 21:10:11.27ID:42MV7MT1
signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、
printf("%c\n", (char)255);
2018/03/26(月) 21:11:26.75ID:42MV7MT1
printf("%d\n", (char)255);
%dね。
2018/03/26(月) 21:42:10.96ID:3IjTFjn0
>>344
>>348
そんな事は決まってない
2018/03/26(月) 21:52:30.42ID:42MV7MT1
charのビット数、CHAR_BITが8ではない環境はほとんどない。
2018/03/26(月) 22:00:14.93ID:42MV7MT1
4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。
2018/03/26(月) 22:58:41.82ID:3IjTFjn0
ほとんど無いから何?
「決まってない」の反論になってないよ

現行品でcharが16bitの環境があるんだけどね
2018/03/26(月) 23:00:24.31ID:3IjTFjn0
charが符号付きとも決まってない
ちょうど今符号無しの環境を使ってるよ
2018/03/26(月) 23:02:53.12ID:8aZ5PUAj
インテル入ってない
356デフォルトの名無しさん
垢版 |
2018/03/26(月) 23:03:06.95
俺のcharは100bitあるぜ!!
2018/03/26(月) 23:04:42.66ID:3IjTFjn0
とりあえず>>1を読んどけ
2018/03/26(月) 23:55:34.36ID:2w8Ha0HC
char と signed char を混同するクソコテ
2018/03/27(火) 01:28:23.66ID:bCiMyjcv
今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。

初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。
2018/03/27(火) 01:33:34.51ID:GW1/xmrB
unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き
以外に遭遇した事無いけどな
2018/03/27(火) 02:55:06.24ID:oddUVIdN
>>359
>>341の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。
そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では?
2018/03/27(火) 07:09:18.07ID:vavxlF2f
???
環境を明示しろって言うのは>>1にも書いてあるんだが...
2018/03/27(火) 07:42:58.98ID:7BdcIkqa
>>361
初心者だろうと質問に付随する前提知識は必要
変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある

まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう
2018/03/27(火) 07:52:49.58ID:ofLFYE4b
回答者もわかってないからな
>>352とか
2018/03/27(火) 08:13:51.03ID:ofLFYE4b
4ビットCPUだとcharは4ビットと思ってんのか?
366デフォルトの名無しさん
垢版 |
2018/03/27(火) 08:39:25.07ID:tnecWY6M
>>341 >>346
不都合と言う程の不都合か分からないけど、
単なる char が signed char のコンパイラで、例えば str[i] == -1 の時、
printf("%02X ", (unsigned char)str[i]); なら表示は "FF "
printf("%02X ", str[i]); だと表示は "FFFFFFFF " (intが32bitの環境)
てな具合に表示結果が指定桁数とずれて見苦しい、という現象が起きる。

ただし void DumpCode(const char* str) でASCII文字列しか扱わないなら、
意図せずASCII以外(漢字など)を含んだ文字列を引数に与えたときに
「見苦しい表示結果」のおかげで関数の使い方の間違いに気付きやすい。
よって (unsigined char) のキャストをしない方が好ましい、て考え方もある。


>>360
ARM で GCC だと、単なる char は unsigined が普通みたい。
元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。
2018/03/27(火) 08:41:45.88ID:7BdcIkqa
4bitのcharか、アルファベットが表現できないな

まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね
なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど
368デフォルトの名無しさん
垢版 |
2018/03/27(火) 09:55:59.95ID:dDmfqIPV
int *p = new int[100];
delete[] p;

delete[] p で int 100個分の領域を解放するのだと思いますが、
どうやって、 p が int 100個分の領域を指していると分かるのでしょうか?
p は単なる int 型へのポインタです。
2018/03/27(火) 10:02:58.95ID:GW1/xmrB
>>366
つ -fsigned-char/-funsigned-char
370デフォルトの名無しさん
垢版 |
2018/03/27(火) 10:03:09.61ID:dDmfqIPV
スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある
そうですが、なぜ、エラー終了にしないのでしょうか?
2018/03/27(火) 10:56:59.81ID:r9AxIBc/
>>368
良くある実装としては
newが返すアドレスの前にヘッダ情報がある
2018/03/27(火) 10:59:24.01ID:r9AxIBc/
>>370
(すぐに)わからないから
2018/03/27(火) 13:22:10.84ID:KACb5w79
素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう
バッファオーバーフローの場合は割り当てたメモリとバッファ境界がミスマッチなら直ぐにエラー検出できないとしても仕方がないけどこれは質問とは別の話
2018/03/27(火) 14:41:48.71ID:1PffFgMm
配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか?
例えばint型配列のfooとint型変数のbarがあったとして、
int n = foo[10000]; と
int n = bar;
の速度は同じですか?
2018/03/27(火) 14:55:45.68ID:Z/OsE5Ku
添字の値にかかわらず一定
foo[10000] と foo[1] が同じって話だぞ
2018/03/27(火) 14:59:13.83ID:1PffFgMm
>>375
ありがとうございます
だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね?
2018/03/27(火) 15:02:49.07ID:jMKP3TFv
レッツ実測&吐き出したコードを確認
最適化具合でも全然ちがう
378デフォルトの名無しさん
垢版 |
2018/03/27(火) 15:06:05.02ID:dDmfqIPV
>>377

吐き出したコードってどうやって確認するんですか?
379デフォルトの名無しさん
垢版 |
2018/03/27(火) 15:06:56.79ID:dDmfqIPV
>>371-372

ありがとうございました。
そのあたりのことを詳しく書いてある本はありますか?
2018/03/27(火) 15:07:03.67ID:1PffFgMm
>>377
確かにそうですね
ありがとうございます、やってみます
2018/03/27(火) 15:08:28.42ID:Di3KX/fh
ポインタから値を読み込む場合は?
2018/03/27(火) 15:16:11.82ID:jMKP3TFv
>>378
使っている環境による
機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する

もっと前のアルゴリズムの検討は済んでて、
もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね?
2018/03/27(火) 17:26:05.07ID:6NyejsSC
>>343-344

char 型が符号付きであってもなくても格納可能な範囲という意味では 0 〜 127 であると思って使ってれば間違いないのは確か。
あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので
char が符号付きだとしても -127 〜 127 しか表現できないかもしれない。

>>345

言語仕様では文字がアスキーコードとは保証してないんだ。
ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、
EBCDIC とかでも言語仕様には違反しない。
2018/03/27(火) 18:20:11.37ID:ofLFYE4b
>>373
並のOS環境って何だよwww

一般的なMCUのほとんどは
アドレス変換テーブルの仕組みがなく
スタックオーバーフローを検出するハード的仕組みも無い
2018/03/27(火) 18:21:21.80ID:ofLFYE4b
>>383
無知は出てくるな
2018/03/27(火) 20:25:43.43ID:GW1/xmrB
BASIC Stamp でもやってればいいのに
387デフォルトの名無しさん
垢版 |
2018/03/27(火) 22:12:36.71ID:gjFRbLOq
二つスレッドがある
片方はstd::queueにつんで、もう片方はそれを取る

これで詰まれた瞬間に取るにはどうするのがいいのかな?
簡単に作るなら、無限ループでスリープ挟みながら取り続けることだけど、無駄も多いから積んだのをトリガーに取りたい


環境はg++とVC++です
2018/03/27(火) 23:17:24.98ID:7OwU1Hvz
>>379
stackoverflow で、たまたまアクセスしたメモリに、
どんな値が入っているかは、誰にも分からない。
単に前に入っていた値が、入っているだけだから

その値が、たまたまCPU 命令にあれば、CPU を実行するから、
エラーになるのは次の命令以降になる

一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる
389デフォルトの名無しさん
垢版 |
2018/03/27(火) 23:21:17.42ID:dDmfqIPV
スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか?
390デフォルトの名無しさん
垢版 |
2018/03/27(火) 23:30:03.49ID:4E83+S2j
>>387
昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。
注意としてspurious wakeupというのも書いてある。
もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。
2018/03/27(火) 23:38:12.48ID:zFrY2ZyB
>>389
してる環境もあれはしてない環境もある
2018/03/27(火) 23:46:19.51ID:6NyejsSC
>>389
ページ単位ではしていることがある。
OS がメモリの割付を管理していて、
足りなければ追加で割り当てたりもする。
割り付けてないメモリ空間に変に触ったら検出できる。
2018/03/28(水) 06:54:26.81ID:fYzIlbdt
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第

ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある
2018/03/28(水) 06:56:20.68ID:fYzIlbdt
今のWindowsとかLinuxとかならもちろん瞬時にわかる
2018/03/28(水) 10:17:21.31ID:qnpV2Jxp
>>387
セマフォの類を使え
396デフォルトの名無しさん
垢版 |
2018/03/30(金) 10:25:28.98ID:8epIcCej
最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから
C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト
してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。
どこまでなら使えるんだろ? なにか目安はないか?
2018/03/30(金) 11:36:04.01ID:Wx9gH+Ym
組み込みなら自分で書いたものだけ使うというか
STLは一切使わないのが普通じゃないか?
2018/03/30(金) 12:31:15.37ID:HVaF4kSp
new/delete
例外
ラムダ式

は使わない
もちろん規模によるけど
2018/03/30(金) 12:36:38.56ID:MnRWcQoL
組み込みってピンキリだからなんとも言えんわ
業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし
2018/03/30(金) 12:43:29.07ID:HVaF4kSp
>>398はMCU/DSPくらいの話
2018/03/30(金) 12:47:07.67ID:TqB3XhjJ
どれぐらいのDSP?
ADSP-21573ぐらい
402デフォルトの名無しさん
垢版 |
2018/03/30(金) 13:46:55.20ID:8epIcCej
STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて
見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力
的に見えてきた。 
2018/03/30(金) 13:52:10.17ID:Wx9gH+Ym
内部で new / delete 使用している stl は使わないリストに入れず
new / delete は使わないリストに入れんのかよ…
2018/03/30(金) 14:08:56.04ID:2gx9kNrJ
STLコンテナとSTLアルゴリズム
どっちの話をしているんだ
2018/03/30(金) 14:25:29.65ID:FxYI+k+J
コンテナ使わない有用なアルゴリズムってあるか
あるなら使いたいからご教授ください

min とかあるか
2018/03/30(金) 16:24:55.88ID:HVaF4kSp
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前

そもそもヒープエリア自体無かったりするし
あってもアロケートのみで解放機能が無かったりする

小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない
2018/03/31(土) 14:52:31.93ID:2aV4tUPq
組み込みって未だにそんなメモリかつかつなの?
2018/03/31(土) 17:31:27.59ID:aygih7Tk
>>407
そりゃ規模による
2018/03/31(土) 17:45:54.96ID:OaeapR1O
>>407
>>399
410デフォルトの名無しさん
垢版 |
2018/04/02(月) 16:24:48.19ID:MJzKsai7
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。

注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?
2018/04/02(月) 16:30:09.86ID:/drqX+oD
>>410
人間の注意力なんてクソザコだからだよ。
2018/04/02(月) 16:40:04.72ID:3MXga4hP
注意していれば防げるミスは、いつか必ず発生する
413デフォルトの名無しさん
垢版 |
2018/04/02(月) 16:42:16.37ID:r6uHUG7/
2重includeに気付いてからでも遅くない
2018/04/02(月) 20:45:42.01ID:JDmrHTz8
>>410
複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか
2018/04/02(月) 20:57:46.72ID:MJzKsai7
header_1
header_2

header_n

で共通に必要なヘッダ header_a がある。

header_1
header_2

header_n

のそれぞれの中で header_a をインクルードしている。

header_i と header_j (i ≠ j) が必要なファイル file1 がある。

というような状況でしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
2018/04/02(月) 21:43:19.92ID:JDmrHTz8
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします

あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?
2018/04/02(月) 22:36:25.27ID:7E1ezZvV
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」

どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける
2018/04/02(月) 22:37:53.93ID:APYGmZJZ
スタジオじゃなくてスタンダード・アイオーや
2018/04/02(月) 22:38:24.97ID:7E1ezZvV
ごめんごめん
2018/04/02(月) 22:51:41.33ID:Y3fpn4XN
なんで前半はフルで後半は省略したの?
2018/04/02(月) 22:58:42.67ID:APYGmZJZ
アイオー、アイオー、声を上げて
2018/04/02(月) 23:06:11.93ID:APYGmZJZ
Input/Output、日本語では入出力
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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