C++相談室 part135
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の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 やたら伸びてると思ったら1人あたりのレス数多すぎだろ(しかも知らんことに口出し過ぎ
fbxsdkは昔ちょっとしか触ってないが、多分そのVSの3Dシーン作成ってのは3Dのモデルやシーンを.fbxに書き出すプロジェクトじゃね?
そういうのは多分Maya使った方が早いしfbxsdkはどっちにしても要る
あとDirect3D使うならそっちのスレ行ってくれ C++で用意されているキャストと
cのi=(int)j みたいなキャストの違いがよくわからない static_cast … 無理のない互換性のある変換。
reinterpret_cast … int から void* 等への強制変換 c の ()キャストと同じ。
const_cast … const 付きから const を無くしたりまたはその逆の変換。
dynamic_cast … 実行時型情報を使って実行時に型情報で互換性を見比べながらの変換。実行時型情報とのリンクが必須。 >>92
C スタイルのキャストは dynamic_cast 以外の C++ スタイルキャストを兼ね備えている。
安全なキャストも危険なキャストも見た目にわかんないから、
うっかり危険なキャストをしないようにカテゴリ分けしたやつを使った方がいいなって話。
reinterpret_cast や const_cast がどうしても必要な状況になったら、
それはそのプログラムが悪いデザインだというサインだ。
(デバイスドライバとか OS とかの低水準プログラムだと仕方なく使う機会は多いかもしれないけど) 『プログラミング言語C++』第4版のどこだったかに、
「危険なキャストを行っているソース箇所が目立つように
reinterpret_cast<型> のような長い綴りで見た目もスマートでない
キーワードを選んで導入した」みたいなことが書いてあったな。 すいませんchar str[1000]に格納されてるこの文字列を、str2[0][]=64 str2[1][]=9 という感じで上手くデータだけ取り出す方法は無いでしょうか
http://i.imgur.com/MMYajmf.jpg ありがとうございます
基本的には見た目の話なんですね >>96
cならsscanfかね
c++ならregexを使うか
そもそもc/c++でやりたい範囲ではないが >>96
テキストなのなら、一行ずつ読んで、=で半分にしましょう。
んで、""の中の空白以外を全部取り去って、std::mapにでも突っ込みましょう。 >>99>>100
めっちゃ難しそうな回答きた・・
ちょっと調べて頑張ってみますありがとうございます danger_cast は言い過ぎとして、unsafe_cast くらいにして欲しかった >>96
・str2はポインタの配列、idxはstr2の添字とする
・1文字ずつループして以下を処理
「=」が現れるまでまで読み飛ばす
「 」「"」以外の文字が現れたらstr2[idx++]にその文字へのポインタ格納
・「;」までスキップして¥0に置き換え >>104
なんかできそう!やってみますありがとうございます! reinterpret_cast をポインタ以外に使うのはない c向けのライブラリをc++で開発するときは躊躇なく使うかな>reinterpret_cast
あとはargとかparamとかいう名前の引数に好きなデータを突っ込みたいときとか。 reinterpret_castはゼロオーバーヘッド? コンパイラさんが解釈かえるだけだから。新しくなにも確保しない。 >>107の「あとは」以下の用例多いよね。
スレッドのエントリポイントの引数だの libcurl のコールバックの引数だのそんなので バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい >バリアント型が無いために野蛮なキャストが生きながらえるんじゃ
誰も殺そうとしていない Windowsとかのメッセージのパラメータなんて、
キャストしないとなにもできないけどな >>112
> さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
C+++でも作って勝手にやっててくれ C++++でしょ
ill-formedだけど
それでこそアホどもに相応しい static_castは長いから、ただのcastにしてほしい
その方がreinterpret_castのunsafe感が高まる デフォルトをstatic_castで解釈しないのはなぜ? >>117
#define cast static_cast >>118
互換性には2種類ある
クラスポインタ変換の場合を例に挙げると
一つは拡張クラスからベースクラスへのアップキャスト
こちらはキャストの明示は必要ない暗黙の型変換が行える
もう一つはベースクラスから拡張クラスへのダウンキャスト
こちらはベースから拡張クラスへの変換に確証が得られている
わけではないのでstatic_castを用いて変換してやらないといけない
このときdynamic_castを使うと実行時に型をチェックしてくれる
のでよりstrictな変換を行わせることができる
できるといってもエラーを発生させるかさせないかの違いだけだけど >>121
それは互換性じゃなくC++独自の話だね
互換性というからには何と互換なのかという相手がいる
ちなみに、かつて暗黙dynamic_castが提案されて否決となった コンソールプログラムのwhile()ループで1文字入力したらループを抜けるときに使うやつって何でしたっけ・・
while(!getchar())だと文字を受けるまで処理がとまってしまいますが、止まらないやつがあったと思うのですが 標準に「止まらないキースキャン」はない
conio.hのgetch()や
ioctl.hのioctl()あるいは
windows.hのGetKeyState()のような
処理系依存の関数が必要 linuxならファイルディスクリプタにselectが使えるけど
windowsの場合はファイルディスクリプタとソケットがまた別物だし >>125
getch()絡みで調べてたらkbhit()って出てきましたこれです
ありがとうございました
ちゃんと任意のキー押したら抜けれました それって結局はビジーループの一種じゃね?
やりたいことにもよるけど、基本的にはあんまりよくない方法だと思う。 >>128
まずいですかね?
一日ランニング試験してみたんですが良い感じに動いてるのですが・・ ビジーループにSleep挿入して100msづつ位休む感じでアイドルに見せ掛けるハッタリを噛ます 低優先度タスクからのプリエンプションが無いOSでSleep(100 ms)したら
優先度関係無く他タスクに100 msを超えて待たされてしまうかもしれない
Sleep()は実行権放棄の呪文としては強力すぐる… DOS並にコンソールがクソな環境も珍しいよな
unixベースのシェルに比べるとこんな貧相なものがよく生き残ってこれたとおもふ >>132
ウィンドウズの話だけど、threadヘッダのスリープは起こし忘れが少ない気がする。 未だにGUIがまともにならないLinuxも珍しいよな Class A
{
void A(B* &b)
{
}
}; 済みません、途中送信してしまいました・・・
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したうえで返すことができるようになるでしょうか? void A(B** b)
{
*b = new B();
}
でいいんでないの 馬鹿だから分からないんだが教えて
インスタンス渡してからnewするのはなぜ?
ポインタを参照にする意味とは? >>142
> void A(B* &b)
> {
> _b = b;
> _b = new B();
> }
下の方は b = new B(); としたかったんじゃないのか A(B*&b) {
b=new B();
_b=b;
}
頭悪いだろオマエラw A(B*&b){_b=b=new B();}
もしくは一発で書けば何の問題もおこらんよ 受け取ったインスタンスを全く使ってないがそれが意図した動作なのか 参照オブジェクトの概念がよくわかってない
学び直せと言いたい >>150
>>142で「インスタンスを受け取り」と書いてあるから
ポインタ(の参照)でだけどインスタンスを渡しているのだろう
何故受け取っているのかとかの説明は無理だが それにしてもbをnewするとかイミフ
何もしてないじゃんw 古いインスタンスを_bに格納して新しいインスタンスをbに返したいのか
新しいインスタンスを作成してbと_b両方に返したいのか
どっちなんだよ >>152
b を new するってのは
>b = new B();
のことか?参照で返してるんだよ
何故返す必要があるのかはこれも答えられないが
>>142に new して返そうと思っていますとあるからな _b=new B() は見当たるが
b=new B() ←こんな記述は見当たらないぞ
嘘もたいがいにしとけや >>142
コイツのソース見る限りbに対しては何もしてないでしょ すまんすまん
>>142
>B* b;
>A* a = new A(b);
を見落としていた
インスタンスを渡すといっておいてインスタンスを渡していないとは思いもしなかったw
>>147であってるんだろうね >>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;
}
こういうのは愚直に書けばええんや 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を行わせたい、という意図かもしれないけど、
元の質問から想像を広げすぎてるよね。 Aが_bをdeleteするために管理するだけのクラスだとしたらスマポ使えという話になる 舌足らずでもうしわけありませんでした・・・
クラスBのインスタンスをクラスAで処理していくためにコンストラクタでクラスBの
インスタンスを参照受け取りする仕様にしました。
大半のケースではそのまま処理して終わり、なのですが
まれに受け取ったクラスBのインスタンスをnewし直す必要がありまして
その際受け取ったクラスAのメンバ変数 _b をnewしても受け取り元のインスタンスを
newできないことに悩んでいました
ただオブジェクト指向の観点から見るとあまり美しいプログラミングスタイルでは無いのかもしれませんね。
クラスBのインスタンスはクラスA内部で完全隔離処理するようにした方がいいのかもしれません BをAしか使わないならAの中に隔離する
他でも使う必要があって、Aの外部でBの寿命を管理してるなら、AにrefreshB()みたいなBをnewし直した時に渡し直す関数を用意する
でいいんじゃないの
本当にBをnewし直す(メモリ上再配置する)必要があるならだけど
実はB自体にreset()用意するだけで済む話のように見える c++じゃポインタのこともインスタンスっていうのか 理解不足を言い換えてミスしてない風にするのが流行ってるのかな 質問あるのですが、
同一PC内の画面機能と処理機能のプロセス間通信はどうやるのが便利ですか?
画面更新速度は100ms周期くらいです。
共有メモリがいいと思ったんですが、ソケット推してる人がいてもやもや
アクセス速度とかNICの通信量とか考えると共有メモリ一択な気がするんですが、どうなんでしょうか?
パイプとマップドメモリはメリット無いので考えていません。 そもそも別にする理由は何?
どんなものを想定してるの?
プロセスは常に1対1なの 同一PC内なのにソケットとNICの通信量って何か関係あるの? >>168
ソケットって、その場合はUNIXドメインソケットのことだろ。 NIC は関係ない。
プロセス間通信としてはほどほどに速度もあって、ほどほどに疎結合なので十分に選択肢の範囲内だと思う。 unix domain ソケットがお手軽で便利だけど
時代に合わせてパイプか tcp かなあ
Windows でしか使わないならならcom使うのも簡便 共有メモリだとリングバッファとか排他とか自分で作り込まなきゃいけんやろ
ソケットならそのへん考えなくてええやん windowsはファイルマッピングオブジェクトでしょ
パイプでさえSYNCHRONIZE特権指定できないゴミなんだから unix domain socket なんて使ったことないな
名前空間としてファイルの指定がいるし将来違うマシン間で動作させる時に変更量が多いしtcp/udpに比べてデメリット多くね? >>173,174
共有メモリは例えば/dev/shmのRAM領域にあるメモリマップですよね
同一PC内のソケットのボーレートってほぼクロック数なんですか?
同一PC内の通信であったとしてもネットワークドライバの実装するプロトコルスタックを経由してしまうので、
その分のオーバーヘッドの分だけ速度が落ちる、という解釈ですが iperfとかで同一PC内で速度測ったらどれくらいいきます?
(1Gbpsな気が) >>179
ドロップしないから楽なんだよ
デメリットは仰る通り >>180
あなた知識が色々おかしいので何も考えずに教えられたとおりにした方が良いですよ 昨日の安全確保支援士の試験にC++が出ていたが、メンバ変数にm_が付いていた。
さすがにポインタのpなどは付いていないが、ちょっと意外だった。 >>183
同一PCのTCP通信はどういう経路通るの? 未だにシステムハンガリアンなやつみたいに変なのとも
うまく付き合うのがC++使いのスキルの1つだかんね Windowsのネットワーク関係APIはkernel内に実装されていない
後は判るな? ネットワーク関係に限らずAPIはすべてサブシステムだね 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で試して見た所当然のようにコンパイルエラーになったのですが・・・ ■ このスレッドは過去ログ倉庫に格納されています