1 名前:デフォルトの名無しさん mailto:sage [2020/07/13(月) 13:51:48.09 ID:WBkWHxcT.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1556142878/
801 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:35:16.14 ID:pCGEFvrX.net] >>772 ごめんそれは知ってるよ。でもそれを知ってる知識レベルの人が >755 のような主張をしてるとは思わなかったんだ。 あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。意味不明なのには同意する。 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
802 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 22:17:32.53 ID:cMMfM4oH.net] >>773 > ごめんそれは知ってるよ。 えっ? 知ってて>>767 ってそれこそ意味不明なんですけどw 結局何を言いたかったの? > あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。 ああマジで日本語の理解力がないのね (もちろん環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない って話ね 念の為に言っておくけど>>764 が言うようなハード上の排他制御は別の話ね > 意味不明なのには同意する。 同意なんていらんから>>767 を書いた意味を説明してよ > 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。 嘘だと言うなら根拠を示したほうが良いと思うよ まあ示せないからグダグダ言うとか関係の無いメモリーオーダーの話とかにそらそうとしてるんだろうけど…
803 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 23:08:12.27 ID:pCGEFvrX.net] >>774 「767を書いた意味」なら>>769 で説明した。 「環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない」これは正しい。 でもそれは生の int でデータ競合を避けられる理由にはならない。 >>755 が嘘だという根拠は >>749 に挙げられた規定による。その条件 "at least one of which is not atomic" について、生の int へのアクセスは "not atomic" に該当するから排他なしのアクセスでは未定義動作となりダメだと言っている。 規格文面の "atomic" は、規格が規定する C++ 抽象機械上の概念という認識。 対して 755 は、規格文面の "atomic" は各処理系でのメモリアクセスが実際にアトミックかどうかに依ると考えてそう。 残念ながら規格の文面で明確にその解釈を否定できないんだけど (https://cplusplus.github.io/LWG/issue2506) 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
804 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 05:14:12.89 ID:oWQENBCT.net] >>775 > 「767を書いた意味」なら>>769 で説明した。 あああのメモリーバリアと排他の区別もついてないアホ丸出しの説明ねw > 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や > 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。 百歩譲ってstd::atomic使えと言うのはいいけど、排他は必須じゃないだろ
805 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 06:52:54.80 ID:DRiXJTFv.net] charはatomicなの?規格にどれがatomicだってあるの? どれがatomicかなんて、CPU毎に違って当然だと思ってたわ
806 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 07:50:32.57 ID:oWQENBCT.net] >>777 CPU毎と言うかシステム毎に違うだろ
807 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 08:52:46.15 ID:JIUDKEB4.net] >>776 うん。データ競合を回避するにあたって std::atomic を使えば排他は必須じゃなくなるよ。 ミューテックスを使うなどの排他(順序付け)でも回避できて、どっちかでもいいし両方でもいい。 >>755 が嘘だという点には異論なくなったみたいだね。よかったよかった。
808 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 09:20:51.24 ID:oWQENBCT.net] >>775 排他は要らんケースがあると言うだけの話 ちなみに>>755 では生intなんて一言も書いてないけどね std::atomic<int>でも多くの環境では > 単純なカウンタみたいなアトミックに読み書きできるような変数になるしな まあ結局規格ガーって言うしかないレベルの低い規格厨が関係のないメモリーバリアーとか出してきて恥を晒しただけだったなw
809 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 10:06:00.17 ID:ux6gJq+a.net] お前ら暇すぎやろ
810 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:50:56.40 ID:VEABT8DF.net] C++ のバイナリ互換性についてお聞きしたいのですが。C++ のライブラリの中に以下のようなものが あったとします。 class A { char *p1; }; class B { /* 略 */ }; class C { A a; B b; }; で、class A に新たな要素を追加して class A { char *p1; char *p2; }; としてからライブラリを再ビルドし、以前のアプリのバイナリと混在させると、class C 内で a のサイズ が変わる結果 b へのオフセットが変わりクラッシュするようです。 そこでふと思ったのですが、class A に最初から class A { char *p1; char *p2; char *p3; char *p4; }; 等と最初からある程度要素を確保しておき、必要に応じ上の方から使っていく、みたいなやり方は アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
811 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:57:58.75 ID:SwFfvD28.net] pimpl使え
812 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 21:01:43.73 ID:y9Kee4rz.net] >>782 素直にC.aやC.bをポインタにすりゃいいだけちゃう?
813 名前:まあ俺が言うのもなんだがw mailto:sage [2021/07/31(土) 22:17:00.01 ID:m7lSxL/B.net] >>782 クラス定義が変わったのにそれを使う一部のコードを再ビルドしないってこと? > そこでふと思ったのですが > (中略) > アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?) ありかも知れんが、なんでそんな前近代的なやり方しないといけないのかを考えたほうがいいと思う
814 名前:デフォルトの名無しさん mailto:sage [2021/08/01(日) 03:13:38.20 ID:/oR3uo3Y.net] C++ポケットリファレンス読んだ方いらっしゃいますか? 独習C++ 詳説 C++ 第2版の次に読もうかと思ってるのですが
815 名前:デフォルトの名無しさん [2021/08/02(月) 10:21:16.05 ID:WSe94FPO.net] 近年の現場と言うか、 大手の製品開発や比較的規模の大きい案件とかで使われてるC++のバージョンってどの辺ですか? 未だにC++03ってわけないですよね?
816 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:29:43.05 ID:WSe94FPO.net] >>786 C++プログラミング言語自体の研究という訳ではないのなら、 入門書以降は何か作る系の書籍のほうが良いのではないでしょうか? 物理シミュレーションだったりゲームだったり 人工知能だったりOSだったり様々あると思うので、 興味のある分野を極めていくのが良いと思います。 作りたいものがあるが何から手を付けて良いか分からないのなら 設計理論系の書籍等も良いと思います。 OOPを極めたいという考えであるならデザインパターン等も良いと思います。
817 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:37:42.71 ID:dQnVwxld.net] どの道、 class C { A* a; }; と、ポインターに変えても、 class A { char *p1; char *p2; }; と、新しいメンバーp2 には、C を再コンパイルしないとアクセスできない
818 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 11:23:37.60 ID:lIzbW3kq.net] class A; class C { A* a; }; だけで完結してるなら まぁ問題をおこしにくそうではあるけど そこまでして C に関わるコンパイルを止めたい理由がわからん
819 名前:デフォルトの名無しさん [2021/08/03(火) 10:56:52.82 ID:Ljn/RAt1.net] >>787 最低でも C++11 それでも古いと思う
820 名前:デフォルトの名無しさん [2021/08/09(月) 22:11:24.65 ID:PKIz3Xw3.net] C++って競プロ以外に何に向いてるの?なんで競プロに使われるの?
821 名前:はちみつ餃子 mailto:sage [2021/08/10(火) 01:15:34.32 ID:7+xjomdk.net] >>792 実行速度が速いことが多いから速度が評価の一部である以上は有利になる。 (速ければ速いほど良いというわけではないが、上限が設定されているのが普通)
822 名前:デフォルトの名無しさん [2021/08/11(水) 12:58:25.34 ID:MU7UJMps.net] std::map<std::pair<const char *, int> > hoge; のように const char * を key とするとき hoge.insert(std::make_pair("A", 41)); hoge.insert(std::make_pair("C", 43)); hoge.insert(std::make_pair("B", 42)); と追加すると hoge["C"] で 43 が得られると期待できますが このとき make_pair したときの "C" と hoge["C"] の "C" のポインタは値が違ってても 同一 key とみなされますか?(ポインタの値ではなく文字の中身の一致を見てくれますか?) あるいは char * だとまた変わりますか?
823 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:12:29.99 ID:Z6PNV5dP.net] ポインターは先頭アドレス 2つのオブジェクトの内容が同じでも、 別々のオブジェクトなら、ポインターも異なる ポインターが同じとは、同一のオブジェクトを指している場合だけ
824 名前:デフォルトの名無しさん [2021/08/11(水) 13:28:06.66 ID:MU7UJMps.net] 追伸 一つの fuga.cpp 内で 二か所以上で "C" が使用されていたとき 同じアドレスにしてくれる機能もあるみたいですが fuga.cpp と hage.cpp みたいに別のソースで それぞれ "C" を使ってたりすると 勝手に同じアドレスにしてくれたりはないみたいで いろいろトラブルのもとになりそうです (どっちみち変数になってると手も足も出ませんし) key は std::string にしておくか あるいは std::hash<> と std::equal_to<> を定義して自分で比較する方が安全な模様
825 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:42:41.83 ID:EWMgwFeS.net] >>796 「あるいは」以降ってunordered_mapの話じゃないかい mapならstd::less<>を定義する……というかデフォルトのstd::less<>が使われないようにユーザ定義比較関数をコンストラクタで渡す 俺もこういう場合はキーにstd::string使うからいいけども
826 名前:デフォルトの名無しさん [2021/08/11(水) 14:06:43.19 ID:MU7UJMps.net] 今回の問題は >一つの fuga.cpp 内で二か所以上で "C" が使用されていたとき同じアドレスにしてくれる機能もあるみたいですが >fuga.cpp と hage.cpp みたいに別のソースでそれぞれ "C" を使ってたりすると勝手に同じアドレスにしてくれたりはないみたいで これでした stringにしたら解決です ほんとうにありがとうございました
827 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:27:08.48 ID:01hIEDa4.net] >>798 別のソースでも同じアドレスにしてくれることあるよ。
828 名前:はちみつ餃子 mailto:sage [2021/08/11(水) 14:56:20.07 ID:QcAq7ivU.net] 言語仕様上は内容が同じ文字列リテラルを統合するかどうかは処理系定義。 https://timsong-cpp.github.io/cppwp/n3337/lex.string#12
829 名前:デフォルトの名無しさん mailto:sage [2021/08/12(木) 23:28:31.22 ID:sg4QisCT.net] >>ってどのように言えばいい? だいなり、だいなり ???
830 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 00:46:25.67 ID:BE9FMbqU.net] >>801 トークンとしての名前は無いと思う。 演算子としての名前なら右シフト演算子とか、 iostream 的な用途の場合は抽出演算子とも言う。
831 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 15:49:32.03 ID:ZZGdeLtF.net] insertion/extraction operatorっていうのか。 stream operatorだと思ってたわ
832 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 16:31:09.36 ID:BE9FMbqU.net] >>802-803 念のために仕様書を見直して見たら抽出子 (extractor) だったわ。
833 名前:デフォルトの名無しさん [2021/08/21(土) 20:09:51.28 ID:7GAoG1Iq.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
834 名前:デフォルトの名無しさん [2021/08/22(日) 10:20:28.75 ID:0Cz6ueFz.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
835 名前:デフォルトの名無しさん [2021/08/22(日) 10:29:54.67 ID:0Cz6ueFz.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 バージョン1.5.1 nim-lang.github.io/Nim/manual_experimental.html 第二プログラミング言語として Rust はオススメしません Nim をやるのです https://wolfbash.hateblo.jp/entry/2017/07/30/193412 Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
836 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 12:34:32.34 ID:m1rLE8Mc.net] 怠け者が一生懸命2回書き込んじゃうのか
837 名前:デフォルトの名無しさん [2021/08/22(日) 13:21:27.56 ID:cx6/dnxW.net] unordered_map で erase(key) を実行した場合 要素のデストラクタは呼ばれるのでしょうか? 必ず自分で呼ばないとだめ? あるいは勝手に呼んでくれるオプションとかある?
838 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:38:27.67 ID:m4vhMo04.net] 呼ばれるよ。そうじゃないと危なすぎるでしょ。
839 名前:デフォルトの名無しさん [2021/08/22(日) 13:51:18.62 ID:cx6/dnxW.net] つまり unordered_map<hoge, fuga *>
840 名前:ンたいなときって fuga *f があるとすると delete f されるっていう認識で OK? [] [ここ壊れてます]
841 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:56:28.38 ID:M38WAZ3o.net] ポインタ型のデストラクタは基本的に何もしない。 デストラクタで破棄したいならunique_ptrなどスマポを使う。
842 名前:ハノン mailto:sage [2021/08/22(日) 15:55:44.42 .net] >>809 つ https://ideone.com/zKMtPs
843 名前:ハノン mailto:sage [2021/08/22(日) 16:00:15.54 .net] >>811 つ https://ideone.com/AIykVF
844 名前:ハノン mailto:sage [2021/08/22(日) 18:24:32.36 .net] >>813 >>809 ユーザー定義のハッシュ関数を std 名前空間に押し込むのはお行儀が悪いよね…‥ https://ideone.com/J5JYnG
845 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 21:31:04.10 ID:YcQtKocs.net] >>815 文字列リテラルを char* にキャストするほうがだいぶん行儀が悪いと思うよ。
846 名前:ハノン mailto:sage [2021/08/22(日) 22:10:22.39 .net] >>816 しかし、MyStr のコンストラクタの引数が std::string とか、もう何やっているのかわからなくなる‥‥
847 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 22:21:02.88 ID:YcQtKocs.net] >>817 ??? const char* で受ければいいだけでしょ? なんでそこで std::string が出てくるの?
848 名前:ハノン mailto:sage [2021/08/22(日) 22:23:59.15 .net] >>818 そういう意味でしたか、const に対する注意力がまだ足りないのは私の課題ですね
849 名前:デフォルトの名無しさん [2021/08/23(月) 11:12:35.74 ID:PZenUrJ/.net] linuxのg++8.3でstd::stringのメンバ関数の insert(const_iterator, char)を使うとコンパイルが通らないのですが、バグでしょうか? -std=gnu++1zつけてます。
850 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 12:30:44.70 ID:gvYYeNdp.net] >>820 具体的に問題を再現するコードとエラーメッセージを書いて。
851 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 14:00:01.42 ID:BEPpIG+d.net] >>819 草生えたw
852 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 09:47:42.50 ID:HAU1OEWW.net] >>821 こんな感じです。 g++のバージョンは8.3で-std=gnu++1z でコンパイルしています。 -- ソースファイル #include <string> int main(int argc, char** argv) { std::string str="abcd"; std::string::const_iterator it = str.cend(); str.insert(it, 'a'); return 0; } -- エラーメッセージ testinsert.cpp: In function ‘int main(int, char**)’: testinsert.cpp:6:21: error: no matching function for call to ‘std::basic_string<char>::insert(std::basic_string<char>::const_iterator&, char)’ str.insert(it, 'a'); ^ In file included from /opt/rh/devtoolset-8/root/usr/include/c++/8/string:52, from testinsert.cpp:1: /opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:4419:7: note: candidate: ‘void std::basic_string<_CharT, _Traits, _Alloc>::insert(std::basic_string<_CharT, _Traits, _Alloc>::iterator, std::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; typename _Alloc::rebind<_CharT>::other::pointer = char*; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(iterator __p, size_type __n, _CharT __c) ^~~~~~
853 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 12:50:48.93 ID:MkJE9y3A.net] >>823 コンパイルできないのはバグだが終端イテレータの扱いについては 変遷があって有効なイテレータと見做されない時期もあった。 最後に文字をくっつけるのであれば push_back か append を使ったほうが無難。
854 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 14:09:58.40 ID:+43Lnt
] [ここ壊れてます]
855 名前:iD.net mailto: >>824 > 終端イテレータの扱いについては > 変遷があって有効なイテレータと見做されない時期もあった。 要出典 [] [ここ壊れてます]
856 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 14:20:52.77 ID:cqt8yWy6.net] >>824 アドバイスありがとうございます。 やっぱり規格的におかしいと思って調べてみたところコンパイラがc++11に対応していないだけでした。 ありがとうございました
857 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 15:38:43.16 ID:9jFaPzYS.net] コンパイラはver.4.8で対応してるよ gnu++1zてのがないんじゃないの?
858 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 17:29:41.65 ID:+rMtuhpY.net] const_iteratorだとダメでiteratorだと通るぽい ↓のコード、手持ちのg++ (GCC) 7.3.1で-std=gnu++1zでコンパイル、実行できたが https://cpprefjp.github.io/reference/string/basic_string/insert.html 「(6) 指定したイテレータが指す要素の前に、文字を挿入する」の s.insert(s.begin(), 'b'); を s.insert(s.cbegin(), 'b'); にするとコンパイルエラーになる
859 名前:デフォルトの名無しさん [2021/08/25(水) 19:02:32.36 ID:s4ke0ECA.net] C++を勉強しているんだけど難しすぎる。 目標は研究に使う数値計算ライブラリを作ることでそのために、 オブジェクト指向とテンプレートプログラミングとSTLを勉強しているんだけど量が多すぎて発狂しそう。 本当にC++を仕事で使っている人はこの量の仕様を覚えて使いこなしてるのか・・・
860 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 19:16:48.44 ID:I0Do+yHA.net] 基本的に自分がよく使う範囲だけ覚えて 必要があればそれ以外の範囲を調べて使う 膨大なようで、所詮言語だから使ってれば覚える
861 名前:デフォルトの名無しさん [2021/08/25(水) 19:55:14.87 ID:s4bO6YKI.net] 生半可に上辺だけ触って判った気になって コード描けますとかいうやつと仕事したくないわ
862 名前:デフォルトの名無しさん [2021/08/25(水) 21:53:18.83 ID:gHVAu5z0.net] >>827 >>828 言葉足らずですみません。 CentOS7のdevtoolのg++はABI互換性の関係から古いlibstdc++としかリンクできないようにされていて つまるところC++11の機能はほとんど使えなくなっている、ということでした。 本来ver8.3ならC++17にも対応しているはずなのにほとんど意味ないわけです…。 だったら-std=c++11とかつけたときに警告してくれとでも思わないわけもないですが。
863 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 23:11:46.20 ID:3/bOIe3o.net] >>829 もしEigenとかみたいなメタプログラミング使った数値計算ライブラリを考えてるならやめとけ 無駄に開発期間が数倍から10倍程度に膨れ上がるだけ とりあえずテンプレートとか使わずに(あるいはメタじゃないレベルにおさえて)普通に書いたら?
864 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 06:13:02.19 ID:H9rsGF96.net] >>829 仕事をすると言っても、他の人がこさえたライブラリを使う場合はそこまでは求められんだろう。 反対に根っこ部分のライブラリとか、チーム内でのルールに関わると知識と経験がいるんじゃないかな? よく理解できている方法でしっかり組み立てられるようになってから、徐々に細かい話に手を出したらいいと思う。 他の方法は解ってるし悪いわけでもないが、記述が気に入らないので延々とtemplate弄り倒す沼もあるから注意してね。
865 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:00:20.61 ID:b62pz5ME.net] 数値計算に使うのならまずはSTL抑えておくだけでいいんじゃね? C++言語自体の習得より、GPGPU、分散処理、SIMD、メモリ管理とかのノウハウ習得にまずは時間を割り当てるほうがよいと思う
866 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:28:17.30 ID:eI1EN0aq.net] 物理の計算とか、いろんな数学的な量が出てくる
867 名前:ッど、そういうのの演算がすべて プログラム上では同じ形で書ければかっこいいなあと思ったり。 例えば、(スカラー)積なら、オペランドが実数、虚数、ベクトル、行列、テンソル....等々どれでも 乗算オペレーターで扱えるとか。 「普通」の数値ライブラリだとオペランド毎に積を扱う関数がうんざりするほどあってそれを適切に 選ばないといけなかったりするので。 [] [ここ壊れてます]
868 名前:デフォルトの名無しさん [2021/08/26(木) 12:08:14.60 ID:p2DPtxMk.net] 829です。 皆さんいろいろとアドバイスありがとうございます。 自分が作ろうと思っているのは、Eigenを用いた金融系の数値計算ライブラリなのですが、テンプレートを用いたらいろいろな型を代入できて便利かな〜くらいの感じで作ろうとしていました。 templateの使い方自体は少し勉強してみましたが、メタプログラミングの概念自体もよくわかっていないので、ひとまずtemplateは後回しにしようかと思います。 オブジェクト指向で書くかどうかは実際にコードを書いてみてから考えてみたいと思います。
869 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 16:35:43.38 ID:9wBQWoih.net] Eigen利用するだけか それならまぁ無駄に時間かかるということも無いと思う(変なとこに拘らなければ
870 名前:デフォルトの名無しさん [2021/08/26(木) 16:43:57.74 ID:WPRv8+9f.net] >>836 コンピューターというか主要な高級プログラミング言語が出来て50年以上経つが だれもそういうことをやってないのは何故だと思う?
871 名前:デフォルトの名無しさん [2021/08/26(木) 16:45:12.60 ID:WPRv8+9f.net] ちなみに SciPy とか SymPy は良く出来てる方
872 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 14:40:33.39 ID:RrJjtAzF.net] >>839 template使ったらもう型にとらわれなくていいんじゃね?はC++学習者の必ず通る道やからしゃーない
873 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 15:05:57.44 ID:nK81wxcE.net] で、結局なんでできないの? C APIのほうが汎用性が高いから? 行列やテンソルは乗算方法が複数あるから? 結果の表現形式も有理数とか複数あるから? 結果をエレベーションする必要があるから?
874 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:44:56.54 ID:LFMqkLz6.net] extern "C" 使ってる?
875 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:53:48.43 ID:nK81wxcE.net] >>843 Cで開発するときに、常にヘッダファイルに書いておく必要があるかどうかって話なら、将来c++から呼び出す可能性があるなら書いておけば? 最悪なくてもインクルードする側でどうにかなる
876 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 19:22:59.35 ID:ghUXxVcH.net] >>843 32bitとはいえマイコンで-std=gnu++17とか指定するのは微妙な背徳感を感じてしまうチキンだが、 Cのライブラリも一緒に使うから、普通に使ってるな。基本ヘッダファイルでほとんど事足りるんだけど、 weak指定のCの割り込みハンドラとか再定義するときは混乱しないように明示的にextern "C"付けてる。
877 名前:デフォルトの名無しさん [2021/08/29(日) 01:50:34.33 ID:TPHdi4yb.net] >>841 operator置き換えまくりとかな
878 名前:デフォルトの名無しさん mailto:sage [2021/08/29(日) 10:17:41.53 ID:sPGAkNt4.net] >>841 設定読み込みの部分でお世話になったわ
879 名前:デフォルトの名無しさん [2021/08/30(月) 14:54:09.69 ID:a7szkEqk.net] C++17は甘え
880 名前:デフォルトの名無しさん mailto:sage [2021/08/30(月) 20:54:03.52 ID:i7moqIxZ.net] 甘えてもいいぜ
881 名前:デフォルトの名無しさん mailto:sage [2021/09/08(水) 21:07:44.76 ID:QZMwNs5W.net] C99で良いです……
882 名前:デフォルトの名無しさん [2021/11/24(水) 18:53:15.36 ID:ONXwk6fD.net] void *q = (void*)p; void *r = reinterpert_cast<void *>(p); void *s = static_cast<void *>(p); どっちが良い?
883 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 22:24:01.60 ID:7YsOMgZx.net] p の型によるんじゃね?
884 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 14:45:18.21 ID:Ts2h3uwp.net] >>838 Eigen の MatrixXtype と Matrix<type, Dynamic, Dynamic> が便利なのは判ったが 自分でそいつらを引数に持つテンプレート関数書こうとして template <typename T, int R, int C> void func(Matrix<T, R, C>&m){ ... } で定義したら a が Matrix3d a; とか RC 固定されてるときは func(a) で問題無いが a が Matrix<type, Dynamic, Dynamic> a(3, 3); だと 実際に func(a) とかで呼ばれるときに Matrix<type, -1, -1> で呼ばれてて Row 数も Column 数も判らないので 結局呼ぶときに func<type, 3, 3>(a) みたいに確定して呼ぶことになるんだが そういうもの?
885 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 19:09:15.51 ID:ZkEvf+9l.net] Eigen使ったことないけど、それ多分動的なサイズ指定だよね コンパイル時にサイズ分かってない奴じゃね
886 名前:デフォルトの名無しさん [2021/11/27(土) 15:14:48.94 ID:dxTMcmeT.net] fstream で open するオプションで ios:in ios:out ios:binary とかと ios_base:in ios_base:out ios_base:binary とかと 何が違うのでしょう?
887 名前:デフォルトの名無しさん mailto:sage [2021/11/29(月) 16:58:44.62 ID:Afxc3rI9.net] おなじ :: だろうけど
888 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:19:18.78 ID:aQJDsz9k.net] 一般的にプリプロセッサのビットシフトに制限てありますか? #define HOGE (1<<27) だとダメで #define HOGE (0x8000000) だとOKだとかありますかね?
889 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:50:06.54 ID:7ju/18KI.net] >>857 プリプロセッサはその define値をその記述通りの文字列(というか文)としか見てなくて、単にその定義名の所へはめ込むだけじゃない? あとは嵌め込まれた後の文脈でコンパイラが解釈するんじゃないかな。
890 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 12:49:27.90 ID:T2nrofKv.net] >>858 そう言われてみればそうですよね トンチンカンな質問失礼しました
891 名前:はちみつ餃子 mailto:sage [2021/12/06(月) 13:31:07.92 ID:Fu08U5Ef.net] >>857 定義での制限はないが、マクロの制御定数式として表れる場合、 つまり #if HOGE > 0 みたいな前処理指令があった場合に全ての符号付整数型が intmax_t 、 全ての符号無し整数型が uintmax_t と同じ表現を持つというルールがあるので 通常の式とは解釈が違う。 (大抵の場合に intmax_t は long long int と同じ大きさだと思う。) つまり普通の式としてならオーバーフローする場合でもプリプロセッサではオーバーフローしないこともあるので、 制限としてはむしろ緩い。 https://wandbox.org/permlink/Ns4Qt2xG3wj1WVBH
892 名前:デフォルトの名無しさん [2021/12/08(水) 17:56:15.71 ID:ouf8qdPn.net] std::listのsortを使ってるのですが 同値だった場合の順序が維持されず困ってます。 何かよい手はないですか? 比較関数を渡してるのですがその中で何とかならないでしょうか?
893 名前:はちみつ餃子 mailto:sage [2021/12/08(水) 18:22:21.80 ID:cTje1973.net] >>861 言語仕様上は std::list::sort は安定ソートなので そうなってないなら標準ライブラリの実装が間違っているか使い方が間違っている。
894 名前:デフォルトの名無しさん mailto:sage [2021/12/08(水) 18:28:56.67 ID:ouf8qdPn.net] >>862 そうなんですね。ありがとうございます。 調べてみます。
895 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 05:48:07.42 ID:4Thv0Igk.net] 純粋仮想関数の通知メソッドの中から他所のアドレスを知りたい時C++だとどう書くのが一般的ですか?
896 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 07:40:39.36 ID:bGgqEdHH.net] 日本語でおけ
897 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:24:10.27 ID:pHnakqcn.net] 私の同僚のプログラマがC++で、あるソフトのプラグインをdll形式で作成しており そのdllファイルは6割くらいの環境では問題なく動作しています。 しかし、ユーザーの環境次第で動かないことがあり dllをインストールした状態でソフトウェアを起動しようとすると、ソフトウェア自体が起動しないというバグを抱えており この問題の解決方法は数か月以上、見つかっていません。 そのdllはWindowsのみで動作するものであり、MacやLinuxには対応していません。 Windowsの何らかの設定に関係するバグなのでしょうか…? バグの原因が一切分からず、彼の作業が進まないので私の作業も進まず、困っています。 私自身はC++でそのソフトのプラグインを作成したこともないですし、彼に何のアドバイスもできないので このスレッドのお力をお借りしたいです。 dllを作成する際にユーザー環境でデバッグしてログを取得する方法など 何でも良いのでアドバイスがあったら教えてください。 エスパーを求めています。
898 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:56:13.12 ID:6fha5luI.net] printfデバッグをファイルに書くとか
899 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 06:41:07.66 ID:9Wj0xfjq.net] 64bitと32bitの違い・・・ではないか それかintel/amdどちらかにしかない命令使ってるとか、何か依存する部分があるとか??
900 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 08:10:32.07 ID:o0cf+I8x.net] まずはエラーメッセージをだな でもランタイムライブラリのオプションがMTじゃなくてMDになってると予想