【初心者歓迎】C/C++室 Ver.74【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/11/09(火) 17:42:35ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1274395127/
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
0002デフォルトの名無しさん
2010/11/09(火) 18:27:54動かしたいのですが、以下の部分のエラーでコンパイル出来ません。
問題点分かる方いましたらご教授お願いします。
ヘッダはサイトのものに<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 }
(略)
0003デフォルトの名無しさん
2010/11/09(火) 18:29:42error 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' の可能性があります。
0004デフォルトの名無しさん
2010/11/09(火) 19:07:2300052
2010/11/09(火) 22:40:12スレ汚し失礼しました。
0006デフォルトの名無しさん
2010/11/10(水) 07:41:44win7の場合もやっぱりC++で.NET使わないほうが高速なのですか?
それとも、.NET使った場合とあまり処理速度は変わりませんか?
0007デフォルトの名無しさん
2010/11/10(水) 09:21:390008デフォルトの名無しさん
2010/11/10(水) 09:34:48C++はプログラム言語。
.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#でなど。
0009デフォルトの名無しさん
2010/11/10(水) 09:56:500010デフォルトの名無しさん
2010/11/11(木) 10:16:090011デフォルトの名無しさん
2010/11/11(木) 22:12:24std::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;
}
だれか助けて
0012デフォルトの名無しさん
2010/11/11(木) 22:13:28ageてしまいましたorz
0013デフォルトの名無しさん
2010/11/11(木) 22:36:22どのように定義されてるのでしょうか
0014デフォルトの名無しさん
2010/11/11(木) 23:26:34ユニバーサルキャラクタ名
ttp://seclan.dll.jp/c99d/c99d03.htm
この絡みかな知らんけどw
0015デフォルトの名無しさん
2010/11/12(金) 01:10:480016デフォルトの名無しさん
2010/11/12(金) 02:00:21これによって使えるPOINT構造体は
int func(POINT pt);
で
func(POINT(0, 0));のように使えないのでしょうか?
0017デフォルトの名無しさん
2010/11/12(金) 02:18:15そしてPOINT(0,0)のようなコンストラクタ構文は、C++固有の機能だ
0018デフォルトの名無しさん
2010/11/12(金) 02:27:40かっこいいな
俺もやりたいけど難しすぎるよ
ランタイムなしで高速に起動するアプリ
かっこよすぎる
おれには無理だが
おまえらがんばってくれ
グフッ・・・・
0019デフォルトの名無しさん
2010/11/12(金) 02:44:49早まるな。たいていのお客さんは起動の速さより納期の短さを優先する。
0020デフォルトの名無しさん
2010/11/12(金) 11:12:37cygwinだと問題ないんだがなぁ。尤も、localeは"C"で試したけど。
vc固有の問題っぽいから回答つかないようならvcスレで聞きなおしてみたら?
>>13
なんでまたそんな危なっかしいことを……
>>16
MFCならCPointがPOINTをラップしてたと思うけど、それを使えないなら自作するしか。
0021デフォルトの名無しさん
2010/11/12(金) 13:45:230022デフォルトの名無しさん
2010/11/12(金) 13:50:23libiconvかなにか、適当なライブラリを使う。
0023デフォルトの名無しさん
2010/11/12(金) 15:25:12できれば手動で変換したいのですが
やり方とかしりませんか?
0024デフォルトの名無しさん
2010/11/12(金) 16:06:15あんたが思っている以上にめんどくさいぞ
おとなしくライブラリ使っとけ
0025デフォルトの名無しさん
2010/11/12(金) 16:58:04一度Wikipediaで漢字コード表を見比べてみるといい。
ttp://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_4000-4FFF
unicodeは例えばここの4e00から見て判るように、部首画数順に並んでいる。
一方SJISはJISc6226がベースになっているのであいうえお順に並んでいる。
とてもじゃないが、手作業でできるようなものじゃない。
0026デフォルトの名無しさん
2010/11/12(金) 17:16:320027デフォルトの名無しさん
2010/11/12(金) 17:43:16コード表をOCRしたかもしらんが。
0028デフォルトの名無しさん
2010/11/12(金) 18:25:15これとかを取り込めばとりあえずは変換できるんじゃないかな
0029デフォルトの名無しさん
2010/11/12(金) 18:50:14というか、どうして自前での変換にこだわるのかわからん。
>>21 の環境がなんなのかわからないけど、Windows環境ならAPI関数ひとつ
呼ぶだけだぞ。
0030デフォルトの名無しさん
2010/11/12(金) 20:45:59struct A
{
int a;
float b;
};
という構造体がある場合、
ポインタをつかって aに整数を、bに小数を代入したいのですが
ポインタの型は何で宣言すればいいのでしょうか?
int型のポインタに構造体のアドレスを入れ、ポインタからbに少数を代入しようとすると
'float' から 'int' への変換です。データが失われる可能性があります。
という警告が出て、bの値がが整数に直されます
float型のポインタに構造体のアドレスを入れようとすると今度はまた別なエラーが出ます
どうすればいいのでしょうか?
0031デフォルトの名無しさん
2010/11/12(金) 20:51:050032デフォルトの名無しさん
2010/11/12(金) 21:04:16すいません。最初のほうから勉強しなおします
0033デフォルトの名無しさん
2010/11/12(金) 22:56:15std::locale("C")で解決でした。
実際には日本語を利用したいのでlocaleはC->japaneseにする必要があるのですが
日本語文字列を出力する場合は"C"だと日本語出ず、
日本語出したくて"japanese"だと"\u00a0"以降文字列出ずorz
SDKでwindow作ってそっちに出してみます。
レスくれた方、thx
0034デフォルトの名無しさん
2010/11/15(月) 03:08:01Win32API/GDI+の質問です
GDI+のImageクラスをnewでインスタンス化した後
deleteで解放するとエラー落ちしてしまいます
デバッグモードのときのみエラーが発生するようで
デバッグなしだと問題なく(?)処理できてるようです
(問題ないように見えているだけかもしれませんが)
もちろんdeleteしないとメモリリークは発生しています
どうすれば解決するでしょうか
0035デフォルトの名無しさん
2010/11/15(月) 04:21:160036デフォルトの名無しさん
2010/11/15(月) 04:53:34もちろん、壊している場所は、deleteを呼んでいる場所ではない。
0037デフォルトの名無しさん
2010/11/15(月) 04:59:28003834
2010/11/15(月) 15:32:22エラーメッセージはその通りでヒープが壊れてると言われます
「ヒープが壊れていることが原因として考えられます。XXXX.exe または読み込まれた DLL にバグがあります。」
ためしにnewで確保してすぐdeleteしてみても同じエラーが出るので
Imageクラスの扱い以外の部分で問題が起きてるようには見えませんでした
newでの扱い方自体に何か根本的な問題があるのでしょうか
>>37
ファイルというのは画像ファイルということでしょうか?
読み込んだ画像ファイルを解放するような操作が必要なのでしょうか
自分で調べた限りではよく分かりませんでした
newで確保しなければ問題は一応回避できるのですが
やはり解決策を知っておかないと後々苦労しそうなので是非おねがいします
0039デフォルトの名無しさん
2010/11/15(月) 15:40:02またはImageのGetLastStatus()で0以外(エラー)が入っていないかどうか。
004034
2010/11/15(月) 15:53:16ウォッチしてみてもアドレスがNULLということは無いみたいです
GetLastStatus()の戻り値もOk(=0)でした
画像描画自体も問題なく行われているのですが・・・
deleteがなぜ上手くいかないのかよく分かりません
0041デフォルトの名無しさん
2010/11/15(月) 15:55:110042デフォルトの名無しさん
2010/11/15(月) 16:01:240043デフォルトの名無しさん
2010/11/15(月) 16:03:01004434
2010/11/15(月) 16:18:11スマートポインタですか?
勉強してみます、ありがとうございました
>>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月ごろにインストールしたものです。
004534
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
上記のサイト様の通りに手直ししたところ無事解決しました
質問に答えてくださった方々、ありがとうございました
0046デフォルトの名無しさん
2010/11/15(月) 21:00:14これって
if (a<b) a=1;
else
b=0;
ってことですよね。
このような式の使い方を説明してるサイトってありますか?
0047デフォルトの名無しさん
2010/11/15(月) 21:01:39条件演算子って言うんですね。
0048デフォルトの名無しさん
2010/11/15(月) 21:25:29いやな使い方だな。
0049デフォルトの名無しさん
2010/11/15(月) 22:39:41#include <ctype.h>
char c;
printf("%c\n", (isprint(c)) ? c : '.');
というふうに、値を返すときに便利です。
条件演算子をネストに使うと便利さが倍増します。
0050デフォルトの名無しさん
2010/11/15(月) 22:50:200051デフォルトの名無しさん
2010/11/15(月) 23:14:20なんと便利なことか ああ便利便利
0052デフォルトの名無しさん
2010/11/15(月) 23:16:260053デフォルトの名無しさん
2010/11/18(木) 01:25:22ところがTreeView_CreateDragImageの戻り値がNULLになってしまいます。
原因として考えられることはなんでしょうか。
0054デフォルトの名無しさん
2010/11/18(木) 09:24:26お使いのGUIライブラリ、フレームワークなどのスレへどうぞ。
0055デフォルトの名無しさん
2010/11/18(木) 12:03:48ポートが開けない、もしくは通信中タイムアウトになった場合は
引数でエラーを通知するべきか例外を送出するべきでしょうか?
また例外を送出する場合と引数などでエラーを通知する場合の使い分けの指針のような物はあるのでしょうか
0056デフォルトの名無しさん
2010/11/18(木) 14:54:27#define THEN ?
#define ELSE :
s = IF cond THEN "T" ELSE "F";
みたいなコードを見たことがあるが、なるほど関数型言語かぶれだったのか
0057デフォルトの名無しさん
2010/11/18(木) 15:01:13どことなくFORTHくさい気がしたが・・・微妙に違うなぁ
何の言語だろう
BASICか?
0058デフォルトの名無しさん
2010/11/18(木) 20:47:20むしろExcelかぶれなのかもしれん。
0059デフォルトの名無しさん
2010/11/18(木) 21:29:21let ff =
let rec ff' s n = if n = 0 then s else n::ff' s (n-1)
ff' [];;
0060デフォルトの名無しさん
2010/11/18(木) 21:48:070061よろしくお願いします
2010/11/19(金) 00:30:22複数の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に同じ時刻を返す場合があり、
このため独立であってほしい乱数系列に相関が出てしまう可能性が高いため)
0062デフォルトの名無しさん
2010/11/19(金) 00:50:130063デフォルトの名無しさん
2010/11/19(金) 00:55:45006453
2010/11/19(金) 01:11:38Win32APIスレで聞きましたが相手にされませんでした・・・。
もしよければ教えてください。
TreeView_CreateDragImageを使うには何か下準備がいるんでしょうか?
0065デフォルトの名無しさん
2010/11/19(金) 01:15:46この通りにしてもできないのか?
0066デフォルトの名無しさん
2010/11/19(金) 01:21:411翻訳単位内であれば定義順
006753
2010/11/19(金) 01:30:03ありがとうございます。結論から言うと出来ました。
まずTreeView_SetImageListでイメージリストを関連付けなくてはならなかったようです。
そちらなども色々と見てましたが書いてなかったもので迂闊でした。
どうもありがとうございました。
006861
2010/11/19(金) 01:40:53ありがとうございました。
/* hoge.cpp */
namespace { A hoge( func() ); B mage( func() ); }
/* fuga.cpp */
namespace { A fuga( func() ); }
こんな感じのとき、hoge、mageの順にfunc()が呼ばれるけど、
(hoge, mage)と(fuga)のどちらのfunc()が呼ばれるかはわからない、
ということでいいのでしょうか。大変参考になりました。
0069デフォルトの名無しさん
2010/11/19(金) 15:36:590070デフォルトの名無しさん
2010/11/19(金) 15:47:37ようハゲ
0071デフォルトの名無しさん
2010/11/19(金) 15:57:38俺は恥ずかしくて使わないが
0072デフォルトの名無しさん
2010/11/19(金) 16:19:180073デフォルトの名無しさん
2010/11/19(金) 20:09:140074デフォルトの名無しさん
2010/11/20(土) 19:30:09田中花子
田中・・・・・
田中一家で統一してしまえ
0075デフォルトの名無しさん
2010/11/20(土) 23:09:510076デフォルトの名無しさん
2010/11/21(日) 00:37:040077デフォルトの名無しさん
2010/11/21(日) 06:54:15PtrToStringCharsとかいうのはあるんですが、
なんかclrがどうとかでて使えません…
0078デフォルトの名無しさん
2010/11/21(日) 10:32:51http://soudan1.biglobe.ne.jp/qa4650429.html
0079デフォルトの名無しさん
2010/11/21(日) 10:34:23そのString型がどこに由来するか、どんなエラーメッセージが出るのか、それによって答えが異なるでしょう。
一般的には、できるはずです。
0080デフォルトの名無しさん
2010/11/21(日) 11:20:05C言語で書いたのですが、どなたかレビューお願いします。
URL
http://sky.geocities.jp/tcshacina/hash.c
0081デフォルトの名無しさん
2010/11/21(日) 11:38:530082デフォルトの名無しさん
2010/11/21(日) 11:49:23人に読ませるのならコメントくらいつけて欲しい
あと、コメントアウトしてる部分は削除して
0083デフォルトの名無しさん
2010/11/21(日) 14:07:24>>82の言うとおり、レビュー以前に書類不備で却下
0084デフォルトの名無しさん
2010/11/21(日) 14:17:04で、VC++でコンパイルしているわけだが(w、
gimple
という構造体を参照していて、この構造体が未定義(インクルードなし)
のためにエラーが出てます。構造体のありかをご存じの人いますか?
一応、gimple.h/cを観てみたが、見つけられなかった。。。
0085デフォルトの名無しさん
2010/11/21(日) 14:30:50gimpleという構造体の宣言の間違いですた。
たとえば、
gimple stmt;
とか。
よろしくお願いします。
0086デフォルトの名無しさん
2010/11/21(日) 16:00:11スレ違い。gccスレへgo.
GCCについて part9
http://hibari.2ch.net/test/read.cgi/tech/1246059290/
Cygwin + MinGW + GCC 相談室 Part 5
http://hibari.2ch.net/test/read.cgi/tech/1269400706/
あとC言語のパーサ使いたいなら自分で書いたほうが数倍早いぞ。
0087デフォルトの名無しさん
2010/11/21(日) 17:21:52アドバイスありがと。
gccへ行きます^^
#そうそう、今自分でかこうか考えてた所(w
0088デフォルトの名無しさん
2010/11/21(日) 17:45:56パーサをCでスクラッチで作るとすると、文字列用の関数を用意すべきだと思うが、
標準(stdio)ではそれら用のラッパー関数を作らにゃならん感じで、時間を使ってしまいそう。
少なくとも、Tclのストリング並みの関数群のライブラリをご存知の方いますか?
ご返答よろしくお願いします。
0089デフォルトの名無しさん
2010/11/21(日) 18:42:190090デフォルトの名無しさん
2010/11/21(日) 23:52:43Visual C++だと戻り値がスレッドごとにメモリ確保されていますが、
Linuxでどうなのか調べがつきませんでした。
0091デフォルトの名無しさん
2010/11/21(日) 23:57:130092デフォルトの名無しさん
2010/11/22(月) 04:35:54{
public:
static int num;
};
このnumにほかのクラスから代入するにはどうしたらいいのですか?
これがstatic関数ならばその関数を使うことはできるのですがstatic変数が利用できません。
0093デフォルトの名無しさん
2010/11/22(月) 04:56:34トークンの切り出しでトリム機能があるとさくっと作れそうなんス。
Tclで半分パーサの機能を作った時の経験からそう思うんス。
0094デフォルトの名無しさん
2010/11/22(月) 08:01:02return strtok(s, " \n\r\t");
}
0095デフォルトの名無しさん
2010/11/22(月) 08:06:14strtok(s, " \n\r\t");
普通に呼び出したほうがマシだろ
0096デフォルトの名無しさん
2010/11/22(月) 12:36:46なんでやねん
publicなんだからクラス関係ないだろ
Something::numで見えるだろ?
0097デフォルトの名無しさん
2010/11/22(月) 12:58:25後から心配になって来たのでやってみた
やっぱりうまく行くな
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;
}
0098デフォルトの名無しさん
2010/11/22(月) 13:13:45>>95
アドバイスありがと。
>>95
多分ラッパー関数と自分が書いたからだと思います。
彼の優しさだす。
切り出しに良い関数ですね。
0099デフォルトの名無しさん
2010/11/22(月) 13:14:160100デフォルトの名無しさん
2010/11/22(月) 13:27:11そうなってるんだけど
お前の目はフシアナか?
0101デフォルトの名無しさん
2010/11/22(月) 14:07:510102デフォルトの名無しさん
2010/11/22(月) 14:10:41お前は一体なにを言ってるんだ
0103デフォルトの名無しさん
2010/11/22(月) 14:21:48もしかしてクラスの中で定義してないので変だと思ったのか
class Something {
public:
static int num = 123;
};
みたいな感じで
これだとstatic intしか初期化出来ないので、俺はいつも外部で定義している
0104デフォルトの名無しさん
2010/11/22(月) 14:42:21柴田望洋先生の'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);
}
0105デフォルトの名無しさん
2010/11/22(月) 14:45:52特に問題ないと思うから、ファイル名を変えてみたら?
0106デフォルトの名無しさん
2010/11/22(月) 14:49:30positon.cpp⇒sample_p.cppに変更してみましたが、
同様のエラーが出ました。
ヘッダーファイル名も変更すべきでしょうか?
0107デフォルトの名無しさん
2010/11/22(月) 14:51:270108デフォルトの名無しさん
2010/11/22(月) 14:53:20bcc32 -P positon.h sample_p.cpp
でコンパイルしてみたら通りました。
-Pオプションが必要だったとは・・・・。
ありがとうございました。
0109デフォルトの名無しさん
2010/11/22(月) 14:55:470110デフォルトの名無しさん
2010/11/22(月) 14:58:17学習用にサクッとコンパイル通すには便利だったんですが
他のコンパイラおすすめありますか?
0111デフォルトの名無しさん
2010/11/22(月) 15:02:06インクルードファイルはインクルードされるのに任せればいいからコンパイルしちゃダメ。
0112デフォルトの名無しさん
2010/11/22(月) 15:03:45食いつくと思わなったが一応解説しておくと
BCCの無料版は古いのでC++新しい機能を駆使しようとすると問題が多い
でも初心者が勉強していく上でそれにひっかかることはまず無いので忘れてください
0113デフォルトの名無しさん
2010/11/22(月) 15:09:39>>111
どういう意味でしょうか・・・?
0114デフォルトの名無しさん
2010/11/22(月) 15:16:23bcc32 sample_p.cppだけでOK。
position.hは、sample_p.cppに「インクルードせよ」と書かれているので勝手にインクルードされる。
0115デフォルトの名無しさん
2010/11/22(月) 15:20:19とりあえずbccでコンパイルしてみます
>>114
たしかにbcc sample_p.cppだけでコンパイルが通りました。
勉強になりました。ありがとうございます。
>以前152
>で書き込ませていただいた者なんですが、教えていただいた通り、打ち込んでみたのですが、実行結果がでませんでした。
>なぜでしょうか?
7行目>>164
i=0; を
i=0; puts("数値を入力>"); に変えてみようか?
0117デフォルトの名無しさん
2010/11/22(月) 16:37:11勉強用ならgccがいいよ
bccはもう終わったコンパイラ
0118デフォルトの名無しさん
2010/11/22(月) 17:28:180119デフォルトの名無しさん
2010/11/22(月) 17:32:220120デフォルトの名無しさん
2010/11/22(月) 19:57:560121デフォルトの名無しさん
2010/11/23(火) 11:20:300122デフォルトの名無しさん
2010/11/23(火) 15:17:24して、ファイルdata.txtを利用できるかって
ifs.good() == true で判断するの?
他になんか定石的な判断法あったら教えてね
0123デフォルトの名無しさん
2010/11/23(火) 17:28:500124デフォルトの名無しさん
2010/11/23(火) 20:50:27ありがとうございます
そんなんで良いですか!
駄目な時ifsを0にするって規格で決まっているですか?
0125デフォルトの名無しさん
2010/11/23(火) 21:26:13が有るんだよ
0126デフォルトの名無しさん
2010/11/23(火) 22:15:03if(!!ifs) か if(!ifs) じゃないか?
0127デフォルトの名無しさん
2010/11/23(火) 22:24:36C++0xのドラフトN3126だとexplict operator bool() constに変更されている模様。
0128デフォルトの名無しさん
2010/11/23(火) 22:38:490129デフォルトの名無しさん
2010/11/24(水) 00:30:49iosで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にゃんですね
0130デフォルトの名無しさん
2010/11/24(水) 23:26:27環境はwindows7、コンパイラはBorland C++ Compiler 5.5です。
オイラー法で数値計算をして出力するEuler.exeという簡単なプログラムを作成したのですが、
コマンドプロンプト上で
>Euler.exe
とするときちんと計算結果がプロンプト上に表示されるのですが、
>Euler.exe>Euler.txt
とテキストファイル上に書き出すようにリダイレクトすると、プログラムが停止してしまいます。
プロンプト上では動作するので、プログラムの問題ではなくwindows7かコンパイラの問題だと思うのですが、
どなたか原因を教えていただけませんでしょうか。(今までの他のプログラムは出力できていました)
よろしくお願いいたします。
0131デフォルトの名無しさん
2010/11/25(木) 03:46:177なら権限の問題ではないかね。
あ、でも他のプログラムではできたのか。
書き出すより先にプログラムが終了しちゃうとかかな?終了間際にウェイトを置いてみるとか。
ひっじょーにしょうもない質問ですが、Cで
getchar();
のようなEnter入力待ちって、C++でcinとか使ってできるのでしょうか?
0132デフォルトの名無しさん
2010/11/25(木) 04:17:100133デフォルトの名無しさん
2010/11/25(木) 14:47:18あ、なるほど
ホンとしょーもない質問で失礼しました
こんな関数持ってたのね
0134デフォルトの名無しさん
2010/11/25(木) 17:14:09cout << "node = " << typeid(*node).name() << "\n";
と書いて実行すると、
node = N3m3g8Sprite3DE
とかいう謎の文字列が得られるのですが、ただしくクラス名Sprite3Dだけを表示するにはどうすればいいですか?
0135デフォルトの名無しさん
2010/11/25(木) 17:38:18てっとりばやく何とかしたいなら、Visual C++を使え。
0136デフォルトの名無しさん
2010/11/25(木) 17:39:48自分で謎文字例からクラス名を取り出せば
たぶんこういうルールじゃね
N
3 m3g (3文字)
8 Sprite3D (8文字)
E
0137134
2010/11/25(木) 17:48:380138じゃあ1行で
2010/11/25(木) 17:55:170139デフォルトの名無しさん
2010/11/25(木) 18:31:26パラメータになりそうな型と手当たり次第に比較したら?
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"; }
0140デフォルトの名無しさん
2010/11/25(木) 18:37:56g++ならabi::__cxa_demangle
0141デフォルトの名無しさん
2010/11/25(木) 20:17:49decltypeはあれ何だっけ
0142デフォルトの名無しさん
2010/11/26(金) 02:00:17初心者用テキストに載っているコードが実行できる程度のもので構わないので、オススメがあったら教えてください。
0143デフォルトの名無しさん
2010/11/26(金) 02:13:590144デフォルトの名無しさん
2010/11/26(金) 02:27:01>初心者用テキスト
テキストに書いてあるオススメ
0145デフォルトの名無しさん
2010/11/26(金) 10:07:150146デフォルトの名無しさん
2010/11/26(金) 12:04:27Tiny C Compiler使ったのがいくつかあったような
0147デフォルトの名無しさん
2010/11/27(土) 19:58:37int value = func();
}
これではループの度に変数iが宣言されて冗長だから
int i, value;
for (i = 0; i < length; i++) {
value = func();
}
C++でこうした方が速い、こうするべきだとよく書かれていますが
これだとループカウンタのスコープが外に出るので危険ですよね
それにこの一連の動作を関数で定義して、関数ごとループさせるような場合はあまり意味を成さないし
ループカウンタをメンバ変数やグローバル変数にするのも馬鹿げていると思います
基本も基本で恐縮ですが、実際のところ、皆様がどのように書かれているのか参考にさせていただければ幸いです
0148デフォルトの名無しさん
2010/11/27(土) 20:01:34書くのが面倒くさい、ぐらいしか思いつかない
0149デフォルトの名無しさん
2010/11/27(土) 20:11:51さっきのvectorのアホに感化されたか
0150デフォルトの名無しさん
2010/11/27(土) 20:15:03C++ってんならスコープを必要最小限に狭める上のほうが一般的だろう
下勧めてるとかどこのアホだ?
それはそれとして、ループのたびに確保ってvalueの方だよな?
なら全体をスコープで囲っちゃえば?
0151デフォルトの名無しさん
2010/11/27(土) 20:19:43下みたいな書き方にしなくて良いようで安心しました
0152デフォルトの名無しさん
2010/11/27(土) 20:25:550153デフォルトの名無しさん
2010/11/27(土) 22:45:20register int value = func();
}
C++はこうするのが正しい
0154デフォルトの名無しさん
2010/11/27(土) 22:47:36死語になってるキーワードじゃないか
0155デフォルトの名無しさん
2010/11/27(土) 22:56:25いいか悪いかは状況によるよな。
0156デフォルトの名無しさん
2010/11/28(日) 01:04:330157デフォルトの名無しさん
2010/11/28(日) 18:10:05value = func();
}
こうしたら?普通ありえんけど
0158デフォルトの名無しさん
2010/11/28(日) 18:35:240159デフォルトの名無しさん
2010/11/28(日) 18:53:190160デフォルトの名無しさん
2010/11/28(日) 20:01:44javaで仕事やってて、ループ内でプリミティブ型の変数を宣言してたら
ループのたびにメモリが確保されてパフォーマンスが落ちるとかいいがり
つけられたことがある。
古い話題じゃなくて、わかってないやつは今でもいっぱいいそう。
0161デフォルトの名無しさん
2010/11/28(日) 21:36:01メモリ確保するコードが出力されないことは保証されていないし、パフォーマンス
落ちるかも知れないだろ。
落ちた所でそれが何なのとは思うし、そんなコードを生成するJITは嫌だが、
別に言いがかりじゃない。説明できなかったお前が悪い。
0162デフォルトの名無しさん
2010/11/28(日) 21:40:240163デフォルトの名無しさん
2010/11/28(日) 22:11:44いや完全にいいがかり。
しっかり反論した。
自分の作ったところがパフォーマンス悪いって指摘されて、おれが
書いたコードに責任をかぶせようとしてた。
一回リクエストがあるたびに、数十M、数百Mメモリを浪費してることろが
あるのに、(仮にループ中のintの宣言がメモリを浪費するとして)リクエスト一回で
数十回しかループしていないところのintを指して、これが原因とか言ってた。
それ以前にC++でだってループ中のint宣言はメモリを浪費しない保障がない、
やめるべきだとか言ってたらそいつ頭おかしいだろ。
それと同じだ。
0164デフォルトの名無しさん
2010/11/28(日) 22:39:310165デフォルトの名無しさん
2010/11/28(日) 22:49:09変数は使う直前で宣言&初期化するってスタイルが理解できない
連中とか珍しくないし、そういうレベルからみたらループ中で宣言って
驚天動地のできごとなんだろな。
0166デフォルトの名無しさん
2010/11/28(日) 23:35:09速度の話なら、毎回メモリ確保したとしてもスタックポインタ加算・減算に1ナノ秒くらい?
100万回実行しても人間は認識できない時間。
0167デフォルトの名無しさん
2010/11/29(月) 01:00:50ループ内で宣言すると「お前のコードは汚い」といわれたことがある、ついさっき。
0168デフォルトの名無しさん
2010/11/29(月) 01:09:520169デフォルトの名無しさん
2010/11/29(月) 01:10:28それはあんたの価値観が古臭いだけだ。
と言い返してやれ。
0170デフォルトの名無しさん
2010/11/29(月) 01:25:550171デフォルトの名無しさん
2010/11/29(月) 14:02:30A != 0 でいいの?
0172デフォルトの名無しさん
2010/11/29(月) 14:51:38その通り
0173デフォルトの名無しさん
2010/11/30(火) 12:03:19例外をキャッチするとき例外AとBの時は同一の処理をしたい場合catch()の指定の仕方はどうすればよいでしょうか?
0174デフォルトの名無しさん
2010/11/30(火) 12:10:120175デフォルトの名無しさん
2010/11/30(火) 12:20:270176175
2010/11/30(火) 12:22:170177デフォルトの名無しさん
2010/11/30(火) 14:18:070178デフォルトの名無しさん
2010/11/30(火) 23:11:00dynamic_castしてくれというのがライブラリ設計者の考えではないだろうか。
0179デフォルトの名無しさん
2010/12/01(水) 01:11:39んなわけない。
仮想関数を持つクラスはほぼすべて virtual デストラクタを持つことになるわけで、
その考え方だと dynamic_cast 推奨と勘違いするケースが多すぎる。
0180デフォルトの名無しさん
2010/12/01(水) 07:30:09>>174-177なんかよりよっぽど見やすいコードだし、使わない手はない
0181デフォルトの名無しさん
2010/12/01(水) 07:57:430182デフォルトの名無しさん
2010/12/02(木) 20:46:210183デフォルトの名無しさん
2010/12/02(木) 21:03:190184デフォルトの名無しさん
2010/12/03(金) 06:47:390185デフォルトの名無しさん
2010/12/03(金) 08:45:420186デフォルトの名無しさん
2010/12/03(金) 09:34:440187デフォルトの名無しさん
2010/12/03(金) 13:26:020188デフォルトの名無しさん
2010/12/03(金) 16:11:54Delphiで
TUnkoClass: class of TUnko
function BuildUnko(AType:TUnkoClass):TUnko;
begin
Result:=AType.Create;
end;
type
TGeri = class(TUnko)
・
・
TIpponGuso = class(TUnko)
・
・
こういうのがあったとして、これをC++でやるにはどうしたらいいんでしょうか。
0189デフォルトの名無しさん
2010/12/03(金) 16:12:481つでもクラスを生成したら以降は無視するようにするためにカウンタを
staticメンバ変数で作る
0190デフォルトの名無しさん
2010/12/03(金) 16:13:30死ね
たいがいにしとけや
0191デフォルトの名無しさん
2010/12/04(土) 02:51:00DLLを利用するコードがDLL作る時と同じコンパイラの同じバージョンでコンパイルされるなら問題無い。
もしくはクラスのメモリレイアウトと例外の実装方式に変更がないという自信があるなら良い。
要するにコンパイラメーカー以外は気安くスローするなってことだ。
0192デフォルトの名無しさん
2010/12/05(日) 23:14:03Visual C++のtime_tのサイズが途中で変わったりしてて驚いた。めんどくせ
0193デフォルトの名無しさん
2010/12/06(月) 13:25:040194デフォルトの名無しさん
2010/12/06(月) 14:37:060195デフォルトの名無しさん
2010/12/06(月) 15:10:410196デフォルトの名無しさん
2010/12/06(月) 15:22:48この(int)が激しくウザい。だれだよsize_tとか作った奴。
0197デフォルトの名無しさん
2010/12/06(月) 15:58:15intが32ビットでsize_tが64ビットの環境もあるから (VC++の64ビット版とか)
64ビットのくせに2GBまでしか扱えなくていいのならintにキャストしとけばいいんじゃない
0198デフォルトの名無しさん
2010/12/06(月) 16:50:56俺は今まで64ビットの環境ではintが64bitになるかと思ってたよwww
0199デフォルトの名無しさん
2010/12/06(月) 19:00:340200デフォルトの名無しさん
2010/12/06(月) 21:37:31for (size_t i = 0; i < v.size(); i++) でいいだろ。
0201デフォルトの名無しさん
2010/12/06(月) 21:44:05最適化で32ビットにでもなれば…
いや、気にする必要もないのか?(64bitOS持ってないんだ)
0202デフォルトの名無しさん
2010/12/06(月) 21:58:53お前は一生shortでも使ってろ。
for (short i = 0; i < 100; i++) ; // メモリの節約(^^)
0203デフォルトの名無しさん
2010/12/06(月) 21:59:560204デフォルトの名無しさん
2010/12/06(月) 22:00:36そんな無駄を意識する前に、ループ回るたびに size() 呼び出してる点を先に考えろ。
0205デフォルトの名無しさん
2010/12/06(月) 22:23:190206デフォルトの名無しさん
2010/12/06(月) 22:25:30ちょっと待て、普通にどうなるか聞きたいのだが?
メモリー以外変わらないのか?
0207デフォルトの名無しさん
2010/12/06(月) 22:39:54十分に最適化の聞くコンパイラなら同じこと。ただし下手に小さい整数型をループ変数にすると
100 を 200 にしたり 300 にしたり 40000 にしたりすると意図しない結果になる可能性がある。
最適化の弱いコンパイラだと、演算時の整数格上げと変数格納時の格下げ(?)が繰り返されて
逆に効率が下がる可能性がある。
基本的にはデメリットしかない。
0208デフォルトの名無しさん
2010/12/07(火) 01:24:00for (int i = 0, size = v.size(); i < size; ++i)
ということか。
まあ面倒くさいってのは一緒だけど。
0209デフォルトの名無しさん
2010/12/07(火) 01:34:540210デフォルトの名無しさん
2010/12/07(火) 07:04:0000 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 で恐ろしいほどの最適化処理だった。下がいいね
0211デフォルトの名無しさん
2010/12/07(火) 10:15:420212デフォルトの名無しさん
2010/12/07(火) 20:53:120213デフォルトの名無しさん
2010/12/07(火) 22:56:33リンクすると/usr/libの方をリンクしてしまうのですが、
自分の${HOME}/libの下にある奴を優先的にリンクさせるには
Makefileをどう書けばいいでしょうか
0214213
2010/12/07(火) 23:08:14指定したらローカルの方をリンクしてくれました。
お騒がせしました
0215デフォルトの名無しさん
2010/12/08(水) 07:55:41というコードがあったのですが、MyAllocatorが複雑でなにをやってるのか
なかなか分かりません。一般的にset::set()で独自アロケータを指定する場合というのは
どういうことがやりたい場合でしょうか?
0216デフォルトの名無しさん
2010/12/08(水) 08:34:120217デフォルトの名無しさん
2010/12/08(水) 09:11:05それ以外ないですよね。
0218デフォルトの名無しさん
2010/12/08(水) 09:23:15boost::boolのドキュメントでも読め
日本語版は少しバージョンが古いがここにある
http://boost.cppll.jp/HEAD/libs/pool/doc/index.html
0219デフォルトの名無しさん
2010/12/08(水) 13:21:18(引数に意味はない) 場合はどのような型(値)の引数を指定したら
いいんでしょうか。
なにかお作法みたいなのはありますか?
0220デフォルトの名無しさん
2010/12/08(水) 13:24:120221デフォルトの名無しさん
2010/12/08(水) 14:15:310222デフォルトの名無しさん
2010/12/08(水) 14:24:270223デフォルトの名無しさん
2010/12/08(水) 20:57:180224デフォルトの名無しさん
2010/12/08(水) 21:24:080225デフォルトの名無しさん
2010/12/08(水) 21:36:47にゅ〜にゅ〜
0226デフォルトの名無しさん
2010/12/08(水) 21:42:130227デフォルトの名無しさん
2010/12/08(水) 21:44:07使用だけなら、時間は同じ。
0228デフォルトの名無しさん
2010/12/08(水) 21:48:31たぶん少し速いかもしれん。
0229デフォルトの名無しさん
2010/12/08(水) 22:37:56いずれにしろ、誤差だ誤差。
0230デフォルトの名無しさん
2010/12/09(木) 07:15:24わかる
ズレてるよね
こんなところでバグらねーよボケがって思うわ
糞MS、str〜系の関数全部エラー出しやがってマジで馬鹿じゃないの?
お前、これの何が危険なんだと
サイズ指定してないから危険?は?
こんなところでバグなんてでやしねぇよ
ちょっとはプログラム組んだことある奴社内にいねーの?
すげー、チンカスども余計なもんいれんなお前等の「安全」とかちっとも役に立たないんだわ
0231デフォルトの名無しさん
2010/12/09(木) 07:55:450232デフォルトの名無しさん
2010/12/09(木) 12:31:53for(size_t i=0;<v.size();i++)
じゃだめなの?
0233デフォルトの名無しさん
2010/12/09(木) 12:51:05警告が出るよ
「符号付き値と符号無し値の比較」みたいな
0234デフォルトの名無しさん
2010/12/09(木) 12:57:42size_tだから大丈夫じゃね
0235デフォルトの名無しさん
2010/12/09(木) 13:05:100236デフォルトの名無しさん
2010/12/09(木) 13:11:03規格を見てないけどsize_tは大抵unsigned longなんだぜ
0237デフォルトの名無しさん
2010/12/09(木) 13:11:540238デフォルトの名無しさん
2010/12/09(木) 13:11:56タイプ量が少なくて楽だから
0239デフォルトの名無しさん
2010/12/09(木) 19:54:44使用できるメモリは4ギガまでなのでしょうか?
0240デフォルトの名無しさん
2010/12/09(木) 20:30:190241デフォルトの名無しさん
2010/12/09(木) 21:38:240242デフォルトの名無しさん
2010/12/09(木) 21:39:590243デフォルトの名無しさん
2010/12/09(木) 21:49:10iを使って計算するときに楽だからじゃないか
負数と足すとき大概はキャストの必要があるし
0244デフォルトの名無しさん
2010/12/10(金) 01:19:39size_tが64ビットの場合もあるので、size_tでループを回すと効率が落ちる場合もある。
0245デフォルトの名無しさん
2010/12/10(金) 01:40:37どの処理系で効率が落ちると?
0246デフォルトの名無しさん
2010/12/10(金) 03:04:26きちんとした説明をしてもらおうか。
0247デフォルトの名無しさん
2010/12/10(金) 09:38:23x86_64とかREXプレフィックス等でコードがでかくなって遅くなりそう。
問題になるほどの差があるかどうかはともかく。
0248デフォルトの名無しさん
2010/12/10(金) 11:00:57へー 64bit Windows持ってないから試せないな
誰かどっちの方が効率いいか実測してくれ
0249デフォルトの名無しさん
2010/12/10(金) 11:09:360250デフォルトの名無しさん
2010/12/10(金) 12:00:26プリフィックスが付く事で遅くなる事はないとIntelは言ってる
ただコードが膨れた分キャッシュ効率は間違いなく低下するだろうけど
だからあんな巨大なL2キャッシュを積んだんじゃね?
0251デフォルトの名無しさん
2010/12/10(金) 20:52:39コードめちゃ綺麗になるわ
0252デフォルトの名無しさん
2010/12/10(金) 23:14:47Cの簡潔さが欲しくなるよ。
0253デフォルトの名無しさん
2010/12/10(金) 23:18:520254デフォルトの名無しさん
2010/12/10(金) 23:48:58{
int i = ・・・
}
って書いたら気味悪がられたことある
これだからC使いは嫌いだよ
0255デフォルトの名無しさん
2010/12/11(土) 00:21:56int i, j, k, ...;
char *p, *q, ...;
ってな感じで
無理にスコープ狭めても醜いし、もうCだしいっかと割り切ることにした
0256デフォルトの名無しさん
2010/12/11(土) 22:26:57もう少し大人になりなさい
0257デフォルトの名無しさん
2010/12/12(日) 01:38:22C使いです。タスタスも少し出来ます。
なんでこれで気味悪がれるの?
なかなかの上級テクだと思うが。
0258デフォルトの名無しさん
2010/12/12(日) 10:01:15上級テクどころか、普通のTIPSだろ。
それを気味悪いだとか言うような奴に限って300行もあるような関数の先頭で変数を宣言したがる。
おまけに、ポインタ変数に整数値を入れてフラグ代わりにするような使い回しも厭わない。
要は感性が違うのだと諦めて、適当にあしらうしかないね。
0259デフォルトの名無しさん
2010/12/12(日) 12:09:350260デフォルトの名無しさん
2010/12/12(日) 12:23:31あんまり酷くなるならスコープ切るより関数分けることを考えるべきでしょ
0261デフォルトの名無しさん
2010/12/12(日) 12:45:49古いfortranの感覚だと、関数なんて使ってんじゃねーよ馬鹿みたいに言われてたとか聞いたし
0262デフォルトの名無しさん
2010/12/12(日) 13:18:47イベントハンドラにコピペコピペで長い処理書いてるおっさんから
「お前のコードはあちこち飛んで分かりにくい」って苦情を言われた
ことがある。
0263デフォルトの名無しさん
2010/12/12(日) 13:36:46俺最近使ったw
ループ一気脱出には便利よね。
0264デフォルトの名無しさん
2010/12/12(日) 13:40:410265デフォルトの名無しさん
2010/12/12(日) 13:41:290266デフォルトの名無しさん
2010/12/12(日) 15:37:570267デフォルトの名無しさん
2010/12/12(日) 17:20:04int *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;
...;
}
こうしたほうが綺麗だよね
やっぱ使い道見えてこんわ
0268デフォルトの名無しさん
2010/12/12(日) 17:23:270269デフォルトの名無しさん
2010/12/12(日) 17:47:22その例で言えば、メモリ確保を集約できるならそれでもいいけどね。
0270デフォルトの名無しさん
2010/12/12(日) 17:59:48の例はあまり綺麗じゃないぞ。
おれなら、リソースのポインターやハンドラーNOに正常オープンの情報が入って。
ポインターならNULL以外。 ハンドラなら-1以外。
解放時にその情報を見て解放している。
これなら、何時終わろうが何処で終了処理されようが問題なく解放できる。
gotoラベルも気にする必要がない。
0271デフォルトの名無しさん
2010/12/12(日) 18:41:31int 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;
}
0272デフォルトの名無しさん
2010/12/12(日) 19:44:21break が関数でネストレベルがパラメータにあればいいのかもね。
0273デフォルトの名無しさん
2010/12/12(日) 19:47:010274デフォルトの名無しさん
2010/12/12(日) 19:47:550275デフォルトの名無しさん
2010/12/12(日) 19:48:360276デフォルトの名無しさん
2010/12/12(日) 19:50:180277デフォルトの名無しさん
2010/12/12(日) 19:51:58switch(〜) {
}
0278デフォルトの名無しさん
2010/12/12(日) 19:52:37このswitchでfor脱出したいときとかないの?
0279デフォルトの名無しさん
2010/12/12(日) 20:01:080280デフォルトの名無しさん
2010/12/12(日) 20:03:220281デフォルトの名無しさん
2010/12/12(日) 20:09:490282デフォルトの名無しさん
2010/12/12(日) 20:16:300283デフォルトの名無しさん
2010/12/12(日) 20:21:31許す許さないの問題じゃない。ただ単にポリシーの問題だ。
使いたければ使うがいい。ただな、ループを抜けたいだけの理由でgoto
使えば、当然飛び先を変えて処理をしたいと思うのが人間、普通にそう思うだろう。
それがいやなんだよ。
0284デフォルトの名無しさん
2010/12/12(日) 20:26:210285デフォルトの名無しさん
2010/12/12(日) 21:05:24思わん。
>>284
それで読みやすいプログラムになるならそうするさ。
0286デフォルトの名無しさん
2010/12/12(日) 21:08:250287デフォルトの名無しさん
2010/12/12(日) 21:10:300288デフォルトの名無しさん
2010/12/12(日) 21:39:300289デフォルトの名無しさん
2010/12/12(日) 23:24:070290デフォルトの名無しさん
2010/12/12(日) 23:25:450291デフォルトの名無しさん
2010/12/13(月) 01:14:31class hoge{
private:
int _data;
public:
hoge():_data(0){}
~hoge(){};
};
がいいいですか それとも
class hoge{
public:
hoge():_data(0){}
~hoge(){};
private:
int _data;
};
のほうが好きですか
privateが上にあるか下にあるか。
ま どっちでもいんですがw
0292デフォルトの名無しさん
2010/12/13(月) 01:18:590293デフォルトの名無しさん
2010/12/13(月) 01:21:47私は横着だから、
class hoge {
int data_;
public:
// construction
hoge() : data_(0) {}
~hoge() {};
// operation
int get() const {return data_;}
};
こんな感じになるかな。
0294デフォルトの名無しさん
2010/12/13(月) 01:39:42m_付きがいいのでしょうか。
0295デフォルトの名無しさん
2010/12/13(月) 02:01:02賛否両論ある話なので好きにしたらいいと思うよ
0296デフォルトの名無しさん
2010/12/13(月) 02:11:53理由、VC++のインテリセンスで下にまとまって便利だから
VC++stlもそうなってるし趣味プログラムだから許してちょ
0297デフォルトの名無しさん
2010/12/13(月) 02:19:10処理系予約の識別子記法で書いてるだけ。
もちろん、絶対に個人でしか扱わないものなら
どうしようと(それで将来不具合が出ようと)自由だけどね。
0298デフォルトの名無しさん
2010/12/13(月) 12:17:26_ で始める人もいる(ちょっと気持ち悪いけど)
なんとなく何かと衝突しそうで怖い
__ で始めるとヤバそうだけど一個なら安全なのかな
0299デフォルトの名無しさん
2010/12/13(月) 14:52:520300デフォルトの名無しさん
2010/12/13(月) 16:24:550301デフォルトの名無しさん
2010/12/13(月) 17:10:07名前空間に入れるなりクラスのメンバにするなりする分にはいい
0302デフォルトの名無しさん
2010/12/13(月) 17:10:53アンスコ2つで始まるのは標準ヘッダのマクロで使われてるかもしれないから問題あるが
アンスコ一つならグローバルとstd名前空間で予約されてるだけだから
問題無い。
0303デフォルトの名無しさん
2010/12/13(月) 17:20:500305デフォルトの名無しさん
2010/12/13(月) 17:53:040306デフォルトの名無しさん
2010/12/13(月) 17:54:40bool mAnko;
0307デフォルトの名無しさん
2010/12/13(月) 17:54:450308デフォルトの名無しさん
2010/12/13(月) 18:05:240309デフォルトの名無しさん
2010/12/13(月) 20:06:280310デフォルトの名無しさん
2010/12/13(月) 20:20:40先頭に_が付いてるってことで触って欲しくないとアピールできる。
0311デフォルトの名無しさん
2010/12/13(月) 20:44:42ヘッダの2重読み込み禁止のdefineの記述はちょっと悩まない?
多分ぶつからんとは思うけどぉって。
VCだと適当に付けてくれるんだけどね。
#ifndef __HOGE_H__
#define __HOGE_H__
・・・
#endif
0312デフォルトの名無しさん
2010/12/13(月) 20:50:12これでおk
衝突したこと一度も無い
0313デフォルトの名無しさん
2010/12/13(月) 21:04:01他の処理系でもサポートしてくれれば・・・
0314デフォルトの名無しさん
2010/12/13(月) 21:08:22邪魔かもしれんけど、プログラムリストが一目で、ローカル変数と区別が付くのがいい
0315デフォルトの名無しさん
2010/12/13(月) 21:23:08アンスコ二つを含む名前はコンパイラ以外が使っちゃいかん。
ぶつからないよう氏名生年月日を入れるのがマジオススメ
#define _山田太郎_19801231_プロジェクトA_TEST_H_
0316デフォルトの名無しさん
2010/12/13(月) 21:23:32実装書くときに変数を省略形にするから被ることないし
0317デフォルトの名無しさん
2010/12/13(月) 21:37:39てか作成時の時間を入れておけば大丈夫だよね
0318デフォルトの名無しさん
2010/12/13(月) 22:05:33作成時間命名規則、又は、作者名命名規則かw
0319デフォルトの名無しさん
2010/12/13(月) 22:48:09こんなのよく考えるなぁーって思うときが多くて、、、
0320デフォルトの名無しさん
2010/12/13(月) 22:57:05まあでも著作権はいろいろ難しいから業務だったら詳しい人に聞いたほうがいいよ
0321デフォルトの名無しさん
2010/12/14(火) 09:38:28doubleだと桁が足りませんよね…こまった
0322デフォルトの名無しさん
2010/12/14(火) 09:58:580323デフォルトの名無しさん
2010/12/14(火) 15:56:190324デフォルトの名無しさん
2010/12/14(火) 15:57:510325デフォルトの名無しさん
2010/12/14(火) 16:04:340326デフォルトの名無しさん
2010/12/14(火) 17:05:350327デフォルトの名無しさん
2010/12/14(火) 17:16:33そもそもヘッダが sys/***.h だったりするし。
そんときはやっぱgccでコンパイルしてextern C でリンクするしかないんかな。
みなさんはどうやってます?
0328デフォルトの名無しさん
2010/12/14(火) 17:26:25C++からでも普通に使える。
0329デフォルトの名無しさん
2010/12/14(火) 18:32:020330デフォルトの名無しさん
2010/12/14(火) 19:35:59�@sys/***.hをインクルードする
�Aそのまま使うコードを書く
�B-lpthreadでリンク
gccコンパイルもextern "C"も要らない。
0331デフォルトの名無しさん
2010/12/14(火) 21:49:05「__int64」ってことはVisual C++かな。/clrオプションでDecimal型使うのが楽。
0332デフォルトの名無しさん
2010/12/15(水) 01:42:26それはわかるんだけど、cstdlib とか cstring とか
namespace std じゃん。
でもそういうヘッダがない システムコール系は グロバル空間じゃん。
そういうのが作法として気になってるだけなんです。
気にしなくていいってならそれしかないんですけどぉ。。
0333デフォルトの名無しさん
2010/12/15(水) 02:02:490334デフォルトの名無しさん
2010/12/15(水) 02:48:09へへぇ 恐れ入ります。
それしかないならそうですね。
ありがとうございました。
またACEでもやるかw
0335デフォルトの名無しさん
2010/12/15(水) 07:21:08C++リンケージのシンボルは名前空間で名前を整理する。
Cリンケージのシンボルは全てがグローバル扱い。
CのモノとリンクするんだからCのやり方に従うのが筋。
C関数を呼び出す変なラッパーをC++で作るのだけはマジ勘弁。
0336デフォルトの名無しさん
2010/12/15(水) 23:11:35>みなさんはどうやってます?
まず言語の選択を間違えている。マルチスレッドでソケット通信するだけなら
Javaの方が10倍マシ。C++でやるメリットなど無い。
無駄なことにエネルギー使うのはやめた方がいい。
0337デフォルトの名無しさん
2010/12/15(水) 23:55:100338デフォルトの名無しさん
2010/12/15(水) 23:55:16C++でソケット使う場合どうするの?
0339デフォルトの名無しさん
2010/12/15(水) 23:56:51Javaは遅いし怪しいし気持ちわるいし
なにより出来ませんw 結局これ。
0340デフォルトの名無しさん
2010/12/15(水) 23:59:25C++でできなかったらJavaでどうやんの?
ソケットどころかJavaの処理系すら存在しない世界になるよ?
0341デフォルトの名無しさん
2010/12/16(木) 03:14:180342デフォルトの名無しさん
2010/12/16(木) 07:25:35まさか、アプリケーションレイヤーで直接ソケットを操作するわけじゃなし。
0343デフォルトの名無しさん
2010/12/16(木) 19:05:18{
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()から抜けるときに自分自身を削除することになってしまうわけですが
この設計を実現するためにはどうしたらいいでしょうか?
0344デフォルトの名無しさん
2010/12/16(木) 20:02:31auto_ptr<A> a(new A);
unko.SetA(a.get());
a.release();
0345デフォルトの名無しさん
2010/12/16(木) 21:21:34>b.SetA( shared_ptr<A>(this)
shared_ptrをテンポラリで使ったらすぐにdeleteが走るに決まってるだろ。
shared_ptr使ってるのをやめればいいんじゃね?
0346デフォルトの名無しさん
2010/12/16(木) 21:43:020347デフォルトの名無しさん
2010/12/16(木) 21:43:110348デフォルトの名無しさん
2010/12/16(木) 22:11:210349デフォルトの名無しさん
2010/12/16(木) 23:10:0664ビット整数という保証はないけど
0350デフォルトの名無しさん
2010/12/16(木) 23:12:34§5.2.4.2.1
? minimum value for an object of type long long int
LLONG_MIN -9223372036854775807 // -(2^63 - 1)
0351デフォルトの名無しさん
2010/12/16(木) 23:14:23LLONG_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が推奨
0352デフォルトの名無しさん
2010/12/16(木) 23:16:23ありがとうございます。感謝です。
0353デフォルトの名無しさん
2010/12/16(木) 23:17:57さらに詳しく解説感謝しますっ
0354デフォルトの名無しさん
2010/12/16(木) 23:41:41こんな感じ?
http://ideone.com/XsMpb
0355デフォルトの名無しさん
2010/12/16(木) 23:56:33それともgccじゃないとだめなんでしょうか?
0356デフォルトの名無しさん
2010/12/17(金) 00:05:040357デフォルトの名無しさん
2010/12/17(金) 00:13:10using namespace std;
int main(){
char b=-1;
cout << b <<endl;
return 0;
}
これを実行すると -1 って表示されないんですけどぉ。なんでぇ。
何か忘れてます?
gcc 4.1.2 CentOS5.5
0358デフォルトの名無しさん
2010/12/17(金) 00:15:070359デフォルトの名無しさん
2010/12/17(金) 00:30:11それはやったんですけど、どうしてcharだとだめなのかなぁと。
0360デフォルトの名無しさん
2010/12/17(金) 00:35:00cout << b <<endl;
で97とか表示されても困るだろうが
0361デフォルトの名無しさん
2010/12/17(金) 00:49:310362デフォルトの名無しさん
2010/12/17(金) 00:50:31横レスしつれいするけどenable_shared_from_thisってコンストラクタで渡せなかったり
自身が必ずshared_ptrの管理下に無いとダメみたいだけど上手く回避する方法はないかな・・・?
0363デフォルトの名無しさん
2010/12/17(金) 08:25:250364デフォルトの名無しさん
2010/12/17(金) 21:24:07例えばこういうポインターです。
Foo* foo = (Foo*)0x12345689;
どうしても必要なのですが何とかなりませんか。
0365デフォルトの名無しさん
2010/12/17(金) 21:35:450366デフォルトの名無しさん
2010/12/17(金) 21:41:170367デフォルトの名無しさん
2010/12/17(金) 21:44:38不正なポインターでしょw。例外的な物ならすぐ分かるからw
0368364
2010/12/17(金) 21:45:00ポインターの指す先が有効なオブジェクトなのか、未定義なのかを判別しないといけないのです。
0369デフォルトの名無しさん
2010/12/17(金) 21:45:490370デフォルトの名無しさん
2010/12/17(金) 21:50:130371デフォルトの名無しさん
2010/12/17(金) 21:50:560372デフォルトの名無しさん
2010/12/17(金) 21:52:370373364
2010/12/17(金) 22:01:15有難うございました。
0374デフォルトの名無しさん
2010/12/17(金) 22:03:45自分はポインタはNULLで初期化してDeleteしたり使わなくなったらNULL代入しておくようにしておくんだが
0375デフォルトの名無しさん
2010/12/17(金) 22:12:37Class().func();
とすると使えてしまいますが、このテクニックはよくつかわれるのでしょうか?
0376デフォルトの名無しさん
2010/12/17(金) 22:16:30有効なオブジェクトのリストを持っておくのはデバッグ中はまれによくやるぞ
(どっちかというと解放漏れチェックのためにだが)
0377デフォルトの名無しさん
2010/12/17(金) 22:17:310378デフォルトの名無しさん
2010/12/17(金) 22:17:390379デフォルトの名無しさん
2010/12/17(金) 22:20:41何かがオーバーランしてポインター潰したとか。
ポインター演算又は配列の添え字間違えたとか。
色々あるよ
0380デフォルトの名無しさん
2010/12/17(金) 22:35:480381デフォルトの名無しさん
2010/12/17(金) 23:19:15deleteしたらnullを代入が作法かと。
ポインタ先が本物か偽者かを判定するなんてわかんのかい?
0382デフォルトの名無しさん
2010/12/17(金) 23:24:290383デフォルトの名無しさん
2010/12/17(金) 23:33:360384デフォルトの名無しさん
2010/12/17(金) 23:55:20やってる人おるん?
そんなにポインタって危ないもん?
ポインタの使い方しらんかちゃんとモドリチみてないか
単にめちゃくちゃなプログラムなのでわ? とw
0385デフォルトの名無しさん
2010/12/18(土) 01:37:53最近、これを忘れてえらいめにあいました。
NULL 代入忘れを検出する方法を思案中。
0386デフォルトの名無しさん
2010/12/18(土) 02:01:400387デフォルトの名無しさん
2010/12/18(土) 03:33:43必ずマクロ(もしくはテンプレート)経由でdeleteするとかでだいたい防げるんじゃね?
まぁNULL初期化を忘れそうだけど
0388デフォルトの名無しさん
2010/12/18(土) 04:33:21自分できちんと管理できない馬鹿は大人しくJava使えばいいんだよ。
あ、C#でもいいか。
0389デフォルトの名無しさん
2010/12/18(土) 05:55:220390デフォルトの名無しさん
2010/12/18(土) 06:00:460391デフォルトの名無しさん
2010/12/18(土) 10:58:59「ロベールの入門講座」を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば動きます)
http://codepad.org/0i4ByGfl
が自分の書いたソースです。
私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?
0392デフォルトの名無しさん
2010/12/18(土) 11:03:110393391
2010/12/18(土) 11:25:06absoluteの略で私は「abs」と勝手に略していたのですが、
偶然にも数学関数の中ですでに定義されていた型のようで、そこでエラーが出ていたみたいです。
「Abs」と最初を大文字にしてやると無事オーバーロード出来ました。
0394デフォルトの名無しさん
2010/12/18(土) 11:27:14知らない間に誰かがcmathあたりをインクルードしてる。
0395デフォルトの名無しさん
2010/12/18(土) 12:19:09スマポ使えって結論が出てる脇でヌル代入するテンプレート自作とか
マヌケな話が続く意味がわからない。
0396デフォルトの名無しさん
2010/12/18(土) 13:03:43ソースでのお作法だろ。
方向性があさってすぎる。
0397デフォルトの名無しさん
2010/12/18(土) 13:29:300398デフォルトの名無しさん
2010/12/18(土) 13:50:28void 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をいれときましょうねってこと
0399デフォルトの名無しさん
2010/12/18(土) 13:52:040400デフォルトの名無しさん
2010/12/18(土) 13:54:59未初期化変数の値を使っているのが問題なのであって、
ヌルを代入したからって何も問題は解決しないだろうが。
0401デフォルトの名無しさん
2010/12/18(土) 13:57:060402デフォルトの名無しさん
2010/12/18(土) 14:02:20それはたとえば auto_ptr ごときと比べても何かメリットがあるのかというレベル。
0403デフォルトの名無しさん
2010/12/18(土) 14:23:560404デフォルトの名無しさん
2010/12/18(土) 14:25:26だからただのセーフティだよ
初期化だってひょっとすると忘れるかもしれないだろ
忘れてんのにそれっぽく動かれるのと、NULLアクセスで一発で落ちるのと
バグ消ししてる時にどっちがありがたいかって話だよ
0405デフォルトの名無しさん
2010/12/18(土) 14:26:18これ使った攻撃方法もあるのでセキュリティには注意しましょうね
0406デフォルトの名無しさん
2010/12/18(土) 14:28:34{
return X;
}
void SetX( int _X )
{
X = _X;
}
メンバ変数の代入はこんな感じの関数でおk?
もっとスマートな書き方ある?
0407デフォルトの名無しさん
2010/12/18(土) 14:28:44こういう単純な未初期化は警告でるな。
0408デフォルトの名無しさん
2010/12/18(土) 14:33:23っていうのに備えて、へんな書き方主張する流れになるな。
0409デフォルトの名無しさん
2010/12/18(土) 14:34:510410デフォルトの名無しさん
2010/12/18(土) 14:36:010411デフォルトの名無しさん
2010/12/18(土) 14:43:09unique_ptrが最初からstlに入ってればもっと住みやすい世界になっていたのに
だれだよauto_ptrとか作ったバカは切腹しろや
0412デフォルトの名無しさん
2010/12/18(土) 14:48:00可搬性の広さとオーバーヘッドの小ささでは数あるスマポの中でも最強だろう。
0413デフォルトの名無しさん
2010/12/18(土) 14:51:46ていう感じだったしな
0414デフォルトの名無しさん
2010/12/18(土) 14:55:020415デフォルトの名無しさん
2010/12/18(土) 16:46:020416デフォルトの名無しさん
2010/12/18(土) 16:56:48マルチバイト文字の関数を使ってもエラーは出ませんが、
これは非推奨ですか?
0417デフォルトの名無しさん
2010/12/18(土) 17:02:230418デフォルトの名無しさん
2010/12/18(土) 17:03:43ありがとうございます
0419デフォルトの名無しさん
2010/12/18(土) 17:30:391>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5):
warning MSB8004: Output ディレクトリの末尾がスラッシュではありません。
Output ディレクトリが適切に評価されるようにするために、このビルド インスタンスによってスラッシュが追加されます。
どうすれば出なくなりますか?
0420デフォルトの名無しさん
2010/12/18(土) 17:46:37Outputの設定が悪いんだろ
0421デフォルトの名無しさん
2010/12/18(土) 17:55:230422デフォルトの名無しさん
2010/12/18(土) 17:56:37何年までに移行せよみたいな
0423デフォルトの名無しさん
2010/12/18(土) 18:36:45unicodeすらアレなのに
0424デフォルトの名無しさん
2010/12/19(日) 14:10:16便利なんですが、設計が悪いのを誤魔化してるんじゃないかという気になってきて・・・
0425デフォルトの名無しさん
2010/12/19(日) 14:12:120426デフォルトの名無しさん
2010/12/19(日) 14:25:15オブザーバーとか相互参照してるパターンでfriend使うことが多いかな(毎回使うわけでもないが)
後付とか全然関係ないクラス間でfriend使うのがだめなんだよ
0427デフォルトの名無しさん
2010/12/19(日) 16:24:300428デフォルトの名無しさん
2010/12/19(日) 17:03:02そうなる前になんとかしないとね。
0429デフォルトの名無しさん
2010/12/19(日) 22:12:30ファクトリクラスを通してしかオブジェクトを生成できないようにしたりとか
そういう使い方もある
0430デフォルトの名無しさん
2010/12/19(日) 22:50:39public:
class Factory;
private:
/* CTORS */
};
class Hoge::Factory {
public:
/* CREATEMETHOD */
};
でいいじゃんfriendとかダサいよ
0431デフォルトの名無しさん
2010/12/20(月) 22:44:10外見はwindowsのテキストツールで下に読み上げボタンが付いているようなものです。
0432デフォルトの名無しさん
2010/12/20(月) 22:47:340433デフォルトの名無しさん
2010/12/20(月) 23:09:14C#あたりの方が触りやすい気がする
0434デフォルトの名無しさん
2010/12/20(月) 23:11:020435デフォルトの名無しさん
2010/12/20(月) 23:13:560436デフォルトの名無しさん
2010/12/20(月) 23:14:33ライブラリの挙動を理解してて適切にチューンできるならともかく動くコードがかけるレベルだとどんな感じ?
0437デフォルトの名無しさん
2010/12/20(月) 23:18:23動くコードが書けるレベルっていうなら
むしろヘタに自力で実装するより素直に使ったほうが速いと思われる
0438デフォルトの名無しさん
2010/12/20(月) 23:20:080439デフォルトの名無しさん
2010/12/20(月) 23:20:39遅かったらそこだけ直せば十分
0440デフォルトの名無しさん
2010/12/20(月) 23:25:31またぞろ、プログラマーなら分かった当たり前と主張するのかw
0441デフォルトの名無しさん
2010/12/20(月) 23:25:41つか、その程度のレベルだと速度云々より安全性が気になるから素直にライブラリ使わせたほうがいいと思う
0442デフォルトの名無しさん
2010/12/20(月) 23:26:39知人にライブラリなんて重くなるから使わんよ、とCライクにコード書くのがいたのでそんなに変わるのか気になったんだ
0443デフォルトの名無しさん
2010/12/20(月) 23:29:590444デフォルトの名無しさん
2010/12/20(月) 23:31:17一つ一つは大したこと無いけど積もり積もって遅くなるかんじ
0445デフォルトの名無しさん
2010/12/20(月) 23:33:35積もり積もるところを探し出して直す
0446デフォルトの名無しさん
2010/12/20(月) 23:33:45boostでやってることをそのままCで再現してかつ速くするにはそれなりの技術がいる
コンパイル時計算のことも考えるとCでは追いつけない場合だって有る
0447デフォルトの名無しさん
2010/12/20(月) 23:35:100448デフォルトの名無しさん
2010/12/20(月) 23:36:180449デフォルトの名無しさん
2010/12/20(月) 23:39:000450デフォルトの名無しさん
2010/12/21(火) 14:43:49普通に書くとどう非効率になるの?具体例出してくれない?
変な書き方しなければ boost 使ったからって有意な差が出る程
遅くなる事はまずないと思うんだが
0451デフォルトの名無しさん
2010/12/21(火) 15:15:500452デフォルトの名無しさん
2010/12/21(火) 15:17:270453デフォルトの名無しさん
2010/12/21(火) 18:25:34他の人のコードを写して,今度はエラーがわからないだろうね
0454デフォルトの名無しさん
2010/12/22(水) 00:13:32なんとかならんか。 ならんだろうなぁ。
結局 実行時に型が決まるからプリコンパイルは出来ないんだよね。
ってエピステメさんとどっかやりとりした記憶が。
人違いだったらごめんなさい。
あ そうそう boost/asio って動いてます?
うちのCentOSにソスから入れてビルドしたら
コンパイルでほげほげなエラーがw
0455デフォルトの名無しさん
2010/12/22(水) 00:32:580456デフォルトの名無しさん
2010/12/22(水) 05:17:34boostのソースをダウンロードして 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は正しく動いてますでしょうか。
0457デフォルトの名無しさん
2010/12/22(水) 08:06:22頭使えよお前ら
このインターネット時代に全然上級者向きとは言えない
0458デフォルトの名無しさん
2010/12/22(水) 08:23:02A.ちったあ頭使えや
0459デフォルトの名無しさん
2010/12/22(水) 11:21:06コーディングしてるの? template 関係のエラーを貼り付けて
スレに書き込めってかなり無理があるなぁ
肝心な数行だけなら良いとしてもそれがわかるなら元々悩まんだろうし
0460デフォルトの名無しさん
2010/12/22(水) 11:37:030461デフォルトの名無しさん
2010/12/22(水) 12:27:170462456
2010/12/22(水) 12:28:49皆さんが使えてるのであれが使い方がヘボいという事で。
0463デフォルトの名無しさん
2010/12/22(水) 13:24:530464デフォルトの名無しさん
2010/12/22(水) 13:27:07俺が見てるのがgccの奴だからだろうか
0465デフォルトの名無しさん
2010/12/22(水) 13:28:120466デフォルトの名無しさん
2010/12/22(水) 16:54:210467デフォルトの名無しさん
2010/12/23(木) 02:52:34タプルのほうが簡潔でよいと思うのですが
0468デフォルトの名無しさん
2010/12/23(木) 02:55:030469デフォルトの名無しさん
2010/12/23(木) 03:01:39あ、たしかにそうですね
0470デフォルトの名無しさん
2010/12/23(木) 04:25:06という検索で、実際にはもう少し範囲が狭められるのが分かっているので
binary_search(vec[idx],vec.end(),xxx);
とやりたいです。(idxは動的に決まる)
どうすればよいでしょうか?
0471デフォルトの名無しさん
2010/12/23(木) 04:29:590472デフォルトの名無しさん
2010/12/23(木) 08:03:43動きました。ありがとうございました。
0473デフォルトの名無しさん
2010/12/23(木) 08:58:520474デフォルトの名無しさん
2010/12/23(木) 12:09:070475デフォルトの名無しさん
2010/12/23(木) 14:08:500476デフォルトの名無しさん
2010/12/23(木) 14:12:360477デフォルトの名無しさん
2010/12/23(木) 16:45:29http://ideone.com/7cFfD
0478デフォルトの名無しさん
2010/12/27(月) 11:42:340479デフォルトの名無しさん
2010/12/27(月) 12:30:59とりあえず使ってみて。わかんなかったらソースを添えて相談しよう。
0480デフォルトの名無しさん
2010/12/27(月) 14:43:050481デフォルトの名無しさん
2010/12/27(月) 14:49:420482デフォルトの名無しさん
2010/12/28(火) 18:49:30Hoge::Hoge(int no) : no(no){}
0483デフォルトの名無しさん
2010/12/28(火) 18:51:370484デフォルトの名無しさん
2010/12/28(火) 19:12:41ども
0485デフォルトの名無しさん
2011/01/07(金) 21:47:27の順番で2+32+4=38byteを書きこんだバイナリファイルがあります.
C++標準ライブラリを使って,このファイルを読み込み,
short score; std::string name; long rank;
にそれぞれ格納する(特にstd::string name)にはどのようなコードを書いたらいいでしょうか?
よろしくお願いします.
0486デフォルトの名無しさん
2011/01/07(金) 21:50:060487デフォルトの名無しさん
2011/01/07(金) 22:07:19仕様を明確化してください。
0488デフォルトの名無しさん
2011/01/07(金) 22:16:45適当にかくならこんなかんじだろうか
ttp://codepad.org/VaLUJpY7
0490デフォルトの名無しさん
2011/01/07(金) 22:20:500491デフォルトの名無しさん
2011/01/07(金) 23:27:39std::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);
0492デフォルトの名無しさん
2011/01/07(金) 23:30:24異なるエンディアンの場合を吸収する必要がないのなら、
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);
がお手軽ではないでしょうか。
0494デフォルトの名無しさん
2011/01/08(土) 13:46:15OS: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;
}
0495デフォルトの名無しさん
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 が未解決です。
環境設定で足りない部分があるのか、あるいはソースが間違っているのか・・・。
誰かご教授ください。
0496デフォルトの名無しさん
2011/01/08(土) 13:49:140497デフォルトの名無しさん
2011/01/08(土) 13:51:16ttp://blog.livedoor.jp/akf0/archives/51595459.html
> 1. リンカにLIBファイルを追加する。
0498デフォルトの名無しさん
2011/01/08(土) 14:41:11返信ありがとうございます。
さっそく試して見た所ビルドは通る様になりました。
しかし立ち上がりの歳にpthreadVC2.dllが無いとメッセージが出ます。
自分の使用環境はVisualStadio6.0、サンプルはVisual Studio 2008との差はありますが
この設定で問題ないでしょうか。
申し訳ありませんが再度ご教授お願いします。
http://uproda.2ch-library.com/330968Mek/lib330968.jpg
http://uproda.2ch-library.com/330966FI0/lib330966.jpg
http://uproda.2ch-library.com/330967o7w/lib330967.jpg
0499デフォルトの名無しさん
2011/01/08(土) 15:12:38> …「C:\Program Files\Microsoft Visual Studio 9.0\VC\bin」
0501デフォルトの名無しさん
2011/01/08(土) 16:05:12ありがとうございます。
Include----*.h
bin--------*.dll
lib--------*.lib
で分け直しましたがやはり同じエラー(pthreadVC2.dllが見つからない)が出ています。
あれから色々弄ってますが、実行させるとdllが見つからないと言われてます
0502デフォルトの名無しさん
2011/01/08(土) 16:22:17プロジェクトと同じ階層フォルダに件のdllを置いたら上手く動作しました。
ありがとうございます。
これって起動時にDLLファイルを動的にリンクしてるって事ですよね。
期待動作としては、EXEファイル単体で動く様にしたかったんですが(コンパイル時にDLLファイルをリンクして欲しかった)
そう言う事は無理なのでしょうか?
0503デフォルトの名無しさん
2011/01/08(土) 16:31:58例えばAAAという名前空間のHogeを前方宣言しようとしてヘッダーに
class AAA::Hoge と書くと'AAA' has not been declared.と出ます。
0504デフォルトの名無しさん
2011/01/08(土) 16:39:20オープンソースだということだから、ソースコードが(探せばどこかに)あるだろう
それをプロジェクトに含めて一緒にコンパイルしてしまえばいいのではないか
ライセンスには注意すること
0505デフォルトの名無しさん
2011/01/08(土) 16:40:52namespace AAA {
class Hoge;
}
0507デフォルトの名無しさん
2011/01/08(土) 17:10:260508デフォルトの名無しさん
2011/01/08(土) 17:56:19書くまでもないってことだ言わせんな恥ずかしい
0509デフォルトの名無しさん
2011/01/09(日) 11:28:15誰も使ってる人がいないしぐぐっても出てこないのですが
0510デフォルトの名無しさん
2011/01/09(日) 11:46:180511デフォルトの名無しさん
2011/01/09(日) 12:15:40前は順番変えたらいけたけど、今回はどう試しても通らない。どうすればいいの、誰が助けて
環境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 が未解決です。
0512デフォルトの名無しさん
2011/01/09(日) 12:31:25どのライブラリにどのヘッダが必要か位確認しろよ
0513デフォルトの名無しさん
2011/01/09(日) 12:34:27とりあえずコード晒せ、話はそれからだ。
0514デフォルトの名無しさん
2011/01/09(日) 12:53:41ヘッダファイル辿っていくだけ?そのライブラリのヘッダ大量にあって、キリがないんだけど。
色々試してたらこれだけで外部参照エラー出てることに気づいた。何で?
#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 スキップ ==========
0515デフォルトの名無しさん
2011/01/09(日) 14:05:44>ライブリにどのヘッダが必要かってどうやってみるの?
>ヘッダファイル辿っていくだけ?そのライブラリのヘッダ大量にあって、キリがないんだけど。
普通はドキュメントに書いてある。
プロジェクトのプロパティのところから「C/C++」→「コマンドライン」と、「リンカー」→「コマンドライン」コピペするとどうなる?
0516デフォルトの名無しさん
2011/01/09(日) 16:36:07共通プロパティのVC++ディレクトリのライブラリディレクトリに一部被ってるライブラリを置いている
パスを設定してたからだった。何故今まではエラー出なかったのか分からないけど、今まではライブリ
そこまで探しに行かなくても全て見つかって有効になってなかったからとかなのかね。
>>515
ありがとう、ライブラリのドキュメントに書いてるのね。今度見てみる。
0517デフォルトの名無しさん
2011/01/11(火) 09:41:41書き込み対象ファイルは動作中常にオープンにしておく方が良いのか
書き込むタイミングで開閉したほうがいいのか
どちらが無難でしょうか?
0518デフォルトの名無しさん
2011/01/11(火) 09:47:05特にあけたままで問題ないと思われる
0519デフォルトの名無しさん
2011/01/11(火) 18:45:32struct 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;
}
}
0520デフォルトの名無しさん
2011/01/11(火) 19:05:47return array.at(idx);
}
範囲外ならout_of_range
0521デフォルトの名無しさん
2011/01/12(水) 12:11:36引数を取らないコンストラクタを持つクラスなど、
データを与えて初期化する必要がない場合でも、
初期化子で初期化した方がいいでしょうか?
0522デフォルトの名無しさん
2011/01/12(水) 12:21:150523デフォルトの名無しさん
2011/01/12(水) 12:22:42初期化と代入は異なる演算であるということを肝に銘じておいてください。
0524デフォルトの名無しさん
2011/01/12(水) 12:32:42A hoge(foo);
A hage = foo;
前者はコピーコンストラクタ A::A(const A&)
後者はデフォルトコンストラクタ A::A() 〜 代入 A::operator = (const A&)
だよな?
0525デフォルトの名無しさん
2011/01/12(水) 12:34:280526デフォルトの名無しさん
2011/01/12(水) 12:36:590527デフォルトの名無しさん
2011/01/12(水) 12:40:37ありがとうございます
0528デフォルトの名無しさん
2011/01/12(水) 16:34:12受け取り先でその参照は生きています。これはコピーされているんですか?
try {
std::exception e("auau");
throw e;
} catch(std::exception &e) {
std::cout << e.what() << std::endl;
}
また、tryブロックで作成したオブジェクトの、深い階層から例外を投げたときなど
catchブロックでreturnを書いても問題ありませんか?
(デストラクタが呼ばれてからcatchブロックへ移行しますか?)
0529デフォルトの名無しさん
2011/01/12(水) 16:43:51メモリには残ってるんじゃね?
0530デフォルトの名無しさん
2011/01/12(水) 19:35:09519です。ありがとうございます。
0531デフォルトの名無しさん
2011/01/12(水) 23:08:52>throw e;
この時点で一時オブジェクトが作成される。その生存期間の保障は
catchハンドラを再スロー以外で抜けるまで。
0532デフォルトの名無しさん
2011/01/13(木) 00:08:27ある計算をしてデータをファイルに書き出したいのです。
double loc1,loc2,loc3;
ofstream ofs("test.txt",ios::trunc);
while(条件){
計算など;
ofs << " " << loc1 << " " << loc2 << " " << loc3 << endl;
};
とすると、なんか書き出したファイルがぐちゃぐちゃになってしまいます。
右に揃えてきれいに整えて出力するにはどう記述すればいいのでしょうか?
0533デフォルトの名無しさん
2011/01/13(木) 00:54:27ofstream fout;
fout.open("text.txt",ios::out );
if(fout){
fout << "Hello World!!\n" ;
fout.close();
}else{
cout << "ファイルの書き込みオープンに失敗しました。" << endl;
}
の感じでどうでしょう。
0534デフォルトの名無しさん
2011/01/13(木) 01:07:12コピーコンストラクタやデストラクタにログを仕込んで実験してみるといいよ。
ただし、たまに特定の実装と規格とでずれがあるから、疑問があれば規格を
確認したほうがいいよ。
0535デフォルトの名無しさん
2011/01/13(木) 01:09:29右にそろえるだけならこう
たぶん正直見にくい結果になるだろうなあ
0536デフォルトの名無しさん
2011/01/13(木) 01:09:36http://www.google.co.jp/search?q=io+%E3%83%9E%E3%83%8B%E3%83%94%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF
0537532
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
としたいのです。ところが、これだと、揃っていなくてみにくい!
それぞれのデータについて、右揃えでみやすく表示するようなファイルへの書き込みをしたいのです。
0538デフォルトの名無しさん
2011/01/13(木) 01:20:18ありがとうございます。
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
こんな感じになりました。
最初の方は少しみやすくなりました。
後半は微妙ですが・・・
0539デフォルトの名無しさん
2011/01/13(木) 01:26:49ofs << setprecision(5) << setiosflags(ios::fixed) << setw(10) << loc1 << setw(10) << loc2 << setw(10) << loc3 << endl;
0540デフォルトの名無しさん
2011/01/13(木) 01:43:550.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
とてもいい感じになりました。
ありがとうございます!
0541デフォルトの名無しさん
2011/01/13(木) 07:29:31コピーコンストラクタは省略されるときがあるからなあ。
例外のthrowでもコピーコンストラクタが
呼び出されるかどうかは処理系の自由。
0542デフォルトの名無しさん
2011/01/13(木) 09:58:21ありがとうございました
0543デフォルトの名無しさん
2011/01/13(木) 18:15:46TCHARの文字列をカンマで分割したいです。
分割後の要素はそれぞれ可変長なんですが、
こういう場合はどうやって分割して、
分割後の要素を入れるバッファとかは
どう確保するのが普通なんでしょうか?
0544デフォルトの名無しさん
2011/01/13(木) 19:53:10でもTCHAR使ってるとコンパイラおぴっしょんごとに
どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。
APIでは正しく変換できるのになんでやねーん。
0545デフォルトの名無しさん
2011/01/13(木) 21:12:19>どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。
何を迷うのか不明だし、どこが正しく使えないのか説明きぼぅ。
>>543
vector<TCHAR>にpush_backして文字列を作っていけば?
最後にbasic_string<TCHAR>に変換。
0546デフォルトの名無しさん
2011/01/13(木) 21:18:28C++ならstringにプッシュしていけばいいね
Cでもカンマ分大きく取ったバッファ用意して、頭からコピーすればいい
0547デフォルトの名無しさん
2011/01/13(木) 21:29:00wchar_tでもUnicodeだったりUTF-8だったり、
単純にstringには入れられねーだろが。
0548デフォルトの名無しさん
2011/01/13(木) 21:34:24それとutf-8をそのままwchar_tに入れることってあるの?
0549デフォルトの名無しさん
2011/01/13(木) 21:38:21#define XXX "aaaa"
#define YYY XXX "bbbb"
↑こういったdefine文の意味がどうもわかりません
この場合コード中のYYYはどういった文字列で解釈されるんでしょうか?
0550デフォルトの名無しさん
2011/01/13(木) 21:43:470551デフォルトの名無しさん
2011/01/13(木) 21:43:5502
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の画面を出力したい
0552デフォルトの名無しさん
2011/01/13(木) 21:45:47それとutf-8をそのままwchar_tに入れることってあるの?
wchar_tはただの整数型なので入れても構わないが、
入れる奴は規格を読まないクレイジー。
0553デフォルトの名無しさん
2011/01/13(木) 21:47:16説明たりねーよ。エラーメッセージを正確に書け。
0554デフォルトの名無しさん
2011/01/13(木) 21:49:38error C2078: 初期化子の数が多すぎます。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
以上です。よろしくです。
初期化って事はreturnですよね?別に問題あるとは思えないんですが(-_-;
0555デフォルトの名無しさん
2011/01/13(木) 21:55:44× int SetGraphMode( 256 , 224 , 16 ) ;
○ SetGraphMode( 256 , 224 , 16 ) ;
他はわからん
0556デフォルトの名無しさん
2011/01/13(木) 21:55:570557553
2011/01/13(木) 21:57:07それ見てもわからんのか?
0558デフォルトの名無しさん
2011/01/13(木) 21:58:220559デフォルトの名無しさん
2011/01/13(木) 22:00:29わかった&でけた^w^
みんなありがとう!
0560デフォルトの名無しさん
2011/01/13(木) 22:01:27使い方をあんまり知らんかったのだw新参なもんで申し訳w
0562543
2011/01/13(木) 23:10:52>>545
>>546
言葉が足りなくてすみません。
カンマ入りの文字列を渡されるので、それを各要素に分割したいんです。
>vector<TCHAR>にpush_backして文字列を作っていけば?
>最後にbasic_string<TCHAR>に変換。
文字列の先頭から見ていってカンマじゃなければpush_backして
カンマが現れたらそこまでの長さ分バッファ確保して各要素に分ける
という意味ですか?
0563デフォルトの名無しさん
2011/01/13(木) 23:27:27「C++ split」でググればコードがでてくるよ。
あともうTCHARはやめてWCHARとかwchar_tきめうちでいいんじゃね。
0564543
2011/01/13(木) 23:37:18string を使用したsplitの例はググれば沢山コードがあるんですが。。
I/Fを指定されているのでTCHARでないとダメなんです...
もうちょっと探してみます。
0565デフォルトの名無しさん
2011/01/14(金) 00:07:06C++だとstd::vectorとかstd::stringとか使えるんだから楽だろう
まあがんがれ
http://codepad.org/yGLOZi3S
0566デフォルトの名無しさん
2011/01/14(金) 00:07:11そして、string.h内の関数を軒並み_tcsファミリ関数に置き換えればOK。
Cコードなので一般的にバッファは固定長。
C++のstringとか使ったり、wchar_tきめ打ちしたりすると
MBCS使われたときに厄介なことになるよ。
0567デフォルトの名無しさん
2011/01/14(金) 00:07:590568デフォルトの名無しさん
2011/01/14(金) 00:08:410569デフォルトの名無しさん
2011/01/14(金) 22:48:40いまさらWin9x対応もないだろうしな。
それに、_tcsとか汎用テキストマッピングつかっていても、ワイド文字とマルチバイト文字と
両方で動くように書いてるやつなんてめったにいないだろうし。
ワイド文字決めうちのほうがトラブルが少なそう。
0570デフォルトの名無しさん
2011/01/15(土) 01:06:49下のように(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;
}
0571デフォルトの名無しさん
2011/01/15(土) 01:14:070572デフォルトの名無しさん
2011/01/15(土) 01:28:26ファイル名とファイルの中身は別もんだ
imbue()はファイルの中身を読み書きするためのlocaleを設定するための関数
結論だけいうと、ワイド文字版のopen()をつかうといいよ
Windowsのファイル名はどのみちUTF-16なんだから
今時Windowsでchar*でファイル名を扱うほうがありえない
ワイド文字なopen()は非標準だけど、
どうせ_tmain()とかstdafx.hとか使ってるんだから気にしないだろ?
0573デフォルトの名無しさん
2011/01/15(土) 03:57:120574デフォルトの名無しさん
2011/01/15(土) 05:19:550575デフォルトの名無しさん
2011/01/15(土) 10:03:36ワーカー側でループの度に、終了をリクエストされているかチェックするようにして
主スレッドから止めたいときには終了をお願いする
概念的にはただのフラグでいいけど、スレッドセーフになるように気をつけて
0576デフォルトの名無しさん
2011/01/15(土) 10:07:390577デフォルトの名無しさん
2011/01/15(土) 10:12:55汎用テキストマップの話だからとうぜん内部で使うコードの話だよ。
0578デフォルトの名無しさん
2011/01/15(土) 10:26:080579デフォルトの名無しさん
2011/01/15(土) 10:35:34うえのほうのTCHARがどうしたとか_tcsがどうしたって話を受けて、
マルチバイトがって発言なんだろ?
汎用テキストのことだよ。
0580デフォルトの名無しさん
2011/01/15(土) 10:52:290581デフォルトの名無しさん
2011/01/15(土) 12:09:28VC6だけかも知れないが、
これだと終わらない場合がある。
m_stop=true とかにしてスレッド内でbreakするようにしても
なかなか死んでくれないのよね。
socket()を含んだやつは綺麗に終わるんだけど。
まだ未熟モノ?という事でよしなに。
0582デフォルトの名無しさん
2011/01/15(土) 12:13:17ちゃんとvolatileしてある?
0583デフォルトの名無しさん
2011/01/15(土) 12:18:27コンパイラの最適化、アトミック性、メモリバリア
といった概念や問題をちゃんと理解したほうがいいな
WindowsならInterlocked〜系のAPIを使うといいんじゃないの
0584デフォルトの名無しさん
2011/01/15(土) 12:28:140585デフォルトの名無しさん
2011/01/15(土) 12:48:140586570
2011/01/15(土) 13:05:050587デフォルトの名無しさん
2011/01/15(土) 13:27:55なにがえっなんでしょう?
0588デフォルトの名無しさん
2011/01/15(土) 13:55:55シングルプロセッサ以外も想定するなら volatile は意味無いでしょ。
0589デフォルトの名無しさん
2011/01/15(土) 13:59:580590デフォルトの名無しさん
2011/01/15(土) 14:03:500591デフォルトの名無しさん
2011/01/15(土) 14:11:43メモリバリアでぐぐるといいぞ
たとえば↓このへんでも読めば
http://d.hatena.ne.jp/i-saint/20101005/1286208402
0592573
2011/01/15(土) 14:24:02今回の場合
副スレッドの1ループと主スレッドからのスレッド停止フラグの操作をCRITICAL_SECTIONで排他すれば良いのでしょうか?
0593デフォルトの名無しさん
2011/01/15(土) 14:29:040594デフォルトの名無しさん
2011/01/15(土) 14:38:30それでもいいけど、上に出てたようにInterlockedCompareExchange()のような
APIのほうが安価だし、このケースではそれで十分
それと、ワーカーでやってるのがI/O待ちのような仕事なら
スレッド間通信にはEventを使って、ワーカーでI/OとEventを一緒に待つように汁
0595デフォルトの名無しさん
2011/01/15(土) 16:25:28こんな便利なAPIあったのか・・・
副スレッドはシリアルポートを通じて外部に接続した機器の定期的な監視とコントロールをしています
0596デフォルトの名無しさん
2011/01/15(土) 16:44:37メモリバリアはCPUがマシン語を実行するときに働くもの。
使いどころが違うと思うんだが。
VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。
0597デフォルトの名無しさん
2011/01/15(土) 16:55:16メモリバリアを呼び出す関数の呼び出し(); // extern関数
g_complete = true;
このコードはコンパイラの順序入れ替えを抑制できないから、
メモリバリアすればいいと思ってる奴はアホ。
0598デフォルトの名無しさん
2011/01/15(土) 17:10:37そんなことしたらシングルスレッドでも結果が変わってしまいます
0599デフォルトの名無しさん
2011/01/15(土) 17:41:40VC6が手元に無いので何ともいえないけど、もしvolatileが無いことで
比較/参照のコードを最適化で消去してしまうのなら、「なかなか」ではなくて
「全く」変わらなくなるのでは?
「なかなか」変わらないのであれば、それはたぶん他のプロセッサから見えない
キャッシュ領域を読み書きしているためで、それこそコード生成時の最適化とは無関係な
実行時のメモリ可視性の問題に見えるけど
0600デフォルトの名無しさん
2011/01/15(土) 19:03:40WaitForMultipleObjects で複数監視できるので他のイベント待機のついでに
脱出イベントも用意してしまおうという腹
0601デフォルトの名無しさん
2011/01/15(土) 19:35:13Linuxとソースの互換がなくなるのでMSの書き方はできるだけ
したくないのですが。
charで動いているものをwcharにするメリットがよくわかりません
0602デフォルトの名無しさん
2011/01/15(土) 19:45:230603デフォルトの名無しさん
2011/01/15(土) 20:11:22たとえばUnicodeのファイル名などをサポートしなかったり
Unicodeの文字が入力できなかったり
マルチバイトの2バイト目でなにか問題を引き起こしたりしても
誰も文句を言わないようなプログラムなら、好きにすればいいんじゃないの
0604デフォルトの名無しさん
2011/01/15(土) 21:40:25TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが
機能してないしな。
0605デフォルトの名無しさん
2011/01/15(土) 22:58:21> VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。
Thanks 調べて見ます。そえいばVCで というかGCCでもvolatileなんて
使った事ないす。 確か実行中に他から変更される可能性あるって意味でしたよね。ちゃう?!
とにかく調べてみます。
0606デフォルトの名無しさん
2011/01/16(日) 13:34:27>TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが
>機能してないしな。
詳細kwsk。
0607デフォルトの名無しさん
2011/01/16(日) 13:49:48実際にはコスト要らずで安全に切り替えられることを保障できる仕組みではないので、
9x系への対応が不要な状態で、その(無駄な)コストを払いたがる人がいないという
ことを言っているのだと思う
コストってのは、両方で正しく動くプログラムを書き、両方で正しく動くことを
テストするコストね
0608デフォルトの名無しさん
2011/01/16(日) 13:53:030609606
2011/01/16(日) 14:15:22char固有の処理を書くのが面倒でやってないってだけじゃないの?
「#ifdefで若干処理を分ける必要があるが、_UNICODEしか考慮しない人が多い」
ってだけ。それは「機能してない」とは言わないと思うけど。
0610デフォルトの名無しさん
2011/01/16(日) 14:28:28文字列の編集とか、マルチバイトとワイド文字列の両方で動くように意識してコード書いてる人、
そんなにいないでしょ。
で、両方でコンパイルしてコンパイルが通るかとか、テストまでやってるところなんて
壊滅的でしょ。
世のwindows用のコードは汎用テキストマップを使っていても99.9%は片方でしか動かない
と思う。
0611デフォルトの名無しさん
2011/01/16(日) 14:43:32言葉の綾程度の話なら、俺にはどうでもいい話だとしか言えん
>char固有の処理を書く
>#ifdefで若干処理を分ける
これって9x系をサポートしないんなら不要なコストじゃん
MSはとっくにそれを切り捨ててる(OSからも、コンパイラからも)
何のために「わざわざ」それを払うの?
0612デフォルトの名無しさん
2011/01/16(日) 14:55:04それに食いつく >>606
ややこしくする >>607
0613デフォルトの名無しさん
2011/01/16(日) 15:34:570614デフォルトの名無しさん
2011/01/16(日) 16:21:09typedefと言う人もいるが個人的にはTEXTだと思ってる
0615デフォルトの名無しさん
2011/01/16(日) 16:39:180616デフォルトの名無しさん
2011/01/16(日) 16:44:59Win2000以降しか存在しないAPI使ってます
なんてのはよくあること
0617デフォルトの名無しさん
2011/01/16(日) 17:06:29APIを通じて受け取るとSJISになるから文字化けするってあったけど、ああいうのって
UTF-8とかで受け取れるとかってできないのかね。
と一瞬思ったけど、どうせ半角1バイト、全角2バイトとか決めうちのコードばっかりで
ワイド文字に移行するのと同じくらいの手間がかかるだろうな。
0618デフォルトの名無しさん
2011/01/16(日) 17:12:520619デフォルトの名無しさん
2011/01/16(日) 17:47:54Japanese_Japan.65001のようなUCS系の文字符号化方式を受け付けないので
VC++の標準ライブラリを通過するとSJISやEUC(の符号化文字集合)に含まれない
Unicodeの文字がすべて文字化けして落っこちるってだけ。
0620デフォルトの名無しさん
2011/01/16(日) 17:56:27Windowsでは非常に多くの場所でMBCSがDBCSだと仮定されていて
そのせいでUTF-8コードページ(CP65001)をきちんとサポートするのは
無理と聞いたことがある
まあMultiByteToWideChar()などでは使えるんだが
コンソールでもchcpで一見CP65001を設定できるが
文字幅が全く考慮されていないので、見た目がガタガタになるし
入力中にバックスペースで1文字削除する時などのカーソルの動きがおかしい
大昔のLinuxレベルだな
これはWindows7でも直ってない
0621デフォルトの名無しさん
2011/01/16(日) 18:04:060622デフォルトの名無しさん
2011/01/16(日) 18:10:04複雑な日本語の表示なんて不可能に決まってるじゃないか。超漢字使おうぜ。^^
0623デフォルトの名無しさん
2011/01/16(日) 18:17:57出力がコンソールのときはWriteConsoleW()を使ってるんだろうな
もっともdirもリダイレクトするとCP932のテキストになるが
0624デフォルトの名無しさん
2011/01/16(日) 21:51:21結局、思うぐいですか
でね、wchar_tのtはどんな意味?
0625デフォルトの名無しさん
2011/01/16(日) 21:59:03time_t とか div_t とか text と関係ないのにも使われてるし
0626デフォルトの名無しさん
2011/01/16(日) 22:48:10UCS-4とかになると1文字を収めるにはサイズが足らんてぃーの。
そこでC++0xではchar16_tとかchar32_tとか。
でも、じゃあ1文字1変数が実現するかって言うと
UTF-16とか使う限り不可能なんだよね。
0627デフォルトの名無しさん
2011/01/16(日) 23:33:36char16_tとかchar32_tが導入されたのはint32_tのようにどの環境でも共通の文字コードを前提としたコードを実現するため
1バイト固定のcharに収まらないためにwchar_tが用意されたのとは違う
つまりUnicodeの合成文字みたいな複数メンバによって一文字を表す文字集合じゃないものを
最大拡張文字集合として扱える環境でwchar_tを使えば解決
0628VCSE
2011/01/17(月) 00:08:28C++でクラフチック法のプログラムと自動微分(ボトムアップ)のプログラム
作成したいのですが、分からないので教えてください
0629デフォルトの名無しさん
2011/01/17(月) 00:20:25何がわからないか分からないので教えてください
0630VCSE
2011/01/17(月) 00:30:270631デフォルトの名無しさん
2011/01/18(火) 00:22:09if(s=110){
0632デフォルトの名無しさん
2011/01/18(火) 00:38:09の続きはぁ〜?
ちなみにif文の中で構造体定義してるのであれば
当然if文抜けたら消える。
if文だろうがfor文だろうが{から}の中でint i;定義したら
{から}から抜けたらiは消えるよ。
0633デフォルトの名無しさん
2011/01/18(火) 00:51:360634デフォルトの名無しさん
2011/01/18(火) 01:45:09int main(void){
int num=1;
{int num=2;}
printf("%d\n", num);
return 0;
}
これの結果は 1 と表示される。
実際に動かしてみそ。
0635デフォルトの名無しさん
2011/01/18(火) 01:50:14int main(void){
int num=1;
{num=2;}
printf("%d\n", num);
return 0;
}
これの結果は 2 と表示される。
>>633の言うように初期化と代入は違うのだ。
分かったかね、>>631。
0636デフォルトの名無しさん
2011/01/18(火) 02:19:30式はこうプログラムする
int a = 1 + 1;
0637デフォルトの名無しさん
2011/01/18(火) 12:18:140638デフォルトの名無しさん
2011/01/18(火) 19:57:04ぶちゃけフリーソフトなんだけども、それをWin7_x64で動くようにしたい。
まず、Visual Studio 2008 Pro で、x64のコードを履かせるやり方は分かったものの、
コード自体がCだがMFCを使うためにC++風にしたコードらしく、C/C++の文法を
【これから】覚えようとはしているが、どうにも難しい。
一体どこから手をつければいいか分からない。
俺の周りにプログラムできるやつがいない。
笑い話だが、俺が一番詳しい。
どこから手をつければいいか教えてくれ。
0639デフォルトの名無しさん
2011/01/18(火) 19:57:440640デフォルトの名無しさん
2011/01/18(火) 21:21:01その前で色々考えても禿げるぞ。
0641デフォルトの名無しさん
2011/01/18(火) 21:28:170642デフォルトの名無しさん
2011/01/18(火) 21:38:160643デフォルトの名無しさん
2011/01/18(火) 23:55:27作者様が忙しいというので、俺がやろうと思ったのだよ。
昔さ、C++のコードをJAVAのコードに変えて、
卒業した先輩がいたようだから、俺もどうにかできないかな〜って思ってね。
ところで、MFCを使うソフトをC#とか、勉強しやすいと言われる言語(思い込みだが)、に
コードを書き換えて、変換することってできんのかな。今の俺には無理だがな。
で、どんなソフトかというと、キーバインドに関係するプログラム。
もう分かったか?まあ、書かずに話を進めてくれるとありがたい。
0644デフォルトの名無しさん
2011/01/19(水) 12:35:040645デフォルトの名無しさん
2011/01/19(水) 15:52:01VC++6からVC++2008に移植するとか、そんなサイトをあちこちから集めている。
しかし、「やさしいC」しか読んだことない俺にできるだろうか・・・
0646デフォルトの名無しさん
2011/01/19(水) 16:14:090647デフォルトの名無しさん
2011/01/19(水) 17:21:42サロゲートペアや合成文字を2文字とカウントしちゃうんだけど
コードページをcp932にしたら
Shift_JIS-2004になってちゃんと1文字とカウントするようになるかしら?
どうなの?
0648デフォルトの名無しさん
2011/01/19(水) 17:48:08シフトJISではそもそもユニコードを表現できない
0649デフォルトの名無しさん
2011/01/19(水) 21:38:37unicodeの合成文字は最大十数バイトらしいんで、めちゃでかくなるな > wchar_t
0650デフォルトの名無しさん
2011/01/19(水) 23:03:15XPはともかく、JIS X 213に正式対応したVistaや7は
Shift_JISも2004対応になってるんじゃないのん?
Unicodeの全文字は到底無理だけど
サロゲートペアや合成文字で表現される日本の文字は
2バイトで表現可能になったんでないのかな?
0651デフォルトの名無しさん
2011/01/20(木) 00:01:28どうしたらいいですか
0652デフォルトの名無しさん
2011/01/20(木) 00:22:330653デフォルトの名無しさん
2011/01/20(木) 08:04:360654x86_2_x64
2011/01/20(木) 17:12:36これ、あと1回回したら、何をすればいい?
「一目で分かる Visual C++ 2008 アプリケーション開発入門」でいいかな?
0655デフォルトの名無しさん
2011/01/20(木) 18:13:210656デフォルトの名無しさん
2011/01/20(木) 18:19:430657デフォルトの名無しさん
2011/01/20(木) 18:54:310658デフォルトの名無しさん
2011/01/21(金) 01:09:45親日のトルコに対して失礼だろ。
0659デフォルトの名無しさん
2011/01/21(金) 01:16:370660デフォルトの名無しさん
2011/01/21(金) 01:41:15それは特産品だからいいんじゃね?
0661デフォルトの名無しさん
2011/01/21(金) 01:43:120662デフォルトの名無しさん
2011/01/21(金) 12:55:19wcsncpy関数を使うとTEXTマクロ?で囲っても
キャストがうまくいかないみたいなエラーが出るんですがどうすれば出なくなりですか?
環境をマルチバイト文字セットを使用する、にするのはなしな方向でお願いします。
0663デフォルトの名無しさん
2011/01/21(金) 13:48:480664デフォルトの名無しさん
2011/01/21(金) 14:09:500665デフォルトの名無しさん
2011/01/21(金) 15:12:04VC++を捨ててQt4に引っ越す
0666デフォルトの名無しさん
2011/01/21(金) 20:35:570667デフォルトの名無しさん
2011/01/22(土) 13:14:11いい名前が思いつきません。例えば
void addAnimation (Animation* anim);
という非バーチャル関数があった場合、
virtual void addAnimationImpl (Animation* anim);
というバーチャル関数が考えられますが正直今ひとつ。
なにかいい名前ないですか?
0668デフォルトの名無しさん
2011/01/22(土) 16:48:55×:p[0] = NULL;
○:p[0] = ;
コンパイルエラーが出ます。
0669デフォルトの名無しさん
2011/01/22(土) 16:50:460670デフォルトの名無しさん
2011/01/22(土) 16:55:13できない。
どういう経緯でそういうことをやろうと思ったのか説明できれば代わりの案がでてくるかもしれない。
0671デフォルトの名無しさん
2011/01/22(土) 17:02:050672デフォルトの名無しさん
2011/01/22(土) 17:05:24何もしない代入
0673668
2011/01/22(土) 17:07:57if (color)
pointer[n++] = pointer ? color : 代入を無かったことに;
pointerがNULLでない時だけ代入したいのですが、これが難しい。
0674デフォルトの名無しさん
2011/01/22(土) 17:10:170675デフォルトの名無しさん
2011/01/22(土) 17:11:020676デフォルトの名無しさん
2011/01/22(土) 17:11:18pointer[n++] = color;
0677デフォルトの名無しさん
2011/01/22(土) 17:17:13boost.optional
0678デフォルトの名無しさん
2011/01/22(土) 17:17:24if (pointer)
pointer[n++] = color;
0679デフォルトの名無しさん
2011/01/22(土) 17:19:01どう見てもそれで終了だよな
つまりなんでそんなことがしたいかの説明になっていないということだ
0680デフォルトの名無しさん
2011/01/22(土) 17:19:37if (color && pointer)
pointer[n] = color;
if (color)
n++
と4行ですが、X10ぐらいあって、何とか1,2行で書けないものかと。
む、難しい
0681デフォルトの名無しさん
2011/01/22(土) 17:21:39がしかしだ、本当の理由は無知だったのを認めたくないだけだろwwwww
0682668
2011/01/22(土) 17:27:26if (color)
pointer ? pointer[n++] = color : (poiner*)n++;
か、
if (color && ++n && pointer)
poiner[n-1] = color;
が考えられますが、お世辞にも見やすいとは言いがたい。
0683デフォルトの名無しさん
2011/01/22(土) 17:32:42n++が(pointer*)でキャストされてたり、++nが条件に入ってたり、どういう意味なんだ。
0684デフォルトの名無しさん
2011/01/22(土) 17:33:23が、>>681に同意
マクロかテンプレート使うなら、別に特にトリッキーな問題じゃないだろ
0686デフォルトの名無しさん
2011/01/22(土) 17:35:54それ不定
0687668
2011/01/22(土) 17:36:27原則マクロは禁止。テンプレートも禁止。
この問題のためだけに制限を緩めるのはもったいない。
どうしてもいいアイディアが思いつかない。
0689デフォルトの名無しさん
2011/01/22(土) 17:42:07>>673 (>>687)
if (color) { if (pointer) { pointer[n] = color; } ++n; }
0690デフォルトの名無しさん
2011/01/22(土) 17:42:12関数やらマクロやら使わない条件なら、そのコードを多少いじって工夫しても大差ないだろ。
0691デフォルトの名無しさん
2011/01/22(土) 17:44:44型を一致させる? color の型は pointer* なのか? pointer は型名なのか?おまえはバカなのか?
0692デフォルトの名無しさん
2011/01/22(土) 17:45:20これ以上あがいても、恥が上乗りするだけ。
0693682
2011/01/22(土) 17:47:40これまでをまとめるとこれが一番良いように思う。
if (color)
pointer ? pointer[n] = color, n++ : n++;
完璧?
0694デフォルトの名無しさん
2011/01/22(土) 17:49:510695682
2011/01/22(土) 17:51:23マクロ×、テンプレート×、一行に沢山書く×、同じような処理を繰り返す×
やっぱり>>693が一番美しいと思う。
0696デフォルトの名無しさん
2011/01/22(土) 17:51:47緩めるのがもったいないっていうが、その禁止事項のどこにメリットがあるの?
0697デフォルトの名無しさん
2011/01/22(土) 17:53:26そんなウンココードにする理由が 56 文字から 51 文字に短縮するためなの?
頭おかしい。
0698682
2011/01/22(土) 17:54:08プログラマーの見るソースと、コンパイルされるソースが異なるのが最大の問題。
あれはゆるせない。
0699デフォルトの名無しさん
2011/01/22(土) 17:54:350700デフォルトの名無しさん
2011/01/22(土) 17:55:37なんてことだ!それじゃ #include も使えないな!
0701682
2011/01/22(土) 17:56:46if (color)
pointer ? pointer[n] = color, n++ : n++;
意図が明確で、上から下に、左から右に読めば理解できて、なおかつ見やすい。
これでいいよね?
0702デフォルトの名無しさん
2011/01/22(土) 18:11:11n++ がダブっている。
理解するのにマイナーな演算子の優先順位やシーケンスポイントのルールを
調べるなり思い出すなりする必要がある。
0703デフォルトの名無しさん
2011/01/22(土) 18:12:32color の判定と pointer の判定とで不統一になっている。
0704デフォルトの名無しさん
2011/01/22(土) 18:13:060705デフォルトの名無しさん
2011/01/22(土) 18:16:52条件演算子使わないでifのほうが明確なんじゃないの?
0706デフォルトの名無しさん
2011/01/22(土) 18:19:470707デフォルトの名無しさん
2011/01/22(土) 18:37:35条件演算子って代入の際の右辺値に使うものだって思ってた
はっきり言って気持ち悪い
0708デフォルトの名無しさん
2011/01/22(土) 18:39:330710デフォルトの名無しさん
2011/01/22(土) 19:52:000711デフォルトの名無しさん
2011/01/22(土) 19:55:37「こんなコード書いたけどどうっすか?」みたいな。
ググればすぐ分かるのに質問してくる初心者とか、
結論がでてるのにとぼけて質問してるようなやつとか、寂しいからだろ。
0712デフォルトの名無しさん
2011/01/22(土) 20:53:45が鼻から悪魔な件
0713デフォルトの名無しさん
2011/01/22(土) 21:25:53んなこたーない。カンマ演算子の左と右の間にはシーケンスポイントがある。
0714デフォルトの名無しさん
2011/01/22(土) 22:55:38まぁ見やすくてわかり易いのいいかと。
コンパイラは賢いからそんなに差は出ないでしょ。
0715デフォルトの名無しさん
2011/01/23(日) 00:04:03PGは孤独を楽しめない奴には向いてないよね
0716デフォルトの名無しさん
2011/01/23(日) 00:07:19pointer[n++] = color
0717デフォルトの名無しさん
2011/01/23(日) 00:45:40意図が明確じゃないですよね
0718デフォルトの名無しさん
2011/01/23(日) 00:53:200719デフォルトの名無しさん
2011/01/23(日) 01:09:380720デフォルトの名無しさん
2011/01/23(日) 01:12:280721デフォルトの名無しさん
2011/01/23(日) 01:57:210722デフォルトの名無しさん
2011/01/23(日) 02:49:30if (color) { if (pointer) { pointer[n] = color; } ++n; }
if (color) pointer ? pointer[n] = color, n++ : n++;
0723デフォルトの名無しさん
2011/01/23(日) 03:24:48>マクロ×、テンプレート×
って
>同じような処理を繰り返す×
とどう両立させんのw
お前知識ないだけだろ
コーディングスタンダードとか笑わせるw
言い訳でしかないわ
0724デフォルトの名無しさん
2011/01/23(日) 04:06:55if (color) pointer ? pointer[n++] = color : n++;
これより>>689の方が1万倍マシ。
0725デフォルトの名無しさん
2011/01/23(日) 05:00:39if (color) pointer ? pointer[n] : color = color, n++;
0726デフォルトの名無しさん
2011/01/23(日) 11:07:34IOCCCに出る権利をやろう
0727デフォルトの名無しさん
2011/01/23(日) 15:53:380728デフォルトの名無しさん
2011/01/27(木) 00:45:30私、Cは一応やってましたが、この度C++を勉強することにしました
クラスを作るレベルから始めてますが、どうなることやら
0729デフォルトの名無しさん
2011/01/27(木) 01:10:150730デフォルトの名無しさん
2011/01/27(木) 02:36:42STLは便利よね。
MFCはダイアログベースのアプリでデータ変換プログラムぐらいは書けます。
でもやっぱ g++ linux が単純で楽しいかと。
0731デフォルトの名無しさん
2011/01/27(木) 02:56:57「テンプレートを理解した」と称してもよいんじゃないでしょうか。
0732デフォルトの名無しさん
2011/01/27(木) 03:50:35MFC は出来なくても問題ない
Win32API は知ってた方が良いが C++ とは関係ない
Qt4 とか wxWidgets とかが使えると楽しい
STL とかテンプレートは使えた方が便利だが使わなくても済む場合も多い
0733デフォルトの名無しさん
2011/01/27(木) 03:52:250734デフォルトの名無しさん
2011/01/27(木) 07:06:30Win32APIは聞いたことあるけど、いろいろ勉強してみる �d
0735デフォルトの名無しさん
2011/01/27(木) 14:37:27俺も最初C++勉強したときはそう思ったな・・・・・・・
0736デフォルトの名無しさん
2011/01/27(木) 15:23:53http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
お前はこれ100回読め
0737デフォルトの名無しさん
2011/01/27(木) 15:33:350738デフォルトの名無しさん
2011/01/27(木) 15:45:08恐ろしく良く出来てるのであります。
C++は最高傑作の言語です。
さて誰の言葉でしょう。
0739デフォルトの名無しさん
2011/01/27(木) 15:49:060740デフォルトの名無しさん
2011/01/27(木) 15:51:29禿げ
0741デフォルトの名無しさん
2011/01/27(木) 15:53:57個人の中だけでやり、外で出てくるな。
0742デフォルトの名無しさん
2011/01/27(木) 16:28:57人に使われてるうちはクソなコードを避けて通ることができないから
クソなコードを書く人間を解雇できる立場にはやくなれるといいね。
0743デフォルトの名無しさん
2011/01/27(木) 16:37:130744デフォルトの名無しさん
2011/01/27(木) 20:14:29ディープな奴だとちんぷんかんぷんになる
0745デフォルトの名無しさん
2011/01/28(金) 00:07:01「チンぷんかんぷん」だけではなく「マンぷんかんぷん」も
平等に使っていけよ? 人として。
0746デフォルトの名無しさん
2011/01/28(金) 03:35:460747デフォルトの名無しさん
2011/01/28(金) 11:22:16読みにくくてしょうがない。テンプレートは使用禁止が正しい。
0748デフォルトの名無しさん
2011/01/28(金) 12:33:07テンプレート使ったら即座に全部読みにくくなるわけじゃないだろう。
個別にコードを改善することはできんのか?
0749デフォルトの名無しさん
2011/01/28(金) 12:34:160750デフォルトの名無しさん
2011/01/28(金) 12:38:03「使用禁止が正しい(キリッ」
とか恥ずかしくないの?
なんか勝手に縛りプレイしてるレスたまに見るけど、適材適所って言葉知らないのかね。
柔軟に行こうぜ。
0751デフォルトの名無しさん
2011/01/28(金) 13:55:30std::vector<int> vec = std::vector<int>(length);
for (int i = 0; i < length; i++)
vec.at(i) = なんらかの処理の戻り値(int型);
0752デフォルトの名無しさん
2011/01/28(金) 14:01:10おk
0〜lengthのループなら範囲チェックも不要だから
vec[i] =でもいい
0753デフォルトの名無しさん
2011/01/28(金) 14:28:58std::unique_ptr<std::vector<int>> とすると、[]演算子使うのが躊躇っゃうんだ。
たしかvectorは、連続性が保証されてたから、上手く動くかもしれないけど
オーバーランしちゃうんじゃないかとか考えちゃって…。
0754デフォルトの名無しさん
2011/01/28(金) 14:33:500755デフォルトの名無しさん
2011/01/28(金) 14:38:17std::unique_ptr<std::vector<int>> vec(new std::vector<int>(length));
この場合、(*vec)[i] と書くと混乱しない? 俺だけ?
0756デフォルトの名無しさん
2011/01/28(金) 14:41:53連続性の保証を気にしてる辺りが
データへのポインタに[]使ってるわけじゃないんだから・・・・・・
0757デフォルトの名無しさん
2011/01/28(金) 14:55:54いやテンプレートを使わないと書けないプログラムは存在しない。
現状ではデメリット方が多いのでテンプレートは一律禁止にしたほうがいい。
あれは技術屋のオナニー。STLだけは許す。
0758デフォルトの名無しさん
2011/01/28(金) 15:14:190759デフォルトの名無しさん
2011/01/28(金) 17:32:490760デフォルトの名無しさん
2011/01/28(金) 17:55:07>>750は適材適所って言っているよね
テンプレートを使わないとプログラムは書けないなんて
一言も言っていないよね
それとデメリット多いから禁止とか、包丁危ないから
禁止って言ってるのとレベル変わらないよ?
そもそもオナニーって気持ちいいよね、何で否定的なの?
敬虔なカトリックなの?
0761デフォルトの名無しさん
2011/01/28(金) 18:46:47今回はこうした方が保守性がいいからこうする、って
ことあるし。
みんなも柔軟にね〜
0762デフォルトの名無しさん
2011/01/28(金) 19:54:59やったほうが作法かと。
どでしょ。
0763デフォルトの名無しさん
2011/01/31(月) 02:16:22Linuxのtimeコマンドみたいにプログラムの実行時間を測定するWindows 7 64bit用のツールってある?
今までWindows Server 2003 Resource Kit Tools付属のtimeitを使ってたんだけど環境移行して使えなくなってしまった
0764デフォルトの名無しさん
2011/01/31(月) 02:40:12int pair[2];
struct {
int x;
int y;
} point;
}
この場合、 pair[0]==point.x と pair[1]==point.y は保証されますか?
0765デフォルトの名無しさん
2011/01/31(月) 03:13:350766デフォルトの名無しさん
2011/01/31(月) 03:31:49Server2008の方にある
0767デフォルトの名無しさん
2011/01/31(月) 03:31:56わからない 教えてくれ。
パディングの問題もないと思うが。
0768デフォルトの名無しさん
2011/01/31(月) 03:34:550769デフォルトの名無しさん
2011/01/31(月) 05:22:56「先頭のメンバの型が同じであるPODな構造体」をメンバに持ち、
かつそれらの構造体の先頭メンバを参照するときだけ。
それ以外は処理系依存。
これはC89の規格だが、C++でもおそらく変わらないはず。
自分の開発環境でどうなのか知りたければコンパイラのドキュメント嫁。
0770デフォルトの名無しさん
2011/01/31(月) 13:24:56int並べた構造体とint配列で位置がずれる実装は現実にはなさそうな気はするけど
0771デフォルトの名無しさん
2011/01/31(月) 14:22:24それがだめならウニなんて使う理由がない。
エンディアンの処理に使うぐらいかな。
0772デフォルトの名無しさん
2011/01/31(月) 15:04:41いいんじゃないの
この辺参考に
ttp://bytes.com/topic/c/answers/441690-structure-size-check-compile-time
0773デフォルトの名無しさん
2011/01/31(月) 15:05:49コンパイラのバージョンが上がった途端に
コードが使い物にならなくなったりするじゃないか…。
マイクロソフト製品とかとくにそう。
0774デフォルトの名無しさん
2011/01/31(月) 15:06:52unionにはvariantや関数型のdiscriminated union(代数データ型)みたいな
用途もあるだろう
っていうかもともとそれが本来の用途だと思うのだが
0775デフォルトの名無しさん
2011/01/31(月) 15:10:53強引なキャストでのtype punningで不正なコードが生成されるので
そのワークアラウンドとしてunion使ってる人も多いかも
まあ規格違反といえば違反だけど、Cでそういうお上品なことばかり
言ってても仕方が無い
0776デフォルトの名無しさん
2011/02/01(火) 16:54:28俺の環境で動けばそれでいい。
0777デフォルトの名無しさん
2011/02/01(火) 17:59:570778デフォルトの名無しさん
2011/02/01(火) 23:30:26同意
>>777
黙ってろ
0779デフォルトの名無しさん
2011/02/02(水) 09:31:48同意
>>778
黙ってろ
0780デフォルトの名無しさん
2011/02/02(水) 21:52:22エラービットはクリアされないんんでしょうか?
下のソースコードだと、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);
}
0781デフォルトの名無しさん
2011/02/02(水) 22:07:16コピーコンストラクタとかなんのために必要なんですか?
0782デフォルトの名無しさん
2011/02/02(水) 22:17:040783デフォルトの名無しさん
2011/02/02(水) 23:04:52単なるコピー以上のことをするため
GCがないからコンテナやスマートポインタをベタにコピーするとまずい
0784デフォルトの名無しさん
2011/02/02(水) 23:21:07エラービットの細かい仕様は知らなくても、 ifs をループの中に入れてやれば自然だし十分でしょ。
そうすれば open() じゃなくてコンストラクタも使えるし。
0785デフォルトの名無しさん
2011/02/03(木) 01:29:56そんなことは些細なこと
ポインタの二重解放とかもっとやばいのが潜んでる
0786デフォルトの名無しさん
2011/02/03(木) 01:53:00private:
Hoge(const Hoge&);
void operator=(const Hoge&);
で事足りる
0787デフォルトの名無しさん
2011/02/03(木) 02:29:070788デフォルトの名無しさん
2011/02/03(木) 02:39:310789デフォルトの名無しさん
2011/02/03(木) 12:53:450790デフォルトの名無しさん
2011/02/03(木) 13:20:090791デフォルトの名無しさん
2011/02/03(木) 15:07:360792デフォルトの名無しさん
2011/02/03(木) 16:49:44はい、スマートポインタ
いろいろ機能を追加していったら
shared_ptrとかになる
http://codepad.org/WT7vbhHD
0793デフォルトの名無しさん
2011/02/03(木) 17:14:43ちゃんとコピコンで管理する方が好きだな。
そんなに難しくないでしょ。ちゃう?
0794デフォルトの名無しさん
2011/02/03(木) 18:03:41口が裂けても大丈夫
0795デフォルトの名無しさん
2011/02/03(木) 21:51:37ISO/IEC 14882をぜんぶ読んだのですが、載ってませんでした。
0796デフォルトの名無しさん
2011/02/03(木) 22:00:320797デフォルトの名無しさん
2011/02/03(木) 22:39:510798デフォルトの名無しさん
2011/02/03(木) 22:59:34つっ、釣られないんだからねっ!
0799デフォルトの名無しさん
2011/02/04(金) 00:25:480800デフォルトの名無しさん
2011/02/04(金) 00:38:110801デフォルトの名無しさん
2011/02/05(土) 23:46:470802デフォルトの名無しさん
2011/02/06(日) 11:19:59MSHTMLを使い、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();
}
}
}
0803デフォルトの名無しさん
2011/02/06(日) 11:43:14押せたの確認できたし
0804デフォルトの名無しさん
2011/02/06(日) 12:41:21IHTMLEventObj::fireEvent
じゃだめ?
submitで実験したことはないんだがたいていのものはこれでなんとかなった
0805デフォルトの名無しさん
2011/02/06(日) 19:04:20でメモリを確保した場合
変数名じゃなくてポインタに名前がついてるみたいで何やら気持ち悪いんだが
これはそういうものとして割り切るものなの?
0806デフォルトの名無しさん
2011/02/06(日) 19:07:570807デフォルトの名無しさん
2011/02/06(日) 19:10:570808デフォルトの名無しさん
2011/02/06(日) 19:19:510809デフォルトの名無しさん
2011/02/06(日) 21:27:12この言葉で以下を試してみたらうまくいきました。
MSHTML::IHTMLElementPtr pElement(pInput);
//!クリックする
if(pElement){
pElement->click();
}
UIAutomationも調べてみましたが、かなり汎用性のあるものですね。
考えていただき有難うございます。
0810デフォルトの名無しさん
2011/02/06(日) 21:44:50int *x = new int[hoge];
0811デフォルトの名無しさん
2011/02/06(日) 23:04:35int *x = new int(1)[hoge]; じゃダメだった
0812デフォルトの名無しさん
2011/02/06(日) 23:12:34int* x = new int[hge]();
0813デフォルトの名無しさん
2011/02/06(日) 23:18:040814デフォルトの名無しさん
2011/02/06(日) 23:19:47それC++0xからしか使えないよ
0815デフォルトの名無しさん
2011/02/06(日) 23:38:360816デフォルトの名無しさん
2011/02/06(日) 23:42:280817デフォルトの名無しさん
2011/02/06(日) 23:43:51規格票
0818デフォルトの名無しさん
2011/02/07(月) 00:00:47いつのバージョン見てるの?
これは 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);
0819デフォルトの名無しさん
2011/02/07(月) 00:06:58なら、配列は全て100でされるの?
0820デフォルトの名無しさん
2011/02/07(月) 00:11:02だめ。配列 new ではデフォルト初期化しかできない。
素直に std::vector 使っとけ。
0821デフォルトの名無しさん
2011/02/07(月) 00:14:48ちゃんと配列newの所見てる?
0822デフォルトの名無しさん
2011/02/07(月) 00:20:150823デフォルトの名無しさん
2011/02/07(月) 00:26:48? 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.
これが目に入らなかったと見えるな
0824デフォルトの名無しさん
2011/02/07(月) 00:34:39その中の2つのケースのどちらにも、 POD である int の配列は該当しないな。関係ない。
0825デフォルトの名無しさん
2011/02/07(月) 00:44:13direct-new-declarator:
[ expression ]
direct-new-declarator [ constant-expression ]
じゃこれか
配列newにはnew-initializeroptは使えない
0826デフォルトの名無しさん
2011/02/07(月) 00:49:45direct-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 )
0827デフォルトの名無しさん
2011/02/07(月) 00:53:20あんたもしつこいねえ。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;
}
0828デフォルトの名無しさん
2011/02/07(月) 00:58:48×ostream_operator
○ostream_iterator
0829デフォルトの名無しさん
2011/02/07(月) 00:59:03値の指定はできないって、 >>820 でも書いてるだろ。
g++ を信じるというなら↓をコンパイルしてみるといい。
int main() { new int[100](); }
当然↓はエラーになる。
int main() { new int[100](1); }
0830デフォルトの名無しさん
2011/02/07(月) 01:00:55なんだ、空の()に限っていたのか
それは付けても付けなくても同じだろ元々
()の中に何か入れるとエラーになるという事を俺は言いたかったのさ
0831デフォルトの名無しさん
2011/02/07(月) 01:04:24あんた >>814 とは別人だったの?
で、 () 付けたらデフォルト初期化されるが、付けなかったら初期化されない。
これも >>811-812 見てたらわかるはずなんだけど。
0832デフォルトの名無しさん
2011/02/07(月) 01:07:03本当だおかしな値が入るな
0833デフォルトの名無しさん
2011/02/11(金) 21:35:57#define ROMC const far rom char
略
sprintf(gLcdBuf, (ROMC *)"CN%-2dCN%-2dCN%-2dCN%-2d", 1, 2, 3, 4);
この場合、(ROMC *)はどのような意味があるのでしょうか?
0834デフォルトの名無しさん
2011/02/11(金) 21:42:28文字列リテラルを指す char* (あるいは char const* )型の値を const far rom char* 型にキャスト。
far とか rom とかが何を指すのかはコンパイラか開発環境のドキュメントを嫁。
0835デフォルトの名無しさん
2011/02/11(金) 21:44:19rom なんてあったのか。
ggってみると PIC のコンパイラ(MPLAB-C) にあるようで。
でも PIC に far/near があるとは思えない。
>>833 はどこぞのコピペらしいし、変わった type qualifier をよせ集めてみただけじゃないかなあ。
0837デフォルトの名無しさん
2011/02/11(金) 23:09:25ありがとう。
PICのプログラムをAVRに移植してるところです。
それは、それは。
疑って申し訳ない。
0839デフォルトの名無しさん
2011/02/11(金) 23:34:46こちらこそ、スレ2つに書き込むのはルール違反でした。
0840デフォルトの名無しさん
2011/02/12(土) 16:25:25warning LNK4042: オブジェクトの指定が重複しています。余分なものは無視されます。
とのことですが
オブジェクトの指定とは何でしょうか
0841デフォルトの名無しさん
2011/02/12(土) 17:12:040842デフォルトの名無しさん
2011/02/13(日) 16:54:56クラスの内に書くとコンパイラにインライン化を要求する。
クラスの外に書くとインライン化されない。となるようですが…
ごく短い処理をわざわざクラス外にinline指定して書いてあるコードを見かけました。
かと思えば、同じコード内の非常に似通った機能の別のクラスでは内に書いてあり、混乱しています。
クラス内に書く方法と、クラス外にinline関数として書く方法では厳密な違いがあるのでしょうか?
0843デフォルトの名無しさん
2011/02/13(日) 16:58:48ありがとう
でもそういうことじゃないんです
そしてPC再起動で直ったってどういうこと
二つに違いはないと思います。
私についていえば、そもそも、クラスの定義の中でメソッドを書こうが、inline をつけてみようが、必ずしもインライン化されるとは限らないですから、
私は、クラスの内、外でわざわざ意味づけをしようとも思っていないのです。複数のモジュールに分けるときには、インラインコードはヘッダに書くように気をつけてはいますが。
0846デフォルトの名無しさん
2011/02/13(日) 20:21:07外部定義したときとインライン定義したときで、
微妙に実体化のタイミングが違ったりして
VCではだいじょうぶなのにgccではエラーになったりする
0847デフォルトの名無しさん
2011/02/13(日) 20:53:07仕事してない中年ニートの癖にw
0848デフォルトの名無しさん
2011/02/13(日) 22:43:22実装スキームの違いはあれど
検索ルールやPOIは厳格に決められているのだから
一方でエラーになるなんていうのはどっちかがクソ実装ってだけ
失礼しました。「メンバ関数」といいなおします。
0850デフォルトの名無しさん
2011/02/13(日) 23:44:10&記号についての質問なのですが、
int& a と int &a は異なるのでしょうか?
前者が参照を表すということは理解できます。
与えられたサンプルプログラムで、
メンバ関数の宣言では、引数にint& aと書いてあり、
メンバ関数の定義では仮引数にint &aと書かれています。
違いがいまいち理解できません。どなたかご教授お願いします。
0851デフォルトの名無しさん
2011/02/13(日) 23:45:18見た目が違うだけ
0852850
2011/02/13(日) 23:51:26そうなんですか。どうもありがとうございます。
参照を宣言するときは型宣言の直後に&を置く、と習っていました。
一緒ならどうしてこういう教え方をするんでしょうね・・・。
C では int *a, C++ では int* a; と書くのが昔からのお作法でした。(C には参照渡しはありませんが。)
0854デフォルトの名無しさん
2011/02/14(月) 01:55:150855デフォルトの名無しさん
2011/02/14(月) 02:58:270856デフォルトの名無しさん
2011/02/14(月) 03:03:04C++のハゲ親父は罪作り
int& a,b;
とかどうすんだよって感じ
>>852
>一緒ならどうしてこういう教え方をするんでしょうね・・・。
素人を混乱に陥れてプログラマの仕事を確保するためらしいよ
0857デフォルトの名無しさん
2011/02/14(月) 04:17:43あとFAQ
``int* p;''と``int *p;''はどちらが正しいですか
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace
0858デフォルトの名無しさん
2011/02/14(月) 05:37:570859デフォルトの名無しさん
2011/02/14(月) 09:23:50メッセージハンドルのswitch部分がどうしても汚くなってしまいます
上手く記述する方法はないでしょうか?
0860デフォルトの名無しさん
2011/02/14(月) 09:26:48ttp://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/message05/index.html
0861デフォルトの名無しさん
2011/02/14(月) 09:36:26各Handler関数のhash(キーはメッセージID等)を作ってテーブルジャンプにすれば良い
0862デフォルトの名無しさん
2011/02/14(月) 11:02:56無いとしたら代わりのものは何でしょうか?
0863デフォルトの名無しさん
2011/02/14(月) 11:04:38マクロつかってメッセージごとに処理を関数へ渡してるかんじですかね・・・
>>861
ハッシュテーブルを使ったことがないのでまともな実装が出来るか不安ですが
(HWND,LPARAM)を引数に持つ関数のポインタの配列、を要素に持つ配列
にハッシュ関数をつかって配列に処理を割り振って行けばいいのでしょうか?
STLが使えれば楽なのでしょうが自分の環境だとhash_mapが使えないみたいです・・・
0864デフォルトの名無しさん
2011/02/14(月) 11:09:15ハッシュを使わなくてもメッセージ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の型や数値、引き数なんかは調整してね
0865デフォルトの名無しさん
2011/02/14(月) 11:21:220866デフォルトの名無しさん
2011/02/14(月) 11:38:56typedef void Func(HWND,LPARAM);
std::map<UINT,*Func>
をラップするclassつくればいいんじゃない?というのは浅はか?
0867デフォルトの名無しさん
2011/02/14(月) 12:03:49あるよ。
VS2010 からだけど。
0868デフォルトの名無しさん
2011/02/14(月) 17:12:48// 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
こうですか?
0869デフォルトの名無しさん
2011/02/15(火) 05:34:33#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; }
0870デフォルトの名無しさん
2011/02/15(火) 06:06:31http://msinttypes.googlecode.com/svn/trunk/stdint.h
0871デフォルトの名無しさん
2011/02/15(火) 10:17:46きもっ!!
0872デフォルトの名無しさん
2011/02/15(火) 11:03:47もともとMainWndProc()とそのメッセージを処理するOn〜()が有って
ダイアログを追加するときにAddDlgProc()のメッセージを処理するOn〜()と関数名が被ってしまう場合
・関数名を工夫する
・namespaceを利用する
・ソースファイルの分割
どの対応が無難でしょうか?
0873デフォルトの名無しさん
2011/02/15(火) 11:28:360874デフォルトの名無しさん
2011/02/15(火) 11:31:370875デフォルトの名無しさん
2011/02/16(水) 00:14:0432桁の電卓って・・
0876デフォルトの名無しさん
2011/02/16(水) 00:19:270877デフォルトの名無しさん
2011/02/16(水) 04:03:290878デフォルトの名無しさん
2011/02/16(水) 04:08:050879デフォルトの名無しさん
2011/02/16(水) 04:23:350880デフォルトの名無しさん
2011/02/16(水) 04:34:56手軽な所で MySQL は 65 桁まで行けるらしいよ
http://dev.mysql.com/doc/refman/5.1/ja/precision-math-decimal-changes.html
0881デフォルトの名無しさん
2011/02/16(水) 13:12:050882デフォルトの名無しさん
2011/02/16(水) 13:48:080883デフォルトの名無しさん
2011/02/16(水) 14:21:39mysql> 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)
0884デフォルトの名無しさん
2011/02/16(水) 15:44:12>>878見ると全部いけそうに見えるけど。
0885デフォルトの名無しさん
2011/02/16(水) 22:35:20電卓で使うようなのなら、遅くても平気だろうし。
0886デフォルトの名無しさん
2011/02/18(金) 00:46:24どう言うふうにしたいのか分らんけど、ちびっとでも見やすくしたいなら
MS提供のメッセージクラッカー
0887デフォルトの名無しさん
2011/02/18(金) 01:07:06つboost
0888デフォルトの名無しさん
2011/02/18(金) 04:29:530889デフォルトの名無しさん
2011/02/18(金) 15:44:34ただの関数ポインタ配列が有れば良いと思うんだけど
0890デフォルトの名無しさん
2011/02/18(金) 16:24:13効率は大事だよー。
0891デフォルトの名無しさん
2011/02/18(金) 17:30:170892デフォルトの名無しさん
2011/02/18(金) 17:59:510893デフォルトの名無しさん
2011/02/18(金) 18:35:07なによりテーブルジャンプになるので
CPUパイプラインにも有効なんだな
0894デフォルトの名無しさん
2011/02/18(金) 19:33:010895デフォルトの名無しさん
2011/02/18(金) 19:46:47自分凄いんだぜって自慢していることは分った
0896デフォルトの名無しさん
2011/02/18(金) 20:51:410897デフォルトの名無しさん
2011/02/18(金) 21:17:37いや線形探索なんかしない、単に大きい配列を用意するだけ
ウィンドウメッセージなんてそんなに離散してるわけじゃないからメッセージIDから規定値を減じたものを配列インデックスにすれば良い
処理しないメッセージID用に何もしないハンドラを用意するか関数ポインタをNULLにしておいて条件分岐するだけで良い
まぁメッセージIDから規定値を減ずるってのもハッシュの一種かも知れんけどね
0898デフォルトの名無しさん
2011/02/18(金) 21:26:500x4000(WM_USER)〜0x7fff コントロールのウィンドウクラス用
0x8000(WM_APP)〜0xBFFF アプリ用
0xC000〜0xFFFF RegisterWindowMessage用
だっけか
まあ実際には自分で処理するハンドラの分だけでいいから
こんなに要らないわな
0899デフォルトの名無しさん
2011/02/18(金) 22:33:030900デフォルトの名無しさん
2011/02/18(金) 22:38:400901デフォルトの名無しさん
2011/02/18(金) 22:58:53型は普通のWindowProcでしょ?
LRESULT (*msg_table[0x10000])(HWND,UINT,WPARAM,LPARAM);
とかの関数ポインタのテーブルを用意して
if(msg_table[msg])return msg_table[msg](wnd,msg,wp,lp);
で呼び出すだけじゃない?
俺は赤黒木やハッシュで十分だと思うからわざわざやらないけどw
0902デフォルトの名無しさん
2011/02/18(金) 23:04:23windowsx.hやMFC/WTLのメッセージクラッカーは、ハンドラの引数がメッセージによって
違うでしょ、そのことを言ってるんじゃないの
まあ、全部一緒のほうがある意味分かりやすいし、実装も単純になるが
0903デフォルトの名無しさん
2011/02/18(金) 23:05:38>その配列の型が固定できない
色々型を入れられる配列コンテナを実現するのがプログラマ
誰かが作った便利なのを利用する(メッセージクラッカーとか)だけのがドカタ
>>900
基本的に全部のメッセージ処理できるようじゃないとな
これやあれは処理できませんじゃ><
0904デフォルトの名無しさん
2011/02/18(金) 23:12:37色々なものを入れるだけなら困らんだろ、所詮ただのポインタだし
呼ぶときに困るんでしょ?
引数の個数や型がまちまちなんだから
0905デフォルトの名無しさん
2011/02/18(金) 23:28:39hoge msg_xxx_sub(x,y,z){
}
LRESULT msg_xxx(wnd,msg,wp,lp){
msg_xxx_sub(...);
}
msg_table[xxx] = msg_xxx;
とかにするだけじゃないの?
で、これを扱いやすいよう整えていくと
既存のフレームワークの車輪になるから
わざわざ自作する必要ないのだが。
0906デフォルトの名無しさん
2011/02/18(金) 23:29:35>引数の個数や型がまちまちなんだから
それを呼ぶときに困るないようにするのがプログラマ
自分のやりたいことを実現するのがプログラマ
あーだこーだと言って実現できないっていうのがドカタ
俺、ドカタだからドカタtraitsはよく分る
0907デフォルトの名無しさん
2011/02/18(金) 23:48:16それはmsg_xxx -> msg_xxx_dubを「自分で」書かせる時点で
既存のメッセージクラッカーより劣る
で、それを整えたものがメッセージクラッカーで、勿論車輪の再発明で、
最初からやるだけ無駄
0908デフォルトの名無しさん
2011/02/18(金) 23:51:38> これを扱いやすいよう整えていくと
> 既存のフレームワークの車輪になるから
> わざわざ自作する必要ないのだが。
眼科池よ
0909デフォルトの名無しさん
2011/02/19(土) 00:01:32実行時にダイナミックにハンドラの追加削除が出来る新しいタイプの車輪だろ
0911デフォルトの名無しさん
2011/02/19(土) 00:14:38ついや線形探索なんかしない、単に大きい配列を用意するだけ
配列とハッシュは別物だぞ
2行目に至ってはメリットが分からない
大丈夫?
0912デフォルトの名無しさん
2011/02/19(土) 00:19:02メニューが色々変わったりするのあるじゃん
0913デフォルトの名無しさん
2011/02/19(土) 00:19:58int func()[1];
関数ポインタも返却値の型にできます
typedef int (*RET)();
RET func();
でも関数ポインタの配列を返却値の型にしようとするとエラーが起きます
なぜなんでしょ?_?
typedef int (*RET)();
RET func()[1]; // NG
0914デフォルトの名無しさん
2011/02/19(土) 00:21:390915デフォルトの名無しさん
2011/02/19(土) 00:24:17RET func[1];
0916デフォルトの名無しさん
2011/02/19(土) 00:24:36?????顔のAAを誰か張ってやってくれ
0917デフォルトの名無しさん
2011/02/19(土) 00:24:36それは関数じゃなくて配列ですし…
0918デフォルトの名無しさん
2011/02/19(土) 00:25:26それも関数じゃなくて配列…
0919デフォルトの名無しさん
2011/02/19(土) 00:27:02動的生成するメニューを差し替えるだけじゃん
デザインパターンの入門書でも読みなさい
0920デフォルトの名無しさん
2011/02/19(土) 00:36:42配列を戻り値で返すなんてどうやるんだよ
0921デフォルトの名無しさん
2011/02/19(土) 00:38:14関数の引数にしてもそうだけどさ
実際には配列はファーストクラスオブジェクトではなくて
関数に渡したり戻り値として返したりできないのに
構文上はそのように見える書き方もできるから……
0922デフォルトの名無しさん
2011/02/19(土) 00:39:23「どうやるか」は問題ではないんです。規格として許されるのかどうかって話なので…。
なんでこんな質問をするかというと、トレイツテンプレートクラスにおいて
関数型の判別にそのような宣言へのマッチングを利用するからです。
具体的にはメンバ関数テンプレートにおいて以下のようにします。
template < typename T > static char test( ... ); // すべてにマッチ
template < typename T > static int test( T (*)[1] ); // void, 参照, 関数以外にマッチ
boostでこんな感じにやってるんですが、どうしてうまく動くのかしら、と
0923デフォルトの名無しさん
2011/02/19(土) 02:17:40sizeof
0924デフォルトの名無しさん
2011/02/19(土) 03:25:57やりたいことがすでに提供されているにもかかわらず、無駄の多いオレオレ実装をするのもドカタ。
>>908
じゃあなんでメッセージクラッカーの話に対して訳わからん自前処理書いたの?
0925922
2011/02/20(日) 13:29:28.110926デフォルトの名無しさん
2011/02/20(日) 15:58:38.950927デフォルトの名無しさん
2011/02/20(日) 18:41:49.54あとでうpする予定
0928デフォルトの名無しさん
2011/02/20(日) 22:33:00.880929デフォルトの名無しさん
2011/02/21(月) 13:14:19.060930デフォルトの名無しさん
2011/02/21(月) 15:12:45.13何で再発明しようとすんの?
0931デフォルトの名無しさん
2011/02/21(月) 22:06:33.72クレクレ
0932デフォルトの名無しさん
2011/02/21(月) 22:19:42.570933デフォルトの名無しさん
2011/02/21(月) 22:53:43.03それだけでアルゴリズム特許獲れるよw
無駄に公開すんじゃねぇ
0934デフォルトの名無しさん
2011/02/22(火) 00:34:30.140935デフォルトの名無しさん
2011/02/22(火) 00:44:06.650936デフォルトの名無しさん
2011/02/22(火) 01:04:48.91簡単なのは、ムリ
0937デフォルトの名無しさん
2011/02/22(火) 10:19:25.770938デフォルトの名無しさん
2011/02/22(火) 15:41:04.35非商用ならOKというライセンスを設けてることが多いね
0939デフォルトの名無しさん
2011/02/22(火) 21:13:40.530940デフォルトの名無しさん
2011/02/22(火) 23:56:48.04なってたけど、ランレングス圧縮にちょっと改良を加えただけみたいな
アルゴリズムでも特許になってたりするとかかかれてたな。
0941デフォルトの名無しさん
2011/02/23(水) 00:06:57.89ある業界だけど、2つの円の大きさの差を求めるのに、
「直径同士を引き算する」特許が取られている。
一方ロシアは「半径同士を引き算してから2倍した」的な特許もある。
0942デフォルトの名無しさん
2011/02/23(水) 00:57:01.20特許にはならない
0943デフォルトの名無しさん
2011/02/23(水) 16:45:38.82既知のものかとかの調査を申請全部にするなら今の数万倍の予算がいる。
制度の設計自体が、争いになってから無効審判請求とかで解決しろってなスタンス。
0944デフォルトの名無しさん
2011/02/23(水) 17:00:48.73代入演算はできないものなんでしょうか?
コンパイルエラーになるんです。 http://ideone.com/qaGs6
どうしてこうなのか、また解決策をご存知の方
いらっしゃいましたら教えていただけませんか?
0945デフォルトの名無しさん
2011/02/23(水) 17:23:11.360946デフォルトの名無しさん
2011/02/23(水) 17:45:55.47{
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
0947デフォルトの名無しさん
2011/02/23(水) 18:01:41.04そうですね、constですから、考え直してみたら
代入出来ないのは当たり前でした。すみません。
ちょっと質問を変えます。
このmap::value_typeのキー部分が
constになっていない型が欲しいのですが、
mapのテンプレート引数を同じようにタイプして
型を作るよりもスマートなやり方というのはないでしょうか?
0948デフォルトの名無しさん
2011/02/23(水) 18:29:48.47std::mapの仕組みについて再考察した方がよい
firstがconstでないと、キーを変える度にツリーを再構築しなければいけない
これは無視できるコストではないのでconstにしたのだと思う
0949デフォルトの名無しさん
2011/02/23(水) 18:41:46.490950デフォルトの名無しさん
2011/02/23(水) 23:48:25.64それ未満はドカタ
0951デフォルトの名無しさん
2011/02/24(木) 00:01:24.81それを巨大なmapで何回もやってごらん
ものすごい時間が掛かるから
だからメンバ関数に入れなかったのだろう
自分の責任においてやる分には一向に構わないわけで
0952デフォルトの名無しさん
2011/02/24(木) 00:35:18.64VSのデバッグ機能などに寄与するとかあるんでしょうか?
自分はC++覚えたてのときから変数は必要になってから宣言即初期化してたんですが…
0953デフォルトの名無しさん
2011/02/24(木) 00:48:34.18ないよ。ただの悪習でしかないから、宣言即初期化(そして const )を貫くがいい。
0954デフォルトの名無しさん
2011/02/24(木) 01:21:00.51ありがとうございます。貫きます。
0955デフォルトの名無しさん
2011/02/24(木) 02:01:16.62insertとかeraseは使えないのだろうか。
0956デフォルトの名無しさん
2011/02/24(木) 02:06:11.690957デフォルトの名無しさん
2011/02/24(木) 02:10:18.880958デフォルトの名無しさん
2011/02/24(木) 02:19:05.21日本語不自由なやつだな。
「削除→挿入によってキーへの代入と同等のことをする操作は巨大なmapで何回もやると
ものすごい時間が掛かるから、メンバ関数には入れなかったのだろう」
ということ。
0959デフォルトの名無しさん
2011/02/24(木) 02:27:31.89誰かほしがってたのかな。
0960デフォルトの名無しさん
2011/02/24(木) 02:35:06.910961デフォルトの名無しさん
2011/02/24(木) 02:37:59.820962デフォルトの名無しさん
2011/02/24(木) 04:54:04.780963デフォルトの名無しさん
2011/02/24(木) 07:13:23.630964デフォルトの名無しさん
2011/02/24(木) 07:31:00.16かっこいいな。
0965デフォルトの名無しさん
2011/02/24(木) 13:29:26.83operator[]と組み合わせて使うとまた別の意味になるけど
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>);
}
0966デフォルトの名無しさん
2011/02/24(木) 16:33:31.650967デフォルトの名無しさん
2011/02/27(日) 08:17:44.820968デフォルトの名無しさん
2011/03/01(火) 02:00:25.02Shared Libraryとして作ったプロジェクトのソースにmain()って書けないの?
デバッグはどうやれば?
つまり
-shared
オプションがつけられた場合に
リンカはmain()が含められたオブジェクトファイルをリンクしてくれるのかどうか
ということかな
0969デフォルトの名無しさん
2011/03/02(水) 06:56:53.41いちいちnamespace{}で囲わないといけないんでしょうか
0970デフォルトの名無しさん
2011/03/02(水) 13:02:38.510971デフォルトの名無しさん
2011/03/03(木) 20:21:15.68windowsならLONG_PTR?
0972デフォルトの名無しさん
2011/03/03(木) 20:23:40.740973デフォルトの名無しさん
2011/03/03(木) 20:24:58.33値が欲しいんです
0974デフォルトの名無しさん
2011/03/03(木) 20:50:10.530975デフォルトの名無しさん
2011/03/03(木) 21:42:31.72情弱乙
0976デフォルトの名無しさん
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を利用するプログラムの両方に
実体が出来るため、リンクに失敗します。
こういう場合、一体どうすればいいのでしょう?
0977デフォルトの名無しさん
2011/03/03(木) 23:25:16.450978デフォルトの名無しさん
2011/03/03(木) 23:25:52.830979デフォルトの名無しさん
2011/03/03(木) 23:31:03.54これは読みだすだけで初期化以外に書き込みは発生しません。
具体的には、構文解析用のAction、Goto、SemanticActionの各テーブルです。
パーサーのインスタンスごとにメモリーを確保、初期化しても最近のコンピューターであれば問題
ないかもしれませんが、できれば無駄をなくしたいと思った次第。
よろしくお願いします。
0980デフォルトの名無しさん
2011/03/03(木) 23:45:34.430981デフォルトの名無しさん
2011/03/03(木) 23:48:45.680983デフォルトの名無しさん
2011/03/03(木) 23:49:12.560984デフォルトの名無しさん
2011/03/03(木) 23:56:35.19Singleton使ったらうまく行かない?
0985デフォルトの名無しさん
2011/03/03(木) 23:58:48.19うまくいくけど、クリティカルセクションが必要になってスマートじゃない予感がする。
0986デフォルトの名無しさん
2011/03/04(金) 00:30:39.63const char *table = "\x00\x01\x02........";
0987デフォルトの名無しさん
2011/03/04(金) 00:40:52.35C++0x待つか。
初期化タイミングが保障されるらしいし。
0988デフォルトの名無しさん
2011/03/04(金) 01:00:07.290989デフォルトの名無しさん
2011/03/04(金) 02:08:05.45スマートである必要はないだろ
動けば今はいいんだろ?
規格で保証されてない動作をあれこれ考えるより余程いい
0990デフォルトの名無しさん
2011/03/04(金) 03:06:41.08struct 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;
}
となってしまいます。
どのようにすれば良いのでしょうか。
0991デフォルトの名無しさん
2011/03/04(金) 03:15:55.96型が合ってないのが悪いんだから、
if(pInfo==&(*itr))
でいいんじゃね?
0992デフォルトの名無しさん
2011/03/04(金) 03:29:53.87次スレお願いします
0993デフォルトの名無しさん
2011/03/04(金) 08:42:53.57struct Info の operator == を自前定義したうえで *pInfo == *itr
0994デフォルトの名無しさん
2011/03/04(金) 15:02:30.56次スレ案内
【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/
うめ
0995デフォルトの名無しさん
2011/03/04(金) 16:45:51.27{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
};
で初期化出来ますが、
*abc[][3] の配列(というか *abc[][3] を指すポインタ)は、
char **xyz[][3] = {abc, def, ...};
じゃ代入出来ないんですけど、
どう書いたら良いでしょうか?
0996デフォルトの名無しさん
2011/03/04(金) 16:50:14.640997デフォルトの名無しさん
2011/03/04(金) 16:53:54.98typedef const char* type[4][3];
type* p = &abc;
とでも書いたらどうだろう
0998デフォルトの名無しさん
2011/03/04(金) 16:56:10.84出来ました!!
ありがとうございました!!!
0999デフォルトの名無しさん
2011/03/04(金) 17:02:16.961000デフォルトの名無しさん
2011/03/04(金) 17:02:58.9910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。