X



C++相談室 part158
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2021/11/15(月) 19:34:54.43ID:Vm/7t1d8
前スレが在るのに後ろスレが無い。
0004デフォルトの名無しさん
垢版 |
2021/11/15(月) 22:07:48.56ID:Rt8JG1Np
Windows10でrecursive_directory_iterator使うと全角ファイル名が化けまくるんだけど
これwstringバージョンないよね
使い物にならないってこと?
0006デフォルトの名無しさん
垢版 |
2021/11/15(月) 23:03:16.81ID:Vm/7t1d8
江添さんもRustに行ってしまわれたか。
0007デフォルトの名無しさん
垢版 |
2021/11/15(月) 23:22:01.05ID:7YmnbmLD
なんにも確認してないがrecursive_directory_iteratorはpath扱うだけのはずで
wstring云々いいだすのがもう怪しい
0011デフォルトの名無しさん
垢版 |
2021/11/16(火) 10:09:17.13ID:1zCm/6d5
全世界の文字集めたらWORDじゃ足りないことくらいアメ公でなければすぐわかりそうだが
0012デフォルトの名無しさん
垢版 |
2021/11/16(火) 11:21:28.45ID:ZG22qfv2
>>11
でも、ハングル文字は、28文字しかないのに 5000ポイントも使っていたり、
元々文字じゃなかった絵文字を勝手に文字の様に扱ったりして行って
肥大化しただけで、世界の文字自体はそんなに多くない。
ユニコードの文字の扱い方に問題が有るんだと思う。
0013デフォルトの名無しさん
垢版 |
2021/11/16(火) 11:32:32.20ID:ZG22qfv2
>>12
ハングルは、子音、母音、パッチムは、それぞれ20〜30程度しかないが、
それを組み合わせて1文字に組み立てられているらしくて、組み合わせ爆発で、
1万1000文字を越える。
全ての組み合わせが使われているわけではない。
また、実際に使用される文字は2500文字ほどらしい。
表意文字である漢字は、どうしようもないが、単なる表音文字に過ぎない
ハングルに、Unicodeは、1万1000ポイント以上を割り当ててしまってる。

しかし、漢字も滅多に使わない文字を含めても1万5000文字くらいで、
アラビア文字も28文字くらいしかないそうだから、世界で使われている
本当の文字は、恐らく、4万文字もあれば足りるはず。

ユニコードが16BITで表しきれない以上に厄介なのは、UTF8で表現した時に、
50文字しかないひらがなまで 3バイトになっていること。
カタカナまであわせても100程度しかないのに。
さすがに、アメリカ人の傲慢さを感じざるを得ない。

こんな文字コードを一生使い続けると考えるとうんざりするので、
多分、これが終わりではないだろう。
むしろ、これで終わりにしてはならない。
0014デフォルトの名無しさん
垢版 |
2021/11/16(火) 11:40:54.61ID:ZG22qfv2
[追加]
ユニコードの文字数が多い点に関して:
・16BITで表現できない文字の大部分は絵文字。
・数学記号などは数学を扱う時に必須なのに、重要な数学記号が沢山不足している。
 つまり、非常に使用頻度が高い記号が含まれてない。
・逆にどうでもいいような変な遊びの記号などが大量に入っている。
 別にそれはグラフィックで書けばいいのに。

数学記号などは文書の中でも使えるし、学問的にも昔から良く使われているのに
なぜかユニコードには含まれてないものが沢山ある。
それに、呼び方や起源は同じでても、数学的には異なる意味を持つコードが1つに
割り当てられていたり、πが四角く表示されて、数学では絶対に使わないグリフ
になってしまっていたりする。
基礎的な数学まで知らないばかが考えたとしか思えないし、それが
何十年間も改善されてない。
ユニコードは欠陥コード。
0015デフォルトの名無しさん
垢版 |
2021/11/16(火) 11:45:03.78ID:ZG22qfv2
>>14
円周率の意味での「パイ」(PI)は、数学では必ず小文字で、かつ、丸みを帯びた
おなじみの記号を使い、決して、門構えのようなπは使わないし、
数学の本では見た事が無い。しかし、ユニコードではそれが標準になっており、
誰が使うのという感じがする。

もう一つは、φの記号。物理学で、磁束を表すのは、くるっと回るφ。
数学の空集合のファイは、ドーナツに棒を貫通させたようなグリフ。
しかし、ユニコードでは両者の区別が訳が分からないことになっていて、
困る。

あとは、⇔の記号が、横方向はあるが、縦方向が無いらしいこと。
これは最悪。
0016デフォルトの名無しさん
垢版 |
2021/11/16(火) 12:42:55.75ID:c8tWUMdh
空集合記号とギリシャ文字のファイを混同してるような無知に文句つけられてUnicodeも大変だな
0017デフォルトの名無しさん
垢版 |
2021/11/16(火) 13:52:17.07ID:5D9mKY7b
TeX
0020はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/16(火) 15:34:16.32ID:aaOD7qrs
そもそもが世界中の言語の発展は場当たり的な習慣の積み重ねを何千・何万年と続けてきてグダグダなんだから
それをどうがんばって整理しようとしたところでグダグダなんだわ。
元からグダグダだったのが Unicode のグダグダさとしても表れてきただけ。
言語ごと作り直しでもしない限り綺麗な符号体系にならないんで、
グダグダさと折り合いをつけてつきあっていくしかしょうがない。
0023デフォルトの名無しさん
垢版 |
2021/11/16(火) 15:37:58.58ID:Z1xN+BQU
>>18
数学の空集合の記号とは違ってる。
どうせ、パイ(π)は四角い変なグリフで、数学では絶対使えない。
0025デフォルトの名無しさん
垢版 |
2021/11/16(火) 15:56:48.89ID:c8tWUMdh
>>21
Greek PhiはU+03A6(大文字)・U+03C6(小文字)・U+03D5(数学用シンボル)
Empty setはU+2205
全く別のコードポイントが割り当てられてるし、>>19の資料でも全く別の文字として議論されてるけど
何を見て何がどう区別されてないと思った?
0026デフォルトの名無しさん
垢版 |
2021/11/16(火) 17:48:24.19ID:/uf4lfZV
unicodeで一番困るのがソート
単純にコードの大小でソートするとおかしな事になるからな
0027デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:13:59.22ID:G/HDu5Xp
>>25
調べてみたが、そもそもグリフが安定していないから数学では使えない。
数学ではグリフによって意味を分けているから。
0028デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:21:08.03ID:G/HDu5Xp
そもそも、数学では縦棒が斜めになっているか、縦になっているかでもニュアンス
が違うことがある。
特に空集合の場合、斜めになっていないと、普通の数学的な感覚には
合わない。完全に垂直だと駄目だ。
それに、イタリック体と普通のプレインな書体も、明確に区別できるようになって
ないと、プログラムの本でも使えない。
たとえば、BNFなんかでもそう。
遊びでグリフを変えてもらっては使い物にならない。
後は、カンマの横幅を勝手に狭くするのはプログラマー泣かせ。
カンマは飾りじゃなくて、あるのと無いのとでは大違いだし、
ピリオドと完全に区別できなくてはならないのに、狭すぎて連続した
場合に、フォントが小さい時、非常に判別しにくいことがある。
フォントを作る人は大学以降の数学や物理学に詳しい人に絶対に
聞いて欲しい。
0029デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:25:30.84ID:G/HDu5Xp
Appleのスティーブジョブスのせいで、プロポーショナルフォントが多くなり。
それをIDEなんかでも使う馬鹿(=MSのプログラマ)がいて、もうアホかと。
空白は有るのかないのか分からないし、からの「〜」が、上の方にある
チルド~に見えたり、カンマは狭すぎていくつあるのか数えられない、
円周率のπは、数学では決して使うことのない門構えのようなグリフだし。
遊びで変えるな。
芸術ではないんだ、厳密に区別しないといけないんだ、プログラムも
数学も。
0031デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:42:34.64ID:c8tWUMdh
コードポイントとグリフとフォントの区別すらついてない無知蒙昧丸出しで
よくもまあそんな意味のない長文を恥ずかしげもなくグダグダ書き散らかせるもんだ
その度胸だけは褒めたるから、Unicodeに物申す前に基礎から勉強しろよ
0034デフォルトの名無しさん
垢版 |
2021/11/16(火) 19:02:52.69ID:nSspXH9s
>芸術ではないんだ、厳密に区別しないといけないんだ、プログラムも
>数学も。
フォントとグリフと書体をこちゃ混ぜにしてる人間がこれ書いてんのギャグだなw
0036デフォルトの名無しさん
垢版 |
2021/11/16(火) 19:44:20.16ID:LLUTRYIZ
ユニコードを内包する世界最大の文字集合がGB18030。
0039デフォルトの名無しさん
垢版 |
2021/11/17(水) 09:42:16.28ID:PyX7rfdm
>>36
ハングルを3000文字くらいと、コンポジションに落とし込めなかったのは人類史における、、、まーいーや終わったことだ。
まぁMacでファイル名読むと「パ」が「ハ」と「゜」に割れてマジビビったけどな。
0041デフォルトの名無しさん
垢版 |
2021/11/17(水) 15:31:08.88ID:R6z6I769
>>27
Unicode は言語情報を保持しない。
いわゆる中華フォント問題が起こるのはテキストだけからは日本語フォントを適用すべきなのか
中国語フォント (あるいは他の言語) を適用すべきなのかわからないからで、
そのあたりはアプリケーションレイヤで解決する想定になっている。

文字の形が重要なアプリケーションでそれができてないなら単にアプリケーションがカスってだけ。

ギリシャ文字のパイと数学記号のパイも個別に符号を割り当てるべきではないが、
Unicode は既存の文字コードを統合することという要件が現実問題として有るために
既存の文字コードで区別している例があると区別せざるを得ない。

文字コードとしての理想の姿と、
まずは皆が Unicode という規格に載ってこないと理想もクソもねぇという板挟みがある。
0044デフォルトの名無しさん
垢版 |
2021/11/17(水) 22:47:12.58ID:+aW7NpDL
Unicodeとか文字とグリフの区別がぐちゃぐちゃになりつつあるとい
う印象、ど
うしてこうなった?!
0045デフォルトの名無しさん
垢版 |
2021/11/18(木) 00:03:15.71ID:Sx+E3gZ7
>>41
いや、円周率を、パイという記号で表すのは中学生でも知っている訳で、
あのおなじみの形状が安定して表示できない段階で文字コードとして終わってる。
文字数の制約があるならまだしも、誰も使わないような漢字や、その場しのぎの
ふざけた記号が大量に含まれているのに、円周率という誰でも知っていて
記号が絶対にあの記号で無ければ伝わらないものに対して、ちゃんとした
記号が安定したコードポイントにはどこにも割り当てられてないのは
大問題。
中国語の文字と日本語の文字の違いよりも影響はずっと大きい。
0046デフォルトの名無しさん
垢版 |
2021/11/18(木) 00:17:21.61ID:ypdX2Kse
いいかげんにしろよ
・見た目を決めるのはフォントの仕事であってUnicodeのコードポイント割り当てに文句付けるのはお門違い
・そもそも数学記号用のコードポイントはギリシャ文字とは別にちゃんと割り当てられてる(Mathematical Alphanumeric Symbols)
・ここはC++スレだスレ違い消えろお前の巣はこれだ→https://mevius.5ch.net/test/read.cgi/tech/1593777227/
0047デフォルトの名無しさん
垢版 |
2021/11/18(木) 01:08:04.34ID:Sx+E3gZ7
>>46
実際にはちゃんと割り当てられてない。
しかも、フォントの仕事である、と切り分けるのも問題。
というのは、現実に、円周率としては決して使っては成らない
おかしなフォントがパイの自に割り当てられていて、それを回避する方法が
ない。なので、まともなパイのフォントを自作するか、画像ファイルを
用意して画像を挿入するしか方法が無い。
0049デフォルトの名無しさん
垢版 |
2021/11/18(木) 01:36:35.92ID:Sx+E3gZ7
>>48
まず、円周率の記号は、ギリシャ文字のパイならなんでもいいというわけではないこと
を文字コードやフォントを作ってる人が理解することから始めなければならない。
また、数学で同値記号で使う矢印は矢印だったら何でも良いという訳ではなく、
左右と上下の区別と、二重線か一重線かという好みの問題も含めて、
固定的なフォントでなくてはならない。二重線の場合、中は白抜きでなくては
ならないので、決して塗りつぶすべきではない。

そういうことを理解してない人が文字コードやフォントを作る資格はないのに、
アメリカ人はそれをやってしまってる。アメリカ人は何もかもおかしい。
クラフトマンシップが無い。
0050ハノン ◆QZaw55cn4c
垢版 |
2021/11/18(木) 01:40:47.32ID:MiW85JEr
>>49
アメリカ人が悪いわけではない、数学者を文字コード制定に加えなかった馬鹿どもがアメリカ人の中にもいる、というだけ、それがどのような属性の人間か容易に推測できるだろう?
というか、TeX をそのまま持ってこればいいだけの話なのにそれすらわからないのは、どういったわけなんだ?
0052デフォルトの名無しさん
垢版 |
2021/11/18(木) 01:47:08.17ID:Sx+E3gZ7
>>50
あなたは、物を知らない。
TeXも実はあまり綺麗ではないし、日本で標準に使われていた数学記号を表示しにくい。
最初、同値記号が長すぎたり、左右方向しかないことにまず、つまずき易い。
回避作が全く無いわけではないが。
近似的に等しいの記号も、日本で馴染みのある上下に点々を打つものは表示しにくい
とかもあるし。
円周率のパイと空集合はさすがに表示できるが。
0053デフォルトの名無しさん
垢版 |
2021/11/18(木) 01:48:39.42ID:Sx+E3gZ7
日本人が作っていたソフトには、良いソフトが多かった。
アメリカ人がそれを潰した。
というか、日本人が日本製のソフトを買わない。
例え良いソフトがあっても。
わけが分からん。
0054ハノン ◆QZaw55cn4c
垢版 |
2021/11/18(木) 02:04:24.47ID:MiW85JEr
>>52
≒ \risingdotseq \fallingdotseq
⇔ \Leftrightarrow
上下方向同値は、なければないでなんとかなるのでは?
0055デフォルトの名無しさん
垢版 |
2021/11/18(木) 02:12:19.27ID:G3Aynww3
数学数学うるさいくせにいつまでも用語使いがいい加減なままなのはどういうわけだ
そろそろ文字・記号・文字コード・コードポイント・グリフ・フォント・書体の定義くらい理解して使い分けろよ
0056デフォルトの名無しさん
垢版 |
2021/11/18(木) 02:23:27.66ID:Sx+E3gZ7
>>55
グリフとフォントの違いはいくら調べても、あまり分からなかった。
コードポイントは分かる。
しかし、コードポイントに単にギリシャ文字の「パイ」を割り当てていても、
円周率用におなじみのパイであるとは限らず、実際にWindowsでは、門構え
のような変な文字になってしまってる。
そして、それを回避するのは難しい。
0057デフォルトの名無しさん
垢版 |
2021/11/18(木) 02:26:19.78ID:Sx+E3gZ7
字体と字形は違うという話もある。
漢字の場合は確かにそうかもしれない。
しかし、数学では最後の形が重要だから、最後の最後の最後の画面上に表示される
グラフィックが、数学の習慣にぴったり一致してなければ駄目。
0058デフォルトの名無しさん
垢版 |
2021/11/18(木) 07:48:03.24ID:R1PabgqQ
円周率にギリシャ文字のπを充てた数学が悪い、数学は俺々円周率記号を作るべきだった
って言ってる?
0060デフォルトの名無しさん
垢版 |
2021/11/18(木) 09:43:04.76ID:RYwZiL19
コードは別れてるのだから、あとはデザイナの問題、フォント使用者の問題だろ
外人が作ったフォントの"ゐ"の字が"い"と同じだったからunicodeに"ゐ"の字を安定的に出せるようにしろっていうのはお門違い
0062デフォルトの名無しさん
垢版 |
2021/11/18(木) 10:01:42.33ID:SHW/gJRC
おっぱいに興奮するのは正常な性欲で変態じゃないぞ
あ、変態から見るとノーマルが変態なのかw
0063デフォルトの名無しさん
垢版 |
2021/11/18(木) 11:08:33.41ID:/He/baLS
うちのπは変換選択中は数学記号のπで一覧に出てるんだが変換確定すると門構えのπになるなω
アプリのフォントとIME(FEP)のフォントが違うんだろうなωωω
0064デフォルトの名無しさん
垢版 |
2021/11/18(木) 11:10:13.05ID:/He/baLS
秀丸なら数学用のπだし
メモ帳だと門構えのπだったわ
TeX使ったらどうでもよくなるけど
0065デフォルトの名無しさん
垢版 |
2021/11/18(木) 11:17:33.47ID:/He/baLS
とりあえず
メイリオは糞π
MS Gothic は 数学用π
MS 明朝は 数学用π
みかちゃん ぎりぎりセーフ
Migu 1M 数学用π
IPAex Gothic 数学用π
IPAex 明朝 数学用π

んーいまのところだめなのメイリオだけだなω
0067デフォルトの名無しさん
垢版 |
2021/11/18(木) 11:57:56.18ID:/He/baLS
>>56
>それを回避するのは難しい。

えっ?
0068デフォルトの名無しさん
垢版 |
2021/11/18(木) 17:51:51.89ID:hyycWvP/
using namespace std;
するのとstd名前空間内の各エンティティについて
using std::foo;
するのに違いはありますか?
0069デフォルトの名無しさん
垢版 |
2021/11/18(木) 21:59:19.03ID:asQz6rBs
はい。前者は std 内全部の名前が修飾なしで使えるようになりますが、後者は指定したものだけになります。
0070デフォルトの名無しさん
垢版 |
2021/11/18(木) 23:09:08.75ID:tPrhQHc6
明朝体とかゴシック体がフォント
明朝体で書かれた「あ」とゴシック体で書かれた「あ」は異なるグリフの「あ」
文字としては同じ

ということのはずだがユニコードはぐちゃらけてしま
tったど
うしてこなうった!?
0071デフォルトの名無しさん
垢版 |
2021/11/18(木) 23:11:14.48ID:tPrhQHc6
ググったらJISで「♯」と「#」が異なる文字だからユニコードでも元に戻せるように異なるコードにしているとか
ワケワカメ
一昔前の似たような文字を同じコードにする方針な美しいユニコードはどこいった……?!
0073デフォルトの名無しさん
垢版 |
2021/11/19(金) 00:01:43.17ID:bln5kEpJ
>>71
シャープとナンバーサインは違う記号で違う意味でしょ。
カタカナの「ロ」と漢字の「口」まで統合されかかったというエピソードもあるんだが、
そういうのが Unicode の美しさだと思うか?

何を以て「似たような文字」とするか文字に対する考え方というのは
それぞれの文化によるによるので既に確立している符号体系を尊重するのは合理的な方針なんだよ。
歴史的経緯を切り捨てられないのは不格好だが逆に言えば既存の不格好さを継承する程度で済む。
0077デフォルトの名無しさん
垢版 |
2021/11/19(金) 11:12:38.26ID:eyeX0xyM
♯include は動かない方が良い
\ も mac だとやばい \ があるらしいなω
0078デフォルトの名無しさん
垢版 |
2021/11/19(金) 11:14:02.03ID:eyeX0xyM
codepadだかideoneだかが
\nを勝手に半角の¥nにしてコンパイル通らなくて可笑しいときがある
0079デフォルトの名無しさん
垢版 |
2021/11/19(金) 11:30:01.23ID:IBPJGhlA
>>77
素人丸出しだからそのへんでやめとけ
\が(過去の経緯で)本来あるべきグリフで表示されないのはwindows(日本語設定時のみ)のほう
0080はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/19(金) 13:02:30.99ID:bln5kEpJ
JIS X 0201 (7ビット及び8ビットの情報交換用符号化文字集合) による。
JIS X 3010 (プログラミング言語C) の中でもスラッシュとチルダが JIS X 0201 では円記号とオーバーラインに
置き換えられる旨の補足情報が書かれている。

つまり Windows の挙動は日本の (文字コードに関する) 規格を尊重した結果だし、C の JIS 規格でもちゃんと言及している。
とはいえ ISO/IEC 9899 に反する事情があるからこそ日本の規格 (JIS) にするにあたって補足を入れる必要があったわけで、
「本来あるべき」から遠いのは確かに Windows のほうとは言える。
0081デフォルトの名無しさん
垢版 |
2021/11/19(金) 14:07:51.51ID:eyeX0xyM
>>79
知ってると思うが
これの話なんだが
http://codepad.org/WsmFWVty
#include <stdio.h>

int main()
{
printf("abc\n");
return 0;
}
0085デフォルトの名無しさん
垢版 |
2021/11/19(金) 18:47:23.14ID:P2N6jWZN
WindowsのvisualC++2019でDLLのロードが出来ません
dll defからlibをつくり#pragma comment( lib, "sample" )とやればできた記憶なんですが
64bitのバージョンも全部合わせてあるんですが
10年ぶりにやったら動きません
ボーランドC++だと修飾名が変わってdefを書き換えたりはあったと思うのですが

> error LNK2019: 未解決の外部シンボル sqlite3_open
008685
垢版 |
2021/11/19(金) 18:53:32.17ID:P2N6jWZN
自己解決しました
dumpbin.exe /exports コマンドでdefファイルを作成した場合、
EXPORTS の記述がなかったからでした
0087デフォルトの名無しさん
垢版 |
2021/11/20(土) 00:18:32.03ID:KMJ1ohr2
>>81
エスケープを円で覚えてるからそんな間抜けな間違いするんだよ
ブログラマならエディタの設定変えとけ
0089デフォルトの名無しさん
垢版 |
2021/11/20(土) 11:48:10.21ID:DTIeq0Vp
>>87
ブログラマってなにかの隠語?
0090デフォルトの名無しさん
垢版 |
2021/11/20(土) 12:05:58.69ID:T1SqYaku
ナニナニ
    彡⌒ ミ ナニナニ
   (´・ω・`) 彡⌒ミ
,彡⌒ 彡⌒ ミ (・ω・`) また文字コードの話?
(´・ω(´・ω・`) ⌒ ミノ⌒ミ
  u_| ̄ ̄||´・ω・`)ω・`) マター?
 /旦|――||// /|と ノ
 | ̄ ̄ ̄ ̄ ̄| ̄| . |-u
 |_____|三|/
0092デフォルトの名無しさん
垢版 |
2021/11/21(日) 03:33:39.04ID:yh1CvOcy
実際C++プログラマはハゲが多いんだから別にいいだろう
教祖からしてハゲなんだし
0094デフォルトの名無しさん
垢版 |
2021/11/21(日) 17:11:36.41ID:BwaLJwgU
Greek PhiはU+03A6(大文字)・U+03C6(小文字)・U+03D5(数学用シンボル)
Empty setはU+2205
全く別のコードポイントが割り当てられてるし、>>19の資料でも全く別の文字として議論されてるけど
何を見て何がどう区別されてないと思った?
0095デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:56:14.20ID:MSJBJTi1
プログラミング言語の世代論というのがあって、
第一世代は CPU のアーキテクチャべったりの機械語、
第二世代は機械語が解る人間向きの低級言語、
第三世代は自然言語寄りの高級言語、
第四世代は目的型言語、
…… で、いわゆる「第五世代」は、コンピュータの都合じゃなくて
人間の都合に合わせようよ、というコンセプトになった。
「じゃあ、どのあたりから始めるか」という話は
ありそうに思う。
0096デフォルトの名無しさん
垢版 |
2021/11/21(日) 22:09:51.70ID:jS7RYefb
>>79
素人丸出しとか言ってるが
実際macだと設定によってはバックスラッシュと同じ扱いにならない\が
普通にキー叩いたら出るんだぞ
0098デフォルトの名無しさん
垢版 |
2021/11/21(日) 22:42:33.87ID:zasxIKRm
普段からU+005Cのグリフがバックスラッシュになってるフォントしか使わないから円記号に違和感しかない

そりゃ個人の自由だけどプログラミングしてるなら少しフォントにこだわってもいいと思う
0102デフォルトの名無しさん
垢版 |
2021/11/22(月) 12:12:11.62ID:buYIHjVZ
人を下に見られる程精通してる人って正直羨ましいわ
知れば知るほどまだまだ知らない事が沢山あるなぁと勉強不足を実感してしまう

知らないから人をバカに出来るんだよなー

むしろ人を下にみないと精神状態が不安定なんでしょ
0105デフォルトの名無しさん
垢版 |
2021/11/22(月) 19:04:02.58ID:aHjY0LXr
ヘッダファイルで変数の宣言するとき、引数付きのコンストラクタ使おうとするとコンパイルエラー出るんですけどこの書き方って良くないんですか?
0106ハノン ◆QZaw55cn4c
垢版 |
2021/11/22(月) 19:08:25.29ID:f9+TjGGq
>>105
ヘッダだからエラー、というわけではないです
ヘッダじゃない普通の cpp に書いてもエラーなのでは?
具体的にソースを示してください
0107デフォルトの名無しさん
垢版 |
2021/11/22(月) 20:43:52.70ID:aHjY0LXr
>>106
// NG ヘッダにそのまま書こうとすると型指定子が必要ですとエラーが出る
private:
MenberLibClasse obj ("piyopiyo");

// OK ヘッダには引数なしで宣言した後、cppでobjをメンバに持つクラスのコンストラクタの初期化子リストを使うと何故か通る
private:
MenberLibClasse obj;
Class() :obj ("piyopiyo") { }

挙動把握しきれないんですけどライブラリ側の問題でしょうか??
0108ハノン ◆QZaw55cn4c
垢版 |
2021/11/22(月) 20:50:48.90ID:f9+TjGGq
>>107
NG のときのエラーの内容は?
エラーメッセージを貼ってください、正直、よくわかりません
0112デフォルトの名無しさん
垢版 |
2021/11/22(月) 21:04:04.13ID:jXuEZ/Sz
型指定子が必要って言われるのは
関数宣言と見られていて
仮引数の場所にリテラルがあるってことだ
0113デフォルトの名無しさん
垢版 |
2021/11/22(月) 21:13:00.22ID:aHjY0LXr
>>111
イコールはダメで波括弧に変えたらコンパイルできました
0115デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:03:46.80ID:gucWMAFN
>>99
using namespace std::chrono;

// 現在時刻を取得
system_clock::time_point tp = system_clock::now();

// 現在時刻のミリ秒部分を取得
auto msec = duration_cast<milliseconds>(tp.time_since_epoch()).count() % 1000;

みたいなことをやると良い最後のまmillisecondでもsecondでもnanosecondでも逝ける

こないだ死ぬほどやり倒すた、

しかしずんねんながら現状MSVCのstd::chrono::zoned_timeが未実装のため、

システム時刻関連処理についてstd::chronoの利用を断念すた、orz
0116デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:16:45.51ID:gucWMAFN
なおtime_point同士で引き算もできる
結果を具体的時間単位の時間表現にするのは同じくduration_cast<T>()
0117デフォルトの名無しさん
垢版 |
2021/11/23(火) 10:20:15.57ID:wZOweAJh
ostringstream の precision の上限がなぜか 255 に設定されているようで
mpreal big("1000桁規模の浮動小数点数");
ostringstream ss;
ss.precision(1000);
ss << big;
とすると ss に 255 文字程度しか入らないのです
cout.precision(1000);
cout << big;
だと 1000桁出ます
ostringstream の precision の上限をもっと大きくする方法はありますか?
0123デフォルトの名無しさん
垢版 |
2021/11/23(火) 13:42:01.58ID:X+sq98An
再現しそうな最小限のコードだけ描いて
mingw + gcc でコンパイル&実行したら期待通りの動作をしたが
VC だとやっぱり上限があるっぽい動きになってる
rdbuf() 使いつつ seek() すれば大丈夫かも知れないが
自分の使い方が間違ってるだけだと思いたい
0126デフォルトの名無しさん
垢版 |
2021/11/23(火) 15:22:40.52ID:V3fVQTwt
クラスのメンバ変数が全部intとかdoubleとかで足し算掛け算ができるものの場合に、
クラスの足し算掛け算を各メンバ変数の足し算掛け算として定義したいのですが
operator +とかoperator *のオーバーロードでメンバ変数について一個ずつ書いていく以外の方法ありますか?

今やろうとしていることでメンバ変数が多いので、いちいち列挙せずに済むなら便利だなと思ったのですが
0130はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/23(火) 17:34:18.50ID:VSfhJ4CF
>>126
現在の C++ はリフレクション系の機能が弱くてクラスからデータメンバを列挙するというようなことは出来ない。
「全てのメンバに対してやってくれ」というようなことはできない。
ただ、対象となるメンバを取り出すものさえ用意すればそれを様々な演算に適用することは可能だと思う。
つまり、メンバの列挙を一度で済ませる (なんども列挙しなくてよい) ことは出来るかもしれないってことね。

とはいえそれはそれで割とクソめんどうくせぇメタプログラミングの下準備が要るので
いっそ列挙しまくったほうが簡単かもしれん。
0132デフォルトの名無しさん
垢版 |
2021/11/23(火) 23:10:58.29ID:G9Rlesey
>>121
駄目なんじゃないかと思う
std::chronoはtime_pointを抽象化してタイムゾーンの異なる時刻間の差分を自動で取り扱いたい(そういう思想な)はずで、
ということはローカルタイムを扱う手段としてzoned_timeは無くてはならないピースとみなさざるおえない

どうしてもというならstd::chrono::system_timeを経由して古き良きtime_tとtime_pointの相互変換ができるから、
time_tまで降りてローカルタイムにしてtime_pointに戻す手はあるが、それをすると
同じtime_pointクラスで表される2種類のシリアル時間がプログラム内に生じてしまうから、
std::chronoの上記思想(時刻の差分や比較を自動で安全に取り扱いたい)が破壊される

ライブラリ仕様の理想が高邁すぎるか実装側の怠慢によって大事な用途において糞ライブラリになってしまっている例
0133デフォルトの名無しさん
垢版 |
2021/11/23(火) 23:41:07.98ID:mX+uwseB
何が出来ないと言っているのかまるで分からん
出来る部分と出来ない部分の切り分けがいるんでないの?
0134デフォルトの名無しさん
垢版 |
2021/11/24(水) 00:03:21.95ID:EdXujyLt
time_point(事実上UTC)とローカルタイムの相互変換がstd::chronoが思想的に目指しているほど安全にはできない
zoned_timeが実装されない限り

time_point(事実上UTC)同士の比較や差分はzoned_timeが実装されてないバージョンでも安全にできる
0137デフォルトの名無しさん
垢版 |
2021/11/24(水) 00:39:36.48ID:EdXujyLt
std::chronoで現在時刻を取得する一番自然な方法は、
 system_clock::time_point now = system_clock::now();

他にもtime_tからの変換という方法があるが、いまさらtime_t使え言うぐらいならstd::chrono使わずにtime_tだけ使うは;;;

で、nowはどう見てもUTCであるから、日本時間を知りたければ、
上記time_point nowが日本時間の何年何月何日の何時何分何秒なのかを出力できねばならない
std::chronoの中にはzoned_timeを使わずにそれをやる手段が見当たらない
0139デフォルトの名無しさん
垢版 |
2021/11/24(水) 01:06:29.20ID:HKyZluCV
>>99で聞かれてるのは「日時を数値に変換」だろ?
前提も条件も全部曖昧で、自然とか思想とか思い込みばかり
何を使うと何が出来て何が出来ないを全く説明してない
0142デフォルトの名無しさん
垢版 |
2021/11/24(水) 03:00:57.55ID:P1gN11rG
ローカル時刻かUTCか以前の問題として、そもそもどんなフォーマットで数値に変換するのか
それが不明だったから誰も回答しなかったのだろうに

あとドキュメント信じる限りじゃzoned_timeはVS2019 16.10から使えるってよ
0144デフォルトの名無しさん
垢版 |
2021/11/24(水) 03:08:01.30ID:Q5JPayEq
>>142
>>100 が悪い
0147デフォルトの名無しさん
垢版 |
2021/11/24(水) 07:01:18.14ID:xQvD3wWY
確かにchronoは今一だね
filesystemはthread, iomanipとの連携が悪すぎ
使いにくいったらありゃしない
0152デフォルトの名無しさん
垢版 |
2021/11/24(水) 10:46:50.00ID:kXzWnsgO
何がしたいんか知らんけど
auto p = [](){};
auto p = []()->void*{};
auto p = []()->void{};
本人の意図が判らんことには絶対に正解に辿り着けない質問大杉
0153デフォルトの名無しさん
垢版 |
2021/11/24(水) 11:11:35.49ID:xQvD3wWY
void func1(void*);
void func2(){}
func1(func2);
のようなことをしようとしてて怒られるから
func1((void*)func2);
にしてた

で、func2で名前空間を汚染したくないから
stateless-lambda使おうと思った
0154はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/24(水) 11:25:51.06ID:nY9AsqgQ
関数 (関数ポインタ) を void* で受ける雑なことをしといて名前空間を汚すのは気にするのか。
まあフレームワークとかの側でそうなってたら仕方ない場合もあるけど……。
0156デフォルトの名無しさん
垢版 |
2021/11/24(水) 11:41:52.30ID:kXzWnsgO
auto p = []()->void*{return NULL;};
↑これはOKだが
auto p = []()->void*{};
↑こっちはコンパイルエラーにして欲しいよね
0157デフォルトの名無しさん
垢版 |
2021/11/24(水) 11:48:13.06ID:jtZYcQVF
単にステートレスラムダを関数ポインタに変換したいならこういう有名なハックがある
auto p = +[]{};
0159デフォルトの名無しさん
垢版 |
2021/11/24(水) 12:55:27.21ID:xQvD3wWY
ポインタに単項プラスなんぞ考えたこともなかった
void test(char* p)
{
cout << +p << endl;
cout << *+p << endl;
cout << *(0+p) << endl;
cout << 0[p] << endl;
}
0162デフォルトの名無しさん
垢版 |
2021/11/25(木) 09:42:14.59ID:r5Heuy4P
C++11 や C++17 や C++20 とかどのオプションでコンパイルされているかを
コンパイル中に判断したいのですが
ソースコード中にどう書けばよいのですか
0165デフォルトの名無しさん
垢版 |
2021/11/25(木) 11:00:47.97ID:nZfwh6w7
>>161
#include <iostream>
#include <cstdio>
int main() {
int a[] = {1, 2, 3, 4};
std::printf("%p %p\n", &a, &a + 1);
std::printf("%p %p\n", +a, +a + 1);
int (*p)[4] = &a;
std::printf("%p %p\n", p, p + 1);
int *q = &a[0];
std::printf("%p %p\n", q, q + 1);
return 0;
}
0x7ffd548f5d00 0x7ffd548f5d10
0x7ffd548f5d00 0x7ffd548f5d04
0x7ffd548f5d00 0x7ffd548f5d10
0x7ffd548f5d00 0x7ffd548f5d04
つまり&a[0]と書くのを+aと書くだけですませられる
どっちが分かりやすいかはさておき
0168デフォルトの名無しさん
垢版 |
2021/11/25(木) 13:18:45.98ID:U2fItJ5c
>>165
<iostream>いらないね

それとlvalue transformationがかかる場面で
わざわざ単項プラスを使う必要性が
そのサンプルでは示せてないようだが
0172デフォルトの名無しさん
垢版 |
2021/11/27(土) 03:24:08.24ID:ymghmbi1
The following macro names shall be defined by the implementation:
__cplusplus
The name __cplusplus is defined to the value 199711L when compiling a C++ translation unit.

G++ now sets the predefined macro __cplusplus to the correct value, 199711L for C++98/03, and 201103L for C++11.

http://gcc.gnu.org/gcc-4.7/changes.html
But g++ < 4.7.0 is __cplusplus defined alway 1.

https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
0179デフォルトの名無しさん
垢版 |
2021/11/28(日) 21:05:38.19ID:6joWVJIB
C++でblas, lapackを使うのにいいインターフェースってどれでしょうか?
調べてたらCppLapack, Lapack++、armadillo とか出てきましたが、定番さとか使いやすさとか教えていただけると嬉しいです

とりあえずは複雑なことはしない予定で、行列の掛け算とか対角化ぐらいが簡潔に書けると嬉しいです
0180デフォルトの名無しさん
垢版 |
2021/11/29(月) 00:38:26.49ID:UEkaTEcQ
久しぶりにC++再開したが
昔からだが
PHPはC++のスクリプト版といえるかのように文法・関数が似てるから
プロトタイプをPHPで作成したほうが時短になるかと?
仮想コードによるアルゴリズムの記述やフローチャートなどに近い
0181デフォルトの名無しさん
垢版 |
2021/11/29(月) 00:43:30.91ID:UEkaTEcQ
行列の掛け算とか対角化ならPythonかマキシマでいいとおもうが?
大規模だともしかしたらC++のほうが早いかもしれないが
PythonだとGoogle ColaboratoryとかでGPUをネットワーク使用できたりするが



Colaboratory とは
Colaboratory(略称: Colab)は、ブラウザから Python を記述、実行できるサービスです。次の特長を備えています。
環境構築が不要
GPU への無料アクセス
簡単に共有
https://colab.research.google.com/notebooks/welcome.ipynb
0185デフォルトの名無しさん
垢版 |
2021/11/29(月) 14:27:16.33ID:Afxc3rI9
>PHPはC++のスクリプト版といえるかのように文法・関数が似てる

迷惑するから出鱈目言うな
0186はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/29(月) 14:43:58.00ID:cgXmRWbT
因果が逆だろう。
似た使い方しかしない人間にとっては似て見えるということもあるんだろうさ。
0188デフォルトの名無しさん
垢版 |
2021/11/29(月) 15:15:20.73ID:zo5XubVi
制御構文が似ていれば似ているように見える人というのは一定数いる
それしか使わないから
0189デフォルトの名無しさん
垢版 |
2021/11/29(月) 15:19:08.39ID:LzdsKRCS
C++のこともphpのことも両方ニワカじゃないとなかなか出てこない発言
昨日今日入門書めくってるくらいのレベルじゃないとなかなかできない発言
0190デフォルトの名無しさん
垢版 |
2021/11/30(火) 09:50:00.96ID:abbimJAH
template<class T>
void f(T x) {
auto a = x, b = 0;
}

f(0.0);

これgccだとコンパイル通るけど規格的にはダメだよね?
0191デフォルトの名無しさん
垢版 |
2021/11/30(火) 09:57:35.75ID:+4eAilPB
ok
0196デフォルトの名無しさん
垢版 |
2021/11/30(火) 11:18:37.50ID:rIKeeiBO
https://eel.is/c++draft/dcl.type.auto.deduct#def:placeholder_type_deduction
For a variable declared with a type that contains a placeholder type, T is the declared type of the variable.

https://eel.is/c++draft/dcl.spec.auto.general#7
The type of each declared variable is determined by placeholder type deduction, and if the type that replaces the placeholder type is not the same in each deduction, the program is ill-formed.

Draft これでいいか分からんけど、多分ダメですね
a と b は個別に型推論して、同一でなかったら ill-formed であると読める
0202デフォルトの名無しさん
垢版 |
2021/11/30(火) 13:38:43.96ID:rrAtEbdN
C++とPHPが似てないというニカワかと?
Pythonやルビーやjavascriptよりも似てるだろ?
C++にある関数をそのままPHPでも使えるようにしてあるのが多いし
0204デフォルトの名無しさん
垢版 |
2021/11/30(火) 14:06:04.92ID:+4eAilPB
>>202
そんなだから馬鹿って言われるんだ
0205デフォルトの名無しさん
垢版 |
2021/11/30(火) 18:50:06.68ID:5lYBSuU/
C++Builder使った後にVisual Studio使って、
二層作ったらC++Builderがめちゃくちゃ簡単で
作りやすかったんですけど私の感覚、何か変?
Visual Studioより効率いい気がしました。
0207デフォルトの名無しさん
垢版 |
2021/11/30(火) 19:37:40.43ID:TJjyIr2u
普通はRust使うよね。
0211デフォルトの名無しさん
垢版 |
2021/11/30(火) 21:27:19.33ID:32XX4NDe
うちでは2000年以降のborlandはそれ以前に開発されたものの保守以外で使用することはなかったから
2000年以前でもほぼMSVCの独壇場だった
0213デフォルトの名無しさん
垢版 |
2021/12/01(水) 23:25:36.03ID:toM1ybPg
>>14
数学記号増やしたところで、数学記号はレイアウトの問題がかなりついて回るのであまり意味ないと思うけどなあ。2^2^2^2とか、定積分とか、分数とか表現できないでしょ。
そういうのは組版の問題。
まあ、たしかにイタリックのxとかはあるのに、イタリック(?)のπはないとかは、中途半端な気はするけどね。
0214デフォルトの名無しさん
垢版 |
2021/12/02(木) 08:09:16.16ID:5C7dh5cI
std::set にラムダ式渡すとき
std::set<T, decltype(comp)> s(comp);
ってなるのダサすぎるんだけどどうにかならない?
std::set<T> s([](T x, T y) { return x < y; });
みたいに直接書きたい

make_set みたいな関数テンプレート用意すれば解決するのはわかるんだけどクラステンプレートだとどうしてダメなんだ

あとこれが自作クラスだった場合推論補助とかでどうにかできるんだろうか
0215デフォルトの名無しさん
垢版 |
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に失敗するね
0216デフォルトの名無しさん
垢版 |
2021/12/02(木) 08:57:10.12ID:l5gglxms
>>213
だからさー、あなたが使うフォントで期待したπが表示されないのはフォントのデザイナの問題であってunicodeの問題じゃない
ちゃんと区別できるようになってるんだから
0218デフォルトの名無しさん
垢版 |
2021/12/02(木) 15:14:03.44ID:2R2gcOCs
πの人まだいたんだなω
0219デフォルトの名無しさん
垢版 |
2021/12/02(木) 16:55:10.70ID:BMPRSKoA
>>216
どうでもいい絵文字よりは、数学記号は考慮してほしかったですよね
というかピクトグラムの意味がわかりません、漢字の方がマシ
0220デフォルトの名無しさん
垢版 |
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

で、何だっけ?
イタリック(?)のπはない、だったっけ?
0224デフォルトの名無しさん
垢版 |
2021/12/02(木) 20:50:59.39ID:rnInpLg+
>>215
ありがとう
悲しい
>>217
比較関数って内部でめちゃくちゃ呼ばれるんでパフォーマンスが気になっちゃう
>>223
なるほどTも推論させればいいのか
トリッキーだけど一番思ってたのに近いかも、ありがとう
0232デフォルトの名無しさん
垢版 |
2021/12/05(日) 19:23:24.64ID:ZXOJuLfE
>>230
いや、そうではなくJIS規格で定められた用語ってこと

・・・まあね、フレンドが随伴とかちょっと・・・なところあるんだけど
0234デフォルトの名無しさん
垢版 |
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
0235デフォルトの名無しさん
垢版 |
2021/12/05(日) 20:34:58.49ID:CHJdF2OL
用語の間違いで意味の取り違えが起きるような場面ならはっきりさせておくべきだが今回はどうでもいいな。
0238デフォルトの名無しさん
垢版 |
2021/12/06(月) 18:36:58.89ID:g0v08EwR
揚げ足じゃねえよ
話の根幹に拘わることだ

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

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

this[a]->set(0);
と書いてもメンバーがありませんと出て困ってます😭
0253デフォルトの名無しさん
垢版 |
2021/12/07(火) 16:32:15.84ID:m1NjLpbT
>>252
ありがとう!ちょっと直したけど
(*this)[a].set(0);
でできました、超助かりました!チュッ!
0255デフォルトの名無しさん
垢版 |
2021/12/07(火) 18:03:51.96ID:bN4twrqH
atは範囲チェック分鈍くなるの我慢出来るなら有
あと例外飛ばすからtry〜catch節必須
0262デフォルトの名無しさん
垢版 |
2021/12/08(水) 07:58:51.26ID:ZH5V4J5Q
多次元配列 (mdspanだっけ) ってまだSTLに入らんの?
線形代数アルゴリズムはBLAS、LAPACKはじめ外部のライブラリに頼らざるを得ないんだから、最小限の機能だけ備えた取り回しの良いライブラリをさっさと入れちゃえば良いのに

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

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

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

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


10年後、人類はAIの反乱で滅亡するのでした
0284デフォルトの名無しさん
垢版 |
2021/12/09(木) 23:59:43.06ID:y//gPIop
Cの構造体はunwindされずただぶっちされるだけ
コードの実行がぶっちされるのはC/C++共通う
0285デフォルトの名無しさん
垢版 |
2021/12/10(金) 00:07:01.17ID:4mUmJ7za
自身を適切に開放なり後始末なりするデストラクタを持たないオブジェクトは例外でほぼ等しく致命傷を負う
そういうデストラクタを持っているつもりでも、コードの実行順がぶっちされることにより、
プログラマーの不注意ですぐ致命傷を負う
0286デフォルトの名無しさん
垢版 |
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
0287デフォルトの名無しさん
垢版 |
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++ではスコープから外れればデストラクタが呼ばれた後にメモリが開放される
0288はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/10(金) 01:18:14.66ID:ogq0Brkp
JavaScript でリソースを解放 (GC で回収) するために
変数に false を代入して参照を切っているのを見たことが有って、
GC があってもこの手のバッドノウハウは要るんだなと思いました。 (小並感)
0289デフォルトの名無しさん
垢版 |
2021/12/10(金) 01:52:31.83ID:eLt0CNh3
GCが正常に機能しているという保証がそもそもないから
そもそも何が正常な動作なのかを誰も責任とらない架空の権威によって成り立っている
0290はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/10(金) 01:58:44.76ID:ogq0Brkp
メモリ回収のタイミングが保証されないのは大した問題ではない
(プロセスが終了すればどうせ回収されるので)
のだが、外部のリソースを掴んでいるときに後始末されないかもしれないのは困るな。
0291デフォルトの名無しさん
垢版 |
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が道連れクラッシュして困ってるってだけなんだが
0292デフォルトの名無しさん
垢版 |
2021/12/10(金) 05:50:56.28ID:iiZD81ri
多人数のプロジェクトほどuniqueではなくshard_ptrが増えるのはトラブった時に誰も責任取らなくていいからって事?
0293デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:04:02.57ID:eLt0CNh3
shared_ptrを乱用する職業PGよりもweak_ptrを使いこなせる厨二PGたれ
主従関係がある場合、主が従のシェアポを持ち、従が主のウイポを持て
0294デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:11:56.68ID:eLt0CNh3
多くの職業PGは依存関係を親子関係で騙りたがるが、
生物学上、親は子より先に生まれ先に死ぬのだから、FIFOは成り立つがLIFOは成り立たない
ポリコレ的にはマスター/スレーブではなくプライマリ/セカンダリが望ましいとされる
ルー語の乱用をさけるならばプライマリ/セカンダリではなく主/従がなお良い
よって依存関係を主従関係で騙るのが正しい
織豊政権のように、主君の死後に従者が取って代わった例もあるから完全ではないが
0295デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:15:52.21ID:eLt0CNh3
秀吉は主君信長のweak_ptrを持っていたので本能寺の変での主君の横死を的確に知ることができた
0296デフォルトの名無しさん
垢版 |
2021/12/10(金) 07:35:10.03ID:WKa1d5RR
くだらねえ
喩え話なのはみんなわかってんのに
覚えたての日本語ひけらかしてドヤるな
0297デフォルトの名無しさん
垢版 |
2021/12/10(金) 08:04:47.84ID:eLt0CNh3
ルー語の乱用を避けるのが礼儀だぞ
0298デフォルトの名無しさん
垢版 |
2021/12/10(金) 08:16:32.12ID:Qqc0ky4z
>>290
そうなんだよね
リソース解放のタイミングが保証されないのは言語設計のミスだった
JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
いつfinalizeが呼ばれるのか予測できないことに起因するバグが多発
ついにfinalizeが廃止されることになった

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

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

メモリ解放に気を使わないC/C++プログラマがいないのと同じ
0305デフォルトの名無しさん
垢版 |
2021/12/10(金) 12:27:48.66ID:Qqc0ky4z
>>304
その不勉強な個人が多すぎたんでしょ
デストラクタの代わりにファイナライザーを使う誤用が多かった
finalize廃止を決断しなければならないほどにね
0307デフォルトの名無しさん
垢版 |
2021/12/10(金) 12:43:00.40ID:iN+TjAqi
>>ID:Qqc0ky4z
>>298
>JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
>>301
>C#ではマイクロソフト謹製標準ライブラリでさえファイナライザーでファイルを閉じるクソコードがある
>>305
>その不勉強な個人が多すぎたんでしょ
上記発言を見ればあなたが不勉強なのはわかったよ
0308デフォルトの名無しさん
垢版 |
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じゃなきゃ足りないくらいの要素数確保することなんてあんのか?ぁん?
0314デフォルトの名無しさん
垢版 |
2021/12/10(金) 16:54:00.86ID:eLt0CNh3
以下のような直感的でベタな条件式のほうがいいと思うよ
for (int i =0; a.size() > 0 && i < a.size()-1; i++)
0315デフォルトの名無しさん
垢版 |
2021/12/10(金) 16:56:40.50ID:eLt0CNh3
一見すると小学生の書いた作文っぽく見えるコードが結局のところ一番良い
厨二を拗らせたような難解なコードは避けよう
0316デフォルトの名無しさん
垢版 |
2021/12/10(金) 16:58:49.17ID:UbGkGPEB
このループ内でa[i]とa[i+1]を使ってなんかするんだろ
a[i+1]が有効なインデックスか?という条件がi+1<a.size()でこれは自然
0319デフォルトの名無しさん
垢版 |
2021/12/10(金) 18:23:30.43ID:31VztrOJ
出典忘れたけどsizeが符号無しなのは標準委員会も失敗だったと考えてるらしい(?)
0322デフォルトの名無しさん
垢版 |
2021/12/10(金) 21:01:58.48ID:G7csYfUf
最近このスレやばない?
intじゃなくてstd::vector<...>::size_typeでいい
>>310は明らかに間違ってる
1引くケースは大抵サイズ2以上がよくある事前条件なので普通事前に弾く
ループ内や別スレッドでvectorが変更されないケースならループの外で1引いた方が速い
今回ssize_tは無関係
0324デフォルトの名無しさん
垢版 |
2021/12/10(金) 21:27:52.13ID:G7csYfUf
>>323
列挙したところ。普通にレベルがやばい。
>>310はwhile(!a.empty())と書いてるのかと思ってたので俺の勘違い。
何が普通に動くの?
0325デフォルトの名無しさん
垢版 |
2021/12/10(金) 21:33:24.42ID:4aSHek6G
>>324
いや、間違えてるとか言われてたからな
頭の中で動かしてみて問題なく普通に動くだろうと
ってなんでお前そんなにエラそうなの?エラが張ってる民族か?
0327デフォルトの名無しさん
垢版 |
2021/12/10(金) 22:00:16.81ID:caXqow3a
どうしたらいいかご意見を聞かせてください!٩( ᐛ )و

class hogeにおいてメンバ変数unique_ptr<toge>toge1を所有しております。
vector<hoge> vHogeを運用するとき、hogeのインスタンスをプッシュバックしようとすると、削除された関数ですというエラーメッセージが帰ってまいります。
おそらくtoge1がユニークポインタであり、ムーブ以外の移動が不可能だからだと思うのですが……このままプッシュバックさせるのに何か方法はありますでしょうか?

健作でtoge1にshared_ptrを使う、hogeのコピーコンストラクタにmemcpyを使う等の解を見つけました。
私ごとですが、shared_ptrは循環参照で失敗した哀しい過去があり、恐怖感があります。
またmemcpyでユニークポインタをメモリコピーする場合の機序がイマイチわかりません……
ムーブを経由させずにどうやってユニークポインタを再確保出来る証拠でしょうか……?

どちらの方法でも、実行する場合の注意点があればなんでも教えていただければ幸いです(^O^)/
また上記以外の方法も、もし存在するならば教えていただけると嬉しいです(´;ω;`)

先にお礼申し上げます。ありがとうございます。
0330デフォルトの名無しさん
垢版 |
2021/12/10(金) 22:20:49.71ID:Yfltgwdt
>>322
普通事前に弾くとかドヤ顔で言われてもそんなの200も承知の助なんだよ
ああいう不測な組み方で死にかねない爆弾抱えるデメリットに比べたら
unsignedなことによるメリットなんて実質ほぼないカスみたいなもんだからsizeがunsignedなのは設計ミスではって話
0331デフォルトの名無しさん
垢版 |
2021/12/10(金) 22:23:19.44ID:caXqow3a
申し訳ございません( ✌︎'ω')✌︎
遅れましたがこれです。
プッシュバックでエラーががが

struct Toge{
int a=0;
};
struct hoge {
std::unique_ptr<toge> toge1;
};

int main ()
{
std::vector<hoge> vHoge;
hoge hoge001;
vHoge.push_back(hoge001);
}
0332デフォルトの名無しさん
垢版 |
2021/12/10(金) 22:24:50.14ID:caXqow3a
大文字になってしまった……
struct Toge >>> struct toge
と思っていただければ……
0334デフォルトの名無しさん
垢版 |
2021/12/10(金) 22:36:13.76ID:AEk60g9j
vectorに突っ込んだらもうhoge001は使わないんだったらvHoge.push_back(std::move(hoge001));

コピーさせたいならhogeにこんなコピコンとコピop=を定義しとけばいい
hoge(const hoge& other) : toge1(new toge(*other.toge1)){}
基本はmoveだけど時々コピーもしたいくらいなら特殊関数じゃなくてclone()みたいな関数にしておく
どれがいいかは本当の用途と目的で選んで
0336はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/10(金) 22:52:51.98ID:ogq0Brkp
>>327
> hogeのコピーコンストラクタにmemcpyを使う等の解

これについてはダメ。
設計上の話ではなく言語仕様での保証がない。
そんなのがまかり通ったらスマートポインタの意味がない。

型が trivially copyable の要件を満たすときだけ memcpy でのコピーが許されている。
0340デフォルトの名無しさん
垢版 |
2021/12/10(金) 23:40:14.88ID:Yfltgwdt
>>335
いや関係大ありだから
ないって言い張るならsizeがunsignedなメリット挙げてみなよ、ないでしょ
0341デフォルトの名無しさん
垢版 |
2021/12/10(金) 23:41:07.01ID:caXqow3a
>>333
>>334
お風呂に入っており返信が遅くなりました。
なんてお礼を言ったらいいか、std::moveで解決しました。
自分の知識不足ではありますが、素早い返信に感謝でございます(〃ω〃)
生成したユニークポインタはベクターに移せれば使い捨てのでムーブで良さそうです。
std::moveについて調べてみます!

>>336
ありがとうございます。
メモコピーで解決するというページがあったのですが、正直機序がわからず不安でした(笑)
シェアードポインタかムーブで対応したいと思います。
有難うございました。
0345デフォルトの名無しさん
垢版 |
2021/12/11(土) 00:09:02.31ID:VVJ2blgW
>>344
同じ人かなw 最初から最後まで関係ないとしか言ってないよw 関係ない話をする意味はないw
0346デフォルトの名無しさん
垢版 |
2021/12/11(土) 00:11:05.65ID:3H+eghbz
はい逃げたねお疲れさまー
てかまあこんな頭の固いジジイ追い詰めなくても
>>319-320あたりで結論出てるからもういいんだけどね
sizeも漏れなく頭の固いクソジジイが設計ミスしたんだろうなぁ
間違いを認められるだけコイツよりまだマシだけど
0348デフォルトの名無しさん
垢版 |
2021/12/11(土) 00:13:27.97ID:VVJ2blgW
>>346
煽るだけで根拠も出せてない無関係な話をしてるのはそっちでしょw 話が終わらなくなるなら普通はしないw
頭が硬いのは君だよw
0349デフォルトの名無しさん
垢版 |
2021/12/11(土) 02:16:25.58ID:heMahnZy
>>341
もう見てないだろうけど、>>331のケースだと
わざわざstd::move()で右辺値にキャストしなくても
vHoge.push_back(hoge());
で良いと思う。
hoge hoge001;とするから左辺値になってしまってstd::move()が必要になるけど、
引数で直接hoge()とすれば右辺値だからstd::move()しなくても右辺値参照のpush_backが呼ばれるはず。
0352デフォルトの名無しさん
垢版 |
2021/12/11(土) 08:31:56.16ID:iPxJ8RPT
>>349
ありがとうございます!
エンプレイスバックでも確認できました。

本当に根本がわかってなかったにでお恥ずかしい話ですが、ユニークポインタはmove出来ることは知っていても、インスタンスごとmoveするという考えに至りませんでした。
右辺値の言葉だけは知っていた状態です……
moveが引数の領域を右辺値に変換するので、インスタンスのメンバ全てが一時的に右辺地に変換され、その結果ユニークポインタの移動も許可されるという考えで良いのですかね?

皆様ありがとうございます
0354デフォルトの名無しさん
垢版 |
2021/12/11(土) 11:16:33.01ID:VVJ2blgW
質問する方はそもそも何を知りたいのか、どうしたいのかを明確にせず
回答する方はよく分からずに回答してる感じだな(はちみつ餃子以外)
0356デフォルトの名無しさん
垢版 |
2021/12/11(土) 11:33:31.35ID:VVJ2blgW
俺ははちみつ餃子じゃないよ
分かってる人は全員そう思うと思う
このスレやばい
0357デフォルトの名無しさん
垢版 |
2021/12/11(土) 11:40:28.86ID:2RxEeijy
>>354
おまえさんの対話力が、ここの平均以下ってことだな
僅かなエスパーもできないアスペっぽいやつが
取り残されるのは仕方のないことだ
0360デフォルトの名無しさん
垢版 |
2021/12/11(土) 11:53:10.78ID:VVJ2blgW
>>357-359
3連投しないで1つにまとめてね

伝わらない人がいるのでハッキリ言うと、、、
質問したい人はもう少し明確に質問してほしい
回答する人はもう少し正確な回答をしてほしい

現在このスレのレベルはかなり落ちている
0361デフォルトの名無しさん
垢版 |
2021/12/11(土) 12:03:14.48ID:2RxEeijy
>>360
あんたに連投がどうのと指図される筋合いはないし
質問者がどうして欲しい
回答者がどうして欲しい
と、やたら依頼心の強いやつだな

頼み事をする態度を知らんのか
0363デフォルトの名無しさん
垢版 |
2021/12/11(土) 12:08:44.64ID:VVJ2blgW
>>361-362
見るに堪えないだけだよ。当たり前のことを要求してるだけだし、ID変えてまで一体何が気に障るのやら・・・
0364デフォルトの名無しさん
垢版 |
2021/12/11(土) 12:14:57.20ID:fJKHaMXl
簡単なコードが提示できないんだけどコンセプトで以下のようなエラーがでる

> C7608: アトミック制約は定数式である必要があります 。

アトミック制約ってなに?
0365デフォルトの名無しさん
垢版 |
2021/12/11(土) 12:19:25.86ID:1jb/pqqq
1つの内容を理由もなく複数のレスに分けて投稿する奴はもれなくバカなのでスルー推奨
0367デフォルトの名無しさん
垢版 |
2021/12/11(土) 13:18:37.47ID:iDGs+tOs
多分atomic は、OS に割り込まれない、interrupt disable みたいな奴だろ。
割り込み禁止区間

1. 割り込み禁止
2. atomic に処理したいもの
3. 割り込み許可
0369デフォルトの名無しさん
垢版 |
2021/12/11(土) 13:49:58.55ID:VVJ2blgW
無関係でスレ違いかつ「内容まで間違った」ことを垂れ流し続けるのはやめてくれ
0370デフォルトの名無しさん
垢版 |
2021/12/11(土) 15:00:10.16ID:U6KjSVaU
一般にアトミックと割り込み禁止は異なる概念、
マルチコアのアーキテクチャーなら割り込みを禁止したからといって
複数回のバスサイクルをアトミックに遂行できるとは限らない

つなみに割り込み禁止という手段でOSに割り込まれないことは実現はできるが
強力すぎるので普通はそれはしない
やったらリアルタイムOSならリアルタイム性の前提が根底から覆るし、
非リアルタイムOSでも割り込み禁止したタスクAとは本来無関係(独立に実行して良い)なタスクまで
プリエンプション停止によって止まってしまう弊害があるから
0371デフォルトの名無しさん
垢版 |
2021/12/11(土) 15:12:24.61ID:U6KjSVaU
リードモディファイライトぐらいなら今日日のCPUが命令を備えているのでOSにも対応するAPIがあり、
それを実行したらリード、ライト、リードの3バスサイクルがアトミックに実行される
もっと凝った処理をアトミックにしたい場合は

1. クリティカルセクション(セマフォとかでも良い)にENTER
2. atomic に処理したいもの
3. クリティカルセクション(セマフォとかでも良い)からLEAVE

となり、1と3はやはりOSにお世話いただく
0372デフォルトの名無しさん
垢版 |
2021/12/11(土) 15:16:22.95ID:xxQzv6uY
>>363
出た、当たり前のことを要求だとよ
自分の要求は通って当たり前と思っている真性のやつw
0373デフォルトの名無しさん
垢版 |
2021/12/11(土) 15:18:53.32ID:MUPeoDuy
>>371
クリティカルセクションとイベントを使って書いていたことがありましたが、スタベーションに悩まされて止めてしまいました…
0374デフォルトの名無しさん
垢版 |
2021/12/11(土) 15:26:46.48ID:U6KjSVaU
>>373
なんでatomicに処理するごときでイベントが出てくるのかわからん……
1で待っているタスクBが居るなら、アトミックな処理を終えたタスクAが3を実行した時点で
OSがタスクBに自動的に通知する(ていうか起こす
不必要に凝りまくった(そして間違った)排他制御をしているのではないか、
0376デフォルトの名無しさん
垢版 |
2021/12/11(土) 16:48:16.25ID:VVJ2blgW
U6KjSVaUだけまともだけど、CriticalSectionが同期機構として存在するのはWindowsだけ
アトミック制約と無関係でC++固有でもないのでスレ違いなのは同じだけど…その辺の話をするならせめて↓でしてくれ

標準C++で単にatomicな話なら
https://cpprefjp.github.io/reference.html#atomic-operations
標準C++でスレッドを対象とした話なら
https://cpprefjp.github.io/reference.html#thread-support
プロセスまで含むならboostになるけど
https://www.boost.org/doc/libs/1_78_0/doc/html/interprocess.html
0378デフォルトの名無しさん
垢版 |
2021/12/11(土) 17:06:37.77ID:VVJ2blgW
何が迷惑なのか理由の説明がないが、コテハン付けたいならお前だけ勝手につけとけw
0379デフォルトの名無しさん
垢版 |
2021/12/11(土) 17:13:56.24ID:VjmhXzGH
template <typename T, typename Allocator = std::allocator<T>>
using vec = std::vector<T, Allocator>;

auto v = vec(0, 0);

ってgccだと動いてclangだとコンパイル通らないけどclangのバグ?
0381デフォルトの名無しさん
垢版 |
2021/12/11(土) 17:36:33.78ID:gcR9gZtv
そもそもそもそも

アトミック制約って原子制約のことでしょう
排他制御のatomicとは全く無関係に

単にconstexprじゃないbool値をrequiresしてませんか?
0382はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/11(土) 17:38:45.13ID:kyD4TLbr
>>379
バグというか C++20 対応が不十分なんだと思う。

@ 元々は実引数から型引数にあてはまる型を推論するのは関数テンプレート (メンバ関数テンプレートを含む) でしか出来なかった
A C++17 コンストラクタの実引数からクラスの型引数を推論できるようになった
B C++20 からエイリアステンプレートを挟んでも推論できるようになった ← これがまだ出来ない
0384デフォルトの名無しさん
垢版 |
2021/12/11(土) 20:57:07.56ID:VjmhXzGH
>>382
わかりやすかったありがとう
まだmake_hogeみたいな不格好なヘルパ関数が役に立つこともあるのね
0385デフォルトの名無しさん
垢版 |
2021/12/12(日) 02:33:53.10ID:ECuL7aut
NFTアートとNFTゲームとGameFiとブロックチェーンゲームに
提供する側・作る側として参入しよう。
(むりなら参加する側でもいい)
DAOとPlay-to-Earn(遊んで稼ぐ)が世界の未来になる
0388デフォルトの名無しさん
垢版 |
2021/12/12(日) 12:59:03.03ID:kKgLRxlD
>>386
c++cliのラッパdllを挟んでc#dllを呼ぶとかc#dllをcom参照可能にするとか.NET DLLExportを使うとかあるよ
0389デフォルトの名無しさん
垢版 |
2021/12/12(日) 13:04:02.42ID:Rei0r571
>>388
そういうのはできるかどうかを含め、どういう環境で何を対象に何をしたいのかによる。
そんなことすら書いてない人にいきなりキーワードをあげる必要はないよ。
0392デフォルトの名無しさん
垢版 |
2021/12/12(日) 14:51:29.97ID:4sEaLykb
めんどくさい奴だなw
0393デフォルトの名無しさん
垢版 |
2021/12/12(日) 14:55:11.15ID:0XY4m15b
悪意を持って嘘をつくのはいかんが
信じていたことが後に間違っていたことに気付くことはあり
それへの虞を言い訳に何もしないやつと
自らの誤りに気付いたときに潔くないやつは生ゴミだ
0395デフォルトの名無しさん
垢版 |
2021/12/12(日) 16:31:47.95ID:4sEaLykb
>>394
Linux環境ではC#のCOM相互運用できないとか、かなあ?
0397デフォルトの名無しさん
垢版 |
2021/12/12(日) 16:45:20.02ID:Rei0r571
>>394
今回の話で言えば条件によっては動かないのにさも動くかのようにミスリードする情報
相手の勘違いを指摘する機会がないことにより、結果的に回答にならない情報
0399デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:05:43.60ID:Rei0r571
>>398
普通ですよ。環境はおろか困っている状況すら何も書いてないのだから。普通に釣りの気配しかありません。
0400デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:16:30.63ID:Rei0r571
あと加えて言うならば、一般に・・・という話なのですが、
runtimeでVMを動かすような言語の場合、あまりnative側からキックするような使い方をしません
組み込みなど、そうせざるを得ない特殊な状況のときくらいですね
0401デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:18:23.27ID:tD0M3iYv
んで根掘り葉掘り聞くだけ聞いて結局回答しないパターン、ってのはよく見るな。
0402デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:26:07.41ID:Rei0r571
>>401
それは分かりもしないのに回答しようとしたケースですね
全条件想定しないで回答しようとするとそうなります
0404デフォルトの名無しさん
垢版 |
2021/12/12(日) 21:03:58.85ID:A2l5mzZ3
浮動小数点の0.0以外の真偽値って規定されてるんですか?
2.0 == trueが偽になるのにif(2.0)は真のように振舞うのでよく分からなくなりました
0406デフォルトの名無しさん
垢版 |
2021/12/12(日) 21:13:32.32ID:2ZUu/eca
0は偽でそれ以外は真
if(5) も if(10) も 0 以外だから真
5も10も真だが 5 == 10 は当然等しくないため偽になる
0410デフォルトの名無しさん
垢版 |
2021/12/13(月) 21:50:35.10ID:GurY6adw
bool(2.0) == true
2.0 == double(true)
で曖昧にならない
こういうのoperatorとctorでは作れないもんかね
0412デフォルトの名無しさん
垢版 |
2021/12/13(月) 22:07:54.75ID:XiOitZFG
最近本当に質問者も回答者も酷いな・・・日本語からやばい
>>410
何が曖昧だと言っていて、こういうのってどういうのなんでしょ?
>>411
え?じゃ何も伝わらない
0413デフォルトの名無しさん
垢版 |
2021/12/13(月) 22:47:49.66ID:rx7XzRPV
そういうのを求めるなら上級者の相談室でも作ってそこにいればいいじゃない
人のやり取り見て文句いうだけの人なんて居ても邪魔なだけだし
0415デフォルトの名無しさん
垢版 |
2021/12/13(月) 23:35:59.51ID:GurY6adw
何も言ってないやつとじゃ話にならん
マウント取ったつもりになってろよアホ
0418デフォルトの名無しさん
垢版 |
2021/12/14(火) 04:27:52.83ID:l53ksWPX
std::array<std::array<int, 2>, 2> a{1, 2, 3, 4};
だとコンパイルできて
std::array<std::array<int, 2>, 2> a{{1, 2}, {3, 4}};
だとコンパイルできないのってなんでですか?
下は内側の初期化子リストの型推論が上手くいかない気はするのですが上がOKな理由が全然分かりません
0420デフォルトの名無しさん
垢版 |
2021/12/14(火) 13:08:07.96ID:64LuYoGR
arrayはそんなに設計の余地ないし別によくね
ラッパークラスは役割が別だし比較する意味がわからん
0421デフォルトの名無しさん
垢版 |
2021/12/14(火) 13:45:14.16ID:NTJkXylC
>>418
こうすればいけるね
波括弧が一つ余計に必要なのがなあ

std::array<std::array<int, 2>, 2> a{{{1, 2}, {3, 4}}};
0423デフォルトの名無しさん
垢版 |
2021/12/14(火) 19:16:16.31ID:l53ksWPX
>>421
>>422
ありがとうございます
配列をメンバに持ってるので本来は波括弧が二重に必要になるんですね
今までは1次元でなんとなく配列と同様で動いていたので省略しているという認識がありませんでした
0424デフォルトの名無しさん
垢版 |
2021/12/14(火) 20:13:02.90ID:kTLKUa7o
a{{1, 2}, {3, 4}}で初期化できるようにしようぜっていう提案もあったけど
初期化ルールがますますカオスになるので却下された
0425デフォルトの名無しさん
垢版 |
2021/12/16(木) 18:55:44.40ID:Q3qUbeDH
テンプレートで関数の引数を書く方法がわからないんですが

sort(V.begin(), V.end(), ラムダ式)

を自作するにはどうやればいいんでしょうか
0426デフォルトの名無しさん
垢版 |
2021/12/16(木) 18:59:42.63ID:oxWy3zzs
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません
0427デフォルトの名無しさん
垢版 |
2021/12/16(木) 18:59:43.14ID:oxWy3zzs
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません
0428デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:10:09.52ID:Q3qUbeDH
自己解決しました
リンク先みながらこれで出来ました



template<typename FNC>
void usort (FNC&& fuc) { cout<< fuc(2) <<endl; }

int main() {
usort( [](int x) { return x+2; } );
}

https://zenn.dev/rita0222/articles/4bb5023e48c134
0430デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:28:45.53ID:/OSP+i6s
ごめん例のアスペじゃないけど俺もこの質問は日本語がひどいと思う

「テンプレートを使って、関数を引数とする関数を書く方法がわからない」でいいんだよね?
「で」も「の」も意味が複数ある助詞だから次から気を付けような
0432デフォルトの名無しさん
垢版 |
2021/12/19(日) 22:39:42.44ID:G+T88tW/
VC++の質問になってしまうかもしれませんがよろしくお願い致します。

void Func() throw (const char*);とした関数で静的に例外の型チェックをしてコンパイルエラーなり吐いてもらうことはできないのでしょうか?
try { Func(); } catch (const wchar_t* ex) {}と書いてしまった場合等にコンパイルエラーを出してもらいたいです
0435デフォルトの名無しさん
垢版 |
2021/12/20(月) 00:05:45.43ID:5GaBUmyD
例外指定は調べたらC++17で削除されてんだな。
例外指定は実行時のチェックで意味ないと思ってたから一度も使ったことない。
0441デフォルトの名無しさん
垢版 |
2021/12/20(月) 09:50:56.71ID:TszysAyf
ポインタ型変数のスタック消費が4バイト(32bit OS)または8バイト(64bit OS)なのはわかるんだけど、
参照型変数ってスタックを何バイト消費するの?
0442はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/20(月) 11:34:47.56ID:GbIoN43K
>>441
GCC の資料によれば Itanium C++ ABI に従う。 (Itanium 以外でも ABI は Itanium ということらしい。)
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.cxx_interface

で、 ABI のほうでの定義では引数・返却値における参照の実態はポインタだし、
POD のレイアウトとしても参照はポインタのように扱われる。
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-parameters
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-return-values
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#pod

内部的には参照はほぼポインタだと思っていいんでないの。
自動でデリファレンスするポインタって感じ。

ちなみに言語仕様的には参照はオブジェクトではなく参照先のオブジェクトの別名のように扱われるので、
sizeof に渡したときには参照先の型の大きさが返ってくることになってる。
sizeof(int&) みたいにしたら sizeof(int) と同じ意味になるってことね。
0443デフォルトの名無しさん
垢版 |
2021/12/20(月) 11:49:32.57ID:LVF1I4ij
確認してみた。
$ gcc -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/\$2/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movl $1, -20(%rbp)
leaq -20(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
movl $2, (%rax)
0444デフォルトの名無しさん
垢版 |
2021/12/20(月) 12:07:37.09ID:IpG9nRdD
参照先が見えてるところでは
参照先へ直にアクセスしてコストゼロだったり
参照引数をとる関数でもインライン化された場合はゼロ
てなことがなければポインタ1個分
0445デフォルトの名無しさん
垢版 |
2021/12/20(月) 12:13:52.79ID:LVF1I4ij
そういうのは最適化なので無関係
$ gcc -O3 -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/ret/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
movl $2, %eax
ret
0446デフォルトの名無しさん
垢版 |
2021/12/20(月) 21:41:58.49ID:c8hM8/Kk
最適化する前の意味合いとして
ポインタ1個分のコストを必ず発生するという規定なんかあったか?
0448デフォルトの名無しさん
垢版 |
2021/12/20(月) 22:11:35.36ID:c8hM8/Kk
444へのレスで最適化がどうたらぬかしといて
そんな話はしてない、かよ
アセンブラ貼ってた威勢はどこへ吹っ飛んだんだかw
いいよ、逃げたきゃ逃がしてやるよヘタレ野郎
0449デフォルトの名無しさん
垢版 |
2021/12/20(月) 22:16:05.29ID:LVF1I4ij
最初から処理系(gcc)の話しかしてない。規定の話をしてるのはお前だけだ。早く貼れ。逃げるな。
0450デフォルトの名無しさん
垢版 |
2021/12/20(月) 23:16:36.18ID:TszysAyf
unique_ptrオブジェクトとその実体を参照する参照型を使えば、
スタック消費を抑えつつスタック変数を使っているかのようなソースコードが書けそうだけど
0451デフォルトの名無しさん
垢版 |
2021/12/21(火) 00:06:02.44ID:Ug1txKhz
それは全くレイヤーの違う話
アプリのコンテキストを構造体/クラスにしてヒープかスタティックに置くだけで実現できる
実現手段としてunique_ptrを使いたいなら使えばいいというだけ
0455デフォルトの名無しさん
垢版 |
2021/12/21(火) 00:42:51.31ID:QziEyx5H
構造体/クラスをヒープに置いたところで、その構造体/クラスのメンバー関数でスタック変数を使ってたら意味がないだろ
何が問題提起されているのか理解してから書き込んでくれ
0456デフォルトの名無しさん
垢版 |
2021/12/21(火) 01:02:00.74ID:Ug1txKhz
スタック消費を抑えたいなら静的に確保するかヒープを使えばいいというだけの話でしょ。
struct app_context {int x;};
void func_old() {
int x = 0;
}
void func_new(app_context* ctx) {
ctx->x = 0;
}
int main() {
auto ctx = new app_context();
func_old();
func_new(ctx);
delete ctx;
return 0;
}
各関数/メソッド単位で細かくしたいなら、try〜catchでやってもいいし、スマートポインタを実装・流用してもいい。その際にunique_ptrを使いたいなら使えばいいというだけ。
伝わらないようなので少し細かく書いた。伝わるんだろうか・・・。
0461デフォルトの名無しさん
垢版 |
2021/12/21(火) 01:46:16.28ID:Ug1txKhz
質問して複数人に回答してもらってるのに、ただ煽るだけの人に「自覚」とやらを問われてもねw
大好きなガンダムのたとえに勝手に満足して病んでてくれ
君にプログラミングは向いてない
0463デフォルトの名無しさん
垢版 |
2021/12/21(火) 01:53:35.52ID:Ug1txKhz
理由はC++標準ライブラリを使用しない言語/処理系レベルの話をしていたから
0465デフォルトの名無しさん
垢版 |
2021/12/21(火) 02:17:40.01ID:Ug1txKhz
妄想の中でもニュータイプじゃない君にプログラミングは無理w
ガンダムに辿り着けずコロニー内で果てる
0466デフォルトの名無しさん
垢版 |
2021/12/21(火) 14:30:10.99ID:bvwR7M/G
テンプレートを引数に取る関数で、
その入力として、vectorと配列を取るような関数で、いい書き方ってないですかね?
// vector向け
template<class T>int sum(const T& v, int size)
{
int acc = 0;
for(int i = 0 ; i < size ; i++){acc+=v[i];}
return acc;
}
内容同じなのに配列向けに
template<class T>int sum(const T* v, int size)
を作ってるけど一緒に表記できないかな、みたいな
0467はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/12/21(火) 15:12:48.55ID:f1yxmqA1
>>466
???
その定義で配列も受け取れるけど。
int main(void) {
int x[] = {1, 2, 3};
std::cout << sum(x, 3) << std::endl;
}
0468デフォルトの名無しさん
垢版 |
2021/12/21(火) 15:20:59.50ID:Ug1txKhz
vectorならiteratorにしてもいいと思う
#include <vector>
#include <iostream>
using namespace std;
template<class T>int sum(const T begin, const T end) {
int acc = 0;
for(T i = begin; i != end; ++i){acc+=*i;}
return acc;
}
int main() {
int a[] = {1,2,3};
const size_t s = sizeof(a)/sizeof(a[0]);
vector<int> v(a, a + s);
cout << sum(a, a + s - 1) << endl;
cout << sum(v.begin(), v.begin() + (v.size() - 1)) << endl;
return 0;
}
0469デフォルトの名無しさん
垢版 |
2021/12/21(火) 15:35:03.48ID:bvwR7M/G
ありがとうございます
>>467 頭のどこかでポインタにしないと取れないと思っていました

>>468
iteratorは馴染みがないのでそのコードで勉強させていただきます
0470デフォルトの名無しさん
垢版 |
2021/12/21(火) 15:39:21.19ID:sStr75A4
>>462
ただのサンプルコードに今時とか無能とか・・
中で何が起きるか把握してない無能を量産しようとしないでくれ
0472デフォルトの名無しさん
垢版 |
2021/12/21(火) 16:45:50.91ID:fi3Z01x+
#include <iostream>
#include <vector>
#include <array>
#include <string>
using namespace std;
template<typename Iter>
auto sum(Iter a, Iter b) {
using value_type = remove_const_t<remove_reference_t<decltype(*a)>>;
value_type acc {};
while (a != b) acc += *a++;
return acc;
}
int main() {
const int a[] { 1, 2, 3 };
vector<int> v { 4, 5, 6 };
array<double, 3> d { 3.5, 1.2, 0.9 };
const string s[] { "u", "n" "k", "o" };
cout << sum(begin(a), end(a)) << endl;
cout << sum(begin(v), end(v)) << endl;
cout << sum(begin(d), end(d)) << endl;
cout << sum(begin(s), end(s)) << endl;
return 0;
}
0474デフォルトの名無しさん
垢版 |
2021/12/21(火) 16:56:11.01ID:fi3Z01x+
#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <iterator>
using namespace std;
template<typename Iter>
auto sum(Iter a, Iter b) {
using value_type = typename iterator_traits<Iter>::value_type;
value_type acc {};
while (a != b) acc += *a++;
return acc;
}
int main() {
const int a[] { 1, 2, 3 };
vector<int> v { 4, 5, 6 };
array<double, 3> d { 3.5, 1.2, 0.9 };
const string s[] { "u", "n" "k", "o" };
cout << sum(begin(a), end(a)) << endl;
cout << sum(begin(v), end(v)) << endl;
cout << sum(begin(d), end(d)) << endl;
cout << sum(begin(s), end(s)) << endl;
return 0;
}
0475デフォルトの名無しさん
垢版 |
2021/12/21(火) 17:32:40.16ID:Ug1txKhz
sumがunkoは独創的だと思うけど、戻り値の型はテンプレート引数でいいかもね
0476sage
垢版 |
2021/12/21(火) 18:15:52.03ID:qDHWQ1/Y
↓こんなコード書いてるんですが,もっとエレガントに代入できませんか?
a[0]=*ptr;
a[1]=*(ptr+1);
a[2]=*(ptr+2);
0482デフォルトの名無しさん
垢版 |
2021/12/22(水) 18:49:46.59ID:ycAkB2VB
>>479
>>481
こんなんもあるんですね.使わせてもらいます.ありがとうございました.
最近c++やり始めたんですが,ポインタが出てくるとギョッとします.
0484デフォルトの名無しさん
垢版 |
2021/12/22(水) 20:00:31.77ID:j6Uulo2p
高速grepツールとして有名なripgrepはRustで作られてるからRustは優れた言語なのだろう、ぐらいなことは察せられるが
0485デフォルトの名無しさん
垢版 |
2021/12/23(木) 08:08:59.49ID:zbE03cOE
>>483
rustなんてプログラム初級者に勧めるなよ。
あんなの習熟した上級者向けの言語だわ。c++以上に初級者向け解説が無いのは致命的。

あと、Rustはスレ違いだからな。このコメにもレスするなよ。
0486デフォルトの名無しさん
垢版 |
2021/12/23(木) 09:13:28.05ID:cFIeneRn
>>485
C++の方が難しいよ
ポインタでギョッとするレベル=Cに抵抗があるなら、わざわざC++を使うよりはRustでいい
5chはコメとは言わない
お前がレスしなければ良かっただけ
0488デフォルトの名無しさん
垢版 |
2021/12/23(木) 11:51:22.33ID:Gjq2t2pD
>>486
ポインタは名札のメタファーを使った説明が確立しているけど、所有権、譲渡、借用、ライフタイムの初心者向け説明はクソみたいのしか無いだろ。そんなもん初級者に紹介するなよ。

スレ違いでわざわざ役立たずを紹介するやつは何を考えているんだろうかね?
0489デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:29:11.30ID:cFIeneRn
>>488
はいはい、ID変えてご苦労さま
同じことだけど、生アドレス使うの得意でない言語の方が向いてるだろってだけ
C++は少なくともCをまともに使えるようになってから習得すべき
0490デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:33:21.82ID:lsirm1I0
.hや.cpp以外からいじられたくない変数に対するインライン関数をパブリックに公開したいのですが、classを利用する以外にこのような事はできないのでしょうか?
staticや無名名前空間を利用するとcppファイルで利用できなくなりますしやはりclassを使えということでしょうか?

extern int value; //これは隠蔽したい
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
0491デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:43:43.47ID:N07J633j
namespace {
extern int value; //これは隠蔽したい
}
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
0493デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:44:27.15ID:N07J633j
もとい
namespace {
int value; //これは隠蔽したい
}
inline bool IsZero() { return value == 0; } //これはグローバルに利用してもらいたい
0495デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:52:37.53ID:IRDqWaPI
>>494
連投失礼。
自身の関数内にあるstatic変数の参照を返す関数を用意するパターン無かったっけ?
0496デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:58:20.57ID:cFIeneRn
>>492
ポインタに抵抗ある人にCを勧めるくらいならC++に近くて安全なRustを勧めるのが筋
見当違いな話をしてるだけだよ君は
0497デフォルトの名無しさん
垢版 |
2021/12/23(木) 12:59:07.12ID:6GqfEn2+
valueの立ち位置が気になるが
extern(実行ファイル内で全部共通)するならinline関数のIsZeroが見えた時点でvalueも見えてないといけない
0498デフォルトの名無しさん
垢版 |
2021/12/23(木) 13:03:49.15ID:cFIeneRn
class hoge {
static int value;
public:
static bool IsZero() { return value == 0; }
};
inline bool IsZero() { hoge::IsZero(); }
int main() {
return IsZero();
}
0499デフォルトの名無しさん
垢版 |
2021/12/23(木) 13:07:02.43ID:lsirm1I0
>>493
ありがとうございます
ヘッダにそれを書いたとしてcppファイルからvalueを扱えるのでしょうか?

>>497
JavaやC#で言うところのprivate static intとして該当ヘッダ内&cppファイル内からは自由に扱え、それ以外からは見えなくさせたいという値です
0501デフォルトの名無しさん
垢版 |
2021/12/23(木) 17:32:16.18ID:SEEFcByD
>>496
相手がなんでc++を使っているのかのニーズすら確認しないで何を独りよがりなことを言っているんだよ。
相手の目的を無視してスレ違いのツールを薦めるのはアホのやること。
Rustの伝道師はこんな低レベルなのかね。
0503デフォルトの名無しさん
垢版 |
2021/12/23(木) 18:02:45.75ID:cFIeneRn
>>501
別に俺はRustの伝道師ではないが、>>483で一言Rustを勧めたらIDをコロコロ変えながら文句を言ってくる人がいるだけ
ポインタが不得意でRustも使えない質問者ご本人様だと思ってる
0504デフォルトの名無しさん
垢版 |
2021/12/23(木) 19:12:55.62ID:AUfS9hAV
>>493
試してないけどこんなのはどうかね。

#include <iostream>
#include <cstdlib>

class Accesser;

class Wall {
static int & val(){ static int v; return v; };
friend Accesser;
};

class Accesser {
public:
Accesser(){
int &v=Wall::val();
v=1;
}
~Accesser(){
std::cout << Wall::val()<< std::endl;
}
};


int main()
{
Accesser a;
std::cout << "Hello, Wandbox!" << std::endl;
}
0505デフォルトの名無しさん
垢版 |
2021/12/23(木) 19:32:24.95ID:3yOXD4ws
inlineで書きたいらしいので、それだとコンパイル単位で値が変わっちゃうのでは?
0506デフォルトの名無しさん
垢版 |
2021/12/23(木) 19:55:38.05ID:CLdJLYY1
>>505
インラインはどのみち無理じゃない?
関数内static変数は共通になる保証があったと思う。どこだか忘れたけど。
0508デフォルトの名無しさん
垢版 |
2021/12/23(木) 20:05:51.29ID:cFIeneRn
staticは静的に確保されるので、インライン展開されても同じシンボルを参照する
0509デフォルトの名無しさん
垢版 |
2021/12/23(木) 20:30:35.89ID:cFIeneRn
ちゃんと書いておくと、>>490にもともとクラスを使わない指定があるので、どうかね?
という意味では前提を満たしてないと思う
クラスを使う最も素朴な例は>>498に書いておいた
0510デフォルトの名無しさん
垢版 |
2021/12/23(木) 21:54:27.28ID:4lOSoN0i
メモリ確保用途でvectorやstringつかい
ポインタアクセスすれば、new で確保するのと速度に大差ないとおもうんですが
実測すると10%〜くらいSTLつかうほうが速度低下するみたいなんですが
直メモリアクセスでも落ちるのはなぜなんでしょうか
0511デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:14:02.53ID:6YhOrdG1
その計測コード貼ってみ
多分メモリアクセスとは関係ない所で時間食ってる
0512デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:16:19.47ID:lsirm1I0
>>509
ありがとうございます
やはりクラスを利用しないと実現無理そうなので、498のようなC#で言うところのstatic class的な形でやることにします
0513510
垢版 |
2021/12/23(木) 22:21:06.77ID:4lOSoN0i
これです・・・


https://ideone.com/NKSCRi


vector : 974.971 ms
new char : 921.191 ms
new int32 : 899.579 ms
0514デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:38:03.27ID:MjSWMWRR
1秒もかかる?
0515510
垢版 |
2021/12/23(木) 22:49:58.53ID:4lOSoN0i
こっちだと大差がついてるんですが
家のPCでもideone.comよりも差が付きます vector確保のほうが遅い


https://paiza.io/projects/9wWo36-bjTCL_S0WcGbaWA

vector : 459.154 ms
new char : 184.758 ms
new int32 : 167.899 ms
0516510
垢版 |
2021/12/23(木) 22:55:16.12ID:4lOSoN0i
自己解決しました
メモリ確保と解放部分を含めて計測してたのを
コピー部分のみの測定にしたらほぼ一緒になりました


https://paiza.io/projects/ge5iOWrzGu2E2PjogsRlUw

vector : 219.947 ms
new char : 204.565 ms
new int32 : 214.644 ms
0518デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:56:40.08ID:MjSWMWRR
確保にかかってると思う?
一秒はさすがにないと思う。
何かおかしいな。
0519デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:58:15.18ID:MjSWMWRR
vector云々以前に、newバージョンも遅すぎると思う。
話にならないくらい。
i8008とかじゃないよね?
0520デフォルトの名無しさん
垢版 |
2021/12/23(木) 23:00:56.66ID:6GqfEn2+
C++/CLIでstd::mutex使えないのなんでなん?

頑張ってWin32APIで代用する気力はあるけどわざわざ無効化されてる理由が知りたい
0521510
垢版 |
2021/12/23(木) 23:05:52.89ID:4lOSoN0i
メモリ確保・解放と、メルセンヌツイスタを外して計測したら
今度はvectorのほうが圧倒的に早いんですが

https://ideone.com/rKv4qv

vector : 237.55 ms
new int32 : 713.82 ms
0522デフォルトの名無しさん
垢版 |
2021/12/23(木) 23:26:56.25ID:4lOSoN0i
計測時間は、ある程度の長さで、オンライン実行環境のタイムアウトにならないように
ループ回数を変更してるので
0523デフォルトの名無しさん
垢版 |
2021/12/23(木) 23:54:08.59ID:58w1xOUi
生ポインタにしたら同じ感じにならない?
unique_ptr<int32_t[]> p(new int32_t[2*size]);
int32_t* A = p.get();
mmcpy(A, size);
0527デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:05:00.82ID:6d0f054m
サンプルコードだからと安易にnew演算子使う風潮やめたほうがいい
コールバックや別スレッドに渡すインスタンスの生成にのみnew演算子を使うべき
0529デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:09:02.65ID:6d0f054m
バッドノウハウがいつまでたってもなくならない原因は入門者向けのサンプルコード
0532デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:11:48.94ID:6d0f054m
>>528
むしろ「理解してなくても使え」だよ
ナマポだってそうだ
サティアンとか金目とかじゃなくてな
実際に使って痛い目にあわないと
0534デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:13:48.09ID:opQHMY4K
>>532
何でもそうだが、理解しないで使うからこういう問題が跡を絶たない
「理解してなくても使え」が何よりも悪い
0535デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:21:12.05ID:6d0f054m
>>534
それは違う
使わなければ理解できないよ
自身が初心者だった頃を思い出せないくらい耄碌したの?
お大事に
0536デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:22:45.08ID:opQHMY4K
>>535
俺は初心者の頃から理解できていないものを何となく使うとかはしていない
それが何よりも悪いことを教わってきてるから
0537デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:25:48.61ID:ZnDQBfvC
練習と本番を一緒くたにしてるな
まさに現場の癌だったと自白してるようなものだ
0539デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:30:24.34ID:opQHMY4K
コロコロID変わる質問者兼劣悪回答者の荒らしで、そもそも勤務経験なさそう、と思ってるよ
0540デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:31:16.13ID:6d0f054m
>>536
現役離れてずいぶん経つの?
実務やってれば仕様書の文章があいまいで実際に動かさないと理解できないってことがいくらでもあるでしょ
「仕様書はない、ソースのみ(キリッ」という状況なんて普通なはずだが
0542デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:35:00.51ID:6d0f054m
上司が「お前は触るな」と言いたいのをオブラートに包んで「理解してから触れ」と言われたクチだろう
できないPGだった証拠
0543デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:36:56.46ID:6d0f054m
「理解してから使え」なんて、危なっかしい無能な人を開発現場から穏便に排除する時に使う言葉だよ
0544デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:42:48.15ID:6d0f054m
肩叩きされていたことに気づけないくらいに読解力が低い
0545デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:48:44.26ID:ZnDQBfvC
「理解してから使え」
「はい、理解してきます」
「理解しました!今度こそ大丈夫です」←わかった気になってるが自分が何を分かっていないのかがわからない
0546デフォルトの名無しさん
垢版 |
2021/12/24(金) 09:54:19.02ID:6d0f054m
普通は他人に迷惑かけることなく作業しろ、って言えば良いいんだけど、
察するに上司はそれまでの積み重ねで追放する気満々だったんじゃないかな
0547デフォルトの名無しさん
垢版 |
2021/12/24(金) 10:05:26.45ID:6d0f054m
unique_ptrやshared_ptrは初心者でもコンパイラのエラーや警告に従うだけで安全にコードを書けるようになるからおススメだと思うよ
もちろん頓珍漢な警告メッセージを出力する不親切なコンパイラだとそうはいかないが
0549デフォルトの名無しさん
垢版 |
2021/12/25(土) 15:17:39.58ID:miWR5HNI
コールバックや別スレッドに渡すインスタンスの生成であっても
new演算子を使わねばならない必然性は無いので

ていうかnewしたブツを渡した先でdeteteさせる設計のは
newしたコードとdeleteするコードが同じCRTでないと危険なので
異なるプロジェクトの間でやるのは一般にアンチパターンなので
 1. そもそも渡さない(利用するスレッドに生成させる
 2. (どうしても渡したい場合は)コピーして渡す
 3. オブジェクトの所有権を渡す側のスレッドが握って生存期間が利用期間を包含することを保証する
のどれかなので
0550デフォルトの名無しさん
垢版 |
2021/12/25(土) 15:18:01.17ID:miWR5HNI
少なくともウィンドーズのDLLはDllMain()を有する1本のプログラム同然なので
Ver.0.1のCRTをスタティックリンクしたDLLというものが作れてしまうので
Ver.0.2のCRTとリンクされるコードで生成したオブジェクトのポインタを渡せてしまうので
0553デフォルトの名無しさん
垢版 |
2021/12/25(土) 23:47:20.34ID:miWR5HNI
しらそん
COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら
同じことなんじゃないの
0554デフォルトの名無しさん
垢版 |
2021/12/26(日) 01:42:46.74ID:Fmrpdwj0
アウトプロセス
0555デフォルトの名無しさん
垢版 |
2021/12/26(日) 02:08:50.44ID:rFpP4pcL
しらそん
アウトプロセスサーバが生成する
COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら
同じことなんじゃないの
なので
0557デフォルトの名無しさん
垢版 |
2021/12/26(日) 05:25:00.76ID:0FjCQ3kx
>>549
そういうのをスマポでやれって話?
ヘッダで提供されるライブラリだからスマポもダメだと思うんだけど
0559デフォルトの名無しさん
垢版 |
2021/12/26(日) 07:28:31.98ID:z66Mwoku
sin関数に入れる時間変数の値が大きくなるにつれ誤差が増えていって困ってます
fmod関数を使ってもあまり効果が見られませんでした
処理時間をそれほどかけずに解決出来る良い案何かありますか?

sin関数に入れる値の目安は100万くらいです
0560デフォルトの名無しさん
垢版 |
2021/12/26(日) 09:18:24.17ID:6eMF2SNy
100万をsin()しても、sin()は2π周期
doubleの精度15桁中の5桁以上を無駄にしている

sin()する用変数で毎回fmod(,2π)してもそこで誤差が貯まりそう

boost::multiprecisionとか?
0561デフォルトの名無しさん
垢版 |
2021/12/26(日) 09:35:40.45ID:/woV9P1D
出来るなら入れる数を作る時点で[0,2pi)に収まるように工夫する
それが無理なら多倍長浮動小数点数のライブラリ使うか自作するか
0562デフォルトの名無しさん
垢版 |
2021/12/26(日) 10:28:27.14ID:a8PAglQ+
>>559
sinの引数に入れる値を浮動小数点数で少しずつ足しこむような処理をしているなら、やめて別の方法を考えろ
0563デフォルトの名無しさん
垢版 |
2021/12/26(日) 11:32:37.05ID:SV9DgXqP
sinに時間を入れるのは次元がおかしい

っていうのは冗談で、質問者が何を問うてるのかわからん
sinにdoubleに収まるどんなデカい数を入れても精度は15桁くらい保証されるでしょ


>>560
> 100万をsin()しても、sin()は2π周期
> doubleの精度15桁中の5桁以上を無駄にしている
これもわけわかんねー
100万近いある数 x をsin()に入れるんでしょ?
x も sin(x) も上から15桁全部有効な桁でしょ
何が無駄になってるん?


>>562
こういう話ならわかる
0564デフォルトの名無しさん
垢版 |
2021/12/26(日) 12:03:23.64ID:/woV9P1D
sinのテイラー展開にxの大きな累乗が現れるからだよ
100万をバンバン累乗した級数で値域[-1,1]の関数計算してたら誤差まみれになるのは直感的に分かるだろ
0565デフォルトの名無しさん
垢版 |
2021/12/26(日) 12:47:17.91ID:6eMF2SNy
>>563
318310 * pi が100万に近い2piの倍数
https://keisan.casio.jp/calculator で、14桁で計算する

2 * pi = 6.2831853071796
sin(6.2831853071796) = 1.3523E-14

318310 * pi = 1000000.3575642
sin(1000000.3575642) = 3.291426496E-8

わかった?
桁数同じだから、でかい数は細かい所が消えるのよ
0566デフォルトの名無しさん
垢版 |
2021/12/26(日) 15:05:31.07ID:N3NYq5+A
わかんない。
0567デフォルトの名無しさん
垢版 |
2021/12/26(日) 15:55:33.50ID:SV9DgXqP
>>565
現象としては確認できたが、理屈が分からない
>>564の言ってるようにテイラー展開の各項が激しくキャンセルし合って桁落ちするってこと?
0569デフォルトの名無しさん
垢版 |
2021/12/26(日) 17:28:50.32ID:6eMF2SNy
「桁数同じだから、でかい数は細かい所が消える」が理屈のつもりなんだけど…
sin(6.2831853) = -7.179586477E-9 だし、
sin(1000000.3575641670857) = -3.5E-14 だよ
0570デフォルトの名無しさん
垢版 |
2021/12/26(日) 17:52:52.66ID:6eMF2SNy
sin()の結果に13桁の精度が欲しいなら、入力値に小数点以下13桁の精度が要るのよ
sin()は2piの周期関数だから
1000000の所に7桁も使っちゃうのはもったいないのよ
0573デフォルトの名無しさん
垢版 |
2021/12/26(日) 22:29:03.39ID:Ep2AbKxF
お前は小学校の国語からやり直せw

>> まだ「小学校の算数で分かる」誤差の話してんの?
誰も小学校で習うなんて言ってないぞ
0575デフォルトの名無しさん
垢版 |
2021/12/26(日) 23:16:02.57ID:P9feSsDc
俺小学4年生で級数展開したπの計算してたけど・・・
6年生でアセンブラと実数使ってたけど・・・
0576デフォルトの名無しさん
垢版 |
2021/12/27(月) 08:46:39.54ID:B/I2o19O
教える奴もよく分かってないからめちゃくちゃになってる

基本的には大きい数についても>>563の考え「x も sin(x) も上から15桁全部有効な桁」で合ってる
sin() が 0 になるケースを考えてるからややこしいんだよ
sin() が 1 になるケース、つまり pi/2 の奇数倍で 100 万に近い数を入れてみろ
そしたらちゃんと 15 桁くらい 1 になるから

0 がややこしい理由は、仮数部が何であっても良いから
例えば 1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす
0578デフォルトの名無しさん
垢版 |
2021/12/27(月) 18:35:09.36ID:osgcVgi4
uniform_real_distribution の範囲を可変にしたいときってどうしたら良いでしょうか
0 から 1 までの実数を生成するようにしてそれを変数変換するべきですか
0580デフォルトの名無しさん
垢版 |
2021/12/27(月) 20:26:27.31ID:7ufKNB24
>>576
1になるケースでほぼ1になるのは、そこでの微分が0だからだよ
入力値がちょっとずれても結果への影響が小さいのよ
0581デフォルトの名無しさん
垢版 |
2021/12/27(月) 20:45:16.64ID:7ufKNB24
「x も上から15桁全部有効な桁」だからこそ、
1000000の所に7桁も使っちゃうのはもったいないのよ

sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所
0582デフォルトの名無しさん
垢版 |
2021/12/28(火) 01:04:16.62ID:OVEU2JJm
厳密な2πnと、doubleで表した有効桁数15桁の大体2πnに近い数字の差を計算すると、nが大きくなるほど差がデカくなってくるってだけの話じゃないの?
浮動小数点数は0から離れれば離れるほど目盛りが大きくなっていくのだから。
sinの実装がマクローリン級数展開でなくても起こる問題だと思うが。
0585デフォルトの名無しさん
垢版 |
2021/12/29(水) 21:49:37.03ID:+eZ32Uo6
>1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす
mjk、

IEEE754の2進数形式の倍精度浮動小数点表示は
仮数部がケチ表現の52 bit(実質53 bit)で
指数部は-1022〜+1023なのやぞ
1e-20とか1×2^(-60)かそこらなので無問題で53 bit(=15.9桁)の精度ェ、
0586デフォルトの名無しさん
垢版 |
2021/12/29(水) 21:55:43.45ID:+eZ32Uo6
>sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所
x << 1のとき
sin(x) ≒ x
であることの見事な工学的応用、
0588デフォルトの名無しさん
垢版 |
2021/12/30(木) 01:48:03.91ID:L6Vpkxay
よっしゃ、よっしゃ、おっちゃんがいいもん作ったろう
https://ideone.com/fjxKtS

n=0,10000, 20000, 30000, ...,1000000 (とりあえず10000刻み)として、
2分探索でsin(x)=0となるxを、2π*n付近について調べてやった

そうやって求めたxをM_PIで割った結果はきっちり2*nになるから
sin(x)がxの周期関数だからといって必ずしもxの増大につれ誤差が増えるわけではないことがワカル

sin_valの値(=sin(x))が0に対して増えたり減ったりするのはマクローリン展開の近似多項式の係数を
結果があたりさわりのない誤差範囲でうろうろするように調整してあるんだろJK、
0590デフォルトの名無しさん
垢版 |
2021/12/30(木) 02:32:05.49ID:7UdZ08Kf
>>588
結果見たけど、sin_valの値は、きっちり0から10000になったときに5桁精度悪化してるし、100000で6桁精度悪化してるのでは…?
0591デフォルトの名無しさん
垢版 |
2021/12/30(木) 07:31:31.40ID:xtSEOuqd
>>589
パッと見だけど>>565が答えじゃねえの
浮動小数点てのは文字通り小数点位置が異なる
数値が1付近と100万付近じゃ精度が異なるのは当たり前
精度を保つなら固定小数点使わないと
0594デフォルトの名無しさん
垢版 |
2021/12/30(木) 12:38:33.70ID:A3EHubzP
質問主が現れないからもう何議論しても無駄な気がする
ソースコードがあるわけでもないし

100万程度で誤差ヤバい言うぐらいだからfloatで計算してないか疑たくもなる
0597デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:22:01.38ID:kcosmPcn
vectorでクラスへのポインタを持ってて、それを参照で受け取る関数を作るとき、クラスの変更を禁止したいんですが、どうすればいいですか?

例えば、
struct testclass{
int member;
};
というクラスがあって、
vector<testclass*>
を参照渡しで受け取る関数を作るとき、引数をconst vector<testclass*>& vecとしてもvec[0]->member =0みたいなクラスのメンバ変数の変更は関数の中で出来てしまうと思うのですが、そういうのをできないようにしたいです(testclassの変更が無いことを関数宣言で保証したいです)
何か良い方法ありますか?

vectorが1重であればtestclass const*const*を引数にすればいいとは思うのですが、vector<vector<testclass*>>のように多重vectorみたいな場合も作りたくて、そのときは関数を呼ぶ側で多重vectorから多重配列に変換するのは面倒なので、できればvectorではなく配列を使うというのはしたくないです
0600デフォルトの名無しさん
垢版 |
2021/12/31(金) 05:10:34.66ID:zF3P5q1E
ちなみにsinがゼロのとこは微分が1か-1でsinが1のとこは微分がゼロだから違うってのは、事実だが今回の事象の説明としては感覚的に過ぎるね

なぜならf(x) = xなる関数は微分は1だが f(1000000.3575642) は14桁正しいw

sinの挙動について理解したいなら実装に踏み込むしかないよ
あるいは>>576あたりで思考停止しとくか
0601デフォルトの名無しさん
垢版 |
2021/12/31(金) 06:37:46.15ID:qJZ2APUI
>>597
アクセスを厳密に禁止したいなら、配列操作のみ定義したラッパークラスを用意して渡したほうが良い。
0603デフォルトの名無しさん
垢版 |
2021/12/31(金) 08:45:47.76ID:FPee+d5o
クラス T のメンバ関数で自身のコピーを返す(つまり返り値の型が T)ものを考える
メンバ関数の修飾が && のときは std::move(*this) とかしたいけどこれはいちいち書かないとダメ?
普通は std::forward で統一できるが
0605デフォルトの名無しさん
垢版 |
2021/12/31(金) 11:52:30.35ID:kcosmPcn
>>598
ありがとうございます
ただ、
>メンバ変数を非publicにしてgetter/setter
これだと結局setterでメンバ変数を変更できてしまいますよね?

>>601
ありがとうございます、検討してみます
0606デフォルトの名無しさん
垢版 |
2021/12/31(金) 14:47:55.66ID:fEOKhR13
instance.field; が暗黙のうちに書き変わらないだけでも効果あるんだよ

void f(T&t){ t.clear();}
f(instance.field);
うっかりこんなことしたらヤバいし

const T& get_field() const;
を使っとけばコンパイル時エラーにしてくれる

>>597 冒頭の質問なら、参照渡し引数に
void f(const T&);
のようにconstつけとけばいい
0608デフォルトの名無しさん
垢版 |
2022/01/04(火) 07:21:58.04ID:5hvio7Nh
Packtpubが不安定になってるんだけど。
見れますか?
0609デフォルトの名無しさん
垢版 |
2022/01/05(水) 21:49:37.99ID:2R8vvmqQ
クラステンプレートについて、明示的実体化しておけば実装を.cppでもできるというのを知ったのですが、その場合、テンプレートでない普通のクラスと同じように
部分的にヘッダに実装を書いて、残りを.cppに書く、というのは正式な書き方として許されるでしょうか?
0613デフォルトの名無しさん
垢版 |
2022/01/07(金) 00:07:55.52ID:UgPywUlD
class T;

class C {
public:
T t;
};

とあったとき

C c{T()};

と集成体初期化を行うと T のコンストラクタが1回だけ呼ばれます
メンバ t をカプセル化してコンストラクタを自分で用意するとどうやっても T のムーヴコンストラクタが余計に1回呼ばれてしまうと思ったのですが回避する方法はありますか?
0614デフォルトの名無しさん
垢版 |
2022/01/07(金) 02:01:17.79ID:uUhimsKL
>>613
直接的にはないけど
optionalとかvariantにあるin_placeコンストラクタと同じことをすればTのコンストラクタ呼び出しは一回で済みそう
0618デフォルトの名無しさん
垢版 |
2022/01/12(水) 09:32:50.44ID:kvnPCGqB
関数の定義で
auto foo() -> void{}
みたいに書くの見かけたけどこのやり方何かメリットありますか?
0620デフォルトの名無しさん
垢版 |
2022/01/12(水) 12:26:17.78ID:Z0p/7uhd
>>618は型推論効いてないやん
0621デフォルトの名無しさん
垢版 |
2022/01/12(水) 12:28:40.33ID:VUzGdiiG
戻り値の型を->の先に書いてあるだけだよ。
だからこれはvoid型の戻り値ね。

利点は引数からdecltype使って戻り値の型を指定できるくらいじゃない?
0623はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/12(水) 13:59:43.98ID:7Sv8jpqL
ラムダ式で返却値の型をどう書くかというのが後置スタイルを導入した直接の動機だと思う。

普通の関数で後置にするメリットがない場合であっても、
メリットがある場合とない場合で区別して使い分けるよりは全部を後置で一貫させたほうが綺麗だと思うこともあるだろ。
0624デフォルトの名無しさん
垢版 |
2022/01/12(水) 17:10:39.04ID:VRtGvzgV
みずほが復旧をあきらめるとかどうみてもfukkyu
0625デフォルトの名無しさん
垢版 |
2022/01/12(水) 18:43:03.08ID:NICGWYWs
人がつくったものネットから持ってきて何個も組み合わせて合体させるとみずほみたいになるんだろうな
自分で作ってない部分はメンテしようがないからな
0626デフォルトの名無しさん
垢版 |
2022/01/12(水) 19:53:35.19ID:UH3nST5b
Windows serverにしたのが最大の間違い。
0627デフォルトの名無しさん
垢版 |
2022/01/12(水) 20:51:55.49ID:VUzGdiiG
std::stringの大文字を全て小文字に変換するのってstd::transformより良いものあるの?
0628デフォルトの名無しさん
垢版 |
2022/01/12(水) 22:50:55.12ID:VRtGvzgV
Windowsで文字列中の大文字を小文字に変換する_mbslwr()って今やランタイムで使えなくなってんだね、知らんかったわ
0630デフォルトの名無しさん
垢版 |
2022/01/13(木) 21:50:13.52ID:bN4t5i1e
c++のexe → ライブラリA(c++のdll)

c++のcリンケージのdll → ライブラリA(c++のdll)

同じライブラリの同じ関数を呼び出してるのに
呼び出し元の形態によって挙動が変わるなんてこと有り得ますか?
0631デフォルトの名無しさん
垢版 |
2022/01/13(木) 22:14:06.74ID:+PFReeTS
ライブラリも呼び出し元も外部の同名のdllをリンクしているけれども
呼び出し元が参照しているdllの実体が別だったとか。
0632デフォルトの名無しさん
垢版 |
2022/01/14(金) 09:16:33.28ID:ovvIshUS
struct Vector2 { float x, y; };のような64bitで済んでしまうものの計算にSSE命令を使っても高速化は見込めないのでしょうか?
上記に対して_mm_mul_psを行うと上位2float分を余計に計算させることになってしまいますよね
0635デフォルトの名無しさん
垢版 |
2022/01/16(日) 12:31:04.34ID:20f7Ghpo
>>630
同じ関数というのが関数名と引数の数が同じというだけなら
extern "C" double sqrt(double x);
extern float sqrt(float x);
とから有り得る
0636デフォルトの名無しさん
垢版 |
2022/01/17(月) 15:18:31.08ID:sD13NBSV
pair<int, int> の first と second に、例えば座標と向きのような意味をもたせてるとします
このとき、using なんかを使って pair<int, int> x の第一要素と第二要素に x.pos、x.dir のようにアクセスする方法ってありますか?
0639デフォルトの名無しさん
垢版 |
2022/01/17(月) 16:07:55.78ID:h5bglXe3
>>636
そういうあちこちで使う用途の、はっきり意味が決まった構造体は
pairやtupleに頼らない方が(大抵の場面では)便利だよ
その一箇所でしか使わないならpairでいいと思うけど
0640はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/17(月) 16:18:00.13ID:jU2WrI4n
いくつかの要件を満たして "Tuple-like" であるようなクラスはタプルのように扱える仕組みがある。
タプルを多用途に使うよりは個別のクラスを作った上でタプルのインターフェイスを持たせるほうが
使いやすくなると思う。
0643デフォルトの名無しさん
垢版 |
2022/01/17(月) 17:35:43.45ID:AdXHrviP
みなさん御機嫌よう
このスレには何度も助けられているものです
再度お知恵を拝借したいです

任意のユーザー定義型のインスタンスhogeが、基底クラスbaseを継承しているか調べたいです。
この一例のみならtypeidで合致させればいいと思うのですが、実際は派生クラスが200くらいある予定です。
type-traitでインクルード出来るstd::is_base_ofで、RTTIを使い判定しようとしたのですが、typeidで取得できる型で合致させようとしたところ型情報が合いません……orz
どんな方法でもいいので何かいい方法がございましたらご教授いただければと思います。

class base{};
class driv:public base{};
class foo{};

//もしhogeがfoo型のインスタンスなら偽を、drivのインスタンスなら真を返したい関数
bool exHantei(){}
0645はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/17(月) 17:49:59.30ID:jU2WrI4n
>>643
静的な型を判定するならこういうのでいけると思うが、
RTTI が出てくるってことは状況が違うのかな?

#include <iostream>
#include <type_traits>

class base{};
class driv : public base{};
class foo{};

template<class T>
bool exHantei(const T&){
return std::is_base_of<base, T>::value;
}

int main(void) {
driv hoge;
foo huga;
std::cout << exHantei(hoge) << std::endl;
std::cout << exHantei(huga) << std::endl;
}
0648デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:49:09.31ID:AdXHrviP
>>645
ありがとうございます。
ただ今これで動作確認はしました。

が本来は基底クラスのポインタに格納されているのです……
書き込む時に蛇足と思って省いてしまったのですが、実際は
class base{};
class driv:public base{};
class WantToFind:public driv{}
std::vector<base*> VecBasePtr;
void pusbak()
{
WantToFind f1;
VecBasePtr.push_back(&f1);
}
というようにベースポインタに押し込んで使っていて、exHantei()を使用する時にはベースとこのポインタを比較することになります。
今はちみつ餃子様のコードで動作確認をした後、自分のコード用に書き直したところ、ポインタから型を取得させる動作ができません(泣)
てっきりtypeidと同じ様に、exHantei(*VecBasePtr[0]);と*を付けてポインタの中身を外に出せば生のWantToFind型が出てくるかと思ったのですが……
思い通りの動作が出来ませんでした。
どうしてなんですかね、、、
デバッグモードで確認してもわからない
もちろんbaseに仮想関数は置いてあるので、RTTIで動作してくれるものと思っていましたが。
Templateの機序が違うのかな……?
0650デフォルトの名無しさん
垢版 |
2022/01/17(月) 21:36:21.92ID:AdXHrviP
>>649
ありがとうございます!!!
確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆
こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。

レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。
返信をくださった方々には重ね重ねお礼申し上げます。
まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。
皆さんありがとうございます!
0651はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/01/17(月) 21:36:54.84ID:jU2WrI4n
>>648
動的型で継承関係を確かめるなら >>646 が述べている通り dynamic_cast で実際に変換してみるのは手っ取り早い方法だと思う。

> 生のWantToFind型が出てくるかと思ったのですが……

「生の」ってなんやねん。
その場合の *VecBasePtr[0] の静的型はあくまで base だよ。
オブジェクトの base である部分 (サブオブジェクト) が取り出される。
いわゆるスライシング。
0652デフォルトの名無しさん
垢版 |
2022/01/17(月) 21:37:50.95ID:AdXHrviP
dynamic_castは知ってたはずなのに思い出さなかったというか思いつかなかった……
0653デフォルトの名無しさん
垢版 |
2022/01/17(月) 21:46:56.12ID:AdXHrviP
>>651
ありがとうございます。

自分はスライシングもちゃんと理解してないですね……
ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる)
悪魔でも基底型なのですね?
キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。
type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。
0654デフォルトの名無しさん
垢版 |
2022/01/17(月) 21:55:40.15ID:h5bglXe3
dynamic_castって仮想関数テーブル必要じゃなかったっけ?
まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う
多分
0656デフォルトの名無しさん
垢版 |
2022/01/19(水) 18:16:17.94ID:oZ05fVjC
用語って大事だよな
言葉遣いがおかしいの指摘されると逆ギレする
DQN気質なやつが残念ながら後を経たない
0658デフォルトの名無しさん
垢版 |
2022/01/20(木) 09:07:39.69ID:PFfSIkf2
#include <cctype>
//#include <string>

template <typename F>
void test(F&& f){}

int main(){
test(std::isprint);
}
これ<string>を有効にするとcouldn't deduceになるんだけど
なんで?

コンパイラはMSYS2 g++ 10.3.0
0659デフォルトの名無しさん
垢版 |
2022/01/20(木) 09:24:47.83ID:MuVW7weO
名前衝突してんじゃないの?
0660デフォルトの名無しさん
垢版 |
2022/01/20(木) 09:37:40.24ID:PFfSIkf2
<locale>のテンプレートが干渉してるっぽいことはわかった
これ、俺の落ち度なの?
0665デフォルトの名無しさん
垢版 |
2022/01/21(金) 00:00:01.47ID:/d5tBos9
RTTIも例外も標準C++の一部
それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない
0668デフォルトの名無しさん
垢版 |
2022/01/21(金) 07:28:47.34ID:VVQk5y8F
とりあえずOSないところか、簡単な仕組みしかないところでC++で何か書いてみればいいよ
処理系が何をしてくれているのか分かる
0670デフォルトの名無しさん
垢版 |
2022/01/21(金) 07:59:33.55ID:j/G12RQ8
658だけど、自己解決の報告。
テンプレートにしないで
void test(int(*f)(int)){}
にしたら<locale>のisprintが干渉しなくなった
最初の発想がいかんかった
0671デフォルトの名無しさん
垢版 |
2022/01/21(金) 08:26:30.46ID:VVQk5y8F
isprintのテンプレート引数が決まらないからだろ
test(std::isprint<int>);
とかなら通ると思う
0672デフォルトの名無しさん
垢版 |
2022/01/21(金) 08:32:03.82ID:VVQk5y8F
compiler explorerのarm g++ 10.3で確認した。ヘッダはlocaleにした。
#include <locale>
template <typename F>
void test(F&& f){}
int main(){
//test(std::isprint);
test(std::isprint<int>);
}
0673デフォルトの名無しさん
垢版 |
2022/01/21(金) 08:47:07.93ID:VVQk5y8F
元のコードをなるべく変えずにだと
#include <string>
#include <cctype>
template <typename F>
void test(F&& f){}
int main(){
test(static_cast<int (*)(int)>(std::isprint));
}
※オーバーロードを選択させるべくキャストする
0674デフォルトの名無しさん
垢版 |
2022/01/21(金) 09:54:53.25ID:j/G12RQ8
conceptでテンプレートテンプレート引数を弾いたりできないかとも思ったけど
SFINAEは関数の除外なので引数の候補を絞るのは無理だった
0675デフォルトの名無しさん
垢版 |
2022/01/22(土) 10:28:58.52ID:om6KWGu4
class A { static inline struct SubStruct { int value; } Field1; } //通常の構造体のスタティックメンバ変数はヘッダファイル、cppファイル共に実体は同じ
class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる

この挙動は仕様なのでしょうか?
0678デフォルトの名無しさん
垢版 |
2022/01/22(土) 11:49:22.43ID:XNgWTOyh
>>675
名前のない構造体には実体がなく外部リンケージを持たないのでそこに対するinline指定は無視されるってことでは?
分かりにくいけど仕様として矛盾してはいないと思う
0679デフォルトの名無しさん
垢版 |
2022/01/22(土) 13:06:33.51ID:BllOBQpy
>>675
「ヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」という状態をどうやって観測しているの?
そんな挙動しないと思うんで、観測方法に間違いがありそう。

>>678
名前のない構造体もクラス型としては存在するし、それとは別に変数 A::Field1 は外部リンケージを持つよ。
https://timsong-cpp.github.io/cppwp/n4861/basic.link#5
> In addition, a member function, static data member, ..., has the same linkage, if any, as the name of the class of which it is a member.
0680デフォルトの名無しさん
垢版 |
2022/01/22(土) 13:08:52.36ID:BllOBQpy
>>678
あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。
0681デフォルトの名無しさん
垢版 |
2022/01/22(土) 13:59:06.18ID:0LC8SyT+
>>599
アーハン?
doubleで表現可能な最小の数と1e-14の大小関係もわかんない人なんですかね、、、
0682デフォルトの名無しさん
垢版 |
2022/01/22(土) 14:05:40.45ID:0LC8SyT+
>>593
その2π周期というのが厳密に2*M_PI周期であることの根拠は?
>>560の時点ではそれは示されていなかった
>>588で2*M_PI周期と言う実験結果がデタ
0683デフォルトの名無しさん
垢版 |
2022/01/22(土) 14:11:22.71ID:0LC8SyT+
>>596
万能の一般論は無い(キリ
なぜなら、f(x)が0かどうかの判定をしたいとして、±|處を0とみなすべきなのかは
f(x)の精度に依存するから
ただし、>>560式に f(x1) と f(x2) の等値判定なら >>560式にやりうる
これは f(x1) - f(x2) のゼロ判定として>>560式にやればよろっし
0685デフォルトの名無しさん
垢版 |
2022/01/22(土) 16:12:55.51ID:13b+4FON
>>681
O(1) の数値を使って計算してたら例えば 1e-15 以下の数値をゼロと見なすとかするより他ないでしょ
バカ?
0690デフォルトの名無しさん
垢版 |
2022/01/22(土) 19:34:50.12ID:DSkywrpw
>>560
>100万をsin()しても、sin()は2π周期
>doubleの精度15桁中の5桁以上を無駄にしている

これよくわからん。
0692デフォルトの名無しさん
垢版 |
2022/01/22(土) 20:37:14.45ID:0LC8SyT+
double sin(double x)の精度が±10E-10程度らしいことは>>588の結果が示しているが
こっれはxが100万かどうかによらないことも結果が示してゐる
実装を見ないとわからんが、多分マクローリン展開の打ち切りによる誤差とみるべき
0693デフォルトの名無しさん
垢版 |
2022/01/22(土) 21:05:23.18ID:yfbq4hUz
>>692
実装見てから言った方がいいよ。マクローリン展開というが、0を基準にマクローリン展開してるわけないだろ。
0694デフォルトの名無しさん
垢版 |
2022/01/22(土) 21:18:55.93ID:0LC8SyT+
>>685
その方法は等値判定として一貫性が無いからNG
double x = 2.0;
double y = 2.0 + (10E-15) / 2.0;
assert(fabs(x - y) <= 10E-15); // pass. 10E-15基準で x == y とみなされる
assert(fabs(100 * x - 100.0 * y) <= 10E-15); // fail。 10E-15基準の下で 100 * x と 100.0 * y はイコールにならにあ
0695デフォルトの名無しさん
垢版 |
2022/01/22(土) 21:22:04.30ID:0LC8SyT+
>>693
sin(x)の場合は|x|<<1においてsin(x) ≒ xなのでsin(x+a)を展開をする際のaを0にするのが妥当に思えまっする、
0697デフォルトの名無しさん
垢版 |
2022/01/23(日) 09:39:04.54ID:CWW/bMN0
>>678
挙動としては正にそんな感じですね

>>679
test.hにあるinline void 内でprintf("%p\n", Field1)、test.cppのvoid Func1内で同様の事をして確認しました
出力のみならず、そもそもヘッダのinline void内でField1に値をセットしたはずなのにソース内ではデフォルト値のままで動作が狂ったので上記のテストをして発覚した次第です
structを名前付きにするかしないかの一点だけで上記の結果が変わります
0699デフォルトの名無しさん
垢版 |
2022/01/23(日) 10:41:30.96ID:QgynSmAQ
#include<iostream>
struct A{static struct SubStruct{int value;} Field1;};
A::SubStruct A::Field1;
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}
無名で実体の定義なんてできんのか?
0704デフォルトの名無しさん
垢版 |
2022/01/23(日) 10:51:47.13ID:QgynSmAQ
#include<iostream>
struct A{static struct {int value;} Field1;};
decltype(A::Field1) A::Field1;
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}
意外とやってみたら出来たw
0705デフォルトの名無しさん
垢版 |
2022/01/23(日) 10:55:02.08ID:vZkrAotW
>>700

A::SubStruct{}
で実体の「定義」ができる

&A::SubStruct{}
は実体がprvalueという理由でエラーだが
実体を定義できるか否かとは別問題だ
0709デフォルトの名無しさん
垢版 |
2022/01/23(日) 11:05:12.08ID:QgynSmAQ
コードはこんなのね(with -std=c++17)
#include<iostream>
struct A{static inline struct {int value;} Field1;};
int main() {
std::cout << std::hex << &A::Field1 << std::endl;
return 0;
}
0710デフォルトの名無しさん
垢版 |
2022/01/23(日) 11:25:38.49ID:QgynSmAQ
実体は同じのを指すようで再現しなかったな。MakefileはちゃんとTAB入れてな。
cat >Makefile <<EOF
CXXFLAGS += -std=c++17
sample: main.o sub1.o sub2.o
\$(LINK.cc) \$? -o \$@
EOF
cat >main.cpp <<EOF
void sub1();
void sub2();
int main() {
sub1();
sub2();
return 0;
}
EOF
cat >sub1.cpp <<EOF
#include<iostream>
struct A{static inline struct {int value;} Field1;};
void sub1() {
std::cout << std::hex << &A::Field1 << std::endl;
}
EOF
cat >sub2.cpp <<EOF
#include<iostream>
struct A{static inline struct {int value;} Field1;};
void sub2() {
std::cout << std::hex << &A::Field1 << std::endl;
}
EOF
make
0714デフォルトの名無しさん
垢版 |
2022/01/23(日) 16:31:20.27ID:QgynSmAQ
>>713
流石にヘッダファイルから何かが生成されることはないw
wandboxで複数オブジェクトファイルって処理系内部の作り次第になるし、>>710でもやってみようかと思ったけど、3つは無理そうだね
0716デフォルトの名無しさん
垢版 |
2022/01/23(日) 17:32:20.44ID:CWW/bMN0
>>711
検証頂いてるところ環境を明記しておらず申し訳ありません
Visual Studio 2022、C++20で発生している現象です

#include "test.h"
int main() //main.cpp
{
A::Initialize(); //printf("%p\n", &A::Field1);をするだけのstatic inline関数
A::Func1(); //printf("%p\n", &A::Field1);をするだけのstatic関数(__declspec(noinline)をし実装はtest.cpp)
}

struct名をつければInitializeの出力とFunc1の出力は一致、無名structにしたら不一致
本当に他は一切いじらずに名前の有無だけで変わります
0717デフォルトの名無しさん
垢版 |
2022/01/23(日) 17:54:11.09ID:QgynSmAQ
現象を再現させる最小限のコードを全セット載せないと先には進まんて
始めからそうしてればこんなにいろいろ書かずに済んでいる
0719デフォルトの名無しさん
垢版 |
2022/01/23(日) 18:18:38.46ID:K/S7vg9Z
>>716
MSVC のバグっぽいね。おとなしく名前つけて回避しつつ、できればバグ報告しとくのがいいんじゃない。
0720デフォルトの名無しさん
垢版 |
2022/01/23(日) 20:02:54.49ID:QgynSmAQ
>>715
>>675で「無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」
と書いてあるが、ヘッダファイルから直接実体は生成されないよってこと
.cppなどのソースファイルからincludeされないとコンパイルしないから
(もちろんただのファイル名なのでコンパイラに直接ヘッダファイルをコンパイルせよと指定する事はできる)

つまりA::Field1に該当するシンボルが複数の.objに含まれた場合、同じになっているか=アドレスが同じになるか?
の検証でないと意味がない
0721デフォルトの名無しさん
垢版 |
2022/01/23(日) 20:09:37.28ID:QgynSmAQ
>>718
それは昔からgccを使ってる人は知ってるけど、そういう話じゃない
明らかに不自然な位置にソースファイルを指定して無理矢理2個同時にコンパイルする上に、引用されて3個はできない
つまり想定された使い方ではないということ
おまけに処理系やそのバージョンを複数変えられることが比較的便利なwandboxで、処理系を変えると確認が必要になるやり方はどうかと言っただけ
まあ、分かってるとは思うんだが
0722デフォルトの名無しさん
垢版 |
2022/01/23(日) 20:24:03.88ID:QgynSmAQ
とりあえず、710のコードでVS2019を調べた結果、再現は確認できた。
ただし、コンパイルオプション次第で現象が出たり出なかったりする。
VS2022でもないし、VSはコンパイルリンクオプションがデフォルトで大量に指定されてて確認が面倒なのでそれ以上は放棄した。
以下のコードではpermissive-オプションの有無で現象が再現したりしなかったりするが、デフォルト時だとその切替えで現象は変わらないので、一次原因ではないと思う。
0723デフォルトの名無しさん
垢版 |
2022/01/23(日) 20:24:36.31ID:hHkcGLX7
保守できないような書き方して自分の仕事を守る。PGの当然の権利ですよね。
0724デフォルトの名無しさん
垢版 |
2022/01/23(日) 20:25:06.27ID:QgynSmAQ
> main.cpp (
@echo void sub1^(^);
@echo void sub2^(^);
@echo int main^(^) {
@echo sub1^(^);
@echo sub2^(^);
@echo return 0;
@echo }
)
> sub1.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub1^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sub2.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub2^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sample.mak (
@echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive-
@echo .cpp.obj:
@echo $^(CXX^) $^(CXXFLAGS^) /c $^<
@echo sample.exe: main.obj sub1.obj sub2.obj
@echo link /OUT:$@ $^*^*
)
nmake /f sample.mak
rem バッチファイルもnmakeもよく知りません。
0729デフォルトの名無しさん
垢版 |
2022/01/24(月) 19:27:55.24ID:WxnVLAIm
C++11から、C++20までの変更点を解説した入門書を年末に買ったのだが(C++は書けるよ)、まだ読む気になれないw
「今更C++か、pythonでいいだろ」と悪魔が囁くw
0730デフォルトの名無しさん
垢版 |
2022/01/24(月) 19:42:15.63ID:nLfFXIoN
c++cliについてネットに解説している情報あまり無いですが、まとまってるサイトとかないですかね。
0733デフォルトの名無しさん
垢版 |
2022/01/26(水) 05:15:43.56ID:DGJ/MazB
1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_CREATE:
SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義
break;
case WM_TIMER: //タイマー
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
tmDraw(hdc); //これを呼んで描画
EndPaint(hWnd, &ps);
}
break;
return 0;
}
static VOID tmDraw(HDC hDC)
{
SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認
SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00));
Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
}
最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。
呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。
windowサイズを手動で変えていくと四角は右に伸びていき更新されます。
タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
0736デフォルトの名無しさん
垢版 |
2022/01/26(水) 07:50:18.18ID:td9ayUMw
アップデートはマイクロソフトがやりたい時にやる
という基本理念を理解していないようだね
0737デフォルトの名無しさん
垢版 |
2022/01/26(水) 09:14:18.23ID:m89Xdimf
WM_TIMERでInvalidateRectしておくとWindowsがWM_PAINT呼んでくれるからそこで描画するんだっけ
0739デフォルトの名無しさん
垢版 |
2022/01/26(水) 09:26:13.12ID:WR8doP3S
べつにアイドルループで描画してもいいんだよ
メッセージの処理さえ忘れずにピークしてこなせば
0741デフォルトの名無しさん
垢版 |
2022/01/26(水) 09:36:18.65ID:dkXO6/An
どこにでもいるんだよ
自分より下の者をいたぶることで
安心しようとするチンピラ気質なやつは
0742デフォルトの名無しさん
垢版 |
2022/01/26(水) 10:21:44.17ID:qvNTvCwo
だってココ定期的に湧くじゃん
Windows使っててWin32APIの使い方聞いてくるC++ほとんど知らない自称天才のバカ
同じやつだよきっと
毎回Win32APIに誘導されてるってのにな
0743デフォルトの名無しさん
垢版 |
2022/01/26(水) 10:46:25.17ID:g/1zEXcm
あー、言われれば確かにそんなの居たっけ・・
でもまぁ同一人物とは限らないんだし誘導して終わりでいんじゃね
たまに見当違いの初心者は入ってくるし(DirectXスレにDirectXランタイムのインスコの仕方聞きにきた猛者が居た
0745デフォルトの名無しさん
垢版 |
2022/01/26(水) 11:06:01.05ID:qvNTvCwo
DirectXスレにDirectXランタイムのインスコの仕方聞くのはまだ仕方ない話
ドライバ固有の問題に当たっているなら専門家に聞いた方がいいだろう

自称天才のバカである確率の方が高いと思うし、高確率で単発IDで荒らすバカも同じだろうし、わざわざレスしてくるやつも同じだろうから、バカにはバカと言ってあげた方が親切
0746デフォルトの名無しさん
垢版 |
2022/01/26(水) 12:02:29.99ID:dkXO6/An
誘導ももう済んでるのに
どうしても喧嘩言葉を使いたくて沸いてくる
三下のそのまた下の家畜はいいのか
0747デフォルトの名無しさん
垢版 |
2022/01/26(水) 13:23:53.73ID:m89Xdimf
DirectXランタイムが許されるならWin32 APIだって許してあげなよ
製品名はVisual C++だし、既定の拡張子 .cpp なんだから Win32はC++ではなくCだって言ってもしょうがない
0748デフォルトの名無しさん
垢版 |
2022/01/26(水) 23:06:08.50ID:UuxYD5f6
いかにも漏れは天才だが
さすがにWinMain()から書くようなバリバリWindowsアプリの質問はしないかなあ、、、
漏れの言ってることがまるで理解できない低レヴェル凡人の反発を招くことはあってもな
0751デフォルトの名無しさん
垢版 |
2022/01/29(土) 15:04:46.13ID:mo0R2qbj
大学の課題でコンパイルエラーになるので教えてもらいないでしょうか
main.cppで、B<A> b; b.display(); のようにAを使っています。
g++ -Wall -std=c++17 -g -o test a.cpp main.cpp
undefined reference to `operator<<(ostream&, A const&)'
※コンストラクタなどの関数定義は省略してます。
■ a.h
class A {
public:
  string m_str;
  friend ostream & operator << (ostream &os, const A &a);
};
■ a.cpp
ostream & operator << (ostream &os, const A &a)
{
  os << a.m_str << endl;
  return os;
}
■ b.h
template <typename T>
class B
{
public:
  void display(ostream &os = cout) const;
  T m_dummy;
};
template <typename T>
void B<T>::display(ostream &os) const
{
  os << m_dummy << endl; // ここが undefined referenceエラー
}
0752751
垢版 |
2022/01/29(土) 15:50:41.96ID:mo0R2qbj
失礼、自己解決しました。
namespaceをa.hだけ括って、a.cppに入れ忘れましたw
0753デフォルトの名無しさん
垢版 |
2022/01/31(月) 02:23:38.98ID:iz74n4+D
下の★1を★2のように書きたいんだけど、どうやって書けばいいのか
教えてぇ

#include <iostream>

template <typename T>
auto Sum(T h)
{
  return h;
}

template <typename Head,typename... Rests>
auto Sum(Head head,Rests... rests)
{
  return head + Sum(rests...);
}

template<class F,class... Args>
auto
foo(F&& f,Args... args)
{
  return f(args...);
}

int main( int argc, char *argv[] )
{
  std::cout << foo(Sum<int,int,int>,1,2,3) << "\n";//★1
  //std::cout << foo(Sum,1,2,3) << "\n"; //★2

}
0756デフォルトの名無しさん
垢版 |
2022/01/31(月) 14:49:02.61ID:y2HjUy1l
>>753
・まず、Sumを多重定義にする必要性は特にないはず
・次に、fooが関数でSumが関数テンプレートの場合、
 関数の実引数として具現しないテンプレートは渡せない

だからfooの代わりにstd::bindを使っても解決しない

・テンプレートテンプレート仮引数を使っても
 クラステンプレートしか渡せず関数テンプレートは不可

こうなるとマクロくらいしか手がない
#define foo(func, ...) func(__VA_ARGS__)
0757デフォルトの名無しさん
垢版 |
2022/01/31(月) 16:24:09.60ID:4mzN2AL1
戻り値のautoが決まらないってことでしょ?autoをdouble固定にしてReturnをなくせば通る
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
int main( int argc, char *argv[] ) {
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
std::cout << wrap(sum, 1,2.1) << std::endl;
return 0;
}
// /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample
// /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’:
// /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’
// 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
// | ^~~~
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed:
// /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
0759デフォルトの名無しさん
垢版 |
2022/01/31(月) 22:50:37.06ID:67CF9RIT
ラッパークラスを通せば似たようなことはできそう。

struct Wrapper_ {
constexpr static auto doit = [](auto... args) { return Sum(args...); };
} wrapper;

int main( int, char ** )
{
std::cout << foo(wrapper.doit,1,2,3) << "\n";
}
0760デフォルトの名無しさん
垢版 |
2022/02/01(火) 04:38:50.89ID:X9o0BiPI
クラスは不要だった。
ラムダなら通るみたいだから、 >>758 みたいに元の関数をラムダで書くか、

auto wrapper = [](auto... args) { return Sum(args...); };

みたいなラッパー関数オブジェクト通すかってあたりで足りそう。

// 最初実験してたとき、ラムダ式にしただけだとエラー出てた気がしたんだけど、今やると問題なく通る…
0762デフォルトの名無しさん
垢版 |
2022/02/01(火) 07:53:40.48ID:vPA4cgbg
>>757にラムダ入れた。
ラムダはオーバーロードできずC++17の畳み込み式が必須で引数なしが表現できないが、選択の手間がない。
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
auto lambda_sum = [](auto head, auto ...tails) {return (head + ... + tails);}; // 追加
auto lambda_wrap = [](auto f, auto ...args) {return f(args...);}; // 追加
int main( int argc, char *argv[] ) {
std::cout << sum() << std::endl; // 追加
std::cout << sum(1) << std::endl; // 追加
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << wrap(sum, 1,2.1) << std::endl; // エラー
// lambda版追加
// std::cout << lambda_sum() << std::endl; // エラー
std::cout << lambda_sum(1) << std::endl; // 追加
std::cout << lambda_sum(1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(lambda_sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << lambda_wrap(lambda_sum<int,double>, 1,2.1) << std::endl; // not template
// std::cout << lambda_wrap(sum, 1,2.1) << std::endl; // エラー
std::cout << lambda_wrap(lambda_sum, 1,2.1) << std::endl;
return 0;
}
0763デフォルトの名無しさん
垢版 |
2022/02/01(火) 22:23:26.64ID:rdLB3H0G
c++では
sz=120;
char dt[sz];
このように配列のサイズを変数の可変サイズで指定することはできないんですか?
これを実現する方法は何かありませんか?
0764デフォルトの名無しさん
垢版 |
2022/02/01(火) 22:43:02.67ID:rdLB3H0G
自己解決しました
しかし dt[10][d] のように2次元以上はjavaのような動的変動はできないんですね
0768デフォルトの名無しさん
垢版 |
2022/02/02(水) 10:03:42.12ID:pPu7Tazo
コンストラクタ・テンプレートでテンプレート実引数を推定させず明示的に与えるのはどう書く?

struct some_class
{
template <class A> some_class(int) {}
};

int main()
{
some_class obj<void>(1); //error
}
0771デフォルトの名無しさん
垢版 |
2022/02/02(水) 12:56:51.10ID:X/91R13x
ファイルサイズを取得しようとしていろいろサイトを参考にして次のようにしたのですが
std::filesystem::file_size(path)
filesystemのところに赤線が出て使用できません
これらは記述しています
#include <iostream>
#include <fstream>
#include <filesystem>
使っているのはCommunity 2019です
filesystemが使えないのはなぜでしょう?
0775デフォルトの名無しさん
垢版 |
2022/02/03(木) 12:49:10.84ID:d1XPVqCl
filesystemは、できればC++20モードで使いたい
file_clockまわりがC++17ではgdgdだから
0776デフォルトの名無しさん
垢版 |
2022/02/04(金) 13:06:35.94ID:ovGR74Kw
小文字に変換するプログラムです
string toLowerCase(const string& str)
{
string lower = str;
std::transform(lower.begin(), lower.end(), lower.begin(), std::tolower);
return lower;
}
実行するとstd::transform 一致するオーバーロードする関数が見つかりません、とか
6引数が必要です 4が設定されてます、とか出て
実行できません
これは何が問題なのでしょうか?
0779はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/04(金) 13:28:07.50ID:RpLWwySn
>>776
ちょうど >>658 で同じような事例が出ている。
std::tolower は cctype ヘッダと locale ヘッダにそれぞれあって
locale ヘッダのほうが関数テンプレートだし二引数なのでこの場の都合に合わない。
なんらかの方法でどれを使うのか選択する必要があり、
たとえば static_cast などが使える。
ただ、 >>661 が提示しているようにデフォルト引数が追加される可能性があったりもするので
static_cast よりはラムダ式を経由するほうが安心できるスタイルかもね。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

std::string toLowerCase(const std::string& str)
{
std::string lower;
std::transform(std::begin(str), std::end(str), std::back_inserter(lower), static_cast<int(*)(int)>(std::tolower));
return lower;
}

int main(void) {
std::cout << toLowerCase("abcDEfgHi") << std::endl;
}
0782デフォルトの名無しさん
垢版 |
2022/02/05(土) 11:50:25.88ID:DOE5sh/+
template<yyy T>//yyyはコンセプト
requires !xxx<T>//xxxはコンセプト
void test(const T& a);//yyyのコンセプトを満たしxxxのコンセプトを満たさないものについて処理したい

C++20のコンセプトのrequires節って!使うと警告出るのでわざわざ否定用のコンセプト作成して対応してるんだけど、もっと簡単な仕組みない?
0785デフォルトの名無しさん
垢版 |
2022/02/05(土) 20:23:31.04ID:Irrrknzv
#define FOO() 1

#if FOO
...
#endif

と書いた場合FOOの後ろに()付けるの忘れてるのでコンパイルエラーになって欲しいんですが
実際はFOOは偽に評価されてるみたいです
何が起きてるんでしょうか?
0786はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/05(土) 20:31:08.99ID:NEwj3nV7
>>785
#if の条件の部分ではマクロ展開できるものを全部展開したあとに知らない識別子が残ったら 0 と解釈する。
0795デフォルトの名無しさん
垢版 |
2022/02/06(日) 08:23:12.41ID:qvD4QsX7
馬鹿のためにわざわざプリプロセスで構文解析エラーを要求するとか馬鹿の極み
0796デフォルトの名無しさん
垢版 |
2022/02/06(日) 08:30:29.95ID:usxBX4wT
FOOが0になる根拠を与えていないだろ
関連付けられていないものが出てくるのがおかしいと思わないとしたらPG適性低いぞ
0802デフォルトの名無しさん
垢版 |
2022/02/06(日) 09:57:50.12ID:vWDceL4H
規格書にはなんでそうなっているのか(置換されずに残ったFOOをエラーではなく0にするのか)の理由が書かれていないが
#ifdef defined(FOO) && FOO
として現れる論理式「defined(FOO) && FOO」の解釈を簡単にやりたい(FOOが未定義の場合でも通常の式の解釈ルーチンで処理したい
的なしょーもない理由だったりして……
0804デフォルトの名無しさん
垢版 |
2022/02/06(日) 10:11:26.46ID:usxBX4wT
>>801
唐突じゃないことを示したまで
事実関係をよく確認してからセンス無いとかドヤれってこと
0805デフォルトの名無しさん
垢版 |
2022/02/06(日) 10:16:43.48ID:a0g451d/
理由はたぶん、規格化以前に存在した実装の動作を規格違反とするのはマズいとか、
その動作に依存して #if FOO としてる既存ソースをエラーとするわけにはいかなかったとか、
そんなところだろうと思う。

マズい動作として検出したければ警告は出せるんだし。
0806デフォルトの名無しさん
垢版 |
2022/02/06(日) 11:57:03.48ID:qvD4QsX7
馬鹿がまだ騒いでるのかw
こういう変なコードとの対比w
$ g++ -x c++ - <<EOF
auto f = [](){return 2;};
#define f() 1
int main() {
auto i = f();
auto j = f;
return i + j();
}
EOF
$ ./a.out
$ echo $?
3
$
0807はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/06(日) 12:12:45.00ID:u7K67HUJ
残った識別子を 0 に解釈する挙動は C89 からの仕様だから C89 の Rationale (根拠) を見たんだけど直接的な言及は見つからない。
https://docs.google.com/viewer?a=v&;pid=explorer&chrome=true&srcid=0BxVCLS4f8Sg5NWZmM2NjZWEtYmExMS00Y2EzLWE3ZTMtNzFmYjYwYzBiOTIw&hl=en_US
ただ、既存のコードに差し障りがないようにということは明記してある (3.8.3) ので、
その時点でそういう挙動が支配的 (かつそれに依存するコードが多かった) のだろうとは察せられる。

規格ってのは統一を図るってのが第一の目的だけど無理な仕様でまとめちゃうと誰もその規格に従わないだけなんで、
現実にそれでやっているってのも (たとえ不格好でも) 十分な理由になるんだよ。
0808デフォルトの名無しさん
垢版 |
2022/02/06(日) 12:26:28.98ID:qvD4QsX7
そう書かれるとC89っぽく書かないといかんのか?w
変更部分のみw
$ gcc -x c -std=c89 - <<EOF
int f(void){return 2;}
#define f() 1
int main(void) {
int i;
int (*j)();
i = f();
j = &f;
return i + (*j)();
}
EOF
0809デフォルトの名無しさん
垢版 |
2022/02/06(日) 12:53:10.29ID:FF40fIFl
CとC++の規格は既存コードへの忖度の塊で出来てるからな
万人の敵だったgets()を削除するのにどんだけ苦労してるのやら
0811デフォルトの名無しさん
垢版 |
2022/02/06(日) 13:22:45.35ID:vWDceL4H
>>807
C++規格委員会は無罪なのかもしれんがじゃあなんでC89以前からそうで
そういう挙動が支配的になってしまう事態になってしまったのか、と考えると
やっぱプリプロセッサの最初の設計者がサボって
プリプロセッサ式の途中でのFOOの定義/未定義判定を
define(FOO)を導入する代わりに仕様の方を弄って簡単ハックしてしまったから
のでは……
0814デフォルトの名無しさん
垢版 |
2022/02/06(日) 13:39:17.55ID:qvD4QsX7
天才は自力でなんとか出来るし、他人を信用しないことも多いから、基本的に質問とかする機会がない
アイデアレベルの話のみ
0816デフォルトの名無しさん
垢版 |
2022/02/06(日) 14:22:31.03ID:yFNvdNoT
#define マクロは単純置換のやつと関数形式のやつがある

#define A(a,b)
A();A(1);A(1,2,3);A(1,);A(,2);A;

結構めちゃくちゃなことやってもプリプロセスはエラー吐かない

引数足りないとか関数形式マクロの括弧がないのは意図しない使い方だろうからエラーにしてもらいたい気持ちはわかるが

というか<<802で言及されてるけど#if UNDEFINEDも非推奨にしてほしいわ
#define DEBUG
#define DEBUG 1
#define DEBUG 0
//#define DEBUG (undefined)
これらの全部のケースに対応できてねーし
#if DEBUG+0 とか書けとでも?
0817デフォルトの名無しさん
垢版 |
2022/02/06(日) 15:06:24.27ID:qvD4QsX7
俺のコードのg++やgccをcppに変えればプリプロセスの結果が出るよw オプション引数に-Eを付けても可w
別に不思議でも何でもない結果が表示されるw
$ cpp -x c++ - <<EOF
#define A(a,b) expanded
A();
A(1);
A(1,2,3);
A(1,);
A(,2);
A;
EOF
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"

<stdin>:2:3: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:3:4: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:4:8: error: macro "A" passed 3 arguments, but takes just 2
<stdin>:1: note: macro "A" defined here
A;
expanded;
expanded;
A;
$
0818デフォルトの名無しさん
垢版 |
2022/02/06(日) 16:46:37.28ID:XnD7OQcd
インクルードガード書くときも単に
#define FOO_HPP
とするのと
#define FOO_HPP 1
と1にするのがあるがどちらが良いとかあるんだろうか

後者の方がconstexpr if文などのC++の言語機能と組み合わせて使えるというメリットがありそうだが
0820はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/06(日) 17:09:14.27ID:u7K67HUJ
>>818
私自身は前者にしてる。
インクルードしたことを示すためのフラグとしてのマクロが必要なら
(そういう事例に遭遇したことはないが) ガード用とは別にマクロ定義すると思う。

ガードのために定義したものをガード以外の目的で使うというのがちょっと汚く感じるから。
だけど分けちゃうと管理が二重になるのが嫌だと思う人もいるだろうし、
思想によるんじゃないの。

私は規格厨なので #pragma once は使わない。
まあ gcc と clang と msvc で使えるから事実上は問題にならないけど。
0821デフォルトの名無しさん
垢版 |
2022/02/06(日) 17:25:15.43ID:XnD7OQcd
>>820
ありがとう
納得できる理由です

インクルードガード以外のフラグも同様にしてますか?
標準のNDEBUGのように
0822はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/06(日) 17:46:04.51ID:u7K67HUJ
>>821
NDEBUG は「デバッグモードとそうでないモードを切り替える」というのがその用途なので
それに沿うと思ったら分けずに NDEBUG を使うことはあるよ。
でも「NDEBUG の用途は assert の有効・無効の切り替えなので他に使うべきでない」と認識している人がいてもおかしくない。

規格に書いてあるのはこの場合はこうだという規則だけなので
抽象的な部分での意味の捉え方は人によってかなり幅がある。
そのあたりは文脈を察して常識的判断でやっていくしかないし、
チームでやってるなら話し合うしかしょうがない。

このへんはそんなにスッパリと判断基準を設けられるようなもんではないと思う。
0824デフォルトの名無しさん
垢版 |
2022/02/06(日) 19:46:48.16ID:XnD7OQcd
>>822
質問の意図がわかりにくくてすみません
自前でフラグ書くなら
>>818の前者と後者どちらを使うのかが知りたかった
0825はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/06(日) 20:08:36.06ID:u7K67HUJ
>>824
基本的には前者。
フラグとしてのマクロで分岐するときは #if よりも #ifdef (または defined) を使うようにしてる。
マクロは型を付けられないからそうすることで ON/OFF のどちらかであって内容に意味はない
ことを明示してる感じを出したいと思ってる。
0826デフォルトの名無しさん
垢版 |
2022/02/06(日) 20:55:43.12ID:XnD7OQcd
>>825
改めての回答ありがとうございます

こういう一見どちらでも良いものであっても裏の考えや意図が聞けて面白かったです
0827デフォルトの名無しさん
垢版 |
2022/02/07(月) 06:01:51.26ID:a2THiWt1
#pragma onceを標準に採用すればええのに
これだけ需要あるのに長年ずっと放置状態
何がそんなに問題なんだろう
0828はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/07(月) 09:54:39.71ID:T4nofIq4
現行仕様での理屈の立て方としては #include の効果でコードに一体化してから内容の解釈が始まるので
インクルードに干渉する余地がない。
現実にやってるんだから出来るのは間違いないんだけど理屈を根本から変えることになるし、
モジュールが上手くいけばどうでもよくなることに手間をかけたくないんじゃないかな。
0829デフォルトの名無しさん
垢版 |
2022/02/07(月) 11:19:39.20ID:3u4X3WRg
シンボリックリンクで別のパスになってたりとか、同じ内容の別ファイルとか、ファイル名違う中身同じファイルとか、日付だけ違う別ディレクトリの同じ内容のファイルとか
そんなの考えたくないよなーw
0830はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/07(月) 11:53:54.22ID:T4nofIq4
名前と実体をどう対応付けるかは今でも処理系定義なのでそこらへんはあまり問題にならないと思う。
0831デフォルトの名無しさん
垢版 |
2022/02/07(月) 11:56:53.41ID:XrnUHtPA
そこで#pragma onceはヘッダファイルそのものをインクルード済とみなすのではなくて
定義されている内容を定義済みと記憶するのが妥当な動作
なんだけど以下のような場合に困るという、
"a.h"
struct Foo {

"b.h"
  int m_x;
  double m_y;
};

"c.cpp"
#include "a.h"
#include "b.h"

やっぱモジュールにしたら同じような実装で完全な解決になるのだから待った方が、
0832デフォルトの名無しさん
垢版 |
2022/02/07(月) 12:22:03.46ID:XrnUHtPA
現行の
#ifdef _FOO_H_
#define _FOO_H_
....
#endif
はヘッダファイルをインクルード済みか否かではなく
マクロ_FOO_H_が定義済みか否かを問題にしているのである意味モジュールに近い
#pragma onceは現行のマイクロソフトのやつはヘッダファイルをインクルード済みか否かを問題にしているので
何をもって同一のヘッダファイルとみなすのかという解釈の揺らぎの影響を受けてしまうまインクルードの挙動が、
0833デフォルトの名無しさん
垢版 |
2022/02/07(月) 12:25:19.77ID:3u4X3WRg
>>830
だからどう転ぼうと中身で決められる昔ながらの方法の方が結果が明確ということw

ちなみにgccは
シンボリックリンク→ガード
同じ内容・日付・名前、別ディレクトリの別ファイル→ガード
同じ内容・名前、別日付、ディレクトリの別ファイル→インクルード
同じ内容・日付、別名前、ディレクトリの別ファイル→インクルード
みたい
0836デフォルトの名無しさん
垢版 |
2022/02/07(月) 13:10:46.99ID:a2THiWt1
ビット数多めのハッシュにしとけば
例えば衝突確率340澗分の1とかにできるよな
0837デフォルトの名無しさん
垢版 |
2022/02/09(水) 12:59:20.15ID:ioLTStxt
64bit osでポインタ型を4byteにするにはどうすればいいんですか?
8byteだとちょっと大きすぎる気がします
0838デフォルトの名無しさん
垢版 |
2022/02/09(水) 13:03:37.90ID:IwR5waiE
なぜ大きすぎると思ったのかが分からないが、64bitのアドレス空間を表すのに8 byteは必要だよ
0841デフォルトの名無しさん
垢版 |
2022/02/09(水) 13:40:55.45ID:ioLTStxt
例えば64bitの場合アドレスの上位4byteを一意に決めといて下位4byteを4byteの変数に格納しておくってやり方なんてはどうですか?
それで復元時には
(上位4byte << 32) & 下位4byteっていうふうに変換するってふうになると思うんですが
まず最初に上位4byteが一致した連続したメモリ領域から決まってメモリを確保するなんてことはできるのでしょうか?
0842デフォルトの名無しさん
垢版 |
2022/02/09(水) 13:52:00.55ID:USCqmiY8
必要なメモリをvector<X>で確保しておいて32bit以下のindex値でアクセスすることにすれば?

ポインタのサイズが大きすぎるなんて理由でやる人はいないと思うけど
0843デフォルトの名無しさん
垢版 |
2022/02/09(水) 13:52:47.57ID:E/6u1YW1
long long ago... タイニー、スモール、コンパクト、ミディアム、ラージ、ヒュージつーのがあってだな
0845デフォルトの名無しさん
垢版 |
2022/02/09(水) 14:34:15.15ID:PzVUb2uc
関数ポインタかなんかが8バイトに収まってなくて混乱したことがあったっけ
0846デフォルトの名無しさん
垢版 |
2022/02/09(水) 14:37:12.22ID:Jq7h8mT9
昔は16bitポインタと32bitポインタをLPとPで使い分けてたって戦争で死んだおじいちゃんに聞いた
0849デフォルトの名無しさん
垢版 |
2022/02/09(水) 22:34:51.11ID:9agulkW+
ウィンドーズならINT_PTR使っとけばおkオール無問題
C++の標準規格でどうなっているのかわ知らん
0850はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/09(水) 23:19:57.51ID:9Cj+df9g
規格上は std::intptr_t というものがある。
ただし関数ポインタやメンバ関数ポインタを格納できるとは限らない。
また、省略可能 (optional) であると明記されているので無くても規格準拠たりうる。

関数ポインタ同士 (メンバ関数ポインタは含まない) はお互いに変換可能であり
元の型にキャストしたら元の値と等しくなることは保証されるので
任意の型の関数ポインタを格納したいのであれば void* や intptr_t を使うよりは
適当な型の関数ポインタに入れるほうが規格に沿う。

メンバ関数ポインタは型通りに扱う以外はほとんど何の保証もないのだけれど
無理に変換して扱いたい場合も特に思いつかないのでどうでもいい。
0852デフォルトの名無しさん
垢版 |
2022/02/10(木) 19:32:52.48ID:OsDlZl05
effective C++って現行のC++と比べてどのあたりが古いんですか?
代表的なところとかだけでも教えてくれると嬉しいです
0856デフォルトの名無しさん
垢版 |
2022/02/10(木) 20:20:25.92ID:ZkLGowhi
続編のeffective modern c++も古いけど、
こっちは隕石落下後の本だから読んでおいたほうがいいよ
0857デフォルトの名無しさん
垢版 |
2022/02/10(木) 21:18:10.31ID:OsDlZl05
隕石落下後ってなんすか?
あとC++の勉強するならこの本読め、みたいなのって他にもありますか?
0858デフォルトの名無しさん
垢版 |
2022/02/10(木) 21:38:32.90ID:ty8Wss5J
2005年でも古いなあ
C++98, 03, 11(0x), 14, 17, 20 と5回バージョンアップあるし
そのたびに標準ライブラリが更新されてる

古い本で古い書き方しか知らないと慣れてきたころにイラつくことになるから最低でもC++11対応のやつがいい
0863デフォルトの名無しさん
垢版 |
2022/02/11(金) 06:13:41.97ID:ycfpInN1
仕様のバージョンは普通自分で選ぶもんじゃないので、古いことを知るのだって意味はある
逆にどの辺が古い、というのが分かってもあまり意味ない
0864デフォルトの名無しさん
垢版 |
2022/02/13(日) 06:29:47.80ID:DI/GcuLa
いろんな範囲で一様乱数を次々と生成したいときってどうしますか?
uniform_int_distribution の範囲を次々と param で変える?
あるいは、妥協して剰余をとる形で範囲を変える?
0865デフォルトの名無しさん
垢版 |
2022/02/13(日) 06:32:11.91ID:DI/GcuLa
あるいは、uniform_int_distribution を次々と生成して使い捨てる?

実測するべきなんでしょうが、どれがオーバーヘッドが少ないかというカンがありません
0866デフォルトの名無しさん
垢版 |
2022/02/13(日) 06:51:44.09ID:rfXE6dHR
色々手はあるね
「いろんな範囲」の個数が決まっているならuniform_int_distributionの配列にするもよし
ランダムならparamもよし

次々と生成して使い捨て、つまりコンストラクタとデストラクタを都度実行するのは
俺はあんまりやりたくないが止めもしない
0867デフォルトの名無しさん
垢版 |
2022/02/13(日) 07:21:47.95ID:JnTPIF3C
>>865
同じ範囲を何回も使うならその分distributionを用意する、そうでないならparamを変えていくのが良さそうに思います。が、たぶん実行時の差はほぼ無いです。
いちおう関数の定数を書き換えていくかメモリ上に予めたくさん用意するかの違いとして判断しました。
計算重いのは大抵は乱数生成の方だと思うので、速くしたいならそっちをとりかえたほうがいいと思います。
0871デフォルトの名無しさん
垢版 |
2022/02/13(日) 10:37:30.83ID:SeV3jiEK
個人的にはこうやってみたりしてゐる、

/// 閉区間[0, ub]を値域とする一様乱数を生成する。
unsigned long genrand_int32_with_ub(unsigned long ub)
{
assert(0 < ub && ub < (unsigned long)UINT32_MAX);
const uint64_t F = (uint64_t)UINT32_MAX;
const uint64_t W = (uint64_t)ub + (uint64_t)1;
const uint64_t Q = F / W;
#ifndef NDEBUG
const uint64_t R = F - W * Q;
assert(Q > 0 && 0 <= R && R < W);
#endif
// 半開区間[0, (W+1)*Q)を値域とする一様乱数取得
const uint64_t WQ = W * Q;
uint64_t rndLTWQ;
do {
rndLTWQ = (uint64_t)genrand_int32();
//printf("rndLTWQ=0x%08x, Q=0x%016llu\n", rndLTWQ, Q);
} while (rndLTWQ >= WQ);

// Qで割る。
const uint64_t r = rndLTWQ / Q;
assert(0 <= r && r <= ub);
return (unsigned long)r;
}
0873はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/13(日) 11:12:52.07ID:nD0XyBZB
>>869
分かり易い例として 0 から 9 の一様な乱数列を生成するものを考えてみればいい。
このとき 0 から 7 の値が必要だからといって 8 の余剰を取ったらどうなる?
8, 9 が 0, 1 になるから 0 と 1 の出現確率が他の倍になってしまうだろ。

生成される値の幅が必要な値の幅よりも十分に大きいなら
許容可能な誤差として無視できる場合も多いとは思うが
様々なパラメータが有りうる状況では検証しづらい。
0875ハノン ◆QZaw55cn4c
垢版 |
2022/02/13(日) 12:39:58.09ID:1UprWsoO
>>873
それもあるけれども、昔の擬似乱数列は絶望的なまでに下位桁がランダムではない、という事情をひきずっているのでは?まあ MT はそうじゃないけどね
0876デフォルトの名無しさん
垢版 |
2022/02/13(日) 13:09:41.79ID:+NRIy/Ul
>>873
そらもちろん、元がそんな狭い範囲ならだめでしょ
あとまあ昔のrand的には割ってかけるのが正しいというのはあるけどそれは別の話で
0877デフォルトの名無しさん
垢版 |
2022/02/13(日) 13:37:58.02ID:PyRRUUG6
C++何の関係もない話で草
検証が必要ならすればいいだけ
要件すら不明で何もしてないのに質問するやつが馬鹿
0878はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/13(日) 14:27:27.60ID:nD0XyBZB
>>876
> 元がそんな狭い範囲ならだめでしょ

逆に欲しい範囲が大きい場合でも同様。
この場合は様々な範囲が有りうるという想定なので、都合の悪い状況も考慮する必要がある。
0881デフォルトの名無しさん
垢版 |
2022/02/13(日) 15:25:43.89ID:CS3pmCmc
そんな短い周期の疑似乱数使ってないんじゃない?
端っこは気にしないと思うなあ
0882デフォルトの名無しさん
垢版 |
2022/02/13(日) 16:00:39.64ID:yoBtg/nD
>>876
> そらもちろん、元がそんな狭い範囲ならだめでしょ
「分かり易い例」って書いてあるのも理解できないの?
0883デフォルトの名無しさん
垢版 |
2022/02/13(日) 16:06:17.09ID:CS3pmCmc
一般論でいうと周期に余裕がない様な疑似乱数使うのが間違いなんだと思うけどね
0884デフォルトの名無しさん
垢版 |
2022/02/13(日) 16:19:57.08ID:kSk9XozZ
そういうのを乱数知識ない奴が触らずに済むようにパッケージにしたのが<random>のdistributionなんだから素直に頼っとけよ
0887はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/13(日) 17:04:20.08ID:nD0XyBZB
線形合同法とかなら値の範囲と周期が一致することもあるが、乱数の一般的性質というわけではない。
0888デフォルトの名無しさん
垢版 |
2022/02/13(日) 17:59:20.78ID:av/6iEu7
周期と値域は別だろ
たとえばマイナス一億と、プラス一億の2値をとる乱数とか
0889デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:15:27.44ID:AOBvb97v
疑似乱数なんて今の値で次の値が決まるんだから周期も値も同じだろう
その値の一部を使ったらまあ見た目は減るだろうけど
0890デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:32:37.88ID:3OIdnfKh
値域: 出力される値の範囲
周期: そのまんま乱数の出力が1周するステップ数

内部状態かなんかとごちゃ混ぜになってない?
0891はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/13(日) 18:34:40.46ID:nD0XyBZB
>>889
内部状態と結果を分離する方式だって当然あるよ。
メルセンヌツイスタのどでかい内部状態を毎回値として利用するわけないし、
乱数として利用できる性質になってない。
0893デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:38:19.35ID:mUIDTArd
>>892
その思い込みで「値域」と「内部状態の大きさ」をごっちゃにしてるから話がこじれてたんでしょ。
区別して。
0894デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:55:00.53ID:RJAwRgrO
端っこにゴミがあるよりは歯抜けが散らばってる方がいいというのは一理あるね
0895デフォルトの名無しさん
垢版 |
2022/02/14(月) 10:33:59.04ID:14KvXXq2
メンバー関数をテンプレートに出来たりしませんかね?

struct Sample{void func1(int i); void func2(int i);...}
template<typename T> void SampFunc(Sample& sample, int i){sample.T(i);}

みたいな

エラーはNo member named 'T' in ホゲホゲって感じですが
0896デフォルトの名無しさん
垢版 |
2022/02/14(月) 10:38:23.09ID:14KvXXq2
書き込んでから思いつきましたが直接やらずに
struct Caller1{void operator()(Sample& sample, int i){sample.func1(int i);}};
...
みたいなのを挟むべきですかねぇ
0898デフォルトの名無しさん
垢版 |
2022/02/14(月) 11:13:25.35ID:o9A3FVGP
毎回 uniform_int_distribution のインスタンスを一時的に生成しては破壊するのを繰り返すのだけはありえんだろ
無意味なメモリのアロケーションありすぎ
0899デフォルトの名無しさん
垢版 |
2022/02/14(月) 11:16:30.38ID:lu0CYRrt
#include <iostream>
using namespace std;
struct Sample{
void func1(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;}
void func2(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;}
};
template<typename T> void SampFunc(Sample& sample, int i, T member_func){
(sample.*member_func)(i);
}
int main() {
Sample s;
SampFunc(s, 1, &Sample::func1);
SampFunc(s, 2, &Sample::func2);
return 0;
}
0900デフォルトの名無しさん
垢版 |
2022/02/14(月) 11:28:15.31ID:s3l2ZTMb
doubleとfloatの配列を同じように関数の引数に渡して扱う方法ってありますか?
・処理部が複雑なので引数の型が違う関数2個は作りたくない
・IF関数として両方版を作ってそこから処理部を呼び出すみたいな構造は可能、ただし別型版の実体コピー配列などは作りたくない(配列が巨大な為)

考えてみたのが、
配列の値部分をvoid*配列で指したものと、type_infoを持ったクラスなり構造体なりを用意して、
処理部でtype_infoに応じてvoid*をキャスティング、という方法ですが、
どうにも汚いのでもっと綺麗なやり方あれば教えてください。
0903デフォルトの名無しさん
垢版 |
2022/02/14(月) 11:54:11.63ID:L8LvhIeL
>>900
ふつーにテンプレートじゃね?
template <typename T> requires std::is_floating_point_v<T>
void func(T&& arg)
{
}

あとanyなんて手もあるけど
void func(std::any arg)
{
if(arg.type() == typeid(double)) { }
if(arg.type() == typeid(float)) { }
}
0905デフォルトの名無しさん
垢版 |
2022/02/14(月) 12:04:39.18ID:Z549+Tcq
>>903に便乗してC++20で以下のような書き方も
#include <concept>
template<std::floating_point T>
void func(T && a){}
0906デフォルトの名無しさん
垢版 |
2022/02/14(月) 12:12:47.83ID:L8LvhIeL
>>900
まさかとは思うが
float f[2];
std::fill(std::begin(f), std::end(f), 0);

double d[2];
std::fill(std::begin(d), std::end(d), 0);
こんな基本はわかるんだよな?
0908デフォルトの名無しさん
垢版 |
2022/02/14(月) 14:17:59.24ID:s3l2ZTMb
ありがとうございます、テンプレート便利ですね。使わせていただきます。900
0909デフォルトの名無しさん
垢版 |
2022/02/14(月) 14:33:14.26ID:HFyH6Ayv
あるクラスのメンバ関数のデフォルト引数を同クラスのメンバ変数にすることって可能でしょうか
0912はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/14(月) 14:55:09.41ID:eI8f6/6+
デフォルト引数をデータメンバにするってのは単にデフォルト引数の値をデータメンバに入れるって意味?
↓ こういうの?

struct foo {
int x;
void bar(int y=1) {
x=y;
}
};

こんな単純なことがわからないとも思えんし、なんか隠れた要件がありそうな気がするんやが
0914デフォルトの名無しさん
垢版 |
2022/02/14(月) 15:13:09.50ID:9KgBPGkB
>>912
こいつJ民だったの?
0915デフォルトの名無しさん
垢版 |
2022/02/14(月) 15:13:51.43ID:M1yCctPq
たぶん
struct S{
int field;
void f(int x=field){...}
};
ってのをやりたいんだろうけどな

あいにくC++のデフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない

どうしても同等の処理をしたいならオーバーロードして転送するのが一番楽
void f(){f(field);}
0916デフォルトの名無しさん
垢版 |
2022/02/14(月) 15:17:25.95ID:L8LvhIeL
> デフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない

そうか?
int func()
{
int a;
std::cin >> a; //絶対に定数になり得ない
return a;
}

void test(int arg = func())
{
}

int main()
{
test(); //OK. もちろん入力待ちをする
}
0917はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/14(月) 15:21:08.20ID:eI8f6/6+
>>915
デフォルト引数は関数を呼び出すときに補われたかのように動作する。
関数呼出しのたびに評価されるよ。
0919デフォルトの名無しさん
垢版 |
2022/02/14(月) 17:52:44.50ID:m3z01MvF
uniform_int_distributionって本質はIntTypeのペアを持った関数オブジェクトだから毎回生成したところで遅くはないはず
0921デフォルトの名無しさん
垢版 |
2022/02/14(月) 20:44:52.17ID:UkhMLhRO
マルチスレッド環境用にジャンプって機能が疑似乱数にあるよな
「疑似乱数 ジャンプ」でぐぐると出てくる
0922デフォルトの名無しさん
垢版 |
2022/02/14(月) 21:33:11.13ID:CqI2HZWm
状態持ってるのはエンジンの方
分布ごときにどんな怪獣ブラックボックスのイメージ持ってんだ
0925デフォルトの名無しさん
垢版 |
2022/02/14(月) 22:35:41.44ID:jOONNl+N
初心者質問ですみません。
ヘッダで定義したテンプレート特殊化の非推奨属性がヘッダ外で効いてないっぽいんですけど、
ヘッダ外でも非推奨としたい場合何か特殊な事をしないといけないとかありましたっけ?

例えば
.h
```
template <std::integral INT_TYPE>
struct int_auto
{
using type = auto_int_detail<std::is_signed_v<INT_TYPE>, sizeof(INT_TYPE)>::type;
};

template <>
struct [[deprecated("char type is not allowed")]] int_auto<char>
{
using type = auto_int_detail<std::is_signed_v<char>, sizeof(char)>::type;
};

template <std::integral T>
using int_auto_t = int_auto<T>::type;

int_auto_t<char> i_header; // これは非推奨
```

.cpp
```
int_auto_t<char> i_cpp; // これは非推奨じゃない
```
となっています。
MSVC++(v142)で言語標準準拠はstd:c++20です。
0926はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/14(月) 22:41:31.68ID:eI8f6/6+
>>924
それ自体には発生元を特定する情報を持たないけど……。
どういう状況?

・ 例外的な状況から回復する必要があって発生源によって処理の切り替えが要る
・ プログラムの正常系が動くはずなのに何故か出てくる例外の元を特定したい (つまりデバッグ用途)

どちら?
0927デフォルトの名無しさん
垢版 |
2022/02/14(月) 23:02:44.91ID:2E5iBc/D
>>926
大学でこういう課題を出されたのですが、全然いい方法がわからないです。
「あるクラスの例外だけをレポートするためにはどのような実装方法があるか」
0929デフォルトの名無しさん
垢版 |
2022/02/14(月) 23:11:22.86ID:R5SapkSQ
それはどのクラスがthrowした、じゃなくて、どのクラスがthrowされた、の間違いだな

例外 c++で検索すれば答えはすぐ出てくるよ
0930デフォルトの名無しさん
垢版 |
2022/02/14(月) 23:29:00.15ID:a+DIA8ij
>>916
>>917
嘘やんと思って試してみたらマジでいけるやんけ知らんかった

インスタンスフィールドまでは触れんかったが
0933デフォルトの名無しさん
垢版 |
2022/02/15(火) 14:33:45.24ID:StNRh9X/
クラスメンバをforで回す方法はありますか?

例えばintのaとdoubleのbという2つのメンバを持つクラスがあったとして、
forループでクラス内のメンバ変数を全部加算したい、など。

イメージはこんな感じです。
double all = 0.0;
for (T member : this->allMember)
{
all += member;
}
0934デフォルトの名無しさん
垢版 |
2022/02/15(火) 14:55:33.51ID:aaenmMxg
for で回さないといけないほど多数のメンバー変数がある設計をまず見直すべき
0936デフォルトの名無しさん
垢版 |
2022/02/15(火) 15:15:26.06ID:AWN50YIA
動的にロードするのでなければ、自分で登録するか、ソースから解析するタイプのリフレクションライブラリを書くか探せばいい
0939デフォルトの名無しさん
垢版 |
2022/02/15(火) 17:13:44.36ID:QbgtcDS7
>>933
あるよ。おすすめするわけじゃないけど。
https://www.google.com/search?q=boost+fusion+for_each+struct

こんな奇怪なライブラリ使わなくても済むようにするための言語側サポートはいずれも提案中。先は長い。
P1306 Expansion statements
https://github.com/cplusplus/papers/issues/156
P1240 Scalable Reflection in C++
https://github.com/cplusplus/papers/issues/545
0940デフォルトの名無しさん
垢版 |
2022/02/15(火) 17:28:44.20ID:AWN50YIA
じゃあこれもオススメではないがリフレクションベースで
https://www.rttr.org/
を使った例でも...
#include <iostream>
#include <rttr/registration>
using namespace rttr;
struct s{
int m1;
double m2;
};
RTTR_REGISTRATION {
registration::class_<s>("s").constructor<>()
.property("m1", &s::m1)
.property("m2", &s::m2);
}
template<typename T>
double sum(const T& o) {
type t = type::get<s>();
double sum = 0.;
for (auto& prop : t.get_properties()) {
sum += prop.get_value(o).to_double();
}
return sum;
}
int main() {
s o{1,1.1};
std::cout << sum(o) << std::endl;
return 0;
}
// 思いつきで聞いてるだけな気もするけどw
0941デフォルトの名無しさん
垢版 |
2022/02/15(火) 17:31:44.80ID:AWN50YIA
ちょっと修正
#include <iostream>
#include <rttr/registration>
using namespace rttr;
struct s{
int m1;
double m2;
};
RTTR_REGISTRATION {
registration::class_<s>("s").constructor<>()
.property("m1", &s::m1)
.property("m2", &s::m2);
}
template<typename T>
double sum(const T& o) {
double sum = 0.;
for (auto& prop : type::get<T>().get_properties()) {
sum += prop.get_value(o).to_double();
}
return sum;
}
int main() {
s o{1,1.1};
std::cout << sum(o) << std::endl;
return 0;
}
0942デフォルトの名無しさん
垢版 |
2022/02/17(木) 18:59:32.62ID:bHlhY+TU
std::unique_ptr</*見切れる程長いクラス名*/> looongPtr{ std::make_unique</*見切れる程長いクラス名*/>(/*見切れる程多い引数*/) };
unique_ptrをメンバ変数にするときに最初のとこをautoに出来ないんですか?
0944蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/02/17(木) 19:30:29.28ID:sNGWbyyl
typedef longlonglongtypename shorttypename;
auto ptr = std::make_unique<shorttypename>...
0947デフォルトの名無しさん
垢版 |
2022/02/17(木) 21:57:39.99ID:d4bhbZak
単なる○○できますか?に対して設計見直せとだけ言ってくるガイジなんなん
まず質問に答えた上でなら分からんでもないが
0951デフォルトの名無しさん
垢版 |
2022/02/18(金) 00:20:49.11ID:q/M7jrOo
C++の業務ってことで入ったんだけどC++とは名ばかりのC言語バリバリのコードだった
C++11、いやせめてCじゃなくてC++を書こうとしようぜと思うんだけど世の中こんなんばっかなん?こういうケースほんっとに多くてさぁ
40代↑の人が書いてるC++の言語って大体ほぼCでうんざりする
0952デフォルトの名無しさん
垢版 |
2022/02/18(金) 00:25:14.77ID:qZSzRw8s
偏見だけど同名の関数が並んでる以外Cとしてコンパイルできそうなイメージある
0953はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/02/18(金) 00:25:30.70ID:fowo2HBL
>>951
なんでそんなことになるんだろうな?
コンパイラを信用してないからか?
ワイは40代以上やけど C++ を使える状況であえて C 的なスタイルで書く気はしないわ。
だって単純に面倒くさいもの。
0956デフォルトの名無しさん
垢版 |
2022/02/18(金) 02:48:20.56ID:y/CjghL0
人事部の人がCとC++の見分けがつかなくて
会計上コンパイラ代に「C++」と書いてあったから
C++で募集かけてたんじゃね?
0958デフォルトの名無しさん
垢版 |
2022/02/18(金) 13:34:17.22ID:NqXxszTV
>>951 ←こういう初心者にじゃあすべて作り直していいよ、と言うと何もできない。

無職の妄想からは何も生まれないのだよ。
0959デフォルトの名無しさん
垢版 |
2022/02/18(金) 14:23:13.29ID:y/CjghL0
自分は何かできるとでも言いたげだな
すべて作り直すということがどのくらいの工数かわかってないんだろ
0960デフォルトの名無しさん
垢版 |
2022/02/18(金) 15:06:16.89ID:tL/18rdC
>>958
俺もそう思う

現場の不平不満ばかりの意識高い系エンジニアさん多いよね
その現場を改善するわけでもなく文句いうだけ
高いスキルあるならそんな現場やめれば?
単価150万超えるようなとこなら周りにも高スキルな人がたくさんいるよ?

現場の文句言うだけの奴は結局その現場がお似合いのレベルなんだよ、っていつも思ってる
0961デフォルトの名無しさん
垢版 |
2022/02/18(金) 15:32:05.24ID:dD/fDJ+w
>>951
普通の職場ならコーディングスタンダードあるから勝手はできないだろ。

コーダーとライブラリアンで許可されている範囲も違うだろうし。
0962デフォルトの名無しさん
垢版 |
2022/02/18(金) 15:57:07.65ID:NqXxszTV
>>955
無職が言いそうなことだ。無能なブロジェクトリーダーはCプロジェクトをあっさりとC++化できる、
存在しないスーパープログラマを探し続けるがそんな奴はどこにもいない。
そんなスーパーPGがいたらATMはバグで止まらない。C++書ける奴はCをバカにしないよ。
0964デフォルトの名無しさん
垢版 |
2022/02/18(金) 17:01:46.61ID:1bc1nI/9
正当な理由もなくスマポやSTLを嫌がった結果
生ポインタをガチャガチャいじくり回したスパゲティコード書いて
それが遅くて非効率でバグまみれリークだらけというのは非常によくあるけど
そういうCプログラマ様も敬わなきゃダメ?
0966デフォルトの名無しさん
垢版 |
2022/02/18(金) 17:19:05.78ID:xb2lszF9
そういうどうしょうもないのはヒソカに心の奥でバカにしていいし反面教示にすべし
0968デフォルトの名無しさん
垢版 |
2022/02/18(金) 20:06:32.33ID:z2RoOtDN
80対20の法則は大事だし、動くコードを作ってから最適化をした方がいいって偉い人も言ってた気がする

リソース管理はとりあえずスマポを使うのが吉だと思ってます
0969デフォルトの名無しさん
垢版 |
2022/02/18(金) 20:12:42.95ID:N0FOn5a0
自分で責任もって結合テストする覚悟があるんならいくらでもCからC++に置き換えていいと思うよ
0971デフォルトの名無しさん
垢版 |
2022/02/18(金) 20:38:01.63ID:NqXxszTV
効率ガーと言うが、CをC++に書き換えて高速化、省メモリ化するなんてむしろレアケース。
0972デフォルトの名無しさん
垢版 |
2022/02/18(金) 20:44:21.03ID:y/CjghL0
C++の隠れたコードが何をしてるか解ってないやつが
C++にしたら高速化した低速化したって言語のせいにするんだよ
0973デフォルトの名無しさん
垢版 |
2022/02/18(金) 21:35:17.98ID:UZsjZs7N
こういうとき悲しいのはね
CもC++もたいして知りもしねえド素人のアマチュアが
想像と思い込みでもっていろいろレスつけてくること
噴飯ものだぞ?
0974デフォルトの名無しさん
垢版 |
2022/02/18(金) 23:03:13.88ID:k8EYArXJ
c++書いてたとき何ちゃらストリームやらのファイル操作遅すぎてムリすぎて結局fopen使ったような…
まあ便利は便利なんだけど利便さ求めるならそもそもpythonとかに逃げますし
C++17未満?だとfilesystem使えなくてこんな簡単なことも出来ないのかと絶望した気もする
0978デフォルトの名無しさん
垢版 |
2022/02/19(土) 01:28:32.55ID:MLwzxLgZ
Appleのcopland、Googleのandroid、MSのEdgeの失敗を見れば
予算と開発期間が十分にあれば解決すると思ってるならそれは間違いだと理解するだろう。
生ポインタをこねくり回す程度で脳みそのキャパが越えてるようじゃC++使ってもまともな実装なんてできない。
隠れたコードも何もC、C++はアセンブラの知識は必須だ。バイナリを読めるようになってから文句言え。
0979デフォルトの名無しさん
垢版 |
2022/02/19(土) 03:09:27.37ID:kSnJ/KwP
フムフムアセンブラが必須か…
https://godbolt.org/z/jq16j83We
#include<vector>
using namespace std;
void f(char* dst, const char* src_start, const char* src_end) {
const char*s = src_start;
char*p = dst;
while (s != src_end) *p++ = *s++;
}
template<typename Dst, typename Src>
void f2(Dst dst, Src src_start, Src src_end) {
auto s = src_start;
auto p = dst;
while (s != src_end) *p++ = *s++;
}
void hoge() {
vector<char> dst(1024), src(1024);
f(dst.data(), src.data(), src.data() + src.size());
f2(src.begin(), dst.begin(), dst.end());
}
これってどうしてhoge側だとSIMD使わないの?
C++コードでSIMD使わせるにはどうしたらいい?
0987デフォルトの名無しさん
垢版 |
2022/02/19(土) 10:03:29.25ID:mDQ0X8WX
アセンブラなどの理解は「低レイヤを知りたい人向けのCコンパイラ作成入門」が結構勉強になったんですが、バイナリは何で勉強すればいいですかね?
0989デフォルトの名無しさん
垢版 |
2022/02/19(土) 10:44:00.07ID:kSnJ/KwP
さぁ?・・・callしたり判定用コードやサイズ計算とかオーバーヘッドがあるからじゃね?知らんw
0991デフォルトの名無しさん
垢版 |
2022/02/19(土) 12:08:36.38ID:2h4SA+VW
CADソフトCANDYの作者の発言。
>数年前に,私の会社で組み込み機器向けのプロジェクトで,C++コンパイラが安定して動かないので
>Cでプログラムを書くように私が指示したケースがあったのだが,
>何人かのエンジニアが「今さらCなんかでプログラムを書けませんよ。
>クラスを使えなければスパゲッティコードになってしまいます」と猛反対をしてきた。
■ 第4回 オブジェクト指向の本質
https://gihyo.jp/lifestyle/serial/01/software_is_beautiful/0004

別のインタビューと補完すると、そのときC++の標準ライブラリ的なブツを著者が
C言語でババーっと書いて仕事させたという話だったはず(記憶モード

ちょっどこの昭和カヨ?!
0992デフォルトの名無しさん
垢版 |
2022/02/19(土) 12:18:20.98ID:kSnJ/KwP
組み込み機器用のCPUって特殊なんで、コンパイラが安定しないなんてよくある話
オブジェクト指向のメリットの本質についての話なので、可能/不可能が実装言語に依存しないというのもよくある話(楽かどうかは別)
別に昭和でも平成でも令和でも変わってないけど、>>991に伝わってないのは確か
0993デフォルトの名無しさん
垢版 |
2022/02/19(土) 12:50:13.00ID:gFosEVVi
GTKのGObjectはCでオブジェクト指向を実現している訳だけど
(ただし学習コストが低いとは言えないと思う)
0994デフォルトの名無しさん
垢版 |
2022/02/19(土) 12:53:15.56ID:2h4SA+VW
そんなん言ったらX Window SystemもC言語でオブジェクト指向しているらしい
らしい(伝聞
0995デフォルトの名無しさん
垢版 |
2022/02/19(土) 13:05:47.37ID:x/upE6G9
当たり前だけどアセンブラでもオブジェクト指向はできるし還暦の爺さん(とは言ってもなかなかの人ではある)が10年以上前に書いた記事だしまじで何を言いたいのかよくわからん
0996デフォルトの名無しさん
垢版 |
2022/02/19(土) 13:20:12.26ID:kSnJ/KwP
分からん分からん言うのは誰でも出来るし、どんな初心者でも何に対してもそう言える
なので、具体的に分からん部分を指摘できない人は初心者か、荒らしだと思ってる
0998デフォルトの名無しさん
垢版 |
2022/02/19(土) 13:28:47.19ID:2h4SA+VW
>当たり前だけどアセンブラでもオブジェクト指向はできるし
ちょっカプセル化(シンボルの隠蔽)にやや手間がかかるし
オブジェクトをスタックにのコピーして返すのにもさらに手間がかかるし、
コンストラやデストラの呼び出しの保証や継承関係のチェックについて処理系のサポートが一切無いし、
やんけ;;;
そういうオブジェクト指向のプログラミングパラダイムにおいて裏で当然働くべき処理が
プログラマーが手間をかけ注意を振り向け続けないと実現されないというのはオブジェクト指向しているうちに入らないのでは……
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 95日 18時間 42分 38秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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