最近のマシンはメモリが安価で優秀なのでSTLで実行ファイルの大きさが10倍になっても特に問題ありません。
8 :
3-7 :2009/11/28(土) 16:41:48
>>1 スレ建てしてくれたのはうれしいけど
ご自分でテンプレまで貼ってくれると
もっとみんなが幸せに。
new禁止ってこれで完璧? #include <cstddef> class Foo { static void *operator new (std::size_t size) { return ::operator new (size); } }; int main(void) { // Foo *foo(new Foo); return 0; }
throw() があるとpaafekuto
>>11 を調べていたら、こんなの見つけた。
関係ないだろうけど面白かった。
////////////////////////////////////////////////////////
CやC++において、演算子の結合は、優先順位ではなく(各々の標準規格での)文法によって定められている。
このため、微妙な差異が生じる場合がある。たとえば、Cの条件演算子は以下のように定義されている。
logical-OR-expression ? expression : conditional-expression
一方、C++では次のように定義されている。
logical-or-expression ? expression : assignment-expression
そのため、
e = a ? b : c = d
という式は、Cだと
e = ((a ? b : c) = d)
と解釈されて条件演算子の結果が左辺値でないことによるエラーとなるが、C++だと
e = (a ? b : (c = d))
と解釈され、正しい式となる。
条件演算子(?:)って同じ型しか返せないんじゃなかったかな。 だから classD も classB に暗黙に変換される。
14 :
デフォルトの名無しさん :2009/11/28(土) 17:16:40
あとJIS的には条件演算子じゃなくて 二択条件演算子 っていうんだね。
>>10 ::operator newってbad_allocをthrowしないの?知らなかったじぇ
16 :
11 :2009/11/28(土) 17:25:12
地鎮祭 STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
18 :
11 :2009/11/28(土) 17:40:21
次のコードが
VC++, Digital Mars C++でコンパイルエラーとなります。
g++. bcc 5.5.1, Comeau C++ではコンパイルエラーとはなりません。
ttp://codepad.org/VNafKGhX VC++, Digital Mars C++のバグと言うことでしょうか?
そうですよ
かもね
∧_∧ ( ´∀`) ( ) | | | (__)_)
すいません。enumで定義した定数を使ってfor文を回したいんですけどどうしたらいいですか。 enum SOME_IDX {
すいません。enumで定義した定数を使ってfor文を回したいんですけどどうしたらいいですか。 enum SOME_IDX { AAA, BBB, (続く) ZZZ, SOME_IDX_NUM }; このようになっていて、 for(SOME_IDX idx=0; idx<SOME_IDX_NUM; idx++){
すいません。enumで定義した定数を使ってfor文を回したいんですけどどうしたらいいですか。 enum SOME_IDX { AAA, BBB, (続く) ZZZ, SOME_IDX_NUM }; このようになっていて、 for(SOME_IDX idx=0; idx<SOME_IDX_NUM; idx++){ func(idx); } というようなことをやりたいんですが。
for(SOME_IDX idx=AAA; idx<SOME_IDX_NUM; idx++){ func(idx); }
ちょっと頭悪すぎますね?
なんだと
++がコンパイルエラーになります
for(int idx=AAA; idx<SOME_IDX_NUM; idx++){ func(idx); }
funcの引数の型がIDXなので変換できないと怒られます
static_cast<IDX>(idx)
質問が糞過ぎて釣りだと思ってた
答える側も釣ってるんだと思ってた
できますたありがとうございました。
oprator++を定義する
1発で答えられてねえし
C++0xをVSが取り入れるのはいつですか
39 :
19 :2009/11/28(土) 19:22:35
やっぱりバグですか…。 VC++で、どうすればこれを回避できますでしょうか?
>>38 C++0xはまだ出来上がってないから、当然まだ取り入れられることもないだろ。
VS2010で完全じゃないけど一部の機能が取り入れられるよ
>>19 return flag ? MyString(hoge.value) : (flag ? hoge : MyString(hoge.value));と書くのはだめなの?
43 :
19 :2009/11/28(土) 19:37:42
>>42 ありがとうございます。
なるほどcastで解決するのですね。
C++の余命を教えてください(>_<) まじめな質問してごめんなさい(>_<)
1000 名前:デフォルトの名無しさん[sage] 投稿日:2009/11/28(土) 17:09:20 1000なら3年後までにC++衰退
呪術はお呼びじゃねえよ
C++03が衰退するのは間違いない
またコーディング規約に禁止事項が増えるのか
コーディングが禁止される禁治産者が増えるの間違いだろう
教えてくれてありがとうございます(>_<) それでは皆さん、何時もの様にクダラナイ質問をどうぞ(>_<)
よくわからんけどC++03xはC99と同じでコンパイラメーカーが 無視する可能性はある C++98/2003で作られたプログラムが多いからだ
(>_<) これつかうやつは女が多い ありがとうございました!! と小文字の!を2度使うやつも
そりゃC++03xは無視だろさ C++0xに関してはVC++とGCCはサポートするのが既定路線
ttp://codepad.org/X0l4gJpf これですが、手元で自分で
g++ ソースファイル.cpp -O0
として実行しても
ClassY()デフォルトコンストラクタ
ClassX()デフォルトコンストラクタ
/////////以下foo()/////////
ClassX()デフォルトコンストラクタ
ClassY(const ClassX&)コンストラクタ
と表示されるだけで、両方とも最後のコピーコンストラクタが
実行されません。
この違いはどこから来ているのでしょうか?
また、codepadと手元のg++はどちらが正しい挙動ですか?
>>54 そのコピーコンストラクタの呼び出しは省略可能。
12.8 Copying class objects p15
> When certain criteria are met, an implementation is allowed to omit the copy
> construction of a class object, even if the copy constructor and/or destructor
> for the object have side effects. ...
>>55 ありがとうございます。
> 一定の条件が満たされれば
> たとえコピーコンストラクタやデストラクタが副作用を持っていたとしても
> 省略可能
なんですね。
ttp://codepad.org/b2yZXUQi このように15行目だけstatic_castを付けて変えたのですが
これも同様の理由で省略されたと考えられるのですね。
ありがとうございました。
//↓このように定義して typedef boost::shard_ptr< std::vector<T> > PtrVector<T>;//実際はエラーになる PtrVector<std::string> ptrVecString; PtrVector<CHoge> ptrVecHoge; .... .. とういふうに使いたいんだけど,どのように書けば良いですか?
template<typename T> struct PtrVector { typedef boost::shared_ptr<vector<T> > type; }; PtrVector<std::string>::type ptrVecString;
ありがとうございました。
60 :
57 :2009/11/29(日) 01:15:33
>>14 ISO のほうでは "Conditional operator" で C も C++ もいっしょなのに、
なんで JIS C++ だけ余計なもんが付いてるのかねぇ?
配列にクラスの型を入れてnewできますか?
例を
こうですか?わかりますん!>< #include <typeinfo> class C { std::type_info const& type; public: C() : type(typeid(C)) {} }; int main() { new C[10]; }
@をAのようにしたいです。 @ if(i == 0){ hoge = new Class0(); }else if(i == 1){ hoge = new Class1(); } A hoge = new classTable[i]();
newじゃなくて関数ポインタの配列を使ってCreateClassx()を並べればできるかもな。 あとは全部にClone()実装した具象クラスの配列とか。 ただし、そこまでやる価値があるかどうかは俺は知らん。
class Hoge{}; Hoge* operator[](type_t x){ switch(x)
VC++2008EE使ってるんですがオプションのVC++ディレクトリで必要なライブラリやインクルードファイルの場所指定してるのに必ずリンカでエラー起こします 何が原因でしょうか? しょうがないのでプロジェクトのプロパティから追加もしてみましたがリンカでエラーでした
>>17 の地鎮祭だけど、
ダイナミックリンクだろうがなんだろうが
テンプレートライブラリであるstd::vectorを使って、
ファイルサイズが増えないのは効果あるんじゃないの?
72 :
デフォルトの名無しさん :2009/11/29(日) 11:13:41
暗黙の型変換と明示的な型変換が区別つきません。 hoge_t a(b);//1 hoge_t p = static_cast<hoge_t>(q);//2 hoge_t x = y;//3 だと、1と3が暗黙の型変換で、2が明示的な型変換でしょうか? とすると、hoge_tの該当するコンストラクタにexplicitが付いていると できなくなるのは1と3でしょうか?
初歩的な質問なんですが、基底クラステンプレートから派生された2つのクラステンプレート のインスタンスを基底クラスに代入するときは基底クラステンプレートのポインターの宣言時に <>はいらないですか?
bcc 5.5.1で
ttp://codepad.org/RglmIAAy がコンパイルできません。
他のコンパイラ(VCとかg++とか)では問題無く動作します。
エラー E2291 ******.cpp 20: } が必要(関数 main() )
エラー E2034 ******.cpp 20: 'ClassX' 型は 'struct' 型に変換できない(関数 main() )
エラー E2141 ******.cpp 20: 宣言の構文エラー(関数 main() )
エラー E2139 ******.cpp 20: 宣言に ; がない(関数 main() )
警告 W8004 ******.cpp 20: 'hoge' に代入した値は使われていない(関数 main() )
エラー E2190 ******.cpp 20: 不要な }
エラー E2040 ******.cpp 22: 宣言が正しく終了していない
エラー E2190 ******.cpp 23: 不要な }
*** 7 errors in Compile ***
こんなエラーが表示されます。
何とかして別の構文を考え出して構造体の初期化をbcc 5.5.1でもできる
ようにしたいのですが、良い方法が思いつきません。
よろしくお願い申し上げます。
75 :
73 :2009/11/29(日) 13:53:09
仮引数だと<>をつけなくても宣言できますよね。 と言うことはポインターや参照の宣言でも<>いらないってことですか?
クラス使えよ
77 :
74 :2009/11/29(日) 13:59:55
78 :
デフォルトの名無しさん :2009/11/29(日) 14:53:43
>>79 試したけどわかりませんでした。
よろしくお願いします。
なんで分からないんだよ
ほっとけ
たぶん何を試して良いのか 質問している方も分かってないんじゃね? 分かっているというなら ” ソースみせろ ”
>>73 これはテンプレート初心者が良く疑問に思う良い質問ですね。
私も疑問に思っていて未だに試す機会が無いので
こういった質問してくれるととても助かります。
2ch に書き込みできてフリーのコンパイラは使えないなんてやつはなかなかいない。 質問してくれただけで助かることなんて無いし、あったとしてもわざわざそれだけを 書き込む意味がない。 「良く疑問に思う良い質問」だと言うのならよくある回答をしてあげればいいのに。
ハァァァァァァァァ
くせぇ流れだな だから構うなって言ったんだよ
応答時間がやたら早すぎな人工無能
素直にこたえてりゃあこんなこたーにならねかったのになー
istringstreamとostringstream の違いが分かりません。 教えてください!or分かるサイトを教えてください!
こんなスレで聞くよりyahoo知恵袋で聞いた方がいいよ。
98 :
デフォルトの名無しさん :2009/11/29(日) 16:37:22
ちゃんとistringstreamとostringstreamの違いが分かるサイトをおしえてあげたのに ひどい言われようだな。
100 :
デフォルトの名無しさん :2009/11/29(日) 16:47:55
103 :
95 :2009/11/29(日) 17:20:36
104 :
74 :2009/11/29(日) 18:42:44
bcc 5.5.1で、 std::numeric_limits<double>::has_quiet_NaNがtrueのくせに quiet_NaN() std::numeric_limits<double>::quiet_NaN()==std::numeric_limits<double>::quiet_NaN() がtrueになってしまいます。 std::numeric_limits<double>::quiet_NaN()!=std::numeric_limits<double>::quiet_NaN() はfalseになってしまいます。 またこのquiet_NaN()をstd::coutやstd::stringstreamに出力すると プログラム(成果物の方。)が落ちます。 この状態でどうにかしてquiet_NaN()をNaNであると判別したいのですが、 名案を授けてくださる方いらっしゃいませんでしょうか? bccを捨てるのが一番な気がしますが、 どうかよろしくお願いします。
105 :
74 :2009/11/29(日) 18:48:54
やっぱbcc捨てます。 失礼しました。
106 :
デフォルトの名無しさん :2009/11/29(日) 18:55:18
Microsoft Visual C++ 2008 Express Editionの話ですけど 文の左に番号を表示する方法はありますか? ビルドするたびにエラーの場所を上から数えるのつらいです
最近釣り多いな F8 キー押せ
もしくはエラーメッセージをダブルクリック
109 :
106 :2009/11/29(日) 19:01:19
事故解決しました
それか Ctrl + G 押して 行番号指定して OK ボタンを押す
それにまだまだいろいろあるんだが 解決したんなら必要ないか
ディレクトリの探索をwin linuxで行うにはどうすればいいですか boostとか大かがりなのはいやです 追加が最小のやり方かいいです
>>112 いやboostにしとけ。
> boostとか大かがりなのはいやです
十分使われて検証されているヤツがいいに貴マットル。
>>112 #ifdef
をつかって2通り書け。
それが
> 追加が最小のやり方
だ。
そうなってるヘッダわけてくれお
自分で書く量もすくないのがいいんです
118 :
113 :2009/11/29(日) 19:42:45
そもそもなんでboostじゃダメなのか わからない。 俺なんて自分や同僚のコードより絶対boostを信頼して 使うけどなぁ。
119 :
72 :2009/11/29(日) 20:02:09
121 :
72 :2009/11/29(日) 20:12:27
122 :
72 :2009/11/29(日) 20:13:51
>>118 自分だけで使うなら良いんですがソース配布して標準のコンパイラで
コンパイルできた方が良いんです
>>117 環境に依存しないようにしたいんです 少なくともwinとlinuxで動作するのがいいいんです
125 :
114 :2009/11/29(日) 20:40:58
>>124 > 環境に依存しないようにしたいんです 少なくともwinとlinuxで動作するのがいいいんです
ちょ!
その一文が無茶。
ファイルやディレクトリの形式が違うことは知ってるだろ?
書け。自力で。それっきゃないだろ。
だいたいそうじゃないと
> ソース配布して
この時困ったことになるぞ?
まあ#ifdef _WIN32で opendir()とFindFirstFile()を使い分けるくらいしか無いべさ
windowsの場合は dirent.h windows でぐぐってきたやつぶち込んでやってみることにしました。
>>104 ECC6.1.0での結果
int main()
{
std::cout << std::boolalpha << std::numeric_limits<double>::has_quiet_NaN << std::endl; // true
std::cout << (std::numeric_limits<double>::quiet_NaN() == std::numeric_limits<double>::quiet_NaN()) << std::endl; // false
std::cout << (std::numeric_limits<double>::quiet_NaN() != std::numeric_limits<double>::quiet_NaN()) << std::endl; // true
std::cout << std::numeric_limits<double>::quiet_NaN() << std::endl; // +NAN
}
最新版はちゃんとバグ取れてるよ
あ、ごめん ECC6.2.0(Embarcadero C++ Compiler)だった
131 :
74 :2009/11/29(日) 23:11:35
>>129-130 ありがとうございます。
ECC6.2.0(Embarcadero C++ Compiler)は有償版でしょうか?
無償で公開されている中での一番新しい版はBCC5.5.1だと思っているのですが。
g++でmakefileを作らないで分割コンパイルを1行のコマンドでやるときどんなオプションをつけないといけないですか?
>>132 ふつうに
g++ a.cpp b.cpp c.cpp
でよくね?
>>133 レスの無駄になるので1レスで詳しく説明してください
またかよ。
しりかよ。
137 :
デフォルトの名無しさん :2009/11/30(月) 01:53:34
std::bad_allocを利用して例外処理をしているのですがちゃんと動作するか確認をしたいのですがどうすれば良いのでしょうか? 意図的にメモリリークなんて起こせるんですか?
138 :
デフォルトの名無しさん :2009/11/30(月) 02:01:04
急いでおりますので、早急にお答えいただけると幸いです。
>>137 仮想メモリのある PC 環境ではメモリリークしたからってすぐに std::bad_alloc は出ない。
それっぽいところで自分で throw std::bad_alloc() すればいいよ。
140 :
デフォルトの名無しさん :2009/11/30(月) 02:16:03
>>139 素早い回答ありがとうございます!早速試してみますね(・∀・)
>>125 boostのはそこのところうまくやるようにできてる
正直追加ライブラリに関しては
「boost使うか自分で書け」
だよなぁ
次点はACEくらい?1回しか使ったことないけど
>>137 環境にもよるけど、new char[(std::size_t)-1]のように、明らかに確保できなさそうなほど大きな値でnewするとbad_alloc飛んでくるよ。
143 :
デフォルトの名無しさん :2009/11/30(月) 10:02:25
>>142 わかりました!!それも試してみますね(・∀・)
Windowsのどのコンパイラでもlinux gccのコードが動かせるラッパーはないですか
ラッパー程度で動くのなら cygwin はなぜあんなに巨大なんだ
エミュレートではなく、ラッパーlinux gccインターフェースを winAPIに書き換えるだけで良いのですが。
その都度、ネットで適当なヘッダー見つけてきて動作確認して組み込むのは 面倒です セットがあれば楽なんですが
とりあえず実装依存可の他のスレで相談してみては?
>>147 mingw
それで足りなければcygwin
どこでdownloadするんですか
クラスAの所持しているクラスB[N]配列のコンストラクタそれぞれに クラスAのポインタを渡したいのですがエラーが出ます(VC2003) 配列の初期化は無理なのですか? class Gyudon; class Niku { Gyudon* m_owner; public: Niku( Gyudon* owner) :m_owner( owner ) { } }; // matuya class Gyudon { public: Niku niku[2]; Gyudon() :niku[0](this) ,niku[1](this) { } };
デフォルトコンストラクタ作るか newするしかないですか?
03以前のC++では配列内要素の各々にデフォルトコンストラクタ以外のコンストラクタを呼び出させる事は不可能
ありがとうございます ひどい話だ
配列まわりは、もっと酷いはなしが色々と
kwsk
配列を継承元の型で delete してみるとか
質問です。 クラス内で固定要素の配列を確保する場合、ヘッダファイルで #define BUF_SIZE 100 class Hoge { int buf[BUF_SIZE]; ・ ・ ・ こんな感じでやっていますが、これだとBUF_SIZEのスコープがグローバルになり よろしくないのではと思っています。 そこで class Hoge { enum {BUF_SIZE=100}; int buf[BUF_SIZE]; と考えたのですが、他にいい方法ってありますか?
int buf[100];
>>158 class Hoge
{
static const int BUF_SIZE = 100;
int buf[BUF_SIZE];
これがだめなコンパイラでは、回避策として
>>158 のenum。
float 定数はどうしてる?
namespace 使う
>>158 それenum hackというやつ
名前付いてるぐらいだから問題ないと思う
ただ
>>160 のいうやつが通るならそれがいい
164 :
158 :2009/11/30(月) 18:21:51
>>159-163 ありがとうございます。
>>160 はコンパイル通りましたが、メモリをケチるならenumという感じですかね。
namespaceでもマクロ定義はダメみたいです。
enumがそれなりにベターならこれで解決とさせてもらいます。
>>161 クラス定義内での初期値指定ができないこと以外はいっしょ。
>>166 えっ
namespaceとdefine組み合わせるつもり?
本気で言ってるの?
170 :
デフォルトの名無しさん :2009/12/01(火) 15:54:08
質問させてください。 C++2008でテトリスを作ろうと思っています。 初心者なので、とりあえずソースコードをテキストの内容を一つずつ真似して 行こうと思ってるのですが、いきなりタイトルがsample.cとなっています。 この.cというのはどこにあるのでしょうか? 新規作成のプロジェクトからやるのでしょうか? 私はform.hと出てくるものしか知らないのですが…よろしくお願いします。
馬鹿じゃねーの
日本語から、学ぶべきだと思うんだ。
C言語以前の問題だな 使ってるコンパイラのスレにいきなさい
c++ならソースコードは.cpp でおk?
form.hって C++で.NETか、 がんばれ
>>170 無理。
C++がセルだとすると、
今のお前はヤムチャであるからして
全く話にもならない。
>>176 ちょw
ヤムチャってこんな弱いのwww
ヤムチャにはカメハメ波きかないんだぜ
でもセルならカメハメ波出す必要もなさそうだな。 const char * const p = 〜; って書く程度で死亡できる。
type_infoって本当に実行時の型情報を取得できるの?
struct Hoge { int id; ... }; struct HogeCollection { public: void add(const Hoge& hoge){...} void remove(int id){...} ... }; addとremoveは対になっているわけですが、引数の型が揃っていません。 こういうのってどう思いますか?気持ち悪い?
>>183 addが戻り値としてidを返すといいんじゃね
>>184 addを呼び出した時の情報(戻り値)で、removeが呼び出せれば整合性がとれているという事でしょうか。
しかし、addの引数に渡したhogeのメンバ変数idがそのまま返ってくるというのも冗長に感じるのですが、
そんなことはないんでしょうか?
>>185 確かに冗長かもね。
今のままでも良いと思うよ。
気になるならSTLのvectorとか参考にしてみたら良いんじゃね。
例外のコストってどんなもんなんですか?? 誰か検証してください・・・
boost::filesystemのような、複数の系統のOSにまたがって使える ファイルやディレクトリを操作する系のC++ライブラリで、 ヘッダをインクルードするだけで使えるものはありませんでしょうか?
誰もいないのでしょうか?
>>189 linuxにあわせるヘッダを用意してlinuxソースを書く。
192 :
189 :2009/12/01(火) 22:27:40
ライブラリを作る話でなく、ネット上に公開されているものをご教示いただけませんでしょうか
わざと書いてるだろ 氏ね
つ インストールがいるが。 Microsoft Windows Services for UNIX 3.5 POCO C++ Libraries.
195 :
189 :2009/12/01(火) 22:48:38
その環境で 特定の組み込み型が使えるかどうか コンパイル時に調べることはできませんか? 例えば > long long型が存在している環境ではlong long型をMyIntegerに、 > 存在していない環境ではlong型をMyIntegerに > typedefする これは標準C++の範囲で可能ですか?
確実にある型を組み合わせればいい。 サイズは最低保障されているだけだろ。 int = long longだってあり得る。
ありがとうございました。
>>188 環境による。プログラムにもよる。自分で測れ。
>>189 最終的にはwinAPIに変換するからわざわざC標準使う意味ないと
考えていたけど、最近は全てのCコンパイラで動いて、かつ速度低下がわずかを
目指してる。
#include <limits.h> #ifdef LLONG_MAX typedef long long MyInteger; #else typedef long MyInteger; #endif
わわわわわ!
203 :
デフォルトの名無しさん :2009/12/02(水) 15:57:19
VC++やgccのlongは何バイトですか? x86で
sizeofで調べましょう!
x86 つっても Windows なら 4 バイトだろうし Solaris なら 8 バイトだろうし。
206 :
デフォルトの名無しさん :2009/12/02(水) 17:29:13
上のレスを見ていて思い出したんだが、 C++0xから公式にlong long型が導入される予定だなんだよね。 LONGLONG_MAX と LLONG_MAX ってどっちが公式なの?
linuxでカレントディレクトリを移動する命令ってなんですか
判明しました。chdirでした。 異なるヘッダ名に収録されている命令を、 コンパイル時にヘッダが存在するかどうか調べる方法ありますか。
209 :
デフォルトの名無しさん :2009/12/02(水) 18:15:31
>>208 自分のレスをもう一度
読み直し、
日本語でどーぞ。
windowsでchdirの収録してあるヘッダを読みたいのですが。 コンパイラによるんです
<windows.h> で SetCurrentDirectory を使えばコンパイラによらない
delete this; ってちゃんとデストラクタが呼ばれて、メモリからも解放されるんですか?
213 :
196 :2009/12/02(水) 18:31:18
N次元配列をtemplateで作り込もうとおもってます。 でも、、、 どのようにすれば、arrayの入れ子をつくれるのかがわかりません・・・ 誰か教えてください。 template<class T, int N> array;
template<class T, int N> class array{ typedef array<class T, int N - 1> down_array; }; あとは自分でなんとかしろ
Nが0になったときの動作は一体・・・??
template<class T> class array<T, 0>{ T &opereetaa [](int i){ ritaan array_[i]; } T array_[M]; }; の様な形で特殊化しろ
ありがとうございます。
ここできくようなやつがテンプレート使うな 効率、コンパイル時間が落ちる
継承 テンプレート 下手に使うと内部のコード分量が凄いことになる。 ライブラリ化するときくらいに使えよ
>>219 いいんじゃない?
>>214 はテンプレートでも簡単なテンプレートの話じゃないし。
中・上級者の第一歩ってことで。
222 :
214 :2009/12/02(水) 19:45:56
ww
226 :
214 :2009/12/02(水) 19:52:12
222と223は間隔が短すぎるからむしろ別人だという証拠だろ そして224もその意味で使ってる
228 :
224 :2009/12/02(水) 19:57:14
ホントだ40sec制限引っかかってるw すまねぇ。 今日はもうROMるわ。
229 :
214 :2009/12/02(水) 19:57:33
そうですか。 まあ僕もテンプレートを使いこなせるようにがんばります・・・
230 :
224 :2009/12/02(水) 19:58:04
>>227 ごめんその意味じゃなかったorz
買いかぶってくれてすまない。
マジで。
まあ、しゃあないわな
まあその気になれば40sec制限なんて回避できるけどな。 でもどうでもいい話だな。
え、できんの??
ここみたいなID出ない板なら、単に生とP2を使い分けるだけでも出来るでしょ。
でも
>>232 が言うように、どうでもいい話。
ちなみにこういうことね。
というか
>>233 だってケータイ持ってるだろ。
それから書き込めば余裕だろ?
まぁそりゃそうだけど。携帯は自明すぎるから、それ抜きで語ってる流れだと思った。
wchar_t文字列の先頭が L"\\\\\?\\"なのかチェックしたいのですが どうやればいいですか。 windowsでは、8バイトの比較ですが、unixなどでは不明です。
一字ずつチェックが確実そうですね
>>206 LLONG_MAX
C99でもそうだったし、最新ドラフトN3000でもこれ。
>>238 std::equalとかstd::wmemcmpとか。
string使えば、4文字取り出して=で比較すれば良いだけですが C言語では1文字ずつがいいですか
242 :
206 :2009/12/02(水) 22:15:16
CYG winは、linuxのバイナリ作れますか?
>>243 Cygwin自体にはLinux用バイナリを作る方法は用意されていないが、
自分でLinuxターゲットのGCCをビルドすれば実現可能。
ターゲットのかえ方がわかりません。
サンクス
delete obj; のあとに obj = NULL; ってしとけば誤って複数回delete obj;しても大丈夫だから delete obj;するときにはojb = NULL;する習慣を付けた方が良いって本当ですか
事実関係は正しい。良いかどうかは自分で判断せよ。
誤って複数回deleteするようなプログラムを書かない習慣をつけろよw
何回でもdeleteしてやる
そんな何回もdeleteしてしまう奴はその10倍くらいdeleteし忘れやポインタ上書きメモリリーク地獄だろ。 設計が出来ていないのだからな。
>>247 そんな習慣を今からつけるぐらいなら、より簡単で安全で本質的な解決策である
std::auto_ptr や boost::smart_ptr を使う習慣を付けるべき。
>>247 void object::destroy()
{
delete p_;
p_ = 0;
}
obj.destroy();
obj.destroy();
分かってるとは思うけど
こういうことするなら必須
void Close(){ delete resource_; resource_= NULL; } ~dtor(){ if(resource_ != NULL) delete resource_; } なんてやることはある。
え?って言ってる奴は何なの? ウザすぎる。もうはやってねーし
ウザ過ぎる返答が返ってくる程お前の書き込みがウザかったって事にいい加減気づけ。
もう少しうまい屁理屈で言い返したほうがいいんじゃね?
誰もそういうの求めてないから
え?
> ウザ過ぎる返答が返ってくる程お前の書き込みがウザかった 意味わからん 「卑劣な通り魔に刺される程お前が卑劣だったことに気付け」くらい前後の脈絡が無い
何回でもdeleteしてやる
>>266 あるよ
「やった奴と同じ業を、やられた奴も持っていたからそれが起きたんだ」という主張が
めちゃくちゃだという話
業ってw 下らない書き込みしたから下らない流れになっただけだろうが。 発端が何を偉そうに言ってるんだか。
std::pow(-0.001, 1.0 / 3.0) が -0.1 じゃなくて -1.#IND000000000000 に なってしまうのは仕様でしょうか?VC++2008を使っています. 数学的には -0.1 が正解だと思うのですが・・・
>>256 絶対そういう例出すやついると思った。
でも delete NULL; はOkなのだから、
if (resource_ != NULL) で場合分けするのが無駄なのは明白。
負数の冪根を求めてはいけない
>>270 発端ってw
俺は
>>264 が最初の書き込みだが、いったい誰と戦ってんのw
> 何を偉そうに
と書いてるレスが一番偉そうというギャグだってんなら、3点くらいあげてもいい
IEEE754だと負数の冪根を求めるとNaNになる。 VC++2008はNaNを-1.#INDと表示する処理系
1.256が下らないネタにもならないクソな書き込みをする 2.同じく258が下らないレスをする 3.259が258に対して「ウザすぎる。もうはやってねーし」等とのたまう 256 = 259だったらとんだ茶番だな。 この一連の流れは頭おかしいだろ。
277 :
デフォルトの名無しさん :2009/12/03(木) 11:33:16
初歩的な質問なんですが、 コピーコンストラクターで、なぜ仮引数のプライベートな部分にまで アクセスできるんですか?本を見たけどわかりませんでした。
クラスが同じならインスタンスが自分以外のものであってもアクセスできる。 当然ながらクラスが違えばアクセスできない。
ありがとうございます。 thisとかも同じですか? あと、継承されたクラスも同じですか?
基底クラスは別クラスだからインスタンスが同じであろうと派生クラスから基底クラスのprivateメンバへはアクセスできない。 ただしprotectedは別。
ありがとうございます。 なんとなくわかりました。
家のPCが無駄にクアッドコアなんですがプログラミング作ったとき何か指定しないと4コア使って計算してくれませんか? OpenMpとか
何も指定されないプログラムが四つ同時に走る事を想定して作ってあるから安心しろ
>>271 errnoにエラーの情報が入るはず
vcならmatherrだったかも
OpenMp使った4コア使った並列計算と何も指定しないで4コア使った計算はたぶん別物ですよね 指定しない場合はどんな計算を行うのでしょうか?
>>282 ・プログラミングは作れません。
・コンパイラはもしかしたら複数コアを使ってコンパイルするかもしれません。
・コンパイラによっては、OpenMPを使わなくても複数コアを使うようなコードを出力することができる場合があります。
・一般的には、複数コアを使うコードを出力するにはOpenMPなりpthreadなりを使う必要があります。
・そもそもOSはプログラムを適宜異なるコアで動くように管理するので余り神経質になる必要はありません。
・いずれにしても、C++は言語仕様としてスレッドの概念もなければマルチコアの概念もないのでスレ違いです。
0xにはスレッドあるが
>>288 OpenMPを使わずに計算を行います。
>>290 議論したければC++0xスレへどうぞ。
女の友達にプライベートな部分を見せてと言ってもみせてくれないとおもうのですが。 なぜフレンド関数はプライベートな部分まで見ることが出来るんですか?
>>293 私は見せて貰ってますよ。友達だと思っているのはあなただけなのではないですか?
マ板でやれ
>>293 C++のフレンドは、女の友達よりは正義超人の友情に近いからです。
すると、その女友達が単一継承を行うと単為生殖になるのでしょうか
301 :
デフォルトの名無しさん :2009/12/03(木) 12:49:29
自分のクラス名::メンバー関数とthis->メンバー関数の違いってありますか?
前者は名前、後者は実体。
303 :
デフォルトの名無しさん :2009/12/03(木) 13:16:26
effective C++3版のテンプレートの最後のアイテムに乗ってる 3個の例の行列の掛け算をコピーしないとかのとかの具体的に乗ってるホームページや 本をお願いします。
Traitsみたいな奴で数を表すクラスのゼロ元とか単位元をあらわすdefineみたいなので intだと0と1がでるみたいなやつのある初めから出来ているやつ知りませんか?
代数的な操作がしたいならC++は適さないのでは
クラステンプレートとテンプレートクラスの違いをおしえてください。
307 :
256 :2009/12/03(木) 15:23:36
あくまで例だよ。お前ら喧嘩すんなw オブジェクトのポインタがフラグとしても意味をなすよってことをいいたかった。 リソース自身がオブジェクト化されていた場合で Close(){ res_->Close(); res_ = NULL; } ~Dtor(){ if(res_!=NULL) res_->Close(); } こう書けばよかったな 単にcharとかintとかなら、NULLで埋めるだけで問題ない
>>309 私もそう思っていた時期もありましたが、
そうでもないみたいなので。
>>306 クラスのテンプレート。template<class T> class HOGE{};
テンプレートのクラス・・・では意味不明だからクラステンプレートにパラメータを与えて実体化させたクラス。HOGE<int>,HOGE<double>,...
214です。 しばらくテンプレートの特殊化について調べていたのですが、 いまいちどういうことなのかわかりません。 助言、参考になるサイトなどありましたら、教えてください。
調べているのですが… m(_ _)m orz
>>312 特殊化すると、ある特定のテンプレート引数が指定された場合だけ、それ以外の場合とは異なる中身にできる
例えばこんな感じ
template<class T> class foo { public: static const int FOO = 1; };
template<> class foo<void> { public: static const int FOO = 0; };
この場合、 foo<int>::FOO や foo<long>::FOO は 1 だが、 foo<void>::FOO だけ 0 になる
316 :
312 :2009/12/03(木) 20:03:52
なるほど! ありがとうございます。
メンバ変数を初期化したいのですが、 javaで他のコンストラクタを呼び出す 『this(String s)』に相当する方法はありませんか?
釣りだと思うなら、釣られるのもほどほどにしとけよ
class A {
コンストラクタはinit()を呼び出すだけにして初期化はinit()でやるようにすればいいよ
322 :
317 :2009/12/03(木) 22:47:50
>>321 やっぱり、それしか方法が無いんですか
わかりました、ありがとうございます
前スレより
967 名前:デフォルトの名無しさん[] 投稿日:2009/11/28(土) 12:28:56
あるコンストラクタから別のコンストラクタを呼べませんでしょうか?
例えば
MyClass(){****}
MyClass(int num)
{
std::cout << num << "\n";
****
}
の様に****が共通の場合、MyClass(int num)の中でデフォルトコンストラクタを呼びたくなります。
現行のC++では可能でしょうか?またC++0xでは可能になりますでしょうか?
968 名前:デフォルトの名無しさん[sage] 投稿日:2009/11/28(土) 12:34:19
>>967 可能でありません。可能になります。
969 名前:デフォルトの名無しさん[sage] 投稿日:2009/11/28(土) 12:34:29
0xでは可能だけど03では別に関数を作るしかない
970 名前:デフォルトの名無しさん[sage] 投稿日:2009/11/28(土) 12:34:57
>>967 お察しのとおり、C++0x の Delegating constructors で可能になる予定。
971 名前:デフォルトの名無しさん[sage] 投稿日:2009/11/28(土) 12:35:26
>>967 0xではできるようになるから実装が出てくるまで待とう
974 名前:967[sage] 投稿日:2009/11/28(土) 12:37:30
>>968-971 ありがとうございます。
楽しみにC++0xを待ちつつ、今は別のinline メンバ関数を用意してどうにかします。
どのようにすればC/C++からXMLを操作することが出来 るのでしょうか?
>>325 いくつか方法がある。
- 自分で標準関数を使って一生懸命XMLを操作するライブラリを書く
- 開発環境にデフォルトで入ってるライブラリを使う(Qtとか)
- Xercesとかlibxmlみたいな外部ライブラリ使う
msxml
自作 正規表現で良いだろ 読み取るだけなら 生成するなら、ライブラリ 習得に手間掛かるが 自分で正規な出力するよりかは楽
330 :
デフォルトの名無しさん :2009/12/04(金) 14:22:21
fstreamについてなんですが、 ifstreamクラスで文字列を読みとろうとすると、改行まで読み取られます。 空白まで読み取るというようには出来ないでしょうか?
すいません。 半角スペースは区切りになってます。 ただ、全角スペースを区切りとして認識してもらう方法ってありませんか?
自分で区切れやチンカス
333 :
デフォルトの名無しさん :2009/12/04(金) 15:31:18
短い処理時間を計測したいのでclockよりも精度の高いgettimeofdayを使いたいのですが、 gettimeofdayが使用されたネット上のコードを見ると #include <time.h> #include <sys/time.h> とあるようにtime.hとは別にsys/time.hをインクルードする必要があるみたいです。 このsys/time.hはどこから入手すればよいのでしょうか?
Linux専用関数じゃねーのそれ
335 :
デフォルトの名無しさん :2009/12/04(金) 15:59:38
簡単な質問ですいませんが教えてください C++のプログラムです。 下図に示すように、整数を入力して指定する位置の ビットを反転した値を出力するプログラムを作成せよ。 ビット位置は最下位ビットを0とすること。 例えば12を入力して反転するビット位置を2とすると、 12の最下位から3番目のビットは1なので これを反転して0に変えると出力は8となる。 整数を入力: 12 反転するビットの位置を入力(0〜31): 2 反転した結果: 8
>>335 それで、質問の内容は?
「整数を入力のやり方がわかりません」 とか、具体的に書いてください
struct Hoge{ operator Hoge&()const{ return *this; } }; このキャスト演算子が無限ループにならないような参照の返し方ってありますか?
C#DLLをCでNET不要で利用する方法ありますか
DLLがNET使ってるから無理か。 C#DLLをC++DLLにする方法ありますか。 ソースのC#->C++化でも良いです
一カ所、NET汚染されただけで、ほぼネイティブの実行ファイルなのに NET入れないと動かないのが嫌なんです。 DotNetZipLibというのを使いたいのですが、いい方法無いですか。 zip64の追記が出来る方法でも良いです、
341 :
340 :2009/12/04(金) 17:59:09
DotNetZipLibは、追記できませんでした。 tmpを生成してから追記してました。 元のファイルに直接追記できるやつありますか。
フォーマットの微妙な違いをチェックするためにtmp作成するのだと思いますが。 zipはそのライブラリのフォーマットであると仮定すればtmpなしでいけると思うのですが
344 :
デフォルトの名無しさん :2009/12/04(金) 18:30:58
zipの追記ネタって前スレでもやってなかったか? まだやってんのか
作業につかう領域を減らしたいというのであれば可能 ディスクの読み書きを減らしたいというのであれば不可能
ライブラリ(のurl)のうpが無いのですが
webページの収集で使いたいのですが。 実行毎にtmp生成して追記するのは都合が悪いです。
zipでまとめるのやめたらいいんじゃね
5Gとか貯まったら、毎回コピー発生するのはかなり都合が悪いです。 zipは必須なんです。容量節約とindex付きでアクセス速度が良くなるので。
>>348 zip64の追記ライブラリ公開してくれお
需要あってアクセス出ると思うよ
ファイル毎か何個か毎に圧縮すれ
>>350 いくつかの書庫に分割すればいいんじゃね?
アクセスするときが都合悪いけどそれが良いですかね。 zipをマウントするとき、複数同時にしないと行けないので。 10Mくらいずつでやってみます。これならコピーがあっても困らないので。
BCCのSTLport binary置いてあるところしりませんか。
あと、boostもあるといいです。
しりませんよ。
修正しないとビルドできないようです。あと最新版ではBCCの対応がカットされてます。 古いやつでも良いので動作するバイナリ教えてください・
bccなんてなんで使うの?
VC2008用のバイナリから インポートライブラリ作ってみたのですが ヘッダで文法エラーでます。
363 :
デフォルトの名無しさん :2009/12/04(金) 22:33:31
先輩方お教えください。 typedef struct tagBITMAPFILEHEADER{ uint16 bfType __attribute__((packed)); uint32 bfSize __attribute__((packed)); uint16 bfReserved1 __attribute__((packed)); uint16 bfReserved2 __attribute__((packed)); uint32 bfOffBits __attribute__((packed)); } BITMAPFILEHEADER; と typedef struct tagBITMAPFILEHEADER{ (中略) } BITMAPFILEHEADER __attribute__((aligned(1))); と #pragma pack(push, 1) typedef struct tagBITMAPFILEHEADER{ (中略) } BITMAPFILEHEADER; #pragma pack(pop) は、どれを使っても同じでしょうか? コンパイラは TDM/MinGW gcc 4.4.1 です。
364 :
デフォルトの名無しさん :2009/12/04(金) 23:38:28
C言語を勉強しようと思ってるんですけど マイクロソフトのVisual C++2008のソフトをインストールしたのですが その後スタート→新規作成→プロジェクトを選択して Win32→Win32コンソールアプリケーションを選択してプロジェクト名をsampleにしてOKタブをクリックしようとしてもOKボタンが表示されませんがどうしたらいいか分かりません ぜひアドバイスをお願いします
初心者はbccにしとけ vc++は実戦向きツール
366 :
デフォルトの名無しさん :2009/12/04(金) 23:43:44
ボタンやメニューのグレー表示は、コード書くたびに罪悪感を憶えるな 冷たいUIの教科書みたいなもんでさ
>>364 bccやVCを勉強する前に
スレタイを読む練習が必要だと思うんだけど。
自分でもそう思わない?
> C言語
C言語やるならbccが良いと思う。
zlibは複数スレッドで圧縮 展開しても辞書は壊れませんか。
370 :
369 :2009/12/05(土) 03:07:28
つか、辞書データは一体どこへ記録されるの?
複数スレッドで圧縮して、辞書は共通って出来るの? ロックして、圧縮関数にはシングルスレットと同じ風にみせればいいけど・。 パフォーマンスが落ちるから同時に圧縮したいけど。
おちつけ
z_stream をスレッドごと (ファイルごと) に別々にご用意ください
TestClass t; TestClass *t = new TestClass(); この2つはインスタンスを作るという意味では同じ事をやっているわけですが、 どうやって使い分けるんですか?
インスタンスをいつ削除するかによって
そのインスタンスがかなり大きい場合、スタック領域の消費を抑えるために常にnewを選ぶこともあります
>>375 >>377 この二つが本当のところじゃない?
それ以外の理由は・・・pimplやりたいとか?
>>377 スタック領域を節約したいってどういう状況?
節約したいんじゃなくてスタックに入りきらない場合だろ
組み込み環境とか PCみたいに何MBもスタックあるような環境じゃ普通は気にしないな
と言うかスタックに大きなデータを配置できるほど事前情報が揃ってる事自体稀だろ
c++のnullって意味ないんだね ダメじゃん
そうだ。 0 を使え。別に困らないから。
Cygwin用の統合環境ありませんか。 コマンドプロンプトがやりにくいです
C++はvoid *の扱いが厳しくなったからNULLがだめになったんだ
0 もマジックナンバーと考えると NULL を使うべきだろう
>>388 別に C でも NULL は役に立たんよ。ヘッダをインクルードするほうがめんどくさい。
#define NULL reinterpret_cast<void*>(0)
set_emptyとか作れよ
ヌルポインタ経由でメンバ関数呼び出すのって鼻から悪魔だっけ?
カナダでは法律で禁止されてる
だからC++0xでnullptrが入るんだろうが
void *p = 0;って64bitでバグらないの?
てことはC++/CLRの選択は正しかったのですか
言語名を間違う俺に隙はなかった
>>398 なんで 64 bit とか関係あると思うの?
誤爆すか
403 :
402 :2009/12/05(土) 19:15:41
大至急の質問があります。 #include <sys/utime.h> または #include <utime.h> をロードする方法ありますか。 sysのあるかないかです。
sysつきなのは確認できた所 VC++だけで次のようにしたらうまくいきました。 #if defined(_MSC_VER) #include <sys/utime.h> #else #include <utime.h> #endif
utime.h って標準じゃない・・・よね?
標準でないから位置が違うんです。
409 :
407 :2009/12/05(土) 19:42:35
そもそも標準が何らかのディレクトリの中に入っているわけがないか。
410 :
387 :2009/12/05(土) 20:12:53
エクリプスとくらべて話題が少ないと思いますが NetBeans IDE はかるく、CYGwinが動作していいです。
まともに情報を引き出せないような質問はクソだ
質問です。 現在、ファイル内に書き込まれたデータから必要な要素だけを抜き取り、その要素を新しいtxtファイルに 書き込むプログラムを実装したいと思っています。 file1.objの中には、 f 1/1/1 2/2/2 3/3/3 f 2/2/2 3/3/3 4/4/4 f 2/2/2 3/3/3 5/5/5 f 10/10/10 13/13/13 15/15/15 のような形のデータが入っています。 1 2 3 2 3 4 2 3 5 10 13 15 のようにしてfile2に保存をしたいのですが、q1,q2,q3の値がp1,p2,p3と同じになってしまい、r1,r2,r3の値を求める際にエラーになってしまいます。 ポインタのあたりが怪しい所までは突き止めたのですが、どのように対処すればよいか教えていただけませんか? class COR2{ public: char vertex1[256]; char vertex2[256]; char vertex3[256]; };
414 :
413 :2009/12/06(日) 00:55:34
class mesh_OBJ{ public: string read; int mesh_target1, mesh_target2, mesh_target3; COR2 val2; vector<COR2> mesh_pattern; void mesh(){ mesh_pattern.clear(); ifstream load("file1.obj"); ofstream save("file2..txt");
while(load){ load >> read; if(read == "f"){ load >> val2.vertex1; load >> val2.vertex2; load >> val2.vertex3; char find1[2] = "/"; char find2[10] = "123456789"; char *p1, *p2, *p3; char *q1, *q2, *q3; char *r1, *r2, *r3; p1=strpbrk(val2.vertex1,find1); p2=strpbrk(val2.vertex2,find1); p3=strpbrk(val2.vertex3,find1); q1=strpbrk(p1,find1); q2=strpbrk(p2,find1); q3=strpbrk(p3,find1); r1=strstr(q1,find2); r2=strstr(q2,find2); r3=strstr(q3,find2); mesh_target1 = atoi(r1); mesh_target2 = atoi(r2); mesh_target3 = atoi(r3); save<<r1<<" "<<r2<<" "<<r3<<endl; } } load.close(); save.close(); } }; VC++ 2008
416 :
413 :2009/12/06(日) 00:57:24
415=413です。 長くなってしまいました・・・ よろしくお願いします。
>>415 >char find2[10] = "123456789";
0は無しですか?
あ、見つけるのだけだから0はイランの根
まずstrpbrkの使い方くらい調べろ。 p1〜p3が最初の/を指してるところから疑問に持て。
420 :
413 :2009/12/06(日) 01:39:26
p1~p3で"/"から始まる文字列になっているのでq1~q3の処理は先頭の"/"を読み取ってしまっていることは アドバイスで分かりました。 ありがとうございます。 後ろから検索するstrrchr(val2.vertex1, "/"); で解決使用とビルドを行ったのですが、"/"がエラーとなってしまいます。 特殊記号の場合、表記どのようにすればよいでしょうか? また、substringのLengthで文字の長さを調べて場合分けの方法でも試しているのですが、上手くいってません。 アドバイスよろしくお願いします。
421 :
413 :2009/12/06(日) 03:01:57
string vertex1 string vertex2 string vertex3 として val2.vertex1, val2.vertex2, val2.vertex3に格納されているデータの長さを取り出したいのですが、 ネットで調べても string str = " "; i=str.length の形でかくと書かれています。 しかし、文字列を最初からしていできないので、文字列変数を読み込ませたいのですが、エラーがでてしまいます。 どのようにすればよいでしょうか?
>415 strstrの用途を勘違いしている。 そこはstrpbrkを使うところ。 (手っ取り早くすますならq1++するだけでいい) atoiのパラメタ指定に誤りがある。 そこはC文字列ではなく文字を指定する。 >420も同様。 >421 エラーが起こったじゃ分からんわ。 エラーメッセージを読んでいないことだけは分かったがな。
424 :
419 :2009/12/06(日) 11:44:41
おはようさん。もう出来たかい? まだなら作ってもいいけど… まず仕様を明確にしてくれ。 何がしたいクラスなのか、どう使いたいのかさっぱりわからん。 ・1/1/1と来たとき最後のデータしかいらないのか、そもそもそれは何なのか ・メンバとして保持すべきなのはどこまでなのか
425 :
413 :2009/12/06(日) 12:29:24
>>423 p1 = strpbrk(val2.vertex1,find1);
p2 = strpbrk(val2.vertex2,find1);
p3 = strpbrk(val2.vertex3,find1);
q1 = strpbrk(p1,find2);
q2 = strpbrk(p2,find2);
q3 = strpbrk(p3,find2);
r1 = strpbrk(q1,find1);
r2 = strpbrk(q2,find1);
r3 = strpbrk(q3,find1);
s1 = strpbrk(r1,find2);
s2 = strpbrk(r2,find2);
s3 = strpbrk(r3,find2);
fprintf(fp, "%d %d %d\n", *s1, *s2, *s3);
_ifnd SSTRPBRK <add ecx,1>
mov al,[esi]
C++で(出来れば汎用的に)DB扱うのに何使うのがいいかなーと思って、 何がいいかは環境によって違うだろうけど、皆が何使ってるか聞きたい。 環境と使ってるもの合わせて書いてみてー
428 :
413 :2009/12/06(日) 12:48:26
>>423 という形に書き換えたところ、s1~s3のポインタには欲しい値がえられているはずなのですが、
_ifnd SSTRPBRK <add ecx,1>
mov al,[esi]
このようなエラーが出てしまいます。
また、val2.vertex1の中身(1/1/1...etc)などを読み取って欲しいのですが、
string str1 = "val2.vertex1";
i=str1.length
のように表記してしまうと、val2.vertex1という文字に対して長さを測ってしまうため、意図している文字列の長さではないので
何かうまい方法がないのかと思って説明させていただきました。
>>425 現在、3Dメッシュデータから、メッシュの合成パターンを読み取ってそのパターンを調べています。
file1.objのファイルの中には、メッシュ合成に用いるパターンが(f 1/1/1 2/2/2 3/3/3)のように記述されています。
1/1/1の場合、(1番目の頂点/1番目の頂点位置/1番目の法線)のように、どうやらメッシュ作成に利用する為にこのような形で書かれている
のだと思います。
ここで、頂点のパターンだけを"file2.txt"のなかに保存しておくことで、他のヘッダファイルで後に利用する関数内での処理に用いようと考えています。
429 :
413 :2009/12/06(日) 12:50:31
>>424 の間違えでした。
環境はVC++ 2008です。
よろしくお願いします。
430 :
419 :2009/12/06(日) 13:32:44
>>428 C++ソースレベルでどこまで実行出来てるのか見た?
ステップ実行するなりprintfか何かで到達点を絞り込まないと。
> string str1 = "val2.vertex1";
> i=str1.length
やるなら
string str1( val2.vertex1 );
i=str1.length();
でしょうが。なんでlengthの後ろの括弧を書かないの。
まさか他の言語と間違えてないよね?
> 1/1/1の場合、(1番目の頂点/1番目の頂点位置/1番目の法線)のように、
意味不明。なら何でCOR2のメンバがvertex1,vertex2,vertex3なのさ?
てっきり頂点1、頂点2、頂点3(各x/y/z)で1行が三角形を表してるもんだと思ってたが。
> ここで、頂点のパターンだけを"file2.txt"のなかに保存しておくことで、他のヘッダファイルで後に利用する関数内での処理に用いようと考えています。
じゃなくて、このクラスを使う側のプログラムがどのようにメソッドを呼び出すかだって。
int func(void)
{
mesh_OBJ obj;
obj.mesh();
}
ってI/Fはあり得ないでしょ。
431 :
426 :2009/12/06(日) 13:59:09
>>427 誰か名指ししないとだめなのかい
「皆が」って言ったつもりなんだが
一人に聞いても仕方ないだろう
432 :
413 :2009/12/06(日) 14:19:43
>>430 void Cauthentication_tDlg::OnBnClickedanalysis()
{
使用変更でメッシュパターンが変更された場合、1度だけ実行
mesh_OBJ make_mesh_pattern;
make_mesh_pattern.mesh();
}
433 :
413 :2009/12/06(日) 14:37:53
while(load){ load >> read; if(read == "f"){ load >> val2.vertex1; load >> val2.vertex2; load >> val2.vertex3; string str1(val2.vertex1); if(str1.length() == 5){ save << str1.substring(0,1) << endl; } if(str2.length() == 8){ save << str1.substring(0,2) << endl; } if(str3.length() == 11){ save << str1.substring(0,3) << endl; } }
434 :
413 :2009/12/06(日) 14:38:34
現在、上記のようなプログラムで、val2.vertex1の中身が(1/1/1)~(9/9/9)までの場合、先頭から1文字 (10/10/10)~(99/99/99)までの場合、先頭から2文字、(100/100/100)~(999/999/999)までの場合、先頭から3文字といった形で 欲しい値を切り出そうとしています。これが成功すれば、val2.vertex2 , val2.vertex3も同様にして行うつもりなのですが、 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_istream<_Elem,_Traits> &(__cdecl *)(std::basic_istream<_Elem,_Traits> &))' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] というエラーになってしまいます。初心者の私には、このエラーがなにを意味しているのかがわからない状態です。 file1.objの中には、 f 1/1/1 2/2/2 3/3/3 f 2/2/2 3/3/3 4/4/4 f 2/2/2 3/3/3 5/5/5 f 10/10/10 13/13/13 15/15/15 のような形のデータが入っています。 一行目の(1/1/1)をvertex1, (2/2/2)をvertex2, (3/3/3)をvertex3と見なしています。
435 :
419 :2009/12/06(日) 14:38:57
困ったな、何かツッコミ所がどんどん増えてきたぞ
えーと…こういうことだろうか。 fはフェイスかなんかの略で、直後にトライアングル1枚分のデータを持ってる。 「頂点インデックス/座標インデックス/法線インデックス」が頂点1個分のデータで、 これがトライアングルの頂点分、つまり3つ並んでる。 それで、vertex1には各トライアングルの第1頂点の頂点インデックスのみ、 vertex2,3も同様に第2、第3頂点の頂点インデックスのみを格納したい、と。
437 :
419 :2009/12/06(日) 15:18:29
>>432 > void Cauthentication_tDlg::OnBnClickedanalysis()
void Cauthentication_Dlg::OnBtnClickedanalysis()
の間違いなんだろうけど…。
・何で認証ダイアログ(?)でメッシュパターンの仕様変更しなきゃいけないの?
・一度だけ実行するんだったら別途コンソールアプリにでもすれば?
・変換する関数名がmeshっていくら何でもないでしょ。せめてconvertとか。
・入力ファイル名、出力ファイル名は固定なの?
>>433 多分>425>428で落ちてたのは
whileループの先頭でreadをクリアしてなかったからじゃないの?
while(load){}
read = "";
load >> read;
(略)
読み込むべき行がないのにreadが"f"のままだからそのまま先に進んじゃって…
>>434 ・「1/22/333」や「22/333/333」だったらどうすんの
・結局、何をどう出力したいの?
438 :
デフォルトの名無しさん :2009/12/06(日) 15:26:29
標準C++ではソースファイルの1行あたりの 文字数制限はありますか? また、現実的にはそれを守らない事による困った事態が起こった経験は みなさんありますか?
>>413 やりたいことだけハッキリさせろ。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream load("file1.obj");
ofstream save("file2.obj");
char a0[10], a1[10], a2[10], a3[10];
if(!load || !save) {load.close(); save.close(); return 1;}
while(load >> a0 >> a1 >> a2 >> a3) {
// cout << a0 << '=' << a1 << '=' << a2 << '=' << a3 << endl;
save << atoi(a1) << ' ' << atoi(a2) << ' ' << atoi(a3) << endl;
}
load.close(); save.close(); return 0;
}
無いだろ。 文字数=読み込み可能ファイルサイズだろ。 エディタの編集サイズも影響ある。 コンパイラとしては ; も、 ; + 改行 も違いなし。
>>438 仕様的にはなかったと思うけど、
コンパイラによっては制限がある場合もある
といっても千文字以上とか普通にはあり得ないレベルだから
普通は気にしなくてもいい
(コードの自動生成とかしてると気にする必要はあるかもしれないが)
>>440 プリプロセスでは改行は大きな意味を持つぜ
443 :
413 :2009/12/06(日) 15:36:32
>>436 その通りです。
わかりにくくてすみません。
>>437 実験用なので、別途のコンソールアプリを作成しなくても一度実行してファイルを作ってからコメントアウトすれば
とりあえずは問題ないのでこのようにしました。
入力ファイル名は固定です。
出力ファイル名は固定ではありません。
>>・「1/22/333」や「22/333/333」だったらどうすんの
このような状況は起こりません。
常に、先頭の"/"までの物と同じ数字が並んでいます。
>>read = " ";を追加
'substring' : 'std::basic_string<_Elem,_Traits,_Ax>' のメンバではありません。
というエラーをはかれてしまいます。
>>438 行数じゃないが、VCで1万文字くらいの文字列リテラルを作ろうとして怒られたことならある
445 :
419 :2009/12/06(日) 15:57:19
>>443 せめて
class MeshConverter{
public:
void convert( istream &in, ostream &out );
};
くらいにならんもんかね。まぁこれとて特別良いもんでもないけど…
void func(void)
{
MeshConverter converter;
ifstream ifs( "file1.obj" );
converter.convert( ifs, cout );
converter.convert( cin, cout );
ofstream ofs( "file2.txt" );
converter.convert( cin, ofs );
}
とか入力も出力も切り替え放題だろうに。
446 :
419 :2009/12/06(日) 15:58:24
>>443 > >>・「1/22/333」や「22/333/333」だったらどうすんの
> このような状況は起こりません。
> 常に、先頭の"/"までの物と同じ数字が並んでいます。
本当にないの?
だったら最初の数字だけ取ってくれば良かったじゃないの。
strtol使えば一発じゃないか。
> >>read = " ";を追加
>
> 'substring' : 'std::basic_string<_Elem,_Traits,_Ax>' のメンバではありません。
> というエラーをはかれてしまいます。
いや、>425>428の頃のプログラムに対するレスだから。
てかその追加部分とsubstringが何で関係すると思ったのか。
そもそもstringクラスにsubstring等というメソッドは無い。
そもそもC#なんじゃね?と思ってきた
>413 わざわざC++でやらんでもsedでやっときゃいいじゃん % sed e- 's/^f *//' -e 's|\([0-9][0-9]*\)/\1/\1|\1|g' < file1.obj > file2
C++\(^o^)/オワタ
451 :
448 :2009/12/06(日) 16:37:34
訂正: × e- → ○ -e
452 :
413 :2009/12/06(日) 16:44:10
みなさんアドバイスありがとうございました。 結局、substringで宣言していたのが間違いなことに気づきました。 substring(0,1)→substr(0,1) と変えたら欲しいデータが出てきました。 長いことアドバイスをありがとうございました。
気付いたじゃなくて気付かされた、じゃないのー?
454 :
438 :2009/12/06(日) 17:00:54
>>441 >>444 >>450 一行の文字数に関しては
普通に打っていれば問題にはならないですね。
nestされたテンプレートがで17までとか
現実的にちょっと引っかかる恐れがあって、
そこからの類推で心配していました。
ありがとうございます。
455 :
419 :2009/12/06(日) 17:08:09
設計もネーミングもオチもひどいもんがあるなw
自分の扱おうとしているデータの抽象化ができていない。
まったく・・・
STLのイテレーターをメンバ変数にするのはいいのかな? listでキャシュみたいに使えばちょっとは早くなるかなぁと思ってみたり。
>>458 イテレータ一般では無効になるタイミングに気をつけないといけないからちょっと危ない
気配がするけど、 list なら対象要素がコンテナ内にある限り大丈夫だし、他のコンテナでも
クラス内できっちり無効になるタイミングに気をつけて管理されていれば問題は無い。
仕事さぼって2ちゃんねるで遊んでるやつを監視中
やるんだったらラッパークラス用意してきっちり管理した方が良いと思う。 凄い面倒だけど。 それよりも中身自体をshared_ptrとかで共用したら? イテレータを弄るときは大抵リストを操作するときなんだから、 あまり長時間保持するようなものじゃないと思う。
Modern C++ Designに載ってる第4章のメモリプール的なものを作ってるんだけど、 オリジナルはvectorだけどlistの方がいいんじゃないかなと思って、 キャッシュ的に使うとなるとイテレータしかないのかなと考えたわけで。
out_of_range と domain_error はどう使い分けられるものでしょうか?
>>464 そちらも拝見いたしましたが、
どうしても違いが分からないのです。
両方とも範囲外というエラーを表現しているのでは
ないかと思うのです。
466 :
463 :2009/12/06(日) 22:32:57
例えば、0除算エラーは out_of_range と domain_error のどちらで通知されるべきものなのでしょうか?
>>467 ありがとうございます。
そうさせていただきます。
C++のdomain_errorはそういう意味じゃないけどね
問題領域だろ
Application domainね
C の errno.h で定義されてる数学関数( math.h )関連のエラー EDOM に対応して 用意しただけっぽいな。 domain_error が EDOM で range_error が ERANGE ってことで。 EDOM と ERANGE については C の規格 7.12.1 Treatment of error conditions を見れ。
474 :
463 :2009/12/06(日) 23:02:03
みなさんすみません。。。 規格を拝見してまいります。
476 :
デフォルトの名無しさん :2009/12/07(月) 12:53:12
C++でサウンドファイルを操作するには どうしたらいいでしょうか?
C#で開発
C++でサウンドファイルの形式をよみこんだりしたいです。 それとintは最大値を超えると最低値になるという理解であってますか?
44kHzを22kHzに変換したいとかファイルを操作するだけなら fopen fseek fread fwrite fclose でおk
再生もしたいです。
ちなみにウインドーズ依存じゃないほうでよろしくお願いします。
482 :
デフォルトの名無しさん :2009/12/07(月) 13:51:36
あなたでは不可能です あきらめましょう
>>483 ライセンスが売り物に出来るやつでも使えるの知りませんか?
探してないなら自分で作るしかないだろ
しかたないからつくるとしよう。
>>485 作ってください。
1週間待ちますから。
作ったらダウンロードしてお前も使うと言うことか? 絶対使うならソース公開してもいいが 1週間は無理だ
配列サイズ(バイトサイズ?)を32や64などにすると 速度が上がると聞いたことがあるのですが、どのような 理由があるのでしょうか?
きっちりしてるから
速いといってもいろいろ種類があるが2^nサイズだとメモリが無駄にならなくてアクセス距離が短くなったりGCの処理が軽くなったりといった理由だろう。 殆ど実装依存だが。 ちなみにC++の動的配列確保実装は配列のサイズをどこかに保持していなければならないのでそれも含めて丁寧に2^nサイズにする事は事実上不可能。
実際はメモリ節約するのが一番。 100Mより10M HDDに移動されると圧倒的な速度低下。 アルゴリズムから見直すべき
tst
int C_Status(void) {int s; if(P4.DR.BIT.B4==0||P4.DR.BIT.B5==0||P4.DR.BIT.B6==0||P4.DR.BIT.B7==0) s=2; else s=0; return(s);} int main(void) {(初期設定部分なので中略) while(!C_Status()); while(1) {seiten(); breek(); }} 上記のwhile(!C_Status());という記述の意味がいまいちわかりません。 どなたかご教授お願いします。
その前にP4が何か書いてくrえ
ペルソナ4です
499 :
496 :2009/12/07(月) 20:12:59
すいませんP4はポート4の事です。B4は4ビット目という意味です。 H8マイコンを使っています。
C_Status関数が関数外部に対して副作用がないからスレッドで別プロセス走らせておいてその様子を見ているだけとえすぱー
501 :
489 :2009/12/07(月) 20:15:27
実測で試してみるくらいしかないような話なんですね。 わかりました。ありがとう。
何実測だとか関係のない事言ってるんだよ
>>496 「C_Status() が 0 を戻したら 「;」 (つまり “何もしない”)」
を、C_Status() が 0 以外を戻すまで繰り返す。
…そういうことでなくて?
>>496 >上記のwhile(!C_Status());という記述の意味がいまいちわかりません。
C_Status()を呼んで、その返り値を論理否定して、真の間ずっとループ。
C/C++で整数を論理値として評価する時は、0はfalse, 0以外はtrue。
つまりP4の4ビット目か5ビット目か6ビット目か7ビット目のどれかが0になるまでループ。
「教授」じゃなくて「教示」。
505 :
496 :2009/12/07(月) 22:18:10
教授も教示も似たようなもんだ。 細かいな。
セグるって一体なんなんですか。 delete obj; の後 delete obj; するとセグりますけど 最初のdelete obj;のときと 2回目のdelete obj;でobjは何が違うんですか。 一回目のdelete obj;でそこのアドレスから数バイトのバイナリ値が 何かに書き換えられてて2回目はその書き換えられた値を見て異常とか判断してるんでしょうか。 異常なobjと異常じゃないobjはどうやって見分けてるんでしょうか。
今日、ウインドウに関するコードを読んでいたら MainForm.hにクラスの宣言が3つほど書いてありました 普通は1つの*.hに1つのクラスしか宣言しないと思うのですが これって、普通なんですかね?
普通なんです
>>507 見分けてるんじゃなくてヒープ領域の管理方法に依存する
つまり実装依存
大抵はリンクリスト+フリーブロックになっていて、deleteすると
リンクリストが書き換えられ、そこがフリーで利用可能であると
マークされる
それをもう一度deleteするとリンクリストがぶっ壊れる
>>507 > 異常なobjと異常じゃないobjはどうやって見分けてるんでしょうか。
いや、見分けられないからこそ
異常なobjをdeleteしてしまってバグるのだよ。
見分けられたなら何度deleteしても問題ない仕様にするだろ?
>>507 心配ならdeleteした直後にポインタに0を入れとけ
delete 0; をやっても何も起こらない事が保証されている
513 :
デフォルトの名無しさん :2009/12/07(月) 23:38:50
>>512 それじゃ他で delete されたらアウトだろ
何回でもdeleteしてやる
515 :
508 :2009/12/07(月) 23:51:07
>>509 1つの*.hに1つのクラスってことで、おk?
>>507 他
その前にセグるって言葉は一般的なのか?w
>>508 C++なら一つのヘッダファイルに関連する複数のクラスの定義を書くのはごく普通。stlやboostの中身見てみな。
520 :
508 :2009/12/08(火) 01:37:40
name spaceが何なのかわかりません #include "hoge"だけじゃ何でダメなの?
意味不明 namespaceと#includeは(直接は)関係ないし
>>524 正しい使い方をみせてください・・・・・・
>>525 標準ライブラリとか boost とか見れ。
お前らしきりにSTLとかの中身見ろみろいうけどよ アレは人間が見るものじゃないだろ まぁ525はバカすぎて適当な対応したくなるのは同意
528 :
デフォルトの名無しさん :2009/12/08(火) 12:44:05
>>525 みたいな低レベルな質問を見るとおぞけが
もしかして : さむけ
もしかして : おざき
>>527 別に中身(実装?)を見る必要は無い。
名前空間の使われ方を知るにはライブラリリファレンスなどインターフェースを見るだけで十分でしょ。
もちろん、それ以上を知るために実装などを見ることも悪くは無い。
//hogeが既にあるとして hoge+hoge.f(); で、f()がhogeを変更するメンバ関数だった場合、上式は未定義の動作でしょうか。
533 :
528 :2009/12/08(火) 13:02:19
もしかして : こわき
>>532 hoge はクラス型のようなので operator+() も関数呼び出しとなり、
hoge.f() および operator+() の呼び出しの前後にシーケンスポイントが
あるので未定義の動作にはならない。
ただし operator+() 呼び出しについて引数の評価順序が未規定なので、
結果に移植性は無い。
独自にプレフィックスを付ければnamespaceなど不要
>>537 namespaceを使えば独自のプレフィックスなど不要
>>539 ところが、独自にプレフィックスを付ければnamespaceなど不要なんだよ
単純反復動作
名前解決で困る気がするような気がする
543 :
528 :2009/12/08(火) 20:41:08
俺の代わりに反論してくれたのはうれしいけど、
>>538 とかがファビョって荒れたら大変だからほどほどに
しておくんなさいまし。
544 :
デフォルトの名無しさん :2009/12/08(火) 20:55:11
struct MyClass{ //適当に実装してある。 }; try{ //処理。 throw MyClass(); } catch(const MyClass& e){ //eを用いた処理。eは変更されない。 } これが普通だと思うのですが、 もし try{ //処理。 throw MyClass(); } catch(MyClass& e){ //eを用いた処理。eが変更される。 } というコードだった場合、規格上未定義の動作になりますか?
なる catch節でeに触った瞬間に鼻から悪魔
しらなかった
inline catch(const MyClass &e){...} とか欲しいな
>>545 それは変更しなくても値を取得した瞬間に鼻から悪魔ということでしょうか?
もうデストラクタ呼ばれて壊れてるからね
>>549 でもそうだとしますと
const MyClass &e
でcatchした例外は
どうしてさわってOKなのでしょうか?
551 :
デフォルトの名無しさん :2009/12/08(火) 21:50:55
553 :
551 :2009/12/08(火) 21:55:54
軽く調べてみた。 > 14882:2003 15.1/4 >The memory for the temporary copy of the exception being thrown is allocated in an unspecified way, >except as noted in 3.7.3.1. The temporary persists as long as there is a handler being executed for that >exception. In particular, if a handler exits by executing a throw; statement, that passes control to another >handler for the same exception, so the temporary remains. When the last handler being executed for the >exception exits by any means other than throw; the temporary object is destroyed and the implementation >may deallocate the memory for the temporary object; any such deallocation is done in an unspecified way. >The destruction occurs immediately after the destruction of the object declared in the exception-declaration >in the handler. 最後の handler が処理されるまでは例外オブジェクトは破棄されないってことらしい。 >551 例外オブジェクトの型は最上位の cv qualifier はずした型になるって 15.1/3 で書いてある。
男はtryを使ってはダメだ!
557 :
551 :2009/12/08(火) 21:59:49
>>554 ありがとう。
> 例外オブジェクトの型は最上位の cv qualifier はずした型になるって 15.1/3 で書いてある。
ということは、
>>544 で、
const MyClass型のオブジェクトがthrowされたとしても
catch(MyClass& e)
でキャッチできるってこと・・・かな?
>>555 finallyってどこの言語?
>>556 つまり男ならassertで断言するか死ぬかを選べ、と。
>>558 ああ、ほんとごめんfinally忘れて
561 :
558 :2009/12/08(火) 22:06:00
>557 #include <iostream> int main(void) { try { throw 1; } catch (int &i) { std::cout << i << std::endl; } return 0; } 確かにこれで 1 って出力されたわ。 gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
>>562 よく分からないけどどれかのデストラクタが呼ばれちゃうからダメだって
#include <iostream> int main(void) { try { try { throw 1; } catch (int &i) { std::cout << i << std::endl; i = 2; throw; } } catch (int &i) { std::cout << i << std::endl; } return 0; } これで 1 2 になる。 変更した結果が throw で再送する結果に反映される事は 15.3/19 に記述あり。
565 :
544 :2009/12/08(火) 22:12:21
言っとくけど仕様に最後のhandlerが処理されるまで非konnsuto参照として扱っても良いのはtry{}ブロック内のスタックが破壊されない事を期待しているからだからな。
> try{}ブロック内のスタックが破壊されない事を期待している
そしてその期待は規格により保証されている、と言いたいのですね?
>>566
例外処理が重いのは例外の発生した箇所から帰着できる部分を保存して処理を別の部分に渡すため。 適当だけど
void temp(const hoge *h) void temp(const hoge &h) この2つは似たような意味ですが、どうやって使い分けているんですか? 参照があればポインタなんていらない気がするんですが
その程度の用途ならいらないですね
>>569 参照だと途中で付け替えられないけどポインタなら付け替えられるでしょ?
参照だとC++専用だけどポインタならC言語でも使い回せるでしょ?
参照だとnullptrとかないけどポインタならあるでしょ?(C++0xからだけど。)
とかかな。
あとfactoryメソッドやりたいときにポインタじゃないと困る・・・とか?
(でも普通はスマートポインタか。)
ポインタは値渡し、 参照は参照渡し。 どちらも用途がある。 ローカル変数を参照渡し出来ない、不具合が出るとかある。
573 :
569 :2009/12/08(火) 23:24:36
>>572 > ローカル変数を参照渡し出来ない
別にアドレス渡し(ポインタ渡し)もできなくね?
参照はクラス変数にするのがとてつもなくしんどい
>>575 しかしそれはポインタも同じじゃないんですか?
コンストラクタをオーバーロードしてると生きるのが苦痛になってくるな。
>>577 そんなあなたに
this->destructor()
参照はコンテナ使えないじゃない
>>545 ,549,563,566
これ全部まちがいだよね?
void func(){ int i = 3; throw i; } int main() { try{func();}catch(int &i){} } この場合、funcのスタックっていつ捨てられるの? とっとと捨てられてるけど、コピーが投げられるの?だとしたらコピーコンストラクタが動くの? はてなだらけですまんす><
>>581 func() のスタック(ローカル変数のための領域)は、もちろん関数を抜けるまで有効。
関数を抜けた後、実際にいつ捨てられるかは実装の勝手。
これに対して例外オブジェクトとして投げられるオブジェクトのための領域の有効期間に
ついては
>>554 にあるとおり。
コピーコンストラクタによるコピーが必要になることがほとんどだけど、関数に引数を
渡す場合や return で戻り値を返す場合と同様に省略可能なので、必ず呼び出される
とまでは言えない。
っていうか、 throw の引数にしたときだけはローカル変数の寿命が関数外まで延びる なんて仕様だったら困るだろ。
つまりthrowされたときに自動的にコピーされるってことは確かなのか。 ただしそれは実装次第では省略可能ということで。
よくわからないからボクはconstでキャッチするよ
586 :
デフォルトの名無しさん :2009/12/09(水) 12:27:23
ところで何でエラー通知に対してC++は 「例外」 という方法を選んだんだろう? (他に何があるかは知らんけど。) 他の言語ではそれが主流だったからとか?
587 :
デフォルトの名無しさん :2009/12/09(水) 12:29:15
自分でnewで確保したメモリは自分でdeleteしないと気が済まないから、僕はスマートポインタを使いません。 こういう馬鹿がたまにいるんだが、どう説得したら良い?
使う必要もない場面なら使わなくていいんじゃないの
メンバ変数にポインタを使っている場合、コピーコンストラクタでどうポインタを扱ってますか
>>587 メモリの所有者を明確にした上でRAIIを徹底できるなら別にスマポ要らないよね。
>>589 ディープコピーが必要な場合はJavaのcloneかserializeを真似る
スマポは基本的には推奨されるべきだが何でもかんでもスマポにすりゃいいってもんでもない
共有もしないし生成破棄タイミングも明確で開発・保守の際に間違いようがない場合(たとえば単純なpimplなど)
いちいちスマポ使うのは無意味。別に使っても見かけ上問題はないけど使う利点がない
さらに誤ってauto_ptrじゃなくて共有ポインタなんて使ったら参照カウンタ確保のための無意味なコストがかかる
>>587 「お前が完璧人間なのはわかったが、保守するかもしれないほかの人のことも考えてくれ」とでも言ってみるとか
完璧主義相手なら下手に煽るより安全工学引き合いに出した方がいいんじゃないか
594 :
589 :2009/12/09(水) 15:10:25
しかし、pimplの場合、たとえ参照カウントが要らなくても、微妙に楽できるのでついshared_ptrを使いたくなる。
597 :
デフォルトの名無しさん :2009/12/09(水) 18:39:07
new だけが露出していて delete は隠蔽されている、というスタイルは嫌いだな
>>597 boost::make_shared
deleteと同じようにnewからも開放されるだけでなく、
shared_ptrが抱える例外安全性の落とし穴からも守ってくれます
メモリ管理は自前かクラスのデストラクタだけで良いよ。 それ以外はc++の速度が失われる
Javaみたいでダサいもん 自分でmallocしたものは自分でfreeする 自分でfopenしたものは自分でfcloseする 自分でnewしたものは自分でdeleteする そんな当たり前のことを当たり前に書けるのがC/C++の魅力のはず
詩人が多いな 特に内容がない詩ばかりだが
struct X { struct Y { struct Z { int i; } z; } y; } x; x.y.z.i = 0; 上のようにネストを深くしても変数へのアクセスコストはコンパイル時にかかるだけで実行時はネストレベルに関係ありませんよね?
class Test { std::string s; public: Test(const std::string& s) { this->s = s; } パラーメータを参照でもらって、メンバ変数を初期化したい。 ひとまずコンパイルが通ったのですが、これで大丈夫ですかね?
>>603 残念ながらstructが被るとアライメント調整でsizeof(Y) != intになる可能性がある。
sizeof(Z) > sizeof(Y)にはならないが。
Zにパディングが入ればアライメントは取れるから Yにさらにパディングが入ることは考えづらいと思うが… コンストラクタとか作るとどうなるかわかんないけど PODだから大丈夫じゃないの?
アラインメンドだのパディングだのはアクセスコストとは別問題じゃね
.演算子はオーバーロードできないしこれで解決できるメンバは全てコンパイルタイムに確定しているから アクセス速度は全て定数時間
>>597 >>601 居たww
まあきっとbetter Cとして使っているから
最新のパラダイム(ってほどでも無いけど、風潮)が理解できないのかな。
RAIIは良いものじゃ
611 :
デフォルトの名無しさん :2009/12/09(水) 23:24:41
>>609 おまえさんが何を探して何に笑っているのかがわからないが、それは置いておこう
いつの時代からかはご想像に任せるが、俺は「最新」を盲信はしない主義でね
色んな形で「圧力」を受けたことがあるが腐っても面従腹背はしない
間違っているものは間違っていると、本心から納得できないものに対しては常に言う
ちなみに、まだ C++ 「ではない」ものを紹介されたが
それとて抽象化レベルの観点から異を唱えたことに対する反論とは受け取っていないぞ
明後日の方向に長文書いて馬鹿がバレる例。
というか長文を書くヤツは大抵 ・・・いや止めておこう。
>>611 > 色んな形で「圧力」を受けたことがあるが腐っても面従腹背はしない
> 間違っているものは間違っていると、本心から納得できないものに対しては常に言う
よし、じゃあ早速鏡に向かって叫んでくれ。
>>611 居るよね、こうして自分を盲信している人。
新しい技術について行けない
->その技術は悪い物だからいいんだ
これ、心理学的に適応機制って言うんだぜw
617 :
609 :2009/12/09(水) 23:52:27
618 :
デフォルトの名無しさん :2009/12/09(水) 23:56:31
よーするに個人煽りしかできないわけね ム板におけるそのザマ自体が返事としては十分だ 十分だがつまんねーから寝るぜ
>>618 >十分だがつまんねーから寝るぜ
age ながら言われてもな。
我が読解力では
いじめないでよ
もう逃げるから
としか読み取れない。
620 :
デフォルトの名無しさん :2009/12/10(木) 00:01:11
マって中学生みたいな奴しかいないよな
みんなでお遊戯しているよ
まぁ、新しい技術に投資する場合はある程度選別しなければならないのも事実ではある。 C#とか絶対滅ぶ。間違いない。おれはJavaに投資して正解だった。これからはHaskelだ。
,, -──- 、._ .-"´ \. :/ _ノ ヽ、_ ヽ.: :/ o゚((●)) ((●))゚oヽ: :| (__人__) |: :l ) ( l: :` 、 `ー' /: :, -‐ (_). / :l_j_j_j と)丶─‐┬.''´ :ヽ :i |: :/ :⊂ノ|:
てっきり
>>611 って「まったく関係のない話を延々するというボケ」だと思ってたけど、
もしかして本人は本当に妥当な論述だと思ってたの?
C++の話しろよ
>>604 それは代入。メンバ変数を初期化するには初期化リストを使う。
データマンバにはm_とか後ろ_とかプレフィクスつけようぜ? Javaの人はthis使いたがるけど。
マンボ!
後ろにつけたらプレフィックスじゃないだろ
GCだのスマートポインタだのfinallyだのRAIIだの 確保したものを解放する責任を放棄するための黒魔術が流行りすぎている こんなの最新でも何でもない、ただの怠け癖を助長する麻薬だ 俺は吸いたくない
技術に道徳やら精神論は持ち込むなよ
for だの while だの switch だの関数だの 正しい位置にジャンプする責任を放棄するための黒魔術が流行りすぎている こんなの最新でも何でもない、ただの怠け癖を助長する麻薬だ 俺は吸いたくない
変数だの配列だの構造体だのビットフィールドだの、 正しいメモリにアクセスする責任を放棄するための黒魔術が流行りすぎている こんなの最新でも何でもない、ただの怠け癖を助長する麻薬だ 俺は吸いたくない
コンパイラだのアセンブラだのプリプロセッサだのリンカだの、 プログラムをマシンコードで組み上げる責任を放棄するための黒魔術が流行りすぎている こんなの最新でも何でもない、ただの怠け癖を助長する麻薬だ 俺は吸いたくない
freeやdelete呼んだり、ファイルやソケット閉じたり、セマフォ返したりするのって そんなに嫌なの?苦痛なの? 妙な言語仕様を付けたり奇怪なトリックを使ったり無用なオーバーヘッドをかけてでも 眼前から完全に排除抹殺しなきゃならないほど邪悪なものなの? おかしいだろう 他人(OSとか)から借りたものを用が済んだらお返しするのは道徳的にも技術的にも当然だ そこから無理矢理逃げ回ることが最新でございというのは納得いかない
プログラム終端におけるfreeは必要/不必要論争とか今さらヤメてね
返し忘れる阿呆が多いから仕方ないんだ セーフティネットみたいなものだと思ってくれないか 世の中は真のプログラマだけがプログラミングする時代から一般人誰でもプログラミングする時代に変わりつつあるんだ
呼ばれた場所にちゃんと返ったり、条件ジャンプ命令使い分けたり、ジャンプテーブル組んだりするのって そんなに嫌なの?苦痛なの? 妙な言語仕様を付けたり奇怪なトリックを使ったり無用なオーバーヘッドをかけてでも 眼前から完全に排除抹殺しなきゃならないほど邪悪なものなの? おかしいだろう フローがわかっているものを正しくマシンコードに起こすのは道徳的にも技術的にも当然だ そこから無理矢理逃げ回ることが最新でございというのは納得いかない
黒魔術とか奇怪なトリックってことは その技術を使いこなせてないか、それとも理解せずに使っているか あるいはそもそもプログラム書いてない可能性すらあるな
それぞれの理屈はわかるよ でもどれもこれも大げさすぎるだろ 「delete書きたくない」ただそれだけのために そんなのを論争してたり長々と解説してたりしてるのを見ると 「いいからサボらずにdelete書けよ」と言いたくなる
>>635 > そんなに嫌なの?苦痛なの?
べつに。 RAII があるので楽チンです。
> 眼前から完全に排除抹殺しなきゃならないほど邪悪なものなの?
邪悪だから排除してるんじゃなくて、人間がやる必要は無いから機械に任せているだけ。
> 他人(OSとか)から借りたものを用が済んだらお返しするのは道徳的にも技術的にも当然だ
そうだね。 RAII はそのためのものです。
> そこから無理矢理逃げ回ることが最新でございというのは納得いかない
逃げ回る?
RAII はリソースを返さないで済ますためのものだと思ってるのかな?
黒魔術じゃないだろ C++にはGCがないので当たり前のテクニックです メモリリークしたくなかったら黙って使え
デストラクタを悪用して、解放のコードを見かけ上抹殺する黒魔術だな>RAII こういうRAII信奉者にありがちなのが、解放に失敗がありうる状況だと途端に困っちゃうパターン 大体エラーを無視してRAIIを使い続けるという最悪の手段を選んで満足してしまう やっぱり麻薬だ
デバイスコンテキストからウィンドウに描画されてる情報をHBITMAPまで持って行ったのですが、 ここから特定のピクセル色を知りたいです。 何か関数は容易されてないでしょうか? よろしくお願いします。
デストラクタを怖がって、解放のコードを見かけ上増量させる黒魔術だな>明示的リソース破棄 こういう明示的リソース破棄信奉者にありがちなのが、処理中に失敗がありうる状況だと途端に困っちゃうパターン 大体例外を無視して明示的リソース破棄を使い続けるという最悪の手段を選んで満足してしまう やっぱりアホだ
> 処理中に失敗がありうる状況だと途端に困っちゃうパターン ほぼ常に困りっぱなしじゃねぇかw
アホはあんただよ RAIIで例外を無視しないようにしようとすると、原理的に 「例外を投げるデストラクタ」というC++最大級の法度を犯すことになる だが、たまたまfreeやdeleteが失敗しないように出来てるので、 (operator deleteは失敗させられるけど普通は禁忌とされてる) RAII信者は「解放が失敗するかもしれない」なんてことは考えもせず そういう場合はRAIIを捨てなければならないという判断を下すことが出来ない だから怖いんだよ
アホはあんただよ 明示的リソース破棄で例外を無視しないようにしようとすると、原理的に 「同じコードを何箇所にもばらまく」というプログラミング最大級の法度を犯すことになる だが、たまたま C 時代のライブラリは例外を投げないように出来てるので、 ( qsort() や bsearch() は投げることがあるけど普通はそんな比較関数は使わない) 明示的リソース破棄信者は「処理中に例外が発生するかもしれない」なんてことは考えもせず そういう場合は明示的リソース破棄を捨てなければならないという判断を下すことが出来ない だから怖いんだよ
いまいちだな
delete this;
{ int *i = new int[100]; char *c = new char[80]; short *s = new short[90]; float *f = new float[32]; double *d = new double[200]; } これをスマポ使わずにメモリリークしないようにするのとか 考えるのも嫌だわ と思ったけどローカルクラス使えばいいか
そこは素直にstd::vector使っとこうぜ
もちろん普段はvectort使ってるよw ただスマポ等を黒魔術と言ってる人(ネタだと思うけど)は 上に書いたのをどう処理してるのかなと
t入ってしまった…
スマポが黒魔術だと思うならJavaなりC#で満足してろってこった C++使う資格がない だいたいデストラクタはメモリリークだけでなく一般的なリソースの 解放もできるのでGCより原理的に優れているんだ 使い方が面倒なだけで
すぐれてるなんてことはない
>>656 あんたも頑固だな
Javaでも使えカス
658 :
デフォルトの名無しさん :2009/12/10(木) 03:55:33
int main() { vector<int ???> v; // <int>にすべきか<int *>にすべきか、が主題です AddVec(v); } void AddVec(vector<int> v) { int i = 0; v.push_back(i); } このiってスタックに作られますよね?一般的に。 それをvectorに積んでも良いの? void AddVec(vector<int *> v) { int * p = new int(0); // これはヒープに確保されますよね v.push_back(p); } // こっちが正解でしょうか? vも(vector<int???> * v)で渡すべきですかね? 昔、Cプログラマだったので、なんでもかんでもポインター渡ししてたのですが(速度命) 最近の風潮だと値渡しもありなんですかねぇ?
速度命は参照渡し
昔のCプログラマならCPUの処理サイズ以下のデータは値渡しした方が効率的だという事くらい知ってそうだけど
intのポインタを積んだら相当速度落ちるだろ。 intの実体がレジスタにあったとしても、int*はメモリに確保されるだろ。 int*を読んで、アドレスを特定してintを読みに行く。 intを直接読むより、手間とメモリが倍掛かる。 アドレス分。 超初心者だろ。・
参照渡しはコンパイル時置換解決とアドレス渡しとで表記が混同できるのが利点であって 実行時となるとアドレス渡しでしか解決方法がないからここでポインタと参照を引き合いに出し合うのはナンセンス
少なくとも10バイト以上のデータでポインタ渡しやれよ。可変長ならそれ以下があっても良いけど アドレス読んでから実体にたどり着く部分と メモリの無駄を無くすため。
>>662 中身ではなくてまずここを変えれって事
void AddVec(vector<int> v)
→
void AddVec(vector<int> &v)
それに参照かポインタ渡しにしないと
元のvectorは変化しないが。
665 :
658 :2009/12/10(木) 05:14:20
ごめんなさい。質問が下手でした。もちろんintだけなんか積まないです。 知りたかったのは DATA d; v.push_back(d); // ここで勝手にコピーコンストラクタが呼ばれるの? ということでした。 スタックに作られた変数を積んだら、 関数から戻ったときに実体なくなるよなぁ・・・って思ったので
666 :
デフォルトの名無しさん :2009/12/10(木) 05:19:15
RAIIが黒魔術って いまさら何を。 素直に私の頭じゃ理解できません首にしないでくださいって言えよww
C++では、 複雑なコードの自動生成をしたいとすると 「プリプロセッサを自作する」 と言う話を聞きました。 …それってよくあることなんでしょうか?
668 :
デフォルトの名無しさん :2009/12/10(木) 05:58:20
>>667 やろうと思ったことはあるが、
途中で冷静になってやめたわ(笑)
670 :
667 :2009/12/10(木) 06:06:29
>>668 まさに私もそんなに感じになっています。
>>669 mocですか。
なるほど、確かに。
ありがとうございます
パラメータで渡されたポインタは、どこでdeleteするのが適切なんですか?
普通は渡した方が削除して渡された方はなにもしない
name spaceはjavaのパッケージと同じ事はわかりました C++の場合javaのパッケージと同じく、name spaceごとにディレクトリを別けるのですか?
677 :
デフォルトの名無しさん :2009/12/10(木) 12:54:35
テンプレ関数の部分特殊化って出来ませんか? できないのならどのようにかいけつしたらいいですか? 例: template<typename A,Typename B,int x> G<A,x>& operator+=(G<A,x> a, G<B,x> b); のxについて部分特殊化したいけれど、出来ない場合を教えてください。
>>676 >name spaceはjavaのパッケージと同じ事はわかりました
わかってねぇ…
>>678 だったらわかるように説明してやれよ
できないのか?ん?
多重定義で代用できることが分かったのでもういいです。 newでオブジェクトの配列を初期化したとき={}で初期化できないんですがどうやりますか?
>>676 C++でnamespaceをJavaのpackageと同じように使うのだけはヤメロ。
昔そういうコーディング規約を採用した会社を知っているが、
またたく間に会社が潰れ、社員の半数近くが悲惨な死を遂げた。南無。
int[] iValule = new int[] { 1 , 2 , 4 , 8 }; のようにイコールをつけないことが分かったのでもういいです。
>>682 それじゃただの FUD にしかならん。
具体的に何がマズかったの?
御守りを買ったら神経痛が治ったとか そういうのの逆verです。
>>676 ファイルシステム上のディレクトリ構成とは無関係に階層を作れるのが(パッケージと比較しての)名前空間の特徴の1つ。
実際、ディレクトリと名前空間の階層が一致しない構成は良くある。
どういう構成にするのかはどちらかというとコーディング規約の範疇。
良くも悪くもコンパイラは関与しないので。
687 :
デフォルトの名無しさん :2009/12/10(木) 18:27:08
教えると調子に乗るから教える必要はないだろ。 あと、そもそもC++にディレクトリという概念は存在しない…よな?
と、わざわざ相手の話を聞いてレス。
g++はgccの一部なんですか?
はい
>>687 存在しないと思うよ。存在していたら、今わざわざapi叩いてフォルダ
扱うライブラリ作っていないw
boostだと日本語だめなんだよね。使えたら便利なんだけど。
694 :
687 :2009/12/10(木) 21:14:06
>>693 さらにインクルードパスの指定についても実は環境依存なんだよね。その意味も込めてのディレクトリの概念存在しない説。
キー値が2つあるmapみたいなコンテナってないんですか
その二つのキーをひとつに纏めるクラスを作れば良いだろ
boostでないスマートポインタありますか。
スマートポインタじゃないしスレッド対応してないけどauto_ptr
マルチスレッドのいいやつ教えて
std::tr1::shared_ptrってマルスレ対応じゃなかったっけ。
boost使えなくてstd::tr1や0xの実装使える環境って一体・・・
機種依存、バージョン依存を無くすため boostからスマートポインタ部分だけ分離したいけど 多方面に関係して諦めた
704 :
682 :2009/12/10(木) 23:12:51
>>682 今さらって感じMAXで、申し訳ありません
JDのソースでnamespaceを見てみたら、javaのパッケージみたいになっていました
ktorrentのソースはjavaっぽくない
705 :
704 :2009/12/10(木) 23:14:08
名前を間違えた
キーが2つって std::map<std::pair<first, second>, value> とかにすればいいでしょ 3つ以上ならなら std::map<std::tr1::tuple<省略>, value>とか
一応動くようだ int main() { std::map<std::pair<int, int>, double> miid; miid[std::make_pair(1, 2)] = 3.0; miid[std::make_pair(2, 3)] = 4.0; std::cout << miid[std::make_pair(2, 3)] << std::endl; }
うるせぇ、カス、ごめんよ、ぺっ。
miil.insertとかmiid.findとかmiid.eraseとかの引数はどうやればいいですか
std::mapの内部でtypedefされた型名があるからそれ使え
boost multi_index
いやです
マルチスレッドで入力がvoid*限定なんですけど これが変換不可能になります。どうすればいいですか shared_ptr<NODE> node; tserach( (void*)node ); error shared_ptr<NODE> から void * へのキャストはできない (関数 main() )
tserach( (void*)&node );
nodeは4バイトしか使わないから放置でいいか。 NODEのメンバでスマートポインタ使っていれば それはnodeを参照している物がなくなれば回収されますか。
NODE *node;を shared_ptr<NODE> node; で置き換えてるので それだと駄目と思うんですが。
tr1::shared_ptrってマルスレ対応なんだ知らんかった どうりであんなに遅かったのか
cls *pの参照が無くなっも、メモリ解放されないです。 #include <string> #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; class cls { public: shared_ptr<string> str; cls(){ str=shared_ptr<string>(new string);str->resize(1<<20,'a'); } }; void fnc(void *p){ cls *q=(cls*)p; } int main(){ int n; for(n=0;n<1000;n++) { cls *p= new cls; cout<<n<<endl; fnc(p); } }
720 :
716 :2009/12/11(金) 00:41:33
放置しないケースだとメモリリークしてないです。 #include <string> #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; class cls { public: shared_ptr<string> str; cls(){ str=shared_ptr<string>(new string);str->resize(1<<20,'a'); } }; void fnc(shared_ptr<cls> p){ //cout<<p->str->substr(0,10)<<endl; } int main(){ int n; for(n=0;n<1000;n++) { shared_ptr<cls> p=shared_ptr<cls>(new cls); cout<<n<<endl; fnc(p); } }
721 :
719 :2009/12/11(金) 00:44:11
2回目以降のnew clsで先のアドレスにはアクセスできなくなるのですが これは回収できないですか。 クラス内でスマートポインタ使っていても、本体がメモリに 存在するから無意味ですか。
>>715 ポインタのポインタのようになってふくざつになりましたがこれで
メモリリークはしてないです。
void fnc(void *p){
shared_ptr<cls> *q=(shared_ptr<cls> *)p;
cout<<(*q)->str->substr(0,10)<<endl;
}
int main(){
int n;
for(n=0;n<1000;n++) {
shared_ptr<cls> p=shared_ptr<cls>(new cls);
cout<<n<<endl;
fnc(&p);
}
}
auto変数を参照が残っている間は 生存させる方法ありますか。 これ出来たら簡単なのですが。
XorShiftのソースコードを見ると、
unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w
>>19 ))^(t^(t
>>8 )) );
}
のようになっているのですが、
unsigned long t = (x^(x<<11));
としないのは何故でしょうか?
>>723 ありません。
そんなことがしたい場合は new で作って shared_ptr で参照を持つようにするのが常套手段です。
>>725 ヒントから、関数内でポインタ解放したら、スマートポインタ働いてメモリリーク無くなりました。
こっちのほうが簡単ですね。サンクス。
void fnc(void *p){
cls *q=(cls*)p;
delete q;
}
int main(){
int n;
for(n=0;n<1000;n++) {
cls *p= new cls;
cout<<n<<endl;
fnc(p);
}
}
stringだけで自動解放するかも知れないと実験したら 解放されずスマートポインタの効果が実証できました。 #include <string> #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; class cls { public: string *str; cls(){ str=new string; str->resize(1<<20,'a'); } }; void fnc(void *p){ cls *q=(cls*)p; delete q; } int main(){ int n; for(n=0;n<1000;n++) { cls *p= new cls; cout<<n<<endl; fnc(p); } }
729 :
728 :2009/12/11(金) 02:18:34
リークはしないけど、関数呼び出し後に利用不可能になりました。
>>727-729 とりあえず new と delete とスマートポインタについてひととおりネットなり本なりで勉強しなおせ。
ここに書かなくていいから。
C++は参照があるのにポインタもあります。ポインタはレガシーな考え方じゃないですかね? javaとかの言語はC++の参照しかないのに、ちゃんとプログラミングできるじゃないですか
何を言ってるんだ。 「Javaでちゃんとプログラムできる」 という時点で間違っている。^^ あんな言語で何をちゃんとできるというのだ。w
> ポインタはレガシーな考え方 iteratorを考えたら決してレガシーになってないぞ。むしろ昇華されてる。 あと各種API関係で使うからそれは避けようがないし。
>>731 C でできることは C++ でもできなければならない。
…C99 で崩れちゃったけども。
Javaアレは参照なのか? ならば、どうしてヌルポになるのだ?
だからJavaグラマとポインタの話は切れって。 向こうから振ってこられても話すな
>>735 貴様…ぬるぽ誕生の歴史を繰り返そうというのか…ッ!
739 :
デフォルトの名無しさん :2009/12/11(金) 16:51:56
Javaで〇〇 これをC++スレで言われても何にもならないという現実を理解してください
740 :
デフォルトの名無しさん :2009/12/11(金) 16:57:29
ぬるぽ
プロのグラマー美女、略してプログラマー
743 :
デフォルトの名無しさん :2009/12/11(金) 17:03:57
Javaが糞だと思うやつ挙手!
744 :
デフォルトの名無しさん :2009/12/11(金) 17:57:13
ぬ
struct nullpointer_exception{ vitrual ~nullpointer_exception(){} };
catch(nullpointer_exeption &e) { e.galtu(); }
外寒すぎw
stl=標準ライブラリ?
そう。
標準ライブラリはcstdlibやがな
753 :
デフォルトの名無しさん :2009/12/11(金) 21:15:09
配列はポインタのシンタックスシュガー
配列newは何かの間違い
そんな事言われてもC++自体が機械語のシンタックスシュガーだし
アセンブラがかわいそうに
アセンブラは言語ではない。ニーモニックだ。
01001000111100101001101110100101010101010101010100111110101100100 男なら0と1だけでプログラミングくらいしてみせぃ!
機械語乙
>>752 つまり、stlは標準に近いけどおまけみたいな感じ?
メンバ関数として定義されてないから
今自動エロ動画探索プログラムつくろうとおもっていて、まずは関連ワードから検索して動画を探知するまでのアルゴリズムがどういった流れでやればいいのかわかりません。 だれか動画探索プログラムのやり方わかる方いらっしゃいますか?
「ネットは広大だわ」が出来上がるのでやめなさい
ああ回答がない アイディア盗まれるしやっぱり書き込まなきゃよかった
アルゴリズムと自らのリビドーを満たす方法は違う
>>763 のアイデアのおかげですばらしいエロ動画探索プログラムができました。
768 :
767 :2009/12/11(金) 23:51:05
>>763 のアイデアのせいで児ポ動画まで拾ってしまい送検されました。
適当に動画サイトを見つけて動画っぽい拡張子全部落として、サイト内のリンクを再帰的に・・・
perlでvipろだの画像をダウンロードするスクリプトを書いた事がある しかし、書いてみると書く前のウハウハとは違う気持ちが沸いてくる
>>749 ,760
Standard Template Library は C++ Standard Library の一部として取り込まれました。
>>763 エロサイトを基準として探索してひたすらダウンロードするだけなら作ったことあるけど、
ネットは広大だな、と思って全部捨てたわ
2chの半角で"神"か"キタ"というレスが付いたリンク先の画像や動画をダウンロードすればおk
download板を巡回してハッシュをp2pソフトにぶち込むプログラム
775 :
デフォルトの名無しさん :2009/12/12(土) 15:46:20
見事グロ画像ゲット
通報されそう
自動巡回とか楽しくなさそう
boostのuBLASを利用してクラスを作ろうとしています。 classのヘッダ内で行列を定義しようとすると error: expected identifier before numeric constant error: expected ‘,’ or ‘...’ before numeric constant ってエラーが起こるんですけど、原因わかる方いましたらお願いします。
>>779 エラーが出てるところ意外を削って問題が再現する最小限のコードを作ってみるといい。
メンバ変数の宣言時に初期化とか... C++の仕様をちゃんと覚えてからboost覚えなさい
>>781 もっと削れるだろ。
struct test { int x(0); };
C++には「インターフェイスと抽象クラスを区別する」考え方が無いんですか?
>>784 C++ には無いが、 C++ プログラマにはある。
786 :
784 :2009/12/12(土) 19:07:14
>>785 なるほど、適切な解答ありがとうございます
int *p=new int[n]ってやってn+1個目が欲しくなったらどうすればいいの?
deleteしてnewしなおす
やっぱりいままでのデータをどっかに格納して交換しかないか・・・
STL使えばいいじゃない
struct mem{ void *ptr; std::size_t size; }; class flexible_deque : public std::deque<mem>{ ... }; 構造的に、flexible_dequeの各々の要素のptrがまちまちなサイズの確保されたメモリ領域を指している形になる。 これなら既存の領域を包括するメモリを再度アロケートする必要はない。 operator []とかは自分で考えろ
>>787 ああCのrealloc()みたいのがないって話か
newはコンストラクタ呼び出しを伴い、またオブジェクトのコピーは
コピーコンストラクタや代入演算子を呼び出すのでrealloc()に
相当する物は意味があまりないとして削られたんだな
reallocなことやりたくて、new/deleteじゃなくてmalloc/free使ってることはよくあるよ いろんなソフトである
>>791 64K 128Kなど固定長ブロックを保持する方が無駄が少ない
>>793 C++でもclassではなくPOD型を扱う時はmalloc/freeで十分
まあ俺はそういう場合でもnew/deleteで統一してるけどな
C++では「staticなメソッド」と「普通の関数」のどちらも書く事ができますが、 作業用に使う時はどちらを使えばいいのですか?
>>796 class間で共通したい作業ならstaticメソッド
そうでなければ普通の関数
別にどっちでもいいんだが、そういう風にかき分けると読む人に
意図が伝わりやすい
あー悪い どっちでも同じじゃないや staticメソッドはprivate属性やprotected属性、const属性を 付ける事が出来るので、classに関連した操作はstaticメソッドで やるべきだな
799 :
796 :2009/12/13(日) 10:51:44
>>797 >class間で共通したい作業ならstaticメソッド
すいませんが、共通したいの意味がわかりません
>>799 staticメソッドにはthisポインタが渡らないので、極端な話を言えば
インスタンスを一つも作らなくても使える
例えば
struct Test {
static void pirnt() { cout << "Hello" << endl; }
};
とやってインスタンスを作らず
Test::print();
とやれば呼び出せる
共通してやりたい作業とは、例えばインスタンスが今いくつ存在するかの
カウンタを入れたい時とか
カウント式のスマートポインタを作る場合に使えるね
802 :
796 :2009/12/13(日) 11:42:16
>>796 (1
private、protectedなメンバ変数/関数にアクセスせず、
一つのファイルでしか使わないなら
// xxxx.cpp
namespace {
関数();
}
(2
private、protectedなメンバ変数/関数にアクセスせず、
外部に公開したいなら
普通の関数();
(3
private、protectedなメンバ変数/関数にアクセスして、
外部に非公開にしたいなら
class hoge {
private:
非静的メンバ関数();
静的メンバ関数(hoge&);
};
(4 private、protectedなメンバ変数/関数にアクセスして、 外部に公開したいなら class hoge { friend フレンド関数(hoge&); }; (5 private、protectedなメンバ変数/関数にアクセスして、継承先クラスに公開、 継承先クラスでアクセス制御を変更したいなら class hoge { protected: 非静的メンバ関数(); 静的メンバ関数(hoge&); }; (6 private、protectedなメンバ変数/関数にアクセスして、外部に公開、 継承先クラスでアクセス制御を変更したいなら class hoge { public: 非静的メンバ関数(); 静的メンバ関数(hoge&); };
クラステンプレートの部分特殊化はOKなのに 関数テンプレートの部分特殊化は禁じられている この仕様はどうしてこうなのですか? 深い理由があってのことでしょうか?
1ファイルに1クラスでコードを書いてるんですがcppの行数が1万行に達しました。クラスを分けずにどうやってファイルに分割して行数を減らしていったらいいですか。
関数ごとにファイル分割
クラス設計を見直すのをおすすめするが、 cppをincludeすると一応分割はできる。 C++にもパーシャルクラス欲しいよな。
>>807 10000行ならよほど低スペックマシンじゃない限り許容範囲じゃね?
クラスという手段がクラスにするという目的に変わってしまっているような
C++ って、変数i ( i >0 )をstring型に出来ないのかな? ifstream ifs(file.dat); datファイルの中身は、 1 ABC 2 12 3 arfe3 の様に、インデックスとそれに対応する中身がしるされているんだが、下の様なプログラムで処理しようと思ったが、 なかなか出来ないんですよね・・・ for( i = 0; i < 100; i++){ while(ifs){ if( ifs == "○"){ 処理実行; } } }
string s; ifs >> s; if (s == "○"){
itoa
何がしたいのか分からない
>>810 人間のスペック的な問題だろ
てかそのクラスはでかすぎると思う
どんなクラスなんだろう
class ManageEnemy {
class ManageEnemy { : class Enemy00 { : }; class Enemy01 { : }; (インナークラスがたくさん) }; 敵の種類が多くなりすぎてcppの行数が一万行越えますた。。 設計的には悪くないと思っている。
いいえ最低です
どう考えてもおかしい 設計的には悪いてか思いつかない
インナークラスを使うのが問答無用で悪いってこと? 別にこれでうまく動いてるんだが。
期待している通りに動くことが「正しい」なら別にいいんじゃね? 非機能要件は無視するってことで。
なんだ叩きたいだけのクズか。
10000行もあるようなクラスはたいがいモノリシックで悪い設計。 ・・・と、ものしりっくに書いてみた^^。
対案を示さず叩くだけならバカでもできるよ
826 :
812 :2009/12/13(日) 21:42:32
>> 815 つまり、"○"の部分にインデックス番号(i)が入ると、インデックスがiの列だけを取り出して処理を行いたい。
(i)←まんこ
誰が何の対案を求めてるの?
ファイル分割に関しては
>>809 が既に解決策を提示している
C++にはJavaやC#にあるToStringメソッドや VBのように自動で文字列⇔数値に変換する機能はありません。^^ boost::lexical_castを使いましょう。 localeにも対応する強力なライブラリです。
設計的に悪いと言っているからもっと良い設計を知ってるんだろう
>>826 いっぺんまるごと読んでstringの配列に行を保存すれば?
>>828 「○○が対案を求めてる」なんて誰も言ってないと思うが。
何につっかかってるの?
仕様も分からないのにお手本教えてくれとか、 冗談で言ってるんだよね? 設計が悪いとかってのはファイル分割が 出来てない時点で...
行数が多い=設計が悪い、だろうか
一つの指標だわな
>>835 思わせぶりなことしか書けない無能なら
いちいち出てこなくていいのに。
>>838 仕様とお前のコード晒せよ
ボロクソにこき下ろしたあとにお手本見せてやるよ
仕様とコード見ないとお手本見せられないくせに何で設計が悪いと判断できるの?
842 :
806 :2009/12/13(日) 22:53:35
私の質問にお答えくださる方はいらっしゃいませんでしょうか?
インナークラスは宣言だけにすればいいじゃないか 問題は他にも山積みなんだろうけど
>>842 オーバーロードとごっちゃになるし、オーバーロードで事足りるからでは
845 :
デフォルトの名無しさん :2009/12/13(日) 22:56:58
オーバーロードとの衝突を理由にするならデフォルト引数も禁じられるべきだが
部分特殊化が必要になるのはどういうとき?
847 :
デフォルトの名無しさん :2009/12/13(日) 23:05:28
改行減らせばいいだけでは? 小学生でもわかることなのに
848 :
デフォルトの名無しさん :2009/12/13(日) 23:08:49
2chにぶっ放してもいい情報少ないからな・・・
関数テンプレートの部分特殊化って必要ですか? こんなこと↓はオーバーロードでできるけど template<typename A, typename B> struct X {}; template<typename Q> void f(Q x) {} template<typename A> void f(X<A, int> x) {}
>>839 馬鹿でも食い下がれるトコでだけ頑張らなくていいですよ、無能さん。
>>840 じゃあ俺はお前の稚拙な手本をこき下ろすわw
853 :
806 :2009/12/13(日) 23:21:01
うろおぼえながら、例としては std::swapの特殊化をする時にテンプレートを使って特殊化したい 等が確かEffective C++でも挙げられていたと思います。 C++0xでできるようになればいいのですが。 期待できないですね。
敵の種類が100種類超えるようなゲームをお前は作ったことがあるのかと。 作ったことないくせに一生懸命作ってる奴に文句だけ言って何のアドバイスもなしとかもう人間として本当の意味でレベルが低いというかこの手の卑しい人間は育ちが悪いとしかいいようがない。
>>853 それは名前空間stdの禁止事項を緩和すればいい話です
部分特殊化が必要なのではなく、STLの設計が良くないということです
多分
>>856 template < typename T >
std::swap < boost::shared_ptr< T > >{〜}
>STLの設計が良くないということです
もう一度言い直してくれ。
0と-0の違いが分かりません。 どうにも2種類あるように思えてならないのですが。 このあたり扱いはどうなっているのでしょうか?
1の補数?
// enemy_manager.h class enemy_manager { class enemy; enemy *enemy_; }; // enemy_manager.cpp #include "enemy_manager.h" #include "enemy.h" // enemy.h #include "enemy_manager.h" class enemy_manager::enemy { }; // enemy.cpp #include "enemy.h"
>>858 浮動小数点で仮数部と指数部が0で符号ビットが1のときじゃなかったっけ?<-0
>>857 template<typename T>
std::swap(boost::shared_ptr<T>&,boost::shared_ptr<T>&){}
は文法違反ですか?
そもそもswapなんてswap対象のクラスと同じ名前空間に定義するものでしょ。
>>863 それだと std::swap が隠れちゃって不便なときがあるんじゃ
質問を投げっぱなしの奴ってどんな育て方されてんだろ
早寝早起きを教えられたんだろう
一生懸命プログラム作ってる奴もいれば、質問放り出して寝る奴もいる。 そんなもんだ。
少しは心を広くしようぜ
初めから全員に言ってるんじゃないの?
特に「狭い」奴が
>>869 みたいなヒスっぽいレス返すのも想定の上で。
STLのvectorでintの配列を作って、5番目の要素を他の値に変えるのは どうすればいい?
v[4] = x;
[4]とか[]を使ったやり方は推奨されないって記述をどっかで見かけたけど、 気にすることはない?
その推奨してない奴は誰だ 一応 v.at(4)=x; という書き方もあって、こっちは要素が足りないと例外投げる (v[4]は未定義動作になる) ただし恐ろしく遅いので存在が保証されてれば[]を使うべき という話を誤解したか歪めて伝えてるバカがいるんだな
判り易い説明ありがとう。これで気兼ねなく使える
876 :
858 :2009/12/14(月) 06:59:40
877 :
876 :2009/12/14(月) 07:01:07
×同一 ○等価
同一協会 等価学会
で?
>>874 横書きの日本文に「,.」を用いるのは朝鮮人だよ。日本語は横書きでも「、。」が正しい。
韓国語では、縦書き文書では「、」が用いられ、横書き文書では「,」が用いられる。
この用い方は統一されているため、縦書き文書に「,」を、横書き文書に「、」を用いるのは誤り。
だから日本語で書くときもカンマピリオドの癖が出るんだろうね。
>>880 のような無知蒙昧の輩はさっさと死ねばいいのに。
バカは放置するとして なんで技術系誌や論文ではカンマとピリオドを使うんだろうな? カンマはともかく, ピリオドは見づらいわ.
883 :
882 :2009/12/14(月) 16:27:25
>>880 お前、教養のある他の人様に見てもらう
公式文書とか書いたことないだろ。
・・・ま、お前のレベルでは必要のないことだから
気にしなくて良いよ。
886 :
861 :2009/12/14(月) 19:07:05
>>876-877 規格的な話は分からないのだが
+0 0 -0 としたときに
+0 は“表現できる絶対値が最小の値”と0の間の正の値。
-0 は“表現できる絶対値が最小の値”と0の間の負の値。
とりあえずこっちの環境(C++)では等価として扱われているけどすべての言語体系で等価であるとは限らないから注意したほうがいいと思う
C++の規格としてどうかは詳しい人に聞いておくれ
定数 0 に正負の単項演算子が適用されるだけじゃないの?
浮動小数点数の規格はC++に限らないような ってか0とepsの間なんてあったっけ
889 :
デフォルトの名無しさん :2009/12/14(月) 20:18:01
共有ライブラリの中で例外が起きたときの catch の仕方を終えてください。 ライブラリの中で try - catch しても、呼び出し側で try - catch しても 捕捉できないのですがそういうものですか?
ライブラリ内で例外を処理して処置をプログラマーに委ねない設計なら、そういうものだろう。
891 :
デフォルトの名無しさん :2009/12/14(月) 20:36:45
そういう意味ではなく。 自分で作ったライブラリで起きた例外がどうやっても catch できないのですが どうやって catch すればいいですか、という意味です。
【FF13はライトニング死亡END】 召喚獣は6体しか使えないは嘘。隠し含めて12体 セラがルシになってクリスタルになるまでは一本道 中盤で訪れるエデンにファルシがいて、ちょっとしたクライマックスになる。 終盤で過去のエデンに行った時にルシになる前のライトニングがいて、セラは実の妹ではなく記憶がファルシに植え付けられていたことを知る。 記憶を取り戻してからは、オーディンの姿やアビリティが変化する。 ラ ス ダ ンはコクーンシティ。機械と融合したファルシの暴走と司教の陰謀を止めるのが最終目標。 ラ ス ボ スは司教エスラクゥス・マター。3回変身して最後はデスピサロみたいになる。 EDラストは3年後に仲間がみんな集まって再会。墓地で誰かの墓参りかと思ったら、ライトニングの墓。 墓石に本名のセラフィナ・ラ・マターと刻まれているのが映ってジエンド。
C++の好きなところは西部の風を感じられるところ。 荒削り。だが、それが良い。 風を捕まえろ。
>>889 ライブラリじゃなければ補足できたものがライブラリにまとめたらできなくなったってこと?
環境とかコードとか出さないと話にならない気がする。
>>892 ホント?
本体ごと買う為の動機をありがとう^^
897 :
デフォルトの名無しさん :2009/12/15(火) 13:01:00
すみません、 class templatesのテンプ引数を<int T>のようにやって Tの数ごとに特殊かして実装のみ変えた別バージョンクラスを作ろうとおもっているのですが、 このやりかたは本に乗ってないので何かいけない理由とかあるんですか? あと、Tをテンプレート引数にしたら実行時にメモリーを多く消費したりしませんよね?
ない 何の本か知らないが全部の事柄をいちいち説明してたらキリがないから独断と偏見で不要と思われた部分を端折ったのでは コードが増えるぶんのメモリは消費するけどそれ以上に何か消費したりはしない
コードはコンパイルタイムだから増えないんじゃないんですか?
コードを実行するためには、そのコードをメモリに読み込む必要がある
そうじゃなくてテンプレート引数のintのことですよ。
テンプレート展開によるコードサイズの増加は、場合によっては無視できないくらいになることもある コードサイズが増えれば、実行時にその増えたコードをロードするためのメモリ領域が必要になる テンプレートの規模にもよるし実装方法にもよるし使い方にもよるけれど いまどき数MB増えたくらいじゃびくともせんよって人もいれば、1KBでも削りたいって人もいるかもしれない 俺は幸い気にしないで済んでる気楽な身だが、あなたがどうなのかは俺にはわからないので
903 :
デフォルトの名無しさん :2009/12/15(火) 15:36:14
std::strstream(<strstream>)をどうしても使いたいのですが、 いまどき古すぎてネットでも余り書く方がいないようで、なかなか良い資料が見つかりません。 どうか参考となるサイトを教えて下さい。
>>900 だがTEXTセクションがROMに配置されるようになっていたらどうかな?
>>904 ROMをいっぱい使うだけじゃね?
お前の中ではROMはメモリに含まれないの?
含まれないね
ワラタ
909 :
デフォルトの名無しさん :2009/12/15(火) 17:56:10
どうでも良いことで残り少ないこのスレを埋めるな。
ですねえ。
少なくともROMに読み込むという表現は使わないなぁ
ROMに書き込む前にメモリに読み込まなくてはいけません。
なるほどそりゃメモリ消費量も気になるところだな っておい
ありゃ〜
C**とかC//はないの?
C** 動的C言語 C// C言語コメント
http使ってアクセスにはどんな方法ありますか? 初心者でもとっつきやすいものができればよいのですが… よろしくお願いします
Boost.Asio
HTTPより1個下の水準、ソケットを扱うという点で取っつきやすいかに疑問符がつく。 ソケット扱いたいんですという質問だったら自分もおすすめなんだけど。
foo()関数の引数がn個とn+1個の2種類を作りたい場合、 オーバーロードを使わず、 デフォルト引数にしたほうが いいのですか? (どちらでも書けるとして。)
iiyo
924 :
903 :2009/12/15(火) 21:24:22
解決しました。
using namespace std; ってやるヤツって何なの?
ヒミツの魔法
あるあるww
928 :
925 :2009/12/15(火) 23:00:49
ああごめん 俺が言いたいのは std名前空間にせっかく入れてあるのにわざわざ引っ張り出してくる プログラマって何なの!? って言いたかったのだ。
c++でメソッドにconstをつけると何が起きるのですか?
>>929 constなインスタンスからもメンバ関数を呼べるようになる。
代わりに、すべてのメンバ変数とthisがconst扱いになる。
933 :
929 :2009/12/15(火) 23:09:24
>>932 つまり、定数(インスタンス)からメンバ関数を呼び出せるようになるという事ですか?
934 :
930 :2009/12/15(火) 23:15:39
>>933 > 定数(インスタンス)
どういうこと?
何が言いたいのかわからん。
struct sutorakuto{ void foo() const{ } }; sutorakuto obujekuto; const sutorakuto konsuto_obujekuto; obujekuto.foo(); // ok! konsuto_obujekuto.foo(); //error! メンバ関数をconstで修飾する事は、そのオブジェクト内のメンバを変更しないという事を宣言する意味。 ちなみにmutable修飾されたメンバ変数ならconstメンバ関数内からでも変更できる。何のためにあるのかは知らん。・
参照をメンバに持ってるとデフォルトの代入が封印されるのは仕様ですか?
struct test{ int &a; test(int &a_) : a(a_){} test(const test &obj) : a(obj.a){} //コピーコンストラクタもちゃんと書こう! };
938 :
929 :2009/12/15(火) 23:41:53
>>935 大体は、constの機能がわかりました
しかし、constなインスタンスが、constなメンバ関数しか呼び出せないメリットがわかりません
>>938 void bar(const sutorakuto &obj){
obj.foo(); // fooが非constメンバ関数だとfooの実行によりobjが変更される可能性があり引数宣言const sutorakuto&の型が意味を成さない
}
940 :
929 :2009/12/15(火) 23:53:04
>>939 constなインスタンスは完全に読み取り専用だから、
メンバ関数もconstにしなければならないということですね?
>>928 マジレスすると「おまじない」とか「魔法」とか言って main の外で
使う入門書やら入門サイトが昔はやたら多かった.今は知らないけど.
そういった本で覚えた人は何も考えずに使うんだろう.
個人的にはこういうの↓も嫌いなんだけど
FILE *fp;
if ((fp = fopen("smpl.txt", "r")) == NULL){
printf("file open error!!\n");
}
942 :
デフォルトの名無しさん :2009/12/16(水) 00:49:44
>>916 残念ながら C++ における C とは Traditional C であって // は構文エラー
質問があります。 Fedora12 + gcc-c++-4.4.2-7.fc12.i686 って環境です。 コンパイルを実行しようとすると、 make: 警告: ファイル `include/HadrontherapyRunAction.hh' の修正時刻が 2.7e+04 秒分未来の時刻です こういう風にエラーが出て、ファイルの依存関係確認が延々とループします。 対処方法とかってあるのでしょうか? 識者の方、ご教示頂けたらと思います。よろしくお願いいたします。
>>943 PC の時刻設定か、ファイルの修正時刻か、どちらかがおかしいので確認すべし。
対処方法は、まぁわかるだろ。
>>944 2台のPCのうち1台で編集した物を、もう1台に移してコンパイルを行った場合に必ず出ます。
PCは2台ともネットで時刻同期を取っています。
今の所、怒られたファイルを開き、スペースやエンターを入れて保存を繰り返しているのですが、
いかんせん扱っているファイル数が多いので、延々とこの作業をやるのかと思うと
気が滅入ってしまうのです…。
タイムスタンプのチェックを外すオプションか何かがあるのかなと思って質問した次第ですが、
無いようですね…。
諦めてファイルを1個1個編集していきます。
確か前は、警告は出るがコンパイルは滞りなく行われてた気がするんですが…
変わったんでしょうかね。
>>945 > PCは2台ともネットで時刻同期を取っています。
だからって時刻設定を確認しないの?何なの?バカなの?
あと、手動で対処するぐらいなら touch で一括対処しろよ。
自演って言いたそうだけど、自演する意味なくないか、内容的に?
文章書くの遅い人だと、
>>945 を7分半後に書き込めるわけない!
って考えるのかな。
>>941 それは何が嫌なの?
NULLと比較してること?
変数に戻り値を代入しつつその値を比較しているってところだろ 俺もあの書き方は嫌いだ 1行に複数の処理を記述すんじゃねーよと fopenとNULLチェックで2行に分けろと ついでに戻り値が0非0の判定の「!=0」も省略するんじゃねーよと
C++ではインターフェイスが無いので、インターフェイスは使わずに多重継承だけするのですか?
>>952 言語機能として直接「インターフェース」と呼ばれるものはありませんが、
純粋仮想関数を持ち実装を持たないクラスが他の言語の「インターフェース」と同様に使えます。
このようなクラスを「インターフェース(クラス)」と呼ぶこともあります。
>>951 まあそう怒るなよ。昔は1画面20行くらいしか表示できなかったんだ。プリンターも遅かったしな。
こんな書き方でも慣れてしまうとなんとも思わない。
今はメリットないだろうけどね。
>>954 > 昔は1画面20行くらいしか表示できなかったんだ。
行数はここでは関係無いんじゃないかな。
>>941 や
>>951 が望むのはこういうのでしょう。
FILE* fp = fopen("smpl.txt", "r");
if (!fp){
printf("file open error!!\n");
}
>>941 にある書き方は、1行目に情報が少なすぎるのに、2行目は逆に多すぎて、
思考の負荷分散的に醜く感じる。
>>945 >2台のPCのうち1台で編集した物を、もう1台に移してコンパイルを行った場合に必ず出ます。
今どきgitもhgもsvnも使ってないの?
次スレ建て時、テンプレ貼り忘れ注意。
>>958 特に問題ない。
関数の途中で変数を宣言したいならC99をつかえ。
ちなみにここはC++相談室。
間違えた。宣言じゃなくて定義だった。
961 :
952 :2009/12/16(水) 13:22:40
Cで途中で変数宣言したかったらスコープ書いちゃうかな 途中から最後までとか微妙なスコープだと悩むけど
2038年問題に対してどう対策すればよいでしょうか
その頃にはCPUが全部64-128bitになってtime_tも64-128bitになってるだろうから 心配すんな それよりもC言語そのものがないかもしれない
29年後・・・想像もつかんな。その頃には年金も破綻してて生活保護とかで暮らしてるのかな
年金が破綻したら生活保護も破綻するんじゃねーの
CPUは余り関係ないな。
968 :
デフォルトの名無しさん :2009/12/16(水) 15:05:55
年金と生活保護ではその資金源が異なるが まぁその頃までには日本は無いかもしれんな 恐るべし小沢&鳩山ってとこかな
>>964 その頃には〜とか言ってほったらかした結果がY2Kだよ!
パソコンの日時いじって実際にどういう事が起きるかテストしてみればいいさ
誰か2038年1月19日3時14分7秒の30秒前くらいにPCの日時設定して試してみて。
やめておけ爆発して焼け野原だぞ 俺の友達はそれやって死んだ
先日 random() という関数を見かけました(多分自作でない)。 rand()ならお馴染みですが、random()は初めてです。 何が違うのでしょうか?
Ramdomクラスとかじゃなくて関数?残念ながら俺は知らん
その正体は関数オブジェクトに7777ギタン賭ける
976 :
デフォルトの名無しさん :2009/12/16(水) 15:18:49
>>971 こういうのをあちこちのスレにコピペしまくったらどういう事態が生じる?
ここ3〜4年の間に発売されたPCなら2038年問題は対策されてるから大丈夫
2000年製PCが現役稼動中だぜ・・・
>>978 2038年1月19日3時14分7秒の30秒前に設定して30秒後どうなるか詳しく報告してくれ。
>>978 たぶん大丈夫だと思うから設定して試してみて。お願い
>>973 rand() の質が悪かった昔、random() が作られた。
でも今は同じなので、標準Cで規定された rand() を使うよろし。
982 :
978 :2009/12/16(水) 15:43:58
>>979-980 別になんともなかったよ。いろんなソフト起動してみたけどどれも正常だった。よかったね
983 :
973 :2009/12/16(水) 17:25:35
>>982 俺も試してみたけどなんともなかった
2038年問題なんてなんで騒いでるかワカンネ
コピーコンストラクタの説明で、メンバ変数にポインタを使っている解説が少ないのですが メンバ変数にポインタを使う事は推奨されていないのでしょうか? private: int hoge; public: Test(const Test& t) { t.hoge; } また、t.hogeは何故シンタックスエラーにならないのか教えてください
業務系のアプリなんて怖くてガクブルだろうな C系で業務系アプリって関わったこと無いから 実在すんのかしらんけど。
>>985 解説が面倒いからじゃないか
その必要があれば、いくらでも使っていいよ
C/C++では式は何でもセミコロンを付ければ式文になる
1;
とか
0;
とか
2 + 3;
とかも意味がないだけで構文的には問題ない
>>987 > t.hogeは何故シンタックスエラーにならないのか教えてください
おれはここの部分の意図が理解できなかったのだが、
良く察したな。
さては魔女だな。
990 :
デフォルトの名無しさん :2009/12/16(水) 21:07:08
>>985 コピコンは参照と決まっているだけ
つーか、そんくらいやってみればわかるだろ
理由は禿本に書いてあるし
逆に「少ない」って表現が気になる
一応確認ですが、 string s("str"); hoge(str); と hoge(string("str"));は同じですよね?
違います
2行目でコンパイルエラーだな
994 :
991 :2009/12/16(水) 22:15:03
間違えました
hoge(str)じゃなくて、hoge(s)ですね
>>992 why ?
おおかた>992は>993の理由で違いますと言ったんだろうよ。 >994-996 しつけぇw どんだけ陰険なんだ低脳のくせに。
1000なら次スレ廃止
1000ならクリスマス用彼女ロボットプログラミング開始
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||ii''''""" "''''"" """"'ii|||||||||||||||||||||||||||||| ||||||||||||||||||iiii'''''"" .,,,,,,,,,, , """'''ii|||||||||||||||| |||||||||||||||||i'" .,,iillll|||||lllli,,. '''"~~"''''・;;,,.. il||||||||||||||| |||||||||||||||〃 i''" ,,,,,,,,, . |||||||||||||||| ||||||||||||||| ,,ii'".iillliiミi,.ミi, .,ッ'~.,illllllliェ. 'i,, i||||||||||||||||| |||||||||||||||| l|" il|||||||||li `|li ,,iii'" ,i|||||||||||i i, l|||||||||||||||| |||||||||||||||| 'il|l,,.ミl||||||リ.,,ii|l" "l||ミェ, ミi|||||||lリ.,li, i||||||||||||||||| |||||||||||||||| "'''iilllllllリ''"" "'ミiilllllliiリ''"" i|||||||||||||||| ||||||||||||||| .,; il|||||||||||||| |||||||||||||||| .;:,,. .,,. il|||||||||||||| il||||||||||||||i, '".;: il|||||||||||| illl||||||||||||||i, .,,,,,メiiiiiメiiillllilllliiiョュ,,,,.. il|||||||||||| iill|||||||||||||i, "iii,.. ,. ,. .,. .,.,,i||||li;. ,il|||||||||||| 'i||||||||||ii, ''ill||""'iil"iiゞゞヾllll|||l'" .il||||||||||||” "i|||||||||ii,,. "'iii'""""'iiiii'"". ..,,iil|||||||||||”" "i|||||||||||iii,, .,,iiillll||||||||” """""""" '''""""
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。