C++相談室 part81
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2010/05/09(日) 21:26:11ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part80
http://pc12.2ch.net/test/read.cgi/tech/1271591488/
0002デフォルトの名無しさん
2010/05/09(日) 21:27:410003v(^・^)v
2010/05/09(日) 21:28:45[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0004デフォルトの名無しさん
2010/05/09(日) 21:29:461.まず半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0005v(^・^)v
2010/05/09(日) 21:29:51[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
0006v(^・^)v
2010/05/09(日) 21:30:40amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
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/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0007デフォルトの名無しさん
2010/05/09(日) 21:31:420008v(^・^)v
2010/05/09(日) 21:32:11Effective 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/
■長いソースを貼るときはここへ。■
http://codepad.org/
0009v(^・^)v
2010/05/09(日) 21:33:270010デフォルトの名無しさん
2010/05/09(日) 21:33:52について
ttp://codepad.org/
もいいけど
Ideone.com | Online IDE & Debugging Tool
ttp://ideone.com/
これもなかなか良いよ。
ただ俺はcodepadの方が慣れているしそっち使うけど。
0011デフォルトの名無しさん
2010/05/09(日) 21:36:40amazonのリンクも英語版だし
0012デフォルトの名無しさん
2010/05/09(日) 21:37:570013デフォルトの名無しさん
2010/05/09(日) 21:38:46環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0014デフォルトの名無しさん
2010/05/09(日) 21:39:180015デフォルトの名無しさん
2010/05/09(日) 21:41:060016デフォルトの名無しさん
2010/05/09(日) 21:41:46そんなに洋書訳書ばっかなのか
0017デフォルトの名無しさん
2010/05/09(日) 21:43:540018デフォルトの名無しさん
2010/05/09(日) 21:44:54地鎮祭乙
0019デフォルトの名無しさん
2010/05/09(日) 22:01:32ttp://www.amazon.co.jp/dp/4839926050/
ttp://www.amazon.co.jp/dp/4798108936/
ttp://www.amazon.co.jp/dp/4797354542/
ttp://www.amazon.co.jp/dp/4797343672/
ttp://www.amazon.co.jp/dp/4777512096/
ttp://www.amazon.co.jp/dp/477410843X/
ttp://www.amazon.co.jp/dp/4062573318/
ttp://www.amazon.co.jp/dp/4797316144/
ttp://www.amazon.co.jp/dp/4797353686/
あとはBoostの解説書とか
ttp://www.amazon.co.jp/dp/4798017043/
C++ テンプレートテクニックとか
ttp://www.amazon.co.jp/dp/4797354534/
0020デフォルトの名無しさん
2010/05/09(日) 22:18:05へぇ。じゃぁあとは■Books(和書)■あたりでテンプレの形にまとめればよさそうだね。
あとはここらへんを■Books■の頭に追加だな。
http://www.amazon.co.jp/gp/bestsellers/books/754384/ref=pd_zg_hrsr_b_1_4_last
0021デフォルトの名無しさん
2010/05/09(日) 22:34:08ttp://ideone.com の方はエラーメッセージが長いときに表示が破綻する。
例:http://ideone.com/FqAKk
0022デフォルトの名無しさん
2010/05/09(日) 23:13:140023デフォルトの名無しさん
2010/05/10(月) 00:08:140024デフォルトの名無しさん
2010/05/10(月) 00:17:410025デフォルトの名無しさん
2010/05/10(月) 00:19:020026デフォルトの名無しさん
2010/05/10(月) 09:39:060027デフォルトの名無しさん
2010/05/10(月) 09:59:050028デフォルトの名無しさん
2010/05/10(月) 17:54:010029デフォルトの名無しさん
2010/05/10(月) 19:25:530030デフォルトの名無しさん
2010/05/10(月) 19:54:080031デフォルトの名無しさん
2010/05/10(月) 20:28:420032デフォルトの名無しさん
2010/05/10(月) 21:10:57これだけ理解してれば、組んで仕事しても安心だと思うよ。
const
参照とポインタの違い
RAII
例外安全
フェイルセーフ
0033デフォルトの名無しさん
2010/05/10(月) 21:33:40いつも思うのだが、
> 参照とポインタの違い
これを理解できないってのが全く理解できないんだが。
ポインタを理解できないってのならその気持ちは分からんでもないが、
> 参照とポインタの違い
これがわからないとコンパイルが全く通らないコードになると思うんだけど。。。
0034デフォルトの名無しさん
2010/05/10(月) 21:42:20参照とポインタの違いを今パッと書いてみ
0035デフォルトの名無しさん
2010/05/10(月) 21:44:500036デフォルトの名無しさん
2010/05/10(月) 21:47:53人に説明できる基準=理解している だと思うんだ
0037デフォルトの名無しさん
2010/05/10(月) 21:49:140038デフォルトの名無しさん
2010/05/10(月) 21:56:40ポインタ
変数名の前に*を付けて宣言する
再代入できる
ヌルポインタが存在する
*をつけることで脱参照する
&をつけることで得られる
右辺値に&をつけてもポインタは得られない(文法エラー)
参照へのdynamic_castでキャストが無効な場合はNULLが返される
参照
変数名の前に&を付けて宣言する
初期化しかできない
ヌル参照は存在しない
*をつけない状態で既に脱参照される
&をつけない状態で直接初期化する
const参照なら右辺値で初期化できる(テンポラリオブジェクトの寿命が延びる)
参照へのdynamic_castでキャストが無効な場合は例外が投げられる
0039デフォルトの名無しさん
2010/05/10(月) 21:59:150040デフォルトの名無しさん
2010/05/10(月) 21:59:190041デフォルトの名無しさん
2010/05/10(月) 22:00:380042デフォルトの名無しさん
2010/05/10(月) 22:06:020043デフォルトの名無しさん
2010/05/10(月) 22:07:370044デフォルトの名無しさん
2010/05/10(月) 22:09:48これでいいか?
参照は、戻りやメンバ変数やスレッド間で使用しない限り、寿命が参照元>参照なのが文法上保証できるのがいいね。
0045デフォルトの名無しさん
2010/05/10(月) 22:09:59for(a) for(b) for(c) for(d) for(e)
0046デフォルトの名無しさん
2010/05/10(月) 22:14:120047デフォルトの名無しさん
2010/05/10(月) 22:17:58> 参照戻しがいまいちわからん
そんな用語俺もしらんわ。
0048デフォルトの名無しさん
2010/05/10(月) 22:20:06template<class T>
T &foo(bool x, T &a, T &b){ return x ? a : b; }
0049デフォルトの名無しさん
2010/05/10(月) 22:22:32for(i) で i から a, b, c, d, e を算出
でも可能なら a, b, c, d, e でループした方がいい
0050デフォルトの名無しさん
2010/05/10(月) 22:22:430051デフォルトの名無しさん
2010/05/10(月) 22:23:40ポインタ返すのと大差ない
0052デフォルトの名無しさん
2010/05/10(月) 22:26:35こんな感じ?メンバーのほうが寿命が長いからこんなことができる。
class hoge
{
int fuga;
int& get()
{
return fuga;
}
const int& get()const
{
return fuga;
}
};
vectorのoperator[]などが参照で戻してるね。でもベクターのサイズを変えると戻りの参照が無効になる危険がある。
0053デフォルトの名無しさん
2010/05/10(月) 22:27:52const参照じゃないから問題はない気がする
まあ使い方によるが
0054デフォルトの名無しさん
2010/05/10(月) 22:29:37そのまま代入できたりするから便利なんだよ。
0055デフォルトの名無しさん
2010/05/10(月) 22:36:51ポインタで返すと戻り値のポインタをコピーされて遥か彼方で参照元がなくなった後にそのポインタを使われたりしてはまる。
参照だとスコープ外まで持ち出すことができないからそういうことを防止できる。
0056デフォルトの名無しさん
2010/05/10(月) 22:43:500057デフォルトの名無しさん
2010/05/10(月) 23:24:53int& func(){ int &x = hoge.get(); return x; }
0058デフォルトの名無しさん
2010/05/10(月) 23:26:200059デフォルトの名無しさん
2010/05/11(火) 01:05:19参照にすべきところをポインタにしたせいで生成されるコードが劣化するケースって、
たとえばどんなの?
0060デフォルトの名無しさん
2010/05/11(火) 01:09:24http://seclan.dll.jp/c99d/c99d07.htm
0061デフォルトの名無しさん
2010/05/11(火) 01:18:160062デフォルトの名無しさん
2010/05/11(火) 01:23:49参照が静的に行われる「置き換え」で解決される事を知っておくべき。
元のオブジェクトがポインタでない場合はその事をコンパイラは簡単に検知できるが、
スコープを横断してオブジェクトを共有する時にポインタを使っていては関数がインライン展開でもされない限りコンパイラは最適化を施す事ができない。
0063デフォルトの名無しさん
2010/05/11(火) 01:35:39> 参照が静的に行われる「置き換え」で解決される
んなこたーない。
int& f();
void g()
{
int& x = foo(); // 静的に置き換えられるわけがない。
...
}
何言ってるのかよくわからんから >>59 に答えるコードを出してくれないか?
006462
2010/05/11(火) 01:40:540065デフォルトの名無しさん
2010/05/11(火) 01:45:28それは前方宣言してるからだろう。少し言葉足らずだったから補足するが、置き換えで解決もできるということだ。
その部分に関してわざと曖昧に判別できる余地が残されているから最適化もたやすいと言っているんだよ。
gのxをfooの戻り値で初期化する場合、もしfooのの中身がその時点で分かっているとしたら、fのinline展開に関わらず
xが指し示すオブジェクトを特定できる時がある。
ポインタの場合は同等の最適化が乱雑になる。一旦動的に処理されるメモリアドレスの値がどのように扱われるかコンパイラが予測しなければならないから。
ポインタ型の中身は組み込み型の値であるからその予測はコンパイラの実行時予測のやりかたとして程度問題に扱われるが
参照はコンパイル時にある程度指し示す先が何かを判断しやすい。
0066デフォルトの名無しさん
2010/05/11(火) 02:00:16コードは出してくれないの?
参照のときはその初期化元を辿ってがんばるのにポインタのときはあきらめるとか、
そんな中途半端な解析するコンパイラほんとに見たことあるの?
0067デフォルトの名無しさん
2010/05/11(火) 02:06:50たいていの C++ コンパイラは C コンパイラとして成功したうえで作成されてるから、
ポインタにした途端に最適化が弱るなんてのは考えにくいと思うよ。
0068デフォルトの名無しさん
2010/05/11(火) 02:13:31コードならfがint&じゃなくてint*返すやつでも想定してればいいよ。
中途半端な解析というか、実行時の動作までコンパイラが予測するのはかなりコストが掛かる。
コンパイラ作った事あるなら分かると思うけど、目の前の最適化を目的にしたコード生成は二の次でコンパイラは型レベルの検査や
解析木の生成に忙しく、込み入った最適化は後回しにされる。
しかし参照は「実行時の参照」ではなく「静的に解決できる参照」に視点を置いているので実行時の動作予測フェイズではなく
式解析における意味の判断の時点で「安全な置き換え」が可能なときがある。
ここでいう「安全な置き換え」とは実行時の予測で必要な「考えうるケース全てを検証する」方法(副作用のトレースなど)を排除しているのでスマートに処理ができ、
コンパイル時間への貢献も大きい。
ポインタしかなかった時代では単純に置き換えが可能なinline関数の展開でさえ、その間接参照された変数が
「他の変数の副作用をトレースしなくても最適化可能か?」という問題を解決できず、最適化が阻害されていた。
0069デフォルトの名無しさん
2010/05/11(火) 02:24:27いや、 63 のコードじゃどんな最適化の有効無効が異なるのかわからないでしょ。
実行時の動作なんて予測しなくていいんだよ。ローカルなポインタ変数に初期化後の
書き込みがあるかないかなんて、基本的な最適化の段階で把握してないとおかしい。
参照をポインタにしたら最適化が抑制されるなんてことはなくて、ポインタで可能になる
初期化後の変更をするから最適化できないというならわかる。ただしその場合は単純に
参照に置き換えることはできない。
最適化にかかるコンパイル時間は確かに参照のほうが安くあがるかもね。
> ポインタしかなかった時代では単純に置き換えが可能なinline関数の展開でさえ、その間接参照された変数が
> 「他の変数の副作用をトレースしなくても最適化可能か?」という問題を解決できず、最適化が阻害されていた。
それ、昔話だよね?
0070デフォルトの名無しさん
2010/05/11(火) 02:30:38inline void swap_r(int& a, int& b) { int x = a; a = b; b = x; }
void f(int& a, int& b) { swap_p(&a, &b); }
void g(int& a, int& b) { swap_r(a, b); }
g++ 4.3.4 の -O1 から -O3 まで、 f(), g() ともにまったく同じコードが生成されました。
0071デフォルトの名無しさん
2010/05/11(火) 02:34:10参照で可能でポインタで不可能なパターンは今時ないだろ
gccなんかはRTLになった段階でほぼ同一コードになるしな
0072デフォルトの名無しさん
2010/05/11(火) 02:38:04最初からコストが嵩む問題が魔法によって軽くなるといってるんじゃなくて、いままでしなくてもいい処理をしていた部分が簡略化されるといってるんだ。
コード生成の結果は同じでもコンパイル時間も比較してくれないと話にならないよ。
0073デフォルトの名無しさん
2010/05/11(火) 02:44:48> コード生成の結果は同じでもコンパイル時間も比較してくれないと話にならないよ。
あれ?
もしかして「最適化を抑制するから参照に」とか言ってた人とは別の人だったのか?
0074デフォルトの名無しさん
2010/05/11(火) 02:51:30最適化としてコンパイラが行うべき処理が減るだろうというのには誰も異論は無い。
ポインタが「最適化を抑制」とか「最適化を阻害」とか言うのが現状にそぐわないという
話をしている。
0075デフォルトの名無しさん
2010/05/11(火) 03:04:59そんな極端な話じゃないよね。
0076デフォルトの名無しさん
2010/05/11(火) 03:06:59ねーよw
そんな不安定なコンパイラがあってたまるか。
0077デフォルトの名無しさん
2010/05/11(火) 13:32:420078デフォルトの名無しさん
2010/05/11(火) 15:53:56色々な煽りに煽り返したりとかしていたけど、
恋人ができたとたん全てがあほらしくなった。
まるで別人のごとき心境。
0079デフォルトの名無しさん
2010/05/11(火) 16:09:030080デフォルトの名無しさん
2010/05/11(火) 16:34:20単純にクラスとかの一部の機能をちまちま使うのはC++では無いって言われた
0081デフォルトの名無しさん
2010/05/11(火) 16:36:530082デフォルトの名無しさん
2010/05/11(火) 17:09:35共通ライブラリー以外のプログラムには必要ない
時間の無駄だ
0083デフォルトの名無しさん
2010/05/11(火) 17:50:050084デフォルトの名無しさん
2010/05/11(火) 18:10:26書き込む前にオナニーをすれば無用な煽りは減らせるぞ
0085デフォルトの名無しさん
2010/05/11(火) 19:36:06ttp://d.hatena.ne.jp/MaD/20081211/1229003917
今は気にしなくていいってこと?
0086デフォルトの名無しさん
2010/05/11(火) 20:05:20軽く使うならそれでもいいけど、せっかくC++使ってるんだからOOP意識して書いたほうが楽だよ。
0087デフォルトの名無しさん
2010/05/11(火) 21:07:06楽になるかどうかは書くコードによるだろ
0088デフォルトの名無しさん
2010/05/11(火) 22:20:440089デフォルトの名無しさん
2010/05/11(火) 22:23:360090デフォルトの名無しさん
2010/05/11(火) 22:24:33まあある意味失敗したOOPだがな。
むしろC++は必ずしもOOPじゃなくても
プログラミングできるのがウリじゃないのか?
マルチパラダイムなのが良い点じゃないか。
0091デフォルトの名無しさん
2010/05/11(火) 22:33:08オブジェクト指向は抽象的すぎて、理解した程度がみんな違うからね
>マルチパラダイムなのが良い点じゃないか。
その通り。言語仕様でジェネリックやオブジェクト指向に対応してるんだしね
しかし、Rubyが出てからかオブジェクト指向が最高となってるね
009290
2010/05/11(火) 22:54:05俺自身は書けねぇけどな!
0093デフォルトの名無しさん
2010/05/11(火) 22:57:39ヘッダファイル見たけどわからないです
0094デフォルトの名無しさん
2010/05/11(火) 23:04:21わからない行に当たる度に参考書をあたれば、いつかわかります
0095デフォルトの名無しさん
2010/05/11(火) 23:06:03精進します
0096デフォルトの名無しさん
2010/05/11(火) 23:25:06class CFoo
{
public:
CFoo(const CFoo& src){〜}
};
CFoo f1;
CFoo f2(f1);
↑これって、問題ないですか?
0097デフォルトの名無しさん
2010/05/11(火) 23:49:020098デフォルトの名無しさん
2010/05/12(水) 00:04:070099デフォルトの名無しさん
2010/05/12(水) 00:21:150100デフォルトの名無しさん
2010/05/12(水) 00:23:41参照を返すときには、返した先で左辺値として書くのが普通では?
0101デフォルトの名無しさん
2010/05/12(水) 00:23:42値型だとコピーが発生するけど
0102デフォルトの名無しさん
2010/05/12(水) 00:45:44ちょっとよくわからなかった
普通というか、それ以外の書き方があるのだろうか
0103デフォルトの名無しさん
2010/05/12(水) 01:05:59気にしなくていい。その記事が書かれた 2008 年当時でもたぶん、挙げられた例で
生成されるコードが変わるほど最適化が貧弱なコンパイラは生き残っていなかっただろう。
(その記事中にも生成されるコードが変わるような実例は挙げられていない)
0104デフォルトの名無しさん
2010/05/12(水) 01:42:02最初からコンパイラがちょっと楽できるねって話じゃないのか
0105デフォルトの名無しさん
2010/05/12(水) 01:48:100106デフォルトの名無しさん
2010/05/12(水) 13:04:51この型をnewで割り当てる場合、どう書けばいいですか?
0107デフォルトの名無しさん
2010/05/12(水) 13:40:040108デフォルトの名無しさん
2010/05/12(水) 15:20:06double timer(){
static int c=-1;
static LARGE_INTEGER cl[2];
static double cnst;
if(c==-1) { c=0; QueryPerformanceFrequency(&cl[0]);
cnst=1000.0/cl[0].LowPart; QueryPerformanceCounter(&cl[0]); return 0; }
c=1-c;
QueryPerformanceCounter(&cl[c]);
return (cl[c].LowPart - cl[1-c].LowPart)*cnst; }
0109デフォルトの名無しさん
2010/05/12(水) 19:15:53何をしたいのかはっきり書こう
10要素の配列、の配列を作りたいのか
10要素の配列、を1つだけ作りたいのか
array_t を使って new int[10]; と全く同じ事をしたいのか
0110デフォルトの名無しさん
2010/05/12(水) 20:19:27newは必ず型名が必要なので、次のようにする必要がある
typedef int (*array_t)[10];
array_t ap = reinterpret_cast<array_t>(new int[10]);
delete[] ap;
0111デフォルトの名無しさん
2010/05/12(水) 20:41:29おい、無茶苦茶教えるな
0112デフォルトの名無しさん
2010/05/12(水) 21:03:110113デフォルトの名無しさん
2010/05/12(水) 21:03:520114デフォルトの名無しさん
2010/05/12(水) 21:13:16釣りだから真似してはいけませんよ。
0115デフォルトの名無しさん
2010/05/12(水) 21:14:02array_t* p = new array_t[20];
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < 10; ++j) {
p[i][j] = i * j;
}
}
delete[] p;
array_t* q = new array_t;
for (int i = 0; i < 10; ++i) {
q[i] = i;
}
delete q;
単純明快なの
0116デフォルトの名無しさん
2010/05/12(水) 21:14:45for (int i = 0; i < 10; ++i) {
(*q)[i] = i;
}
0117デフォルトの名無しさん
2010/05/12(水) 21:55:30array_t* a = new array_t;
0118デフォルトの名無しさん
2010/05/12(水) 21:57:33コンパイルエラー出るぞゴルァ
0119デフォルトの名無しさん
2010/05/12(水) 22:20:02delete[] a;
C++って衝撃的な文法だよな
「配列はtypedefするな」ってのもよく分かるわ
0120デフォルトの名無しさん
2010/05/12(水) 23:04:34x[][]形式でアクセスする
int a[n][m]をnewで生成ってどうするんですか
0121デフォルトの名無しさん
2010/05/12(水) 23:07:400123デフォルトの名無しさん
2010/05/12(水) 23:28:260124デフォルトの名無しさん
2010/05/12(水) 23:41:520125デフォルトの名無しさん
2010/05/12(水) 23:45:33いや十分速いだろ。
ただしC++0xでは。
0126デフォルトの名無しさん
2010/05/12(水) 23:46:380128デフォルトの名無しさん
2010/05/13(木) 00:08:370129デフォルトの名無しさん
2010/05/13(木) 00:32:29ms.insert(3);ms.insert(2);ms.insert(4);
ms.insert(4);ms.insert(1);ms.insert(5);
としたとき、【A】multisetの中の一番小さいもの
&二番目に小さいもの(1,2)を取得し削除する処理と
同様に、【B】multisetの中の一番大きいもの
&二番目に大きいもの(5,4)を取得し削除する処理を書きたいです。
multiset<int>::iterator it = ms.begin();
int one = *it; ms.erase(it++);
int two = *it; ms.erase(it);
処理Aは以上のコードで可能なのですが、処理Bができません。
multiset<int>::reverse_iterator it = ms.rbegin(); とすると
ms.erase(it++); ができませんし、
multiset<int, std::greater<int>> ms; はエラーでコンパイルできません。
なにか上手な方法はありませんか?環境はVC++2010です。
0130デフォルトの名無しさん
2010/05/13(木) 00:55:570131デフォルトの名無しさん
2010/05/13(木) 02:08:54typedef boost::array<int, 10> array_t;
std::vector<array_t> v;
0132デフォルトの名無しさん
2010/05/13(木) 15:14:45フォーマットは何にすれば楽でしょうか?
0133デフォルトの名無しさん
2010/05/13(木) 15:35:47サンプルもいっぱいあるっしょ。
0134デフォルトの名無しさん
2010/05/13(木) 16:19:03それ以外だと、「項目=value」のInf方式もいいかもね。
0135デフォルトの名無しさん
2010/05/13(木) 16:22:250137デフォルトの名無しさん
2010/05/13(木) 16:39:180138デフォルトの名無しさん
2010/05/13(木) 17:00:000139デフォルトの名無しさん
2010/05/13(木) 20:34:51データ量をさほど気にせず、Boostに慣れてるならぶっちゃけ一番簡単。
設定用途程度なら何でも出来る。
XML, JSON, INI, INFO(Boost独自フォーマット)に対応してる。
0140デフォルトの名無しさん
2010/05/13(木) 20:38:09PHPは標準でINIに対応しているからこれと互換にしておけば。
バイナリならシリアル化するやつをboost以外で用意する。
0141デフォルトの名無しさん
2010/05/13(木) 20:39:07なぬこんなのあるのか、、、
0142デフォルトの名無しさん
2010/05/13(木) 23:08:21#include <iostream>
#include <vector>
using namespace std;
template<class T> class array {
public: int m; vector< vector<T> > *vec;
T& operator[](int n) { return (*vec)[m][n]; } };
template<class T> class arrays {
vector< vector<T> > vec;
array<T> prx;
public:
arrays(int x,int y) {
vec = vector< vector<T> >( x, vector<T>(y) );
prx.vec = &vec; }
array<T>& operator[](int m) { prx.m = m; return prx; }
};
int main () {
arrays<int> array(3,5);
int m,n;
for(m=0;m<3;m++) for(n=0;n<5;n++) array[m][n] = (m+1)*(n+1);
for(m=0;m<3;m++) {
for(n=0;n<5;n++) printf("%3d", array[m][n]);
printf("\n"); }}
0143デフォルトの名無しさん
2010/05/13(木) 23:31:17満足げにかいてるが、お前それ何してるのか分かってるのか?
int array[1][2];
って書けばいいだけジャンw
0144デフォルトの名無しさん
2010/05/13(木) 23:32:250145デフォルトの名無しさん
2010/05/13(木) 23:52:30データ参照するだけでなく何らかの処理も必要な場合は
operatorでかくしか無い。
0146デフォルトの名無しさん
2010/05/13(木) 23:59:14#include <iostream>
#include <vector>
using namespace std;
template<class T> class retu {
public:
int m; vector< vector<T> > *vec;
T& operator[](int n) { return (*vec)[m][n]; } };
template<class T> class nijyu_test {
vector< vector<T> > vec;
retu<T> ret;
public:
nijyu_test(int x,int y) {
vec = vector< vector<T> >( x, vector<T>(y) ); ret.vec = &vec; }
retu<T>& operator[](int m) { ret.m = m; return ret; } };
int main () {
nijyu_test<int> A(3,5);
int m,n;
for(m=0;m<3;m++) for(n=0;n<5;n++) A[m][n] = (m+1)*(n+1);
for(m=0;m<3;m++) {
for(n=0;n<5;n++) printf("%3d", A[m][n]);
printf("\n"); }}
0147デフォルトの名無しさん
2010/05/14(金) 00:11:58Effective C++とMore Effective C++ を読んでから出直してこい
0148デフォルトの名無しさん
2010/05/14(金) 00:16:260149デフォルトの名無しさん
2010/05/14(金) 01:00:11>int (*a)[10] = new int[100][10];
このnewの戻り値変数、なんで int (*a)[10] になるんですか?
0150デフォルトの名無しさん
2010/05/14(金) 01:11:490151デフォルトの名無しさん
2010/05/14(金) 01:48:13確保されてその先頭のアドレスであるint(*)[10]が返されたんだろ。
0152122
2010/05/14(金) 07:43:57a[99] = new int[10];
(a[99])[9] = 0;
cout << a[99] <<" "<< &(a[99])[0];
delete [] a[99];
0153デフォルトの名無しさん
2010/05/14(金) 14:35:08strict_aliasing.cpp:12: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/c++/4.4/bits/stl_tree.h:175: note: initialized from here
というwarningが出ます。
Hogeの別名Fugaを使っていることが原因のようですが、これは良くないプログラムなのでしょうか?
また、解決方法はオプション変更以外にあるのでしょうか?
#include <iostream>
#include <map>
using namespace std;
class Hoge
{
__public:
____double val;
____Hoge( double d ) : val(d) { }
____bool operator<( const Hoge& rhs ) const{
______return (val < rhs.val);
____}
};
typedef Hoge Fuga; // これが悪いらしい
int main(int argc, char* argv[])
{
__map<Fuga,int> fuga2int;
__fuga2int[ Fuga(100) ] = 1;
__return 0;
}
0154デフォルトの名無しさん
2010/05/14(金) 15:33:45こいつ>>146、このスレで揚げ足とるときに必ず出てくる奴なんだよ。
日本語の変数つかってるからすぐ分かる。
うぜーからほっといてあげてください
0155デフォルトの名無しさん
2010/05/14(金) 15:45:36>日本語の変数つかってるからすぐ分かる。
>日本語の変数つかってるからすぐ分かる。
>日本語の変数つかってるからすぐ分かる。
>日本語の変数つかってるからすぐ分かる。
0156デフォルトの名無しさん
2010/05/14(金) 19:30:52#include <cstdio>
class マンコ
{
public:
void 挿入()
{
std::printf("あいう");
}
};
int main()
{
マンコ i;
i.挿入();
std::fgetc(stdin);
}
0157デフォルトの名無しさん
2010/05/14(金) 23:03:05{
(void)a;
}
こういうコード見たんだけど何の意味があるんでしょうか?
0158デフォルトの名無しさん
2010/05/14(金) 23:13:17その式の副作用だけに期待して評価を無視する場合は明示的に(void)とキャストして警告が出ないようにしていた。
ただしC言語がANSIで規定される前の話だからそのコードを見る限りは何なのか判断できないな。
0159デフォルトの名無しさん
2010/05/14(金) 23:35:07昔そういうクソなツールがあって、その警告防止のため
0160デフォルトの名無しさん
2010/05/14(金) 23:43:24得に意味は無いんですね
0161デフォルトの名無しさん
2010/05/14(金) 23:48:37という表明にはなる
0162デフォルトの名無しさん
2010/05/14(金) 23:50:190163デフォルトの名無しさん
2010/05/14(金) 23:51:08だから
>そのコードを見る限りは何なのか判断できないな。
って書いてあるだろ。
0164デフォルトの名無しさん
2010/05/14(金) 23:52:120165デフォルトの名無しさん
2010/05/14(金) 23:53:550166デフォルトの名無しさん
2010/05/14(金) 23:57:590167デフォルトの名無しさん
2010/05/15(土) 00:13:16もともとaなんて何も意味ない式だし、よくわからんね。意味ないんじゃない?
0168デフォルトの名無しさん
2010/05/15(土) 00:18:14察してあげなよ
0169デフォルトの名無しさん
2010/05/15(土) 00:20:47引数使ってないよ!警告を出さないようにするってのを
どっかで見たな
virtual void xxx(const A& /* a */) const
{
}
0170デフォルトの名無しさん
2010/05/15(土) 00:25:220171169
2010/05/15(土) 00:29:47消さないって前提だった
0172デフォルトの名無しさん
2010/05/15(土) 00:46:540173デフォルトの名無しさん
2010/05/15(土) 00:51:590174デフォルトの名無しさん
2010/05/15(土) 02:47:470175デフォルトの名無しさん
2010/05/15(土) 02:51:56コンパイラに警告を出させない目的で'(void)引数'を使ってる。
引数名を書かなくてすむ方法があるならそうしたいが…。
0176デフォルトの名無しさん
2010/05/15(土) 02:55:21doxygen のコメントは宣言だけに書いて、引数名を書かないのは定義だけにすればいい。
0177デフォルトの名無しさん
2010/05/15(土) 03:28:58std::mapで警告されるのはgcc4.4のバグらしいよ。
0178デフォルトの名無しさん
2010/05/15(土) 06:17:230179デフォルトの名無しさん
2010/05/15(土) 12:11:20関数の多重宣言は出来るから変数にも適用して
同名で異なる型の変数を自動で生成してくれよ。
変数宣言無くせれば見通し良くなる。
0180デフォルトの名無しさん
2010/05/15(土) 13:44:480181デフォルトの名無しさん
2010/05/15(土) 14:59:320182デフォルトの名無しさん
2010/05/15(土) 22:45:33新茶と新緑の薫りを楽しみながらで談話しせう
0183デフォルトの名無しさん
2010/05/15(土) 22:47:110184デフォルトの名無しさん
2010/05/15(土) 22:52:000185デフォルトの名無しさん
2010/05/15(土) 22:56:160186デフォルトの名無しさん
2010/05/16(日) 04:05:560187デフォルトの名無しさん
2010/05/16(日) 11:39:210188デフォルトの名無しさん
2010/05/16(日) 11:46:290189デフォルトの名無しさん
2010/05/16(日) 12:10:01いずれデータベースとかの勉強しようとした時に多分これらのSQL系ソフトが必要になるんだろうけど、
今のとこデータベースやる予定ないから消したい。
VC++とSDKでの開発に当たり障り無い範囲でSQLなどの関係ないソフトを消したいんだけど、プログラムの追加と削除のところからテキトーにやっちゃって良いの?
何か消しちゃヤバいプログラムとかあったら教えてエロい人
0190デフォルトの名無しさん
2010/05/16(日) 12:16:260191デフォルトの名無しさん
2010/05/16(日) 13:55:280192189
2010/05/16(日) 14:46:53合計600MB超えてるしww
消してくる。THX
0193189
2010/05/16(日) 14:48:260194デフォルトの名無しさん
2010/05/16(日) 15:45:25それよりハードディスク大きいやつに交換しろよ。
0195デフォルトの名無しさん
2010/05/16(日) 16:43:46.netランタイムだったら消すなよ。
0196デフォルトの名無しさん
2010/05/16(日) 16:50:560197デフォルトの名無しさん
2010/05/16(日) 19:21:180198デフォルトの名無しさん
2010/05/16(日) 19:37:03VC++はC++コンパイラでCコンパイラじゃないよ。
C++コンパイラでC言語なんて止めたまえ
0199デフォルトの名無しさん
2010/05/16(日) 20:19:14なんでやねん
拡張子を".c"にするとcコンパイラになるんだが
ぐぐったらVC++でCのソースを扱う方法がいっぱい出てくるだろうが
0200デフォルトの名無しさん
2010/05/16(日) 20:24:100201デフォルトの名無しさん
2010/05/16(日) 20:33:10↓上から目線で
0202デフォルトの名無しさん
2010/05/16(日) 20:52:22互換性と移植性が失われる
0203デフォルトの名無しさん
2010/05/16(日) 20:54:340204デフォルトの名無しさん
2010/05/16(日) 20:55:28やめろ馬鹿
0205デフォルトの名無しさん
2010/05/16(日) 20:56:520206デフォルトの名無しさん
2010/05/16(日) 20:59:320208デフォルトの名無しさん
2010/05/16(日) 23:00:47template <class T> ・・・
{
T *p = new (buffer) T(arg);
p->~T();
operator delete (p, buffer);
p = 0;
}
上記のような流れが正しい扱い方だと思うんですが、以下の場合どう書くべきなのか困ってます
�@T *p;ではなくconst T *p;にした場合
operator delete (p, buffer);の引数は非constなのでコンパイルできない
const_castを使うほかないと思うんですが、それって作法としてはどうなのかな、と
�ATがメンバにoperator delete (void *, void *);を持っている場合
TMPを使って適切に呼び出すことは可能ですが、C++を開発した人が最初からTMPを前提にplacement new/deleteを用意したとは思えません
TMPを使わずに適切なoperator deleteを呼び出すことは可能でしょうか?
0209デフォルトの名無しさん
2010/05/16(日) 23:24:57最初のソースから何かおかしい。
buffer がどう確保されてるのかわからないので、 operator delete () の呼び出しが
正しいのかどうか判別不能。
0210デフォルトの名無しさん
2010/05/16(日) 23:28:01unsigned char buffer[sizeof(T)];
を使うことを考えています
0211デフォルトの名無しさん
2010/05/16(日) 23:35:55それなら operator delete () 呼び出しちゃダメ。
あと、アライメントに注意。
0212デフォルトの名無しさん
2010/05/17(月) 00:39:54何もしない関数とは言え、newに対応するdeleteは一応呼び出した方が良くないですかね?
0213デフォルトの名無しさん
2010/05/17(月) 00:51:150214デフォルトの名無しさん
2010/05/17(月) 00:51:450215デフォルトの名無しさん
2010/05/17(月) 00:54:57placement newは既に存在するメモリ空間に対してオブジェクトを構築する構文。
この場合はoperator deleteする必要はない。
0216デフォルトの名無しさん
2010/05/17(月) 01:05:05オーバーロードされてないことが事前にわかるなら呼ばなくていい
0217デフォルトの名無しさん
2010/05/17(月) 01:08:140218デフォルトの名無しさん
2010/05/17(月) 01:20:180219デフォルトの名無しさん
2010/05/17(月) 01:34:11http://codepad.org/rojFWYYr
0220デフォルトの名無しさん
2010/05/17(月) 01:41:370221デフォルトの名無しさん
2010/05/17(月) 01:54:52それ以外は絶対呼んじゃ駄目。
当たり前すぎることなんだけど、
new演算子とoperator new()の違い、及びdelete演算子とoperator delete()の違いが
区別できてないアホはウダウダ言い続ける。
0222デフォルトの名無しさん
2010/05/17(月) 01:57:07わかってる人はわかってるが、さすがに「当たり前すぎる」はないだろう。
「new演算子とoperator new()の違い」なんて一見して何言ってるのかわかんないよ。
説明もしにくい。
0223デフォルトの名無しさん
2010/05/17(月) 01:58:50君、発言から察するに追加引数ありとなしのoperator new|deleteを混同してないかね?
0224デフォルトの名無しさん
2010/05/17(月) 02:06:56こういうやつが居ることを考慮して、 ::new (buffer) ... ってしとかないとダメなんだな。
0225デフォルトの名無しさん
2010/05/17(月) 02:11:42は?
new演算子は、operator new()を呼び出してメモリを確保した後、コンストラクタを呼び出す演算子。
operator new()は、単純に指定した量のメモリを確保するだけの関数。
この程度のこと、知らないわけじゃあるまい?
オーバーロードできるのはoperator new()とoperator delete()のみ。
operator delete()の明示的な呼び出しと、デストラクタがどうのって話は全然関係ない。
0226デフォルトの名無しさん
2010/05/17(月) 02:16:38ねーねー、m_countの初期値はいくつ?
0227デフォルトの名無しさん
2010/05/17(月) 02:17:51よく見てなかった。
0228デフォルトの名無しさん
2010/05/17(月) 02:20:26知ってるけどわかりにくいって話だよ。特に「演算子」が operator の訳語であると知っていれば
なおさら。
0229デフォルトの名無しさん
2010/05/17(月) 02:23:20::operator new(size_t, a_t, b_t, c_t, ...)を呼んだら、::operator delete(void*, a_t, b_t, c_t, ...)を同じ引数で呼ばないとだめ
同じように::operator new(size_t, void*)を呼んだら、::operator delete(void*, void*)を呼ぶ(ほうが対称性があって行儀が良いけどどうせなかで何もしないからべつに書かなくてもいいよ)
そんで::new(a_t, b_t, c_t, ...)演算子は内部で::operator new(size_t, a_t, b_t, c_t, ...)を呼んでいるから対応する::operator delete(void*, a_t, b_t, c_t, ...)も呼ばないとだめ
グローバルに関してはこれでおk?
0230デフォルトの名無しさん
2010/05/17(月) 02:29:161行目と3行目はわかるが、それ以外については何も言えないはず。
0231デフォルトの名無しさん
2010/05/17(月) 02:46:59スタックが巻き戻されて引数が対応するoperator deleteに同じ引数を渡して呼ばれるね
ということはC++の仕様を考えた人たちは
operator newとoperator deleteはセットで考えてるはずだよ
だから実際になんの意味がなくても呼び出すべきだし
セットで扱う前提で書かれているのが良いコード
0232デフォルトの名無しさん
2010/05/17(月) 04:39:30> スタックが巻き戻されて引数が対応するoperator deleteに同じ引数を渡して呼ばれる
そんな事実はない
0233デフォルトの名無しさん
2010/05/17(月) 07:04:470234デフォルトの名無しさん
2010/05/17(月) 09:10:390235デフォルトの名無しさん
2010/05/17(月) 09:27:30ここが間違ってんじゃない?
0236デフォルトの名無しさん
2010/05/17(月) 11:54:04便利だと思うのですが。
0237デフォルトの名無しさん
2010/05/17(月) 12:03:320238デフォルトの名無しさん
2010/05/17(月) 12:14:16過去の書き込みなので無理です・・・
考えられる使わない方がいい原因と言ったら、なにが挙がりますか?
0239デフォルトの名無しさん
2010/05/17(月) 12:18:29仕事のプログラムでdefineマクロで関数みたいのを作ってるソースコードを見たときは可読性下がるなと感じた。
defineマクロの中でreturnとかされてて読みづらかったわ。
0240237
2010/05/17(月) 12:23:02#define N 10
デバッガーでNの値が覗けるからintの方を使うとか、
#define MACRO(a) a+3
MACRO(3)*6
式を括弧でくくらないといけないという使い方。
#define MACRO(a) (a+3)
aを括弧でくくらないといけない例もあったと思うけど自分で考えて。
0241デフォルトの名無しさん
2010/05/17(月) 12:24:17#ifdefとかでフラグ的に使うものは別として、インライン関数で代用できるものは
きちんと型安全が保証されるインライン関数使えってことでは?
あと#ifdefもそれ自体が汚いと思わない?
0242デフォルトの名無しさん
2010/05/17(月) 13:24:53マクロでひとくくりにされてもよくわからんな。
どんなマクロ定義が便利だという話?
0244デフォルトの名無しさん
2010/05/17(月) 14:28:04使ったことあるけど、それが何か?
0245デフォルトの名無しさん
2010/05/17(月) 14:43:07使おうとも思わんが。
#define MACRO(a) ((a)+3)
↓
inline int macro(int a) { return a + 3; }
でいいだろ
0247デフォルトの名無しさん
2010/05/17(月) 14:49:540248デフォルトの名無しさん
2010/05/17(月) 14:55:39#define ErrorCheck(x) { if (!(x)) { printf("ERROR\n"); break; } }
void foo()
{
for(;;){
ErrorCheck( bar() );
}
}
0249デフォルトの名無しさん
2010/05/17(月) 14:59:24関数がどこまで実行されたのか分からないということがあって殺意を覚えたね。
0250デフォルトの名無しさん
2010/05/17(月) 15:23:03スタックトレースで関数たどるのが地獄なんだよ。
0251デフォルトの名無しさん
2010/05/17(月) 17:23:26よくテストされてるものを使うだけならすごく便利だが
マクロ満載のデバッグとかしたくないな
0252デフォルトの名無しさん
2010/05/17(月) 20:31:37fnc( string &s )とすると、 fnc( x.sunstr(10) );
が動かせないですが解決方法ありますか。
0253デフォルトの名無しさん
2010/05/17(月) 20:32:550254デフォルトの名無しさん
2010/05/17(月) 20:48:300255デフォルトの名無しさん
2010/05/17(月) 21:05:090256デフォルトの名無しさん
2010/05/17(月) 21:07:54x.sunstr(10)が参照で渡せないのは名前がついていない値「右辺値」だから。
現在のC++はconst参照で受けると、右辺値でも受け取れる仕様。
C++0xでは右辺値を参照で渡す構文も入ってくるらしい。
ちなみに、
fnc( const string &s)と
fnc( string const &s)は同じね。
0257デフォルトの名無しさん
2010/05/17(月) 22:22:39知ったか先生お願いします
0258デフォルトの名無しさん
2010/05/17(月) 22:40:42態度が気に入らないので教えない
0259デフォルトの名無しさん
2010/05/17(月) 23:59:03VB6アプリからVC++アプリをShell関数で呼び出してる。
VV6アプリとVC++アプリのEXEは同じサーバ、同じ場所に置いてる。
VB6アプリを直接実行した場合、VC++のアプリは正常に動くんだけど
WEBからVB6アプリを実行した場合、VC++アプリが正常に動作しない。
一応起動はするみたいなんだが、VC++アプリで定義してる
独自のライブラリ/インクルードファイルが上手くいってない感じ。
(独自定義の型使った宣言が入ってると落ちる)
VB6から直接実行した場合は正常に動作するけどWEB経由するとダメってのが理解できない
ライブラリとかインクルードファイルの環境設定がまずいなら
ビルドの時点でアウトだよな? そもそもVB6アプリからなら問題ないってのが…
こんなことあるの?
0260デフォルトの名無しさん
2010/05/18(火) 00:04:170261デフォルトの名無しさん
2010/05/18(火) 00:36:050262デフォルトの名無しさん
2010/05/18(火) 07:01:27左辺値→アドレスをとれる値
右辺値→アドレスをとれない値
0263デフォルトの名無しさん
2010/05/18(火) 11:42:36必要なヘッダファイルを自動で生成するって言うこと・
0264デフォルトの名無しさん
2010/05/18(火) 12:20:52プログラム歴は長いが、いままでコピペして対処していた。
どの部分が改良してある最新版が分からなくなり不便だった。個人用共通include作ったら便利になった。
0265デフォルトの名無しさん
2010/05/18(火) 14:20:320266デフォルトの名無しさん
2010/05/18(火) 14:37:520267デフォルトの名無しさん
2010/05/18(火) 19:07:300268デフォルトの名無しさん
2010/05/18(火) 19:11:160269デフォルトの名無しさん
2010/05/18(火) 19:12:07一覧はありますか
0270デフォルトの名無しさん
2010/05/18(火) 19:13:39_MSV_VER
とかが定義されてるとかで
0271デフォルトの名無しさん
2010/05/18(火) 19:13:54右辺値でもアドレスはとれるだろ
0272デフォルトの名無しさん
2010/05/18(火) 19:23:36http://psychlops.l.u-tokyo.ac.jp/?%B3%AB%C8%AF%A5%E1%A5%E2
MSVC
_MSC_VER
BCC
__BORLANDC__
CYGWIN
__CYGWIN__
GNUC
__GNUC__
intel c
__INTEL_COMPILER
Apple
__APPLE__
0273デフォルトの名無しさん
2010/05/18(火) 20:15:03それらの間でだけprivateメンバへのアクセスを許可したい
friendを使わずに実装する方法はあるだろうか?
0274デフォルトの名無しさん
2010/05/18(火) 20:28:480275デフォルトの名無しさん
2010/05/18(火) 21:55:160276デフォルトの名無しさん
2010/05/18(火) 22:39:14>>275は忘れて
0277デフォルトの名無しさん
2010/05/18(火) 22:43:07自分でもプロクシとかディスパッチとか色々考えたけど出来ないっすわ・・・
0278デフォルトの名無しさん
2010/05/18(火) 22:47:57これ、何でoperator deleteよばれないん?
0279デフォルトの名無しさん
2010/05/18(火) 22:58:57>>232
0280デフォルトの名無しさん
2010/05/18(火) 23:06:450281デフォルトの名無しさん
2010/05/18(火) 23:09:18プッwww
0282デフォルトの名無しさん
2010/05/18(火) 23:17:38http://www.kijineko.co.jp/tech/superstitions/memory-leak-at-dynamic-creation-fail.html
0283デフォルトの名無しさん
2010/05/18(火) 23:18:18ありがと。ものすごい勘違いしてたわ
placement deleteの場合、operator deleteの第2引数以降は、
placement newの第2引数以降と合わせないとダメなのね
ってことは、deleteするときにdelete対象オブジェクトのサイズって
operator deleteに渡されないの?
0284デフォルトの名無しさん
2010/05/18(火) 23:29:42うわっBCC5.5.1だとdelete呼ばれない
バグってる
0285デフォルトの名無しさん
2010/05/18(火) 23:38:340286デフォルトの名無しさん
2010/05/18(火) 23:45:19きっちり調べたわけじゃないからアレだけど追加引数があるとダメっぽいね
整数一つ分余計に確保してそこに入れておくとか
追加の引数に整数への参照を渡して保存しておくとか
工夫すればできなくもないと思うけど・・・
0287デフォルトの名無しさん
2010/05/19(水) 01:07:06実装非依存かつ標準C++で任意の型に対してアラインメントを揃えるにはどうすればいいの?
0288デフォルトの名無しさん
2010/05/19(水) 01:10:36BCじゃなくて?
0289デフォルトの名無しさん
2010/05/19(水) 01:26:35渡されません。
自動的に追加の引数を入れてくれるのは new 式の途中で呼ばれたコンストラクタから
例外が飛んだときだけ。
delete 式で呼ばれる operator delete () はポインタひとつあるいはポインタとサイズのふたつを
引数に取るものだけ。 (12.5. p5)
0290デフォルトの名無しさん
2010/05/19(水) 01:54:550291デフォルトの名無しさん
2010/05/19(水) 02:09:49標準の範囲ではどうしようもない。
まあ、バッファをdouble型あたりで取っておけば、大抵の処理系で動作するとは思うけど、
保証はないので、素直にboostとかを使うほうがいい。
ところでalinged_storageって0xに入るんだっけ?
0292デフォルトの名無しさん
2010/05/19(水) 07:42:33メモリを動的に確保する
0293デフォルトの名無しさん
2010/05/19(水) 08:02:03もともとMyClassのオブジェクトをnew MyClass;でつくって、
アドレスを保存しておいて明示的にMyClassのDestructorを呼び出す。
するとそのメモリ領域は確保されたまま何も乗っていない状態になるので、
そこで初めてplacement newで明示的にConstructorを発動すれば
はれてalignmentされた領域にplacement newできたことになる。
0294デフォルトの名無しさん
2010/05/19(水) 08:54:13これでアライメント取れてるよね
0295デフォルトの名無しさん
2010/05/19(水) 09:14:070296デフォルトの名無しさん
2010/05/19(水) 12:01:09iteratorを使用して降順で対象を探し目標を erase にて削除はできるのですが、
昇順で reverse_iterator を利用しての削除はどのように行えばよいでしょうか?
erase は reverse_iterator には対応してない様でした。
なにか参考になるサンプルなどをご紹介していただけますでしょうか・・・。
よろしくお願いいたします。
0297デフォルトの名無しさん
2010/05/19(水) 12:20:48>>129-130
Effective STL の28項あたりに詳しい
0298デフォルトの名無しさん
2010/05/19(水) 13:21:42レスありがとうございます、このように書き直してみましたがいかがでしょうか?
前提として _ite は reverse_iterator 型となっております。
//削除部分
vector<xxx>::iterator _tmpIte = xxx_vec->erase( _ite.base() );
_ite = vector<xxx>::reverse_iterator( _tmpIte );
添削をお願いいたします。
0299デフォルトの名無しさん
2010/05/19(水) 13:34:430300デフォルトの名無しさん
2010/05/19(水) 15:15:57その保証はない。
>>295
そもそもdoubleでバッファをとってもdouble境界にアライメントされる保証もない。
0301デフォルトの名無しさん
2010/05/19(水) 16:28:40変えれたとしてもそれは間違った使い方で、本当はcoutのクラスを作るのが
ふつうですよね?
以上の理解であってますか?
もし合っていましたらcoutのクラスを作る方法をおしえてください。
0302デフォルトの名無しさん
2010/05/19(水) 16:32:04ストリーム形式(型の静的多相性と動作)に互換があればそれぞれ自前で用意してもいいし、boostのasioなんかはその分かりやすい良い例になってる。
STLの範囲内だから適当にぐぐるよろし
0303デフォルトの名無しさん
2010/05/19(水) 16:33:080304デフォルトの名無しさん
2010/05/19(水) 16:44:13有難うございました。
0305デフォルトの名無しさん
2010/05/19(水) 17:54:31何を言っているのかわからん。
> 変えれたとしてもそれは間違った使い方で、本当はcoutのクラスを作るのが
coutのクラスってなんじゃい。
0306デフォルトの名無しさん
2010/05/19(水) 18:01:030307デフォルトの名無しさん
2010/05/19(水) 18:10:59次回起動時に読み込んでオブジェクトを復元したいんですが、これってぶっちゃけ一般解は無いですよね?
0308デフォルトの名無しさん
2010/05/19(水) 18:14:39その目的では
Boost.Serialization
っていうすげぇ良いのがあるぞ。
詳しくはBoost総合スレ part8
ttp://pc12.2ch.net/test/read.cgi/tech/1251446016/
に聞いてご覧。
0309デフォルトの名無しさん
2010/05/19(水) 18:18:04boostは使うのが困難。
こっちヘッダを生成して読み込むだけ。
自分でやること少なめ
0310デフォルトの名無しさん
2010/05/19(水) 19:00:170311デフォルトの名無しさん
2010/05/19(水) 19:01:16> 他人が作った非PODクラス(変更はできない)
か。そりゃ無理じゃねぇか。
やっぱり#define private publicが必要だな。
0312デフォルトの名無しさん
2010/05/19(水) 19:06:12これは最強魔法#define private publicの敗北であるといわざるを得ない
0313デフォルトの名無しさん
2010/05/19(水) 21:26:02いいサンプルコード集のダウンロード先や解説サイトないでしょうか?
0314デフォルトの名無しさん
2010/05/19(水) 21:35:21http://msdn.microsoft.com/ja-jp/library/se881ay9.aspx
0315デフォルトの名無しさん
2010/05/19(水) 22:17:42・・・・コンパイル出来ないからSDKもダウンロードしないと
0316デフォルトの名無しさん
2010/05/19(水) 22:20:44居たら絶対可愛いよ。軟体動物の中で最も高知能だし、まったり天然と見せかけて秀才キャラなのは誰の目から見ても明らか。
イカ娘の立場は存在しない。
0317デフォルトの名無しさん
2010/05/19(水) 22:24:130318デフォルトの名無しさん
2010/05/19(水) 22:26:15引数で参照やchar**使うより2倍メモリ使いますか。
関数内の一時領域と受け取り側で。
0319デフォルトの名無しさん
2010/05/19(水) 22:31:55とりあえずRVOでぐぐれ
0320デフォルトの名無しさん
2010/05/19(水) 22:34:24通常は戻り値最適化1(RVO)が行われるので一時オブジェクトは作成されず2倍消費することはない。
0321デフォルトの名無しさん
2010/05/19(水) 22:35:06むしろchar**の方がdereferenceのコストがひとつ多く発生するのでchar*の方が効率がいい。
どちらにせよ、クラスとポインタを同一で比べられるものではない。
ポインタ型だと編集や追加書き込みが発生しない場合に引数として受け取ったメモリ領域をそのまま返すという最適化もできるのだし、
事実std::stringもその様な最適化が既に施されているから素直にstd::stringを使えばいいと思うが。
0322デフォルトの名無しさん
2010/05/19(水) 22:35:110323デフォルトの名無しさん
2010/05/19(水) 22:37:440324デフォルトの名無しさん
2010/05/19(水) 22:40:480325デフォルトの名無しさん
2010/05/19(水) 22:45:12http://www.nicovideo.jp/watch/sm6040129
0326デフォルトの名無しさん
2010/05/19(水) 23:15:49それぞれ別な問題として論じられる人が、
いないときは悲しいほど誰もいないのな
0327デフォルトの名無しさん
2010/05/19(水) 23:45:08RVOは最適化なので必ず適用されるとは限らない。
moveは右辺値参照をサポートしていれば必ず適用される。
0328デフォルトの名無しさん
2010/05/20(木) 03:18:31まあね
0329デフォルトの名無しさん
2010/05/20(木) 11:38:190330デフォルトの名無しさん
2010/05/20(木) 12:26:110331デフォルトの名無しさん
2010/05/20(木) 12:34:480332デフォルトの名無しさん
2010/05/20(木) 12:38:36Rubyならこれだけで済むのに…
C++糞すぎだろ
0333デフォルトの名無しさん
2010/05/20(木) 12:47:13C++ でも std::string("a.b.c.d").rfind(".") と書けるわけで、そんなに違わない。
逆に C++ なら >>330 で済むのに…オブジェクトの生成が必須になるRuby糞すぎ、
という立場もあるかもしれない。
0334デフォルトの名無しさん
2010/05/20(木) 13:01:420335デフォルトの名無しさん
2010/05/20(木) 14:26:14C++が凄すぎるんだよ。
0336デフォルトの名無しさん
2010/05/20(木) 14:37:52これって真?偽?
0337デフォルトの名無しさん
2010/05/20(木) 15:20:09C++規格としては真でも偽でもありません。
0338デフォルトの名無しさん
2010/05/20(木) 15:20:440339デフォルトの名無しさん
2010/05/20(木) 15:55:37どうやら複合型のアラインメントはメンバのなかで最大のアラインメントを持ってるやつと同じになるらしい
ってことは再帰的に考えて組み込み型のどれかと同じになるってことだよね
ただvtableとかについては書いてなかったからそのへんが気になる
0340デフォルトの名無しさん
2010/05/20(木) 16:11:04class x { char a; virtual ~x() {} };
は1バイトアラインになるわけですね。
0341デフォルトの名無しさん
2010/05/20(木) 16:11:47参照をリセットした上で、今のリセットによってオブジェクトが解体されたかを知るすべはないのでしょうか?
resetが参照をやめるのに使えるのですが、返り値がvoidのため、解体されたのかはわからないようです。
0342デフォルトの名無しさん
2010/05/20(木) 16:14:00その手間を減らすだけで、shared_ptrでしか出来ないことはないでしょ。
0343デフォルトの名無しさん
2010/05/20(木) 16:15:160344デフォルトの名無しさん
2010/05/20(木) 16:53:37規格で決まってるんだ?知らなかった。
「複合型」ってもしかして非PODなクラスは含まないのかな?
定義調べるのメンドクサ。ははは
0345デフォルトの名無しさん
2010/05/20(木) 17:29:36いや規格ではどうかわからん
0346デフォルトの名無しさん
2010/05/20(木) 18:41:560347デフォルトの名無しさん
2010/05/20(木) 19:05:550348デフォルトの名無しさん
2010/05/20(木) 20:14:43自明じゃないけど、論理追っていくと自然とそうなる
0349デフォルトの名無しさん
2010/05/20(木) 20:33:57fopenと互換の長いファイル名に対応した関数はないですか?
0350デフォルトの名無しさん
2010/05/20(木) 20:46:04_wfsopenは長いファイル名に対応していました。
0351デフォルトの名無しさん
2010/05/20(木) 20:59:22パスをロング用から元に戻していた。
\\?\付きのパス名です。
CreateFileはどのコンパイラでも\\?\対応だけど。
これ使うと、fopenとの互換性を保つのが一苦労。
既に作ってあるやつないですか。
0352デフォルトの名無しさん
2010/05/20(木) 21:01:51全関数を対応されるのは困難で
CreateFileを自作関数で呼び出すけど、FILE*型をリターンして
read writeやシークは既存関数を使いたいのですが。
0353デフォルトの名無しさん
2010/05/20(木) 21:11:47ハンドルなんて所詮void*だろ
0354デフォルトの名無しさん
2010/05/20(木) 21:30:37継承したクラスの型を知りたいのですがこんな場合可能でしょうか?
class Base{}
class Parent : public Base{}
class Child : pubic Parent{}
class Other : Base{}
Parent* p = new Child();
Base* b = p;
このとき b から Parentを取得できるかどうかってのが質問なのです。
typeid(b).name()やtypeid(*b).name()ではBase*かChildかどうかはわかりますが
Parentがわからなくて・・・
よろしくお願いします。
0355デフォルトの名無しさん
2010/05/20(木) 21:37:24typeidでは継承の関係は判別できない。
bからParentを取得するにはstaic_castまたはdynamic_castを使う
dynamic_castは仮想デストラクタが必要
0356デフォルトの名無しさん
2010/05/20(木) 21:38:090357デフォルトの名無しさん
2010/05/20(木) 21:53:25あーそうでしたか。ありがとうございます。
画面遷移でif文を使わずに基底クラス型に突っ込んで
中のオブジェクトの型で遷移するかどうかを判定したかったんですが
画面にも階層があるので中間的なクラスを判定に使いたくてできるかどうか
質問しました。
こんな感じです。
nowState = new Child();
while(nextがParentの派生クラスなら継続※←ここが問題){
Base* next = getNext(); //getNextはBase*で返すが中身はChild型またはOther型
}
0358デフォルトの名無しさん
2010/05/20(木) 21:57:33ちなみにこれって不可能な考え方でしょうか?
0359デフォルトの名無しさん
2010/05/20(木) 21:59:33while(dynamic_cast<Parent*>(next))
でいいんじゃないの
0360デフォルトの名無しさん
2010/05/20(木) 22:08:20おおお、いけました。ありがとうございます。
dynamic_castってこういう使い方ができるのですね(使ったことがなかった。。)
0361デフォルトの名無しさん
2010/05/20(木) 22:17:52shared_ptr::unique()では役に立たない?
0362デフォルトの名無しさん
2010/05/20(木) 22:57:15自分しか所有してないからreset()すれば解体されるって感じか
そもそもshared_ptrが適してるのかねその設計
0363デフォルトの名無しさん
2010/05/20(木) 23:09:53weak_ptrつくってexpired()かな
>>362
自分で管理したいなら最初から自分で管理しろって話だよな
0364デフォルトの名無しさん
2010/05/20(木) 23:10:09http://msdn.microsoft.com/ja-jp/library/bdts1c9x.aspx
http://msdn.microsoft.com/ja-jp/library/dye30d82.aspx
0365デフォルトの名無しさん
2010/05/20(木) 23:21:31うっへりする現実を見た
http://d.hatena.ne.jp/nagoya313/20100520
0366デフォルトの名無しさん
2010/05/21(金) 00:04:30const教徒はムーブコンストラクタがconst付きの物をぶち壊してくれた方が嬉しいのか
変なの
0367デフォルトの名無しさん
2010/05/21(金) 09:54:35そう?
>>365のinitHoge2の戻り値はconstじゃないんだから
この結果は変だと思いますけどね。これで規格通りなの?
0368367
2010/05/21(金) 09:57:170369デフォルトの名無しさん
2010/05/21(金) 10:42:28お返事ありがとうございます。
>>361
それぞれのスレッドで
if (p->unique())
{
//特別な処理
}
p = shared_ptr<hoge>();
こんな感じにするわけですが、スレッドだと排他処理を別途書かない限り、両方でuniqueがFALSE返すことがありえますので無理かと。
>>362
適しているのかはわかりません。
現状では自前の参照カウントでやっています。
やろうとしていることがshared_ptrでも可能だったら、そちらのほうがベターだとと思ったしだいです。
>>363
weak_ptrを使ったとしても
スレッドA weak_ptr作成
スレッドB weak_ptr作成
スレッドA shared_ptr解放
スレッドB shared_ptr解放
スレッドA weak_ptr::expired()
スレッドB weak_ptr::expired()
と動作した場合、双方で「俺が消した」ことになってしまいます。
shared_ptrでの解放処理と、参照カウントの取得は、スレッド不可分でなければ成り立たないかと思います。
0370デフォルトの名無しさん
2010/05/21(金) 11:16:08質問者じゃないが、そんなものあったのか…
fopen_sにしたら、エクセルで編集中のCSVファイルを開けなくなったので困ってたんだ
fopenの時は、共有モードなんてガン無視してたんかな。_sになって厳密になったのに、共有モードを指定する方法が無いからエラーになってた。
>>364の使えば問題回避できるわ
0371デフォルトの名無しさん
2010/05/21(金) 11:51:27サンク。長いファイル名と既存のC言語関数が使えるようになりました。
#include<windows.h>
#include<io.h>
#include<stdio.h>
iint main(){
HANDLE hd=
CreateFileA( "\\\\\.\\C:\\sample.txt", GENERIC_WRITE , FILE_SHARE_READ , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
FILE *fp=_fdopen( _open_osfhandle ( (int)hd, 0 ), "w+" );
char ch[]="test desu.";
fwrite(ch, 1, strlen(ch), fp);
fclose(fp);
}
0372デフォルトの名無しさん
2010/05/21(金) 12:35:040373デフォルトの名無しさん
2010/05/21(金) 12:56:00デリータ渡しとけ。
しかしスレッド対応とか、そんな重要な情報を後出しするなよ…
0374デフォルトの名無しさん
2010/05/21(金) 13:17:05#include<windows.h>
#include<io.h>
#include<stdio.h>
#include<string>
FILE* wfopen (std::wstring fname, std::wstring opt) {
int flg, att;
std::wstring fn(1<<15, L'\0');
int n=GetFullPathNameW( &fname[0], 1<<15, &fn[0], NULL);
fn.resize(n);
if( memcmp( &fn[0], L"\\\\\?\\", 8)!=0) fn = L"\\\\\?\\" + fn;
att = GetFileAttributesW(&fn[0]);
if(att==-1) { if( opt[0]==L'r' ) return NULL; else att=0; }
if(opt[0]==L'a' || opt[0]==L'r' ) flg=OPEN_ALWAYS; else flg=CREATE_ALWAYS;
HANDLE hd=CreateFileW( &fn[0], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ , NULL , flg , att , NULL);
FILE *fp=_wfdopen( _open_osfhandle ( (int)hd, 0 ), &opt[0] );
return fp; }
static std::wstring char2wchar(std::string x){
int m=x.size(); if(m<=0)return 0;
std::wstring y(m, L'\0');
m=MultiByteToWideChar(CP_ACP, 0, &x[0], m, &y[0], m);
y.resize(m); return y;}
FILE* wfopen (std::string fn, std::string opt) { return wfopen( char2wchar(fn), char2wchar(opt) ); }
int main(){
FILE* fp = wfopen(L"c:/test.txt", L"wb");
char ch[]="This is a pen.";fwrite(ch,1,strlen(ch),fp);
fclose(fp); }
0375デフォルトの名無しさん
2010/05/21(金) 14:09:19ほんとにすいません。
自分の質問読み返して、スレッドだって書いてなくて愕然としました。
本当に申し訳ないです。
書いた後に、文章整理している段階で消してしまったようです。
デリータを渡しても、どちらのスレッドで解放されたかで処理をわけるのはできなくないでしょうか?
スレッドIDを見て、それで処理分けといった感じでしょうか?
0376デフォルトの名無しさん
2010/05/21(金) 14:15:12全手動でやれよ。
0377374
2010/05/21(金) 14:18:43これ自分で作るしかないな
0378デフォルトの名無しさん
2010/05/21(金) 14:21:20こういうことができるってことはデフォルト引数の抽出も出きると思うんですけど、いったいどうやってるんでしょうか?
0379デフォルトの名無しさん
2010/05/21(金) 15:20:42デリータ渡しても無理だと思う。
resetの特別版を実装したshared_ptrもどきを作るのが
一番簡単そう。
0380デフォルトの名無しさん
2010/05/21(金) 15:32:39超適当に書いたけど、デリータ受けるロジックはたしかこんな感じ。
http://codepad.org/a42WpiAY
0381374
2010/05/21(金) 15:49:59std::wstring fullpath( std::wstring path){
unsigned int n;
if( memcmp( &path[0], L"\\\\\?\\", 8)!=0 ) {
if( (int)path.find(L":")!=-1) path=L"\\\\\?\\"+path;
else {
std::wstring root;
n=(1<<15); root.resize(n); n=GetCurrentDirectoryW(n, &root[0]); root.resize(n);
path = L"\\\\\?\\"+root + L"/" + path; } }
for( n=0; n<path.size(); n++ ) {
if( path[n]<32 ) { path[n]=L'_'; continue; }
if( path[n]==L'/' ) path[n]=L'\\';
}
return path; }
FILE* wfopen (std::wstring fname, std::wstring opt) {
int flg, att;
std::wstring fn=fullpath( fname );
att = GetFileAttributesW(&fn[0]);
if(att==-1) { if( opt[0]==L'r' ) return NULL; else att=0; }
if(opt[0]==L'a' || opt[0]==L'r' ) flg=OPEN_ALWAYS; else flg=CREATE_ALWAYS;
HANDLE hd=CreateFileW( &fn[0], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ , NULL , flg , att , NULL);
return _wfdopen( _open_osfhandle ( (int)hd, 0 ), &opt[0] ); }
FILE* wfopen (std::string fn, std::string opt) { return wfopen( char2wchar(fn), char2wchar(opt) ); }
0382デフォルトの名無しさん
2010/05/21(金) 16:07:57codepadだと通るけどg++だと通らないですね
もしやと思って最初に書いたコードもg++でやってみたら通りませんでしたorz
すいませんcodepadが特殊だっただけ(?)みたいです
0383デフォルトの名無しさん
2010/05/21(金) 18:39:11L"\\\\\?\\"
間違ってるぞ。\がひとつ多い
APIと違って hoge/../hoge/../
といったかけあがりパスなどを解決してくれないのもマイナス
0384374
2010/05/21(金) 18:49:40手持ちに主にURLを一意化する関数ある。
手順掛かるけど。ファイルも可能。区切りが/だけど。
カレントディレクトリで無い場合も、rootにセットしたらできる。
std::wstring abspath(std::wstring path, std::wstring root){
cout<< wchar2char(path) <<endl;
unsigned int n, k;
if( (int)path.find(L":")==-1) {
if(root==L""){ n=(1<<15); root.resize(n); n=GetCurrentDirectoryW(n, &root[0]); root.resize(n); }
path = root + L"/" + path; }
n=path.find(L"\\\\\?\\"); if(n==0) path=path.substr(4);
std::vector<std::wstring> word;
std::wstring s = L"";
unsigned short int x;
for( n=0; n<path.size(); n++ ) {
x=path[n]; if( x<32 ) continue;
if( x!=L'\\' && x!=L'/' ) { s+=path[n]; continue; }
if( s.size()!=0 ){ word.push_back(s); s.resize(0); }
}
if( s.size()!=0 ) word.push_back(s);
std::vector<std::wstring> abs;
for(n=0; n<word.size(); n++) {
if (word[n]==L".") continue;
if (word[n]==L"..") { k=abs.size(); if(k>0)abs.resize(k-1); continue; }
abs.push_back(word[n]); }
path=L"";
for(n=0; n<abs.size(); n++) path+=abs[n]+L'/';
k=path.size();
if(k>0) path.resize(k-1);
return path; }
0385デフォルトの名無しさん
2010/05/21(金) 20:05:370386374
2010/05/21(金) 22:08:55#include<windows.h>
#include<io.h>
#include<stdio.h>
#include<string>
std::wstring fullpath( std::wstring fname){
unsigned int n;
std::wstring fn;
for( n=0; n<fname.size(); n++ ) if( fname[n] >= 32 ) fn+=fname[n];
fname=fn;
fn.resize(1<<15);
n=GetFullPathNameW( &fname[0], 1<<15, &fn[0], NULL);
fn.resize(n);
if( fn.substr(0,4) != L"\\\\?\\" ) fn=L"\\\\?\\" + fn;
return fn; }
FILE* wfopen (std::wstring fname, std::wstring opt) {
int flg, att;
std::wstring fn=fullpath( fname );
att = GetFileAttributesW(&fn[0]);
if(att==-1) { if( opt[0]==L'r' ) return NULL; else att=0; }
if(opt[0]==L'a' || opt[0]==L'r' ) flg=OPEN_ALWAYS; else flg=CREATE_ALWAYS;
HANDLE hd=CreateFileW( &fn[0], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ , NULL , flg , att , NULL);
return _wfdopen( _open_osfhandle ( (intptr_t)hd, 0 ), &opt[0] ); }
int main(){
FILE* fp = wfopen(L"c:/aaa/../test.txt", L"wb");
char ch[]="This is a pen.";
fwrite(ch,1,strlen(ch),fp);
fclose(fp); }
0387374
2010/05/21(金) 22:19:56255文字以上のパスや、\\?\付きのパスを読み込む
fopen、 _wfopen互換関数です。
349 名前:デフォルトの名無しさん[sage] 投稿日:2010/05/20(木) 20:33:57
fopen と _wfopenは長いファイル名に対応していないんですが。
fopenと互換の長いファイル名に対応した関数はないですか?
0388デフォルトの名無しさん
2010/05/21(金) 23:54:050-31はエンコードによらず制御コードしか入らない気がしてたけど。
0389デフォルトの名無しさん
2010/05/22(土) 00:02:290390デフォルトの名無しさん
2010/05/22(土) 01:05:32Windowsなのにパスデリミタに / 使うバカって一体なんなの?
0391デフォルトの名無しさん
2010/05/22(土) 01:09:38\\?\c:/aaa/../test.txtをそのままCreateFileWに渡すとエラーになるから
その変換がいる。\より手順が多い。
0392デフォルトの名無しさん
2010/05/22(土) 01:11:10などでも通る必要ある。
試してはいない。
0393デフォルトの名無しさん
2010/05/22(土) 01:19:52APIリファレンスに書いてないことしちゃいかんだろ。誰が保証するんだ。
ある日パッチ当てたら「動かなくなりました」でマイクロソフトのせいにする気か?
0394デフォルトの名無しさん
2010/05/22(土) 01:22:55\で無いと通らないことも確かめてある。
0395デフォルトの名無しさん
2010/05/22(土) 01:42:24MDSN Libraryのwfopenの仕様に / が使えますって書いてあったのか?
書いてないなら使うな。wfopenがリファクタリングついでに実装変えたらどうするよ
0396デフォルトの名無しさん
2010/05/22(土) 02:15:020397デフォルトの名無しさん
2010/05/22(土) 02:16:24コード
FILE* wfopen (std::wstring fname, std::wstring opt) {
int flg, att;
std::wstring fn=fullpath( fname );
att = GetFileAttributesW(&fn[0]);
if(att==-1) { if( opt[0]==L'r' ) return NULL; else att=0; }
if(opt[0]==L'a' || opt[0]==L'r' ) flg=OPEN_ALWAYS; else flg=CREATE_ALWAYS;
HANDLE hd=CreateFileW( &fn[0], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ , NULL , flg , att , NULL);
return _wfdopen( _open_osfhandle ( (intptr_t)hd, 0 ), &opt[0] ); }
0398349=374
2010/05/22(土) 02:19:03wfopenという新規の関数をつくったというわけ。
普通のヘッダにwfopenという関数は入っていない。
0399デフォルトの名無しさん
2010/05/22(土) 02:25:00>>394
>APIに渡す前に\に変換しているわけだが・・・
一体どこで変換してんだよwww
0400デフォルトの名無しさん
2010/05/22(土) 02:38:270401デフォルトの名無しさん
2010/05/22(土) 02:59:310402デフォルトの名無しさん
2010/05/22(土) 05:05:22なんかもう要求仕様が>>341と全然違うようだけど、本当に想定してるシナリオはどんなのなんだ。
何かの時に使うかも試練。
0404デフォルトの名無しさん
2010/05/22(土) 09:36:19いくつかの関数はマルチバイト版しか無いし、なんでこんなやる気無いんだろ。
0405デフォルトの名無しさん
2010/05/22(土) 12:29:320406デフォルトの名無しさん
2010/05/22(土) 12:41:560407デフォルトの名無しさん
2010/05/22(土) 12:56:14C++学園の人々でも読んどけ。
0408デフォルトの名無しさん
2010/05/22(土) 13:01:04C++ 0xって何が凄いの?
0409デフォルトの名無しさん
2010/05/22(土) 13:01:390410デフォルトの名無しさん
2010/05/22(土) 13:20:18linuxがUTF8とEUCをスタンダードにしているからだろ。
あえてwchar_t関数を用意する必要がない。
文字の取り扱いが不便だけど、UTF8もEUCを1バイト単位だから。
0411デフォルトの名無しさん
2010/05/22(土) 13:24:56凄いと思うかどうかなんて人によるだろ
主観混じりの言葉に踊らされてないで自分で調べろよ
0412デフォルトの名無しさん
2010/05/22(土) 13:44:260413デフォルトの名無しさん
2010/05/22(土) 13:53:590414デフォルトの名無しさん
2010/05/22(土) 14:00:23wchar_tなんてサイズが処理系定義だし
0415デフォルトの名無しさん
2010/05/22(土) 14:07:02m9(^Д^)プギャー
0416デフォルトの名無しさん
2010/05/22(土) 14:23:10キッチリ対応しようとするとややこしい
BMPでもヒドイことになってるしなあ
0417デフォルトの名無しさん
2010/05/22(土) 15:31:36STL動作するようにビルドしてほしいです。
boostも出来たらしてほしいです。
http://bellard.org/tcc/
0418デフォルトの名無しさん
2010/05/22(土) 15:32:270419デフォルトの名無しさん
2010/05/22(土) 15:39:13たとえば、待ち時間が一回6秒違えば、10回で一分。600回で1時間変わります。
ちりも積もればで作業時間が短縮できます。
なのでビルドしてほしいです。
Compilation Speed
TinyCC 2.27s
GCC 20.0s
0420デフォルトの名無しさん
2010/05/22(土) 15:42:460421デフォルトの名無しさん
2010/05/22(土) 15:46:56C++動かないならいらないや
0422デフォルトの名無しさん
2010/05/22(土) 15:52:370423デフォルトの名無しさん
2010/05/22(土) 16:09:12許さない! 絶対にだ!!
0424デフォルトの名無しさん
2010/05/22(土) 16:09:44いつも漫画読んでるわ
0425デフォルトの名無しさん
2010/05/22(土) 16:13:34自作中のコンパイル時間を短くするために爆速コンパイラをみつけたいです。
0426デフォルトの名無しさん
2010/05/22(土) 16:16:330427デフォルトの名無しさん
2010/05/22(土) 16:19:290428デフォルトの名無しさん
2010/05/22(土) 16:21:490429デフォルトの名無しさん
2010/05/22(土) 16:32:030430デフォルトの名無しさん
2010/05/22(土) 16:32:41コンパイル時間の短縮を考えるよりも、
APIリファレンスを丁寧に読むとかロジックを慎重に考えるとかしてバグの作りこみを減らすほうが
ずっと効率的だと思うが。
0431デフォルトの名無しさん
2010/05/22(土) 16:37:010432デフォルトの名無しさん
2010/05/22(土) 18:30:070433デフォルトの名無しさん
2010/05/22(土) 19:01:220434デフォルトの名無しさん
2010/05/22(土) 19:30:410435デフォルトの名無しさん
2010/05/22(土) 19:35:20それはありだと思うよ。
STLにdequeがあるのに、あえてstackもあるのはそういう意味だと思うよ。
0436デフォルトの名無しさん
2010/05/22(土) 20:35:48C++→アプリ作成用
という感じで棲み分けが進みそう
0437デフォルトの名無しさん
2010/05/22(土) 21:17:540438デフォルトの名無しさん
2010/05/22(土) 21:21:05C++ 組み込みからWinアプリまで何でもござれ。
C# 客先仕様Winアプリ
こんな感じか。
0439デフォルトの名無しさん
2010/05/22(土) 21:22:25C#がぴったりなのかもしれんなあ
開発コストやスピードが半端なく安くて速いし
0440デフォルトの名無しさん
2010/05/22(土) 21:40:440441デフォルトの名無しさん
2010/05/22(土) 21:43:52Pythonは追加ソフトが必要。
C#は特にコンパイラ入れなくてもwindowsディレクトリに入っているかも知れないほど
身近な物
0442デフォルトの名無しさん
2010/05/22(土) 22:03:080443デフォルトの名無しさん
2010/05/22(土) 22:16:10{
class Boo
{
bbb::Foo foo; // 定義がない
};
}
namespace bbb
{
class Foo{};
}
この状態を前方宣言で解決できるでしょうか?
0444デフォルトの名無しさん
2010/05/22(土) 22:21:040445デフォルトの名無しさん
2010/05/22(土) 22:21:17{
class Boo
{
bbb::Foo* foo; // 定義がない
};
}
namespace bbb
{
class Foo{};
}
こうだった。
0446デフォルトの名無しさん
2010/05/22(土) 22:22:03{
class Foo;
}
namespace aaa
{
}
0447デフォルトの名無しさん
2010/05/22(土) 22:33:19C#も.netランタイム入れなきゃならないけどね。
pythonで書かれたsvnクライアントインストールしたときはインストーラひとつで済んだけど。
>>440
最近のC#はジェネリックスもサポートしたしそれなりに使えるよ。でもtypedefとconstが無いのには泣かされるけどな。C++の代わりにはならないか。
>>439
フルタイムで働くC++エンジニア育てるのはメリット大きいけど結構大変なのはあるね。
0448デフォルトの名無しさん
2010/05/22(土) 22:34:25解決方法わかりますか
0449デフォルトの名無しさん
2010/05/22(土) 22:39:30FILE*経由するのをやめることにした。
0450デフォルトの名無しさん
2010/05/22(土) 22:42:22きわめて安全に使えるファイル操作ライブラリないですか。
36767文字のパスが読み込めて、装備も良いやつです。
0451448
2010/05/22(土) 23:45:16int main(){
wstring fn=L"aaaa";
int n;
HANDLE hd=CreateFileW( fn.c_str() , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_ALWAYS , 0 , NULL);
FILE* fp=_wfdopen( _open_osfhandle ( (intptr_t)hd, 0 ), L"r" );
fseek(fp,0,SEEK_END);
n=ftell(fp);
cout<<n<<endl;
fseek(fp,0,SEEK_SET);
string s( n,'\0' );
n=fread(&s[0],1,n,fp);
fclose(fp);
cout<<n<<endl;
return 1; }
0452デフォルトの名無しさん
2010/05/22(土) 23:47:44http://homepage1.nifty.com/herumi/prog/gcc-and-vc.html#LARGE_FILE
0453448
2010/05/22(土) 23:54:23サイズは100K以下ですが失敗します。
0454デフォルトの名無しさん
2010/05/22(土) 23:56:110455448
2010/05/22(土) 23:59:51出力。
3256 実
2974 読み込み
#include <windows.h>
#include <string>
#include <iostream>
#include<io.h>
using namespace std;
int main(){
wstring fn=L"aaaa";
int n;
HANDLE hd=CreateFileW( fn.c_str() , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_ALWAYS , 0 , NULL);
FILE* fp=_wfdopen( _open_osfhandle ( (intptr_t)hd, 0 ), L"rb" );
fseek(fp,0,SEEK_END);
n=ftell(fp);
cout<<n<<endl;
fseek(fp,0,SEEK_SET);
string s( n,'\0' );
n=fread(&s[0],1,n,fp);
fclose(fp);
cout<<n<<endl;
return 1; }
0456デフォルトの名無しさん
2010/05/23(日) 00:03:060457デフォルトの名無しさん
2010/05/23(日) 00:14:19経験上、俺は標準ライブラリのシークは信用してない。
0458デフォルトの名無しさん
2010/05/23(日) 00:14:320459デフォルトの名無しさん
2010/05/23(日) 00:21:010460デフォルトの名無しさん
2010/05/23(日) 00:23:00全関数を作らなければならなさそうでそれならfstreamに合わせた方が楽なので。
0461デフォルトの名無しさん
2010/05/23(日) 00:44:24LP64/LLP64であぼーん
0462デフォルトの名無しさん
2010/05/23(日) 00:44:32単に君が CRLF ←→LF 変換を理解してないだけでは
0463デフォルトの名無しさん
2010/05/23(日) 00:53:26seekなどしなくても、途中までしか読み取れないんだが。
実サイズ1M以下で値は知っているとして、これで失敗するんだ。
int main(){
wstring fn=L"aaaa";
int n;
HANDLE hd=CreateFileW( fn.c_str() , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_ALWAYS , 0 , NULL);
FILE* fp=_wfdopen( _open_osfhandle ( (intptr_t)hd, 0 ), L"rb" );
string s( 1<<20, '\0' );
n=fread( &s[0], 1, 1<<20, fp );
fclose(fp);
cout<<n<<endl;
return 1; }
0464デフォルトの名無しさん
2010/05/23(日) 01:00:55バイナリモードでもはまることがあってな。
0465デフォルトの名無しさん
2010/05/23(日) 01:10:43俺のVisual C++ 9の環境では正しく動いた。
0466デフォルトの名無しさん
2010/05/23(日) 04:34:04その例だったら目で追えるでしょ。
freadで読んだ中身を1byteずつ表示してみて、aaaaの中身をバイナリエディタで見て比較したら、どうなってるかはっきりしない?
0467デフォルトの名無しさん
2010/05/23(日) 07:24:180468デフォルトの名無しさん
2010/05/23(日) 13:24:464G以上、32767文字までのパスを扱える部分だけ
拡張出来ればいいのだが。
すでに作ってあるやつ無いの?
0469デフォルトの名無しさん
2010/05/23(日) 13:28:560470デフォルトの名無しさん
2010/05/23(日) 13:32:154Gと長いパス使える完成がほしいです。
自分で作ってるけど手間掛かる。バグってる。
0471デフォルトの名無しさん
2010/05/23(日) 13:45:560472デフォルトの名無しさん
2010/05/23(日) 14:08:09手持ちのVC6で正常と思われる動作をしたよ。
ホントに抜粋じゃなくて>>455のコードだけでおかしくなるの?
それならPCが壊れてるんじゃあ…
0473デフォルトの名無しさん
2010/05/23(日) 15:43:310474デフォルトの名無しさん
2010/05/23(日) 16:18:210475デフォルトの名無しさん
2010/05/23(日) 16:25:45| | | |
| |__| |
/ 一 ー\ 人人人人人人人人人人人人人人人人人人人人
/ (・) (・) | < テストコードのテストコードがバグってたら >
| ○ | < どうすればいいの? >
\__ ─ __ノ YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
0476デフォルトの名無しさん
2010/05/23(日) 16:30:48プログラマの頭脳もバグってるからやってらんない
0477デフォルトの名無しさん
2010/05/23(日) 17:35:28fp<< と fp>> は未対応。
人柱求む。
getline fwrite fread がちゃんと動けばいいんだけど。
http://kineko.dyndns.org/~touhou/up/source/up5256.txt
http://kineko.dyndns.org/~touhou/up/source/up5255.txt
0478デフォルトの名無しさん
2010/05/23(日) 17:45:19Read WriteはこれだけでAPIいらず目指します。
0479デフォルトの名無しさん
2010/05/23(日) 17:47:20iostream側じゃなくてstreambuf側を何とかするのが普通じゃないか
0480デフォルトの名無しさん
2010/05/23(日) 17:54:17テストも自分でやれよ
0481デフォルトの名無しさん
2010/05/23(日) 19:07:08a=b*c;
となっていると、bはthisポインタで使うことができて、cは引数で持ってくると思うのですが、
b*cの値をaに入れるにはreturnを使うしかないのでしょうか?
0482デフォルトの名無しさん
2010/05/23(日) 19:08:130483デフォルトの名無しさん
2010/05/23(日) 19:09:470484デフォルトの名無しさん
2010/05/23(日) 19:13:500485デフォルトの名無しさん
2010/05/23(日) 19:17:35a::operator=(b){ ... }
でいいんだろ?
0486デフォルトの名無しさん
2010/05/23(日) 19:18:060487デフォルトの名無しさん
2010/05/23(日) 19:18:10A a; a = b*c; なら代入演算子が動く
両方とも実装すればいい
デフォルトで問題ないなら実装は不要だが
0488デフォルトの名無しさん
2010/05/23(日) 19:18:43>>485
ああ、なんかそんな気がします。ちょっと考えてみます。
ありがとうございました
0489デフォルトの名無しさん
2010/05/23(日) 19:21:09operator *でreturn *thisはダメだろ
0490デフォルトの名無しさん
2010/05/23(日) 19:21:500491デフォルトの名無しさん
2010/05/23(日) 19:22:330492デフォルトの名無しさん
2010/05/23(日) 19:28:30もう一方もそれで実装できる
friend A operator*(const A& a, const A& b) {
A c = a;
return c *= b;
}
A& operator*=(const A& b) {
A c = *this * b;
return *this = c;
}
これ定石な
まあ、処理に無駄が多い事もあるけど
実装の手間は小さい
もちろん、どちらか一方はちゃんと実装するんだぞ
0493477
2010/05/23(日) 19:31:41#include <fstream>
/*
#include "fwstream.h"
#define fstream fwstream
*/
0494デフォルトの名無しさん
2010/05/23(日) 20:10:57#if 0 でコメント化するのが楽
0495デフォルトの名無しさん
2010/05/23(日) 20:37:44サンクス
fp>>str; fp<<str;;のやり方調べたけどわからんかった。
メンバ関数なら出来るけど互換性が無くなるんだよな。
0496デフォルトの名無しさん
2010/05/23(日) 20:41:00fstreamが入出力を受け付けている型を全部書くしかないかなあ。
0497デフォルトの名無しさん
2010/05/23(日) 20:41:03friendでoperator<<をオーバーロードするのくらい基本だろ?
まあそもそもstreambufの方を弄る方が正道だが
0498デフォルトの名無しさん
2010/05/23(日) 20:43:35テンプレートで任意の型を受け取って、ssacnf sprintfのC++版使えばいいか。
できそうな気はしてきたけど。
0499デフォルトの名無しさん
2010/05/23(日) 20:48:18ttp://www.kab-studio.biz/Programing/Codian/iostream/08.html
0500デフォルトの名無しさん
2010/05/23(日) 21:01:000501デフォルトの名無しさん
2010/05/23(日) 21:03:210502デフォルトの名無しさん
2010/05/23(日) 22:47:38MessageBoxで、いちいち、wsprintfとかで整形して出すのがめんどくさかったので
msgbox << _T("ハンドル: ") << std::hex << hwnd << std::endl;
って出来るようにした
調子に乗って、エディットコントロールも
edit << _T("なんとか") << std::endl;
edit >> text;
見たいな感じで扱えるようにしようと思ったら
バッファとエディットコントロールの関係をどうすんのかとか
入力ってどのタイミングでバッファにコピーすればいいの?とか色々わけが判らなくなって挫折中...
0503デフォルトの名無しさん
2010/05/23(日) 22:53:290504デフォルトの名無しさん
2010/05/23(日) 22:56:480505デフォルトの名無しさん
2010/05/23(日) 23:10:06ありがとう
メッセージボックスは出来たんだ
エディットコントロールの場合、ユーザーが入力した内容とバッファの同期をどうするのかとか
一行のエディットコントロールと複数行のエディットコントロールで、バッファのフラッシュをどう制御するのかとか
そう言った所で悩み中
>>504
入門サイトのcinとかcoutを使えよってのを見てただけの時はそう思った
basic_streambufをカスタマイズして見たら納得した
0506デフォルトの名無しさん
2010/05/24(月) 00:02:51演算子のオーバーロードを乱用するとこんな糞になりますって言いたかったんだよ。
0507デフォルトの名無しさん
2010/05/24(月) 00:34:250508デフォルトの名無しさん
2010/05/24(月) 00:38:210509デフォルトの名無しさん
2010/05/24(月) 00:48:03<<ってビット演算となんか関係あるの?
0510デフォルトの名無しさん
2010/05/24(月) 01:05:17ビット演算と誤解する文脈が発生しないように
って禿が言ってた
0511デフォルトの名無しさん
2010/05/24(月) 01:56:08普通にsprintf系を使ってると思いますが
0512デフォルトの名無しさん
2010/05/24(月) 01:58:11-f関数はフォーマットの解析にメモリたくさん食べるから、std::coutのoperator <<みたいにtemplateの型特性で代替してると思うよ。
0513デフォルトの名無しさん
2010/05/24(月) 02:18:19あまりにも無知
0514デフォルトの名無しさん
2010/05/24(月) 02:22:36シビアな環境で開発していたのでつい印象で・・・
0515デフォルトの名無しさん
2010/05/24(月) 02:23:29意味が分からん
0516デフォルトの名無しさん
2010/05/24(月) 02:27:220517デフォルトの名無しさん
2010/05/24(月) 02:41:46なら関係ないな。
0518デフォルトの名無しさん
2010/05/24(月) 02:49:20メモリ(コードサイズ)的につらいという面もある。
0519デフォルトの名無しさん
2010/05/24(月) 03:06:05当然printfなのだから、バッファ確保用のmalloc等も含めて。
ていうか、普通に8bit処理系だってsprintfくらい持ってる。
もちろん、それらを踏まえても、
その程度すらケチりたい環境というのが存在するのはわかっているよ。
でも、templateで各型毎に別関数の実体を作って持つのが容認されるような環境ならば
sprintf程度がきつくなるとは思えないな。
0520デフォルトの名無しさん
2010/05/24(月) 08:20:260521sage
2010/05/24(月) 08:28:41子ウィンドウを管理するクラスを作り、メッセージループ等の処理を全てそのクラスで行いたいと思っています。
クラスには2つ関数があります。
クラスA:
ウィンドウ・クラスの登録、CreateWindowを発行し子ウィンドウを作る
クラスB:
メッセージループの処理
ところが、クラスAのウィンドウ・クラスの登録の際、エラーが出てしまいます。
error C3867: 'Test::B': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&Test::B' を使用してください
Bの関数をstaticで宣言すればエラーは発生しないのですが、なにか根本的に間違っている気がします。
アドバイスよろしくお願いいたします。
0522デフォルトの名無しさん
2010/05/24(月) 08:35:380523521
2010/05/24(月) 08:41:03wc.lpfnWndProc = B;
同じ書き方をしても関数Bがstaticだと関数ポインタになって、
staticでないとメンバ関数ポインタになる。
ということでしょうか?
0524デフォルトの名無しさん
2010/05/24(月) 08:44:560525デフォルトの名無しさん
2010/05/24(月) 23:27:56int main(void){
int n=1;
float w,kei=0,heikin,max,min;
while(1){
printf("%d件目のデータを入力してください-->",n);
scanf("%f",&w);
if(w==0) break;
kei+=w;
if(n==1){max=w;min=w;}
if(w>max) max=w;
if(w<min) min=w;
n++;
}
heikin=kei/(n-1);
printf("合計 :%.1f[kg]\n"
"件数 :%d[件]\n"
"平均値:%.1f[kg]\n"
"最大値:%.1f[kg]最小値:%.1f[kg]\n",kei,n-1,max,min);
return 0;
}
最小値にループを抜けるための条件のW=0が代入されてしまいます
breakでループを抜けたらその後の
kei+=w;
if(n==1){max=w;min=w;}
if(w>max) max=w;
if(w<min) min=w;
の文は処理されないはずではないのですか?
0526デフォルトの名無しさん
2010/05/24(月) 23:31:310527デフォルトの名無しさん
2010/05/25(火) 00:12:13ぱっと見だがheikinとやらの出力忘れてんじゃね?
それに最初に0が入力されたら未初期化のmax、minに触る事になるぜ
0除算は…平気か
C言語のお勉強?
0528デフォルトの名無しさん
2010/05/25(火) 05:27:210529デフォルトの名無しさん
2010/05/25(火) 07:27:16zip書庫のリードに使いたいのですが。
zipの中のzipの内容を解凍すること無く参照したいのですか゛。
0530デフォルトの名無しさん
2010/05/25(火) 09:10:42zlibにファイルポインタとして、アーカイブの一部を渡したいってこと?
それとも、zipアーカイブの中のファイルを解凍しながら直接読むストリームが欲しいってこと?
0531デフォルトの名無しさん
2010/05/25(火) 11:34:00newとかoperator&を禁止するのとこまでは考えたんだけどなんか不安です
ちなみに用途は一時的なアダプタとかを考えてます
0532デフォルトの名無しさん
2010/05/25(火) 11:55:06>>527も触れているが最初に0が入力された場合、n=1 (初期値のまま)になるな。
その後のheikin=kei/(n-1);で0除算になる。
> の文は処理されないはずではないのですか?
なにをもって抜けていないと思うのだ?
> heikin=kei/(n-1);
これは heikin=kei/(n); に直すべき。0除算の問題もあるが、n は0以外の入力があった後、インクリメントされている。
つまり、n は入力個数に等しい。
なので、 heikin=kei/(n-1); の部分で-1するのは間違っている。
あと、最大値、最小値計算は if(n==1){max=w;min=w;} のほうほうでもまぁいいが、宣言時にでも必ず初期化しておくこと。
max=(もっとも小さい値)、min=(想定される最大値よりじゅうぶん大きい値)
それか、if(w==0) break; の前に持ってくるのでも良い。
if(n==1){max=w;min=w;}
if(w==0) break;
kei+=w;
if(w>max) max=w;
if(w<min) min=w;
どちらの方法を取るかで、最大最小値の表示が変わるが。
0533デフォルトの名無しさん
2010/05/25(火) 17:03:50int x; int &r = x;
Func(x);
Func(r);
どっちでやってもT = intになるんだけど
これって規格通りなの?
0534デフォルトの名無しさん
2010/05/25(火) 17:17:26zipの中のzipの中のファイルにダイレクトにアクセス出来たら良いんですが。
普通にやると、一回zipを取り出さないと出来ないですよね。
なにか方法ないですか。
0535デフォルトの名無しさん
2010/05/25(火) 17:20:13一個目のファイルの中身をロードするのに2Gぶん展開せずに
読み込めると良いんですが。
0536デフォルトの名無しさん
2010/05/25(火) 17:21:45・その先頭から随時メモリに展開する。
メモリにロード出来ないならこんなんじゃね?
ポインタの変わりにファイルの読み込み位置をシークするってことで。
0537デフォルトの名無しさん
2010/05/25(火) 17:26:59先頭アドレスと後方アドレスを渡したら
順次にファイル名、サイズ、アドレスなどをリターンできるライブラリなどありますか?
ここを自作するのがつらいです。
0538デフォルトの名無しさん
2010/05/25(火) 17:28:28再びそれを同じ関数へ渡せば、階層ありのzipも読み込めるのですが。
0539デフォルトの名無しさん
2010/05/25(火) 18:07:41ZIPのソースコードからコピーしてくればいいんじゃないかな?
BSDでころがってる。
0540デフォルトの名無しさん
2010/05/25(火) 18:25:54既存品は探しているながめているのですが。オープンしたファイルポインタを操作する様になっていて
書き換える部分が多くありげで成功するか不明です
0541デフォルトの名無しさん
2010/05/25(火) 21:16:56自動変数?
0542デフォルトの名無しさん
2010/05/25(火) 21:18:35型に対して、その型のインスタンスが自動変数しか存在しない事を保証したいの?
0543デフォルトの名無しさん
2010/05/25(火) 21:54:18よく知らんけど、手っ取り早く済ませたいなら Susie のアーカイブプラグインに対応させてみるのも手じゃ?
ライセンスは分からんが。
0544デフォルトの名無しさん
2010/05/26(水) 01:11:16ISO C++ 2003 5 [expr] p6
> If an expression initially has the type "reference to T", the type is
> adjusted to "T" prior to any further analysis, ...
0545デフォルトの名無しさん
2010/05/26(水) 15:36:09全クラスに定義するのめんどくさいなぁ
0546デフォルトの名無しさん
2010/05/26(水) 15:40:47クラスでも防げるが。
0547デフォルトの名無しさん
2010/05/26(水) 15:58:070548デフォルトの名無しさん
2010/05/26(水) 16:12:22ボキャブラリーないからいい単語思い浮かばないなぁ
0549デフォルトの名無しさん
2010/05/26(水) 16:52:22恥ずかしいけどそんなにかぶらない。
0550デフォルトの名無しさん
2010/05/26(水) 17:09:57これで書き込もうとしたらファイルが作られないです。
fstream fp ( fname, ios :: in | ios::out );
0551デフォルトの名無しさん
2010/05/26(水) 21:51:45ファイルを作りたい場合は
ios::in | ios::out | ios::app (既にファイルがある場合はそれをそのまま使う)
ios::in | ios::out | ios::trunc (既にファイルがある場合は中身が消える)
のどちらかを使う
0552デフォルトの名無しさん
2010/05/26(水) 21:52:510553デフォルトの名無しさん
2010/05/26(水) 21:59:340554デフォルトの名無しさん
2010/05/26(水) 21:59:470555デフォルトの名無しさん
2010/05/26(水) 22:01:270556デフォルトの名無しさん
2010/05/26(水) 22:24:02OSによって使い分けてる事もあれば、使い分けてない事もある
0557デフォルトの名無しさん
2010/05/27(木) 01:23:05コントロールパネルとかマイコンピュータ
0558デフォルトの名無しさん
2010/05/27(木) 06:28:460559デフォルトの名無しさん
2010/05/27(木) 06:36:420560デフォルトの名無しさん
2010/05/27(木) 11:47:090561デフォルトの名無しさん
2010/05/27(木) 13:52:49Windows3.1→Windows95の時に呼び方が変わっただけだろ
0562デフォルトの名無しさん
2010/05/27(木) 13:59:57フォルダ シェル名前空間の要素 ディレクトリ以外にマイコンピュータやコントロールパネル等も含む
0563デフォルトの名無しさん
2010/05/27(木) 14:02:07深く考えない方がいい
0564デフォルトの名無しさん
2010/05/27(木) 14:07:340565デフォルトの名無しさん
2010/05/27(木) 19:50:42メイン関数 は メーン関数 ですよ
まぬがれる でなく まぬかれる ですよ
0566デフォルトの名無しさん
2010/05/27(木) 20:30:25これはわかるけど、
> メイン関数 は メーン関数 ですよ
これはキモイな。新聞の「メード喫茶」並に。
内閣府告示2号ってメーン関数とか言ってるの?
0567デフォルトの名無しさん
2010/05/27(木) 20:31:450568デフォルトの名無しさん
2010/05/27(木) 20:40:560569デフォルトの名無しさん
2010/05/27(木) 21:04:54madeとmaid
0570デフォルトの名無しさん
2010/05/27(木) 21:32:23デバッグビルドでは範囲チェックつきクラスになって
リリースビルドでは普通の配列になるようにすればどうすればいいですか?
Array<int> boo(100); // int型で要素数100の配列
がリリースビルドでは
int boo[100];
のように自動的に切り替わってくれるようにしたいのです。
0571デフォルトの名無しさん
2010/05/27(木) 21:34:02マクロで制御せよ。
0572デフォルトの名無しさん
2010/05/27(木) 21:34:35マクロ教えてください!
0573デフォルトの名無しさん
2010/05/27(木) 21:36:41リリースビルドもチェック付きのままでいいと思うよ。
サイズ・速度ともに問題無かろう。
0574デフォルトの名無しさん
2010/05/27(木) 21:39:49DSとかしょっぱい環境もあるので欲しいんです!教えてください!
0576デフォルトの名無しさん
2010/05/27(木) 21:46:36http://www.geocities.jp/ky_webid/c/059.html
ところで、templateで関数を沢山生成するとDSではメディアの中がぱんぱんだぜ状態になるけどPSPは余裕っていう話をよく聞くね。
0577デフォルトの名無しさん
2010/05/27(木) 21:48:40Releaseでビルドしても、除去されない。イテレータチェックコードを消すには。次のように定義する必要がある。
#define _SECURE_SCL 0
たいていの場合、ファイルの先頭に
#ifndef _DEBUG
#define _SECURE_SCL 0
#endif
と、書いてやればいい。
http://anpcf.blog71.fc2.com/
0578デフォルトの名無しさん
2010/05/27(木) 21:51:03汎用エラー処理マクロとして使ってる馬鹿がたまに居るから困る。
0579デフォルトの名無しさん
2010/05/27(木) 21:51:30テンプレート使うとコード大きくなるし、オーバーヘッドも気になるので
普通の配列に変わるようにしたいんです!教えてください!
0580デフォルトの名無しさん
2010/05/27(木) 21:58:570581デフォルトの名無しさん
2010/05/27(木) 21:59:470582デフォルトの名無しさん
2010/05/27(木) 22:00:51#define ARRAY(type,name,num) std::array<num> name
#else
#define ARRAY(type,name,num) type name[num]
#endif
最適化とか期待できないならマクロでも使えば?
俺だったら使わないけどw
0583デフォルトの名無しさん
2010/05/27(木) 22:02:01ありがとうございます!
0584デフォルトの名無しさん
2010/05/27(木) 22:03:54operator []をオーバーロードしろ。
ちなみにArray<int> foo(100);ではなくてArray<int, 100> foo;とかじゃないとint foo[100];には置き換えられないから注意しろ。
0585デフォルトの名無しさん
2010/05/27(木) 22:05:24なんのためのデバッグビルドなんだか
0586デフォルトの名無しさん
2010/05/27(木) 22:09:02ARRAY_AT(name,i) name.at(i)
#else
ARRAY_AT(name,i) name[i]
#endif
うん、これは使いたくないな
0587デフォルトの名無しさん
2010/05/27(木) 22:09:27{
public:
T& operator[](int index){ return a[index]; }
private:
T a[NUM];
};
こんな感じですか!これをどうやって置き換えるんですか!?
0588デフォルトの名無しさん
2010/05/27(木) 22:11:24あとはマクロで普通の配列に置き換えるコード書けばおk
0589デフォルトの名無しさん
2010/05/27(木) 22:12:50省略しただけです!マクロ教えてください!
0590デフォルトの名無しさん
2010/05/27(木) 22:14:11>>586
0591デフォルトの名無しさん
2010/05/27(木) 22:15:300592デフォルトの名無しさん
2010/05/27(木) 22:16:14それ配列にアクセスするマクロやないか!
宣言のマクロ教えてください!
0593デフォルトの名無しさん
2010/05/27(木) 22:19:26#ifdef DEBUG
{
int n = sizeof(a) / sizeof(a[0]);
if(index < 0 || index >= n){ throw(hogehoge); }
}
#endif
return a[index];
とかしたら?
0594デフォルトの名無しさん
2010/05/27(木) 22:20:54リリースビルドではテンプレートやクラスのオーバーヘッドを無くしたいんです!
0595デフォルトの名無しさん
2010/05/27(木) 22:27:040596デフォルトの名無しさん
2010/05/27(木) 22:29:15相当配列をぶんぶん回しまくっているか、たいした処理していない=配列を一巡して終了する程度
のプログラムだろ。
GUIとか画像処理とか他の箇所あれば大差は出ない。
0597デフォルトの名無しさん
2010/05/27(木) 22:31:22こだわって良いところと意味ないところがある。
範囲チェックが常になくても、範囲外の読み書きあれば異常終了する。
デバッガでたどれば判明する。
0598デフォルトの名無しさん
2010/05/27(木) 22:31:29メモリ4Mしかないんです!少しでも節約したいんです!
0599デフォルトの名無しさん
2010/05/27(木) 22:32:39CodeWarriarで範囲オーバーしても何もおきません!
どこの設定をいじればいいんですか!?
0600デフォルトの名無しさん
2010/05/27(木) 22:34:14windowsXPだけど、vectorと配列の違いってせいぜいexeサイズが80Kが200Kになる程度。
もっとも多く使っているところはないか
0601デフォルトの名無しさん
2010/05/27(木) 22:34:300602デフォルトの名無しさん
2010/05/27(木) 22:39:05デバッグ版では、自作したoperator[]に渡せばいいじゃん。
上でも書いてあると思うが。マクロで書き換える。
0603デフォルトの名無しさん
2010/05/27(木) 22:41:17クラス内の定義は自動的にinlineになるんじゃないんですか!?
>>602
難しくてわかりません!
int *x=new int [100];をベースにして、
ってなんのことですか!
0604デフォルトの名無しさん
2010/05/27(木) 22:42:240605デフォルトの名無しさん
2010/05/27(木) 22:43:37#define ARR(T, A, n) T *A=new T [n];
int main() {
ARR(int,x,10); // intt型配列を10個用意する。
}
0606デフォルトの名無しさん
2010/05/27(木) 22:43:58テンプレートってクラス内にしか書いたことありません!外に出せるんですか!?
0607デフォルトの名無しさん
2010/05/27(木) 22:44:59なんで動的にメモリ確保してるんですか!しかも解放してないじゃないですか!
0608デフォルトの名無しさん
2010/05/27(木) 22:45:59リリースでは使わず、デバッグでは使えばいい。
0609デフォルトの名無しさん
2010/05/27(木) 22:47:00だからその方法を最初から聞いてるんじゃないですか!オロローン!
0610デフォルトの名無しさん
2010/05/27(木) 22:48:02コンパイル時に決定しているx[100]を使うと、固定サイズメモリの確保が必要になる。
動的にすれば解放可能
0611デフォルトの名無しさん
2010/05/27(木) 22:48:150612デフォルトの名無しさん
2010/05/27(木) 22:48:48どうしてそんなに「!」をつけるんですか。
0613デフォルトの名無しさん
2010/05/27(木) 22:49:48いやいや、この場合使うケースと使わないケースでコストを全く同じにする方法があるから。
>>594
inlineでリリースモードだとreturn a[index];しか残らないからオーバーヘッドはないよ。
0614デフォルトの名無しさん
2010/05/27(木) 22:50:14あなた達が教えてくれないからハイテンションになってるんじゃないですか!!
教えてくださいよ!
0615デフォルトの名無しさん
2010/05/27(木) 22:50:22#ifdef DEBUG
#define ARR(T, A, n) 自作した範囲チェック付きのクラスか、 範囲チェックある既存クラスを呼び出す。
#else
#define ARR(T, A, n) T *A=new T [n];
#endif
0616デフォルトの名無しさん
2010/05/27(木) 22:51:24まじですか!コンパイラはそこまで最適化してくれるんですか!
じゃあマクロでいちいち置き換える必要ないじゃないですか!
最初からそこ教えてくださいよ!
0617デフォルトの名無しさん
2010/05/27(木) 22:51:46#ifdef DEBUG
#define ARR(T, A, n) vector<T> A(n);
#else
#define ARR(T, A, n) T *A=new T [n];
#endif
0618デフォルトの名無しさん
2010/05/27(木) 22:53:32解放処理はどうするんですか!
デバッグとリリースで違う解放処理いれないといけないじゃないですか!
デバッグでもリリースでも同じように使えないと意味ないでしょ!
0619デフォルトの名無しさん
2010/05/27(木) 22:53:53ごめん・・・。マクロは置き換えじゃなくて特定のモードのみコード生成っていう事もできるから
文脈上気づくと思ってた・・・。まさかあなたがこんなに無能だったとは予想に反していたから・・・。
0620デフォルトの名無しさん
2010/05/27(木) 22:56:04#ifdef DEBUG
#define DEL(A) A.swap( vector<T>() ); <- Tはどう求めるのかしらんが
#else
#define DEL(A) delete(A);
#endif
0621デフォルトの名無しさん
2010/05/27(木) 22:59:210622デフォルトの名無しさん
2010/05/27(木) 23:00:49おだまりスカポンターン!
>>620
なんで動的に確保させようとするんですか!固定配列で充分なんですよ!
0623デフォルトの名無しさん
2010/05/27(木) 23:01:40>>570が前提条件ですよ!
0624デフォルトの名無しさん
2010/05/27(木) 23:04:240625620
2010/05/27(木) 23:09:45確定しないと駄目だ。int、charと一致するか調査して適切な解放すれば良し。
0626620
2010/05/27(木) 23:14:21常に前者で確保すれば、初期の固定スタックが巨大化するため。
0627デフォルトの名無しさん
2010/05/27(木) 23:17:58本当ですか?なんか嘘くさいです!
まあでも僕も巨大な配列は動的確保します!
まあそれはどうでもよくて欲しいのはデバッグビルドのみの範囲チェックなんですよ!
0628620
2010/05/27(木) 23:19:56動的確保でvectorの標準範囲チェックを使う
0629デフォルトの名無しさん
2010/05/27(木) 23:22:38#ifdef DEBUG
#define DEL(A) ; <- 空行でよし。 関数や括弧抜ければ自動開放すめため。
#else
#define DEL(A) delete(A);
#endif
0630デフォルトの名無しさん
2010/05/27(木) 23:25:44{
public:
T& operator[](int index){ /*範囲チェック*/return a[index]; }
private:
T a[NUM];
};
#ifdef _DEBUG
#define ARRAY(type,name,num) Array<type,num> name
#else
#define ARRAY(type,name,num) type name[num]
#endif
ARRAY(int,a,10);
a[5]=100;
a[10]=a[5]; // エラー
これでいいじゃないですか!動的確保はなんの為にしてるんですか!
0631デフォルトの名無しさん
2010/05/27(木) 23:27:140632デフォルトの名無しさん
2010/05/27(木) 23:30:420633デフォルトの名無しさん
2010/05/27(木) 23:34:31T& operator[](int index)
{
#ifdef _DEBUG
/*範囲チェック*/
#endif
return a[index];
}
こうしとけばマクロで切り替える必要も無い。
0634デフォルトの名無しさん
2010/05/27(木) 23:35:39{
#ifdef DEBUG
typedef CheckedArray<T, N> type;
#else
typedef T type[N];
#endif
};
Array<int, 100>::type a;
0635デフォルトの名無しさん
2010/05/27(木) 23:35:49なんでですか!?最適化が効くからパフォーマンスに差は無くなるんですか!?
0636デフォルトの名無しさん
2010/05/27(木) 23:38:220637デフォルトの名無しさん
2010/05/27(木) 23:39:19すいません!向こうのも僕です!
0638デフォルトの名無しさん
2010/05/27(木) 23:42:420639デフォルトの名無しさん
2010/05/27(木) 23:47:170640デフォルトの名無しさん
2010/05/27(木) 23:48:52コンパイラによっては、配列取得時に変数での確保は無理。
実装によるが、スタックが少量しかなければヒープから持ってくるだろ・。
0641デフォルトの名無しさん
2010/05/27(木) 23:50:21いつでも最適化されるとは限らない。
0642デフォルトの名無しさん
2010/05/27(木) 23:54:11コンパイラが勝手にヒープから確保するんですか!?ほんとにそんなことあるんですか!
>>638,639,641
どっちなんですか!
0643デフォルトの名無しさん
2010/05/28(金) 00:02:37> コンパイラが勝手にヒープから確保するんですか!?ほんとにそんなことあるんですか!
あるよ。
どこから確保しろなんて規定はない。
0644デフォルトの名無しさん
2010/05/28(金) 00:03:35#include <stdio.h>
#define N 270000
int main(){
//double x[N];
//int n=N; double x[n];
double *x=new double [N];
printf("ok");
getchar();
}
0645デフォルトの名無しさん
2010/05/28(金) 01:08:49http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%9F%BA%E6%9C%AC%E3%82%AF%E3%83%A9%E3%82%B9(Parameterized_Base_Class)
上記のサンプルコードのようなクラスを作成した場合、
インスタンス化するときは、必ず
Serializable<ConcreteClass> tmp;
みたいな感じで、インスタンス化するんですよね?
この場合、ConcreteClassで、コンストラクタ引数を受け取るようにすることはできないのでしょうか?
0646デフォルトの名無しさん
2010/05/28(金) 04:16:31class Serializable : public T, public ISerializable {
public:
Serializable() : T() {}
template<class A0>
Serializable(A0 a0) : T(a0) {}
…
template<class A0,〜class AN>
Serializable(A0 a0,〜AN an) : T(a0,〜an) {}
};
というのはどうか。
0647デフォルトの名無しさん
2010/05/28(金) 04:23:440648デフォルトの名無しさん
2010/05/28(金) 04:31:440649デフォルトの名無しさん
2010/05/28(金) 06:49:460650デフォルトの名無しさん
2010/05/28(金) 06:51:430651デフォルトの名無しさん
2010/05/28(金) 07:02:46参照・const参照を適切に切り替えてくれないのはこまらね?
0652デフォルトの名無しさん
2010/05/28(金) 07:10:17Serializable(hogehoge(), fugafuga()); なんて事もできるし。
T内部でreferenceを持つために引数が非constなreferenceだったらどうしようもないけどw
template <class T>
class Serializable : public T, public ISerializable {
public:
Serializable() : T() {}
template<class A0>
Serializable(const A0 &a0) : T(a0) {}
…
template<class A0,〜class AN>
Serializable(const A0 &a0,〜const AN &an) : T(a0,〜an) {}
};
0653デフォルトの名無しさん
2010/05/28(金) 07:23:42配列は>>648と同じくboost::array(可変長なら当然vector)。
templateでコードが膨張するっても、サウンドやグラフィックと比べりゃたかが知れてる。
手書きしたとしてもどうせ同じくらいのサイズになるし、下手をするとtemplateを使うよりでかくなる。
標準ライブラリも、いまどきのは基本的に膨張対策されてるから問題なし。
0654デフォルトの名無しさん
2010/05/28(金) 08:34:020655デフォルトの名無しさん
2010/05/28(金) 08:42:29関数名が同名で衝突するから名前空間を持たせる。
その前にクラスの名前が違えば別によくないですか?
連レスすみません。
0656デフォルトの名無しさん
2010/05/28(金) 08:44:570657デフォルトの名無しさん
2010/05/28(金) 10:12:490658デフォルトの名無しさん
2010/05/28(金) 10:14:490659デフォルトの名無しさん
2010/05/28(金) 10:20:140660デフォルトの名無しさん
2010/05/28(金) 10:23:380661デフォルトの名無しさん
2010/05/28(金) 10:36:270662デフォルトの名無しさん
2010/05/28(金) 10:40:161h、1libで高速ビルドのやつ
0663デフォルトの名無しさん
2010/05/28(金) 10:47:030664デフォルトの名無しさん
2010/05/28(金) 10:51:040665デフォルトの名無しさん
2010/05/28(金) 13:26:090666デフォルトの名無しさん
2010/05/28(金) 14:05:550667デフォルトの名無しさん
2010/05/28(金) 14:49:50おれはやらないけどな。
0668デフォルトの名無しさん
2010/05/28(金) 15:02:020669デフォルトの名無しさん
2010/05/28(金) 15:10:040670デフォルトの名無しさん
2010/05/28(金) 15:14:260671デフォルトの名無しさん
2010/05/28(金) 15:52:100672デフォルトの名無しさん
2010/05/28(金) 16:02:250673デフォルトの名無しさん
2010/05/28(金) 16:03:300674デフォルトの名無しさん
2010/05/28(金) 16:05:280675デフォルトの名無しさん
2010/05/28(金) 20:05:230676デフォルトの名無しさん
2010/05/28(金) 20:53:320677デフォルトの名無しさん
2010/05/28(金) 21:19:49class hogehoge{
private:
hogehoge(){ ... }
hogehoge(arg0_type arg0, arg1_type arg1, arg2_type arg2){ ... }
public:
static hogehoge *create(){ return new hogehoge; }
static hogehoge *create(const arg0_type &arg0, const arg1_type &arg1, const arg2_type &arg2){ return new hogehoge(arg0, arg1, arg2); }
};
0678デフォルトの名無しさん
2010/05/28(金) 21:56:32int b = *(int*)&a[0];
int c = *(int*)&a[1];
ってやるとcの値が0x22554433ってなるんですがどういう現象なんでしょうか?
0679デフォルトの名無しさん
2010/05/28(金) 21:59:040680デフォルトの名無しさん
2010/05/28(金) 22:04:48環境依存の現象
0681デフォルトの名無しさん
2010/05/28(金) 22:05:49ググッたけどよくわかりません!
>>680
環境はDSです!もうちょい詳しく教えてください!
0682デフォルトの名無しさん
2010/05/28(金) 22:09:34落ちないが正しく修正もされない
http://jr0bak.homelinux.net/~imai/linux/arm_gcc_badknowhow/arm_gcc_badknowhow-4.html
0683デフォルトの名無しさん
2010/05/28(金) 22:11:35ビッグエンディアンならデータ配置は0x55443322となり、リトルエンディアンなら0x44552233となるはずだが、
実際はa[2], a[3], a[4], a[1]の配置になっている。
これはそのDSの処理系とやらがビッグエンディアンでなおかつアラインメントが原因でエラーが発生しているのだろう。
0684デフォルトの名無しさん
2010/05/28(金) 22:12:320685デフォルトの名無しさん
2010/05/28(金) 22:12:320686デフォルトの名無しさん
2010/05/28(金) 22:14:26DSはリトルエンディアンです!
じゃあint型は4バイトアラインメントで配置しないとうまくキャスト出来無いってことですかー!
4バイトアラインメントじゃないアドレスからint型にキャストするにはどうすればいいんですか!!!
0687デフォルトの名無しさん
2010/05/28(金) 22:15:560688デフォルトの名無しさん
2010/05/28(金) 22:15:59何で16ビット単位を仮定してるんだ?
0689デフォルトの名無しさん
2010/05/28(金) 22:16:540690デフォルトの名無しさん
2010/05/28(金) 22:20:300691デフォルトの名無しさん
2010/05/28(金) 22:21:55コーヒー
チャッカマン
0692デフォルトの名無しさん
2010/05/28(金) 22:24:05int c = a[4]<<24|a[3]<<16|a[2]<<8|a[1];
0693デフォルトの名無しさん
2010/05/28(金) 22:24:57なんかマイナスの値が返ってきました!
0694デフォルトの名無しさん
2010/05/28(金) 22:25:360695デフォルトの名無しさん
2010/05/28(金) 22:28:43unsigned int uc = (unsigned int)c;
0696デフォルトの名無しさん
2010/05/28(金) 22:30:26printf("%d
してるから無意味さ
0697デフォルトの名無しさん
2010/05/28(金) 22:39:200698デフォルトの名無しさん
2010/05/28(金) 22:40:310699デフォルトの名無しさん
2010/05/28(金) 22:41:17関係あるけど、リトルって決まってるんだよね?
0700デフォルトの名無しさん
2010/05/28(金) 22:41:56リトルエンディアンです!
0701デフォルトの名無しさん
2010/05/28(金) 22:43:150702デフォルトの名無しさん
2010/05/28(金) 22:48:00この手のCPUってSHやMBとかもそうだけどエンディアン切り替えられるんじゃない?
それよかエンディアンの問題というよりアライメントの問題じゃね?
ARMって偶数番地やワードアクセスの制約とかないの?
0703デフォルトの名無しさん
2010/05/28(金) 22:49:240704デフォルトの名無しさん
2010/05/28(金) 22:49:310705デフォルトの名無しさん
2010/05/28(金) 22:52:53int b = *(int*)&a[0];
int c = *(int*)&a[1];
b 0x44332211 // 非常によくわかる。リトルエンディアンだから
c 0x22554433 // エンディアンのせい?アラインメントのせい?
ってなります!
エンディアンの関係がよくわかりません!
0706デフォルトの名無しさん
2010/05/28(金) 22:53:530707デフォルトの名無しさん
2010/05/28(金) 22:54:09> c 0x22554433 // エンディアンのせい?アラインメントのせい?
0x55443322にならないのは、アライメントをまたぐから。
0708デフォルトの名無しさん
2010/05/28(金) 22:54:34じゃあなんでエンディアン言い出したんですか!混乱するでしょが!
0709デフォルトの名無しさん
2010/05/28(金) 22:56:520710デフォルトの名無しさん
2010/05/28(金) 22:56:57リトルエンディなんならこうするし
int c = a[4]<<24|a[3]<<16|a[2]<<8|a[1];
ビッグエンディアンならこうするから
int c = a[1]<<24|a[2]<<16|a[3]<<8|a[4];
エンディアンが関係ないわけじゃない。
0711デフォルトの名無しさん
2010/05/28(金) 22:58:39お前の頭の中にはシフト演算しか無いのか
0712デフォルトの名無しさん
2010/05/28(金) 23:00:41論理和も使ってるけど?
0713デフォルトの名無しさん
2010/05/28(金) 23:02:15int c = (int)a[4]<<24|(int)a[3]<<16|(int)a[2]<<8|(int)a[1];
0714デフォルトの名無しさん
2010/05/28(金) 23:04:37それとCPUのマニュアルぐらい読んでアーキテクチャ確認しろよw
0716デフォルトの名無しさん
2010/05/28(金) 23:16:30そうだよ
0717デフォルトの名無しさん
2010/05/28(金) 23:16:590718デフォルトの名無しさん
2010/05/29(土) 01:29:19無茶なキャストしといて結果に何か期待するのが間違い。
キャストなんかしてるからエンディアンだのアライメントだの心配しないといけなくなる。
期待している動作があるなら素直にそのとおりのコードを書けよ。
0719デフォルトの名無しさん
2010/05/29(土) 14:04:57WinAPI使ってfstream互換関数作るだけでずいぶん苦労かかるな。
0720デフォルトの名無しさん
2010/05/29(土) 15:09:560721デフォルトの名無しさん
2010/05/29(土) 15:18:41というかC++の入出力ライブラリはOSのAPI使わないと実装できないのばかりだろ。
0722デフォルトの名無しさん
2010/05/29(土) 15:59:26既存のスマポシリーズだと帯に短し襷に長しって感じでどうもしっくりこない
0723デフォルトの名無しさん
2010/05/29(土) 16:05:190724デフォルトの名無しさん
2010/05/29(土) 16:15:26ボディクラスが自動生成したコンストラクタ・デストラクタ・代入を使うとバグになるから空でもcppに書かなくちゃならなくてめんどくさい
0725デフォルトの名無しさん
2010/05/29(土) 16:20:49WinAPIと同等の性能・機能を発揮して、fstreamと互換動作するやつは重要だ。
0726デフォルトの名無しさん
2010/05/29(土) 16:36:46不完全型かどうかで定義が変わって欲しいと言うこと?
不完全型かどうか取得ってメタプロ的に可能なんだろうか
0727デフォルトの名無しさん
2010/05/29(土) 16:55:020728デフォルトの名無しさん
2010/05/29(土) 17:01:16XXXtraits<int>.zero();ってやると0が返ってくるようなクラスありますか?
0729デフォルトの名無しさん
2010/05/29(土) 17:04:06shared_ptrはその不完全型も正しくdeleteできるんじゃなかった?
0730デフォルトの名無しさん
2010/05/29(土) 17:24:00int() じゃだめなの
0731デフォルトの名無しさん
2010/05/29(土) 17:26:030732デフォルトの名無しさん
2010/05/29(土) 17:27:550733デフォルトの名無しさん
2010/05/29(土) 17:30:37struct XXXtraits{
static T zero(){ return static_cast<T>(0); }
};
0734デフォルトの名無しさん
2010/05/29(土) 17:34:14きいてみただけです。
0735デフォルトの名無しさん
2010/05/29(土) 17:41:040736デフォルトの名無しさん
2010/05/29(土) 17:56:15特殊化以外はデフォルトコンストラクタよぶ
0737デフォルトの名無しさん
2010/05/29(土) 18:07:15というわけでstatic_castに一票
0738デフォルトの名無しさん
2010/05/29(土) 18:17:59dword unknown;
dword filenum;
HEADER * header;
int i, j;
src = fopen( archive, "rb" );
fread( &unknown, sizeof(dword), 1, src );
fread( &filenum, sizeof(dword), 1, src );
header = (HEADER *)malloc( filenum * sizeof(HEADER) );
fread( header, sizeof(HEADER), filenum, src );
0739デフォルトの名無しさん
2010/05/29(土) 18:18:470740デフォルトの名無しさん
2010/05/29(土) 18:19:54誤爆ですね。わかります。
0741デフォルトの名無しさん
2010/05/29(土) 18:22:200742デフォルトの名無しさん
2010/05/29(土) 18:23:51初心者スレでもなさそうだったから書き込むの辞めようと思ったのにorz
せっかくですので…
字数制限で結構省略してしまっていますが…
srcから7byte目まで変数に読み込むということは分かったんですが
HEADER * headerという宣言がどういう働きをしているのか分かりません。
FILE *みたいなのはググれば出てくるのですが、HEADERというのは出てきません。
よろしければお願いいたします。
mallocも正直あまり分かりません…
0743デフォルトの名無しさん
2010/05/29(土) 18:28:58HEADERはそのファイル固有の先頭のヘッダー情報の構造体と思われる。
ここはC++なのでCはCのスレで質問したほうが反応いいと思うよ。
0744デフォルトの名無しさん
2010/05/29(土) 18:34:42cppでコンパイルされてたのでここに書き込んだのです。
すみませんでした。
どうも返答ありがとうございます。
おかげで謎が解けました。
HEADERで検索をかけてみたところ、最初の方で宣言されていました;;
どうやら見落としていたみたいです。
mallocも理解できそうなんで、大丈夫そうです。
ありがとうございました。
0745デフォルトの名無しさん
2010/05/30(日) 00:32:56以下のような感じだと、obj1とobj2のコンストラクタが呼ばれて、
push時にコピーコンストラクタが呼ばれて、
スコープから出るときにデストラクタが呼ばれるので3手間かかりますよね?
vector<obj> v;
obj obj1(...);
obj obj2(...);
v.push_back(obj1);
v.push_back(obj2);
オブジェクトのポインタを入れるなら、コンストラクタ1回で済みますけど、
自分でdeleteしないといけないですよね?
vector<obj*> v;
v.push_back(new obj(...));
v.push_back(new obj(...));
自動でdeleteしてもらおうと思ったら、
boostのポインタコンテナ使うのが普通なんでしょうか?
0746デフォルトの名無しさん
2010/05/30(日) 00:33:51付けないとWinAPIでファイルロード速度が低下するのが定説だったけどいまは直ってるぞ。
最新版のwinSDK、コンパイラいれてみそ。
これで面倒なクラスタサイズを気にすることなくかける。
0747デフォルトの名無しさん
2010/05/30(日) 00:35:130748デフォルトの名無しさん
2010/05/30(日) 00:35:53え?
0749デフォルトの名無しさん
2010/05/30(日) 00:41:30いまはバッファありでも大差でなくなった。
大容量ファイルI/Oの効率について 其の弐
http://d.hatena.ne.jp/wraith13/20080430/1209565632
http://f.hatena.ne.jp/images/fotolife/w/wraith13/20080430/20080430231453.png
0750デフォルトの名無しさん
2010/05/30(日) 00:44:56shared_ptr使うのが普通
c++0xなら一手間ですむ。
v.push_back(obj(...));
obj1,obj2がpush後不要ならc++0xで以下のようにムーブセマンティックを使うと1手間ですむ。
v.push_back(std::move(obj1));
0751デフォルトの名無しさん
2010/05/30(日) 00:47:29std::unique_ptrが使える
0752デフォルトの名無しさん
2010/05/30(日) 00:47:460753デフォルトの名無しさん
2010/05/30(日) 00:52:56元の値が残ってるんだけど。これは正しい動作なんだろうか。
int main(){
vector<string > v;
string a="aaaaaaaa";
string b="BBBBBBBB";
v.push_back(std::move(a));
v.push_back(std::move(b));
cout<<a<<" "<<v[0]<<endl;
v[0]="CCCCCCC"; v[1]="DDDDDDDD";
cout<<a<<" "<<b<<endl;
return 0;
}
0754753
2010/05/30(日) 00:59:440755デフォルトの名無しさん
2010/05/30(日) 01:05:022010だと使うと死んだような気がするんだけど
場合によるのか
0756デフォルトの名無しさん
2010/05/30(日) 01:21:30VC10で試したけど、ムーブはされてるようだけど。
どんな結果がでた?
デバッガーで見て内部のバッファーに残ってるというなら
string a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
string b="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
で試してごらん。
文字列が短いときと長いときでは格納方法が違うようだ。眠いのでライブラリのコードは追ってない。
結果から見ると、文字列が短いときはstring内に格納されていて、長いときはヒープに格納されていたって事じゃないか?
0757デフォルトの名無しさん
2010/05/30(日) 01:23:16知らなかった
0758753
2010/05/30(日) 01:27:21int main(){
string a;
for(int n=0; n<512*1024; n++) a+=('0' + n%10);
vector<string > v;
v.push_back(std::move(a));
v.resize(0);
cout<<a<<endl;
return 0; }
0759デフォルトの名無しさん
2010/05/30(日) 01:30:050760デフォルトの名無しさん
2010/05/30(日) 01:32:42VC10ではaは空になるよ。
STLが右辺値参照に対応して無いんじゃないの?
0761デフォルトの名無しさん
2010/05/30(日) 01:35:390762753
2010/05/30(日) 01:36:580763デフォルトの名無しさん
2010/05/30(日) 01:38:32>>753,758ではなんでaは空にならないのは何故かなって話。
0764デフォルトの名無しさん
2010/05/30(日) 01:39:50まあ対応が微妙なコンパイラ使ってるってだけだろうけど
0765753
2010/05/30(日) 01:44:04だった。
0766デフォルトの名無しさん
2010/05/30(日) 01:48:18載ってないわ
対応状況はよく分からん
ttp://wiki.apache.org/stdcxx/C++0xCompilerSupport
0767753
2010/05/30(日) 01:51:10R-Value References yesだけど出来ないな
0768デフォルトの名無しさん
2010/05/30(日) 01:51:26残念、非対応です
0769デフォルトの名無しさん
2010/05/30(日) 01:53:45ライブラリが対応してないとか?
あるいは表が間違ってるんだろうか
0770デフォルトの名無しさん
2010/05/30(日) 01:57:12ダメなら文法的に非対応
通るならライブラリが非対応なだけだからSTLportかなんか入れれば使えるかもしれない
0771デフォルトの名無しさん
2010/05/30(日) 08:16:35stringは参照カウントとCOWを使ってる実装があるから
moveする際にきちっとポインタとかを0にして空のオブジェクトにするのも
参照カウントだけ増やして元のオブジェクトには何もしなくても(つまりただのコピー)
どうせ消えるオブジェクトだからおんなじだよってことじゃないの?
短い文字列の場合newのオーバーヘッドを避けるためヒープじゃなくて固定長のバッファを使うからmoveの動作も異なる
ということだと思う
むろん確認はしていない
0772デフォルトの名無しさん
2010/05/30(日) 08:37:350773デフォルトの名無しさん
2010/05/30(日) 09:14:22std::vectorに実装されている演算子( ==、< など)の情報が載っているサイトはありませんか?
ここ(ttp://www.cplusplus.com/reference/stl/vector/)には無いようなのですが。
比較の基準などが気になります。
0774デフォルトの名無しさん
2010/05/30(日) 09:28:36VC10のヘルプには載ったけど。左辺側が全てlessだったらtrueか。これはべんりだな。標準かどうかはしらないけど。
0775デフォルトの名無しさん
2010/05/30(日) 09:39:29!(a<b)かつ!(b<a)かつa!=bになるvectorの組みがあるわけか
なんかいやだな
0776デフォルトの名無しさん
2010/05/30(日) 09:47:060777デフォルトの名無しさん
2010/05/30(日) 09:56:44http://www.cppll.jp/cppreference/cppvector_details.html#Operators
http://msdn.microsoft.com/en-us/library/572x098y.aspx
0778デフォルトの名無しさん
2010/05/30(日) 10:42:46規格で lexicographical_compare の結果になると規定されている
lexicographical_compare は要するに strcmp(a, b) < 0 と同じような動きをするもの
0779デフォルトの名無しさん
2010/05/30(日) 11:10:47その場合は、型は何が標準になりますか。
0780デフォルトの名無しさん
2010/05/30(日) 11:15:45size_t。
一般的な 64 bit コンパイラなら sizeof(size_t) == 8 になるはず。
0781デフォルトの名無しさん
2010/05/30(日) 11:20:230782デフォルトの名無しさん
2010/05/30(日) 11:27:220783デフォルトの名無しさん
2010/05/30(日) 11:51:540784デフォルトの名無しさん
2010/05/30(日) 12:24:300785デフォルトの名無しさん
2010/05/30(日) 12:27:080786デフォルトの名無しさん
2010/05/30(日) 12:29:35<stdio.h>ならsize_tか::size_t
<cstdio>なら::std::size_t
現行のC++なら<cstdio>を推奨
0787デフォルトの名無しさん
2010/05/30(日) 12:31:12typedef implementation-defined size_t;
namespace std { using size_t; }
とされるだけやで
0788デフォルトの名無しさん
2010/05/30(日) 12:33:41C++しかサポートしてないコンパイラなら<stdio.h>ではなく<cstdio>しか存在しない場合もある。
<stdio.h>はC++ではなくてCのライブラリだからな。C++である以上<cstdio>を使えということ。
0789デフォルトの名無しさん
2010/05/30(日) 13:02:31確かにstd内って書いてあるな
0790デフォルトの名無しさん
2010/05/30(日) 13:17:35size_t 符号無し整数 32/64bit自動切替
DWORD 符号無し整数 32bit
long long 符号付き整数 64bit
int 符号付き整数 32bit
0791デフォルトの名無しさん
2010/05/30(日) 13:19:15依存型は処理系依存スレでやれ
0792デフォルトの名無しさん
2010/05/30(日) 13:27:270793デフォルトの名無しさん
2010/05/30(日) 13:27:39大きさがきっちり決まってる方がいい→int8_t、int16_t、・・・
ビット集合→uint8_t、uint16_t、・・・
unsignedは基本的には使わないこと
0794デフォルトの名無しさん
2010/05/30(日) 13:30:02意味分からん
0795デフォルトの名無しさん
2010/05/30(日) 13:32:560796デフォルトの名無しさん
2010/05/30(日) 13:40:100797デフォルトの名無しさん
2010/05/30(日) 13:50:13http://pc12.2ch.net/test/read.cgi/tech/1274949734/
0798デフォルトの名無しさん
2010/05/30(日) 13:57:55(x>=0)&&(x<10000)がunsignedだと(x<10000)だけですむじゃん。
0799デフォルトの名無しさん
2010/05/30(日) 14:04:30unsignedは整数拡張でバグを生みかねないからsignedを使うべき
0800デフォルトの名無しさん
2010/05/30(日) 14:06:28と言いつつunsignedは使うなとか意味分からん
0801デフォルトの名無しさん
2010/05/30(日) 14:09:390802デフォルトの名無しさん
2010/05/30(日) 14:14:53整数拡張以前の問題でバグになる部分が多々あると思うが
0803デフォルトの名無しさん
2010/05/30(日) 14:16:29警告出るから
0804デフォルトの名無しさん
2010/05/30(日) 14:19:550805デフォルトの名無しさん
2010/05/30(日) 14:36:48signed int b = -1;
assert(b < a); // -1 < 1
しかし assertion failed
0806デフォルトの名無しさん
2010/05/30(日) 14:38:360807デフォルトの名無しさん
2010/05/30(日) 14:43:49> オーバーフローの時の性質の明確なことが大事で負の値が不 要なら、対応する
> 符号なしの整数を使え(ただし符号付と符号なしの 整数の混在には注意すること)。
これで FA だな。
0808デフォルトの名無しさん
2010/05/30(日) 14:47:20警告が出るし
0809デフォルトの名無しさん
2010/05/30(日) 14:49:260810デフォルトの名無しさん
2010/05/30(日) 14:52:320811デフォルトの名無しさん
2010/05/30(日) 14:52:390812デフォルトの名無しさん
2010/05/30(日) 14:53:500813デフォルトの名無しさん
2010/05/30(日) 14:53:540814デフォルトの名無しさん
2010/05/30(日) 14:55:03警告見て signed に修正するんじゃないの?
0815デフォルトの名無しさん
2010/05/30(日) 14:56:24intが-2147483648のときに--したらどうなるのっと・・・・・・
0816デフォルトの名無しさん
2010/05/30(日) 14:57:112^(CHAR_BIT*sizeof(unsigned int))-1 になると規格で規定されている
0817デフォルトの名無しさん
2010/05/30(日) 14:57:360818デフォルトの名無しさん
2010/05/30(日) 14:58:12ループカウンタにautoで面倒なイテレータの型記述をしないで済むぞやったー!とか言ってる奴もすでにいるしね
不要な場合の非負整数をつかわないと統一しておけばバグは確実に減らせる
0819デフォルトの名無しさん
2010/05/30(日) 14:58:56>>815
そこはMIN_INTと書くべきだな
規格では処理系定義となっている
MAX_INTになるかもしれないし、例外が発生するかもしれない
0820デフォルトの名無しさん
2010/05/30(日) 15:00:57そうやって std::vector::size との比較でキャストしまくりになるわけですね
分かります
0821デフォルトの名無しさん
2010/05/30(日) 15:03:090822デフォルトの名無しさん
2010/05/30(日) 15:03:22これ何か問題なん?
0823デフォルトの名無しさん
2010/05/30(日) 15:04:010824デフォルトの名無しさん
2010/05/30(日) 15:07:07どんな型でも大丈夫なように作れよ
0825デフォルトの名無しさん
2010/05/30(日) 15:07:170826デフォルトの名無しさん
2010/05/30(日) 15:08:39ごめんよ
規格通りに書こうとすると説明面倒くさくて
確かにlong doubleとか有効なビット幅と一致しない処理系多いし
整数型だってそういう事あるだろうしね
0827デフォルトの名無しさん
2010/05/30(日) 15:09:080828デフォルトの名無しさん
2010/05/30(日) 15:23:16キャストしたら正から負になったりするんだから。
0829デフォルトの名無しさん
2010/05/30(日) 15:24:09符号付きも符号なしも同じじゃ・・・
0830デフォルトの名無しさん
2010/05/30(日) 15:26:260831デフォルトの名無しさん
2010/05/30(日) 15:26:34突っ込んだら負け?のような気がするんだが
0832デフォルトの名無しさん
2010/05/30(日) 15:27:400833デフォルトの名無しさん
2010/05/30(日) 15:27:41符号なしを符号付きにキャストしようが
お互いに表現できない数の領域で問題になるのは同じだろw
0834デフォルトの名無しさん
2010/05/30(日) 15:32:48C++民ならまずそういうの探すところから始めるだろ
0835デフォルトの名無しさん
2010/05/30(日) 15:33:400836デフォルトの名無しさん
2010/05/30(日) 15:34:18符号なしへのキャストで範囲外の場合の値はどうなるか規格で定められている。
符号つきへのキャストで範囲外の場合の値は処理系定義。
0837デフォルトの名無しさん
2010/05/30(日) 15:36:09>>828はそういう問題じゃないでしょ
0839デフォルトの名無しさん
2010/05/30(日) 15:39:110840デフォルトの名無しさん
2010/05/30(日) 15:45:32負数を符号無し型へキャストしてるようなコードとは極力関わり合いたくない
え、string::npos?(∩ ゚д゚)アーアーきこえなーい
0841デフォルトの名無しさん
2010/05/30(日) 15:47:240842デフォルトの名無しさん
2010/05/30(日) 15:58:34>表現しているのが実際には数値ではなくビットパターンであったり、
>2の補数オーバーフローを定義する必要があるとき以外、uint32_t といった unsigned 整数型を使うべきではない。
>特に、数値が負にならないことを示すためだけに unsigned 型を使ってはいけない。代わりに、アサーションを使うこと。
らしい
0843デフォルトの名無しさん
2010/05/30(日) 16:00:09符号無しでは警告多く出る。
0844デフォルトの名無しさん
2010/05/30(日) 16:08:020845デフォルトの名無しさん
2010/05/30(日) 16:08:470846デフォルトの名無しさん
2010/05/30(日) 16:09:360847デフォルトの名無しさん
2010/05/30(日) 16:09:59STL使う普通のプログラムじゃsizeとの比較を考えてsize_tが増えるのは当然の事
0848デフォルトの名無しさん
2010/05/30(日) 16:17:55あー、それウザイよね。
だからといって unsigned を優先したりはしないんだけど。
外向けのインターフェースでは signed で、内部では負の値のチェックのあとに unsigned に
変換っていうのがいいかな。 boost::numeric_cast とか。
0849デフォルトの名無しさん
2010/05/30(日) 16:37:50たとえばcharを-128〜127で扱うより、0〜255のほうが便利。
unsigned char *p =(unsigned char *)str;などする。
0850デフォルトの名無しさん
2010/05/30(日) 16:49:240851デフォルトの名無しさん
2010/05/30(日) 17:01:140852デフォルトの名無しさん
2010/05/30(日) 17:02:440853デフォルトの名無しさん
2010/05/30(日) 17:08:20キャストは基本的に悪というのが分かってんのかね
0854デフォルトの名無しさん
2010/05/30(日) 17:11:06charとintとかサイズが異なるものは変化しているかもしれないが。
符号有り無しはコンパイル時だけチェックしていて
実行時には確認してないだろ。
0855デフォルトの名無しさん
2010/05/30(日) 17:13:08サイズと異なるキャストは除く。
char -> int など。これは前方に0が3つ入らないとまずいからな。
0856デフォルトの名無しさん
2010/05/30(日) 17:17:39これでは、まちがって引数に負の値を入れてしまい、なおかつ現在のサイズが非常に大きい場合にエラーを検知できない
intにしていれば負数を検知できるので間違いが少なくなる
そしてintとunsignedでどっちがアンダーフローのミスを犯しやすいかというと当然unsignedだ
indexにはsignedを使うべきということがよくわかったね
0857デフォルトの名無しさん
2010/05/30(日) 17:22:39変数宣言もしっかり書け、なに言ってるのかサパーリ解らん
0858デフォルトの名無しさん
2010/05/30(日) 17:23:090859デフォルトの名無しさん
2010/05/30(日) 17:25:53そのとおり!
信用できないやつがいるからこそ負数を検知すべきなんだ
勉強になったね
0860デフォルトの名無しさん
2010/05/30(日) 17:27:13uint32_t idx = -1;
uint32_t size = 10;
assert( idx < size );
0861デフォルトの名無しさん
2010/05/30(日) 17:27:55idxがsignedの場合、idxが負でもアサートされねーよ
0862デフォルトの名無しさん
2010/05/30(日) 17:28:42それで警告無視するのは問題外だろ
0863デフォルトの名無しさん
2010/05/30(日) 17:34:38符号無しで統一している場合、
負数を入れる奴がいても>>860で検出できる
0864デフォルトの名無しさん
2010/05/30(日) 17:38:24お前何も分かってないな・・・
キャストはアップキャスト以外は常に危険性を孕んでるんだよ
C++型のキャストが何であんな面倒くさい形してるかよく考えろ
0865デフォルトの名無しさん
2010/05/30(日) 17:39:36せっかくだから俺はgoogle先生を信じるぜ!
0866デフォルトの名無しさん
2010/05/30(日) 17:41:410867デフォルトの名無しさん
2010/05/30(日) 17:42:270868デフォルトの名無しさん
2010/05/30(日) 17:45:060869デフォルトの名無しさん
2010/05/30(日) 17:45:44Cのキャストは何もしないから危険なんだろ。
いかなる型でもコンパイラがエラー出さなければ、強制で指定された型と見なされる。
実行時に動的な変化はしない。
コンパイル時に既になんの型か決まってしまう。
854 855は正しいだろう。
0870デフォルトの名無しさん
2010/05/30(日) 17:48:07「キャスト」した場合に限って特に言及されてるのが変な気がしたんだ。
0871デフォルトの名無しさん
2010/05/30(日) 17:49:430872デフォルトの名無しさん
2010/05/30(日) 17:50:41キャストした方がマシ
しかし、それよりはキャストが必要ないように組むのがベター
0873デフォルトの名無しさん
2010/05/30(日) 17:52:10何を根拠にそんなことを言ってるの?
signed/unsigned の変換で専用の関数を呼び出すような実装だって規格の範囲内だろ。
0874デフォルトの名無しさん
2010/05/30(日) 17:53:100875デフォルトの名無しさん
2010/05/30(日) 17:58:18is系関数は罠の塊だな
キャスト必須だ
0876デフォルトの名無しさん
2010/05/30(日) 18:04:47あーあー、どうすんだ?
エラー検知できてないぞ
unsigned厨涙目www
0877デフォルトの名無しさん
2010/05/30(日) 18:07:57アホか
0878デフォルトの名無しさん
2010/05/30(日) 18:19:43static std::vector<int> a(0xc0000000); // 適当にとったすごく大きいサイズ
assert(index < a.size());
return a[index];
}
こうですかわかりません
0879デフォルトの名無しさん
2010/05/30(日) 18:22:260880デフォルトの名無しさん
2010/05/30(日) 18:22:55#include <cstdlib>
#include <cassert>
#define SIZE 200
struct Hoge
{
void operator [] (unsigned idx) { assert(idx < SIZE); std::puts("...do something..."); }
void operator [] (signed idx) { assert(0 <= idx); (*this)[static_cast<unsigned>(idx)]; }
};
int main(void)
{
Hoge hoge;
hoge[100];
// hoge[-1];
// hoge[200];
system("pause");
return 0;
}
ていうかこれでいいじゃん
既存のコードをいちいちラップするのメンドクセーけどさ
0881デフォルトの名無しさん
2010/05/30(日) 18:23:21符号付きと符号なしを直接比較するな
0882デフォルトの名無しさん
2010/05/30(日) 18:25:30じゃあsignedにあわせる
0883デフォルトの名無しさん
2010/05/30(日) 18:27:19毎回チェックしろっていうなら singed 引数にして中でチェックしてほしい。
そうは思わんかね?
0884デフォルトの名無しさん
2010/05/30(日) 18:31:55これイイね
0885デフォルトの名無しさん
2010/05/30(日) 18:35:52std::vectorはそうなってないし
0886デフォルトの名無しさん
2010/05/30(日) 18:36:56オーバーフローが起こる状況ならチェックを入れるのが当然
0887デフォルトの名無しさん
2010/05/30(日) 18:38:400888デフォルトの名無しさん
2010/05/30(日) 18:47:330889デフォルトの名無しさん
2010/05/30(日) 18:54:240890デフォルトの名無しさん
2010/05/30(日) 19:12:57そして俺はBetter C
0891デフォルトの名無しさん
2010/05/30(日) 19:44:36動的配列はvectorでとかなら分かるんだが
負数を入れてしまう間違いを防ぐためだけに
あまり使うことが無いとはいえ、最上位の1bitを
犠牲にしてしまうのはC/C++としてどうなのか
安全性を取るか、無駄を省くか、ここらへんは好みによって
違ってくる
0892デフォルトの名無しさん
2010/05/30(日) 19:47:110893デフォルトの名無しさん
2010/05/30(日) 19:53:00サイズやインデックスの値域は
普通に符号なしでなければ表現できない・・・環境もあるってことだ
0894デフォルトの名無しさん
2010/05/30(日) 19:56:55vc++はわかんね。
0895デフォルトの名無しさん
2010/05/30(日) 20:03:06残念ながらVCはでないね。
MinGWもインストールするべきかなあ?
0896デフォルトの名無しさん
2010/05/30(日) 20:23:38どっち使っても変わらない気がします。
0897デフォルトの名無しさん
2010/05/30(日) 20:28:07どっち使っても構わない
0898デフォルトの名無しさん
2010/05/30(日) 20:29:340899デフォルトの名無しさん
2010/05/30(日) 20:34:43read writeで別々に動作したりするのかと思ったりして、試してもそんなことなく。
判らなかったんです。
0900デフォルトの名無しさん
2010/05/30(日) 20:37:08std::ostream&にキャストして使うならseekpしか使えない
(dynamic_castすれば別だが)
まあそういう事だ
0901デフォルトの名無しさん
2010/05/30(日) 20:49:01/Wall
0902デフォルトの名無しさん
2010/05/30(日) 21:06:130903デフォルトの名無しさん
2010/05/30(日) 21:10:160904デフォルトの名無しさん
2010/05/30(日) 22:04:39C++なんだからlogic_error例外出しましょうよ普通に
0905デフォルトの名無しさん
2010/05/30(日) 22:08:37assertと例外は別物
0906デフォルトの名無しさん
2010/05/30(日) 22:10:480907デフォルトの名無しさん
2010/05/30(日) 22:11:45レイヤが違うというならそれはまーそうだが
0908デフォルトの名無しさん
2010/05/30(日) 22:28:390909デフォルトの名無しさん
2010/05/30(日) 23:23:14超汎用目的である std::vector なら符号無しのインデックスもまぁやむをえない事情かも
しれないとは思うが、それを基本としてユーザーコードが真似るべきかというと、そうでは
ないだろうと。
0910デフォルトの名無しさん
2010/05/30(日) 23:24:23ライブラリ実装のバグなんかで呼び出し元に logic_error 飛ばされても困る。
0911デフォルトの名無しさん
2010/05/30(日) 23:25:070912デフォルトの名無しさん
2010/05/30(日) 23:26:54それに付随して符号なしを使わざるを得ないケースがあるということだ
0913デフォルトの名無しさん
2010/05/30(日) 23:33:470914デフォルトの名無しさん
2010/05/30(日) 23:34:180915デフォルトの名無しさん
2010/05/30(日) 23:38:08http://stackoverflow.com/questions/1555154/default-int-type-signed-or-unsigned
0916デフォルトの名無しさん
2010/05/30(日) 23:40:140917デフォルトの名無しさん
2010/05/30(日) 23:41:54リリース時にバグがあっても問題ないように符号有りにするのか
値の入力元でチェックすればエラーチェックが伝播することは
ないんだけど、全部チェックしたほうがいいんだろうか?
でもそうすると普通の配列とか使えなくなるから
ラップしないといけなくなるな…
0918デフォルトの名無しさん
2010/05/30(日) 23:42:09機械にマッチしているのは符号無し。
0919デフォルトの名無しさん
2010/05/30(日) 23:44:240920デフォルトの名無しさん
2010/05/30(日) 23:44:384Gのファイルにアクセスするには、符号無ししかない。
符号無しでも範囲チェックは入れられるが。
[]関数作って、ある程度以上かをチェック。
0921デフォルトの名無しさん
2010/05/30(日) 23:44:490922デフォルトの名無しさん
2010/05/30(日) 23:47:24拡大体とGF(2^n)は別物なんだが
0923デフォルトの名無しさん
2010/05/30(日) 23:55:390924デフォルトの名無しさん
2010/05/30(日) 23:58:16中の人のチェックじゃ、サイズが非常に大きいときに[]に負数を渡した場合、エラーを検出できないんだよ
0925デフォルトの名無しさん
2010/05/31(月) 00:03:050926デフォルトの名無しさん
2010/05/31(月) 00:36:1816エクスビバイトだぜw
32ビット時代でも、メモリは4Gのせられても
OSの制限から全部使えなかったりするので
結局あり得なかったりする
0927デフォルトの名無しさん
2010/05/31(月) 00:38:160928デフォルトの名無しさん
2010/05/31(月) 00:40:28size_tに統一すれば負数は使わない。
0929デフォルトの名無しさん
2010/05/31(月) 00:42:40{
static_assert(std::numeric_limits<Num>::is_integer, "err");
static_assert(sizeof(Num) <= sizeof(unsigned int), "err");
assert(Num(0) <= n);
return n;
}
std::vector<hoge> v(check(-10)); // assert
std::vector<hoge> v(check(20.55) // static_assert
v[check(1000000000000000)]; // static_assert
std::vector<hoge> v(check(10000)); // Cool!
v[check(100)] = hoge(); // Oh! fantastic!
みなさんもこれ使っていいですよ!
0930デフォルトの名無しさん
2010/05/31(月) 01:18:51sizeofと値の表現長は全く関係ないんだが。
有効ビット数が得られないのと同じで、厳密に判定するには処理系ごとの規定する範囲をテーブルやtraitsに持って比較するしかない。
0931デフォルトの名無しさん
2010/05/31(月) 01:28:31あ、 max(), min() は static_assert で使えないんだっけ?
0932デフォルトの名無しさん
2010/05/31(月) 07:34:040933デフォルトの名無しさん
2010/05/31(月) 07:41:270934デフォルトの名無しさん
2010/05/31(月) 08:55:490935デフォルトの名無しさん
2010/05/31(月) 09:05:130936デフォルトの名無しさん
2010/05/31(月) 12:16:07無い物は無い・・・・真理だね。
0937デフォルトの名無しさん
2010/05/31(月) 16:02:530938デフォルトの名無しさん
2010/05/31(月) 19:12:510939デフォルトの名無しさん
2010/05/31(月) 20:06:190940デフォルトの名無しさん
2010/05/31(月) 21:31:350941デフォルトの名無しさん
2010/05/31(月) 21:43:190942デフォルトの名無しさん
2010/06/01(火) 01:06:25場合「gcnew演算子」を使いますが、ネイティブC++の場合 new 演算子を使い
ます。このあたりごっちゃになってよくわからないのですが、どう違いがあるのでしょういか?また現場ではどちらが良く用いられているのでしょうか?
0943デフォルトの名無しさん
2010/06/01(火) 01:13:58僅かでもDOTNET混じれば、DOTNETに統一した方がメモリ管理にむだが無くなるんでは。
0944デフォルトの名無しさん
2010/06/01(火) 01:17:37new演算子は単にヒープからメモリ確保の要請をOSに出して、その結果として要請された大きさを持つ空間の頭のアドレスをポインタとして取得でき、
使い終わったらdelete/delete[]でOSに確保要請したメモリ空間の管理権限を返します(開放)。
つまりnewによって取得したアドレスは、プログラムが管理しなければいけないメモリ空間のアドレスです。
そしてgcnewですが、OSの持つガーベージコレクタという自動メモリ管理機能に開放の管理を委ねます。
具体的には、プログラムの指定したタイミング(もしくはリソースが競合しなければプログラムの処理フローと無関係なタイミングで)
OSが「どこからも使用されていないメモリ空間」を検出し、自動でdelete/delete[]に当たる処理を行います。
C++のnewでとある型ExTypeの大きさを持つ空間をヒープから持ってくる場合、実行時に「それがポインタであるか」とか「組み込み型であるか」などといった情報は不明です。
全てコンパイル時に検査してしまうからです。これはメモリ解釈を比較的自由にやらせてくれる余地と無駄な情報を省くメリットがありますが、
OSから見ればどんな使われ方をするか分からないので柔軟な管理ができません。
そこでgcnewという処理系依存の機能を提供しているわけです。これ以上はCLIスレでどうぞ。
0945デフォルトの名無しさん
2010/06/01(火) 01:19:58thanks
dot NET-->C++/CLI
C Runtime -->Native C++
こんなかんじですか、なるほど、例えば、メモリ管理のムダを考えなければ、
CLI のコードの中に、 NativeC++ もかくことができるのか。
0946デフォルトの名無しさん
2010/06/01(火) 01:22:18大変詳しい解説ありがとうございました。なるほど、メモリ管理がポイントですね。
0947デフォルトの名無しさん
2010/06/01(火) 01:22:39できないよ。
gcnewされるクラスTが内部でNativePointer pを持っていたらTの破棄時にpから先をたどれない
0948デフォルトの名無しさん
2010/06/01(火) 01:31:11ポインタ、その破棄時、
そのポインタ について、なかなかおもいつかなかったです。そう考えるのですね。なるほどです
0949デフォルトの名無しさん
2010/06/01(火) 01:48:350950デフォルトの名無しさん
2010/06/01(火) 14:18:26ホワイトスペースの取り扱いが本家と違うが、想定内の動きはしている。
長いパスと巨大ファイルへの対応が主。
fstreamをfwstreamで置き換えれば使える。
http://kineko.dyndns.org/~touhou/up/source/up5469.txt
0951デフォルトの名無しさん
2010/06/01(火) 14:21:370952デフォルトの名無しさん
2010/06/01(火) 15:14:340953デフォルトの名無しさん
2010/06/01(火) 15:46:410954デフォルトの名無しさん
2010/06/01(火) 18:45:12規格書10ぺん読み直してこい
0955デフォルトの名無しさん
2010/06/01(火) 18:52:43#include <malloc.h> // #include <cmalloc>ではない
class stringadr : public std::string // std::stringの継承
// 0 ではなく NULL の使用
// DWORD その他WinAPI の使用
// 「fstreamをfwstreamで置き換えれば使える。」 "..." が L"..." ではないので使えない
// Cスタイルキャストの使用
// std::size_t が size_t ではない
// 識別子"motosize" (笑)
0956デフォルトの名無しさん
2010/06/01(火) 19:07:16あれ循環しないってわかってる時には使わないようにしたいんだけどそういうオプション無いの?
0957デフォルトの名無しさん
2010/06/01(火) 19:15:02__int32と__int64の方が気持ち良くない?
| long a = (long) (iti - b * (1 << 31));
| int n = SetFilePointer ( fp, a, &b, FILE_BEGIN );
何コレ。DWORDをintに突っ込むな。
0958デフォルトの名無しさん
2010/06/01(火) 21:28:250959デフォルトの名無しさん
2010/06/01(火) 21:30:450960デフォルトの名無しさん
2010/06/01(火) 21:35:35ほぼすべての箇所で32bit符号なし整数よく64bitいるのはファイル位置とサイズの所。
std::stringの継承は良くないの?
テストコードで動いたからアップしたけど。手直ししてみるよ。
ライセンスはCC0で。
0961デフォルトの名無しさん
2010/06/01(火) 21:38:15日本語版の47ページに書いてあるじゃん
「thisを導入した時はまだ、リファレンスというものはなかった。」
0962デフォルトの名無しさん
2010/06/01(火) 21:41:390963デフォルトの名無しさん
2010/06/01(火) 21:59:350964デフォルトの名無しさん
2010/06/01(火) 22:01:16#include <iostream>
#include <string>
class A : public std::string {
public:
~A() { std::cout << "~A()" << std::endl; }
};
int main() {
std::string* p = new A;
delete p;
}
0965デフォルトの名無しさん
2010/06/01(火) 22:02:09今はできないから*const
0966デフォルトの名無しさん
2010/06/01(火) 22:11:16#include <iostream>
#include <string>
using namespace std;
class A : public std::string {
public: ~A() { std::cout << "~A()" << std::endl; } };
class B {
public: ~B() { std::cout << "~B()" << std::endl; } };
int main() {
A* p = new A; delete p;
B* q = new B; delete q;
}
0967デフォルトの名無しさん
2010/06/01(火) 22:11:46そんな関数,ファンクタ,定形句、そういったものって何か無いかな?
0968デフォルトの名無しさん
2010/06/01(火) 22:15:13std::string* にして delete できない
0969デフォルトの名無しさん
2010/06/01(火) 22:17:060970デフォルトの名無しさん
2010/06/01(火) 22:19:28Map m;
for (Map::iterator it = m.begin(); it != m.end(); ) {
if (...) {
m.erase(it++);
} else {
++it;
}
}
0971デフォルトの名無しさん
2010/06/01(火) 22:29:15stringと関係無いだろ。
#include <iostream>
using namespace std;
class A {
public:
A() { std::cout << "A start" << std::endl; }
~A() { std::cout << "A end" << std::endl; } };
int main() {
void *p = new A; delete p; }
0972デフォルトの名無しさん
2010/06/01(火) 22:40:05おいおい
仮想デストラクタって知ってるか?
0973デフォルトの名無しさん
2010/06/01(火) 22:44:22こんなレベルじゃ怖すぎて使えないなwww
0974デフォルトの名無しさん
2010/06/01(火) 22:51:51あと、他所でもメモリ管理は手間かかるからstringで代替えしてる。
用途的にはこれでも一緒だけど、アクセスが一段階増えてみた目良くない。
class string_adress {
public:
string buf;
long long adress;
}
0975デフォルトの名無しさん
2010/06/01(火) 22:53:52何故継承した
0976デフォルトの名無しさん
2010/06/01(火) 22:58:30x.buf[n]とx.adressより、
x[n]とx.adressの方が良いからだよ。
0977デフォルトの名無しさん
2010/06/01(火) 23:09:43やはり自分でループ書いて一個一個やるしか無いのかな
Erase-Removeイディオム的なものがあったらいいなと思ってたんだが…
0978デフォルトの名無しさん
2010/06/01(火) 23:14:26その追加した変数を外部からしか操作しないってのは
俺には違和感大有り
見た目悪くても構造体にすべきだろう
0979デフォルトの名無しさん
2010/06/01(火) 23:19:05string buf;
long long adress;
関数での受け渡しの時に一変数の方が見やすい。
見た目、書く量減らすには継承になった。駄目か?
0980デフォルトの名無しさん
2010/06/01(火) 23:22:450981デフォルトの名無しさん
2010/06/01(火) 23:32:20あとfopenも追加しよう。
DWORD (unsigned long) はWINAPIの要請で使うしかないな。
HTTP(S)も同じ操作にしようと思っているところ。
0982デフォルトの名無しさん
2010/06/02(水) 00:04:03コード公開したいなら他人が弄り易いコードにすれば?
仮想デストラクタとか多重継承とかを考えれば普通そこで継承はない。
0983デフォルトの名無しさん
2010/06/02(水) 02:56:51まあstringadrでもいいけどせめてprivateにしよう。
というかなぜprivateにしなかったし。
itiって最初何のことか分からんかった。
0984デフォルトの名無しさん
2010/06/02(水) 07:01:350985デフォルトの名無しさん
2010/06/02(水) 07:34:170986デフォルトの名無しさん
2010/06/02(水) 07:36:340987デフォルトの名無しさん
2010/06/02(水) 15:19:22age.insert( 0 );
set<int>::iterator itr = age.find(0);
if( itr != age.end() ){
*itr = 1; // 38行目
}
をコンパイルすると、
hoge.cpp:38: error: assignment of read-only location ‘itr.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = int]()’
というエラーが出てくるのですが、原因が分かりません。
どうしたら解決できるでしょうか?
0988デフォルトの名無しさん
2010/06/02(水) 15:54:09やっぱりboost使っておけばいいじゃんという結論に落ち着いてなんだかなぁ
自作スマポ練り込んで使ってる人って居ます?
0989デフォルトの名無しさん
2010/06/02(水) 15:54:260990デフォルトの名無しさん
2010/06/02(水) 15:55:03外部から書き換えられるとソートされた
状態を維持できない(かもしれない)。
たから書き込み禁止にしてるんじゃないかな。
対処としては、検索して見つかったのをeraseして、新たな値をinsertする、とかじゃないかな。
0991989
2010/06/02(水) 16:05:28GCCについて part9
0992デフォルトの名無しさん
2010/06/02(水) 17:04:14scoped_ptrに動的削除子とdeep copyの機能持たせただけのやつは自作してけっこう使ってる
自作でshared_ptr以上のものってなるとしんどいけど、shared_ptrじゃオーバーだろって時は自作してもいいんじゃね?
0993デフォルトの名無しさん
2010/06/02(水) 17:29:11std::setのイテレータはconst_iteratorってちゃんとエラーに出てるじゃん
insert()で入れなされ
0994デフォルトの名無しさん
2010/06/02(水) 18:26:30{
Object obj[8]
func( obj );
}
func( Object *obj ){
obj[0]->getobj();
obj[1]->getobj();
}
みたいな、わかりづらくてすみません。
0995デフォルトの名無しさん
2010/06/02(水) 18:30:44当然
オブジェクトのリファレンスも渡す事ができる
template <int N>
func(Object (&obj)[N])
{
}
0996デフォルトの名無しさん
2010/06/02(水) 18:31:34おっとまった
obj[0]->getobj();
obj[1]->getobj();
これはおかしいな
obj[0].getobj();
obj[1].getobj();
こうか
obj->getobj(); だろ
0997デフォルトの名無しさん
2010/06/02(水) 18:57:480998デフォルトの名無しさん
2010/06/02(水) 19:03:27触れる部分は少ないが
参考にはなる
0999デフォルトの名無しさん
2010/06/02(水) 19:13:06即値で渡すと配列型からポインタに変換されてしまって動かないし、要素数書いても無視される。
一方でリファレンス使えば勝手に変換されることもないので、
テンプレートで要素数推論してObject[N]型へのリファレンスで渡せば問題なく通る。
1000デフォルトの名無しさん
2010/06/02(水) 19:24:13template <size_t N> void func(int (&a)[N])
{
func(a, N);
}
通はこうするよ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。