C++相談室 part135

■ このスレッドは過去ログ倉庫に格納されています
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/04/06(金) 20:36:14.26ID:gYiRH0WM0
何を言っているのかわからないし
特定のプラットフォームの話ならそっちで聞くべき
2018/04/06(金) 21:01:12.49ID:RWHjeoGDa
YAMLをC++で読む簡単な方法はなんですか?
LibYAMLなんですかね
2018/04/06(金) 21:11:46.44ID:eB6IhESGd
>>64
https://github.com/jbeder/yaml-cpp
これが一番良さそう。星がたくさん付いてるし。
66名無し@キムチ (ワッチョイ 25b3-1Lkb)
垢版 |
2018/04/06(金) 21:18:03.84ID:VpnYoE0I0
>>62
いや、いま使ってたのはUnityでC♯だったが、
それとは別にVisualC++とFBXSDKでってのをやってみようと思っておとといから始めたわけだよ。
でFBXファイルを読み込んでノードの取得あたりまでは進んだけど、
よく見るとVisualC++のファイル新規作成に3Dシーン(FBX)ってのがあるわけ。
もしやこれ使うとFBXSDKはいらないのかな?とも思ったりしたんだけど、
何しろまだ右も左もわからないし、その3Dシーンにオブジェクトを置くやりからもわからないし、
そのシーンを一応とってつけてつくってみたウインドウズ実行ファイルから呼び出すためのコードの書き方もわからないしで、
こうやってみなさまにご教授を求めた次第ですよ!!
2018/04/06(金) 21:21:11.15ID:eB6IhESGd
私の認識が正しければ、SDKはSoftware Development Kitだから、実際の実行時に使うライブラリーのことだろうよ。
2018/04/06(金) 21:23:42.24ID:eB6IhESGd
実行時に動かすなら、SDKにリファレンス(またはドキュメント)があるはずだ。
2018/04/06(金) 21:27:19.39ID:eB6IhESGd
ドキュメントがないなら、そんなマイナーなフレームワークを使うな、で終わり。
2018/04/06(金) 21:29:52.65ID:eB6IhESGd
ゲーム製作板か、CG板の方がいいかもしれない。
71名無し@キムチ (ワッチョイ 25b3-1Lkb)
垢版 |
2018/04/06(金) 21:32:34.54ID:VpnYoE0I0
>>68
まだ正式なリファレンスはいろいろ暇がなくて読んでない。
日本語で簡単に解説してあるウェブサイトは見たけど、
取得したFBXファイルのいろんな情報を文字列で表示するプログラムが載ってるだけで、
実際にその3Dオブジェクトを画面に表示する方法が載ってない。日本語のサイトで解説してあるのは、どうもここまでみたいなので、
やはり英語の正式なリファレンスを見ないとダメかな?www
2018/04/06(金) 21:35:02.97ID:eB6IhESGd
ゲーム製作板に、くわしく知ってる人が居るかも知れない。
2018/04/06(金) 21:39:40.26ID:eB6IhESGd
業界へ出るなら、英語アレルギーは克服すべし。自動翻訳が使えれば、詠めるかもしれない。蘭学から学べることは多い。
74名無し@キムチ (ワッチョイ 25b3-1Lkb)
垢版 |
2018/04/06(金) 21:40:42.10ID:VpnYoE0I0
>>70
>ゲーム製作板か、CG板の方がいいかもしれない。
いやゲームはもう作りたくないし、CGも特に興味ない。
実はMakeHumanみたいな3Dキャラ作成ツールがつくりたくてね。
まだ始めたばかりで、そこまでの距離は100億光年ばかりあるけど・・・
これってやっぱりちゃんとしたプログラム技術板向きの話題だよね?
2018/04/06(金) 21:42:51.27ID:eB6IhESGd
器の小さい人には教えないよ。時間のムダだからね。
2018/04/06(金) 21:48:02.69ID:eB6IhESGd
ゼロから3D作りたいなら、DirectX, OpenGL, Valkanあたりを勉強することになる。
しかし、ゲームエンジンがなければ、動く3Dは手間がかかる。
2018/04/06(金) 21:49:10.94ID:RWHjeoGDa
>>65
ありがとうございます!
2018/04/06(金) 21:50:43.17ID:RWHjeoGDa
>>76
DirectX便利ですよね
魚眼を再現しようとして挫折しましたが...
2018/04/06(金) 21:51:55.72ID:eB6IhESGd
iPhoneXでリアルタイムでVtuber作れる時代に素人が3Dモデラー作るのは、技術のムダだろう。
2018/04/06(金) 21:56:32.87ID:eB6IhESGd
数学のベクトル、射影、非ユークリッド幾何学が理解できるくらいの数学力がないと魚眼レンズはムリだろう。ムリムリ。
2018/04/06(金) 22:00:38.96ID:eB6IhESGd
物理学的に考えると、魚眼は屈折率の差から発生する現象だから、モデラーの物体に屈折率を設定するだけでいい。
2018/04/06(金) 22:05:13.65ID:eB6IhESGd
カメラの特性で、レンズの広角が設定できればそれに越したことはないが。
2018/04/06(金) 22:10:52.66ID:eB6IhESGd
「広角 DirectX」で検索。
https://msdn.microsoft.com/ja-jp/magazine/dn745869.aspx
2018/04/06(金) 22:14:45.90ID:Qe7eZ8vzM
>>80
エピポール幾何はいるでしょうねぇ
AR/MR/VRするなら
2018/04/06(金) 22:23:28.39ID:RWHjeoGDa
>>83
度重なるありがとうございます。
勉強します。とりあえず処理重そうです(・・;)
2018/04/06(金) 22:30:22.55ID:gYiRH0WM0
ゲーム作ろうと思っても大体はゲームエンジン作り始めて途中で飽きてやめる
2018/04/06(金) 22:30:40.49ID:eB6IhESGd
CGもオブジェクト指向になっているから、撮影スタジオで実際に物体やカメラの位置を決めるのと同じように、シーンを構築すれば、それが映像になる。
2018/04/06(金) 22:57:17.05ID:eB6IhESGd
ニュースセンターで使われるような、再現CGを自由に作れるようになったら、引っ張りダコだよ。
2018/04/06(金) 23:06:06.99ID:eB6IhESGd
そうなったら、映像クリエイターになって仕事を請け負って独立できるぞ。プログラマーよりも働き甲斐があるかもしれん。
2018/04/06(金) 23:07:50.12ID:gYiRH0WM0
どっちも薄給
2018/04/07(土) 00:36:31.30ID:Y5tUUVb30
やたら伸びてると思ったら1人あたりのレス数多すぎだろ(しかも知らんことに口出し過ぎ

fbxsdkは昔ちょっとしか触ってないが、多分そのVSの3Dシーン作成ってのは3Dのモデルやシーンを.fbxに書き出すプロジェクトじゃね?
そういうのは多分Maya使った方が早いしfbxsdkはどっちにしても要る
あとDirect3D使うならそっちのスレ行ってくれ
2018/04/08(日) 02:00:13.10ID:xND6FkKma
C++で用意されているキャストと
cのi=(int)j みたいなキャストの違いがよくわからない
2018/04/08(日) 02:09:06.48ID:+gqqNGFK0
static_cast … 無理のない互換性のある変換。
reinterpret_cast … int から void* 等への強制変換 c の ()キャストと同じ。
const_cast … const 付きから const を無くしたりまたはその逆の変換。
dynamic_cast … 実行時型情報を使って実行時に型情報で互換性を見比べながらの変換。実行時型情報とのリンクが必須。
2018/04/08(日) 03:14:37.94ID:RvzgDq0H0
>>92
C スタイルのキャストは dynamic_cast 以外の C++ スタイルキャストを兼ね備えている。
安全なキャストも危険なキャストも見た目にわかんないから、
うっかり危険なキャストをしないようにカテゴリ分けしたやつを使った方がいいなって話。

reinterpret_cast や const_cast がどうしても必要な状況になったら、
それはそのプログラムが悪いデザインだというサインだ。
(デバイスドライバとか OS とかの低水準プログラムだと仕方なく使う機会は多いかもしれないけど)
2018/04/08(日) 06:15:21.60ID:fQMOYFpe0
『プログラミング言語C++』第4版のどこだったかに、
「危険なキャストを行っているソース箇所が目立つように
reinterpret_cast<型> のような長い綴りで見た目もスマートでない
キーワードを選んで導入した」みたいなことが書いてあったな。
2018/04/08(日) 11:13:04.50ID:NQAA1W7E0
すいませんchar str[1000]に格納されてるこの文字列を、str2[0][]=64 str2[1][]=9 という感じで上手くデータだけ取り出す方法は無いでしょうか

http://i.imgur.com/MMYajmf.jpg
2018/04/08(日) 11:13:28.36ID:CEYO7YYHa
ありがとうございます
基本的には見た目の話なんですね
98デフォルトの名無しさん (ワッチョイ 2d7f-vJpg)
垢版 |
2018/04/08(日) 11:44:19.45ID:rArjzNgz0
C形式のキャストは絶対に使うなって事だよ
2018/04/08(日) 11:44:37.07ID:ySnMa92f0
>>96
cならsscanfかね
c++ならregexを使うか
そもそもc/c++でやりたい範囲ではないが
2018/04/08(日) 11:44:50.16ID:wX43tNlZ0
>>96
テキストなのなら、一行ずつ読んで、=で半分にしましょう。
んで、""の中の空白以外を全部取り去って、std::mapにでも突っ込みましょう。
2018/04/08(日) 12:07:31.24ID:NQAA1W7E0
>>99>>100
めっちゃ難しそうな回答きた・・
ちょっと調べて頑張ってみますありがとうございます
2018/04/08(日) 12:17:01.56
danger_cast は言い過ぎとして、unsafe_cast くらいにして欲しかった
2018/04/08(日) 12:19:03.34
hansode_tampan_cast
104デフォルトの名無しさん
垢版 |
2018/04/08(日) 12:34:24.71
>>96
・str2はポインタの配列、idxはstr2の添字とする
・1文字ずつループして以下を処理
 「=」が現れるまでまで読み飛ばす
 「 」「"」以外の文字が現れたらstr2[idx++]にその文字へのポインタ格納
・「;」までスキップして¥0に置き換え
2018/04/08(日) 12:36:55.36ID:NQAA1W7E0
>>104
なんかできそう!やってみますありがとうございます!
2018/04/08(日) 13:00:09.46ID:CRecF1KTd
reinterpret_cast をポインタ以外に使うのはない
2018/04/08(日) 13:13:04.30ID:IdsKnaEwM
c向けのライブラリをc++で開発するときは躊躇なく使うかな>reinterpret_cast
あとはargとかparamとかいう名前の引数に好きなデータを突っ込みたいときとか。
2018/04/08(日) 13:57:50.07
reinterpret_castはゼロオーバーヘッド?
2018/04/08(日) 13:59:32.17ID:wX43tNlZ0
コンパイラさんが解釈かえるだけだから。新しくなにも確保しない。
2018/04/08(日) 14:55:18.41ID:XIh7sWbQ0
バイト単位の処理をするときに必ず出てくるだろ
2018/04/08(日) 15:41:01.45ID:drN9+cfC0
>>107の「あとは」以下の用例多いよね。
スレッドのエントリポイントの引数だの libcurl のコールバックの引数だのそんなので
2018/04/08(日) 17:17:06.93ID:9PMBUXuM0
バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
2018/04/08(日) 17:26:02.77ID:XIh7sWbQ0
>バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
誰も殺そうとしていない
2018/04/08(日) 17:48:08.38ID:yoJPjKyN0
Windowsとかのメッセージのパラメータなんて、
キャストしないとなにもできないけどな
2018/04/08(日) 20:53:29.38ID:B7amW+qmM
>>112
> さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
C+++でも作って勝手にやっててくれ
2018/04/08(日) 21:04:08.52ID:aevyI+Fp0
C++++でしょ
ill-formedだけど
それでこそアホどもに相応しい
2018/04/09(月) 11:03:03.24ID:Ecf+pvidM
static_castは長いから、ただのcastにしてほしい
その方がreinterpret_castのunsafe感が高まる
2018/04/09(月) 11:19:04.00ID:ClY8G0uJa
デフォルトをstatic_castで解釈しないのはなぜ?
2018/04/09(月) 11:23:19.28ID:fbTUuQs/0
>>117
#define cast static_cast
2018/04/09(月) 15:59:42.60ID:AbJVhraD0
>>118
互換性
2018/04/09(月) 22:38:54.59ID:J7f8Y+mC0
>>118
互換性には2種類ある
クラスポインタ変換の場合を例に挙げると
一つは拡張クラスからベースクラスへのアップキャスト
こちらはキャストの明示は必要ない暗黙の型変換が行える
もう一つはベースクラスから拡張クラスへのダウンキャスト
こちらはベースから拡張クラスへの変換に確証が得られている
わけではないのでstatic_castを用いて変換してやらないといけない
このときdynamic_castを使うと実行時に型をチェックしてくれる
のでよりstrictな変換を行わせることができる
できるといってもエラーを発生させるかさせないかの違いだけだけど
2018/04/10(火) 00:58:36.89ID:KTsfJjko0
>>118
そら互換性のためでしょ
2018/04/10(火) 05:22:39.46ID:AY1cx8Cu0
>>121
それは互換性じゃなくC++独自の話だね
互換性というからには何と互換なのかという相手がいる

ちなみに、かつて暗黙dynamic_castが提案されて否決となった
2018/04/10(火) 09:48:42.17ID:PdcJoG7U0
コンソールプログラムのwhile()ループで1文字入力したらループを抜けるときに使うやつって何でしたっけ・・
while(!getchar())だと文字を受けるまで処理がとまってしまいますが、止まらないやつがあったと思うのですが
2018/04/10(火) 10:20:00.71ID:AY1cx8Cu0
標準に「止まらないキースキャン」はない
conio.hのgetch()や
ioctl.hのioctl()あるいは
windows.hのGetKeyState()のような
処理系依存の関数が必要
2018/04/10(火) 10:30:44.25ID:h0HOed+p0
linuxならファイルディスクリプタにselectが使えるけど
windowsの場合はファイルディスクリプタとソケットがまた別物だし
2018/04/10(火) 11:04:35.34ID:PdcJoG7U0
>>125
getch()絡みで調べてたらkbhit()って出てきましたこれです
ありがとうございました
ちゃんと任意のキー押したら抜けれました
2018/04/10(火) 11:10:44.06ID:141aKXKv0
それって結局はビジーループの一種じゃね?
やりたいことにもよるけど、基本的にはあんまりよくない方法だと思う。
2018/04/11(水) 08:10:31.14ID:T4s6uHOl0
>>128
まずいですかね?
一日ランニング試験してみたんですが良い感じに動いてるのですが・・
2018/04/11(水) 09:27:42.36ID:WgIjYyd40
ビジーループにSleep挿入して100msづつ位休む感じでアイドルに見せ掛けるハッタリを噛ます
2018/04/11(水) 12:28:20.43ID:nyTWTQlG0
はったりじゃないでしょ
それは合格
2018/04/14(土) 12:01:39.22ID:bHi1VZVu0
低優先度タスクからのプリエンプションが無いOSでSleep(100 ms)したら
優先度関係無く他タスクに100 msを超えて待たされてしまうかもしれない
Sleep()は実行権放棄の呪文としては強力すぐる…
2018/04/14(土) 13:25:03.37ID:RVvtBgPf0
DOS並にコンソールがクソな環境も珍しいよな
unixベースのシェルに比べるとこんな貧相なものがよく生き残ってこれたとおもふ
2018/04/14(土) 14:27:12.94ID:AqyGMwU/0
>>132
ウィンドウズの話だけど、threadヘッダのスリープは起こし忘れが少ない気がする。
2018/04/14(土) 22:00:06.17ID:7AzbU2hj0
未だにGUIがまともにならないLinuxも珍しいよな
2018/04/14(土) 22:16:23.39ID:B3QB9Fpb0
>>135
君に期待しても良いのかな?
2018/04/14(土) 22:26:38.67ID:jn5/AQ8F0
誰かがデザイナ雇わないとな
2018/04/14(土) 22:31:21.78ID:Tt8LTURP0
まともを定義せよ
2018/04/14(土) 22:47:45.04ID:jn5/AQ8F0
美しいGUIか使用上十分なGUIか
2018/04/14(土) 23:04:06.39ID:WAEnZz2X0
Class A
{


  void A(B* &b)
  {
  }
};
2018/04/14(土) 23:06:11.46ID:B3QB9Fpb0
毎日使う上では美しさはいらない。シンプルで頼む
2018/04/14(土) 23:08:51.81ID:WAEnZz2X0
済みません、途中送信してしまいました・・・

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したうえで返すことができるようになるでしょうか?
2018/04/14(土) 23:15:39.02ID:EkNosKh20
void A(B** b)
{
*b = new B();
}
でいいんでないの
2018/04/14(土) 23:23:21.44ID:9kNArSDya
馬鹿だから分からないんだが教えて
インスタンス渡してからnewするのはなぜ?
ポインタを参照にする意味とは?
2018/04/15(日) 00:33:02.73ID:/OvgYAab0
>>142
>  void A(B* &b)
>  {
>    _b = b;
>    _b = new B();
>  }

下の方は b = new B(); としたかったんじゃないのか
2018/04/15(日) 00:44:36.47ID:b/ktaKN+0
A(B*&b) {
b=new B();
_b=b;
}
頭悪いだろオマエラw
2018/04/15(日) 00:52:36.30ID:b/ktaKN+0
A(B*&b){_b=b=new B();}
もしくは一発で書けば何の問題もおこらんよ
2018/04/15(日) 00:57:54.63ID:/OvgYAab0
受け取ったインスタンスを全く使ってないがそれが意図した動作なのか
2018/04/15(日) 01:00:18.78ID:b/ktaKN+0
参照オブジェクトの概念がよくわかってない
学び直せと言いたい
2018/04/15(日) 01:04:57.02ID:VAOccv/70
>>148
インスタンスなんて受け取ってないぞ
2018/04/15(日) 01:09:03.26ID:/OvgYAab0
>>150
>>142で「インスタンスを受け取り」と書いてあるから
ポインタ(の参照)でだけどインスタンスを渡しているのだろう
何故受け取っているのかとかの説明は無理だが
2018/04/15(日) 01:19:33.61ID:b/ktaKN+0
それにしてもbをnewするとかイミフ
何もしてないじゃんw
2018/04/15(日) 01:22:46.36ID:b/ktaKN+0
古いインスタンスを_bに格納して新しいインスタンスをbに返したいのか
新しいインスタンスを作成してbと_b両方に返したいのか
どっちなんだよ
2018/04/15(日) 01:22:49.52ID:/OvgYAab0
>>152
b を new するってのは
>b = new B();
のことか?参照で返してるんだよ

何故返す必要があるのかはこれも答えられないが
>>142に new して返そうと思っていますとあるからな
2018/04/15(日) 01:30:17.78ID:b/ktaKN+0
_b=new B() は見当たるが
b=new B() ←こんな記述は見当たらないぞ
嘘もたいがいにしとけや
2018/04/15(日) 01:39:29.12ID:b/ktaKN+0
>>142
コイツのソース見る限りbに対しては何もしてないでしょ
2018/04/15(日) 03:35:09.27ID:mYZtkoVNd
すまんすまん

>>142
>B* b;
>A* a = new A(b);

を見落としていた
インスタンスを渡すといっておいてインスタンスを渡していないとは思いもしなかったw
>>147であってるんだろうね
158デフォルトの名無しさん
垢版 |
2018/04/15(日) 06:03:36.65
>>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;
  }

こういうのは愚直に書けばええんや
2018/04/15(日) 08:25:34.99ID:IUBKEb9a0
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を行わせたい、という意図かもしれないけど、
元の質問から想像を広げすぎてるよね。
2018/04/15(日) 10:01:16.50ID:6WpjLuna0
Aが_bをdeleteするために管理するだけのクラスだとしたらスマポ使えという話になる
2018/04/15(日) 10:57:43.04ID:Yi/sDJN50
前に書き込んだことあるけど
https://qiita.com/notenopg/items/40571e69986a58b888a0
どうじゃ
2018/04/15(日) 11:01:19.87ID:GeT3puOg0
舌足らずでもうしわけありませんでした・・・

クラスBのインスタンスをクラスAで処理していくためにコンストラクタでクラスBの
インスタンスを参照受け取りする仕様にしました。

大半のケースではそのまま処理して終わり、なのですが
まれに受け取ったクラスBのインスタンスをnewし直す必要がありまして
その際受け取ったクラスAのメンバ変数 _b をnewしても受け取り元のインスタンスを
newできないことに悩んでいました

ただオブジェクト指向の観点から見るとあまり美しいプログラミングスタイルでは無いのかもしれませんね。
クラスBのインスタンスはクラスA内部で完全隔離処理するようにした方がいいのかもしれません
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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