C++相談室 part152at TECH
C++相談室 part152 - 暇つぶし2ch2:デフォルトの名無しさん
20/07/12 13:42:53.37 TX1mpKr6.net
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part151
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
 URLリンク(codepad.org)
 URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
テンプレここまで

3:デフォルトの名無しさん
20/07/12 13:47:57.74 CSJoJ4mx.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

4:デフォルトの名無しさん
20/07/12 14:06:26.23 tkU6cDNN.net
>>3
void君まだ生きてたの?

5:デフォルトの名無しさん
20/07/12 19:59:20 7bgQZ4MZ.net
-Wl,--start-groupって-Wl,--end-groupで閉じなくてもいいの?

6:デフォルトの名無しさん
20/07/12 22:51:08.59 CSJoJ4mx.net
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします!
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします!

7:デフォルトの名無しさん
20/07/13 04:14:20.50 3a05UOb2.net
ある整数nが他の整数の4乗数であることも確かめられない奴らが常駐してるC++スレに何の意味があるのだろうか、、、
素直にsqrtなりpowなり使えば良いのに無意味に二分探索とか言い出す奴まで現れる始末

8:デフォルトの名無しさん
20/07/13 10:33:53 WBkWHxcT.net
#include <stdafx.h> が入ってると消したくなる

9:デフォルトの名無しさん
20/07/13 10:35:47 WBkWHxcT.net
>>7
流れ観てて思ったけど
整数の2乗数じゃないと判った時点で整数の4乗数でないことは明らかで打ち切りっていうレスが無かった気がする

10:デフォルトの名無しさん
20/07/13 12:07:41.92 a0LpYw/5.net
>>8
VS2019だと入らないぞ

11:デフォルトの名無しさん
20/07/13 12:09:59.97 WBkWHxcT.net
それ5ちゃんは2ちゃんじゃない5ちゃんだってのと同じ匂いがする

12:デフォルトの名無しさん
20/07/13 17:47:10 17o/9bhC.net
>>9
前スレッドで
スレリンク(tech板:998番)
は、そのつもりで書いたんだけど、上手く伝わらなかったみたいね。

13:デフォルトの名無しさん
20/07/13 18:28:35.47 fGz9l1yv.net
4乗数は例えばmod5で必ず0か1なので234だったら弾ける
他にもいろんなmod使ってアーリーリジェクトするのが速い
まあそれだけで判定はできないから最後は真面目に確かめるんだけど

14:デフォルトの名無しさん
20/07/13 19:32:08 5XlUrV9a.net
整数の4乗だろ?
どのレンジの値までサポートする必要があるのか
この辺に意識行かないやつは初級者

15:デフォルトの名無しさん
20/07/13 22:49:46.38 vn0aaIQL.net
>>12
知ってた

16:デフォルトの名無しさん
20/07/13 23:35:03 hjMalhfu.net
template <class R>
R hoge(std::function<R(int)> func, int val) {
return func(val);
}

みたいな、std::functionの戻り値の型がテンプレートな関数があったときに、第一引数のfuncに渡す引数を
「std::function<int(int)> f = [](auto a) {return 10 * a; }」
と明示的に「std::function」にすると、Rも型推論が効いて「hoge(f, 10)」と呼べますが
ラムダ式を直接渡すと、Rの型推論が働かず「hoge<int>([](auto a){...}, 10);」と
テンプレートの型を明示しない限り、MSVC2019(std:c++latest)ではコンパイルエラーになります。

こういう場合にラムダ式から型を推論できる関数を作る方法ってないですかね?
ラムダ式がいければ、std::functionは渡せなくなってもいいのですが。

17:デフォルトの名無しさん
20/07/14 00:18:40 zGM7yt58.net
aがintであることはどこから推定するの?

18:デフォルトの名無しさん
20/07/14 01:20:42 BX6Ieja2.net
難しく考えすぎ

template <class F>
auto hoge(F func, int val) { return func(val); }

19:デフォルトの名無しさん
20/07/14 07:41:56.85 XNlphOJb.net
[](auto a) -> int {return 10 * a; }
[](auto a) -> std::common_type_t<int, decltype(a)> {return 10 * a; }

20:デフォルトの名無しさん
20/07/14 19:51:39 XydZfji4.net
>>17-19
ありがとうございます。やりたかったことができました。
ラムダだからって変にstd::functionとか入れずに、関数まるごとテンプレートに委ねればよかったんですね。
どうも関数を特別視してしまっていたようです。

21:デフォルトの名無しさん
20/07/20 23:03:27.73 6gjYUAkG.net
保守

22:デフォルトの名無しさん
20/07/22 21:14:41.10 KUJQPOij.net
std::list<int> l = {0, 1, 2};
auto it = l.begin();
// auto x = move(*it);
l.erase(it);
// この後 x にムーブしてればいいけど it を参照するのは未定義動作?
// pop が削除した要素を返してくれればいいのに

23:デフォルトの名無しさん
20/07/22 21:27:49.98 ZfR2rpjD.net
>>22
まるで正常

24:デフォルトの名無しさん
20/07/22 23:12:53.61 tg3nt/Qu.net
コマンドライン引数でブーリアン渡したいときってどうするん

25:デフォルトの名無しさん
20/07/22 23:46:58.46 xb0kAqoI.net
コマンドライン引数は文字列
boolとかintとか渡せない
「"1000"を1000と解釈してintを渡せる」って言うなら、
同様に"true","false"を解釈すればいい

26:デフォルトの名無しさん
20/07/23 00:41:36 4rdlbzE6.net
getopt

27:デフォルトの名無しさん
20/07/23 06:09:28 fF4wk4d/.net
オプション文字列を渡す作法のような話なら
-f1, -f0 や --flag, --no-flag の形で渡すかな。
簡易的には -f と指定すれば有効、指定しなければ無効、って感じ。

28:デフォルトの名無しさん
20/07/23 08:45:05 SrgI206W.net
結局はORマッパーのような問題に行きつく

29:デフォルトの名無しさん
20/07/25 02:54:53.84 hso1irDO.net
お前らってマゾだよね

30:デフォルトの名無しさん
20/07/27 02:23:48.14 kndJPXCH.net
ある変数に対してプロセスAからは書き込みしかしないで別プロセスBは読み込みしかしない場合
この変数に対してstd::atomic<>する必要ありますか?

31:デフォルトの名無しさん
20/07/27 02:50:40.88 OPuipBq/.net
あります

32:デフォルトの名無しさん
20/07/27 03:16:39.82 iDNWe3mh.net
>>30
プロセスとスレッドの違いは理解している?

33:デフォルトの名無しさん
20/07/27 05:33:26.23 EghVn5lV.net
「プロセス」は「スレッド」と読み替えるとして
自前で排他してもいいし
「ある変数」が例えばintで今のPCのCPUなら元々アトミック
そういう意味では「std::atomic<>する必要」はないよ

34:デフォルトの名無しさん
20/07/27 07:02:13.52 QTF0cexn.net
すstd::atomic<>なら型に応じた特殊化がなされていることが気体できるのでは知らんけど
ていうかTによらずアクセスの度に馬鹿正直にcritical sectionに出入りされる実装だったら嫌すぐる、、、
アーキテクチャーに応じて確実に作動するDouble-Checked LockingとかTripple-Checked Lockingとかになって
最適なパフォーマンスが出るコードにしていただける処理系であってホスイ

35:デフォルトの名無しさん
20/07/27 07:31:29.47 9eU73XOZ.net
>>30
別途排他制御をしていないなら、コンパイル時や実行時に勝手に実行順序並び替えて誤動作する可能性があるから、atomicにしておいたほうがええよ

36:デフォルトの名無しさん
20/07/27 08:17:24.84 7+Lkkq8+.net
読み込む側が壊れた値でも構わないなら要らない

37:デフォルトの名無しさん
20/07/27 08:47:53.90 eo3eOCcP.net
>>36 未定義動作の結果はそれだけでは済まないかもしれない。

38:デフォルトの名無しさん
20/07/27 11:14:28.62 vNtx9fDh.net
DRAMがリフレッシュされなくなるとかか

39:デフォルトの名無しさん
20/07/27 11:45:04.43 HTI8upPJ.net
プロセスならOS提供の共有メモリ使うから、未定義動作の範疇外じゃね

40:デフォルトの名無しさん
20/07/27 12:06:22.37 arCdAL0/.net
>>30
結論は必要がある(もちろん環境依存しないのが前提として)
>>33は間違い
たとえCPUがload/storeのatomic性を保証していたとしても
コンパイラが代入を1 instructionにする保証がない
なのでLinux kernelでは(C言語だけど)WRITE_ONCEみたいな一見意味不明なマクロが用意されていたりする
マルチプロセスでlock-freeを自作するのは勉強になるけど、たぶんミスるから
製品とかでは使わないのをお勧めする

41:デフォルトの名無しさん
20/07/27 20:51:46.94 EghVn5lV.net
>>40
CPUがstoreのatomic性を保証しているのに
コンパイラが代入を2 instructionにできるの??
俺には意味不明だ

42:デフォルトの名無しさん
20/07/27 22:29:41 SfaUTK+M.net
>>41
できるできないならできるだろ
例えば32bit整数を16bit毎に書き込むようにすればいいだけだし
そんな意味のないことをするコンパイラがあるかどうかは知らんけど

43:デフォルトの名無しさん
20/07/27 23:14:45 OPuipBq/.net
コンパイラが独自仕様で明示的に保証してるなら別にいいよ
特に何も書いてないなら保証されてないと思うべき

44:デフォルトの名無しさん
20/07/27 23:30:43.14 arCdAL0/.net
>>42
x86だと即値の場合16bit x2のコードが吐かれる場合があるらしいよ

45:デフォルトの名無しさん
20/07/28 15:19:44.89 XpAjM/1U.net
URLリンク(ja.wikipedia.org)
URLリンク(ja.wikipedia.org)

46:デフォルトの名無しさん
20/07/28 15:58:37 2ZofU2zv.net
forで少しの(255以下)ループ回すときにint i=0;i<10;++iとかするけどなんで
2バイトのintでとって1バイトのunsigned charじゃあまり取らないんだろ?
(typedefで宣言すればタイプ数少なくできるし・・・)

47:デフォルトの名無しさん
20/07/28 16:02:12 0Pr5T/O4.net
unsigned char でループしても良いけど
結局 int にされるでしょ
それより int が 2byte っていつの話よ

48:デフォルトの名無しさん
20/07/28 16:05:58 2ZofU2zv.net
>>47
すいません
>結局 int にされるでしょ
ってとこ解説お願いします

マイコンでc使うときにメモリ節約しようと思って
そもそも組み込み系のスレで質問しろって話ですが・・・

49:デフォルトの名無しさん
20/07/28 16:12:26 JnUAmZD/.net
>>48
charは算術式の中ではintに拡張されるって話だ
char a, b;
printf("%u", sizeof(a)); //1, これは左辺値で算術式ではない
printf("%u", sizeof(a - b)); //2, 減算の算術式
printf("%u", sizeof(+a)); //2, 単項プラスの算術式

50:デフォルトの名無しさん
20/07/28 16:16:35.96 2ZofU2zv.net
>>49
なるほど
ちなみにこれで最後の質問ですが
forループは自分が間違えてましたしint使ったほうがいいと理解しました
それでビット演算でのみ使う場合においては
intにされることはないという認識でいいでしょうか?
(ビット演算で使いたいと思って調べてたらふと>>46みたいな疑問が湧いたので)

51:デフォルトの名無しさん
20/07/28 16:18:26.72 JnUAmZD/.net
>>46
charの拡張はcpu内部のレジスタで行われるだけで
メモリにはその痕跡が残らない
だからintをunsigned charにすればメモリを節約する効果は
期待できる(ただし保証はされない)
俺も実はforの制御変数は[0, 256)の範囲内でもintを使うが
正直に本音を言うと長い長いtypedef unsigned charをタイプせずに
短くintで済むからだ
普段建前ではintは自然なサイズの整数だからとか言い訳してるけどね

52:デフォルトの名無しさん
20/07/28 16:20:24.69 2ZofU2zv.net
>>51
なるほど
丁寧に解説してもらい助かりました
スッキリしました、ありがとうございます
あとメモリの節約には効果ありそうなのは目論見通りなのでよかったです

53:デフォルトの名無しさん
20/07/28 16:23:12.92 tckSAZy5.net
>>52
URLリンク(ideone.com)

54:デフォルトの名無しさん
20/07/28 16:23:36.08 JnUAmZD/.net
>>50
されるよ
たとえば、こういう場合
char c = 0;
c = c | 1;
部分式 c | 1 は ((int)c) | 1 で計算され結果はint
c = (char)結果; という具合にcharに戻して書き込む
c は00000000
c | 1 は0000000000000001
=は00000001にしてからを書き込む
一旦intにされたものをcharに戻して書き込んでいるが
普段はこのことを忘れていても正しいコードが書けてしまう

55:デフォルトの名無しさん
20/07/28 16:27:57.80 JnUAmZD/.net
おっと、ここC++スレやん
Cスレのつもりだったw
C++の場合はここ気をつけて
void func(char); //#1
void func(int); //#2
char c = 0;
func(c | 1); //#2

56:デフォルトの名無しさん
20/07/28 16:28:23.54 2ZofU2zv.net
>>53
>>54
ありがとうございます
されるんですね・・・
う〜ん、やっぱ大人しくint使います(メモリ切り詰めるほどでないなら)

57:デフォルトの名無しさん
20/07/28 16:29:57.66 2ZofU2zv.net
>>55
丁寧にどうもです
いや、自分が悪いっす
そもそもここで聞くなよという話なので
(ここが一番はやく回答してくれるので申し訳無さ半分で質問してます・・・)

58:デフォルトの名無しさん
20/07/28 16:36:03.22 Vr5x1U6Z.net
>>51-52
「メモリを節約する効果は期待できる(ただし保証はされない)」っていうより
「メモリを節約する効果は期待できない(ただし可能性はゼロではない)」でしょ。
ほんとうにメモリ節約のためにやるなら実測のうえ結果をコメントで添えてたのむ。

59:デフォルトの名無しさん
20/07/28 16:41:14.06 JnUAmZD/.net
>>58
sizeof(int) == 2な環境を使ってる質問者だぜ?
おまえさんターゲットをエスパーできるのか?
できたとして同じコンパイラ持ってるか?

60:デフォルトの名無しさん
20/07/28 16:43:35.65 XpAjM/1U.net
(ただし可能性はゼロではない)

61:デフォルトの名無しさん
20/07/28 16:51:19.06 FdPQCZeu.net
>>56
char使ってメモリ節約ってのは基本的にクラス・構造体のメンバとか配列、かつそれらが多用される場合ね
単発の一時変数をcharにしたところでそれがスタックに置かれたとしてもアライメントで何も節約できてないどころか
整数拡張のオーバヘッドで逆に非効率になる
引数にchar使うのも性能上は意味がない
組み込みマイコンなら特に逆アセは読めるようになった方がいいよ

62:デフォルトの名無しさん
20/07/28 17:03:52 2ZofU2zv.net
ちょっと追加で調べて納得したのはcharを扱うメリットとしては
int ポインタ型に +1 した際、何バイト進むのかは処理系に依存するけど
char ポインタ型なら必ず1バイトだけ進むから
その場合においてメリットがあるからchar使えってことですかね?

63:デフォルトの名無しさん
20/07/28 17:08:44.62 XpAjM/1U.net
>>62
それ最初の質問と何か関係あるか?

64:デフォルトの名無しさん
20/07/28 17:15:03.80 JnUAmZD/.net
>>61
別に逆汗しなくても汗吐かせればええやん
けっこう懇切丁寧にコメント入れてくれたりするぞ

65:デフォルトの名無しさん
20/07/29 00:51:49 YVVFldw+.net
デバッガでトレースしながら読むから逆アセだな
アセンブラ吐かせるってそれ用にビルド設定用意するのか?

66:デフォルトの名無しさん
20/07/29 04:47:56.76 8sSsdFab.net
泥縄で設定変えるのイヤだから
端っからアセンブラ経由にしてる

67:デフォルトの名無しさん
20/07/30 06:46:58 82YOHtIh.net
C++でUnicodeを扱いたいんですがライブラリを探したほうが良いですか?
なにか定番のライブラリありませんか?

68:デフォルトの名無しさん
20/07/30 07:59:44 h+N/x6i+.net
ICU一択でしょ

69:デフォルトの名無しさん
20/07/30 21:53:30 82YOHtIh.net
>>68
返信遅くなってすみません
ICU把握しました、ありがとうございます

70:デフォルトの名無しさん
20/07/31 10:43:54.52 N0eufbNj.net
逼迫中

71:デフォルトの名無しさん
20/07/31 13:57:05.58 RNPOl6hd.net
学術の巨大掲示板群 - アルファ・ラボ URLリンク(x0000.net)<)
☆ malloc / free を実装してみた (C#)
URLリンク(up.x0000.net)

72:デフォルトの名無しさん
20/08/08 00:45:58.56 0OMeneB5.net
保守

73:デフォルトの名無しさん
20/08/10 15:43:27 fh5hS3eV.net
UDPで、メッセージをブロードキャストすると該当するコンピューターがユニキャストで応答するんですが、
このとき、シングルスレッドで、ブロッキングでsendでブロードキャストしてすぐにrecvで受信待ちするのは素敵ではないですよね?

74:デフォルトの名無しさん
20/08/10 15:45:49.73 fh5hS3eV.net
UDP でもともとreliableでないですがsendとrecvの間にネットワークスタックが受信したりすると、recvで受信できない?

75:デフォルトの名無しさん
20/08/10 15:48:15.44 fh5hS3eV.net
UDPはじめてなんですが、受信を先に立ち上げてから、sendすべきでしょうか?

76:デフォルトの名無しさん
20/08/10 16:28:51 bhDIRnmP.net
UDPスレで聞け

77:デフォルトの名無しさん
20/08/10 18:44:21.00 94dKV070.net
一文で「で」使いすぎ

78:デフォルトの名無しさん
20/08/10 21:36:29 DdNEnUy+.net
○○で××で△△な□□ってオタクが好む文語でしょww

79:デフォルトの名無しさん
20/08/10 22:39:58 miZfIOtK.net
それオタクていうか、ラノベ勢やん

80:デフォルトの名無しさん
20/08/12 21:03:47 CtzJaQ9q.net
std::unordered_mapのキーをstd::stringにして
findで検索する時にstd::string_viewを使って検索したいんだけど、
error C2664 : 'std::string_view' から 'const _Kty &' へ変換できません。
と出てしまいます。

std::unordered_mapの場合ではどうすればいいでしょうか?(´・ω・`)
以下仮コード
std::unordered_map<std::string, int> a;
a.insert_or_assign("AAA", 10);
std::string_view b = "AAA";
std::unordered_map<std::string, int>::iterator it = a.find(b);

81:デフォルトの名無しさん
20/08/12 21:20:56.14 3e1Z4brU.net
>>80 a.find(std::string(b));

82:デフォルトの名無しさん
20/08/12 21:37:06 CtzJaQ9q.net
>>81
あ・・・・・・(´・ω・`)
できました。ありがとうございます。

ついでに聞きたいのですが、
std::stringに変換することなくfind関数を使用するにはどうすればいいんでしょうか?
std::mapであれば、std::less<>を用いることでfind関数を使用した時std::string_viewでも検索できるようになりますが、
std::unordered_mapの場合はどのようにすればいいんでしょうか?

83:デフォルトの名無しさん
20/08/12 21:43:02 3e1Z4brU.net
>>82
URLリンク(wg21.link)
URLリンク(cpprefjp.github.io)
> 順序付き連想コンテナと同様に、非順序連想コンテナの検索処理で、一時オブジェクトが生成されるコストを抑える拡張を追加。...

84:デフォルトの名無しさん
20/08/12 21:49:15 CtzJaQ9q.net
>>83
これは・・・・・・
C++20から使えるかも?ってことですかね?(´・ω・`)

85:デフォルトの名無しさん
20/08/13 10:37:08.60 m1xh97jB.net
std::unordered_map<const std::string, int> a;

86:デフォルトの名無しさん
20/08/13 11:17:58 hnCcHlo3.net
C++2a
URLリンク(cppinsights.io)

URLリンク(arnemertz.github.io)
URLリンク(riptutorial.com)

URLリンク(wandbox.org)
URLリンク(coliru.stacked-crooked.com)

87:デフォルトの名無しさん
20/08/16 03:35:19.99 Qk/OMLZN.net
今年学生でコロナ下でオンラインばかりなので合間を縫って独学に勤しんでます。
優しいc++を読み終えました
現在atcoderのabcやオライリーから出てるmodern c++ チャレンジ等をやっていますが、何をもってプログラミングが出来ると言うのでしょうか?
テトリス等もサイトを参考に書いたりしてみました。
自分はlinux上で動作する音楽プレイヤーソフトを作成したいと思うのですが、文法等はある程度理解していてもいざ自分で一から作れと言われると出来ません。c/c++で書かれているgithubのソースコード等は読めるんです
読めると言うのは、知らない文法やライブラリ等検索出来るためなんとなく実装内容がわかるって意味です
しかし自分で一からとなると何から始めればいいのか…

皆さんはこの壁をどう超えましたか?それとも壁に出会いませんでしたか?もしそれなりの規模の開発をする際止まった経験があるならばアドバイスを欲しいです
長文すみません

88:デフォルトの名無しさん
20/08/16 03:47:01 Degs0Zl8.net
初心者は、Ruby on Rails で、web アプリのポートフォリオを作る

むしろ、コーディング・テストよりも、
アプリの設計・構築運用など、Linux の勉強の方が多い

文法・コーディングだけだと、ちょっとしたコマンドぐらいしか作れない

Rails みたいなフレームワークを使わないと、
データベースを含んだ、webアプリなどは作れない

89:デフォルトの名無しさん
20/08/16 05:51:14.48 1OSQgfCu.net
>>87
linuxの統合開発環境がどんなのか知らんけど、とりあえず空のプロジェクトから作るのは出来るんでしょ?
そっから必要なものを一つずつ実装してくだけだよ
千里の道もうんたらで

90:デフォルトの名無しさん
20/08/16 06:33:25.81 wVZFHsSL.net
>>87
> 何をもってプログラミングが出来ると言うのでしょうか?
何かを作るぞ! と頑張って、目標を達成できること
「何か」はゲームでもいいしドローンの自動運転でもいいから
自分の好みで勝手に決めればいい
87は音楽プレイヤーだろ?
いきなり市販のプレイヤーに匹敵しなくてもいい
こんなことできないかな~とアイディア先行で実験してみて
うまくいったら見栄えも気にして仕上げにかかる
てなことを小刻みに繰り返すとアジャイルっぽくなる

91:デフォルトの名無しさん
20/08/16 07:20:43.69 5tP8nVqa.net
第二不完全性定理の制約を受けず、
停止性問題を解けること、
って無理ゲーじゃん?!?
なんで人間ってプログラミングできるの?!!?!

92:デフォルトの名無しさん
20/08/16 09:23:07.48 ng3yYkoc.net
ユニバーサル文法があるから
その辺りは余り深く考えても意味が無い
出来るから出来る
出来ない奴は出来ない

93:デフォルトの名無しさん
20/08/16 10:39:09.01 5tP8nVqa.net
ユニバーサル文法を操るメンタルオーガンが実在したとしても
そいつがたんなる機械なら解決にならないんじゃ…

94:デフォルトの名無しさん
20/08/16 12:13:35 INgchOov.net
>>87
まず作りたいものの機能をもった最も簡単なプログラム作ったら?
例えば音楽プレーヤーがお題なら音声ファイル名を与えると再生するだけのコマンド
あとは機能を付け足してく

95:デフォルトの名無しさん
20/08/16 14:54:00.65 43uVw8aV.net
>>87
強いて言えば
「バグ取りを自分で出来ること」

96:デフォルトの名無しさん
20/08/16 15:36:41.55 1Qmt1HH2.net
>>87
アプリ作り上げるのに言語の詳しい知識って実はあんまり要らないんだよね
c++だとtemplateにはまって一日つぶすとかざらにあるんだけど、
これってただの自己満だよな~って思う
愚直なコードでとりあえず解決しておいて、その分
アプリとして作り込むのに時間かけた方がよかったんだろなーと
まぁそれはさておき、音楽プレーヤなら
- GUIフレームワーク
- CODECライブラリ
- linuxシステムコール、libc
あたりの知識がないと進められないでしょう
GUIフレームのお作法の理解とか、
CODECもフォーマット特有の制約が上位まで波及したりするから結構知識いるよね
まず何を使うかの選定からでしょう
あと、たぶんお前さんの作りたいものは既に世の中にごまんとあるはず
それを承知で勉強と割り切って作るのはいいんだけど、
あんまり大きいものは最初の目標にしないように
すぐに情熱失ってやめてしまうのがオチ

97:デフォルトの名無しさん
20/08/16 16:32:23 Qk/OMLZN.net
87のものです 皆さん有難うございます
再生させる機能やタグの取得等の割りかし簡単そうなものから実装していき
あわよくばイコライザーやスペクトラム等の機能も追加していこうと思います

あと、linuxだとuiや機能が優れた音楽プレイヤーって実は少ないんですよね…GitHub等でも探したのですが…foobar2000とかしかなくて正直ダサくて…
ないから自分で勉強がてら書いてみたいなと思った次第でした

98:デフォルトの名無しさん
20/08/16 17:31:00 PN3bHl0Q.net
>>87
〉何をもってプログラミングが出来ると言うのでしょうか?

他の人も似たようなこと言ってるけど、「ソフトを完成させる段取りを知っていること」が一つの目安。
実現機能を明確化して、実装する機能に分解して、必要なリソース・ライブラリを集めて、全部の機能を実装して、誤動作しないようにバグ取りをする。
これができれば言えるんじゃない?

少なくとも「プログラムするためには何が必要か」がわかるようになる。

99:デフォルトの名無しさん
20/08/16 18:12:46 8WlfPd5U.net
C++のGUIライブラリとして、こういうものがあるけどね。
お気に召すかわからんけど。

URLリンク(ja.uncyclopedia.info)

100:デフォルトの名無しさん
20/08/16 18:35:06 wVZFHsSL.net
>>96
ダウト
「こうしたい」と、せっかく閃いたアイディアを
表現力が足りないばかりに諦めたり
誰かさんみたいにtemplateがロクに使えなくて一日つぶすとかってのは
言語の詳しい知識が足りないことに他ならない
それを何やかんやと言い訳考えることこそ自己満以外の何物でもない
言語の基本をしっかり固めるのを軽視するとこうなるという典型だ

101:デフォルトの名無しさん
20/08/16 19:20:29.73 x8ZjthFZ.net
progress_displayいつになったら規格に取り込まれるんだ

102:デフォルトの名無しさん
20/08/17 02:08:49.38 u6ES7f8s.net
>誰かさんみたいにtemplateがロクに使えなくて一日つぶす
そんなこと一言も言ってなかったと思うが(俺96じゃないよ)
いつものアホが沸いたのかな?

103:デフォルトの名無しさん
20/08/17 02:55:30.59 vOFQCRbE.net
というか他人が思ったことに対してダウト~っていうセンスに痺れるわ

104:デフォルトの名無しさん
20/08/17 05:56:47.89 TQifZMS/.net
>>102
strcmp的なやつとは話にならねえ

105:デフォルトの名無しさん
20/08/17 07:50:57.12 p3n8cAbg.net
strcmp的なやつって笑える表現だな
a="templateにはまって一日つぶす";
b="templateがロクに使えなくて一日つぶす";
ここでstrcmp(a,b)が偽になる以上どういう意図のなのか説明が必要だろ
>言語の基本をしっかり固める
とはまったく逆の事をしてることに気づけ

106:デフォルトの名無しさん
20/08/17 08:11:11 TQifZMS/.net
へーえ、おまえさんとこではstrcmp(a, b)がint(0)を返すのか
ユーザーがあまりにも馬鹿過ぎると標準ライブラリまでバグるとは知らんかったわ

107:デフォルトの名無しさん
20/08/17 16:39:05 p3n8cAbg.net
strcmpてのは三値を返すんだから0が真で非0が偽

108:
20/08/17 19:38:46.36 fdEh9bfN.net
>>107
普通は零が偽、非零であればなんでも真、なんですけど

109:デフォルトの名無しさん
20/08/17 19:41:49.25 aDjhg6Zt.net
>>107
無茶苦茶言わないで、そこは「strcmp(a,b)==0が偽」の書き間違いだと認めるぐらいしようぜ。

110:デフォルトの名無しさん
20/08/17 19:49:37.18 I0An2PUB.net
揚げ足とりこそC++erの本懐よ

111:はちみつ餃子
20/08/17 20:13:14.96 Km1hLS23.net
strcmp を定義するのは言語仕様なんやから
あえて言語仕様と異なる用語を使うんなら
その適用範囲 (プロジェクト単位?) と共に定義を明文化するのは最低限の要求やろ。
当事者が合意した範囲内でなら一見して変な用語でも使うのは好きにすりゃええ。
たとえばハードウェアに近い部分なら負論理がソースコード上に露骨に現れることだって無いとは言いきれん。
ただそれは特殊な例を総合的に見てあえて奇妙な用語を使った方が良くなる場合にとる選択肢であって、
「三値を返すんだから」というようわからん理屈では正当化でけへんし、
言語のスレとしては許容でけへんわ。

112:デフォルトの名無しさん
20/08/17 20:18:38 vrG6zXoN.net
急にバリバリの関西弁でどないしたんや

113:デフォルトの名無しさん
20/08/17 20:25:51 ltcLkjuo.net
個人的には整数のサイズにこだわるときは
#include <cstdint>
してint8_tとか使ってるなぁ

114:デフォルトの名無しさん
20/08/17 21:37:15.36 S/xJ/Voo.net
そもそも3値な時点でbooleanの真偽かどうか議論すること自体無意味

115:デフォルトの名無しさん
20/08/17 22:07:28.50 cXN7EgSQ.net
真偽値じゃないものを真偽値扱いしてもエラーとして検出されない、根が深い問題なんだよな。
型が無いB言語に末代まで祟られているとも。

116:はちみつ餃子 ◆8X2XSCHEME
20/08/17 23:56:15 Km1hLS23.net
整数の暗黙の型変換はそれなりに上手くいってると思うけど
bool が整数型扱いってのがいきすぎた一般化だったのかもな。

117:デフォルトの名無しさん
20/08/18 00:15:03 6UORXKST.net
学術の巨大掲示板群 - アルファ・ラボ URLリンク(x0000.net)<)

118:デフォルトの名無しさん
20/08/19 03:53:13 itvjYGVQ.net
45歳こどおじ高卒無職歴約10年
10年以上前にIT系業界にいたが主にPC保守やユーザサポートをトータルしても10年くらい
コード開発の実務は30代の頃VB約3ヶ月でばっくれ
30代の頃エクセルVBA約3ヶ月でばっくれ
両方超ブラックだった
なんか疲れて実家帰ったらいつの間にか10年経ってた

暇なんで趣味で勉強してみた
2年前くらいに3ヶ月ほどjavaとpythonとc++
各言語のpaizaでC問題全部回答B問題10問くらい解けたからもうやってない
ガチで就職探したけど当然無くて諦めて勉強もやめてた

んでまた競プロサイトで練習始めたんだけど結局アルゴリズム意味不明で詰んだ感じ
暇なんで暇つぶしの惰性で練習してる感じ

こんなレベルで就職あるかな?
無職10年は適当にバイトしてたとかでごまかすコミュ力はあると自負してるつもり
こんな新人来られてもやっぱ迷惑だよね
てか俺が採用担当だったら絶対に採用しない

死んだほうが良いかな?
転生してやりなおしたい

119:デフォルトの名無しさん
20/08/19 06:19:51.21 AaZqqXX6.net
マ板でどうぞ

120:デフォルトの名無しさん
20/08/20 05:04:54.05 DqyqYTXG.net
if (!strcmp(a, b)) goto hell;

121:デフォルトの名無しさん
20/08/20 11:16:03 RX/3qqm6.net
hell終わるど

122:デフォルトの名無しさん
20/08/23 16:03:07.43 SVuEjc7r.net
例えば、
x<1 || y>3
と書いた場合、人間なら、この < や > は、大小比較をする比較演算子だと
思うでしょうが、コンパイラにとっては、1 || y を実引数とするところの
template展開だと勘違いする可能性があります。
どうやってこれを区別しているのでしょうか?

123:デフォルトの名無しさん
20/08/23 16:05:12.45 Exm+Pt+Z.net
どちらかというと
< <>, <> >
みたいなときに
<<>, <>>
って書くと期待通りに動かないのが面倒だと思う

124:デフォルトの名無しさん
20/08/23 16:08:14.77 SVuEjc7r.net
x がtemplate名であるかどうかを検査するのでしょうか?

125:デフォルトの名無しさん
20/08/23 16:18:37 SVuEjc7r.net
pure C で、構文ツリーを作りたいとき、出現してきた名前トークンがどう宣言されて
いるかを知らなくても、構文ツリーを作れてしまいます。
ところが、もし、xがtemplateの名前として宣言されているかどうかを知らなければ、
< が、比較演算なのが、template引き数の始まりを示す括弧なのか


126:の区別が 付かないのであれば、そうはいかなくなります。 pure C の場合:  構文ツリーを作る ---> ツリーの中にある中の名前の宣言を調べ、種類を見る。 で済んだところが、C++の場合、下手すれば、  構文ツリーを作る際に、出現した名前の宣言も逐次、調べる。 ということになります。



127:デフォルトの名無しさん
20/08/23 16:40:37.67 VT3zweO2.net
その場合、トークンとしての'<'が比較演算子なのかテンプレートの括弧なのかは区別しないで
構文解釈の結果として文脈によって決定するのが常套手段だろうね。
URLリンク(github.com)
>ところが、もし、xがtemplateの名前として宣言されているかどうかを知らなければ、
>< が、比較演算なのが、template引き数の始まりを示す括弧なのかの区別が
>付かないのであれば、そうはいかなくなります。
そうならない仕様にはしているはず。
どうしても区別がつかない部分は前にtemplateキーワードを置く必要があるとか。

128:デフォルトの名無しさん
20/08/23 17:11:53 SVuEjc7r.net
>>126
>その場合、トークンとしての'<'が比較演算子なのかテンプレートの括弧なのかは区別しないで
>構文解釈の結果として文脈によって決定するのが常套手段だろうね。
ここは、x<・・・> の x がtemplate名かどうかを区別できるところの
意味解析の段階ではなく、本当に構文解析の段階ですか?

129:デフォルトの名無しさん
20/08/23 17:21:37.10 PNDTq65a.net
xがtemplate名かどうかは識別子の辞書を見たらワカル
辞書の中身はその時点までのソースコードの内容と
言語規格上の定義(形式言語ではなく、自然言語で書かれた仕様)に依存するから
言語の「意味」に依存するところがあるからこれを意味解析に含めるかどうかは議論の余地があるが、
普通のコンパイラ屋のマインドとしては
識別子の辞書を見てxが(例えば)template名であると判明したら
xがtemplate名xという「字句」であるという前提の下に字句解析した結果を文法パーサに入力するので
構文解析の範疇だと思われ

130:デフォルトの名無しさん
20/08/23 17:23:59.45 SVuEjc7r.net
>>128
昔読んだコンパイラの本には、これまでに行われた宣言の情報を参照するのは、
意味解析だ、とあったと記憶しています。
逆に、それが意味解析でないのなら、何が意味解析になるのでしょうか。
「解析」ですから、コード生成では有りませんし。

131:デフォルトの名無しさん
20/08/23 17:26:01.74 PNDTq65a.net
それよか
std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::string> > x("Hello");
とコンパイラに解釈させるという方がよっぽど凶悪
これこそ構文の意味を知らねば「>>」という単一の字句なのか、「>」という字句2個なのか
定まらないという意味で字句解析→文法解析の流れをぶち壊しにしてくれる

132:デフォルトの名無しさん
20/08/23 17:28:17.74 PNDTq65a.net
>>129
構文解析、でええやん?
>>130みたいな凶悪なケースと違って
辞書の参照、というただ1点のチートだけやれば、
BNFで形式的に完全に表せる世界に持ち込める

133:デフォルトの名無しさん
20/08/23 17:29:06.23 PNDTq65a.net
訂正orz
誤: >>130みたいな凶悪なケース
正: >>129みたいな凶悪なケース

134:デフォルトの名無しさん
20/08/23 17:31:18.68 PNDTq65a.net
訂正2、。n_
>>130 正:
std::vector<std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::vector<std::string> > x("Hello");
とコンパイラに解釈させる方がよっぽど凶悪

135:デフォルトの名無しさん
20/08/23 17:39:05.76 SVuEjc7r.net
>>131
C++の場合、辞書の参照も簡単では有りません。
namespaceや、クラススコープの名前などが複雑に絡み、
スコープ演算子を使った、修飾名などがあり、
Q1::Q2::Q3::name<xxx>
のような場合がありますが、
ややこしいのは、実際に template を展開してみないことには、nameがどういう識別子
なのかも分からない事があることです。例えば、
aaa<xxx>::bbb<yyyy>::name < 5, 5 > y
と有った場合、name が変数名なのか、template 名なのかによって、
< が template 引き数の始まりなのか、比較演算子なのかが決まる可能性があります。
ただ、この場合、> の後に名前トークン y が来ていますが、template展開だと
すると、この並びは恐らく、必ず間違いであるはずで、比較演算子でしか
合法にはならないと思います。

136:デフォルトの名無しさん
20/08/23 17:40:50.98 08jUbd/H.net
いつもの人か

137:デフォルトの名無しさん
20/08/23 17:49:20.95 VT3zweO2.net
>>127
どのテンプレートが使われるかの判断は意味解析だろうけど、テンプレートの使用か
比較式かの区別は構文解析段階で確定するはずだがね。
で、両方に解釈できるケースは基本的に非templateとみなすことになっていて、そこで
テンプレートを使用したいならばtenplateキーワードを追加する。

138:デフォルトの名無しさん
20/08/23 18:14:03.07 PNDTq65a.net
>>136
>両方に解釈できるケースは基本的に非templateとみなすことになっていて、
それだと構文解析時のBNFの当てはめ時点でバックトラックしているように読めてしまうま、
そのような方式は、テンプレート定義が入れ子になったときバックトラック回数が指数関数的になりかねないから近畿
実際はそんなことはせずに、「name」というテンプレートの定義が辞書にあれば、「name」とかかれたソースコードの部分が
<テンプレート名>という字句として文法パーサに入力される、という方式で実現しており、
字句解析→文法解析、の一本道が保たれているはず(つまりは>>128のやり方
>>134
辞書の参照が難しい、と仰せなのですが
識別子のスコープを辞書の階層化で表現するのは常套手段であってコンパイラの教科書にも書いてある
(と思う)のでそんなに難しい話とはみなすことはできない(希ガス

139:デフォルトの名無しさん
20/08/23 18:17:01.07 PNDTq65a.net
※ 個人の感想です

140:デフォルトの名無しさん
20/08/23 19:31:26.00 OrwVzT4b.net
<=>演算子はどうなん

141:デフォルトの名無しさん
20/08/23 20:00:57.91 L0YhmUmF.net
面白そうな議論だけど忙しくて参加できない(泣

142:デフォルトの名無しさん
20/08/23 21:32:54.31 MKE8ZoLo.net
C++の文法は複雑すぎて構文解析と意味解析を分離できないのは有名な話
例によってBoostさんがそれを最大限に悪用してるのも有名な話
URLリンク(dechimal.hatenadiary.com)

143:デフォルトの名無しさん
20/08/24 09:07:54 2j0RwZQH.net
構造体へのファイル読み込みについて、悩んでいます。

今まで#pragma pack(x)を使用して、構造体にパディングが入らないようにしていたのですが、これ以外にパディングが入らないようにする方法はあるのでしょうか?

移植性の面からpragma禁止、かつ暗黙アラインメント禁止(自分でパディングを入れる)という指示がありました。

144:デフォルトの名無しさん
20/08/24 09:12:28 hO98kfNk.net
メンバ1つずつ個別に入出力
C++はそれがしやすい

145:デフォルトの名無しさん
20/08/24 09:14:54 hO98kfNk.net
エンディアン問題は1バイトずつ入出力することで解決できる

146:デフォルトの名無しさん
20/08/24 10:43:50.34 seWRIuQk.net
自分でパディングを入れる方が、明確。
解釈の余地がなくなるから
構造体へのファイル読み込みって、
構造体には、文字列のポインターがあるだけだろ
可変サイズの文字列の実メモリは、構造体内には確保しないだろ

147:デフォルトの名無しさん
20/08/24 10:50:48 3u4r+xiS.net
そもそもの話の流れの趣旨とは無関係
struct hoge {
char mojiretsu[0];
} hage;

で malloc するときに
struct hoge *p = (struct hoge *)malloc(sizeof(struct hoge) + length + 1);

148:デフォルトの名無しさん
20/08/24 11:20:42.08 RW1y5ZfB.net
>>142
バイト単位で読み込んで自分でメンバーに格納
てか移植性云々なら入出力部分を切り出しとけよと思うが…

149:デフォルトの名無しさん
20/08/24 11:25:15.19 hO98kfNk.net
C++的には構造体の中の物理的な配置に依存しない設計をするのが本筋
ostream& operator << (ostream&, your_struct const&);
istream& operator >> (istream&, your_struct&);

150:デフォルトの名無しさん
20/08/24 11:51:04.72 2j0RwZQH.net
ありがとうございます。とても


151:参考になります。 パッと見て理解できないこともありますが、一つ一つ勉強します。 「入出力部分を切り出し」については、知識不足でイメージもできない状態なのですが、入社したらそうなっているのかも?と心構えというか、理解しておきたいと思います。



152:デフォルトの名無しさん
20/08/24 12:08:08.35 5d5vIMqX.net
>>142
自分でパディングいれろ、という指示なんだから自分パディング入れればいいんでしょ?
方法は明確じゃん
まぁお前の質問の仕方が悪いってことね
まずやることはコンパイラのパディングのルールを確認してどういう条件で暗黙パディングが入るか理解すること
理解できたら自分でダミーのメンバ追加して暗黙パディングが入らないようにする
gcc/clangだったら-wpaddedで暗黙パディングが検出できるはず
念のためstatic_assertとoffsetofを使ってすべてのメンバーで期待通りのオフセットであること保証しておくといい
おまけでstatic_assertとsizeofで期待通りの構造体のサイズであることも
こういうのが多数あるんだったら、別途ツール使って構造体のソースは自動生成するようにすべき
あとpragma packは(レイアウトによって)実行時にオーバーヘッドが生じるってことも勉強しとくといい

153:デフォルトの名無しさん
20/08/24 12:32:35 2j0RwZQH.net
すみません。質問を正しく説明できるように気をつけます。

私が質問したかったのは、「パディングの入れ方」ではなく、「そもそもパディングが入らないようにする方法はないだろうか」ということでした。
パディングの入れ方については既に理解しているのですが、入るとやや都合が悪い状況です。
「暗黙アラインメント禁止(自分でパディングを入れる)」と書いてしまったことで質問内容がブレてしまい、良くなかったと反省しております。

また、詳しくアドバイスをしていただきありがとうございます。

154:デフォルトの名無しさん
20/08/24 13:32:36.10 3u4r+xiS.net
#pragma pack(1)
も禁止?

155:デフォルトの名無しさん
20/08/24 14:16:40.36 5d5vIMqX.net
>>151
「そもそもパディングが入らない方法」がpragma packであって、それが禁止されてんでしょ?
言われた通りに明示的にパディング入れな
何か方法があったとしてもチーム開発しているときに、妙な小細工は嫌われる

156:デフォルトの名無しさん
20/08/24 14:23:21.21 2j0RwZQH.net
「#pragmaは禁止」とあったので、そうだと判断しています。
もしこれが必ずしも#pragma pack(1)も禁止というわけではないなら、一度担当者に確認してみようと思います。

157:デフォルトの名無しさん
20/08/24 14:33:52.11 2j0RwZQH.net
>>153
ありがとうございます。
そのようにしようと思います。
様々なアドバイスをいただき、私の考え方や疑問に思う部分が誤っていたと感じました。
これからはもっと広い視野で考えられるように頑張ります。

158:蟻人間
20/08/24 14:38:21.49 lUUB+Gis.net
#include <pshpack1.h>

159:デフォルトの名無しさん
20/08/24 20:32:07.30 0b6x/pxR.net
環境依存しない方法なんてないよ
int, short, longのバイト数すら環境依存なんだから
環境依存が嫌ならC++使うこと自体が間違い

160:デフォルトの名無しさん
20/08/24 20:39:16.80 hO98kfNk.net
#include <cstdint>知らなさそうだね

161:デフォルトの名無しさん
20/08/25 00:20:38.83 GVKOVEUV.net
明示的にパディング入れる方がかえって小細工になったりして…
パディング前:
struct Foo {
 int16_t m_someWord;
 // ここに明示的にパディングを入れる
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return m_someWord; }
};
明示的パディング後(1):
struct Foo {
 int32_t m_someWordInDWord; // 32 bit境界に隙間無くパディング入ったやたー!
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return (m_someWordInDoubleWord >> 16); } // OOPS! 欲しい16 bitの位置がホストのエンディアン次第で変わるorz
};
明示的パディング後(2):
struct Foo {
 uint8_t m_someWordInBytes[4]; // 32 bit境界に隙間無くパディング入ったやたー!今度はしくじらないのですよ
 int32_t m_someDoubleWord;
 int16_t GetSomeWord() const { return ((uint16_t)m_someWordInBytes[1] << 16) | (uint16_t)m_someWordInBytes[0]; } // |||OTL
};

162:デフォルトの名無しさん
20/08/25 07:35:37.57 IvfDNlgu.net
int16_tが欲しいのに他の型使ったらそりゃ。

163:デフォルトの名無しさん
20/08/25 09:32:18 ILy/WoQ4.net
逆だな。
C言語を使うといくらでも環境依存のものを作れそうな気持ちにさせる

164:デフォルトの名無しさん
20/08/25 09:50:55 DOmxfygr.net
環境非依存て聞こえはいいけど色んな機種の機能の積集合でできることだかんな

165:デフォルトの名無しさん
20/08/25 10:21:10.89 z55E+4lG.net
Unix文化とWindows文化の違いがあって、
Unixでは、OSよりもC言語によって、ハードウェアの違いを吸収する思想だった。
この思想では、バイナリ互換ではなく、ソース互換を目指し、
異なるOSやCPUに対しても、Cのソースを再コンパイルして対応しようとした。
一方、Windows文化では、最初から互換性のあるCPUを使うことが前提であり、
OSがCPU以外のハードウェアの違いを吸収することで、バイナリレベルで互換性を
維持する思想であった。
この思想では、異なるOSやCPUをターゲットにすることは想定されていない変わりに、
ハードウェアの違いは、互換性のある(単一の)OSをハードウェアに乗せることに
よって吸収しようとした。
なので、GNUやgccなど、Unix文化からきたプログラムでは、徹底的に#ifなどで
場合分けして互換性を維持しようとしているのに対し、Windowsから来たプログラム
ではそのような場合分けはしていない。
また、Unix文化でも、#if によってソースを場合分けすることで対応していることが
ほとんどで、何の場合分けも無いソースで対応できている訳ではない。

166:デフォルトの名無しさん
20/08/25 11:00:39.10 8PaZBEwq.net
[要出典]

167:デフォルトの名無しさん
20/08/25 11:11:45.82 Zt9gBA2M.net
htons とか ntohl とか最強

168:デフォルトの名無しさん
20/08/25 12:41:01.28 72rzjRbk.net
C++を検索するときの技で上手い方法ありますか?
ググる、アマゾン、図書館での検索など
勉強しようとしても検索できないです

169:デフォルトの名無しさん
20/08/25 12:45:40.95 KRGfI1UY.net
コンパイラーのエラー文で投げたら大抵その言語で釣れると思うけどなぁ

170:デフォルトの名無しさん
20/08/25 12:56:51 qQcORjN3.net
ぐぐるときは
hoge -ruby -java -javascript -php -sejuku -techacademy -teratail

171:デフォルトの名無しさん
20/08/25 13:08:39.95 3B5pz6IO.net
−ヤフーゴミ袋

172:デフォルトの名無しさん
20/08/25 13:10:33.24 V6jdFuMQ.net
>>166
検索して出てきた情報を理解するための基礎的な力が無いんじゃね?
ググれば何でも即解決できるわけではないよ
愚直にC++の入門書を買って順を追って系統立てて、C++の基本的な概念や用語を理解していく必要がありそう
もしかすると、C++より前に他の言語でそれをやってプログラミングの基本的なところから土台を踏み固めておかないとダメかも

173:デフォルトの名無しさん
20/08/25 13:25:38.78 YCpmFLs5.net
「勉強」がどのレベルなのか分からないとなんとも言えない
直感で言うとC++の入門書なんでもいいから一冊買ってやりなさい

174:はちみつ餃子
20/08/25 13:56:10.27 xuORV4zd.net
>>166
俺も >>170 に同意だわ。
基礎的な考え方が身に付いてないと個別の説明を見ても意味わからん。
検索するにしたって検索に適当な語句を選択するだけの知識は要るしな。
用語は大事。
概念を分割して定義を積み重ねるのが体系化だし、
定義は用語の定義として現れることが多い。
用語がわかると色々わかる。

175:デフォルトの名無しさん
20/08/25 14:26:43.50 72rzjRbk.net
「C++」で検索ができないんだが
PCの設定がダメなのかな
これから情報を得るために検索くらいしたいんだけど
本買いたくても出てこない
図書館へは行ったけどC++は貸出中で予約も数件入ってるらしい
+のフォントが変なのか?

176:デフォルトの名無しさん
20/08/25 14:29:17.40 y+wyfPxz.net
>>168
-qiitaが抜けてる

177:はちみつ餃子
20/08/25 14:32:45.54 xuORV4zd.net
>>173
俺の手元だと、グーグルでもアマゾンでも C++ で検索できてるがなぁ……。
ダブルクォートで囲って "C++" にしたらより確実に C++ が含まれるページが検索される。

178:デフォルトの名無しさん
20/08/25 14:43:38.93 z55E+4lG.net
twitter は、C++ や C# を検索できない。"C++" や "C#" としても駄目。
なので、cpp OR cplusplus とすると良いと言われているが、
個人的には、これは、twitter を作った人の C++ や C# を弱まらせるための策略
だと思っている。

179:デフォルトの名無しさん
20/08/25 14:49:20.21 8QbTjnzx.net
なんか流れにしれっとキチガイ混じっとるな

180:デフォルトの名無しさん
20/08/25 14:50:58.98 H1PjAHfj.net
アメリカはそういう国で、
彼らは、自分のためなら何をやっても文句は言わせない的な心持でいる。

181:デフォルトの名無しさん
20/08/25 14:57:06.54 72rzjRbk.net
>>176
ありがと
cplusplusで検索できました

182:デフォルトの名無しさん
20/08/25 15:16:32.29 YCpmFLs5.net
勘違いで御高説垂れてた奴wwww

183:デフォルトの名無しさん
20/08/25 20:28:52.64 Ascep3nh.net
何故かyahooでリアルタイム検索ではC++で検索できる

184:デフォルトの名無しさん
20/08/25 23:48:37 zCjig7ks.net
シープラプラとか
チンチンブラブラみたいな名前付けやがって
たぬき砲でいいよなもう

185:デフォルトの名無しさん
20/08/25 23:56:18 zCjig7ks.net
Cよりもちょっと背伸びした意識高い系狙ってみましたみたいなキモいネーミングセンス

186:デフォルトの名無しさん
20/08/26 00:15:37 DrItK79l.net
>>183
ちょっとどころじゃねーよ馬鹿
お前みたいな低能にはC++は無理

187:デフォルトの名無しさん
20/08/26 00:16:50 1Tu0I/K+.net
あーキモい(゚〇゚)キモい

188:はちみつ餃子
20/08/26 01:00:49.72 Yn/rXsvn.net
キーッ! もういい! (駄洒落)

189:デフォルトの名無しさん
20/08/26 01:32:11 NYX2/iU2.net
CRTP(奇妙に再帰したテンプレートパターン)ってどんなときに使うの?
template <class Derived>
struct Base {
static void interface() {
...
Derived::static_interface();
...
}
};
struct Hoge : Base<Hoge> {
static void static_interface() { ... }
};
通常の継承とは依存関係が逆になってるというのはわかるけど
具体的にどんなケースで便利なのかいまいちピンとこない...

190:デフォルトの名無しさん
20/08/26 02:37:52.45 oEB3gdtA.net
速度重視のときじゃないかな。
ATL/WTLがCRTP使ってると思ったけど。
メリットとデメリットを比べるとデメリットが上回ってるような気がするな。
ぼくは構文解析器の合成にCRTPを使いましたが、合成の頻度が非常に少ないので、使った感じです。

191:デフォルトの名無しさん
20/08/26 02:49:00.89 oEB3gdtA.net
仮想関数の代わりにCRTPを使うと呼び出しコストが無くなる・・・的な使い方で、便利にはならないと思う。
というより、めんどくさくなるだけ。

192:デフォルトの名無しさん
20/08/26 07:05:25.59 NYX2/iU2.net
なるほどどうしてもパフォーマンスが気になるときに使うものって感じですかね

193:デフォルトの名無しさん
20/08/26 10:20:21.13 2Yv7E1bU.net
というより、動的な多態は不要だが静的な多態が必要で、
かつ派生クラスの型情報がどうしても必要なときに使うもんだと思う
クラステンプレートであれこれやってるうちに必要な場面が出てくるかと

194:デフォルトの名無しさん
20/08/26 11:43:55.11 KrF5vX4s.net
学術の巨大掲示板群 - アルファ・ラボ URLリンク(x0000.net)<)

195:デフォルトの名無しさん
20/08/26 13:51:37.26 CU/Sbvp9.net
派生クラスの型情報を静的に使うというのはstatic_castでのダウンキャストだな

196:デフォルトの名無しさん
20/08/26 18:43:05.84 UQhlb7Hi.net
Derivedを引数にとる比較演算子を生成するみたいなことは継承だと無理そう。

197:デフォルトの名無しさん
20/08/26 19:52:17.80 IvFDW58Y.net
基底と言いつつテンプレートでガッツリ派生型の名前が入ってるわけで
他の派生型を持つ基底を一括してコンテナに入れるとかできないしあまり意味を感じないな

198:デフォルトの名無しさん
20/08/26 23:36:52.30 BTqRZu5v.net
そもそもポリモ目的でやるもんじゃないでしょ
基底クラスは結局全部別モンになるわけだし
ボイラープレートコードをまとめたクラスをミックスインするときに使うもの

199:デフォルトの名無しさん
20/08/27 06:37:57.11 7Sruawh3.net
>>195
basic_iosとios_baseみたいにテンプレート化する必要のある部分と不要な部分に分けるとか

200:デフォルトの名無しさん
20/08/28 17:02:52.88 BFWbiW8H.net
関数へのポインタが、メンバ変数に有る場合、例えば、
class CXxx {
public:
  void (*pfn)(int a);
  void (*pfn)(float b);
};
の様な場合、
pXxx->pfn(5);
pXxx->pfn(10.0f);
とした場合に、関数呼び出しに使われる関数ポインタが自動的に選択されるでしょうか?
つまり、関数ポインタについても、関数と同様な「オーバーロード解決」が行われますか?
そもそも、上の様なクラスは、定義時にエラーになるでしょうか?

201:デフォルトの名無しさん
20/08/28 17:09:28.47 47MLab1u.net
自分で動かしてから質問しろよ

202:デフォルトの名無しさん
20/08/28 17:09:34.31 namGYget.net
同じ名前のデータメンバーをふたつ定義してるからアウト

203:デフォルトの名無しさん
20/08/28 17:26:26.84 bCpDWR5V.net
>>198
それコンパイル通るかやってみ

204:デフォルトの名無しさん
20/08/28 17:41:13 AJ/VhFe8.net
ここに質問するより少ない手数で試せるだろうに何やってんだろうね

205:デフォルトの名無しさん
20/08/28 17:44:35 TvC7lNeF.net
>>198
関数は多重定義できるが
関数へのポインタは多重定義できない

206:デフォルトの名無しさん
20/08/28 17:48:03 TvC7lNeF.net
ちかっとエスパーすると
class CXxx_base {
public:
  virtual void fn(int) = 0;
 virtual void fn(float) = 0;
};
class CXxx : public CXxx_base {
public:
  void fn(int) override { }
 void fn(float) override { }
};
pXxx->fn(5);
pXxx->fn(1.0.f);
これでおまえさんの考えてることはできるんじゃないか?

207:デフォルトの名無しさん
20/08/28 19:11:25.34 KPVk+Ml/.net
>>198
机上の空論持ってくるな
きちんと検証してから持ってこい

208:デフォルトの名無しさん
20/08/29 11:57:26.58 HmjSn9P9.net
関数へのポインタって関数じゃなくてただのメンバ変数だからな

209:デフォルトの名無しさん
20/08/29 14:38:37.69 EjjA84a9.net
>>196
>ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
ちょっとかっこいい(型情報ある)マクロみたいな感じか

210:デフォルトの名無しさん
20/08/30 13:47:11.43 6dVOYYO/.net
構造体を使った配列の記憶にて
配列に順に入力しても出力が上手くいきません助けて偉い人

211:デフォルトの名無しさん
20/08/30 13:49:26.97 KF/F+MKa.net
スルーで

212:デフォルトの名無しさん
20/08/30 13:51:20.52 GgAZZaQa.net
100歩譲っておま環

213:デフォルトの名無しさん
20/08/30 14:21:16.52 6dVOYYO/.net
void dataInput(Student& st){
string ans;
for(int i=1, i<=n;i++){
cin>>st.id;
pN[i]=st.id;
cin>>st.ans;
pA[i]=st.ans;
}
};
void showData(Student& st);
int main(){
cin>>n;
pN = new int[n];
pA = new int[n];
Student st;
dataInput(st);
showData(st);
return 0;
}
void showData(Student& st){
for(int j=0; j<=n; j++){
cout << pN[j] << pA[j] << "\n";
}
}
定義はファイル別にしてある
正直すまんかった

214:デフォルトの名無しさん
20/08/30 14:23:30.40 KF/F+MKa.net
デバッガで自分でトレースしろ

215:デフォルトの名無しさん
20/08/30 14:28:47.09 GgAZZaQa.net
死ね

216:デフォルトの名無しさん
20/08/30 14:54:19.28 6dVOYYO/.net
hファイルの方
struct Student{
int id;
char ans;
};
int n;
int* pN;
char* pA;
cppファイル冒頭
#include <iostream>
#include <string>
#include "funk.h"
using namespace std;

217:デフォルトの名無しさん
20/08/30 15:13:34 6dVOYYO/.net
デバッグしたけど問題は見つかりませんでしたと出た。出力に問題があるっぽい

218:デフォルトの名無しさん
20/08/30 15:22:13 6dVOYYO/.net
自己解決しました!iとjの初期値を1から0にしたら解決できました。

219:デフォルトの名無しさん
20/08/30 15:22:13 6dVOYYO/.net
自己解決しました!iとjの初期値を1から0にしたら解決できました。

220:デフォルトの名無しさん
20/08/30 15:57:12.85 HKGZh04b.net
きちんと検証しろ
ソレができないなら初心者スレか日記帳にでも書いとけ

221:デフォルトの名無しさん
20/08/30 17:44:09 oWP9MzfY.net
これはひどい

222:デフォルトの名無しさん
20/09/04 17:01:57.31 8b49PodW.net
hage

223:デフォルトの名無しさん
20/09/04 17:03:42 LCYaN/vD.net
どっちのだよ

224:デフォルトの名無しさん
20/09/04 17:11:42.93 ML6iv+hM.net
URLリンク(dotup.org)

225:デフォルトの名無しさん
20/09/07 16:37:42 AmzB5PF6.net
githubなりに落ちてるc++で書かれたアプリなりを読んで勉強しているんだけど、
include無限ループに陥って萎えてしまうのですが、どうしてますか?

mainのinclude沢山→その指定先にもinclude沢山→stlなりのライブラリ(ここは読まずネットでドキュメント読む)
で相当時間食ってしまうまのですけど、コツとかありますか?

226:デフォルトの名無しさん
20/09/07 16:42:08.11 bjXgxZkO.net
includeガードしろ

227:デフォルトの名無しさん
20/09/07 16:54:18.66 4QMtZq9v.net
ていうかなぜ初学者なのにいきなりそんな重厚長大なアプリからチャレンジしようとするのか
自分の力量を過大評価しているのではないか
まずヘローワールドとかそういう簡単なとこからはじめなさい

228:デフォルトの名無しさん
20/09/07 16:57:38.12 x8yvSFtj.net
コンパイル時にg++とかなら-Eオプションつければ
実際のプリプロセッサの処理の結果が確認できる

229:デフォルトの名無しさん
20/09/07 16:58:04.33 3Ozv9Uf+.net
読まなきゃいいじゃん
何のために全部読もうとしているのか自問自答したら?

230:デフォルトの名無しさん
20/09/07 17:02:08.59 qk/9c7gK.net
>>223
身の丈に合わない巨大なプロジェクトを読もうとしてるか、または愚直に頭から全部読もうとしてないか?
お前さん自身がコンパイラじゃないんだから、頭からすべて把握して読んでいく必要はないぞ。
まともなソースならオブジェクト指向で書かれてるのだから、上位層で大筋を把握しながら必要に応じて深いところに入っていって、有用そうな所や興味があるところだけ詳しく読めば?
ヘッダファイルは使ってるライブラリとかの当たりをつける程度でざっと読み飛ばして、定義を調べたくなったときにIDEの機能で見に行けばいいだろう。

231:デフォルトの名無しさん
20/09/07 17:05:02.17 Egt+Qwmp.net
吊りかも知れないが勉強中とのことなので
マジレスすると
#include の行を一つづつ消してみて(mainに近い方だけ)
消したらどんなコンパイルエラー出るかを観察する

232:デフォルトの名無しさん
20/09/07 17:07:22.95 6+huFxV7.net
>>228
sshのソース読んでも全くオブジェクト指向じゃないぞ。

233:デフォルトの名無しさん
20/09/07 17:13:56.93 x8yvSFtj.net
あらゆるところで参照したいヘッダファイル↓があるとして
./include/common/hoge.hpp
詳細な実装(深い階層にいるやつ)
./include/hage/chibi/debu/unko.hpp
からそれを読み込むときって
#include "../../../../common/hoge.hpp"
みたいにしてしまっているのですが、もっとまともなやり方はありますか?

234:デフォルトの名無しさん
20/09/07 17:18:55.68 x8yvSFtj.net
ちなみにCMakeを使っています

235:デフォルトの名無しさん
20/09/07 17:21:09.32 ualItUCM.net
なぜSTLは
#include <vector>
などで読み込めるのでしょうか
不思議ですねぇ

236:デフォルトの名無しさん
20/09/07 17:27:17.02 x8yvSFtj.net
./include/common
をインクルードパスに含めるのは思いついた上で微妙な気がしたから
聞いてます

237:デフォルトの名無しさん
20/09/07 17:43:09.75 3Ozv9Uf+.net
まとも~とか微妙~とか
そういう表現どう思う?

238:デフォルトの名無しさん
20/09/07 17:44:59.68 x8yvSFtj.net
./include/hage/chibi/
配下ではどこからでも見れるようにするとかしたいときはそこの
CMakeLists.txtにインクルードパス指定する
とかしかないんですかね

239:デフォルトの名無しさん
20/09/07 19:33:13.69 u0REhpNo.net
インクルードガード標準搭載の言語多いのに
ほんと無駄な時間使わせてる言語なんだなって再確認できて辛い

240:
20/09/07 20:11:18.48 bJcKHVeO.net
>>237
マクロによるインクルードガードなんて決まりきった定型文だし、正直 #pragma に載せる必要もないかと…

241:デフォルトの名無しさん
20/09/07 20:19:27.09 h3kjQIhT.net
まあね、GUIDなら衝突の確率340澗分の1だかんな
それすらも衝突したらどうすんだと・・・ほとんど病気だねw

242:デフォルトの名無しさん
20/09/07 20:40:39.15 x8yvSFtj.net
>まとも~とか微妙~とか
なんとも思わねえよばあか

243:デフォルトの名無しさん
20/09/07 21:32:21.88 kH2Fy/8z.net
そっか君プログラマ向いてないね
知らなくて驚くかもしれないけどコンピュータには感覚じゃなくて理屈しか通じないんだよ

244:はちみつ餃子
20/09/07 21:58:09.22 PI/34Ato.net
>>237
C++20 にはモジュールが入ったから……。

245:デフォルトの名無しさん
20/09/08 00:30:42.07 h4K4tlm9.net
誰がプログラマって言ったよ?
理屈しか通じないんだろ?
頭悪そう

246:デフォルトの名無しさん
20/09/08 00:32:32.14 h4K4tlm9.net
自分で言ってることに矛盾してる時点で才能ないよ君

247:デフォルトの名無しさん
20/09/08 16:47:11.08 FxZYRSTV.net
is_integralみたいな型判定をメタ関数に渡すとこを書いてて思ったんだが
変数テンプレートをテンプレート・テンプレートパラメータとして渡せるようにはなってないんだよなぁ
ということは、と思ってコンセプトの予定されてる内容調べたら、コンセプトも同様なんだな・・残念

248:デフォルトの名無しさん
20/09/10 08:49:56.48 ke8OXyHN.net
C++でもNPMみたいなパッケージマネージャ使いたい
ヘッダと実装別で書かなきゃいけないのも無駄
このへん解決したAlterC++みたいなの作って

249:デフォルトの名無しさん
20/09/10 09:32:44.42 xgcscVfX.net
>>246
>>242

250:はちみつ餃子
20/09/10 09:34:27.99 LwYTdpan.net
>>246
ヘッダファイルを実装とは別に用意する仕組みは効率よく差分ビルドするための仕組みとして機能していたんだけど、
テンプレートが登場してからは足を引っ張るようになってるとは思う。
まあ単純に面倒くさいってのもわかる。
パッケージマネージャはディストリビューションに乗ってるものを使いたまえよ。
実行環境の管理と開発環境の管理は要求されるものが本来は違うのだけど、
C/C++ は特権階級的な立場だから実行環境を開発環境として使えるようになってることが多い。
あえて分離したいなら CONAN が有名かなぁ……。 使ったことないけど。
URLリンク(conan.io)

251:デフォルトの名無しさん
20/09/10 13:27:37.52 ke8OXyHN.net
>実行環境を開発環境として使えるようになってることが多い
これは古い慣習でそうなってるだけで実は分けたほうが便利な気がする
システム汚さないし、依存関係の解決も楽
そもそも実行環境に不要なはずのものがいることがおかしい
ConanもC++20のModuleも良さそうだけど結局バベルの塔だからなぁ

252:デフォルトの名無しさん
20/09/10 13:37:57.10 wdhKSMlq.net
>>249
俺も同意見
開発環境、それとテスト環境もVMwareのゲストにしてる
おっかない実験もするし

253:デフォルトの名無しさん
20/09/10 13:58:43 h1ZKqHov.net
>>246
VCPKGがあるじゃないか。

254:はちみつ餃子
20/09/10 15:13:20.95 LwYTdpan.net
>>249-250
それは重々承知なんだけど C/C++ では分ける体制になってないから
無理して分けるとそれはそれで変になるって話。

255:デフォルトの名無しさん
20/09/10 16:03:33.34 wdhKSMlq.net
変になるって、具体的に何?

256:デフォルトの名無しさん
20/09/10 18:50:19.73 6Z343NeL.net
>>252
>それは重々承知なんだけど C/C++ では分ける体制になってないから
そうか?
はちみつはそういう経験無いだけだろ
VCでだってクロスプラットフォームは可能だぞ

257:デフォルトの名無しさん
20/09/10 18:55:15.35 h1ZKqHov.net
VSがクロス一番楽。

258:デフォルトの名無しさん
20/09/10 18:56:59.66 h1ZKqHov.net
C/C++はコンパイラメーカーがローダーを用意していない。
これに尽きる。

259:デフォルトの名無しさん
20/09/10 19:04:13.58 wOYL1pS0.net
最近は何でもdockerに突っ込んでいる。
vscode + remote containerで開発環境の構築も楽になったし。

260:デフォルトの名無しさん
20/09/10 19:05:01.58 ke8OXyHN.net
C++ moduleってテンプレート使ったクラスをモジュール化したとき
プリコンパイルヘッダと原理的に同じで機械語じゃなくて中間表現に
変換されるらしいんだけど、これってコンパイル速度が大幅に改善することはない
ってことだよね?

261:デフォルトの名無しさん
20/09/10 19:13:48.12 6Z343NeL.net
よく考えたインクルードでpch併用してるプロジェクトなら、普段のビルド大して変わらんかもだけど
pchが依存するヘッダを書き換えた場合のフルビルドみたいなのは避けやすくなるぽい??

262:デフォルトの名無しさん
20/09/10 19:13:59.29 ke8OXyHN.net
プリコンパイルヘッダを試しに生成するのと
普通にコンパイルするのと試したら2割程度しか時間短縮できなかった

263:はちみつ餃子
20/09/10 21:58:54.33 LwYTdpan.net
>>260
二割はでかいやろ。
>>258
従来からもたとえば gcc で LTO を有効にしたときは中間表現で持っておいて
リンク時に最適化とコード生成をやったりはする。
それと同程度のコンパイル速度だろうと考えると
モジュールの導入は速度にはそれほど寄与しないと思う。

264:デフォルトの名無しさん
20/09/10 22:37:36.67 ke8OXyHN.net
うーん まぁチリツモと考えるとでかいか
夢見過ぎだったか

265:はちみつ餃子
20/09/10 23:28:14.82 LwYTdpan.net
>>262
ジョジョ、それは高速化しようとするからだよ。
逆に考えるんだ、『もう十分に速い』と考えるんだ。

266:デフォルトの名無しさん
20/09/10 23:45:25.82 EIogAYj0.net
質問ですが
 double x = 0.3333;
 printf("x=%f\n", x); // 期待する表示: x=0.3333
みたいなBCD風表記→IEEE 754→再びBCD風表記
としたときに、元の表記と結果の表記が一致することは
保証されてますん?

267:はちみつ餃子
20/09/11 00:13:13.30 iGbGHAE2.net
>>264
保証されない。
0.3333 は浮動小数点で正確に表現することは出来ないので誤差は生じる。
誤差があるところから再び十進数の表現にするんだから
元と同じ表現になることは期待できない。

268:デフォルトの名無しさん
20/09/11 00:15:27.86 ajBE7peV.net
されてない

269:デフォルトの名無しさん
20/09/11 00:22:49.83 WOjxtKnw.net
不可逆変換

270:デフォルトの名無しさん
20/09/11 00:27:13.22 1mBomO61.net
何がしたいんだろな。

271:デフォルトの名無しさん
20/09/11 00:31:20.53 hb2JlHSF.net
ちょっソ──スコ──ドに0.3333と書いたのに
0.33331とかに解釈になったらスゲーまずくね??

272:デフォルトの名無しさん
20/09/11 00:38:43 ajBE7peV.net
初心者スレは別にあるだろ

273:デフォルトの名無しさん
20/09/11 00:40:37 OVJtRCSC.net
さすがにもう少し精度が高くて、doubleなら
0.3333000000000001 くらいの誤差じゃない?(適当)

274:デフォルトの名無しさん
20/09/11 00:41:20 hb2JlHSF.net
何がしたいのかというと実行時計算ができる有理数クラスを書いたんじゃが
ソース値がソースコードに浮動小数点で書かれていた場合は当たり障りのない有理数にしたいわけで、
たとえば
 Rational x = 0.11;
と書けば済むところはそのまんま
 x.m_num == 11LL // 分子
 x.m_den == 100LL // 分母
とかになってホスイ
(必ずいちいちRational x = Rational(11, 100);と書かなければならないことはユーザー(≒漏れ自身)に強制したくない

275:デフォルトの名無しさん
20/09/11 00:43:42.19 hb2JlHSF.net
つかソースコードに書かれた浮動小数点数を文字列化して元に戻せることの重要性を
書いたコンパイラの教科書はマイナーかもしれんが実在したで(記憶モード
そのやり方こそ今思い出すべきなのだが手元に無いから質問すた、

276:デフォルトの名無しさん
20/09/11 00:44:51.33 ajBE7peV.net
>>272
ユーザ定義リテラルでも作れば?

277:デフォルトの名無しさん
20/09/11 00:45:17.34 OVJtRCSC.net
固定小数点?

278:デフォルトの名無しさん
20/09/11 00:50:39.51 hb2JlHSF.net
>>274
やだ
数値的にやるとしたらここ↓のalmost_equal<T>()でも使ってゴニョれば良いんかのう…
URLリンク(en.cppreference.com)
しかし件の本にはこれと似たような演算を書いてあったような気がしないOTL

279:デフォルトの名無しさん
20/09/11 00:54:13.41 ajBE7peV.net
>>273
浮動小数ならやり方ははっきりしてんだよ
お前の場合BCDなんだろ?

280:デフォルトの名無しさん
20/09/11 00:59:52.73 ajBE7peV.net
>>276
そのRationalクラスが多倍長とかだったら無理だね
64bit/64bitでも無理だろ、たぶん

281:デフォルトの名無しさん
20/09/11 01:08:43.17 hb2JlHSF.net
>>278
しらそん
桁の十分不十分は応用にもよるし
足りないとわかったらRationalの方を多数桁対応させるは
とにかくRationalは見かけをdouble型と同様に扱えるように仕上げ鯛、
なぜなら真に走らせたいアルゴリズムはdoubleをtypedefして作ってあって、
それをRationalに差し替えるだけ!と思ってたら
単体テストが10億行ぐらい浮動小数点で書いてあったので…

282:デフォルトの名無しさん
20/09/11 01:27:41.74 ajBE7peV.net
それはわかったけど
>>264 は必要?
別にいらんと思うけど

283:デフォルトの名無しさん
20/09/11 01:52:30.29 tAPrmVM5.net
文字列受け取るコンストラクタ書くだけだろ

284:デフォルトの名無しさん
20/09/11 03:35:25.76 iBiKDQ69.net
char配列に変換して8バイト読み書きするだけのこと
文字列に変換することは忘れろ

285:デフォルトの名無しさん
20/09/11 12:52:59.43 WJYUzgW7.net
そもそも0と0.0を区別する方法がないのにどこまで意味のある事なのか

286:デフォルトの名無しさん
20/09/11 15:59:42.05 Cxw4gZ+X.net
> (必ずいちいちRational x = Rational(11, 100);と書かなければならないことはユーザー(≒漏れ自身)に強制したくない
無理だろ
Rational x = 0.1;
こんなの、どうすんだよ?
double型の0.1は1/10じゃねえぞ

287:デフォルトの名無しさん
20/09/11 16:00:39.94 Cxw4gZ+X.net
denが必ず10のべき、みたいなことにして
誤差が最小になるように頑張るならともかく

288:デフォルトの名無しさん
20/09/11 16:17:57.96 FpD9K4HS.net
>>272
Rational x = "0.11"; を許せばいい

289:デフォルトの名無しさん
20/09/11 16:29:19.36 6r5prnWG.net
>>279
仮にテストコードに 0.333333333333333 って書いてあったとしても
それは 0.3333333333333329818 のことだから、
0.333333333333333として受け取ってしまうと逆にテストに失敗するのでは?

290:デフォルトの名無しさん
20/09/11 16:36:45.19 G2VX17rJ.net
10億行ぐらい既存テストコードがあるとのことなので文字列とか全面書き換えになる案はNGなんでしょう
でもいい案はなさげ
一旦浮動小数になったら元のリテラルの復元はできないだろうな

291:デフォルトの名無しさん
20/09/11 16:39:43.52 su+TWEMf.net
>文字列とか全面書き換え
Rational にする書き換えはOKなんだろ

292:デフォルトの名無しさん
20/09/11 16:43:40.92 G2VX17rJ.net
そりゃクラスの差し替えは局所的な置き換えで済むんじゃないの
浮動小数のリテラルを全部文字列に置き換えることに比べたら楽でしょ
まぁ本人が答えるべきだが状況はなんとなく推測できる

293:デフォルトの名無しさん
20/09/11 20:04:14.01 ua52u3Jr.net
そのくらい正規表現で置換すればいいだろ。
だいたい10億行のテストコードが仮に本当なら100%手書きじゃないから一つずつ確認しながら置換するなんてアホなことはしない。
有理数クラスなんて普通は枯れたライブラリ拾って来るけどな

294:デフォルトの名無しさん
20/09/11 20:18:44.50 G2VX17rJ.net
だからさ、そこは本人の希望なんだからあれこれ言ってもしかたないじゃん
正規表現で機械的に置き換えたらまずいものもあるかもしれないし
浮動小数と有理数で切り替えたいって言ってるからそのメンテコストもあるだろ

295:デフォルトの名無しさん
20/09/11 21:28:10.16 opulvzCM.net
ユーザー定義リテラルとか使ってboost::rationalでも生成したら?
やったことないからできるか知らんが。

296:デフォルトの名無しさん
20/09/11 21:35:23.73 em6XQ5sn.net
何にせよdoubleになった時点でリテラル表記の情報は失われるんだから、何がしかの書き換えをするしかない
それがイヤだ絶対やらんと言うなら、じゃあ不可能だよという答えにしかならない

297:デフォルトの名無しさん
20/09/11 21:51:53.86 aT3N5bZo.net
プリプロセッサを書けばどうだろう

298:デフォルトの名無しさん
20/09/11 22:53:08.79 3mrNom4D.net
Rational に double の数値が直代入されてるところだけ文字列代入にするための
プリプロセッサ描けば良い話

299:デフォルトの名無しさん
20/09/12 05:53:05.89 2ljmp3qW.net
結論から言うと、
IEEE 754の値x → 10進数文字列 s→ IEEE 754の値x'
という変換を行った場合、x == x'となるかどうかはx次第であって一般に保証されないが、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
s == s'を保証可能
なぜなら、(1)の条件を満たすsとそのIEEE 754への変換結果xの食い違う条件は
sを2進数に変換したとき循環小数になる場合に限られるが(もとの10進数のsはもちろん循環小数ではない
この食い違いは±DBL_MINを超えないから以下略
(結局x→s'変換はalmost_equal<T>()的な処理が必要にはなるが、適切にやれば
 sの整数部の文字列化 ==> x -= (xの整数部) ==> x *= 10、
 の反復を何時やめればよいか確定する

300:デフォルトの名無しさん
20/09/12 05:55:29.22 2ljmp3qW.net
>>294
やだという理由は>>279の後半部で言い尽くされとる

301:デフォルトの名無しさん
20/09/12 08:39:01.67 U5yMllJ4.net
sagemathで
a=0.11
QQ(a)
とすると
11/100
が得られる
aの実体はMPFRのオブジェクト
まーsagemathのソースでも見とけば

302:デフォルトの名無しさん
20/09/12 15:38:22.68 cDX1Q2rT.net
>>297
的外れ

303:デフォルトの名無しさん
20/09/12 15:47:40.14 JdE/Bv85.net
>>297
その前にリテラル表現→double値(お前が言うところのIEEE754の値)
という変換が入って、それが不可逆だから書き換えなしじゃ無理だっつってんだよ
Hoge(0.0)とHoge(0.00)に表現に応じた別の処理させるのはC++の範囲では不可能だ

304:デフォルトの名無しさん
20/09/12 15:50:40.29 cDX1Q2rT.net
プリプロセッサなら可能
Cの仕様

305:デフォルトの名無しさん
20/09/12 15:54:45.19 JdE/Bv85.net
ああ、#で文字列化できるからこの場合はできるのか忘れてた
まあ対象の浮動小数を全部マクロで括らないといけないからどっちみち書き換えは発生するけどな

306:デフォルトの名無しさん
20/09/12 15:56:41.81 cDX1Q2rT.net
おまえプリプロセッサが何か判ってないだろ

307:デフォルトの名無しさん
20/09/12 15:59:56.68 JdE/Bv85.net
ん?シンボルを文字列化する#演算子はプリプロセッサディレクティブの一つだぞ
何か間違ってるか?

308:デフォルトの名無しさん
20/09/12 16:08:00.10 idwadC/M.net
問題はそこじゃない

309:デフォルトの名無しさん
20/09/12 16:17:43.12 JdE/Bv85.net
絡んでくるだけで具体的な問題を指摘できないカスは置いといて
プリプロセッサフェーズの後で0.0と0.00を区別する方法はないから279君の望みは叶わないでFA
プリプロでもdouble x = 0.00;とかを自動で書き換えるの無理でしょ

310:デフォルトの名無しさん
20/09/12 16:19:33.34 idwadC/M.net
プリプロセッサを書けと言っている

311:デフォルトの名無しさん
20/09/12 16:28:52.93 erdZI+Jx.net
>>299
有理数の分母が10の冪という前提ならある程度の精度で出来そうだな。

312:デフォルトの名無しさん
20/09/12 17:27:31.95 JdE/Bv85.net
分母仮定せずに普通にディオファントス近似した方が誤差小さくなると思うんだけど

313:デフォルトの名無しさん
20/09/12 17:57:13.06 erdZI+Jx.net
10進リテラルで渡す前提なら分母が10の冪になってしまったら逆に誤差が大きいことになると思うが。
#約分とかは別として。
まぁ、1.0/3.0みたいなものも渡せるようにということなら確かにそうかも。

314:デフォルトの名無しさん
20/09/12 20:28:37.72 2ljmp3qW.net
とりあえずここまではできた;;
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=1233456699999999/10000000000000 // NG
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456788999999/10000000000000 // NG
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000

315:デフォルトの名無しさん
20/09/12 20:35:15.16 2ljmp3qW.net
わかったことは、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
において、s→xのところで仮数部最小桁で丸めがおきたのかどうかの情報が無いと
xからsの復元が難しいケースがあるというこっちゃorz
コンパイラならs→xをやるのは自分自身なので、x→s'を行うライブラリと手を握ってうまいことやれる可能性があるが
xを与えられるだけのユーザープログラムではこれは対処が難しい
Ad-hocに.999999 = 1とみなす系のAd-hocな処置が必要かも試練、

316:デフォルトの名無しさん
20/09/12 20:45:44.57 JdE/Bv85.net
だからさ
例えばそれでrt=1233456699999999/10000000000000になったとして
どうやって元の表現が123.34567だったって判断するのさ
本当に123.345699999999って書かれてた場合と区別できるわけないんだけどどうするの?
123.34567を123.345699999999に間違えるのはダメだけど逆は許されるの?どうして?どういう仮定置いてるの?
その辺を何一つハッキリさせないまま勝手にやられても
何がしたいのか全くわからない

317:デフォルトの名無しさん
20/09/12 20:52:26.12 EJqlmNG1.net
まぁそんな追い込まんでも
自分で手を動かしてダメっぽいことい気づいたのは立派だよ

318:デフォルトの名無しさん
20/09/12 20:53:34.39 U5yMllJ4.net
>>314
そのことを言ってるんだろ、
>>313の丸め情報が必要ってのは

319:デフォルトの名無しさん
20/09/12 20:54:09.24 2ljmp3qW.net
>>314
>本当に123.345699999999って書かれてた場合と区別できるわけない
思い込みが激しいお人じゃ…
123.345699999999はギリ仮数部で表現可能な桁数に収まっているから
これは123.34569とは明確に区別可能
ていうか実際のところできたわ;;
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=12334567/100000
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456789/10000000
x=123.345699999999: rt=123345699999999/1000000000000
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000

320:デフォルトの名無しさん
20/09/12 20:59:43.51 JdE/Bv85.net
そりゃ0.00002も差があれば区別できるに決まってるわな
いやまあ自分が書き間違えたのが悪いんだけど結局何が問題だか全く理解してないのね

321:デフォルトの名無しさん
20/09/12 21:00:56.75 2ljmp3qW.net
>>318
何が問題なのかではkwsk
wwwwwwwwwww

322:デフォルトの名無しさん
20/09/12 21:08:30.19 EJqlmNG1.net
0.500000000000000166533453693773481063544750213623046875
これできる?

323:デフォルトの名無しさん
20/09/12 21:09:20.40 JdE/Bv85.net
別のリテラル表現が同じdouble値(IEEE754の値)を示す時に何をもって正しいとするかという
お前の勝手な俺様基準を何も説明しないまま公衆の面前でガチャガチャやってることが問題なんだよ
わかれ

324:デフォルトの名無しさん
20/09/12 21:18:05.26 2ljmp3qW.net
>>321
>>272を嫁、
気体動作は明確はなず
これを読んでもわからず妥当な反論ができもしないというのであれば
読み手のセンスの問題と判断せざるおえない
>>320
>>297を嫁、
提示されたテストケースは(1)を満たしていないから範囲外

325:デフォルトの名無しさん
20/09/12 21:22:42.84 EJqlmNG1.net
いやいやそれでどやられてもw
> 10進数文字列s → IEEE 754の値x → 10進数文字列s'
> という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
> s == s'を保証可能
仮数部で表現可能かどうかってどうやって判定するわけ?

326:デフォルトの名無しさん
20/09/12 21:30:02.39 2ljmp3qW.net
うれしげにコード貼る、
URLリンク(ideone.com)
実行結果は>>317と同じ
>>313の問題があるから
0.999999(9の循環小数)を1.0と見なす処置を入れた結果、考えていたテストケースは全部通った。
結局、
 10進数文字列s → IEEE 754の値x → 10進数文字列s'
でs'が厳密なsの復元にならないケースがあるはずだがまだ見つかっていない。
ま、あったとしても有理数として解釈する上では数値としての大差は無いので問題ないはず、、、

327:デフォルトの名無しさん
20/09/12 21:33:35.13 2ljmp3qW.net
>>323
入力となる浮動小数点数を文字列として書いた時点でワカル
52 bitでまったく表現しきれない桁数なら(1)を満たさない
そうでなく、かつ(xE+s表記で与えたとして)指数sが極端に小さくなければ(xの桁数+sが-1022以上なら)(1)を満たす

328:デフォルトの名無しさん
20/09/12 21:40:34.66 JdE/Bv85.net
>>325
なんだ、仮数部で表現可能かのチェックのために結局20億行テストコードを文字列として解析する必要があるわけね
じゃあその時に文字列として扱うようにコード直せよ
どうせそういうスクリプトが必要なんだからついでにやればいいね、よかったこれで解決だ
あほくさ

329:デフォルトの名無しさん
20/09/12 21:43:09.42 EJqlmNG1.net
>>325
は?書く?
10億行のテストコードあんだろ?
それが(1)を満たすかどうか確認する必要があるんだろ?
だいたい仮数におさまってたら大丈夫ってそりゃそうだろよ
誤差が問題なのにそれを考えなくていいケースなんだもの

330:デフォルトの名無しさん
20/09/12 21:47:15.04 2ljmp3qW.net
>>326
>なんだ、仮数部で表現可能かのチェックのために結局20億行テストコードを文字列として解析する必要があるわけね
なんでそうなる必要があるのかkwsk、
10億行のテストコードは手入力なので52 bitで表現できないような桁数の数値は無いし、
とまれそこまで認識が進んだのであれば、あと何か言いたければ>>324のバグ探しでもしてちょんまげ
看板に偽りありを示すテストケースを指摘してくれたら大金星と言える

331:デフォルトの名無しさん
20/09/12 21:52:28.75 GweMiOHC.net
>ま、あったとしても有理数として解釈する上では数値としての大差は無いので問題ないはず、、、
ならRationalなんていらないね(´・ω・`)

332:デフォルトの名無しさん
20/09/12 21:58:02.93 JdE/Bv85.net
>>328
はあ?なんだそれ?
全部お前に都合がいいリテラルしか書いてない前提なんだったら、お前がさっきから書き散らかしてる落書きなんも必要ねえじゃん
話にならんわ下らねえ

333:デフォルトの名無しさん
20/09/12 22:03:02.47 2ljmp3qW.net
>>330
単体テストというのは真に走らせたいアルゴリズム(>>279)の単体テストのことであって、
別段IEEE 754から有理数への変換のエッジケースを書く必要は無いんである。
問題の所在自体を(よく読みもせずに)つついても無駄じゃよ
それよか何か言いたいのであれば>>324をデバッグ汁、

334:デフォルトの名無しさん
20/09/12 22:04:39.19 JdE/Bv85.net
あっはいどうでもいいです
(仮数部)/2^52に一番近い10^nを分母とする分数を探す簡単なさんすうの問題を解くだけの話だったんですね
がんばって

335:デフォルトの名無しさん
20/09/12 22:17:12.69 EJqlmNG1.net
手入力だから大丈夫ってのはお前しか判断できないよね?
成り立たない数字あげてもそれは手入力しないと言われるわけでしょ?
おれもあほくさくなった

336:デフォルトの名無しさん
20/09/12 22:28:23.42 MEMmSzVD.net
俺ぐらいの達人になると、もう初期段階で
「あ、これさわったらアカン人や・・」って雰囲気でわかるようになる


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch