【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net
1 :
デフォルトの名無しさん :
2014/11/28(金) 21:54:52.02 ID:QcGoPiaz
2 :
デフォルトの名無しさん :2014/11/28(金) 21:55:19.03 ID:QcGoPiaz
テンプレここまで
3 :
デフォルトの名無しさん :2014/11/28(金) 23:10:20.05 ID:/kbuZX05
いまのところ、統計的に一番需要が大きいのはどのOSですか?
ノ ゚.ノヽ , /} ...
,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは
>>1 乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. :::
6 :
デフォルトの名無しさん :2014/11/30(日) 06:08:23.21 ID:b4nmdqGs
スレだぶってるよ
今時32ビット使ってるのは労害エロゲーマーかNEC社員ぐらいだろ
保守上げ
9 :
デフォルトの名無しさん :2014/11/30(日) 23:20:16.87 ID:dPZ+5hvT
初心者死ねよ
関数の戻り値について質問なのですが、例えば何か計算して その結果をvectorに入れて返したいので、データを入れる構造体を定義して、 struct MyData{ ... }; vector<MyData> func1() { vector<MyData> vmd; ... return vmd; } みたいな感じの関数を良く使います。 この時に、さらにその関数の実行が上手く行ったかどうかも返したいので、即席でヘンテコな構造体を作って、 struct ReturnData{ vector<MyData> vmd; bool success; }; ReturnData func2(){ ReturnData rd; ... rd.vmd.push_back(..); ... rd.success = true; return rd; } みたいな事を良くやります。 自分でも安易なやり方だと思うのですが、もう少しスマートな定番方式はありますか? 関数の引数で値を返すと言う方法もありますが、私としてはどちらかというと引数ではなく 戻り値で返したいのです。上級者の皆さんのアドバイスをお願いします。
そういう時こそboost::optionalですよ
boostですか。 標準のC++の機能では無理でしょうか?
テンプレだしいいと思うが じゃあstd::pairで
unique_ptrでもいいな
15 :
デフォルトの名無しさん :2014/12/01(月) 04:32:52.00 ID:6glZ0bPp
戻り値を複雑化するのはおすすめではないだろ。たとえばスクリプト言語から動的リンクで関数を使おうとするとシンプルな型でないと動かない。
>>13 レスありがとうございました。
早速ググりました。こんなのが有るとは知らなかったです。
でもメンバ変数名がfirst、secondに固定されるようなのですが、
ちょっと抵抗有ります。
型指定getはC++14からだからダメか
>>17 たびたびレスありがとうございます。
さっそくググりました。こんなのが有るのは知らなかったです。
std::tuple<vector<MyData>, bool> func(){
...
}
ってやればいいんですね。でも、これだと、即席のヘンテコ構造体でやるのと同じような感じです。
>>14 >unique_ptrでもいいな
どうやるんでしょうか?
使っているのはVisual studio 2013です。
>>19 std::unique_ptr<MyData> func() {
auto pvmd = std::make_unique<MyData>();
pvmd->push_back(..);
if (...)
return pvmd; // 成功
else
return nullptr; // 失敗
}
>>20 レスありがとうございました。
試したら上手く行きました。
unique_ptrというのは使ったことが無いのですが、こういう用途に
使うものなのでしょうか?
もしtrue/false以外の別の情報も返したい場合には、
どんな方法がありますか?
つーか、vectorのsize()がでかかったら鬱陶しいから戻り値は状況だけ返すとして 引き数でvectorの参照を渡せばいいよ。
>>10 はコピーコストが高そうだが、それでも完成形なの?なんだか Java とかから来た人がやりそうだね
>>10
コピーコスト? どこでコピーが起こるというの
moveセマンティクスを使える環境の人ばかりじゃないだろう。
vector<T> f()
{
vector<T> v;
;
return v;
}
と vector をベッタリかえすのだから、v全体がコピーされる、と考えてしまうのだが
Java だとこれでもいいかもしれないが
>>10 が完成形とかなんの冗談だ?
move関係ないし、NRVO: named return value optimization でググっときなさいな
横からだけど、RVO(returnで直接構築したらOKってやつ)は知ってたがNRVOは知らなかった 勉強になった
ローカル変数は暗黙moveされるようになったからRVOもNRVOが効かなくても大丈夫
こういう用途にはmaybe monadすばらし
void* を経由して std::shared_ptr を運びたい時って、 std::shared_ptr<T> a(ptr); void *UserData = &a; ... std::shared_ptr<T> b = *(std::shared_ptr<Type> *)UserData; で大丈夫なの?
aの寿命にさえ気を付ければ
クラスのコピーを禁止したい クラスの生成を関数の返り値に制限したい これって両立不可?
friend関数
コンストラクタとコピーコンストラクタをprivateに 生成はファクトリーパターンで
38 :
デフォルトの名無しさん :2014/12/03(水) 18:42:54.40 ID:o987ZOaf
c++ではクラスはコピーできないし、生成もできない。 出来るのは宣言と定義。
gen()をAのメンバーにする A()もprivate
c++でクラスを毎回newして使うのと、パブリックなサブルーチンの関数を呼び出して使うのでは、 後者の方が早いんでしょうか。
その程度なら最適化で消えそうだが
>>41 やっぱコピーコンストラクタを開放するしかないっすかね
ポインタで返すのは駄目なのか?
>>44 コピーコンストラクタはprivateだけど
class Bar { // き・ん・し. Bar &operator=( Bar const& ); Bar( Bar const& ); Bar(){} public: int a; static Bar &generate(){ return *new Bar; } static void erase( Bar &bar ){ delete &bar; } }; int main() { // 受け取るのはこれで. Bar &a = Bar::generate(); // Bar b; // これエラー. // Bar *c = new Bar; // これももちろんエラー. Bar::erase( a ); }
Bar &aが嫌なら class Bar_ { // 中は同じ. }; typedef Bar_ &Bar; でBar_::generate();とか。 どっちかっていうとFactoryクラスをfriendにしてgenerateとeraseをそっちに移す方が好み Bar b = Factory::generate(); って書けるし
C言語既習で、rubyとかpythonとかjavaとかscalaとかhaskellとかその辺のメジャーどころも書いたことあるんだけど、C++は書いたことがなかった。 今度C++を書かなきゃいけないのだけど、なにかいい書籍はありますか? プログラミングの基礎的な部分とかC言語とかぶる部分は飛ばしたいのだけど
あ、もちろんサイト等でもかまいません。連レスすみません。
ロベールでいいんじゃね
え、独習C++?
独習はいいよ、中盤どころで string クラスを自分で作れ、という最大の山場があるが、ここにいたるまでの説明が比較的親切だ
>>34 class Uncopyable
{
public:
Uncopyable(const Uncopyable&) = delete;
Uncopyable& operator= (const Uncopyable&) = delete;
Uncopyable(Uncopyable&&) = delete;
Uncopyable& operator= (Uncopyable&&) = delete;
};
こういう、単語レベルで猿のように反応して とんちんかんなURLを貼りまくる馬鹿ってよくいるよな
C++ポケットリファレンスでいんじゃね
ありがとうございます!いただいた意見を参考に探してみたいと思います。 C++11だとかC++14?だとかは最初はあんまり気にしなくて良いんですかね。 C++はテンプレートとかboostとか難しそうというか覚えることが多そうで怯みますね
C++は多くの概念をその身に宿している。 C++は手続き型であり、構造化であり、オブジェクト指向であり、ジェネリクスであり、半関数型である。 どんな人の好みにでも合致する部分があり、嫌悪する部分がある。 故に、自分の好みの部分を最大限に生かすように使えばいいのだ。決してすべてを網羅する必要などない。 boostはあくまで外部ライブラリだから!言語として考えるものじゃないから!
ただ、現実には自分の好みが許されることなど決してなく どこかの誰かの意味不明な好みを押し付けられる!
60 :
デフォルトの名無しさん :2014/12/04(木) 07:48:13.59 ID:UwyMS5sV
c++で a って言うフォームが有って、これがインスタンス化されているかを調べる時は、 if (a != NULL) ↑ フォームのポインタ とかで問題ないですかね。
どうやってインスタンスを作ったかによるだろう
・ポインタが ヌルかどうか ・ヌルでないポインタが有効なメモリ(オブジェクト)を指しているかどうか ・オブジェクトが有効なウインドウハンドルを持っているかどうか 気の利いたライブラリを使っているなら上のいくつかを省略できる
予め初期化しとけばいんでね? ま でもポインタなら何が入るかは保証できしんしね。
NULLじゃなくてnullptr使いなさい
if (a)だけでいいよね
それは宗教の問題だからアンタッチャブル
そか 皆気をつけて
例外について質問です 何種類かの例外クラスを投げうる関数を使うのに、tryブロックで囲みcatchしたあとの処理を共通化したいのですがどのように書けばいいですか? 今まではcatchをダラダラといくつか書いてたのですが、 catchしうる例外の種類が増えた時その関数を使う箇所全てのcatchを増やさないといけないことに気が付きました。 投げられる例外は必ずstd::exceptionを継承した例外クラスなので、とりあえずはstd::exceptionの参照でキャッチして、 受け取りうるエラークラスの型のオブジェクトを引数に取るようなポリモーフィックな関数で処理しようとしたのですがうまくいきません。 例外処理を共通化するにはどう実装すればよいですか?
try catchの部分を関数化したらあかんの?
71 :
デフォルトの名無しさん :2014/12/06(土) 18:57:18.46 ID:7IWME+c9
> catchしうる例外の種類 その関数から出す例外の共通ベースクラスを作って 例外は全部そのベースクラスの派生クラスだけ投げる そのベースクラスだけcatchする
72 :
片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/12/06(土) 19:01:26.94 ID:Z6yqpce/
try { ... }catch(const std::exception& e) { catcher(e); }
>>70 なるほど、確かに
解決しました、有難うございました
>>72 これでcatcherを派生クラスごとに書いたんですがうまくいかないということでしたが、
一回try catchする関数でラップすることで解決しました
関数化するしかないんだろうけど 必要な変数を渡すのが面倒なんだよな。 C#6.0みたいに条件指定できるようにならないものか catch (exeption &e) if (e.SomeValue ==2 || e.OtherValue!= null) { }
基底クラスで先にキャッチしてて派生クラスの分岐に行かないというオチでは
>>75 そんなのいちいち構文拡張しなくてもリスローすればいいやん
>>76 再スローしたら後続のキャッチハンドラにいかなくね?
というか例外なんかを使うやつがいるのか? 再帰で書くようなコンパイラを書くか、窓でメインとスレッドエントリーポイントで囲んで謝罪メッセージを出力するぐらいしか使わないんだが。 例外を掴んでリカバリコードを与えた上でリトライ、スキップが書けないから使いどころが少ない
もちろん 正常系にエラー処理をずらずら書きたくないからな
言語で例外を強要するのもあるから、ま、多少はね・・
Goなら例外自体を言語仕様から抹消したぜ! まあ、panicとrecoverで例外相当の事が出来ちゃうんだけどね
茫洋さんのポインタの本買おうと思ったけど廃版になってた 仕方ないから前橋さんのにしたよ 14年前の本か・・・
ポインタまわりなんて20年経っても変わらんやろ
Win7のVS2013で FILE *fp; wstring logFile = "ログファイル.txt" errno_t err = _wfopen_s(&fp, logFile.c_str(), L"at, ccs=UTF-8"); みたいな感じでファイルオープンして、vfwprintf_s()を使って日本語を書き出しているのですが、 文字が時々化けるのです。 ログファイルなので、プログラムの実行中にいろんな情報を書き出しています。ファイルが既に有る場合には追加で書き込んでいます。 デバッグなどでプログラム実行中に強制的に中止することもあります。なので、ログファイルに書き出している途中で中断した 場合などに、ファイルが中途半端な状態で閉じられ、そういう不完全なファイルに、次の実行時に追加で書き出すと、 化けるのかななどと推測していますが、根拠はありません。 プログラム開始前にファイルを削除して新規に作成すれば化けることはないのですが、それだと長期的なログが収集出来ません。 ログファイルが文字化けする理由は何でしょうか?どのような対策が良いでしょうか?
フラッシュしたら?
まずどう化けるのかを言うべき。 だが多分排他してないからじゃね
87 :
84 :2014/12/09(火) 19:56:43.15 ID:FiVhwApy
原因が分らないので、ログファイルは諦めます。 しばらく修行してまた出直します。ありがとうございました。
自分は書き出したつもりでも、実はメモリ上に溜まっていて ある程度溜まったところで実際のファイルに書き出される仕組み
文字化けの原因が自分のプログラムだけにあると思い込まない方がいい。 utf-8は、まだ普及途中の文字符号化方式だから不具合も希にある。 だが、86が指摘している通り、俺も排他制御せずにログファイルに書き込んでいる事が原因だと思うな。 確かめたいならば、一度ccs=UTF-8を外して実行してみることを勧める。 Cの一行、ストリーム関数の中の処理と、スレッドがプリエンプションするタイミングは無関係に発生する。
unsigned char Max = 0; ・・・ Max = std::max( Max, 0 ); とすると、引数の型が揃わないからエラーになります。 0を0uとしてもダメです。 unsigned char( 0 )にしたら通りますが、 unsigned charな数値リテラルの書き方ってあるんでしょうか?
ない
ないからstatic_castでキャスト、 Cキャストやreinterpret_castは死すべき、慈悲は無い
>reinterpret_castは死すべき、慈悲は無い
無いのは慈悲じゃなくて、
>>92 の脳みそじゃね?
>>90 揃わないなら揃えなくてもいいように指定すればいい
std::max<unsigned char>(Max, 0) とか
std::max<std::decay<decltype((Max))>::type>(Max, 0) でOK
>>89 >文字化けの原因が自分のプログラムだけにあると思い込まない方がいい。
>utf-8は、まだ普及途中の文字符号化方式だから不具合も希にある
じゃあその不具合の一例を出してみろ
96 :
90 :2014/12/10(水) 22:22:48.33 ID:xebn7APd
>>91-92 ありがとうございます。
>>94 おお、そんな書き方ができたとは!
前者にします。
ありがとうございました。
そもそもmaxの意味がないというのはスルー?
用例でそれをいったらキリが無い
話の本質はそこじゃないから良いんでねーの
100 :
90 :2014/12/11(木) 00:50:53.63 ID:ykbWZu7K
>>97 あ、ホントは
Max = std::max( Max, b ? Val : 0 );
みたいな感じです。
>>90 は問題を示すために簡略化しました。
>>90 VC++だったらこれ使ったら?
std::max( Max, 0ui8 );
102 :
90 :2014/12/11(木) 01:26:59.08 ID:ykbWZu7K
>>101 え!?そんな書き方できるんですか!?
ちょっとキモいですけど、文字数少なくてナウいですね。
明日会社で試してみます!
ありがとうございます!
Max = b?std::max( Max, Val ):Max;
>>95 つい最近そのバグ見つけて報告したらパッチ出たよ
具体的に
BOMを省略したがるエディタが文字化けを起こしやすい HTMLも編集できるタイプは自動認識して、かつ履歴にあるとチェックしない時がある 最初にASCIIやSJISで認識して、そのあと実はUTF-8に更新されると化ける まあUTF実装の不具合じゃないけど、直面するとバグだー不具合だー実装者無能と騒がれる
開発に鬼の首を取ったように煽りにいくバカが蔓延しているからエディタ名は言わないからな もとの質問と違うしね
UTF-8 に BOM が?
え!!おなじUTF-8でBOMを!?
if(a && (!b)) は if(a && !b) と書いても同じですよね?
>>111 ありがとうございました。
良く迷うので、あえて
if(a && (!b))
のように書くことにします。
可読性だな
>>106 > まあUTF実装の不具合じゃないけど、
で、結局何が言いたかったの?
まぁ、UTF-8にBOMがあるなんてMSの妄想を真に受けている位だから 自分の妄想垂れ流したいだけなんじゃないの?
WindowsみたいなASCIIのお供に互換性の全くない各言語専用のコード使っててそれを切り捨てない環境だったら 判別の為にBOMを付けざるを得ないってのも解らなくはないけどな。 個人的に今更SJISなんか使わねえから設定でUTF-8をデフォルトにしてくれんかなとは思う。 仕事でWindows使ってないからあんまり困ってないけど
UTF-8にBOMが無いとでも言いたげな奴は 何を根拠に物申してるんだ。 Unicode規格読んだ上で言ってるのか?
102 90 sage 2014/12/11(木) 01:26:59.08 ID:ykbWZu7K ちょっとキモいですけど、文字数少なくてナウいですね。 このスレもう嫌だ
この子鳥羽通り そう思うんだったら、そうなんだろうな と。
Unicode 7.0ではUTF-16のBOMに相当するUTF-8のシグネチャーは 「<EF BB BF>と言うシーケンス」という表現になっていて BOMという用語は避けているようだ。 3.10章D95, 23.8章
ボマーつかまえた
VSでUTF-8が文字化け ↓ まだ普及途中の文字符号化方式だから不具合も希にある ↓ じゃあその不具合の一例を出してみろ ↓ つい最近そのバグ見つけて報告したらパッチ出たよ ↓ 具体的に ↓ (世の中の)エディタが文字化けを起こしやすい。 俺のプログラムに非が無いのにバグと言われた経験ある。 何なのこのアホは
124 :
90 :2014/12/11(木) 21:03:27.00 ID:ykbWZu7K
>>101 その記述でコンパイル通りました。
ui8以外にも色々あるんですね。
勉強になりました。
>>103 あ、たしかに、それでOKですね・・・w
数値リテラルを使わない上に、文字数も最小になったので、
今回はその記述でいくことにしました。
ありがとうございました!
いまのメモ帳ってUTF-8がデフォなのな
BOMと呼んでいるけど、元々はUnicodeで普通に定義されている文字コードだからね。 そのコード配列をBOMという別名でエンコード判定にも使っているだけで。
class formA : publicB { private: ここ } void formA::test(){ ・・・ } の時、privateの所に、 void test() と宣言するのと、 void formA::test(); で宣言するのでは違うんでしょうか。 どっちもコンパイルされて動くんですが
内部に定義するとinlineキーワードを書かなくともインラインになるね。
class formA : publicB { private: void formA::test(); }; みたいに(クラス内での)メンバ関数の宣言で修飾名を使うのは規格違反 クラス外での定義のときだけ許される vc++で通るのは独自拡張
130 :
127 :2014/12/12(金) 02:27:24.01 ID:FMxaf1vD
なるほど。なんとなくわかりました。
>>126 一時期ファイルの先頭に「美乳」って書いておくと
そのバイト列がBOMの代わりに使えるって話があったな
C++では関数のプロトタイプ宣言は、どこに書いてもいいのでしょうか? Cだとファイルの先頭に書いていたのですが、今日、関数の中でプロトタイプ宣言してみたのですが、 void func1() { int func2(); // 別のファイルで実装 int a = func2(); } これでも問題なく行けたのですが、これは問題ないでしょうか?
実行してみろよ
実行は出来るんですが、ググってもこんな書き方が 見つからなかったので、何かの間違いかと思っているのですが。
func1の中でだけfunc2を使うなら問題ない。func1の外で他の宣言なしにfunc2を使おうとすればエラー ついでにC++固有ではなくCから引き継いだ仕様だ
>>135 サンキュウ、君は詳しいな。助かったよ。ありがとう。
>>136 変数宣言と同じだろ
スコープ内か外かの違い
なるほど。 自分も参考になった。
でも使わないよな。 別ファイルの関数呼ぶのにそんな宣言してるやつ見たらとりあえずディスる
引き数プロトタイプもない時代のロートルは今でもやるぞ。 例えば、こんな感じ。 -- int main() { double sin(); printf("%g\n", sin(0.0)); return 0; } -- 今となっては飛んだアナクロ仕様だな。
141 :
デフォルトの名無しさん :2014/12/12(金) 15:12:12.08 ID:z5EZhpJA
stackずれてきたりしませんか
>>140 そんなロートルが勤めれるなんていい会社じゃないか。
使わね−よ で済めばいいが他の構文と混じって嫌らしいことが起きる
組み込みだと使われてるのか
Foo a(0,1); Foo b(1); Foo c();
+演算子のオーバーロードに関する質問なんですけど、 次のようなクラスがあったとして、 template<typename T> class A { public: A(T val_) : val(val_) {} ... private: T val; }; このクラスのための+演算子(2項バージョン)を実装したいと思って、 template<typename T> A<T>& operator+(const A<T>& lhs, const A<T>& rhs) { ... return ret; } というようなものを作ったんですけど、次のようにするとエラーがでてしまいます A<int> a(1), a2(2); A<int> a3 = a1 + a2; A<int> a4 = a3 + 1; //←ここでエラー ここでintからA<int>への変換が働いてうまく動くと期待したんですが、ダメでした こういうコードが動くように+演算子を実装したいんですけどどうすればいいですか?
エラーメッセージは?
template<typename T> A<T>& operator+(const A<T>& lhs, const T& rhs) { return lhs + A<T>(rhs); }
149 :
146 :2014/12/12(金) 19:01:29.43 ID:msKuYMsR
コンパイル時に、たくさんエラーメッセージが出るんですが、だいたい以下のようなかんじです ...テンプレート 引数を 'const A<T> &' に対して 'int' から減少できませんでした ...クラス、構造体、共用体に既定のコンストラクターがありません ...これらのオペランドと一致する演算子 "+" はありません オペランドの型: A<int> + int
150 :
146 :2014/12/12(金) 19:13:12.95 ID:msKuYMsR
>>146 で
A<T>& operator+(const A<T>& lhs, const A<T>& rhs)
のところで
A<T>&となってるのは2chに書き込むときのミスです
A<T>&→ A<T>&
に修正します、すいません
151 :
146 :2014/12/12(金) 19:21:25.51 ID:msKuYMsR
>>148 ありがとう、動きました
ただ、左オペランドがTのバージョンも書く必要がある思いますけど、
そういうものなんでしょうか?
はい
C言語なら関数を呼び出す時には、 ヘッダをインクルードしてれば普通に a = kansu(); って呼び出せますが、 C++でオブジェクト指向で作る場合に、別のBって言うクラスの中に作ったkansu()を呼び出す時は、 毎回Bをnewしてインスタンス化して kansu()を使って、必要無くなったらnewしたのをdeleteするんですか。 めんどくさくないですか。
static 付けとけって事ですか?
>>157 ちげーよ
お前はC言語でオブジェクト指向的に作るときどうしてんだよ。
そういう場合がないっていうんであればお前にはC言語以外のあらゆるモダンな言語をさわる必要がない。
オブジェクト指向で作ったことないから聞いてるんですが
>>159 pythonとかから始めた方がいいよ。オブジェクト指向のメリットも解らないうちからクラスを使っても無駄。
あとC++でnewは必須ではないnewはC言語のmallocの代わり
161 :
146 :2014/12/13(土) 01:59:00.67 ID:0ma+/H0C
>>154 newしなくても呼び出せるよ
B b;
b.kasu();
これでいい
B().kasu()じゃいかんの?
>>154 Cでオブジェクト指向で作る場合にファイル内移動のfseek()を呼び出す時は、
毎回ファイルをfopenしてFILE*を取得して fseek()を使って、必要無くなったらfopenしたのをfcloseするんですか
>>162 やることによるだろうが、初心者への回答としては
>>161 だろうな
> 別のBって言うクラスの中に作ったkansu()を呼び出す時は
を満たすだけならスタティックメソッド定義して B.kansu() でもいいわけだし
>>162 オブジェクト指向って、まずはデータありき
例えばだけど、
FILE* fp; の実体は構造体で、それに対してfpを引数に取る関数が有るが、
fputs(str, fp);
fclose(fp);
こういうのを、データとそれに対する処理をまとめて、例えばだけど、
File fp;
fp.fputs(str);
fp.fclose();
こういう風に書く、と言えば理解出来るかな?
(ちなみにこれは例で作ったでっちあげコードだから)
そういう意味で、fpに相当するデータが無い処理であれば、
File::kansu()
のように、fpを作らずC言語風に直接呼び出すようにすることも出来る。
namespace にすべきか class 内 static にすべきか
167 :
デフォルトの名無しさん :2014/12/13(土) 07:37:43.67 ID:KcZztYF+
B.kansu()
168 :
スッキリ厨 :2014/12/13(土) 08:13:03.36 ID:3ehKG0WS
>>154 関数には2種類ある
各インスタンスのデータを利用するメソッドと、
どのインスタンスにも関係しない、単なる関数
例えば上は、f(){
処理中に、そのインスタンスのデータをさわる
}
下は、f(a,b){return a+b;}など。
また同様に、staticメソッドも、
各インスタンスのデータを利用しない
オブジェクト指向を知らないなら、
スッキリわかる Java入門 第2版、2014を読んでみ
using でばら撒ける利点と欠点があるのが namespace
すたちっく・めそっど?
忘れるのがやな人はnamespace を使わないんだって
staticおじさんかな?
しっくりこない
http://usi58.blog16.fc2.com/blog-entry-155.html この人と同じ疑問を持ったのでURL貼らせてもらいます
int str_char(const char str[], int c)
この仮引数cはint型
でも関数呼び出しの際に実引数として使っているのは・・・
char ch;
no=str_char(str, ch)+1;
char型
int型の方が守備範囲が広いのでchar型に格納された整数値を
int型に引き渡しても問題ないという感覚ですか?
問題が起きないとしても、わざわざstr_char関数の仮引数にint型を使うメリットはあるのですか?
演習問題として出題されているのですが、仮引数部分は問題文でこのように指定されているんです。
ちなみにchar型を使っても問題は起きませんでした。
型をそろえるという話をするのであれば
main関数の方で使っているchar ch;を
int ch;とする事も考えられれるのですがコンパイル失敗します
http://newcomer.s368.xrea.com/clang/src/9/9-3.c.txt 例えば↑このサイトだとint型変数を使っているのですがコンパイルできません
int main(void)
{
int a;
scanf("%c", &a);
printf("%c\n", a);
return 0;
}
これにaを入力してもちゃんとaが表示されるので
演習問題でもいけるか?とも思ったのですが・・・
ちなみにポインタはまだ習っていないとの前提で解く問題です。
ちなみにこの本の筆者は関数にはポータビリティを持たすべきだと各所で主張しているので int型を指定したのはその関連なのかなとも思うのですがどうなのでしょう
本がクソ
>>177 それが答えなら納得できるんですけどね。
この演習問題の次の問題でも同様に検索する文字をint型で引き受けるように
仮引数が指示されてるんで、何か意味があるのかと思ってしまうんです
getcharの戻り値がintだからとか?
>>179 この解答ではgetchar関数は使っていません
だからもしsscanfをgetcharに変えたりするときに変更しなくてもいいように
182 :
174 :2014/12/14(日) 05:27:25.96 ID:l0UGMelp
連投規制に引っかかったのでIP変えました
>>181 気づきませんでした
ごめんなさい
なるほどです
もしかしてgetcharを使うように暗に促しているのかなとも今考えているのですが・・・
例題等の流れからするとそこまでの要求はしていないかな・・
getcharの知識をまだあまりもってないのでまた考えてみます
183 :
名無しさん@そうだ選挙に行こう :2014/12/14(日) 06:37:41.82 ID:QEpJ0bQG
>>174 >int c;
>scanf("%c", &c);
自分が何やってるか判っててやってる?
コンパイル通れば良いってもんでもない
本に言えよ
185 :
名無しさん@そうだ選挙に行こう :2014/12/14(日) 07:03:24.49 ID:QEpJ0bQG
しらんがな
マジレス その本が クソ でいい。いや本当に 本だから正しいってことは無いから
if(str[i]==c) ってやってんだから、str[i]で取り出した時点でたぶんint型だろう。 それと比較するんだからcもint型にしてた方が良い。
どうせintに自動拡張されるんだろ
>>174 ,
>>178 C言語では関数引数のcharはintに昇格されるから
getchar云々のレスは何か勘違いしてるから無視していい
まずはC言語の基礎を勉強すべき
printf("%d\n", sizeof('a')); // C言語では4(intが4byteの場合)になる。
//なおC++だと1になる
単にC言語の‘a’がint型だから。 それ以上でも以下でもない
>>174 >int型に引き渡しても問題ないという感覚ですか?
理由が3つ。
一つはその通りです。
二つ目は、C標準関数にはcharの代替でintを用いる関数があるため
それに合わせたと考えられます。
すべてのchar値に加えEOFなど特別な値も表現させるためです。
三つ目は、printfなどの可変個引数の関数に渡す際には
自動的にintに変換されて渡されるため
それに何となく合わせたのだと思われます。
しかしここで少し問題があります。
charが符号付きの処理系ではそのままintに変換すると
C標準ライブラリでの文字のint表現と互換のない表現になります。
例えば
char ch = (char)'\xFF'; //0b1111'1111(マイナス1)
はintにすると
~0 // 0b11111'1111'…1'11111'1111(マイナス1)
になりますが、これはfgetcなどの表現0x000000FF(255)と違うのです。
これはstr_char内部でstr[i]==cを評価する際のstr[i]に合わせたものですが、
あまり使われる表現ではありません。
まあ間違いではないと思います。
まあ、若いうちはintやcharやそういうのが気になるんだな。 いつか、そんなのは気にならなくなるよ。動けばいいんだよ。
>C言語では関数引数のcharはintに昇格されるから 以前もこういうこという人いたよな ソース出せといわれて出せなかったけど ISO/IEC 9899:2011の6.5.2.2読んでから出直した方がいい
194 :
174 :2014/12/14(日) 08:48:21.05 ID:l0UGMelp
>>183 一文字の文字コードをint型変数cに格納 かな
自分が何が分かってないのかが分からないところが独学の怖いところですね
それを自分で発見しないといけないからやっかいで・・・
>>186 分かりましたw
>>189 自分の理解だと・・
'a' は「文字定数」といい、「char型ではなく」 「int型である」
よってsizeofの引数に 'a' を指定すると、そもそもchar型ではなく
int型が引数に指定されるということになる。
つまりsizeof関数によってint型に昇格したのではなく
そもそも元からint型である
aはchar型だが、'a' はint型である
と必死に書いていたら、すでに簡潔に書いてくれていました
>>190 >>191 なるほどです。
一応意味はあるだけど突き詰めていくとグレーの部分に触ってしまうとも言えるのですね
なんかスッキリしました
たぶんこの辺はもっと学習が進めば分かっていくと思うのでがんばります
>>192 はいw
charは1バイトの整数なんだから、文字型って読んでるだけで文字でも何でもねえんだよ
>>193 ISO/IEC 9899:2011 6.5.2.2 p6
If the expression that denotes the called function has a type that does not include a
prototype, the integer promotions are performed on each argument,
プロトタイプ宣言ではない表現であれば、すべての引数について整数格上げが実施される
ISO/IEC 9899:2011 6.3.1.1
If an int can represent all values of the original type, the value is converted to an int;
otherwise, it is converted to an unsigned int. These are called the integer
promotions.
整数格上げの定義
>>193 どこ読んでんだ?
それってプロトタイプに型が宣言されてないprintfみたいな関数は整数は格上げされるしfloatはdoubleにされるって話じゃねーの?
そもそもsize_ofは関数じゃないから発端の
>>189 はどう考えてもおかしいんだけど。
>>196 それはプロトタイプが無い場合って書いてあるだろう。
その直後にはプロトタイプが有っても可変個引数の場合の記述もある。
プロトタイプが有って可変個引数じゃない場合は段落7の通り
f(const volatile char p1); に対して char p1 = 実引数;
を実行したかのようにcharに変換される。
If the expression that denotes the called function has a type that does include a prototype,
the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters,
taking the type of each parameter to be the unqualified version of its declared type
↑ 最後に「declared type」って書いてあるだろう?
>>189 どうでもよいけれど
× printf("%d\n", sizeof('a')); // 未定義動作
○ printf("%zu\n", sizeof('a'));
%z規格は最近だから使えるかが問題だな キャストが安全 ビッグエンディアンじゃなければ%dでも範囲内ならたぶん大丈夫
AIXとかSolarisはこのスレに来ないでください。 あと複数のsize_t引数を%dで受け取ると読みとり位置がずれる糞処理系も。
printf("%d\n", (int)sizeof('a')); これで環境非依存
符号ビット部の情報欠損してんじゃん
脊髄反射だった、欠損じゃないや、データビットから符号ビットになってしまうじゃん、って事
>>204 別にその程度だったら実用上問題なくね?
【制限】「sizeof(type)」が32767を超える処理系では使わないでください 例: struct s {char x[1024LL*1024*1024*2]}; printf("%d", (int)sizeof(struct s));//oops...
そんなにでかいのスタックやヒープで取っちゃダメww 低レベルAPIよべえええ
2ギガぐらいヒープに確保させてよ 器の小さい男だな
低レベルAPIはどこに確保してると思ってるのかな?w
VirutaAllocみたいなん使えってことだな
ヒープに確保してんじゃんw
ところでcharが1バイト8ビットというのは、今後、 永久に変わらない保証はあるのか?
お前、永久に生きるつもりなのか?
>>212 ない。
と言うか、まず1バイト=8ビットと言うのが環境依存。
バイト、と言う用語自体が8ビット単位だとは規定されてなくて
あくまで大手が採用した8ビットをよく使ってるだけだからな。
9ビットとか7ビットとかの環境も実在してたらしい。
RFCみてると、byte という単位はあいまいなので あえて octet として 8ビットで1まとまりの集合 と表現してるケースがあるけど それを取り扱えるC/C++上での型は生き残って欲しいね
>>215 > 9ビットとか7ビットとかの環境も実在してたらしい。
8以上でないとダメなので、9 はいいけど 7 はダメよ〜ダメダメ
>>218 あそっか、Cの仕様としては8以上だっけ
実際問題1バイトを7bitとか9bitにしてもメリット無いから
>>218 >8以上でないとダメなので、9 はいいけど 7 はダメよ〜ダメダメ
そうなのか。君は博識だな。感心した。
しかし、
8以上でないとダメなので、9 はいいけど 7 はダメ
みたいな曖昧さを残しているから混乱のもとでは無いのかな。
この際、『charは永久に8ビットです。』みたいに長嶋監督みたいに
言いきれば良いのに。そしたら、混乱は無くなる。
ついでにshortは2バイト、intは4バイト、longは8バイトと決めてしまえよ
と言いたい。
218、おまえ頑張ってCの規格決める委員になってやってくれ!
組み込み用16bitCPU辺りを使っているときに、intが4バイトを強制されるのは鬱陶しい。 4バイト極め打ちが欲しければint32_tを使え。
もしshortは2バイト、intは4バイト、longは8バイトになったら 16バイト整数は何て呼ぶのがいいかな。そんな整数使わないか?
最初にlong型を定めた環境では8バイト整数だったけど8バイト整数扱えないチープな環境でハイエンドマシン用に開発されたlong多用のソースコードを手直し無しでコンパイルできて満足な速度で実行したいという要望に応えるためにint型と同等にするコンパイラが相次いだ もはやlongがintのシノニムになってる環境が多かったのでそれより大きな整数型を定めるとき新たにlong longが型を作った
>long long なんて安易な名前付けた奴を10時間くらい説教したいわ。
>>221 > ついでにshortは2バイト、intは4バイト、longは8バイトと決めてしまえよ
> と言いたい。
> 218、おまえ頑張ってCの規格決める委員になってやってくれ!
言いたいお前がやれよ...
規格に int8_t int16_t int32_t int64_t あるだろ。 それ使えよ
だってそれ実装必須じゃないんだもん
>>227 本当かい?
良い事を聞いた。ありがとう。2014年に得た知識の中で最高の情報だ。
うそん charは8ビットって憲法に書いてるとおもた
>>218 >8以上でないとダメなので
ソースは?
>>221 個人的には
char : 8bits
short : 32 bits
int: 64 bits
long: 128 bits
long long : んなもの作るな
intX_t : 必須にしろ
5.2.4.2.1 整数型の大きさ<limits.h> 次に列挙する値は, #if 前処理処理指令の中で使用するために適した定数式に置き換えられなければならない。 さらに, CHAR_BIT 及び MB_LEN_MAX に対する値を除き, これらの値は, 対応する型のオブジェクトだけからなる式が整数拡張に従って変換された場合の型と同じ型を持つ式に置き換えなければならない。 これらの処理系定義の値は, それぞれの項目の右に示してある値と同じ符号をもち, その値以上の大きさ (絶対値) をもたなければならない。 ビットフィールドでない最小のオブジェクト (バイト) におけるビット数 CHAR_BIT 8
今一番使われてる文字エンコーディングのUTF-8やUTF-16を1バイトが8bit以外の環境で扱う事を考えるとそんな物が普及するとは思えない
#ifdef _DEBUG printf("デバッグ i=%d\n", i); #endif みたいなのを沢山入れると見づらいので、一行でスッキリ書く方法ありますか? printfに限定すれば自作出来そうなのですが、 printfの部分が他の関数の場合でも使える上手い方法教えて下さい。
>>236 linux kernelのpr_debugみたいなの?
#ifdef _DEBUG #define _DEBUG_ONLY(x) x #else #define _DEBUG_ONLY(x) #endif _DEBUG_ONLY(printf("デバッグ i=%d\n", i));
>>238 ありがとうございます。片山先生に教えていただけるとは光栄です。
早速使わせていただきます。
_DEBUG_ONLY(x)は長いのでD(x)にしました。
fprintf(stderr, __VA_ARGS__) じゃないの
void main() { _tsetlocale(LC_ALL, _T("")); wstring str1 = L"abc"; wstring str2 = L"abcdefg"; wstring str3 = L"ABC"; wstring format = L": %20.15lf, %d\n"; wprintf((str1 + wstring(10 - str1.size(), ' ') + format).c_str(), 12.345, str1.size()); wprintf((str2 + wstring(10 - str2.size(), ' ') + format).c_str(), 12.345, str2.size()); wprintf((str3 + wstring(10 - str3.size(), ' ') + format).c_str(), 12.345, str3.size()); } VS2013で出力の ":" の位置を揃えたいので上のようなのを試したのですが、文字列の中に全角文字があると ずれてしまいます。どうすれば良いでしょうか?
なんで%-10sを使わないんだ? それはさて、どの途プロポーショナルフォントなら揃わないだろ。
>>244 >なんで%-10sを使わないんだ?
そうですね、それでも良いのですが、兎に角、位置を揃える方法ありますか?
どんなに変な方法でも構いません。
想定している端末上での全ての文字について 表示幅を配列にでも格納しておき、それを使って計算する。
表示はVSのコンソールウインドウです。 あるいはファイルに出力する場合もあります。 使うフォントはMSゴシックです。 この前提で、何か良い方法ありますか?
.size() の所だけマルチバイトに変換して呼び出すくらいかな〜
>>248 string使えば揃う
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string str1 = "abc";
string str2 = "abcdef";
string str3 = "ABC";
printf("%-20s:%20.15f,%d\n", str1.c_str(), 12.345, str1.size());
printf("%-20s:%20.15f,%d\n", str2.c_str(), 12.345, str2.size());
printf("%-20s:%20.15f,%d\n", str3.c_str(), 12.345, str3.size());
}
/*
abc : 12.345000000000001,3
abcdef : 12.345000000000001,6
ABC : 12.345000000000001,6
*/
>>249 >>250 レスありがとうございました。
wstringでやりたいのですが、無理そうですね。
そもそも一文字が同じ幅って原則がないのに無理だろ。
>>251 前提から、全角文字の表示幅が半角文字の環境なんだから
表示したい文字列の一つ一つの文字種を調べて、全角なら半角2文字文として表示幅を計算すればいい
stringで揃ったのは全角が2バイトだからだけど、とても環境依存だから要注意
>>254 ありがとうございました。いい感じで行けました。感謝です。
ビット演算はよく分らないので普段あまり使わないのですが
size += (ch & ~0xFF) == 0 ? 1 : 2; // オリジナル
size += (ch <=255) ? 1 : 2;
こんなのでも問題ないでしょうか?いちおう同じ動作のようなのですが。
>>255 chが負数のとき動作が変わるけど、ほぼ大丈夫だと思う
windowsのwchar_tはunsignedみたいだし
258 :
254 :2014/12/18(木) 14:45:54.46 ID:Mboq20NA
>>257 存在を忘れていたすまぬ
size += (ch<127 || (0xFF61<=ch && ch<=0xFF9F)) ?
1 : 2;
ギリシャ文字はどっちなんだ?
アルファベット以外のラテン文字もあるよな
いえ、MS ゴシックにそんなものはありません
ちょっと変な事質問しますけれど、エディタで編集しているときに 新しい関数など追加する時、ファイルの末尾に追加しますか? 先頭に追加しますか?私は基本的には先頭に追加しています。 不可意味はありませんが。
X 不可意味 ○ 深い意味
先頭に追加するタイプの人は、ひとつの関数に対して プロトタイプと実装の不整合が起きるのを嫌う人が多いように思う 俺もそう思って先頭に書くことが多い 後ろに追加するタイプの人は、それは揃いで修正するものだし そもそもヘッダ書くときは自然とそうなるじゃんって考えるのかもな …でも、別ファイルの場合は、ファイル毎にカーソル位置が維持されてるけど 同一ファイルだと画面分割やジャンプマーカー、 IDEの定義ジャンプ使うとかになるから微妙に感じが違うんだよなあ
途中に挿入することも普通にあるわ 前後に関連する関数が並んでた方が都合良い場合
局所的なら関数オブジェクトや構造体作ってそこに静的関数書いてしまう
局所的なら無名名前空間に書いちゃうな。
関数内限定ならstd::functionでローカル関数にしちゃうな
先頭に追加するタイプの人は馬鹿
後ろに追加するタイプの人も馬鹿
意味を理解できず形式でのパターン認識しかできないアスペ
意味を考えて関連する関数の隣に追加する
>>265 が正解
宣言順に合うように定義する
↑どうしようもないアスペ
基本的には関連を並べるとして 末尾のほうがdiff失敗しにくい気がするからそうしてる
起動時初期化関係 プログラム起動中の処理 さらにその初期化・動作部・後始末 終了時後始末関係 って感じでやってるわ
俺は初期化と始末は近くに置く その方が対象になってて読みやすいし、その2つは大概セットで弄るから近いほうがいい
なんでコンパイルエラーこんなにわかりにくいのん
コンパイラさんの気持ちになればわかるよ
関連する関数はひとまとめにして宣言するから宣言順の定義はありだろ 何も考えずに適当に定義する奴が一番うざい 複数人で編集してそれぞれが別々のポリシーだと更につらい…
>>276 最近のコンパイラさんは親切
CLANGのprintfの書式までみたエラー報告を観て、乗り換えることに決めたし
279 :
デフォルトの名無しさん :2014/12/20(土) 13:30:45.46 ID:e+FqSQyU
>コンパイラさんの気持ち こんな糞コード書きやがってボケが
280 :
デフォルトの名無しさん :2014/12/20(土) 13:33:30.15 ID:e+FqSQyU
隠しオプションでコンパイラが文句言うのも楽しいかと。 初期化してねーよ。 ほんとに代入文でいいのか。 returnがねーんだよ。 何回 エラー出すんだよ やめちまえ
>ほんとに代入文でいいのか if文とかでよくお世話になてますgccさま
なんじゃその 0x81 な文字は 全角スペースになってた
enum classというのを知ったのですが、これはclassと言う名前が付いています けれどメンバ関数やメンバ変数を持つ事は出来ますか?
ええ
そんな誰も使わないようなのは忘れてしまいなさい
>>285 >>286 使えるんですか?本当ですか?
toString()みたいなメソッドを追加してenumの要素の名前を
文字列化することが出来ないかなあと思ったのですが、、、
出来ますか?
delete this; っていいの? struct Koo { void del() { delete this; } }; Koo koo; koo.del(); なんて合法ですか?
newしたのなら問題ない
それ一番最初みたのはCOMのIUnknown実装だったな
警告とエラーの区別がついていない奴が居るな
ご相談に乗っていただきたいです
現在OpenCV2.4.10とDxLibを併用して使っているのですが、findContoursメソッドを使用すると
ヒープが壊れたというランタイムエラーが発生してしまいます
どうにか回避方法を教えていただきたいです
↓ソースです
http://codepad.org/hS14MmrI 環境はWindows vista(32bit) visual studio 2010
>>294 一応ひと通り検索して上記のサイトの通りcv::Matでも試してみましたが同じエラーでした
>>287 enum class Word {FUCK, SHIT};
std::string ToStr(Word word)
{
switch (word)
{
case Word::FUCK: return "FUCK";
case Word::SHIT: return "SHIT";
}
}
for(int i=0;i<1000;i++) { ... // 処理 } みたいなループの処理の中で、例えばi=200のときに原因不明のエラーが 発生するのでデバッガのブレークポイント●置きたい時に if(i==200) ● int aaa = 777; みたいに適当な文を入れてブレークポイント●で止めているのですが、上級者の方は どのようにされているのでしょうか?
条件付ブレークポイントを設定すれば?
>>289 合法、但しdelete thisより後には自身のメンバを参照したり設定したりといったことはせずに抜けること
戻り値などに必要なら、ローカル変数などに予め計算し退避してからdelete this、退避した値をすぐ返して抜ける感じ
>>297 C/C++の話じゃなくてIDEの話やな
>>298 ありがとうございました。こんな便利な機能があったとは。
下記のようなプログラムはメモリリークを起こすでしょうか? また、メモリリークを起こすかどうか調べる方法はありますか? struct STest0 { char* p; STest0 () { p = new char[1000]; } ~STest0 () { delete[] p; } }; struct STest1 { STest0* p; STest1 () { p = new STest0[1000]; } ~STest1 () { delete[] p; } }; int main(void) { STest1* p; p = new STest1; delete p; return 0; }
しないよ メモリリークを調べるにはIDEの用意した機能を使うか よくやるのはplacement newを使って確保したメモリを全部しらべるか
>>302 単にそれだけなら問題ないが生ポインタを直接使うとリークと二重解放の危険がある
{
Stest0 a,b;
a = b; //aのポインタはリーク
} //a,bともに同じポインタをdeleteして未定義動作
boost.optional使っとけ
>>303 無能は黙ってろ
いや、下記のようなプログラムと名打ってるんだから、 (そのmain処理の場合は)メモリーリークは起こらないよ(、ただし、常に起こらないとは限らない)、が正しい
君もアスペかな?単にそれだけなら問題ないと断ってるんだけどな
>>307 生ポインタを直接使う危険な書き方について初心者にお墨付きを与えるような回答をしたから。
君のアスペの典型例のような回答によってまた世の中に信頼性の低いゴミプログラムが量産されることなる。
あとplacement newじゃなくてnewのオーバーロードだろ君か言いたいのは
> 生ポインタを直接使う危険な
あのさあ…
>>307 そいつのことはほっとこう。
newはオーバーロードだったかな、訂正します もちろん上のコードを見た時は色々言いたいことがあったけど 掲示板上で相手の姿を勝手に想像して余計なことを言うよりはマシだと思ったので 聞かれたこと以上のことは言わなかったよ
>>309 すくなくともクラスのメンバに生ポインタを持たせるときは
コピーコンストラクタと代入演算子を定義するべきだとアドバイスするべきだと思うんだ
312 :
デフォルトの名無しさん :2014/12/21(日) 12:11:30.00 ID:HpxqpUIE
スマポ信者ウザいぞ 布教活動なら駅前でやれ
>>308 現在はオブジェクトの配置を操作する場合に限らず全部ひっくるめて placement new と
呼ぶのが普通だろう。
今気づいたけどoptionalって配列扱えないよね。すまん。
配列ならvectorで十分よね
会話が噛み合ってないぞ A.配置を目的としたもの B.配置を目的としないけどnew(引数※1) 型(※2)の※1を伴うもの C.new演算子のオーバーロード全般 Cを含むかどうかはっきりさせろ。 ちなみにISO/IEC 14882:2011でA Bを配置と読んでいる
もし
>>308 が否定した placement new が最初からBを指していたのだとしたらおかしな話だ。
実際、Bの placement new でリークチェックを行う環境はあるわけだし。
皆aについて話をしていたのに
>>313 が違う話をしだした。
>>313 の内容自体は正しくて
それまでの話とも矛盾はしてないのに
それまでの話を否定をしているかの様な言い回しだったため
混乱を招いた
>>303 すまんが placement new はすでに確保してある領域に対してコンストラクタを走らせる **だけ** の機能なので、
領域確保と解放の整合性に使えるとは思えないが、どうしてそんなものを思いつくのか?
C で malloc()/free() をラップするように、C++ では延々と new をオーバーロードするのが、回り道のようにみえて手っ取り早い
Wikipediaには 「配置new (プレースメントnew, placement new)は、new演算子からnew演算子関数へ引数を与えられる機能である。 当初、インスタンスを特定のメモリアドレスに「配置」するための機能ということで配置newと命名された。 後に配置に限らず様々な使い道に応用できることが明らかとなったものの、今でも慣習的に配置newと呼ばれる。」 とか書いてあるが、初めて聞いたぞこんなの。
>>318 ところで、配置newではないnewのオーバーロードってどういうものを言うんだろう?
327 :
318 :2014/12/22(月) 09:34:43.95 ID:UkKFD8pd
>>325 メモリリーク検出とあったので
struct STest0 {
void * operation new (std::size_t s) {
…//ログhere
return ::operator new (s);
}
};
のシリーズのつもりで書いた
これをオーバーロードと呼ぶかどうかは確認せずに掻いた
まぁ「無能は黙ってろ」とか言うやつは叩かれても仕方が無いな 人のふり見て我がふり直せだな
>>327 ::operator new 自体をラップして delete と対にしたいところだ
>>329 >>327 は省略してるだけで、当然、対応する operator delete も定義するんだと思うが。
このうえさらにグローバルな ::operator new をラップするのって何か役立つのかね?
というかそれ以前に、どこでラップするんだろう。
>>330 デバッグ時限定で、delete 忘れがないか、あるいは二重に delete していないか、チェックしたいところだが
そういうときに ::operator new や ::operator delete あるいは ::operator new[], ::operator delete[] をオーバーライドして、これらのチェックをコードで確かめておくのはよくあることだと思うけれども
>>331 delete直前でassert p != NULL
delete直後にp = NULLじゃあかんの?
アドレスをダンプしておいてどこで確保されさものか分けるようにするとかの発想は無いのか
>>330-333 そんなごちゃごちゃしなくてもスマートポインタ・標準コンテナ使えば大方解決する問題じゃないの?
>>331 それは
>>327 でもできるんじゃないの?というかそのための
>>327 でしょ。
そのかわりに ::operator new でやるというのはあるだろうけど、それぞれ得失はあるよね。
::operator new を置き換えたら元の ::operator new は使えないから、メモリ管理全部自前で
実装しなきゃならないんじゃなかったかな?
<まとめ> 生ポでメモリリーク検出したい ↓ 配置newでおk ↓ 配置newは関係ないだろ ↓ オーバーロードの間違いでした。例えば>327 ↓ グローバルnew使うのがフツー ↓ クラスメンバーのnewでいいだろ ↓ スマポ使えば? ←アスペ
プレースメントnew結構つかうな 普段はnewするだけのクラスで、そのオブジェクトを管理するオブジェクトの削除時に一気に全削除するようなとき VirtualAllocで十分なメモリ空間リザーブして必要に応じてコミット拡張、実際の解放はdeleteでやらずVirtualFreeで全領域リリースとか
>>335 >メモリ管理全部自前で実装しなきゃならないんじゃなかったかな?
まあ、そういうことだが、そんなに大変じゃない‥
>>338 そのような用途のために
std::vector<T, ★>
コイツがあるんじゃないの
>>337 生ポでメモリリーク検出したい に スマポ使えば?
これ、日本のマなら普通だろう。
コミュ能力なくて他の仕事に就けない奴でもマには普通になれるし
要件は「メモリリークを検出したい」であって「メモリリークを防ぎたい」じゃないでしょ
visualstudio使えば簡単に検出してくれる だがや
>>341 コミュ能力 ないの?
生ポのメモリリークから始まって、new演算子オーバーロードによる
フック的な使い方の実現方法の話になっていた矢先に
>>334 がスマポとか言い出したから
>>336 が「流れ無視?」と言ったんだよ。
>>341 に無いのはコミュ能力じゃなくて、
初歩的なところの理解力だと思うがw
ライブラリを探していますが,ここで聞いても良いですか?
釣りはいりません スマホとPCでIPと文体変えて 自作自演するんだろ?
struct A {virtual void test() {}} struct B : public A {virtual void test() {}} struct C : public B {virtual void test() {}} みたいな関係の三つのクラスを定義して A *a = new C;a->test();するとき、 BやCのtestにvirtualつけるか否かって意味ないですよね? 今確かめたらそうなってました。 Bでvirtual外すと、Cでオーバーライドできない、 なんてことがあった時代がありますか?(←質問) おぼろげながら、十数年前はそういう理解だったのですが、 それは当時も俺が勝手に勘違いしてただけでしょうか。
いいえ
>なんてことがあった時代がありますか? ありません。 今は struct C : public B {virtual void test() override {}}; としておくのが良いでしょう。
>>349-350 さっそくありがとうございます!
すっきりしました。overrideキーワードについても早速ぐぐりました。
finalも
353 :
片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 21:23:08.86 ID:gEw73of1
template <typename T_CONTAINER> site_t total_size(const T_CONTAINER& c) { return c.size()*sizeof(T_CONTAINER::value_type); } template <typename T_VALUE, size_t t_siz> size_t total_size(const T_VALUE (&)[t_siz]) { return t_siz*sizeof(T_VALUE); } どや?
キチガイ警報発令中 会話のできないコミュ障は無視してください
いちおう説明しとくと、これらは、 コンテナの実データサイズを求めるテンプレート関数、 並びに配列の実データサイズを求めるテンプレート関数である。
t_sizが小文字なのが気持ち悪い。 ついでに言うと、中途半端な略語も気持ち悪い。 typename T_VALUE, size_t T_SIZE>でいいだろうに。
意味不明な断片コードを投下して 後から 一 応 説明とか スレ荒らすなボケ
お前なに欠番に向かって喋ってんだよ
UTF8と16の相互変換て何か定石ありますかね?
ある
>>359 1.仕様通り一旦コードポイント値を経由して変換
2.UTF16のサロゲートペアをくっつけて本来の範囲外の値になったら
セキュリティ攻撃の可能性あり
以上
codecvtを使う
>>360-362 ありがとうございます
今結局自力でゴリゴリ書き始めてしまったので
後ほどレビューなどお願いするかもです
UTF-8でも同じ値でも一番短く表現できるものより長く表現されてるものは攻撃の可能性あり。
using namespace std; int add(int a, int b, int c) { return a + b + c; } int main() { // 第1引数のみを先に渡す using namespace std::placeholders; std::function<int(int, int)> f = std::bind(add, 2, 3,_1); // 残りの引数を渡して関数を呼び出す const int result = f(4); std::cout << result << std::endl; } ってなんで怒られるんですか?
std::function<int (int)> じゃね?
bindって何のために存在してるの? function<int (int)> f = [](int p3){return add(2,3,p3);}; って書けばいいのに
bindの方がすっきりする場面があるから
jsのprototypeのオブジェクト指向を廃止して classの指向オブジェクト指向を強制
>>367 それっぽさを演出できるから。
あるいは計算機とエンドユーザーへの責任を度外視して、
プログラマー to プログラマーへの視野狭窄に導けることにうま味が在るから。
それっぽさ、とバッサリ表現した感性は評価したい
>>370 bindの対象はパラダイムだったのか…
そもそもbindってなんだかよく分かってない C++版クロージャ?
引数を束縛する関数オブジェクト
>>373 クロージャだけど、
多変数関数の変数をその場の環境の変数を取り込んで
変数の数を減らすことに特化した関数です。
std::mem_funとstd::mem_fnってどう違うんですか?
>>379 mem_fun : 引数無しで呼び出す関数オブジェクトを作成。
使い物にならずC++17で無くなる予定。
mem_fn : 引数ありも対応した関数オブジェクトを作成。
>>380 分かりやすい説明ありがとうございます。
関数の引数で質問なのですが、 void func(int *x){} (1) void func(int x[]){} (2) って、厳密に同じなのかどうか知らないのですが、同じように動きますよね。 じゃあ、const を付けて void func(int const *const x){} とすると、これに相当する(2)はどう書けば良いのでしょうか?
>>382 厳密に同じです。
(2)は書けません。
>>383 レスありがとうございました。
厳密に同じですか。すっきりしました。
>>384 失礼、スレを間違えた。
C++では指定できませぬ。Cなら
void func(int const x[const]);
クラス内の2つの関数がテキストファイルにログを出力するようになってて プロジェクトによって出力内容が少し変わるような場合ってどうしてる? そのクラスは機能毎に分けられてる小さなクラスで 将来プロジェクトAとBに使用された場合ログ出力部分だけが プロジェクトAとBで違う動作になる感じ
void test(){ //なんやかんや時間のかかる処理 } マルチスレッド、マルチコア処理で記述していなかったら testの実行を開始したプロセッサと、実行中のプロセッサと終了時のプロセッサは必ず同じなのですか?
>>389 同じとは限りません。
タスクマネージャーなどから特定のプロセッサのみで実行するよう変更出来ます。
しかし通常のプログラムはどのプロセッサで実行されているか意識する必要はありません。
test()を開始したときプロセッサ0で スケジューラによってプロセッサが奪取されて、プロセッサ0は別プロセスの別スレッドに割り当てられたとして そのとき、プロセッサ1は暇だとしたら testの実行はプロセッサ0が空くのを待つのか、プロセッサ1で実行されるのかを知りたいです。
0で実行されるかもしれないし1で実行されるかもしれない またまた3で実行されるかもしれない
0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね 0を待つか、他の空きを使用するかと質問しているのですが。
お前のOSでは二つのプロセスしか動いていないのか?
はい、そうです。 もういいや、あなた方では答えれない内容なんでしたねw
なんだ。釣りか。
タワーディフェンスかな
>0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね んなこたーない。 >0を待つか、他の空きを使用するか オペレーティングシステムの気分次第。 だが明示的にアフィニティーを指定しない限り 変わったところを見たことがない
>>386 その少し違う設定変更をする関数を作るんでは?
log::configure(プロジェクトA);
>>398 >>0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね
>んなこたーない。
となると、1つのプロセッサが同時に別のコードを実行していることが可能になりますね
他プロセスがそのプロセッサを奪取されない限り、他のコードが実行できるとは思えませんが。
>>400 「アフイニティ」というキーワード教えてもらっただろ。
調べてから出直せ。
>>400 「アフィニティ」というキーワード教えてもらっただろ。
調べてから出直せ。
>>386 > 将来プロジェクトAとBに使用された場合ログ出力部分だけが
> プロジェクトAとBで違う動作になる感じ
出力ルーチンをプロジェクト毎に持ちたいだけなら、派生させて出力ルーチンをオーバーライドすればいいと思う
>>400 「プリエンプション」を調べて出直せ。
調べるまでもう来るな。
> 将来プロジェクトAとBに使用された場合ログ出力部分だけが これだけならprintf、boost::formatなんかのフォーマット部分、streamならプロダクトごとに違う文字列をマクロにするだけでいいような気がする
マクロ=バカ発見器
ほんと馬鹿ばっかだな
↑一番の馬鹿
中二病患者なんてほっとけよ…
中二病でもCがしたい 例:「JAVA? フッ俺らCだから。コンピューターの基礎だぜ」
C++でネット接続を確認する方法はありますか? オンラインゲーム(三人以上)を作ろうとしているのですが、サーバーマシンが用意できそうにないので 参加者同士でネットワークを形成するデザインにしようと思っています。 しかし、お互いの接続を確認するだけだと、自分がネットから切断された状況とほかの参加者が全員同時に切断された状況の区別がつきません。 Googleなど、インターネットにつながっていればまず繋がるサイトにリクエストを出してみる方法も考えましたが、あまりスマートとは思えません(外部から切断されたLAN接続にも対応できませんし)。 ネットワークトポロジーをフルコネクトでなくスター型にするれば参加者の切断を検知することは容易ですが、ハブが切断した時の対応を考えると無理がありそうです。 (ゲームが中断しないようにほかの参加者をハブに立てようとすると結局全員の接続を確認する必要があるため、フルコネクトと同様の問題が起こる) かなりワガママな話ですがうまい方法はないでしょうか……。 開発環境はWin8.1、VC++ 動作環境は極力広くお願いします
なぜその区別をしたいのか、もう少し掘り下げて考えてみることだな。
ブラウザ起動してユーザーにネットにつながってるか聞けば分かるよ
>>412 ネトゲーは知りませぬが遠隔地クラスタリングでは
「自分を含めて過半数と通信できるグループ(ノードマジョティー)はただ一つ」
と言う考え方があります。
全員が孤立した場合は全てのノードがノードマジョティーでなくなりますが
これは致し方ない。
切断されたら最下位としたいので、切断されたほうから見ると最下位、切断した方から見ると一位と矛盾が起きてしまうからです。 切断したら無効試合とすれば矛盾は起きませんが、自分に都合の悪い戦局となった時にLANを切断するチートまがいができてしまいます。
P2Pじゃ無理だあきらめろ
明らかに設計とやりたいことが噛み合ってない サーバなしでランキングなんかできん
>>415 ノードマジョリティーのことですか? 調べてみましたがよくわかりませんでした。。。
もう少し詳しくお願いできますか?
よく考えたらLAN対戦でルーターに障害が起きた場合はどれが切断したとは言えないですね。
LAN対戦とネット経由での対戦で別のモードにしますか。。。
LAN対戦はおそらく知り合いに(少なくとも近場に)対戦相手がいることになるのでペナルティーは勝手にやってもらうとして、
インターネットを経由した遠距離での対戦の場合のみ障害判定をするとします。
つまりインターネットにつながっているかどうかのみわかればよさそうです。
そうすると
>>414 さんの方法も条件には合いそうですね。あまりスマートとは思えませんが。。
要点がまとまっていなくてすみません。。。
LAN切断だけじゃなくて相手の接続だけ切った場合はどうなるんだ? 自分はネットに繋がってるから相手が切ったように見せかけられるだろ?
>>418 全プレイヤーのランキングではなく、小規模な対戦の中での順位づけです。
あとサーバーがないといっても自由にプログラムを動かすことができるようなサーバーがないだけで
レンタルサーバーでCGIを動かすぐらいはできます。まあそうするとなおのことチート対策は万全にする必要がありますが
うまく伝わってないようなので構想段階ですがやりたいことを晒します。
まとまってないのでわからないところ、無理そうなところがあったらバンバン言ってください。
最終的にやりたいことは、対戦リストやIPアドレスから対戦相手を指定して行う小規模(多くみても20人程度)のオンライン対戦ゲームです。
ポイント制にして対戦の報酬として受け取ったポイントで対戦に参加したりレベルアップしたりします。
構造としてはこのブラウザゲームに似ています→
http://kyucon.com/tank/ 対戦リストはCGIで書き込まれたネット上のファイルから取得します。
試合を立ち上げた人がゲームからCGIを経由してネット上にIPや人数上限などを書き込み、
その情報から対戦リストを表示して、他のプレイヤーがアクセスします。
対戦が終わると、順位に応じたポイントが手に入ります。
切断すると順位は最下位扱いとなり、ポイントは最下位相当の分しかもらえません。 ネットを通じては、毎フレームごとに入力情報、数フレームごとに座標情報(近距離にいるプレイヤーほど高頻度で通信)、送信された時だけチャットデータ、同じく発生したときのみ退室連絡(あと必要なら切断情報も)です
そんな細かいことより先に完成品を作ることが先じゃないか
>>424 そう。。かもしれませんね。
出直してきます。
ネット碁でも形勢が動かせないほどはっきりするとブチンとやるやつがいたりするしね まあ囲碁なら時間が切れて勝つことになるけれども ゲームルールの方で対処してはいかが?
427 :
デフォルトの名無しさん :2014/12/31(水) 14:19:33.15 ID:oAGy3gWf
サーバーなしで接続判定するのは難しいのでは。対等でなく長くつないだ実績のあるところに判定させるとかは。
bitcoin式に幾人かの監視者第三者を用意すればいい。 報酬は対局中の発声権(チャットの文字数)とか本筋に作用していいなら消費型の運パラとか
429 :
デフォルトの名無しさん :2014/12/31(水) 14:45:55.07 ID:oAGy3gWf
bitcoin式でも送受信のバグをつかれてマウントゴックスは潰れたが。 上手いこと運営側で対処したら出来たようだが。 当初から知られてたセキュリティ・ホールだったようだが。
430 :
デフォルトの名無しさん :2014/12/31(水) 15:00:49.66 ID:oAGy3gWf
ビットコインの送金に失敗したか成功したかわからなくさせる攻撃だったはずだが名称忘れた。 ビットコイン本体で改善されたか調べようとしたがわからん。 マウントゴックスは、顧客から送信に失敗したので再送して下さいという シグナルが出ると自動で再送して、何度も送金してたのに放置してたらしい。
431 :
デフォルトの名無しさん :2014/12/31(水) 15:00:55.10 ID:oy55ZnpW
が。 が。 が。
432 :
デフォルトの名無しさん :2014/12/31(水) 15:41:44.30 ID:oAGy3gWf
433 :
デフォルトの名無しさん :2014/12/31(水) 17:17:57.18 ID:sgzK7Ywh
ぬるぽ
だがだがだが
ポインタへの参照を返却するには? int*& foo() { static int bar; return &bar; } ではなぜダメなの?
アドレスを格納した参照先がないからだよ
>>435 そりゃ参照先の変数を確保してないからね。
int *& foo()
{
static int bar;
static int * p_int = &bar;
return p_int;
}
でもやりたかったのは
int *foo() {
static int bar;
return &bar;
}
int &foo() {
static int bar;
return bar;
}
じゃないのか?
>>437 ご丁寧に解説して頂いて、ありがとうございます。
wstring 文字列を unsigned char配列に変換したいのですが、ググッても良く分りません。 お勧めの変換方法を教えて下さい。
>>439 L"あいう"
これをunsigned char[] にしたときに
どのような結果を期待しているのか述べたまへ
>>440 "あいう"
だと全部で6バイトだと思うので、その6バイトの値を
unsigned char[] 配列に入れたいのですが。
リトルエンディアンとかビッグエンディアンとか メモリ上のバイナリイメージそのままで良ければ、 unsigned char * でキャストするとか
l12バイトじゃないの?
終端の \0 も勘定にいれてあげて
>>445 終端の\0は必要ないので"あいう"の例なら、6バイトの配列に入れています。
Visual Studioで void func1(){ try{ func2(); }catch(...){ } } のようにしておけば、func2でどんな例外が起こっても、必ずcatchできますか? ちょっと試したらcatch出来ずに異常終了する場合があるのですが、何か設定など必要ですか?
>>447 > catch出来ずに異常終了する場合
ヌルポインターアクセスとかは捉えられないよ
捉えたいなら、構造化例外で
>>447 C++言語の規定の範囲内のことであればcatchできます
未定義動作のコードがあれば何が起きても文句は言えません。
Visual Studio ならば 構造化例外を C++例外に乗せる コンパイラオプションの設定があったような C++ の項かのう
try catchを __try { } __except(EXCEPTION_EXECUTE_HANDLER) { } に変えてみたら error C2712: オブジェクト アンワインディングが必要な関数内で __try を使用できません。 っていうのが出ます。エラーメッセージの意味が、ググッても良く分らないのですが、何ですかこれは?
構造化例外って、何だかいろんな制約が多くて、使い物にならないですね。 ダメだこんなの。
そんな分かり切ったこと今更言われても…
>447 >異常終了する場合があるのですが、何か設定など必要ですか 異常終了するのはバグが有るからです。 設定の問題じゃなくてバグを直してください。
stdライブラリで使われている &&ってなんですか? aaa(Function& f); なら Function func; aaa(func); でいいんでしょうけど、 aaa(Function&& f); ってどういう風に呼び出されるのを期待しているのでしょうか?
右辺値参照という aaa(Function&& f); Function bbb(); aaa(bbb()); っていう風に呼び出されるのを期待している bbb()の戻り値は一時オブジェクトなので通常の参照は取れないが右辺値参照は取れる ぶっちゃけムーブコンストラクタやムーブ代入演算子を実装するためのもの
>>456 質問を読めよ
『stdライブラリで使われている &&って』
>>457 456と別人だけど何を指摘したいのか解らんよ。
456の回答で違和感ない。
もっと具体的に言わないと伝わらないよ。
>stdライブラリで使われている &&ってなんですか? ↓ >通常の参照は取れないが右辺値参照は取れる >ムーブコンストラクタやムーブ代入演算子を実装するためのもの 通常の参照は取れるし、ムーブコンストラクターを実装するためのものでもない
>>459 通常の参照(lvalue reference)が取れるのはtemplate<typename Tp>void f(Tp&& v){}
こういう風に定義されてるときだけ(&&が無視されるから)だろ?
std::vectorのpush_backみたいなvoid f(T&& v){}
こういうのだとそっちで取れない
元の質問がC++11で追加されたvoid push_back(T&& value);みたいなのを言ってるなら456で正しい。例の渡し方おかしいし、moveコンストラクタやmove演算子を実装するものじゃなくてそれらを使用するためのものだけど。
あれ?つまり正しくない所の方が多いな。
461 :
456 :2015/01/02(金) 11:13:18.68 ID:hWXODlaZ
俺の書いたことが正しくないらしいということはわかったので、誰か代わりに正しい回答を書いてくれると助かる
>>461 > aaa(Function&& f);
ってあったら呼び方は
aaa(Function());
だろ?
もしくは
Function a;
aaa(std::move(a));
横からだけど 他の関数の戻り値を、変数に格納せずにダイレクトに他の関数の引数にした場合 ムーブしてくれるものだと勝手に思っていたが・・・
ユークリッド最大公約数再帰関数の int gcd(int a,int b){ if(a%b==0)return b; else gcd(b,a%b); } aとbの大小判定をしなくても a%bがaになり自動で入れ替わり正常に機能する理由が解らないです。 先頭に大小判定を入れたほうが正しいんでしょうか?
処理を一つ一つ追ってみるといいよ もし a < b だった時には、 a%b の値( a を b で割った余り)は a そのものになるから 再帰呼び出し gcd(b, a%b) の部分は実質的に gcd(b, a) になって 2段目に呼び出された gcd() の中では、a(元b) < b(元a) になる。 大小判定を入れても動作に問題は無いけど、せいぜい再帰の段数が1個減るぐらいで 入れても殆ど無意味だと思う・・・
× 2段目に呼び出された gcd() の中では、a(元b) < b(元a) になる。 ○ 2段目に呼び出された gcd() の中では、a(元b) > b(元a) になる。 だった。
ありがとうございます。 a<b時のa%bがaというのは仕様なんですね。
>>468 仕様というか算数ちゃうか…
a=2 b=3に当てはめてみなさい
割り算の余りだもの 仕様ではなく定義だな a < b ならば a は b で割れるはずもなく、全て余りになる という自明の話 (負の数の時の剰余取り扱いについては仕様になるだろうが)
>>461 あっているよ
Function func();
はFunction型の値を返す関数の宣言だもの。
>>456 は単なる右辺値参照の説明であって、質問の回答としてはあってねーよ。
>>460 がヒント出してるだろ。二種類の目的で使われている。
const T &とT &&がオーバーロードされてるような場合は
>>456 の通りだが
template<typename Tp>void f(Tp&& v);
のように使われている場合は
完全転送(perfect forwarding)を目的としている。
でとどのつまり template<typename Tp>void f(Tp&& v); はどういう風に使うの? A a; f(std::move(a)); でいいの?
いいよ
>>474 そいつはどうとでも使える。
標準ライブラリならmoveが許されるrvalueを渡されたらmoveするし、そうでないなら普通のコピーする。
moveして欲しいならあんたが書いてるようにstd::move()したものを渡してやればいい。
俺もいまいち整理できてないけど 関数テンプレートで && の場合は、非const参照のオーバーロードが考えられる 理由は、右辺値も左辺値も受け取れるようにしたいからと。 こういうのさあ…、初心者に分かりやすい一覧ないの。ちゃんと理由が書いてある
そんなの見りゃわかるだろ
templateメソッドの&&引数って値コピーでもrvalueでも使えるって風に特殊化されてなかったっけ
スマソ、それが
>>477 だわ、
template展開後のコードを見れたら良いんだがなあ
if文で if( 2 <= x < 5 ) みたいな書き方出来ませんか?
できません
>>481 if( 2 <= x && x < 5 )
で我慢しろよ
>>483 c++の高度な機能を駆使して
どうにか出来ませんか?
>>484 構文解析に影響するので、コンパイラーが替わらない限り不可能だ。
できません
ちょっと考えてみたのですが、 #define IF(xmin, a1, x, a2 , xmax) if(((xmin) a1 (x)) && ((x) a2 (xmax))) とすると IF(2, <= , x, <, 5) みたいに行けたのですが、問題ありますか?
頭に問題があります
普通にbetween関数でも作ればいい
>>477 よし教えてやろう。
1.「完全転送」をしたい時はtemplate<T> auto f(T&&);の形だ。
たいていは可変個引数になる。
2.それ以外は普通に&と&&を使い分ける。
完全転送はテンプレートの展開後のコードが無かったかのように
直接渡したい場合だ。例えば
vector<A> v; v.emplace_back(…★…); は
追加するメモリ位置に配置newで
new (追加位置) A{…★…};
とするのが目的で、本当はAのコンストラクターに値を渡すために
emplace_backの関数呼び出しすらしたくない。だからT&&で完全転送させる。
template<template<typename U> class comp1_t, template<typename V> class comp2_t> bool between(T lower, T const &v, T upper); between<std::less_equal, std::less>(2, x, 5);
double f() { static double d = 100.0; return d; } このfはマルチスレッドで呼んでも安全ですか?
>>492 C++11 以降なら問題ない。 6.7 [stmt.dcl] p4
>>494 C++11 以前だとなんか問題あったっけ?
スレッド1が書き込んでる途中に スレッド2が初期化完了と思って初期化途中の値を返すと困る あと二重初期化も
doubleの定数の代入でそういう問題出る?
ブロック内static変数の初期化保護がC+11に入ってたはずつまり=
>>492 doubleは古いCPUで32bit転送すると問題起きそう
あと並列処理で変更する可能性あるならvolatile
変更するつもりないなら関数も一緒にconstexpr
>>496 static 変数って関数に入る度に代入しないでしょ?
しないがマルチスレッドだとまた事情が違う
>>500 どう言うこと?
d への代入/参照以外に競合しそうにないんだけど...
そもそもどうやってstatic変数が初期化されていると判断していると思う?
doubleはアトミックな代入ができないから、 マルチスレッド対応の排他処理が必要ということか
判断用の別のstatic変数を使っている
javaでdoubleの代入がアトミックじゃないというのは有名な話だけど、C++でも同様に アトミックであることが保証されていないとして、同じ定数の代入で問題出る? この場合、二重初期化にはなるかもしれないけど結果は変わらないように思うんだが。
>>505 もう少し面白いレスを期待したんだが w
>>507 つい最近、関数内static変数の初期化タイミングについて調べたんだが
VS2013はこうだったよ
静的変数領域に初期化済みフラグ変数が作られてて
それが0だったら初期化とatexitにデストラクタを登録して、フラグを1にしてた
規格で保証されているのは初期化完了まで他のスレッドが待つことのみ。 あるスレッドが書いた結果を別のスレッドが読めることは保証されていない。 例えばスレッド1が書いた結果がCPU1のキャッシュに書かれ、 スレッド2がCPU2のキャッシュから違う値を読み出す可能性もある。
int型のstatic変数の値取得・値設定を複数スレッドから行う場合、 std::atomicかvolatileのどちらを使えばいい?
Winならvolatile longにしてInterlock~系の組み込み関数使う
それはどちらが良いかの回答でなく 「俺のスタンダードはこうだぜ」 でしかないのだが
Unixならfopenなんて使わずにopenだぜ!的な
>>509 でも初期化完了してから代入が無いうちに読めば初期値が読み出せることは
保証されてる (C++11 1.10 [intro.multithread] p3) から、問題ないよね?
>>510 一般的には atomic を使わないと複数スレッドから同じ変数の値取得・値設定を行った場合の
結果は保証されない。
厳密には未定義動作の範囲になるけど int なら volatile でなんとなく動いちゃう環境も多そうで、
「いい」の基準にもよってはそっちかもしれない。
>>514 むむ、確かにそうなるようように読めるな。
Foo test() { return Foo(); } int main( int argc, char *argv[] ) { Foo foo = test(); return 0; } 上記コードでfooはコピーコンストラクタで初期化されるのですか? operator= ですか? どちらも呼ばれていないようなんです。
そういう釣りは要りません
RVOでコピーコンストラクタが呼ばれてないだけ
>>519 釣りだと思うなら、書き込まなければよくね?
そうじゃないかもしれないじゃん
>>518 ・operator=ではありません
・Fooにムーブコンストラクターが有る場合はムーブコンストラクターで初期化されます
・Fooにムーブコンストラクターが無い場合はコピーコンストラクタで初期化されます
・でもコンパイラーの気分次第でどちらも呼ばれないことがあります
>>518 test関数内の『Foo()』よって
呼び出し元のfooの構築予定位置に直接構築されることがあります。
{
Foo foo=test();
…
}
Foo test() {
return Foo(…);
}
↓ コンパイラーによる実装
{
char foo_buf[sizeof(Foo)];//メモリだけ確保
Foo &foo = *(Foo *)foo_buf;
test(&foo);//testの内で構築
…
foo.~Foo();
}
void test(Foo *p_ret) {
new(p_ret) Foo(…);//p_retの位置に構築
}
おー凄いですね、 ありがとうございます。 そんなコードがさっと書けるなんて私のレベルからみたらハッカーレベル
今更だけどc++の文法はクソだな X &x = ...; と &x の「&」が こうも違う意味で使用されるとは
>>525 元々ポインタの宣言とアドレスからのデリファレンスに同じ*を使ってたのがC言語だし、今更かと
文法は慣れちゃったけど、コンパイル時間短縮の作業が冗長かつめんどい、 fwdヘッダ用意したり、前方宣言にしたり、pImplイディオム使ったり
ポインタなら******と何個書いても 意味ありますが、&は二個までしか 使わないんですか? &&&みたいなのが使われる事は 有りますか?
型としての&とオペレータとしての&があってだな
ポインタ型の*とポインタ参照の*は対になるからいいんだよ 参照型の&とアドレス取得の&は何の関係もない
^よりマシ
>>530 ポインタでなくアドレスの参照なんだけどな
いやポインターだな 型情報の無いものをデリファレンスすることは不可能
*はポインタと関係ない掛け算に使われてるけどそれはいいの?
operatorには右結合と左結合があってだな
なんで演算子に # 使われなかったんだろう…
>>536 プリプロセッサの実装がかなりカオスになるかと…
現行仕様なら文字リテラルや文字列リテラルだけチェックすりゃいいと思う
てか#が演算子だと #define はプリプロセッサ指令なのか?
それとも「#演算子」+「識別子define」なのか?
あー!!! プリプロセッサに使われてたね(;^ω^)
プリプリの#は行頭縛りが有るんだから 単独はともかく複合は何とかなるだろ それより$はどこいったんだ?
>>534 &もC言語の頃から論理演算やビット演算に使われてるしなー
カンマ演算子はいらない子
>>541 for (;; i++, j++)
これはちょっと捨てがたい
>>541 func(value1, value2, ...)
どうすんの区切り
三項演算が必要ない言語仕様を求める カンマ演算子はどーでもいい
Lispも知らないアホウが三項演算子とか。自虐ギャグか?
>>544 それはカンマ演算子じゃない
>>547 三項演算子は Lisp 由来とはいいにくい、とはC/C++関連スレではよく言われるところ
stringのsizeとlengthは同じだと思うのですが、 適当に両方を使うので、ソースの中にsizeやlengthが混じっています。 上級者の人は、どちらか一方しか使わないと決めていますか?
>>549 size_t size() const noexcept;
Return length of string
Returns the length of the string, in terms of bytes.
This is the number of actual bytes that conform the contents of the string,
which is not necessarily equal to its storage capacity.
Note that string objects handle bytes without knowledge of the encoding that may eventually be used to encode the characters it contains.
Therefore, the value returned may not correspond to the actual number of encoded characters in sequences of multi-byte or variable-length characters (such as UTF-8).
Both string::size and string::length are synonyms and return the same value.
>>548 Short-circuit evaluationがMcCarthy evaluationという別名を持ってる事を知らないアホウ。
enable_shared_from_thisについて教えてください 機能させる条件として「shared_ptrで管理されている状態でなければならない」みたいな説明をされていたのですが 使い方としては(Tはenable_shared_from_thisをpublic継承しているものとして) T* ptr = new T(...); shared_ptr<T> sp{ ptr }; // またはmake_shared使って直接shared_ptr<T>で作るとか ptr->shared_from_thisを使う操作(); はOKで T* ptr = new T(...); ptr->shared_from_thisを使う操作(); shared_ptr<T> sp{ ptr }; ではダメ、という認識で合っていますか?
その認識でおk ちなみに用途としては、メンバメソッド内部で自身のshared_ptr要求してる時に型解決するって単純なのから、 非同期処理時にshared_ptrを取得して、処理終了までインスタンスが残るのを保証したりとか if (auto p = t->shared_from_this()) { p->asyncHoge(); }
回答ありがとうございます 不安点が解消されたので、ようやく手を出せそうです・・・
Lispとか言ってるのはキチガイなので触れないでください
C/C++を使ってデスクトップ上で使えるアプリを作りたい。 猫でもわかるWindowsプログラミング以外にいい書籍ないですかね?
>>559 その引用したコードのどこに短絡評価が使われているのか?
だいたい切り出し箇所を間違えている、コンマ演算子は優先順位は最低だ
0, に引き続いて g(n, s, r, r) が常に実行されるわけじゃない
(s[r] == 0) ? ( printf("%-3d ", r),
(k == M - 1) ? putchar('\n') : 0,
g(n, s, r, r),
h(n, s, r + 1, (k == M - 1) ? 0 : k + 1) )
そのコードはちゃんと動くからしっかり読め馬鹿?
http://ideone.com/PF7IFU
相談 #define VERSION_XXX ... #ifdef VERSION_XXX ... #endif みたいな方法でコード区切って、VERSION_XXXがdefineされててもされてなくても コンパイルされるコードを書いているのですが 間違って #ifdef VRESION_XXX // RとEが逆! みたいな区切りをしてしまってもコンパイルが通ってしまいます なんらか誤字を検知するいい方法ってありませんか?
手打ちじゃなくてコピペするようにする
基本すね インテリセンスが聞くとコピペより楽だから手打ちがクセになっちゃってますけど 心がけて参ります
ヘッダなら#pragma onceとか
専用のテストツール作るとか そうでなければコンパイル後の実行テストで発見するしかないかな そこだけ丸々抜けてるんだから実行時には必ず見つけられないと可笑しい
#ifdef VRESION_XXX // #else #error "VERSION_XXX is Not defined." #endif とでもしとけばいいんでないの?
#if VER==1 #elif VER==2 #else # error #endif
定義を必須にするならそもそも論で定義自体が要らなくなっちゃうな
>>566 なんのために #ifdef 使ってるんだよ w
570 :
デフォルトの名無しさん :2015/01/07(水) 22:47:59.80 ID:F9tFXwtq
「特別に教えてやる」ワロタ その話はもう終わりましたよ
573 :
デフォルトの名無しさん :2015/01/08(木) 02:59:34.28 ID:dQf1lgek
>Cのconditional operatorもshort-circuit evaluationに分類される。
and や or がないのに短絡評価とはこれいかに?
お前の好きな McCarthy evaluation に言及している
http://en.wikipedia.org/wiki/Short-circuit_evaluation では、
>when the first argument of the AND function evaluates to false, (以下略)
>when the first argument of the OR function evaluates to true,(以下略)
conditinal operator (三項演算子)の話は(全然ないわけではないが)関係ないね。
分類?興味はないから勝手に分類すればぁ?
#専用ブラウザを締め出しにかかったのか?
574 :
デフォルトの名無しさん :2015/01/08(木) 09:31:28.52 ID:97n2OZ0x
Cの経験はあるのですが、C++初心者なのですが、 static_cast const_cast reinterpret_cast などの使い方が良く分らないので、キャストする時は (char *) みたいにCのやり方でキャストをしまくっている のですが、何か問題ありますか?VisualStudio2013 C++です
>>573 予想通りアホウには理解できなかったか。
お前の「三項演算子をフルに活用した」コードはうんこ。グロ。
肥溜から汲み出して陳列するな。
中学生でも「FPの真似事してみました」くらいの事はできるぞ。
それぞれの意味を理解することあきらめたのならそんでいいんじゃない としか言いようがない
>>574 本質的に同じものと明記しているURLが欲しい。
>>575 クロスキャストが正しい結果にならなかったような
ついでにそれだとdynamic_castのチェック機構が働かない
>>576 オペレータ op による
(op A, B, ....)
の多項演算において、A を評価した結果によっては B 以降を評価しない、というのはよくわかる、しかし
if A then B else C
で当たり前のことだが
B が評価されるときは C は評価されない
C が評価されるときは B は評価されない
それをもってして、
「"if A then B else C" は lazy だ、short-circuit だ」と主張しているようにしかみえないが、そんな当たり前なことを主張したところで誰得?
それとも分類したつもりで納得したつもりな、頭が幸せな人なの?
>お前の「三項演算子をフルに活用した」コードはうんこ。グロ。
光栄だね、
>>543 は狙って書いたからね、お気に召されたようでなによりだ
>>580 お前、スレを荒らすときはちゃんとクソコテ付けろよ
NGしにくいだろ
ち、負けたよ‥Cの三項演算子 if C then A else B / C : A ? B に生来の自然な lazy 性があるというのだろう、その主張は認めよう
やっぱり理解していないアホウ。そんな事はお前以外は全員知っていた。 conditional operatorをshort-circuit evaluationと呼んで良いかが争点だった。 二度と肥溜から汚物を汲み出して陳列するな。
そうか、
>>574 と微妙に変化しているが、short-circuit のほうかね
私は汚物どころか、ふつくしくまとめたものだと考えているが‥あこがれの R
RWH まで動員されたら、ちと遠慮するしかないな‥
関係ないけど3項演算子の?を条件文にくっつけて書くのが好き。Ruby のみたくなる
>>587 ちょっと考えれば
c ? a : b == (c && a) || (!c && b)
である事は明白だけど、こういっても難癖つけるだろ。
590 :
デフォルトの名無しさん :2015/01/10(土) 11:59:14.45 ID:gEQY0px8
そういえばお前らはちゃんとeffective modern c++買ったのか?
6000円で日本語訳無しか ちと考えるな 英語でもいいけど見出し付きPDFにしてくれないと読む気がしない
これ以上キチガイクソコテに触れないで下さい コイツはQですよ?
>>589 残念だがその等式は C に関しては成立しない
残念な点は2つ
1. 左辺は a, b のいずれかの値を返す、右辺は 0, 1 のどちらか
2. 左辺のCの評価は1回、右辺は場合によってはCが二回評価されることがある、Cが副作用をもっているとき、これは重大な相違|
アホウには理解不能だろうけど、そういう事じゃないから。
具体的な反論できないけど、悔しくてアホ呼ばわりするしかないのはわかった
rubyとJavaScript は少し経験あり、 C++を勉強中です ruby では pp JavaScript では JSON.stringify で 変数の情報を参照していました C++でおなじように変数の子要素もまとめて出力するような機能はありますか
いいえ
>>597 言語仕様にはありません
適当なライブラリを探してください
アホ呼ばわりではない、アホウだと言っている。
アホウにはアホウと言ってもいいと思っている モヒカン的な思想ですね もう少し社会に適応した方がいいですよ
602 :
デフォルトの名無しさん :2015/01/11(日) 16:08:35.26 ID:wfXxgM2H
既存のバイナリファイルに対し、指定した2バイトのみ書き換えたいのです。 しかし、下のようなソースではファイルが新規作成されてしまいます。 いくつもまずいところあるかもしれませんが、どこをどのように直せばよいか、あるいはどこのサイトをみればよいか教えてくださいませ。 #include <iostream> #include <fstream> using namespace std; int main() { ofstream fout ; char outfile[] = "workfile.bin"; int i1; fout.open(outfile,ios::out|ios::binary|ios::ate ) ; if (!fout){ cout << "workfile.binが開けないですいません"; } short s1 ; //書き替え用2Byte cout << "何番目(2byte単位)を書き替えますか"<<endl; cin >> i1; cout << "いくつに書き換えますか"<<endl; cin >> s1; fout.seekp ( (i1-1)*sizeof ( short ) ); fout.write( ( char * ) &s1, sizeof( short ) ); fout.close(); return 0; }
>>602 そうだな
まずiostreamという糞ライブラリを使うのを止めることをオススメする
そのファイル(workfile.bin)は、はじめから存在しているファイルなのか?
>>600 で、具体的なことはなにも書けないと w
606 :
602 :2015/01/11(日) 19:17:36.28 ID:4/5dMjSN
>604 はい、別途作成済のファイルです。 >603 iostreamは糞なんですか。もっといいのがあれば教えてくださいませ。
フラグの意味ぐらい調べてから使えよ
俺のフラグが立つのはいつですか
>>606 コードよく見てなかったが
>>607 の通りだな。ios::outは既存のファイルがある場合は
それを削除して開くことになる。代わりのフラグを設定しる(ios::appか?)
610 :
602 :2015/01/11(日) 21:24:36.19 ID:4/5dMjSN
ありがとうございます。これで指定した位置の書き換えができるようになりました。 fout.open(outfile,ios::in|ios::out|ios::binary ) ;
611 :
デフォルトの名無しさん :2015/01/14(水) 16:53:09.61 ID:qg2WOmMy
class Callback { virtual void onNannka(Manager *pMngr) = 0; } みたいなコールバックの中でのみpMngrにアクセスを許したいんですがどうすればいいんですか?
friend
613 :
デフォルトの名無しさん :2015/01/15(木) 20:42:13.86 ID:lMW8kkLc
for(int i=0;i<10;i++){ } みたいなループ変数や、 int array[10][20]; int x=2; int y=6; array[x][y] = 100; みたいな配列のインデックスなどのちょっとした変数にintを良く使うのですが、 size_tを使うべきなのでしょうか? 特に64bitをターゲットにビルドする場合、intよりsize_tを使うほうが 実行速度が速くなったりしますか?Windowsです。
615 :
デフォルトの名無しさん :2015/01/15(木) 21:09:47.58 ID:lMW8kkLc
>>614 レスありがとうございます。同じですか。
では質問を変えて、上級者の皆さんはintを使いますか?
size_tを使いますか?
intは処理系の一番得意な整数型になるのが望ましいって決まってるから理由が無いならintの方がいいよ
>size_tはlongだけど どうしてこう、息を吸って吐くように嘘が言えるのか
618 :
デフォルトの名無しさん :2015/01/15(木) 21:39:13.36 ID:lMW8kkLc
>>616 なるほど。今までintを良く使ってきたのですが、
vectorなどを使い始めて
for(int i=0;i<v.size();i++){}
とした場合や、文字列に対して
int len = strlen(str);
などで警告が出るので
for(size_t i=0;i<v.size();i++){}
size_t len = strlen(str);
のように、徐々にsize_tを使うようにして来ました。
なので世の中はどっちを使うのか主流なのかなと思いまして。。
>>617 すまん、処理系によるな、ヘッダ覗いて書きこんでた
signed(符号あり)は負にもなる整数 unsigned(符号なし)は負にならない整数(0以上) ただしunsignedは、オーバーフローせずに、wrap around する 例えば、byteなら0〜255だから、255の次は、0に戻る
>>621 ループインデックスの値が必要なケースについて訊いてるんだろ
そのくらい理解しろ
>>622 range based for 知ってる俺スゲー君だろ
そのくらい理解しろ
624 :
デフォルトの名無しさん :2015/01/16(金) 10:05:12.01 ID:xsGnLZU7
やっぱりループは for(int i=0;i<10;i++)みたいな書き方が落ち着くわ。 iteratorでbegin endや auto みたいな書き方は、馴染めない。
そうでもない
rangeってindexアクセス出来る配列以外でも一貫性を保ちつつループ出来るから、変数削除以外にも恩恵あるよ まあ慣れだよ
range based for と scoped enum はもうないとやっていけない体になっちまったわ
クラスの関数と、コンストラクタの違いって何?
たしかにたいした違いはない、インスタンスの確保の後で最初に呼ばれるように言語上縛りがはいっているが、ただそれだけのメンバ関数ということでもいいかもしれない
明示的に呼べるしな
戻り値
クラスの関数 ・戻り値がある ・インスタンス確保後のメンバ変数を操作する時に使われる(カプセル化) コンストラクタ ・戻り値が無い ・インスタンス確保時に呼ばれる ・メンバ変数の初期化に使われる ・コンストラクタ内で例外が投げられた時、デストラクタが呼ばれない →例外の懸念がある時はtry - catch ・値渡しでコンストラクタを呼べる(呼べてしまう) →呼ばれたくない時はexplicit こんな所かな
コピーコンストラクタの定義漏れ
>例外の懸念がある時はtry - catch 貴様、さてはJAVA()ドカタだな
>>635 なんでだよw確かにJavaは業務で触った事あるが
デストラクタでハンドラ解放必要な処理の場合はcatchで解放しとかないとリークするんだぞw
まあスマポでカスタムデリータに解放処理書いときゃそんなの要らないが
637 :
デフォルトの名無しさん :2015/01/17(土) 00:13:52.55 ID:v4dny9bU
C++禁止、リンクライブラリなど禁止 の条件(実質.c, .hファイルと#include)で2つのアプリケーション間で通信をしたい場合どのような方法を使うべきでしょうか? 環境はwindows8です
C言語のスレあるんだからそっち行けば良いのに
639 :
デフォルトの名無しさん :2015/01/17(土) 04:29:02.45 ID:Vi+da9/m
void callback(Manager *pMgr) { //この中でpMgrを勝手にコピーさせない方法ってありますか? }
CentOS6.x/7で使われてるglibcって、 実行時ロードでCPUの細かいフィーチャ (サポートしているsseのバージョンなど)で リンクするAPIを替える機能ってありますか?
>>637 リンクライブラリ禁止といつことは
数値演算・論理演算・メモリアクセスしかできないということだから
Windowsでは無理。
Visual C++標準のライブラリ以外禁止ということなら
パイプかソケットでも使っておけば?
ただアプリケーション間通信をC++で書くという選択が微妙
>リンクライブラリ禁止といつことは >数値演算・論理演算・メモリアクセスしかできないということだから それは可笑しい ライブラリのソース入手してまとめてコンパイル&リンクすれば良い それがだめで完全リンク禁止って言うなら実行ファイルすら作れない
それじゃKernel32のソースくれよ
エントリポイント探して呼ぶだけならソースなくてもリンクもなくても出来ないことはないな
646 :
デフォルトの名無しさん :2015/01/17(土) 15:58:17.68 ID:Vi+da9/m
>>640 なんかええ感じのスマポとかないんすか?
>>646 そもそも pMgr をコピーさせたくないのか、*pMgr をコピーさせたくないのか
どちらにせよ、値を読み出すだけでもコピーだし...
pMgr 渡さなきゃいいじゃん、としか言えない
>値を読み出すだけでもコピーだし ちょっと何言ってるかわからない
>>649 ストレージの別の場所にコピー元を模倣する
オブジェクトが作られることでしょ
>>650 オブジェクト限定ならコピーコンストラクタ禁止しときゃいいんじゃね?
>>651 コピコンでどうやって防ぐのか教えてもらおうか
void callback(Manager *pMgr) {
Manager pCopy = pMgr; // NG
}
int main() {
Manager m{};
Manager pMgr = &m;
Manager pCopy = pMgr; // OK
}
それポインタのコピーじゃね? 「オブジェクト限定なら」と書いてあるようだが
c++ (ちんぽ ぷらぷら) >>all
>>652 まともにコード書けるようになってから、出直してこいよ
こういう質問見るとなぜそういう間違った手法へとたどり着いたのか背景を聞いてみたくもするけど、やっぱりどうでもいいや。
>>653 ポインター変数はオブジェクトであると規格で定められてるぞ
>>652 つまり、
>>639 は
callbackの中はコピーNGにしたい、
で、それ以外のところではコピーOKでってことか。
なんでこうすることになったのか
>>657 じゃないが気になるな
friend地獄にするかプロキシーを使うしかない
>>658 俺は「オブジェクト」=「クラスや構造体の実体」と文脈から読んだんだけども
規格だとそうなんだ、知らなかったよ
物知りだねぇ
friend地獄 noexcept地獄 const地獄 C++には地獄が多いですね Cだとグローバル変数地獄とか
地獄でなく落とし穴
>>662 const地獄ってどんなの?
なんかデメリットある?
デフォルトの属性にしちまえよってくらいconst constだらけでチカチカして記述を忘れたりする マーフィの法則で記述忘れがそのままmake通ってよくわからないバグを生む
それでバグってんのはconstつけてるつけてないのせいじゃねーから!
667 :
デフォルトの名無しさん :2015/01/19(月) 04:16:37.17 ID:nqrjGtBd
668 :
デフォルトの名無しさん :2015/01/19(月) 04:22:17.07 ID:nqrjGtBd
コメントで書いてれば充分だろ
670 :
デフォルトの名無しさん :2015/01/19(月) 04:28:29.24 ID:nqrjGtBd
672 :
デフォルトの名無しさん :2015/01/19(月) 05:25:19.50 ID:sDzJfvsV
実行時にコメント消すコンパイラばっか
所有権のないポインタを保存しておくのは常にdangling referenceの危険があるから 常識として普通は保存しないしコメントは冗長
所有権って概念を理解してない初心者にありがちな間違いではあるね。 所有権が理解出来てないとクラス設計も壊滅的に酷い物になる。
有効性判定なら shared_ptr/weak_ptr かなぁ
676 :
デフォルトの名無しさん :2015/01/19(月) 09:44:06.66 ID:nqrjGtBd
>>674 つまり、コピーを取られないことを前提で作って良いってことですか?
コンパイラの機能やライブラリの範囲で防ぐのは不可能 だがD言語ならきっと何とかしてくれるかもしれないっ…!!
>>676 一般的にポインタ保存することをコピー取るなんて言わないから、そういう意味で使ってるなら誤解招くからやめた方がいいぞ
シャローコピーとディープコピーの概念はわかり易いと思うけど
ハンドルで書き直すとかは
code readingに出てくる バリアント、インバリアントがよくわかりません 例えば int x=0,y+=10,z; while (x<y) { z=x; x++; } で インバリアントがx<y バリアントがその他でおk?
どんなスペルなの?
class invaliantだろが
まちがえたw class invariant
>>681 > インバリアントがx<y
> バリアントがその他でおk?
まったくだめ、というかそれ以前
そのバリアント・インバリアントはコードではなくコードが表現する処理の意味に関するものだから
無意味な処理のテストコードで形式だけで考えても意味はない
まずわ意味をぐぐればいいわけね
char[]の中に、こういう文字列が有るんですが、 Name = "データ"\r\n ここから データ という文字列の部分を取り出したいのですが、 いろんな方法があると思うんですが、スマートな方法教えて下さい。 なお、"データ" という文字列の部分は、いろいろ変わりますが、 改行とか変な文字は含みません。
>>687 何をしたいのかその文ではさっぱり分からんが、
想像するに\r\nを削りたいってところだろうか
char *Name="データ\r\n";
return strsep(&Name, "\r\n");
Name1 = "Data1" Name2 = "Data2" …… ってたくさんあって、Name1のデータは"Data1", Name2のデータは"Data2"みたくしたいのかな?
>>687 エスパーすると、
"Name = 1234¥r¥n"
"Name = abcd¥r¥n"
"Name = 東京都品川区¥r¥n"
こんな感じ?
\r と \n が複数回いろんな場所に登場する事もあったりしてw 頭から全角半角判定して、一個一個調べて行くのがいいのかな。
getlineでおk
>>688 本題と違うけどリテラル文字列を変更しちゃあかんやろ
これだからCゲンガーは
kansu() const throw() と kansu() const noexcept は何か違いはありますか?
>>690 そう、そんな感じですけれど、一点だけ違います。
"Name = 1234\r\n"
ではなくて
"Name = \"1234\"\r\n"
です。
ファイルから読み込んだ文字列なので末尾に\r\nが付きますが、それ以外の部分には
\r\nや、それ以外の制御文字などは入りません。
C++で使えるスキップリストの実装で、おすすめの物などあったら教えてください。
当初std::multimapを使用していたのですが、全要素に対しての
先頭からの反復処理が非常に低速であるため、スキップリストを利用したいと思いました。
検索して見つけたCS::SkipList (
http://sourceforge.net/projects/csskiplist/ ) を試したところ
反復処理で満足のいく速度が出たため使っていたのですが、使っているうちに
* C++03時代の物であるためムーブが行えない
* 軽微ではあるがメモリリークのバグがある
* 要素の大量追加 => 大量削除を行うとその後の各操作が非常に低速になる?
(細かい検証はしていません。もしかしたらただのメモリフラグメンテーションかも)
のような問題が見られ、別の実装を探した方が良いのではと考えるに至りました。
要件は以下の通りです:
* GPL/LGPL等でなく、ライセンスが比較的緩いこと
(成果物はバイナリ形式で無償で不特定多数に配布予定)
* multimap同様、「重複可能なキー」と「値」のペアを格納するタイプのスキップリスト
* できればムーブに対応していると嬉しい(emplace等)
* できればC++11の拡張forで扱えると嬉しい(begin, end)
自分でもこれから色々探して、最悪自作することも視野に入れていますが
もし既に良い実装をご存じの方がいたら、教えて欲しいです。
>>696 >>697 サンプルありがとうございました。
istringstreamもregexも、難しそうなのでふだん使わないので参考になりました。
自分でも作ってみたのですが、
char c_str[] = "Name = \"1234\"\r\n";
string str = c_str;
string::size_type is = str.find("\"") + 1;
string::size_type ie = str.find("\"", is);
string data = string(&str[is], &str[ie]);
いちおう目的は達成できたのですが、こういうやり方はどうでしょうか?
700 :
デフォルトの名無しさん :2015/01/23(金) 16:08:31.27 ID:R2ihxFB7
Cで、sizeofは内部でどういう計算がされていますか
足し算で計算されていると思います
>>699 後端の"が見つからなかった場合のエラー処理ができてない。
>>702 文字列には必ずペアでダブルクオーテーションがあることが前提なのですが、
そういう場合でも、エラーチェック処理をするべきでしょうか?
前提を崩した入力があった時に ・エラーで文句言う ・落ちる ・鼻から悪魔
>>703 その文字列がプログラム埋め込みでもない限りするべきだと思うけど
・PCを再起動する
・ハングアップさせる 逆にむずいか ・自爆させる 捕まるか ・入力者の個人情報をツイでさらす これいいかも 鉄則 『入れちゃいけないデータは入れちゃいけない』
Mac、C++で ディレクトリ内のファイル一覧の取得、 ディレクトリまたはファイルが存在するかどうかのチェック、 ディレクトリまたはファイルの作成 をするにはどうしたらよいですか Objective-CでいうところのNSFileManagerみたいなイメージです
710 :
デフォルトの名無しさん :2015/01/24(土) 07:34:19.87 ID:fHbROJyl
>>708 中途半端に安全宣言して実は漏れてました
よりも最初から危険だと判ってた方が良いよね
原発と同じ
C#だと文字列の頭に@を付けて str = @"c:\path\file" ; みたいに出来ますが、C/C++でも似たような事出来ませんか? 現状だと str = "c:\\path\\file" ; みたいに \\ を入れるのが面倒なので。
>>711 c++11のRAWストリングリテラルを使う
>>712 ありがとうございました。
便利なのが有るんですね。助かりました。
enum class MyEnum :int { one, two, three, }; int func() { return MyEnum::one; } とすると、VC++2013では IntelliSense: 戻り値の型が関数型と一致していません と出るのですが、関数をMyEnum型にするか、戻り値をintにキャストすれば解決はするのですが、 MyEnum :int と宣言しているので、MyEnumはintになると思ったのですが。 ググったら暗黙の型変換はしないと書いて有ったのですが、ではMyEnum :intの intはどういう時に使うのでしょうか?有っても無くても同じですか? 要するに関数はint型のままで、キャストせずに戻り値にMyEnumを使う事は出来ませんか?
できません
>>714 >intはどういう時に使うのでしょうか?
クラスのバイナリイメージを扱いたいときに便利
struct AbcHeader {
int ver : 4;
int reserved : 28;
enum class MyEnum type;
};
>>714 > ではMyEnum :intのintはどういう時に使うのでしょうか?
int以外の整数型を指定したいとき
> 有っても無くても同じですか?
enum classの場合はあってもなくても同じ
> 要するに関数はint型のままで、キャストせずに戻り値にMyEnumを使う事は出来ませんか?
enum classの場合はできない
718 :
デフォルトの名無しさん :2015/01/24(土) 15:00:04.93 ID:+P7E5oiJ
コンソールアプリケーションでゲームを作っているのですが 全角文字が一文字分右にずれて表示され動かしているキャラクターの前回の座標を上書きすると○の文字の場合○の右半分だけ残ってしまいます 同じコード(少しいじって途中でおかしいのに気付きCtrl+zで戻しました)なのに急にこのような状況になってしまいました 理由がわかる方がいればお願いします
719 :
デフォルトの名無しさん :2015/01/24(土) 15:09:33.04 ID:1f2SI/kI
それはわからん。今後はバージョン管理ツールやバックアップツールを導入しとけ。
>>698 ですが
色々あって自作する事になりましたので、質問を取り下げます
ありがとうございました
722 :
デフォルトの名無しさん :2015/01/24(土) 15:51:41.08 ID:vo9it+x1
>>718 二次元配列で仮想画面を保存して全角の後ろを上書きすれ
724 :
デフォルトの名無しさん :2015/01/24(土) 22:19:35.41 ID:CVvB/wzu
Cのポインタの問題をお願いします 配列変数aを{2,1,7,3,6,4,8,5,9}で初期化し、バブルソートで大きな順に並び替えて表示するプログラムを作成せよ 配列要素の参照にはポインタ変数を用いること
726 :
デフォルトの名無しさん :2015/01/25(日) 00:00:18.23 ID:l2NWKfU1
>>723 それでも直らなかったのですがMSゴシックを標準のフォントに戻すと直りました
他のPCではMSゴシックでも動いてたので結局根本的な原因は不明です
>>715 >>716 >>717 解説ありがとうございました。class無しでやる事にしました。
構造体で
int ver : 4;
の :4 は何を表しているのでしょうか?
ググりたいのですがキーワードを教えて下さい。
728 :
デフォルトの名無しさん :2015/01/25(日) 00:25:59.54 ID:6pmbh6NX
ビットフィールド
709です Cのstatとsystemを使って出来るみたいですね。 しかしもう少し抽象化されたものはないんでしょうか。
boost::filesystemを使う
NSFileManager をC++でラップする
boostなんて、仕事じゃ使えねーよ 遅すぎるし
ヘッダによる、 fwdヘッダ用意してなかったりasio、format、regexだったりは遅くなるけど、 それ以外はプリコンパイルヘッダに含めればそこまで足引っ張らない
動作が遅いっていってんだけど
お前のやってる仕事ではそうなのかもな。
(ヾノ・∀・`)ナイナイ
boostつったって色々あるしなぁ
どれだけ遅いのですか。 データはありますか。
739 :
デフォルトの名無しさん :2015/01/26(月) 00:47:39.69 ID:CYa04E4M
ブーストなのに遅いとか
740 :
デフォルトの名無しさん :2015/01/26(月) 01:02:32.94 ID:5Hop7PEH
仕事には使えないな。そういう用途のものでないな。 実装実験のためのものだし、バージョン依存も激ししい。
書くのが早いというだけで‥
>>740 仕事用でasioの代用だと何使ってる?
ID:jnERKKsIがアレなのを別にしても boost.poolテメーはダメだ。
744 :
デフォルトの名無しさん :2015/01/26(月) 06:18:40.46 ID:fhQPsb6z
format regex 使ったけど遅すぎて止めた
そこはxpressive使うべきだろ
質問させてください javaは経験してますが、C++は最近0から独習しています 今回教えていただきたいのはC++のクラスの多重継承についてなのですが これは本来の基底クラスの拡張という以外に、javaのインターフェースの代替として使用しても良い機能でしょうか? したいことといえば、例えばjavaであればインターフェースを使用して class Bar extends Foo implements IMovable, IContainerable,ISpeakable とクラスの親子関係と性格を決めていたところを C++ではその目的で class bar : public foo, public mover, public container, public speaker のように全て継承で一緒くたに扱う形で実装してよいのでしょうか javaのインターフェースが実装を保障するものであるのに対し C++ではそれに相当するものが見あたらず、とりあえず実装上同じような事が出来そうなのが多重継承だったのですが C++本来の継承の意味合いからしてそういう使い方をしてよいのか気になっています
>class bar : public foo これはC#のインターフェース相当かな。 Javaのインターフェースに相当するC++の記述は class Bar : public virtual foo
fooはインターフェースじゃなくて普通の基底クラスじゃなかろうか
>>747 ありがとうございます
では、とりあえずその方向で移植しながら勉強してみます
>>751 そのinterface用のクラスで
virtual void a()=0;
って感じで後ろに=0;を付けて定義するとinterface用クラスを派生した側でvoid a()を実装しなければ実体化出来なくなるからJavaとかのinterfaceに近くなる。
詳しくは 純粋仮想関数 でググれ
C++はインターフェースが無いから、
>>752 のやり方でインターフェースとして振る舞うクラスを定義するのが普通だね、
そして共通メソッドもBaseクラスじゃなくこのインターフェース用クラスのメソッドとして実装しちゃうので、ここでJavaとの実装方法に違いが出てた、
ただ、JavaもJava8からインターフェースにdefaultメソッドを実装できるようになったから、
C++と同じく多重継承は出来るようになった。
だけど、それはインターフェースに限定され、クラスの多重継承は未だに出来ない事から、
実装をインターフェースに集約出来るってメリットが生まれたって考えとけば良いと個人的には思ってる。
java の interface は元から多重継承でしょう。 それより仮想継承についてここまで説明なしなんだが。
>>754 interfaceに仮想継承関係ないから
C++でクラスを使ったプログラミングでは、 p1->p2->member みたいにポインタの->が出てくるのが普通だと思いますが、 c1.c2.member みたいに . だけでプログラムを書くことは可能でしょうか? どっちの方法が良いとかありますか? 好き好きですか?
わざわざ(*p1).(*p2).memberって書くのか? そんなことにこだわる意味が分からないよ
758 :
デフォルトの名無しさん :2015/01/28(水) 12:27:05.03 ID:U/zfeC5A
(A){ Hoge hoge(); hoge.pointer->method(); hoge.reference.method(); } (B){ Fuga *fuga = new Fuga(); fuga->pointer->method(); fuga->reference.method(); delete fuga; }
>>757 >>758 レスありがとうございます。
-> を使うということは、new をしているということですよね。
なので質問の意図としては、newやdeleteを使わずに
. だけでプログラムを組むなんていうのは出来るのかな?現実的では
ないのかな?実際のところはどうなんだろうという質問です。
ポインタを使うのはポインタを使う理由があるからやっている (多態を使うとかnewで構築したとか) そうした理由が無ければ好きにすればいい
>>759 new使わなくてもアローは使う事がある
func1()
{
A a;
func2(&a);
}
func2(*A pa)
{
pa->member
}
C++ なら new 使っても . でいけるし func1() { A* a = new A; func2(*a); } func2(A& pa) { pa.member }
クラスのメンバに参照使うこともできるぞ メンバに参照があるとoperator=がデフォルトで定義されなくなるし大抵の場合不便だからポインタにすることが多いけど
ポリモーフィズムでBaseクラス型のポインタが必要になった時にアロー使ったり、 一応templateでポリシークラス渡す方法だとアロー消せるけどこっちはダックタイピングだから主旨ずれちゃうけど
765 :
デフォルトの名無しさん :2015/01/28(水) 23:07:35.37 ID:anpOJbJr
そんなことができそうな提案がいくらか出されてるから(operator .とかinline valiablesとかexpression aliasとか)将来のC++ではできるかもしれない
>>759 とりあえず、見た目にこだわっての話なら、そのこだわりは早めに矯正したほうがいい
それらの使い分けは、構文的なこだわりとは全く別の視点で行われるべき
例えば大量のデータに対する順次処理はインライン関数内でスタック処理したが早い
ただし再帰でやったら死ぬから、自分が何をしようとしているかがわからない内は無理して使い分けはしないほうがいい
尚、ポインタであっても参照にとればアロー使わずメンバにアクセスできるけど、これに特に意味はない
>>766 その変数がnullでない事を保証するぐらいの意味はあるだろ
768 :
デフォルトの名無しさん :2015/01/29(木) 10:16:32.39 ID:wMkjI3CS
769 :
デフォルトの名無しさん :2015/01/29(木) 12:34:49.33 ID:+k0iBMBa
Visual Studio 2012 Professional を使用しています。 Win32 プラットホームだとビルドできるのに x64 だと デストラクタなどが未定義というリンクエラーが発生してしまうのには どんな原因が考えられるでしょうか? エラー自体は以下の様な感じです。 コンストラクタに関しては宣言すらしてないのに未定義と言われてしまいます。 error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: virtual __cdecl Hoge::~Hoge(void)" error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __cdecl Hoge::Hoge(void)"
仮想PC(vmware)内でVirtualQueryExを行うと戻り値が0になって 情報が得られません。 ホストPCではきちんと取得できるのですが・・・。 原因が分かる方、どうかアドバイスをお願いします。 仮想PCのOSはwindows7 32bitで そのときのpid、OpenProcessの値は特に問題なさそうです。 OpenProcessのアクセスフラグにPROCESS_QUERY_INFORMATIONをきちんと追加してあります。 試しに同じハンドルでReadProcessMemoryを使って読み込み可能なアドレスを 読んでみましたが、問題なしです。
If the function fails, the return value is zero. To get extended error information, call GetLastError. Possible error values include ERROR_INVALID_PARAMETER.
773 :
770 :2015/01/30(金) 19:05:38.20 ID:TnZuFfmI
自己解決しました。すみません。
Win32でなんか問題あったら英語のリファレンス見ろ 日本語の自動翻訳は古いしごっそり抜けおちてる
775 :
デフォルトの名無しさん :2015/01/31(土) 08:35:04.41 ID:YMt5PyZL
日本語訳は意味が正反対になってたりするから見ない方が良い
ある型の演算子+を定義する際、下記のどちらがよいのでしょうか? struct Hoge { friend Hoge operator+(const Hoge& rhs,const Hoge& lhs) }; struct Hoge { Hoge operator+(const Hoge& rhs) };
>>776 下の方こうな
Hoge operator+(const Hoge& rhs)const;
>>779 どのように自由度が高いのか、教えてください
>>778 こうだろjk
Hoge operator+(const Hoge& rhs) const &;
Hoge operator+(const Hoge& rhs) &&;
>>780 オーバーロード
Hoge operator+(int rhs,const Hoge& lhs);
Hoge operator+(const Hoge& rhs,int lhs);
rhsとlhsが逆だよ。rhsはright hand sideだろ。
>>781 そいうこと聞いてるわけはないんだけどな・・・
>>782 別にrhsはright hand sideなんて主張はしてませんけど・・・
何だ。釣りか
ホゲ使いと糞コテハンにはマトモな奴がいないことがわかる
左右なんて幼稚園児でも知ってる
>>781 別に必須じゃないし、それだと右がmoveに対応してないから片手落ち
じゃあこれだな。 Hoge operator+(Hoge&& rhs) const &; Hoge operator+(const Hoge& rhs) const &; Hoge operator+(const Hoge& rhs) &&;
>>776 どちらもいまいち、二項演算子の基本はこう。11以降ならmoveを考慮した変形もあり
// 非friend
inline Hoge operator+(Hoge lhs, Hoge const & rhs) // 左辺は参照ではなくコピー
{
return lhs += rhs; // operator+=も自身(Hoge)の+を使わず別に定義
}
>>790 これだと
Hoge{} + Hoge{}
が解決できないと思うが
Hoge operator+(Hoge&& rhs) const &; Hoge operator+(const Hoge& rhs) const &; Hoge operator+(const Hoge& rhs) &&; Hoge operator+(Hoge&& rhs) &&; だろjk
左辺が左辺値で右辺が右辺値のときにオブジェクトを一個無駄に作るのは何とかならないの?
代表的なstd::complexの仕様を確認してみるという発想は無いんだね おまいら
>>794 右辺に結果入れて return std::move(rhs);
char a[1]; a[0]='A'; a[1]='\0'; ってやると、 A \0 \0 って3文字分メモリを取って、隣接する配列とかがおかしくなるんですが何でですか。
範囲外に値書き込んだら 何が起こってもおかしくない。
一次元配列のメモリ領域の一部分を借りて変数の配列にしてるんだから、 配列外にアクセスしたら別の変数にアクセスしてしまう場合もあるわな
> ってやると、 A \0 \0 って3文字分メモリを取って 解読してくれよエスパー
>>794 ,795
オーバーロードを追加。もちろん+が項の交換可能なときだけ
inline Hoge operator+(Hoge lhs, Hoge const & rhs) { return lhs += rhs; } //
>>791 inline Hoge operator+(Hoge const & lhs, Hoge && rhs) { return rhs += lhs; }
char a[1] ; strcpy(a,"A"); a[0] a[1] ってすると、A \0 って領域が取られると思ってたので、 a[1] に '\0' を直接入れても変わらないと思ってたのですが違うんですかね。
char a[1]は要素数が1しかないから a[1]にはアクセスしてはいけません
806 :
803 :2015/02/01(日) 13:26:13.54 ID:DsQLSXV2
おっと2つ目はmoveがいるか rhs += lhs; return move(rhs);
char a[2] ; strcpy(a,"A"); だったら A \0 ってなるが、 char a[1] ; strcpy(a,"A"); だと A しか格納されないって事ですかね。この場合終端文字が無いって事ですかね。
器の大きさに見合わないことをやっているので、 その後何がおきてもしかたない状態
>>807 どっちも 'A'と'\0'の2バイトをコピーするよ、
ただしstrcpyはコピー先の確保メモリ数なんて考慮しないから、
下の方は確保領域外であるa[0]の次に'\0'を書き込んじゃうのでよろしくない
クルマが道路をはみ出して走った場合に
直ちに重火器で破壊停止される場合と
人をひいても気付かずにそのまま走り続ける場合がある
>>807 の例は後者
char a[1] ; strcpy(a,"A");で a[0] にA その次に \0 が入る。 a[1] = '\0' でも同じ事。 文字列としてaを扱った場合 aの隣の領域に変更が無ければ A\0の文字列として扱える。 ただし a[0] の隣に \0 を入れた時点で、 その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。
>>811 いや、違う
配列外が'\0'になってるのはOSがよろしくやってくれてるだけで、
環境が違えばメモリ確保領域外にゴミデータが入ってる事なんてよくある、
メモリ確保領域外がすべて0クリアされてる前提でコードを組むのは環境依存になるし、お作法的にもやっちゃダメ
> その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。
こっちも、変数のフラグメンテーションによって配列外アクセスが常に別の変数の先頭領域になるなんて保障がないよ
あ、ちなみに、配列内なら初期値以降が0クリアされるって言語仕様で決められてるよ 例えば int a[3] = {0}; だと、a[0] == 0、a[1] == 0、a[2] == 0 int a[3] = {5, 2}; だと、a[0] == 5、a[1] == 2、a[2] == 0 char a[3] = "A"; だと、a[0] == 'A'、a[1] == '\0'、a[2] == 0('\0')
strcpy_sじゃあかんのか
double型で桁数の多い計算をしたら、1.6493361431022000e-006という数字になりました。 これはdouble型の桁数を超えたんでしょうか? この数字が出るとその後、この数字に乗算しても正しい結果にならないんですが
大人C++でstd::string使っとけ
>>815 それ
0.00000164933…
って数
計算してるところが解らないから何ともいえないけど計算間違ってるだけじゃない?
もしかしてただ誤差が出てるのを正しい結果になってない!おかしい!って思ってるだけかも
>>815 >double型の桁数を超えたんでしょうか?
いいえ、違います。
計算上は何ら問題は起きていません。
計算結果の正確さの保証を求めるなら浮動小数点型を使ってはならない 桁あふれじゃなくてもとんでもない結果が出たりする
数式上問題ないなら 不動小数点数の取り扱いが悪いとしか言いようがないような 後は実際のコード見なきゃなんとも言えない
>815 MINGWのG++ならば、doubleでなくて long doubleを指定して4倍長計算をしてみたら どうなりますか。
昔知り合いの会計士が うちはPC二台でエクセルでそれぞれ同じ計算して 答え合わせしてるので完璧ですっ(キリっ) って逝ってたの思い出した
浮動小数点数の扱いを知らんで誤差出て可笑しいって言う人って
>>823-824 同じデータと同じマクロを使ってペンティアムバグの対策するんだよな
当然だよな
片手にエクセル、片手に電卓 これでいく
マクロのバグってのはありえるかもな
>>815 ども^^;
知らなかったす0.00000164933だったなんて
喪黒ならハグよりドーンの方が怖い
>>830 そもそもおまえ浮動小数点型使う必要ないんじゃね
桁数多いからってならlong long使えよ
今の大学って実用数学とか計算機数学習わないの?
>>835 そんなうさんくさい講義は受けたことないわ
837 :
デフォルトの名無しさん :2015/02/03(火) 08:10:35.59 ID:00JNNVea
customer satisfaction
VS2013で for (int i = 0; i<1000; i++) { auto nowS = std::chrono::system_clock::now(); // 10秒前後掛かる重い処理 auto nowE = std::chrono::system_clock::now(); auto millisec = duration_cast_milliseconds(nowE - nowS).count(); } みたいな感じで 重い処理に掛かる時間を計測しているのですが、1000回繰り返して正常に終わる場合もあれば、 1000回繰り返すと、時々1,2回くらい計測時間がマイナスになるんですが、そんなこと有りますか?
steady_clockを使え
>>839 ありがとうございました。steady_clockを試してみます。
その後、steady_clockを使って試したのですが、以下のコードをWin7-64のVS2013でWinXP向けにビルドして WinXP32SP3のマシンで実行するとやはり、マイナスの値が計測されました。このコードで何かおかしな部分ありますか? だいたいいつもi=2000前後で発生します。でも、その後は、また正常に計測されます。再現実験に2,3時間かかるので 困っています。 #include <Windows.h> #include <string> #include <chrono> #include <iostream> using namespace std; void main(){ for (int i = 0; i < 1000000; i++){ auto nowS = std::chrono::steady_clock::now(); Sleep(5 * 1000); // 5 sec auto nowE = std::chrono::steady_clock::now(); auto millisec = std::chrono::duration_cast<std::chrono::milliseconds>(nowE - nowS).count(); cout << "i=" << i << endl; cout << millisec << endl; if (millisec < 0){ wstring msg = L"millisec=" + to_wstring(millisec); MessageBox(NULL, msg.c_str(), L"マイナス", MB_OK); } } }
842 :
デフォルトの名無しさん :2015/02/03(火) 17:41:47.29 ID:Ii7aDZgi
>>841 初レスだが。ダメだったら確実なAPIを使えばいい。
マルチプラットフォームはchronoとwinAPIを切り替える部分を自作したらいい。
>>842 レスありがとうございました。
WinAPIで確実なのはGetLocalTime()でしょうかね?
なお841をXP向けにReleaseビルドしたときはランタイムライブラリはマルチスレッド(/MT)
です。それ以外の設定はデフォルトだと思います。
QueryPerformanceCounter と QueryPerformanceFrequency
>>841 1秒に一回現在時刻を取得して出力するプログラムを動かし続けたらどうなる?
コンピューターの時刻が戻っているのかプログラムがおかしいのかの切り分けはすべき
コールバック処理をしたいのですが C#でいうところのActionやdelegateは無いみたいなので困ってます たすけてください
>>841 GetSystemTimeAsFileTime()を使えばいいんじゃないかな?
849 :
デフォルトの名無しさん :2015/02/04(水) 01:13:32.90 ID:VCpWnwFT
クラスAのprivateメンバにアクセスできるクラスBを内部的に使いたいんですが、 内部クラスを使うにせよフレンドクラスにするにせよ、クラスAのヘッダにクラスBの宣言は露出せざるを得ないもんでしょうか? クラスAのサイズやらには影響しないので宣言を公開する必要まったくないのですが…。
共有メモリを使ってプロセス間通信をしつつ、共有メモリ書き換え時に通知を出してイベント駆動したいんですが可能ですか?
>>849 外部からアクセスさせないためにprivateメンバにしてるんだろ。クラス定義の時点でfriendにもしてない内部クラスでもないクラスがアクセスできたら困るわ
ソースファイルに隠蔽したいなら、privateメンバの参照渡すなり何なりやりようはある
>>850 ・共有メモリを監視して変更があったらイベントを実行する
・共有メモリとは別に名前付きパイプを使ってメッセージを送信し、受信したらイベントを実行する
どっちでもお好きなのを。どちらにせよイベント駆動する側のスレッドで何らかの監視はせにゃあかんよ
>>841 VS2013のsteady_clockにはバグがあってシステム時刻に連動してるから使えないよ
時刻同期された時点でアウト
VS2015(プレビュー版)では修正したって記述があるけど、MSのことだから
VS2013は直さず放置かも
>>852 そうみたいですね。
何日も連続で使っても正しく時刻を計測できる方法は無いのでしょうか?
どの方法でも、たとえバグが無くても、必ず上限がありますよね?
アホみたいな初心者レベルの質問なんだろうと理解しているけども
助けてほしい。
mbedでEthernetInterfaceライブラリを使ってUDP通信をするプログラムなんけども
char out_buffer[] = "Hello\n";
sock.sendTo(echo_server, out_buffer, sizeof(out_buffer));
これで文字列以外を送信する場合ってどうすれば良いの?
mbedにRJ-45のコネクタつなげて、実際にやってるんだけど
文字列は送れてもそれ以外の、例えばADコンバータで変換した電圧の数値とかを送る方法が分からない。
戻り値がintだったりする場合は、それを一度キャストしてやらないとダメなんですか?
ちな
http://developer.mbed.org/handbook/Socket ここのUDP Echo Clientがソース全文です。
あとmbedでのプログラムの話なので
板違いだったらすいません
857 :
デフォルトの名無しさん :2015/02/04(水) 14:23:36.96 ID:e5R1ECjv
int hoge = 846; sock.sendTo(echo_server, (char *)&hoge, sizeof(hoge));
>>856 キャストすればいいんじゃない。sprintfで文字列として送ってもいいし。
>>857-858 ありがとうございます
キャストで行けました。
これでLANオーディオもどき作成に戻れます
教えてください。 親ウィンドウのあるボタンを押すと 子ウィンドウが出て(この間、親ウインドウの操作不可) 子ウィンドウを閉じると親ウィンドウに操作が移る。 こういうプログラムを作りたいのですが、いまいち分かりません。 ウィンドウを一時的に操作不可にする命令などあるのでしょうか?
ただしそういうことはできるだけ控えろと言う。
ソース見てて、 a->exit(); みたいなのは、ああ、A* a=new A();という感じで宣言したんだなと分かるのですが、 a()→exit(); という形になるのがよくわからないです。どういう時にこうなるんでしょうか?
関数aの返り値がポインタ (aがクラスでoperator ()が定義されてる場合なども含め) A* a(){ static A s; return &s; }
そういう場合は参照にしろよって話だな。 ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない
> ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない はぁぁぁ??? a->exit(); のaがnullかどうかの話と何が違うんだ
>>867 this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば
>>868 aがnullかどうかは自分でポインタ取るんだから解るだろ
他からポインタ受け取るときnullが許されないなら参照にしろって話
>>869 thisがnullでも呼んで大丈夫な関数を普通のメンバー関数にすんなstaticにしろ
>>870 > 自分でポインタ取るんだから解るだろ
void foo(A *a) {a->exit();}
>>870 >thisがnullでも呼んで大丈夫な関数を普通のメンバー関数にすんなstaticにしろ
それは Java, C# に毒されているとしか、C/C++ の世界ならば当たり前の仕様
>>873 > それは Java, C# に毒されているとしか、C/C++ の世界ならば当たり前の仕様
C++はともかくCでnullのメンバー呼んで(?メンバー変数へのアクセス?)大丈夫ってどんな場合だよ
ぬるぽチェックをしない人が集まるスレはここですか?
C++なんだろうけど やっぱstaticにしてほしいよなあ
>>875 OO でない C が記述にあるというだけで揚げ足とりに走る必死さw
>>869 > this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば
そうなんだっけ?
仮想メンバ関数だったらどうなるんだ?
>>875 メソッド自体は存在するから仮想じゃなければ大抵大丈夫
>>881 だよね、そもそも仮想じゃないケースだとして
> this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば
これって保証されてるんだっけ?
>>867 >ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない
いやそれはおかしい。
参照の場合nullptrを返すことが不可能だが
ポインターの場合でもnullptrの可能性が有るかどうかは仕様書読めばわかる。
不安なら
a()->exit(); // a() never returns null
と書いときゃいいだけ
>>884 そりゃそうだけど参照にしとけばドキュメントに書く必要すらないし
886 :
デフォルトの名無しさん :2015/02/04(水) 23:49:32.47 ID:MGLmZlif
>>882 保証されてないはず。
struct X
途中で書き込んじまった struct X { void f() {} }; int main() { X* x = nullptr; x->f(); } このx->f();は(*x).f();のシンタックスシュガーだから、nullポインタのxをデリファレンスしてる時点で未定義動作 だから例えばfが呼ばれる前にabortする処理系があってもおかしくないはず
昔C++はCに変換してコンパイルされてたとか聞く すると X::f()は f(X*)に変換されたのかもしれない
今もそんなに変わらんだろう eaxレジスタにthis入れて関数呼んでるだけだ
もう時代は64ビットだし、raxレジスタって言うべきじゃないかな
>>888 昔、というか今もリンク時にはC言語形式の f(X*)になっている
>>892 C言語形式の関数のシンボル名は引数自体ないんだけど
C関数の引数はスタックに積んで、thisポインタはraxに積む処理系だってある マングリングした名前で静的ライブラリから関数ポインタと取得して、そのままC関数としてcallできる保証なんざどこにもない C言語形式のってのは不適切じゃないかね
静的ライブラリじゃねえや、動的ライブラリだ
例外が何のために導入されたのか良く判った