早いけど先に地鎮祭しとくのでテンプラよろしく STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
すみません早速質問です。 class Test { public: Test getThis() { return this; } }; のように自身を帰したい場合C++ではどのようにかくのですか?
目的次第で class Test { public: Test* getThis() { return this; } const Test* getThis() const { return this; } Test& getThisRef() { return *this; } const Test& getThisRef() const { return *this; } };
そう言えば仮想関数で共変と反変ってのがあったな それよりテンプラよろ
ここが100スレ目?
9 :
デフォルトの名無しさん :2013/02/21(木) 22:03:02.48
初心者は回答するな
>>9 あなたjavaスレにもいるでしょ?毎日張り付いてご苦労様です。
11 :
デフォルトの名無しさん :2013/02/21(木) 22:17:24.33
>>10 Javaスレなんかいないよ
Javaは10年前にかじっただけだから全く分からないし
C++メインで使ってるからこのスレは張り付いてというか一応毎晩チェックしてる
これも張り付くっていうのかな?
まあどっちでもいいや
相手が毎日張り付いてるのを確認できるのは同類だけしかいないだろうにな
自分スーパーハッカーなので誰が張り付いてるか張り付いていなかくらい寝て起きる生活と同じように取得できますんで。
14 :
デフォルトの名無しさん :2013/02/21(木) 22:19:39.21
無駄口叩くな
新スレ早々荒れ模様
16 :
デフォルトの名無しさん :2013/02/21(木) 22:35:51.87
たしか削除人は、IPアドレスがみえるそうだ
またseikyou.ne.jp大暴れなのか
ちょっと荒れてしまったようですみません。一応謝っておきます。 お酒を飲んでいたのと、C++がJavaのようにかけないのでイライラしてしまいました。
19 :
デフォルトの名無しさん :2013/02/22(金) 23:37:04.06
初心者は回答するな
別言語で同じように書けると思っている方がおかしい
void func() { if (i == 0) return; i++; } と void func() { if (i == 0) { } else { i++; } ではどちらが好きですか?
俺の原則はソースの行数(文字数)を減らすこと バグの数は行数に比例する てか、その下のやつ{}が合ってないし
行数を減らす手段にカッコの位置を使うってのは斬新だな。 関数1つあたりの機能を正しく分割できていれば行数など ふくれあがるわけないんだが。
上は気持ち悪い 1行だろうが30行だろうが下で統一したい
でもその場合なら void func(){ if(i!=0){ i++ } } こう書くと思うな
>>21 上は、最初に条件付けて関数を実行する状況を事前に制限する意図があるときに使う
下は、純粋に条件分岐する場合に使う
意図次第かと
i == 0 がいいか i != 0 がいいかも意図次第だな
>>26 >上は、最初に条件付けて関数を実行する状況を事前に制限する意図があるときに使う
だね、俺もそうする。
ただ、その場合でも
void func(){
if(i == 0){
return;
}
i++;
}
だな。
俺はこうだな void func() { if (i == 0) { return; } i++; }
空の{}入れてelseとか気持ち悪い
そういう時は俺は空の { } の中にコメントを書くね
途中returnを異様に避けようとする人いるよね
必要なら途中でreturnしてもいいけど、このコードは普通に != 使うのが素直
>>31 MISRA とかでも禁止されていたりするしね。
>>32 常にそうだと思うなら、ちょっと頭固すぎ。
void func() { if (i != 0) i++; } これが一番わかりやすいじゃん 本質的に一行のコードなのになんでreturnとか出てくるの
質問の意図を解さない頭の悪い回答が出始めてきたな・・・
初心者は回答するな と貼り付ける人の気持ちも分からんでも無いな
どっちが好きかって聞いてるだけだからな 実用性とかそんなもの聞いてないんだよ
コメントとコードが近い表現になるように条件式を書いた方が良い
>>33 MISRAなんてものがコーディング規約に含まれている会社の人はご愁傷様としか言いようがない
条件式にコメントを合わせるのではなく コメントに条件式を合わせる これでコードが理解しやすくなる そのためなら空のifがあってもいいけど コードの書き忘れと区別できるようなコメントはあった方がいい
42 :
デフォルトの名無しさん :2013/02/23(土) 16:00:36.52
初心者並の頭しかないくせに自覚のないゴミも回答するな そう、今自分のことじゃないと思ったお前だよお前
43 :
22 :2013/02/23(土) 17:01:23.36
>>22 だけど、本当はこうだった。
void func() {
if (i == 0) return;
i++;
}
と
void func() {
if (i == 0) {
return;
} else {
i++;
}
}
だったわ。すまんこ。
やっぱ単なる好みの質問じゃんw
if-else の一方だけで return; というのは個人的にはあまり良くないと思う
動けばなんでもいい
>>42 > そう、今自分のことじゃないと思ったお前だよお前
お前のことだと思った俺はどうすりゃいい? (w
>>43 ガード条件のつもりなのか、そうでないのかをはっきりしろよ
りったんしかないのならif (i != 0) ++i;でまろやかに行くよね
それだとanalがムズムズするからオレは if (i==0);else ++i; かな
anal は形容詞だよ
英語圏でも普通に名詞的に使われてるだろ 俺は使わないけど
anus っていうんだよ
アヌスの鏡?w えーと、returnの後には基本、elseは置かない習慣だから、 if (i == 0) return; ++i; だな。 elseを書きたい場合はその前後をイーブンにしたいから、 if (i == 0) { return; } else { ++i; return; } とするかも。 まぁ、その場合は、 if (i == 0) { } else { ++i; } return; だろうな。
>>40 MISRA が規約に含まれてる会社って車業界だから、
どっちかって言うとご愁傷様とか言われるのはお前や
俺たちじゃね? (w
iが規定値の時に触るなら if (i != 0) ++i; iが想定の範囲内から出ることもあるニュアンスを含めるなら if (i == 0) return; ++i; iの範囲によって2種の異なる処理を行うなら if (i == 0) return; else ++i;
途中returnがだめなら throwなんてもっとだめなのか
ニュアンスなんてどうでもいいからコメント書けよ コードで伝えようとするのは危険
コメント書くのは前提だろ
こういう無理やり1行にしてみましたみたいなコード嫌い
>>61 個人的には ; は1行に2つ以上あると気になるわ(ただしfor文を除く)
普通はそう教育される
そこは井手が勝手に直してくれるでしょ?w
井出らっきょのことね
コメントは最小限にして、それでも分かりやすいコードにして欲しい コメント読むにはコード読むのと同等以上のエネルギーが必要
日本人なら日本語マスターしてこい
メンテされていないコメントほど害悪なものは無い
メンテされてないコードの方が害悪だと思う
>>67 えっ?コメント日本語で書いてるの?ってのは冗談として
自然言語はプログラミング言語ほど最適化されていないし、曖昧な点が多いから
>>69 コメントはメンテしなくても
書いてあるコードの通りに動くからタチが悪いだろ
>>56 価値観?
世間の動向とか興味ない人なの?
すみません。うんkに毛が生えたレベルの質問なのですが、 int main() { return 0; } のreturn 0;の必要性がイマイチわからないです。あるサイトではこれがないとコパイル通らないそうですが、通りました。 例えば例外発生したときにそこでプログラムがとまってメモリを食っちゃうのを阻止する感じでしょうか
C++ではなくてもコンパイルは通ります
それじゃ必要になったら書けばいい 必要ないなら書く必要はない
>>74 main 関数が int を返すって宣言してるから。
なるほど。すみません続けて質問なのですが using namespace std; はできるだけ書かずにstd::cout, std::endlのように書いていったほうが良いと考えておkですか? スタティックなインポート?に恐怖を感じます
>>75 Cでも最新の仕様なら要らない
最新の仕様に対応していればだけど
>>78 using namespace std; はなるべく書かない方がいい
解説書やら何かやらではスペースやら説明やらの都合上よく使われるが
こういうのなら悪くはない
namespace AAA {
using std::cout;
using std::endl;
int main() {
cout << "aaa" << endl;
}
} // namespace AAA
ヘッダにさえ書かなきゃどうでもいい
>>80 そんな風にmain()関数を囲い込む方法もあるんですね。今自分で、
AAA::main();
とよんでみたら確かに通りました。
ありがとうございます。
あ、すまん main は名前空間に含んじゃいけないな こういうことで namespace AAA { using std::cout; using std::endl; void foo() { cout << "aaa" << endl; } } // namespace AAA int main() { AAA::foo(); }
設計上よくないということですか?
文法上まずい mainはグローバル名前空間内で定義する必要がある using namespace std; は色々問題があるけど グローバルでない名前空間内で std::cout, std::endl などを個別で using するのは割と安全 というものの例を上げようとしたら 間違って main も名前空間内に入れてしまっただけ
ふと思ったんだけど、なんで return で制御返しちゃうんだろ。 return だからって、制御返すのと戻り値をまじちゃってるよね。 制御構文として return を書かないなら綺麗になるかなかな?
もうちょっと日本語で話してくれ
>>73 価値観とか人生相談とか…
要するに論理的な話はできないと言うことね、了解した。
>>58 途中returnが駄目で途中breakがOKな理由がよくわからないね、あれだ、ダブルスタンダードってやつか?
>>59-60 コメントって怏々にしてメンテがゆきとどかず、実体の真逆を記述していることもおおいよね
コメントを頼りにするのは馬鹿
91 :
デフォルトの名無しさん :2013/02/24(日) 20:26:55.91
もちろんコード前提だろ馬鹿
93 :
86 :2013/02/24(日) 20:58:33.41
呼んだ関数は、いつかは(あれば)戻り値を伴って戻ってくる訳で、
そのときに戻り値が設定されてればいいわけで、
戻り値返すついでに制御も返しちゃいけないと思うんです。
スレちだけど、言い出しっぺなので。
>>21 の質問は、何らかの数が 0 なら処理しなくて良い or するなって意味で、
0 で return させたのです。
でも 0 で無いなら処理しろにして、0の場合でもそのまま関数抜けていただいたほうが、
御社にとってもとかったのではないかと。思った次第。
皆さんC++学ぶ上で何をしましたか。 やってて面白い分野が見つかればよいのですが。C++ならではのAPIとかあれば教えてください。
ゲーム作る
科学技術計算
>>95 自分もそれを第一に考えたのですがウィンドウ作る所でいやになりました。
もっとC++言語としてまとまったAPIdocumentがあればよいのにないですよね?
Cライクで書かれたサンプルプログラムをC++のSTLとクラス使って書きなおす
C++にウィンドウなんて概念はないからな
ウィンドウなんて作らなくても テキストベースでゲーム作ればいいじゃん
可読性のために処理速度を犠牲にしてもいいですか?
DXライブラリなるものでゲーム作ろうと思ったのですが、あれってVC++がいるのですよね? よくわからないのですが、VC++ってC++と並列というか、また別の言語なんですか?
可読性のためにプログラミング言語が生まれました
最初のプログラムってひたすら0と1を打ち続けてたんだろうか
そもそもリレーとかだろ確か EDSACが最初の(実用的な)プログラム内蔵方式コンピュータだったはず
>>106 VC++でしか使えないライブラリとかあるのですか?
>>104 アルテアあたりだと、スイッチを捻って01を入力してプログラミングしてた。
DXライブラリはVC++限定ではないけどね
>>92 別に1人とは書いてないけど、そう思い込んだ理由はなんだろうね (w
>>93 マジで、C++ の勉強の前に「日本語」の勉強した方がいいよ。
FORTRANnerかも
なぜファイルストリームのインターフェースはランダムアクセサブルなシーケンスじゃないんですか?
高度に発展したインタネットは、テープと区別が付かないからです
>>114 つfseek()
ラップすればいくらでもランダムアクセスになるのでは?
あと、ハード的には最終的にセクタ/クラスタ単位でしたアクセスできない点は考慮してあると思う。
概念が十分かつ簡潔に汎用化出来ないからじゃね?
ファイルストレージの主流がシーケンシャルアクセスデバイスだった頃に設計された仕様が元だからだろうな
119 :
デフォルトの名無しさん :2013/02/26(火) 19:27:39.61
std::stringも参照渡しにするべきなんですか?
>>119 デストラクタを備えているクラスは参照渡しの時は注意
もしそれが向こうでconst参照で束縛されても、戻ってきた瞬間デストラクタが走り
実体が解体されてしまうため、束縛の意味がなくなってしまう
>>119 最近はコピーしたほうがええってのが定説や
コアはちゃんとつかわなあかん
参照渡しよりコピーの方が良いという理屈が分からん
124 :
デフォルトの名無しさん :2013/02/27(水) 05:07:31.16
初心者は回答するな
>>123 やってみろや
class C {
const string& cs;
public:
C(const string& s) : cs(s) {}
void print() const { std::cout << cs << std::endl; }
};
これを C cc("test"); としてインスタンスを生成し cc.print() とすると
果たして test と表示されるかどうか
>>126 なんだQか
最初のは結局
class C {
const std::string& cs;
public:
C(const std::string& s) : cs(s) {}
void print() const { std::cout << cs << std::endl; }
};
int main()
{
std::string* const s = new std::string("test");
C c(*s);
delete s;
c.print();
}
とやってるのと基本的に同じ
constの参照は一時オブジェクトでも束縛出来るが、それがクラスの場合は
要注意
というよりメンバにconstへの参照を持っていてそれに束縛する場合は要注意って事だな
129 :
デフォルトの名無しさん :2013/02/27(水) 11:24:54.65
>>127 ワロタ。すばらしい例だね。
参照先・ポイント先が有効なのか考えないでプログラム
している人ってC/C++には向かないよね
時代はmove
>>129 低脳はこういう罠にも気付いてないのに「俺はC++が出来る」と嘘をほざいてるだけだと
バラされて顔を真っ赤にして遁走したようですwww
>>130 スレ違い
C++11スレに行け
string&&を受けとるのをオーバーロードして static_assertすればいいんじゃね
moveってauto_ptrに似た挙動をするからなあ スピードは格段に上がるけどちょっと怖い でもgcc4.7.2のSTLは既にmove semanticsを前提に書き換えられているし 実際ベンチマークを取ってみると速くなってる
>>133 明示的にやるにはstd::moveって書かなきゃダメだし
勝手にmoveするauto_ptrと違ってそんな怖くはないだろ
moveが機能するケースを区別できないならともかくmoveが怖いっていったいどんなコード書いてんだか
>>134 それは分かっている
しかしauto_ptrに痛い目に遭わされて来たからなぁ
>>135 感情が染み付いてしまうとしばしば理性を超えて恐怖を感じる
戦場のプログラマ
138 :
デフォルトの名無しさん :2013/02/27(水) 15:56:27.75
やっぱ銃弾の飛び交う中で崩れた建物の陰とかでノートPC抱えて必死でコーディングする感じ? 自分の隠れてる小さなブロック塀の残骸にマシンガンの流れ弾が当たるのは日常茶飯事で たまに塀のこっちに手榴弾とかが入ってきて脊髄反射でノートPC抱えて逃げないとヤバい感じ? 夜は明かりで居場所が分からないようにノートPCと自分を黒い布で覆ってコーディングする感じ?
弾丸が貫通する電子機器はごみ
防弾のフルタワーPCなら自分の体も隠せる
とりあえず何を組んでいるんだ?
FPSゲーム
関数の引数にクラスを渡す場合、普通は const& で問題ないよ。
むしろ値渡なんかしない。
>>125 の問題は、引数ではなくてメンバ変数のライフタイム。
その例の場合、普通はメンバの方を参照にはしない。
メンバーを参照にする意味あるの?
意味があるときにはする 寿命には気を付けるけど
構造上特定のクラスに本質的に依存するクラスはそれを参照メンバとして取る事がある。 例で言うとboost::lock_guardとか。
RAII 的なロック区間管理オブジェクトは、どちらかと言えばイディオムだけどな
const_castでconstを外せるようにするのに参照にしないといけなかった
const intのメンバ変数をconst_castで書き換えようとしたら const int&のメンバ変数じゃないと書き換えられなかった
152 :
デフォルトの名無しさん :2013/02/27(水) 22:27:20.04
static const intだったわ ↑が書き換えられなくて、static const int&にした
>>125 constの参照をメンバに持つこと自体がバカなんじゃないの
153の続き:
const参照じゃなくても生ポインタでも同じ事だよね
呼ばれた側で参照/生ポインタを保持するようなアホなことはそもそも俺はしないなあ
>>131 最近忙しすぎて2ch除くヒマもないだけで遁走したわけじゃないよ
お前と一緒にするなよカス
つまり
>>125 みたいなコードを書く奴は死んだ方がいいということ
「注意が必要」以前の問題
>>150 コンパイル時定数をconst_castすんなよ
>>153 constの参照を今知ったのがバレバレ
constの参照はコンストラクタで初期化しないとコンパイルエラーになる
>>154 お前Qだろ
無知なのがバレて逆切れすんなよ
>>155 連投か
よほど悔しそうだな
俺は「例え」のために書いただけで、パッと見てすぐにおかしいと分からない
時点でお前も同じ
本来はconstの参照などメンバに持たず、単に参照をメンバに持つ こうすればコピーしか初期化出来なくなるので正常動作するわけだ
そんなバッドノウハウは忘れていいよ
C++FAQに書いてあるんだが・・・
VCとかじゃ通用しないテクニックだし 右辺値禁止したければオーバーロードをdeleteするのが正道なんだよなあ
C++使いって基本アホだよな
そうだよアホだよ
なんだ、俺は例外中の例外の異端児だったのか
ハンドルされていない例外が発生しました 人事部にお問い合わせください
167 :
126 :2013/02/28(木) 12:34:17.03
戻りの束縛は有用だけど、引数の束縛は何のメリットもないぞ。
>>168 いいんだって
それより文法を正しく理解しているかどうかだ
C++0xで追加されたrandomを使おうと思うのですが、 std::mt19937 myrand(); の()内に乱数の種を入れることはわかったのですが、 ここではsrand()のように、種を入れる初期化用関数は存在しないのでしょうか? 初期化用の処理にsrand()を入れていたので、どうしていいのか戸惑っています
インスタンスごとに独立してない種なんか本当に欲しいか?
myrand(初期化用の数値)
>>158 なに言ってるんだ?
>constの参照はコンストラクタで初期化しないとコンパイルエラーになる
当たり前だカス。ドヤ顔でいうことじゃないだろ。
お前がド素人丸出しなんだよ。
それに何よQって?知らんよそんなもん
◆QZaw55cn4c
ようQ 顔真っ赤にしてファビョらなくてもいいぞ老害
176 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/02/28(木) 20:19:56.19
class MyRand { static unsigned m_seed; std::mt19937 m_rand; public: MyRand() : m_rand(m_seed) { } ... }; unsigned MyRand::m_seed; void MySRand(unsigned seed) { MyRand::m_seed = seed; }
ム板もそうだが、マには精神壊れている奴が多いよな そんな奴が就くからドカタ職業になるんだろうなと思う いや、ドカタ職業だから精神壊れている奴ぐらいしか就かないのかも
>>176 friend か public が必要だけどね。
>>177 精神の壊れ方にもいろいろ種類があるけど、他人に迷惑を掛けない壊れ方(自己破壊的)と、
他人に迷惑を掛けまくり(他罰的)な壊れ方の二種類に大別出来る。
前者は統失・双極性障害・うつ病、後者は人格障害がほとんど。後者はアスペではないかと
思う人もいるかもしれないが、それは単にアスペが人格障害を伴っている場合が多いから。
無駄な分類をするのも習い性だな
181 :
170 :2013/02/28(木) 23:19:28.02
>>171 いえそういうことではなく、乱数クラス内に種を渡す用のメンバ関数がないのかなと思ったのです
>>176 >>178 ありがとうございます。しかしかえって使いにくくなっているような気がしますが…
皆さまありがとうございました、自己解決しました。
ttp://ideone.com/6QYWl1 例えばあるクラスで使う場合、コンストラクタで初期化をするのはどうすればいいのかと思っていたのですが、
このようにすればいいのですね。
無駄な分類(クス 分類せずに人を見る事が可能だと思ってるのか? プログラムで言えばソートアルゴリズムにいろいろあるようなもんだ
>>181 解決したようだけど一応、種の再初期化をしたいってことならseedメンバ関数がある。
なんだ、またいつもの粘着君かよ
(クス これは流行る
186 :
170 :2013/03/01(金) 01:29:46.12
>>183 あ、あるにはあるのですね。ありがとうございます。
187 :
126 :2013/03/01(金) 02:42:21.24
const 修飾子の有無によって、メモリイメージが変わるものなの?
メモリイメージって何のこと言ってるのかな?
189 :
126 :2013/03/01(金) 03:16:18.13
>>188 >>127 を例にとると
C::C(const std::string& s) : cs(s) {}
に対して C c(*s); としたときにスタック上に展開される *s の内容と
C::C(std::string& s) : cs(s) {}
に対してのそれとが異なるかどうか?
あるいは一般的に const をつけるかつけないかで、スタック上に展開される内容が異なるかどうか、気になるのです。
変わらないよ その場合constは魔法でも何でもない ただ書き換えのエラーチェックがコンパイル時に為されるだけ
実体は単なるポインターでしかないんだから
>>189 気になるなら自分でアセンブリ吐かせて見ろよ。
>>189 強いて言えばリファレンスをメンバに持たせるとそのメンバはコンストラクタで必ず初期化しないと
コンパイルが通らない位の違い
レファレンスってポンタ渡ししてデリファレンスを自動でやるぽ機能だろ ho(T&& ge)の場合、引数にはポンタ以外何か渡しているのか
195 :
126 :2013/03/01(金) 21:49:39.03
>>195 そこであなたが言ってることはほとんど正しいと思うけどね
ボロクソ言ってる奴は何も考えていないシッタカ素人としか思えない
参照がポインタconstの糖衣構文とは言い切れないのって
const参照による一時オブジェクト束縛くらいじゃないの?
そうじゃないって言うなら、そうじゃない例を挙げて欲しいものだよ
配列の扱いがまず違う。
ポインタと参照は概念が違うのに、実装が同じという理由だけで故意か低脳なのか 混同している輩には呆れる
また社会的に弱いのがわいてきたな
概念ガー
無能な味方とか蛇足でスレが縞模様になるのは避け様の無い現実。
>>198 混同している、とはどういう意味?今現在混同している事例が進行中なの?
203 :
デフォルトの名無しさん :2013/03/02(土) 03:00:58.98
>>202 その前にお前は敵なのか味方なのかそれをはっきりさせろ
敵(笑)味方(笑) 無能の言うことはいつもこれ
自己顕示が目的だからな
このスレで餌付けに成功しただけ
今日もQzは炎上学習法の実践中
餌付けされたのは金魚の糞のほうであって金魚は昔からいたというか人気に嫉妬
低能ってホント女の腐ったような発想しかしないんだな
c系スレは雑談、罵倒がたくさんないとつまらんよな APIスレみたいになると楽しいよな
wcsncpy_sについて教えてください。 今、次のようなコードがあるとします。 wchar_t * src = L"aabbcc"; wchar_t dest[3]; size_t lenToCpy = 2; wcsncpy_s(dest, 3 * sizeof(wchar_t), src, lenToCpy); dest[6] = L'\0'; "aa"だけコピーしたいんですけど。 使い方はこれであってますか? なんか、wcsncpy_sでsrcの長さ(この場合6文字xsizeof(wchar_t) = 12バイト)だけdestが0xfeで埋められてから len文字分だけコピーされているように見えます。@VS2008 なのでdestでヒープが壊れるってデバッグ終了時に言われるんですが。。 (この例ではdestはローカルだけど、実際にやってるコードだとヒープです。)
>>211 >dest[6] = L'\0';
ダメ
>>212 あ、すみません。。
そこは2chに書くときに治し忘れてました。。dest[2]=L'\0'って読み替えてください。。
本当に申し訳ない。
>これらの関数のデバッグ バージョンは、最初に 0xFE のバッファーに格納します。 >この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。 正常動作ですが何か
>>214 え?
FEで埋めるのはいいんですが、与えられたバッファサイズを超えて埋めるのってどうなんですか?
なんか追っかけていくと最後に_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
って処理があって、これがバッファをバーンと壊してますね。
その直前まではいい感じなのに。
第2引数はバイト数じゃなくて文字数だろ。 マニュアルちゃんと読めよ
wcsncpy_s の第二、第四引数はバイト数じゃなくて要素数 3 * sizeof(wchar_t) の * sizeof(wchar_t) が要らない
そもそも”3 * sizeof(wchar_t)”これ要らん 配列ならテンプレートが勝手に要素数埋めてくれる
>>216 ありがとうございます!
やっぱり使い方が間違っていたんですね。
スレ汚しすみませんでした
何気に0xFDで埋めると書いてあるままになってるマニュアルが(2005までは0xFD、2008からは0xFE)
ヘッダファイルでincludeしたくないヘッダがあるんだけど、 template使ったらヘッダでincludeしなきゃならなくなる。 template使わない方がいいのかな?
どういうこと? 例を出すと、Windows.hをヘッダでインクルードしないぞと決めていて、 template使ってしまうと、実装部分にSleep関数あるから困るみたいな感じ。
template<class F> void func(int a, F f) { f(a); } で使う側で func(10, Sleep); としてやればいい
なるほど 関数渡してやればいいわけですか ありがとうございました あとは自分の中で保守性とか考えてどうするか決めたいと思います
薄いテンプレートを挟むのも良い
template<void(&F)(DWORD)>void func(DOWRD a,F f=Sleep){f(a);}
template<void(&F)(DOWRD)=Sleep>void func(DOWRD a){F(a);}
>>229 それじゃ汎用性なさ杉
Sleepが一つならともかく、引数型・数や返値が違うapiを使うたびに書くようじゃ
おいおいじゃないか
非テンプレートの基底クラスで実装して それを継承するのが定石じゃね?
template<class F, class... Args> auto func(F f, Args... args) -> decltype(f(args...)) { return f(args...); }
>>211 String.copyValueOf(char[] data)使いなよ
どの??
C++って書いてるのが見えないのか
??
今気づいた。。。 ∧_∧ ( ・ω・ ) 何も思い残すことはない (====) ボコボコにされてやんよ ______( ⌒) ) /\  ̄`J ̄ ̄ ̄\  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ | | / \
どういう勘違いだw
すんません、VC++使わないでDXライブラリ使う方法教えてくださいな winでcygwin使ってます
dllのがあるから探せば?
訂正 総合開発環境使わないでDXライブラリ使う方法を教えてください
適切なディレクトリに置く コード書く コンパイルする リンクする
まず君は総合開発環境使わないでHello worldのプログラム書けるところまではできるの?
248 :
デフォルトの名無しさん :2013/03/05(火) 00:23:33.03
BCCコマンドラインとDirectXSDKだけで開発している俺に隙はなかった
>>247 普段Eclipse使っててCDTなるC/C++開発環境プラグインを導入したのだがコンパイラがついていなかった
なのでcygwin導入したもののEclipseで実行するとバイナリが見つからないチックなエラーが出る
そこで総合開発環境はあきらめて質問した
なんで諦めるんだそこで!
EclipseでC/C++とかドMだな
VC++入れてcl.exeでも叩いてみたら
MAX_PATH の記述はOKなのに、 MAX_DRIVE や MAX_DIR は、前に _ をつけなければならない理由を教えてください。 あと、普段記述するのに、 MAX_PATH _MAX_PATH のどちらがいいですか?
Cランタイム由来(Windows APIでそれを使わない)だから 変な言い方だがWindowsアプリケーションなのかC/C++アプリケーションなのかで決めろ _が付く→C/C++実装系の為 付かない->Windows APIのもので言語依存とか知らんがな
MAX_PATHは C言語コンパイラで決められているんですか C言語ではなくOSで決められいるてるんですか それとも、他のなにかでですか
OSの提供するヘッダかな
258 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/05(火) 21:33:52.52
だからMAX_PATHはWindows APIで定義されているんだってばよ
259 :
242 :2013/03/05(火) 21:53:02.95
あきらめてVC++Expression2010DLしますた
了解しますた
関数ポインタと、operator () をオーバーロードした関数オブジェクト、 両方を引数として受け取れる関数は作れるでしょうか。 void f (int x, int型を引数にとる1引数関数ポインタor関数オブジェクト g) { g が関数ポインタなら (*g) (x); g が関数オブジェクトなら g (x); } この関数 f を2種類の引数でオーバーロードするしか無いでしょうか。
template<typename T>void f(int,T);
>g が関数ポインタなら (*g) (x); 関数ポインタでも g (x); で呼べるだろ。 どちらもtemplate<typename T>void f(int,const T&); で受けられる。 ただし、VC10にはconst T&に&関数名ではなく、 暗黙に関数ポインタに変換されることを期待して、関数名を渡すと、 おかしな挙動をするバグがあったから注意。 他はしらね。
264 :
261 :2013/03/07(木) 12:45:15.54
アドバイスどおりにしたらできました。 ありがとうございました。
関数オブジェクトを期待している引数を template<class F>void call(F f); のようにコピーで受け取るのが流行ってるのはなぜですか? 無駄なコストに思えるのですが合理的な理由があるのでしょうか
>>265 いちいちそんなコストを気にしていない or inline化を期待してる or operator()に副作用がある場合にそれを呼び出し元に伝えないように or
F&だと一時変数を渡せない。C++11ならtemplate FのF&&でいいかもしれないがC++03とのコードの可搬性を考えているl。
インライン化ならconst&Fでは? これならテンポラリも渡せるしconst故に副作用もない(constメソッドに副作用がある書き方をする方が悪い) やはり値渡しをする理由がないですよ
>>267 const& F自体はinline化には関係ないと思うけど。
内部状態を変更する関数オブジェクトを渡す予定がないならconst F&でもいい。でも柔軟性はなくなるよね。
C++11ならstd::ref,std::crefがあるし、moveもできる。
const参照だと非constメンバ関数が呼べない。 環境によっては平行性に影響があるかもしれない。
STLを学ぶのにおすすめの本はありませんか? classまではわかります
272 :
デフォルトの名無しさん :2013/03/07(木) 16:49:31.74
STLはクラスより易しい。 STLを実現するためにクラスなどC++の装備が整えられた。 クラスをふくめC++の多くの装備は裏方。 STL+C言語ができれば、多くを知らずとも生産性は余り変わらない。
STL を扱った書籍自体あまり見ないよね。 ま、かなり直交的に設計されてるから、覚える事ってか少ないんだよね。 使い方だけしか載ってないけど、STL 標準講座で十分かなと思う。 少し深入りしたければ、effective STL かな。
普通に使うのは簡単なんだが イテレータとかアロケーターの作り方覚えるのめんどかった なんかこうC#みたいにこのインターフェースを実装しろみたいなのがある方が親切だよね
ありがとうございました
C++ってライブラリ作る人が使う言語で C#みたいに簡単にアプリを作る人が使う言語じゃないよな
>>277 でもライブラリ作る人が作ったそのライブラリは誰が使うの?
C++が高尚なものと言いたいだけだろ 実際そういうC++プログラマは多いがな
>>279 他の言語を見下している奴が多いよな
最高の言語はC++でそれを使っている俺は最高の奴だって自負
俺は最近はアプリはC#だけどな
至高のbrainf*ck、悠久のHQ9+、穢れ無きwhitespace
至高の上が究極ならば、究極はロゴライターでお願いします
高尚な grass
C#で間に合うならC#使えばいいじゃん わけのわからないいちゃもんつけるなアホ
C#はこれ以上進化しないでほしい。 もうラムダとかLINQとかいらない。
ちょっと僕、最近ポインタを学び始めました メモリの番地を参照したり変更したりもできちゃうのですね 僕、これは反則だと思います Javaとweb系しかいままでやってきませんでしたが、このポインタを使ってるとまるでチートしてるような気分ですわ ありがとう たけちゃんより
チートしたことあるのか 反則だな
289 :
287 :2013/03/08(金) 22:47:44.65
>>288 チートだけにっすか(満点大笑いですwww)
288さん、反則はチートの英訳ですよwww
今はテンプレートのせいでモンスターみたいになってしまったけれど、 もとは高級アセンブラだから、何でもありで、それでいてシンプルだった。
英訳って、日本語を英語に訳すものだとずっと思ってた
すみません質問なのですが、 TRUE FALSE NULLのように大文字で書く理由ってなんなのですかね 例えば小文字にしても動いたり、動かない場合があったりする気がします
TRUEもFALSEもNULLも使わないように
マクロだから
マクロは大文字で書くべしとの禿のお言葉
マクロ??マクロは使ってませんよ私 その関数がマクロで作られているってこと??
TRUEもFALSEもNULLもマクロだろうが
お前は全部自分で定義しないと使えないとでも思ってんのか
もしかして、そのTRUEやFALSEやNULLはint型で定義しているって事?
インクルードしてるどれかのヘッダで #define NULL 0 #define TRUE -1 #define FALSE 0 とかされてる
シングルトンを強制するインタフェスクラスって作れるんですか?
TRUEは1だよw VBじゃねーんだから
>>300 C++初心者の素朴な疑問なんですが、どうしてBool型ではなくint型なの?
メモリけちるため?
・++ ++・
Bool型なんて存在しない
なるほど・・・ マシン語に近いって言われる理由がなんとなくわかった気がする
どこでマシン語に近いと思ったんだ
nullって0なのかよ
そういう全角半角まじりの文字ってどうやって入力してんだ
>>303 C++にbool型はあってもBool型はない
そしてC++ではbool型はあるのでマクロを使う必要はない
Cにはbool型はない
一部の環境・ライブラリではCで真偽値型を模すためにTRUE/FALSEマクロを定義してる
bool型はないのでbool型で定義するのは不可能
せっかくC++でbool型を追加してもCとの互換から intとbool変換を無制限に許すことになったので、 bool型のご利益がほとんど無い。
312 :
303 :2013/03/09(土) 02:42:54.49
bool型使わない意味がイマイチわからないなぁ~。 C++のライブラリでもそのマクロ?なるものでint型でフラグわけるのですよね?
Cでも使えるんだから、今時は普通にbool/true/falseを使うよ。 Bool/TRUE/FALSEを使うのは一部のライブラリの方言(方便)と思っておけばよろし。
c99からだっけ、この件はcがc++の後追いだよね。
315 :
303 :2013/03/09(土) 03:12:49.34
>>313 >Cでも使えるんだから、今時は普通にbool/true/falseを使うよ。
コレが聞きたかった!安心してつかいます。
boolとBOOLは同じだと思ってたんだが64bitだと違うようだな。
どういうこと? Javaのラッパークラスとはまた別?
>>316 BOOLは標準じゃないんだから実装次第だよ。
if ( cond ) { while ( cond ) { condの部分は非ゼロなら真、ゼロなら偽という定義は変わってないよね?
> bool型使わない意味がイマイチわからないなぁ~。 > C++のライブラリでもそのマクロ?なるものでint型でフラグわけるのですよね? 間違い 純粋にC++で完結するなら真偽値マクロは使わずboolだけを使う C++からC用に真偽値マクロを定義したライブラリを使うところはそのライブラリの定義するマクロを使わなくてはならない
んー? C++で簡潔するというのがどういうのかがわかんない 例えばC++用のライブラリを作るとして、ある程度Cと互換のあるものを作りたい場合にbool方使わずにint型使ったりするってこと?
> 例えばC++用のライブラリを作るとして、ある程度Cと互換のあるものを作りたい場合にbool方使わずにint型使ったりするってこと? 大体はそんな感じ(ライブラリが外部に公開するインターフェイスやデータ構造の話) C++用がC++専用の意味ならそのライブラリはCとの互換性を考える必要はない(Cから使えなくてもかまわない)からboolを使う C/C++のどちらからでも使えるライブラリならC用のライブラリとして作ればいいけど その場合boolは使えないからマクロを用意してそれを使う
cppでcライブラリとか例外処理めんどくさくね? いちいち全部tryでラップすんの?
BOOLとboolの一番の違いはデータサイズかな。 BOOLはintだけど、boolは1バイトかint以下のことが多い。 関数の引数なら問題ないだろうけど、 配列や構造体の場合使い分けないとまずいね。
c99でも↓これ正しくないだろ。C++はどうだっけ… 規格書が手元にない。 int p(void); if (p() == true)
>>324 構造体のサイズとか気にする時に実装が環境依存のboolは使わないよ
charを使うのが普通だ
if(p()) とは動作が異なるって意味なら正しくない C99のtrueマクロは1でC++のtrueは整数拡張で1になるから それを判定したいならおかしくない まあいわゆる正しい書き方ではないだろうが
a != false と a == trueが等しくないなんちゃってboolなんか廃止すれば良いのに。
非ゼロを確実にTRUE(1)にするために良くこんなことやってるよね。 BOOL b = ( x != FALSE ) boolは2値化を確実にやってくれるところだけはありがたい。
ばちもんじゃんそれ・・・
Exceptional C++の項目45に、boolが組込型である必要性が書いてあるな。 いささか厳しすぎる内容だと思うが、それでもマクロではまずい場合が多い。 enumかclassにするのが組込型の次に良いらしい。
int - boolの変換をキャスト必須に出来なかった時点で負けが決まっていたようなものだな。
cpp自体が負け犬がいやいや使う言語だし
C preprocessor の話題はもういいよ
ライブラリの投げた例外てキャッチして自前の例外なげるのが普通なん?
>>333 C++が難しくて挫折したからって負け惜しみ言うなよ(^w^)
>>335 > ライブラリの投げた例外てキャッチして自前の例外なげるのが普通なん?
その例外をどう扱いたいかを決めてそれにあわせた処理をするのが普通
じゃあどう扱うかは外が決めるとした場合にはどうする?
>>328 a が bool 型なら
a != false と a == true は等しくなるよ
a が bool 型でない場合に保証されないのは
C99 も C++ も同じ
例外は例外的なんだから一般的な対処法なんてものはない。 まあcatchするかしないかのどちらかだとは言える。
>>338 > じゃあどう扱うかは外が決めるとした場合にはどうする?
なにもせず全ての例外をそのまま外に渡す
どこに疑問に思うところがあるんだろう?
追加情報なにも持たせないとか素人かよw
当然素人だよ。ドカタには素人しかいないから
自分が土方だからって…
土方は土曜日休みなしだよ
職業プログラマって日本では人形のプログラム開発機械扱いだからな ど素人でもなれる職業にしたから、機械扱いになるのはしょうがない 人間に生まれたのに機械になるなんて信じられない 壊れるまえに人間に戻れ
日本のソフトウェア分野は弱すぎて米にやられっぱなしですな
素人ドカタでOKの日本、優秀なプログラマを世界中から集めるアメリカ やっている連中のレベルが違いすぎて当然
つうてもアイデアがあれば実現はできるぐらいの技術はあるだろ 日本全国さがしても技術的に無理な案件てなんだ?
技術、技術って念仏好きだよな でも、ドカタには技術は禄にいらんから、素人でOKってことだろ
マ板でやれ
354 :
デフォルトの名無しさん :2013/03/09(土) 23:40:23.62
uyが好きそうなネタだな uyか? uyはコテ付けて暴れろうざい
VC++って初心者にはわかりづらすぎるよ 特にライブラリの追加。 リンカーだとかインクルードだとか設定が面倒くさすぎだし、初心者がライブラリを使いづらいし、ライブラリ自体追加したいという気にならない。 Java x Eclipseみたいにガンガンライブラリ追加できる仕組みにしてほしいわ
馬鹿はライブラリなど使うな
C++だとVC++以外も大して変わらん
358 :
355 :2013/03/10(日) 00:04:36.81
>>356 >馬鹿はライブラリなど使うな
ほれみろ。いったとおりじゃないか。結局こういう流れになる。そういう排他的な言語なのか?C++は。
どの言語だろうと自分から学ばない馬鹿には辛く当たるにきまってるだろ
ライブラリの追加が大儀なのは俺も認める
VC++じゃなくてVSの作りじゃねーの 環境と言語を一緒くたにしてしまう男の人って・・・
>>358 マジキチのクズがいやいややらされる言語がC系列だから仕方ない
性格悪い→++の案件押し付けられる→精神汚染されて性格がさらにゆがむ
この悪循環から抜け出せないんだよ奴らは
ライブラリをパッケージ化してライブラリマネージャーを各環境で作れば? CMakeみたいに
インクルードとライブライリファイルのパス設定するのそんなにめんどいか? そんなこと程度をめんどくさがってたらコードなんて書けないだろうに
>>325 c99で規格化されてるよ
お約束的にincludeおすすめ
stdint.h c用
cstdint c++用
プロパティ開いて弄るのが面倒臭いな ライブラリのリンクまではVC++だと#pragmaでいけるけど ものによってはそれもダメだし、 インクルードパスの指定はどうにもならない
stdbool ならともかく何で stdint なの
そもそも
>>365 は何に対するどういうレスなのかが理解できない
>>361 だけどやっぱIDEとともに言語って進化するのではなかろうか
>>369 EclipseとかXcodeなら肯定するけどVSは違うんじゃね
371 :
デフォルトの名無しさん :2013/03/10(日) 00:30:00.38
それならC#もわかりにくいでしょうが
C#はともかくC++はIDEとは無関係な進化しかしてないな
例えばプロジェクトにインクルードパスやライブラリファイルをD&Dで追加できるようにするとか?
C++はMSの傘下じゃないからな
いや、D&Dで追加とかじゃなくて、同じ「ライブラリ」を追加するんだから、ライブラリの追加方法は共通であってほしいのだよ 可能な限りね。 言語柄しかたないが、個別に振り分けないといけない設定が多すぎるとは思う
>>365 >>322 失礼アンカ間違えた
325は取りあえず、cなら論理式かく必要ないしあまり気にならない
強いてするならfalseと比較かな?
0固定で環境依存しないし。
関数の戻りにbool使うのはwindowsの文化だよね
基本はちゃんとエラーコードを返すべき
エラーと真偽値は意味が違うと思うんだ。
面倒だしコンパイルも遅い 悪い面が多すぎるw
>>368 おっしゃるとおりですorz
boolつかってないのばればれだ
はずかしー
RedHatのRPMっていうのは知ってるよね。あれみたいにライブラリとヘッダーをまとめた共通形式のパッケージを作れば? インストールされている開発環境を識別する仕組みが必要だな
プラットフォームに依存した形だと便利になればなるほどIDE等は無秩序になってしまうのがきついな
MacのFrameworkは比較的簡単に追加できるんだが
include/ lib/ を開発環境に上書きコピーするだけでライブラリのインストール完了、って形式がいいと思う
frameworkは楽でよかった 上書き形式だとアンインストールしたいとき少し面倒かもしれない
>>365 ,376
流れも読め。
>>322 はTRUE/FALSEマクロの話からの流れだからC99はお呼びじゃない
include/*.h lib/*.lib bin/*.dll,*.exe ?????_uninstall.bat コピーしたファイルを消すバッチファイルも付けとくか。
それ何てconfigure make install と思ったけどあれは消すとかしてくれなかったか
確か、make uninstallで消せたはず。 あ゛、UACのせいでバッチが正しく動作しない可能性があった!バッチファイルじゃダメか?
388 :
デフォルトの名無しさん :2013/03/10(日) 02:06:37.03
>>379 色んなスレで初心者に嘘教えて喜んでる精神異常は来るな
スレが荒れるだけ
ファイルの設置自体は何とでもなるけど問題はコンパイルするとき
>>388 証拠がなければあなたを名誉棄損で訴えますよ。近々東京地裁に出廷してもらいます。
>>339 そうとも限らないよ
aがbool型でも未初期化ならfalse/trueでもない値になっている可能性がある
>>391 じゃあ裁判のときに提出するからいいよ
ここだと片山一味が炎上学習法とやらで煽って回答得ようとするからな
>>393 g++で試した所、== true は最適化されて消されるようだ
396 :
デフォルトの名無しさん :2013/03/10(日) 02:45:18.46
嘘回答とか言うからだろ。 バグ仕込ませる回答、が正解。
訴えてもらったほうがいいんじゃね?w そうすれば片山がどれだけいい加減な知識で 適当なことを言ってるかを公にできるし、 2chで質問したらどれほどの糞情報をつかまされるかを 世の中に知らしめることができるw
証拠ってこの部分の証拠じゃないの? >喜んでる精神異常 回答の内容が虚偽であることを証明しろってことじゃなくて、 意図的にそういった書き込みをしていることを証明し、さらに、精神異常と認められるもの(障害者手帳など)をもって証明しろってことじゃないの? 知識が足りないだけで本人は正しいことを書いてると思い込んでるだけならこれは証明できないだろ、ってことじゃないの?
そろそろ別のところでやってくれない?
401 :
デフォルトの名無しさん :2013/03/10(日) 03:07:41.38
片山の余罪は他にもあるぞ。 質問スレッドの私的利用とかな。 (具体的にはスレッドの趣旨に関係ないブログ的利用など)
402 :
デフォルトの名無しさん :2013/03/10(日) 03:09:59.70
実名さらすって脅迫めいたこともしてなかった? 確か片山がそういう投稿してたよ
ここもapiスレぽくなってきて良い事だな
urlにも含まれるアカウント名を指摘して何か意味あんの
本人乙 他でやれ スレ荒らしどもめ
荒らしているんじゃなく、キチなりに精一杯スレを盛り上げているんだよ まー所詮キチ連中だからね
このキチ成分はC++によるものとして一件落着としよう さすがC++
どんだけコンプレックス持ってるんだ
まじでうざい 片山入室禁止って書いとけ
0~100の整数を不公平さ無くランダムに並び替えるにはどうするのが効率的ですか?
std::shafulu
「不公平さ無く」ってのを明確にしたほうがいい 「ランダムに並び替える」のとはどう違うんだ
>>414 対象としてる全ての数字が全ての順番に同じ確率で現れうることを不公平さが無いと考えてます
unsigned a[101]={0,1,2・・・}; unsigned tmp[101]; memcpy(tmp,a,sizeof(unsigned)*101); for (i = 0; i <101; ++1) a[i+X%100]=tmp[i];
あ。しっぱい X=rand(); a[(i+X)%100]=tmp[i];
>>417 それだと重複しませんか?
並び替えなので当然重複はしてはいけません
>>416 ,417みたいな何もわかっていない人のためにstd::shuffleがあるんだけどな
こうしてカルドセプトはバグったわけか
ループの外でX取得すれば重複はしないねぇ
>>421 rotateを実装したいんですね。分かります。
rand()の分布しだいで415の条件を満たしてしまう不思議
int N = 101; for (int i = N - 1; i > 0; --i) { int j = rand() % (i + 1); swap(a[i], a[j]); }
>>419 一見正しそうだが実は嘘やよくないやり方を教えるのがC/C++使いの美しい伝統
そりゃ残念だったな
リアチョン!
conio.hでキー入力があったら次のフレームへというようなメインループを作りたいのだけれどどうかくといいかな? windows.hのSleep()とか使うの?
>>429 conio.hでキー入力っつーのが分からん
kbhitとかだろ。 あとはgetcharとか。 それでSleepとか言ってるようじゃまるっきりわかってねーなw
C++と関係なさそうな話だな
在日半島人だからな
conio.hとかMS-DOS時代を思い出すじゃないか懐かしい
そうですkbhitです イメージとしては、 //メインループ while() { //単位フレームあたりの処理 ..... //もしキー入力があれば次のフレームへ .... } のようなことをしたいのでwindows.hのSleepでキー入力があるまでSleepさせておくのかなと思ったので質問しました
conio.h を使ったゲームとか 今の環境で作る人いないから 何とも言えないと思われ 昔はsleepしなくても動作がもっさりだったので 誰も気にしなかった
もうすぐ似非UNIXターミナル用意するよりDOS環境用意する方が手間になる時代になあ
kbhitでやるなら while(!kbhit()); とかで適当に待機しとけばいいだろ Sleep入れたきゃいれろ
MS-DOS環境互換のプログラミングなんて そんなつまらないことしてるなら Linux環境の方がましじゃねえか
>>438 すげー懐かしいわwhile(!kbhit());
涙が出そう
era...
442 :
デフォルトの名無しさん :2013/03/17(日) 10:04:01.04
if( 0&& f_in_check == 0 && fmovecheck == 0 && i > 0 && newdepth < 3 * INC_PLY) { 処理 } といった感じの記述があったんですが、これだと ・0 ・f_in_check == 0 ・i > 0 ・newdepth < 3 * INC_PLY がすべて真のときでないとIF文の中に入らなくて でも0があったら絶対に中に入らない気がするんですけど違うんでしょうか? 0&&っていうのが、判定のためのなんかのテクニック、ということなんでしょうか……?
コメントアウトのかわりに0&&でとりあえずその個所を無効にしただけだろ
#if 0 #endif は二箇所書く必要があるからそれを嫌ったのかもしれない
445 :
デフォルトの名無しさん :2013/03/17(日) 14:47:39.56
推理ごっこはそれまでにしとけよ白痴
446 :
442 :2013/03/17(日) 15:22:42.17
>>443-444 「絶対ここに来ない」というのを逆に利用したんですねきっと
ありがとうございました
|| が入ってると使えないけどな
>>456 それ結構やる人いるよバッドマナーだと思うけど
俺なら#if 0使うな
456が一体何をしたってんだ
ふっ これからするのさ
template< typename T, typename M = Data > struct AAA { struct Data { int a; }; }; クラス内の構造体をテンプレートのデフォルト引数にする方法ないですか?
無理 素直に外に出しなさい
はい
_if < is_void<M> , Data , M >::type みたいな感じでおk
make_heapって何に使うんですか
>>456 ヒープ(データ構造)を作るのに使います。
>>456 ヒープとしてだけ使うのにmulti_setやmulti_mapではオーバースペックで重いから
vectorとかでヒープを表現するのに使う
再帰関数(多分木の巡回)で条件をみたしたらthrowで帰る(ルートのラッパーでcatch)みたいなコードを書く同僚を説得してやめさせたいんだけどなんて言えばいいかな?
>>459 C++例外はもともとエラー通知目的で作られてそう使われてるから、意図が伝わりづらいし
たぶん遅いよ。
実測だよ実測
正常系でthrowとかやめて!
>>459 お前が throw を使わずに高パフォーマンスと高可読性を備えたシンプルなコードを示せば、
そいつは何も言えなくなるだろう。
発想は面白いとは思うが、効率は・・・ デストラクタがないなら longjmpしてもいいのだろうか
正常系でthrowはしないとかいうルールすら時には投げ捨てるべきだ
やめさせたい理由は? その手の人は、常識だとか、宗教論争的な理由では動かないんだよね。 理由とその根拠を明示しないと。
速度要件を満たせば別にイインジャネーノ
throwで帰るのか 普通returnで返さないの?
普通はreturnだよ。 でも、「普通」ってのが難しい人って、結構いるんだよね。 個人的には、そういう人も嫌いなはないんだが、会社で出くわすとめんどい。
returnを繰り返すのは遅いとでも思ってるんじゃないだろうか
再帰だと一気に全部 return とかできないから、関係箇所全部に終了判定書かなきゃいけない。 throw 一発で書くほうがずっと楽だから、実行効率と開発効率のトレードオフだね。
俺は再帰関数でthrowを使うという発想はなかったが、エラーでどうしてもやめたいときはいいんじゃない?
474 :
デフォルトの名無しさん :2013/03/20(水) 17:32:17.83
例外とエラーは全然違う概念だから
どう違っててどう使い分ければいいんすか先輩
例外のが最適化しやすいね
>>475 例外は、一般的には通常の処理の流れを変えて別の処理に移る仕組みを指す。
C++含む多くの言語ではエラーの通知を主な目的として言語機能に反映されており、
当然エラー通知に使うと便利。
基本的にエラー通知にだけ使っておけばいいけど、自己責任で妙な使い方もできるだろうし、
その中にはもしかすると有用だったり面白い使い方もあったりしないとも言い切れない。
そんなわけで、簡単な答えとしては「エラー通知以外に使うな」となる。
例外を使わない方法だと「再帰の下の階層で答えが見つかったか」を階層分確かめないといけない また、答えを下層からルートまで運ぶのに返り値でリレーしなければならないから無駄が多い
どっちでもいいけど実例としてコード書いてくれ
その無駄は本当に無駄になっているのかよ 大抵無駄な最適化だよ
481 :
デフォルトの名無しさん :2013/03/20(水) 18:20:12.61
例外はエラーのためだけなんて変な固定概念に束縛されんなよ
このシステムはメモリーを出来る限り多く確保する方針であるという作り方なら、 メモリー確保を試みた結果「確保できませんでした」となる頻度が高く そのようなシステムではbad_allocの例外は必要ない。 エラーだからといって例外とは限らない。
「例外」は「通知手段」じゃない これわからない奴がエラー通知に使うんだな
例外とエラー処理は違うという話もわからんではないが 例外はエラー処理でいいだろ。
>>478 その認識は再帰を理解していないと思われる
っていうか、例外って積極的に使うようなものじゃないよね? ときどき、catch使えばifによるエラー分岐が不要になってその分効率よくなるとか書いてあるけど、 throw()とかが役に立たない今はthrowなんてプログラムを不安定にするだけだから、使わないし使わせない。
よほど特殊な実装出もない限り、throw と catch より if の方が効率良いけどな。 ま、結局の所、実測してみないと何とも言えないけど。
>>486 逆だろ
例外はいつでも飛んでくるということを前提にしないとダメ
>>486 どういう理屈でthrowがプログラムを不安定にするなんてことになるの?
深い再帰で 各レイヤーにifを入れて分岐させるよりは throwのlongjumpに任せて例外時のみ判断が入るようにした方が高速
throwするかどうかをif使わずに分岐させるってことか?
signalを使え…やっぱりいい
別に例外使ってシンプルになるならどんな使い方だってやればいい 自分の足も他人の足も撃たないように理解して説明も出来るならだが
あれ exception速いな
気になったのでコード書いてみました
ttp://codepad.org/RwcflKZ9 環境はWindows7 64bt、 CPU はAthlon64x2 3800+
コンパイラはVisualStudio2012、最適化はO2、バイナリは64bit版を生成
結果はこうでした
Normal版 : 326 ミリ秒
Exception版 : 1346 ミリ秒
>>500 いやまじな話な
例外を使わないとifを繰り返すコストがあるが
例外はもう最近は正常系ではゼロコストだか、
例外が速いって言ってる人は大抵数行のコードだけで比較して言ってるのばっかり
例外なんて積極的に使うもんじゃない
gccもいつのバージョンからか、例外使うコードの正常系はオーバーヘッドがゼロになったんだよな
正常系にthrowを使う話をしてたんじゃなかったのか
C/C++プログラマに例外は理解できない Javaをやれ
ま、例外の方が速いなら、自己責任の最適化として使えばいいんじゃね? 例外やエラー時に、exception を使う事自体には何の問題もないと思うが、そこに速度の話を持ち込むのはいかがなものかと思うぞ。 正常系の終了処理とかでexception を使うとか言うのは、会社ではやめた方がいいと思う。
>>501 実際に throw されるパスの話をしているわけだが。
例外を制御に使うとただのgotoでしかないんですがそれは
Pythonとかに喧嘩売ってんの? もう固定観念で例外を活用しないてのは素人のやることだよ
>>501 throw するときに必ず if を使うと思うが?
異常時に例外を使う話だと思ってるアホは
>>459 から読み直せよ
>>489 catch漏れによる異常終了とか、逆に全部補足によるエラーの握りつぶし
前者は例外を追加したときに起こりやすいけど、そうでなくても標準以外の例外まで把握しないとならないとか仕事じゃ使い物にならないし、後者は障害発生の兆しを見逃すことになるから問題外。
標準で発生する例外を捕捉するのは当たり前なのだけどthrowで標準以外の例外まで投げられたらたまらないだろう。常にそれを全部把握していないといないんだよ?
だから使わせない。
javaのせいで同一視されがちだけど例外とエラーの違いはOS関係のエラーとアプリケーションによるエラーという認識なんだ。
>>477 申し訳ないが、実装が使用法を規定する、とはどうしても考えにくいのだが。
>>511 重要なポイントは伝播に有る
例外の伝播はなんの苦労もないが
エラーコードチェックは何層にも渡りイフを繰り返さなければならない
これは無論正常系でも同じことでこのオーバヘッドがプログラム全域で積み上がるとバカに出来ない無駄となるわけだ
>>491 例外の実装が SjLj ならレジスタを総入れ替えするだけだからきわめて高速。
実装が使用法を規定するなんて考えられない。
>>513 素人かよ
標準例外だけなんてバカなこと言ってるから例外を使いこなせない
>>516 で、throw を使えば、ifはいらないの?
>>516 なんでお前catchするときの話してんの?
>>513 対処漏れの可能性については、エラーが無視されるほかの通知方法よりちゃんと異常終了する例外のがマシだろ。
エラーの握りつぶしの可能性だって、例外なら明示的にやることになるから起こりづらいし見つけやすい。
例外を全部把握していないといけない、などということもない。興味の無い例外は上部のハンドラに引っかかれば
十分なことがほとんど。
例外とエラーの違いについてのその認識も、何の役に立つのかわからない。
>>515 そんな話はしてないから安心していいよ。
安心できないねえ
>>522 なんで?
throw する条件を満たしているかどうかのチェックはどうするの?
>>477 のどこをどう読んだら「実装が使用法を規定する」なんて話だと思うのかな。
エラーは例外の一種に過ぎないのに エラー以外は例外にしてはいけないと凝り固まっている奴がいるんだな
そのifなしでthrowする具体的なコードを見たいんだけど
それがエラーなのかという問題と それは例外的状況かという問題と それに例外機構を使うかという問題は それぞれ独立していて、都度都度判断すべきだろ
533 :
デフォルトの名無しさん :2013/03/20(水) 22:27:42.77
お前らの書いたソースコードって可読性低そうだよね
何か、間違った再帰の使い方をしている人が、持論を展開してないか? そもそも、エラーや例外の入るような処理に再帰は適さないと思うのだが。 通常の再帰は戻り値のチェックは行わないで、return で繋いで行くものなので、再帰末尾にreturn を使おうが throw を使おうが余り関係ない。 ほんのちょびっとthrow の方が遅いくらい。
>>507 > 例外やエラー時に、exception を使う事自体には何の問題もないと思うが、そこに速度の話を持ち込むのはいかがなものかと思うぞ。
エラー時や例外時にexception使うのは問題ないのは間違いない。
ここでの話題はエラー時ではない方の例外時に当てはまるかをどう判断するかだろう。
> 正常系の終了処理とかでexception を使うとか言うのは、会社ではやめた方がいいと思う。
正常系の中のエラー以外の例外時にexception使うのは何の問題もないと思ってるんじゃないのか?
>>536 それはたぶん throw しないときのオーバーヘッドの話。
ついにC++がゲーム開発にも使われなくなりそうだけど気分はいかが?
ゲームほどパフォを追及する分野でC++を使わないとか考えられないのだが‥‥ いったいかわりにどんな言語を使うのか?
jsとか言い出すに500円
時代は変わったってこった。 >いったいかわりにどんな言語を使うのか? そういうのもういいから。何の言語があがろうが打ち負かしたくなるのが君のような人でここの住人だろ。そういう流れにするな
今やゲームはミドルウェアで開発するのが主流だからな そこではC++ではなく、より素早く開発できる言語が用いられる 我々はもうOSを開発するしかないんだ
>(俺の知ってる範囲では)ついにC++がゲーム開発にも使われなくなりそうだ(と耳にした)
>(俺の知ってる範囲では)ついにC++がゲーム開発にも使われなくなりそうだ(という事にしないと俺の気が済まない)
マジでハイスペな超美麗ゲームでもなきゃ今時のマシンでCPPはオーバーすぎるよ
>超美麗ゲーム あぁ昨今の画だけの内容無いゲームのアレね。
c++だと中身のこと考えてる余裕ないからな
画面叩くだけでカードをゲットするようなゲームならC++は要らないな まあ、ミドル以下は必須だろうけど
だけど市場はそれを必要としていないというか、 >画面叩くだけでカードをゲットするようなゲーム を大手は本腰入れてやってるんだよね
まだC++にスクリプトを組み合わせるのが主流だよ スマホ向けとか一部unityを使った開発とかはC++使わないけどまだ少数派だね 大手も力入れてるけど、開発じゃなくて広告の方に金を投入してるだろ
なんでスクリプトなんかつかうんだろ
プログラマがイベント直打ちしてたら高くつくから
なんか組み込みスクリプトで開発効率あげたぜぇ~っていうとかっこいいじゃろ
技術的にはスクリプトもC++もそんなに変わらんと思うが。
テストが楽だからな 無駄なコンパイルは馬鹿のすること
スクリプトってjavascriptとか? それとも独自スクリプトを作って ゲームプログラム本体がゲーム機のCPU使って実行するの? そんな仕組みにしてまでスクリプト使うんだね。
スクリプトで世界が周りだしてるのに何をいってるんだ
今だにスクリプト否定派居るんだな 逆に実行速度が足りてる部分にC++使う理由がないんだが?
老害ここに極まれりだな スクリプトと聞いてjavascriptとか
こんな実のない議論して。みんな暇なんだな。
2ch書き込んでる奴で暇じゃない奴なんていねーよ
JISC のサイトで見れる C++ の規格って索引が無いっぽいんだけど、みんなどうしてんの
>>563 買えって事だよ
あれはスキャン、しかもわざと荒くスキャンしただけ
自分で作ってますよ 自動で
ISOの方しか読んでない
567 :
デフォルトの名無しさん :2013/03/22(金) 20:07:50.12
で、何スクリプトを使うんだ?
IT業界はちゃんとしたプログラマーに金を出さないから 世の中糞みたいなソフトだらけになるんだよな。 まずC++もできないような頭の奴に仕事を出すのが間違いなのでは?
LuaとかC++に組み込んで使ってる
>>568 今だにC++に幻想抱いてるコンクリート脳に仕事出す方が危険だよ
C++まともに使える奴探すと人が集まらないんだよ
ガベコレのある言語って、ゲームにどこまで使えるの
>>571 金のなる木である大規模プロジェクトに使えないようじゃだめだからな
馬鹿
>>573 さすがに、そんな事は無いだろ。gnue compilerもたしかC++に移行だし、
他にも、近頃はC++派が多い。特にgoogle周りには。
単純に日本だとC++が出来ても評価できる上が居ないから、
人材が流出しやすいだけだと思うよ。
まぁ、なんというか日本の環境が~とか言う気は無いけど、
勉強しつづけられる人じゃないとC++はね・・・
C++98 C++03 C++11 C++14 C++17 ...
577 :
デフォルトの名無しさん :2013/03/23(土) 03:23:12.01
最強は CC++999
>>576 そんな高レベルな話じゃないっしょ
日本でC++プログラマ集めるとメモリリークとかアクセスバイオレーションとか
起こしてそれで何日もはまるようなPGばっかで・・とかそのレベルっしょ。
素人の俺でもアプリ作るのにメモリリークなんか一度もした事無いのにメモリリークさせる職業プログラマなんて本当に実在するのか?架空の人物像で騙そうとしてないか?
関係ないけど想像力が足りない人って怖いよね。関係ないけど
>>579 世の中にはアプリと呼べるような規模や複雑度では解決できない問題が山積してるのぢゃ
582 :
デフォルトの名無しさん :2013/03/23(土) 09:48:31.08
むしろ一人の方がメモリリーク発生しにくいんじゃないの
まぁ今は広く普及したスマポがあるしな スタックぶっ壊す奴はいまだにいるけど
広く…
スタンダードやん
>>579 居るからJavaやVBが選択されたんだろ。
でもそれって正規のプログラマじゃなくて派遣奴隷とか野良PGでしょ? それならプログラマって呼ばないでほしい
儲からなきゃ何をほえても無駄。君が言うプログラマと呼べないやつでも商いを成功させていたら評価できるんだよ。 君より知識のない若手でもその辺しっかりしてるヤツは多い。
マ板でやれ
誰も金の話なんてしてないのに詭弁のテンプレですな
あほやなぁ 儲けたいならPGになんかならねぇよ その時点で負けなんだからあとはカスどうしで腕のよしあし競うしかないだろ
社会の話してるだろ それとも日本社会は金でまわっていないと妄信してる学生か?
哀れな奴隷たちが必死に自分たちは金を社会を動かしてるんだとわめいている 金や社会を動かしてるのは別のやつでお前らは機械的に与えられた処理をしてるだけなんだよ 電気を与えられたコンピューターのように、はした金をエネルギーに変えて計算する機械 それがPGだ。一著前になにかを成し遂げたような気になっているんじゃあないぞッ!!
暇人品評会会場
>>588 そいつらは別に商いを成功させてるんじゃなくて
そいつらをこき使って商いしてるやつが成功してるだけで
本人たちは糞みたいな時給です。
つまりちゃんとした技術者がちゃんとした給料を受け取れないのは
業界の違法なサービス残業や偽装請負などで薄利多売で無茶するから。
そしてそれはソフトウエアの品質も下げている。
客は金を払っているが天下りSIerやピンハネ人繰り屋それを盗んでいるので
PGの地位も賃金もソフトの品質も低く、客は高い金を払わざるを得ない。
で、言語仕様と何か関係でも?
ぐうの音も出ないようです
C++のpathの変数値を間違えて消してしまったんですが、どこで変数値は分かりますか?
諦めて再インストールしろ
Javaや.NET CLRでもリークさせることは可能。 リストに際限なく要素を突っ込んでいけばいずれ限界がくる。 リークのしやすさに違いはあるが、最終的には設計のわかりやすさと 担当レベルの技術力しかない。
>>601 それリークじゃないじゃん
単にメモリを使い果たしただけ
そもそも「メモリリーク」ってどんな現象なんだ? 使い終わったメモリ領域を再利用しないでいるのがメモリリークとちゃうの?
リソースを制御する情報が失われ リソースを解放できない状態
ということは、解放し忘れとリークは全くの別物か 解放し忘れ : 解放しようと思えばいつでも解放できる リーク : 解放不可能
ん? じゃあ、厳密にはメモリリークは検出できない?
使用メモリが増えてけば たいていはメモリリーク。 確保と解放の時にアドレスをログに 出しておけば 漏れたかどうかはわかる。
>>603 C/C++でダングリングポインタと呼ばれる現象がそれ
つまりmalloc/newで確保した領域を解放する手段がなくなる
GCを備えている言語では原理的にメモリリークは発生しない
単なる怠慢
>>607 それは、リークなのか解放し忘れなのか検出できんことない?
>単なる怠慢 主語は何かな?
メモリリークについて正しい意味を知りたかったらExceptional C++の第2章を熟読しろ ただしGC言語でもリソースリークはあり得る 例外が発生したらリソースを解放するパスが二度と実行されない可能性はある
>>610 お前難癖付けて理解したくないだけだろうがカス
重箱の隅をつつくようなマネをする前に意味が分かるだろうが
答えたくないなら答えなくてもいいですよ、もちろん。
>>606 エレクトリックフェンスとか使えばできんじゃね? 使ったことないけど
>>608 >
>>603 >C/C++でダングリングポインタと呼ばれる現象がそれ
ちげーよ。10年ROMってろ、ヘボ
なんでリーク起こるの?スマートポインタ使ってもダメなの?
意外ッ!!それは循環参照ッ!!!
ダングリングポインタっつうのはダングリング状態のポインタのことだよ
例外安全という概念があってのう
>>615 メモリの枯渇とメモリリークをごちゃ混ぜにすんな
例外処理中の例外て考慮しますか?
622 :
デフォルトの名無しさん :2013/03/23(土) 21:00:27.35
>>620 寝ぼけたふりしてとぼけてんじゃねーぞ
ダングリングポインタを説明してみろ
例外処理中の例外は即terminate()される
連レス失礼 terminateはデストラクタでの例外だった、catch節中の例外はより外側のtry-catch節で捕捉されるはず
メモリーリークというのはアプリケーションの処理のサイクルのなかで 本来解放すべきメモリーを開放せず、サイクルが進むにしたがってメモリが無駄に枯渇する現象で設計ミスです。 C#などでは参照を管理しているので、参照がなくなれば消してもらえるが 参照しっぱなしなら結局リークしていることになる。 ただしC#では参照しっぱなしという状態は作りにくい。 リストにガンガン突っ込み続けるとかそういう本当にアホな事をしないと起きない。
GCってVRAM回りにも効くの?
void X::Func() { try { // DoSomething } catch(exception const & e) { string s("ERR in X::Func(void);"); s += e.what(); throw X::Exception(s); } こんな感じで例外にデバッグ情報を追加していってるんだけどstringでbad_allocしたらどうするべきなんだろう
628 :
デフォルトの名無しさん :2013/03/23(土) 21:46:08.03
bad_allocしないallocator
素直に終わっといたほうがよくね
>>627 再throwで型を変えてしまったら「デバッグ情報を追加していってる」にはならないよな?
try { func(); catch(MyException&e) { e.add_debug_info(foo); throw; }
うーんならどうするのがいいのだろう 深いところで例外を投げられてそれが伝播してくともうどこで起こったかぜんぜんわからないんですよね
>>632 Boost.Exception を使え。
>>625 だからその参照を管理しているのを消せば勝手にGCが走った時に解放されるでしょ?
ダングリングポインタというのは例えば
int* a = new int; // (1)
a = new int; // (2)
とやった時に(1)でnewした部分を解放する手段がなくなる事を言う
こういうのが本当のメモリリーク
GCを備えている言語ではメモリの枯渇は起きてもメモリリークはおきない
ちゃんと自分で参照を消せばそれでいい話
だから じゃねえんだよ そんなもんわかってんだよ 広義では参照解放しないのもメモリーリークだっつってんだろ 市ね
ダングリングポインタでググろう!な!
>>635 参照を解放しないのは単なる手落ちだろ
相変わらず参照を解放する手段は残ったままだ
それはメモリリークではない
故意であろうとバグであろうと解放する手段が残っているうちはメモリリークではない
解放する手段がなくなった時がメモリリーク
>>636 ダングリングポインタについては俺が誤解していた
しかし
>>637 で言った事は変わらないぞ
639 :
デフォルトの名無しさん :2013/03/23(土) 22:37:10.88
>>634 このバカ、本当にダングリングポインタしらねーでやんの。
晒し上げ
無理やりダングリングポインタでメモリリークを説明するならば、 int* p = new int; // (1) p = 0; // (2) (2)の時点でpはダングリングポインタになる そして(1)で確保した部分を解放する手段がなくなるので この時点でメモリリークを起こしたと言える
>>635 「広義」なんて言葉、このスレで初めてだ
>>637 参照を解放する手段がなくなってる時の話をしてるんだが。
たとえば参照を握ってるコンテナからの削除に至るUIが無い場合とかね。
644 :
デフォルトの名無しさん :2013/03/23(土) 22:43:48.11
>>640 このバカ、まだダングリングポインタを理解して無い。
>>643 参照を握ってるコンテナがスコープを外れたらGCでコンテナごと削除されるんだけど
>>645-646 ↓これで伝わるかな?
class UI {
private static Container<Object> objects;
public void add(Object x) { objects.add(x); }
public void remove(Object x) { /* コンテナからの削除を書き忘れた */ }
// ...
}
アホなコードだと思うだろうが、こういうアホなことをすればGCのある言語でも
メモリリークという現象は生じることになる。
もしかしてDとかJavaとかC#を一度も触った事がない奴がファビョってるだけか
最近C++ 使えてもC#は使えないって話がでてますけど 本当でしょうか? C++使えれば多言語でもできそうな気がするけど
>>647 なんか他の部分の実装次第で起こりそうな起こらなさそうな・・・
>>649 単なるバグだったらメモリリークじゃないって言うの?
単なるバグじゃないメモリリークのほうが少ないと思うんだけど・・・。
お前の中の「メモリリーク」の定義を整理して書き出してくれ。わけがわからない。
>>647 あーいや、objectの追加削除に関しては他の実装部分がないのか・・・
すると手段がなくなった時点で、という定義に照らし合わせるとメモリリーク?
メモリリークって Wikipedia で見ると、日本語版と英語版で説明が違くね? 日本語版 : プログラムが確保したメモリの一部、または全部を解放するのを忘れ、 確保したままになってしまうことを言う。 英語版 : In object-oriented programming, a memory leak may happen when an object is stored in memory but cannot be accessed by the running code. 日本語版は「解放忘れ」、英語版は「アクセスできない」 まぁ、チラッと読んだだけだから、 結局同じ事を違う言葉で言ってるだけなのか知らんが。
>>653 解放する手段はあるだろ
Containerに直接触ればよい
クラスで包んで「あー解放できないやー」とか言って誤魔化してんじゃねーよ
>>654 英語版はmay happenなので定義ですらない気がする
>>653 自己レスだが訂正すると、UIにaddされたオブジェクトが他で開放されてれば別にメモリリークじゃなくなるな
>>655 インスタンスのobjectsにはアクセスできなくね?
>>655 んなこと言い出したらCのfree()忘れだって「ヒープに直接触ればよい」わけで、メモリリークにならんぞ。
どうでもいい けれどきになるお年頃
>>657 だからインターフェースのバグだっつーの
オブジェクト指向によるprivateと解放する手段がなくなる事を同じ意味で捉えるな
>>658 話が飛躍しすぎ
外行って頭冷やしてこい
お前の中の「メモリリーク」の定義を整理して書き出してくれ。わけがわからない。
>>660 メモリリークの定義が、アクセスする手段がなくなった時点で、ということなんだよね?
privateはその一種なのでは?
>>663 >>654 の英文が果たしてオブジェクト指向を考慮した物かどうか分からなければ
これ以上議論しようがない
というか
>>654 は
In object-oriented programming,
で始まってるんだからprivateも含むような気がする
666 :
デフォルトの名無しさん :2013/03/23(土) 23:15:24.33
プロセスを開放すればメモリも開放されるんだから メモリ解放の手段がないのがメモリリークというならWindows95まで立ち返らないとダメだな。
>>666 by the running code
例えばprivateなコンテナをメンバに持つclassをnewして、それをプログラム終了時まで 使うとすれば、もしこのclassにコンテナから削除するコードがなければメモリリークだな
typedef std::shared_ptr<foo> Object; class UI{ static std::vector<Object> objects; public: void add(Object x) { objects.push_back(x); } void remove(Object x) { /* コンテナからの削除を書き忘れた */ } }; うーん・・・
>>670 だからさ、保護レベルもメモリリークの一因だと決着が付いたんだからそれでいいんじゃね
GCあればメモリリークはおきないとか言ってたバカは居なくなったか。よかったよかった。
このスレに居なくなったからといって存在しなくなったわけではない その考えこそメモリーリークみたいなものでは
shutdown
うまいこといってしめるな
「解放し忘れてますがアクセス手段は残ってます。だからメモリリークじゃありません!」 このボケ死ね。 もういいから己を生から解放しろ。
delete [] me;
多重人格か
いいこと思いついた。 1日1回サーバー再起動すれば メモリリークなんて無くなるんじゃね?
681 :
デフォルトの名無しさん :2013/03/24(日) 02:27:22.43
1日20Mづつリークするけど月1でリブートするから 対応しなくておkってシステムあったわ。ちなみに官公庁
合理的じゃないか 逆になぜ金をかけて治したがるのか?
>>681 そりゃ発注側はプログラマーのオナニーの為
じゃなくて、サービスを提供するために
金払ってるからな。
「プログラマーはバグだらけのシステムしか作れないクズ」
と割り切るのには慣れているだろう。
リブートって了解取るのが結構面倒なんだよ 相手が行政だとなおさら
1.参照されず(未定義でない環境非依存のコードでは)解放できない状態派 2.参照されてないけど標準ライブラリの内部データをいじって解放できたらリークじゃない派 3.参照されていても解放が実行されないバグ派 4.再起動最強。リークなんて幻想派 昔は1をメモリリークということが多かったけど 3もまあいいんじゃないかと思う。 2と4はこのスレで初めて見た。
>>685 それだけ自分の意見を通すだけのためにデタラメを言う奴が多いって事だ
例外処理中の例外について上でちょっと出てたけど、C/C++って上の階層に例外投げられないの?
できるよ
↓例外の情報追加はこれがお勧め template<typename InnerException> class MyException: std::exception { std::string msg_; InnerException inner_; public: MyException(std::string && s, InnerException && e): msg_(std::move(s)), inner_(std::move(e)) {} // ry }; try { do_something(); } catch(std::out_of_range & e) { throw MyException<std::out_of_range>("error: do something", std::move(e)); } catch(std::bad_alloc & e) { throw // ry
>>689 スライスされてんじゃねーか。型も変わってるし、多段にできそうにもないし。
Boost.Exception でいいよ。
C++の例外むずかしすぎーJavaみたいにして
どこスラ?
inner_(std::move(e)) だな
ちゃんとキャッチすればスライスなんか起こらないだろアホか
C+11限定じゃねーかという突っ込みはないのか
というかお前ら例外処理中のメモリ確保はご法度って知らないのか 当たり前のようにstringとかつかってて笑えるんだが?bad_allocで死ぬぞ
>>696 オリジナルの例外のかわりに bad_alloc が飛ぶだけで、別に死ぬわけではない。
例外の再スローはメモリ使ってないの?
newしてないから使ってないとは言えない気がするけど(スタックとか 予め確保されてる中でやりくりしてるのかな?
例外中にログを吐くのもダメですか
bad_alloc の時は正直余計な処理したら変になりそうで怖いので 死んでくれた方がいい気もする
>>696 お前は例外ハンドラの中で何をしてるの?
>>700 スタックが足りなくなったらbad_allocとは違う理由でプロセスが死ぬだろう
>>701 エラーが出ると危険だ
エラー情報を静的領域に保存してプログラムを安定させてから吐き出そう
>>705 エラー情報はそれでよくてもI/O処理が内部でメモリ動的に使ってたら意味なくね?
別プロセスでロガーを立ち上げておいて、 初めからそいつとのパイプを開いておけば良い。
プロセス間通信エラーったらどうすんの?
予備のプロセスをあらかじめ立ち上げておいてだな・・・
予備のプロセスがエラーしたら
>>705 の言うように予め確保しておいた静的メモリ利領域にログ情報を書き込んで、
最後プロセスが死ぬ時にメモリダンプすればいいじゃん
例外捕まえてなにするの?
逮捕しちゃうぞ!
>>711 ログ書き込む前に死ぬかもしれない
死ぬ前にログを書いた方がマシ
僕は耳と目を閉じ口をつぐんだ人間になろうと考えた
716 :
デフォルトの名無しさん :2013/03/24(日) 17:37:55.26
友達のあんどろは結構再起動必要みたいだけど あいほんはOSアップデートの時以外再起動したことないなー アプリ作ってるときはXCodeで警告だしてくれるけど優秀なのかな
>>616 いろいろな言い方がされているけれどアプリケーションの実行中にリソースが枯渇する現象を「メモリリークしていた」と説明することもある。
まあ、確保と解放を同じスコープ内で行えるようにしていけば、基本は平気なのだけどね。
でもgcあっても参照されていないことにならなければ解放されないから、gcあるから大丈夫なんてのは都市伝説だと思った方がいい。
メモリリテンションいうのだったかな?
ごめ、用語はわすれた。
用語もうろ覚えで具体例もなくまさにFUD
コンサバGCなら解放されない可能性もあるわけだが、これもリークかね?
>>717 >確保と解放を同じスコープ内で
なにかの×ゲームですか?
×ゲームかどうか知りたいならググれ 何でも質問するんじゃない
スコープを越えて寿命を維持したいからnewをする場面が多かろうに
まじでC++使われなくなっててワロタ・・・
普通に仕事で使ってるけど
C++しかできない俺オワタ
スコープ超えたいだけならstatic変数でええやん
std::list::sort以外で std::listの中身をソートするSTLのアルゴリズムを教えて下さい
>>723 C++は少なくともJavaよりは長生きするから心配しなくていいよ
>>728 できないっす。operator-がどうたら言われます
>>727 listをソートするにはSTLではlist::sortしかないはずだが。
>>728 >>730 std::sortのイテレータのtraits要件はRandom Access Iterator
std::listのイテレータのtraitsはBidirectional Iteratorだからstd::sortは使えない
コンテナにalgorithmと同じメンバ関数がある場合は、メンバ関数を使うのが基本ね。
>>733 std::begin/endみたく勝手にやってくれないだろうか
>>722 可能な限り生成と同じ場所で?破棄するのがいいよねという話です。
そうすれば、確保と解放が一緒に確認できるので解放が漏れることはなくなるから。
リソース確保した結果が、有効なうちに破棄していることが確認できれば問題はないという目的でスコープ内と表現したので、単純にnewしたもどりがスコープ越えちゃっただけなら同じ話だと思う。
でも、可能なら管理した方がいいような気もする
まぁc++の場合、スタックサイズに制限のある環境でなければ、newが必要になる場面なんてほとんどないから普段はあまり意識しませんけどねー
スマポ使えでFA
なんでc++11でC#のプロパティやらなんやらパクらなかったんだろう 意地張ってないでいいところは素直に取り入れればいいのにね
そういう化石みたいなお荷物を囲い込みたいんじゃねーの 今度からアンモナイトC++と呼ぼう
プロパティは文法が決まらなかったんじゃないのかなあ わからないが
暗黙のコード仕様の追加はよくよく考えないと 暗黙なのに使用には熟考が必要なコピーコンストラクタみたいな事に成るからね
C++は今や周回遅れの言語だからな 積極的に便利にしていかないと使用者がどんどん減るな
PCアプリはともかく組み込みはやっとC++に移行してきたところ
組み込みぐらいだと逆にCのがやりやすいだろ
組み込みつーのは、家庭用ゲーム機やゲーセンなんかのゲームも含まれる?
組み込みだってRAMもROMも、使えるリソース増加中なので、 でかくなってくりゃCよりC++が楽になることもあるわな
>>740 perlみたいに名前付けたブロック系をbreakとかできるようにはしてほしかった。
いや、マジであればすごい便利だと思うんだ。
Javaにもあるね
組み込みLinuxじゃQt使う事すらある
C++は標準ライブラリが糞だからな。 ガベージがないからコレクション系がおのずと使いにくいアルゴリズムなことになってしまうんだが それにしても糞。 C++の黎明期に標準ライブらつくったやつらのオナニーのせいで伸び悩んでるんだよ。
一部は機能のデモンストレーションになっちゃってるからね・・・ そのせいでvector<bool>とかcoutとか邪悪な代物があるけど それほど悲観するほどでもない
せめてライブラリ追加が楽なら救われたのにそれも面倒なのがww
ライブラリ追加どうこうは言語というより環境の問題じゃね
C#もライブラリの追加面倒だったぞ
ライブラリ追加って何? 何に追加するの?
std名前空間
C++プログラマはこのオープンソースの時代にライブラリ追加もしらないのな
C++プログラマは必要なライブラリ取ってきて利用するだけで、 わざわざ追加なんて言葉を使わないからな。
ライブラリ追加って具体的にはどういう作業?
stdの呪縛から逃れた使いやすい代替ライブラリないのかよ
STLコンテナの要件ってどんなのですか?
>>762 ダウンロードしてきて使いたい環境用にコンパイルしてみたいなことじゃないの?
>>764 規格読め
正確に知りたければ結局それが早くて確実
>>759 もともと std 名前空間にない外部のライブラリを
わざわざ std 名前空間に入れるのは何故?
その作業は少なからず苦労すると思うが、
その苦労に見合ったメリットが私には思いつかない。
違うnamespaceを使えばいいだけの話 boostだってboostという名前空間だろ
> 正確じゃなくても要約でいいです いくつかのtypedefされた型と規定された動作をするメンバ関数をメンバに持つこと
772 :
デフォルトの名無しさん :2013/03/26(火) 15:22:12.79
英語が読めないなら勉強すべきはプログラム言語ではなく英語だな
理系で英語読まない奴は何をやってもダメ 害を及ぼすのみ もうこれは絶対法則
気が大きくなってますね。
>>774 それは言い過ぎ
時間がない時にサラッと読めるのはやはり日本語
>もうこれは絶対法則
いやあんたの価値観が他人に通用するとは限らないからそういう書き方はおかしい
いくら現実逃避したって明らかなものは明らか
自己完結的な世界だなあ。
優秀なら英語サポートのための部下をつけてもらえるさ
>>777 明らかなら証明してみろ
反証可能性って知ってるよな?これがない物は明らかも糞もない
なぁ、それ今ここで議論しなきゃ駄目なのか? つまんないんだけど。
782 :
デフォルトの名無しさん :2013/03/26(火) 17:59:17.25
人的な問題はマ板でやれよ
783 :
デフォルトの名無しさん :2013/03/26(火) 18:27:57.41
うるさいゴミ
>>783 お前の部分だけ言っている意味が全く分からない
786 :
デフォルトの名無しさん :2013/03/26(火) 20:18:25.25
板違いは板違い 但し今後このスレで英語すら読めないゴミに気を使って日本語のドキュメントを探してきてやる必要はない
>>786 そんなこと、子どもみたいにわざわざ宣言しなくてもいいと思うよ。
相手に合わせて和洋ドキュメントを選んでくれる人もいれば、
そうじゃない人も当然いるわけで、そんなのは普通のことだから。
>>787 だから
>>786 は自分を中心に世界が回ってると思い込んでる自己愛性パーソナリティ障害だから
放っとけって
病気のひとを差別する気満々でもない限りはそういう書き方はいけないよ。 あくまでその人の人格的な問題であって、各種疾病のせいなんかじゃないよ。 人格が破綻した駄目な奴なだけだよ。
>>787 そういうバカは身の程をわきまえて、英語メッセージのツールや日本語ドキュメントが整っていないツールには一切近づかない事だ
791 :
デフォルトの名無しさん :2013/03/26(火) 20:50:11.89
英語も読めないキチが発狂してワラタw お前ら生きてる価値ないなw
まぁコンパイルエラーのメッセージさえ読めないというか読もうとしない奴は 死んで欲しいところだけど
>>785 部下を持ってる人は日本中誰であっても英語が読める人だと言いたいのか
>>789 >人格が破綻した駄目な奴なだけだよ。
まあ同じ事だなww
英語厨発狂w
技術文書の英語くらい読めないとどうしようもないよな それくらい読めたって「英語出来る」なんてとても言えないレベルだぞ
一人だけ発狂してる奴がいるな 英語できないのに英語英語いうやつが
まぁMSDNの日本語ページの詐欺っぷりに騙されたことがあるやつだろう
そもそもC++使ってる時点でこいつ英語できないんだなと思われる社会ですが。
800 :
デフォルトの名無しさん :2013/03/26(火) 23:55:30.15
>>793 お前バカだろ。逆は真ならずって知らねーだろ。
Windows8が売れなくて Windows携帯も売れなくて Microsoftもオワコンになる?
802 :
デフォルトの名無しさん :2013/03/26(火) 23:59:28.70
論理積じゃない&&ってどういう意味?
move
805 :
デフォルトの名無しさん :2013/03/27(水) 00:23:25.76
vector<string> vs; を初期化したいんですが、 {"aoieo kakikukeko", "sasisuseso tatituteto", "naninuneno hahihuheho"}; 順番にpush_backとかで代入するしかないですか?
右辺値参照でググれ
>>805 最新規格のC++11なら = { ... } で初期化できるが
対応してないならpush_backするか
別に配列を用意してその配列で初期化するかだな
なんで初期化したいのか書いた方がいいんじゃないの
static const char* vs_def[] = {"aoieo kakikukeko", "sasisuseso tatituteto", "naninuneno hahihuheho"}; std::vector<std::string> vs(vs_def, vs_def + _countof(vs_def)); _countofはVC++のマクロなので ないなら自分で似たようなの作る
やりたい事によっては外部ファイルから読んだ方がいいしな
>>809 std::begin std::endでいいだろ
std::begin, std::endってC++11だろ。だったら{}で初期化できる。
まあ、自作可能だけどな
っていうかさー &ってなに なんでアンドってよんだり暗パーサンドって言ったりするの? っていうかそもそも暗パーサンドってなに?なんで変換できないの? アンパーサンドってアンドの親戚かなにか? 俺ら&がめちゃ身近になってるけど 実は謎だらけ。
けっ つまんね
using namespace std
http://codepad.org/Tgv7qrba 参照ムズカシイネー
上のコードではBのコンストラクタでAのコンストラクタを呼んでるんだけど
const参照で保持しておけばBが死ぬまでAを抑えてくれるかと思ったらそんなことないのね
この場合、constでAを予め生成しておくのか、Bの中にAを実体で持っておくのか
どっちが良いの?
自分が寿命を管理しないリソースをメンバに持つな
>BのコンストラクタでAのコンストラクタを呼んで ないよね
>>818 constの参照は一時オブジェクトを束縛するってやつだろ?
でもそれをメンバに持ったら、コンストラクタから帰還次第一時オブジェクトは
解体されてしまうんで参照先がなくなる
ま、悪い事言わないんでコンポジション使っとけ
スマートポインツ使えよ
スマートポインタは絶滅しろ
ナマポは絶滅しろだろ
STLについての質問ですが、 std::set<T>での集合演算(共通部分や(集合の)差)のコンパクトで実行効率の良い書き方って、どうなんでしょうか、、、 *(イテレータ)に書き込みを行えるタイプのコンテナ(std::vector<T>とstd::list<T>)であれば std::set_intersection()とかstd::set_deference()が使えるのですが、 いかんせんstd::set<T>はそうではなく、VC++2010でコンパイルエラーになります、、
>>826 std::inserter() の出番かな。
>>826 演算結果を書き込む時にエラーが出るだけなら、std::vectorにback_inserterなどで
outputしておいてそれをstd::setにinsertすりゃいいじゃん
>>827 ああそうかstd::back_inserterはstd::setに使うと意味が変わるのね
やった事ないから分からなかった
const int N = 100; int main() { std::set<int> si1, si2, si3; for (int i = 0; i < N; i++) { si1.insert(std::rand() % N); si2.insert(std::rand() % N); } std::insert_iterator<std::set<int> > ins3(si3, si3.begin()); std::set_intersection(si1.begin(), si1.end(), si2.begin(), si2.end(), ins3); std::copy(si3.begin(), si3.end(), std::ostream_iterator<int>(std::cout, " ")); } こんな感じだな ちなみにstd::back_inserterをstd::setに使おうとするとコンパイルエラー
std::setはstd::back_insert_iteratorを持ってないからな
>>830 > std::insert_iterator<std::set<int> > ins3(si3, si3.begin());
> std::set_intersection(si1.begin(), si1.end(), si2.begin(), si2.end(), ins3);
そこは↓これでいい。
std::set_intersection(si1.begin(), si1.end(), si2.begin(), si2.end(), std::inserter(si3, si3.begin()));
>>831 push_back() を持っていない、の間違いだろ。
834 :
826 :2013/03/30(土) 11:18:02.86
レス㌧クス、 >832式に行ってみようかと、 しかし#include <iterator>って何だよなんでiteratorみたいなちょー基本概念に関する手段がなんで別のヘッダファイルに隔離されてるんだよコンテナのヘッダをインクルードしただけで使わせてくれよ、、、 とそこはかとなくオモタ、
コンテナだってアルゴリズムとヘッダ分かれてるだろ そういうことだ
意味分からん シンボルが見える(宣言される)ことと、シンボルが指す機能の直交性に何の関係が
オールインワンにしろってことだろうか
>>818 const は寿命を制御するわけではないようだね。
普通に委譲的手法で B::B() で A を new するしか思いつかない。
839 :
デフォルトの名無しさん :2013/03/30(土) 16:49:43.27
出たw委譲的手法厨w
そっか C++ は委譲を意識しなくてもいいんだねえ、Java とちがって多重継承ができるからねえ
>>818 >>819 の言うとおりだな。
BがAを所有してないからおかしくなる。
BがAの実体を持つようにして、
右辺値参照でもスマポでもいいけど
ムーブする所。
右辺値参照厨は黙ってろって
というか、参照型は実体のある(NULLじゃない)ポインタ変数だろ? 暗黙の型変換でのスコープ範囲はずれればデストラクタ発生するのはあたり前なんじゃないのか? 俺的には Aは、実体として宣言するか、実体のrefを保持するのが無難だと思う。 使うときめんどくさくなるから、コンストラクタやデストラクタで例外が発生する処理は避けるなあ
844 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/30(土) 23:43:35.11
strlenにはstd::を付けて、wcslenには付けない。なんで?
VisualStudio2010や2012で2005のコンパイラを使えますか?
C++の仕様に関係してるのか、日本語が?
Syntax error とか コマンドまたはファイル名が違います あんまり懐かしいとは思えないな。日本語でまでやる事無い
849 :
デフォルトの名無しさん :2013/03/31(日) 06:24:21.84
>>878 みたいなのは、緊急時に報道や連絡が違ったっつって一歩も動かず
災害に会ってそのままアボンするんだろうな
まぁ、それはそれで本人がそれで良いっつってんだから誰も止めないけどw
850 :
デフォルトの名無しさん :2013/03/31(日) 12:20:47.57
template< typename T > struct Test { template< typename U > explicit Test( const Test< U >& other ){} }; int main() Test< int > a( Test< int >() );
template< typename T > struct Test { template< typename U > explicit Test( const Test< U >& other ){} }; int main() { Test< int > a( Test< int >() ); // warning C4930: 'Test<T> a(Test<T> (__cdecl *)(void))': プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) return 0; } という警告が出るのですが何故ですか
>>852 たぶん変数の定義を意図してるんだろうけど実は関数の宣言と解釈されてて、
その関数を呼び出すコードも無いし、ますます変数の定義なんじゃないかとコンパイラが
疑ってるから。
ようわからんし興味本位で言うが、Test<T>にデフォルトコンストラクタでも定義すれば解消するんジャネーノ? なんか個人的にC++の仕様書を読んだら気が狂って死んでしまいそうな気がする、、、
853の言うとおりでは。 Test<int>() が関数宣言だと認識されてるだけ。
>>891 文語(四段活用)と口語(上一段活用)が混ざっている
>>891 文語四段活用と口語上一段活用が混在している
891へのアンカーがあるてことは大量に削除されたってことか? それとも誤爆?
typename
Test< int > a = Test< int >(); だと警告は出ません。デフォルトコンストラクタ付けてもだめでした。VC2010です。
Test< int > a( Test< int >() ); 全体で関数宣言であってTest<int>()は引数の型でしかないんだよ わかってない奴はだまってろ
だまってましたが、なにか御用でしょうか?
EffectiveC++だかExceptionalC++だかに載ってた例の典型じゃん
most vexing parse
かっこつけろ
FAQだ
ふと思ったんだが__FUNCTION__マクロみたいにコールスタックが呼び出せるマクロがあったら 色々捗りそうな気がしたんだが、ちょっと調べてみたところ見当たらないということは、自作するしかない?
glibcでそういうのなんかあったような気がした
ISO/IEC 14882:2011 20.10.5 Comparison of ratios の段落1 は <ratio> の他のあらゆる規定と矛盾してるよね? == はオーバーフローしないって、ただそれだけのために、こんなアフォな仕様を誰か強硬に主張したの?
>>867 __builtin_return_address と _ReturnAddress
それに関しては他言語がうらやましい printStacktrace()一発だもんな
>>871 Java使ったことないからしらなんだが、Javaにはそんな便利なのがあるのか。
>>869 オーバーフローしないんじゃなくて、
オーバーフローしたらコンパイル諦めてね
ってことじゃないの?
874 :
デフォルトの名無しさん :2013/04/02(火) 23:08:54.43
age
>>650 「英語が出来れば、近縁であるドイツ語も簡単だ」
という言説に然りという人もあれば無茶言いやがると抗議する人もあろう。
自転車に乗れるかどうかなどという話と同じで頭も、単純な良し悪しとは
違う語学の運動感覚みたいなものがある。そういうのを会得しているひとに
とっては「英語がチャンとできているなら独逸語など数ヶ月でマスターできるだろう」
と言い、実際彼はそのようにできるだろうし、一方ドクトルの学位を持ちながら
数年に及ぶ刻苦の末になおアイサツ程度の独逸語しかものにできないものも
あるだろうし、その一方彼はドクトルの学位を取得していることから簡単に彼を
アンポンタンと呼ぶのもまたアンフェアというものであろう。
>>873 そうじゃなくて、分母、分子、両方一致したときだけ等しいとか有理数としておかしいだろってことかと。
>>869 でも 20.10.3p2 で gcd で割って正規化されるんで正しい規定だと思うよ。
ある名前空間内にあるクラステンプレートを、 別のファイルにおいて前方参照する方法について質問です。 class.h と class.cpp と use.cpp の3つのファイルがあります。 class.h ではクラスを宣言しており、private メンバとして、 std::map <int, const char *> 型の変数を宣言しています。 この変数は、クラス内でデータを管理するためにだけに使います。 class.cpp には class.h で宣言したクラスの定義が書かれています。 use.cpp では class.h ファイルを include し、そのクラスを利用しています。 class.h で宣言した変数の map 型を直接使うことはありません。 class.cpp では std::map <int, const char *> 型のメンバ関数を使うので、 map ファイルを include しています。 一方 use.cpp では直接使うことはないので map ファイルは include しません。 しかし、使わなくても use.cpp で include した class.h では std::map <int, const char *> の記述があるので未定義エラーを起します。 そこで、class.hpp 内のクラス宣言の前に前方参照をしておきたいのですが、 どのように書けば良いのでしょうか。 普通のクラスを前方参照するなら、単に class ClassName; と書けば良いのですが・・・
>>877 stdな要素を前方宣言するのは難しい。
namespace std {template <class K, class T, class C, class A> class map;}
そもそも、privateなものは宣言もヘッダーに書かずに隠すべき。
おっと、allocatorとかの指定を忘れてた。 追加しておいて。
関数が複数の値を返す場合に retuen (values 1 "aaa") みたいな方法ないのでしょうか
>>880 boostのoptionalやtupleを
>>880 pair<Foo, Bar> を返り値にする関数とかにすればよいのでは
make_pair ってのを使うと便利
883 :
877 :2013/04/03(水) 12:52:21.89
>>878 やってみました。
std::map の他に std::pair や std::less など必要なものを前方参照しましたが、
iterator の前方参照でどうしたら良いのか分からなくなりました。
class.h 内の自作のクラス内では、
typedef std::map<int, const char *> Items;
typedef Items::iterator ItemsItr;
と private に宣言しているのですが、iterator の所でこれは型名ではないという、
コンパイルエラーがてました(gcc 4.7.1 です)。
それはそうと
> そもそも、privateなものは宣言もヘッダーに書かずに隠すべき。
どういう事でしょうか。
宣言をヘッダに書かずに何処に書くのでしょう?
pImplにでもすれば?
>>876 p2って、ratio_less の話ちゃうの?
>>883 mapの実体をメンバで持ってしまっているのなら、そもそも前方参照は不可能だと思うけど。
それは一般的なクラスでも同じだよね?
前方参照可能なのは、サイズ計算の必要がないポインタか参照で宣言した変数のみじゃね?
887 :
877 :2013/04/03(水) 18:48:52.31
>>886 あぁ、なるほど、そうですね。
use.cpp でそのクラスを使う時に、サイズが分からないといけない。
クラスに別のクラスの実体(と言うのですか)があれば、
その別のクラスの内容が分からなければサイズの計算ができないですね。
納得しました。
ありがとうございます。
>>877 class.hがmapをインクルードするに
決まってるだろう。
前方山椒とか何を言ってるんだ?
890 :
877 :2013/04/03(水) 23:17:29.01
>>889 何を言っていたのか説明します。
その class.h を include している use.cpp が、
class.h 内で宣言された map に直接アクセスすることは無いので、
前方参照により、use.cpp のコンパイル単位に map を含めなくてもよくなる、
と勘違いしていました。
実際は、直接アクセスすることは無くても、コンパイルにはサイズを計算する必要があるため、
use.cpp からも map の宣言が見えていなければならない事が
>>886 の指摘でわかりました。
何を言っていたのか理解していただけたでしょうか。
mapをポインターで持つか、pimplで実装すればいいじゃない
>>891 文語四段活用と口語上一段活用が混在している
894 :
デフォルトの名無しさん :2013/04/04(木) 02:59:09.26
smart_ptrを使ったオブジェクトの数珠繋ぎで質問。 class N { shared_ptr<N> p_; N(shared_ptr<N> const& p) : p_(p) {} }; shared_ptr<N> v(new N(shared_ptr<N>()); // ルートは親なし for (int i=0; i<T; ++i) { shared_ptr<Node>(new Node(v)).swap(v); // 前のノードが親 } みたいにvを葉とする一本鎖を作った後、v.reset()で全ノードを連鎖的に解放したいのですが、 深さTが大きいと解放の連鎖が途中で止まってしまいます。(Tが小さいとうまくいく) 原因が分かる方いますか?
>>892 解決策を求めているのではなく、理由を知りたかっただけだろ。
原因さえわかれば対応策なんていくらでも練れるし。
>>894 お前がそういうプログラムを書いたから
なんかよくわかってない奴の設計した変なプログラムの感じだし
>>894 大小が問題になるなら、ある程度読める程度の数値を書いてくれ。
Tが100程度で失敗するのか、10億程度で失敗するのかでは話が違う。
898 :
894 :2013/04/04(木) 10:50:13.55
>>1 に便利なサイトが挙がってたのでそこにソースをあげてみた。
codepad.org/OyYRvLKK
これは深さT=10の場合でうまくいった例。
手元の環境(gcc4.5.3)だと、Tを50000くらいにすると
最後p:0に到達する前に処理が止まっちゃう…。
良く分からないけど予約スタックサイズが足りないとか?
900 :
894 :2013/04/04(木) 13:01:02.07
>>899 Thanks!!
stackoverflow.com/questions/14057262/segfault-using-stdshared-ptr-during-destruction-likely-due-to-too-many-functio
「shared_ptr」と「stack size」で調べたら↑でも議論されてました。
しかし…shared_ptr使うケースならDestructorの再帰は当然多発すると思うけど、
これは盲点だなぁ。
shared_ptrでリスト作ったりしないから無問題
shared_ptr関係ない デストラクタの中でメンバ変数のデストラクタ呼び出し ->そのメンバ変数のデストラクタ呼び出しの中でメンバ変数のメンバ変数のデストラクタ呼び出し->・・・ で関数呼び出しのネストが深くなりすぎてスタック食いつぶしてるだけだから
>>902 確かにそうだわ
でもそんな再帰が起こるような設計は本能的に避けるから無問題
programAからprogramBを実行したとして /* program A */ //program Bを実行 while(FLAG){ //program Bから値を受け取る処理 } /* program B */ while(FLAG) { if(COD) //program Aに値を渡す処理 } こんな処理がしたいのですが良い方法はないでしょうか
名前付きパイプ
メールスロットって相手に確実に届いたか保証がないのね TCPでなくてUDPに近いのか
馬鹿には何でもDB渡しが一番
>>905-908 メールスロットが簡単そうなのでそれにしてみます
不安定だったら一度書き出してやるのがよさそうですね
ありがとうございます
あとはメモリマッピングとか
moveされるしどうでもよくね?
retuenって利戸園というお茶のメーカーか?
列津園
struct stST { int Val; int Ary[ 2 ][ 3 ]; }; void Func( int Ary[ 2 ][ 3 ] ) { stST stSt; stSt.Val = 10; stSt.Ary = Ary; ←こんな感じで配列のアドレスを書き換えたいのですが、コンパイルエラーになります。 どうすればよいでしょうか?? FuncSub( &stSt ); }
当たり前だ int** Aryにしなさい
質問者とは別人だが、なんでエラーになるのか俺も理屈が分からん
>>916 事情があってポインタにしたくないんです。
>>917 さんも書いてますが、何で許されないのかが理解できないです。
論理的には可能なはずですよね?
920 :
デフォルトの名無しさん :2013/04/05(金) 21:08:12.82
C++は使っていないので正確でないが、その関数の引数は一時的な生存しかしないだろ。 いったん、メモリ動的確保して値をコピーしてわたせ。 それで解決する保証はない。
すまん、
>>919 はミスった
多次元配列どうしのアドレスコピーはそれではできない
各次元ごとの先頭アドレスをそれぞれ渡す必要がある
922 :
デフォルトの名無しさん :2013/04/05(金) 21:12:53.28
配列のコピーを勝手にやってくれるようにC++は便利にできていないんだろう。 コピー部分を自作するか、構造体のほうをアドレス(ポインタ)保存に書き換えればいいだろうという結論。 上の者。
配列はポインタじゃないのでアドレスを書き換えたりはできないのです
>>922 一次元配列ならすぐできる
多次元だからややこしくなる
926 :
915 :2013/04/05(金) 21:18:20.43
今のところ、FuncSubの前後で配列をコピーすることで対応していますが、
実際の配列要素数がそこそこあってパフォーマンス的なオーバーヘッドが無視できないですし、
何よりエレガントじゃないです。
>>924 &Ary[0][0]とすれば配列変数の先頭ポインタを指し示せませんか?
&stSt.Ary[0][0] = &Ary[0][0]
とやってもエラーでしたけどね・・・。
>>926 &stSt.Ary[0][0]は右辺値だからな
929 :
915 :2013/04/05(金) 21:21:35.62
>>928 そうそう、エラーメッセージに左辺値じゃないとかどうとか出てました。
???ってなりました。
1 = 12; こんなことはできないだろ? そういうことだ
932 :
915 :2013/04/05(金) 21:29:26.10
>>930 あー、すごく分かりやすいですw
>>931 わざわざコードまで書いてくださってありがとうございます。
でも
>>915 のstST構造体の定義は諸事情により変えれないので、
ポインタの配列方式を使うこともできないんです。
残念ですが、諦めて素直にコピーすることにします。
>>915 実体を持っているのだからmemcpy()するところなんじゃないか?
アドレスのみの参照とか危険なにおいしかしない。
>>919 char **のconstもちゃんと指定できる人も意外に少ないよねー
なんでconst使わない人多いの?アホなの?
便乗質問ですまんが
int *a;
int *b;
a = b;
これができて、
int a[] = {0};
int b[] = {1};
a = b;
(配列の内容をコピーしたいのではなく、
a の先頭アドレスを b の先頭アドレスと同じにしたい)
これができないのも、
>>930 と同じ理屈?
それとも
>>924 の理屈?
両方だろ
937 :
デフォルトの名無しさん :2013/04/05(金) 21:44:19.22
初心者はポインタ(Cの配列)をなるべく使わない方がいい。 参照渡しやSTLで代替できるだろ。
std::tr1::array もよいぞ
オペレータ
今時TR1も取り込んでない処理系使ってるとか可哀想
arrayぐらい30分もありゃ実装できるだろ 昼休み一回消費すれば後は使い放題なのに処理系の性にすんなカス
昼休みはプログラム以外のもっと他のことに使いたいよな
946 :
デフォルトの名無しさん :2013/04/05(金) 23:00:06.23
一日くらいいいだろカス
>>944 お前は30分で単体試験成績書兼報告書まで作れるのか?
できなきゃ他人に迷惑かかるだけだぞカス
>>943 今時、標準化前の化石コンパイラ使ってるなんて可哀想。
ちなみにstd::arrayはムーブコンストラクタ無いからな。
まぁ本当に一日なら良いが、いちどやってしまうと、 しばらく次から次へと余計な仕事が舞い込むからなぁ
なんとか書なんて書かないといけない仕事は辛いの~
moveが無いからなんだって言うんだ
何とか書を書いてる現場ほど碌なもんじゃない
>>950 は単体試験成績書兼報告書がなんなのか知らないのではないか?
単体試験成績書兼報告書を作らない現場は禄なもんじゃない
>>934 あっいや、char **のconstをconst char ** って、書く人が多かったという話。
使ってる本人はconstのつもりだから、問題はでないのだけどconstがたりてない事にきづいてないんだ。。。
といいつつ、俺も2次元以上のポインタは、あんまり理解できて無いので、使わないようにしてる。
まぁ、クラスの場合、参照型でも多態できることを知ってから全体的にポインタ自体ほとんど使わなくなったけど。。。
cならともかくc++でダブルポインタ使うやつはコードの書き方根本的に間違えてるから1からやり直したほうがいいよな
C++はポインタの参照の方が使い勝手がいいからな
むしろダブルポインタをちゅうちょなく使ったほうが楽になれる。
本日の単体試験成績書兼報告書スレ
ダブルポインタとかいう言葉を使うあたりが素人
この業界はなんでも形式に走りすぎている C++も妙な技巧に走りすぎている。 そんなものしなくてもキャストすればいいじゃん とか コードレビューして解放漏れをチェックすればいいじゃん で 終わってしまうようなコーディングミスを隠すのにうじゃうじゃくだらない技巧に走りすぎ。 あとXMLも糞。 あんなものなーんもよくねーよ。 書くのめんどくさいしネームスペースとかうるせえ約束が多いし 改行が無視されたり改行を期待した使いかたするソフトがあるし。 インナーテキストに改行期待するんじゃねーよ。 ってか&とか素でいれんな。 つーか冗長だよ。バイナリストリームじゃだめなんかい。 iniファイルで充分だろう。 CSVにしとけや なんでも形式に乗っかってとりあえず安心する。そして今日も残業ご苦労さん。
ダブルポインタの単体試験書兼報告書明日までによろしく
バイナリはバイトオーダがややこしい
まあ小ネタだけどタマゴの話はあれ生物学的にはリトルエンディアンのほうが正解なんだけどね
>>964 のレスが本気で理解できないんだが……誰か翻訳してくれ
リトルエンディアンがタマゴの↑方向ってこと
今さらXML否定のテンプレみたいな感想だな 何年前の人間だよ なんでもかんでもXML使うアホなんてもういないだろ
とりあえずXMLにしておけば何とかなる みたいなやつばっかだが
時代はjsonだよな
理由がないならXMLでいいだろ
jsonだなあ
jsonならあんなこともこんなことも
ジェイソンなら安売りのほうだけで十分だよ
ini は構文に関する標準仕様が無いのが難点。 特に理由が無ければ、xmlにしておくに賛成。
moveってin_place_factory の代用になるってことでいいの?
moveとforwardなら あんなこともこんなことも
978 :
デフォルトの名無しさん :2013/04/06(土) 08:06:22.21
形式は重要。 フォーマットが一定していれば汎用性がある。 多言語やネットワークへデータ送信するのに便利。 ただしXMLは表示に自由度があるし XMLもJSONもテキスト用でバイナリデータの扱いが困る。
JSONって何か怖いなぁ・・・。
>>974 ライブラリの有無にもよるけどxmlは、人間が手書きするには向いてないからおすすめするところはないなぁ。
iniについて、規格はないけど暗黙の了解レベルで記述は、最低ラインは統一されてる感が強い。
個人的にはiniよりもconf形式の方が好きだ。
所詮、アプリ固有の情報なのに変なこだわりは無用だ。
簡単越したことはない。
981 :
デフォルトの名無しさん :2013/04/06(土) 08:32:36.60
プログラム内で使う変数・構造体・(連想)配列などを一意的なテキストへシリアライズ出来ることは重要。
階層構造がある形式がいいわ
>>983 逆。
利用者が多くなるほど単純であるべき
xmlは、アプリが自分自身で完結するにはいいのかもしれないが、自アプリ以外とのインターフェイスには不向き
設定ならiniで十分だし、データならテキスト形式の固定長が一番いい。
仕様書はかざりじゃないのだ。
所詮、xmlは俺すげーしたいやつだけの自己満足用データ形式。
※インターネットメッセージを除く(笑
985 :
デフォルトの名無しさん :2013/04/06(土) 09:23:17.11
>>984 ロード・セーブの手順が定まっていなければ
読み(エンコード・シリアライズ)
書き(デコード、デシリアライズ)
部分を自作しなきゃならん。
ツールが吐き出すフォーマットはXMLが多いし わざわざ小さなファイルに複数の形式持ち込むのも一貫性が無いし大抵XMLだわ あとはCSV程度かな
あっ、追記 xmlがいいといってる人は、取り込んだ後の事をはなしてる? そんなものパーサの役割であってデータ形式とは関係ないな。 出力については、後のこと考えず、アプリ内部の情報をダダ漏れさせるならxmlでもよいと思うが、他者とインターフェイスするような正規化されたデータならレコード単位に出力すればすむ話。
>>985 なので、ライブラリの有無しだいという前提がある。
とはいえ、
自作すると言っても、単純な形式の読み書き部分なんて、テストケース込みでも300L程度。
xmlはxsdとセットにして初めて意味を持つし、かなり強力なのだけどねぇ。
オーバースペック感が半端ない。
xmlについて行き着くところは、手書きするのがダルいという点に限るな。
ソフト屋さんは、なんとか書を書きながらプログラムコード打ってるんだね。 たいへんそう・・・。
xml手書きとかアホじゃねーのと思ってる
xmlなんてサイトマップとアンドロイドくらいでしか使わない
XMLはデータ構造と表現できる内容が重要であって 人間がタグを見るなんてアホすぎ。
あとさぁ、アプリによってはWindowsのレジストリに設定保存したりするじゃん? あれってキモくない? .exeと同階層に.iniファイル設けて保存すりゃイイじゃんって思う。 アンインストールしてもレジストリ設定だけ残るとかキモい。
それはアンインストーラーがアホなだけだ
>>993 何のためにアンインストーラがあると思ってんの?
>>993 お前なんのためにレジストリがあると思っているんだ……?
形式はともかくファイルデータベースにして欲しいよな。 共通はProgramDataの下、ユーザー設定はプロファイルの下と 自分で決めたルールにマイクロソフトが従わないんだから困る。
998 :
993 :2013/04/06(土) 12:47:30.58
>>998 素直にUltimateの仕様版ずっと使い続ける方法教えて下さいと言えばどうだ?
1000 :
993 :2013/04/06(土) 12:50:17.27
>>999 6万円払ったProエディションです(T_T)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。