C++相談室 part135at TECH
C++相談室 part135 - 暇つぶし2ch1:デフォルトの名無しさん
18/03/31 20:20:06.25 o3PNwIlC0.net
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part134
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
 URLリンク(codepad.org)
 URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

2:デフォルトの名無しさん
18/03/31 22:59:04.29 Nj0xu+770.net
この64ビットが主流になりつつある時代にSTL使うとファイルサイズガァとかよく耳にしますが、時代についてこれていない老いぼれの戯言なのでとっとと見限って先に進みましょう
----- テンプレ ここまで -----

3:デフォルトの名無しさん
18/04/01 00:05:25.36 DhlCxYuo0.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイ�


4:€を使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。 ---- テンプレ ここまで ----



5:デフォルトの名無しさん
18/04/01 00:06:31.91 DhlCxYuo0.net
>>1乙だが
さすがに>>2がテンプレとかないわ;;

6:デフォルトの名無しさん
18/04/01 00:37:05.49 O5KM55R90.net
両方テンプレじゃないから死ね

7:デフォルトの名無しさん
18/04/01 01:00:30.68 EwuQ9U5u0.net
えー、どっちもワシ(>>1)が貼り付けたわけじゃないのにー

8:デフォルトの名無しさん
18/04/01 01:13:57.19 lZy6W71f0.net
このRTL使うとファイルサイズが減るとかおもいっきり頭悪い回答した奴とSTLをごっちゃにするテンプレいい加減やめれ
STL使っている奴=無能に見えるではないか

9:デフォルトの名無しさん
18/04/01 02:21:27.54 lZy6W71f0.net
コレ老いぼれが仕掛けているマッチポンプにも見えなくはないしな
毎回毎回クソみたいなテンプレ貼りまくって見苦しいぞまったく

10:デフォルトの名無しさん
18/04/03 00:14:36.74 xAju6wwe0.net
C++を原発制御に使うか?という質問に帰着する

11:デフォルトの名無しさん
18/04/03 00:33:19.68 .net
>>9
特に問題ないやろ

12:片山博文MZ
18/04/03 00:38:42.54 GFbsNNGId.net
原発にヒープメモリーは使いたくないだろ。

13:デフォルトの名無しさん
18/04/03 00:59:39.78 .net
原発も飛行機も、自動車も?固定メモリ空間で、確保解放なんて一瞬の手間すら惜しんで全部上書きでしょ(知らんけど)

14:片山博文MZ
18/04/03 01:34:24.25 GFbsNNGId.net
インターネットにつながってる原発とか、USB接続ができる原発なんてあり得ないから。フロッピーもダメ。ROMカセットならギリギリOK。

15:片山博文MZ
18/04/03 01:37:02.89 GFbsNNGId.net
EMP対策とか防火対策とか銃器対策もしないといけない。

16:デフォルトの名無しさん
18/04/03 01:39:39.79 sF82ozBk0.net
確実な「保証」が必要だからなぁ。
リアルタイム性の要求もそうだが、
ありそうにないほどの最悪条件でもメモリ確保に失敗してはいけないので、
確実に見積もれるようにするにはヒープメモリの使用を避けるのは妥当なことも有りうる。
メモリ確保に失敗したら安全な終了シーケンスの実行も難しいだろうし。
起こりうるすべてのパターンで new が失敗しないことを検証するなんて
面倒くさい (というより事実上不可能な) ことは出来んだろ。
本当にシビアな制御が必要な原発レベルなら定理証明系とかも使ってるんじゃないかな。

17:デフォルトの名無しさん
18/04/03 01:44:54.43 0fcGXeNT0.net
URLリンク(i.imgur.com)
全部アナログに任せてるから操作間違ってこんなんになっているんやろ

18:デフォルトの名無しさん
18/04/03 01:50:56.68 i3mVMD7F0.net
コントロールルームの写真見るとありえんくらい計器とボタンついてるから
ソフトウェア自体ほとんど使われてないだろうな

19:片山博文MZ
18/04/03 01:57:10.44 GFbsNNGId.net
マウスで原子炉の制御棒を操作するのか? 冗談すぎる。

20:片山博文MZ
18/04/03 02:01:20.38 GFbsNNGId.net
作業員に1人テロリストが混ざっていたとしても、原子炉を暴走させることが出来ないようなシステムにしないといけない。

21:デフォルトの名無しさん
18/04/03 02:13:51.81 i3mVMD7F0.net
不便にすることが最も外部からの攻撃に対して強い

22:デフォルトの名無しさん
18/04/03 02:15:27.83 mF5KVDd50.net
二人が同時にキースイッチをカチッとオンにすると発射!

23:片山博文MZ
18/04/03 02:23:04.91 GFbsNNGId.net
原発関係の諜報活動はかなりシビアで、どこかの国では、国家犯罪的なコンピューターウイルスにやられて原発が稼働できなくなったらしい。

24:片山博文MZ
18/04/03 02:32:26.64 GFbsNNGId.net
16bit時代は、友人にウイルスを集める奴が、居たよな。今では所持だけで犯罪になっちゃったけど。

25:デフォルトの名無しさん
18/04/03 02:35:57.94 mF5KVDd50.net
原発は既に発電原価が他の発電方法よりも割高なんで、やめても良い
核廃棄物の処分方法すら未だに手が付けられないんだし
他の国は土地があって置き場所に困らないが、日本はそうでは無いよ

26:デフォルトの名無しさん
18/04/03 02:41:11.28 i3mVMD7F0.net
>>23
その頃はしょせん個人がいたずら目的で作ってた程度だからな
今の違法なビジネスで作られてるものとは性質が違う

27:片山博文MZ
18/04/03 02:46:57.19 GFbsNNGId.net
あの頃は、ウイルス対策の概念が浸透してなくて、雑誌の付録にもウイルスが付いていたらしい。MS-DOSとWin9x時代のデジタル発掘には危険が伴う。

28:片山博文MZ
18/04/03 02:51:53.34 GFbsNNGId.net
ウイルス蔓延に対する答えが、プログラムファイルの保護、ウイルス対策、UAC、SmartScreen、デジタル署名なんだよな。

29:片山博文MZ
18/04/03 02:53:31.90 GFbsNNGId.net
C++20では、生ポインタが非推奨になるんだよな?

30:デフォルトの名無しさん
18/04/03 02:57:29.37 i3mVMD7F0.net
>>28
生ポインタを取り出すstd::to_addressが追加されるんだが

31:片山博文MZ
18/04/03 03:08:11.37 GFbsNNGId.net
じゃ、勘違い。
株価を見るに、インテルも安泰じゃないようだ。

32:デフォルトの名無しさん
18/04/03 03:11:08.11 i3mVMD7F0.net
リスクオフで世界的に株安なだけでインテルの業績が悪化しているわけではない

33:デフォルトの名無しさん
18/04/03 07:51:19.92 .net
>>31
しったか乙
アップルがIntel捨てるからだよ

34:デフォルトの名無しさん
18/04/03 08:03:30.55 wc7Iq10c0.net
ん?ノートがARMにでもなるの?ちょっとむりない?

35:デフォルトの名無しさん
18/04/03 08:15:32.96 4cz+HfdtF.net
独自CPUだよ
林檎だしアーキから独自じゃないの?

36:デフォルトの名無しさん
18/04/03 09:37:51.60 wc7Iq10c0.net
>>34
あいほんはARMベースじゃなかったっけ。自社カスタムしてるけど。

37:デフォルトの名無しさん
18/04/03 10:39:38.27 3tygYxHf0.net
仮にインテルから自社製造に切り替えが本当だったとしても、
ARMかAMDみたいな互換の�


38:ヌちらかじゃないかな 仮にARMだったらRISCに戻ることになるのか そんな変更を強行出来るのはアップルくらいなもんだな



39:デフォルトの名無しさん
18/04/03 11:22:41.72 8N8wvrwRM.net
これまでのニュース記事
・独自CPUを開発中
・iphoneアプリをmacbookで動かせるようにする
・1000ドル未満のmacbookを追加する
つまりはこんなとこでしょ。
・macbookはARMアーキのカスタムCPU
・proはIntel CPUとカスタムCPUのデュアル構成
スレチなのでもうやめる

40:デフォルトの名無しさん
18/04/03 12:06:02.87 i3mVMD7F0.net
>>32
最近の下げ調子からちょっと戻したところをイースター休暇を狙って仕掛けがあったんだが
個別のちょっとしたニュースの影響なんて掻き消える事態なんだよ
ITだけでもほぼ全部下げてる
URLリンク(stocks.finance.yahoo.co.jp)
アップル 前日比-1.10(-0.66%)
マイクロソフト 前日比-2.75(-3.01%)
アマゾン・ドット・コム 前日比-75.35(-5.21%)
IBM -3.36(-2.19%)
グーグル -25.32(-2.45%)
インテル 前日比-3.16(-6.07%)
エヌビディア -10.54(-4.55%)
AMD 前日比-0.52(-5.17%)
クアルコム -1.60(-2.89%)
オラクル -0.74(-1.62%)
フェイスブック -4.40(-2.75%)
ツイッター 前日比-0.97(-3.34%)
ヒューレット・パッカード -0.78(-3.56%)
シスコ・システムズ -1.88(-4.38%)

41:デフォルトの名無しさん
18/04/03 21:56:39.00 eMYrGYMY0.net
>>15
>メモリ確保に失敗したら安全な終了シーケンスの実行も難しいだろうし。
これに関しては起動時にまとまったメモリを終了処理用にmalloc()しておくという古典的なテクニックがある
(1 MBのメモリを起動時にmalloc()しておき、ヒープメモリが無くなったらそいつを解放すれば
 終了処理に1 MB使える
メイヤーズの本にも載ってる

42:デフォルトの名無しさん
18/04/04 06:41:13.40 5k6f4LQE0.net
>>39
それJAVAがやっててすごい評判悪い。

43:デフォルトの名無しさん
18/04/04 08:49:31.33 Ls5GP4D6M.net
Javaの評判で良いのなんて心当たり無いかも

44:デフォルトの名無しさん
18/04/04 20:06:00.30 kRSnmS570.net
Java最高!プログラムの未来はJavaにある!面倒なメモリ管理もなくなるし移植でコード書き直す必要もなくなるぞ!
それに引き換えC++(笑)ときたら、数年後には特殊用途以外では消えてるね。まあその特殊用途もCとアセンブラで充分だけどな(プ
とか言われてた時代もあったんです
本当だよ

45:デフォルトの名無しさん
18/04/04 21:24:30.34 g8Q3GJCm0.net
Java実行するチップもあったが夢の跡

46:デフォルトの名無しさん
18/04/04 22:54:27.67 aEQNvaBv0.net
C++とかいまや高位合成でそのままハードウェアに

47:デフォルトの名無しさん
18/04/04 22:56:36.02 do3bz0SM0.net
Javaとか百害あって一利あるかないかのレベル

48:デフォルトの名無しさん
18/04/05 05:14:09.23 KAa2PFgc0.net
class Manager {
public:
template <class T>
static void add(std::string key) {
auto inst = std::make_shared<SuperClass>(new T());
Manager::m_data[key] = inst;
}
}
使用例
Manager::add<SubClass>("key1");
こんなことがしたいんだけどnew T()のところでエラーが出る
C2248 'SubClass::SubClass': private メンバー (クラス 'SubClass' で宣言されている) にアクセスできません。
解決策を教えてください
SubClassはSuperClassから派生させてコンストラクタSubClass(){}を追加しただけです

49:デフォルトの名無しさん
18/04/05 05:18:59.30 KAa2PFgc0.net
すみません派生クラスのコンストラクタにpublic:つけてませんでした・・・

50:デフォルトの名無しさん
18/04/05 05:45:20.00 KAa2PFgc0.net
いろいろ修正したら解決しました

51:デフォルトの名無しさん
18/04/05 08:26:54.03 L9k+v76Td.net
make_shared使ってるのにnewするなんて

52:デフォルトの名無しさん
18/04/05 08:38:48.75 KAa2PFgc0.net
newもけしました

53:デフォルトの名無しさん
18/04/05 20:15:16.61 SmaaQ+MA0.net
こうしなさい
auto inst = std::make_shared<T>();
Manager::m_data[key] = std::move(inst);

54:デフォルトの名無しさん
18/04/05 20:38:45.12 B7cMgYJ4M.net
まずはManagerとかControllerとかいった名前をたやすく使うのをやめるべき。
もちろんそういった名前が適切な場合も多々あるが、初心者が使う場合、たいていオブジェクト指向設計に失敗している。

55:デフォルトの名無しさん
18/04/05 20:44:22.17 Qwh0cfWA0.net
その主張前にも聞いたけど実にくだらない

56:デフォルトの名無しさん
18/04/05 20:54:24.03 BAXwN9iv0.net
>>51
なんで?シェアードポインタに限っては内部カウント増えてコピーされるだけだよ。
うにーくはmoveしたいけど、mapには入らないみたい。

57:デフォルトの名無しさん
18/04/05 21:08:32.94 SmaaQ+MA0.net
違うよ
ちゃんと実際の型でmake_sharedしてからshared_ptr<SuperClass>に入れろって言ってるの

58:デフォルトの名無しさん
18/04/05 21:42:13.44 kzoSJIbv0.net
せっかく make_shared 使うのに明示的に生ポインタを new する人って…
というようなことだろ

59:デフォルトの名無しさん
18/04/05 21:56:01.48 BAXwN9iv0.net
あー、なるほど。すまんね。

60:デフォルトの名無しさん
18/04/06 01:37:22.74 Mgh91ASd0.net
auto変数はスコープ外れたらどうせ破棄されるしmove要らない

61:名無し@キムチ
18/04/06 20:16:12.73 VpnYoE0I0.net
いままでC♯使ってたけど、最近つーかおととしくらいからC++使い始めたんだよ。
そしていろいろ見ているうちにファイルの作成→3Dシーンというのがあったので、作成したら、
何もオブジェクトの入ってないシーンだけの画面が出てきたわけよ。
このシーンにオブジェクトを入れるにはどうすればいいの?
またウインドウズのGUIの実行ファイルからこのシーンを出すにはどうすればいいの?
つーかそもそもGUIの実行ファイルからこのシーンを出せるの?
このようにまだ右も左もわかってない状態なんで、よろしくご教授お願いしますよw

62:名無し@キムチ
18/04/06 20:17:16.93 VpnYoE0I0.net
>最近つーかおととしくらいからC++使い始めたんだよ。
ごめん、おとといくらいからの間違いだったよw
よろしくご教授たのむよ!!

63:デフォルトの名無しさん
18/04/06 20:26:20.68 TFjbUU5Da.net
おととい来やがれ
と言ってみる

64:片山博文MZ
18/04/06 20:34:38.59 eB6IhESGd.net
>>59
自分の環境くらい理解しよう。UnityなのかUnrealなのか。

65:デフォルトの名無しさん
18/04/06 20:36:14.26 gYiRH0WM0.net
何を言っているのかわからないし
特定のプラットフォームの話ならそっちで聞くべき

66:デフォルトの名無しさん
18/04/06 21:01:12.49 RWHjeoGDa.net
YAMLをC++で読む簡単な方法はなんですか?
LibYAMLなんですかね

67:片山博文MZ
18/04/06 21:11:46.44 eB6IhESGd.net
>>64
URLリンク(github.com)
これが一番良さそう。星がたくさん付いてるし。

68:名無し@キムチ
18/04/06 21:18:03.84 VpnYoE0I0.net
>>62
いや、いま使ってたのはUnityでC♯だったが、
それとは別にVisualC++とFBXSDKでってのをやってみようと思っておとといから始めたわけだよ。
でFBXファイルを読み込んでノードの取得あたりまでは進んだけど、
よく見るとVisualC++のファイル新規作成に3Dシーン(FBX)ってのがあるわけ。
もしやこれ使うとFBXSDKはいらないのかな?とも思ったりしたんだけど、
何しろまだ右も左もわからないし、その3Dシーンにオブジェクトを置くやりからもわからないし、
そのシーンを一応とってつけてつくってみたウインドウズ実行ファイルから呼び出すためのコードの書き方もわからないしで、
こうやってみなさまにご教授を求めた次第ですよ!!

69:片山博文MZ
18/04/06 21:21:11.15 eB6IhESGd.net
私の認識が正しければ、SDKはSoftware Development Kitだから、実際の実行時に使うライブラリーのことだろうよ。

70:片山博文MZ
18/04/06 21:23:42.24 eB6IhESGd.net
実行時に動かすなら、SDKにリファレンス(またはドキュメント)があるはずだ。

71:片山博文MZ
18/04/06 21:27:19.39 eB6IhESGd.net
ドキュメントがないなら、そんなマイナーなフレームワークを使うな、で終わり。

72:片山博文MZ
18/04/06 21:29:52.65 eB6IhESGd.net
ゲーム製作板か、CG板の方がいいかもしれない。

73:名無し@キムチ
18/04/06 21:32:34.54 VpnYoE0I0.net
>>68
まだ正式なリファレンスはいろいろ暇がなくて読んでない。
日本語で簡単に解説してあるウェブサイトは見たけど、
取得したFBXファイルのいろんな情報を文字列で表示するプログラムが載ってるだけで、
実際にその3Dオブジェクトを画面に表示する方法が載ってない。日本語のサイトで解説してあるのは、どうもここまでみたいなので、
やはり英語の正式なリファレンスを見ないとダメかな?www

74:片山博文MZ
18/04/06 21:35:02.97 eB6IhESGd.net
ゲーム製作板に、くわしく知ってる人が居るかも知れない。

75:片山博文MZ
18/04/06 21:39:40.26 eB6IhESGd.net
業界へ出るなら、英語アレルギーは克服すべし。自動翻訳が使えれば、詠めるかもしれない。蘭学から学べることは多い。

76:名無し@キムチ
18/04/06 21:40:42.10 VpnYoE0I0.net
>>70
>ゲーム製作板か、CG板の方がいいかもしれない。
いやゲームはもう作りたくないし、CGも特に興味ない。
実はMakeHumanみたいな3Dキャラ作成ツールがつくりたくてね。
まだ始めたばかりで、そこまでの距離は100億光年ばかりあるけど・・・
これってやっぱりちゃんとしたプログラム技術板向きの話題だよね?

77:片山博文MZ
18/04/06 21:42:51.27 eB6IhESGd.net
器の小さい人には教えないよ。時間のムダだからね。

78:片山博文MZ
18/04/06 21:48:02.69 eB6IhESGd.net
ゼロから3D作りたいなら、DirectX, OpenGL, Valkanあたりを勉強することになる。
しかし、ゲームエンジンがなければ、動く3Dは手間がかかる。

79:デフォルトの名無しさん
18/04/06 21:49:10.94 RWHjeoGDa.net
>>65
ありがとうございます!

80:デフォルトの名無しさん
18/04/06 21:50:43.17 RWHjeoGDa.net
>>76
DirectX便利ですよね
魚眼を再現しようとして挫折しましたが...

81:片山博文MZ
18/04/06 21:51:55.72 eB6IhESGd.net
iPhoneXでリアルタイムでVtuber作れる時代に素人が3Dモデラー作るのは、技術のムダだろう。

82:片山博文MZ
18/04/06 21:56:32.87 eB6IhESGd.net
数学のベクトル、射影、非ユークリッド幾何学が理解できるくらいの数学力がないと魚眼レンズはムリだろう。ムリムリ。

83:片山博文MZ
18/04/06 22:00:38.96 eB6IhESGd.net
物理学的に考えると、魚眼は屈折率の差から発生する現象だから、モデラーの物体に屈折率を設定するだけでいい。

84:片山博文MZ
18/04/06 22:05:13.65 eB6IhESGd.net
カメラの特性で、レンズの広角が設定できればそれに越したことはないが。

85:片山博文MZ
18/04/06 22:10:52.66 eB6IhESGd.net
「広角 DirectX」で検索。
URLリンク(msdn.microsoft.com)

86:デフォルトの名無しさん
18/04/06 22:14:45.90 Qe7eZ8vzM.net
>>80
エピポール幾何はいるでしょうねぇ
AR/MR/VRするなら

87:デフォルトの名無しさん
18/04/06 22:23:28.39 RWHjeoGDa.net
>>83
度重なるありがとうございます。
勉強します。とりあえず処理重そうです(・・;)

88:デフォルトの名無しさん
18/04/06 22:30:22.55 gYiRH0WM0.net
ゲーム作ろうと思っても大体はゲームエンジン作り始めて途中で飽きてやめる

89:片山博文MZ
18/04/06 22:30:40.49 eB6IhESGd.net
CGもオブジェクト指向になっているから、撮影スタジオで実際に物体やカメラの位置を決めるのと同じように、シーンを構築すれば、それが映像になる。

90:片山博文MZ
18/04/06 22:57:17.05 eB6IhESGd.net
ニュースセンターで使われるような、再現CGを自由に作れるようになったら、引っ張りダコだよ。

91:片山博文MZ
18/04/06 23:06:06.99 eB6IhESGd.net
そうなったら、映像クリエイターになって仕事を請け負って独立できるぞ。プログラマーよりも働き甲斐があるかもしれん。

92:デフォルトの名無しさん
18/04/06 23:07:50.12 gYiRH0WM0.net
どっちも薄給

93:デフォルトの名無しさん
18/04/07 00:36:31.30 Y5tUUVb30.net
やたら伸びてると思ったら1人あたりのレス数多すぎだろ(しかも知らんことに口出し過ぎ
fbxsdkは昔ちょっとしか触ってないが、多分そのVSの3Dシーン作成ってのは3Dのモデルやシーンを.fbxに書き出すプロジェクトじゃね?
そういうのは多分Maya使った方が早いしfbxsdkはどっちにしても要る
あとDirect3D使うならそっちのスレ行ってくれ

94:デフォルトの名無しさん
18/04/08 02:00:13.10 xND6FkKma.net
C++で用意されているキャストと
cのi=(int)j みたいなキャストの違いがよくわからない

95:デフォルトの名無しさん
18/04/08 02:09:06.48 +gqqNGFK0.net
static_cast … 無理のない互換性のある変換。
reinterpret_cast … int から void* 等への強制変換 c の ()キャストと同じ。
const_cast … const 付きから const を無くしたりまたはその逆の変換。
dynamic_cast … 実行時型情報を使って実行時に型情報で互換性を見比べながらの変換。実行時型情報とのリンクが必須。

96:はちみつ餃子
18/04/08 03:14:37.94 RvzgDq0H0.net
>>92
C スタイルのキャストは dynamic_cast 以外の C++ スタイルキャストを兼ね備えている。
安全なキャストも危険なキャストも見た目にわかんないから、
うっかり危険なキャストをしないようにカテゴリ分けしたやつを使った方がいいなって話。
reinterpret_cast や const_cast がどうしても必要な状況になったら、
それはそのプログラムが悪いデザインだというサインだ。
(デバイスドライバとか OS とかの低水準プログラムだと仕方なく使う機会は多いかもしれないけど)

97:デフォルトの名無しさん
18/04/08 06:15:21.60 fQMOYFpe0.net
『プログラミング言語C++』第4版のどこだったかに、
「危険なキャストを行っているソース箇所が目立つように
reinterpret_cast<型> のような長い綴りで見た目もスマートでない
キーワードを選んで導入した」みたいなことが書いてあったな。

98:デフォルトの名無しさん
18/04/08 11:13:04.50 NQAA1W7E0.net
すいませんchar str[1000]に格納されてるこの文字列を、str2[0][]=64 str2[1][]=9 という感じで上手くデータだけ取り出す方法は無いでしょうか
URLリンク(i.imgur.com)

99:デフォルトの名無しさん
18/04/08 11:13:28.36 CEYO7YYHa.net
ありがとうございます
基本的には見た目の話なんですね

100:デフォルトの名無しさん
18/04/08 11:44:19.45 rArjzNgz0.net
C形式のキャストは絶対に使うなって事だよ

101:デフォルトの名無しさん
18/04/08 11:44:37.07 ySnMa92f0.net
>>96
cならsscanfかね
c++ならregexを使うか
そもそもc/c++でやりたい範囲ではないが

102:デフォルトの名無しさん
18/04/08 11:44:50.16 wX43tNlZ0.net
>>96
テキストなのなら、一行ずつ読んで、=で半分にしましょう。
んで、""の中の空白以外を全部取り去って、std::mapにでも突っ込みましょう。

103:デフォルトの名無しさん
18/04/08 12:07:31.24 NQAA1W7E0.net
>>99>>100
めっちゃ難しそうな回答きた・・
ちょっと調べて頑張ってみますありがとうございます

104:デフォルトの名無しさん
18/04/08 12:17:01.56 .net
danger_cast は言い過ぎとして、unsafe_cast くらいにして欲しかった

105:デフォルトの名無しさん
18/04/08 12:19:03.34 .net
hansode_tampan_cast

106:デフォルトの名無しさん
18/04/08 12:34:24.71 .net
>>96
・str2はポインタの配列、idxはstr2の添字とする
・1文字ずつループして以下を処理
 「=」が現れるまでまで読み飛ばす
 「 」「"」以外の文字が現れたらstr2[idx++]にその文字へのポインタ格納
・「;」までスキップして¥0に置き換え

107:デフォルトの名無しさん
18/04/08 12:36:55.36 NQAA1W7E0.net
>>104
なんかできそう!やってみますありがとうございます!

108:デフォルトの名無しさん
18/04/08 13:00:09.46 CRecF1KTd.net
reinterpret_cast をポインタ以外に使うのはない

109:デフォルトの名無しさん
18/04/08 13:13:04.30 IdsKnaEwM.net
c向けのライブラリをc++で開発するときは躊躇なく使うかな>reinterpret_cast
あとはargとかparamとかいう名前の引数に好きなデータを突っ込みたいときとか。

110:デフォルトの名無しさん
18/04/08 13:57:50.07 .net
reinterpret_castはゼロオーバーヘッド?

111:デフォルトの名無しさん
18/04/08 13:59:32.17 wX43tNlZ0.net
コンパイラさんが解釈かえるだけだから。新しくなにも確保しない。

112:デフォルトの名無しさん
18/04/08 14:55:18.41 XIh7sWbQ0.net
バイト単位の処理をするときに必ず出てくるだろ

113:デフォルトの名無しさん
18/04/08 15:41:01.45 drN9+cfC0.net
>>107の「あとは」以下の用例多いよね。
スレッドのエントリポイントの引数だの libcurl のコールバックの引数だのそんなので

114:デフォルトの名無しさん
18/04/08 17:17:06.93 9PMBUXuM0.net
バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい

115:デフォルトの名無しさん
18/04/08 17:26:02.77 XIh7sWbQ0.net
>バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
誰も殺そうとしていない

116:デフォルトの名無しさん
18/04/08 17:48:08.38 yoJPjKyN0.net
Windowsとかのメッセージのパラメータなんて、
キャストしないとなにもできないけどな

117:デフォルトの名無しさん
18/04/08 20:53:29.38 B7amW+qmM.net
>>112
> さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
C+++でも作って勝手にやっててくれ

118:デフォルトの名無しさん
18/04/08 21:04:08.52 aevyI+Fp0.net
C++++でしょ
ill-formedだけど
それでこそアホどもに相応しい

119:デフォルトの名無しさん
18/04/09 11:03:03.24 Ecf+pvidM.net
static_castは長いから、ただのcastにしてほしい
その方がreinterpret_castのunsafe感が高まる

120:デフォルトの名無しさん
18/04/09 11:19:04.00 ClY8G0uJa.net
デフォルトをstatic_castで解釈しないのはなぜ?

121:はちみつ餃子
18/04/09 11:23:19.28 fbTUuQs/0.net
>>117
#define cast static_cast

122:デフォルトの名無しさん
18/04/09 15:59:42.60 AbJVhraD0.net
>>118
互換性

123:デフォルトの名無しさん
18/04/09 22:38:54.59 J7f8Y+mC0.net
>>118
互換性には2種類ある
クラスポインタ変換の場合を例に挙げると
一つは拡張クラスからベースクラスへのアップキャスト
こちらはキャストの明示は必要ない暗黙の型変換が行える
もう一つはベースクラスから拡張クラスへのダウンキャスト
こちらはベースから拡張クラスへの変換に確証が得られている
わけではないのでstatic_castを用いて変換してやらないといけない
このときdynamic_castを使うと実行時に型をチェックしてくれる
のでよりstrictな変換を行わせることができる
できるといってもエラーを発生させるかさせないかの違いだけだけど

124:デフォルトの名無しさん
18/04/10 00:58:36.89 KTsfJjko0.net
>>118
そら互換性のためでしょ

125:デフォルトの名無しさん
18/04/10 05:22:39.46 AY1cx8Cu0.net
>>121
それは互換性じゃなくC++独自の話だね
互換性というからには何と互換なのかという相手がいる
ちなみに、かつて暗黙dynamic_castが提案されて否決となった

126:デフォルトの名無しさん
18/04/10 09:48:42.17 PdcJoG7U0.net
コンソールプログラムのwhile()ループで1文字入力したらループを抜けるときに使うやつって何でしたっけ・・
while(!getchar())だと文字を受けるまで処理がとまってしまいますが、止まらないやつがあったと思うのですが

127:デフォルトの名無しさん
18/04/10 10:20:00.71 AY1cx8Cu0.net
標準に「止まらないキースキャン」はない
conio.hのgetch()や
ioctl.hのioctl()あるいは
windows.hのGetKeyState()のような
処理系依存の関数が必要

128:デフォルトの名無しさん
18/04/10 10:30:44.25 h0HOed+p0.net
linuxならファイルディスクリプタにselectが使えるけど
windowsの場合はファイルディスクリプタとソケットがまた別物だし

129:デフォルトの名無しさん
18/04/10 11:04:35.34 PdcJoG7U0.net
>>125
getch()絡みで調べてたらkbhit()って出てきましたこれです
ありがとうございました
ちゃんと任意のキー押したら抜けれました

130:はちみつ餃子
18/04/10 11:10:44.06 141aKXKv0.net
それって結局はビジーループの一種じゃね?
やりたいことにもよるけど、基本的にはあんまりよくない方法だと思う。

131:デフォルトの名無しさん
18/04/11 08:10:31.14 T4s6uHOl0.net
>>128
まずいですかね?
一日ランニング試験してみたんですが良い感じに動いてるのですが・・

132:デフォルトの名無しさん
18/04/11 09:27:42.36 WgIjYyd40.net
ビジーループにSleep挿入して100msづつ位休む感じでアイドルに見せ掛けるハッタリを噛ます

133:デフォルトの名無しさん
18/04/11 12:28:20.43 nyTWTQlG0.net
はったりじゃないでしょ
それは合格

134:デフォルトの名無しさん
18/04/14 12:01:39.22 bHi1VZVu0.net
低優先度タスクからのプリエンプションが無いOSでSleep(100 ms)したら
優先度関係無く他タスクに100 msを超えて待たされてしまうかもしれない
Sleep()は実行権放棄の呪文としては強力すぐる…

135:デフォルトの名無しさん
18/04/14 13:25:03.37 RVvtBgPf0.net
DOS並にコンソールがクソな環境も珍しいよな
unixベースのシェルに比べるとこんな貧相なものがよく生き残ってこれたとおもふ

136:デフォルトの名無しさん
18/04/14 14:27:12.94 AqyGMwU/0.net
>>132
ウィンドウズの話だけど、threadヘッダのスリープは起こし忘れが少ない気がする。

137:デフォルトの名無しさん
18/04/14 22:00:06.17 7AzbU2hj0.net
未だにGUIがまともにならないLinuxも珍しいよな

138:デフォルトの名無しさん
18/04/14 22:16:23.39 B3QB9Fpb0.net
>>135
君に期待しても良いのかな?

139:デフォルトの名無しさん
18/04/14 22:26:38.67 jn5/AQ8F0.net
誰かがデザイナ雇わないとな

140:デフォルトの名無しさん
18/04/14 22:31:21.78 Tt8LTURP0.net
まともを定義せよ

141:デフォルトの名無しさん
18/04/14 22:47:45.04 jn5/AQ8F0.net
美しいGUIか使用上十分なGUIか

142:デフォルトの名無しさん
18/04/14 23:04:06.39 WAEnZz2X0.net
C


143:lass A {   void A(B* &b)   {   } };



144:デフォルトの名無しさん
18/04/14 23:06:11.46 B3QB9Fpb0.net
毎日使う上では美しさはいらない。シンプルで頼む

145:デフォルトの名無しさん
18/04/14 23:08:51.81 WAEnZz2X0.net
済みません、途中送信してしまいました・・・
Class A
{
  B* _b;
  void A(B* &b)
  {
    _b = b;
    _b = new B();
  }
};
B* b;
A* a = new A(b);
b←newされてない・・・
クラスAのコンストラクタでクラスBのインスタンスを受け取り
newで新たなインスタンスを作成したうえで返そうと思います。
しかし上記のようなプログラムを作成してもインスタンスbは
newされてませんでした。
どうしたらbをnewしたうえで返すことができるようになるでしょうか?

146:デフォルトの名無しさん
18/04/14 23:15:39.02 EkNosKh20.net
void A(B** b)
{
*b = new B();
}
でいいんでないの

147:デフォルトの名無しさん
18/04/14 23:23:21.44 9kNArSDya.net
馬鹿だから分からないんだが教えて
インスタンス渡してからnewするのはなぜ?
ポインタを参照にする意味とは?

148:デフォルトの名無しさん
18/04/15 00:33:02.73 /OvgYAab0.net
>>142
>  void A(B* &b)
>  {
>    _b = b;
>    _b = new B();
>  }
下の方は b = new B(); としたかったんじゃないのか

149:デフォルトの名無しさん
18/04/15 00:44:36.47 b/ktaKN+0.net
A(B*&b) {
b=new B();
_b=b;
}
頭悪いだろオマエラw

150:デフォルトの名無しさん
18/04/15 00:52:36.30 b/ktaKN+0.net
A(B*&b){_b=b=new B();}
もしくは一発で書けば何の問題もおこらんよ

151:デフォルトの名無しさん
18/04/15 00:57:54.63 /OvgYAab0.net
受け取ったインスタンスを全く使ってないがそれが意図した動作なのか

152:デフォルトの名無しさん
18/04/15 01:00:18.78 b/ktaKN+0.net
参照オブジェクトの概念がよくわかってない
学び直せと言いたい

153:デフォルトの名無しさん
18/04/15 01:04:57.02 VAOccv/70.net
>>148
インスタンスなんて受け取ってないぞ

154:デフォルトの名無しさん
18/04/15 01:09:03.26 /OvgYAab0.net
>>150
>>142で「インスタンスを受け取り」と書いてあるから
ポインタ(の参照)でだけどインスタンスを渡しているのだろう
何故受け取っているのかとかの説明は無理だが

155:デフォルトの名無しさん
18/04/15 01:19:33.61 b/ktaKN+0.net
それにしてもbをnewするとかイミフ
何もしてないじゃんw

156:デフォルトの名無しさん
18/04/15 01:22:46.36 b/ktaKN+0.net
古いインスタンスを_bに格納して新しいインスタンスをbに返したいのか
新しいインスタンスを作成してbと_b両方に返したいのか
どっちなんだよ

157:デフォルトの名無しさん
18/04/15 01:22:49.52 /OvgYAab0.net
>>152
b を new するってのは
>b = new B();
のことか?参照で返してるんだよ
何故返す必要があるのかはこれも答えられないが
>>142に new して返そうと思っていますとあるからな

158:デフォルトの名無しさん
18/04/15 01:30:17.78 b/ktaKN+0.net
_b=new B() は見当たるが
b=new B() ←こんな記述は見当たらないぞ
嘘もたいがいにしとけや

159:デフォルトの名無しさん
18/04/15 01:39:29.12 b/ktaKN+0.net
>>142
コイツのソース見る限りbに対しては何もしてないでしょ

160:デフォルトの名無しさん
18/04/15 03:35:09.27 mYZtkoVNd.net
すまんすまん
>>142
>B* b;
>A* a = new A(b);
を見落としていた
インスタンスを渡すといっておいてインスタンスを渡していないとは思いもしなかったw
>>147であってるんだろうね

161:デフォルトの名無しさん
18/04/15 06:03:36.65 .net
>>142
>  void A(B* &b)
>  {
>    _b = b;
>    _b = new B();
>  }
  void A(B* &b)
  {
    B* new_b = new B();
    b = new_b;
    _b = new_b;
  }
こういうのは愚直に書けばええんや

162:デフォルトの名無しさん
18/04/15 08:25:34.99 IUBKEb9a0.net
AのコンストラクタにBへのポインタのポインタだか参照だかを渡さなくても
Bへのポインタと関係ないAのコンストラクタ、と
A内部のBメンバへのポインタを返すゲッタ、との
組み合わせにする方が素直でねぇか?
class A
{
  B* _b;
public:
  A() {_b = new B();}
  B* ptr_b() const {return _b;}
};
int main(void)
{
  A* a = new A();
  B* b = a->ptr_b();
  return 0;
}

別に確保した「Bを格納すべき領域へのポインタ」を受け取って、
Aの初期化時にBの配置newを行わせたい、という意図かもしれないけど、
元の質問から想像を広げすぎてるよね。

163:デフォルトの名無しさん
18/04/15 10:01:16.50 6WpjLuna0.net
Aが_bをdeleteするために管理するだけのクラスだとしたらスマポ使えという話になる

164:デフォルトの名無しさん
18/04/15 10:57:43.04 Yi/sDJN50.net
前に書き込んだことあるけど
URLリンク(qiita.com)
どうじゃ

165:142
18/04/15 11:01:19.87 GeT3puOg0.net
舌足らずでもうしわけありませんでした・・・
クラスBのインスタンスをクラスAで処理していくためにコンストラクタでクラスBの
インスタンスを参照受け取りする仕様にしました。
大半のケースではそのまま処理して終わり、なのですが
まれに受け取ったクラスBのインスタンスをnewし直す必要がありまして
その際受け取ったクラスAのメンバ変数 _b をnewしても受け取り元のインスタンスを
newできないことに悩んでいました
ただオブジェクト指向の観点から見るとあまり美しいプログラミングスタイルでは無いのかもしれませんね。
クラスBのインスタンスはクラスA内部で完全隔離処理するようにした方がいいのかもしれません

166:デフォルトの名無しさん
18/04/15 11:19:51.96 6WpjLuna0.net
BをAしか使わないならAの中に隔離する
他でも使う必要があって、Aの外部でBの寿命を管理してるなら、AにrefreshB()みたいなBをnewし直した時に渡し直す関数を用意する
でいいんじゃないの
本当にBをnewし直す(メモリ上再配置する)必要があるならだけど
実はB自体にreset()用意するだけで済む話のように見える

167:デフォルトの名無しさん
18/04/15 12:55:30.01 eVQUY7wra.net
c++じゃポインタのこともインスタンスっていうのか

168:デフォルトの名無しさん
18/04/15 14:39:37.81 rsq+XQj0M.net
>>164
2レス前も読めないのか

169:デフォルトの名無しさん
18/04/15 18:30:19.93 51qZxk5sa.net
理解不足を言い換えてミスしてない風にするのが流行ってるのかな

170:デフォルトの名無しさん
18/04/15 22:24:39.46 vR7s+ZvT0.net
ミスって理解不足からくるじゃん

171:デフォルトの名無しさん
18/04/15 23:39:26.36 Mp1WrgTGa.net
質問あるのですが、
同一PC内の画面機能と処理機能のプロセス間通信はどうやるのが便利ですか?
画面更新速度は100ms周期くらいです。
共有メモリがいいと思ったんですが、ソケット推してる人がいてもやもや
アクセス速度とかNICの通信量とか考えると共有メモリ一択な気がするんですが、どうなんでしょうか?
パイプとマップドメモリはメリット無いので考えていません。

172:デフォルトの名無しさん
18/04/15 23:42:01.12 sXJBpbWg0.net
何を重視するか次第

173:デフォルトの名無しさん
18/04/15 23:43:30.47 qZPDSYA20.net
共有メモリ=マップドファイルのファイル無しやで

174:デフォルトの名無しさん
18/04/15 23:43:31.62 51qZxk5sa.net
そもそも別にする理由は何?
どんなものを想定してるの?
プロセスは常に1対1なの

175:デフォルトの名無しさん
18/04/15 23:44:26.87 sXJBpbWg0.net
OSは?

176:デフォルトの名無しさん
18/04/15 23:47:06.30 51qZxk5sa.net
同一PC内なのにソケットとNICの通信量って何か関係あるの?

177:はちみつ餃子
18/04/15 23:53:07.49 aQ0USPFo0.net
>>168
ソケットって、その場合はUNIXドメインソケットのことだろ。 NIC は関係ない。
プロセス間通信としてはほどほどに速度もあって、ほどほどに疎結合なので十分に選択肢の範囲内だと思う。

178:デフォルトの名無しさん
18/04/16 00:28:23.74 TXxoP4/a0.net
unix domain ソケットがお手軽で便利だけど
時代に合わせてパイプか tcp かなあ
Windows でしか使わないならならcom使うのも簡便

179:デフォルトの名無しさん
18/04/16 01:39:01.50 .net
共有メモリだとリングバッファとか排他とか自分で作り込まなきゃいけんやろ
ソケットならそのへん考えなくてええやん

180:デフォルトの名無しさん
18/04/16 02:21:40.05 kGNRvKds0.net
windowsはファイルマッピングオブジェクトでしょ
パイプでさえSYNCHRONIZE特権指定できないゴミなんだから

181:デフォルトの名無しさん
18/04/16 03:12:35.45 HsbFINqV0.net
標準入出力最強説

182:デフォルトの名無しさん
18/04/16 06:43:39.39 kK8liqj6M.net
unix domain socket なんて使ったことないな
名前空間としてファイルの指定がいるし将来違うマシン間で動作させる時に変更量が多いしtcp/udpに比べてデメリット多くね?

183:デフォルトの名無しさん
18/04/16 07:06:03.32 irvwqMpDa.net
>>173,174
共有メモリは例えば/dev/shmのRAM領域にあるメモリマップですよね
同一PC内のソケットのボーレートってほぼクロック数なんですか?
同一PC内の通信であったとしてもネットワークドライバの実装するプロトコルスタックを経由してしまうので、
その分のオーバーヘッドの分だけ速度が落ちる、という解釈ですが

184:デフォルトの名無しさん
18/04/16 07:17:01.48 irvwqMpDa.net
iperfとかで同一PC内で速度測ったらどれくらいいきます?
(1Gbpsな気が)

185:デフォルトの名無しさん
18/04/16 08:09:11.43 TXxoP4/a0.net
>>179
ドロップしないから楽なんだよ
デメリットは仰る通り

186:デフォルトの名無しさん
18/04/16 08:09:52.14 TXxoP4/a0.net
>>180
あなた知識が色々おかしいので何も考えずに教えられたとおりにした方が良いですよ

187:デフォルトの名無しさん
18/04/16 12:07:30.90 1SlhlQTu0.net
昨日の安全確保支援士の試験にC++が出ていたが、メンバ変数にm_が付いていた。
さすがにポインタのpなどは付いていないが、ちょっと意外だった。

188:デフォルトの名無しさん
18/04/16 18:56:27.96 aeexu7jXa.net
>>183
同一PCのTCP通信はどういう経路通るの?

189:デフォルトの名無しさん
18/04/16 20:00:43.80 Iff3OzVTM.net
クライアント→OS→サーバかその逆

190:デフォルトの名無しさん
18/04/17 17:50:44.77 YRsoLN600.net
未だにシステムハンガリアンなやつみたいに変なのとも
うまく付き合うのがC++使いのスキルの1つだかんね

191:デフォルトの名無しさん
18/04/18 00:38:34.88 1Mo3YyI90.net
↑ボゾビット

192:デフォルトの名無しさん
18/04/18 02:18:47.96 whM0Cl8U0.net
Windowsのネットワーク関係APIはkernel内に実装されていない
後は判るな?

193:デフォルトの名無しさん
18/04/18 07:02:39.34 bX/oR0u10.net
ネットワーク関係に限らずAPIはすべてサブシステムだね

194:デフォルトの名無しさん
18/04/20 23:48:17.59 MBksKo4b0.net
class Sample{
private:
const double val{0.0}
public:
void set(double v){
static_cast<double>(this->val) = v;
}
};
VS2015での話なのですが、こんな感じのコードを先日見かけまして
static_castでメンバ変数のconst外しができているように見えるのですけど、この動作は合法なものなのでしょうか?
試しにwandboxのclang 7.0で試して見た所当然のようにコンパイルエラーになったのですが・・・

195:はちみつ餃子
18/04/21 00:23:55.79 7j/Wt31X0.net
>>191
const を外すのは const_cast じゃなきゃ出来ないことになっている。
だいぶん昔からそう。
でなきゃわざわざ分けている甲斐がない。

196:デフォルトの名無しさん
18/04/21 00:37:31.88 WobodGQW0.net
const char *a = "hoge";
const char *b = "hoge";
この2つのポインタがa == bになることは保障されていますか?

197:デフォルトの名無しさん
18/04/21 00:42:18.95 F9SE4HSu0.net
ない

198:デフォルトの名無しさん
18/04/21 00:47:40.36 5uFute1E0.net
>>192
やっぱりそうですよね、何か特別な動作かとも思ったのですがVC++のバグか仕様なんですね・・・

199:デフォルトの名無しさん
18/04/21 06:06:21.46 pETeS31u0.net
>>191
VS2017では警告されるぞ(おそらくVS2015でも)
cl 191.cpp /c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.13.26129 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
191.cpp
191.cpp(7): warning C4213: 非標準の拡張機能が使用されています: 左辺値でキャストしました。
後はわかるな?

200:デフォルトの名無しさん
18/04/21 06:22:18.02 wsxrLs1Z0.net
ポインタや参照のconst外しは合法だが
なぜ合法なのか(合法にせざるを得なかったのか)というとmemory aliasing状況下での最適化の限界に関する
ラクダ本ばりに長い議論を要する
悪寒、
プログラミング言語C++か何かでは古いライブラリのconst付け忘れにコード修正無しで対応できるYO!みたいな簡単な説明しかないが
しかし左辺値のキャストというのはどうなの?

201:デフォルトの名無しさん
18/04/21 08:02:29.99 POwjcYl50.net
static_cast<double>(this->val)自体は合法でしょ
this->valと同じ値のdouble一時オブジェクトができるだけ
おかしいのはそれに代入してること

202:デフォルトの名無しさん
18/04/21 11:34:19.85 pETeS31u0.net
int x;
(float&)x = 1;

203:デフォルトの名無しさん
18/04/21 11:34:55.76 pETeS31u0.net
途中で書き込まれてしまった
int x;
(float&)x = 1; //well-formed
(float )x = 1; //ill-formed

204:デフォルトの名無しさん
18/04/22 17:24:24.80 RLzEBpTGa.net
std:stringを引数や戻り値で使う場合、値渡しでも大丈夫ですか?

205:デフォルトの名無しさん
18/04/22 17:29:11.38 xCJicIF50.net
大丈夫

206:デフォルトの名無しさん
18/04/22 18:29:08.58 i5tL4+9s0.net
stringは内部に参照カウンタを保持した共有リファレンサを持っているから&&使用せずに直で渡しても特に副作用もなく何の問題もないよ

207:デフォルトの名無しさん
18/04/22 18:53:47.99 cFbiqY2T0.net
今どきのstringはヒープじゃなくスタックを使ったりもするね
鬼のように最適化されている

208:デフォルトの名無しさん
18/04/22 19:26:19.72 xCJicIF50.net
>>203
おじいちゃんそれ大昔の話ですよ

209:デフォルトの名無しさん
18/04/22 19:52:27.54 i5tL4+9s0.net
>>205
貴様は過去を否定するのか?
温故知新という言葉を知らないのか?
青二才

210:デフォルトの名無しさん
18/04/22 20:00:35.45 pGMCB93ha.net
ありがとうございます
勝手にデストラクタでdeleteされるとか色々考えていましたがそこは先人たちが考慮して作られているのですね

211:デフォルトの名無しさん
18/04/22 20:19:16.41 5qvptAAaM.net
いやいや老害に騙されちゃだめですよ。
参照カウントなstringは大昔に禁止されているので、ちゃんと参照や右辺値渡等を使いましょう

212:デフォルトの名無しさん
18/04/22 20:23:51.32 M8qmSLCN0.net
>>208
何言ってんだおまえ
頭悪すぎるにもほどがあるだろ

213:デフォルトの名無しさん
18/04/22 20:58:25.32 ltJDDxzZ0.net
COWなstringは効率が悪くてマルチスレッドとの相性が最悪なのでとっくの昔に打ち捨てられました
規格のCOW実装許容するための記述はC++11でバッサリ捨てられました
今はCOWは規格違反です

214:デフォルトの名無しさん
18/04/22 21:39:50.50 M8qmSLCN0.net
なん…だと!?

215:デフォルトの名無しさん
18/04/22 21:51:37.63 .net
おじいちゃんw

216:デフォルトの名無しさん
18/04/22 21:54:34.58 w7SgV4Bf0.net
値渡しや戻り値で戻せることと、
std::string内部での(ヒープ)メモリ管理の詳細は関係なくね??
引数や戻り値としてスタックに構造体を積めるようになった時点で値渡しや戻り値で戻せることとはほぼ自明
(よほど変なコピコンを定義してコピーをわざと不首尾に終わらせない限りそれはできる

217:デフォルトの名無しさん
18/04/22 23:24:42.33 xCJicIF50.net
>>213
まあそうだけれど無駄なコピーはなるべく避けましょうということで

218:デフォルトの名無しさん
18/04/22 23:50:24.01 usC+gOtq0.net
今時のコンパイラは、そこらの人間よりよっぽど高度な最適化をするから、素直で単純なコードを書くと速くなる。
効率化するつもりで余計なことをすると、コンパイラの最適化を妨げて、かえって効率が落ちたりする。
本当に重要な部分は実測しながら試行錯誤、それ以外はできるだけ素直なコードを書く、ってあたりが基本。

219:デフォルトの名無しさん
18/04/23 01:28:01.46 C1tu+nEe0.net
stringを値渡しせずにconst参照等々で渡すことはc++の基本なので、素直で単純なコードの部類に入ると思うが。

220:デフォルトの名無しさん
18/04/23 01:32:17.81 Lxhtz3Yj0.net
って、あたりが基本(`・ω・´)キリッ
道化かw

221:デフォルトの名無しさん
18/04/23 01:37:49.36 voecBiJS0.net
先生!OpenMPへの展開も自動でやってくれるんですか?

222:デフォルトの名無しさん
18/04/23 01:46:26.60 Lxhtz3Yj0.net
値渡しを素直なコードとか言う人って他人の書いたコード読まないんだろうな
宿題以外で何か書いたことあるのか

223:デフォルトの名無しさん
18/04/23 02:04:07.25 SgzxVTg+0.net
const type &

224:デフォルトの名無しさん
18/04/23 04:33:47.47 WjBjSqCj0.net
const参照渡しが基本だったのって C++11 以前の世界の話だよね…
幸い、近頃はそんなコードをあまり読まずに済んでるけど。
余計なことをしない、ってのが大事なんだよ。
参照でなきゃいけない理由がなければ、参照を使うべきじゃないんだ。

225:デフォルトの名無しさん
18/04/23 06:33:47.30 awXEdMZR0.net
どこの世界に生きてる人?

226:デフォルトの名無しさん
18/04/23 07:20:47.54 voecBiJS0.net
どんな作品を作っているのかなぁ?

227:デフォルトの名無しさん
18/04/23 08:32:33.12 EDVnvY5w0.net
初心者です。
今書いてるプログラムをコンパイルして実行すると、エラーが出たり出なかったり謎の挙動を起こします
最初はエラーが出て、その後数回、コードを一切変えずコンパイルしなおして実行すると急にエラーが出ず上手く行ったりします。
これって何が原因なのでしょうか…
こういう事ってよくあるのですか?

228:デフォルトの名無しさん
18/04/23 08:34:14.27 Lxhtz3Yj0.net
キチガイ発言はツイッターかブログでどうぞ

229:デフォルトの名無しさん
18/04/23 08:35:11.51 Lxhtz3Yj0.net
>>224
よくあることです
デバッグしましょう

230:デフォルトの名無しさん
18/04/23 10:17:10.24 Hh6TN2Aq0.net
>>224
そのエラーとやら、もしかして警告か?
エラーは直すまで何度コンパイルしても絶対に通らない
警告はコンパイルが完了しオブジェクトファイルができる
そのコンパイルとやら、もしかしてビルドか? それともmakeか?
ビルドやmakeはオブジェクトファイルとソースファイルの日付を比較して
ソースファイルのほうが古いとコンパイルを省く
だから警告が出てからもう一度ビルドしても同じ警告は出ない
おそらく、こういうことだと見受ける

231:デフォルトの名無しさん
18/04/23 10:24:23.61 48PNhEnX0.net
変数を初期化してないんだろ

232:デフォルトの名無しさん
18/04/23 12:27:19.92 8odlZZv8M.net
>>227
日本語読めないのかよ...
> 実行すると、エラーが出たり出なかったり謎の挙動を起こします

233:デフォルトの名無しさん
18/04/23 13:44:26.09 Hh6TN2Aq0.net
>>229
日本語でしゃべってくれ

234:デフォルトの名無しさん
18/04/23 13:58:46.97 1JtTwXqR0.net
実行してるということはコンパイルは通ってるということだと思う
つまりコンパイルの問題ではなく、コンパイルエラーではないだろうという推測

235:デフォルトの名無しさん
18/04/23 13:58:59.41 Lxhtz3Yj0.net
>>230
「実行すると」
ビルド時のコンパイラなどからのエラーではなく、
プログラムを実行したときの挙動についての質問のようですよ

236:デフォルトの名無しさん
18/04/23 14:45:37.00 Hh6TN2Aq0.net
初心者つってるから
どこまでがコンパイルで
どこからが実行なのかの
区別からあやしいと見ている
実行時エラーにしても
stopダイアログなのか
結果がおかしいのか
あの質問では言ってない

237:デフォルトの名無しさん
18/04/23 14:53:14.79 48PNhEnX0.net
すげーみっともない奴だな

238:デフォルトの名無しさん
18/04/23 14:56:19.11 Hh6TN2Aq0.net
嘘は言っていない

239:デフォルトの名無しさん
18/04/23 15:52:04.86 mDBTWEJod.net
言論の自由を行使し過ぎw

240:デフォルトの名無しさん
18/04/23 16:27:46.06 So2OBlKcd.net
コンパイルして(リンクを)実行すると
だったりして

241:デフォルトの名無しさん
18/04/23 17:14:12.91 VArh9qU+0.net
初心者がいちいちobjからリンクしてるのか

242:デフォルトの名無しさん
18/04/23 17:15:44.11 Hh6TN2Aq0.net
しつけえな
ここはプログラム技術板
技術的な内容が皆無のレスでひっ絡んでくるなカス

243:デフォルトの名無しさん
18/04/23 17:30:01.10 orIXCmni0.net
>>224
何を実行するのか目的語をはっきりさせろ
プロ意識が欠けている

244:デフォルトの名無しさん
18/04/23 17:32:39.31 orIXCmni0.net
あ、初心者だったのか…

245:デフォルトの名無しさん
18/04/23 17:34:51.03 vGDXyrLu0.net
>>224
ソースを公開することは可能ですか?
URLリンク(ideone.com)

246:デフォルトの名無しさん
18/04/23 21:12:48.39 7US5BnQm0.net
pthread を使ってループ処理をマルチスレッド化したのですが、シングルスレッドと同じスピードしか出ませんでした。
pthread でこういう事やっても無駄なんでしょうか?

247:デフォルトの名無しさん
18/04/23 22:04:36.67 C1tu+nEe0.net
流石に情報が少なすぎて
このままだと下手糞としか言いようがない。
ソースコード貼り付けれ

248:デフォルトの名無しさん
18/04/23 22:09:13.69 oFP/MhUD0.net
シングルコアのPCかも

249:デフォルトの名無しさん
18/04/23 22:17:20.63 1ikED9ud0.net
pthread使うとひとつの処理が倍速にでもなると思ったのだろうか

250:片山博文MZ
18/04/23 22:21:51.35 ATy8dQXfd.net
不完全な質問はスルーすっと

251:デフォルトの名無しさん
18/04/23 22:42:58.69 7US5BnQm0.net
舌足らずですみません。コードはこんな感じです。
threadFunctionは単なる加算値、joinFunctionは集計処理です。
コアは物理2論理4です。
template< class ArgType >
void Reduce( std::vector< ArgType >& threadArgs, void* (*threadFunction)(void*), void (*joinFunction)(std::vector< ArgType >&) )
{
const size_t threadCount = threadArgs.size();
threads.resize( threadCount );
std::vector< void* > voidPtrArgs = CastArgsToVoidPtrs( threadArgs );
for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex )
{
sched_param schedParam;
schedParam.sched_priority = sched_get_priority_max( SCHED_FIFO );
pthread_attr_t threadAttribute;
pthread_attr_init( & threadAttribute );
pthread_attr_setschedpolicy( & threadAttribute, schedPolicy );
pthread_attr_setinheritsched( & threadAttribute, PTHREAD_EXPLICIT_SCHED );
pthread_t& thread = threads[ threadIndex ];
pthread_setschedparam( thread, schedPolicy, & schedParam );
pthread_create( & thread, & threadAttribute, threadFunction, voidPtrArgs[ threadIndex ] );
}
for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex )
{
pthread_t thread = threads[ threadIndex ];
pthread_join( thread, NULL );
}
joinFunction( threadArgs );
}

252:デフォルトの名無しさん
18/04/23 22:45:44.01 reOPAGg30.net
>>243
この世界では、何かやって思い描いてたようにならなかった場合
まず自分の能力不足を疑うのが鉄則

253:デフォルトの名無しさん
18/04/23 22:51:38.20 reOPAGg30.net
>>248
アハハハハ!ジョークのつもりかなんか?
そうじゃないならjoinの動きを勉強しろ

254:デフォルトの名無しさん
18/04/23 22:53:42.39 voecBiJS0.net
釣り針デカいな

255:デフォルトの名無しさん
18/04/23 23:14:39.42 gZ/aKTVF0.net
いまだに関数ポインタ使ってるのか。野蛮人。
std::functionってスレッドセーフじゃないの?

256:デフォルトの名無しさん
18/04/23 23:18:02.49 YIxEn5Qs0.net
いまだ関数ポインタが使いこなせないんだけどやばいかな?

257:デフォルトの名無しさん
18/04/23 23:20:18.71 reOPAGg30.net
考えたらjoinの問題じゃないか
もし「単なる加算処理」が1スレッドでメモリ帯域使い潰していたらマルチスレッドにしてもどうしようもないのは明らかだよ

258:デフォルトの名無しさん
18/04/23 23:21:31.95 reOPAGg30.net
>>253
未だに関数ポインタなんて使ってるほうがやばい

259:デフォルトの名無しさん
18/04/23 23:30:05.62 1JtTwXqR0.net
画像処理で合成処理をパラメータでもらう場合があるんだが
その場合内部処理と対応させるために関数ポインタは使うが
そういうのもダメ?

260:デフォルトの名無しさん
18/04/23 23:35:26.41 reOPAGg30.net
ダメってわけじゃないけどさあw
C++ならもっと柔軟性のあるやりかたが幾らでもあるってこと

261:デフォルトの名無しさん
18/04/23 23:36:21.76 lnjW6wzS0.net
virtual関数もラムダ式も関数ポインタ

262:デフォルトの名無しさん
18/04/23 23:40:33.42 awXEdMZR0.net
std::byteが邪魔すぎるんですけどg++で無効にするオプションってありますかね?

263:デフォルトの名無しさん
18/04/23 23:50:59.76 9sQDUnnSM.net
>>257
あんた昨日のおじいちゃんだろ。
functionの時代もとっくに終わってるぞ。
autoとlambdaで関数ポインタを使うべき。

264:デフォルトの名無しさん
18/04/23 23:51:42.53 gZ/aKTVF0.net
>>258
ライブラリ制作者でもなければ関数ポインタなんぞ触らんよ。
よほどCとの兼ね合いが無いと。

265:デフォルトの名無しさん
18/04/24 00:06:39.75 qFc5rpEV0.net
>>248
threadcountいくつになってるの?

266:はちみつ餃子
18/04/24 00:06:56.48 VhsA5JFS0.net
忘れがちなことだが std::function は実行時の型を扱う。
画像処理などのようにヘビーな繰返しがあるような場面では関数ポインタを使った場合との間に深刻な速度差が生じることもなくはない。

267:デフォルトの名無しさん
18/04/24 00:16:24.07 qFc5rpEV0.net
>>248
関数名からして、一度のreduce処理量は大したことなくて、何度も繰り返し呼んでない?
thread処理に必要な処理量が相対的に無視できなくなってるんじゃね?
スレッドは4本に制限して、各スレッドが処理する量を増やすかスレッドプール式にしては?

268:デフォルトの名無しさん
18/04/24 00:17:16.38 .net
C++だから関数ポインタ使わないとか頭おかしい
関数ポインタのほうが高速かつシンプルに書けるならそちらを選択すべき

269:デフォルトの名無しさん
18/04/24 00:20:31.80 N5/L/OXI0.net
皆富豪ばかりではない

270:デフォルトの名無しさん
18/04/24 00:26:04.88 RoXKv00p0.net
富豪かどうかはおま環だろ
だから自己申告しないヤツが悪い
なんでこっちがエスパーみたいなことしなきゃいけないんだ
わたくしは教えないがあなたがわたしの環境を忖度しろってか?
ヴァカじゃねえの?
アフォに対してちゃあんと「テメーのスペックはいかほどですか」と尋ねろクズ
富豪かどうかはわからない、それを言わない人間がまず間違い、
それを逆手にとって相手をマウンティングするアフォがいるから話が進まない

271:デフォルトの名無しさん
18/04/24 00:38:30.68 Sy+ZRJzm0.net
関数ポインタの構文の方がかっこいいだろ!

272:デフォルトの名無しさん
18/04/24 00:47:04.42 hfyVIq8IM.net
どんなスペックだろうと他のソフトがどれだけメモリや処理時間を喰い潰していようと自分の処理はサクッと終わらせたいといつも思う

273:デフォルトの名無しさん
18/04/24 01:40:17.33 2n4xWLsG0.net
>>260
へんてこりんなマウンティングするやつだなあ
ちなみに昨日なんて俺書き込んでないからw

274:デフォルトの名無しさん
18/04/24 03:16:15.83 CsMI0xmD0.net
>>248
調べてみたけどさっぱり判りません。
pthread_joinで各スレッドの終了を待って、その後、集計処理をするというのはごく渡り前の処理に見えるのですが、
何が行けないのでしょうか? 
別の方法でスレッドの終了を待たねばならないのでしょうか?
自分勝手デスミア線が、具体的に問題点、改善点を指摘して下さいm(_ _)m。

275:デフォルトの名無しさん
18/04/24 03:31:10.06 2n4xWLsG0.net
いいから「単なる加算処理」全部見せろよこの包茎野郎

276:デフォルトの名無しさん
18/04/24 03:56:33.85 CsMI0xmD0.net
threadFunctionが、
void* CalcBasicStatics( void* threadArg ) {
    BasicStaticsThreadArg* arg = reinterpret_cast< BasicStaticsThreadArg* >( threadArg );
double interva


277:lOfX = arg->intervalOfX; double x = arg->dividedRangeOfX.start; double sumOfY = 0.0; double sampleCount = 0; const sc::Sampler& f = arg->f; while ( x <= arg->dividedRangeOfX.end ){ double y = f( x ); sumOfY += y; sampleCount++; x += intervalOfX; } arg->sumOfY = sumOfY; arg->sampleCount = sampleCount; return nullptr; } joinFunctionが、 void CalcBasicStaticsJoin( std::vector< BasicStaticsThreadArg >& args ) { double sampleCount = 0.0; double sumOfY = 0.0; for ( int i = 0; i < args.size(); ++I ) { sumOfY += args[ i ].sumOfY; sampleCount += args[ i ].sampleCount; } for ( int i = 0; i < args.size(); ++i ) { // 結果を書き込み BasicStaticsThreadArg& arg = args[ i ]; arg.average = sumOfY / sampleCount; } } です。細々すみません。



278:デフォルトの名無しさん
18/04/24 05:46:22.80 vHj8ybNt0.net
そのコード見ても
並列度もスレッドあたりのサンプル数も
1サンプルあたりのコスト(f)もわからないので
まるで意味がない
2または4並列で、1スレッドあたり1~10Mサンプルくらい処理するようにすれば
速くなるか少なくともスレッドを使わない場合より遅くならないと思う
同じ速度ということはメモリ帯域が律速なのかもね

279:デフォルトの名無しさん
18/04/24 05:46:49.67 vHj8ybNt0.net
同じ速度

スレッドを使わない場合と同じ速度

280:デフォルトの名無しさん
18/04/24 05:55:18.81 vHj8ybNt0.net
fでメモリのどっかから数値を読んでいるんだと思うけど、
これがなるべく連続したアクセス(局所化を謀る)になるようにループを構成できれば速くなるかもしれない。
この辺りはググれば色々参考になるページがあると思うが
いまググッたらそれらしいページがあったので書いておく
URLリンク(myoga.web.fc2.com)
仕様として外からfが与えられるなら無理な話かもしれない。
もちろん interval が 1 で f(x) が { return v[x]; } のような最適なケースよりは速くならないので
その辺りは無駄な努力をしないよう測っておきましょう。

281:デフォルトの名無しさん
18/04/24 06:54:08.05 RDzdLFpT0.net
fの中身が公開出来るなら公開して
複数あるならそのうちの1個でいいから
あと、
1回のthreadFunctionで何個くらいfを計算する?

282:デフォルトの名無しさん
18/04/24 09:24:50.43 jHZYDUEYd.net
>>250
joinについて勉強しろとか偉そうに言ってたのは何だったの

283:デフォルトの名無しさん
18/04/24 18:12:35.67 2n4xWLsG0.net
>>278
こりゃ「多分」joinの問題じゃないなと判断して>>254を書いたんだが
これくらいのコンテキスト読めないとマルチスレッドは無理だよ

284:デフォルトの名無しさん
18/04/24 18:15:41.14 2n4xWLsG0.net
fやら具体的なargsの内容やら処理時間測定のやりかたも記述されてないし
んなもの誰も答えられるかよ

285:デフォルトの名無しさん
18/04/24 18:32:28.83 6+u8wIQpd.net
>>279
違う違う
なんで明らかに間違えてる事を偉そうに述べられるのかと聞いてんだけど
読解力もスキルもないのか

286:デフォルトの名無しさん
18/04/24 18:41:27.90 2n4xWLsG0.net
>>281
本当に「明らかに」だと思ってるの?バカですか?

287:デフォルトの名無しさん
18/04/24 18:45:24.94 cOEBcXkN0.net
サンプルレベルのJoinの使い方をみて
「アハハハハ!ジョークのつもりかなんか?そうじゃないならjoinの動きを勉強しろ」
は流石に笑ってしまう

288:デフォルトの名無しさん
18/04/24 18:47:53.38 2n4xWLsG0.net
勝手に笑ってればw

289:デフォルトの名無しさん
18/04/24 18:49:15.43 Z9G2Fq/Ha.net
cin で、個数の決まっていない整数たちを読み込みたいのですが、どうすればいいでしょうか?
整数たちの個数 n が分かっていれば、以下のように読み込めばいいですが。。。
vector<int> v;
int i;
for (int i = 0; i < n; ++i) {
cin >> i
v.push_back(i)
}

290:デフォルトの名無しさん
18/04/24 18:59:54.20 lGEjd9Z7M.net
>>282
明らかにだろどう見ても。
何をどう勘違いしたのか


291:説明してくれよ。



292:デフォルトの名無しさん
18/04/24 19:02:18.64 of0BgjlM0.net
>>285
他に入力がないなら cin.eof() で入力の終了を検出できるよ。
cin のブール演算を使ってもいいけど、どうにも慣れなくてね(個人の見解)。

293:デフォルトの名無しさん
18/04/24 19:15:13.81 Z9G2Fq/Ha.net
>>287
ありがとうございました。
別の質問なのですが、一般的に、vectorの使用頻度というのはどれくらいでしょうか?
配列でやれることもすべて vector を使ってやるという人は多いでしょうか?
それとも、効率などを考えて配列で極力済ませるという人が多いでしょうか?
もちろん、ケースバイケースでしょうけれども、そのあたりの常識がないので、大体
どんな感じなのかが知りたいです。

294:デフォルトの名無しさん
18/04/24 19:17:35.43 Z9G2Fq/Ha.net
自分としては、効率など細かいことは考えずに、vectorを使って問題ない
場面ではvectorを使うという風にしたいのですが。。。
vectorを使っても速度などの点で問題ない場合、一般的なプログラマーなら
どうするのかが知りたいです。

295:デフォルトの名無しさん
18/04/24 19:20:20.45 Z9G2Fq/Ha.net
vector<int> v;
int n;
cin >> n;
int t;
for (int i = 0; i < n; ++i) {
cin >> t;
v.push_back(t);
}
int *p;
int n;
cin >> n;
p = new int[n];
for (int i = 0; i < n; ++i) {
cin >> p[i];
}
どちらにするのが普通なのかの常識がありません。

296:片山博文MZ
18/04/24 19:30:42.86 Eukzbh8yd.net
>>290
生のnew/deleteは、なるべく使わないのがいい。delete忘れ、例外などでバグの元や維持コストになる。

297:デフォルトの名無しさん
18/04/24 19:33:20.39 Z9G2Fq/Ha.net
>>291
ありがとうございました。
ということはできるだけvectorを利用したほうがいいということでしょうか?

298:片山博文MZ
18/04/24 19:36:23.45 Eukzbh8yd.net
>>292
動的にサイズが変わらないなら配列かstd::array。
動的にサイズが変わるならstd::vector。

299:デフォルトの名無しさん
18/04/24 19:38:54.99 t8t5TswZ0.net
>>290
上だったらv.reserve(n)しておこう

300:
18/04/24 19:42:04.62 B3J+xNmy0.net
>>289
私は書き始めは std::vector を専ら使っており、後で他のコンテナに換えています

301:デフォルトの名無しさん
18/04/24 19:46:25.46 UxTdQ3KXd.net
>>293
コード読めないの?

302:片山博文MZ
18/04/24 19:51:37.43 Eukzbh8yd.net
>>296
普通の人間なら、文脈を読み取れるけど、俺はコンピューターに近いんだ。

303:はちみつ餃子
18/04/24 20:04:19.79 VhsA5JFS0.net
>>289
実用上の問題が無いことがわかっている範囲内であれば、
深く考えずに vector だけで乗り切るのも悪い選択じゃないと思うよ。
ただ、使い分けることで意図を表現しやすい。
たとえば list を使っていれば要素の挿入や削除が頻繁なデータなんだなって思うし、
array が使われていれば要素の個数が固定なんだなって思う。
速度的に影響がない程度の規模であっても、
それが適しているような操作をこれからするのだという意思表明は人間がプログラムを読むときのヒントになる。
そして、そういうヒントは書いている途中にこそ必要なものなので、 >>295 のように後から整理していくスタイルは個人的には好きじゃないな。

304:
18/04/24 20:22:55.46 B3J+xNmy0.net
>>298
>それが適しているような操作をこれからするのだ
うーむ、いろいろと考えさせられます
std::vector でなら使えても、std::list では使えない、というのはあるから、最初からそれを考慮しておくのは…よくありますねえ

305:デフォルトの名無しさん
18/04/24 20:43:20.11 Ukt80uX+0.net
vector は list に比べた場合、
データがメモリ上隣接して並んでいるので
→そういう引数を要する�


306:e種 API にそのまま渡せる →メモリアクセスが局所的にできてキャッシュが効く 予約領域を拡張する場合にのみアロケータが呼ばれるので追加時のアロケータによるオーバーヘッドが低い とかの良い特性もあるので要素のコピーが軽くて個数が小さいものはvectorにして損することは少ない



307:デフォルトの名無しさん
18/04/24 21:34:54.87 JVcrtulg0.net
BidirectionalIteratorとRandomAccessIteratorだろ
規格用語で言えば短く済む

308:デフォルトの名無しさん
18/04/24 22:35:44.34 iCiOyu8i0.net
std::listはメモリ局所性がないので今どきのマシンだとクソ遅い
積極的に使う理由は基本的にない

309:デフォルトの名無しさん
18/04/24 23:33:49.11 RDzdLFpT0.net
積極的にって...
使いどころで使うための物だよ

310:デフォルトの名無しさん
18/04/24 23:51:07.95 z/eaD8m90.net
メリットとデメリットを見極められないとコンテナを使いこなすのは難しい
昔から配列を弄り倒している古参にとってはこんなに便利な物はないと思うがね
90年初頭辺りにタイムスリップして実際に構造を真似てフルスクラッチでテンプレートなんぞなかった世界で組んでみればコンテナの挙動は自ずと理解できると思うが時代がわるかったな
今は何も苦労しなくても容易になんでも手に入る世界だからな
修業が足らんよ青二才

311:デフォルトの名無しさん
18/04/24 23:55:55.63 iCiOyu8i0.net
>>303
その使い所がよほど特殊な状況以外にないんだよ

312:デフォルトの名無しさん
18/04/24 23:58:59.30 4OXNJpQB0.net
大規模C++ソフトウェアデザインという本を読んでいます。
冗長インクルードガードが紹介されているのですが、効果あるんですかね。
古めの本なのですが、最近のコンパイラだと意味ないですかね

313:>>306
18/04/25 00:13:26.67 2lHeUIKm0.net
URLリンク(ir9.jp)
ここの967以降に同じ質問がありました。質問撤回します。

314:デフォルトの名無しさん
18/04/25 00:14:20.28 MdUECE2K0.net
#pragma once って規格化されたんだっけ?

315:デフォルトの名無しさん
18/04/25 01:03:31.17 YD2+CY860.net
されてない
しようしようと20年言われ続けて技術的な問題でできずにいる

316:デフォルトの名無しさん
18/04/25 02:07:21.83 /kuz3CrQ0.net
243です。
アドバイスを頂き検討したのですが、メモリが散らかっているのが原因と判断しました。
都合により細々とした実装の話は割愛しますが、付き合ってくれた皆さんありがとうございました。

317:デフォルトの名無しさん
18/04/25 02:33:10.54 wwssDiVV0.net
どおりで未だに警告でるわけだ

318:デフォルトの名無しさん
18/04/25 06:26:59.61 8qaCWrbS0.net
>>305
その特殊な状況の為にlistが存在する
私の場合は特殊なプログラムを書くことが多いので
使いどころは多いのかもしれない
また、普通の組み込みC言語でも簡易な片方向リストとかを使ったりする (C++じゃないのでlistは無い)

319:デフォルトの名無しさん
18/04/25 07:15:49.01 ntbHaYzVM.net
>>309
技術的な問題ってなに?
既に実装してる環境の方が多くね?

320:デフォルトの名無しさん
18/04/25 07:30:39.44 kzCoHflQa.net
今はモジュールの方を標準化しようとしてるんじゃ

321:デフォルトの名無しさん
18/04/25 08:47:25.49 wwssDiVV0.net
偉い人が考えてることはわからん

322:デフォルトの名無しさん
18/04/25 11:24:32.26 iscLTfMY0.net
>>313
プリプロセッサは C++ じゃないからね
C++ 以外の言語と共有しているツールなので
それらと歩調を合わせる必要があるし
プリプロセッサだけ独立の規格にするなら
C++ を含め、諸


323:言語の規格も プリプロセッサのバージョンとどう付き合うのか 策定せにゃならん



324:デフォルトの名無しさん
18/04/25 12:23:57.05 ntbHaYzVM.net
>>316
意味わからん
C/C++の規格にプリプロセッサの仕様もあることを知らんのか?
そもそも他の言語と共有してる環境なんて見たことないし

325:はちみつ餃子
18/04/25 15:37:25.53 7Yqb38x00.net
現行では、 #include ディレクティブは「対象ファイルの内容がそこに書かれているかのようにふるまう」という規則なので、
ヘッダファイル内のプラグマ (#pragma once) の解釈が始まるのはインクルードされた後になる。
もちろん対象範囲がコンパイル単位全体に及んでしまっては #pragma once の意味がないが、
現状の仕様に辻褄を合わせるとそうなる。
実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
#pragma once を仕様に入れるのに #pragma once の項目を追加すれば済むわけではないってことは理解してくれ。
それと、プリプロセッサの仕様は C/C++ の一部なのは確かだが、
挙動を規定しきれていないのじゃないかということは指摘されている。
URLリンク(qiita.com)
うやむやでやってきてるところを整理する必要は有ると思う。
>>317
Haskell (GHC) は C プリプロセッサを使うよ。
汎用的に使いたいなら M4 とかの方がいいとは思うけど、
Cプリプロセッサに慣れている人は多いから……。

326:デフォルトの名無しさん
18/04/25 16:38:46.53 iscLTfMY0.net
また別な話
#includeしようとしているファイルが
過去に#includeしたファイルと同一かどうか
という判定も意外に厄介だね
ハードリンクできるファイルシステムと
そうでないファイルシステムがあったりするし
ハッシュが一致しても衝突かどうかの問題もある

327:はちみつ餃子
18/04/25 18:09:25.23 7Yqb38x00.net
ハードリンク、シンボリックリンクが無いファイルシステムだったとしても、サーチパスの問題も思いつくな。
たとえばカレントディレクトリと、カレントディレクトリ直下の foo ディレクトリからヘッダファイルを探すようになっているとき、
#include "bar.h"

#include "foo/bar.h"
は同じファイルを指しているが、表現が異なる。
同一のファイルとして除去すべきだろうか?

328:デフォルトの名無しさん
18/04/25 19:34:37.54 ch3bizaad.net
#if ****
#pragma once
#endif
とかどうなるの?
複数回のインクルードで条件がちがっていたら?

329:デフォルトの名無しさん
18/04/25 20:33:35.69 ntbHaYzVM.net
>>318
> 実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
規定すればいいだけだろ?
どこに技術的な問題があるんだ?
政治的な問題だと言うならまだしも
>>319-320みたいな話は処理系定義ですむ話
>>321は少し悩ましいがそもそも途中まで読んでから#pragma onceとか言われても面倒だから書くならファイルの最初に書けとかの制限をつければいい
> 挙動を規定しきれていないのじゃないかということは指摘されている。
いやいや、その子ちゃんと規格読めてないだけでしょ w
> Haskell (GHC) は C プリプロセッサを使うよ。
仕様を流用してるだけでしょ?
何かのコンパイラと共有してるわけじゃないと思うが

330:デフォルトの名無しさん
18/04/25 20:43:06.43 YD2+CY860.net
君よりよっぽど賢い人達が20年間悩み続けて未だに出来てないことを舐めない方がいい

331:デフォルトの名無しさん
18/04/25 21:22:23.29 ntbHaYzVM.net
>>323
別に悩み続けてなんていないでしょ w
#pragma onceで事足りてるからわざわざ政治的なことに足突っ込みたくないだけ

332:デフォルトの名無しさん
18/04/25 21:47:31.85 YD2+CY860.net
新規格の季節になると毎回のように標準化委員会の議題に上がってるんだが?

333:デフォルトの名無しさん
18/04/25 22:20:34.77 fPsUNFh1a.net
モジュール方式になったらヘッダファイルが要らなくなる?

334:デフォルトの名無しさん
18/04/25 22:28:42.99 iscLTfMY0.net
>>322
> 処理系定義ですむ話
それはおかしいでしょ
ハードリンクできる処理系からできない処理系に移植したtarボールの
#includeの挙動が未規定なら結局インクルードガードを自前で書くことになる

335:デフォルトの名無しさん
18/04/25 22:48:43.95 7S1PATFb0.net
>>325
でも誰も進めようとしないんだろ w
よくある話
>>327
C/C++ ってそういう言語だしそもそも環境変える予定があるならそんなものに依存したファイル構成にしないでしょ

336:デフォルトの名無しさん
18/04/25 22:55:12.61 eMzyfy/H0.net
#pragma once なんて
once upon a time だぜ
今はもうだれも気に留めてやしねぇ

337:デフォルトの名無しさん
18/04/25 23:31:56.94 iscLTfMY0.net
アホの相手は疲れたわ
もう寝る

338:はちみつ餃子
18/04/25 23:46:14.09 7Yqb38x00.net
>>322
トピックとして大きすぎるので面倒くせえってだけの話。

339:デフォルトの名無しさん
18/04/25 23:50:29.61 ayqRGoGD0.net
#pragma once
ぐらいPerlでインクルードガードに自動変換できる、
ていうか無くてもできるから自前で書くとかありえん…

340:デフォルトの名無しさん
18/04/25 23:51:29.73 ayqRGoGD0.net
むしろプリコンパイルヘッダーが規格化されないの方のが悩ましい…

341:デフォルトの名無しさん
18/04/25 23:58:40.94 7S1PATFb0.net
>>330
逃げるなら黙って逃げろよ w

342:デフォルトの名無しさん
18/04/26 00:10:34.39 0UXBsrps0.net
ていうか#pragma onceとか#ifdef~#endifによるインクル~ドガ~ドのシノニム以外の何者でもないと思うが
一方#ifdef~#endifによるインクル~ドガ~ドは
「対象ファイルの内容がそこに書かれているかのようにふるまう」
という規則の下で立派に機能していると思うし、
>>321のように等価な#ifdef~#endifによるインクル~ドガ~ドが存在し得ない場合はエラーにしたら良いと思うし、
ハードリンクできる処理系かどうかに関係なく#ifdef~#endifによるインクル~ドガ~ドは機能していると思うし
(だいたい1バイナリのビルド中にハードリンクの中身が変わるみたいな想定をする方がおかしい=ハードリンクはそうでないファイルと区別がつかないとみなせるハズ
だったら#pragma onceも問題なく規格化が可能なのでは…
少なくとも技術的な問題とかとうていナッシング?

343:デフォルトの名無しさん
18/04/26 00:21:25.86 44bF0Q7g0.net
ちょっとはググれよ。
お前みたいなやつを「殆し」って言うんだぜ

344:デフォルトの名無しさん
18/04/26 00:41:00.06 0UXBsrps0.net
↑ググってもボンクラが書いたような駄文が見つかるだけなので却下。
1. #pragma onceは#ifdef~#endifによるインクル~ドガ~ドのシノニムである
2. #ifdef~#endifによるインクル~ドガ~ドは世の中で立派に機能を果たしている
にもかかわらず、
3. #pragma onceの規格化の有効な解が存在しない
という驚くべき結論がなぜ導かれるのやろうか…

345:デフォルトの名無しさん
18/04/26 06:29:49.76 IAeApo/t0.net
インクルードガードを自前で書くたびに
毎度毎度ワンパターンでタイプ数だけは結構多い不毛な作業は
機械化できないかと考えるのは至極当然
むしろ何の疑問も持たないやつは適性に疑問符がつく
インクルードガード用のフラグマクロの命名則にも不安がつきまとい
無名namespaceのように衝突しない保証があったらなあと思ったりもする

346:デフォルトの名無しさん
18/04/26 07:22:21.59 4xU9Va0kM.net
要するに同じファイルであるかをどうやって判定するかの問題
インクルードガードは利用者(プログラマー)に識別子を決めさせる(押し付けたとも言う)ことで実現してる
なので押し付けられたプログラマーには
> インクルードガード用のフラグマクロの命名則にも不安がつきまとい
みたいなことが発生する
#pragma onceはこの判定を処理系側でやるんだが例えばファイルの絶対パスで判断するとかファイルをインクルードする前にmd5とかのハッシュを求めて判断するとかすればいいだけ
ハードリンクとかで違う名前つけて#pragma onceがうまく動かないとか言うアホとかは無視すればいいし、ハッシュの衝突が心配と言うなら衝突した時に比較するようにすればいい
どういう仕様がいいのかで揉めるのはあるけど技術的な問題とか言ってる奴はちょっと知能が足りなさすぎ

347:デフォルトの名無しさん
18/04/26 07:42:18.98 n/ljx3l20.net
>>338 #ifndef 形式のインクルードガードを自前で書くとタイプ数が多いし
識別名を打ち間違える危険もあるから .h のファイルを新規作成したときに
自動的に入力されるようにエディタのマクロにしたよ。
まぁ、識別名をファイル名から作ってるから、ファイル名の変更でアレだけど。
昔(フロッピーでやってた時代?)は #ifndef 形式でガードすると
どのみちヘッダファイルをまるごと読み込まなきゃならないから、
#pragma once の方がコンパイル時間において優れてる、などと言ったけど、
ハッシュを計算して同一か検証するとか手間が増えるなら
時間の面での優位性はなくなったのかな。

348:はちみつ餃子
18/04/26 09:45:48.32 P0bCzIha0.net
「技術的な」というときの技術は「プログラミング技術」の意味じゃないこともあるんだよ。
前置きが無い限り広すぎてあんまり意味ない。
実装がいくつもあるのに、仕様策定にあたっての言葉で出てくる「技術的な」なんだから文脈でわかれよ。
仕様に落とし込む難しさが元々の論点。
ハードリンクの話題は「同一のファイルとは何か」を定義する難しさの一例で、実装のことなんか言ってない。
このスレで既に上がっている選択肢だけでも
 ・ 内容が同じ
 ・ 絶対パスが同じ
 ・ #include ディレクティブ中の表現が同じ
 ・ inode が同じ (ハードリンクは同一とみなす)
があり、内容の一致を選択する場合以外は言語の外の世界の環境に関する記述が必要になる。
世の中にある色んな環境のことを考慮して文面にする難しさってのはわかるだろ?
そんなわけで、個人的には内容の一致だけで判定するのが (仕様として定義するにあたって) 一番簡単だと思う。
ODR に関するルールの中にも同じトークン列を要求するものがあるし。
それに加えて >>318 で取り上げた展開手順の規則をなんとかする必要はあるが、 >>321 に解を与えるような上手い簡単な規則は思いつかないな。
既に多く書かれてしまっているコードの現状との互換性を考えると >>322 のいうような、
#pragma once を書ける場所を制限するような規則は選択できないと思う。
結局は複雑なものにならざるを得ない。
そんなのほっといてモジュールの導入に邁進しようぜっていうのは妥当な方針だろ。

349:デフォルトの名無しさん
18/04/26 11:12:45.83 IAeApo/t0.net
>>339みたいに独善的なやつは標準化委員に向かないタイプだね
提起された問題を個人的に考えるのがイヤだから却下とかやってたら
みんなやる気なくすし

350:デフォルトの名無しさん
18/04/26 11:13:52.62 IAeApo/t0.net
会社にもいるよね今の野党みたいなアイディアキラー

351:デフォルトの名無しさん
18/04/26 11:26:33.21 +C2ovlRwM.net
この板の別スレにも跳梁跋扈してるな

352:デフォルトの名無しさん
18/04/26 12:36:39.87 4xU9Va0kM.net
>>341
> 「技術的な」というときの技術は「プログラミング技術」の意味じゃないこともあるんだよ。
そういう人がいるからわざわざ「政治的」って言う言葉を入れてあるんだが理解できなかったのか?
で、あんたの言う技術的な問題ってなに?
具体的に書いてくれ
>>342
> >>339みたいに独善的なやつは標準化委員に向かないタイプだね
> 提起された問題を個人的に考えるのがイヤだから却下とかやってたら
意味わからん
俺が提示した内容がダメだと言うならもっといい案を提示すればいいだけ
こんなスレで独善的とか頭大丈夫?

353:デフォルトの名無しさん
18/04/26 13:01:09.90 IAeApo/t0.net
提示してねえだろ、おまえは無視つったんだよ
嘘つくんじゃねえ

354:はちみつ餃子
18/04/26 13:58:41.43 P0bCzIha0.net
>>345
私はこの件について、技術的な問題があるとは述べてない。
その箇所の後に技術的という言葉は広範すぎて (言い換えれば、具体性がないので) 意味ないという意味のことを書いてるつもりなんだが。
それとは別に、私の考える問題を端的に言うと仕様の文面に落とし込むのは難しいねっていう、そんだけのこと。

355:デフォルトの名無しさん
18/04/26 14:09:35.01 9t94Lsi9d.net
相談スレであって要望スレじゃない

356:デフォルトの名無しさん
18/04/26 14:10:26.12 9t94Lsi9d.net
中身のないガキの言い合いは他で

357:
18/04/26 17:50:46.60 y22H8Uhx0.net
>>348
現時点での問題点をはっきりさせることに意味はあると思いますよ…

358:デフォルトの名無しさん
18/04/26 17:56:28.00 4xU9Va0kM.net
>>346
理解できないなら絡んでくるなよ w
「アホな利用者は相手にしない(=無視する)」って言う仕様を「提示」してるって話だ、ボケ

359:デフォルトの名無しさん
18/04/26 18:15:04.17 EM3O7qLA0.net
>>350
スレチ
意味があると思うなら他にスレ立ててやれ

360:デフォルトの名無しさん
18/04/26 18:20:39.64 IAeApo/t0.net
>>351
科学技術的な議論にアホなんて用語を使うあたりお里が知れるな
形容詞には比較基準や単位をつけろボケ

361:デフォルトの名無しさん
18/04/26 19:18:47.48 bSbrcQnXd.net
ガキの喧嘩は他でやれ

362:デフォルトの名無しさん
18/04/26 19:29:11.00 HtO+dzj70.net
俺は>>339が正しいと思うぜ。
というか>>341は明確に間違ってるだろ。色々と。
「ハードリンクガー」なんてのは論外。規格で定めるべき事項ではない。
規格で定めるべきなのは、
・全く同一の中身だが実体が異なる場合でも #pragma once は有効か?
(cp A.h B.h の場合にも B を読み込むか?)
だ。そしてこれは当然現行のインクルードガードと同じ方向に揃えるべきであり、
・読み込んではいけない
という仕様になるのも自明だ。
絶対パスやinodeやハードリンクというのは、
・通常のファイルシステムであれば、絶対パスが同一なら同じファイルを参照する
(=同じ中身であることが保証される)
・inodeでファイルシステムが実装されているのなら、
同じinodeを指すファイル(=ハードリンク)の場合には、同じ実体を参照する
(=同じ中身であることが保証される)
であって、これらは「全く同一の中身」であることを確認する手段でしかない。
これらが有効な環境では間引くのに用いればいいだけ。勿論ハッシュを使ってもいい。
これらが別物に見えるのなら、それは抽象思考が出来ない馬鹿だからだよ。
ファイルシステム毎にC++の規格をいちいち決め直す必要があるなんて、おかしいだろ。
今後新しいファイルシステムが考案される毎に、毎回C++の規格を刷新するつもりか?
例えばWindowsでは同一ドライブに複数のドライブレターを割り当てることが出来るが、
それでどうなるかをC++の規格に定めるべきだと?マジで馬鹿だろ。

363:デフォルトの名無しさん
18/04/26 19:29:59.32 HtO+dzj70.net
最終的に規格に定めるのはつまり、
・全く同一の中身の場合には #pragma once は有効
(=現行のincludeガードと同様)
であって、揉めるとしたら、
・意味的には同一だがバイナリ比較では異なる場合
(例:最終行に空白や改行が追加された場合や、コメントのみの変更の場合)
(=現行のincludeガードでは読み込まれないが、単純な方法では同一性の確認が難しい場合)
だが、これも方向としては現行のインクルードガードと合わせる方向、つまり、
・読み込んではいけない
とされるべきであり、これもまた自明だ。
(とはいえここは実装的に揉めるかもしれんが)
そもそも「同一性の確認」をファイルシステムに依存する考え方自体がおかしい。
もうじき #include 対象を url 指定するような時代にもなるだろうし。
(善し悪しはさておき、PHPではこれが出来る)
そうしたら、「同一かどうかは中身で判断する」という選択肢以外はなくなる。
こんな当たり前の話が分からないのは完全に老害化してる。

364:デフォルトの名無しさん
18/04/26 19:30:31.24 HtO+dzj70.net
そしてやる気がないのは今更意味がないからだろ。ほぼ全ての環境で実装済みだ。
> Cray C and C++ 以外では全て実装済み
> URLリンク(en.wikipedia.org)
勿論糞長いパスとかにしたらはまることもあるが、これもよくある話でしかないし、ユーザ責�


365:Cでいい。 規格に「パスは○○文字まで」と決めるわけにも行かんし。 > 途中でバッサリとパスが切られて、まったく同じシンボル名になって、 > 初めてincludeしたファイルなのにスキップされるという、 > なかなか原因解明が困難な不具合に襲われる……といったケースがあるかもしれません。 > ……はい、体験談です。 > http://cpp.aquariuscode.com/include_guard



366:デフォルトの名無しさん
18/04/26 19:39:23.16 CbHb+b7U0.net
二重にインクルードすることを想定しているヘッダーファイルって、存在するものなの?
pragmaとか書かなくても、勝手にやってくれたら問題あるの?

367:片山博文MZ
18/04/26 19:43:43.54 napFR+dZd.net
>>358
<pshpack?.h>
<poppack.h>

368:
18/04/26 19:56:21.41 y22H8Uhx0.net
>>355
要旨が混乱していますね
>例えばWindowsでは同一ドライブに複数のドライブレターを割り当てることが出来る
つまり、今読み込んでいるヘッダファイルがかつて読んだファイルと同じ実体かどうか、を決める方法は**基本的にない**と主張しているのですよね
そう主張するのなら、
>・読み込んではいけない
>という仕様になるのも自明だ。
「読み込んでいいかどうか」を決める方法がないのに「読み込んではいけない」と決めていいのですか?
条件を満たすかどうかチェックする手段がないのに、その条件を仕様とするのは無意味ではないですか?

369:はちみつ餃子
18/04/26 19:59:02.73 P0bCzIha0.net
>>358
たくさん存在する。
インクルードする前後のマクロ定義によって挙動を切り替えて使うようなものもある。
基本としては宣言というか、別のコンパイル単位にある関数などのインターフェイスを取り込むために使うものなんだけど、
アクロバティックな使い方をしてるものはそれなりに多いよ。

370:デフォルトの名無しさん
18/04/26 20:06:45.74 OZbR3XDf0.net
プリプロでループを実現するには再帰includeは欠かせないからな

371:デフォルトの名無しさん
18/04/26 20:08:29.05 CbHb+b7U0.net
>>361
むしろそっちのほうに、
二重インクルード可能みたいな宣言を用意してほしいわ

372:デフォルトの名無しさん
18/04/26 20:24:45.91 HtO+dzj70.net
>>360
マジで言ってるんなら死ね。
俺の意見は、
・#pragma once は現行のインクルードガードと同じ方向に仕様化すべき
であって、実際これで文句が出ることはないし、妥当だろ。
つかお前、>>340を理解してるか?

373:デフォルトの名無しさん
18/04/26 20:34:58.75 JC9sZU4oa.net
int lengthOfLcs_r(const char x[], const char y[], int ix, int iy, int xsize, int ysize) {
static int **lengthTable = new int*[xsize];
for (int i = 0; i < xsize; ++i) {
lengthTable[i] = new int[ysize];
}
if (ix == xsize || iy == ysize) {
return 0;
}
if (x[ix] == y[iy]) {
return lengthOfLcs_r(x, y, ix + 1, iy + 1, xsize, ysize) + 1;
}
return max(lengthOfLcs_r(x, y, ix, iy + 1, xsize, ysize), lengthOfLcs_r(x, y, ix + 1, iy, xsize, ysize));
}

374:デフォルトの名無しさん
18/04/26 20:36:08.64 OZbR3XDf0.net
#include "/dev/tty" も知らない雑魚はもう黙ってろよ

375:デフォルトの名無しさん
18/04/26 20:37:18.41 JC9sZU4oa.net
>>365
の関数は、再帰的な関数です。
その再帰的な関数内で static な配列を利用したいのですが、動的に確保した
領域を解放するにはどうすればいいのでしょうか?
再帰的な関数なので単純に関数の最後で解放するというわけにはいかないので
困っています。

376:デフォルトの名無しさん
18/04/26 20:39:18.48 JC9sZU4oa.net
>>365
動的計画法で配列に計算結果を記録しておき利用したいんです。
なので static にしています。

377:
18/04/26 20:39:31.36 y22H8Uhx0.net
>>364
わけて考えてみますね
インクルードガードはプリプロセッサ名前空間内の一つのプリプロ識別子を犠牲にして、機能させようとしているわけですよね
#progma once が犠牲にする**べき**ものは何でしょうか?

378:デフォルトの名無しさん
18/04/26 20:40:15.50 JC9sZU4oa.net
>>365
の関数はまだ書きかけなので、計算結果を記録した配列の値はまだ利用し�


379:トいません。



380:デフォルトの名無しさん
18/04/26 20:43:55.37 OZbR3XDf0.net
>>>365
lengthTableのポインタ値をなんとかしてグローバル変数に持ち出してatexitに登録するか
最初からそのグローバル変数でnewするか
どうせプログラム終了時にヒープ丸ごと消えるんだから放置するか
一から書き直すかの4択

381:デフォルトの名無しさん
18/04/26 20:45:16.69 JC9sZU4oa.net
>>365
あ、すみません。
なんかおかしなことを書いてしまいました。

382:デフォルトの名無しさん
18/04/26 20:53:11.22 JC9sZU4oa.net
>>371
ありがとうございました。
すみません。質問がちょっとおかしかったので、質問を代えさせていただきます。
ある特定の関数内でしか見えないグローバル変数のような変数というのはC++にありますか?
考えているのは、関数 func でそのグローバル変数のような変数 a を宣言する。
func 内で呼び出している再帰関数 rec_func 内でのみそのグローバル変数のような
変数 a を利用したい。グローバル変数のような変数なので、 rec_func の引数として
a を渡す必要はない。

383:デフォルトの名無しさん
18/04/26 20:57:03.80 JC9sZU4oa.net
何度も呼び出される再帰関数に引数として同じ変数を渡し続けるのはなんか
無駄なことをしているように思われたので質問しました。
本を読むとグローバル変数は使うなと書いてあるので質問しました。

384:デフォルトの名無しさん
18/04/26 21:01:32.17 JC9sZU4oa.net
>>373
でいう変数 a の代わりに、クラスを作って、メンバ変数を利用すればいいですかね?
rec_func はメンバ関数にすればいいですかね?

385:デフォルトの名無しさん
18/04/26 21:03:04.18 JC9sZU4oa.net
でも、そのためだけにクラスを作るというのもなんだかな―という感じがします。

386:デフォルトの名無しさん
18/04/26 21:06:11.37 HtO+dzj70.net
>>360
一応添削しておくと、
> 今読み込んでいるヘッダファイルがかつて読んだファイルと同じ実体かどうか、を決める方法は**基本的にない**
× 同じ実体かどうか、を決める方法は
○ 同じ実体かどうか、をパス等で決める方法は
ただし俺はそもそも「中身」を見て確認すべきで、同じ実体だったら云々、という話はしてない。
cp A.h B.h の場合にインクルードガードでBを弾くとして、
当然Bは「ファイルとしては」「読み込まれ」、「コンパイル対象としては」「読み込まれない」だろ。
#pragma once はインクルードガードの自動版なんだから、インクルードガードと同じ仕様でいいんだよ。
そして逆に、実体が異なっていてもこの場合はインクルードガードは利くのだから、#pragma once も利くべきなんだよ。
ファイルパスでの識別ではこれは実現不可能だろ。
>>369
意味不明。何も犠牲にするべき物は無いと思うが。
というかな、規格化するなら方向は自明で、
・#pragma once はインクルードガードの代わりに使われているのだから、
現行のインクルードガードを機械的に #pragma once に置き換えして問題ないように仕様化すべき
でしかないだろ。これで誰も文句ないと思うが。

387:デフォルトの名無しさん
18/04/26 21:07:21.99 OZbR3XDf0.net
>>374の心配があるんだったらクラスにしたって裏でthis渡すようになるだけだから一緒よ
ポインタ渡すコストが気になるならグローバル変数にするしかない
>>365のコードのままなら末尾再帰の最適化かかるだろうから問題にならんと思うけどな

388:デフォルトの名無しさん
18/04/26 21:07:30.49 JC9sZU4oa.net
クラスを作ってそのプライベートなメンバ変数を、
ある関数内でのみ利用できるグローバル変数の
ような変数として使うというのは邪道でしょうか?

389:デフォルトの名無しさん
18/04/26 21:08:37.69 JC9sZU4oa.net
>>378
ありがとうございました。

390:デフォルトの名無しさん
18/04/26 21:51:10.65 HtO+dzj70.net
>>373
> ある特定の関数内でしか見えないグローバル変数のような変数というのはC++にありますか?
見た目だけの話ならラムダでキャプチャすればいい。(クロージャ)

ただ、今気づいたが、C++のラムダって名前付けられないから再帰できないね。
変数の直接呼び出しも試してみたが、以下は通らない。
auto f = [](int x) {return x? x+f(x-1) : x;};
なんでこんな糞仕様にしたんだ?
JavaScriptも当初はそうだったが、不便だったので名前が付けられるように変更した。
この変更を知ってて無視してるのなら頭おかしいし、
知らないのなら不勉強だし。(言語仕様に携わる奴は他言語の動向も見ておくべき)
名前を付けられて悪いことはないし、技術的に不可能って事も無いと思うが。

391:デフォルトの名無しさん
18/04/26 22:07:02.86 IAeApo/t0.net
ID:4xU9Va0kM=ID:HtO+dzj70
#include "X:\sandbox\aho.h"
#include "Y:\sandbox\aho.h"
これでどうなるかをC++の規格に定めるべきだと言っているのはおまえだけ
//X:\sandbox\some_app.cpp
#include "aho.h"
#include "some_lib.h"
//Y:\sandbox\some_lib.h
#include "aho.h"
おまえq文字列の解釈をまさか知らんのか?

392:デフォルトの名無しさん
18/04/26 22:34:27.88 4xU9Va0kM.net
>>353
反論されてぐうの音もでないのかよ
5チャンは初めてか? w

393:デフォルトの名無しさん
18/04/26 22:35:24.34 IAeApo/t0.net
>>383
全文そのまま返すわ

394:デフォルトの名無しさん
18/04/26 22:41:09.16 EM3O7qLA0.net
同じファイル
同じ中身
大きく分けて2種類あり、
それぞれ、同じの定義の詳細は色々と考えられる


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