【初心者歓迎】C/C++室 Ver.74【環境依存OK】
1 :
デフォルトの名無しさん :
2010/11/09(火) 17:42:35
2 :
デフォルトの名無しさん :2010/11/09(火) 18:27:54
http://d.hatena.ne.jp/aidiary/20091122/1258853886のプログラムをVC++2008で 動かしたいのですが、以下の部分のエラーでコンパイル出来ません。
問題点分かる方いましたらご教授お願いします。
ヘッダはサイトのものに<vector>,<string>を追加でincludeしました。
以下問題点と思われる部分
131 /**
132 * 物体ID->物体名のmapを作成して返す
134 * @param[in] filename 物体ID->物体名の対応を格納したファイル
135 * @param[out] id2name 物体ID->物体名のmap
137 * @return 成功ならtrue、失敗ならfalse
138 */
139 bool loadObjectId(const char *filename, map<int, string>& id2name) {
140 // 物体IDと物体名を格納したファイルを開く
141 wifstream objFile(filename);
(略)
146
147 // 1行ずつ読み込み、物体ID->物体名のmapを作成
148 string line;
149 while (getline(objFile, line, '\n')) {
150 // タブで分割した文字列をldataへ格納
151 vector<string> ldata;
152 istringstream ss(line);
153 string s;
154 while (getline(ss, s, '\t')) {
155 ldata.push_back(s);
156 }
158 // 物体IDと物体名を抽出してmapへ格納
159 int objId = atol(ldata[0].c_str());
160 string objName = ldata[1];
161 id2name.insert(map<int, string>::value_type(objId, objName));
162 }
(略)
3 :
デフォルトの名無しさん :2010/11/09(火) 18:29:42
コンパイル実行時のエラー error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : 2 引数が必要です - 3 が設定されます。 1> c:\program files\microsoft visual studio 9.0\vc\include\string(527) : 'std::getline' の宣言を確認してください。 1>c:\visual studio 2008\projects\test\test\test.cpp(149) : error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : テンプレート 引数を 'std::basic_istream<_Elem,_Traits> &' に対して 'std::wifstream' から減少できませんでした 1> c:\program files\microsoft visual studio 9.0\vc\include\string(475) : 'std::getline' の宣言を確認してください。 1>c:\visual studio 2008\projects\test\test\test.cpp(149) : error C2782: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : テンプレート のパラメータ '_Elem' があいまいです。 1> c:\program files\microsoft visual studio 9.0\vc\include\string(475) : 'std::getline' の宣言を確認してください。 1> 'char' の可能性があります。
よう無能ども。w
5 :
2 :2010/11/09(火) 22:40:12
上記に#include <sstream>加えてwifstream→ifstreamで何の問題も無く実行出来ました。 スレ汚し失礼しました。
詳しくは知らないのですが、xpだとC++で.NET使わない方法でプログラミングしたソフトは処理が高速なんですよね? win7の場合もやっぱりC++で.NET使わないほうが高速なのですか? それとも、.NET使った場合とあまり処理速度は変わりませんか?
最近は.NETの方が高速だよ
>>6 C++はプログラム言語。
.NETはライブラリの名前。
.NETを利用できる言語にC#やVB.NETなどが存在する。
で、普通は言語+ライブラリのセットで開発する。
.NETの場合、C# + .NET2.0 みたいな形で開発する。
C++の場合、C++ + Microsoft C++ Runtime Liburary + Windows API みたいな形で開発する。
で、質問への答えですが、一般的に
C++の方が高速です。
メモリ使用量についてもC++の方が少量で済みます。
ただ開発効率ではC#の方が高く、初心者にとっては.NET系の言語の方が扱いやすくライブラリも充実しています。
この辺りはトレードオフの関係だと思うので、用途によって使い分けるのがベターかと思います。
中には双方の特性をミックスして開発してる人もいます。
速度を追求する部分はC++でdll化し、GUIや速度を求めない実装はC#でなど。
きもいです^^
test kakiko.
11 :
デフォルトの名無しさん :2010/11/11(木) 22:12:24
windows7,vc++2010でコンソールアプリの勉強をしています。 std::wcout << L"\u00A0"; を実行した後、文字が表示されなくなります 以下コード #include <iostream> #include <tchar.h> int _tmain(int argc, _TCHAR *argv[]) { std::locale::global(std::locale("japanese")); std::wcout << L"before" << std::endl; std::wcout << L"\u00A0" << std::endl; //問題のコード std::wcout << L"after" << std::endl; // 表示されない return 0; } だれか助けて
すみません ageてしまいましたorz
13 :
デフォルトの名無しさん :2010/11/11(木) 22:36:22
double (*)(int) から int (*)(int) のキャストって どのように定義されてるのでしょうか
iostream に Unicode は鬼門。
Windows.hをインクルードしてるのですが、 これによって使えるPOINT構造体は int func(POINT pt); で func(POINT(0, 0));のように使えないのでしょうか?
windows.hはCでも使えるように、C++固有の機能を使わないで作られてる そしてPOINT(0,0)のようなコンストラクタ構文は、C++固有の機能だ
C++やってるのかお前ら かっこいいな 俺もやりたいけど難しすぎるよ ランタイムなしで高速に起動するアプリ かっこよすぎる おれには無理だが おまえらがんばってくれ グフッ・・・・
>>18 早まるな。たいていのお客さんは起動の速さより納期の短さを優先する。
>>11 cygwinだと問題ないんだがなぁ。尤も、localeは"C"で試したけど。
vc固有の問題っぽいから回答つかないようならvcスレで聞きなおしてみたら?
>>13 なんでまたそんな危なっかしいことを……
>>16 MFCならCPointがPOINTをラップしてたと思うけど、それを使えないなら自作するしか。
s-jisコードをユニコードに変換する方法教えてください。
>>21 libiconvかなにか、適当なライブラリを使う。
ライブラリーですか・・・・ できれば手動で変換したいのですが やり方とかしりませんか?
手動でやりたいとか正気か? あんたが思っている以上にめんどくさいぞ おとなしくライブラリ使っとけ
ライブラリ作った人は手作業でやったの?
少なくとも最初の一回はコード表を睨めっこしたんじゃない? コード表をOCRしたかもしらんが。
単純に一対一で変換すればいいってもんでもないからな。
というか、どうして自前での変換にこだわるのかわからん。
>>21 の環境がなんなのかわからないけど、Windows環境ならAPI関数ひとつ
呼ぶだけだぞ。
VC++2008EEを使っています struct A { int a; float b; }; という構造体がある場合、 ポインタをつかって aに整数を、bに小数を代入したいのですが ポインタの型は何で宣言すればいいのでしょうか? int型のポインタに構造体のアドレスを入れ、ポインタからbに少数を代入しようとすると 'float' から 'int' への変換です。データが失われる可能性があります。 という警告が出て、bの値がが整数に直されます float型のポインタに構造体のアドレスを入れようとすると今度はまた別なエラーが出ます どうすればいいのでしょうか?
なぜA型のポインタを使わない
基礎の基礎でしたね・・・ すいません。最初のほうから勉強しなおします
>> 20 std::locale("C")で解決でした。 実際には日本語を利用したいのでlocaleはC->japaneseにする必要があるのですが 日本語文字列を出力する場合は"C"だと日本語出ず、 日本語出したくて"japanese"だと"\u00a0"以降文字列出ずorz SDKでwindow作ってそっちに出してみます。 レスくれた方、thx
ここで質問していいものか分かりませんがC++で書いてるのでここで Win32API/GDI+の質問です GDI+のImageクラスをnewでインスタンス化した後 deleteで解放するとエラー落ちしてしまいます デバッグモードのときのみエラーが発生するようで デバッグなしだと問題なく(?)処理できてるようです (問題ないように見えているだけかもしれませんが) もちろんdeleteしないとメモリリークは発生しています どうすれば解決するでしょうか
よくあるパターンだね
ヒープの管理ブロックを壊してる可能性が大。 もちろん、壊している場所は、deleteを呼んでいる場所ではない。
単純にファイル開きっぱなしなのでは
38 :
34 :2010/11/15(月) 15:32:22
>>36 エラーメッセージはその通りでヒープが壊れてると言われます
「ヒープが壊れていることが原因として考えられます。XXXX.exe または読み込まれた DLL にバグがあります。」
ためしにnewで確保してすぐdeleteしてみても同じエラーが出るので
Imageクラスの扱い以外の部分で問題が起きてるようには見えませんでした
newでの扱い方自体に何か根本的な問題があるのでしょうか
>>37 ファイルというのは画像ファイルということでしょうか?
読み込んだ画像ファイルを解放するような操作が必要なのでしょうか
自分で調べた限りではよく分かりませんでした
newで確保しなければ問題は一応回避できるのですが
やはり解決策を知っておかないと後々苦労しそうなので是非おねがいします
new で得たアドレスが実はNULLとか。 またはImageのGetLastStatus()で0以外(エラー)が入っていないかどうか。
40 :
34 :2010/11/15(月) 15:53:16
>>39 ウォッチしてみてもアドレスがNULLということは無いみたいです
GetLastStatus()の戻り値もOk(=0)でした
画像描画自体も問題なく行われているのですが・・・
deleteがなぜ上手くいかないのかよく分かりません
41 :
デフォルトの名無しさん :2010/11/15(月) 15:55:11
スマポ使えスマポ
うまく動かない最小のコードを出せ
それが一番だね。コンパイラのバージョンも提示してくれると判りやすい。
44 :
34 :2010/11/15(月) 16:18:11
>>41 スマートポインタですか?
勉強してみます、ありがとうございました
>>42 試しに書いたコードです
Image* test = new Image(_T("img\\016.jpg"));
Status st = test->GetLastStatus();
delete test;
1行目で正しくアドレスが取得されました
2行目でエラーの確認、戻り値Okでした
3行目でヒープが壊れているというエラーが出て止まります
具体的にはGdiPlusBase.hのGdiPlusBaseクラス内で定義されている
deleteのオーバーライドの部分でブレークします
>>43 コンパイラはVC++2008Express Edition
Version 9.0.30729.1 SP 今年の8月ごろにインストールしたものです。
45 :
34 :2010/11/15(月) 18:47:24
皆様お騒がせしました、自己解決しましたので報告します
原因はメモリリークの検出用に記述したデバッグ用定義が原因でした
前提条件の説明不足、大変失礼しました
#if _DEBUG
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
こんな感じの記述をする例のアレ(?)です
GDI+のクラスでnewをオーバーロードする際にこの部分が引っかかるようです
http://d.hatena.ne.jp/wata_d/20080304/1204609100 上記のサイト様の通りに手直ししたところ無事解決しました
質問に答えてくださった方々、ありがとうございました
(a<b)?a=1 : b=0; これって if (a<b) a=1; else b=0; ってことですよね。 このような式の使い方を説明してるサイトってありますか?
すいません自己解決しました。 条件演算子って言うんですね。
>>46 #include <ctype.h>
char c;
printf("%c\n", (isprint(c)) ? c : '.');
というふうに、値を返すときに便利です。
条件演算子をネストに使うと便利さが倍増します。
難解さも倍増するけどな
51 :
デフォルトの名無しさん :2010/11/15(月) 23:14:20
そう、Cの世界に関数型言語のような条件式を持ち込めるのです なんと便利なことか ああ便利便利
条件演算子、目のカタキにするのやめてほしい。
53 :
デフォルトの名無しさん :2010/11/18(木) 01:25:22
ツリービューの項目をドラッグ&ドロップして移動しようと思ってます。 ところがTreeView_CreateDragImageの戻り値がNULLになってしまいます。 原因として考えられることはなんでしょうか。
>>53 お使いのGUIライブラリ、フレームワークなどのスレへどうぞ。
シリアルポートを利用するとき ポートが開けない、もしくは通信中タイムアウトになった場合は 引数でエラーを通知するべきか例外を送出するべきでしょうか? また例外を送出する場合と引数などでエラーを通知する場合の使い分けの指針のような物はあるのでしょうか
#define IF #define THEN ? #define ELSE : s = IF cond THEN "T" ELSE "F"; みたいなコードを見たことがあるが、なるほど関数型言語かぶれだったのか
俺はそんな表記法の関数型言語は知らん どことなくFORTHくさい気がしたが・・・微妙に違うなぁ 何の言語だろう BASICか?
一瞬BASICっぽいように見えたけど、BASICにはIF文に戻り値があるなんて発想はないな。 むしろExcelかぶれなのかもしれん。
OCamlやF#がそれっぽい let ff = let rec ff' s n = if n = 0 then s else n::ff' s (n-1) ff' [];;
cond といえば元祖 lisp 様ではないか?
61 :
よろしくお願いします :2010/11/19(金) 00:30:22
以下のような無名の名前空間から関数 timeを呼び出すようなコードが、 複数のcppファイルのなかに書いてあります。 このとき、gen が初期化されるタイミングや順序はどのように規定されているのでしょうか? namespace { boost::mt19937 gen( static_cast<unsigned long>(time(0)) ); boost::uniform_smallint<> dst( 1, 6 ); boost::variate_generator<boost::mt19937&, boost::uniform_real<> > rand( gen, dst ); } このコードは不適切と考えて良いのでしょうか? (timeが複数のcppファイル内のgenに同じ時刻を返す場合があり、 このため独立であってほしい乱数系列に相関が出てしまう可能性が高いため)
不適切だから捨てろ
ではどうすればよいのですか?はなからグローバル変数として定義したほうがいいですかね?
64 :
53 :2010/11/19(金) 01:11:38
>>54 Win32APIスレで聞きましたが相手にされませんでした・・・。
もしよければ教えてください。
TreeView_CreateDragImageを使うには何か下準備がいるんでしょうか?
67 :
53 :2010/11/19(金) 01:30:03
>>65 ありがとうございます。結論から言うと出来ました。
まずTreeView_SetImageListでイメージリストを関連付けなくてはならなかったようです。
そちらなども色々と見てましたが書いてなかったもので迂闊でした。
どうもありがとうございました。
68 :
61 :2010/11/19(金) 01:40:53
>>62 >>66 ありがとうございました。
/* hoge.cpp */
namespace { A hoge( func() ); B mage( func() ); }
/* fuga.cpp */
namespace { A fuga( func() ); }
こんな感じのとき、hoge、mageの順にfunc()が呼ばれるけど、
(hoge, mage)と(fuga)のどちらのfunc()が呼ばれるかはわからない、
ということでいいのでしょうか。大変参考になりました。
ホゲとかフガとかキモい
hogeとかfugaとか使いたくなる年頃ってあるよなwww 俺は恥ずかしくて使わないが
恥ずかしいっていうか、発想が貧困な子なのかなって思うな
AとかBとかってのもひどいな
田中太郎 田中花子 田中・・・・・ 田中一家で統一してしまえ
msg1とかmsg2とか手抜きしたっていいじゃない
自分の作った関数を勝手にシリーズ化されると腹が立つよな。
String型をconst char*に変換って出来ますか? PtrToStringCharsとかいうのはあるんですが、 なんかclrがどうとかでて使えません…
>>77 そのString型がどこに由来するか、どんなエラーメッセージが出るのか、それによって答えが異なるでしょう。
一般的には、できるはずです。
80 :
デフォルトの名無しさん :2010/11/21(日) 11:20:05
C++/CLIでこのスレ汚すのやめてくれない?これC++じゃないから
>>80 人に読ませるのならコメントくらいつけて欲しい
あと、コメントアウトしてる部分は削除して
gcc(4.5.1)のc-parser.cだけを利用しようと思っています。 で、VC++でコンパイルしているわけだが(w、 gimple という構造体を参照していて、この構造体が未定義(インクルードなし) のためにエラーが出てます。構造体のありかをご存じの人いますか? 一応、gimple.h/cを観てみたが、見つけられなかった。。。
>gimpleという構造体を参照していて gimpleという構造体の宣言の間違いですた。 たとえば、 gimple stmt; とか。 よろしくお願いします。
>>86 アドバイスありがと。
gccへ行きます^^
#そうそう、今自分でかこうか考えてた所(w
ついでに質問させて。 パーサをCでスクラッチで作るとすると、文字列用の関数を用意すべきだと思うが、 標準(stdio)ではそれら用のラッパー関数を作らにゃならん感じで、時間を使ってしまいそう。 少なくとも、Tclのストリング並みの関数群のライブラリをご存知の方いますか? ご返答よろしくお願いします。
文字列操作なんて入力からトークンを切り出すのと2つの識別子が同じか比較する以外になんかやることあるけ?
Linux(GCC)ですが、Cのlocaltimeってマルチスレッドで使えるんでしょうか? Visual C++だと戻り値がスレッドごとにメモリ確保されていますが、 Linuxでどうなのか調べがつきませんでした。
localtime_r でぐぐれ
class Something { public: static int num; }; このnumにほかのクラスから代入するにはどうしたらいいのですか? これがstatic関数ならばその関数を使うことはできるのですがstatic変数が利用できません。
>>89 トークンの切り出しでトリム機能があるとさくっと作れそうなんス。
Tclで半分パーサの機能を作った時の経験からそう思うんス。
char *trim(char *s) { return strtok(s, " \n\r\t"); }
そんな関数にするぐらいなら strtok(s, " \n\r\t"); 普通に呼び出したほうがマシだろ
>>92 なんでやねん
publicなんだからクラス関係ないだろ
Something::numで見えるだろ?
>>92 後から心配になって来たのでやってみた
やっぱりうまく行くな
class Something {
public:
static int num;
};
int Something::num = 0;
class Other {
public:
void func() {
Something::num = 123;
}
};
int main()
{
Other o;
o.func();
std::cout << Something::num << std::endl;
}
>>94 >>95 アドバイスありがと。
>>95 多分ラッパー関数と自分が書いたからだと思います。
彼の優しさだす。
切り出しに良い関数ですね。
Something::num = 123; ではなくて int Something::num = 123; にしないと定義できないよ。
>>99 そうなってるんだけど
お前の目はフシアナか?
まさか二重定義されてるとは思わなかったw
>>101 もしかしてクラスの中で定義してないので変だと思ったのか
class Something {
public:
static int num = 123;
};
みたいな感じで
これだとstatic intしか初期化出来ないので、俺はいつも外部で定義している
質問です! 柴田望洋先生の'97発行の「C++への道」という本のサンプルソースを borlandにてコンパイルしようとすると、「エラー E2141 position.h 1: 宣言の構文エラー」 エラーが発生します。なぜでしょうか。 /* position.h*/ class Position{ private: double xp; double yp; public: Position(double x, double y){ xp = x; yp = y; } double X(void){ return xp; } double Y(void){ return yp; } void Set(double x, double y){ xp = x; yp = y; } }; /* position.cpp*/ #include "position.h" #include <iostream> using namespace std; int main(void){ Position a(10.0, -10.0); Position b = Position(3.5, 6.0); cout << "点a = (" << a.X() << ", " << a.Y() << ")\n"; cout << "点b = (" << b.X() << ", " << b.Y() << ")\n"; return (0); }
>>104 特に問題ないと思うから、ファイル名を変えてみたら?
106 :
デフォルトの名無しさん :2010/11/22(月) 14:49:30
>>105 positon.cpp⇒sample_p.cppに変更してみましたが、
同様のエラーが出ました。
ヘッダーファイル名も変更すべきでしょうか?
例のC++としてコンパイルするオプション・・・なんだっけ忘れた。
108 :
デフォルトの名無しさん :2010/11/22(月) 14:53:20
>> 107 bcc32 -P positon.h sample_p.cpp でコンパイルしてみたら通りました。 -Pオプションが必要だったとは・・・・。 ありがとうございました。
C++やるなら無料のBCCなんて捨てろ
>>109 学習用にサクッとコンパイル通すには便利だったんですが
他のコンパイラおすすめありますか?
>>108 インクルードファイルはインクルードされるのに任せればいいからコンパイルしちゃダメ。
>>110 食いつくと思わなったが一応解説しておくと
BCCの無料版は古いのでC++新しい機能を駆使しようとすると問題が多い
でも初心者が勉強していく上でそれにひっかかることはまず無いので忘れてください
質問ばっかりすみません!
>>111 どういう意味でしょうか・・・?
>>113 bcc32 sample_p.cppだけでOK。
position.hは、sample_p.cppに「インクルードせよ」と書かれているので勝手にインクルードされる。
>>113 とりあえずbccでコンパイルしてみます
>>114 たしかにbcc sample_p.cppだけでコンパイルが通りました。
勉強になりました。ありがとうございます。
>>284 >以前152
>で書き込ませていただいた者なんですが、教えていただいた通り、打ち込んでみたのですが、実行結果がでませんでした。
>なぜでしょうか?
7行目
>>164 i=0; を
i=0; puts("数値を入力>"); に変えてみようか?
>>110 勉強用ならgccがいいよ
bccはもう終わったコンパイラ
Σ(゚∀゚) bccは終わコン!
Σ(゚∀゚) bccは終っパイ!
120 :
デフォルトの名無しさん :2010/11/22(月) 19:57:56
Σ(゚∀゚) b(ボインで)cc(CC)はオっパイ!
C+でプログラミングしたいと思うのですが、オススメの書籍やソフトなどありますでしょうか??
ifstream ifs( "data.txt" ); して、ファイルdata.txtを利用できるかって ifs.good() == true で判断するの? 他になんか定石的な判断法あったら教えてね
if (ifs) または if(!ifs) でよい
>>123 ありがとうございます
そんなんで良いですか!
駄目な時ifsを0にするって規格で決まっているですか?
bool operator ! () const; が有るんだよ
>>123 if(!!ifs) か if(!ifs) じゃないか?
if (ifs)って書けるようにoperator void*() constが定義されている。 C++0xのドラフトN3126だとexplict operator bool() constに変更されている模様。
可読性低くなるからわかりやすいのを使ったほうがいいな
129 :
デフォルトの名無しさん :2010/11/24(水) 00:30:49
>>125 、
>>127 熱烈感謝わん
iosでoperator void*() const、bool operator ! () const定義されていて
if (ifs) -> operator void*() const,
null pointer if either failbit or badbit is set.
if(!ifs) -> bool operator ! () const,
true if either failbit or badbit is set
よりif (ifs) または if(!ifs)でokにゃんですね
130 :
デフォルトの名無しさん :2010/11/24(水) 23:26:27
すみません、質問させてください。 環境はwindows7、コンパイラはBorland C++ Compiler 5.5です。 オイラー法で数値計算をして出力するEuler.exeという簡単なプログラムを作成したのですが、 コマンドプロンプト上で >Euler.exe とするときちんと計算結果がプロンプト上に表示されるのですが、 >Euler.exe>Euler.txt とテキストファイル上に書き出すようにリダイレクトすると、プログラムが停止してしまいます。 プロンプト上では動作するので、プログラムの問題ではなくwindows7かコンパイラの問題だと思うのですが、 どなたか原因を教えていただけませんでしょうか。(今までの他のプログラムは出力できていました) よろしくお願いいたします。
>>130 7なら権限の問題ではないかね。
あ、でも他のプログラムではできたのか。
書き出すより先にプログラムが終了しちゃうとかかな?終了間際にウェイトを置いてみるとか。
ひっじょーにしょうもない質問ですが、Cで
getchar();
のようなEnter入力待ちって、C++でcinとか使ってできるのでしょうか?
cin,get()
>>132 あ、なるほど
ホンとしょーもない質問で失礼しました
こんな関数持ってたのね
プログラム中でクラスの名前を表示したくて cout << "node = " << typeid(*node).name() << "\n"; と書いて実行すると、 node = N3m3g8Sprite3DE とかいう謎の文字列が得られるのですが、ただしくクラス名Sprite3Dだけを表示するにはどうすればいいですか?
環境に依存しない方法では存在しない。 てっとりばやく何とかしたいなら、Visual C++を使え。
>>134 自分で謎文字例からクラス名を取り出せば
たぶんこういうルールじゃね
N
3 m3g (3文字)
8 Sprite3D (8文字)
E
137 :
134 :2010/11/25(木) 17:48:38
面倒くさいので1行でお願いします。
デマングルでぐぐれ
静的な型しかないC++で、何で型がわからないんだ? templateか? パラメータになりそうな型と手当たり次第に比較したら? template<typename T> char const *get_type_name(T const &t); template<> char const *get_type_name(int const &) { return "int"; } template<> char const *get_type_name(double const &) { return "double"; } template<> char const *get_type_name(float const &) { return "float"; }
>>134 g++ならabi::__cxa_demangle
リフレクションみたいな機能が欲しいのか decltypeはあれ何だっけ
C言語の勉強をしたいのですが、無料の練習環境はありますか? 初心者用テキストに載っているコードが実行できる程度のもので構わないので、オススメがあったら教えてください。
OSすら書かないとかマジパネェっすよ
>>142 >初心者用テキスト
テキストに書いてあるオススメ
練習用にcodepadまじオススメ
>>142 Tiny C Compiler使ったのがいくつかあったような
for (int i = 0; i < length; i++) { int value = func(); } これではループの度に変数iが宣言されて冗長だから int i, value; for (i = 0; i < length; i++) { value = func(); } C++でこうした方が速い、こうするべきだとよく書かれていますが これだとループカウンタのスコープが外に出るので危険ですよね それにこの一連の動作を関数で定義して、関数ごとループさせるような場合はあまり意味を成さないし ループカウンタをメンバ変数やグローバル変数にするのも馬鹿げていると思います 基本も基本で恐縮ですが、実際のところ、皆様がどのように書かれているのか参考にさせていただければ幸いです
冗長の何が悪いというんだ 書くのが面倒くさい、ぐらいしか思いつかない
>>147 さっきのvectorのアホに感化されたか
>>147 C++ってんならスコープを必要最小限に狭める上のほうが一般的だろう
下勧めてるとかどこのアホだ?
それはそれとして、ループのたびに確保ってvalueの方だよな?
なら全体をスコープで囲っちゃえば?
回答ありがとうございます 下みたいな書き方にしなくて良いようで安心しました
また犠牲者が一人・・・
for (int i = 0; i < length; i++) { register int value = func(); } C++はこうするのが正しい
registerって何だよ 死語になってるキーワードじゃないか
仮にregisterが有効に働いたとしても、valueをregisterにするのが いいか悪いかは状況によるよな。
ここは昭和の自転車置き場の議論を引きずっているインターネットですね。
for (int i = 0, value; i < length; i++) { value = func(); } こうしたら?普通ありえんけど
>>156 javaで仕事やってて、ループ内でプリミティブ型の変数を宣言してたら
ループのたびにメモリが確保されてパフォーマンスが落ちるとかいいがり
つけられたことがある。
古い話題じゃなくて、わかってないやつは今でもいっぱいいそう。
>>160 メモリ確保するコードが出力されないことは保証されていないし、パフォーマンス
落ちるかも知れないだろ。
落ちた所でそれが何なのとは思うし、そんなコードを生成するJITは嫌だが、
別に言いがかりじゃない。説明できなかったお前が悪い。
少なくともこれだけは間違いない。おまいらスレ違い。
>>161 いや完全にいいがかり。
しっかり反論した。
自分の作ったところがパフォーマンス悪いって指摘されて、おれが
書いたコードに責任をかぶせようとしてた。
一回リクエストがあるたびに、数十M、数百Mメモリを浪費してることろが
あるのに、(仮にループ中のintの宣言がメモリを浪費するとして)リクエスト一回で
数十回しかループしていないところのintを指して、これが原因とか言ってた。
それ以前にC++でだってループ中のint宣言はメモリを浪費しない保障がない、
やめるべきだとか言ってたらそいつ頭おかしいだろ。
それと同じだ。
↓落ちつけよバカ
Cみたいに関数の先頭で変数宣言するスタイルがいいって信じ込んで、 変数は使う直前で宣言&初期化するってスタイルが理解できない 連中とか珍しくないし、そういうレベルからみたらループ中で宣言って 驚天動地のできごとなんだろな。
速度じゃなくてメモリ消費を指摘されたのか? 先頭で宣言しようがforの中だろうが同じだな。 速度の話なら、毎回メモリ確保したとしてもスタックポインタ加算・減算に1ナノ秒くらい? 100万回実行しても人間は認識できない時間。
>>165 ループ内で宣言すると「お前のコードは汚い」といわれたことがある、ついさっき。
もういっそ関数内の宣言もやめてグローバル変数で確保しちゃいなよ。
>>167 それはあんたの価値観が古臭いだけだ。
と言い返してやれ。
1999年にCでも途中での宣言が許されるようになったんだがなあ
Aがdouble型のとき (bool)A ってどういう意味? A != 0 でいいの?
std::exceptionを継承したclassがA , B・・・と複数あって 例外をキャッチするとき例外AとBの時は同一の処理をしたい場合catch()の指定の仕方はどうすればよいでしょうか?
catchでもっかいthrowすればいいじゃない
176 :
175 :2010/11/30(火) 12:22:17
throw ~ catch で型判定するぐらいなら dynamic_cast 使ったほうがまだ軽くていいような気がしてきた。
std::exceptionのデストラクタがわざわざvirtualになっていることから、 dynamic_castしてくれというのがライブラリ設計者の考えではないだろうか。
>>178 んなわけない。
仮想関数を持つクラスはほぼすべて virtual デストラクタを持つことになるわけで、
その考え方だと dynamic_cast 推奨と勘違いするケースが多すぎる。
virtual関数持ってる(=型情報あり)なんだから素直にdynamic_castすればいいじゃん
>>174-177 なんかよりよっぽど見やすいコードだし、使わない手はない
dynamic_cast の使いどころであることに異存は無いが
>>178 の理由付けはおかしい。
例外が飛んできてる時点で軽いとか重いとかは無意味だよ。
DLLから例外投げたら『ヤバイ』っすか~?
classにstaticとstatic以外のものが混ざる場合ってよくあるんでしょうか?
まれによくある
俺はあまり無い。
しつもんです~ Delphiで TUnkoClass: class of TUnko function BuildUnko(AType:TUnkoClass):TUnko; begin Result:=AType.Create; end; type TGeri = class(TUnko) ・ ・ TIpponGuso = class(TUnko) ・ ・ こういうのがあったとして、これをC++でやるにはどうしたらいいんでしょうか。
Singletonパターンではあるかもな 1つでもクラスを生成したら以降は無視するようにするためにカウンタを staticメンバ変数で作る
>>183 DLLを利用するコードがDLL作る時と同じコンパイラの同じバージョンでコンパイルされるなら問題無い。
もしくはクラスのメモリレイアウトと例外の実装方式に変更がないという自信があるなら良い。
要するにコンパイラメーカー以外は気安くスローするなってことだ。
同じコンパイラならバージョンぐらい変わってもいいだろ、とか思ってたが Visual C++のtime_tのサイズが途中で変わったりしてて驚いた。めんどくせ
size_tって何のためにあるんですか?
sizeof の戻り値を表現するために
intじゃなんだめなの?
for (int i = 0; i < (int)v.size(); i++) この(int)が激しくウザい。だれだよsize_tとか作った奴。
>>195 intが32ビットでsize_tが64ビットの環境もあるから (VC++の64ビット版とか)
64ビットのくせに2GBまでしか扱えなくていいのならintにキャストしとけばいいんじゃない
まじかよ。 俺は今まで64ビットの環境ではintが64bitになるかと思ってたよwww
パンピーにゃ32ビットありゃ十分でしょ
パンピーはプログラムなんか書かねーよ。 for (size_t i = 0; i < v.size(); i++) でいいだろ。
サイズの小さいのに、62ビット計算は無駄な気がするな~ 最適化で32ビットにでもなれば… いや、気にする必要もないのか?(64bitOS持ってないんだ)
>>201 お前は一生shortでも使ってろ。
for (short i = 0; i < 100; i++) ; // メモリの節約(^^)
いやいや、100くらいならcharにするべき
>>201 そんな無駄を意識する前に、ループ回るたびに size() 呼び出してる点を先に考えろ。
それは、普通に最適化で外に出るだろ
>>202 ,203
ちょっと待て、普通にどうなるか聞きたいのだが?
メモリー以外変わらないのか?
>>206 十分に最適化の聞くコンパイラなら同じこと。ただし下手に小さい整数型をループ変数にすると
100 を 200 にしたり 300 にしたり 40000 にしたりすると意図しない結果になる可能性がある。
最適化の弱いコンパイラだと、演算時の整数格上げと変数格納時の格下げ(?)が繰り返されて
逆に効率が下がる可能性がある。
基本的にはデメリットしかない。
>204 for (int i = 0, size = v.size(); i < size; ++i) ということか。 まあ面倒くさいってのは一緒だけど。
>>208 のケースはvがconstなら一時変数に入れなくても最適化されるだろうけどねぇ。
; 10 : for(int i=0;i<(int)sizeof(buf)/4;i++) { 00 mov edi, DWORD PTR __imp__printf 0000b 33 f6 xor esi, esi 0000d 8d 49 00 npad 3 $LL6@wmain: ; 11 : buf[i] = i; ; 12 : printf("loop1 dat = %d\n",buf[i]); 00010 56 push esi 00011 68 00 00 00 00 push OFFSET ??_C@_0BA@NNHHKGGK@loop1 00016 ff d7 call edi 00018 46 inc esi 00019 83 c4 08 add esp, 8 0001c 83 fe 0a cmp esi, 10 ; 0000000aH 0001f 7c ef jl SHORT $LL6@wmain ; 14 : for(size_t i=0;i<sizeof(buf)/4;i++) { 00021 33 f6 xor esi, esi $LL3@wmain: ; 15 : buf[i] = i; ; 16 : printf("loop2 dat = %d\n",buf[i]); 00023 56 push esi 00024 68 00 00 00 00 push OFFSET ??_C@_0BA@KKOJHEJK@loop2 00029 ff d7 call edi 0002b 46 inc esi 0002c 83 c4 08 add esp, 8 0002f 83 fe 0a cmp esi, 10 ; 0000000aH 00032 72 ef jb SHORT $LL3@wmain VS2008 で恐ろしいほどの最適化処理だった。下がいいね
俺には同じに見える・・・
32ビットターゲットで比較してアホだろ
/usr/lib と ${HOME}/lib に同じ名前のライブラリがあります。 リンクすると/usr/libの方をリンクしてしまうのですが、 自分の${HOME}/libの下にある奴を優先的にリンクさせるには Makefileをどう書けばいいでしょうか
214 :
213 :2010/12/07(火) 23:08:14
LD_LIBRARY_PATHを指定していませんでした。 指定したらローカルの方をリンクしてくれました。 お騒がせしました
215 :
デフォルトの名無しさん :2010/12/08(水) 07:55:41
std::set<string,less<string>,MyAllocator> Set; というコードがあったのですが、MyAllocatorが複雑でなにをやってるのか なかなか分かりません。一般的にset::set()で独自アロケータを指定する場合というのは どういうことがやりたい場合でしょうか?
んなもん、作った奴に聞け。
217 :
デフォルトの名無しさん :2010/12/08(水) 09:11:05
コードを読むうちに、やっぱりメモリプールを使った独自アロケータかな、、という気がして来ました。 それ以外ないですよね。
219 :
デフォルトの名無しさん :2010/12/08(水) 13:21:18
c++ で throw するときにとりあえず catch にさえ行ってくれればいい (引数に意味はない) 場合はどのような型(値)の引数を指定したら いいんでしょうか。 なにかお作法みたいなのはありますか?
catch (...)
エラーコードでもthrowしとけば?
throw "This is meaningless value";
ここまでstdexceptについての言及なし。
new しなくても関数使えますが new を使う必要ない場合は使わないほうがいいんですか?
必要なときニュ~する、必要でないときはニュ~しない。 にゅ~にゅ~
new した方が早いとかそういう噂を聞いたものでな
いや速くないでしょ、にゅ~する時間かかるし。 使用だけなら、時間は同じ。
いやまて、スタックに配置されるのとグローバルに配置される分は。 たぶん少し速いかもしれん。
どちらかと言えば、キャッシュヒット率が期待できる分だけスタックの方が速いね。 いずれにしろ、誤差だ誤差。
>>196 わかる
ズレてるよね
こんなところでバグらねーよボケがって思うわ
糞MS、str~系の関数全部エラー出しやがってマジで馬鹿じゃないの?
お前、これの何が危険なんだと
サイズ指定してないから危険?は?
こんなところでバグなんてでやしねぇよ
ちょっとはプログラム組んだことある奴社内にいねーの?
すげー、チンカスども余計なもんいれんなお前等の「安全」とかちっとも役に立たないんだわ
なるほど、間抜けはウォーニングとエラーの区別がつかないらしい。
|for (int i = 0; i < (int)v.size(); i++) for(size_t i=0;<v.size();i++) じゃだめなの?
>>232 警告が出るよ
「符号付き値と符号無し値の比較」みたいな
forループのカウンタってなんでintが多いの
>>234 規格を見てないけどsize_tは大抵unsigned longなんだぜ
負の数が表現できて普通に使う分には十分大きくて多分他の整数より速い
WOW64で32ビットアプリケーションが実行された場合、 使用できるメモリは4ギガまでなのでしょうか?
いえす
アプリで使用できるの2ギガじゃないの?
RAM DISKを使うと使えるってだけの話でわ?
>>235 iを使って計算するときに楽だからじゃないか
負数と足すとき大概はキャストの必要があるし
>>232 size_tが64ビットの場合もあるので、size_tでループを回すと効率が落ちる場合もある。
>>244 じゃないが、
x86_64とかREXプレフィックス等でコードがでかくなって遅くなりそう。
問題になるほどの差があるかどうかはともかく。
いくら出せますか?
>>247 プリフィックスが付く事で遅くなる事はないとIntelは言ってる
ただコードが膨れた分キャッシュ効率は間違いなく低下するだろうけど
だからあんな巨大なL2キャッシュを積んだんじゃね?
たまにCで書くとC++の偉大さが解かるな コードめちゃ綺麗になるわ
ちょと複雑になってデバグとかなると Cの簡潔さが欲しくなるよ。
いやそれ、単に設計が悪いだけ
寿命の短い変数のために { int i = ・・・ } って書いたら気味悪がられたことある これだからC使いは嫌いだよ
俺はCで(99以前で)書くときは関数の先頭に全部の変数宣言をまとめてる int i, j, k, ...; char *p, *q, ...; ってな感じで 無理にスコープ狭めても醜いし、もうCだしいっかと割り切ることにした
気味悪がられた程度で嫌になるとか・・・ もう少し大人になりなさい
>>254 C使いです。タスタスも少し出来ます。
なんでこれで気味悪がれるの?
なかなかの上級テクだと思うが。
>257 上級テクどころか、普通のTIPSだろ。 それを気味悪いだとか言うような奴に限って300行もあるような関数の先頭で変数を宣言したがる。 おまけに、ポインタ変数に整数値を入れてフラグ代わりにするような使い回しも厭わない。 要は感性が違うのだと諦めて、適当にあしらうしかないね。
曰くスコープのネストが深くなるのがキモイんだと
その感覚自体は正常だろ あんまり酷くなるならスコープ切るより関数分けることを考えるべきでしょ
所詮他言語なんてそんなもんだろ 古いfortranの感覚だと、関数なんて使ってんじゃねーよ馬鹿みたいに言われてたとか聞いたし
VBの仕事で、普通の感覚で、関数やらサブルーチンやら作ってたら、 イベントハンドラにコピペコピペで長い処理書いてるおっさんから 「お前のコードはあちこち飛んで分かりにくい」って苦情を言われた ことがある。
で みなさんは goto を使ってます? 俺最近使ったw ループ一気脱出には便利よね。
gotoつかわないと抜けられないようなループは書かないので使いません
ここ10年ほど、ネタ以外で使った事がない
Cで例外処理っぽく書くときに使うな。
例外処理っぽくというと int *p = malloc(...); int *q = malloc(...); ...; if(err) goto FREE; ...; if(err) goto FREE; ...; FREE: free(p); free(q); こんな感じ?でもこれって int *p = malloc(...); int *q = malloc(...); sub(p, q); free(p); free(q); void sub(p, q) { ...; if(err) return; ...; if(err) return; ...; } こうしたほうが綺麗だよね やっぱ使い道見えてこんわ
>>267 その例で言えば、メモリ確保を集約できるならそれでもいいけどね。
>>268 の例はあまり綺麗じゃないぞ。
おれなら、リソースのポインターやハンドラーNOに正常オープンの情報が入って。
ポインターならNULL以外。 ハンドラなら-1以外。
解放時にその情報を見て解放している。
これなら、何時終わろうが何処で終了処理されようが問題なく解放できる。
gotoラベルも気にする必要がない。
#include <stdio.h> int main(void) { FILE *fp, *gp, *hp; int i; for(i = 1; i; i = 0) { fp = fopen("f.txt", "r"); if(!fp) break; // do something if(error) break; gp = fopen("g.txt", "r"); if(!gp) break; // do something if(error) break; hp = fopen("h.txt", "r"); if(!hp) break; // do something if(error) break; } if(fp) fclose(fp); if(gp) fclose(gp); if(hp) fclose(hp); return 0; }
だから多重ループ一気脱出の時に便利なだけだよ。 break が関数でネストレベルがパラメータにあればいいのかもね。
その為の例外機構です
例外で脱出とかアリなの?
例外を通常の制御フローに使うな
だいたい、多重ループしなきゃ行けないような設計自体が問題だ
for (~) { switch(~) { }
途中送信しちまった このswitchでfor脱出したいときとかないの?
ifで書けば解決
goto使うぐらいなら、終了フラグ作るよ
ループ脱出のgotoくらい許せや
絶対に許さない! 絶対にだ
>>281 許す許さないの問題じゃない。ただ単にポリシーの問題だ。
使いたければ使うがいい。ただな、ループを抜けたいだけの理由でgoto
使えば、当然飛び先を変えて処理をしたいと思うのが人間、普通にそう思うだろう。
それがいやなんだよ。
ループを工夫して一重で書けよ
これからも多重ループ脱出にはgotoを使うであろう。予言
多重ループ平気で書くやつを多重ルーピーと呼ぶことにしよう
#define LOOPBREAK {i=ENDVALUE;continue;}
ループ制御変数がi限定なのか。
時代はラムダ式とreturn、アルゴリズムにして追い出す方向に向うのかな
でわネタ豆乳 class hoge{ private: int _data; public: hoge():_data(0){} ~hoge(){}; }; がいいいですか それとも class hoge{ public: hoge():_data(0){} ~hoge(){}; private: int _data; }; のほうが好きですか privateが上にあるか下にあるか。 ま どっちでもいんですがw
googleは後者
アンダーバーで始まる識別子は敬遠される。 私は横着だから、 class hoge { int data_; public: // construction hoge() : data_(0) {} ~hoge() {}; // operation int get() const {return data_;} }; こんな感じになるかな。
やぱメンバ変数は m_付きがいいのでしょうか。
>>294 賛否両論ある話なので好きにしたらいいと思うよ
人には言えないけどアンダーバー開始にしてる 理由、VC++のインテリセンスで下にまとまって便利だから VC++stlもそうなってるし趣味プログラムだから許してちょ
処理系が提供しているライブラリだから 処理系予約の識別子記法で書いてるだけ。 もちろん、絶対に個人でしか扱わないものなら どうしようと(それで将来不具合が出ようと)自由だけどね。
俺は member data は _ で終わりにしてるけど _ で始める人もいる(ちょっと気持ち悪いけど) なんとなく何かと衝突しそうで怖い __ で始めるとヤバそうだけど一個なら安全なのかな
_からはじめない派の人は、_の後に大文字が使えない(規格に違反する)ことを気にしているのですか?
でもぶつかればコンパイルエラーになるのでわ?
グローバルな関数に使ったりするのはダメだけどそれ以外はいいよ 名前空間に入れるなりクラスのメンバにするなりする分にはいい
>>296 アンスコ2つで始まるのは標準ヘッダのマクロで使われてるかもしれないから問題あるが
アンスコ一つならグローバルとstd名前空間で予約されてるだけだから
問題無い。
アンダースコア2つで「始まる」じゃなくてアンダースコア2つを「含む」識別子じゃなかったっけ
304 :
302 :2010/12/13(月) 17:26:57
>>303 アンスコ二つは「含む」でした。失礼したでござる。
どうせタイプ一回ならmHogeでよくねーかアンスコだとシフト押さないといかんし
麻雀プログラム書くときに卑猥になるからダメだ。 bool mAnko;
キャピタライズのときにもシフトは押すわけだが
インテリセンスのためにも m_ を愛用してる。
でもm以下の関数呼ぶのに邪魔じゃね?
俺は_だな。 先頭に_が付いてるってことで触って欲しくないとアピールできる。
同じような話題で ヘッダの2重読み込み禁止のdefineの記述はちょっと悩まない? 多分ぶつからんとは思うけどぉって。 VCだと適当に付けてくれるんだけどね。 #ifndef __HOGE_H__ #define __HOGE_H__ ・・・ #endif
#define PROJECTNAME_ROOTDIR_・・・_HEADERNAME_HPP これでおk 衝突したこと一度も無い
#pragma once最強。 他の処理系でもサポートしてくれれば・・・
>>309 邪魔かもしれんけど、プログラムリストが一目で、ローカル変数と区別が付くのがいい
>>311 アンスコ二つを含む名前はコンパイラ以外が使っちゃいかん。
ぶつからないよう氏名生年月日を入れるのがマジオススメ
#define _山田太郎_19801231_プロジェクトA_TEST_H_
メンバもほかの変数も区別せんけどなぁ 実装書くときに変数を省略形にするから被ることないし
>>315 てか作成時の時間を入れておけば大丈夫だよね
アプリケーション命名規則じゃなく。 作成時間命名規則、又は、作者名命名規則かw
他のソースを参考に読み、理解したらそれをパクるのではなく自分なりに書き換えたほうがいいのでしょうか? こんなのよく考えるなぁーって思うときが多くて、、、
そのまま流用できるコードならそれでいいんじゃないの まあでも著作権はいろいろ難しいから業務だったら詳しい人に聞いたほうがいいよ
__int64より大きい整数扱いたい場合はどないすればいいんですか? doubleだと桁が足りませんよね…こまった
自分でそういう整数を扱うクラスを作るか、既存のライブラリを探してきてそれを使うか。
たぶんboostライブラリーにあるよ。
ねぇよ
それならクヌースの2巻を読むといいよ
BigNumでぐぐれ
Linux+g++ で socketとかpthreadとかやりたい時、namespaceがないでしょ。 そもそもヘッダが sys/***.h だったりするし。 そんときはやっぱgccでコンパイルしてextern C でリンクするしかないんかな。 みなさんはどうやってます?
何言ってんだ? C++からでも普通に使える。
reallib でググれ
>>327 ①sys/***.hをインクルードする
②そのまま使うコードを書く
③-lpthreadでリンク
gccコンパイルもextern "C"も要らない。
>>321 「__int64」ってことはVisual C++かな。/clrオプションでDecimal型使うのが楽。
>>330 それはわかるんだけど、cstdlib とか cstring とか
namespace std じゃん。
でもそういうヘッダがない システムコール系は グロバル空間じゃん。
そういうのが作法として気になってるだけなんです。
気にしなくていいってならそれしかないんですけどぉ。。
>>333 へへぇ 恐れ入ります。
それしかないならそうですね。
ありがとうございました。
またACEでもやるかw
>>332 C++リンケージのシンボルは名前空間で名前を整理する。
Cリンケージのシンボルは全てがグローバル扱い。
CのモノとリンクするんだからCのやり方に従うのが筋。
C関数を呼び出す変なラッパーをC++で作るのだけはマジ勘弁。
>Linux+g++ で socketとかpthreadとかやりたい >みなさんはどうやってます? まず言語の選択を間違えている。マルチスレッドでソケット通信するだけなら Javaの方が10倍マシ。C++でやるメリットなど無い。 無駄なことにエネルギー使うのはやめた方がいい。
悪名高き Java をインストールさせるなど愚の骨頂
>>336 Javaは遅いし怪しいし気持ちわるいし
なにより出来ませんw 結局これ。
>>338 C++でできなかったらJavaでどうやんの?
ソケットどころかJavaの処理系すら存在しない世界になるよ?
ちょと何言ってるかわからない
変なラッパなんか使わず、Cの流儀で書けばいいだけだ。 まさか、アプリケーションレイヤーで直接ソケットを操作するわけじゃなし。
class B { list<weak_ptr<a> > alist; void SetA(shared_ptr<A> a){/*alistにaをpush */}; } class A { void Hoge(B &b){ b.SetA( shared_ptr<A>(this) );}; } 大雑把ですが このようなコードを実装するとHoge()から抜けるときに自分自身を削除することになってしまうわけですが この設計を実現するためにはどうしたらいいでしょうか?
B unko; auto_ptr<A> a(new A); unko.SetA(a.get()); a.release();
>>343 >b.SetA( shared_ptr<A>(this)
shared_ptrをテンポラリで使ったらすぐにdeleteが走るに決まってるだろ。
shared_ptr使ってるのをやめればいいんじゃね?
enable_shared_from_thisでぐぐると幸せに慣れるかもな
わからんw
INT64 (__int64)等はVCのコンパイラ独自拡張ですか?
long long intならC99の正式規格だな 64ビット整数という保証はないけど
あっごめんlong long intは最低でも64ビットだわ §5.2.4.2.1 ? minimum value for an object of type long long int LLONG_MIN -9223372036854775807 // -(2^63 - 1)
? maximum value for an object of type long long int
LLONG_MAX +9223372036854775807 // 2^63 - 1
? maximum value for an object of type unsigned long long int
ULLONG_MAX 18446744073709551615 // 2^64 - 1
>>348 __int64はVCの独自規格だが結構多くのベンダーが対応している
gccはC99に部分的に対応しているためlong long intが推奨
Cygwinを使ってvc++のclを呼び出すみたいなことって出来るんですか? それともgccじゃないとだめなんでしょうか?
環境変数設定すれば普通にできるんじゃねえの
#include <iostream> using namespace std; int main(){ char b=-1; cout << b <<endl; return 0; } これを実行すると -1 って表示されないんですけどぉ。なんでぇ。 何か忘れてます? gcc 4.1.2 CentOS5.5
cout << static_cast<int>(b) <<endl;
>>358 それはやったんですけど、どうしてcharだとだめなのかなぁと。
char b='a'; cout << b <<endl; で97とか表示されても困るだろうが
なるほど。最履修します。ありがとうございます。
>>346 横レスしつれいするけどenable_shared_from_thisってコンストラクタで渡せなかったり
自身が必ずshared_ptrの管理下に無いとダメみたいだけど上手く回避する方法はないかな・・・?
364 :
デフォルトの名無しさん :2010/12/17(金) 21:24:07
明らかに不正なポインターを見分ける方法はありませんか? 例えばこういうポインターです。 Foo* foo = (Foo*)0x12345689; どうしても必要なのですが何とかなりませんか。
if (foo == (Foo*)0x12345678) {
実際にそこへアクセスしてみて EXCEPTION_ACCESS_VIOLATION なり SIGSEGV なりを捕まえる
いやいやいや、エスパーするに、たぶん例外的なアクションをしない、 不正なポインターでしょw。例外的な物ならすぐ分かるからw
368 :
364 :2010/12/17(金) 21:45:00
すいません、まじめに教えてください。 ポインターの指す先が有効なオブジェクトなのか、未定義なのかを判別しないといけないのです。
ほらやっぱりw
Cをやめるのが一番だと思うよ
有効なオブジェクトのリストを持っておき、そのポインタがリストに載っていれば有効、でいいんじゃね
無効なポインタはNULLポインタにしておけば良いんじゃね?
373 :
364 :2010/12/17(金) 22:01:15
もういいです。自分で何とかします。 有難うございました。
結構本気だったのになぁ 自分はポインタはNULLで初期化してDeleteしたり使わなくなったらNULL代入しておくようにしておくんだが
クラスの関数を使うときに Class().func(); とすると使えてしまいますが、このテクニックはよくつかわれるのでしょうか?
結構本気だったんだがな 有効なオブジェクトのリストを持っておくのはデバッグ中はまれによくやるぞ (どっちかというと解放漏れチェックのためにだが)
というかスマポ使えよ、と言うのは無しなのだろうか
NULLチェックでダメな場合がそもそも思いつかない
いやいやいや、スタック上のオブジェクトですでに消えたスタックデータとか。 何かがオーバーランしてポインター潰したとか。 ポインター演算又は配列の添え字間違えたとか。 色々あるよ
自分でオブジェクトの管理もできないならポインタを使わないようにするのが一番だろ。
変数は初期化して deleteしたらnullを代入が作法かと。 ポインタ先が本物か偽者かを判定するなんてわかんのかい?
ポインタにNULLを入れて何回でもdeleteしてやる
ダブルポインタで参照しとけばどこからアクセスされてても生存確認できるんじゃ
結局 ワッチャかトレサを入れておくってのは解かもしれんが、 やってる人おるん? そんなにポインタって危ないもん? ポインタの使い方しらんかちゃんとモドリチみてないか 単にめちゃくちゃなプログラムなのでわ? とw
>>374 最近、これを忘れてえらいめにあいました。
NULL 代入忘れを検出する方法を思案中。
結局可能なら素直にスマポっておけって結論になるんだよなぁ
>>385 必ずマクロ(もしくはテンプレート)経由でdeleteするとかでだいたい防げるんじゃね?
まぁNULL初期化を忘れそうだけど
だから、忘れる可能性のある対策なんて無意味なんだって。 自分できちんと管理できない馬鹿は大人しくJava使えばいいんだよ。 あ、C#でもいいか。
覚悟がないなら生でやるな、でいいだろ。
忘れる可能性なんて言ってたら何もかけないだろ
C++を0の状態から勉強している者です。
「ロベールの入門講座」を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば動きます)
http://codepad.org/0i4ByGfl が自分の書いたソースです。
私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?
マルチ氏ね
393 :
391 :2010/12/18(土) 11:25:06
すいません、聞いておいてなんなんですが、事故解決しました。 absoluteの略で私は「abs」と勝手に略していたのですが、 偶然にも数学関数の中ですでに定義されていた型のようで、そこでエラーが出ていたみたいです。 「Abs」と最初を大文字にしてやると無事オーバーロード出来ました。
std::'double abs(double)'が既に定義されているから再定義はできない。 知らない間に誰かがcmathあたりをインクルードしてる。
>>381 ,385,387
スマポ使えって結論が出てる脇でヌル代入するテンプレート自作とか
マヌケな話が続く意味がわからない。
deleteしたあとにNULL入れるって、変数の使い回しが横行してるような ソースでのお作法だろ。 方向性があさってすぎる。
ポインタにNULLを入れて何回でもdeleteしてやる
>>396 void func() { int x = 999; std::cout << &x << "," << x <<std::endl; }
void hunc() { int x; std::cout << &x << "," << x <<std::endl; }
int main(void) { func(); hunc(); return 0; }
output:
0x23ff3c,999
0x23ff3c,999
環境次第では上のようなことも起こりうる
使い終わった変数の中身を間違って見てしまうこともある
これが整数を使ったハンドルだったりポインタだとめんどくさいことになる
だから使い回ししなくてもNULLをいれときましょうねってこと
てめぇSAFE_RELEASEさんdisってんのかあぁ?
>>398 未初期化変数の値を使っているのが問題なのであって、
ヌルを代入したからって何も問題は解決しないだろうが。
>>399 「えーマジマクロ?」「キモーイ」「キャハハ」
>>399 それはたとえば auto_ptr ごときと比べても何かメリットがあるのかというレベル。
SAFE_RELEASEで十分
>>400 だからただのセーフティだよ
初期化だってひょっとすると忘れるかもしれないだろ
忘れてんのにそれっぽく動かれるのと、NULLアクセスで一発で落ちるのと
バグ消ししてる時にどっちがありがたいかって話だよ
>>400 これ使った攻撃方法もあるのでセキュリティには注意しましょうね
406 :
デフォルトの名無しさん :2010/12/18(土) 14:28:34
int GetX() { return X; } void SetX( int _X ) { X = _X; } メンバ変数の代入はこんな感じの関数でおk? もっとスマートな書き方ある?
コーディングスタイルの話題になると、普通に書いてたらそんなミスしないだろ っていうのに備えて、へんな書き方主張する流れになるな。
>>404 スマポ使えば初期化が抜けることも無い。
auto_ptr作ったやつが開発段階で心臓発作で死んで unique_ptrが最初からstlに入ってればもっと住みやすい世界になっていたのに だれだよauto_ptrとか作ったバカは切腹しろや
auto_ptr 怖がりすぎじゃね?いいやつだよ。 可搬性の広さとオーバーヘッドの小ささでは数あるスマポの中でも最強だろう。
いきなり「所有権の移動」なんて概念を持ち込まれても・・・ ていう感じだったしな
const auto_ptrでおk
参照つかえ
VCにて、Unicode文字セット設定でビルドした場合で、 マルチバイト文字の関数を使ってもエラーは出ませんが、 これは非推奨ですか?
使ってもいい
vc10で自作したライブラリをコンパイルすると毎回このエラーが出ます 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5): warning MSB8004: Output ディレクトリの末尾がスラッシュではありません。 Output ディレクトリが適切に評価されるようにするために、このビルド インスタンスによってスラッシュが追加されます。 どうすれば出なくなりますか?
どうすればよいのか書いてあるじゃないか....ねぇ、日本語読めないの Outputの設定が悪いんだろ
素直にディレクトリの末尾にスラッシュを追加するがよろし
法律で文字コード統一してほしい 何年までに移行せよみたいな
何で統一すんだよ unicodeすらアレなのに
friendクラスってできれば使わない方が良いんでしょうか? 便利なんですが、設計が悪いのを誤魔化してるんじゃないかという気になってきて・・・
自分で設計が悪いと薄々思ってるんならfriendどうこうじゃなしに見直すべきだろう
設計段階で結びつきが強いことが解ってるならfriendが最良の解決案で問題ない オブザーバーとか相互参照してるパターンでfriend使うことが多いかな(毎回使うわけでもないが) 後付とか全然関係ないクラス間でfriend使うのがだめなんだよ
friend は operator とか cppunit とか piml とかくらいかなぁ
どうしようもなくなって最後は友達に泣きつくって事でしょう。 そうなる前になんとかしないとね。
ファクトリクラスをfriendにして ファクトリクラスを通してしかオブジェクトを生成できないようにしたりとか そういう使い方もある
class Hoge { public: class Factory; private: /* CTORS */ }; class Hoge::Factory { public: /* CREATEMETHOD */ }; でいいじゃんfriendとかダサいよ
VISUAL C++でSalTalkのようにテキストをWAVファイルの音声で読み上げるようなプログラミングはできますでしょうか。 外見はwindowsのテキストツールで下に読み上げボタンが付いているようなものです。
できる
今からはじめるならC++より他言語の方がよくね?w C#あたりの方が触りやすい気がする
連結部の波形合成まで考えると、C#じゃ処理落ちすると思う。
その程度で処理落ちするわけない
STLやBOOSTつかいまくっても処理速度って維持できる? ライブラリの挙動を理解してて適切にチューンできるならともかく動くコードがかけるレベルだとどんな感じ?
>>436 動くコードが書けるレベルっていうなら
むしろヘタに自力で実装するより素直に使ったほうが速いと思われる
間違った使い方をしないなら遅くなることはないと思われる
そういうのは99%杞憂 遅かったらそこだけ直せば十分
そう言うレベルは何処が遅いかも分からんと思うけどな。 またぞろ、プログラマーなら分かった当たり前と主張するのかw
STLやBOOSTより性能いいものって、そんなのそう簡単には作れんぞ つか、その程度のレベルだと速度云々より安全性が気になるから素直にライブラリ使わせたほうがいいと思う
確かに考えてみればC++のライブラリがボトルネックになるほど重たい処理なんてそうそう無いよね 知人にライブラリなんて重くなるから使わんよ、とCライクにコード書くのがいたのでそんなに変わるのか気になったんだ
いやいや STLは下手に使うと、オブジェクトの配置換えによるコンスト・ディストの嵐
多数のオブジェクトをSTLコンテナで管理したときは直配列とくらべて遅くなったかなぁ 一つ一つは大したこと無いけど積もり積もって遅くなるかんじ
ほとんどの場合は積もり積もらないんだよな 積もり積もるところを探し出して直す
Cで書いたら速くなるなんてのは処理が簡単な場合だけだよ boostでやってることをそのままCで再現してかつ速くするにはそれなりの技術がいる コンパイル時計算のことも考えるとCでは追いつけない場合だって有る
だからそれは、熟知している人がうまくboost使った場合だろ
くだらないこと気にする前にさっさと完成させてボトルネック直せって感じ
ハード屋の尻叩いて高速化させるほうが先決
>>447 普通に書くとどう非効率になるの?具体例出してくれない?
変な書き方しなければ boost 使ったからって有意な差が出る程
遅くなる事はまずないと思うんだが
初心がboost使った場合どちらかというと意味不明すぎるエラーで死ねると思う
template使うとエラー出力が意味不明すぎてもうね
boost初心者はまだしも C++初心者なら説明がわからんだろう 他の人のコードを写して,今度はエラーがわからないだろうね
boostは何の問題もないが、コンパイルだけが遅くなるのは なんとかならんか。 ならんだろうなぁ。 結局 実行時に型が決まるからプリコンパイルは出来ないんだよね。 ってエピステメさんとどっかやりとりした記憶が。 人違いだったらごめんなさい。 あ そうそう boost/asio って動いてます? うちのCentOSにソスから入れてビルドしたら コンパイルでほげほげなエラーがw
日本語でおk
ではちょっと正確に boostのソースをダウンロードして bootstrap.shやって bjamでインストールして ldconfig の設定してOK!と 思ったら、 #include <boost/asio.hpp> using namespace boost::asio; int main(){ // www.boost.org の http サービスに接続 ip::tcp::iostream s( "www.boost.org", "http" ); return 0; } の簡単なサンプルで100行ぐらいどわーってエラーが出たって感じです。 元々入っていた古いboostのパッケージは消してあります。 みなさんの環境ではboost 1.45.0は正しく動いてますでしょうか。
エラーがわからなきゃスレに書き込めばいいだけ 頭使えよお前ら このインターネット時代に全然上級者向きとは言えない
Q.100行も書き込めません A.ちったあ頭使えや
>>457 コーディングしてるの? template 関係のエラーを貼り付けて
スレに書き込めってかなり無理があるなぁ
肝心な数行だけなら良いとしてもそれがわかるなら元々悩まんだろうし
適当にテキストファイルに書き込んでうpろだにでもあげればいいだろう
boost_systemとpthreadをリンクしてないなんていう凡ミスじゃないよね?
462 :
456 :2010/12/22(水) 12:28:49
お騒がせしてすみませんでした。 皆さんが使えてるのであれが使い方がヘボいという事で。
エラーなんて最初のあたりだけ見れば結構わかるもんなんだけどな
テンプレート関係はむしろ最後の方じゃないか? 俺が見てるのがgccの奴だからだろうか
エラーメッセージのtemplateクラスを脳内typedefで置き換えていけば割と読める
cppメーリングリストで見れない記事があるのは何故だろう
boost::tupleと構造体の違い教えてください タプルのほうが簡潔でよいと思うのですが
>>467 構造体のメンバには名前が付けられます。
470 :
デフォルトの名無しさん :2010/12/23(木) 04:25:06
binary_search(vec.begin(),vec.end(),xxx); という検索で、実際にはもう少し範囲が狭められるのが分かっているので binary_search(vec[idx],vec.end(),xxx); とやりたいです。(idxは動的に決まる) どうすればよいでしょうか?
binary_search(vec.begin() + idx, vec.end(), xxx);
472 :
デフォルトの名無しさん :2010/12/23(木) 08:03:43
binary_search(vec.begin()+idx,vec.end(),xxx);
10以下の計算だったらbool使ってもよくないか
利点はなんか俺テクニカルでかっこいいと思える事かな
ファイルストリームのイテレーターの使い方教えてください。
>>478 とりあえず使ってみて。わかんなかったらソースを添えて相談しよう。
ファイルの終端のイテレーターって引数なしのイテレーターでいいのですか?
以下のように引数の名前とメンバ変数の名前が同じ場合正常に初期化されますが保証されているのですか? Hoge::Hoge(int no) : no(no){}
はい
点数(short型整数2byte),名前(char型配列32byte),順位(long型整数4byte) の順番で2+32+4=38byteを書きこんだバイナリファイルがあります. C++標準ライブラリを使って,このファイルを読み込み, short score; std::string name; long rank; にそれぞれ格納する(特にstd::string name)にはどのようなコードを書いたらいいでしょうか? よろしくお願いします.
ファイルストリームのreadメソッドを使って38バイトずつchar配列に読み込み、読み込んだ配列を解析しましょう
コードを書く前にバイナリファイルの仕様が不明確です。 仕様を明確化してください。
489 :
488 :2011/01/07(金) 22:18:43
点数は32kまでで人数が2G人ってどういう想定なんだろう
キャストして直接入れるのが簡単な気がする std::ifstream ifs("data.dat", std::ios::in | std::ios::binary); short score; char buffer[33]; long rank; ifs.read((char*)&score, sizeof(short)); ifs.read((char*)buffer, 32); ifs.read((char*)&rank, sizeof(long)); std::string name(buffer);
そしていつの日かそれが全然簡単な方法ではなかったことに気がつく
>>485 異なるエンディアンの場合を吸収する必要がないのなら、
short n;
char s[32];
long l;
fread(&n, sizeof(n), 1, fp);
fread(s, sizeof(s), 1, fp);
fread(&l, sizeof(l), 1, fp);
がお手軽ではないでしょうか。
494 :
デフォルトの名無しさん :2011/01/08(土) 13:46:15
教えて下さい。
OS:Windows
開発環境:Visual Stadio 6.0
pthreadを使ったマルチスレッドの勉強をしています。
pthreadはunix依存のものらしいのでWindowsで使える様に以下のブログを参照させて頂き環境を作りました。
ttp://blog.livedoor.jp/akf0/archives/51595429.html その環境を使って以下のソースを組んで見ました。
#include <windows.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
void *thread_function(void *arg) {
int i;
for ( i=0; i<20; i++ ) { printf("Thread says hi!\n"); Sleep(1); } return NULL;
}
int main(void) {
pthread_t mythread;
if ( pthread_create( &mythread, NULL, thread_function, NULL) ) { printf("error creating thread."); abort(); }
if ( pthread_join ( mythread, NULL ) ) { printf("error joining thread."); abort(); }
exit(0);
return 0;
}
495 :
デフォルトの名無しさん :2011/01/08(土) 13:47:36
結果は以下の様なエラーが出ます。 thread1.obj : error LNK2001: 外部シンボル "__imp__pthread_join" は未解決です thread1.obj : error LNK2001: 外部シンボル "__imp__pthread_create" は未解決です LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Debug/testaaa.exe : fatal error LNK1120: 外部参照 3 が未解決です。 環境設定で足りない部分があるのか、あるいはソースが間違っているのか・・・。 誰かご教授ください。
ライブラリ(LIBファイル)をリンクする必要があるかと
498 :
デフォルトの名無しさん :2011/01/08(土) 14:41:11
>3)DLLファイル > …「C:\Program Files\Microsoft Visual Studio 9.0\VC\bin」
500 :
485 :2011/01/08(土) 15:20:02
501 :
デフォルトの名無しさん :2011/01/08(土) 16:05:12
>>499 ありがとうございます。
Include----*.h
bin--------*.dll
lib--------*.lib
で分け直しましたがやはり同じエラー(pthreadVC2.dllが見つからない)が出ています。
あれから色々弄ってますが、実行させるとdllが見つからないと言われてます
502 :
デフォルトの名無しさん :2011/01/08(土) 16:22:17
>>496-497 さん、
>>499 さん
プロジェクトと同じ階層フォルダに件のdllを置いたら上手く動作しました。
ありがとうございます。
これって起動時にDLLファイルを動的にリンクしてるって事ですよね。
期待動作としては、EXEファイル単体で動く様にしたかったんですが(コンパイル時にDLLファイルをリンクして欲しかった)
そう言う事は無理なのでしょうか?
名前空間の下にいるクラスの前方宣言はどうすればいいですか? 例えばAAAという名前空間のHogeを前方宣言しようとしてヘッダーに class AAA::Hoge と書くと'AAA' has not been declared.と出ます。
>>502 オープンソースだということだから、ソースコードが(探せばどこかに)あるだろう
それをプロジェクトに含めて一緒にコンパイルしてしまえばいいのではないか
ライセンスには注意すること
>>503 namespace AAA {
class Hoge;
}
506 :
503 :2011/01/08(土) 16:50:43
>>505 超サンキューです。これどのC++の参考書を見ても書いてないのですが。。。。
激しくLGPLだな
>>506 書くまでもないってことだ言わせんな恥ずかしい
509 :
デフォルトの名無しさん :2011/01/09(日) 11:28:15
std::arrayってg++だと使えないんですか? 誰も使ってる人がいないしぐぐっても出てこないのですが
4.4なら-std=c++0x
前にも一度なったんだけど、includeの順番とかそんなので外部参照エラーがでる。 前は順番変えたらいけたけど、今回はどう試しても通らない。どうすればいいの、誰が助けて 環境VS2010 エラー 1>test.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __int64 __thiscall std::ios_base::width(__int64)" (__imp_?width@ios_base@std@@QAE_J_J@Z) が関数 __catch$??$?6U?$char_traits@D@std@@@std@@YAAAV? $basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z$0 で参照されました。 1>test.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __int64 __thiscall std::ios_base::width(void)const " (__imp_?width@ios_base@std@@QBE_JXZ) が関数 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char)" (??$?6U?$ char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z) で参照されました。 1>C:\Users\Windows\Documents\test\Debug\test.exe : fatal error LNK1120: 外部参照 2 が未解決です。
順番変えたらって・・・ どのライブラリにどのヘッダが必要か位確認しろよ
>511 とりあえずコード晒せ、話はそれからだ。
ライブリにどのヘッダが必要かってどうやってみるの? ヘッダファイル辿っていくだけ?そのライブラリのヘッダ大量にあって、キリがないんだけど。 色々試してたらこれだけで外部参照エラー出てることに気づいた。何で? #include<iostream> int main(){ std::cout<<"cout部分で外部参照エラー"<<std::endl; return 0; } 1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------ 1> test.cpp 1>test.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __int64 __thiscall std:: ios_base::width(__int64)" (__imp_?width@ios_base@std@@QAE_J_J@Z) が関数 "class std::basic_ostream <char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z) で参照されました。 入りきらないので2つ略 1>C:\Users\Windows\Documents\test\Debug\test.exe : fatal error LNK1120: 外部参照 3 が未解決です。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
>514 >ライブリにどのヘッダが必要かってどうやってみるの? >ヘッダファイル辿っていくだけ?そのライブラリのヘッダ大量にあって、キリがないんだけど。 普通はドキュメントに書いてある。 プロジェクトのプロパティのところから「C/C++」→「コマンドライン」と、「リンカー」→「コマンドライン」コピペするとどうなる?
今までググったりして調べててやっと解決した。
共通プロパティのVC++ディレクトリのライブラリディレクトリに一部被ってるライブラリを置いている
パスを設定してたからだった。何故今まではエラー出なかったのか分からないけど、今まではライブリ
そこまで探しに行かなくても全て見つかって有効になってなかったからとかなのかね。
>>515 ありがとう、ライブラリのドキュメントに書いてるのね。今度見てみる。
一定時間おき(10-60秒くらい)に実行結果をfputs()でファイルに書き出すとき 書き込み対象ファイルは動作中常にオープンにしておく方が良いのか 書き込むタイミングで開閉したほうがいいのか どちらが無難でしょうか?
教えてください。 struct CELL { int a; int b; }; std::vector<struct CELL> array; というような、構造体のvectorを持つCSampleクラスがあります。 指定したidxの構造体のメンバを見るための内部関数を作りたいのですが、 次のようなポインタを使った書き方(添字内なら構造体へのポインタ、 添字外ならNULLを返す)を考えたのですが、やっぱり問題あるでしょうか? C++で普通な書き方(参照と例外を使う?)を教えて欲しいです。 const struct CELL *CSample::GetDataPtr(unsigned long idx) { if(idx < array.size()){ return &(array.at(idx)); }else{ return NULL; } }
CELL& CSample::GetDataPtr(unsigned long idx){ return array.at(idx); } 範囲外ならout_of_range
いまいち初期化子の必要性、有用性が分かりません。 引数を取らないコンストラクタを持つクラスなど、 データを与えて初期化する必要がない場合でも、 初期化子で初期化した方がいいでしょうか?
constなメンバが初期化できないし
>>521 初期化と代入は異なる演算であるということを肝に銘じておいてください。
class A foo; A hoge(foo); A hage = foo; 前者はコピーコンストラクタ A::A(const A&) 後者はデフォルトコンストラクタ A::A() ~ 代入 A::operator = (const A&) だよな?
それはどっちもコピコン
両者供にコピコンでしたか。 勘違いしてたっぽ
catchブロックに入ると元の例外オブジェクトは消えているのに 受け取り先でその参照は生きています。これはコピーされているんですか? try { std::exception e("auau"); throw e; } catch(std::exception &e) { std::cout << e.what() << std::endl; } また、tryブロックで作成したオブジェクトの、深い階層から例外を投げたときなど catchブロックでreturnを書いても問題ありませんか? (デストラクタが呼ばれてからcatchブロックへ移行しますか?)
>元の例外オブジェクトは消えているのに メモリには残ってるんじゃね?
>>528 >throw e;
この時点で一時オブジェクトが作成される。その生存期間の保障は
catchハンドラを再スロー以外で抜けるまで。
教えてください! ある計算をしてデータをファイルに書き出したいのです。 double loc1,loc2,loc3; ofstream ofs("test.txt",ios::trunc); while(条件){ 計算など; ofs << " " << loc1 << " " << loc2 << " " << loc3 << endl; }; とすると、なんか書き出したファイルがぐちゃぐちゃになってしまいます。 右に揃えてきれいに整えて出力するにはどう記述すればいいのでしょうか?
>>532 ofstream fout;
fout.open("text.txt",ios::out );
if(fout){
fout << "Hello World!!\n" ;
fout.close();
}else{
cout << "ファイルの書き込みオープンに失敗しました。" << endl;
}
の感じでどうでしょう。
>>528 コピーコンストラクタやデストラクタにログを仕込んで実験してみるといいよ。
ただし、たまに特定の実装と規格とでずれがあるから、疑問があれば規格を
確認したほうがいいよ。
ofs << setw(10) << loc1 << setw(10) << loc2 << setw(10) << loc3 << endl; 右にそろえるだけならこう たぶん正直見にくい結果になるだろうなあ
537 :
532 :2011/01/13(木) 01:14:25
解りにくくてすみません。 例えば、sin(x),e^x,tan(x) の挙動を比較するために ofstream ofs("tmp",ios::trunc); for(i=0;i<20;i++){ x=sin(i);y=exp(i);z=tan(i); ofs << x << " " << y << " " << z << endl; }; として、 (sinxの値) (e^xの値) (tanxの値) 0 1 0 0.841471 2.71828 1.55741 0.909297 7.38906 -2.18504 0.14112 20.0855 -0.142547 -0.756802 54.5982 1.15782 としたいのです。ところが、これだと、揃っていなくてみにくい! それぞれのデータについて、右揃えでみやすく表示するようなファイルへの書き込みをしたいのです。
>>535 ありがとうございます。
0 1 0
0.841471 2.71828 1.55741
0.909297 7.38906 -2.18504
0.14112 20.0855 -0.142547
-0.756802 54.5982 1.15782
-0.958924 148.413 -3.38052
-0.279415 403.429 -0.291006
0.656987 1096.63 0.871448
0.989358 2980.96 -6.79971
0.412118 8103.08 -0.452316
-0.544021 22026.5 0.648361
-0.99999 59874.1 -225.951
-0.536573 162755 -0.63586
0.420167 442413 0.463021
0.9906071.2026e+06 7.24461
0.6502883.26902e+06 -0.855993
-0.2879038.88611e+06 0.300632
-0.9613972.4155e+07 3.49392
-0.750987 6.566e+07 -1.13731
0.1498771.78482e+08 0.151589
こんな感じになりました。
最初の方は少しみやすくなりました。
後半は微妙ですが・・・
つまりこういうことだな ofs << setprecision(5) << setiosflags(ios::fixed) << setw(10) << loc1 << setw(10) << loc2 << setw(10) << loc3 << endl;
>>539 0.00000 1.00000 0.00000
0.84147 0.54030 1.55741
0.90930 -0.41615 -2.18504
0.14112 -0.98999 -0.14255
-0.75680 -0.65364 1.15782
-0.95892 0.28366 -3.38052
-0.27942 0.96017 -0.29101
0.65699 0.75390 0.87145
0.98936 -0.14550 -6.79971
0.41212 -0.91113 -0.45232
とてもいい感じになりました。
ありがとうございます!
>>534 コピーコンストラクタは省略されるときがあるからなあ。
例外のthrowでもコピーコンストラクタが
呼び出されるかどうかは処理系の自由。
>>531 ,534,541
ありがとうございました
543 :
デフォルトの名無しさん :2011/01/13(木) 18:15:46
丸投げでごめんなさいなんですけど教えてください。 TCHARの文字列をカンマで分割したいです。 分割後の要素はそれぞれ可変長なんですが、 こういう場合はどうやって分割して、 分割後の要素を入れるバッファとかは どう確保するのが普通なんでしょうか?
すなおにstringやwstring使えばいいじゃなーい。 でもTCHAR使ってるとコンパイラおぴっしょんごとに どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。 APIでは正しく変換できるのになんでやねーん。
>>544 >どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。
何を迷うのか不明だし、どこが正しく使えないのか説明きぼぅ。
>>543 vector<TCHAR>にpush_backして文字列を作っていけば?
最後にbasic_string<TCHAR>に変換。
カンマで分割ってのは区切るってことかな C++ならstringにプッシュしていけばいいね Cでもカンマ分大きく取ったバッファ用意して、頭からコピーすればいい
TCHARはcharだったりwchar_tだったり、 wchar_tでもUnicodeだったりUTF-8だったり、 単純にstringには入れられねーだろが。
んなもんtstringでも作ればいいだろ それとutf-8をそのままwchar_tに入れることってあるの?
古いCのコードをC#で書き直す作業をしているのですが、 #define XXX "aaaa" #define YYY XXX "bbbb" ↑こういったdefine文の意味がどうもわかりません この場合コード中のYYYはどういった文字列で解釈されるんでしょうか?
aaabbbに決まってんだろ。
01 #include "DxLib.h" 02 03 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 04 ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 05 if( DxLib_Init() == -1 ) return -1; 06 07 08 int SetGraphMode( 256 , 224 , 16 ) ; // 画面モードの変更 09 10 11 WaitKey() ; 12 DxLib_End() ; 13 return 0 ; 14 } コンパイラー通したら初期化子が大杉って言われます。どこがいけないのかさっぱりわかりません。説明ってこれで足りてます…? Visual Studio 2010, DXライブラリ関数使用, 256×224の画面を出力したい
>>548 それとutf-8をそのままwchar_tに入れることってあるの?
wchar_tはただの整数型なので入れても構わないが、
入れる奴は規格を読まないクレイジー。
>>551 説明たりねーよ。エラーメッセージを正確に書け。
>553 error C2078: 初期化子の数が多すぎます。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 以上です。よろしくです。 初期化って事はreturnですよね?別に問題あるとは思えないんですが(-_-;
>>551 × int SetGraphMode( 256 , 224 , 16 ) ;
○ SetGraphMode( 256 , 224 , 16 ) ;
他はわからん
> int SetGraphMode( 256 , 224 , 16 ) ; // 画面モードの変更
557 :
553 :2011/01/13(木) 21:57:07
コンパイラがエラーが何行目なのか出力してるだろ。 それ見てもわからんのか?
そういえば int i(0); なんてことができたんだなC++は
>555-557 わかった&でけた^w^ みんなありがとう!
>557氏 使い方をあんまり知らんかったのだw新参なもんで申し訳w
561 :
553 :2011/01/13(木) 22:05:14
>>560 ついでにエラーのカーソル位置に赤い下線が出るはず。
マウスでポイントするとエラー内容が表示される。
562 :
543 :2011/01/13(木) 23:10:52
レスありがとうございます。
>>545 >>546 言葉が足りなくてすみません。
カンマ入りの文字列を渡されるので、それを各要素に分割したいんです。
>vector<TCHAR>にpush_backして文字列を作っていけば?
>最後にbasic_string<TCHAR>に変換。
文字列の先頭から見ていってカンマじゃなければpush_backして
カンマが現れたらそこまでの長さ分バッファ確保して各要素に分ける
という意味ですか?
>>562 「C++ split」でググればコードがでてくるよ。
あともうTCHARはやめてWCHARとかwchar_tきめうちでいいんじゃね。
564 :
543 :2011/01/13(木) 23:37:18
>>563 string を使用したsplitの例はググれば沢山コードがあるんですが。。
I/Fを指定されているのでTCHARでないとダメなんです...
もうちょっと探してみます。
C++じゃなくてCのsplitコードを検索してみれ。 そして、string.h内の関数を軒並み_tcsファミリ関数に置き換えればOK。 Cコードなので一般的にバッファは固定長。 C++のstringとか使ったり、wchar_tきめ打ちしたりすると MBCS使われたときに厄介なことになるよ。
もうマルチバイト文字なんて使う機会なくね?
って、565がすでに^^
>>567 いまさらWin9x対応もないだろうしな。
それに、_tcsとか汎用テキストマッピングつかっていても、ワイド文字とマルチバイト文字と
両方で動くように書いてるやつなんてめったにいないだろうし。
ワイド文字決めうちのほうがトラブルが少なそう。
ファイルオープン時のみ、ストリーム単位でロケールを変更したいです。 下のように(A)の行をコメントアウトした状態だと「failed」が出力され、 ファイルオープンに失敗します。 ((A)を有効にして、(B), (C), (D)をコメントアウトした場合は「succeeded」が表示されます) どこを修正したらいいか、ご指摘をお願いします。 環境はWinXP Pro で Visual Studio 2008 Proです。プロジェクトはWin32コンソールアプリケーションで、 ウィザードの設定はデフォルトです。 #include "stdafx.h" #include <iostream> #include <fstream> int _tmain(int argc, _TCHAR* argv[]) { std::ifstream ifs; // std::locale::global(std::locale("japanese")); // (A) std::locale loc = ifs.getloc(); // (B) ifs.imbue(std::locale("japanese")); // (C) ifs.open("あいうえお.txt"); ifs.imbue(loc); // (D) if (!ifs.is_open()) { std::cout << "failed" << std::endl; } else { std::cout << "succeeded " << std::endl; } return 0; }
Visual Studio 2010を使う
>>570 ファイル名とファイルの中身は別もんだ
imbue()はファイルの中身を読み書きするためのlocaleを設定するための関数
結論だけいうと、ワイド文字版のopen()をつかうといいよ
Windowsのファイル名はどのみちUTF-16なんだから
今時Windowsでchar*でファイル名を扱うほうがありえない
ワイド文字なopen()は非標準だけど、
どうせ_tmain()とかstdafx.hとか使ってるんだから気にしないだろ?
裏作業で無限ループしてる副スレッドを停止させるにはどうしたら良いでしょうか
TerminateThread
>>573 ワーカー側でループの度に、終了をリクエストされているかチェックするようにして
主スレッドから止めたいときには終了をお願いする
概念的にはただのフラグでいいけど、スレッドセーフになるように気をつけて
>>576 汎用テキストマップの話だからとうぜん内部で使うコードの話だよ。
567のどこにそんなことが書いてある?
>>578 うえのほうのTCHARがどうしたとか_tcsがどうしたって話を受けて、
マルチバイトがって発言なんだろ?
汎用テキストのことだよ。
>>578 みたいな文章が読めない奴って日本人なんだろうか
>>575 VC6だけかも知れないが、
これだと終わらない場合がある。
m_stop=true とかにしてスレッド内でbreakするようにしても
なかなか死んでくれないのよね。
socket()を含んだやつは綺麗に終わるんだけど。
まだ未熟モノ?という事でよしなに。
>>581 コンパイラの最適化、アトミック性、メモリバリア
といった概念や問題をちゃんと理解したほうがいいな
WindowsならInterlocked~系のAPIを使うといいんじゃないの
終了判定で変数見るだけなら、そのまま見てもいいでしょ。
えっ
586 :
570 :2011/01/15(土) 13:05:05
アドバイスありがとうございました。ワイド文字版のopen()というのを使ってみます。
>>582 シングルプロセッサ以外も想定するなら volatile は意味無いでしょ。
えっ
volatileは最適化を避ける効果「だけ」はあるんじゃないの
592 :
573 :2011/01/15(土) 14:24:02
マルチスレッドプログラミングは色々と面倒ごとが多そうですね・・・ 今回の場合 副スレッドの1ループと主スレッドからのスレッド停止フラグの操作をCRITICAL_SECTIONで排他すれば良いのでしょうか?
なにをするために無限ループさせてるのかによるな
>>592 それでもいいけど、上に出てたようにInterlockedCompareExchange()のような
APIのほうが安価だし、このケースではそれで十分
それと、ワーカーでやってるのがI/O待ちのような仕事なら
スレッド間通信にはEventを使って、ワーカーでI/OとEventを一緒に待つように汁
>>594 こんな便利なAPIあったのか・・・
副スレッドはシリアルポートを通じて外部に接続した機器の定期的な監視とコントロールをしています
volatileはコンパイラがマシン語生成するときに働くキーワードで、 メモリバリアはCPUがマシン語を実行するときに働くもの。 使いどころが違うと思うんだが。 VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。
g_message[i/10] = 42; メモリバリアを呼び出す関数の呼び出し(); // extern関数 g_complete = true; このコードはコンパイラの順序入れ替えを抑制できないから、 メモリバリアすればいいと思ってる奴はアホ。
中で何にアクセスしてるかわからない謎のextern関数を超えて順序を入れ替えたりはしないでしょう そんなことしたらシングルスレッドでも結果が変わってしまいます
>>596 VC6が手元に無いので何ともいえないけど、もしvolatileが無いことで
比較/参照のコードを最適化で消去してしまうのなら、「なかなか」ではなくて
「全く」変わらなくなるのでは?
「なかなか」変わらないのであれば、それはたぶん他のプロセッサから見えない
キャッシュ領域を読み書きしているためで、それこそコード生成時の最適化とは無関係な
実行時のメモリ可視性の問題に見えるけど
俺は 名無し手動リセットのイベント使ってるな WaitForMultipleObjects で複数監視できるので他のイベント待機のついでに 脱出イベントも用意してしまおうという腹
TCHARとか_UNICODEって、みなさん使用されているのでしょうか? Linuxとソースの互換がなくなるのでMSの書き方はできるだけ したくないのですが。 charで動いているものをwcharにするメリットがよくわかりません
他のOSでも動作するソフトを作らないので必要を感じません。
>>601 たとえばUnicodeのファイル名などをサポートしなかったり
Unicodeの文字が入力できなかったり
マルチバイトの2バイト目でなにか問題を引き起こしたりしても
誰も文句を言わないようなプログラムなら、好きにすればいいんじゃないの
ワイド文字かマルチバイト文字かってのとは別問題だけど、 TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが 機能してないしな。
>>596 > VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。
Thanks 調べて見ます。そえいばVCで というかGCCでもvolatileなんて
使った事ないす。 確か実行中に他から変更される可能性あるって意味でしたよね。ちゃう?!
とにかく調べてみます。
>>604 >TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが
>機能してないしな。
詳細kwsk。
>>606 実際にはコスト要らずで安全に切り替えられることを保障できる仕組みではないので、
9x系への対応が不要な状態で、その(無駄な)コストを払いたがる人がいないという
ことを言っているのだと思う
コストってのは、両方で正しく動くプログラムを書き、両方で正しく動くことを
テストするコストね
あの、TCHARやtcharのT(t)はどんな意味でつけたの
609 :
606 :2011/01/16(日) 14:15:22
>>607 char固有の処理を書くのが面倒でやってないってだけじゃないの?
「#ifdefで若干処理を分ける必要があるが、_UNICODEしか考慮しない人が多い」
ってだけ。それは「機能してない」とは言わないと思うけど。
>>606 文字列の編集とか、マルチバイトとワイド文字列の両方で動くように意識してコード書いてる人、
そんなにいないでしょ。
で、両方でコンパイルしてコンパイルが通るかとか、テストまでやってるところなんて
壊滅的でしょ。
世のwindows用のコードは汎用テキストマップを使っていても99.9%は片方でしか動かない
と思う。
>>609 言葉の綾程度の話なら、俺にはどうでもいい話だとしか言えん
>char固有の処理を書く
>#ifdefで若干処理を分ける
これって9x系をサポートしないんなら不要なコストじゃん
MSはとっくにそれを切り捨ててる(OSからも、コンパイラからも)
何のために「わざわざ」それを払うの?
>>608 typedefと言う人もいるが個人的にはTEXTだと思ってる
windows.hで定義されるのは_T()でなくてTEXT()だからtextじゃないの
TCHARやTEXTつかってても Win2000以降しか存在しないAPI使ってます なんてのはよくあること
MBCSで作られたアプリで、画面ではunicodeの文字が打ち込めるけど、 APIを通じて受け取るとSJISになるから文字化けするってあったけど、ああいうのって UTF-8とかで受け取れるとかってできないのかね。 と一瞬思ったけど、どうせ半角1バイト、全角2バイトとか決めうちのコードばっかりで ワイド文字に移行するのと同じくらいの手間がかかるだろうな。
何が言いたいのかry
受け取れるよ。ただ、VC++のLocaleは Japanese_Japan.65001のようなUCS系の文字符号化方式を受け付けないので VC++の標準ライブラリを通過するとSJISやEUC(の符号化文字集合)に含まれない Unicodeの文字がすべて文字化けして落っこちるってだけ。
>>617 Windowsでは非常に多くの場所でMBCSがDBCSだと仮定されていて
そのせいでUTF-8コードページ(CP65001)をきちんとサポートするのは
無理と聞いたことがある
まあMultiByteToWideChar()などでは使えるんだが
コンソールでもchcpで一見CP65001を設定できるが
文字幅が全く考慮されていないので、見た目がガタガタになるし
入力中にバックスペースで1文字削除する時などのカーソルの動きがおかしい
大昔のLinuxレベルだな
これはWindows7でも直ってない
とりあえずwchar_tに日本語以外が入ってると表示すらできないVC++ランタイムはなんとかしてほしい
高々16bitで世界中の文字をすべて表現可能だといきまいていた欧米人に 複雑な日本語の表示なんて不可能に決まってるじゃないか。超漢字使おうぜ。^^
dirみたいな組み込みのコマンドは流石にUnicodeの文字でも表示するから 出力がコンソールのときはWriteConsoleW()を使ってるんだろうな もっともdirもリダイレクトするとCP932のテキストになるが
それは type でしょう time_t とか div_t とか text と関係ないのにも使われてるし
wchar_tはcharと等しいかそれより大きな整数としか規定されていないので UCS-4とかになると1文字を収めるにはサイズが足らんてぃーの。 そこでC++0xではchar16_tとかchar32_tとか。 でも、じゃあ1文字1変数が実現するかって言うと UTF-16とか使う限り不可能なんだよね。
wchar_tは最大拡張文字集合(largest extended character set)の1メンバを入れられることが保障されている char16_tとかchar32_tが導入されたのはint32_tのようにどの環境でも共通の文字コードを前提としたコードを実現するため 1バイト固定のcharに収まらないためにwchar_tが用意されたのとは違う つまりUnicodeの合成文字みたいな複数メンバによって一文字を表す文字集合じゃないものを 最大拡張文字集合として扱える環境でwchar_tを使えば解決
628 :
VCSE :2011/01/17(月) 00:08:28
環境は borand C++でクラフチック法のプログラムと自動微分(ボトムアップ)のプログラム 作成したいのですが、分からないので教えてください
>>628 何がわからないか分からないので教えてください
630 :
VCSE :2011/01/17(月) 00:30:27
どのようにして式などをプログラムで書いていけばよいか
if文中で構造体を初期化するとif文から抜けた瞬間消えてしまうのですが何か書き方があるのでしょうか? if(s=110){
if(s==110){ の続きはぁ~? ちなみにif文の中で構造体定義してるのであれば 当然if文抜けたら消える。 if文だろうがfor文だろうが{から}の中でint i;定義したら {から}から抜けたらiは消えるよ。
初期化と代入は違うからね。
#include <stdio.h> int main(void){ int num=1; {int num=2;} printf("%d\n", num); return 0; } これの結果は 1 と表示される。 実際に動かしてみそ。
#include <stdio.h>
int main(void){
int num=1;
{num=2;}
printf("%d\n", num);
return 0;
}
これの結果は 2 と表示される。
>>633 の言うように初期化と代入は違うのだ。
分かったかね、
>>631 。
>>630 式はこうプログラムする
int a = 1 + 1;
そのまま書けばいいと思うがw
VC++ 2008 (Pro)で、VC++6で作ってあり、WinSDK 2003(?)ベースのプログラム、 ぶちゃけフリーソフトなんだけども、それをWin7_x64で動くようにしたい。 まず、Visual Studio 2008 Pro で、x64のコードを履かせるやり方は分かったものの、 コード自体がCだがMFCを使うためにC++風にしたコードらしく、C/C++の文法を 【これから】覚えようとはしているが、どうにも難しい。 一体どこから手をつければいいか分からない。 俺の周りにプログラムできるやつがいない。 笑い話だが、俺が一番詳しい。 どこから手をつければいいか教えてくれ。
履かせる、は、吐かせるでいいのかな・・?
まずVC2008でビルド出来るようにする事だな。 その前で色々考えても禿げるぞ。
つか C の文法の範囲で MFC(C++) を呼び出すことできるん?
Dekin.
道程は遠いな。(高い確率で)挫折しそうだ。 作者様が忙しいというので、俺がやろうと思ったのだよ。 昔さ、C++のコードをJAVAのコードに変えて、 卒業した先輩がいたようだから、俺もどうにかできないかな~って思ってね。 ところで、MFCを使うソフトをC#とか、勉強しやすいと言われる言語(思い込みだが)、に コードを書き換えて、変換することってできんのかな。今の俺には無理だがな。 で、どんなソフトかというと、キーバインドに関係するプログラム。 もう分かったか?まあ、書かずに話を進めてくれるとありがたい。
はい
しょうが無いから自力で情報集めている。 VC++6からVC++2008に移植するとか、そんなサイトをあちこちから集めている。 しかし、「やさしいC」しか読んだことない俺にできるだろうか・・・
悩めもがけ それが血肉となる。
VC++のwcsファミリ関数(wcslenなど)は サロゲートペアや合成文字を2文字とカウントしちゃうんだけど コードページをcp932にしたら Shift_JIS-2004になってちゃんと1文字とカウントするようになるかしら? どうなの?
ユニコードのほうがコードポイント数というか規模がはるかに大きいので シフトJISではそもそもユニコードを表現できない
>>627 unicodeの合成文字は最大十数バイトらしいんで、めちゃでかくなるな > wchar_t
>>648 XPはともかく、JIS X 213に正式対応したVistaや7は
Shift_JISも2004対応になってるんじゃないのん?
Unicodeの全文字は到底無理だけど
サロゲートペアや合成文字で表現される日本の文字は
2バイトで表現可能になったんでないのかな?
ヘッダにusingを書くのは良くないらしいですが関数の引数にstd::stringとか書くのもめんどくさいです どうしたらいいですか
typedef std::string s;
Shift_JIS-2004なんて、この世のどこで使われてるんだよ
654 :
x86_2_x64 :2011/01/20(木) 17:12:36
「やさしいC++」をクラスの前まで読む予定。 これ、あと1回回したら、何をすればいい? 「一目で分かる Visual C++ 2008 アプリケーション開発入門」でいいかな?
まず何をやりたいかだ
セックスです。脱童貞を目指しています。ご教示お願いします。
トルコ風呂逝け
古いんだよ。じじぃ。ソプと言いなさい。 親日のトルコに対して失礼だろ。
じゃあ、トルコ石のことはなんと呼べば…
まづ見苦しくない服を買いに行きます。
662 :
デフォルトの名無しさん :2011/01/21(金) 12:55:19
visualc++2010でプログラム書いてます。 wcsncpy関数を使うとTEXTマクロ?で囲っても キャストがうまくいかないみたいなエラーが出るんですがどうすれば出なくなりですか? 環境をマルチバイト文字セットを使用する、にするのはなしな方向でお願いします。
そのエラーが出るってことはマルチバイト文字セットを使用する、になってる気がしないでもない
TEXT(variable)とか書いてそうな気がする
TEXT()とかは_tcs系と使うもので、wcsなら使う必要ないわな。
Effective C++で書かれているNon-Virtual Interface(NVI)を採用しようと思うのですが、 いい名前が思いつきません。例えば void addAnimation (Animation* anim); という非バーチャル関数があった場合、 virtual void addAnimationImpl (Animation* anim); というバーチャル関数が考えられますが正直今ひとつ。 なにかいい名前ないですか?
NULLではなく本当に何も代入しない代入ってできますか。 ×:p[0] = NULL; ○:p[0] = ; コンパイルエラーが出ます。
p[0] = p[0];
>>668 できない。
どういう経緯でそういうことをやろうと思ったのか説明できれば代わりの案がでてくるかもしれない。
通常のNULLとは異なる「第2のNULL」が欲しいとかか?
// p[0] = 0; 何もしない代入
673 :
668 :2011/01/22(土) 17:07:57
やりたいことはpinterがNULLも可で、 if (color) pointer[n++] = pointer ? color : 代入を無かったことに; pointerがNULLでない時だけ代入したいのですが、これが難しい。
NULLが不正なのか代入出来る場合に入っている値が不正なのか
if (color && pointer) pointer[n++] = color;
if (color) if (pointer) pointer[n++] = color;
>>676 どう見てもそれで終了だよな
つまりなんでそんなことがしたいかの説明になっていないということだ
馬鹿正直に書くと if (color && pointer) pointer[n] = color; if (color) n++ と4行ですが、X10ぐらいあって、何とか1,2行で書けないものかと。 む、難しい
行数だけの問題なら、マクロでもテンプレートでもつかえばいい。 がしかしだ、本当の理由は無知だったのを認めたくないだけだろwwwww
682 :
668 :2011/01/22(土) 17:27:26
頑張って2行で書くと、 if (color) pointer ? pointer[n++] = color : (poiner*)n++; か、 if (color && ++n && pointer) poiner[n-1] = color; が考えられますが、お世辞にも見やすいとは言いがたい。
>>682 n++が(pointer*)でキャストされてたり、++nが条件に入ってたり、どういう意味なんだ。
なるほど意味は分かった
が、
>>681 に同意
マクロかテンプレート使うなら、別に特にトリッキーな問題じゃないだろ
685 :
682 :2011/01/22(土) 17:34:53
>>683 三項演算子(A?B:C)のBとCは型が一致してないとコンパイルエラーになるから。
colorがNULLでなければn++
687 :
668 :2011/01/22(土) 17:36:27
>>681 ,
>>684 原則マクロは禁止。テンプレートも禁止。
この問題のためだけに制限を緩めるのはもったいない。
どうしてもいいアイディアが思いつかない。
688 :
682 :2011/01/22(土) 17:37:11
おまえら遊ぶのもたいがいにしろ。
>>673 (
>>687 )
if (color) { if (pointer) { pointer[n] = color; } ++n; }
同じようなコードが繰り返されるからすっきりさせたいってことらしいけど 関数やらマクロやら使わない条件なら、そのコードを多少いじって工夫しても大差ないだろ。
>>685 型を一致させる? color の型は pointer* なのか? pointer は型名なのか?おまえはバカなのか?
>>668 これ以上あがいても、恥が上乗りするだけ。
693 :
682 :2011/01/22(土) 17:47:40
>>689 長い。却下。
これまでをまとめるとこれが一番良いように思う。
if (color)
pointer ? pointer[n] = color, n++ : n++;
完璧?
689でFAだな
695 :
682 :2011/01/22(土) 17:51:23
(自分で決めた)コーディングスタンダード的に、
マクロ×、テンプレート×、一行に沢山書く×、同じような処理を繰り返す×
やっぱり
>>693 が一番美しいと思う。
>>687 緩めるのがもったいないっていうが、その禁止事項のどこにメリットがあるの?
>>693 そんなウンココードにする理由が 56 文字から 51 文字に短縮するためなの?
頭おかしい。
698 :
682 :2011/01/22(土) 17:54:08
>>696 プログラマーの見るソースと、コンパイルされるソースが異なるのが最大の問題。
あれはゆるせない。
668の時点で頭おかしいとみんな思ってる
>>698 なんてことだ!それじゃ #include も使えないな!
701 :
682 :2011/01/22(土) 17:56:46
これうんこコードですか? if (color) pointer ? pointer[n] = color, n++ : n++; 意図が明確で、上から下に、左から右に読めば理解できて、なおかつ見やすい。 これでいいよね?
>>701 n++ がダブっている。
理解するのにマイナーな演算子の優先順位やシーケンスポイントのルールを
調べるなり思い出すなりする必要がある。
>>701 color の判定と pointer の判定とで不統一になっている。
n++++++;
>>701 条件演算子使わないでifのほうが明確なんじゃないの?
同じコードがx10続くらしいけど、たぶんちょっといじればループでまわせるような処理なんだろうな。
>>701 条件演算子って代入の際の右辺値に使うものだって思ってた
はっきり言って気持ち悪い
if文を一行で書いた方がマシ
709 :
682 :2011/01/22(土) 18:54:07
>>701 評判悪いなぁ
でもこれで行きます。私のコードなので自分がいいと思えばそれが一番。
じゃ聞くなよアホか
コミュニケーションがとりたかったんだろ。 「こんなコード書いたけどどうっすか?」みたいな。 ググればすぐ分かるのに質問してくる初心者とか、 結論がでてるのにとぼけて質問してるようなやつとか、寂しいからだろ。
pointer[n] = color, n++ が鼻から悪魔な件
>>712 んなこたーない。カンマ演算子の左と右の間にはシーケンスポイントがある。
盛り上がるネタはいいね。 まぁ見やすくてわかり易いのいいかと。 コンパイラは賢いからそんなに差は出ないでしょ。
>>711 PGは孤独を楽しめない奴には向いてないよね
>>712 pointer[n++] = color
意図はわかるだろ?
意図おかし
意図が分からないというのは、インクリメント演算子の挙動が分からない人からみたらってこと?
ところで
>>689 と
>>693 の長さが大差無いように見えるのは俺だけ?
if (color) { if (pointer) { pointer[n] = color; } ++n; }
if (color) pointer ? pointer[n] = color, n++ : n++;
>>695 >マクロ×、テンプレート×
って
>同じような処理を繰り返す×
とどう両立させんのw
お前知識ないだけだろ
コーディングスタンダードとか笑わせるw
言い訳でしかないわ
>>701 のうんこコードをもっと運子にすると
if (color) pointer ? pointer[n++] = color : n++;
これより
>>689 の方が1万倍マシ。
> 代入を無かったことに if (color) pointer ? pointer[n] : color = color, n++;
質問者が無知であったのを認めないで、あがいている図式w
C++が出来るって言えるには、MFCぐらい使えないとダメですかね? 私、Cは一応やってましたが、この度C++を勉強することにしました クラスを作るレベルから始めてますが、どうなることやら
MFCはともかくSTLが使えて自分でもテンプレート書けないとな
簡単 なクラステンプレトと関数テンプレトぐらいは書けるけどなぁw STLは便利よね。 MFCはダイアログベースのアプリでデータ変換プログラムぐらいは書けます。 でもやっぱ g++ linux が単純で楽しいかと。
二段階検索と引数依存検索を理解できたら 「テンプレートを理解した」と称してもよいんじゃないでしょうか。
>>728 MFC は出来なくても問題ない
Win32API は知ってた方が良いが C++ とは関係ない
Qt4 とか wxWidgets とかが使えると楽しい
STL とかテンプレートは使えた方が便利だが使わなくても済む場合も多い
テンプレなんてただのマクロだろ
なるほど~STLとテンプレートか Win32APIは聞いたことあるけど、いろいろ勉強してみる ㌧
>>733 俺も最初C++勉強したときはそう思ったな・・・・・・・
便利なマクロくらいの認識でも問題ないな
STLはよく出来てるのではありません。 恐ろしく良く出来てるのであります。 C++は最高傑作の言語です。 さて誰の言葉でしょう。
おちんちんボーイ
オリジナルテンプレート多数多重に駆使するプログラムはクソだ。 個人の中だけでやり、外で出てくるな。
そうだね。 人に使われてるうちはクソなコードを避けて通ることができないから クソなコードを書く人間を解雇できる立場にはやくなれるといいね。
わらた、深読みしすぎw
浅いテンプレートでコンパイルエラー出た場合、おおよそ見当がつくけど ディープな奴だとちんぷんかんぷんになる
おいおい、男女雇用機会均等法に基づき、 「チンぷんかんぷん」だけではなく「マンぷんかんぷん」も 平等に使っていけよ? 人として。
マンプイ
得意げになってテンプレート振りかざすアホは死ねばいいと思う。 読みにくくてしょうがない。テンプレートは使用禁止が正しい。
>>747 テンプレート使ったら即座に全部読みにくくなるわけじゃないだろう。
個別にコードを改善することはできんのか?
テンプレートですら理解できないアホはC++から手を引いたほうがいいと思う。
むしろお前が理解できてないアホの可能性があるのに 「使用禁止が正しい(キリッ」 とか恥ずかしくないの? なんか勝手に縛りプレイしてるレスたまに見るけど、適材適所って言葉知らないのかね。 柔軟に行こうぜ。
vectorに値を入れたいんだけど、vector.at()は、このような使いかたで良い? std::vector<int> vec = std::vector<int>(length); for (int i = 0; i < length; i++) vec.at(i) = なんらかの処理の戻り値(int型);
>>751 おk
0~lengthのループなら範囲チェックも不要だから
vec[i] =でもいい
>>752 ありがとう。
std::unique_ptr<std::vector<int>> とすると、[]演算子使うのが躊躇っゃうんだ。
たしかvectorは、連続性が保証されてたから、上手く動くかもしれないけど
オーバーランしちゃうんじゃないかとか考えちゃって…。
なにか勘違いしてる気配を感じるが上手く説明できない
>>754 んー… 上手く表現できないけど。
std::unique_ptr<std::vector<int>> vec(new std::vector<int>(length));
この場合、(*vec)[i] と書くと混乱しない? 俺だけ?
unique_ptrどうこうじゃなくて 連続性の保証を気にしてる辺りが データへのポインタに[]使ってるわけじゃないんだから・・・・・・
>>750 いやテンプレートを使わないと書けないプログラムは存在しない。
現状ではデメリット方が多いのでテンプレートは一律禁止にしたほうがいい。
あれは技術屋のオナニー。STLだけは許す。
1と0で書けないプログラムは存在しない。
こういうやつが EC++ みたいなクソを生み出したりしたんだろうな。
>>757 >>750 は適材適所って言っているよね
テンプレートを使わないとプログラムは書けないなんて
一言も言っていないよね
それとデメリット多いから禁止とか、包丁危ないから
禁止って言ってるのとレベル変わらないよ?
そもそもオナニーって気持ちいいよね、何で否定的なの?
敬虔なカトリックなの?
柔軟が重要。 自分でもこの書き方嫌いだけど 今回はこうした方が保守性がいいからこうする、って ことあるし。 みんなも柔軟にね~
イテレラつかって begin と end の間で やったほうが作法かと。 どでしょ。
C/C++とは直接関係ないんだけど、どこで聞けばいいのか分からんからここで聞かせてくれ Linuxのtimeコマンドみたいにプログラムの実行時間を測定するWindows 7 64bit用のツールってある? 今までWindows Server 2003 Resource Kit Tools付属のtimeitを使ってたんだけど環境移行して使えなくなってしまった
union { int pair[2]; struct { int x; int y; } point; } この場合、 pair[0]==point.x と pair[1]==point.y は保証されますか?
されない
>>765 わからない 教えてくれ。
パディングの問題もないと思うが。
わからないならレスしないでください。
union のメモリレイアウトが正確に重なることが保証されるのは、 「先頭のメンバの型が同じであるPODな構造体」をメンバに持ち、 かつそれらの構造体の先頭メンバを参照するときだけ。 それ以外は処理系依存。 これはC89の規格だが、C++でもおそらく変わらないはず。 自分の開発環境でどうなのか知りたければコンパイラのドキュメント嫁。
union以前に、struct { int x; int y; } point;でのyの位置が実装依存だよね int並べた構造体とint配列で位置がずれる実装は現実にはなさそうな気はするけど
g++使いとしては、テストしておkだったらそのまま使う。 それがだめならウニなんて使う理由がない。 エンディアンの処理に使うぐらいかな。
そんな規格違反な使い方をしていると コンパイラのバージョンが上がった途端に コードが使い物にならなくなったりするじゃないか…。 マイクロソフト製品とかとくにそう。
>>771 unionにはvariantや関数型のdiscriminated union(代数データ型)みたいな
用途もあるだろう
っていうかもともとそれが本来の用途だと思うのだが
gccだと-O2で暗黙に指定されるstrict aliasingが有効になってると 強引なキャストでのtype punningで不正なコードが生成されるので そのワークアラウンドとしてunion使ってる人も多いかも まあ規格違反といえば違反だけど、Cでそういうお上品なことばかり 言ってても仕方が無い
俺なら規格で保証されてなくても使うけどな。 俺の環境で動けばそれでいい。
なら言わいでええやん
VC++ 2008を使っているのですが、ifstreamってclose()を呼び出しただけでは、 エラービットはクリアされないんんでしょうか? 下のソースコードだと、b.txtとc.txtの中身を表示できないので、 とりあえずclear()呼び出してます。それとも、やっぱり何か使い方を間違っていますか? どなたかご教示お願いします。 #include <iostream> #include <fstream> #include <string> int main(void) { std::string fileName[3] = { "a.txt", "b.txt", "c.txt"}; std::ifstream ifs; std::string buf; for(int i=0; i<3; i++){ ifs.open(fileName[i].c_str()); if(!ifs.is_open()){ std::cerr << "Err:" << fileName[i].c_str() << std::endl; return (-1); } while(std::getline(ifs, buf)){ std::cout << buf << std::endl; } ifs.close(); // ifs.clear(); } return (0); }
C#から転向なんだけど難しいなあ・・・ コピーコンストラクタとかなんのために必要なんですか?
>>781 単なるコピー以上のことをするため
GCがないからコンテナやスマートポインタをベタにコピーするとまずい
>>780 エラービットの細かい仕様は知らなくても、 ifs をループの中に入れてやれば自然だし十分でしょ。
そうすれば open() じゃなくてコンストラクタも使えるし。
>>783 そんなことは些細なこと
ポインタの二重解放とかもっとやばいのが潜んでる
内側でnewするクラスはたいてい private: Hoge(const Hoge&); void operator=(const Hoge&); で事足りる
開放したポインタにNULLを入れて何回でもdeleteしてやる
スマートポインタは何の本を読んだら分かりますか
使えれば分からなくていいです
まずはwikipediaで十分だと思う
譲渡に頼るのは好き好きだな。 ちゃんとコピコンで管理する方が好きだな。 そんなに難しくないでしょ。ちゃう?
ポマードポインタ 口が裂けても大丈夫
STLって何ですか? ISO/IEC 14882をぜんぶ読んだのですが、載ってませんでした。
ISO/IEC14882で定義されてるテンプレートライブラリをSTLと呼ぶことが多い
Superior Temlate Libraryの略。
凄いテンプレートライブラリと覚えとけば問題ない。
ステキなテンプレートライブラリ
802 :
デフォルトの名無しさん :2011/02/06(日) 11:19:59
こんにちは。この度プログラムでHTML上のsubmitボタンを押す方法がわからなくて質問をさせて頂きます。 MSHTMLを使い、html上のinputの<type = "submi">ボタンを押したいのですがうまくいきません。 inputの<type = "image">や<type = "text">なら以下のようにしてクリックできるのですが、なぜsubmitボタンはうまくいかないのでしょうか? よろしくお願いいたします。 環境 visual C++ 2008 Express Edition SHDocVw::IWebBrowser2Pt m_pIE.CreateInstance(L"InternetExplorer.Application"); //希望のページに飛ぶ(中略) MSHTML::IHTMLDocument3Ptr pDocument( m_pIE->Document ); MSHTML::IHTMLElementCollectionPtr pCollection = pDocument->getElementsByTagName(_bstr_t(L"input")); for (long i = 0; i < pCollection->length; ++i) { MSHTML::IHTMLInputElementPtr pInput(pCollection->item(_variant_t(i))); if (!_wcsicmp(pInput->type, "submit" ) && pInput->value == _bstr_t( "要素の名前" ) ) { MSHTML::IHTMLFormElementPtr pForm(pInput->form); //!クリックする if (pForm){ pForm->submit(); } } }
UIAutomation使えばいいよ 押せたの確認できたし
IHTMLDocument::createEventObject IHTMLEventObj::fireEvent じゃだめ? submitで実験したことはないんだがたいていのものはこれでなんとかなった
int* x = new int() でメモリを確保した場合 変数名じゃなくてポインタに名前がついてるみたいで何やら気持ち悪いんだが これはそういうものとして割り切るものなの?
p_xとしたりする
女湯を覗き見したらおばちゃんの裸だったp_x
ポインタ変数も変数だから、xは変数名だ
809 :
デフォルトの名無しさん :2011/02/06(日) 21:27:12
>>803 >>804 この言葉で以下を試してみたらうまくいきました。
MSHTML::IHTMLElementPtr pElement(pInput);
//!クリックする
if(pElement){
pElement->click();
}
UIAutomationも調べてみましたが、かなり汎用性のあるものですね。
考えていただき有難うございます。
>>805 int *x = new int[hoge];
>>810 でnewの配列初期化(全て0とか、全て1とか)も同時にするにはどうするの
int *x = new int(1)[hoge]; じゃダメだった
>>811 int* x = new int[hge]();
calloc
int* x = new int[hge]:{ 1... };
>>817 いつのバージョン見てるの?
これは 2003 のやつから引用。 5.3.4 New p15 より。
> If the new-initializer is of the form (), the item is value-initialized (8.5);
古い奴だとこれが無いのかと思って探してみたけど。
C++98 でも同じく 5.3.4 New p15 にちゃんと書いてある。
http://www.kuzbass.ru:8086/docs/isocpp/expr.html > If the new-initializer is of the form (), default-initialization shall be performed (dcl.init);
int* x = new int[hge](100); なら、配列は全て100でされるの?
>>819 だめ。配列 new ではデフォルト初期化しかできない。
素直に std::vector 使っとけ。
>>822 ? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
これが目に入らなかったと見えるな
>>823 その中の2つのケースのどちらにも、 POD である int の配列は該当しないな。関係ない。
1 direct-new-declarator: [ expression ] direct-new-declarator [ constant-expression ] じゃこれか 配列newにはnew-initializeroptは使えない
>>825 direct-new-declarator の後ろに new-initializer が来るんだよ。問題ない。
以下、 C++ 2003 5.3.4 New p1 より。(下付き opt は ,opt に置換してある。)
new-expression:
::,opt new new-placement,opt new-type-id new-initializer,opt
::,opt new new-placement,opt ( type-id ) new-initializer,opt
new-placement:
( expression-list )
new-type-id:
type-specifier-seq new-declarator,opt
new-declarator:
ptr-operator new-declarator,opt
direct-new-declarator
direct-new-declarator:
[ expression ]
direct-new-declarator [ constant-expression ]
new-initializer:
( expression-list,opt )
>>826 あんたもしつこいねえ。gccに-ansiを付けてコンパイルしてごらんよ
..\Array_new1.cpp:14:26: error: ISO C++ forbids initialization in array new
って出るから
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
int* p = new int[100](1);
std::copy(p, p + 100, std::ostream_operator<int>(std::cout, " "));
std::cout << std::endl;
}
おっと ×ostream_operator ○ostream_iterator
>>827 値の指定はできないって、
>>820 でも書いてるだろ。
g++ を信じるというなら↓をコンパイルしてみるといい。
int main() { new int[100](); }
当然↓はエラーになる。
int main() { new int[100](1); }
>>829 なんだ、空の()に限っていたのか
それは付けても付けなくても同じだろ元々
()の中に何か入れるとエラーになるという事を俺は言いたかったのさ
4064168 4064168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 本当だおかしな値が入るな
sprintfなのですが #define ROMC const far rom char 略 sprintf(gLcdBuf, (ROMC *)"CN%-2dCN%-2dCN%-2dCN%-2d", 1, 2, 3, 4); この場合、(ROMC *)はどのような意味があるのでしょうか?
>>833 文字列リテラルを指す char* (あるいは char const* )型の値を const far rom char* 型にキャスト。
far とか rom とかが何を指すのかはコンパイラか開発環境のドキュメントを嫁。
far ポインタってMSC6の時にあったと思うが rom なんてあったのか。
>>835 ggってみると PIC のコンパイラ(MPLAB-C) にあるようで。
でも PIC に far/near があるとは思えない。
>>833 はどこぞのコピペらしいし、変わった type qualifier をよせ集めてみただけじゃないかなあ。
>>838 こちらこそ、スレ2つに書き込むのはルール違反でした。
vc++10の警告についてですが warning LNK4042: オブジェクトの指定が重複しています。余分なものは無視されます。 とのことですが オブジェクトの指定とは何でしょうか
クラスのコンストラクタやメンバ関数の定義を、 クラスの内に書くとコンパイラにインライン化を要求する。 クラスの外に書くとインライン化されない。となるようですが… ごく短い処理をわざわざクラス外にinline指定して書いてあるコードを見かけました。 かと思えば、同じコード内の非常に似通った機能の別のクラスでは内に書いてあり、混乱しています。 クラス内に書く方法と、クラス外にinline関数として書く方法では厳密な違いがあるのでしょうか?
>>841 ありがとう
でもそういうことじゃないんです
そしてPC再起動で直ったってどういうこと
>>842 二つに違いはないと思います。
私についていえば、そもそも、クラスの定義の中でメソッドを書こうが、inline をつけてみようが、必ずしもインライン化されるとは限らないですから、
私は、クラスの内、外でわざわざ意味づけをしようとも思っていないのです。複数のモジュールに分けるときには、インラインコードはヘッダに書くように気をつけてはいますが。
845 :
842 :2011/02/13(日) 17:42:04
>>844 ありがとうございます。
おかげですっきりしました。
メソッド内で別クラステンプレートの実体化がおこるとき、 外部定義したときとインライン定義したときで、 微妙に実体化のタイミングが違ったりして VCではだいじょうぶなのにgccではエラーになったりする
メソッド…ねぇ。まぁいいけど。 実装スキームの違いはあれど 検索ルールやPOIは厳格に決められているのだから 一方でエラーになるなんていうのはどっちかがクソ実装ってだけ
>>848 失礼しました。「メンバ関数」といいなおします。
最近学校の授業でC++を学んでいて、参照・ポインタのあたりを勉強しています。 &記号についての質問なのですが、 int& a と int &a は異なるのでしょうか? 前者が参照を表すということは理解できます。 与えられたサンプルプログラムで、 メンバ関数の宣言では、引数にint& aと書いてあり、 メンバ関数の定義では仮引数にint &aと書かれています。 違いがいまいち理解できません。どなたかご教授お願いします。
どっちも一緒 見た目が違うだけ
852 :
850 :2011/02/13(日) 23:51:26
>>851 そうなんですか。どうもありがとうございます。
参照を宣言するときは型宣言の直後に&を置く、と習っていました。
一緒ならどうしてこういう教え方をするんでしょうね・・・。
>>852 C では int *a, C++ では int* a; と書くのが昔からのお作法でした。(C には参照渡しはありませんが。)
>1
int* a,b; って書くと間違うからね。
>>855 C++のハゲ親父は罪作り
int& a,b;
とかどうすんだよって感じ
>>852 >一緒ならどうしてこういう教え方をするんでしょうね・・・。
素人を混乱に陥れてプログラマの仕事を確保するためらしいよ
益々判らなくなりました><
小規模なプログラムなのでwin32apiをmfcなどを使わず直で記述してるのですが メッセージハンドルのswitch部分がどうしても汚くなってしまいます 上手く記述する方法はないでしょうか?
>>859 各Handler関数のhash(キーはメッセージID等)を作ってテーブルジャンプにすれば良い
VC++ には int32_t は無いのでしょうか? 無いとしたら代わりのものは何でしょうか?
>>860 マクロつかってメッセージごとに処理を関数へ渡してるかんじですかね・・・
>>861 ハッシュテーブルを使ったことがないのでまともな実装が出来るか不安ですが
(HWND,LPARAM)を引数に持つ関数のポインタの配列、を要素に持つ配列
にハッシュ関数をつかって配列に処理を割り振って行けばいいのでしょうか?
STLが使えれば楽なのでしょうが自分の環境だとhash_mapが使えないみたいです・・・
>>859 ハッシュを使わなくてもメッセージIDと関数ポインタのテーブルを作ればいいんじゃね?
例えばこんな感じ。
--
typedef enum {MessageFoo, MessageBar} MessageID;
typedef void MessageFunc(MessageID id);
static void funcFoo(MessageID id)
{
}
static void funcBar(MessageID id)
{
}
struct {
MessageID id;
MessageFunc * func;
} MessageTable[] = {
{MessageFoo, funcFoo},
{MessageBar, funcBar},
};
void funcCaller(MessageID id)
{
for (int ic = 0; ic < sizeof(MessageTable) / sizeof(* MessageTable); ++ic) {
if (id == MessageTable[ic].id) MessageTable[ic].func(id);
}
}
--
勿論、メッセージIDの型や数値、引き数なんかは調整してね
線形検索ですね
STLつかえるなら typedef void Func(HWND,LPARAM); std::map<UINT,*Func> をラップするclassつくればいいんじゃない?というのは浅はか?
#if _MSC_VER < 1600 // 1200 VC6.0 // 1300 VC7.0 VC2003 // 1310 VC7.1 VC2003 // 1400 VC8.0 VC2005 // 1500 VC9.0 VC2008 // 1600 VC10.0 VC2010 typedef unsigned int uint32_t; #endif こうですか?
インデントやら処理メッセージの一覧性だけならgoto使ったり #define CASEGOTO(a) case a:goto LABEL_##a;break; callback(MSG m){ switch(m){ CASEGOTO(WM_PAINT) CASEGOTO(WM_XX) default: value=DefWndPorc(); } LABEL_QUIT: return value; LABEL_WM_PAINT: ....;goto LABEL_QUIT; LABEL_WM_XX: ....;goto LABEL_QUIT; }
windowsSDKで もともとMainWndProc()とそのメッセージを処理するOn~()が有って ダイアログを追加するときにAddDlgProc()のメッセージを処理するOn~()と関数名が被ってしまう場合 ・関数名を工夫する ・namespaceを利用する ・ソースファイルの分割 どの対応が無難でしょうか?
関数名を工夫する
ソースファイルの分割
電卓作成が難しいでござる 32桁の電卓って・・
gmpでおk
BCGライブラリを自分で実装汁のが面倒って意味では
RDBMS に丸投げでオケ
どのDBだとその桁いけるの
MySQLってそんなところに特長があったなんて
そんな機能があったとはな
mysql> delimiter // mysql> select 65536 * 65536 * 65536 * 65535// | 65536 * 65536 * 65536 * 65535 | +-------------------------------+ | -281474976710656 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select 65536 * 65536 * 65536 * 65536// | 65536 * 65536 * 65536 * 65536 | +-------------------------------+ | 0 | +-------------------------------+ 1 row in set (0.00 sec) mysql> create procedure testproc() begin declare d decimal(64, 0) default 0; declare m decimal(64, 0) default 0; set d = 65536 * 65536; set m = 65536 * 65536; set d = d * m; select d; end// Query OK, 0 rows affected (0.00 sec) mysql> call testproc()// | d | +----------------------+ | 18446744073709551616 | +----------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> drop procedure testproc// Query OK, 0 rows affected (0.00 sec)
手軽じゃないRDBMSだと何が使えるんだろ。
>>878 見ると全部いけそうに見えるけど。
多倍長演算ってそんなに難しくないだろ。 電卓で使うようなのなら、遅くても平気だろうし。
>>863 どう言うふうにしたいのか分らんけど、ちびっとでも見やすくしたいなら
MS提供のメッセージクラッカー
hash_mapがなくてもmapでいいんじゃないのと思ったんだが
ハッシュなんて必要か? ただの関数ポインタ配列が有れば良いと思うんだけど
探索に線形時間かかっちゃうだろ^^ 効率は大事だよー。
効率が重視で且つswitchブロックにベタ書きが嫌ならgoto一択だべw
お前は何を言っているんだ
Hashにすると線形探索より速くなるし なによりテーブルジャンプになるので CPUパイプラインにも有効なんだな
う 難しくてわからん
>>894 俺もだ
自分凄いんだぜって自慢していることは分った
速い遅いと言ったって、巨大なテーブルでもなければ誤差だよ
>>890 いや線形探索なんかしない、単に大きい配列を用意するだけ
ウィンドウメッセージなんてそんなに離散してるわけじゃないからメッセージIDから規定値を減じたものを配列インデックスにすれば良い
処理しないメッセージID用に何もしないハンドラを用意するか関数ポインタをNULLにしておいて条件分岐するだけで良い
まぁメッセージIDから規定値を減ずるってのもハッシュの一種かも知れんけどね
0~0x3fff システム用 0x4000(WM_USER)~0x7fff コントロールのウィンドウクラス用 0x8000(WM_APP)~0xBFFF アプリ用 0xC000~0xFFFF RegisterWindowMessage用 だっけか まあ実際には自分で処理するハンドラの分だけでいいから こんなに要らないわな
その配列の型が固定できないからこそのメッセージクラッカーなんじゃないのか
線形時間が……とかいったいいくつのメッセージを処理するつもりなんだよ
>>899 型は普通のWindowProcでしょ?
LRESULT (*msg_table[0x10000])(HWND,UINT,WPARAM,LPARAM);
とかの関数ポインタのテーブルを用意して
if(msg_table[msg])return msg_table[msg](wnd,msg,wp,lp);
で呼び出すだけじゃない?
俺は赤黒木やハッシュで十分だと思うからわざわざやらないけどw
>>901 windowsx.hやMFC/WTLのメッセージクラッカーは、ハンドラの引数がメッセージによって
違うでしょ、そのことを言ってるんじゃないの
まあ、全部一緒のほうがある意味分かりやすいし、実装も単純になるが
>>899 >その配列の型が固定できない
色々型を入れられる配列コンテナを実現するのがプログラマ
誰かが作った便利なのを利用する(メッセージクラッカーとか)だけのがドカタ
>>900 基本的に全部のメッセージ処理できるようじゃないとな
これやあれは処理できませんじゃ><
>>903 色々なものを入れるだけなら困らんだろ、所詮ただのポインタだし
呼ぶときに困るんでしょ?
引数の個数や型がまちまちなんだから
>>902 hoge msg_xxx_sub(x,y,z){
}
LRESULT msg_xxx(wnd,msg,wp,lp){
msg_xxx_sub(...);
}
msg_table[xxx] = msg_xxx;
とかにするだけじゃないの?
で、これを扱いやすいよう整えていくと
既存のフレームワークの車輪になるから
わざわざ自作する必要ないのだが。
>>904 >引数の個数や型がまちまちなんだから
それを呼ぶときに困るないようにするのがプログラマ
自分のやりたいことを実現するのがプログラマ
あーだこーだと言って実現できないっていうのがドカタ
俺、ドカタだからドカタtraitsはよく分る
>>905 それはmsg_xxx -> msg_xxx_dubを「自分で」書かせる時点で
既存のメッセージクラッカーより劣る
で、それを整えたものがメッセージクラッカーで、勿論車輪の再発明で、
最初からやるだけ無駄
>>907 > これを扱いやすいよう整えていくと
> 既存のフレームワークの車輪になるから
> わざわざ自作する必要ないのだが。
眼科池よ
車輪の再発明っていうけど今の流れでみんなが考えてるのってhash使って 実行時にダイナミックにハンドラの追加削除が出来る新しいタイプの車輪だろ
910 :
897 :2011/02/19(土) 00:11:19
>>900 が一番適切だな
恥ずかしいから発言は無かった事にしてくれ
>>909 ついや線形探索なんかしない、単に大きい配列を用意するだけ
配列とハッシュは別物だぞ
2行目に至ってはメリットが分からない
大丈夫?
実行中にPOPUP作って メニューが色々変わったりするのあるじゃん
配列を関数の返却値の型にできます int func()[1]; 関数ポインタも返却値の型にできます typedef int (*RET)(); RET func(); でも関数ポインタの配列を返却値の型にしようとするとエラーが起きます なぜなんでしょ?_? typedef int (*RET)(); RET func()[1]; // NG
int *(*func[])();
typedef int (*RET)(); RET func[1];
>>911 ?????顔のAAを誰か張ってやってくれ
>>912 動的生成するメニューを差し替えるだけじゃん
デザインパターンの入門書でも読みなさい
>>913 配列を戻り値で返すなんてどうやるんだよ
それはCの構文が悪いんだよな 関数の引数にしてもそうだけどさ 実際には配列はファーストクラスオブジェクトではなくて 関数に渡したり戻り値として返したりできないのに 構文上はそのように見える書き方もできるから……
>>920 「どうやるか」は問題ではないんです。規格として許されるのかどうかって話なので…。
なんでこんな質問をするかというと、トレイツテンプレートクラスにおいて
関数型の判別にそのような宣言へのマッチングを利用するからです。
具体的にはメンバ関数テンプレートにおいて以下のようにします。
template < typename T > static char test( ... ); // すべてにマッチ
template < typename T > static int test( T (*)[1] ); // void, 参照, 関数以外にマッチ
boostでこんな感じにやってるんですが、どうしてうまく動くのかしら、と
>>906 やりたいことがすでに提供されているにもかかわらず、無駄の多いオレオレ実装をするのもドカタ。
>>908 じゃあなんでメッセージクラッカーの話に対して訳わからん自前処理書いたの?
925 :
922 :2011/02/20(日) 13:29:28.11
わたしの勘違いでした。おちんちんしゃぶってもいいです
しゃぶりに行く服がない
hash の実装とメッセージハンドラが完成した あとでうpする予定
いらな~い
hashってな~に
WTLでいいじゃん 何で再発明しようとすんの?
タコラ
「パラ任意抽出のハッシュ関数+最終的な分岐処理」が線形探索よりも高効率なら それだけでアルゴリズム特許獲れるよw 無駄に公開すんじゃねぇ
よし。特許をとったら公開してくれ。
アルゴリズムって、特許取れたっけ?
難しいアルゴリズムだったら特許取れる 簡単なのは、ムリ
公開してくれって言わんでも特許になったら自動的に公開されるんじゃない
画像処理関係(含むシェーダー)はアルゴリズムだけで特許とられてたりするが… 非商用ならOKというライセンスを設けてることが多いね
特許法で色々決まってた気がするけど忘れたw
昔、圧縮のアルゴリズムの特許が話題になったときにCマガジンで記事に なってたけど、ランレングス圧縮にちょっと改良を加えただけみたいな アルゴリズムでも特許になってたりするとかかかれてたな。
厳密に審査されないこともおおいからねぇ。 ある業界だけど、2つの円の大きさの差を求めるのに、 「直径同士を引き算する」特許が取られている。 一方ロシアは「半径同士を引き算してから2倍した」的な特許もある。
因みに低レベルなものは実用新案 特許にはならない
特許庁は内容の審査なんてしない。基本、書式に不備がなければ登録される。 既知のものかとかの調査を申請全部にするなら今の数万倍の予算がいる。 制度の設計自体が、争いになってから無効審判請求とかで解決しろってなスタンス。
944 :
デフォルトの名無しさん :2011/02/23(水) 17:00:48.73
map<K,V>::value_type型(pair<const K, V>)って、
代入演算はできないものなんでしょうか?
コンパイルエラーになるんです。
http://ideone.com/qaGs6 どうしてこうなのか、また解決策をご存知の方
いらっしゃいましたら教えていただけませんか?
const K型に代入ができるわけ無いだろ
int main() { std::map<std::string, int> hogeMap; hogeMap["abc"] = 1; std::map<std::string, int> hoge; hoge[(*hogeMap.begin()).first] = (*hogeMap.begin()).second; std::cout << (*hogeMap.begin()).first << std::endl; } std::mapの一番目の要素はconst
947 :
デフォルトの名無しさん :2011/02/23(水) 18:01:41.04
ああ・・どうもありがとうございます。 そうですね、constですから、考え直してみたら 代入出来ないのは当たり前でした。すみません。 ちょっと質問を変えます。 このmap::value_typeのキー部分が constになっていない型が欲しいのですが、 mapのテンプレート引数を同じようにタイプして 型を作るよりもスマートなやり方というのはないでしょうか?
>>947 std::mapの仕組みについて再考察した方がよい
firstがconstでないと、キーを変える度にツリーを再構築しなければいけない
これは無視できるコストではないのでconstにしたのだと思う
要素の削除→挿入で同等のことが発生すると思うけれど
おまえらがプログラマなら特許10件以上は取得しているだろ それ未満はドカタ
>>949 それを巨大なmapで何回もやってごらん
ものすごい時間が掛かるから
だからメンバ関数に入れなかったのだろう
自分の責任においてやる分には一向に構わないわけで
C++なのに、後で使うローカル変数をあえて関数の最初で宣言するのは VSのデバッグ機能などに寄与するとかあるんでしょうか? 自分はC++覚えたてのときから変数は必要になってから宣言即初期化してたんですが…
>>952 ないよ。ただの悪習でしかないから、宣言即初期化(そして const )を貫くがいい。
>>951 insertとかeraseは使えないのだろうか。
メンバ関数にないって書いてるから。
>>957 日本語不自由なやつだな。
「削除→挿入によってキーへの代入と同等のことをする操作は巨大なmapで何回もやると
ものすごい時間が掛かるから、メンバ関数には入れなかったのだろう」
ということ。
なんでキーを変更するようなメンバ関数の有無の話になってんだ? 誰かほしがってたのかな。
>>944 がそういうoperator=()を望んでる
そうは見えないが、日本語不自由だから本当はそれをほしがってることに気づけてないのか
頭も不自由のようだな
pair<string, int>を使えとかそういう話じゃないの?
だからoperator=の事とちゃうんか? operator[]と組み合わせて使うとまた別の意味になるけど hogeMap["abc"] = 1; とか 次のようにするとキーはそのままで値のみが置き換わるのがわかる std::multimapはまた別の動作をする (しかしラムダ式使いてーなー) template <class U, class V> void print(std::pair<U, V> p) { std::cout << '[' << p.first << "] = " << p.second << std::endl; } int main() { std::map<std::string, int> hogeMap; hogeMap["abc"] = 1; std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>); hogeMap["abc"] = 2; std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>); }
for_eachの練習ならよそでやってくれ
うめ
968 :
デフォルトの名無しさん :2011/03/01(火) 02:00:25.02
Eclipse CDTでやってるんだけど Shared Libraryとして作ったプロジェクトのソースにmain()って書けないの? デバッグはどうやれば? つまり -shared オプションがつけられた場合に リンカはmain()が含められたオブジェクトファイルをリンクしてくれるのかどうか ということかな
969 :
デフォルトの名無しさん :2011/03/02(水) 06:56:53.41
Javaみたいにパッケージ内で1つの名前空間を使う方法ってありますか? いちいちnamespace{}で囲わないといけないんでしょうか
using namespace
アドレスってどの型に入れればよいですか? windowsならLONG_PTR?
void*
ポインタ型
976 :
デフォルトの名無しさん :2011/03/03(木) 23:17:58.81
ヘッダーファイルだけで構成されたライブラリが流行っていますよね。 こういうライブラリで静的な変数をうまく初期化する方法はあるでしょうか? すぐに考え付く方法として、関数のスコープで静的な局所変数を宣言し関数の戻り値として利用する方法です。 int const * getData() { static int const data[] = { 1, 2, 3, 4, 5 }; return data; } この方法は、現行のC++ではスレッドを利用した時に破綻します。(C++0xでは保障されるようです。) しかし、ヘッダー内で普通に大域変数として初期化すると、DLLとDLLを利用するプログラムの両方に 実体が出来るため、リンクに失敗します。 こういう場合、一体どうすればいいのでしょう?
普通にconst int ARRAY[] = {1,2,3,4,5};ではだめなん?
VC限定だが__declspec(selectany)
979 :
デフォルトの名無しさん :2011/03/03(木) 23:31:03.54
プロセス内に唯一つの大きなテーブルが欲しい。 これは読みだすだけで初期化以外に書き込みは発生しません。 具体的には、構文解析用のAction、Goto、SemanticActionの各テーブルです。 パーサーのインスタンスごとにメモリーを確保、初期化しても最近のコンピューターであれば問題 ないかもしれませんが、できれば無駄をなくしたいと思った次第。 よろしくお願いします。
new deleteかmalloc free で確保すればいいと思うが、何が疑問なんだ?
モリマップドファイルとかDB使うとか?
982 :
デフォルトの名無しさん :2011/03/03(木) 23:48:47.83
メモリマップドファイル^^
>>976 Singleton使ったらうまく行かない?
985 :
デフォルトの名無しさん :2011/03/03(木) 23:58:48.19
>>984 うまくいくけど、クリティカルセクションが必要になってスマートじゃない予感がする。
文字列化 const char *table = "\x00\x01\x02........";
987 :
デフォルトの名無しさん :2011/03/04(金) 00:40:52.35
ごくありふれた問題ですぐに回答がつくかと思ったらそうでもないのか。 C++0x待つか。 初期化タイミングが保障されるらしいし。
組み込み型定数なら初期化タイミングなんて気にしなくてよくね?そういう話じゃないの?
>>985 スマートである必要はないだろ
動けば今はいいんだろ?
規格で保証されてない動作をあれこれ考えるより余程いい
MinGWで開発中の者です。 struct Info{ int num1; int num2; std::string str1; }; int Delete(struct Info *pinfo,std::list<struct Info>& list){ for(std::list<struct Info>::iterator itr=list.begin();itr!=list.end();itr++){ if(pInfo==(*itr)){//ここで「no match for 'operator==' in 'pinfo == itr'」 //削除処理 } } } int main(){ std::list<struct Info> list1; struct Info info; //要素追加処理。 struct Info del; del={2,3,"foo"}; Delete(&del,list1); return 0; } となってしまいます。 どのようにすれば良いのでしょうか。
>>990 型が合ってないのが悪いんだから、
if(pInfo==&(*itr))
でいいんじゃね?
次スレお願いします
>>990 struct Info の operator == を自前定義したうえで *pInfo == *itr
char *abc[][3] = { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }; で初期化出来ますが、 *abc[][3] の配列(というか *abc[][3] を指すポインタ)は、 char **xyz[][3] = {abc, def, ...}; じゃ代入出来ないんですけど、 どう書いたら良いでしょうか?
char *(*xyz[])[3] = {abc, def, ...};
ややこしく書かずに typedef const char* type[4][3]; type* p = &abc; とでも書いたらどうだろう
>>996 出来ました!!
ありがとうございました!!!
質問いいですか?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。