C++相談室 part95
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/05/08(火) 04:55:24.99ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part94
http://toro.2ch.net/test/read.cgi/tech/1329512856/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1331894668/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0002デフォルトの名無しさん
2012/05/08(火) 04:58:34.10[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://en.cppreference.com/w/cpp (英語)
http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2012/05/08(火) 05:00:06.89[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2012/05/08(火) 05:02:20.58amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005デフォルトの名無しさん
2012/05/08(火) 05:03:05.30Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006デフォルトの名無しさん
2012/05/08(火) 09:40:19.69韓国へ、中国の人肉カプセル密輸急増
死産した赤ん坊や乳幼児の遺体からつくられた粉末のカプセルが、
中国から韓国に密輸入されるケースが急増し、韓国関税庁が取締りを強化しています。
これが摘発された中国製のカプセルです。中には死産した赤ん坊や乳幼児の遺体からつくられた粉末が入っていて、
「滋養強壮剤」として韓国に密輸入されました。韓国では去年8月以降、密輸入が急増しており、
関税庁はこれまでに35件、合わせて1万7000錠以上を摘発しました。いずれも、旅行者の携帯品や国際郵便で持ち込まれたものです。
色やにおいで識別できないよう生薬などを混ぜたり、他の医薬品の中身だけを入れ替えるなど、
密輸の手口も巧妙になっているということです。
粉末から抗生物質がほとんどきかない「スーパー細菌」が検出されたとして、取締りを強化しています。
(07日17:14)
http://news.tbs.co.jp/newseye/tbs_newseye5023288.html
0007デフォルトの名無しさん
2012/05/08(火) 12:29:13.26/ /:::::; -‐''" `ーノ
/ /:::::/ \
/ /::::::/ | | | |
| |:::::/ / | | | | | |
| |::/ / / | | || | | ,ハ .| ,ハ|
| |/ / / /| ,ハノ| /|ノレ,ニ|ル'
| | | / / レ',二、レ′ ,ィイ|゙/ 私は只の数ヲタなんかとは付き合わないわ。
. | \ ∠イ ,イイ| ,`-' | 頭が良くて数学が出来てかっこいい人。それが必要条件よ。
| l^,人| ` `-' ゝ | さらに Ann.of Math に論文書けば十分条件にもなるわよ。
| ` -'\ ー' 人 一番嫌いなのは論文数を増やすためにくだらない論文を書いて
| /(l __/ ヽ、 良い論文の出版を遅らせるお馬鹿な人。
| (:::::`‐-、__ |::::`、 ヒニニヽ、 あなたの論文が Ann of Math に accept される確率は?
| / `‐-、::::::::::`‐-、::::\ /,ニニ、\ それとも最近は Inv. Math. の方が上かしら?
| |::::::::::::::::::|` -、:::::::,ヘ ̄|'、 ヒニ二、 \
. | /::::::::::::::::::|::::::::\/:::O`、::\ | '、 \
| /:::::::::::::::::::/:::::::::::::::::::::::::::::'、::::\ノ ヽ、 |
| |:::::/:::::::::/:::::::::::::::::::::::::::::::::::'、',::::'、 /:\__/‐、
| |/:::::::::::/::::::::::::::::::::::::::::::::::O::| '、::| く::::::::::::: ̄|
| /_..-'´ ̄`ー-、:::::::::::::::::::::::::::::::::::|/:/`‐'::\;;;;;;;_|
| |/::::::::::::::::::::::\:::::::::::::::::::::::::::::|::/::::|::::/:::::::::::/
| /:::::::::::::::::::::::::::::::::|:::::::::::::::::::::O::|::|::::::|:::::::::::::::/
0008デフォルトの名無しさん
2012/05/08(火) 14:45:32.75どのようにすればよいでしょうか?無理かな?
また、一度初期化した後は参照するだけで、マップの中身を弄くるつもりはないのですが
もしこのケースでメモリやアクセス速度を最適化できる方法があれば教えてください。
//とあるシステムのキーコード
struct HOGESYSTEM_KEYDATA
{
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
};
// WindowsのVK_XXと、Hogeシステムのキーコードのマップ(Win->Hogeの変換のみでOK)
map<int,HOGESYSTEM_KEYDATA> WinToHogeKeyMap = {
{VK_SHIFT,{0,0x2a,2}},
{VK_CONTROL,{0,0x1d,2}},
};
よろしくお願いいたします!
0009片山博文MZボット ◆0lBZNi.Q7evd
2012/05/08(火) 15:44:11.64http://codepad.org/3LgLvRwC
0010デフォルトの名無しさん
2012/05/08(火) 16:23:31.17C++11の初期化リストを使いたいなら
HOGESYSTEM_KEYDATA(std::initializer_list<int>)を実装する。
0011デフォルトの名無しさん
2012/05/08(火) 16:24:45.050012片山博文MZボット ◆0lBZNi.Q7evd
2012/05/08(火) 16:51:18.020013片山博文MZ ◆0lBZNi.Q7evd
2012/05/08(火) 18:23:36.23initializer_listは使えないんだな、これが。
00148
2012/05/08(火) 19:30:15.98ありがとうございます!
無事に実装できました!
>>10
initializer_listは時間に余裕が出てから勉強させて頂きます!
情報有り難うございました!
0015デフォルトの名無しさん
2012/05/08(火) 21:14:30.60今Linux上で作られたC言語ソース(TCP通信系の処理)をWindowsベース(VC MFC)に移植する作業をしているんですが、
コンパイルをすると以下のヘッダがインクルード出来ないってエラーが出ます。
sys/ioctl.h
sys/sockh
で調べたら上記のヘッダはLinux専用(?)なんで、VCでやりたかったらWinsock使いなさいって書かれていましたが、
Winsockで処理を書き直すのが面倒なんで流用出来る方法って他にありませんか?
無い知恵絞って考えたのは、gcc使ってLinuxベースのソースをDLLにしてVCからリンク時に読み込ませれば
良いんじゃないかと思って色々試してるんですが、gcc使ってのDLL化が良く分かって無いので下のサイトを
参考にしたのですが上手く行きません。
http://yun.cup.com/wingccsdl019.html
コンプライアンスの関係上ソースを公開出来ませんが何か良い方法をご存知の方は是非ご教授ください。
0016デフォルトの名無しさん
2012/05/08(火) 21:18:31.41スレ違い。VCのスレ辺りがいいんじゃない?
で、LinuxのソースをLinux上でDLL(so)にしてもVCではリンクできない。
Cygwin上でDLLが作れれば、リンクできるかもしれない。
でもCygwinでioctlまでサポートされているかは微妙。
これらを踏まえると、素直にWinSockで書き直すのが一番手っ取り早いと思う。
つーか、それが面倒な人がDLL化なんて面倒なことができるとは思えない。
0017デフォルトの名無しさん
2012/05/08(火) 21:21:07.30なら上司に聞けよ屑
0018デフォルトの名無しさん
2012/05/08(火) 21:45:33.62やっぱりそうですか。
通信周りの処理なんですが、既存のAPIと挿げ替えただけで動くと思って安請け合いした結果、
思った以上に面倒だったので困ってしまいました。
あまり手を加えずに既存のソースを流用したかったんですが、難しいですかね。
ありがとうございました。
0019デフォルトの名無しさん
2012/05/08(火) 22:00:07.36クルーグマンが、実は日本の00年代の一人当たりGDPの成長率はEU諸国、そしてアメリカよりも高かった事実を発表した。
バブルによる日本の不景気はあくまでも10年間で、それ以降は実はしっかり成長軌道に乗っていることを示して
失われた20年などというのは間違いで、無知な悲観論者の戯言だったとのこと。
※クルーグマンはノーベル賞やその他の経済学賞を受賞しているアメリカで最も著名な経済学者
http://image.space.rakuten.co.jp/lg01/80/0000186380/72/img66421dc8zik4zj.jpeg
http://noahpinionblog.blogspot.com/2012/01/japan-had-one-lost-decade-but-not-two.html
http://www.nytimes.com/2012/01/08/opinion/sunday/the-true-story-of-japans-economic-success.html?_r=1
0020デフォルトの名無しさん
2012/05/08(火) 22:22:09.11環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
一応地鎮祭な
0021デフォルトの名無しさん
2012/05/08(火) 22:55:42.980022デフォルトの名無しさん
2012/05/08(火) 22:58:42.970023デフォルトの名無しさん
2012/05/08(火) 23:02:42.120024デフォルトの名無しさん
2012/05/08(火) 23:14:08.25初期化してやらないとまともに動かねぇとか、selectがソケットしか受け付けねぇケチ仕様だとか、
struct in_addrのメンバが違うとか、それくらいかねぇ?
0025デフォルトの名無しさん
2012/05/09(水) 03:46:32.580026デフォルトの名無しさん
2012/05/09(水) 07:02:21.45に対して、
!(x>y)
と
x<=y
の結果って同じですか?
(infとかnanを気にしているわけではありません)
0027デフォルトの名無しさん
2012/05/09(水) 07:31:29.220028デフォルトの名無しさん
2012/05/09(水) 07:39:26.70ビットレベルでそれぞれの不等式を実装した時にどういうことをやってるか教えてもらえませんか?
自分はx<=yを使わないようにしているのですが、誤差の意味でx<yのほうが優れていると言い切っていいのですか?
0029デフォルトの名無しさん
2012/05/09(水) 07:56:04.13何をしたいかによるが、前後の誤差を考慮することが多いという話
0030デフォルトの名無しさん
2012/05/09(水) 08:02:45.170031デフォルトの名無しさん
2012/05/09(水) 08:04:58.850032デフォルトの名無しさん
2012/05/09(水) 08:49:15.53bool compare(T x, U y) {
return x<=y;
}
みたいに使うので、intの場合にも同じ実装が使えることは(いまの目的では)けっこう重要です。
上にあるようにビットレベルで同じなら何の問題もないですよね?
0033デフォルトの名無しさん
2012/05/09(水) 11:09:32.29目的とする精度によって違うから
0034デフォルトの名無しさん
2012/05/09(水) 11:15:30.34あんたがそれでいいのなら、それでいいよ。
うちじゃ話にならないけどね。
0035デフォルトの名無しさん
2012/05/09(水) 13:52:50.05単純な話、
bool compare(double x, double y) {
return !(x>y);
}
と
bool compare(double x, double y) {
return x<=y;
}
の結果が、doubleで許される全値の組み合わせについて同じかどうか聞いてるだけなんですが。
違うなら違うと言ってくれたらいいのに。
0036デフォルトの名無しさん
2012/05/09(水) 14:25:50.250037デフォルトの名無しさん
2012/05/09(水) 15:00:59.780038デフォルトの名無しさん
2012/05/09(水) 15:57:01.60それが同じかどうかは環境依存。
0039片山博文MZボット ◆0lBZNi.Q7evd
2012/05/09(水) 16:41:00.33コンパイラのアセンブリ出力オプションを試せば、
!(x>y)とx<=yの違いが分かる。
0040デフォルトの名無しさん
2012/05/09(水) 18:29:51.05解放した後に再確保できると、シングルトンと
グローバル変数のインスタンスと違いがはっきりするけど。
初期化が一度しか行われないこともシングルトンの用件だとしたら
解放されちゃまずいよね。
0041デフォルトの名無しさん
2012/05/09(水) 18:54:59.09参照カウンタ付けとく
カウンタ0で解放とかするかどうかは内容次第じゃね
0042デフォルトの名無しさん
2012/05/09(水) 19:34:42.86そんな概念なんて教条的なOOPデザパタカルトのキチガイが気にするだけ
0043デフォルトの名無しさん
2012/05/09(水) 19:53:40.54初心者への紹介も兼ねるけど
0044デフォルトの名無しさん
2012/05/09(水) 20:53:21.87デザパタがあって、名前がある。
まだ名前の無いデザパタも複数有る。
デザパタ本は、前書きに有るとおり、
複数あるデザパタから特に良く使うものを抜き出して
紹介しているだけで、デザパタ本に書いてなければ
デザパタに非ずというような物でもない。
0045デフォルトの名無しさん
2012/05/09(水) 20:55:50.34手段を目的にするなよ。
目的が達成できて問題がなけりゃ
どんな形式でもいいだろうが。
0046デフォルトの名無しさん
2012/05/09(水) 22:10:34.39複数あるって何だよw有限個じゃねーんだから
設計なんて無数だろ
名前が付いて初めてデザパタだよ
アレは銀の弾丸なわけでもなく
名前を付けることが他者との意思疎通に有用ってのが主旨だろ
典型例の紹介だけなら入門書にでも書いときゃいいんだよ
0047デフォルトの名無しさん
2012/05/09(水) 22:37:45.31「オブジェクト指向における再利用のためのデザインパターン 改訂版」
本位田 真一/吉田 和樹 監訳
この本のp13〜15に書いてあった内容引っ張っただけだし、
お前は、お前のデザパタ定義を貫けばいいんじゃないか?
0048デフォルトの名無しさん
2012/05/09(水) 23:00:49.21コンストラクタ・デストラクタを意識しなくていいよね?
0049デフォルトの名無しさん
2012/05/09(水) 23:07:08.47ああ、お前もお前のデザパタ定義を貫けばいいと思うよ
Design Patterns: Elements of Reusable Object-Oriented Software
>In general, a pattern has four essential elements:
>1. The pattern name is a handle we can use to describe a design problem, its
solutions, and consequences in a word or two. Naming a pattern immediately
increases our design vocabulary. It lets us design at a higher level of
abstraction. Having a vocabulary for patterns lets us talk about them with
our colleagues, in our documentation, and even to ourselves. It makes it
easier to think about designs and to communicate them and their trade-offs
to others. Finding good names has been one of the hardest parts of developing
our catalog.
0050デフォルトの名無しさん
2012/05/09(水) 23:07:52.05005149
2012/05/09(水) 23:11:59.82http://my.safaribooksonline.com/book/software-engineering-and-development/patterns/0201633612/chapter-1-introduction/3
0052デフォルトの名無しさん
2012/05/09(水) 23:19:23.92そらデザパタカタログに乗ってるものは名前ついてるわなw
一部だけ抜粋するんじゃなく、金だして一度全文読んどけよ
0053デフォルトの名無しさん
2012/05/09(水) 23:30:04.50ま、デザインパターンの意図としてはパターンを有限個にしたいということであって>49で正解だが
可算無限濃度の設計の中から残すだけの価値があるパターンがこの先可算無限濃度見いだされる可能性は
>49とて否定できないハズ
なにしろ「洗練されたコード」と言うのと同じで数学的基準があるようでない世界だからな
0054デフォルトの名無しさん
2012/05/09(水) 23:45:47.550055デフォルトの名無しさん
2012/05/09(水) 23:53:26.180056デフォルトの名無しさん
2012/05/09(水) 23:56:24.630057デフォルトの名無しさん
2012/05/10(木) 00:01:07.16いや、お前が読んどけよ
どうやってあのURLを見つけたと思ってんだよ
>>53
俺は>>44の
>まだ名前の無いデザパタも複数有る。
を否定しただけ
カタログにした理由、名前を付けることの意義
何故GoFがパターンに不可欠な4要素の第1項目をpattern nameにしたか、そういった話
あれを「さいきょうの設計かたろぐ」だと思ってる層から
意味不明な信者と、アンチが出てくるんじゃないかね
0058デフォルトの名無しさん
2012/05/10(木) 00:02:18.35Factory MethodとStateぐらいは知っとこうよ
0059デフォルトの名無しさん
2012/05/10(木) 00:06:38.78しなくていいけど
むしろシングルトンであることを意識しないで済む方がいいと思う
後でシングルトン(プロセス毎)からスレッドローカル(スレッド毎)に変える場合も楽
0060デフォルトの名無しさん
2012/05/10(木) 00:08:57.210061デフォルトの名無しさん
2012/05/10(木) 00:14:22.10んなもん聞いたことないわ
0062デフォルトの名無しさん
2012/05/10(木) 00:19:12.98forkが使えない環境のときとか
GUIで重い処理中にキャンセルボタン出すときとか
0063デフォルトの名無しさん
2012/05/10(木) 00:20:49.30ついぞ昔ならGUIプログラムの非GUI処理。
特にI/O関係。マルチプロセッサーやマルチコアが
現れてからは、並行処理で使われる事が増えつつ有る。
0064デフォルトの名無しさん
2012/05/10(木) 00:22:05.96Singletonの方がよっぽど要らんだろうに・・・
0065デフォルトの名無しさん
2012/05/10(木) 00:27:55.90シングルトンを知ってすべて解決した
0066デフォルトの名無しさん
2012/05/10(木) 00:33:25.78俺は実態がシングルトンでも
初期化引数かスレッドローカル経由かインジェクションで
xxxContextとかを渡す方が好み
0067デフォルトの名無しさん
2012/05/10(木) 00:41:28.38Factory Methodを使うとC#におけるBeginInvokeみたいなことがサッと安全にできる
ていうかFactory Methodでクロージャを生成するのだと考えればマルチスレッド状況をスキーリ安全に扱える
Stateはキーマトリックスの処理ルーチンを書くのに個人的に重宝した
>>56
マルチスレッド状況下で呼ばれるSingletonは奥が深い…
0068デフォルトの名無しさん
2012/05/10(木) 00:45:48.49クラスの外から見て状態を持ち変化があるものには絶対つかわんな
ループ中にどっか別の関数でシングルトンが書き換えられてたらデバッグしづらすぎる
0069デフォルトの名無しさん
2012/05/10(木) 01:10:58.560070デフォルトの名無しさん
2012/05/10(木) 01:14:27.490071デフォルトの名無しさん
2012/05/10(木) 01:26:41.19http://ideone.com/aOWhQ
http://ideone.com/rPUpT
グローバル変数に直よりかは関数経由でアクセスしたり仮想関数使える方が良いだろう
まぁグローバル変数もシングルトンも使わない方が良いけど
0072デフォルトの名無しさん
2012/05/10(木) 09:59:09.71メソッド関数を呼び出すコードを見て、
「この変数は値を渡しているだけなのか、書き換えられて返ってくるのかどうか」がぱっと見分かりません。
(引数がconstかどうか調べれば判断つきますが、面倒で付けずに済ますこともあるし、呼び出し側のソースを流し読みしてるときに分かりずらい)
書き換えないなら必ずconst、呼び出し側のソース見てるときは、メソッドにマウスカーソル合わせて引数をチェック、
というやり方しかないのでしょうか?
0073デフォルトの名無しさん
2012/05/10(木) 10:07:28.94そういうことにならないように関数名や引数並び、引数に使う変数名をちゃんとつける。
どうやったところで関数宣言を見ないのなら正確に把握というわけにはいかない。
0074デフォルトの名無しさん
2012/05/10(木) 11:18:37.08それを嫌って、書き換える場合はポインタ、書き換えない場合はconst参照、と使い分ける人もいる。
私の場合、関数名にgetなどが含まれていて戻り値のない関数は、一番目の引き数が書き換え対象だ。
0075デフォルトの名無しさん
2012/05/10(木) 11:57:23.49bool result = false;
/* いろいろ処理*/
// 戻り値の用意
return (ioResult&&sockResult&&time<10);
}
なんて関数をコーディングした場合、
if(hoge())
ではなく、戻り値必要ないので
hoge();
なんて書いた場合は、コンパイラの最適化でvoid版hoge()を作って、returnの行を出力しない、
みたいなことはしてくれるんでしょうか?
普通にbool版hoge()が呼ばれて、普通に関数内全部実行して、戻り値はテンポラリかなにかに入れてすぐ捨てるんでしょうか?
0076デフォルトの名無しさん
2012/05/10(木) 12:02:41.77return の式に非ローカルな副作用が一切無いのであれば、そういう最適化は可能ではある。
ただしあまり大きな違いにはならなさそうなので、実際に最適化されることは少なくとも現時点では
あまりないだろうと思うし、気にするべきでもないと思う。
0077デフォルトの名無しさん
2012/05/10(木) 12:04:56.890078デフォルトの名無しさん
2012/05/10(木) 12:27:30.80そのhoge()が同一翻訳単位内から呼ばれた場合は、インライン展開される場合がある。
そのとき、そのreturn文には副作用がないので省略される可能性は高い。
# 一部のコンパイラでは、同一翻訳単位外からでも最適化されうる。
とは言え、void版のhoge()が用意されるわけではない。
0079デフォルトの名無しさん
2012/05/10(木) 12:34:37.23hogeがstatic関数とかでコンパイル単位内ローカルなら可能かも知れんが
やってるコンパイラは無いだろう。
0080デフォルトの名無しさん
2012/05/10(木) 13:01:08.600081デフォルトの名無しさん
2012/05/10(木) 13:41:32.290082デフォルトの名無しさん
2012/05/10(木) 13:57:55.02確かにそうかも。試してないけど。
最適化技術って進んでるんだね。
0083デフォルトの名無しさん
2012/05/10(木) 22:33:31.08インライン展開してくれるし、親クラスにキャストしてるオブジェクトの
仮想関数ですらインライン展開してくれるからな。
0084デフォルトの名無しさん
2012/05/10(木) 23:14:48.250085デフォルトの名無しさん
2012/05/10(木) 23:23:53.10インライン関数のインポートとエクスポート
http://msdn.microsoft.com/ja-jp/library/feffc7b5(v=vs.80).aspx
0086デフォルトの名無しさん
2012/05/10(木) 23:52:13.14DLL内の関数をインライン展開できるって話じゃないだろ
0087デフォルトの名無しさん
2012/05/10(木) 23:58:02.23注意
インポート インライン関数は、DLL のバージョン間で矛盾することがあるので、
インライン関数のインポート時は注意が必要です。インライン関数は、アプリケーション コード内に展開されます。
このため、関数を書き直した場合は、アプリケーション自体をコンパイルし直さないと、
インライン関数は更新されません。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。
0088デフォルトの名無しさん
2012/05/11(金) 00:20:06.290089デフォルトの名無しさん
2012/05/11(金) 00:23:33.94どうせアセンブリコードに展開したときは、本来の名前空間の
名前になるんだから、不要になったら削除できてもいいだろうに
0090デフォルトの名無しさん
2012/05/11(金) 00:26:30.84インライン展開しないなら、こんな事わざわざ書く必要ないだろ。
逆に「DLLにインライン関数定義してもインライン展開できません」と書くのが筋だろ。
>インポート インライン関数は、DLL のバージョン間で矛盾することがあるので
>。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。
0091デフォルトの名無しさん
2012/05/11(金) 00:38:58.63そもそも、リンク時に使うのはインポートライブラリであってDLLそのものは一切使わない
0092デフォルトの名無しさん
2012/05/11(金) 00:44:47.35DLLを参照してるアプリケーションをコンパイルするとき、DLLが参照できればぶっこ抜かれるんだよ。
0093デフォルトの名無しさん
2012/05/11(金) 03:34:47.68仰天!会長は元偽ソウル大生、中国密航で逮捕
http://jbpress.ismedia.jp/articles/-/35163
自己資本比率5.6%、実はマイナス16.2%だった
営業処分の直前に漁船で密航を試みた会長の正体
金会長は、未来貯蓄銀行に対する営業停止処分が不可避と見て、かねて準備していた密航ルートを使って中国に逃亡しようとした。
金融委員会は未来貯蓄銀行など4つの貯蓄銀行を営業停止処分とした。
来貯蓄銀行の場合、粉飾決算を重ね、「5.67%」と発表していたBIS基準に基づく自己資本比率が実際はマイナス16.2%であることが明らかになった。
http://jbpress.ismedia.jp/articles/-/35163
◆貯蓄銀行とは庶民専用の銀行
貯蓄銀行(ちょちくぎんこう)とは、個人の貯蓄を引き受けることを主目的とする金融機関である。
庶民に対して倹約を奨励し貯蓄により生活を安定させるための公益的な金融機関。
http://ja.wikipedia.org/wiki/%E8%B2%AF%E8%93%84%E9%8A%80%E8%A1%8C
0094デフォルトの名無しさん
2012/05/11(金) 05:33:41.33const int x;
X(istream& is) try: x(read_int(is)) {
catch (何か) ...
}
const int read_int(istream& is) const {
int x;
is>>x;
if (x<0) throw 何か;
return x; }
};
int main()
{
X a(cin);//負の数が与えられるまで読み続ける
}
みたいなことってできませんか?
0095デフォルトの名無しさん
2012/05/11(金) 06:21:28.72int x;
for (;;) {
is >> x;
if (!cin) {
cin.clear();
cin.ignore( 1024, '\n' );
continue;
}
if (x < 0);
return ;
}
};
0096デフォルトの名無しさん
2012/05/11(金) 06:30:32.40何がしたいの?
0097デフォルトの名無しさん
2012/05/11(金) 06:50:37.13のポイントは、
- constメンバを初期化子を使って初期化していること
- tryブロックをそこにかまして、例外処理にしていること
です。
無論、95みたく普通にやればいいのだが。
0098デフォルトの名無しさん
2012/05/11(金) 07:11:41.62はread_intね。いけてる気がする。
0099デフォルトの名無しさん
2012/05/11(金) 07:19:17.27cin >> x;
} catch (...) {
入力を求める
}
みたいなことを初期化子についてやりたかった。
0100デフォルトの名無しさん
2012/05/11(金) 07:33:31.87try {
int x;
cin >> x;
return x;
}
catch (...) {
return read_int(is);
}
}
みたいな雰囲気。
例外の使い方がよくわからないし、istreamは例外投げないのかな・・・
ひっかかってくれない。
0101デフォルトの名無しさん
2012/05/11(金) 07:39:30.34int x=-1;
cin >> x;
if (x<0) throw x;
return x;
}
catch (int input) {
cerr << input << endl;
read_int(is);
}
でイケた。かっこよくね?
0102デフォルトの名無しさん
2012/05/11(金) 07:42:50.74こんなので大丈夫なのかしら・・・。
0103デフォルトの名無しさん
2012/05/11(金) 07:44:39.57これが右に偏ってる気がして気持ち悪いんだけど
どうにかならない?
0104デフォルトの名無しさん
2012/05/11(金) 08:19:53.450105デフォルトの名無しさん
2012/05/11(金) 08:30:41.25double x; cin >> x;
の結果がよく分かりません。
stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、
doubleなのでx==0で判定するのも気持ち悪い。
cinが例外飛ばしてくれたりしますか?
0106デフォルトの名無しさん
2012/05/11(金) 08:36:01.980107デフォルトの名無しさん
2012/05/11(金) 08:43:35.840108デフォルトの名無しさん
2012/05/11(金) 08:51:53.96cin.ignore(1024,'\n');
としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね?
決め打ちを避けたいだけなんだけど。
0109デフォルトの名無しさん
2012/05/11(金) 08:56:45.82std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。
cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。
0110デフォルトの名無しさん
2012/05/11(金) 09:03:59.04へぇ、そんなのがあるんですね。
JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。
>>108
numeric_limits<streamsize>::max()
を第一引数に渡すのはやりすぎでしょうか?
0111デフォルトの名無しさん
2012/05/11(金) 09:20:10.07C++設計者の例。
http://www2.research.att.com/~bs/bs_faq2.html
の↓あたり。
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error¥n";
return 1; // error return
}
0112デフォルトの名無しさん
2012/05/12(土) 11:08:35.52その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。
mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか?
int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){
FILE* fp;
errno_t err;
short int LVol=0,RVol=0;
int Ave=0;
LONGLONG Sum=0;
if((err=fopen_s(&fp,SoundPath,"rb"))!=0){
return 0;
}
fseek(fp,44+StartSample*4,SEEK_SET);
for(int i=0;i<EndSample-StartSample;i++){
fread(&LVol,sizeof(LVol),1,fp);
fread(&RVol,sizeof(RVol),1,fp);
Sum+=MAX(abs(LVol),abs(RVol));
}
if(EndSample-StartSample>0){
Ave=(int)(Sum/(EndSample-StartSample));
}
fclose(fp);
return Ave;
}
0113デフォルトの名無しさん
2012/05/12(土) 11:34:52.670114デフォルトの名無しさん
2012/05/12(土) 15:48:55.120115デフォルトの名無しさん
2012/05/12(土) 15:49:55.940116デフォルトの名無しさん
2012/05/13(日) 09:05:43.48int a,b;
inline int f() { return a+b; }
int g() { return a+b; }
int h();
inline friend int plus(X& x) { return x.a+x.b; }
};
inline int X::h() { return a+b; }
hの定義につけたインライン要請は意味があると思うのですが、
クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか?
あと同様にクラス内に書いたfriendについてもお願いします。
0117デフォルトの名無しさん
2012/05/13(日) 09:11:11.310118デフォルトの名無しさん
2012/05/13(日) 10:13:52.490119デフォルトの名無しさん
2012/05/13(日) 13:42:41.18グローバルな名前空間を汚染させない方法ってありますか?
namespace X {
#include <cstdlib>
}
はコンパイルエラーになってしまうのですが・・・
0120デフォルトの名無しさん
2012/05/13(日) 14:14:33.200121デフォルトの名無しさん
2012/05/13(日) 14:18:36.79namespaceに入れてくれたらいいのに・・・
あるいはstatic includeみたいなのでも。
0122デフォルトの名無しさん
2012/05/13(日) 14:19:52.840123デフォルトの名無しさん
2012/05/13(日) 14:29:45.35関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る
特定のコンパイル単位においてのみCのヘッダをインクルードし、
そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは
同名のwrapperの方を呼べば良い
(※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ
C++の関数シンボルは引数型とセットでマングルされるので、
仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても
(extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない
0124デフォルトの名無しさん
2012/05/13(日) 14:32:35.45C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が
何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456
0125デフォルトの名無しさん
2012/05/13(日) 14:43:32.30なんという無意味な再宣言w
コーディング規約として、そうするか・・・
>>123
負担が線形増大w
けど参考になります。
>>124
ふむふむ、将来的にも予定はない・・・と。
0126122
2012/05/13(日) 14:51:25.13こーやればいけたので報告
やっていいかどうかはわからないので詳しい人お願いします
#include <iostream>
namespace hoge {
#include <cstdlib>
using::atoi;
}
int main(void)
{
int a = hoge::atoi("4");
std::cout << a << std::endl;
return 0;
}
0127デフォルトの名無しさん
2012/05/13(日) 14:53:10.74無駄だよ
0128デフォルトの名無しさん
2012/05/13(日) 14:54:22.820129デフォルトの名無しさん
2012/05/13(日) 15:03:15.52#include <cstdlib>
namespace hoge { using ::atoi; }
0130デフォルトの名無しさん
2012/05/13(日) 15:07:17.90当然アウト。
17.6.2.2 [using.headers] p3
> A translation unit shall include a header only outside of any external declaration or definition, ...
0131デフォルトの名無しさん
2012/05/13(日) 15:16:09.34GCC4.7でコンパイル通らないよ。
0132デフォルトの名無しさん
2012/05/13(日) 15:30:36.18あーそうだね、ごめんなさい
>>126は忘れてください
>>130
解説あり
0133デフォルトの名無しさん
2012/05/13(日) 16:00:48.99多重継承でオペレータ関数を追加したら、28byteになってしまった。
多重継承にしたのは、他のクラスでも使うからで
アップキャスト等する予定はありません。
これを多重継承ではなくコピペにしたら16byteのままのはずです。
ただ、コピペするとクラスのコードが長くなって、望ましくありません。
サイズを増やさずに、継承のように再利用出来る方法はありませんか?
0134デフォルトの名無しさん
2012/05/13(日) 16:31:46.260135デフォルトの名無しさん
2012/05/13(日) 17:08:52.40>>133 C++でおk
多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、
みたいな質問をされると困惑するから具体例示せ
0136860
2012/05/13(日) 18:03:56.68---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : public A, public B { char a; void f(){} void g(){} };
size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。
0137133
2012/05/13(日) 18:06:33.52---
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : { char a; void f(){} void g(){} };
size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。
0138デフォルトの名無しさん
2012/05/13(日) 18:22:49.23http://codepad.org/Q4fuvcOb
> size of C is 1
> size of D is 1
> size of E is 1
VC++2010EE の最適化が至らないといだけのことだな。
0139デフォルトの名無しさん
2012/05/13(日) 18:28:21.41↓
http://stackoverflow.com/questions/6119927/empty-base-optimisation-msvc
↓
https://connect.microsoft.com/VisualStudio/feedback/details/100686/empty-member-optimization-not-working-properly
> 終了
> 解決策: 修正しない
...
> 投稿者: Microsoft、投稿日時: 2006/04/11 11:50
> Hi: unfortunately even though this is a bug in the Visual C++ object
> model we are unable to fix it at this time given that fixing it would
> potentially break a lot of existing programs as the sizes of objects
> would change. Hopefully in the future we may be able to address this
> issue but not for the next release of the product.
0140デフォルトの名無しさん
2012/05/13(日) 18:32:38.27クラスは空であってもサイズは1。
ただし継承元が空の場合、最適化で0とすることが出来る。
しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。
残念、こういう結果になるとは。ともかくありがとうございました。
0141デフォルトの名無しさん
2012/05/13(日) 19:18:04.32vector<string> arg(argv,argv+argc);//ここまでOKだよね?
int res;
while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) {
}
}
が通らない。
char* const*にconvertできないといって怒られる。
&arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、
static_castで何とかなりますか?
0142デフォルトの名無しさん
2012/05/13(日) 19:20:05.07static_cast<char*>(&arg[0])
とやってもダメ。
0143デフォルトの名無しさん
2012/05/13(日) 19:34:20.71何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?
0144デフォルトの名無しさん
2012/05/13(日) 19:37:58.28#include<c〜>でインクルードして
グローバル名前空間に関数が展開されるのは規格違反
MSのクソコンパイラー以外じゃコンパイル出来んぞ
0145デフォルトの名無しさん
2012/05/13(日) 19:38:05.27stringとvectorでラッパを作ろうと思って。
0146デフォルトの名無しさん
2012/05/13(日) 19:43:57.510147デフォルトの名無しさん
2012/05/13(日) 19:46:05.79>>132
0148デフォルトの名無しさん
2012/05/13(日) 19:51:06.88reinterpret_cast<char**>(&arg[0])でイケた。
違いがわからんw
0149デフォルトの名無しさん
2012/05/13(日) 20:10:31.93VC++2010EEつうか、Windows SDKにも入ってる
MSのMicrosoft (R) C/C++ Optimizing Compilerの問題じゃね。
EEだろうがどのエディションでもコンパイラーは同じだから問題も同じ。
0150デフォルトの名無しさん
2012/05/13(日) 20:10:51.440151デフォルトの名無しさん
2012/05/13(日) 20:11:34.630152デフォルトの名無しさん
2012/05/13(日) 20:15:55.15int main( int argc, char *argv[] )
{
//std::vector<std::string> arg(argv,argv+argc); この時点でダメ
int res;
while( ( res = getopt(argc, argv, "a") ) != -1 )
{
}
}
getoptはchar**型を取るのであって、std::vector<std::string>を取れるように出来ていない
例え std::string args[argc];で有ってもアウト。std::stringとcharの配列には互換性が無い。
0153デフォルトの名無しさん
2012/05/13(日) 20:18:37.42arg の初期化自体には別に問題ないだろ。 char* → std::string の変換がきく。
0154デフォルトの名無しさん
2012/05/13(日) 20:22:13.96そういう問題じゃないだろ。
std::vector<std::string>をgetoptに突っ込めばいいと考えてる時点でダメなんだろ。
0155133
2012/05/13(日) 21:44:24.5112クラスの多重継承を行った、とでも言うのでない限り、>137が>133(12バイトも増えた)の原因とは考えにくい
元クラスA,Bおよび派生クラスCそれぞれで仮想関数を使ってねえが
そう考えると、2クラスの多重継承で12 バイト増える説明がつく。
それぞれのクラスが仮想関数テーブルへのポインタを含むから、4*3で12バイト増。
(これは>138のサンプルでf(), g()にvirtualを付けると検証できる。
また、強いて言えば>137のサンプル(仮想関数抜き)で
どうして>133の多重継承理由(他のクラスでも使うから)になるのかわからん
別にMSを擁護するわけではないが、interfaceの多重継承みたいなことをしたいのだとすれば
基底クラスは必ずポインタ1個分(今日日のPCなら4バイト)の領域を占めるから、>140のような最適化の出番はない、
ハズ
0156135
2012/05/13(日) 21:47:48.550157デフォルトの名無しさん
2012/05/13(日) 21:49:56.32仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど
そうでない事もあるから困る
0158デフォルトの名無しさん
2012/05/13(日) 21:53:23.93typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。
0159155
2012/05/13(日) 22:04:04.04>137のサンプルにおいて、
struct D : public A, public B { char a; virtual void f() { } };
としたとき、DとAは仮想関数テーブルへのポインタが共通
(単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる)
だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。
残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、
それでトータル12バイトになる。
0160デフォルトの名無しさん
2012/05/13(日) 22:26:12.530161133
2012/05/13(日) 23:16:40.69133で出したクラスは、
9個のクラスを多重継承しており、
うち1つは、2つのクラスを多重継承しています。
完全にノーコストだと思ってたんでやられました。
継承はやめて全部コピペすりゃいいんでしょうけど・・
0162デフォルトの名無しさん
2012/05/13(日) 23:33:09.77んなもん今日大したコストじゃねぇぞ
そんな事気にしてたらいつまで経ってもモノができん
0163デフォルトの名無しさん
2012/05/13(日) 23:51:21.35継承なんて実際大して使わないと思うんだが
全クラスの2割くらいじゃね
0164デフォルトの名無しさん
2012/05/13(日) 23:54:03.400165デフォルトの名無しさん
2012/05/14(月) 00:04:51.01多重継承は使いまくる
実装継承使うときは、デフォルト実装が欲しいときぐらいだな
完全抽象化クラスを継承することがほとんど
つか>>133は何をどういう風に再利用する気なんだろう
再利用するとなると、<algorithm>がいろんなクラスに適用出きるように
普通クラス側でなくクラスを使う側なんだが
0166デフォルトの名無しさん
2012/05/14(月) 01:14:59.86ベクトルです。float32 x 4で16byteな訳です。
多重継承している9種は、
ベクトルとの2項演算子
ベクトルとの単項演算子
ベクトルとの代入演算子
スカラとの2項演算子
スカラとの単項演算子
スカラとの代入演算子
などなど演算子が主です。
再利用化は、他に行列クラスにも使うためです。
合わせて6種類のクラスで使っています。
設計は満足のいくものだったんですが、
16Byteであるべきものが28Byteもあるようでは
はっきり言って使い物になりません。
0167デフォルトの名無しさん
2012/05/14(月) 04:27:49.77こんなのはどう?
#include <iostream>
template<typename Vec, typename Any> struct A : public Any { void a(){}; };
template<typename Vec, typename Any> struct B : public Any { void b(){}; };
template<typename Vec, typename Any> struct C : public Any { void c(){}; };
template<typename> struct Empty {};
struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; };
int main() {
std::cout << sizeof(MyVec) << std::endl;
}
0168デフォルトの名無しさん
2012/05/14(月) 07:37:20.880169デフォルトの名無しさん
2012/05/16(水) 20:03:33.91{
}
List<T>と同じ挙動のFindIndexを作りたいんですが、
どう実装されてるのかわかりません
Predicate<T>からメソッドを取り出して、
フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか
0170デフォルトの名無しさん
2012/05/16(水) 20:10:22.47C#スレで聞いてきます
0171デフォルトの名無しさん
2012/05/17(木) 04:06:37.89便利なんだがなぁ
0172デフォルトの名無しさん
2012/05/17(木) 19:49:25.05・・・というのはさておき、
struct A {
const std::string get(const std::string& value) const {
return value;
}
const bool get(bool value) const {
return value;
}
};
これで
error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested
って怒られるのなんで?
string関係はいつもストレスやわ・・・
0173デフォルトの名無しさん
2012/05/17(木) 20:51:19.48http://ideone.com/hoiKy
再現するコードかかないとわからんよ
引数の型間違ってるだけじゃないの?
0174デフォルトの名無しさん
2012/05/17(木) 21:11:17.03んでconst char*からの変換ではconst std::string&よりboolのほうが優先されて
返り値がboolなのにstd::stringで受けようとしてるからエラー
0175デフォルトの名無しさん
2012/05/18(金) 01:35:02.13a.get("abc")てしたせいです。
この問題って、もしかして
std::ofstream::ofstream(std::string)
が存在しなくて、char*にしてある理由と同じ?
なんでいちいちc_strにしないといけないのかいつも不思議だったんだけど。
・・・しかもC++0xで修正されているというのも更に分からん。
0176デフォルトの名無しさん
2012/05/18(金) 19:33:19.950177デフォルトの名無しさん
2012/05/19(土) 11:32:06.88ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。
テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。
参考→ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html
もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は
CPUではなくGPUで処理したほうが圧倒的に早いいいので、
Windows環境限定でそこそこのグラフィックカード使えるなら
DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い)
こいつらより早い行列計算ルーチンを書くのは至難だよ。
CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。
0178デフォルトの名無しさん
2012/05/19(土) 19:36:09.33関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?
0179デフォルトの名無しさん
2012/05/19(土) 19:43:35.13CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。
Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。
0180デフォルトの名無しさん
2012/05/19(土) 20:19:12.21BoostはFortranのuBlasを再現したものだから
Blits++の方がいい。速度もこっちの方が速いしね。
0181デフォルトの名無しさん
2012/05/19(土) 20:51:21.10あの変態演算子オーバーロードか
カンマ演算子をオーバーロードしたライブラリは初めて見たよ
0182デフォルトの名無しさん
2012/05/19(土) 21:13:24.420183デフォルトの名無しさん
2012/05/19(土) 21:31:33.61>カンマ演算子をオーバーロード
そんなこともできるのか点点点
0184デフォルトの名無しさん
2012/05/19(土) 21:40:31.23行列の要素を読み込むのに使ってる
ドキュメント読んでみ
0185デフォルトの名無しさん
2012/05/19(土) 21:49:13.440.1, 0.3, 0.2, 0.9,
0.0, 1.0, 0.7, 0.4,
0.2, 0.3, 0.8, 0.4;
こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ
0186デフォルトの名無しさん
2012/05/19(土) 22:41:45.370187デフォルトの名無しさん
2012/05/19(土) 22:56:32.85Array<FixedPoint, 2> A(4,4);
って宣言してる
0188デフォルトの名無しさん
2012/05/19(土) 23:00:15.42速度的にどうなんだろうか
0189デフォルトの名無しさん
2012/05/19(土) 23:07:43.73問題は肝心のテンソルの演算速度
0190デフォルトの名無しさん
2012/05/20(日) 17:53:27.61どうすればよろしいでしょうか?
0191デフォルトの名無しさん
2012/05/20(日) 18:00:27.85Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。
ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。
0192デフォルトの名無しさん
2012/05/20(日) 18:51:40.1816×16ぐらいなら転送のコストで帳消しになるだろう
0193デフォルトの名無しさん
2012/05/20(日) 19:05:49.990194デフォルトの名無しさん
2012/05/20(日) 19:49:45.50FORTRANて別に速いわけじゃないのに、なんで使われているんだろ?
やっぱ過去の資産かな?
配列の並びが逆なのが気持ち悪い。
0195デフォルトの名無しさん
2012/05/20(日) 20:03:52.87つ[ポインタのエイリアス問題]
C/C++はこれがあるために配列で最適化が十分に出来ない
VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る
0196デフォルトの名無しさん
2012/05/20(日) 20:04:11.77×>>94
○>>194
0197デフォルトの名無しさん
2012/05/20(日) 20:15:57.73http://logsoku.com/thread/pc11.2ch.net/tech/1177215582/
ちゃんとここに書いてあるのに
http://seclan.dll.jp/c99d/c99d07.htm
7.6 restrict ポインタ
0198デフォルトの名無しさん
2012/05/20(日) 20:37:06.35実際速いから。あとC++じゃベクトル命令(SSEの類ではない)
まともに自動で使えないから。
0199デフォルトの名無しさん
2012/05/20(日) 20:45:37.650200デフォルトの名無しさん
2012/05/20(日) 20:57:54.26C++には無いよ。C++11なら無視されるらしい。
0201デフォルトの名無しさん
2012/05/20(日) 21:34:30.810202デフォルトの名無しさん
2012/05/20(日) 21:48:23.26vector<double> x,y,z;
z=x*y;
的なこと?たしかにRとかで使うけどなれると便利だよな。
Pascalにもあるの?
0203デフォルトの名無しさん
2012/05/20(日) 22:14:52.36コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの?
まったく想像がつかないんだけど命令手書きとか?
0204デフォルトの名無しさん
2012/05/20(日) 22:19:12.45http://www.ss.isc.tohoku.ac.jp/refer/pdf_data/v36-1p17-54.pdf
http://www.ss.isc.tohoku.ac.jp/refer/pdf_data/v35-3p21-39.pdf
この辺の話にでてくるベクトル命令
0205デフォルトの名無しさん
2012/05/20(日) 22:25:08.49B(1:99) = A(2:100)
こんなんとか。
Fortranならある範囲から、ある範囲に対して
演算を行える専用構文が存在するがCやC++には
存在しない。独自の拡張か、環境依存の関数を
使う必要が有る。
0206デフォルトの名無しさん
2012/05/20(日) 22:30:31.09固定回数の繰返し構文を見つけて専用命令を充てる。
0207デフォルトの名無しさん
2012/05/20(日) 22:55:46.78ようにすりゃいいんだけどな。演算子のオーバーロードとか
通常時は、演算毎にループして、最適化がかかった場合は
Expression Templateみたいに一つのループで一つの要素に対する
演算をすべて実行したりとかさ。
0208デフォルトの名無しさん
2012/05/20(日) 22:58:09.26基礎研究レベルからの積み重ね以外にないだろう
商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの
別に言語の仕様が高速化に向いてるからだとかいうものじゃない
0209デフォルトの名無しさん
2012/05/20(日) 23:06:09.20配列演算ができるのと出来無いのじゃ差が大きいよ
GpGPU分野でもFortranがそのまま移植され始めたし
0210デフォルトの名無しさん
2012/05/20(日) 23:24:38.00ここで言うベクトル命令ってSSEの類じゃないってどういうこと?
インテル系以外のプロセッサということなのか?
0211デフォルトの名無しさん
2012/05/20(日) 23:26:50.520212デフォルトの名無しさん
2012/05/20(日) 23:35:25.20ここではベクトルプロセッサーのベクトル命令の事。
ベクトルプロセッサーの命令は、ループで回しながら
xmm0みたいな固定長のレジスタを使って演算する
わけじゃなく、演算命令に範囲と要素のサイズを
指定するだけ。構造がだいぶ違う。
0213デフォルトの名無しさん
2012/05/21(月) 00:35:17.00なるほどよくわかった。ベクトル機向けだからか。
今だとCUDAに近い感じかな。
0214デフォルトの名無しさん
2012/05/21(月) 00:59:09.35VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる
ヘルプ見てみ
>>209
D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな
でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ
どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし
ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを
並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213のように
GPUを使ったCUDAしかない
しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが
これは気軽に買えるようなものではない
0215デフォルトの名無しさん
2012/05/21(月) 01:13:25.790216デフォルトの名無しさん
2012/05/21(月) 01:16:42.78ちなみにC++03にもないです
俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を
買うしかないという事
スパコンも案外独自拡張されてそうだけどな
あれだけ演算速度を重視されるんだから
0217デフォルトの名無しさん
2012/05/21(月) 01:22:04.90ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね
これがないとベクトルCPUやSIMDが使えないもんなあ
それか素直にC99を使うか
0218デフォルトの名無しさん
2012/05/21(月) 01:28:46.99exstringというクラスを作ったのだけど
std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?
0219デフォルトの名無しさん
2012/05/21(月) 01:31:36.96無いとdeleteの時にメモリリークするぞ
次にコンストラクタは継承されないから自分で書き直すしかない
コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い
0220デフォルトの名無しさん
2012/05/21(月) 01:33:12.86doubleのビットを全部見たらnanについて何が分かる?
0221デフォルトの名無しさん
2012/05/21(月) 01:34:33.68std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ
0222デフォルトの名無しさん
2012/05/21(月) 01:35:11.83それからexstring自身のポインタ経由で使うか
std::stringは「失敗した標準ライブラリ」だと良く言われる
理由は多量のコンストラクタに、整理されてない多量のメンバ関数
STLの前に作られたから仕方ないんだが
string用に最適化されている事を期待して諦めているが
0223デフォルトの名無しさん
2012/05/21(月) 01:50:02.37おまいバカだろ
0224デフォルトの名無しさん
2012/05/21(月) 01:56:35.44馬鹿というなら具体的な対応策をお前が>>218に呈示してやれよ
0225デフォルトの名無しさん
2012/05/21(月) 02:52:59.24boostもC++11も見捨ててるみたいだけど、自然消滅?
0226デフォルトの名無しさん
2012/05/21(月) 04:21:31.83IEE754でいいなら、ビットパターンでNaNを表現している。
0227デフォルトの名無しさん
2012/05/21(月) 04:27:55.75<boost/container/string.hpp>
使うのは?
0228デフォルトの名無しさん
2012/05/21(月) 04:43:06.94本当だな
それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる
全部STLでやれって事だよな
0229デフォルトの名無しさん
2012/05/21(月) 06:11:32.83正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。
数カ月前向こうでそういう議論があった。
今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。
つか過疎ってる。
0230デフォルトの名無しさん
2012/05/21(月) 08:41:00.31自分で書けばいいじゃん。
俺はクリティカルになるところは自分でかく。
それ以外は、コンパイラ任せ。
0231デフォルトの名無しさん
2012/05/21(月) 09:11:46.860232デフォルトの名無しさん
2012/05/21(月) 12:36:03.13どうでも良い
0233デフォルトの名無しさん
2012/05/21(月) 19:17:30.82現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか?
昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス
→移動可能メモリを読み書きするにはロックが必要
今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス
0234デフォルトの名無しさん
2012/05/21(月) 19:31:11.61断片化解消を阻止するプログラムでも作るつもりか?
0236デフォルトの名無しさん
2012/05/21(月) 20:20:42.21DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る
0237233
2012/05/21(月) 20:42:28.92なるほど。
GPUから見た場合は論理テーブルみたいな仕組みがないので、
明示的に物理アドレスを固定しないといけないということなんですね。
ありがとうございました!!
0238デフォルトの名無しさん
2012/05/22(火) 15:19:56.67UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね?
例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?
0239デフォルトの名無しさん
2012/05/22(火) 20:57:41.810240デフォルトの名無しさん
2012/05/22(火) 22:39:22.14{
char x;
X( const X& o ) : x(1) {}
X() : x(0) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
X x;
x = X();
return 0;
}
これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが
なぜだかわかりますか? Visual C++ 2010です。
0241デフォルトの名無しさん
2012/05/22(火) 22:52:07.800242デフォルトの名無しさん
2012/05/22(火) 22:54:31.430243デフォルトの名無しさん
2012/05/22(火) 23:14:03.530244デフォルトの名無しさん
2012/05/22(火) 23:25:39.40operator=を書いてみ
0246デフォルトの名無しさん
2012/05/23(水) 07:22:31.200247デフォルトの名無しさん
2012/05/23(水) 23:34:18.12int float doubleは同じ処理で
string charは違う
その他のいろんなクラスは汎用処理
ということをしたいとする
int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか
0248デフォルトの名無しさん
2012/05/23(水) 23:41:58.93struct my_class{ ... }; // etc type
template<class T>
struct base_int_float_double{ ... }; // int or float or double
template<>
struct my_class<int> : public base_int_float_double<int>{};
template<>
struct my_class<float> : public base_int_float_double<float>{};
template<>
struct my_class<double> : public base_int_float_double<double>{};
これじゃいかんのか?
0249デフォルトの名無しさん
2012/05/23(水) 23:47:57.51ありがとう
それでいけます
0250デフォルトの名無しさん
2012/05/24(木) 03:41:09.75struct exint ; public int
{};
してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?
0251デフォルトの名無しさん
2012/05/24(木) 04:04:31.20D言語でおk
0252デフォルトの名無しさん
2012/05/24(木) 04:49:36.72何でもかんでもオブジェクトじゃないよ
0253デフォルトの名無しさん
2012/05/24(木) 13:53:23.19一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか?
つまり↓
newオブジェクト�@->newオブジェクト�A->xxxx ;
と続いている時、newオブジェクト�@をdeleteする
この場合はnewオブジェクト�Aを削除したければ、そいつのデストラクタを呼ばないと駄目?
0254デフォルトの名無しさん
2012/05/24(木) 13:58:59.65newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。
だから消えない。
0255デフォルトの名無しさん
2012/05/24(木) 14:00:56.11それはデストラクタに書くべき事でしょ
newオブジェクトにもデストラクタを書いておけば全部呼んでくれる
継承してないし簡単
0256デフォルトの名無しさん
2012/05/24(木) 14:12:45.06class Base {
public:
Base* bp;
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
Base* bp = b.pointer();
bp->bp = new Base;
bp->bp->bp = new Base;
bp->bp->bp->bp = new Base;
}
0257デフォルトの名無しさん
2012/05/24(木) 14:20:05.69やはりメモリリークはない
class Base {
Base* bp;
public:
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp->bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
Base* bp = b.pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
}
0258デフォルトの名無しさん
2012/05/24(木) 14:26:34.15newしたらdelete
http://ideone.com/Q8DwX
スマートポインタの方がいい
http://ideone.com/2PugO
ポインタの必要がなければ普通にメンバにした方がいい
http://ideone.com/eepV0
0259デフォルトの名無しさん
2012/05/24(木) 15:23:47.59タメになるなぁ。
>>257
ダメになるなぁ。
0260デフォルトの名無しさん
2012/05/24(木) 15:56:15.57リーク以前にそれ無限ループじゃね?
0261デフォルトの名無しさん
2012/05/24(木) 16:14:14.63やってみて言ってんのか
Base() : bp(new Base) {
bp->bp = 0;
}
が何のために書いてあるのか分からないのか
0262デフォルトの名無しさん
2012/05/24(木) 16:19:57.35開発環境入ってないから検証できないな。
で、Ideoneで試してみたら、ランタイムエラーだってさ。
http://ideone.com/ikpg0
0263デフォルトの名無しさん
2012/05/24(木) 16:36:25.550264デフォルトの名無しさん
2012/05/24(木) 16:38:47.40ループの件とは別に、
>>256はbp->bp->bpで連結してるけど
>>257はBase::bpでなくmainのローカル変数書き換えてるだけなのでリークする
やりたいことは分かるけどサンプルは盆ミス回避のため実際に実行するに限る
http://ideone.com/pcKDy
0265264
2012/05/24(木) 16:41:37.05そしてこの凡ミスである
0266デフォルトの名無しさん
2012/05/24(木) 17:00:14.45やってみて言ってんのか
0267260
2012/05/24(木) 17:43:32.61コンストラクタでのnewでまたコンストラクタを呼び出す <---- 無限ループ
試しに bp->bp=0; にブレークポイント仕掛けたけど、そこに到達する前にスタックオーバーフローした
見た瞬間に気が付くと思うんだけどなぁ
0268デフォルトの名無しさん
2012/05/24(木) 18:47:57.480269デフォルトの名無しさん
2012/05/24(木) 19:51:23.02ありがとうございました
#include <iostream>
class Base {
Base* bp;
public:
Base(int i = 0) {
std::cout << "Base() " << i << " time(s) called." << std::endl;
bp = new Base(i + 1);
bp->bp = 0;
}
Base** pointer() { return &bp->bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
}
0270240
2012/05/24(木) 20:52:39.67ただもうひとつ、疑問があります。
このoperator=()が適用されないんですが
なぜなのかさっぱりです。
というかこれは常識ですか?
http://codepad.org/z5OlAQXL
0271デフォルトの名無しさん
2012/05/24(木) 20:57:20.69普通のメンバ関数なのでテンプレートより優先。
0272240
2012/05/24(木) 21:04:15.42デバッガでトレースしても何も無いし
暗黙なんて止めて欲しい・・
ともあれ、おかげで対策方法もやっとわかりました。
どうもありがとうございます。
0273デフォルトの名無しさん
2012/05/24(木) 23:25:58.77}
初期化リストでnewするって無いよな
スマポ使えとまでは言わんが、せめて
初期化リストはNULL初期化だわ
効率もスマポ使った時と変わらん
Base():value1(NULL),value2(NULL)
try
{
value1 = new Type();
value2 = new Type();
}
catch(...)
{
delete value1;
delete value2;
}
0274デフォルトの名無しさん
2012/05/24(木) 23:42:36.300275デフォルトの名無しさん
2012/05/24(木) 23:43:59.04いや、俺はちゃんとnew_handler記述するよ。
0276デフォルトの名無しさん
2012/05/24(木) 23:47:16.61もうガッタガタで、プロセス落とすしかないんじゃないの?
0277デフォルトの名無しさん
2012/05/24(木) 23:55:28.25Effective C++読んでみれ。
第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。
メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。
イメージできないなら、まだ初級プログラマになれてない。
0278デフォルトの名無しさん
2012/05/24(木) 23:59:38.27二版では2章7項だったが、三版では8章辺りの話題のようだ。
0279デフォルトの名無しさん
2012/05/25(金) 00:02:50.740280デフォルトの名無しさん
2012/05/25(金) 00:05:45.16それがわからないって言ってるやつは結局エラー処理をサボる理由が欲しいだけなんでしょ。
0281デフォルトの名無しさん
2012/05/25(金) 00:06:34.49再帰呼び出しになるから、引数を入れて深さがある程度になったら
止めるなどの工夫をしないとstd::bad__alloc例外が投げられるのは目に見えている
0282デフォルトの名無しさん
2012/05/25(金) 00:07:23.77処理系によってはスタックオーバーフローしても何も言わずにそのまま続行するから
たちが悪い
0283デフォルトの名無しさん
2012/05/25(金) 00:20:57.760284デフォルトの名無しさん
2012/05/25(金) 00:37:07.29普通の関数のCALLみたいな機構で実現されてる場合が多いみたいです
だから先にスタックが逝くような感じ
0285デフォルトの名無しさん
2012/05/25(金) 00:56:04.36どのような方針で書けばいいでしょうか。
よろしくお願いします。
0286デフォルトの名無しさん
2012/05/25(金) 01:01:57.440287285
2012/05/25(金) 01:36:52.37ストリーミング取得しやすくするライブラリでもあればいいのですが。
ちなみに対象のMJPEGの構造は把握しているので独自に解析するとして、今は自分の中に以下の3つの課題があります。
・データをどうやって取ってくるか
・送られてくるMJPEGを具体的にどのようにバッファして解析してバッファをリリース&次のデータを取得すればいいのか
・マルチスレッドで他の処理と並行して実行させたいので、プロセス内でjpgのやり取りをしたいのですが、
例えばOpenCVを使った画像処理スレッドとjpgを取得するスレッドをどうやって連携させるのか
0288デフォルトの名無しさん
2012/05/25(金) 04:07:11.321. wget URL | お前のプログラム
2. read(stdin)
3. シングルで動いてから考えろ
煽りじゃなくて本気でリファレンス実装作ってからじゃないとデバッグ大変よ?
0289デフォルトの名無しさん
2012/05/25(金) 04:37:11.100290デフォルトの名無しさん
2012/05/25(金) 06:01:17.57new演算子の問題じゃなく、newに付けたコンストラクターが
例外を出した時が問題なんだけどな
0291デフォルトの名無しさん
2012/05/25(金) 06:24:09.31new_handlerつかっててもコンストラクタでコケたらメモリーリークする
メモリーリークだけなら即致命的な事態にならないが
ファイルロックや排他など各種ロックが掛かりっぱなしになる
0292デフォルトの名無しさん
2012/05/25(金) 06:26:00.68>ファイルロックや排他など各種ロックが掛かりっぱなしになる
これは、ロックするタイプのオブジェクトをnewで確保していた場合な
0293デフォルトの名無しさん
2012/05/25(金) 07:32:03.940294デフォルトの名無しさん
2012/05/25(金) 08:24:38.42new_handler とメモリーリークは関係ないだろ。
0295デフォルトの名無しさん
2012/05/25(金) 09:28:57.730296デフォルトの名無しさん
2012/05/25(金) 09:35:01.30そうは思わんかね
0297デフォルトの名無しさん
2012/05/25(金) 09:46:28.440298デフォルトの名無しさん
2012/05/25(金) 09:58:18.30細かいアレだけど「コンストラクタが例外安全なコードになってなかったら」だろ?
0300デフォルトの名無しさん
2012/05/25(金) 12:58:34.67C++はGCが付いてないんだからスマポ使った方がいいかもね
メモリリークで本当に悩む
0301デフォルトの名無しさん
2012/05/25(金) 16:45:50.43パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。
0302デフォルトの名無しさん
2012/05/25(金) 17:04:43.030303デフォルトの名無しさん
2012/05/25(金) 17:23:15.50int*: time: 2.13s
http://ideone.com/2tLcx
std::unique_ptr<int>: time: 2.13s
http://ideone.com/wtba4
std::shared_ptr<int>: time: 4.41s
http://ideone.com/UDuJE
sizeof:
http://ideone.com/EtftU
> sizeof(int*) = 4
> sizeof(std::unique_ptr<int>) = 4
> sizeof(std::shared_ptr<int>) = 8
0304デフォルトの名無しさん
2012/05/25(金) 17:24:20.59http://ideone.com/sc7fr
0305デフォルトの名無しさん
2012/05/25(金) 17:56:17.190306デフォルトの名無しさん
2012/05/25(金) 19:21:00.330307デフォルトの名無しさん
2012/05/25(金) 19:33:51.01会社がboost使わせねェんだから仕方ねぇだろ
0308デフォルトの名無しさん
2012/05/25(金) 19:41:03.98scoped_ptrくらいなら定義すればいいだろ
0309デフォルトの名無しさん
2012/05/25(金) 19:43:11.82内製の糞ライブラリ使うしかないのかwww
0310デフォルトの名無しさん
2012/05/25(金) 19:49:48.85紐付けとかないとなにやらかすかわからん集合無知みたいな
0311デフォルトの名無しさん
2012/05/25(金) 20:03:22.590312デフォルトの名無しさん
2012/05/25(金) 20:10:06.480313デフォルトの名無しさん
2012/05/25(金) 20:12:18.610314デフォルトの名無しさん
2012/05/25(金) 20:13:50.230315デフォルトの名無しさん
2012/05/25(金) 20:19:58.860316デフォルトの名無しさん
2012/05/25(金) 20:24:12.060317デフォルトの名無しさん
2012/05/25(金) 20:50:09.14全部覚えたら神様と崇めるよ
0318デフォルトの名無しさん
2012/05/25(金) 20:58:47.740319デフォルトの名無しさん
2012/05/25(金) 21:02:10.590320デフォルトの名無しさん
2012/05/25(金) 21:06:08.79resize
0321デフォルトの名無しさん
2012/05/25(金) 21:07:54.550322デフォルトの名無しさん
2012/05/25(金) 21:08:02.540323デフォルトの名無しさん
2012/05/25(金) 21:31:17.40どんな理由で禁止されてんの?
0324デフォルトの名無しさん
2012/05/25(金) 21:45:46.590325デフォルトの名無しさん
2012/05/25(金) 21:47:35.900326デフォルトの名無しさん
2012/05/25(金) 21:47:36.000327デフォルトの名無しさん
2012/05/25(金) 21:47:46.73テンプレが役に立たなかった時の名残
0328デフォルトの名無しさん
2012/05/25(金) 21:49:27.89なら今はもう問題ないな。
0329デフォルトの名無しさん
2012/05/25(金) 21:50:34.360330デフォルトの名無しさん
2012/05/25(金) 21:51:37.500331デフォルトの名無しさん
2012/05/25(金) 21:53:21.900332デフォルトの名無しさん
2012/05/25(金) 21:55:01.370333デフォルトの名無しさん
2012/05/25(金) 22:13:36.610334デフォルトの名無しさん
2012/05/25(金) 22:26:00.18俺「それC++を使う意味なくないっすか?」
0335デフォルトの名無しさん
2012/05/25(金) 22:26:55.36おっとMicrosoftの悪口はそこまでだ
0336デフォルトの名無しさん
2012/05/26(土) 00:23:07.533〜5年前なら当たり前のようにそういう話があった
今でも少なくない
0337デフォルトの名無しさん
2012/05/26(土) 00:34:43.340338デフォルトの名無しさん
2012/05/26(土) 01:21:21.230339デフォルトの名無しさん
2012/05/26(土) 01:25:34.850340デフォルトの名無しさん
2012/05/26(土) 01:27:44.730341デフォルトの名無しさん
2012/05/26(土) 01:30:26.650342デフォルトの名無しさん
2012/05/26(土) 02:09:27.730343デフォルトの名無しさん
2012/05/26(土) 02:13:27.57ttp://eternalwindows.jp/control/controlbase/controlbase09.html
0344デフォルトの名無しさん
2012/05/26(土) 02:46:18.77コンパイラが変わると、コンパイルが通らないからだよ。
ビルド環境にboostがあるとは限らんし。
早くboostがstlになればいいんだよ。
0345デフォルトの名無しさん
2012/05/26(土) 02:51:18.550346デフォルトの名無しさん
2012/05/26(土) 03:05:38.090347デフォルトの名無しさん
2012/05/26(土) 07:27:02.37遅レス&&全レス読んでないが、関係はある
クラスFooのコンストラクタ内で例外が発生すると、
その時点で構築済みメンバのデストラクタはもれなく呼ばれるが
Fooインスタンス自体のデストラクタが呼ばれない
したがって、Fooがメンバとして単純なポインタFoo::m_pを含んでおり、
それに対するnewが成功した後に(別のnew等で)例外が発生すると
Foo::m_pが指すメモリを解放する奴が居ないからリークする
解決策はFoo::m_pのような奴を生のポインタではなくauto_ptrにするとか
0348デフォルトの名無しさん
2012/05/26(土) 07:41:07.42new_handler中身でやることのパターンは何通りかあるが、結局例外を投げてしまう場合、と読み替えてちょ
0349デフォルトの名無しさん
2012/05/26(土) 13:07:43.57イテレーターのクラスによって要請されているインターフェイスの
オペレーターを全て実装していることを仮定されていますか?
よろしくお願いします。
0350デフォルトの名無しさん
2012/05/26(土) 16:52:27.58C++に準拠してれば、C++の仕様に沿ったオペレーターを実装してるだろう。
C++に準拠してないコンパイラーの話なんかされても知らんがなとしか言えん。
0351デフォルトの名無しさん
2012/05/26(土) 17:23:19.31何を聞きたいのかわからんが、
一応テンプレートに現れるシンボル(オーバーライドされたオペレータ含む)はtwo-phase lookupと言う規則で解決され、
インスタンス化しないテンプレートに現れるシンボルやオペレータについては宣言も実装も一切要らない
0352デフォルトの名無しさん
2012/05/26(土) 17:43:29.25インターフェイスの提供するファンクションはSTLで実装されているイテレーターのイテレータークラス
によって類別されて決定される全てのファンクションが実装されていることを前提としているのでしょうか?
0353デフォルトの名無しさん
2012/05/26(土) 18:00:41.46だから現状ではイテレータの要件を完全には満たしてないクラスを渡しても動作するアルゴリズムの実装はありえる
0354デフォルトの名無しさん
2012/05/26(土) 18:05:54.57一回動けばいいような書き捨てプログラムでもない限りきっちり作っておくが吉。
0355351
2012/05/26(土) 18:56:58.81初心者なものでイテレータはSTLのコンテナから出てくるものが全てだと思い込んでいた、
0356デフォルトの名無しさん
2012/05/26(土) 20:27:12.61結構面倒くさいからboost使うといいよ
0357デフォルトの名無しさん
2012/05/26(土) 21:41:27.080358デフォルトの名無しさん
2012/05/26(土) 21:50:08.94for_eachで回すだけで面白い事が出来る奴とか
0359291
2012/05/26(土) 21:52:12.10俺は、>>275がnew_handlerでなんとか出来るらしいと
書いてたからnew_handlerでメモリーリーク対策できなくねと書いたまで。
new_handlerとメモリーリークが関係するかはしらんがな。
0360デフォルトの名無しさん
2012/05/26(土) 21:57:56.250361デフォルトの名無しさん
2012/05/26(土) 22:03:50.90Fooのコンストラクタ内で例外を捕捉しないものとして、
>347な状況でnew_handlerから(何でもいいが)bad_alloc等の例外をスローすると、Foo::m_pが指す先のメモリがリークする
>347の状況であってもnew_handler内で(あらかじめ非常用にリザーブしておいたメモリから割り当てる等の手段で)
例外をスローせずに処理した場合、リークは起きない
よって、new_handlerの中身がリーク発生に全く無関係とは言えない
0362デフォルトの名無しさん
2012/05/26(土) 22:09:06.28空きがあったらってぶっちゃけ関係ないよな
0363デフォルトの名無しさん
2012/05/26(土) 22:18:29.67>空きがあったらってぶっちゃけ関係ないよな
空き0前提はともかく、非常用のリザーブ領域まで0前提なのか否かはスレの流れからは自明ではありませんね〜
new_handler内でユーザー向けダイアログボックス用にリザーブ領域メモリを割り当て、
エラー表示した後プログラム終了、という設計も有り得る
0364デフォルトの名無しさん
2012/05/26(土) 22:22:05.70newが例外を出した時点で、new_handlerは失敗してる。
0365デフォルトの名無しさん
2012/05/26(土) 22:25:43.17newが例外だしてりゃリザーブ領域空ですよね
0366デフォルトの名無しさん
2012/05/26(土) 22:30:47.43kwsk
デフォルトのnew_handlerを自作new_handlerに差し替えた後でも
newが勝手に例外をスローするというのは初耳
0367デフォルトの名無しさん
2012/05/26(土) 22:36:04.77自作new_handlerが何も割り当てできなかったらNULLでも返す気か?
要点は例外じゃなくて、new_handlerがなすすべがない状態におちいてっるて
所なんだからそれぐらいは解れよ
0368デフォルトの名無しさん
2012/05/26(土) 22:41:05.88つまらん事で意地をはるな
得することなんて何もないんだから
0369デフォルトの名無しさん
2012/05/26(土) 22:48:40.40自作new_handlerなんだから、なすすべがない状態に陥らないように設計もできるよ?
単純な方法としては、プログラムの起動時に数KBかそこらのメモリを非常用にnewしておき、
そのポインタを大域変数g_pReservedに記録、
その後本当にメモリが0になったらg_pReservedからとりあえず返し、ただしプログラム終了フラグをセットして
速やかにプログラムを終わらせる、みたいな
そのためのnew_handlerです
0370デフォルトの名無しさん
2012/05/26(土) 22:53:03.92もうダメだなこの人完全に意固地になってる
0371デフォルトの名無しさん
2012/05/26(土) 22:53:30.08g_pReserved が使われた後にもっかい new したら同じこと。
0372デフォルトの名無しさん
2012/05/26(土) 22:55:46.29元々可能性の低い失敗がもし起こったらどうなるか、って話をしてるのに
可能性をもう少しほんのちょっとだけ下げる方法の話をしても意味ないでしょ。
0373デフォルトの名無しさん
2012/05/26(土) 22:57:52.31話の論点からずれるけどアホだろあんた
最初にnewしてなければその分空きがあったはずで、意味がない。
new_handlerとして有効な使い方は、高速化の為にだけ先読みしてた
画像データなどのキャッシュ解放。不要なデータを削除すんのが普通。
#余談だから無視してくれ
0374デフォルトの名無しさん
2012/05/26(土) 23:09:46.56デフォルトのnew_handlerを自作new_handlerに差し替えた後ならnewが勝手に例外を投げることはないから、
>365の言うような現象は起きない。よって、>365に基づく批判はナンセンスだし
>>371
まあそこらの細かい設計は一考を要するが、
別にg_pReservedをただ一つのオブジェクトに一括で返さねばならないわけでもなし
>>372
可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
本当にヒープ0になってからでは何も仕事はできない、という主張をするなら、
後始末という仕事を正しく遂行するため用のメモリをあらかじめ確保しておくという発想に到らねばおかしい
>>373
無視するが、>372へのレスの通りである
0375デフォルトの名無しさん
2012/05/26(土) 23:17:56.17g_pReservedが空になったらどうする気だ?
0376デフォルトの名無しさん
2012/05/26(土) 23:21:13.73本当にそうなったら万事休すだが、
やる仕事は後始末、と限定し、それに必要十分なメモリ量を見積もって
g_pReservedとして確保しておけば、それは避けられる
0377デフォルトの名無しさん
2012/05/26(土) 23:23:24.66万事休すになった時のことをみんな言っているんだけど
それと、その時あんた例外なげないっていってたけどどうする気だ?
0378デフォルトの名無しさん
2012/05/26(土) 23:33:22.47newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
取れれば有効なポインタが返り、取れなければ例外、それだけ。
足りなくなったのでクリーンナップして終了させる必要があるなんて知る余地もない。
std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?
0379デフォルトの名無しさん
2012/05/26(土) 23:36:22.15「万事休す」に2種類あることに注意だな。ただしどっちの解決策も示し済みwwwwww
(1) 後始末を遂行するためのメモリがリザーブ領域に残っているがそれ以外が0になった「万事休す」なら、
リザーブ領域のメモリからの割り当てて後始末を遂行し、プログラムを正常終了すれば良い(>369, >374の3コ目)
(2) 後始末を遂行するためのメモリまで0になる「万事休す」は、
>376のようにきちんと必要なメモリ量を見積もって確保しておけば生じない
ていうか、漏れとしてはnew_handlerの一活用方法を述べているだけで、そればかりに食いつかれてもなんだか悲しい
興味がおありの向きは、自力でnew_handlerを調べて活用方法でも考えたらどう?
例えば、new_handlerから自作GCを起動してしばらく使っていないオブジェクト(当然GCで管理する設計にする)
を解放し、空いたメモリを返すとか
0380デフォルトの名無しさん
2012/05/26(土) 23:40:36.58>>369のやり方をすれば、ヒープが枯渇するタイミングが早まるだけで、
使えるヒープの総量は変わらないんだけど
0381デフォルトの名無しさん
2012/05/26(土) 23:54:34.16>newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
おk newがメモリをどこから取るかに依存するような話はしていないつもりだが
>std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?
漏れはg_pReservedに残っているメモリでプログラムの後始末を遂行し、終了するという考え方を示した。
後始末と終了以上の仕事をさせたいというならどうするか考えるのはYOUの仕事ですな
>>380
使えるヒープの総量が変わらない、はその通り
>369のやり方は、後始末を遂行する余力を残した状態で、ちょっとだけ早期にヒープ枯渇を察知することに意味がある。
0382デフォルトの名無しさん
2012/05/27(日) 00:22:31.86おい、new_handlerが不足を察知したところでnewを呼ぶ側にはそれを知る術がない、といっているのだが。
0383デフォルトの名無しさん
2012/05/27(日) 00:27:33.02リザーブが枯渇した後なんだから(1) は文脈としてありえないだろ
見積もれないからnew_handlerが呼ばれてるわけで(2)も終ってる
0384デフォルトの名無しさん
2012/05/27(日) 00:36:22.89> 可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
どっちにしてもメモリーリークと関係なくね?
プログラムを正常終了させる話にしても、普通にスマートポインタつかってりゃ
例外が飛んで catch されるなり terminate() されるなりしてプログラムを終了
させたければさせられるわけだが、そのよくわからん new_handler を使う方法は
何がうれしいのかさっぱり。
0385デフォルトの名無しさん
2012/05/27(日) 14:26:48.55Effective C++ 改訂2版 p.49に>363に類似だがより良い方法の記述がある
>たとえばプログラム起動時に予備として大きなメモリブロックを割り当てておき、
>new-handlerが初めて呼び出されたときにそのブロックを開放するという方法がある。
記憶管理の話は荒れますねwwwwww
0386デフォルトの名無しさん
2012/05/27(日) 14:31:55.15荒れてる原因は話題じゃなくて、無理を通そうとする若干一名に見える。
0387デフォルトの名無しさん
2012/05/27(日) 14:34:23.79>385の引用の続きだが
>予備のメモリを解放するときには、ユーザーにメモリが少ないことを警告
>し、もっとメモリを追加しないと今後の要求が失敗する恐れがあることを
>知らせるメッセージを出す事が多い。
↑これはメッセージを出すケースだが、予備が十分なら、
メッセージを出すのがある程度高価な処理であるケース
(例えばダイアログボックススに長いメッセージを出す必要があり、文字列をnewしたい場合等)に対応できる。
また、ヒープメモリが予備含めて完全に0になった状態で
「(例外をcatch等して)プログラムを(正常に)終了させたければさせられる」
という>384の自信はどこから来るんだ;
0388デフォルトの名無しさん
2012/05/27(日) 14:36:00.96違うな。Effective C++の著者と漏れとで少なくとも2名だ
0389デフォルトの名無しさん
2012/05/27(日) 15:00:39.65お前か。
みんなが >>361 の「new_handlerの中身がリーク発生に全く無関係とは言えない」について
ツッコミを入れているのがわからないの?
0390デフォルトの名無しさん
2012/05/27(日) 15:19:59.91じゃあ藻前ら流の「全く無関係」のwell-definedな定義と「全く無関係」であることの論証よろ
少なくとも>388は、A,Bを命題として、「A→Bかつ¬A→¬BだからAとBは無関係とはいえない」、
という論法(のちょい派生)なわけだが
0391デフォルトの名無しさん
2012/05/27(日) 15:21:59.07× >388
○ >361
0392デフォルトの名無しさん
2012/05/27(日) 15:27:48.240393デフォルトの名無しさん
2012/05/27(日) 16:04:43.89_ 争 も _ /, -‐==ミ: : : : _,ィニ-‐……ー-: 、`ヽ、: : : : ヽ、 _ 争 _
_ え っ _ . .:´: : : : : : : ≠:7: : : : : : : : : : : : :ヽ、 ヽ| : i : : :, _ え _
_ : . と _ /.: : : : -‐: :7´: : /:,ハ : : : :ヽ : : : ゝ-- :\ | : :! : : : , _ : _
_ : _ /, -‐/.: : : : :i : : /ィ:爪: : :\ :\ : : :\: : :`ト : !: : : :′ _ : _
〃 /. : : : : : : |.:イ :ハ:| \: .、\: : xィ¬ト、: :| : : ! : : : : :,
/ \ /.: :/.: : : : /l : |/Гト、 / |_,ノ0:::ヽ : : :i : : : : :′ / \
/ | | \ | .:/.:/. : : :i: i : | |ノ0:::ト ::::::::::::: |: :∩::::::ト: : : !: : : : : : :, / | | \
∨i: |: : : : |: :ヽ| |::∩::| :::::::::::::::: !.::∪::::::| |: : :i : : : : : : ′ ,ィ /〉
|: |: : i : :', : | |::∪::| :::::::::::::::: !: : : : : :||: : i : : : : : : : :, / レ厶イ
ヽハ: : :、: :ヽ| l : : : |::::: , ::::└――┘ ! : : i : : : : : : : ′ / ⊂ニ、
い、: :\/  ̄ ̄ ', : : i : : : : : : : : , _, -‐' ⊂ニ,´
r 、 _ ヽ: :〈 <  ̄ フ |: : : ! : : : : : : : :′,.-‐T _,. -‐'´ ̄
くヾ; U| | : \ /| : : :i : : : : :_, -‐' | /
r―' ヽ、 | : : : \ イ: : :| : : :i_,. -‐ |/
`つ _  ̄ ̄Τ`ー―-- L: : : : : `: : . . . __ .:〔: : :|: : :r┬' |
0394デフォルトの名無しさん
2012/05/27(日) 19:45:53.790395デフォルトの名無しさん
2012/05/27(日) 19:49:06.860396デフォルトの名無しさん
2012/05/27(日) 20:20:49.72初心者用しかないのが気にはなるが
くだすれC++/CLI(初心者用)part2
http://toro.2ch.net/test/read.cgi/tech/1268613679/
0397デフォルトの名無しさん
2012/05/27(日) 21:00:36.93向こうはC++/CLIに固有の内容以外(C++や.NETの基礎知識)は基本的にスレチだし
0398デフォルトの名無しさん
2012/05/27(日) 21:42:40.23{
int *array = new int[0];
delete[] array;
return 0;
}
Visual Studio 2008搭載のコンパイラーでこのコード走らせると
異常終了してた気がするけど、もし異常終了したらバグじゃね?
仕様として正常終了と異常終了どっちが正しいんだ?
0399デフォルトの名無しさん
2012/05/27(日) 21:58:07.72new が失敗→ bad_alloc → terminate() → abort() という可能性はあるが、
現実に VS が対象としてる Windows 環境でそうなることは考えづらいな。
0400デフォルトの名無しさん
2012/05/27(日) 22:00:21.06メモリー不足→new_handler作動→リザーブが足りない→newが例外→直前にnewで確保したメモリーがリーク
もしくは、
メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了
メモリーリークとnewが例外出す以前は全く関係ない
0401デフォルトの名無しさん
2012/05/27(日) 22:01:47.57俺Windows持ってないから、実際やったらどうなるか試してもらえるか?
正常終了したら正常終了したと教えてくれ。
0402デフォルトの名無しさん
2012/05/27(日) 22:10:53.15…規格票はJISのページがアレなので、誰か英語の規格でも貼っておくれ^^
0403デフォルトの名無しさん
2012/05/27(日) 22:12:54.12って書いてある本があったな
Exceptional C++だったかな?
0404デフォルトの名無しさん
2012/05/27(日) 22:14:48.61new int[0]が何を返そうがどうでも良いんだけどね。
どうせ0なんだから代入しないわけだし。
問題はdelete[]がnew int[0]で確保した何かを
削除して落ちるのが合法かというわけで。
0405デフォルトの名無しさん
2012/05/27(日) 22:17:32.68勿論合法。>>398もエラー無しの正常終了。VCでもエラーでなかったよ。
0406デフォルトの名無しさん
2012/05/27(日) 22:20:18.83大抵はダメでも対処するケースはそれなりにある
可能な限りキャッシュを開放してロックを解除とかね
プロセス外部にあるロックは鼓動が止まってから
しばらく立たないと解除されないから、開放できるものがあるなら
最後の余力を使って可能な限り解放したほうがいい
0407デフォルトの名無しさん
2012/05/27(日) 22:21:29.08de;ete[] new int[0];で異常終了が合法なの?
りょうかーい。
0408デフォルトの名無しさん
2012/05/27(日) 22:25:00.40実装によっては開放した途端OSにボッシュートされてヨソにもってかれたりとかも。
0409デフォルトの名無しさん
2012/05/27(日) 22:29:37.55基本的に
ヒープが空 = アドレス空間に空きがない
であって
ヒープが空 = システムの記憶領域が足りない
じゃないからな。後者だとプログラム以前にOSが止まる。
0410デフォルトの名無しさん
2012/05/27(日) 22:30:27.97ちゃうねん。異常終了しないのが合法。
0411デフォルトの名無しさん
2012/05/27(日) 22:31:42.590412デフォルトの名無しさん
2012/05/27(日) 22:58:10.60cmathのrand()って周期いくつか分かりますか?
0413デフォルトの名無しさん
2012/05/27(日) 23:00:29.78cmathのrand()って周期いくつか分かりますか?
0414デフォルトの名無しさん
2012/05/27(日) 23:03:46.580415デフォルトの名無しさん
2012/05/27(日) 23:15:26.42そんなもの存在しない
0416デフォルトの名無しさん
2012/05/27(日) 23:26:07.120417デフォルトの名無しさん
2012/05/28(月) 00:05:41.96cmathの中にrandはない。他の場所にあるrandの周期は実装によって異なる。
0418デフォルトの名無しさん
2012/05/28(月) 00:15:04.790419デフォルトの名無しさん
2012/05/28(月) 00:24:54.980421デフォルトの名無しさん
2012/05/28(月) 05:52:39.320422デフォルトの名無しさん
2012/05/28(月) 10:47:20.39>>361
RAII(スマポ)使うかtry-catch(-rethrow)するか2択なんだし
両方しないのは単なる例外安全でないバグコードじゃね
Fooがバグってるのに
Foo「俺のせいじゃないです、bad_alloc投げたやつせいです」
それあんまりじゃね
0423デフォルトの名無しさん
2012/05/28(月) 12:00:15.12どうしようも無いケースも多いだろうけど
オンメモリで小さいテキストを処理する機能にクソでかいファイル渡すとか
オプションで何かのバッファサイズに無茶な値を設定したとかあるし
対話型なら別にプロセス落とさなくても
入力ハンドラあたりでcatchしてエラー表示して続行でよくね
0424デフォルトの名無しさん
2012/05/28(月) 12:34:04.340425デフォルトの名無しさん
2012/05/28(月) 14:26:54.15画面表示もメモリ食うんじゃないのか?
0426デフォルトの名無しさん
2012/05/28(月) 18:21:20.59>>423の2,3行目のケースならメモリ大量消費処理から
入力(\nやマウスイベント)ハンドラまでスタックが戻った時点で
メモリは解放されてる(例外安全なコードなら)
戻って尚足りないなら、どうしようも無いケースってことで
0427デフォルトの名無しさん
2012/05/29(火) 09:45:22.55コンパイラオプションで例外を無効にしてる人っている?
0428デフォルトの名無しさん
2012/05/29(火) 13:24:28.38Google社員がそうじゃね?
0429デフォルトの名無しさん
2012/05/29(火) 21:19:59.030430デフォルトの名無しさん
2012/05/29(火) 21:59:51.13コンパイラー何使った?
0431デフォルトの名無しさん
2012/05/29(火) 22:52:35.800432デフォルトの名無しさん
2012/05/30(水) 01:10:25.39427 じゃないけど、なんで切ったのか気になるなー。
プログラムサイズ?実行速度?
0433デフォルトの名無しさん
2012/05/30(水) 04:20:14.38それはコンパイラーじゃなくて統合開発環境じゃん。てのは置いといて、
CodeWarriorについて来るコンパイラーは、そもそもthrow-try-catchが
まともに動かんだろ。
0434デフォルトの名無しさん
2012/05/30(水) 07:38:21.36ベターCとしてのC++になるのかな
0435デフォルトの名無しさん
2012/05/30(水) 08:05:44.79いやまて例外を投げるメンバ関数だけ切ればいい話か
0436デフォルトの名無しさん
2012/05/30(水) 08:28:18.20class sub{
public:
int aaaa;
};
claaa sper{
public:
sub* s;
};
↑特にこういう時
0437デフォルトの名無しさん
2012/05/30(水) 08:37:44.75(sub::**s)になるのかな
0438デフォルトの名無しさん
2012/05/30(水) 08:38:14.93インスタンスと組み合わせて使わないと意味をなさない
オフセットのようなものか
0439デフォルトの名無しさん
2012/05/30(水) 08:46:53.930440デフォルトの名無しさん
2012/05/30(水) 08:50:28.22他の配列やPODなんかを指しても別にいいけど
ただクラスはstaticメンバでない限り多数生成する目的なんだからやはりnewだろうね
そしてデストラクタにはdeleteを入れる
スマポを使うと楽だけどな
0441デフォルトの名無しさん
2012/05/30(水) 08:52:29.69初期化関数を抜けたらポインタで持たせているデータだけNULLになっていました。
char*とかがそうです。中身を持たせているのにも関らず消えてしまうのはなぜなんでしょうか?
0442デフォルトの名無しさん
2012/05/30(水) 09:00:09.20文章だけじゃイメージ沸かない
0443デフォルトの名無しさん
2012/05/30(水) 09:17:17.40こんな感じかなあ
class sub {
public:
int aaaa;
};
class sper {
public:
sub* s;
};
int main()
{
sub* su = new sub;
sper* sp = new sper;
sp->s = su;
int sub::*aa = &sub::aaaa;
su->*aa = 1;
std::cout << su->*aa << std::endl;
sp->s->aaaa = 2;
std::cout << su->*aa << std::endl;
delete sp;
delete su;
}
0444デフォルトの名無しさん
2012/05/30(水) 09:42:39.53class test{
public:
cObj* objArray[10];
test() : objArray[0](new cObj) {};
};
みたいな感じなんですが・・・・・
0445デフォルトの名無しさん
2012/05/30(水) 09:50:21.49できる。
0446デフォルトの名無しさん
2012/05/30(水) 09:56:04.82どうやって?
0447デフォルトの名無しさん
2012/05/30(水) 09:58:31.43できないと思った瞬間にゲーム終了だ
0448デフォルトの名無しさん
2012/05/30(水) 09:58:34.74それできるのか? 知らんかった
0449デフォルトの名無しさん
2012/05/30(水) 10:05:05.19HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 )
Windows によって hoge.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
0450デフォルトの名無しさん
2012/05/30(水) 10:19:59.96nullをdeleteしてるんだろ
0451デフォルトの名無しさん
2012/05/30(水) 10:23:54.40デフォルトコンストラクタでいいならvectorにでも突っ込めばいいけどな
0452デフォルトの名無しさん
2012/05/30(水) 10:41:58.15地道にデバッグするしかない
書いちゃダメなところに書いてる
多くの場合、配列の添字かポインタが意図しない値になってる
0453デフォルトの名無しさん
2012/05/30(水) 10:51:41.49無理!
超雑だし、吐き気を催すだろうからww
>>452
なるほど・・、取りあえずやってみます。
0454デフォルトの名無しさん
2012/05/30(水) 10:57:58.230455デフォルトの名無しさん
2012/05/30(水) 11:04:26.07明日から背中に気をつけろよ
0456デフォルトの名無しさん
2012/05/30(水) 11:13:47.590457デフォルトの名無しさん
2012/05/30(水) 11:25:43.53カスだろうがカスじゃなかろうが、カス扱いは確実だろう
やりたくなきゃやらなきゃ良い
0458デフォルトの名無しさん
2012/05/30(水) 11:32:25.520459デフォルトの名無しさん
2012/05/30(水) 11:40:58.92それが嫌ならaligned_storageから作れるスタック領域にplacement newをforなりwhileなりの
繰り返し構文で回せばできるだろ。
0460デフォルトの名無しさん
2012/05/30(水) 11:43:19.03http://ideone.com/Axkqv
http://ideone.com/k4arh
http://ideone.com/7vhhV
0461デフォルトの名無しさん
2012/05/30(水) 11:43:25.500462デフォルトの名無しさん
2012/05/30(水) 11:46:14.460463デフォルトの名無しさん
2012/05/30(水) 11:56:39.78mpl::mapを使えばできる。
ちょっと待っててね。
0464デフォルトの名無しさん
2012/05/30(水) 12:18:14.76できたよー(^o^)ノ
ttp://ideone.com/pkiS4
0465デフォルトの名無しさん
2012/05/30(水) 12:35:47.700466デフォルトの名無しさん
2012/05/30(水) 12:35:57.38ありがとうございます
template<int n>にして目的のものが出来ました
0468デフォルトの名無しさん
2012/05/30(水) 12:45:23.75前規格だと delete NULL; かな。
0469デフォルトの名無しさん
2012/05/30(水) 18:35:27.65元のソースが秘密で出せないのならせめて症状が再現する最小のプログラムだけでも
示してくれないと何も出来ないから
0470デフォルトの名無しさん
2012/05/30(水) 18:57:32.46が多い。それで回答者が逆質問をしたり
悪口を言ったりする。それを前もって思
い描く力が絶望的に欠如してるに違いない。
スーパーハッカーだけが意図を理解できる。
レアなそういう神が颯爽と登場する予感。
0471デフォルトの名無しさん
2012/05/30(水) 19:47:02.72NULLじゃなくて0じゃね?
NULLは、Cとの互換で残ってて
元々非推奨だし
0472デフォルトの名無しさん
2012/05/30(水) 20:19:34.260473デフォルトの名無しさん
2012/05/30(水) 20:24:15.210474デフォルトの名無しさん
2012/05/30(水) 20:24:50.010475デフォルトの名無しさん
2012/05/30(水) 20:29:53.11NULLだと、0だということがぼやけるから
という事だったハズ
0476デフォルトの名無しさん
2012/05/30(水) 20:36:29.390がぼやけるってのを補足するとNULLだと別に
0じゃなくてもいいんだけど、C++じゃdynamic_castとか
deleteとか無効アドレスとして0を前提とした
言語機能があるもんで、NULLだと値が不定でマズイ
0477デフォルトの名無しさん
2012/05/30(水) 20:39:30.911 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that
type and is distinguishable from every other value of pointer to object or pointer to function type. Two null
pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer
to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification
conversion (4.4).
JIS-X3014
4.10 ポインタ変換
ゼロと評価される右辺値を持つ整数型の汎整数定数式(5.19)を、空ポインタ定数と呼ぶ。空ポインタ定数
は、ポインタに変換する事ができる。その結果は、その型の空ポインタ値となる。空ポインタ値は、オブジェクト先
ポインタ型 又は 関数型ポインタ型のどんな値とも区別できる値とする。同じ型の二つの空ポインタ値は、
比較で等しくなるものでなければならない。空ポインタ定数から、cv修飾付きの型へのポインタの変換は、
単一の変換となり、ポインタ変換の後で修飾変換(4.4)を行うことはできない。
C++ではCと違い、void*を任意のポインタに代入する場合には明示的なキャストをしなくてはならなく
なったためにvoid*を使うメリットがなくなったという話
しかし単なる 0 をヌルポインタなのかdouble型の0.0なのかコンパイラが判別出来ないためにまだ問題が
残ったので、C++11ではnullptrを新設した
0478デフォルトの名無しさん
2012/05/30(水) 20:42:10.74C++98とかそんな最近の話じゃないぞ
0479デフォルトの名無しさん
2012/05/30(水) 20:44:03.62ISO/IEC 14882:2003だぞ
0480デフォルトの名無しさん
2012/05/30(水) 20:48:17.8398年以前から言われてた話だってこと
そっからすると2003は最近でしょ
あと、仕様が出来た理由と非推奨の話は別だからね
仕様書に書いてる話じゃなく禿のコラムとかそっちに
書いてあった内容だから
0481デフォルトの名無しさん
2012/05/30(水) 21:01:09.85標準化前というとiostream.hとかの時代かなあ
0482デフォルトの名無しさん
2012/05/30(水) 21:15:42.11例外切ってるけどstd::stringやstd::vectorはフルに使うよ。何かまずいの?
0483デフォルトの名無しさん
2012/05/30(水) 21:43:54.88D&Eの日本語版のP291から書いてあるな
0484デフォルトの名無しさん
2012/05/30(水) 23:01:04.82中でメモリ確保失敗したらどうすんの?
0485デフォルトの名無しさん
2012/05/30(水) 23:12:10.31メモリ確保失敗しないように作る。ゲーム開発では普通のこと
0486デフォルトの名無しさん
2012/05/31(木) 00:04:33.51そりゃ製品はそうなるだろうけど、開発中には失敗しちゃうこともあるでしょ。
呼び出し元でチェックとかできないわけだけど、どうすんの?
わけわかんない動作が起こってから調べに行くの?
0487デフォルトの名無しさん
2012/05/31(木) 00:13:37.94なぜ呼び出し元でチェックできないのかよくわからんけど
0488デフォルトの名無しさん
2012/05/31(木) 00:17:11.330489デフォルトの名無しさん
2012/05/31(木) 00:25:19.960490デフォルトの名無しさん
2012/05/31(木) 00:27:53.20vectorの中のメモリ確保失敗は標準C++ではbad_allocなんかの例外で通知されるんだけど、
例外無効にしてる状態で呼び出し元でチェックしようとしたら何かしら標準以外の方法を使うことに
なるんじゃないの?
>>488-489 vectorやstringではそうはいかないでしょ。
0491デフォルトの名無しさん
2012/05/31(木) 00:29:39.31例外未対応の処理系ならabortへ直行
0492デフォルトの名無しさん
2012/05/31(木) 00:35:15.990493デフォルトの名無しさん
2012/05/31(木) 00:44:25.22やっぱそうか。ありがとう。
0494デフォルトの名無しさん
2012/05/31(木) 00:45:33.180495デフォルトの名無しさん
2012/05/31(木) 00:46:14.25んなこたーない。
0496デフォルトの名無しさん
2012/05/31(木) 07:20:19.34ビット表現が ~0 だろうが
ソース上は必ず 0 で表現する
だから >>476 はあり得ない
というか (void*) 付きの NULL は C++ じゃなくて C だし
>>476 は無茶苦茶やで
0497デフォルトの名無しさん
2012/05/31(木) 07:29:48.780498デフォルトの名無しさん
2012/05/31(木) 10:50:31.28内部表現が0(0番地)とは限らない
//OK
int* p = 0;
delete p;
//NG ただし殆どの環境で問題は起こらない
int n = 0;
int* p = reinterpret_cast<int*>(n);
delete p;
0499デフォルトの名無しさん
2012/05/31(木) 11:32:04.450500デフォルトの名無しさん
2012/05/31(木) 12:16:01.43http://www.kouno.jp/home/c_faq/c5.html
0501デフォルトの名無しさん
2012/05/31(木) 12:30:10.640502デフォルトの名無しさん
2012/05/31(木) 12:57:36.360503デフォルトの名無しさん
2012/05/31(木) 13:01:32.980504デフォルトの名無しさん
2012/05/31(木) 13:02:29.840505デフォルトの名無しさん
2012/05/31(木) 13:08:12.510506デフォルトの名無しさん
2012/05/31(木) 13:19:43.41馬鹿かお前は
規格票は無駄な議論を終わらせるためにある
0507デフォルトの名無しさん
2012/05/31(木) 13:20:03.680508デフォルトの名無しさん
2012/05/31(木) 14:39:11.68最初からNULLじゃ駄目なの
0509デフォルトの名無しさん
2012/05/31(木) 14:51:05.54int *a = new int(0);
delete a;
a = nullptr;
の事?それなら、
int *a = new int(0);
delete a;
a = nullptr;
... // いろいろな処理
delete a; // 重複delete
っていうのを仮にしたとしてもプログラムを落とさせないためだと思う。
でもそれやるくらいならunique_ptr使った方がいいし、これが必要な場面というと
「もしかしたらコードの中途半端な所でメモリ削減のためにdeleteする場合があるけど最終的な終了場面でもdeleteしたい」
っていうそうとうトリッキーで可読性の低い時だから推奨は推奨はしない。
0510デフォルトの名無しさん
2012/05/31(木) 14:51:43.630511デフォルトの名無しさん
2012/05/31(木) 15:16:43.24GCの話・・・なわけないよな
0512デフォルトの名無しさん
2012/06/01(金) 00:39:38.16>メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了
ないわwwwwww
newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって
set_new_handler()に有効なnew_handlerを設定すれば、メモリ確保に成功するか、
new_handlerから例外を投げるかするまでnew_handlerが繰り返し呼ばれるのじゃ
というわけでど素人相手に潰れた漏れの土日を返せよ;
ま、漏れの意見を潰したければ、>369の無駄な複雑さに噛み付くべきであった
0513デフォルトの名無しさん
2012/06/01(金) 00:47:51.29Fooがバグっていたとして、叫ぶことになるのがFooの作者とは限らん
ていうか、std::vector<T>にしても、コンストラクタからTのコンストラクタが呼ばれるわけだが、
その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?
いちおうVS2008ではリークしないみたいだけど、ようわからんので>376への回答は避けといた
0514デフォルトの名無しさん
2012/06/01(金) 01:07:08.93> newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって
そんな動作しません。
set_new_handler(0) はデフォルトのハンドラを指定していることになるので、普通に bad_alloc が飛ぶ。
0515デフォルトの名無しさん
2012/06/01(金) 02:06:07.06> Tのコンストラクタが呼ばれるわけだが、
> その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?
new TでTのコンストラクタが例外を投げたらTのために確保されたメモリは解放される。
new T[x]でどこかの要素の構築中にTのコンストラクタが例外を投げたら構築済みの要素のデストラクタが呼ばれ確保されたメモリは解放される。
ただしTの内部でコンストラクタの中断でリークがおきるならそれはリークする。
0516デフォルトの名無しさん
2012/06/01(金) 02:12:02.44>リークしないことが仕様で
リークしたらバグ
リークしないためのRAII
http://ideone.com/Z52HM
0517デフォルトの名無しさん
2012/06/01(金) 06:27:50.13お前が例外出さない方法があるって言ったから提示してくれた案だろ
痴呆かよ
0518513
2012/06/01(金) 06:36:18.11>>514
ありゃ確かにそうかも、、、
// (main()の冒頭で)
std::new_handler prevHandler = std::set_new_handler(foo);
std::cout << "p=0x" << prevHandler << std::endl; // p=0x00000000
0519デフォルトの名無しさん
2012/06/01(金) 06:39:59.13>お前が例外出さない方法があるって言ったから提示してくれた案だろ
┐(´ー`)┌
気持ちは有難いが、規格準拠じゃない挙動を案と言われても困るな、、
0520デフォルトの名無しさん
2012/06/01(金) 06:51:04.780521デフォルトの名無しさん
2012/06/01(金) 07:25:18.440522デフォルトの名無しさん
2012/06/01(金) 08:15:17.43NULL返す意味ねーよ
0523デフォルトの名無しさん
2012/06/01(金) 10:10:18.87ロゴ画像のロゴ以外の部分(何も無い余白部分)を透明にして
ロゴ画像の何も無い部分には背景画像が映るようにするにはどうしたらいいんですか?
0524デフォルトの名無しさん
2012/06/01(金) 10:13:12.39画像を二枚読んで合成する。
具体的には、
ロゴ画像のとある位置の色が透過色だったら背景色を出力バッファに書き込む。
透過色じゃなかったらロゴの色を出力バッファに書き込む。
それだけ。
0525デフォルトの名無しさん
2012/06/01(金) 10:30:01.460526デフォルトの名無しさん
2012/06/01(金) 10:36:08.000527デフォルトの名無しさん
2012/06/01(金) 10:38:55.07>>524
画像を読むときはファイルオープンして画像フォーマットにそって画素データを読み込む。
画像ファイルフォーマットは数多にあるので対象になるものをググれ。
後は画素を比較して出力バッファに書き込むだけなんだが・・・。
コードがほしいなら宿題スレでお願いしてみるのがいいかもしれん。
あんまりいい方法じゃないけどな。
0528デフォルトの名無しさん
2012/06/01(金) 10:41:38.98>>524ぐらいしか言えないだろw
APIも画像フォーマットも謎なんだし
0529デフォルトの名無しさん
2012/06/01(金) 10:43:34.01合成はOpenGL側でやるとかか
0530デフォルトの名無しさん
2012/06/01(金) 11:19:10.19用件が解決する方法であればなんでもいいだろ
客先で「画像形式は?」「API使います?」なんて聞くエンジニアは見たこと無い
指定が無いなら勝手に決めればいいこと
0531デフォルトの名無しさん
2012/06/01(金) 11:22:53.98このスレではよくあること
理解してても他の人の説明聞くと「えっ?」ってなる
0532デフォルトの名無しさん
2012/06/01(金) 11:23:40.510533デフォルトの名無しさん
2012/06/01(金) 11:31:27.28同じチームなら困る
0534デフォルトの名無しさん
2012/06/01(金) 11:59:26.970535デフォルトの名無しさん
2012/06/01(金) 12:51:38.25ttp://www1.axfc.net/uploader/File/so/79537.zip&key=2ch
もっと手を抜くつもりだったけど思ったよりかかってしまった。
画像形式はPGMテキストだ!まさに外道。
我を崇めよ〜〜〜。はっは〜〜。
0536デフォルトの名無しさん
2012/06/01(金) 13:21:30.920537デフォルトの名無しさん
2012/06/01(金) 13:36:25.45よく言った。その功績を讃えてすごいサンプルを作る義務をあげるよ。
たのんだよ〜。
0538デフォルトの名無しさん
2012/06/01(金) 13:38:30.630539デフォルトの名無しさん
2012/06/01(金) 13:46:27.56テンプレート書いてた時の癖でベタ書きしてしまう。
手抜きの意味もあるんだが、正直スマンカッタ。
0540デフォルトの名無しさん
2012/06/01(金) 15:29:52.120541デフォルトの名無しさん
2012/06/01(金) 16:48:21.330542デフォルトの名無しさん
2012/06/01(金) 19:23:02.02今は、ヘッダー別のプリコンパイルドヘッダーも
あって速度も速いんだからいいじゃねぇか
0543デフォルトの名無しさん
2012/06/02(土) 00:03:30.050544デフォルトの名無しさん
2012/06/02(土) 02:49:02.35腕がないのはしょうがない。仕様だ。
処理が低級っていうだったら、概念を説明出来ればいいかなと割り切ったんだよ。
ま、高尚なライブラリは俺がドキュメント読めなくて使えないんだけどね。
お、俺にもっと能力をくれ・・・。
0545デフォルトの名無しさん
2012/06/02(土) 04:07:18.140546デフォルトの名無しさん
2012/06/02(土) 04:09:06.20きょぬー甘え。
賓乳萌え
0548デフォルトの名無しさん
2012/06/02(土) 10:53:04.80頭脳労働者はグラマーが好きな傾向が高いです
0549デフォルトの名無しさん
2012/06/02(土) 12:15:53.190550デフォルトの名無しさん
2012/06/02(土) 12:21:02.950551デフォルトの名無しさん
2012/06/02(土) 12:21:38.680552デフォルトの名無しさん
2012/06/02(土) 12:24:48.040553デフォルトの名無しさん
2012/06/02(土) 13:54:10.94オヤジはプログラマなんて出来ないよ
連日徹夜でしかも頭の柔らかさを必要とするIT土方だから、定年が35才と言われている
それまでに管理職に移動出来ないと悲惨な人生が待っている
0554デフォルトの名無しさん
2012/06/02(土) 16:03:52.76確かに力づくでコーディングしている人は体力がなくなると終わりだが、
センスや技術がある人はいくつになってもプログラマできるよ。
0555デフォルトの名無しさん
2012/06/02(土) 16:40:55.850556デフォルトの名無しさん
2012/06/02(土) 16:52:31.83ただのヘボプロブラマだけの話だよ
0557デフォルトの名無しさん
2012/06/02(土) 17:09:55.44その日の飯の種を拾う(3年後には)無駄/死亡と判りきってる学習が億劫に成っちゃうからねー
ケツの軽い若い時期しか無理ってのは確かだと思うよ
0558デフォルトの名無しさん
2012/06/02(土) 17:12:13.660559デフォルトの名無しさん
2012/06/02(土) 18:14:27.03お前プログラマじゃないだろ・・・
0560デフォルトの名無しさん
2012/06/02(土) 19:05:05.40プログラマだよ
まだ35じゃないけど
0561デフォルトの名無しさん
2012/06/02(土) 19:13:26.54センスも技術も年で劣化するからダメというのなら、
どんな職業も35歳で定年だな。
0562デフォルトの名無しさん
2012/06/02(土) 19:14:14.71hoge *h;
h = new hoge(int ho)[size];
とかだとコンストラクタの引数を変えれないので
*(h+1) = new hoge(int ho);
*(h+2) = new hoge(int ge);
みたいにできないでしょうか
0563デフォルトの名無しさん
2012/06/02(土) 19:21:04.500564デフォルトの名無しさん
2012/06/02(土) 19:27:14.73parent *h;
h[0] = new child1();
h[1] = new child2();
みたいな使い方がしたいんです
0565デフォルトの名無しさん
2012/06/02(土) 19:29:43.99どうしても new したいのなら boost::ptr_vector<T> でも使っとき
C++11 なら std::vector<std::unique_ptr<T>> でもええけど
0566デフォルトの名無しさん
2012/06/02(土) 19:33:32.17std::vector<hoge> h;
h.reserve(size);
h.push_back(hoge(ho));
h.push_back(hoge(ge));
...
0567デフォルトの名無しさん
2012/06/02(土) 19:36:28.000568デフォルトの名無しさん
2012/06/02(土) 19:53:32.36ありがとうございます、試してみます
へーそうなんだ、なして?
0570デフォルトの名無しさん
2012/06/02(土) 21:45:33.58C++でも、
xxx.method(new A());
と書けると思うんですが、
この場合、Aのインスタンスのdeleteは、
どこですべきなのでしょうか?
method内ですると、
A *a = new A();
xxx.method(a);
のときにもdeleteされてしまい、その後使えなくなってしまいます。
C++では、
xxx.method(new A());
という使い方はよくないのでしょうか?
0571デフォルトの名無しさん
2012/06/02(土) 21:49:42.820572デフォルトの名無しさん
2012/06/02(土) 21:58:36.410573デフォルトの名無しさん
2012/06/02(土) 22:19:09.09Javaはすべてのオブジェクトをnewで生成するけど、
C++はnewでオブジェクトと生成するのは
「スコープを私(プログラマ)が管理しますよ」って宣言するのとほとんど同義なのでー
生成した人が、破壊を管理しないといけないんですよー。
で、xxx.methodの中で破棄するなら、
それは生成と破棄をxxxが管理すべきですしー
xxx.methodを呼び出す側が生成しているなら、破棄も呼び出す側の責任ですしー
もしくは、A自身が己の破棄を自前で行うよう設計する必要があるわけですよー。
…タブンネ。
0574デフォルトの名無しさん
2012/06/02(土) 22:20:16.710575570
2012/06/02(土) 22:44:41.62Java感覚でできるということですね。
>>571さんありがとうございました。
0576デフォルトの名無しさん
2012/06/02(土) 23:01:03.29C++使う意味ないね
0577デフォルトの名無しさん
2012/06/02(土) 23:16:06.280578デフォルトの名無しさん
2012/06/02(土) 23:20:47.09ライブラリが正しく設計されていると、その利用者は右辺値参照について考慮しなくて済む。
0579デフォルトの名無しさん
2012/06/03(日) 01:18:34.69method関数がnewするなんてどこに書いてあった?
0580デフォルトの名無しさん
2012/06/03(日) 08:22:12.26そのうちメモリが断片化してbad_alloc例外飛ばされるぞ
0581デフォルトの名無しさん
2012/06/03(日) 08:23:50.710582デフォルトの名無しさん
2012/06/03(日) 08:25:37.740583デフォルトの名無しさん
2012/06/03(日) 08:44:04.41何かいいリファレンスかサイトある?
特にclassのメソッドをよく使っているプログラムで解析しやすい方法が知りたい。
0584デフォルトの名無しさん
2012/06/03(日) 08:45:23.250585デフォルトの名無しさん
2012/06/03(日) 09:42:01.37___attribute( 何か )___ で止められたはず
何かは、何だったか忘れた volatileだったかnoinlineだったかそんな感じだったはず
0586デフォルトの名無しさん
2012/06/03(日) 12:51:55.87main.cpp等のファイル内に簡単に埋め込む方法はないでしょうか。
現在はchar型配列に
char data="int main(){..."
上のように書き込んでいますが見にくいので・・・(改行ごとにバックスラッシュを入れています)
boostや標準機能の中でもっと綺麗に書く方法があればご教示お願いします。
0587デフォルトの名無しさん
2012/06/03(日) 12:56:38.800588デフォルトの名無しさん
2012/06/03(日) 12:59:33.93std::stringを返す専用の引数なし関数にキックするとか。
0589デフォルトの名無しさん
2012/06/03(日) 13:00:14.86エスケープ済みの別ファイルsource.cppとか
作ってmainで#include"source.cpp"じゃだめなんけ
source.cppは、cl.cppみたいな別ファイルにソース書いといて
置換コマンドで、\,"を\\, \"に置き換えるだけ
0590デフォルトの名無しさん
2012/06/03(日) 13:31:19.36レスありがとうございます。
>>588
string型を返す専用関数で少しうまい方法を考えて見ます。
>>589
ヘッダのように別ファイルに書き込んで置換、というのは一度やってみたのですが
次の2点から少し敬遠していました。
・IDE上に並ぶファイルが増える。
・友人にコードを渡すときにヘッダが増殖する(lib化しろ、というのは最もなのですがWinとMac・・・)
588さんの書き込みを見ていろいろ探していたところ、
string tmp=STRINGIFY(int main(){...);
のような書き方をしているコードを見かけたので中を調べてみます。
皆様すぐにレスしていただきありがとうございました。
0591デフォルトの名無しさん
2012/06/03(日) 14:13:54.22と出てしまいます。エラー場所はこれだと思うのですが、文法が間違っているのかよくわかりません。
class Cabc{
Cbdf* bdfaddr;
public:
Cabc(Cbdf*);
};
Cabc::Cabc(Cbdf* tmp):bdfaddr(tmp){}
class Cbdf{
Cabc* abc;
private:
Cbdf(){abc = new Cabc(this)}
};
0592デフォルトの名無しさん
2012/06/03(日) 14:22:16.98これは
Cabc(int*)
って書いてるようなものだ
Cabc(Cbdf* hoge);
とすれば消える
0593デフォルトの名無しさん
2012/06/03(日) 14:36:17.770594デフォルトの名無しさん
2012/06/03(日) 14:44:26.79きゃびっく型が事前に宣言してないきゃぶどふ型使ってるからだろ
きゃびっくの前に、class Cbdf;と書いとくか、Cbdf *bdfaddr;を
class Cbdf *bdfaddrと書けば行けるはずだ。
ただ、よっぽどの事情が無い限りクラス同士を循環参照すべきじゃない。
オブジェクト同士の循環参照は構わないが、その場合、抽象クラスなどを
用いてクラス定義では単一参照にする。
0595デフォルトの名無しさん
2012/06/03(日) 14:45:17.51Class ABC じゃね?
0596デフォルトの名無しさん
2012/06/03(日) 14:49:01.510597デフォルトの名無しさん
2012/06/03(日) 15:01:37.39なるほど・・・
宣言時は省略できるもんだと思ってました
0598デフォルトの名無しさん
2012/06/03(日) 15:02:43.71便利じゃないですかー
0599デフォルトの名無しさん
2012/06/03(日) 15:11:23.54(今やプリフィクス禁止が基本なのに)
0600デフォルトの名無しさん
2012/06/03(日) 15:22:11.28代わりに名前空間使えや
0601デフォルトの名無しさん
2012/06/03(日) 15:23:27.27いや、省略できるよ。そこは問題ない。問題は循環参照。
0602デフォルトの名無しさん
2012/06/03(日) 15:25:32.980603デフォルトの名無しさん
2012/06/03(日) 15:51:11.79懐かしいな。黒い猫だろ。
0604デフォルトの名無しさん
2012/06/03(日) 15:59:12.440605デフォルトの名無しさん
2012/06/03(日) 19:44:49.390606デフォルトの名無しさん
2012/06/03(日) 20:03:46.47ポインタの場合具体的な変数名を記入すれば回避できるという話では無いんですか?
それにしてもfunc(int*)という宣言は出来たような気がしますけど・・・
0607592
2012/06/03(日) 20:05:20.920608デフォルトの名無しさん
2012/06/03(日) 20:08:14.92とりあえず他のエラー要因は無いということですか?
0609デフォルトの名無しさん
2012/06/03(日) 20:23:15.28だから循環参照が原因だっつってんじゃねぇかハゲっ
0610デフォルトの名無しさん
2012/06/03(日) 21:08:37.12両方ポインタなら回避できると聞いたんですけど、違うんですか?
0611デフォルトの名無しさん
2012/06/03(日) 21:15:31.140612デフォルトの名無しさん
2012/06/03(日) 21:41:55.41既出のように>>591の適切な場所にCbdfの宣言と;を追加すればとりあえずコンパイルは通る
が、意図したように動くか?
0613デフォルトの名無しさん
2012/06/03(日) 22:30:35.03設計の話になってしまうのですが
マネージャークラスが保持する任意のクラスから、
同じくマネージャークラスが保持する他の任意のクラスにアクセスしたいんです。
ファイルの階層構造みたいな感じで、例えばwindowsの
Program FilesフォルダからWindowsフォルダにアクセスするときローカルディスクC:に戻るみたいな設計です。
C++風に書くと
LocalDiscAddress->GetWindowsAddr()->hoge
でも中々に読みづらい(´・ω・`)
0614デフォルトの名無しさん
2012/06/03(日) 23:43:59.830615デフォルトの名無しさん
2012/06/04(月) 00:21:22.68親 hoge = new 子1
親 hoge = new 子2
みたいな感じで1つのオブジェクトで親と子の2クラスを両方扱いたいんです。
これは可能で、キャストすれば子独自のメソッドも使用可能なのはわかるんですが。
今親クラスのオブジェクトの宣言を std::auto_ptr で行なっているため、キャストが上手くいきません。
解決法としては、std::auto_ptr を辞めるしかないんでしょうか?他にいい方法がありましたら、
ご教授お願いします。
0616デフォルトの名無しさん
2012/06/04(月) 00:22:55.89std::unique_ptr使ってください
0617デフォルトの名無しさん
2012/06/04(月) 01:25:07.50auto_ptr でも static_cast<子1&>(*p) すりゃ何の問題も無いだろう。
何か他に制約があるようならコード晒せ。
0618デフォルトの名無しさん
2012/06/04(月) 01:36:00.600619615
2012/06/04(月) 01:36:05.78これは思いつきませんでした。ありがとうございます。
0620615
2012/06/04(月) 01:42:13.45ダウンキャストしようかと。
0621デフォルトの名無しさん
2012/06/04(月) 01:46:09.88同じオブジェクトを参照させるべき
auto_ptrじゃ使えねぇからshared_ptr使うことになるけどね
0622デフォルトの名無しさん
2012/06/04(月) 02:24:53.64型を自分で保証できるなら static_cast でいい。
0623デフォルトの名無しさん
2012/06/04(月) 02:25:16.25それはないわ。
0624デフォルトの名無しさん
2012/06/04(月) 05:39:45.46根底と、派生2つのポインターで管理してる場合は、
派生クラスを差し替えた際、派生のポインターで
コンパイルエラーを引き起こせる。根底のポインターを
1個使い回しダウンキャストする方法だと、
派生を交換しても実行時になるまで、キャストミスに
よるエラーが解らない。関数スコープならそこまで
面倒じゃないが、クラススコープだと問題特定が面倒になる。
0625デフォルトの名無しさん
2012/06/04(月) 07:07:32.40Visual C++ で時刻を取得するにはどうしたらいいんでしょうか
time.h インクルードしても
time_t time;
は宣言できるんですが
time(&time);
でエラーになります
レベルの低い質問ですいません…
0626デフォルトの名無しさん
2012/06/04(月) 07:15:56.300627デフォルトの名無しさん
2012/06/04(月) 07:18:53.48式には(pointer-to0)関数型が必要です
っていうエラーがでます
0628デフォルトの名無しさん
2012/06/04(月) 07:25:16.64ごめんなさい 自己解決しました
time_t t;
time(&t);
にしたらとおりました
C++は関数と変数で名前空間かぶっちゃだめなんですね
授業でならうの Java が多いのでので知りませんでした
おさわがせしました><
0629デフォルトの名無しさん
2012/06/04(月) 09:28:28.59メッセージボックスが表示されてないときにプログラム終了するには
タスクマネージャーからきるしかないんでしょうか…
好きなときに終了できるようにするにはどうするのがスマートなんでしょうか…
#include <windows.h>
#include <time.h>
#define INTERVAL 60
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
time_t prev = (time(NULL) + 300) / 1800;
while(1) {
time_t now = (time(NULL) + 300) / 1800;
if(now != prev) {
MessageBox(NULL, TEXT("時間で〜す"), TEXT("時間で〜す"), MB_OK | MB_TOPMOST | MB_SETFOREGROUND);
prev = now;
}
Sleep(INTERVAL * 1000);
}
}
0630デフォルトの名無しさん
2012/06/04(月) 09:33:59.01例えば「好きなとき」をキー入力で伝えることにすれば、てきとうな API でキー入力でも監視すればいいだろう。
心を読んで欲しいということならたぶん無理だ。
0631デフォルトの名無しさん
2012/06/04(月) 09:43:08.60できればキーじゃなくて直感的に分かりやすい操作で終了dけいるようにしたいんですけど
たとえば常にベースパネルだけ表示させてそこに終了ボタンつけるとか…
下のタスクバーに表示させて右クリック終了みたいにできるとか…
って簡単にできますか?
なにぶん GUI プログラミング初心者なもので…
0632デフォルトの名無しさん
2012/06/04(月) 09:59:34.740633デフォルトの名無しさん
2012/06/04(月) 10:05:46.32なんか難しそうですけどがんばってよんでみます!
ほんとにありがとうございました!
0634デフォルトの名無しさん
2012/06/04(月) 10:12:32.33今度からは環境を明記の上、環境依存OKのスレに書いてね。
0635デフォルトの名無しさん
2012/06/05(火) 17:47:30.54固定されないのはいいけど
a1,a2,b1,a,b のように並列関係を超えて順序が未規定なのは何でだろう
これのせいで
f(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B()));
が危険なコードになってしまう
C++11で直せばよかったのに
どうせCと完全互換でないんだから例外に絡むところまで合わせる必要ないのに
0636635
2012/06/05(火) 17:49:38.33f(a(a1(), a2()), b(b1())));
0637デフォルトの名無しさん
2012/06/05(火) 19:13:51.16評価順序の話か?
その危険なコードとやらがどう危険なんだ?
0638デフォルトの名無しさん
2012/06/05(火) 19:33:33.75new A()実行後にunique_ptrに渡される前にnew B()が呼ばれ
Bのコンストラクタが例外を出すとAは解放されない
並列関係を超えない場合はnew A()の結果が必ずunique_ptrに渡されるので、
その後Bが例外を出してもunique_ptrのデストラクタで例外安全は保たれる
↓はshared_ptrでの例、C++11/unique_ptrでも同様
http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm
>Avoid using unnamed shared_ptr temporaries to save typing; to see why this is dangerous
>void bad()
>{
> f(shared_ptr<int>(new int(2)), g());
>}
関数の引数で無名スマポを作ってはいけないという話
0639デフォルトの名無しさん
2012/06/05(火) 20:01:42.25流石にやんないけど
f([&](){return std::unique_ptr<A>(new A());}(), [&](){return std::unique_ptr<A>(new A());}());
http://ideone.com/hJh8q
0640デフォルトの名無しさん
2012/06/05(火) 20:06:10.81引数の評価順が固定されない方が最適化が楽な処理系があるからに決まってるじゃん
0641デフォルトの名無しさん
2012/06/05(火) 20:16:38.14それと引き換えにスマポを一時オブジェクトにすることで可能な最適化が出来なくなってる
あと評価順の固定とまでは言ってない、並列関係を越えないことの保証と言ってる
f(a(), b(d()), c())がb,c,aという順でもいいけど、
dとbの間にa,cが入らないのを保証して欲しいということ
その制限でも出来なくなる最適化はあるだろうけどさ、トレードオフに見合うかは疑問
0642デフォルトの名無しさん
2012/06/05(火) 20:37:01.40stdcallとcdeclじゃ引数の積み方が逆だし
今更固定にできないよな
0643デフォルトの名無しさん
2012/06/05(火) 20:51:49.09スマポはtemplateが入ってきてからboostから入れられた概念だろ
それに対し引数の評価順はC時代から規定されていない
スマポがC++98/2003にもう入っていたら規定されてたかもね
他にも&&や||のオーバーロードも短絡評価ではなく全部評価してしまう
という元の演算子とは異なる挙動を見せるなど問題点は一杯あるだろ
More Effective C++に書いてあるけど
0644デフォルトの名無しさん
2012/06/05(火) 20:55:17.19コンパイラーベンダーは、引数で時間のかかる処理呼ばれたら
スレッド化する最適化とかすりゃいいのに
0645デフォルトの名無しさん
2012/06/05(火) 21:03:14.061コアで並列化しても意味が無いし
0646デフォルトの名無しさん
2012/06/05(火) 21:06:49.51今でもSSEなんてそうだし
0647デフォルトの名無しさん
2012/06/05(火) 21:28:25.32既に似たような仕組みがあるし
0648デフォルトの名無しさん
2012/06/05(火) 21:28:43.050649デフォルトの名無しさん
2012/06/05(火) 21:31:12.760650デフォルトの名無しさん
2012/06/05(火) 21:32:15.390651デフォルトの名無しさん
2012/06/05(火) 22:23:05.31現実的に考えて日本語版Effective C++11が出るくらいまで
(2年後くらい?)はC++11普及しない気がする。
もっと悲観的な見方をすれば、爆発的な機能増強のせいで、
C++03に対するC言語ユーザの認識程度にしか広まらなかったりして。
「あ〜C++11ね、コンパイラは使ってるけどね」
そのへんどう考えてるの>偉い人
0652デフォルトの名無しさん
2012/06/06(水) 12:59:59.190653デフォルトの名無しさん
2012/06/06(水) 14:45:53.320654デフォルトの名無しさん
2012/06/07(木) 10:09:46.63auto_ptrは板違いとか言われそうw
0655デフォルトの名無しさん
2012/06/07(木) 20:46:47.320656デフォルトの名無しさん
2012/06/07(木) 21:07:08.620657デフォルトの名無しさん
2012/06/07(木) 21:28:46.060658デフォルトの名無しさん
2012/06/07(木) 21:33:27.840659デフォルトの名無しさん
2012/06/08(金) 16:01:44.790660デフォルトの名無しさん
2012/06/08(金) 20:08:17.520661デフォルトの名無しさん
2012/06/08(金) 20:37:16.620662デフォルトの名無しさん
2012/06/08(金) 20:40:21.33使ったことないからどんなできかは知らんが
0663デフォルトの名無しさん
2012/06/08(金) 21:38:15.300664デフォルトの名無しさん
2012/06/08(金) 21:41:46.55C++11のものと同じような使い勝手だと思うとモニターに右ストレート叩き込みたくなるレベル
0665デフォルトの名無しさん
2012/06/08(金) 22:58:15.540666デフォルトの名無しさん
2012/06/09(土) 01:11:55.09日本優秀だな
0667デフォルトの名無しさん
2012/06/09(土) 01:12:53.390668デフォルトの名無しさん
2012/06/09(土) 01:14:28.80boost::geisha
boost::shogun
0669デフォルトの名無しさん
2012/06/09(土) 03:27:19.550670デフォルトの名無しさん
2012/06/09(土) 03:59:45.65このライブラリは日本の優秀さをみごとに示している
0671デフォルトの名無しさん
2012/06/09(土) 04:21:40.190672デフォルトの名無しさん
2012/06/09(土) 22:08:27.44アクセス頻度の低いデータをちゃっちゃと
削除する(所謂キャッシュ)のに、適した
STLコンテナーの組み合わせってなんだろうか?
大量の配列からデータを検索するんだが、
その検索速度よりは、速くしたい。
0673デフォルトの名無しさん
2012/06/09(土) 22:23:21.200674デフォルトの名無しさん
2012/06/09(土) 22:30:55.99LRU STL でぐぐってみたら?
0675デフォルトの名無しさん
2012/06/09(土) 22:49:25.47こんなのは?
http://timday.bitbucket.org/lru.html
0676デフォルトの名無しさん
2012/06/10(日) 00:07:32.88商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ
0677デフォルトの名無しさん
2012/06/10(日) 00:12:42.90バグ多発のヨカーン
0678デフォルトの名無しさん
2012/06/10(日) 00:14:14.012chで金取るような質問すんなよ
そこまで言うなら自分で考えな
0679デフォルトの名無しさん
2012/06/10(日) 00:21:08.760680デフォルトの名無しさん
2012/06/10(日) 00:21:59.97商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ
0681デフォルトの名無しさん
2012/06/10(日) 00:22:45.47ありがとうございます。もっと詳しく調べてみようと思いますが
キャッシュ管理コスト自体が重そうですね・・・
0682デフォルトの名無しさん
2012/06/10(日) 00:24:13.85具体的には、読み込まれたdllのインスタンスが自分が何番目のdllインスタンスなのかを知ることができるかどうかなのですが
HD書き込みよりも直接的な方法で
0683デフォルトの名無しさん
2012/06/10(日) 00:26:56.110684デフォルトの名無しさん
2012/06/10(日) 00:30:58.11templateのinstanceは共有できんぞ
単に変数とか記憶領域の事をいってんならMemory-Mappedか、
data_segをつかう↓。ただし処理系依存だし、addressも制御できんから
特別事情がない限りMemory-Mappedを使うべき
http://msdn.microsoft.com/ja-jp/library/h90dkhs0(v=vs.80).aspx
0685デフォルトの名無しさん
2012/06/10(日) 00:31:33.01ありがとうございます、ググっていけばなんとかなりそうな雰囲気がつかめました
これって言語レベルで使えるものなんですかね?
0686デフォルトの名無しさん
2012/06/10(日) 00:40:59.55更にありがとうございます
チラッとし食べてみた感じ言語レベルで使えそうですね、ありがたい
0687デフォルトの名無しさん
2012/06/10(日) 00:44:43.61下記をやるために用意しなければいけないnekoのメソッドって何ですか?
const char* koe = "wan";
neko pochi = neko(koe);
0688デフォルトの名無しさん
2012/06/10(日) 00:46:02.330689デフォルトの名無しさん
2012/06/10(日) 00:46:56.730690デフォルトの名無しさん
2012/06/10(日) 03:01:36.67is_rvalueで条件文分岐するのは無理なのでしょうか
boostの中にもis_rvalueないみたいですし
例えばこんなことしたい
template<T>
struct glue
{
T & value
glue(T & v):value(v) {}
};
template<>
struct glue<rvalue<float> >
{
float value;
glue(float v):value(v) {}
};
float f=10.2;
glue<float> g1(f);
glue<rvalue<float>> g1(2.3);
0691デフォルトの名無しさん
2012/06/10(日) 03:58:06.88template<T>
struct glue
{
T value
glue(T v):value(v) {}
};
float f=10.2;
glue<float&> g1(f);
glue<float> g1(2.3);
0692デフォルトの名無しさん
2012/06/10(日) 12:58:03.710693デフォルトの名無しさん
2012/06/10(日) 20:37:33.460694デフォルトの名無しさん
2012/06/10(日) 20:38:47.450695デフォルトの名無しさん
2012/06/10(日) 20:45:12.22なるほど
0696デフォルトの名無しさん
2012/06/10(日) 21:10:27.44サブクラスのフィールドのオブジェクトポインタを
返したいんだけどどうしたらいいですか?
インターフェースクラスは複数のサブクラスに継承されて、それぞれのオブジェクトの定格は違う
0697デフォルトの名無しさん
2012/06/10(日) 21:29:30.05どんなことしたいかソース書いた方がいい
0698デフォルトの名無しさん
2012/06/10(日) 21:45:35.96C++に詳しそうだから聞こう。std::messageってLinuxだと
gettextと同じカタログファイルでいいんだが、
windowsだと、どこのカタログから文字列取ってくるんだ?
0699デフォルトの名無しさん
2012/06/10(日) 21:54:16.400700デフォルトの名無しさん
2012/06/10(日) 21:56:41.900701デフォルトの名無しさん
2012/06/10(日) 21:58:09.300702デフォルトの名無しさん
2012/06/10(日) 22:12:53.22あっ
メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね
ありがとうございました
0703デフォルトの名無しさん
2012/06/10(日) 22:13:18.02あっ
メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね
ありがとうございました
0704デフォルトの名無しさん
2012/06/10(日) 22:15:22.58つかVC++の日本語localeはゴミみたいな仕様なのでもしかしたら未実装なのか?^^
0705デフォルトの名無しさん
2012/06/10(日) 22:21:21.59ttp://cpplover.blogspot.jp/2011/04/boostlocale.html
0706デフォルトの名無しさん
2012/06/10(日) 22:28:38.430707デフォルトの名無しさん
2012/06/10(日) 22:47:28.40http://stdcxx.apache.org/doc/stdlibref/messages.html#sec12
http://en.cppreference.com/w/cpp/locale/messages
に書いてある
rwstdmessages.catや/usr/share/locale/de/LC_MESSAGES/sed.moを探してみたら?
0708デフォルトの名無しさん
2012/06/10(日) 23:04:06.31インターフェース
インタフェイス
インターフェイス
どれ派?
0709デフォルトの名無しさん
2012/06/10(日) 23:08:32.63じゃなかった、返り値の型が定まらないです。
class Interface{
public:
virtual Object GetObject() = 0;
};
class hoge:Interface{
Object obj;
public:
hoge(Object obj):this.obj(obj){}
};
0710デフォルトの名無しさん
2012/06/10(日) 23:15:37.27約 1,510,000 件
約 3,400,000 件
約 363,000 件
約 2,550,000 件
0711デフォルトの名無しさん
2012/06/10(日) 23:19:41.67yahooにしろよ
0712デフォルトの名無しさん
2012/06/10(日) 23:22:30.470713デフォルトの名無しさん
2012/06/10(日) 23:29:12.97よく分からんけどこういうこと?
http://ideone.com/jC5TY
それとも
class hoge:Interface{
HogeObject obj;
とかになるってこと?
0714デフォルトの名無しさん
2012/06/10(日) 23:32:46.96それっぽいけど、Objectポインタってなんでもいいの?
まぁ4バイト固定だからできるんですか。
実際に仮想関数作る時に適当なポインタいれるのは一般的に使われる手法なんですか?
0715デフォルトの名無しさん
2012/06/10(日) 23:43:56.65= 0のこと?
4バイト固定でも適当なポインタでもなく
純粋仮想関数を定義するただの構文で、0に数値としての意味は無いよ
0716デフォルトの名無しさん
2012/06/10(日) 23:58:54.33まともに動かない事もあるしな
0717デフォルトの名無しさん
2012/06/11(月) 00:01:09.690718デフォルトの名無しさん
2012/06/11(月) 00:01:58.47いや、リンク先の1行目でObjectを定義してて
それをポインタとして利用してるから、それはよく使われるのかなーと・・・
例えるなら、数値データリストクラスと文字データリストクラスがあって、
それぞれ数値データクラスのリストと文字データクラスのリストを持っている。
データクラスのポインタを各リストクラスで共通のメソッドでGetしたいので同じインターフェースクラスを作って継承することにする。
・・・すると、インターフェースクラスの宣言?のGetメソッドの返り値は、
数値データクラスのポインタも文字データクラスのポインタでも適さないのでは?
という感じです。
Object構造体はあくまでポインタを使うための使い捨てするのは一般的な手法なのかなと・・・
わかりにくてすいません。
0719デフォルトの名無しさん
2012/06/11(月) 00:24:10.23>それをポインタとして利用してるから
structはstructでしかなくポインタではないよ
Object ←実体
Object* ←Objectのポインタ
&objの& ←アドレス演算子
hogeのメンバobjは実体、hogeコンストラクタのaobjも実体(値渡し)
GetObject()の戻り値はObjectのポインタ
というところまで分かる?
>>709のObjectはどう扱いたいの?
0720デフォルトの名無しさん
2012/06/11(月) 08:39:54.15例えが悪かったです
class Interface{
public:
virtual ??? GetObject() = 0;
};
class hoge:Interface{
ObjectA obj;
public:
hoge(ObjectA obj):this.obj(obj){}
};
class hage:Interface{
ObjectB obj;
public:
hage(ObjectB obj):this.obj(obj){}
};
このような時、InterfaceのGetObjectメソッドの返り値をどのように宣言したらいいのか
ということです。
>>713でいうなら、hogeクラスの他にhuga,hogaクラスがあったとして
それぞれの扱うobjの型は違います。
0721デフォルトの名無しさん
2012/06/11(月) 09:42:53.65ObjectAとObjectBが同じinterfaceを持つならそれを返せばいい。
class Object{
public:
virtual int GetID() = 0;
};
class ObjectA : Object {
public:
int GetID(){...}
};
class ObjectA : Object {
public:
int GetID(){...}
};
class Interface{
public:
virtual Object* GetObject() = 0;
};
ObjectAとObjectBが同じinterfaceを持たないなら、
そもそもInterface::GetObject()を使って何をしたいか意味不明。
0722デフォルトの名無しさん
2012/06/11(月) 13:03:15.130723デフォルトの名無しさん
2012/06/11(月) 20:59:01.800724デフォルトの名無しさん
2012/06/11(月) 23:54:12.27struct bar {
foo a;
union { int b; };
};
bar zot;
int bar::*p = &bar::b;
int x = zot->*p; // is zot.b
int bar::*q = XXX;
int y = zot->*q; // is zot.a.f
これを満たすようにするにはXXXの所どう書けばいいんでしょうか?
0725デフォルトの名無しさん
2012/06/12(火) 00:12:16.320726デフォルトの名無しさん
2012/06/12(火) 00:15:18.44winのデスクトップアプリを作成するとき皆さんはなにをつかってるの?
0727デフォルトの名無しさん
2012/06/12(火) 00:24:56.620728デフォルトの名無しさん
2012/06/12(火) 00:28:10.44union foo {
int f;
void operator=(int x) {
f = x;
}
};
struct bar {
foo a;
union { int b; };
friend std::ostream& operator<<(std::ostream& os, foo& f);
};
std::ostream& operator<<(std::ostream& os, foo& f)
{
std::cout << f.f;
return os;
}
int main()
{
bar zot;
zot.b = 123;
zot.a = 456;
int bar::*p = &bar::b;
int x = zot.*p; // is zot.b
foo bar::*q = &bar::a;
foo y = zot.*q; // is zot.a.f
std::cout << x << std::endl;
std::cout << y << std::endl;
}
0729デフォルトの名無しさん
2012/06/12(火) 01:35:48.510730デフォルトの名無しさん
2012/06/12(火) 08:43:54.540731デフォルトの名無しさん
2012/06/12(火) 09:09:03.00unionが名前空間じゃないしクラス名でもないから通らないんだって
やってみろ
0732デフォルトの名無しさん
2012/06/12(火) 10:35:05.45int bar::*単体でネスト内にアクセスしたいんだろうし。
呼び出し側を変えていいならコピーしなくてもzot.*q1.*q2で十分。
http://ideone.com/OR9Zp
pとqが同じ型であればいいだけなら関数ポインタで似たものにはなる。
http://ideone.com/22kQL
0733デフォルトの名無しさん
2012/06/12(火) 10:39:53.63http://ideone.com/KnuVI
0734デフォルトの名無しさん
2012/06/12(火) 11:01:35.150735デフォルトの名無しさん
2012/06/12(火) 11:20:23.420736デフォルトの名無しさん
2012/06/12(火) 12:16:05.92Boost.Variantを使ってやってみた
ttp://ideone.com/cSE2g
0737デフォルトの名無しさん
2012/06/12(火) 20:15:35.480738デフォルトの名無しさん
2012/06/12(火) 21:08:41.940739デフォルトの名無しさん
2012/06/12(火) 23:30:49.04もともとC++ではunionは型安全でない点で推奨できるものではなかったし
最近では(型を意識しない)ジェネリックなプログラミングにも対応できないしで
Cから引き継いでしまった負の遺産といっていいだろ
0740デフォルトの名無しさん
2012/06/12(火) 23:38:09.53無名構造体が書けるC++11で>>724のunionを両方ともstructに置き換えても同じことが起きるぜ。
0741デフォルトの名無しさん
2012/06/13(水) 00:13:25.65というかもともとの話の本質はunionも無名なんちゃらも関係なく
直接のメンバとメンバのメンバを同列に扱いたいけどどうしようという話だよな
0742デフォルトの名無しさん
2012/06/13(水) 00:18:58.860743デフォルトの名無しさん
2012/06/13(水) 01:46:00.21>>732と同じ方向性だが最初からC++っぽい設計にしとけば悩むほうが難しいくらいだったろうに
union foo { int f; };
struct bar {
foo a;
struct { int b; };
int get_f() { return a.f; }
int get_b() { return b; }
};
int main()
{
bar zot;
zot.b = 123;
zot.a.f = 456;
int (bar::*p)() = &bar::get_b;
int x = (zot.*p)(); // is zot.b
int (bar::*q)() = &bar::get_f;
int y = (zot.*q)(); // is zot.a.f
std::cout << x << std::endl;
std::cout << y << std::endl;
return 0;
}
0744デフォルトの名無しさん
2012/06/13(水) 14:40:09.67boost:intrusive
がそれっぽいけど doubleとかintとかは扱えないっぽい
0745デフォルトの名無しさん
2012/06/13(水) 15:58:15.10ある文字列のペアを引数に取ることで自作クラスの実体のアドレスを返す関数、またはクラスを
作りたいと考えています。
Hoge* rtnHoge(std::string a,std::string b){...; return &hoge;}//例
上記のような方法で一度作成したのですが、
・この方法ではペアの検索に時間がかかる(std::mapを使用しました)
・aとbに入れる文字列はコーディング時に決めうちで入力する
の二つの特徴から、
テンプレート等を利用して別途にアドレスを確保する箇所を作成したいと考えています。
テンプレートの特殊化では文字列を受けることができないため、
文字列からint型のユニークなIDを再生することが出来ると思い、その方法を探しています。
もしどなたか良い案などがありましたらアドバイスのほう頂けたら幸いです。
0746デフォルトの名無しさん
2012/06/13(水) 16:05:28.090747デフォルトの名無しさん
2012/06/13(水) 16:22:51.36しかしクラスのオブジェクトのアドレスっていうのはコンパイル時にはわかっていないじゃろ。
どうやってMooRieなんじゃないかって気がするんだよね。
0748デフォルトの名無しさん
2012/06/13(水) 16:24:04.04CLSIDかSHA256とか
0749デフォルトの名無しさん
2012/06/13(水) 16:50:14.75レスありがとうございます。
CRC,CLSID,SHA256を少し調べてみましたが、動的な方法になってしまいそうですね・・・。
>>747
そうですね、コンパイル時に確定したいと思っています。
テンプレートを使えば
template<int ID=0>
class Hoge{}
Hoge<0>,Hoge<1>,Hoge<2>
上記は全て異なる型として生成されるので、
この中それぞれに別途にシングルトンのようなクラスを生成してアクセスすれば
実現できると考えました。
ですので、静的に、コンパイル時に文字列からユニークなIDが生成できれば・・・と思い、
こちらに質問させていただきました。
0750デフォルトの名無しさん
2012/06/13(水) 16:55:53.760751デフォルトの名無しさん
2012/06/13(水) 17:01:30.60・#defineで自分で連番化
・ユーザー定義リテラル(C++11)
・GNU gettext
0752デフォルトの名無しさん
2012/06/13(水) 17:01:57.34マクロでも列挙でも定義すればいいと思うのだが…
自分は壮大な勘違いをしているのかな?
0753デフォルトの名無しさん
2012/06/13(水) 17:39:19.120754デフォルトの名無しさん
2012/06/13(水) 17:48:20.74文字列そのものが動的に変化する性質のものなのになぜユニークなIDが?
0755デフォルトの名無しさん
2012/06/13(水) 17:54:40.28stringとSHA1のstructをコレクションに突っ込んでおればいいしな
0756デフォルトの名無しさん
2012/06/13(水) 17:57:07.63>>750,753
はじめはmapで実装を行っていたのですが、文字列ですのでどうしても検索速度が気になって・・。
>>751,750
やはりマクロか列挙型しかないですか・・・。
実は実行時コンパイルの必要なGLSLのプログラムクラスを作りたいと思っています。
本来ならば以下のようにすれば特に問題ないのですが
class Hoge
{
public:
Hoge(){prog.init("foo.vert","bar.frag");}
void run()
{
prog.bind();
○○何らかの処理○○
prog.unbind();
}
private:
GLSLProgram prog;
};
prog自体はrunの中でしか呼び出さないためメンバ変数として保持するほどでもないので
出来れば以下のようにしたいなと考えています。
void run()
{
prog("foo.vert","bar.frag");//コンストラクタ、デストラクタでbind,unbindを行う
}
ただ、prog("foo.vert","bar.frag")自体はほかのクラスでも使うときがあるかもしれないので、
"あるペアに対する実体は一つ"のクラスを作りたい、と考えています。
0757デフォルトの名無しさん
2012/06/13(水) 17:58:16.34実用上ユニークと考えて差し支えは無いかもしれないけど
0758デフォルトの名無しさん
2012/06/13(水) 18:04:18.81intを作る必要なんかないのでは?
0759デフォルトの名無しさん
2012/06/13(水) 18:05:23.41あとはハッシュ関数自前で作ってaとbの命名を被らないように特徴づけるとかすればいいんじゃないの?
0760デフォルトの名無しさん
2012/06/13(水) 18:08:28.50衝突する確率はゼロじゃないわな
でも文字列も同一文字列である可能性もあるわけで
0761デフォルトの名無しさん
2012/06/13(水) 18:23:11.70static id = id_from_map("foo.vert", "bar.frag");
GLSLProgram prog(id);
}
0762デフォルトの名無しさん
2012/06/13(水) 19:02:57.58http://ideone.com/B4Sri
cache find, new glsl_bodyは2回、bind,unbindは4回
文字列での検索は関数毎に1回だけ
コンパイル時じゃないけど初回くらいいいだろうということで
0763デフォルトの名無しさん
2012/06/13(水) 22:06:36.710764デフォルトの名無しさん
2012/06/13(水) 22:24:01.97回線も一昔前のISDN時代とは違うしな。
0765デフォルトの名無しさん
2012/06/13(水) 22:46:02.090766デフォルトの名無しさん
2012/06/13(水) 22:47:27.450767デフォルトの名無しさん
2012/06/13(水) 22:48:51.210768デフォルトの名無しさん
2012/06/13(水) 22:53:15.510769デフォルトの名無しさん
2012/06/13(水) 22:59:02.78お勉強したいだけなら、cintやcodepad使う手もある
0770デフォルトの名無しさん
2012/06/13(水) 23:01:54.020771デフォルトの名無しさん
2012/06/13(水) 23:07:47.88mp3だとかwavみたいな音楽ファイルから、
タイトルとかアルバム名を取れるライブラリってないかな?
0772デフォルトの名無しさん
2012/06/13(水) 23:19:17.890773デフォルトの名無しさん
2012/06/13(水) 23:35:31.84ありがとう。
とりあえずこのプログラムから解析してる部分の抜き出しをがんばってみる。
0774デフォルトの名無しさん
2012/06/13(水) 23:36:17.30戻り値が引数と同じ型で、
かつ特殊化をするコードを教えていただけませんでしょうか。
C#でのコードだと↓です
public T getObject<T>() where : Hoge
{
~~~~~~
~~~~~~
return T;
}
0775デフォルトの名無しさん
2012/06/13(水) 23:43:01.910776デフォルトの名無しさん
2012/06/13(水) 23:45:50.36テンプレート引数です。
0777デフォルトの名無しさん
2012/06/13(水) 23:48:22.98特に悩むところもないと思うけど
0778デフォルトの名無しさん
2012/06/13(水) 23:57:26.61究極的には文字列を分解して一文字ずつテンプレートに渡す方法だな
template<char C1, char C2 ・・・ > hoge;
hoge<'f', 'o', 'o'> h;
11ならconstexprと組み合わせて文字列から↑まで持っていくのも不可能ではなさそうなんだが実際できるのかな?
0779デフォルトの名無しさん
2012/06/14(木) 00:05:36.700780デフォルトの名無しさん
2012/06/14(木) 00:09:44.66それはちょっと違うと思う
特定の型から派生されているかの制約を持たせたいなら
メタプロでなんとかなると思われ
C++11 なら std::is_base_of ってのがあるが
C++11 でなくても真似すればいいと思う
0781デフォルトの名無しさん
2012/06/14(木) 00:19:00.62list< shared_ptr<double> >
0782デフォルトの名無しさん
2012/06/14(木) 00:20:07.66すみません。また説明不足でした。すみません。
>>778
関数の処理結果に応じて戻り値の型を変える事ができるのでしょうか?勉強不足ですみません。
説明不足で申し訳ありません。
↓のような場合の時でテンプレート引数がHogeの派生クラスになるように制約をかけたいです。
class Hoge()
{
public T getObject<T>() where T : Hoge()
{
~~~~
~~~~
return T;
}
}
class Poge() : public Hoge
{
}
class Foge() : public Hoge
{
}
>>780
メタプロでぐぐってみます。
0783デフォルトの名無しさん
2012/06/14(木) 00:22:39.49BOOST_STATIC_ASSERTと組み合わせて使えばいいはず
0784デフォルトの名無しさん
2012/06/14(木) 00:25:59.51こうだろ
0785デフォルトの名無しさん
2012/06/14(木) 00:28:09.48今回はたまたま戻り値の型でしかTが使われてないけど
2箇所以上で使われている場合に
1箇所だけenabled_ifってのも何かバランス悪いし
0786デフォルトの名無しさん
2012/06/14(木) 00:28:38.38ミスったよ
0787デフォルトの名無しさん
2012/06/14(木) 00:41:45.51あんなのヲタが使うもの
ソースが汚くいことこの上ない
0788デフォルトの名無しさん
2012/06/14(木) 00:47:04.520789デフォルトの名無しさん
2012/06/14(木) 00:53:53.73今さっきなんとなくわかりました。長いのは戻り値だったんですねー…
Boostをインストールしてみて、
きびしそうなら別の方法を執ってみます。
みなさんわざわざありがとうございました。
0790デフォルトの名無しさん
2012/06/14(木) 00:56:23.34使いこなせないとどこに書いてあるんだ?
脳内補完もここまで来ると感服だなw
0791デフォルトの名無しさん
2012/06/14(木) 02:38:33.340792デフォルトの名無しさん
2012/06/14(木) 03:04:06.370793デフォルトの名無しさん
2012/06/14(木) 04:11:05.53ありない
ありない
汚くい
汚くい
汚くい
0794デフォルトの名無しさん
2012/06/14(木) 06:05:26.57そんな事するんだったらconst定数使った方がましじゃね?
template<const char *array> class Example;
namespace Keys
{
const char alpha[] = "Alpha";
const char beta[] = "Alpha";
}
Example< Keys::alpha > object;
>>782
template<class type> type Example::Function()
{
type value;
ExampleBase *base_check = &value; // 親子関係がなければコンパイルエラー
return value;
}
0795デフォルトの名無しさん
2012/06/14(木) 06:27:38.53map, set, priority_qeueは内部的にtree使ってる
std::make_heapを使えば自前の二分木を楽に作れる
0796デフォルトの名無しさん
2012/06/14(木) 08:43:30.62class User
{
public:
User(std::shared_ptr<Object> o = std::make_shared<Object>())
: o_(o)
};
0797796
2012/06/14(木) 08:45:31.56デフォルト引数にstd::make_shared〜とやると、make_sharedがglobal namespaceのメンバーでないとエラーが出てしまいます。
当然、using namespace std;を行うと、正しくコンパイルできるのですが、それはしたくありません。
どのように記述するのが正しいのでしょうか?
0798デフォルトの名無しさん
2012/06/14(木) 09:24:56.760799デフォルトの名無しさん
2012/06/14(木) 10:06:41.320800デフォルトの名無しさん
2012/06/14(木) 11:35:13.06User(std::shared_ptr<Object> o = [](){return std::make_shared<Object>();}()) : o_(o) {}
0801デフォルトの名無しさん
2012/06/14(木) 11:44:08.99そもそも勉強用にMSVC使うってのが間違ってるだろ。
LLVM/clang使えばいろいろ捗るぞ。ここまで無料で高品質でライセンスの緩いコンパイラは珍しいし他にない。
本来ならば金の要らないLinux前提だしmingw入れればwindowsでも動くしな。
0802デフォルトの名無しさん
2012/06/14(木) 11:54:10.94Windows前提ならmingw選ぶのは間違ってる
0803デフォルトの名無しさん
2012/06/14(木) 12:40:59.56ファイル消せなくなって困るぞ。
0804デフォルトの名無しさん
2012/06/14(木) 12:45:48.23cygwinを入れたせいでファイルを消せなくなる点なんだよな。
0805デフォルトの名無しさん
2012/06/14(木) 12:49:49.760806デフォルトの名無しさん
2012/06/14(木) 13:30:06.780807デフォルトの名無しさん
2012/06/14(木) 13:52:33.440808デフォルトの名無しさん
2012/06/14(木) 16:22:24.280809デフォルトの名無しさん
2012/06/14(木) 18:03:24.84global.elとか仕様頻繁に換えんな
0810デフォルトの名無しさん
2012/06/14(木) 18:28:20.780811デフォルトの名無しさん
2012/06/14(木) 19:22:16.79使っているソフトはVS2010です
0812デフォルトの名無しさん
2012/06/14(木) 19:30:59.40【初心者歓迎】C/C++室 Ver.78【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1331894668/l50
0813デフォルトの名無しさん
2012/06/14(木) 19:39:57.21(使い方はある程度環境に依存はするけど)
0814デフォルトの名無しさん
2012/06/14(木) 19:41:19.39int std::system(const char*);
のことかな。
0815デフォルトの名無しさん
2012/06/14(木) 20:37:55.88単に実行するならexecとか
標準入出力の内容を操作したいならpopen/_popenを使ふ
0816デフォルトの名無しさん
2012/06/14(木) 22:05:13.070817デフォルトの名無しさん
2012/06/15(金) 22:09:00.460818デフォルトの名無しさん
2012/06/15(金) 22:24:09.160819デフォルトの名無しさん
2012/06/15(金) 22:26:06.03標準ライブラリなんて元々POSIXのサブセットだぞ
0820デフォルトの名無しさん
2012/06/15(金) 22:35:30.41あまり手広く広げてもなあ
0821デフォルトの名無しさん
2012/06/15(金) 22:49:13.90現状std名前空間にあるC関数もあんまり積極的には扱ってないだろ
0822デフォルトの名無しさん
2012/06/15(金) 23:06:35.340823デフォルトの名無しさん
2012/06/16(土) 05:48:02.11場合によりけり?
どういう場合に速いんだろ
0824デフォルトの名無しさん
2012/06/16(土) 09:43:38.23VM実行の場合は、VMの性能次第
0825デフォルトの名無しさん
2012/06/16(土) 18:01:49.090826デフォルトの名無しさん
2012/06/17(日) 18:42:17.050827デフォルトの名無しさん
2012/06/17(日) 18:43:04.790828デフォルトの名無しさん
2012/06/18(月) 21:31:39.610829デフォルトの名無しさん
2012/06/18(月) 23:14:28.280830デフォルトの名無しさん
2012/06/18(月) 23:29:23.070831デフォルトの名無しさん
2012/06/19(火) 13:46:05.440832デフォルトの名無しさん
2012/06/20(水) 16:25:14.310833デフォルトの名無しさん
2012/06/20(水) 16:35:07.580834uy
2012/06/20(水) 17:13:51.17お前らのような下級ゴミカスとは格が違う
0835デフォルトの名無しさん
2012/06/20(水) 17:22:24.68うるせーゴミカス
0836uy
2012/06/20(水) 17:37:41.960837デフォルトの名無しさん
2012/06/20(水) 18:01:38.16韓国のコミュニティサイト「ガセンイドットコム」の掲示板に「韓国人は日本人のように正直ではない」とのスレッドが立てられたところ、さまざまな意見が寄せられた。
スレ主は、18日に行われた台湾大手EMS企業・鴻海集団の株主総会に関して、日本で報じられた記事を紹介。
同社の郭台銘(グオ・タイミン)理事長は、日本のシャープと協力することにより、韓国のサムスンとの競争に勝算があると話した。
郭理事長は、日本人を尊重していると語り、日本人の行動力やコミュニケーション力、面と向かって断っても裏切ることはない正直さを評価した。
一方で、韓国人は日本人のように正直ではないと語ったという。
スレッドには、この記事に対する批判的な意見が数多くあがった。
・「台湾がそんな言葉を!」
・「台湾はいつまでたっても日本に奴隷根性」
・「台湾が正直さについて語るとは、笑える」
・「日本は勝てないライバルを悪役にするのが上手。到底実力では勝てないからキム・ヨナを性格の悪い子のようなイメージを植えつけ、真央は良い子に。」
・「日本がサムスンに勝つ方法は、台湾を味方につけることだけ」
・「最も正直から距離が遠い民族が笑わせる」
・「常に韓国人から、認定と関心を受けたいようだね」
・「台湾が計算しているのでは」
・「台湾人は中国人より日本人が好きだろう。」
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0620&f=national_0620_035.shtml
0838デフォルトの名無しさん
2012/06/20(水) 20:31:06.500839デフォルトの名無しさん
2012/06/21(木) 01:07:06.66またネトウヨの陰謀論か
0840デフォルトの名無しさん
2012/06/21(木) 03:01:48.72・Qが正直さについて語るとは、笑える
・Qは勝てないライバルを悪役にするのが上手。到底実力では勝てないからキム・ヨナを性格の悪い子のようなイメージを植えつけ、真央は良い子に
・Qが他の住人に勝つ方法は、他の住人を味方につけることだけ
・最も正直から距離が遠いQが笑わせる
・常にネット住民から、認定と関心を受けたいようだね
・Qが計算しているのでは
・Qはネット住民より自分が好きだろう。
自 己 愛 性 人 格 障 害
0841デフォルトの名無しさん
2012/06/21(木) 09:21:21.17ブログにでも書いとけ。
0842デフォルトの名無しさん
2012/06/21(木) 19:00:03.51Embarcadero C++BuilderってC++使いから見てどうなん?
使っている理由何?
使っていない理由は何?
0843デフォルトの名無しさん
2012/06/21(木) 19:06:34.660844デフォルトの名無しさん
2012/06/21(木) 19:07:50.610845デフォルトの名無しさん
2012/06/21(木) 19:10:20.96・そもそもその製品を知らない
・VC++EEで困ってない
0846デフォルトの名無しさん
2012/06/21(木) 19:22:22.07無料版コンパイラは相変わらずBCC5.5で古すぎてゴミ
http://www.embarcadero.com/jp/products/cbuilder/free-compiler
有償版はどの程度か分からないけど
同価格帯のVC++の有償版を超える程とは考え辛い・・・
0847デフォルトの名無しさん
2012/06/21(木) 21:15:08.98現状、C++コンパイラは規格に合致するものひとつも存在せず
個々のコンパイラ毎の方言を理解してそういう部分を局所化したコードを書かないといけない
つまり実績のないコンパイラは存在価値がない
0848デフォルトの名無しさん
2012/06/21(木) 21:26:23.49VC7.1から逆転した
0849デフォルトの名無しさん
2012/06/21(木) 21:36:21.94VC++MFCの方が生産性が高いから
0850デフォルトの名無しさん
2012/06/21(木) 21:40:43.20結局進準拠度の低さがすべてをダメにした
規格に準拠しないオレオレ規格で開発効率優先するなら.NET使ったほうがよっぽどいい
0851デフォルトの名無しさん
2012/06/21(木) 22:05:35.06ボタンを自動で押すなどの外からの操作がしにくいから迷惑
0852デフォルトの名無しさん
2012/06/21(木) 22:21:15.82名前すら知らない、眼中にない、準拠度が低いからが使わない理由か
たとえば、stdのスマポ使いたいになったとき他のではサポートしているのに
それが未対応じゃ使う気起こらないよな
俺のところは俺が入社したころはまだ会社ではC++builder6を使っていたが
理由は知らないがそれ以降はVC++に統一なったな。
それがVC2003あたりだった気がする。
俺、C++builder6はほとんど使ったことないけど、GUI作るのがVCより楽だったって記憶はあるな
0853デフォルトの名無しさん
2012/06/21(木) 22:35:34.66ライブラリの豊富さでは歯がたたないし
0854デフォルトの名無しさん
2012/06/21(木) 22:53:28.190855デフォルトの名無しさん
2012/06/22(金) 11:00:10.840856デフォルトの名無しさん
2012/06/22(金) 11:05:44.51比較にならん
0857デフォルトの名無しさん
2012/06/22(金) 11:18:21.610858デフォルトの名無しさん
2012/06/22(金) 11:29:03.69GUIだけはC#の方がいいとかいうのは幻想だったと
0859デフォルトの名無しさん
2012/06/22(金) 11:41:01.96MFCでやったほうが100倍マシ
前者はどのみち、利用者からもっさり感やレスポンスの悪さを指摘される
FAでman-machine-interfaceの作成ツールを.netを用いているが
未だに、起動時の遅さを文句言われる
次VerではMFC、VCL、Qtが検討されていて、繰り返しDR、CRを行っているが
安易に.netを採用した結果の失敗例だと思う。
0860デフォルトの名無しさん
2012/06/22(金) 12:01:40.350861デフォルトの名無しさん
2012/06/22(金) 12:27:08.95コーディングに上手いも下手もないだろ
0862デフォルトの名無しさん
2012/06/22(金) 12:47:26.570863デフォルトの名無しさん
2012/06/22(金) 12:53:33.510864デフォルトの名無しさん
2012/06/22(金) 12:57:40.11そんなの客にきちんと説明すればいいだけじゃん
「.netを使っているため、起動時に毎回ネイティブにコンパイルしているから遅いんですよ」
「じゃ、ネイティブでかいてよ」
「工数が掛かってしまいます」
「じゃ、他社使うからいいよ」
0865デフォルトの名無しさん
2012/06/22(金) 13:37:42.56やるならもっと柔軟にしとけよ
0866デフォルトの名無しさん
2012/06/22(金) 15:20:45.81他から持って込んでも.NETの標準ライブラリが使えるし
端末のSDKに.NET用API付いてたから
ActiceXとかNPAPIプラグインはC++で書いてるけど
0867866
2012/06/22(金) 15:22:02.63○v
0868デフォルトの名無しさん
2012/06/22(金) 15:45:28.45殆ど全く使わない無駄なプログラムはC#
年に一回以上使用する可能性があるプログラムはC/C++
0869デフォルトの名無しさん
2012/06/22(金) 17:34:17.240870デフォルトの名無しさん
2012/06/22(金) 18:27:20.140871デフォルトの名無しさん
2012/06/22(金) 18:30:55.41説明しよう!
C++/CLIとは、某企業がC++の名声を残しつつ自己実現するために送り込んだエイリアンである。
しかし、結果は裏腹にC++の奇形児として扱われ人気も出ず、.NETブリッジとしか使われないのだ〜。
南無三!
0872デフォルトの名無しさん
2012/06/22(金) 18:49:11.650873デフォルトの名無しさん
2012/06/22(金) 18:52:24.96いや〜、もっとプログラマ囲えたら更に独自規格出して逃げれなくなってたと思うよ。
0874デフォルトの名無しさん
2012/06/22(金) 18:55:44.620875デフォルトの名無しさん
2012/06/22(金) 18:59:12.040876デフォルトの名無しさん
2012/06/22(金) 19:05:59.850877デフォルトの名無しさん
2012/06/22(金) 19:07:18.850878デフォルトの名無しさん
2012/06/22(金) 19:12:56.83もしたい。
0879デフォルトの名無しさん
2012/06/22(金) 19:18:03.81の型は何だと思ってるんだ?
0880デフォルトの名無しさん
2012/06/22(金) 19:20:06.560881デフォルトの名無しさん
2012/06/22(金) 19:21:37.82僕の頭の中では
template<typename X1, ... , typename Xn>
class cartesian_product;
ってのが n=2, ..., 20 ぐらいまで定義されているんです。
0882デフォルトの名無しさん
2012/06/22(金) 19:21:56.510883デフォルトの名無しさん
2012/06/22(金) 19:42:35.23void func(p*);
で、使うときは
func(&hoge);
でいいんだよな
0884デフォルトの名無しさん
2012/06/22(金) 19:43:31.79×ポインタって宣言するときは
○ポインタを引数にする関数を宣言するときは
でしたすいません。
0885デフォルトの名無しさん
2012/06/22(金) 19:45:33.650886デフォルトの名無しさん
2012/06/22(金) 19:50:11.64あんな気持ち悪いのいやです
0887デフォルトの名無しさん
2012/06/22(金) 19:50:54.59ビルドしてみれば判る。
0888デフォルトの名無しさん
2012/06/22(金) 19:52:55.82C#でもシコシコやっててください
0889デフォルトの名無しさん
2012/06/22(金) 19:54:22.45もしもしなので無理です
わがままですいません
0890デフォルトの名無しさん
2012/06/22(金) 20:09:15.04http://ideone.com/clone/Au4m0
0891デフォルトの名無しさん
2012/06/22(金) 22:12:30.13C#で言うところのDictonary.TryGetValue()みたいなメソッドがあると助かるんだが、C++にはそういうメソッドはないの?
0892デフォルトの名無しさん
2012/06/22(金) 22:14:07.330893デフォルトの名無しさん
2012/06/22(金) 22:18:39.93同じkeyに対する要素なら線形探索になる。
もう一度アルゴリズムをやり直して仕様も読み直せ。
0894デフォルトの名無しさん
2012/06/22(金) 22:23:44.40それC++11のSTLを部分的に取り入れた物だと思う
>>893も言ってるけど要するにこれオープンハッシュだよね?
同じキーならハッシュも同じなのでその後は線形探索しかない
ダブルハッシュにすればいいけどメモリを馬鹿みたいに食うので
std::hash_map<key, std::hash_map<key2, value> > とすれば擬似的に
ダブルハッシュに出来るから速度実測してみな
0895デフォルトの名無しさん
2012/06/22(金) 22:26:58.19同じキーがあればO(N)ってことはキーが全く存在しなければO(1)なんだよな?
xhashのソースコード読んでたら、こんな実装になっていて、全要素文サーチしてたんだが、俺の勘違いだよな
iterator find(const key_type& _Keyval)
{ // find an element in mutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}
iterator lower_bound(const key_type& _Keyval)
{ // find leftmost not less than _Keyval in mutable hash table
size_type _Bucket = _Hashval(_Keyval);
for (iterator _Where = _Begin(_Bucket);
_Where != _End(_Bucket); ++_Where)
if (!this->comp(this->_Kfn(*_Where), _Keyval))
return (this->comp(_Keyval,
this->_Kfn(*_Where)) ? end() : _Where);
return (end());
}
0896デフォルトの名無しさん
2012/06/22(金) 22:29:16.13lower_bound内の_Bucket = _Hashval(_Keyval)に注目。
ここで探索対象が存在するbucketを判別している。
あとはそのbucketを線形探索だから何も間違いはない。
0897891
2012/06/22(金) 22:29:32.97× キーが全く
○ 同じキーが全く
0898デフォルトの名無しさん
2012/06/22(金) 22:31:59.960899891
2012/06/22(金) 22:33:50.92なるほど
ためしに存在しないキーを指定して、ソース追ってみたら、_Hashval(_Keyval)のところで0を返していて、その後、最後まで検索していたorz
キーが重複しても意味ない用途なんで重複を許さないhash_mapというのはないのかな…
0900デフォルトの名無しさん
2012/06/22(金) 22:35:10.150901デフォルトの名無しさん
2012/06/22(金) 22:36:03.34何を言ってるんだ
0902デフォルトの名無しさん
2012/06/22(金) 22:36:24.930903デフォルトの名無しさん
2012/06/22(金) 22:36:36.80で時間食われる
by VC++
0904デフォルトの名無しさん
2012/06/22(金) 22:37:27.34Flex使いましょう
0905デフォルトの名無しさん
2012/06/22(金) 22:38:20.12それぐらい自前でパースすりゃいい
0906デフォルトの名無しさん
2012/06/22(金) 22:39:10.68え、それが欲しいんでないの?
ようはただの連想配列を探していて、mapの前にhash_mapに辿りついたんだと思ってた。
0907デフォルトの名無しさん
2012/06/22(金) 22:41:24.170908デフォルトの名無しさん
2012/06/22(金) 22:41:29.25>>901
hash_mapに切り替える前はmapを使ってたんだが、そいつもfind()で存在しないキーを指定すると全要素検索していた
キーの重複は許さなくてもいいからfind()で存在しないキーを指定してO(1)なやつはないんだろうか
0909デフォルトの名無しさん
2012/06/22(金) 22:42:33.00VSのmapは赤黒木なんだからそれをend()に当たるまで探索するのは当たり前
0910デフォルトの名無しさん
2012/06/22(金) 22:42:46.98C#のDictonary相当の奴を探してる
mapならfind()でもO(log(n))、hash_mapならO(1)かと思ったら、そうでなかったでござる
0911デフォルトの名無しさん
2012/06/22(金) 22:43:50.92もしかして存在しない要素を探すのにO(1) = 定数時間しか掛からないと思ってるのか?
0912デフォルトの名無しさん
2012/06/22(金) 22:46:26.93理想的なハッシュ関数ならO(1)で済むよ
現実はそうじゃないから妥協しなきゃいけない
0913デフォルトの名無しさん
2012/06/22(金) 22:52:54.16要素が存在してなければ、定数時間だったと思うが
>>912
それってキーが重複している場合の話だよな
キーが存在しないのにo(1)で済まないというのも変な気がするが…
0914デフォルトの名無しさん
2012/06/22(金) 22:54:21.640915デフォルトの名無しさん
2012/06/22(金) 22:55:43.90その生成はもちろんO(N)だろうかハッシュテーブルの探索自体はO(1)だろ
0916デフォルトの名無しさん
2012/06/22(金) 22:57:44.80キーの重複は関係ないだろ
キーが存在しないってことは、コンテナの中に入ってるキーすべてと合致しないことを確かめないといけないのだから
ハッシュマップは確かめなきゃいけないキーの数が少なくて済むってだけの話
0917デフォルトの名無しさん
2012/06/22(金) 23:05:49.97キーが存在しないということはハッシュに対応するコンテナの中に何もないからコンテナの中を調べる必要はないんじゃないか?
念のためにくぐってみたら教科書的な実装はこういう風になってた
http://www.geocities.jp/ky_webid/algorithm/014.html
0918デフォルトの名無しさん
2012/06/22(金) 23:10:48.57キーが存在しないって
コンテナのサイズが0って意味か?
0919名無しのデフォルトさん
2012/06/22(金) 23:14:11.190920デフォルトの名無しさん
2012/06/22(金) 23:18:50.02存在しないキーに対応するコンテナーは0だね
0921デフォルトの名無しさん
2012/06/22(金) 23:20:55.41ChangeDynamicPointArray
0922デフォルトの名無しさん
2012/06/23(土) 10:02:38.94CPU負荷が半分以下に減っていて笑った
0923デフォルトの名無しさん
2012/06/23(土) 12:05:53.040924デフォルトの名無しさん
2012/06/23(土) 12:09:18.780925デフォルトの名無しさん
2012/06/23(土) 14:07:04.840926デフォルトの名無しさん
2012/06/23(土) 14:16:50.440927デフォルトの名無しさん
2012/06/23(土) 14:20:33.110928デフォルトの名無しさん
2012/06/23(土) 14:22:48.510929デフォルトの名無しさん
2012/06/23(土) 15:13:02.33stdexに隔離された方しか使ったことないや
0930デフォルトの名無しさん
2012/06/23(土) 20:27:22.56class P{
private:
double hoge;
public:
double Hoge(){ return hoge;}
};
double F(P<double> a, P<double> b){
return a.Hoge() + b.Hoge();
}
テンプレート型のクラスを引数に持ってくる際に型を固定したいのですが
以上のようにできるでしょうか
0931デフォルトの名無しさん
2012/06/23(土) 20:40:58.470932デフォルトの名無しさん
2012/06/23(土) 20:43:57.34VS2010だが、std::hash_mapは普通に使えてる
0933デフォルトの名無しさん
2012/06/23(土) 20:52:06.480934デフォルトの名無しさん
2012/06/23(土) 20:56:24.14よく知らないSTLの実装かもしんないじゃん!
0935デフォルトの名無しさん
2012/06/24(日) 03:08:40.250936デフォルトの名無しさん
2012/06/24(日) 03:24:45.630937デフォルトの名無しさん
2012/06/24(日) 11:05:14.26COM限定だけど
0938デフォルトの名無しさん
2012/06/24(日) 11:09:15.480939デフォルトの名無しさん
2012/06/24(日) 11:11:02.99COM≒shared_ptrは違うな
0940デフォルトの名無しさん
2012/06/24(日) 11:13:14.13COMは確かにintrusive_ptr扱いだな
0941デフォルトの名無しさん
2012/06/24(日) 23:14:57.24理屈じゃわかってたけど目からウロコだわ
ADLの有効な使い方初めて見た
0942デフォルトの名無しさん
2012/06/24(日) 23:34:55.98どうせならunordered_mapも比較してよ。
もちろん、VC++付属のとSTLportのと両方。
0943デフォルトの名無しさん
2012/06/27(水) 15:11:39.12C++/CLIだと使いたくても使えない
0944デフォルトの名無しさん
2012/06/27(水) 15:59:45.95GC標準装備なのにスマポなんかいらないだろ
0945デフォルトの名無しさん
2012/06/27(水) 16:12:24.10GCはメモリか、プロセス終了まで開きっぱなしでも良いようなリソースにしか使えないから
0946デフォルトの名無しさん
2012/06/27(水) 20:54:48.26ほとんど意味がない → shared_ptr
shared_ptr を new してポインタで保持するという・・・
0947デフォルトの名無しさん
2012/06/27(水) 21:03:31.24スレチだけどこんな感じであるいは
template <typename T> ref class managed_shared_ptr{
shared_ptr<T>* sp;
public:
managed_shared_ptr(T* p):sp(new shared_ptr<T>(p)){}
~managed_shared_ptr(){delete sp;}
...
0948デフォルトの名無しさん
2012/06/27(水) 22:15:55.38>>946と何が違うのん
0949デフォルトの名無しさん
2012/06/28(木) 00:54:23.69もう1段かましてmanagedクラスのフィールドに直接持てるスマポにする
0950デフォルトの名無しさん
2012/06/28(木) 07:24:31.06そして Dispose するくらいなら delete したのでもいい罠
0951デフォルトの名無しさん
2012/06/28(木) 07:27:02.41最近 C# ばっかだから混乱したわ
で、その Dispose を呼ぶためには
C++/CLI 的には delete を使うのであって
本当に意味が無い
0952デフォルトの名無しさん
2012/06/28(木) 08:04:48.57>C++/CLI 的には delete を使うのであって
いや、C++/CLIではC++の自動変数ライクな構文が用意されている
ref class A{public: A(){} ~A(){}};
ref class B{
A a; //実体は実際にはgcnewされる(A^ a = gcnew A();)
};
void f(){
B b; //実体は実際にはgcnewされる
f2(b);
}
これはC#での
class A : IDisposable {public A(){} public void Dispose(){}};
class B : IDisposable {
A a = new A();
public void Dispose(){using(a){}}
};
void f(){
using(B b = new B()){
f2(b);
}
}
になる
0953デフォルトの名無しさん
2012/06/28(木) 18:19:10.10bool (Choge::*func[NUM][NUM])(Chage*,Chage*); //関数ポインタ配列
↑宣言
↓実際に使おうとしたとき
bool a = this->*func[Array[Ai]->Getnum()][Array[Bi]->Getnum()](Array[Ai],Array[Bi]);
式にはpointer-to- 関数型が必要です
って出ます。どうしたらいいでしょうか?
0954デフォルトの名無しさん
2012/06/28(木) 18:23:11.25じゃなかったっけ
0955デフォルトの名無しさん
2012/06/28(木) 18:30:10.40警告でなくなった!!
ありがとう!
0956デフォルトの名無しさん
2012/06/28(木) 18:59:55.77boolの返値って受け取らなくても大丈夫ですか?
オーバーロードさせるのが不便なんですけど、コンパイラによって違う〜とか、正式に定義されていないとかありますか?
0957デフォルトの名無しさん
2012/06/28(木) 19:06:18.41Oh, そうだったのか・・・
0958デフォルトの名無しさん
2012/06/28(木) 20:04:21.84デストラクターもつかえるけど
!A(){}ってなデストラクターもどきを使うんじゃなかったか?
0959デフォルトの名無しさん
2012/06/28(木) 20:06:00.67エラーじゃないのか?これでコンパイル通ったら問題だろ。
0960デフォルトの名無しさん
2012/06/28(木) 20:12:27.52~A()はDisposeに相当して
!A()はファイナライザに相当する
普通はDispose(bool)を用意してそれを呼ぶ形で実装する
0961デフォルトの名無しさん
2012/06/28(木) 20:16:12.34>普通はDispose(bool)を用意してそれを呼ぶ形で実装する
これはなんで?~A()から!A()よべばええんちゃうん?
0962デフォルトの名無しさん
2012/06/28(木) 20:17:08.19ファイナライザだね
javaでも同様だけどファイナライザというのは気休め(後処理を書き忘れるアホプログラマ対策用)に過ぎないので
呼ばれることを前提にしては駄目な機能
0963デフォルトの名無しさん
2012/06/28(木) 20:34:45.08Finalizerそのものを当てにする必要はないけど、
deleteすればFinalizerが呼ばれるんだから
わざわざ別の関数にする必要ないじゃないの?
!A()に記述しとけば、関数から戻ってきたobjectを
managed用のunique_ptrに突っ込んで消すってことが
出来るじゃん。Disposeの明示的な呼び出しだと
忘れそうでこわひ。
0964デフォルトの名無しさん
2012/06/28(木) 20:47:21.20ファイナライザじゃないよ
あとunique_ptrはRAIIによってちゃんとdeleteする
>>947でラップして>>952のように埋め込めば勝手にDisposeを呼んでくれるから
明示的な呼び出しは必要無くなる
0965デフォルトの名無しさん
2012/06/28(木) 21:03:25.36>ファイナライザじゃないよ
了解。
ただ後半が何が言いたいのかわからないな。
managed用unique_ptrやscoped_ptrで消すって話と何が違うの?
0966デフォルトの名無しさん
2012/06/28(木) 21:14:24.18スマポは直接フィールドに持ってRAIIすることに意味があるから
0967デフォルトの名無しさん
2012/06/28(木) 22:26:49.81(1,2,3)
(4,5,6)
(7,8,9)
のような値が入っているCSVファイルから
括弧とカンマを除いて一文字ずつ配列に格納する方法ってありますか?
説明下手で申し訳ないです…
0968デフォルトの名無しさん
2012/06/28(木) 22:36:38.73fscanf
0969デフォルトの名無しさん
2012/06/28(木) 22:57:03.02fgets, strtok, atoi の方がやりやすそうではある
0970デフォルトの名無しさん
2012/06/28(木) 23:21:27.59https://github.com/tonicebrian/csv_iterator/blob/master/src/main.cpp
https://github.com/tonicebrian/csv_iterator/blob/master/include/csv_iterator.hpp
0971デフォルトの名無しさん
2012/06/28(木) 23:23:27.58while( !feof( stream ) )
{
do
{
if( 2 != fscanf( stream, "%d %[,\n]", value, stab ) ) throw ParseError( "あうちっ" );
col.push_back( value );
}
while( ln != stab );
row.push_back( col );
}
なんでC++にscanfファミリーに当たるもんがねぇんだよ・・・。
0972デフォルトの名無しさん
2012/06/28(木) 23:24:27.450973デフォルトの名無しさん
2012/06/28(木) 23:32:26.110974デフォルトの名無しさん
2012/06/28(木) 23:33:30.110975デフォルトの名無しさん
2012/06/28(木) 23:45:12.620976デフォルトの名無しさん
2012/06/29(金) 01:24:15.74SGIの原型にはあったけど98/03で無くなり、そして11で復活した
0977デフォルトの名無しさん
2012/06/29(金) 07:15:47.48istringstreamでは不満か?
0978デフォルトの名無しさん
2012/06/29(金) 09:00:11.35CSVの展開にstrtokを使うバカ発見。
0979デフォルトの名無しさん
2012/06/29(金) 09:31:24.870980デフォルトの名無しさん
2012/06/29(金) 09:38:21.60二元数(複素数)や四元数(クォータニオン)や八元数はあっても3つしかデータがないのは
ベクトルか何かのつもりか?
0981デフォルトの名無しさん
2012/06/29(金) 09:49:20.670982デフォルトの名無しさん
2012/06/29(金) 10:42:15.96C++ではそうなるよな
boost::lexical_castでも内部ではそれ使ってるし
0983デフォルトの名無しさん
2012/06/29(金) 12:41:10.460984デフォルトの名無しさん
2012/06/29(金) 19:21:58.57これはCSVではない
0985デフォルトの名無しさん
2012/06/29(金) 19:24:03.40普通のならこれでいいのに
0986デフォルトの名無しさん
2012/06/29(金) 19:45:14.14何のための外部ファイルだよw
0987デフォルトの名無しさん
2012/06/29(金) 19:50:19.520988デフォルトの名無しさん
2012/06/29(金) 20:40:43.56修正のたびに再コンパイルだったなあ
0989デフォルトの名無しさん
2012/06/29(金) 20:44:02.04C++のiostream系は、"<a %[!"#$%&'()~] >"ってな集合に対するパターンマッチが
出来ないから不便。同じ事をしようとしたら自前でパターンに一致する範囲を抜き出さなきゃならん。
scanf駆使すりゃXMLの読み込みでも、半日足らずで書けるが、iostreamじゃとてもじゃないけど半日は無理。
あと、sscanfとかstringstreamとか、一旦メモリーに読み込む奴は
ストリーム系に流用できないし、流用しようとすると複雑になるからナシ。
0990デフォルトの名無しさん
2012/06/29(金) 20:48:53.06演算子のオーバーロードの単なるデモだろ
0991デフォルトの名無しさん
2012/06/29(金) 20:56:37.950992デフォルトの名無しさん
2012/06/29(金) 21:04:21.760993デフォルトの名無しさん
2012/06/29(金) 22:59:08.27やはりC++11のregexに頼るしかないのか(´・ω・`)
0994デフォルトの名無しさん
2012/06/29(金) 23:42:32.220995デフォルトの名無しさん
2012/06/30(土) 02:14:36.88逆に言えば、コンパイル時に取り込める有り難い画像ファイルフォーマットってことじゃないか。
再コンパイルがいやなら他のフォーマット同様実行時に取り込めばいいだけだ。
それにしても、WikipediaのXPMは私が書いたっきりか(苦笑
0996デフォルトの名無しさん
2012/06/30(土) 11:44:43.820997デフォルトの名無しさん
2012/06/30(土) 12:49:19.020998デフォルトの名無しさん
2012/06/30(土) 12:55:46.660999デフォルトの名無しさん
2012/06/30(土) 13:10:42.06C++相談室 part96
http://toro.2ch.net/test/read.cgi/tech/1341029267/
1000デフォルトの名無しさん
2012/06/30(土) 13:16:31.0310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。