C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part142
https://mevius.5ch.net/test/read.cgi/tech/1554124625/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/07/04(木) 03:01:53.76ID:OupeWpkE0
「メモリ確保に失敗したこと」のメッセージを出す以外に対処法はないと
思うんだけど。
2019/07/04(木) 03:16:52.36ID:+bvr5vAX0
なんでnewで例外起こる話しているんだか
本当に全くわかっていないのね
2019/07/04(木) 03:47:53.77ID:P4gQiU7c0
どうでもいい話はやめて今までにない新しい画期的なテクニックの話をしてくれ
頼む
一生のお願い
2019/07/04(木) 05:48:37.09ID:Vr4LlPEB0
>>549
> n * (P * 2 - E * 0.5) > H2 - H1.
> n > (H2 - H1) / (P * 2 - E * 0.5).
> となる。
(P * 2 - E * 0.5)がマイナスだと不等号が逆転するのを忘れている
3 > 2 の両辺を-1で割ると -3 < -2
2019/07/04(木) 07:22:01.27ID:Ic4+qAXvM
>>629
そんなテクニックはここに書かない
2019/07/04(木) 08:41:24.64ID:boKHx0+g0
>>626
newの例外の話なんてしてしてません。
本当にレベル低いやっちゃな
2019/07/04(木) 08:52:16.87ID:yrHYMywV0
TYPE *pArr = new TYPE[N];
と同じスコープ内(のdelete pArrの前)で例外が発生した場合に
>>624
>誰がヒープ回収するねん...
という話ですな
2019/07/04(木) 09:10:15.58ID:MHKH+BBjd
また話それたのかw
ポインタもコンテナも結局都合の悪いレスはスルーしてるからこうなる
2019/07/04(木) 09:34:14.60ID:8zHkL2vVM
こいつC++98で時間止まってるからな
20年かけてSTLコンテナの使い方学んで
その結果がvectorよりlist、それ以上に生ポインタが最強って結論
どうせ40代おっさん低収入だろうけど、自分を天才と呼び、
数学ががどうのこうの言うわり、単なる足し算掛け算をどや顔でさらすし、
本当読んでて可哀想になってくる
2019/07/04(木) 10:15:53.90ID:mwmcFkvyM
要素数固定ってコンパイル時に固定の意味と実行時にある値に決まるって意味があると思うけど
前者では T Arr[N]
後者では std::unique_ptr<T[ ],>
を使ってしまう。
それ自体をreturnしないときは std::array を使うのがかったるく感じてしまう
2019/07/04(木) 10:35:11.99ID:VBCrH1IpM
>>636
arrayはもうひと頑張りしないとだめだな。
宣言時に値を初期化するとき、値の数をテンプレートパラメータに手打ちとか
要素数省略できるCスタイル配列に負けてる
2019/07/04(木) 11:36:25.81ID:Bk1vOaTSa
>>637
c++17から推論補助が出たので要素数指定不要です。
c++14以前はmake_arrayとか作ればいける
2019/07/04(木) 11:42:55.77ID:mwmcFkvyM
でも std::begin std::end があるからスコープ内の単純な配列に std::arrayを使う
メリットがいまいちわからないんだよねー
2019/07/04(木) 11:55:46.77ID:zoOerLpiM
begin endは普通の配列にも使えるだろ
2019/07/04(木) 11:56:48.16ID:tdjije7mM
>>638
おお、ほんまや。
かゆいところに手が届いて行くのぅ
2019/07/04(木) 12:06:11.23ID:VQxD4eRSd
template関数で受けたときにポインターにならないからauto lambdaで受けてもsizeがとれる
2019/07/04(木) 12:17:57.65ID:mwmcFkvyM
>>640
だから普通の配列を使ってしまうという話なんだが
2019/07/04(木) 12:19:43.85ID:mwmcFkvyM
>>642
その場合にはそうだね
でも関数に渡すとき大抵 begin end だからなあ
2019/07/04(木) 12:49:15.77ID:bmYDtW5Wp
>>642の言ってるのは配列の参照にキャストされないからだと思うんだけど(自分もそれが不便だと思う)
そのキャストを実装しない理由あるんかね?
中身ただの配列なんやろ?
2019/07/04(木) 12:50:55.35ID:zoOerLpiM
>>643
変なところで改行するなよ
2019/07/04(木) 15:52:29.03ID:mwmcFkvyM
>>646
なるほどすまん
100人中98人位が誤解する改行だた
2019/07/04(木) 17:29:10.64ID:XTdeRRSwa
構造体をchar配列にシリアライズする方法を教えてください
2019/07/04(木) 17:31:04.99ID:QgrgqeUu0
memcpy
2019/07/04(木) 17:32:23.03ID:MlPmA9V9M
キャストしてぶっ込め
なお環境とアドレスによってはバスエラーが発生したりするよ
2019/07/04(木) 17:41:18.95ID:DFmBoT0+d
>>645
cとの互換性に起因した過去コードとの互換性保つために、配列を引数で渡そうとするとpointer渡しになるのだろう。
受け側でtemplate使ってT (&arr)[N]みたいに明示的に引き取らない限りは

c++20でstd::spanが使えるようになれば楽になるな。
それでも完全転送は通らないけど
2019/07/04(木) 17:42:05.56ID:Bk1vOaTSa
配置newで出来たりしますか?
2019/07/04(木) 20:00:03.82ID:C9xm0dvc0
>>651
いや、受け側でそう書いても、普通の配列はいけても
arrayは通らないんだわ・・自分の書き方が間違ってるのかもしれんけど
https://wandbox.org/permlink/LBzgUfB6MRtk9P12
2019/07/04(木) 20:05:01.64ID:SRe/Pasd0
使ってるコンパイラのArrayヘッダの実装見てそのメンバ変数名をしらべてそれを指定すれば通る
2019/07/04(木) 20:12:08.06ID:DFmBoT0+d
reinterpret_castならいけたけど未定義かどうかは知らん
2019/07/04(木) 20:40:50.48ID:C9xm0dvc0
別に無理に通そうとしてるわけじゃないんだぜ
arrayの不備のひとつではないかな、ってだけ
2019/07/04(木) 20:53:10.33ID:SRe/Pasd0
暗黙変換定義すれば出来るんだろうけど、出来ない方が自然な気がする
2019/07/04(木) 20:54:01.06ID:GHUD7qNB0
>>636
以下コードがちゃんと動くの今知った。サンクス。
std::unique_ptr<Test[]> test(new Test[5]);
2019/07/04(木) 21:48:13.92ID:WSU/R6xT0
確かに内部配列の参照を取得する手段はあってもいい気がする
先頭のポインタはdata()で取れるけど、配列型そのものへと読み替える手段って標準の範囲にはないんだな
ちょっと意外
2019/07/04(木) 22:18:07.85ID:MlPmA9V9M
えっじゃあdataはどこをさしてんのよ
2019/07/04(木) 22:36:36.22ID:j4C7DC1D0
>>659の言う「配列型」が要素数まで含んだ型のことなら無くて当たり前。
要素数を含まないのなら先頭要素へのポインタと同等。
なにを意外に思ったのかわからん。
2019/07/04(木) 22:41:46.89ID:C9xm0dvc0
>>660
いや、わかりにくかったかもしれんけど
配列の参照にキャスト出来れば配列またはarrayから、静的に要素数が取れるのよ
現状だとそういう時array版と配列の参照版の2つを書かなきゃいけない
ので配列の参照のキャスト演算子も定義しててくれたらなぁ・・
と思ったらポインタへのキャストも無いのね

まぁあくまでSTLフレンドリーな配列ってことなんだろう
2019/07/04(木) 22:51:51.05ID:GHUD7qNB0
ポインタ使うなと言ったそばからイテレータ使ってたら同じだろ、と誰も言わない優しいスレ
2019/07/04(木) 22:52:31.12ID:8zHkL2vVM
バイナリ肥大を屁とも思わず静的解決マンセーのやつに名前つけたいんだけどなんかないかな?
2019/07/04(木) 23:07:27.43ID:OMb74HbU0
イテレータ渡してるならdistanceで取ればええやん
2019/07/04(木) 23:11:39.07ID:+bvr5vAX0
バイナリむしろ減ることも多いしな
バイナリ肥大が許せないなら多少の工夫で何とでもなる
2019/07/04(木) 23:30:20.81ID:kZ6AZY+J0
バイナリ肥大を気にするならそもそもc++じゃなくてc使えや。
2019/07/04(木) 23:32:41.86ID:+bvr5vAX0
c使っても変わらんだろ
無駄に面倒臭くなるだけで
c++のままバイナリ肥大対策した方が楽だし効果も変わらない
2019/07/04(木) 23:34:32.32ID:kZ6AZY+J0
なんだ真性のバカか。
2019/07/04(木) 23:35:07.30ID:gNJuQcZk0
std::vector::resize(size_t n)ならn要素きっかりになるお
および(>>439もご存知のはずの)std::vector::reserve()で10とか20に指定することもできるお
(その通りのメモリ確保が行われるかどうかは最適化に依存し得るが

>>439
そのサンプルコードでは不適切で、最適化が利いている可能性があるお
だってコンパイラが見渡せる範囲で要素のpush_back()をしていないし…
(していたとしても定数回数のループならやっぱ最少サイズになり得る
2019/07/04(木) 23:36:33.90ID:gNJuQcZk0
訂正;
誤:だってコンパイラが見渡せる範囲で要素のpush_back()をしていないし…
正:だってコンパイラが見渡せない範囲で要素のpush_back()をやられる可能性が無いコードやし…
2019/07/04(木) 23:37:50.01ID:OMb74HbU0
お前らそんなにカツカツのターゲットで仕事してるの?
フリースタンディング環境でトースターの制御マイコンとかそういう世界?
2019/07/04(木) 23:42:16.32ID:+bvr5vAX0
マイコンでRAM1キロとかでもc++つかうよ。
ヒープどころかスタックすら殆んど使えず、ループカウンタすらstatic使うような状況でも、高級マクロとしての性能はc++の方が上
オーバーロード使えるだけでもありがたい
2019/07/04(木) 23:44:44.77ID:gNJuQcZk0
しかしポインタは悪という考えには賛成する
全てのオブジェクトはimmutableであるべきだが現実にはそうではない
(オブジェクト指向プログラミングはmutableなオブジェクトを作る仕事だと一般に理解されている
するとポインタや参照の使用はオブジェクトの参照透明性を失わせる究極の悪となる
2019/07/04(木) 23:45:53.18ID:+bvr5vAX0
バイナリ肥大は余り気にしなくていい
ROM容量はRAMとは桁違いに余裕あるし
速度稼ぐためにテーブル作って持っておくとかでもc++だとやり易いw
2019/07/05(金) 00:42:05.40ID:iD2vPqXr0
ポインタは悪いは草
プログラムの性質そのものだろw
良いも悪いもない
2019/07/05(金) 00:50:35.24ID:sXJnPGx/0
>>675
おいおい
今時組み込みでrom実行する環境ほとんどないだろ
だいたい普通肥大化したかどうか比較できん
2つ作ることなんてまずないし
もし容量が足りなくなったら実行コードより他のでかいデータがやり玉になるので目立たない
678デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/05(金) 01:08:22.53ID:V2Gzd6Sr0
参照子を長い時間や広い空間で保持する行為が危険なのはどんな言語でも同じ。
2019/07/05(金) 01:20:04.09ID:RI4o57M10
>>678
全部値コピー(deep copy)ならそうはなんね

>>67
ポップアップトースター…
2019/07/05(金) 01:20:13.88ID:pqoXwmD60
ファームウェアのバージョンアップとかなら容量との戦い出てくるんでないの
2019/07/05(金) 01:20:46.48ID:Gz4SaY1k0
rom実行する業界ですまん
自分とこの環境はrom容量も限られてるけどロジックでの肥大化よりデータの肥大化の方が圧倒的に大きいからそこまで気にならんけど
2019/07/05(金) 01:29:54.68ID:RI4o57M10
すまん全部immutableならと書こうとして手が滑った、
2019/07/05(金) 01:33:18.52ID:RI4o57M10
ポップアップトースターのファームウェア(入力はほとんど時間と温度だけ、出力は動作だけ)で
実行コードより他のでかいデータが生じるケースとは
なんじゃらほい
2019/07/05(金) 01:33:25.26ID:iD2vPqXr0
高級アセンブラの役割があること理解してる奴いないな
2019/07/05(金) 01:48:21.75ID:84H5xbwY0
シンプルなポップアップトースターに電子制御はいらんし
電子制御するような高機能トースターなら音声データくらい入ってるかもしれん
2019/07/05(金) 02:03:59.75ID:iD2vPqXr0
転倒したときに加熱が停止するようにするくらいの制御はいるでしょ
2019/07/05(金) 02:10:23.60ID:RI4o57M10
>音声データ
なおROMに置ける固定データはコードに含めるものとする
>>675も事実上そう言っているのだから後出しではナイ

>>686
それは「出力は動作だけ」に含まれる
転倒したときプログラムがやることは、姿勢判定用センサと温度とタイマーの入力を受けて状態変数を何個か弄りつつヒーターを切るだけなんじゃ…
データの生成というプロセスは無い
2019/07/05(金) 02:11:34.20ID:84H5xbwY0
転倒時の停止なんかに電子制御はいらん
床面に接触するとオンになり、離れたら回路が切断される、というような単純なスイッチだけで十分
2019/07/05(金) 02:12:54.60ID:RI4o57M10
もっとも、状態変数みたいなmutableで邪悪なものを使わずに
全てimmutablueなオブジェクトでスマートに済ませるなら、オブジェクトの生成がデータの生成に該当し、多少RAM容量を消費するが
な、
2019/07/05(金) 02:20:38.54ID:iD2vPqXr0
>>688
なるほど
2019/07/05(金) 07:41:44.43ID:RDJzDNDNM
Rom実行でC++のテンプレートばりばり使ってバイナリ肥大しても問題ない環境ってどんなの?
プロセッサ、OS、メモリのサイズあたりどんなもん?
2019/07/05(金) 08:32:12.48ID:Gz4SaY1k0
OSは無し、CPUは数百Mhz、RAMは数十KB
誤解を招いたかもしれんが環境がこういう感じなんでテンプレートばりばりなんて無理なんだ
693デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/05(金) 10:27:12.65ID:V2Gzd6Sr0
C++はろくに使いもしない巨大モジュールがプログラムのビルド時にリンクされるから実用性ないわな・・・
2019/07/05(金) 11:53:33.73ID:RDJzDNDNM
>>692
そのレベルの組み込みならわかる
C++全面的に使ったりしないよね

謎なのが
>>673
その環境でどうやってC++使い倒してんの?
例外ありなんだよね?
2019/07/05(金) 12:05:00.53ID:vxFjgZssM
またCで十分おじさんか
2019/07/05(金) 12:26:27.03ID:8Dqkh8+pd
もちろん例外なし、RTTIなし、標準コンテナなし、仮想関数無し、new mallocも無し
だよ
templateで組み込みのC関数呼び出しに変換する固定小数点クラス作ったり、peripheralの実アドレスにmapしてメンバ関数で制御可能なラッパー作ったりと、メモリやバイナリ肥大しない様に使うのでも、c++機能は色々使い手が多い
2019/07/05(金) 13:02:54.74ID:yhA0U74XM
いわゆるBetter Cだろ
俺もそう言うのよくやる
2019/07/05(金) 13:20:11.14ID:RDJzDNDNM
>>696
バイナリ肥大気にしないって言った人?
言うこと変わってんじゃんw
2019/07/05(金) 13:31:43.83ID:h+45fasi0

元々バイナリ肥大全く気にしないとかではないだろ
template使うとバイナリが必ず肥大するってのが大嘘なのよ
うまく使えばCよりユーザー側の負担を減らしたまま、バイナリサイズ減る方向に誘導出来る
ifdefのスイッチを型で分岐して自動指定するようなことが出来るからね
2019/07/05(金) 13:36:49.89ID:h+45fasi0
まあRAMが極端に少ない場合は、
大抵バイナリ肥大気にする前にRAMが枯渇してしまう

ROM浪費してまでRAM容量押さえる手段すらとることもあるし。
ループ回さず展開すればループ変数分のスタック消費は押さえられるみたいな奴
2019/07/05(金) 13:38:34.49ID:iD2vPqXr0
そうですか
どうでもいいですね
2019/07/05(金) 14:29:40.45ID:vxFjgZssM
多相アロケータとか組み込みに使えそうで期待してる
2019/07/05(金) 19:29:27.74ID:cg54bwGhM
>>698
どう変わってるの?
ちょっと説明してみ
2019/07/05(金) 22:54:57.76ID:v6DHhGs90
なおc++を使うことで増えるバイナリ肥大化は考慮しなくて良いものとする。
みたいなクソ意見。
2019/07/05(金) 23:06:22.44ID:RqC4v1rZM
PCなら考慮しなくていいしプアな環境ならスタートアップルーチン削りまでする場合もあるし
環境書かなきゃクソも何もないわ
2019/07/05(金) 23:23:06.20ID:RI4o57M10
>>704は、>>675の2行目を認識すべき

例:RX600シリーヅとか、ROMが2GBもあるのにRAMが128KBしかないのがあるし、
2019/07/05(金) 23:35:12.09ID:RI4o57M10
よく見たら2 MBやったorz
まあRAMは多いほうが良い
コードもRAMに置いた方が速いしimmutableなプログラミングもしやすいし、、
2019/07/06(土) 00:24:21.88ID:Cx3pk18b0
ramよりromの方がだいたい安価
電源が不安定でも一定の動作の保証がほしい
OS無いんで電源投入時の処理から自前で実装
そもそもそこまで速度重視しない

組み込みだとこういう環境があるんすよ
技術的には枯れた世界かもしれんが
2019/07/06(土) 02:13:02.83ID:2DlqEmd30
stringからstd::chrono::secondsへ変換するにはどうしたらよいですか??????????
2019/07/06(土) 02:18:48.19ID:QpY/QUgO0
auto sec=std::chrono::seconds(std::stoi(s));
2019/07/06(土) 02:23:42.88ID:2DlqEmd30
atoiだとオーバーフローする場合がありませんか?
2019/07/06(土) 02:42:12.32ID:F4bvg3qDd
タイヤに空気入れると破裂しませんか?
713デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/06(土) 08:21:27.31ID:UHbZjDbS0
ディグダグのROMは何キロバイトですか?
2019/07/06(土) 10:43:54.53ID:YCbxVHxg0
stoullにしなさい
時間はintで扱っちゃあかん
あの日までもう20年切ってるんだ
2019/07/07(日) 00:31:17.33ID:t8N8shlC0
↑誰か曲を付けよう
2019/07/07(日) 00:41:38.39ID:04ONxsyD0
いいかい、学生さん、トンカツをな、トンカツをいつでも食えるくらいになりなよ。
2019/07/07(日) 01:15:25.86ID:t8N8shlC0
>>335の続き。
目的は一応達成できていたものの、偶然に頼りすぎたきらいのある>>333式の解決策の改善を試みたが、
やっぱテンプレートだけでは済まず、関数のオーバーロードも援用しなければ(意図した記述量では)実現できなかった、

・ 関数テンプレートの部分特殊化をやらないと、
  tr_pos<Foo, *>()、tr_pos<Bar, *>()、tr_pos<*, Foo>()、tr_pos<*, Foo>() (*=A, B, C, D, ...)
  の特殊化を総当りで書く必要があり全然省力化にならない
  (A, B, C, ...は1兆個ぐらいあるから、ほとんどコピペとはいえ4兆個のテンプレートの定義を書く必要が出てくる

・ というわけで、クラステンプレートを経由する例のやり方で関数テンプレートの部分特殊化はやった

・ 結局、テンプレートの名前解決規則ではコンパイラが名前を解決できなくなるものとして以下の4ケースが残った。
  tr_pos<Foo, Bar>(), tr_pos<Foo, Foo>(), tr_pos<Bar, Foo>, tr_pos<Bar, Bar>()
  こいつらは関数のオーバーロードで特殊化でおk

・ スフィ姉は未調査

いじょ
2019/07/07(日) 01:22:19.64ID:t8N8shlC0
なおFooやBarにset()やget()のメソッドを追加してA, B, C, ...と共通にtr_pos()できるようにする案はパフォーマンス上の問題で論外なのでもともと却下
(set()やget()の追加は出し入れするデータの型としてintermediateなクラスWの存在を仮定しているが、FooやBarとWとの間の変換は極めて重い処理となる
2019/07/07(日) 09:11:52.62ID:SNWX9Bjla
>>718
Foo->Bar
Bar->Foo
Foo->Foo
Bar->Bar
この四つの操作は共通?
2019/07/07(日) 12:23:18.94ID:t8N8shlC0
>>719
共通ではありません
Foo->Bar、Bar->Fooは互いに他方の逆関数なので別
Foo->Foo、Bar->Barはそれぞれのコピコンを呼ぶように(今週から)しますた、

なお、先週は変換元インスタンスをx、変換先インスタンスをy、intermediateなクラスWをaとして、
 inline void tr_pos(.const (変換元クラス).& x, (変換後クラス)& y) { tr_pos(x, a); tr_pos(a, y); }
とか書いていたので、上記4者は「表記上は」共通操作に見えるコードだったが
今週からはその共通性も無くなり申した、
721デフォルトの名無しさん (アウウィフ)
垢版 |
2019/07/07(日) 12:29:05.93ID:L+nDH+YyF
>>715
https://www.youtube.com/watch?v=W8C5Za4_4j4
2019/07/07(日) 22:04:14.86ID:SWnsKia6a
なんでC++で備えてる通信関係のインターフェースがソケット止まりなの
2019/07/07(日) 22:10:23.25ID:rayzKf1F0
需要がないから
2019/07/07(日) 22:26:16.63ID:2F5duMK20
少なくとも高レイヤのライブラリが標準で提供されることは今のところないな
2019/07/07(日) 22:50:37.10ID:gRf2diQc0
networking-TSで<net>を検討中だよ
C++20にはまだ入らなそうだけど
2019/07/07(日) 23:00:04.50ID:yY7Z+zin0
無数にライブラリがあるじゃん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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