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/06/28(金) 20:01:01.82ID:j8DkSia+H
>>217
じゃあそこもどう書くべきか分からないです
2019/06/28(金) 20:08:22.32ID:ZUKGdUen0
根本的にはオートマトンで判定する

IP型 192.56.125.0
小数型 1025.62
整数型 100731
分数型 57/1269

+-の記号も含めて状態遷移図を考えてif文のすごい連なりを作る
単純でしょ
2019/06/28(金) 20:12:43.82ID:ZUKGdUen0
9.7/2.01
ピリオドと/を含むこの文字列を分数と見做して小数にしてしまうかどうかも勝手に決めて言い

2.54/-0.07
これは非常に怪しいけど、負の小数に直してもいい、と決めていい

.565
これはどこからどう見ても小数の0.565に見えるから小数である、としてもいい

00.3
ゼロが重なってるけどだいたい小数だろ、ということにしてもいい
2019/06/28(金) 20:30:23.52ID:j8DkSia+H
>>219
トライ木みたいなものを作るべきということですか?
それとも、トライ木など言わずにもっとシンプルに実装できるのでしょうか
2019/06/28(金) 20:38:09.73ID:OXCJu0Q4a
読み込みの時点で処理をするときの型に変換するだけでは?
2019/06/28(金) 20:41:38.84ID:j8DkSia+H
>>222
>>213のコードで言うと、fin >> tmp の部分が「読み込みの時点」ですよね?
どう変えたら良いですか。

ちなみに、
〜 v にしたい処理を書く〜
というところには int なら int、float なら float 向けの工程が書かれるというつもりです
2019/06/28(金) 21:21:06.58ID:DjhzO0vj0
とりあえずvector<string>に収集してから中身がintかdoubleかcomplexかゆっくり解析すればええやん
2019/06/28(金) 21:23:57.66ID:j8DkSia+H
>>224
皆そんなダサいやり方でやっているのですか?
2019/06/28(金) 21:25:54.60ID:WO9nfxiid
字句解析の方法を勉強しないといけないよ。簡単に言えば文字列を一文字一文字解釈する訳。
2019/06/28(金) 21:27:07.49ID:WO9nfxiid
std::atoiとか、std::strtolなどの関数を使えば字句解析は省略できるけど。
2019/06/28(金) 21:27:59.32ID:WO9nfxiid
std::sscanfっつーのもあるね。
2019/06/28(金) 21:29:46.80ID:eXqq+/Cl0
ださいと思うならプログラミング向いてない
2019/06/28(金) 21:36:20.96ID:4VImPalK0
てか面倒だから全部doubleで読むんじゃダメなの?
2019/06/28(金) 21:41:50.76ID:j8DkSia+H
ハァ〜〜〜ダセェ奴しかいねぇなここは
分かった。自分で勉強するわ
ありがとう
2019/06/28(金) 23:21:16.52ID:XG6P9m/X0
N⊆Z⊆Q⊆R⊆C
2019/06/28(金) 23:59:43.49ID:4xkaC8y70
答えでてんのに何が聞きたいんだこいつ
2019/06/29(土) 00:51:14.21ID:JdKIde9pa
>>233
自分が思うカッコイイやり方があるかと期待してたら、誰も期待に応えてくれなかったということだろう。
周囲の人間が「お前のカッコイイは世間からずれてるぞ(むしろバカっぽいぞ)」と教えてやっても、本人は納得しないのだろう。
2019/06/29(土) 01:06:46.73ID:3pgMwDvE0
C++をPythonかなんかと勘違いしてるんだろう
2019/06/29(土) 01:39:33.69ID:wtFmE/I80
>>196
ストラウストラップのは初心者用って聞いてたからスルーしてた。両方ちょっとチェックしてみるわ感謝
2019/06/29(土) 01:58:15.72ID:RmkpebDX0
typescriptだとint|floatみたいな型指定ができるんだっけ
2019/06/29(土) 02:25:19.40ID:WOkj4PNs0
質問です。weak_ptr<T>とintの双方向マップがやりたかったので

boost::bimap<weak_ptr<T>,int> bm;

とやったらweak_ptrはハッシュにできないのでエラーになりました。よく考えると当たり前ですね。
仕方ないのでとりあえずunordered_mapと組み合わせて

boost::bimap<T*,int> bm;
unordered_map<T*, weak_ptr<T>> um;

この2つをセットで用いてるんですが、なんか不格好というか・・・
もしかして変なことしてますかね自分?
2019/06/29(土) 07:07:52.52ID:TGC7pT1Z0
字句解析しても書かれた数が整数型として扱うべきなのか浮動小数点型として扱うべきなのか
書いてあるのが数だけなら、書いた奴の意図まで常にわかるとは限らん

価域だけが問題ならとりあえずdoubleかlong doubleの数値xとして読んでから
std::numeric_limits<T>::lowest()〜std::numeric_limits<T>::max()にxが収まるような最少の型Tを決定せよ、
みたいな
2019/06/29(土) 07:08:51.86ID:TGC7pT1Z0
訂正
 誤: 価域
 正: 値域
2019/06/29(土) 07:20:56.68ID:vBcvr2/W0
>>237
文字列から直接ぶち込むのは無理でしょ
2019/06/29(土) 08:06:13.25ID:8bAr7lLW0
>>231
隙のないクソ野郎コメントだなw
2019/06/29(土) 08:35:15.39ID:z4L1A7GC0
>>239
Tclが演算するときに整数か浮動小数点か勝手に決めるんだよね。
ファイルからデータ読んできて処理させたら所々不自然な値になると思ったら
整数演算になってたりさ。
型変換関数噛ませばいいだけだけどね。
2019/06/29(土) 09:14:29.25ID:1DstyLuX0
むしろ、整数と浮動小数点の両方のパターンで値を持っておいて、後で必要なときにどっちかを使えばいいだけなのでは?
2019/06/29(土) 09:20:12.61ID:xxikbG460
C++でアライメントを指定してクラスをnewしたい
void* operator new[](std::size_t, std::align_val_t)
なる関数が存在するからこれを使う
しかしnew側では一般的にクラスをどのアライメントでnewすればよいのかは知らない
というよりアライメントを指定すべきかどうかも知らない
こういった場合、例えば普通のnewをprivateにしておいて、
その近くにコメントで16でアライメントを使うこととか書くくらいしかできませんかね?
あるいはstatic klass* Generator()みたいな関数を用意すればよいのか
2019/06/29(土) 09:35:17.38ID:TGC7pT1Z0
>>244
値を保持するだけならdouble(使えるならlong double)の一種類で十分
2019/06/29(土) 09:36:35.93ID:TGC7pT1Z0
>>245
『プログラミング言語C』のmalloc()の実装例を嫁

ていうかそれすら読んでいないのカヨ、というレヴェル
2019/06/29(土) 09:56:05.74ID:XuKJ1prL0
>>245
alignasが目的に合うように見えるが使ったことがないから適切かどうか分からん
2019/06/29(土) 09:59:59.32ID:YSWfxQRJ0
>>245
アライメント指定してるのに、
newがアライメントわからないって意味不明
アライメント指定どこいったんだよ
2019/06/29(土) 10:02:29.39ID:xxikbG460
アライメント指定してnewしてほしいクラスがある時
newする側にそれをどうやって伝えるべきか?という問題です
2019/06/29(土) 10:18:23.37ID:YSWfxQRJ0
__attribute__ ((aligned(x)))
2019/06/29(土) 10:20:28.90ID:TGC7pT1Z0
アライメント指定してnewしてほしいクラスTのoperator new()を
オーバーロードしてaligned_malloc()でも呼ぶようにすれば良い
2019/06/29(土) 10:35:52.45ID:vBcvr2/W0
class C {
public:
    __m512i aa;
    void* operator new(std::size_t n) {
        std::cout << "new" << std::endl;
        return ::operator new(n, std::align_val_t(64));
    }
};

こういうことではなく?
2019/06/29(土) 10:37:05.53ID:1DstyLuX0
>>246
でもそれだと、intとdoubleで別々の処理を書かないといけなくなる。
vector<int>とvector<double>を両方作ってtemplate関数で呼び分ければ処理の記述自体は1つにできるでしょ。
2019/06/29(土) 10:45:25.08ID:cHNlfV280
>>246
整数値のビット数が長いとdoubleじゃダメ
2019/06/29(土) 10:55:17.59ID:TGC7pT1Z0
>>255
12 bitぐらいまけてくれYO、
ていうか10バイトのdoubleを使ったらおk
2019/06/29(土) 10:59:12.33ID:TGC7pT1Z0
>>254
どっちかというとunionベースのクラスの出番かとオモテタ
要素型の方でキャスト演算子を定義するなどして整数型解釈と浮動小数点型解釈に両方対応したら、
コンテナを2種類用意する必要はなくなる
キモス
2019/06/29(土) 11:35:29.00ID:sVUKPNaW0
V言語が出来るからC++なんて誰も使わなくなる
2019/06/29(土) 12:00:09.50ID:V+jAPY2V0
>>250
alignas
2019/06/29(土) 12:03:32.81ID:vBcvr2/W0
>>258
今度こそ本当だろうな?
2019/06/29(土) 12:40:30.78ID:LSTTNlMa0
>>258
流行る要素がない
2019/06/29(土) 13:00:13.77ID:N8jtlPKB0
アライメント指定はとっくに言語に組み込まれてるんだけど…
2019/06/29(土) 13:07:40.29ID:HkzJkYF9a
C++ってハウルの動く城みたいな言語だよね
2019/06/29(土) 13:12:22.27ID:xxikbG460
>>252-253
そういうことですハイ
まあひねくれて変なnew使わなければそれで良さそうっすね

>>259
ありがとうございます
2019/06/29(土) 15:10:49.18ID:TGC7pT1Z0
newを呼び出す側がアライメントサイズを過少に設定しても、
コンパイラはnewしようとする構造体に含まれる全メンバのアライメント要請を把握しているはずなので
>>247式に構造体定義を対策しておけば問題無い配置でポインタを返してくれる気もする(そうすべきなのが道理
が(さもないとARMとかで例外で落ちるコードを簡単に量産できてしまう
newの細かい仕様は知らんのでわからん
2019/06/29(土) 15:31:17.71ID:vBcvr2/W0
そんなに迷うことある?
2019/06/29(土) 16:11:26.09ID:N8jtlPKB0
どっちかというとmallocしたメモリよりスタックで確保した場合に問題なることがある
環境やコンパイルオプションにもよるけど
2019/06/29(土) 16:12:26.58ID:oMQgVAVxM
atoiとかで解析する前後でオーバーフローを検出する方法ってあるの?
2019/06/29(土) 16:15:01.31ID:gccJajeoM
長さでもみとけばいいんじゃないの
2019/06/29(土) 16:19:54.13ID:N8jtlPKB0
>>268
ない
0返すだけ
std::stoi
とか使った方がいい
2019/06/29(土) 16:35:00.54ID:/vAOJE6i0
>>263
でも便利なんだな、実は。
2019/06/29(土) 16:43:49.04ID:ggIuLAhq0
vtableの仕様を標準規格化してれば、もっと便利になっていたのにな。
2019/06/29(土) 17:08:11.53ID:/vAOJE6i0
clangやLLVMって、coff 形式の object file は作れないのかな?
2019/06/29(土) 21:36:10.47ID:TGC7pT1Z0
>>271
いろいろやれるからな
テンプレートみたいな難しい仕組みも標準規格としてきちんと仕様化できる連中が
言語仕様の策定を仕切っているというのが大きい
2019/06/29(土) 22:45:38.89ID:zjX1HUko0
>>238
bimapに比較関数の指定をすればよいだろ
https://wandbox.org/permlink/1Zi4FrORsgQ28P9r
2019/06/30(日) 00:04:22.02ID:ft0B/0dK0
>>274
委員会が入ってきてからは汚くなってる気がする。
むしろ、ずっと昔に入った仕様が使いやすい。
2019/06/30(日) 00:15:31.74ID:DqQWlJNh0
C言語が一番使いやすいからな
278デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 00:34:51.63ID:UuQw9kvG0
C++はSTLの既存クラスに、新たなメンバ関数を追加できますか? 継承の新クラス作るのはではなく。
javascriptとかは追加できたとおもいます。
2019/06/30(日) 00:43:41.85ID:DqQWlJNh0
無理だからフリー関数作りましょう
2019/06/30(日) 01:56:53.48ID:exYwiLt20
>>277
テンプレートの代替物がプリプロセッサのマクロになってしまうというのが最悪すぐる、
しかしまあそれ以外は同意
ただしスタックに構造体を詰めないK&Rの頃の奴のは除外それは論外
2019/06/30(日) 03:02:40.95ID:xrN+8YHV0
>>275
ありがとうございます。owner_lessを使えばbimapだけで済むとわかり、こんなふうにしてましたが

boost::bimap<boost::bimaps::set_of<weak_ptr<string>, owner_less<weak_ptr<string>>>, int>

unordered_setを使う方法もあるんですね。
しかしググってみると、参照先が消えたらハッシュ値が変わるから駄目だ、少し遅くてもstd::set<weak_ptr>にしとけって意見もあるようです。

https://stackoverflow.com/questions/13695640/how-to-make-a-c11-stdunordered-set-of-stdweak-ptr

まぁ自分で分かってやるなら好きにすればいい感じですかね
2019/06/30(日) 07:01:13.58ID:V2b2ALnu0
昔C++にお世話になってたんだけどその頃はゲームでよく使われる言語だったんだよね
今でもゲーム開発によく使われてるの?
2019/06/30(日) 07:14:28.67ID:CneIN5yy0
>>282
使われていると思う。アメリカのQuoraによれば、本格的な3Dゲームでは、
C#が使われたことは無く、全てC/C++製らしい。
2019/06/30(日) 08:26:27.75ID:VKcFh0qo0
ゲームエンジン自体はC++だけど、購入したエンジンを使って作る場合にはエンジンによって使う言語は変わる
2019/06/30(日) 08:41:33.25ID:V2b2ALnu0
>>283
>>284
3Dゲームとゲームエンジンで使われてるのね
やはり速度とモダンな機能ではまだC++の代替になる言語は無い感じだよね
そういう意味ではRustが最近がんばってるみたいだが
2019/06/30(日) 10:05:11.67ID:ft0B/0dK0
>>285
Rustは、mozillaが開発したから有名なだけ。
実際には広く使われることは無いらしい。

既存の言語から逸脱しすぎた言語は、よっぽど便利でない限りは普及しないらしいよ。
2019/06/30(日) 10:59:26.27ID:xpepSpla0
新言語上げでよくやられてるC++叩きって、書いてる方の知識が98/03で止まってて
「そんなん最近のC++でも出来るし…」ってなる事が多い印象が強い
もちろん新言語の本当に優れてるところもあるんだろうけど、比較するなら比較元もちゃんと勉強しろと言いたい

あと「C++はこんなに危険!」ってどうしようもないクソコードを藁人形に出してきたりな
お前らの新言語の新機能も間違った理解でクソみたいな使い方したら危険だっての
2019/06/30(日) 11:09:37.42ID:BKgyqS0e0
メタではみんなLISPを作りたがるんだけど、表現方法の違いで文法が狂う。
2019/06/30(日) 11:19:26.11ID:HRz15QoR0
そうはいってもRustは良さげなので
コンパイルがVisual C++クラスに瞬時に終わって
Visual Studioクラスの光速で反応するインテリセンスができたらぜひやりたい
変数がデフォルトでimmutableなのがたいへん痺れる、
2019/06/30(日) 11:23:39.34ID:/mKHwNLn0
確かに今のC++の用途で置き換えられる可能性がありそうなのはRust位だな
2019/06/30(日) 11:27:27.66ID:ft0B/0dK0
でもRustは使いたくない。
2019/06/30(日) 11:30:06.24ID:BKgyqS0e0
Rustは情緒的に言って錆びだからな。蓄積使うんですーって感じの命名なのだろう。
2019/06/30(日) 11:39:32.70ID:iTCTHGA20
RustってC++11以降の機能を勉強して
難しすぎると感じた人がやったらすんなり入れるんだよね
でも普通の言語から移った人は何じゃこれってなる
C++11以降に挫折した人のための言語
2019/06/30(日) 13:14:05.13ID:HRz15QoR0
RustでC++ → Rustトランスレータを書いたら勉強になると思うわ
2019/06/30(日) 13:31:27.33ID:BKgyqS0e0
>>294
間にLLVM挟むと公共の福祉になりえます。
2019/06/30(日) 13:54:46.76ID:HRz15QoR0
>>295
ソースコードのコメントやインデントが保持されないのでは…
あと自分自身が使っていない範囲も含めたC++の全機能のトランスレートに対応しようとしたら日が暮れてしまう
2019/06/30(日) 14:03:37.82ID:aHps5PsQM
>>270
遅レスだけどthx。
面倒そうだけど何とかなりそうね
2019/06/30(日) 14:31:31.86ID:BKgyqS0e0
>>296
貴様、パイソニアンだな。

ずしゃんずしゃん。
2019/06/30(日) 15:34:49.82ID:TD3JD5CyM
みんなC++がここまで残ることになるとは予想してた?
このままだとC++30とか40とか普通に来そう
300デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 16:01:24.12ID:y+UHg1Q80
OSを除けば基礎的なソフトはだいたいC++でしょ
ふつーに重要言語の1つ
2019/06/30(日) 16:06:12.25ID:/mKHwNLn0
C++11以降標準のフットワークが軽くなってありがたい
その代わり要るんかこれ?みたいのもガンガン入ってくるけど
2019/06/30(日) 16:09:27.02ID:9MaqxN1M0
>OSを除けば基礎的なソフトはだいたいC++でしょ
docker, kubeはgolangだが?
2019/06/30(日) 16:09:52.38ID:9MaqxN1M0
ちなみにgitはc
2019/06/30(日) 16:10:56.10ID:Eya2a1WdM
>>303
開発者があいつだからだろ
2019/06/30(日) 16:37:46.54ID:iTCTHGA20
golangが増えてきたね
Cを置き換える感じになりそう
言語仕様もCとPython混ぜたような言語だし
2019/06/30(日) 16:42:10.94ID:9MaqxN1M0
c++が使われるとこってのはゲーム、ブラウザ、windows, MSoffice
とか、GUIでかつ計算資源どっかり使うようなプログラムだわ。
2019/06/30(日) 16:59:55.50ID:HRz15QoR0
確かにVC++はMFCが使えるからGUI向きだな!
308デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 18:33:30.39ID:y+UHg1Q80
clang, llvm, jdk, .net core, chrome,ほとんどのゲームエンジン
この辺C++
他の主要ブラウザも大体C++のはず

dockerはgoで書かれたせいで性能が悪いって言ってる記事を読んだ事がある
309デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 18:34:08.60ID:y+UHg1Q80
goの性能はjavaより悪い
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go.html
310デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 18:40:59.64ID:y+UHg1Q80
要するにC++は「ソースコードが大規模かつ性能がシビアに要求される」場面で使われる。
開発効率はJavaより悪い事が実証されてたはず。
なんかの研究論文もあったし多くの開発者の経験談もある。
だから開発効率を多少悪化させてでも性能を求める場合に使われる。
2019/06/30(日) 18:45:18.35ID:/mKHwNLn0
使える人揃えるの大変なんだよ
Rustの導入談とか見ると、
性能に問題があって他言語導入を検討したがC++は使える人がいないのでRustにしましたとか書いてあるし
2019/06/30(日) 19:27:38.00ID:y5K6zYFc0
マジで?
2019/06/30(日) 19:34:56.51ID:CneIN5yy0
そもそもポインタが理解できる人が、アメリカの大学の理系の学生でもほとんどいないという話がある。
だから、C++が悪い言語というより、C++がある種の数学みたいに難しすぎて理解できない人が多いので
Javaなんかが必要になったらしい。
2019/06/30(日) 19:49:13.48ID:+OB1DaoJa
Rustはポインタ理解でない人が使える言語ではない気がする
2019/06/30(日) 19:56:47.32ID:9MaqxN1M0
ポインタが理解できるとかそういう問題じゃねーわ。
むしろ「〜の概念が理解できる」てだけでドヤって
まともなプログラム書けると思い込むバカが問題なんだわ。
2019/06/30(日) 19:57:51.51ID:DqQWlJNh0
ポインタすら理解できない人にプログラミングは難しすぎないか?
317デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 20:16:06.58ID:y+UHg1Q80
>>313はただのデマだろう
ポインタが理解できないなんてことはありえない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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