C++相談室 part158

■ このスレッドは過去ログ倉庫に格納されています
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
2021/12/02(木) 08:50:46.97ID:boATToTk
>>214
これなら通るんだけど
template <typename T> std::set(T(&)(T,T)) -> std::set<T, T(&)(T,T)>;
int comp(int x, int y) { return x < y; }
std::set s(comp);

compをラムダやテンプレートにするとdeductionに失敗するね
2021/12/02(木) 08:57:10.12ID:l5gglxms
>>213
だからさー、あなたが使うフォントで期待したπが表示されないのはフォントのデザイナの問題であってunicodeの問題じゃない
ちゃんと区別できるようになってるんだから
2021/12/02(木) 10:08:07.72ID:0ZST/pCU
>>214 std::function<bool (T,T)> 使っちゃダメなの?
218デフォルトの名無しさん
垢版 |
2021/12/02(木) 15:14:03.44ID:2R2gcOCs
πの人まだいたんだなω
2021/12/02(木) 16:55:10.70ID:BMPRSKoA
>>216
どうでもいい絵文字よりは、数学記号は考慮してほしかったですよね
というかピクトグラムの意味がわかりません、漢字の方がマシ
2021/12/02(木) 18:05:22.46ID:X/wGilGd
>>219
>>46

Mathematical Italic Small Pi
ttps://www.compart.com/en/unicode/U+1D70B

Mathematical Alphanumeric Symbols
ttps://www.compart.com/en/unicode/block/U+1D400

で、何だっけ?
イタリック(?)のπはない、だったっけ?
2021/12/02(木) 18:17:52.07ID:BMPRSKoA
>>220
せめて
https://meta.wikimedia.org/wiki/Help:Displaying_a_formula/ja
に載っている文字は全部表示してほしいですね… >>220 は全然足りないとおもいますよ
2021/12/02(木) 19:00:15.54ID:xMkISEUv
>>221
https://www.compart.com/en/unicode/search?q=math#blocks
なんか抜けているのあったっけ?

Arrowをmath専用にして欲しいとか?
https://www.compart.com/en/unicode/search?q=arrow#blocks
2021/12/02(木) 20:38:05.02ID:MbA5frdV
>>214
std::set s(std::initializer_list<T>{}, [](T x, T y){return x < y;});
とかどうやろ
2021/12/02(木) 20:50:59.39ID:rnInpLg+
>>215
ありがとう
悲しい
>>217
比較関数って内部でめちゃくちゃ呼ばれるんでパフォーマンスが気になっちゃう
>>223
なるほどTも推論させればいいのか
トリッキーだけど一番思ってたのに近いかも、ありがとう
2021/12/02(木) 23:20:50.87ID:kbM6t4K6
C++20なら、こんな書き方はできる
std::set<T, decltype([](T x, T y) { return x < y; })> s;

https://cpprefjp.github.io/lang/cpp20/default_constructible_and_assignable_stateless_lambdas.html
2021/12/05(日) 09:34:11.45ID:nrpyYaDv
(float) std::sin(3.14);
これの三角関数の左の(float)ってどういう意味ですか??
2021/12/05(日) 09:47:34.80ID:s0V2liBt
キャストでぐぐれ
2021/12/05(日) 11:30:58.25ID:nrpyYaDv
あなるほど
C形式のキャストでdoubleからfloatに変換してるんですね
2021/12/05(日) 12:19:36.79ID:ZXOJuLfE
× C形式
○ キャスト記法
2021/12/05(日) 18:20:14.63ID:jjkrjYLo
C形式のキャストでええやろ
C++ならstatic_castでキャストするべきところ
2021/12/05(日) 18:26:41.52ID:BgqX0HXa
精度がfloatでいいならsinf使え
2021/12/05(日) 19:23:24.64ID:ZXOJuLfE
>>230
いや、そうではなくJIS規格で定められた用語ってこと

・・・まあね、フレンドが随伴とかちょっと・・・なところあるんだけど
2021/12/05(日) 20:16:51.63ID:DeLDBVlq
いまだに用語警察っているんだなw
2021/12/05(日) 20:29:45.29ID:jjkrjYLo
C++11以降にJIS規格は存在しないし, ぶっちゃけ本当に誰もキャスト形式なんて呼んでないし (T) cast-expression とさえ呼ばれない。
C++ Core GuidelinesやgccやclangでもC-style(やold-style)と表現しているのだからそんな古臭い分かりにくい用語を押し付ける必然性がない

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Pro-type-cstylecast
2021/12/05(日) 20:34:58.49ID:CHJdF2OL
用語の間違いで意味の取り違えが起きるような場面ならはっきりさせておくべきだが今回はどうでもいいな。
2021/12/06(月) 07:47:05.01ID:g0v08EwR
>>234
キャスト形式?
何に対する意見を言っているんだ?
2021/12/06(月) 08:09:01.81ID:3cd7zaNc
また下らん揚げ足取り君が来たw
2021/12/06(月) 18:36:58.89ID:g0v08EwR
揚げ足じゃねえよ
話の根幹に拘わることだ

まともに反駁できないなら
黙っているのが得策だぞ
2021/12/06(月) 21:16:52.28ID:dR0HZDjS
訂正の益があったとしても(今回は全くなさそうだが)用語警察は不要
書き込みの意味が文脈から一意であれば問題ない
黙ってろ
2021/12/06(月) 21:23:49.13ID:XPddKxbx
constructorとdestructorを常に生成子・消去子と呼んでる者だけがJIS規格を振り回しなさい
2021/12/06(月) 22:13:15.88ID:Zqmej2qN
オレ用語を高圧的な態度で押しつけてくるやつとは仕事したくねえ
2021/12/07(火) 00:15:41.50ID:35fMaRJu
>>219
今から考えれば NECのPC-8801 のBASIC言語は数学好きに合っていた。
当時のNECの社長は、東大物理の大学院出の人だったらしい。
その人がTOPにいる間はNECのパソコンは日本で一斉を風靡していたが、
その人が降りてからは、嘘の様に勢いがなくなった。
243デフォルトの名無しさん
垢版 |
2021/12/07(火) 13:20:30.29ID:XtC4oDEh
みんなコルーチン使ってる?
2021/12/07(火) 13:44:30.14ID:bN2QwYhk
コルーチンはいろいろ制限が多くてな、最近はfiberの方を使ってる
機種依存APIを使う必要がある、実行効率が若干落ちる、スタック用のメモリを大量消費する、トレースデバッグがやりづらい等のデメリットはあるが、
本物のyieldはやっぱ便利よ
2021/12/07(火) 14:37:49.13ID:RTlriAYU
c+のvectorって無限に要素追加したらどうなりますか?
例えばwhile (1) でemplace_back()し続けた時の挙動です。javaみたいにちゃんとoutofmemoryエラー吐くようにできてますか?
2021/12/07(火) 14:52:13.72ID:N5mK0FmF
「ちゃんとout of memoryエラーを吐く」というのは突き詰めるとものすごく難しい概念なので、どこまでを求めるかによる
Javaにしても本当にどのレベルまで正しくやれてるのかは知らん
まあ「なんかあったらstd::bad_alloc投げて来るやろ」で99%のケースは事足りると思うけど
2021/12/07(火) 14:57:50.91ID:xk7e4Rn1
例えば普通のアプリだと、C++とか関係なく最近のOSのメモリ確保は仮想メモリの確保なので、実際にそのアドレスが使われて初めて物理アドレスが確保され、スワップ領域が足りない場合もそのとき検出される。
2021/12/07(火) 14:57:56.04ID:Z6YBtzSC
mallocに失敗すればbad_allocが投げられるが
実際のところmallocが失敗するときにできることは殆ど無いと認識している
2021/12/07(火) 15:01:16.11ID:i9OSA5UU
>>179
そもそも C++ から Fortran で書かれてるオリジナルの BLAS とか LAPACK を呼ぶこともできるのだから、その辺は別に何でも良い

そんなことよりも多次元配列をどう持つかの方が C++ にとっては難しい課題だ
Cの多次元配列や一次元配列として持つのはユーザ側の負担が大き過ぎる
boost の multi_array は放置されている (move セマンティクスに対応してすらない)
xtensor みたいなサードパーティのものをわざわざ使うのも…… (つーかどれもパッとしない)
早く多次元配列くらい公式で用意してほしい
2021/12/07(火) 15:42:17.22ID:bN4twrqH
多次元といっても中身掛け算の一次元だしな
2021/12/07(火) 16:20:01.36ID:m1NjLpbT
class foo : vector<mystruct>
みたいなクラスを作っているんだけど
クラス内の関数で自身の配列の構造体の関数を呼ぶにはどうしたらいいんだろう?

this[a]->set(0);
と書いてもメンバーがありませんと出て困ってます😭
2021/12/07(火) 16:24:10.42ID:bN4twrqH
(*this)[a]->set(0);
253デフォルトの名無しさん
垢版 |
2021/12/07(火) 16:32:15.84ID:m1NjLpbT
>>252
ありがとう!ちょっと直したけど
(*this)[a].set(0);
でできました、超助かりました!チュッ!
2021/12/07(火) 17:48:46.48ID:D9y2bkeI
そういうときはat()使ってる
2021/12/07(火) 18:03:51.96ID:bN4twrqH
atは範囲チェック分鈍くなるの我慢出来るなら有
あと例外飛ばすからtry〜catch節必須
2021/12/07(火) 20:03:22.82ID:CgArR1cc
>>248
bad_alloc is not out-of-memory!
https://wg21.link/P1401
2021/12/07(火) 21:29:05.30ID:C8BO015l
std::vectorのデストラクタはvirtualじゃないから気を付けてね、念のため
2021/12/07(火) 22:45:19.35ID:eXh2WItM
abort()したら生きている自動オブジェクトは
どうなってし
まいますの?
2021/12/08(水) 00:17:43.36ID:19ueGHR5
#include <iostream>
#include <cstdlib>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
int main() {
s a;
abort();
return 0;
}
https://ideone.com/YDdO5O
https://cpprefjp.github.io/reference/cstdlib/abort.html
2021/12/08(水) 00:51:11.41ID:x9fXkANc
abortより例外飛ばした方が確実だな(VC++6.0を除く
2021/12/08(水) 07:27:41.53ID:HL2646/9
>>258
デストラクタは実行されない
問答無用で強制終了
電源ぶっちするようなもん
2021/12/08(水) 07:58:51.26ID:ZH5V4J5Q
多次元配列 (mdspanだっけ) ってまだSTLに入らんの?
線形代数アルゴリズムはBLAS、LAPACKはじめ外部のライブラリに頼らざるを得ないんだから、最小限の機能だけ備えた取り回しの良いライブラリをさっさと入れちゃえば良いのに

この機械学習全盛の時代に置いてかれるよね
2021/12/08(水) 10:00:58.02ID:19ueGHR5
機械学習全盛なの?
2021/12/08(水) 13:49:53.98ID:juXg17Zg
ああいうライブラリってプラットフォームにべったり依存してるんじゃないの
265デフォルトの名無しさん
垢版 |
2021/12/08(水) 13:51:20.15ID:ADK1Cn8m
GoogleのGPUがオンラインで無料でつかえるぞ
Python言語だが
266デフォルトの名無しさん
垢版 |
2021/12/08(水) 13:56:11.42ID:ADK1Cn8m
C言語とかローカルの言語からGoogleのGPUを操作できれば
ローカルで実行してるのと大差なくできると今おもったが
探せばすでにそういったAPIとかある気はしたが
2021/12/08(水) 14:21:17.05ID:19ueGHR5
スレ違い。
Google Colaboratoryはjupyter notebook使えればいいだけ。
!や%%で大抵のことは出来る。
2021/12/08(水) 16:19:48.22ID:ZH5V4J5Q
>>264
どういうライブラリ?
2021/12/09(木) 00:00:00.18ID:y//gPIop
>>260
例外飛ばしたら今度はCの関数が処理の途中でぶっちされるやん……?
次のような場合:
foo() // C++で記述、例外をスロー

bar() // Cで記述、ループ内とかでfoo()を呼ぶ

baz() // C/C++で書かれた呼び出し元
2021/12/09(木) 01:16:56.11ID:nwscR4Pq
構造体を関数の中で宣言して戻り値に入れたら
呼び出した側が受け取った値はどこかで開放しないといけないですか?
2021/12/09(木) 01:43:46.28ID:9kW8IukA
なんで最近こんな無茶苦茶なの?
>>269
質問は「生きている自動オブジェクト」がどうなるかであり、例外でスコープから抜ければC/C++だろうと破棄される
>>270
「関数の中で宣言」とはどういうこと?
「受け取った値」はどうやって確保されたの?
ちゃんと伝えられないならコードで質問しないと伝わらない
2021/12/09(木) 07:16:10.87ID:Gl3ymjyg
>>270
要らない
構造体はintなんかと同じでコピーされるから
2021/12/09(木) 09:45:40.72ID:nwscR4Pq
>>272 >>271
ありがとう!助かりました

C#でGC慣れしているので
正直この辺はなかなか理解が進まなくて…
ESP32が面白くてC++を始めたんだけど
いざ自分であれこれ作ろうとすると
わからない部分が多すぎて申し訳ない
2021/12/09(木) 10:43:53.70ID:XwSSuf4e
そこらへんのメカニズムはどんな入門書にでも書いてあるはずだよ。
C# の経験があると C++ の入門書では重複する考え方も多くて馬鹿らしく思うかもしれないけど、
似て非なる機能や用語で混乱しないためには基礎から学んだほうがいい。
2021/12/09(木) 11:33:51.67ID:WBF8gVdC
newを知っててもdelete知らなかったりするからな
2021/12/09(木) 11:45:45.22ID:kWV4UehO
そこらじゅうにうんこをばらまいておいて誰かが始末してくれると信じているというわけか
2021/12/09(木) 12:14:01.37ID:WBF8gVdC
やつらメモリーリークという言葉自体知らなかったりするから
2021/12/09(木) 17:58:28.95ID:0JFBEVvg
GC言語でもファイルのcloseはあるから
C++はメモリもあれと同じでnewした物は全部責任持ってdeleteしなきゃならないんだよって教えるんだけど
みんなこの世の終わりみたいな顔する
2021/12/09(木) 18:13:01.83ID:jWh05eno
>>275
w
2021/12/09(木) 20:34:39.79ID:XclkFwFR
おまいら「よう、うんこ掃除屋」
unique_ptr「…」


10年後、人類はAIの反乱で滅亡するのでした
2021/12/09(木) 21:19:33.80ID:JHQQMY8Y
コンピューターの計算だから正しいっ!!
2021/12/09(木) 23:56:02.90ID:y//gPIop
>>271
Cのは
破棄されない
2021/12/09(木) 23:59:22.21ID:9kW8IukA
>>282
Cで書かれてるならデストラクタなどはないのでメモリ解放で破棄
2021/12/09(木) 23:59:43.06ID:y//gPIop
Cの構造体はunwindされずただぶっちされるだけ
コードの実行がぶっちされるのはC/C++共通う
2021/12/10(金) 00:07:01.17ID:4mUmJ7za
自身を適切に開放なり後始末なりするデストラクタを持たないオブジェクトは例外でほぼ等しく致命傷を負う
そういうデストラクタを持っているつもりでも、コードの実行順がぶっちされることにより、
プログラマーの不注意ですぐ致命傷を負う
2021/12/10(金) 00:28:44.05ID:G7csYfUf
cat >sample_cpp.cpp <<EOF
#include <iostream>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
void func1() {
s a;
throw "hoge";
}
extern "C" void func2(void(*)());
int main() {
s a;
try {
func2(func1);
}
catch(const char* m) {
cout << m << endl;
}
return 0;
}
EOF
cat >sample_c.c <<EOF
struct s {
int dummy;
};
void func2(void (*f)()) {
struct s a;
f();
}
EOF
2021/12/10(金) 00:29:59.22ID:G7csYfUf
gcc -g -c sample_c.c
g++ -Wall -g -c sample_cpp.cpp
g++ sample_c.o sample_cpp.o -o sample
./sample

実行結果
called.
hoge
called.

>>284-285
Cにはデストラクタがないので、メモリが開放されればOKであり、自動的に開放される
C++ではスコープから外れればデストラクタが呼ばれた後にメモリが開放される
2021/12/10(金) 01:18:14.66ID:ogq0Brkp
JavaScript でリソースを解放 (GC で回収) するために
変数に false を代入して参照を切っているのを見たことが有って、
GC があってもこの手のバッドノウハウは要るんだなと思いました。 (小並感)
289デフォルトの名無しさん
垢版 |
2021/12/10(金) 01:52:31.83ID:eLt0CNh3
GCが正常に機能しているという保証がそもそもないから
そもそも何が正常な動作なのかを誰も責任とらない架空の権威によって成り立っている
2021/12/10(金) 01:58:44.76ID:ogq0Brkp
メモリ回収のタイミングが保証されないのは大した問題ではない
(プロセスが終了すればどうせ回収されるので)
のだが、外部のリソースを掴んでいるときに後始末されないかもしれないのは困るな。
291デフォルトの名無しさん
垢版 |
2021/12/10(金) 02:33:47.50ID:eLt0CNh3
Windows10でコマンドプロンプトのGUIを提供するconhost.exeはナウくてヤングなC++のstd::basic_string_viewを使っている
Windows2000以来のconhost.exeが古いコードのままメンテ放置されているわけではないことがわかり少しだけほっこりする
以下、それらしきシンボル
TextBuffer::InsertCharacter(class std::basic_string_view<unsigned short,struct std::char_traits<unsigned short> >,class DbcsAttribute,class TextAttribute)


ま、本当はなにをしたかったというとpwsh.exeとconhost.exeが道連れクラッシュして困ってるってだけなんだが
2021/12/10(金) 05:50:56.28ID:iiZD81ri
多人数のプロジェクトほどuniqueではなくshard_ptrが増えるのはトラブった時に誰も責任取らなくていいからって事?
293デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:04:02.57ID:eLt0CNh3
shared_ptrを乱用する職業PGよりもweak_ptrを使いこなせる厨二PGたれ
主従関係がある場合、主が従のシェアポを持ち、従が主のウイポを持て
294デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:11:56.68ID:eLt0CNh3
多くの職業PGは依存関係を親子関係で騙りたがるが、
生物学上、親は子より先に生まれ先に死ぬのだから、FIFOは成り立つがLIFOは成り立たない
ポリコレ的にはマスター/スレーブではなくプライマリ/セカンダリが望ましいとされる
ルー語の乱用をさけるならばプライマリ/セカンダリではなく主/従がなお良い
よって依存関係を主従関係で騙るのが正しい
織豊政権のように、主君の死後に従者が取って代わった例もあるから完全ではないが
295デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:15:52.21ID:eLt0CNh3
秀吉は主君信長のweak_ptrを持っていたので本能寺の変での主君の横死を的確に知ることができた
2021/12/10(金) 07:35:10.03ID:WKa1d5RR
くだらねえ
喩え話なのはみんなわかってんのに
覚えたての日本語ひけらかしてドヤるな
297デフォルトの名無しさん
垢版 |
2021/12/10(金) 08:04:47.84ID:eLt0CNh3
ルー語の乱用を避けるのが礼儀だぞ
298デフォルトの名無しさん
垢版 |
2021/12/10(金) 08:16:32.12ID:Qqc0ky4z
>>290
そうなんだよね
リソース解放のタイミングが保証されないのは言語設計のミスだった
JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
いつfinalizeが呼ばれるのか予測できないことに起因するバグが多発
ついにfinalizeが廃止されることになった

リソースは自前で廃棄してねというスタンス
GCも当初の期待ほどうまくいってない
2021/12/10(金) 09:48:13.03ID:IPFkCC9z
ファイルやソケットの開放はcloseないしデストラクタでやるのだから保証されてるぞ?
保証されないのはメモリリソースだけ

あとjavaも当初からfinalizeが呼ばれることは保証されてなかったからfinalizeで開放しなさいなんていう慣習はなかったと思うが
300デフォルトの名無しさん
垢版 |
2021/12/10(金) 10:14:08.92ID:eLt0CNh3
JavaはJDBC周りのGCの挙動が厄介だYO
GC性善説に立つと痛い目にあう
301デフォルトの名無しさん
垢版 |
2021/12/10(金) 11:20:58.79ID:Qqc0ky4z
>>299
JavaやC#にはデストラクタないからね
C++経験者がJavaやC#ではファイナライザーを使ったりしてたんだよ
C#ではマイクロソフト謹製標準ライブラリでさえファイナライザーでファイルを閉じるクソコードがある
2021/12/10(金) 11:32:06.75ID:G7csYfUf
いつまでスレ違いの話続けんの?間違いの指摘すら面倒
2021/12/10(金) 11:49:22.35ID:/d3oGHTa
C#はファイナライザで解放でいいんだよ
Disposeパターンがそういうスタイルだから
2021/12/10(金) 11:51:44.78ID:IPFkCC9z
>>301
それはその個人が不勉強なだけだろ…
finalizeが呼ばれないことがあるのはあまりに初歩的なチップスで、初級でない一般的なJavaプログラマがfinalizeだけでリソース開放するとかありえない。
思想って誰の思想?

メモリ解放に気を使わないC/C++プログラマがいないのと同じ
305デフォルトの名無しさん
垢版 |
2021/12/10(金) 12:27:48.66ID:Qqc0ky4z
>>304
その不勉強な個人が多すぎたんでしょ
デストラクタの代わりにファイナライザーを使う誤用が多かった
finalize廃止を決断しなければならないほどにね
2021/12/10(金) 12:36:42.08ID:WKa1d5RR
C++の轍を踏まないはずが
ざまあねえな
2021/12/10(金) 12:43:00.40ID:iN+TjAqi
>>ID:Qqc0ky4z
>>298
>JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
>>301
>C#ではマイクロソフト謹製標準ライブラリでさえファイナライザーでファイルを閉じるクソコードがある
>>305
>その不勉強な個人が多すぎたんでしょ
上記発言を見ればあなたが不勉強なのはわかったよ
2021/12/10(金) 16:09:36.14ID:nNdO4jXs
vectorのaが空じゃないと思い込んでて実は空の状態で
for (int i =0; i < a.size()-1; i++)
これやると一瞬でオワるのなんとかならないかな
まあ普通はa.sizeをintやらでキャスりましょーって話だとは思うけど
そもそもsizeの型がuなのが悪いと思うんだが
uじゃなきゃ足りないくらいの要素数確保することなんてあんのか?ぁん?
2021/12/10(金) 16:21:05.76ID:UbGkGPEB
i+1<a.size()
2021/12/10(金) 16:24:59.62ID:4aSHek6G
または、if(!a.empty()) for(...)
2021/12/10(金) 16:26:11.66ID:nNdO4jXs
>>309
てんさいかよ
2021/12/10(金) 16:40:04.25ID:UbGkGPEB
C++20にはstd::ssize()もあるぞ
2021/12/10(金) 16:46:05.19ID:PJTDipJe
i <= a.size()-1じゃなくて i < a.size()-1?
314デフォルトの名無しさん
垢版 |
2021/12/10(金) 16:54:00.86ID:eLt0CNh3
以下のような直感的でベタな条件式のほうがいいと思うよ
for (int i =0; a.size() > 0 && i < a.size()-1; i++)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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