【初心者歓迎】C/C++室 Ver.74【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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が重い事があるのでここも利用)
2デフォルトの名無しさん:2010/11/09(火) 18:27:54
http://d.hatena.ne.jp/aidiary/20091122/1258853886のプログラムをVC++2008で
動かしたいのですが、以下の部分のエラーでコンパイル出来ません。
問題点分かる方いましたらご教授お願いします。
ヘッダはサイトのものに<vector>,<string>を追加でincludeしました。
以下問題点と思われる部分
131 /**
132 * 物体ID->物体名のmapを作成して返す
134 * @param[in]  filename  物体ID->物体名の対応を格納したファイル
135 * @param[out] id2name   物体ID->物体名のmap
137 * @return 成功ならtrue、失敗ならfalse
138 */
139 bool loadObjectId(const char *filename, map<int, string>& id2name) {
140    // 物体IDと物体名を格納したファイルを開く
141   wifstream objFile(filename);
  (略)
146
147    // 1行ずつ読み込み、物体ID->物体名のmapを作成
148    string line;
149    while (getline(objFile, line, '\n')) {
150        // タブで分割した文字列をldataへ格納
151        vector<string> ldata;
152        istringstream ss(line);
153        string s;
154        while (getline(ss, s, '\t')) {
155            ldata.push_back(s);
156        }
158        // 物体IDと物体名を抽出してmapへ格納
159        int objId = atol(ldata[0].c_str());
160        string objName = ldata[1];
161        id2name.insert(map<int, string>::value_type(objId, objName));
162    }
  (略)
3デフォルトの名無しさん:2010/11/09(火) 18:29:42
コンパイル実行時のエラー
error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits>
&,std::basic_string<_Elem,_Traits,_Alloc> &)' : 2 引数が必要です - 3 が設定されます。
1> c:\program files\microsoft visual studio 9.0\vc\include\string(527) : 'std::getline' の宣言を確認してください。
1>c:\visual studio 2008\projects\test\test\test.cpp(149) : error C2784: 'std::basic_istream<_Elem,_Traits>
&std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)' : テンプレート 引数を 'std::basic_istream<_Elem,_Traits> &' に対して 'std::wifstream' から減少できませんでした
1> c:\program files\microsoft visual studio 9.0\vc\include\string(475) : 'std::getline' の宣言を確認してください。
1>c:\visual studio 2008\projects\test\test\test.cpp(149) : error C2782: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)'
: テンプレート のパラメータ '_Elem' があいまいです。
1> c:\program files\microsoft visual studio 9.0\vc\include\string(475) : 'std::getline' の宣言を確認してください。
1> 'char' の可能性があります。
4デフォルトの名無しさん:2010/11/09(火) 19:07:23
よう無能ども。w
52:2010/11/09(火) 22:40:12
上記に#include <sstream>加えてwifstream→ifstreamで何の問題も無く実行出来ました。
スレ汚し失礼しました。
6デフォルトの名無しさん:2010/11/10(水) 07:41:44
詳しくは知らないのですが、xpだとC++で.NET使わない方法でプログラミングしたソフトは処理が高速なんですよね?
win7の場合もやっぱりC++で.NET使わないほうが高速なのですか?
それとも、.NET使った場合とあまり処理速度は変わりませんか?
7デフォルトの名無しさん:2010/11/10(水) 09:21:39
最近は.NETの方が高速だよ
8デフォルトの名無しさん:2010/11/10(水) 09:34:48
>>6
C++はプログラム言語。
.NETはライブラリの名前。
.NETを利用できる言語にC#やVB.NETなどが存在する。
で、普通は言語+ライブラリのセットで開発する。

.NETの場合、C# + .NET2.0 みたいな形で開発する。
C++の場合、C++ + Microsoft C++ Runtime Liburary + Windows API みたいな形で開発する。

で、質問への答えですが、一般的に
C++の方が高速です。
メモリ使用量についてもC++の方が少量で済みます。

ただ開発効率ではC#の方が高く、初心者にとっては.NET系の言語の方が扱いやすくライブラリも充実しています。
この辺りはトレードオフの関係だと思うので、用途によって使い分けるのがベターかと思います。
中には双方の特性をミックスして開発してる人もいます。
速度を追求する部分はC++でdll化し、GUIや速度を求めない実装はC#でなど。
9デフォルトの名無しさん:2010/11/10(水) 09:56:50
きもいです^^
10デフォルトの名無しさん:2010/11/11(木) 10:16:09
test kakiko.
11デフォルトの名無しさん:2010/11/11(木) 22:12:24
windows7,vc++2010でコンソールアプリの勉強をしています。

std::wcout << L"\u00A0";
を実行した後、文字が表示されなくなります
以下コード
#include <iostream>
#include <tchar.h>
int _tmain(int argc, _TCHAR *argv[]) {
std::locale::global(std::locale("japanese"));
std::wcout << L"before" << std::endl;
std::wcout << L"\u00A0" << std::endl; //問題のコード
std::wcout << L"after" << std::endl; // 表示されない
return 0;
}
だれか助けて
12デフォルトの名無しさん:2010/11/11(木) 22:13:28
すみません
ageてしまいましたorz
13デフォルトの名無しさん:2010/11/11(木) 22:36:22
double (*)(int) から int (*)(int) のキャストって
どのように定義されてるのでしょうか
14デフォルトの名無しさん:2010/11/11(木) 23:26:34
>>11
ユニバーサルキャラクタ名
ttp://seclan.dll.jp/c99d/c99d03.htm

この絡みかな知らんけどw
15デフォルトの名無しさん:2010/11/12(金) 01:10:48
iostream に Unicode は鬼門。
16デフォルトの名無しさん:2010/11/12(金) 02:00:21
Windows.hをインクルードしてるのですが、
これによって使えるPOINT構造体は
int func(POINT pt);

func(POINT(0, 0));のように使えないのでしょうか?
17デフォルトの名無しさん:2010/11/12(金) 02:18:15
windows.hはCでも使えるように、C++固有の機能を使わないで作られてる
そしてPOINT(0,0)のようなコンストラクタ構文は、C++固有の機能だ
18デフォルトの名無しさん:2010/11/12(金) 02:27:40
C++やってるのかお前ら
かっこいいな
俺もやりたいけど難しすぎるよ
ランタイムなしで高速に起動するアプリ
かっこよすぎる
おれには無理だが
おまえらがんばってくれ
グフッ・・・・
19デフォルトの名無しさん:2010/11/12(金) 02:44:49
>>18
早まるな。たいていのお客さんは起動の速さより納期の短さを優先する。
20デフォルトの名無しさん:2010/11/12(金) 11:12:37
>>11
cygwinだと問題ないんだがなぁ。尤も、localeは"C"で試したけど。
vc固有の問題っぽいから回答つかないようならvcスレで聞きなおしてみたら?

>>13
なんでまたそんな危なっかしいことを……

>>16
MFCならCPointがPOINTをラップしてたと思うけど、それを使えないなら自作するしか。
21デフォルトの名無しさん:2010/11/12(金) 13:45:23
s-jisコードをユニコードに変換する方法教えてください。
22デフォルトの名無しさん:2010/11/12(金) 13:50:23
>>21
libiconvかなにか、適当なライブラリを使う。
23デフォルトの名無しさん:2010/11/12(金) 15:25:12
ライブラリーですか・・・・
できれば手動で変換したいのですが
やり方とかしりませんか?
24デフォルトの名無しさん:2010/11/12(金) 16:06:15
手動でやりたいとか正気か?
あんたが思っている以上にめんどくさいぞ
おとなしくライブラリ使っとけ
25デフォルトの名無しさん:2010/11/12(金) 16:58:04
>>24
一度Wikipediaで漢字コード表を見比べてみるといい。
ttp://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_4000-4FFF
unicodeは例えばここの4e00から見て判るように、部首画数順に並んでいる。
一方SJISはJISc6226がベースになっているのであいうえお順に並んでいる。
とてもじゃないが、手作業でできるようなものじゃない。
26デフォルトの名無しさん:2010/11/12(金) 17:16:32
ライブラリ作った人は手作業でやったの?
27デフォルトの名無しさん:2010/11/12(金) 17:43:16
少なくとも最初の一回はコード表を睨めっこしたんじゃない?
コード表をOCRしたかもしらんが。
28デフォルトの名無しさん:2010/11/12(金) 18:25:15
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
これとかを取り込めばとりあえずは変換できるんじゃないかな
29デフォルトの名無しさん:2010/11/12(金) 18:50:14
単純に一対一で変換すればいいってもんでもないからな。
というか、どうして自前での変換にこだわるのかわからん。
>>21 の環境がなんなのかわからないけど、Windows環境ならAPI関数ひとつ
呼ぶだけだぞ。
30デフォルトの名無しさん:2010/11/12(金) 20:45:59
VC++2008EEを使っています

struct A
{
int a;
float b;
};

という構造体がある場合、
ポインタをつかって aに整数を、bに小数を代入したいのですが
ポインタの型は何で宣言すればいいのでしょうか?

int型のポインタに構造体のアドレスを入れ、ポインタからbに少数を代入しようとすると
'float' から 'int' への変換です。データが失われる可能性があります。
という警告が出て、bの値がが整数に直されます
float型のポインタに構造体のアドレスを入れようとすると今度はまた別なエラーが出ます
どうすればいいのでしょうか?
31デフォルトの名無しさん:2010/11/12(金) 20:51:05
なぜA型のポインタを使わない
32デフォルトの名無しさん:2010/11/12(金) 21:04:16
基礎の基礎でしたね・・・
すいません。最初のほうから勉強しなおします
33デフォルトの名無しさん:2010/11/12(金) 22:56:15
>> 20
std::locale("C")で解決でした。
実際には日本語を利用したいのでlocaleはC->japaneseにする必要があるのですが
日本語文字列を出力する場合は"C"だと日本語出ず、
日本語出したくて"japanese"だと"\u00a0"以降文字列出ずorz

SDKでwindow作ってそっちに出してみます。
レスくれた方、thx
34デフォルトの名無しさん:2010/11/15(月) 03:08:01
ここで質問していいものか分かりませんがC++で書いてるのでここで
Win32API/GDI+の質問です

GDI+のImageクラスをnewでインスタンス化した後
deleteで解放するとエラー落ちしてしまいます

デバッグモードのときのみエラーが発生するようで
デバッグなしだと問題なく(?)処理できてるようです
(問題ないように見えているだけかもしれませんが)
もちろんdeleteしないとメモリリークは発生しています

どうすれば解決するでしょうか
35デフォルトの名無しさん:2010/11/15(月) 04:21:16
よくあるパターンだね
36デフォルトの名無しさん:2010/11/15(月) 04:53:34
ヒープの管理ブロックを壊してる可能性が大。
もちろん、壊している場所は、deleteを呼んでいる場所ではない。
37デフォルトの名無しさん:2010/11/15(月) 04:59:28
単純にファイル開きっぱなしなのでは
3834:2010/11/15(月) 15:32:22
>>36
エラーメッセージはその通りでヒープが壊れてると言われます

「ヒープが壊れていることが原因として考えられます。XXXX.exe または読み込まれた DLL にバグがあります。」

ためしにnewで確保してすぐdeleteしてみても同じエラーが出るので
Imageクラスの扱い以外の部分で問題が起きてるようには見えませんでした
newでの扱い方自体に何か根本的な問題があるのでしょうか

>>37
ファイルというのは画像ファイルということでしょうか?
読み込んだ画像ファイルを解放するような操作が必要なのでしょうか
自分で調べた限りではよく分かりませんでした


newで確保しなければ問題は一応回避できるのですが
やはり解決策を知っておかないと後々苦労しそうなので是非おねがいします
39デフォルトの名無しさん:2010/11/15(月) 15:40:02
new で得たアドレスが実はNULLとか。
またはImageのGetLastStatus()で0以外(エラー)が入っていないかどうか。
4034:2010/11/15(月) 15:53:16
>>39
ウォッチしてみてもアドレスがNULLということは無いみたいです
GetLastStatus()の戻り値もOk(=0)でした
画像描画自体も問題なく行われているのですが・・・
deleteがなぜ上手くいかないのかよく分かりません
41デフォルトの名無しさん:2010/11/15(月) 15:55:11
スマポ使えスマポ
42デフォルトの名無しさん:2010/11/15(月) 16:01:24
うまく動かない最小のコードを出せ
43デフォルトの名無しさん:2010/11/15(月) 16:03:01
それが一番だね。コンパイラのバージョンも提示してくれると判りやすい。
4434:2010/11/15(月) 16:18:11
>>41
スマートポインタですか?
勉強してみます、ありがとうございました

>>42
試しに書いたコードです
Image* test = new Image(_T("img\\016.jpg"));
Status st = test->GetLastStatus();
delete test;

1行目で正しくアドレスが取得されました
2行目でエラーの確認、戻り値Okでした
3行目でヒープが壊れているというエラーが出て止まります
具体的にはGdiPlusBase.hのGdiPlusBaseクラス内で定義されている
deleteのオーバーライドの部分でブレークします

>>43
コンパイラはVC++2008Express Edition
Version 9.0.30729.1 SP 今年の8月ごろにインストールしたものです。
4534: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
上記のサイト様の通りに手直ししたところ無事解決しました

質問に答えてくださった方々、ありがとうございました
46デフォルトの名無しさん:2010/11/15(月) 21:00:14
(a<b)?a=1 : b=0;
これって
if (a<b) a=1;
else
b=0;
ってことですよね。
このような式の使い方を説明してるサイトってありますか?
47デフォルトの名無しさん:2010/11/15(月) 21:01:39
すいません自己解決しました。
条件演算子って言うんですね。
48デフォルトの名無しさん:2010/11/15(月) 21:25:29
>>46
いやな使い方だな。
49デフォルトの名無しさん:2010/11/15(月) 22:39:41
>>46
#include <ctype.h>
char c;
printf("%c\n", (isprint(c)) ? c : '.');
というふうに、値を返すときに便利です。
条件演算子をネストに使うと便利さが倍増します。
50デフォルトの名無しさん:2010/11/15(月) 22:50:20
難解さも倍増するけどな
51デフォルトの名無しさん:2010/11/15(月) 23:14:20
そう、Cの世界に関数型言語のような条件式を持ち込めるのです
なんと便利なことか  ああ便利便利
52デフォルトの名無しさん:2010/11/15(月) 23:16:26
条件演算子、目のカタキにするのやめてほしい。
53デフォルトの名無しさん:2010/11/18(木) 01:25:22
ツリービューの項目をドラッグ&ドロップして移動しようと思ってます。
ところがTreeView_CreateDragImageの戻り値がNULLになってしまいます。
原因として考えられることはなんでしょうか。
54デフォルトの名無しさん:2010/11/18(木) 09:24:26
>>53
お使いのGUIライブラリ、フレームワークなどのスレへどうぞ。
55デフォルトの名無しさん:2010/11/18(木) 12:03:48
シリアルポートを利用するとき
ポートが開けない、もしくは通信中タイムアウトになった場合は
引数でエラーを通知するべきか例外を送出するべきでしょうか?

また例外を送出する場合と引数などでエラーを通知する場合の使い分けの指針のような物はあるのでしょうか
56デフォルトの名無しさん:2010/11/18(木) 14:54:27
#define IF
#define THEN ?
#define ELSE :

s = IF cond THEN "T" ELSE "F";

みたいなコードを見たことがあるが、なるほど関数型言語かぶれだったのか
57デフォルトの名無しさん:2010/11/18(木) 15:01:13
俺はそんな表記法の関数型言語は知らん
どことなくFORTHくさい気がしたが・・・微妙に違うなぁ
何の言語だろう
BASICか?
58デフォルトの名無しさん:2010/11/18(木) 20:47:20
一瞬BASICっぽいように見えたけど、BASICにはIF文に戻り値があるなんて発想はないな。
むしろExcelかぶれなのかもしれん。
59デフォルトの名無しさん:2010/11/18(木) 21:29:21
OCamlやF#がそれっぽい
let ff =
  let rec ff' s n = if n = 0 then s else n::ff' s (n-1)
  ff' [];;
60デフォルトの名無しさん:2010/11/18(木) 21:48:07
cond といえば元祖 lisp 様ではないか?
61よろしくお願いします:2010/11/19(金) 00:30:22
以下のような無名の名前空間から関数 timeを呼び出すようなコードが、
複数のcppファイルのなかに書いてあります。
このとき、gen が初期化されるタイミングや順序はどのように規定されているのでしょうか?

namespace {
 boost::mt19937 gen( static_cast<unsigned long>(time(0)) );
 boost::uniform_smallint<> dst( 1, 6 );
 boost::variate_generator<boost::mt19937&, boost::uniform_real<> > rand( gen, dst );
}

このコードは不適切と考えて良いのでしょうか?
(timeが複数のcppファイル内のgenに同じ時刻を返す場合があり、
 このため独立であってほしい乱数系列に相関が出てしまう可能性が高いため)
62デフォルトの名無しさん:2010/11/19(金) 00:50:13
不適切だから捨てろ
63デフォルトの名無しさん:2010/11/19(金) 00:55:45
ではどうすればよいのですか?はなからグローバル変数として定義したほうがいいですかね?
6453:2010/11/19(金) 01:11:38
>>54
Win32APIスレで聞きましたが相手にされませんでした・・・。
もしよければ教えてください。
TreeView_CreateDragImageを使うには何か下準備がいるんでしょうか?
65デフォルトの名無しさん:2010/11/19(金) 01:15:46
ttp://support.microsoft.com/kb/214814/ja
この通りにしてもできないのか?
66デフォルトの名無しさん:2010/11/19(金) 01:21:41
>>61
1翻訳単位内であれば定義順
6753:2010/11/19(金) 01:30:03
>>65
ありがとうございます。結論から言うと出来ました。
まずTreeView_SetImageListでイメージリストを関連付けなくてはならなかったようです。
そちらなども色々と見てましたが書いてなかったもので迂闊でした。
どうもありがとうございました。
6861:2010/11/19(金) 01:40:53
>>62 >>66
ありがとうございました。

/* hoge.cpp */
namespace { A hoge( func() ); B mage( func() ); }
/* fuga.cpp */
namespace { A fuga( func() ); }

こんな感じのとき、hoge、mageの順にfunc()が呼ばれるけど、
(hoge, mage)と(fuga)のどちらのfunc()が呼ばれるかはわからない、
ということでいいのでしょうか。大変参考になりました。


69デフォルトの名無しさん:2010/11/19(金) 15:36:59
ホゲとかフガとかキモい
70デフォルトの名無しさん:2010/11/19(金) 15:47:37
>>69
ようハゲ
71デフォルトの名無しさん:2010/11/19(金) 15:57:38
hogeとかfugaとか使いたくなる年頃ってあるよなwww
俺は恥ずかしくて使わないが
72デフォルトの名無しさん:2010/11/19(金) 16:19:18
恥ずかしいっていうか、発想が貧困な子なのかなって思うな
73デフォルトの名無しさん:2010/11/19(金) 20:09:14
AとかBとかってのもひどいな
74デフォルトの名無しさん:2010/11/20(土) 19:30:09
田中太郎
田中花子
田中・・・・・
田中一家で統一してしまえ
75デフォルトの名無しさん:2010/11/20(土) 23:09:51
msg1とかmsg2とか手抜きしたっていいじゃない
76デフォルトの名無しさん:2010/11/21(日) 00:37:04
自分の作った関数を勝手にシリーズ化されると腹が立つよな。
77デフォルトの名無しさん:2010/11/21(日) 06:54:15
String型をconst char*に変換って出来ますか?
PtrToStringCharsとかいうのはあるんですが、
なんかclrがどうとかでて使えません…
78デフォルトの名無しさん:2010/11/21(日) 10:32:51
ググったらこんな回答が・・・

http://soudan1.biglobe.ne.jp/qa4650429.html
79デフォルトの名無しさん:2010/11/21(日) 10:34:23
>>77
そのString型がどこに由来するか、どんなエラーメッセージが出るのか、それによって答えが異なるでしょう。
一般的には、できるはずです。
80デフォルトの名無しさん:2010/11/21(日) 11:20:05
ハッシュ関数作りました。
C言語で書いたのですが、どなたかレビューお願いします。
URL
http://sky.geocities.jp/tcshacina/hash.c
81デフォルトの名無しさん:2010/11/21(日) 11:38:53
C++/CLIでこのスレ汚すのやめてくれない?これC++じゃないから
82デフォルトの名無しさん:2010/11/21(日) 11:49:23
>>80
人に読ませるのならコメントくらいつけて欲しい
あと、コメントアウトしてる部分は削除して
83デフォルトの名無しさん:2010/11/21(日) 14:07:24
>>80
>>82の言うとおり、レビュー以前に書類不備で却下
84デフォルトの名無しさん:2010/11/21(日) 14:17:04
gcc(4.5.1)のc-parser.cだけを利用しようと思っています。
で、VC++でコンパイルしているわけだが(w、
gimple
という構造体を参照していて、この構造体が未定義(インクルードなし)
のためにエラーが出てます。構造体のありかをご存じの人いますか?
一応、gimple.h/cを観てみたが、見つけられなかった。。。
85デフォルトの名無しさん:2010/11/21(日) 14:30:50
>gimpleという構造体を参照していて
gimpleという構造体の宣言の間違いですた。
たとえば、
gimple stmt;
とか。
よろしくお願いします。
86デフォルトの名無しさん:2010/11/21(日) 16:00:11
>>84
スレ違い。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言語のパーサ使いたいなら自分で書いたほうが数倍早いぞ。
87デフォルトの名無しさん:2010/11/21(日) 17:21:52
>>86

アドバイスありがと。
gccへ行きます^^

#そうそう、今自分でかこうか考えてた所(w
88デフォルトの名無しさん:2010/11/21(日) 17:45:56
ついでに質問させて。

パーサをCでスクラッチで作るとすると、文字列用の関数を用意すべきだと思うが、
標準(stdio)ではそれら用のラッパー関数を作らにゃならん感じで、時間を使ってしまいそう。
少なくとも、Tclのストリング並みの関数群のライブラリをご存知の方いますか?

ご返答よろしくお願いします。
89デフォルトの名無しさん:2010/11/21(日) 18:42:19
文字列操作なんて入力からトークンを切り出すのと2つの識別子が同じか比較する以外になんかやることあるけ?
90デフォルトの名無しさん:2010/11/21(日) 23:52:43
Linux(GCC)ですが、Cのlocaltimeってマルチスレッドで使えるんでしょうか?
Visual C++だと戻り値がスレッドごとにメモリ確保されていますが、
Linuxでどうなのか調べがつきませんでした。
91デフォルトの名無しさん:2010/11/21(日) 23:57:13
localtime_r でぐぐれ
92デフォルトの名無しさん:2010/11/22(月) 04:35:54
class Something
{
public:
static int num;
};

このnumにほかのクラスから代入するにはどうしたらいいのですか?
これがstatic関数ならばその関数を使うことはできるのですがstatic変数が利用できません。
93デフォルトの名無しさん:2010/11/22(月) 04:56:34
>>89

トークンの切り出しでトリム機能があるとさくっと作れそうなんス。
Tclで半分パーサの機能を作った時の経験からそう思うんス。
94デフォルトの名無しさん:2010/11/22(月) 08:01:02
char *trim(char *s) {
return strtok(s, " \n\r\t");
}
95デフォルトの名無しさん:2010/11/22(月) 08:06:14
そんな関数にするぐらいなら
strtok(s, " \n\r\t");
普通に呼び出したほうがマシだろ
96デフォルトの名無しさん:2010/11/22(月) 12:36:46
>>92
なんでやねん
publicなんだからクラス関係ないだろ
Something::numで見えるだろ?
97デフォルトの名無しさん:2010/11/22(月) 12:58:25
>>92
後から心配になって来たのでやってみた
やっぱりうまく行くな

class Something {
public:
static int num;
};

int Something::num = 0;

class Other {
public:
void func() {
Something::num = 123;
}
};

int main()
{
Other o;

o.func();
std::cout << Something::num << std::endl;
}
98デフォルトの名無しさん:2010/11/22(月) 13:13:45
>>94
>>95
アドバイスありがと。
>>95
多分ラッパー関数と自分が書いたからだと思います。
彼の優しさだす。

切り出しに良い関数ですね。
99デフォルトの名無しさん:2010/11/22(月) 13:14:16
Something::num = 123; ではなくて int Something::num = 123; にしないと定義できないよ。
100デフォルトの名無しさん:2010/11/22(月) 13:27:11
>>99
そうなってるんだけど
お前の目はフシアナか?
101デフォルトの名無しさん:2010/11/22(月) 14:07:51
まさか二重定義されてるとは思わなかったw
102デフォルトの名無しさん:2010/11/22(月) 14:10:41
>>101
お前は一体なにを言ってるんだ
103デフォルトの名無しさん:2010/11/22(月) 14:21:48
>>101
もしかしてクラスの中で定義してないので変だと思ったのか

class Something {
public:
static int num = 123;
};

みたいな感じで

これだとstatic intしか初期化出来ないので、俺はいつも外部で定義している
104デフォルトの名無しさん: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);
}
105デフォルトの名無しさん:2010/11/22(月) 14:45:52
>>104
特に問題ないと思うから、ファイル名を変えてみたら?
106デフォルトの名無しさん:2010/11/22(月) 14:49:30
>>105
positon.cpp⇒sample_p.cppに変更してみましたが、
同様のエラーが出ました。
ヘッダーファイル名も変更すべきでしょうか?
107デフォルトの名無しさん:2010/11/22(月) 14:51:27
例のC++としてコンパイルするオプション・・・なんだっけ忘れた。
108デフォルトの名無しさん:2010/11/22(月) 14:53:20
>> 107
bcc32 -P positon.h sample_p.cpp
でコンパイルしてみたら通りました。
-Pオプションが必要だったとは・・・・。
ありがとうございました。
109デフォルトの名無しさん:2010/11/22(月) 14:55:47
C++やるなら無料のBCCなんて捨てろ
110デフォルトの名無しさん:2010/11/22(月) 14:58:17
>>109
学習用にサクッとコンパイル通すには便利だったんですが
他のコンパイラおすすめありますか?
111デフォルトの名無しさん:2010/11/22(月) 15:02:06
>>108
インクルードファイルはインクルードされるのに任せればいいからコンパイルしちゃダメ。
112デフォルトの名無しさん:2010/11/22(月) 15:03:45
>>110
食いつくと思わなったが一応解説しておくと
BCCの無料版は古いのでC++新しい機能を駆使しようとすると問題が多い
でも初心者が勉強していく上でそれにひっかかることはまず無いので忘れてください
113デフォルトの名無しさん:2010/11/22(月) 15:09:39
質問ばっかりすみません!
>>111
どういう意味でしょうか・・・?
114デフォルトの名無しさん:2010/11/22(月) 15:16:23
>>113
bcc32 sample_p.cppだけでOK。
position.hは、sample_p.cppに「インクルードせよ」と書かれているので勝手にインクルードされる。
115デフォルトの名無しさん:2010/11/22(月) 15:20:19
>>113
とりあえずbccでコンパイルしてみます
>>114
たしかにbcc sample_p.cppだけでコンパイルが通りました。
勉強になりました。ありがとうございます。
116 ◆/91kCCQXBo :2010/11/22(月) 15:59:39
>>284
>以前152
>で書き込ませていただいた者なんですが、教えていただいた通り、打ち込んでみたのですが、実行結果がでませんでした。
>なぜでしょうか?

7行目>>164
i=0; を
i=0; puts("数値を入力>"); に変えてみようか?
117デフォルトの名無しさん:2010/11/22(月) 16:37:11
>>110
勉強用ならgccがいいよ
bccはもう終わったコンパイラ
118デフォルトの名無しさん:2010/11/22(月) 17:28:18
Σ(゚∀゚) bccは終わコン!
119デフォルトの名無しさん:2010/11/22(月) 17:32:22
Σ(゚∀゚) bccは終っパイ!
120デフォルトの名無しさん:2010/11/22(月) 19:57:56
Σ(゚∀゚) b(ボインで)cc(CC)はオっパイ!
121デフォルトの名無しさん:2010/11/23(火) 11:20:30
C+でプログラミングしたいと思うのですが、オススメの書籍やソフトなどありますでしょうか??
122デフォルトの名無しさん:2010/11/23(火) 15:17:24
ifstream ifs( "data.txt" );
して、ファイルdata.txtを利用できるかって
ifs.good() == true で判断するの?
他になんか定石的な判断法あったら教えてね
123デフォルトの名無しさん:2010/11/23(火) 17:28:50
if (ifs) または if(!ifs) でよい
124デフォルトの名無しさん:2010/11/23(火) 20:50:27
>>123
ありがとうございます
そんなんで良いですか! 
駄目な時ifsを0にするって規格で決まっているですか?
125デフォルトの名無しさん:2010/11/23(火) 21:26:13
bool operator ! () const;
が有るんだよ
126デフォルトの名無しさん:2010/11/23(火) 22:15:03
>>123
if(!!ifs) か if(!ifs) じゃないか?
127デフォルトの名無しさん:2010/11/23(火) 22:24:36
if (ifs)って書けるようにoperator void*() constが定義されている。
C++0xのドラフトN3126だとexplict operator bool() constに変更されている模様。
128デフォルトの名無しさん:2010/11/23(火) 22:38:49
可読性低くなるからわかりやすいのを使ったほうがいいな
129デフォルトの名無しさん:2010/11/24(水) 00:30:49
>>125>>127 熱烈感謝わん
iosでoperator void*() const、bool operator ! () const定義されていて
if (ifs) -> operator void*() const,
null pointer if either failbit or badbit is set.

if(!ifs) -> bool operator ! () const,
true if either failbit or badbit is set
よりif (ifs) または if(!ifs)でokにゃんですね
130デフォルトの名無しさん:2010/11/24(水) 23:26:27
すみません、質問させてください。
環境はwindows7、コンパイラはBorland C++ Compiler 5.5です。
オイラー法で数値計算をして出力するEuler.exeという簡単なプログラムを作成したのですが、
コマンドプロンプト上で
>Euler.exe
とするときちんと計算結果がプロンプト上に表示されるのですが、
>Euler.exe>Euler.txt
とテキストファイル上に書き出すようにリダイレクトすると、プログラムが停止してしまいます。
プロンプト上では動作するので、プログラムの問題ではなくwindows7かコンパイラの問題だと思うのですが、
どなたか原因を教えていただけませんでしょうか。(今までの他のプログラムは出力できていました)
よろしくお願いいたします。
131デフォルトの名無しさん:2010/11/25(木) 03:46:17
>>130
7なら権限の問題ではないかね。
あ、でも他のプログラムではできたのか。
書き出すより先にプログラムが終了しちゃうとかかな?終了間際にウェイトを置いてみるとか。

ひっじょーにしょうもない質問ですが、Cで
getchar();
のようなEnter入力待ちって、C++でcinとか使ってできるのでしょうか?
132デフォルトの名無しさん:2010/11/25(木) 04:17:10
cin,get()
133デフォルトの名無しさん:2010/11/25(木) 14:47:18
>>132
あ、なるほど
ホンとしょーもない質問で失礼しました
こんな関数持ってたのね
134デフォルトの名無しさん:2010/11/25(木) 17:14:09
プログラム中でクラスの名前を表示したくて
cout << "node = " << typeid(*node).name() << "\n";
と書いて実行すると、
node = N3m3g8Sprite3DE
とかいう謎の文字列が得られるのですが、ただしくクラス名Sprite3Dだけを表示するにはどうすればいいですか?

135デフォルトの名無しさん:2010/11/25(木) 17:38:18
環境に依存しない方法では存在しない。
てっとりばやく何とかしたいなら、Visual C++を使え。
136デフォルトの名無しさん:2010/11/25(木) 17:39:48
>>134
自分で謎文字例からクラス名を取り出せば
たぶんこういうルールじゃね
N
3 m3g (3文字)
8 Sprite3D (8文字)
E
137134:2010/11/25(木) 17:48:38
面倒くさいので1行でお願いします。
138じゃあ1行で:2010/11/25(木) 17:55:17
デマングルでぐぐれ
139デフォルトの名無しさん:2010/11/25(木) 18:31:26
静的な型しかないC++で、何で型がわからないんだ? templateか?
パラメータになりそうな型と手当たり次第に比較したら?
template<typename T> char const *get_type_name(T const &t);
template<> char const *get_type_name(int const &) { return "int"; }
template<> char const *get_type_name(double const &) { return "double"; }
template<> char const *get_type_name(float const &) { return "float"; }
140デフォルトの名無しさん:2010/11/25(木) 18:37:56
>>134
g++ならabi::__cxa_demangle
141デフォルトの名無しさん:2010/11/25(木) 20:17:49
リフレクションみたいな機能が欲しいのか
decltypeはあれ何だっけ
142デフォルトの名無しさん:2010/11/26(金) 02:00:17
C言語の勉強をしたいのですが、無料の練習環境はありますか?
初心者用テキストに載っているコードが実行できる程度のもので構わないので、オススメがあったら教えてください。
143デフォルトの名無しさん:2010/11/26(金) 02:13:59
OSすら書かないとかマジパネェっすよ
144デフォルトの名無しさん:2010/11/26(金) 02:27:01
>>142
>初心者用テキスト
テキストに書いてあるオススメ
145デフォルトの名無しさん:2010/11/26(金) 10:07:15
練習用にcodepadまじオススメ
146デフォルトの名無しさん:2010/11/26(金) 12:04:27
>>142
Tiny C Compiler使ったのがいくつかあったような
147デフォルトの名無しさん:2010/11/27(土) 19:58:37
for (int i = 0; i < length; i++) {
int value = func();
}

これではループの度に変数iが宣言されて冗長だから

int i, value;
for (i = 0; i < length; i++) {
value = func();
}

C++でこうした方が速い、こうするべきだとよく書かれていますが
これだとループカウンタのスコープが外に出るので危険ですよね
それにこの一連の動作を関数で定義して、関数ごとループさせるような場合はあまり意味を成さないし
ループカウンタをメンバ変数やグローバル変数にするのも馬鹿げていると思います
基本も基本で恐縮ですが、実際のところ、皆様がどのように書かれているのか参考にさせていただければ幸いです
148デフォルトの名無しさん:2010/11/27(土) 20:01:34
冗長の何が悪いというんだ
書くのが面倒くさい、ぐらいしか思いつかない
149デフォルトの名無しさん:2010/11/27(土) 20:11:51
>>147
さっきのvectorのアホに感化されたか
150デフォルトの名無しさん:2010/11/27(土) 20:15:03
>>147
C++ってんならスコープを必要最小限に狭める上のほうが一般的だろう
下勧めてるとかどこのアホだ?

それはそれとして、ループのたびに確保ってvalueの方だよな?
なら全体をスコープで囲っちゃえば?
151デフォルトの名無しさん:2010/11/27(土) 20:19:43
回答ありがとうございます
下みたいな書き方にしなくて良いようで安心しました
152デフォルトの名無しさん:2010/11/27(土) 20:25:55
また犠牲者が一人・・・
153デフォルトの名無しさん:2010/11/27(土) 22:45:20
for (int i = 0; i < length; i++) {
register int value = func();
}
C++はこうするのが正しい

154デフォルトの名無しさん:2010/11/27(土) 22:47:36
registerって何だよ
死語になってるキーワードじゃないか
155デフォルトの名無しさん:2010/11/27(土) 22:56:25
仮にregisterが有効に働いたとしても、valueをregisterにするのが
いいか悪いかは状況によるよな。
156デフォルトの名無しさん:2010/11/28(日) 01:04:33
ここは昭和の自転車置き場の議論を引きずっているインターネットですね。
157デフォルトの名無しさん:2010/11/28(日) 18:10:05
for (int i = 0, value; i < length; i++) {
value = func();
}
こうしたら?普通ありえんけど
158デフォルトの名無しさん:2010/11/28(日) 18:35:24
>>157 何がうれしいの?
159デフォルトの名無しさん:2010/11/28(日) 18:53:19
いや>>147の意を汲んだだけ
160デフォルトの名無しさん:2010/11/28(日) 20:01:44
>>156
javaで仕事やってて、ループ内でプリミティブ型の変数を宣言してたら
ループのたびにメモリが確保されてパフォーマンスが落ちるとかいいがり
つけられたことがある。
古い話題じゃなくて、わかってないやつは今でもいっぱいいそう。
161デフォルトの名無しさん:2010/11/28(日) 21:36:01
>>160
メモリ確保するコードが出力されないことは保証されていないし、パフォーマンス
落ちるかも知れないだろ。
落ちた所でそれが何なのとは思うし、そんなコードを生成するJITは嫌だが、
別に言いがかりじゃない。説明できなかったお前が悪い。
162デフォルトの名無しさん:2010/11/28(日) 21:40:24
少なくともこれだけは間違いない。おまいらスレ違い。
163デフォルトの名無しさん:2010/11/28(日) 22:11:44
>>161
いや完全にいいがかり。
しっかり反論した。
自分の作ったところがパフォーマンス悪いって指摘されて、おれが
書いたコードに責任をかぶせようとしてた。
一回リクエストがあるたびに、数十M、数百Mメモリを浪費してることろが
あるのに、(仮にループ中のintの宣言がメモリを浪費するとして)リクエスト一回で
数十回しかループしていないところのintを指して、これが原因とか言ってた。

それ以前にC++でだってループ中のint宣言はメモリを浪費しない保障がない、
やめるべきだとか言ってたらそいつ頭おかしいだろ。
それと同じだ。
164デフォルトの名無しさん:2010/11/28(日) 22:39:31
↓落ちつけよバカ
165デフォルトの名無しさん:2010/11/28(日) 22:49:09
Cみたいに関数の先頭で変数宣言するスタイルがいいって信じ込んで、
変数は使う直前で宣言&初期化するってスタイルが理解できない
連中とか珍しくないし、そういうレベルからみたらループ中で宣言って
驚天動地のできごとなんだろな。
166デフォルトの名無しさん:2010/11/28(日) 23:35:09
速度じゃなくてメモリ消費を指摘されたのか? 先頭で宣言しようがforの中だろうが同じだな。
速度の話なら、毎回メモリ確保したとしてもスタックポインタ加算・減算に1ナノ秒くらい?
100万回実行しても人間は認識できない時間。
167デフォルトの名無しさん:2010/11/29(月) 01:00:50
>>165
ループ内で宣言すると「お前のコードは汚い」といわれたことがある、ついさっき。
168デフォルトの名無しさん:2010/11/29(月) 01:09:52
もういっそ関数内の宣言もやめてグローバル変数で確保しちゃいなよ。
169デフォルトの名無しさん:2010/11/29(月) 01:10:28
>>167
それはあんたの価値観が古臭いだけだ。
と言い返してやれ。
170デフォルトの名無しさん:2010/11/29(月) 01:25:55
1999年にCでも途中での宣言が許されるようになったんだがなあ
171デフォルトの名無しさん:2010/11/29(月) 14:02:30
Aがdouble型のとき (bool)A ってどういう意味?
A != 0 でいいの?
172デフォルトの名無しさん:2010/11/29(月) 14:51:38
>>171
その通り
173デフォルトの名無しさん:2010/11/30(火) 12:03:19
std::exceptionを継承したclassがA , B・・・と複数あって
例外をキャッチするとき例外AとBの時は同一の処理をしたい場合catch()の指定の仕方はどうすればよいでしょうか?
174デフォルトの名無しさん:2010/11/30(火) 12:10:12
catchでもっかいthrowすればいいじゃない
175デフォルトの名無しさん:2010/11/30(火) 12:20:27
176175:2010/11/30(火) 12:22:17
throw 〜 catch で型判定するぐらいなら dynamic_cast 使ったほうがまだ軽くていいような気がしてきた。
177デフォルトの名無しさん:2010/11/30(火) 14:18:07
178デフォルトの名無しさん:2010/11/30(火) 23:11:00
std::exceptionのデストラクタがわざわざvirtualになっていることから、
dynamic_castしてくれというのがライブラリ設計者の考えではないだろうか。
179デフォルトの名無しさん:2010/12/01(水) 01:11:39
>>178
んなわけない。

仮想関数を持つクラスはほぼすべて virtual デストラクタを持つことになるわけで、
その考え方だと dynamic_cast 推奨と勘違いするケースが多すぎる。
180デフォルトの名無しさん:2010/12/01(水) 07:30:09
virtual関数持ってる(=型情報あり)なんだから素直にdynamic_castすればいいじゃん
>>174-177なんかよりよっぽど見やすいコードだし、使わない手はない
181デフォルトの名無しさん:2010/12/01(水) 07:57:43
dynamic_cast の使いどころであることに異存は無いが >>178 の理由付けはおかしい。
182デフォルトの名無しさん:2010/12/02(木) 20:46:21
例外が飛んできてる時点で軽いとか重いとかは無意味だよ。
183デフォルトの名無しさん:2010/12/02(木) 21:03:19
DLLから例外投げたら『ヤバイ』っすか〜?
184デフォルトの名無しさん:2010/12/03(金) 06:47:39
185デフォルトの名無しさん:2010/12/03(金) 08:45:42
classにstaticとstatic以外のものが混ざる場合ってよくあるんでしょうか?
186デフォルトの名無しさん:2010/12/03(金) 09:34:44
まれによくある
187デフォルトの名無しさん:2010/12/03(金) 13:26:02
俺はあまり無い。
188デフォルトの名無しさん:2010/12/03(金) 16:11:54
しつもんです〜

Delphiで

TUnkoClass: class of TUnko

function BuildUnko(AType:TUnkoClass):TUnko;
begin
 Result:=AType.Create;
end;

type
 TGeri = class(TUnko)


 TIpponGuso = class(TUnko)



こういうのがあったとして、これをC++でやるにはどうしたらいいんでしょうか。
189デフォルトの名無しさん:2010/12/03(金) 16:12:48
Singletonパターンではあるかもな
1つでもクラスを生成したら以降は無視するようにするためにカウンタを
staticメンバ変数で作る
190デフォルトの名無しさん:2010/12/03(金) 16:13:30
>>188
死ね
たいがいにしとけや
191デフォルトの名無しさん:2010/12/04(土) 02:51:00
>>183
DLLを利用するコードがDLL作る時と同じコンパイラの同じバージョンでコンパイルされるなら問題無い。
もしくはクラスのメモリレイアウトと例外の実装方式に変更がないという自信があるなら良い。
要するにコンパイラメーカー以外は気安くスローするなってことだ。
192デフォルトの名無しさん:2010/12/05(日) 23:14:03
同じコンパイラならバージョンぐらい変わってもいいだろ、とか思ってたが
Visual C++のtime_tのサイズが途中で変わったりしてて驚いた。めんどくせ
193デフォルトの名無しさん:2010/12/06(月) 13:25:04
size_tって何のためにあるんですか?
194デフォルトの名無しさん:2010/12/06(月) 14:37:06
sizeof の戻り値を表現するために
195デフォルトの名無しさん:2010/12/06(月) 15:10:41
intじゃなんだめなの?
196デフォルトの名無しさん:2010/12/06(月) 15:22:48
for (int i = 0; i < (int)v.size(); i++)

この(int)が激しくウザい。だれだよsize_tとか作った奴。
197デフォルトの名無しさん:2010/12/06(月) 15:58:15
>>195
intが32ビットでsize_tが64ビットの環境もあるから (VC++の64ビット版とか)
64ビットのくせに2GBまでしか扱えなくていいのならintにキャストしとけばいいんじゃない
198デフォルトの名無しさん:2010/12/06(月) 16:50:56
まじかよ。
俺は今まで64ビットの環境ではintが64bitになるかと思ってたよwww
199デフォルトの名無しさん:2010/12/06(月) 19:00:34
パンピーにゃ32ビットありゃ十分でしょ
200デフォルトの名無しさん:2010/12/06(月) 21:37:31
パンピーはプログラムなんか書かねーよ。
for (size_t i = 0; i < v.size(); i++) でいいだろ。
201デフォルトの名無しさん:2010/12/06(月) 21:44:05
サイズの小さいのに、62ビット計算は無駄な気がするな〜
最適化で32ビットにでもなれば…
いや、気にする必要もないのか?(64bitOS持ってないんだ)
202デフォルトの名無しさん:2010/12/06(月) 21:58:53
>>201
お前は一生shortでも使ってろ。
for (short i = 0; i < 100; i++) ; // メモリの節約(^^)
203デフォルトの名無しさん:2010/12/06(月) 21:59:56
いやいや、100くらいならcharにするべき
204デフォルトの名無しさん:2010/12/06(月) 22:00:36
>>201
そんな無駄を意識する前に、ループ回るたびに size() 呼び出してる点を先に考えろ。
205デフォルトの名無しさん:2010/12/06(月) 22:23:19
それは、普通に最適化で外に出るだろ
206デフォルトの名無しさん:2010/12/06(月) 22:25:30
>>202,203
ちょっと待て、普通にどうなるか聞きたいのだが?
メモリー以外変わらないのか?
207デフォルトの名無しさん:2010/12/06(月) 22:39:54
>>206
十分に最適化の聞くコンパイラなら同じこと。ただし下手に小さい整数型をループ変数にすると
100 を 200 にしたり 300 にしたり 40000 にしたりすると意図しない結果になる可能性がある。

最適化の弱いコンパイラだと、演算時の整数格上げと変数格納時の格下げ(?)が繰り返されて
逆に効率が下がる可能性がある。

基本的にはデメリットしかない。
208デフォルトの名無しさん:2010/12/07(火) 01:24:00
>204
for (int i = 0, size = v.size(); i < size; ++i)
ということか。

まあ面倒くさいってのは一緒だけど。
209デフォルトの名無しさん:2010/12/07(火) 01:34:54
>>208のケースはvがconstなら一時変数に入れなくても最適化されるだろうけどねぇ。
210デフォルトの名無しさん:2010/12/07(火) 07:04:00
; 10 : for(int i=0;i<(int)sizeof(buf)/4;i++) {
00 mov edi, DWORD PTR __imp__printf
0000b 33 f6 xor esi, esi
0000d 8d 49 00 npad 3
$LL6@wmain:
; 11 : buf[i] = i;
; 12 : printf("loop1 dat = %d\n",buf[i]);
00010 56 push esi
00011 68 00 00 00 00 push OFFSET ??_C@_0BA@NNHHKGGK@loop1
00016 ff d7 call edi
00018 46 inc esi
00019 83 c4 08 add esp, 8
0001c 83 fe 0a cmp esi, 10 ; 0000000aH
0001f 7c ef jl SHORT $LL6@wmain

; 14 : for(size_t i=0;i<sizeof(buf)/4;i++) {
00021 33 f6 xor esi, esi
$LL3@wmain:
; 15 : buf[i] = i;
; 16 : printf("loop2 dat = %d\n",buf[i]);
00023 56 push esi
00024 68 00 00 00 00 push OFFSET ??_C@_0BA@KKOJHEJK@loop2
00029 ff d7 call edi
0002b 46 inc esi
0002c 83 c4 08 add esp, 8
0002f 83 fe 0a cmp esi, 10 ; 0000000aH
00032 72 ef jb SHORT $LL3@wmain

VS2008 で恐ろしいほどの最適化処理だった。下がいいね
211デフォルトの名無しさん:2010/12/07(火) 10:15:42
俺には同じに見える・・・
212デフォルトの名無しさん:2010/12/07(火) 20:53:12
32ビットターゲットで比較してアホだろ
213デフォルトの名無しさん:2010/12/07(火) 22:56:33
/usr/lib と ${HOME}/lib に同じ名前のライブラリがあります。
リンクすると/usr/libの方をリンクしてしまうのですが、
自分の${HOME}/libの下にある奴を優先的にリンクさせるには
Makefileをどう書けばいいでしょうか
214213:2010/12/07(火) 23:08:14
LD_LIBRARY_PATHを指定していませんでした。
指定したらローカルの方をリンクしてくれました。
お騒がせしました
215デフォルトの名無しさん:2010/12/08(水) 07:55:41
std::set<string,less<string>,MyAllocator> Set;
というコードがあったのですが、MyAllocatorが複雑でなにをやってるのか
なかなか分かりません。一般的にset::set()で独自アロケータを指定する場合というのは
どういうことがやりたい場合でしょうか?
216デフォルトの名無しさん:2010/12/08(水) 08:34:12
んなもん、作った奴に聞け。
217デフォルトの名無しさん:2010/12/08(水) 09:11:05
コードを読むうちに、やっぱりメモリプールを使った独自アロケータかな、、という気がして来ました。
それ以外ないですよね。
218デフォルトの名無しさん:2010/12/08(水) 09:23:15
>>217
boost::boolのドキュメントでも読め

日本語版は少しバージョンが古いがここにある

http://boost.cppll.jp/HEAD/libs/pool/doc/index.html
219デフォルトの名無しさん:2010/12/08(水) 13:21:18
c++ で throw するときにとりあえず catch にさえ行ってくれればいい
(引数に意味はない) 場合はどのような型(値)の引数を指定したら
いいんでしょうか。

なにかお作法みたいなのはありますか?

220デフォルトの名無しさん:2010/12/08(水) 13:24:12
catch (...)
221デフォルトの名無しさん:2010/12/08(水) 14:15:31
エラーコードでもthrowしとけば?
222デフォルトの名無しさん:2010/12/08(水) 14:24:27
throw "This is meaningless value";
223デフォルトの名無しさん:2010/12/08(水) 20:57:18
ここまでstdexceptについての言及なし。
224デフォルトの名無しさん:2010/12/08(水) 21:24:08
new しなくても関数使えますが new を使う必要ない場合は使わないほうがいいんですか?
225デフォルトの名無しさん:2010/12/08(水) 21:36:47
必要なときニュ〜する、必要でないときはニュ〜しない。
にゅ〜にゅ〜
226デフォルトの名無しさん:2010/12/08(水) 21:42:13
new した方が早いとかそういう噂を聞いたものでな
227デフォルトの名無しさん:2010/12/08(水) 21:44:07
いや速くないでしょ、にゅ〜する時間かかるし。
使用だけなら、時間は同じ。
228デフォルトの名無しさん:2010/12/08(水) 21:48:31
いやまて、スタックに配置されるのとグローバルに配置される分は。
たぶん少し速いかもしれん。
229デフォルトの名無しさん:2010/12/08(水) 22:37:56
どちらかと言えば、キャッシュヒット率が期待できる分だけスタックの方が速いね。
いずれにしろ、誤差だ誤差。
230デフォルトの名無しさん:2010/12/09(木) 07:15:24
>>196
わかる
ズレてるよね
こんなところでバグらねーよボケがって思うわ

糞MS、str〜系の関数全部エラー出しやがってマジで馬鹿じゃないの?
お前、これの何が危険なんだと
サイズ指定してないから危険?は?
こんなところでバグなんてでやしねぇよ
ちょっとはプログラム組んだことある奴社内にいねーの?
すげー、チンカスども余計なもんいれんなお前等の「安全」とかちっとも役に立たないんだわ
231デフォルトの名無しさん:2010/12/09(木) 07:55:45
なるほど、間抜けはウォーニングとエラーの区別がつかないらしい。
232デフォルトの名無しさん:2010/12/09(木) 12:31:53
|for (int i = 0; i < (int)v.size(); i++)

for(size_t i=0;<v.size();i++)
じゃだめなの?
233デフォルトの名無しさん:2010/12/09(木) 12:51:05
>>232
警告が出るよ

「符号付き値と符号無し値の比較」みたいな
234デフォルトの名無しさん:2010/12/09(木) 12:57:42
>>233
size_tだから大丈夫じゃね
235デフォルトの名無しさん:2010/12/09(木) 13:05:10
forループのカウンタってなんでintが多いの
236デフォルトの名無しさん:2010/12/09(木) 13:11:03
>>234
規格を見てないけどsize_tは大抵unsigned longなんだぜ
237デフォルトの名無しさん:2010/12/09(木) 13:11:54
負の数が表現できて普通に使う分には十分大きくて多分他の整数より速い
238デフォルトの名無しさん:2010/12/09(木) 13:11:56
>>235
タイプ量が少なくて楽だから
239デフォルトの名無しさん:2010/12/09(木) 19:54:44
WOW64で32ビットアプリケーションが実行された場合、
使用できるメモリは4ギガまでなのでしょうか?
240デフォルトの名無しさん:2010/12/09(木) 20:30:19
いえす
241デフォルトの名無しさん:2010/12/09(木) 21:38:24
アプリで使用できるの2ギガじゃないの?
242デフォルトの名無しさん:2010/12/09(木) 21:39:59
RAM DISKを使うと使えるってだけの話でわ?
243デフォルトの名無しさん:2010/12/09(木) 21:49:10
>>235
iを使って計算するときに楽だからじゃないか
負数と足すとき大概はキャストの必要があるし
244デフォルトの名無しさん:2010/12/10(金) 01:19:39
>>232
size_tが64ビットの場合もあるので、size_tでループを回すと効率が落ちる場合もある。
245デフォルトの名無しさん:2010/12/10(金) 01:40:37
>>244
どの処理系で効率が落ちると?
246デフォルトの名無しさん:2010/12/10(金) 03:04:26
>>244
きちんとした説明をしてもらおうか。
247デフォルトの名無しさん:2010/12/10(金) 09:38:23
>>244じゃないが、
x86_64とかREXプレフィックス等でコードがでかくなって遅くなりそう。
問題になるほどの差があるかどうかはともかく。
248デフォルトの名無しさん:2010/12/10(金) 11:00:57
http://msdn.microsoft.com/ja-jp/library/3b2e7499(v=vs.80).aspx
へー 64bit Windows持ってないから試せないな
誰かどっちの方が効率いいか実測してくれ
249デフォルトの名無しさん:2010/12/10(金) 11:09:36
いくら出せますか?
250デフォルトの名無しさん:2010/12/10(金) 12:00:26
>>247
プリフィックスが付く事で遅くなる事はないとIntelは言ってる
ただコードが膨れた分キャッシュ効率は間違いなく低下するだろうけど
だからあんな巨大なL2キャッシュを積んだんじゃね?
251デフォルトの名無しさん:2010/12/10(金) 20:52:39
たまにCで書くとC++の偉大さが解かるな
コードめちゃ綺麗になるわ
252デフォルトの名無しさん:2010/12/10(金) 23:14:47
ちょと複雑になってデバグとかなると
Cの簡潔さが欲しくなるよ。
253デフォルトの名無しさん:2010/12/10(金) 23:18:52
いやそれ、単に設計が悪いだけ
254デフォルトの名無しさん:2010/12/10(金) 23:48:58
寿命の短い変数のために
{
int i = ・・・
}
って書いたら気味悪がられたことある
これだからC使いは嫌いだよ
255デフォルトの名無しさん:2010/12/11(土) 00:21:56
俺はCで(99以前で)書くときは関数の先頭に全部の変数宣言をまとめてる
int i, j, k, ...;
char *p, *q, ...;
ってな感じで
無理にスコープ狭めても醜いし、もうCだしいっかと割り切ることにした
256デフォルトの名無しさん:2010/12/11(土) 22:26:57
気味悪がられた程度で嫌になるとか・・・
もう少し大人になりなさい
257デフォルトの名無しさん:2010/12/12(日) 01:38:22
>>254
C使いです。タスタスも少し出来ます。
なんでこれで気味悪がれるの?
なかなかの上級テクだと思うが。
258デフォルトの名無しさん:2010/12/12(日) 10:01:15
>257
上級テクどころか、普通のTIPSだろ。
それを気味悪いだとか言うような奴に限って300行もあるような関数の先頭で変数を宣言したがる。
おまけに、ポインタ変数に整数値を入れてフラグ代わりにするような使い回しも厭わない。
要は感性が違うのだと諦めて、適当にあしらうしかないね。
259デフォルトの名無しさん:2010/12/12(日) 12:09:35
曰くスコープのネストが深くなるのがキモイんだと
260デフォルトの名無しさん:2010/12/12(日) 12:23:31
その感覚自体は正常だろ
あんまり酷くなるならスコープ切るより関数分けることを考えるべきでしょ
261デフォルトの名無しさん:2010/12/12(日) 12:45:49
所詮他言語なんてそんなもんだろ
古いfortranの感覚だと、関数なんて使ってんじゃねーよ馬鹿みたいに言われてたとか聞いたし
262デフォルトの名無しさん:2010/12/12(日) 13:18:47
VBの仕事で、普通の感覚で、関数やらサブルーチンやら作ってたら、
イベントハンドラにコピペコピペで長い処理書いてるおっさんから
「お前のコードはあちこち飛んで分かりにくい」って苦情を言われた
ことがある。
263デフォルトの名無しさん:2010/12/12(日) 13:36:46
で みなさんは goto を使ってます?
俺最近使ったw
ループ一気脱出には便利よね。
264デフォルトの名無しさん:2010/12/12(日) 13:40:41
gotoつかわないと抜けられないようなループは書かないので使いません
265デフォルトの名無しさん:2010/12/12(日) 13:41:29
ここ10年ほど、ネタ以外で使った事がない
266デフォルトの名無しさん:2010/12/12(日) 15:37:57
Cで例外処理っぽく書くときに使うな。
267デフォルトの名無しさん:2010/12/12(日) 17:20:04
例外処理っぽくというと

int *p = malloc(...);
int *q = malloc(...);
...;
if(err) goto FREE;
...;
if(err) goto FREE;
...;
FREE:
free(p);
free(q);

こんな感じ?でもこれって

int *p = malloc(...);
int *q = malloc(...);
sub(p, q);
free(p);
free(q);

void sub(p, q) {
...;
if(err) return;
...;
if(err) return;
...;
}

こうしたほうが綺麗だよね
やっぱ使い道見えてこんわ
268デフォルトの名無しさん:2010/12/12(日) 17:23:27
269デフォルトの名無しさん:2010/12/12(日) 17:47:22
>>267
その例で言えば、メモリ確保を集約できるならそれでもいいけどね。
270デフォルトの名無しさん:2010/12/12(日) 17:59:48
>>268
の例はあまり綺麗じゃないぞ。
おれなら、リソースのポインターやハンドラーNOに正常オープンの情報が入って。
ポインターならNULL以外。 ハンドラなら-1以外。
解放時にその情報を見て解放している。
これなら、何時終わろうが何処で終了処理されようが問題なく解放できる。
gotoラベルも気にする必要がない。
271デフォルトの名無しさん:2010/12/12(日) 18:41:31
#include <stdio.h>

int main(void) {
FILE *fp, *gp, *hp;
int i;

for(i = 1; i; i = 0) {
fp = fopen("f.txt", "r");
if(!fp) break;
// do something
if(error) break;
gp = fopen("g.txt", "r");
if(!gp) break;
// do something
if(error) break;
hp = fopen("h.txt", "r");
if(!hp) break;
// do something
if(error) break;
}

if(fp) fclose(fp);
if(gp) fclose(gp);
if(hp) fclose(hp);

return 0;
}
272デフォルトの名無しさん:2010/12/12(日) 19:44:21
だから多重ループ一気脱出の時に便利なだけだよ。
break が関数でネストレベルがパラメータにあればいいのかもね。
273デフォルトの名無しさん:2010/12/12(日) 19:47:01
その為の例外機構です
274デフォルトの名無しさん:2010/12/12(日) 19:47:55
例外で脱出とかアリなの?
275デフォルトの名無しさん:2010/12/12(日) 19:48:36
例外を通常の制御フローに使うな
276デフォルトの名無しさん:2010/12/12(日) 19:50:18
だいたい、多重ループしなきゃ行けないような設計自体が問題だ
277デフォルトの名無しさん:2010/12/12(日) 19:51:58
for (〜) {
switch(〜) {
}
278デフォルトの名無しさん:2010/12/12(日) 19:52:37
途中送信しちまった
このswitchでfor脱出したいときとかないの?
279デフォルトの名無しさん:2010/12/12(日) 20:01:08
ifで書けば解決
280デフォルトの名無しさん:2010/12/12(日) 20:03:22
goto使うぐらいなら、終了フラグ作るよ
281デフォルトの名無しさん:2010/12/12(日) 20:09:49
ループ脱出のgotoくらい許せや
282デフォルトの名無しさん:2010/12/12(日) 20:16:30
絶対に許さない! 絶対にだ
283デフォルトの名無しさん:2010/12/12(日) 20:21:31
>>281
許す許さないの問題じゃない。ただ単にポリシーの問題だ。
使いたければ使うがいい。ただな、ループを抜けたいだけの理由でgoto
使えば、当然飛び先を変えて処理をしたいと思うのが人間、普通にそう思うだろう。
それがいやなんだよ。
284デフォルトの名無しさん:2010/12/12(日) 20:26:21
ループを工夫して一重で書けよ
285デフォルトの名無しさん:2010/12/12(日) 21:05:24
>>283
思わん。

>>284
それで読みやすいプログラムになるならそうするさ。
286デフォルトの名無しさん:2010/12/12(日) 21:08:25
これからも多重ループ脱出にはgotoを使うであろう。予言
287デフォルトの名無しさん:2010/12/12(日) 21:10:30
多重ループ平気で書くやつを多重ルーピーと呼ぶことにしよう
288デフォルトの名無しさん:2010/12/12(日) 21:39:30
#define LOOPBREAK {i=ENDVALUE;continue;}
289デフォルトの名無しさん:2010/12/12(日) 23:24:07
ループ制御変数がi限定なのか。
290デフォルトの名無しさん:2010/12/12(日) 23:25:45
時代はラムダ式とreturn、アルゴリズムにして追い出す方向に向うのかな
291デフォルトの名無しさん:2010/12/13(月) 01:14:31
でわネタ豆乳

class hoge{
private:
  int _data;
public:
  hoge():_data(0){}
  ~hoge(){};
};


がいいいですか それとも

class hoge{
public:
  hoge():_data(0){}
  ~hoge(){};
private:
  int _data;
};

のほうが好きですか
privateが上にあるか下にあるか。
ま どっちでもいんですがw
292デフォルトの名無しさん:2010/12/13(月) 01:18:59
googleは後者
293デフォルトの名無しさん:2010/12/13(月) 01:21:47
アンダーバーで始まる識別子は敬遠される。
私は横着だから、
class hoge {
int data_;
public:
// construction
hoge() : data_(0) {}
~hoge() {};
// operation
int get() const {return data_;}
};
こんな感じになるかな。
294デフォルトの名無しさん:2010/12/13(月) 01:39:42
やぱメンバ変数は
m_付きがいいのでしょうか。
295デフォルトの名無しさん:2010/12/13(月) 02:01:02
>>294
賛否両論ある話なので好きにしたらいいと思うよ
296デフォルトの名無しさん:2010/12/13(月) 02:11:53
人には言えないけどアンダーバー開始にしてる
理由、VC++のインテリセンスで下にまとまって便利だから
VC++stlもそうなってるし趣味プログラムだから許してちょ
297デフォルトの名無しさん:2010/12/13(月) 02:19:10
処理系が提供しているライブラリだから
処理系予約の識別子記法で書いてるだけ。

もちろん、絶対に個人でしか扱わないものなら
どうしようと(それで将来不具合が出ようと)自由だけどね。
298デフォルトの名無しさん:2010/12/13(月) 12:17:26
俺は member data は _ で終わりにしてるけど
_ で始める人もいる(ちょっと気持ち悪いけど)

なんとなく何かと衝突しそうで怖い
__ で始めるとヤバそうだけど一個なら安全なのかな
299デフォルトの名無しさん:2010/12/13(月) 14:52:52
_からはじめない派の人は、_の後に大文字が使えない(規格に違反する)ことを気にしているのですか?
300デフォルトの名無しさん:2010/12/13(月) 16:24:55
でもぶつかればコンパイルエラーになるのでわ?
301デフォルトの名無しさん:2010/12/13(月) 17:10:07
グローバルな関数に使ったりするのはダメだけどそれ以外はいいよ
名前空間に入れるなりクラスのメンバにするなりする分にはいい
302デフォルトの名無しさん:2010/12/13(月) 17:10:53
>>296
アンスコ2つで始まるのは標準ヘッダのマクロで使われてるかもしれないから問題あるが
アンスコ一つならグローバルとstd名前空間で予約されてるだけだから
問題無い。
303デフォルトの名無しさん:2010/12/13(月) 17:20:50
アンダースコア2つで「始まる」じゃなくてアンダースコア2つを「含む」識別子じゃなかったっけ
304302:2010/12/13(月) 17:26:57
>>303
アンスコ二つは「含む」でした。失礼したでござる。
305デフォルトの名無しさん:2010/12/13(月) 17:53:04
どうせタイプ一回ならmHogeでよくねーかアンスコだとシフト押さないといかんし
306デフォルトの名無しさん:2010/12/13(月) 17:54:40
麻雀プログラム書くときに卑猥になるからダメだ。
bool mAnko;
307デフォルトの名無しさん:2010/12/13(月) 17:54:45
キャピタライズのときにもシフトは押すわけだが
308デフォルトの名無しさん:2010/12/13(月) 18:05:24
インテリセンスのためにも m_ を愛用してる。
309デフォルトの名無しさん:2010/12/13(月) 20:06:28
でもm以下の関数呼ぶのに邪魔じゃね?
310デフォルトの名無しさん:2010/12/13(月) 20:20:40
俺は_だな。
先頭に_が付いてるってことで触って欲しくないとアピールできる。
311デフォルトの名無しさん:2010/12/13(月) 20:44:42
同じような話題で
ヘッダの2重読み込み禁止のdefineの記述はちょっと悩まない?
多分ぶつからんとは思うけどぉって。
VCだと適当に付けてくれるんだけどね。

#ifndef __HOGE_H__
#define __HOGE_H__
・・・
#endif
312デフォルトの名無しさん:2010/12/13(月) 20:50:12
#define PROJECTNAME_ROOTDIR_・・・_HEADERNAME_HPP

これでおk
衝突したこと一度も無い
313デフォルトの名無しさん:2010/12/13(月) 21:04:01
#pragma once最強。
他の処理系でもサポートしてくれれば・・・
314デフォルトの名無しさん:2010/12/13(月) 21:08:22
>>309
邪魔かもしれんけど、プログラムリストが一目で、ローカル変数と区別が付くのがいい
315デフォルトの名無しさん:2010/12/13(月) 21:23:08
>>311
アンスコ二つを含む名前はコンパイラ以外が使っちゃいかん。

ぶつからないよう氏名生年月日を入れるのがマジオススメ
#define _山田太郎_19801231_プロジェクトA_TEST_H_
316デフォルトの名無しさん:2010/12/13(月) 21:23:32
メンバもほかの変数も区別せんけどなぁ
実装書くときに変数を省略形にするから被ることないし
317デフォルトの名無しさん:2010/12/13(月) 21:37:39
>>315
てか作成時の時間を入れておけば大丈夫だよね
318デフォルトの名無しさん:2010/12/13(月) 22:05:33
アプリケーション命名規則じゃなく。
作成時間命名規則、又は、作者名命名規則かw
319デフォルトの名無しさん:2010/12/13(月) 22:48:09
他のソースを参考に読み、理解したらそれをパクるのではなく自分なりに書き換えたほうがいいのでしょうか?
こんなのよく考えるなぁーって思うときが多くて、、、
320デフォルトの名無しさん:2010/12/13(月) 22:57:05
そのまま流用できるコードならそれでいいんじゃないの
まあでも著作権はいろいろ難しいから業務だったら詳しい人に聞いたほうがいいよ
321デフォルトの名無しさん:2010/12/14(火) 09:38:28
__int64より大きい整数扱いたい場合はどないすればいいんですか?
doubleだと桁が足りませんよね…こまった
322デフォルトの名無しさん:2010/12/14(火) 09:58:58
自分でそういう整数を扱うクラスを作るか、既存のライブラリを探してきてそれを使うか。
323デフォルトの名無しさん:2010/12/14(火) 15:56:19
たぶんboostライブラリーにあるよ。
324デフォルトの名無しさん:2010/12/14(火) 15:57:51
ねぇよ
325デフォルトの名無しさん:2010/12/14(火) 16:04:34
それならクヌースの2巻を読むといいよ
326デフォルトの名無しさん:2010/12/14(火) 17:05:35
BigNumでぐぐれ
327デフォルトの名無しさん:2010/12/14(火) 17:16:33
Linux+g++ で socketとかpthreadとかやりたい時、namespaceがないでしょ。
そもそもヘッダが sys/***.h だったりするし。
そんときはやっぱgccでコンパイルしてextern C でリンクするしかないんかな。
みなさんはどうやってます?
328デフォルトの名無しさん:2010/12/14(火) 17:26:25
何言ってんだ?
C++からでも普通に使える。
329デフォルトの名無しさん:2010/12/14(火) 18:32:02
reallib でググれ
330デフォルトの名無しさん:2010/12/14(火) 19:35:59
>>327
@sys/***.hをインクルードする
Aそのまま使うコードを書く
B-lpthreadでリンク
gccコンパイルもextern "C"も要らない。
331デフォルトの名無しさん:2010/12/14(火) 21:49:05
>>321
「__int64」ってことはVisual C++かな。/clrオプションでDecimal型使うのが楽。
332デフォルトの名無しさん:2010/12/15(水) 01:42:26
>>330
それはわかるんだけど、cstdlib とか cstring とか
namespace std じゃん。
でもそういうヘッダがない システムコール系は グロバル空間じゃん。

そういうのが作法として気になってるだけなんです。
気にしなくていいってならそれしかないんですけどぉ。。
333デフォルトの名無しさん:2010/12/15(水) 02:02:49
>>332 気にしたところでそれしかない。
334デフォルトの名無しさん:2010/12/15(水) 02:48:09
>>333
へへぇ 恐れ入ります。
それしかないならそうですね。
ありがとうございました。

またACEでもやるかw
335デフォルトの名無しさん:2010/12/15(水) 07:21:08
>>332
C++リンケージのシンボルは名前空間で名前を整理する。
Cリンケージのシンボルは全てがグローバル扱い。
CのモノとリンクするんだからCのやり方に従うのが筋。
C関数を呼び出す変なラッパーをC++で作るのだけはマジ勘弁。
336デフォルトの名無しさん:2010/12/15(水) 23:11:35
>Linux+g++ で socketとかpthreadとかやりたい
>みなさんはどうやってます?
まず言語の選択を間違えている。マルチスレッドでソケット通信するだけなら
Javaの方が10倍マシ。C++でやるメリットなど無い。
無駄なことにエネルギー使うのはやめた方がいい。
337デフォルトの名無しさん:2010/12/15(水) 23:55:10
悪名高き Java をインストールさせるなど愚の骨頂
338デフォルトの名無しさん:2010/12/15(水) 23:55:16
>>335
C++でソケット使う場合どうするの?
339デフォルトの名無しさん:2010/12/15(水) 23:56:51
>>336
Javaは遅いし怪しいし気持ちわるいし
なにより出来ませんw 結局これ。
340デフォルトの名無しさん:2010/12/15(水) 23:59:25
>>338
C++でできなかったらJavaでどうやんの?
ソケットどころかJavaの処理系すら存在しない世界になるよ?
341デフォルトの名無しさん:2010/12/16(木) 03:14:18
ちょと何言ってるかわからない
342デフォルトの名無しさん:2010/12/16(木) 07:25:35
変なラッパなんか使わず、Cの流儀で書けばいいだけだ。
まさか、アプリケーションレイヤーで直接ソケットを操作するわけじゃなし。
343デフォルトの名無しさん:2010/12/16(木) 19:05:18
class B
{
list<weak_ptr<a> > alist;
void SetA(shared_ptr<A> a){/*alistにaをpush */};
}

class A
{
void Hoge(B &b){ b.SetA( shared_ptr<A>(this) );};
}

大雑把ですが
このようなコードを実装するとHoge()から抜けるときに自分自身を削除することになってしまうわけですが
この設計を実現するためにはどうしたらいいでしょうか?
344デフォルトの名無しさん:2010/12/16(木) 20:02:31
B unko;
auto_ptr<A> a(new A);
unko.SetA(a.get());
a.release();
345デフォルトの名無しさん:2010/12/16(木) 21:21:34
>>343
>b.SetA( shared_ptr<A>(this)
shared_ptrをテンポラリで使ったらすぐにdeleteが走るに決まってるだろ。
shared_ptr使ってるのをやめればいいんじゃね?
346デフォルトの名無しさん:2010/12/16(木) 21:43:02
enable_shared_from_thisでぐぐると幸せに慣れるかもな
347デフォルトの名無しさん:2010/12/16(木) 21:43:11
わからんw
348デフォルトの名無しさん:2010/12/16(木) 22:11:21
INT64 (__int64)等はVCのコンパイラ独自拡張ですか?
349デフォルトの名無しさん:2010/12/16(木) 23:10:06
long long intならC99の正式規格だな
64ビット整数という保証はないけど
350デフォルトの名無しさん:2010/12/16(木) 23:12:34
あっごめんlong long intは最低でも64ビットだわ

§5.2.4.2.1
? minimum value for an object of type long long int
LLONG_MIN -9223372036854775807 // -(2^63 - 1)
351デフォルトの名無しさん:2010/12/16(木) 23:14:23
? maximum value for an object of type long long int
LLONG_MAX +9223372036854775807 // 2^63 - 1
? maximum value for an object of type unsigned long long int
ULLONG_MAX 18446744073709551615 // 2^64 - 1

>>348
__int64はVCの独自規格だが結構多くのベンダーが対応している
gccはC99に部分的に対応しているためlong long intが推奨
352デフォルトの名無しさん:2010/12/16(木) 23:16:23
>>349
ありがとうございます。感謝です。
353デフォルトの名無しさん:2010/12/16(木) 23:17:57
>>350-351
さらに詳しく解説感謝しますっ
354デフォルトの名無しさん:2010/12/16(木) 23:41:41
>343 >346
こんな感じ?
http://ideone.com/XsMpb
355デフォルトの名無しさん:2010/12/16(木) 23:56:33
Cygwinを使ってvc++のclを呼び出すみたいなことって出来るんですか?
それともgccじゃないとだめなんでしょうか?
356デフォルトの名無しさん:2010/12/17(金) 00:05:04
環境変数設定すれば普通にできるんじゃねえの
357デフォルトの名無しさん:2010/12/17(金) 00:13:10
#include <iostream>
using namespace std;
int main(){
 char b=-1;
 cout << b <<endl;
 return 0;
}
これを実行すると -1 って表示されないんですけどぉ。なんでぇ。
何か忘れてます?
gcc 4.1.2 CentOS5.5
358デフォルトの名無しさん:2010/12/17(金) 00:15:07
cout << static_cast<int>(b) <<endl;
359デフォルトの名無しさん:2010/12/17(金) 00:30:11
>>358
それはやったんですけど、どうしてcharだとだめなのかなぁと。
360デフォルトの名無しさん:2010/12/17(金) 00:35:00
char b='a';
cout << b <<endl;

で97とか表示されても困るだろうが
361デフォルトの名無しさん:2010/12/17(金) 00:49:31
なるほど。最履修します。ありがとうございます。
362デフォルトの名無しさん:2010/12/17(金) 00:50:31
>>346
横レスしつれいするけどenable_shared_from_thisってコンストラクタで渡せなかったり
自身が必ずshared_ptrの管理下に無いとダメみたいだけど上手く回避する方法はないかな・・・?
363デフォルトの名無しさん:2010/12/17(金) 08:25:25
>>362 どっちも無理だろjk
364デフォルトの名無しさん:2010/12/17(金) 21:24:07
明らかに不正なポインターを見分ける方法はありませんか?
例えばこういうポインターです。

Foo* foo = (Foo*)0x12345689;

どうしても必要なのですが何とかなりませんか。

365デフォルトの名無しさん:2010/12/17(金) 21:35:45
if (foo == (Foo*)0x12345678) {
366デフォルトの名無しさん:2010/12/17(金) 21:41:17
実際にそこへアクセスしてみて EXCEPTION_ACCESS_VIOLATION なり SIGSEGV なりを捕まえる
367デフォルトの名無しさん:2010/12/17(金) 21:44:38
いやいやいや、エスパーするに、たぶん例外的なアクションをしない、
不正なポインターでしょw。例外的な物ならすぐ分かるからw
368364:2010/12/17(金) 21:45:00
すいません、まじめに教えてください。
ポインターの指す先が有効なオブジェクトなのか、未定義なのかを判別しないといけないのです。
369デフォルトの名無しさん:2010/12/17(金) 21:45:49
ほらやっぱりw
370デフォルトの名無しさん:2010/12/17(金) 21:50:13
Cをやめるのが一番だと思うよ
371デフォルトの名無しさん:2010/12/17(金) 21:50:56
有効なオブジェクトのリストを持っておき、そのポインタがリストに載っていれば有効、でいいんじゃね
372デフォルトの名無しさん:2010/12/17(金) 21:52:37
無効なポインタはNULLポインタにしておけば良いんじゃね?
373364:2010/12/17(金) 22:01:15
もういいです。自分で何とかします。
有難うございました。
374デフォルトの名無しさん:2010/12/17(金) 22:03:45
結構本気だったのになぁ

自分はポインタはNULLで初期化してDeleteしたり使わなくなったらNULL代入しておくようにしておくんだが
375デフォルトの名無しさん:2010/12/17(金) 22:12:37
クラスの関数を使うときに
Class().func();
とすると使えてしまいますが、このテクニックはよくつかわれるのでしょうか?
376デフォルトの名無しさん:2010/12/17(金) 22:16:30
結構本気だったんだがな
有効なオブジェクトのリストを持っておくのはデバッグ中はまれによくやるぞ
(どっちかというと解放漏れチェックのためにだが)
377デフォルトの名無しさん:2010/12/17(金) 22:17:31
というかスマポ使えよ、と言うのは無しなのだろうか
378デフォルトの名無しさん:2010/12/17(金) 22:17:39
NULLチェックでダメな場合がそもそも思いつかない
379デフォルトの名無しさん:2010/12/17(金) 22:20:41
いやいやいや、スタック上のオブジェクトですでに消えたスタックデータとか。
何かがオーバーランしてポインター潰したとか。
ポインター演算又は配列の添え字間違えたとか。
色々あるよ
380デフォルトの名無しさん:2010/12/17(金) 22:35:48
自分でオブジェクトの管理もできないならポインタを使わないようにするのが一番だろ。
381デフォルトの名無しさん:2010/12/17(金) 23:19:15
変数は初期化して
deleteしたらnullを代入が作法かと。

ポインタ先が本物か偽者かを判定するなんてわかんのかい?
382デフォルトの名無しさん:2010/12/17(金) 23:24:29
ポインタにNULLを入れて何回でもdeleteしてやる
383デフォルトの名無しさん:2010/12/17(金) 23:33:36
ダブルポインタで参照しとけばどこからアクセスされてても生存確認できるんじゃ
384デフォルトの名無しさん:2010/12/17(金) 23:55:20
結局 ワッチャかトレサを入れておくってのは解かもしれんが、
やってる人おるん?
そんなにポインタって危ないもん?
ポインタの使い方しらんかちゃんとモドリチみてないか
単にめちゃくちゃなプログラムなのでわ? とw
385デフォルトの名無しさん:2010/12/18(土) 01:37:53
>>374
最近、これを忘れてえらいめにあいました。
NULL 代入忘れを検出する方法を思案中。
386デフォルトの名無しさん:2010/12/18(土) 02:01:40
結局可能なら素直にスマポっておけって結論になるんだよなぁ
387デフォルトの名無しさん:2010/12/18(土) 03:33:43
>>385
必ずマクロ(もしくはテンプレート)経由でdeleteするとかでだいたい防げるんじゃね?
まぁNULL初期化を忘れそうだけど
388デフォルトの名無しさん:2010/12/18(土) 04:33:21
だから、忘れる可能性のある対策なんて無意味なんだって。
自分できちんと管理できない馬鹿は大人しくJava使えばいいんだよ。
あ、C#でもいいか。
389デフォルトの名無しさん:2010/12/18(土) 05:55:22
覚悟がないなら生でやるな、でいいだろ。
390デフォルトの名無しさん:2010/12/18(土) 06:00:46
忘れる可能性なんて言ってたら何もかけないだろ
391デフォルトの名無しさん:2010/12/18(土) 10:58:59
C++を0の状態から勉強している者です。

「ロベールの入門講座」を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば動きます)

http://codepad.org/0i4ByGfl
が自分の書いたソースです。

私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?
392デフォルトの名無しさん:2010/12/18(土) 11:03:11
マルチ氏ね
393391:2010/12/18(土) 11:25:06
すいません、聞いておいてなんなんですが、事故解決しました。

absoluteの略で私は「abs」と勝手に略していたのですが、
偶然にも数学関数の中ですでに定義されていた型のようで、そこでエラーが出ていたみたいです。
「Abs」と最初を大文字にしてやると無事オーバーロード出来ました。
394デフォルトの名無しさん:2010/12/18(土) 11:27:14
std::'double abs(double)'が既に定義されているから再定義はできない。
知らない間に誰かがcmathあたりをインクルードしてる。
395デフォルトの名無しさん:2010/12/18(土) 12:19:09
>>381,385,387
スマポ使えって結論が出てる脇でヌル代入するテンプレート自作とか
マヌケな話が続く意味がわからない。
396デフォルトの名無しさん:2010/12/18(土) 13:03:43
deleteしたあとにNULL入れるって、変数の使い回しが横行してるような
ソースでのお作法だろ。
方向性があさってすぎる。
397デフォルトの名無しさん:2010/12/18(土) 13:29:30
ポインタにNULLを入れて何回でもdeleteしてやる
398デフォルトの名無しさん:2010/12/18(土) 13:50:28
>>396
void func() { int x = 999; std::cout << &x << "," << x <<std::endl; }
void hunc() { int x; std::cout << &x << "," << x <<std::endl; }
int main(void) { func(); hunc(); return 0; }

output:
0x23ff3c,999
0x23ff3c,999


環境次第では上のようなことも起こりうる
使い終わった変数の中身を間違って見てしまうこともある
これが整数を使ったハンドルだったりポインタだとめんどくさいことになる
だから使い回ししなくてもNULLをいれときましょうねってこと
399デフォルトの名無しさん:2010/12/18(土) 13:52:04
てめぇSAFE_RELEASEさんdisってんのかあぁ?
400デフォルトの名無しさん:2010/12/18(土) 13:54:59
>>398
未初期化変数の値を使っているのが問題なのであって、
ヌルを代入したからって何も問題は解決しないだろうが。
401デフォルトの名無しさん:2010/12/18(土) 13:57:06
>>399 「えーマジマクロ?」「キモーイ」「キャハハ」
402デフォルトの名無しさん:2010/12/18(土) 14:02:20
>>399
それはたとえば auto_ptr ごときと比べても何かメリットがあるのかというレベル。
403デフォルトの名無しさん:2010/12/18(土) 14:23:56
SAFE_RELEASEで十分
404デフォルトの名無しさん:2010/12/18(土) 14:25:26
>>400
だからただのセーフティだよ
初期化だってひょっとすると忘れるかもしれないだろ
忘れてんのにそれっぽく動かれるのと、NULLアクセスで一発で落ちるのと
バグ消ししてる時にどっちがありがたいかって話だよ
405デフォルトの名無しさん:2010/12/18(土) 14:26:18
>>400
これ使った攻撃方法もあるのでセキュリティには注意しましょうね
406デフォルトの名無しさん:2010/12/18(土) 14:28:34
int GetX()
{
return X;
}

void SetX( int _X )
{

X = _X;
}

メンバ変数の代入はこんな感じの関数でおk?
もっとスマートな書き方ある?
407デフォルトの名無しさん:2010/12/18(土) 14:28:44
>>398
こういう単純な未初期化は警告でるな。
408デフォルトの名無しさん:2010/12/18(土) 14:33:23
コーディングスタイルの話題になると、普通に書いてたらそんなミスしないだろ
っていうのに備えて、へんな書き方主張する流れになるな。
409デフォルトの名無しさん:2010/12/18(土) 14:34:51
>>406 予約識別子使わないで
410デフォルトの名無しさん:2010/12/18(土) 14:36:01
>>404 スマポ使えば初期化が抜けることも無い。
411デフォルトの名無しさん:2010/12/18(土) 14:43:09
auto_ptr作ったやつが開発段階で心臓発作で死んで
unique_ptrが最初からstlに入ってればもっと住みやすい世界になっていたのに
だれだよauto_ptrとか作ったバカは切腹しろや
412デフォルトの名無しさん:2010/12/18(土) 14:48:00
auto_ptr 怖がりすぎじゃね?いいやつだよ。
可搬性の広さとオーバーヘッドの小ささでは数あるスマポの中でも最強だろう。
413デフォルトの名無しさん:2010/12/18(土) 14:51:46
いきなり「所有権の移動」なんて概念を持ち込まれても・・・
ていう感じだったしな
414デフォルトの名無しさん:2010/12/18(土) 14:55:02
const auto_ptrでおk
415デフォルトの名無しさん:2010/12/18(土) 16:46:02
参照つかえ
416デフォルトの名無しさん:2010/12/18(土) 16:56:48
VCにて、Unicode文字セット設定でビルドした場合で、
マルチバイト文字の関数を使ってもエラーは出ませんが、
これは非推奨ですか?
417デフォルトの名無しさん:2010/12/18(土) 17:02:23
使ってもいい
418デフォルトの名無しさん:2010/12/18(土) 17:03:43
>>417
ありがとうございます
419デフォルトの名無しさん:2010/12/18(土) 17:30:39
vc10で自作したライブラリをコンパイルすると毎回このエラーが出ます
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5):
 warning MSB8004: Output ディレクトリの末尾がスラッシュではありません。
 Output ディレクトリが適切に評価されるようにするために、このビルド インスタンスによってスラッシュが追加されます。
どうすれば出なくなりますか?
420デフォルトの名無しさん:2010/12/18(土) 17:46:37
どうすればよいのか書いてあるじゃないか....ねぇ、日本語読めないの
Outputの設定が悪いんだろ
421デフォルトの名無しさん:2010/12/18(土) 17:55:23
素直にディレクトリの末尾にスラッシュを追加するがよろし
422デフォルトの名無しさん:2010/12/18(土) 17:56:37
法律で文字コード統一してほしい
何年までに移行せよみたいな
423デフォルトの名無しさん:2010/12/18(土) 18:36:45
何で統一すんだよ
unicodeすらアレなのに
424デフォルトの名無しさん:2010/12/19(日) 14:10:16
friendクラスってできれば使わない方が良いんでしょうか?
便利なんですが、設計が悪いのを誤魔化してるんじゃないかという気になってきて・・・
425デフォルトの名無しさん:2010/12/19(日) 14:12:12
自分で設計が悪いと薄々思ってるんならfriendどうこうじゃなしに見直すべきだろう
426デフォルトの名無しさん:2010/12/19(日) 14:25:15
設計段階で結びつきが強いことが解ってるならfriendが最良の解決案で問題ない
オブザーバーとか相互参照してるパターンでfriend使うことが多いかな(毎回使うわけでもないが)
後付とか全然関係ないクラス間でfriend使うのがだめなんだよ
427デフォルトの名無しさん:2010/12/19(日) 16:24:30
friend は operator とか cppunit とか piml とかくらいかなぁ
428デフォルトの名無しさん:2010/12/19(日) 17:03:02
どうしようもなくなって最後は友達に泣きつくって事でしょう。
そうなる前になんとかしないとね。
429デフォルトの名無しさん:2010/12/19(日) 22:12:30
ファクトリクラスをfriendにして
ファクトリクラスを通してしかオブジェクトを生成できないようにしたりとか
そういう使い方もある
430デフォルトの名無しさん:2010/12/19(日) 22:50:39
class Hoge {
public:
class Factory;
private:
/* CTORS */
};

class Hoge::Factory {
public:
/* CREATEMETHOD */
};

でいいじゃんfriendとかダサいよ
431デフォルトの名無しさん:2010/12/20(月) 22:44:10
VISUAL C++でSalTalkのようにテキストをWAVファイルの音声で読み上げるようなプログラミングはできますでしょうか。
外見はwindowsのテキストツールで下に読み上げボタンが付いているようなものです。
432デフォルトの名無しさん:2010/12/20(月) 22:47:34
できる
433デフォルトの名無しさん:2010/12/20(月) 23:09:14
今からはじめるならC++より他言語の方がよくね?w
C#あたりの方が触りやすい気がする
434デフォルトの名無しさん:2010/12/20(月) 23:11:02
連結部の波形合成まで考えると、C#じゃ処理落ちすると思う。
435デフォルトの名無しさん:2010/12/20(月) 23:13:56
その程度で処理落ちするわけない
436デフォルトの名無しさん:2010/12/20(月) 23:14:33
STLやBOOSTつかいまくっても処理速度って維持できる?
ライブラリの挙動を理解してて適切にチューンできるならともかく動くコードがかけるレベルだとどんな感じ?
437デフォルトの名無しさん:2010/12/20(月) 23:18:23
>>436
動くコードが書けるレベルっていうなら
むしろヘタに自力で実装するより素直に使ったほうが速いと思われる
438デフォルトの名無しさん:2010/12/20(月) 23:20:08
間違った使い方をしないなら遅くなることはないと思われる
439デフォルトの名無しさん:2010/12/20(月) 23:20:39
そういうのは99%杞憂
遅かったらそこだけ直せば十分
440デフォルトの名無しさん:2010/12/20(月) 23:25:31
そう言うレベルは何処が遅いかも分からんと思うけどな。
またぞろ、プログラマーなら分かった当たり前と主張するのかw
441デフォルトの名無しさん:2010/12/20(月) 23:25:41
STLやBOOSTより性能いいものって、そんなのそう簡単には作れんぞ
つか、その程度のレベルだと速度云々より安全性が気になるから素直にライブラリ使わせたほうがいいと思う
442デフォルトの名無しさん:2010/12/20(月) 23:26:39
確かに考えてみればC++のライブラリがボトルネックになるほど重たい処理なんてそうそう無いよね

知人にライブラリなんて重くなるから使わんよ、とCライクにコード書くのがいたのでそんなに変わるのか気になったんだ
443デフォルトの名無しさん:2010/12/20(月) 23:29:59
いやいや STLは下手に使うと、オブジェクトの配置換えによるコンスト・ディストの嵐
444デフォルトの名無しさん:2010/12/20(月) 23:31:17
多数のオブジェクトをSTLコンテナで管理したときは直配列とくらべて遅くなったかなぁ
一つ一つは大したこと無いけど積もり積もって遅くなるかんじ
445デフォルトの名無しさん:2010/12/20(月) 23:33:35
ほとんどの場合は積もり積もらないんだよな
積もり積もるところを探し出して直す
446デフォルトの名無しさん:2010/12/20(月) 23:33:45
Cで書いたら速くなるなんてのは処理が簡単な場合だけだよ
boostでやってることをそのままCで再現してかつ速くするにはそれなりの技術がいる
コンパイル時計算のことも考えるとCでは追いつけない場合だって有る
447デフォルトの名無しさん:2010/12/20(月) 23:35:10
だからそれは、熟知している人がうまくboost使った場合だろ
448デフォルトの名無しさん:2010/12/20(月) 23:36:18
くだらないこと気にする前にさっさと完成させてボトルネック直せって感じ
449デフォルトの名無しさん:2010/12/20(月) 23:39:00
ハード屋の尻叩いて高速化させるほうが先決
450デフォルトの名無しさん:2010/12/21(火) 14:43:49
>>447
普通に書くとどう非効率になるの?具体例出してくれない?
変な書き方しなければ boost 使ったからって有意な差が出る程
遅くなる事はまずないと思うんだが
451デフォルトの名無しさん:2010/12/21(火) 15:15:50
初心がboost使った場合どちらかというと意味不明すぎるエラーで死ねると思う
452デフォルトの名無しさん:2010/12/21(火) 15:17:27
template使うとエラー出力が意味不明すぎてもうね
453デフォルトの名無しさん:2010/12/21(火) 18:25:34
boost初心者はまだしも C++初心者なら説明がわからんだろう
他の人のコードを写して,今度はエラーがわからないだろうね
454デフォルトの名無しさん:2010/12/22(水) 00:13:32
boostは何の問題もないが、コンパイルだけが遅くなるのは
なんとかならんか。 ならんだろうなぁ。
結局 実行時に型が決まるからプリコンパイルは出来ないんだよね。
ってエピステメさんとどっかやりとりした記憶が。
人違いだったらごめんなさい。

あ そうそう boost/asio って動いてます?
うちのCentOSにソスから入れてビルドしたら
コンパイルでほげほげなエラーがw
455デフォルトの名無しさん:2010/12/22(水) 00:32:58
日本語でおk
456デフォルトの名無しさん:2010/12/22(水) 05:17:34
ではちょっと正確に

boostのソースをダウンロードして bootstrap.shやって
bjamでインストールして ldconfig の設定してOK!と
思ったら、
#include <boost/asio.hpp>
using namespace boost::asio;
int main(){
 // www.boost.org の http サービスに接続
 ip::tcp::iostream s( "www.boost.org", "http" );
 return 0;
}
の簡単なサンプルで100行ぐらいどわーってエラーが出たって感じです。
元々入っていた古いboostのパッケージは消してあります。
みなさんの環境ではboost 1.45.0は正しく動いてますでしょうか。
457デフォルトの名無しさん:2010/12/22(水) 08:06:22
エラーがわからなきゃスレに書き込めばいいだけ
頭使えよお前ら

このインターネット時代に全然上級者向きとは言えない
458デフォルトの名無しさん:2010/12/22(水) 08:23:02
Q.100行も書き込めません
A.ちったあ頭使えや
459デフォルトの名無しさん:2010/12/22(水) 11:21:06
>>457
コーディングしてるの? template 関係のエラーを貼り付けて
スレに書き込めってかなり無理があるなぁ
肝心な数行だけなら良いとしてもそれがわかるなら元々悩まんだろうし
460デフォルトの名無しさん:2010/12/22(水) 11:37:03
適当にテキストファイルに書き込んでうpろだにでもあげればいいだろう
461デフォルトの名無しさん:2010/12/22(水) 12:27:17
boost_systemとpthreadをリンクしてないなんていう凡ミスじゃないよね?
462456:2010/12/22(水) 12:28:49
お騒がせしてすみませんでした。
皆さんが使えてるのであれが使い方がヘボいという事で。
463デフォルトの名無しさん:2010/12/22(水) 13:24:53
エラーなんて最初のあたりだけ見れば結構わかるもんなんだけどな
464デフォルトの名無しさん:2010/12/22(水) 13:27:07
テンプレート関係はむしろ最後の方じゃないか?
俺が見てるのがgccの奴だからだろうか
465デフォルトの名無しさん:2010/12/22(水) 13:28:12
エラーメッセージのtemplateクラスを脳内typedefで置き換えていけば割と読める
466デフォルトの名無しさん:2010/12/22(水) 16:54:21
cppメーリングリストで見れない記事があるのは何故だろう
467デフォルトの名無しさん:2010/12/23(木) 02:52:34
boost::tupleと構造体の違い教えてください
タプルのほうが簡潔でよいと思うのですが
468デフォルトの名無しさん:2010/12/23(木) 02:55:03
>>467 構造体のメンバには名前が付けられます。
469デフォルトの名無しさん:2010/12/23(木) 03:01:39
>>468
あ、たしかにそうですね
470デフォルトの名無しさん:2010/12/23(木) 04:25:06
binary_search(vec.begin(),vec.end(),xxx);
という検索で、実際にはもう少し範囲が狭められるのが分かっているので
binary_search(vec[idx],vec.end(),xxx);
とやりたいです。(idxは動的に決まる)
どうすればよいでしょうか?
471デフォルトの名無しさん:2010/12/23(木) 04:29:59
binary_search(vec.begin() + idx, vec.end(), xxx);
472デフォルトの名無しさん:2010/12/23(木) 08:03:43
>>471
動きました。ありがとうございました。
473デフォルトの名無しさん:2010/12/23(木) 08:58:52
binary_search(vec.begin()+idx,vec.end(),xxx);
474デフォルトの名無しさん:2010/12/23(木) 12:09:07
10以下の計算だったらbool使ってもよくないか
475デフォルトの名無しさん:2010/12/23(木) 14:08:50
>>474 使う事の利点は?
476デフォルトの名無しさん:2010/12/23(木) 14:12:36
利点はなんか俺テクニカルでかっこいいと思える事かな
477デフォルトの名無しさん:2010/12/23(木) 16:45:29
478デフォルトの名無しさん:2010/12/27(月) 11:42:34
ファイルストリームのイテレーターの使い方教えてください。
479デフォルトの名無しさん:2010/12/27(月) 12:30:59
>>478
とりあえず使ってみて。わかんなかったらソースを添えて相談しよう。
480デフォルトの名無しさん:2010/12/27(月) 14:43:05
ファイルの終端のイテレーターって引数なしのイテレーターでいいのですか?
481デフォルトの名無しさん:2010/12/27(月) 14:49:42
482デフォルトの名無しさん:2010/12/28(火) 18:49:30
以下のように引数の名前とメンバ変数の名前が同じ場合正常に初期化されますが保証されているのですか?
Hoge::Hoge(int no) : no(no){}
483デフォルトの名無しさん:2010/12/28(火) 18:51:37
はい
484デフォルトの名無しさん:2010/12/28(火) 19:12:41
>>483
ども
485デフォルトの名無しさん:2011/01/07(金) 21:47:27
点数(short型整数2byte),名前(char型配列32byte),順位(long型整数4byte)
の順番で2+32+4=38byteを書きこんだバイナリファイルがあります.
C++標準ライブラリを使って,このファイルを読み込み,
short score; std::string name; long rank;
にそれぞれ格納する(特にstd::string name)にはどのようなコードを書いたらいいでしょうか?
よろしくお願いします.
486デフォルトの名無しさん:2011/01/07(金) 21:50:06
ファイルストリームのreadメソッドを使って38バイトずつchar配列に読み込み、読み込んだ配列を解析しましょう
487デフォルトの名無しさん:2011/01/07(金) 22:07:19
コードを書く前にバイナリファイルの仕様が不明確です。
仕様を明確化してください。
488デフォルトの名無しさん:2011/01/07(金) 22:16:45
>>486
適当にかくならこんなかんじだろうか
ttp://codepad.org/VaLUJpY7
489488 :2011/01/07(金) 22:18:43
安価ミス
488は
>>485
490デフォルトの名無しさん:2011/01/07(金) 22:20:50
点数は32kまでで人数が2G人ってどういう想定なんだろう
491デフォルトの名無しさん:2011/01/07(金) 23:27:39
キャストして直接入れるのが簡単な気がする

std::ifstream ifs("data.dat", std::ios::in | std::ios::binary);
short score;
char buffer[33];
long rank;
ifs.read((char*)&score, sizeof(short));
ifs.read((char*)buffer, 32);
ifs.read((char*)&rank, sizeof(long));
std::string name(buffer);
492デフォルトの名無しさん:2011/01/07(金) 23:30:24
そしていつの日かそれが全然簡単な方法ではなかったことに気がつく
493 ◆QZaw55cn4c :2011/01/07(金) 23:46:38
>>485
異なるエンディアンの場合を吸収する必要がないのなら、
short n;
char s[32];
long l;
fread(&n, sizeof(n), 1, fp);
fread(s, sizeof(s), 1, fp);
fread(&l, sizeof(l), 1, fp);
がお手軽ではないでしょうか。
494デフォルトの名無しさん:2011/01/08(土) 13:46:15
教えて下さい。

OS:Windows
開発環境:Visual Stadio 6.0

pthreadを使ったマルチスレッドの勉強をしています。
pthreadはunix依存のものらしいのでWindowsで使える様に以下のブログを参照させて頂き環境を作りました。
ttp://blog.livedoor.jp/akf0/archives/51595429.html

その環境を使って以下のソースを組んで見ました。
#include <windows.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

void *thread_function(void *arg) {
int i;
for ( i=0; i<20; i++ ) { printf("Thread says hi!\n"); Sleep(1); } return NULL;
}

int main(void) {
pthread_t mythread;
if ( pthread_create( &mythread, NULL, thread_function, NULL) ) { printf("error creating thread."); abort(); }
if ( pthread_join ( mythread, NULL ) ) { printf("error joining thread."); abort(); }
exit(0);
return 0;
}
495デフォルトの名無しさん:2011/01/08(土) 13:47:36

結果は以下の様なエラーが出ます。
thread1.obj : error LNK2001: 外部シンボル "__imp__pthread_join" は未解決です
thread1.obj : error LNK2001: 外部シンボル "__imp__pthread_create" は未解決です
LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です
Debug/testaaa.exe : fatal error LNK1120: 外部参照 3 が未解決です。

環境設定で足りない部分があるのか、あるいはソースが間違っているのか・・・。
誰かご教授ください。
496デフォルトの名無しさん:2011/01/08(土) 13:49:14
ライブラリ(LIBファイル)をリンクする必要があるかと
497デフォルトの名無しさん:2011/01/08(土) 13:51:16
ってその翌日の記事に書いてあるじゃないか
ttp://blog.livedoor.jp/akf0/archives/51595459.html
> 1. リンカにLIBファイルを追加する。
498デフォルトの名無しさん:2011/01/08(土) 14:41:11
>>496-497
返信ありがとうございます。
さっそく試して見た所ビルドは通る様になりました。

しかし立ち上がりの歳に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
499デフォルトの名無しさん:2011/01/08(土) 15:12:38
>3)DLLファイル
> …「C:\Program Files\Microsoft Visual Studio 9.0\VC\bin」
500485:2011/01/08(土) 15:20:02
>>486-493
ありがとうございました.参考にさせていただきます.
501デフォルトの名無しさん:2011/01/08(土) 16:05:12
>>499
ありがとうございます。

Include----*.h
bin--------*.dll
lib--------*.lib
で分け直しましたがやはり同じエラー(pthreadVC2.dllが見つからない)が出ています。
あれから色々弄ってますが、実行させるとdllが見つからないと言われてます
502デフォルトの名無しさん:2011/01/08(土) 16:22:17
>>496-497さん、>>499さん
プロジェクトと同じ階層フォルダに件のdllを置いたら上手く動作しました。
ありがとうございます。

これって起動時にDLLファイルを動的にリンクしてるって事ですよね。
期待動作としては、EXEファイル単体で動く様にしたかったんですが(コンパイル時にDLLファイルをリンクして欲しかった)
そう言う事は無理なのでしょうか?
503デフォルトの名無しさん:2011/01/08(土) 16:31:58
名前空間の下にいるクラスの前方宣言はどうすればいいですか?
例えばAAAという名前空間のHogeを前方宣言しようとしてヘッダーに
class AAA::Hoge と書くと'AAA' has not been declared.と出ます。
504デフォルトの名無しさん:2011/01/08(土) 16:39:20
>>502
オープンソースだということだから、ソースコードが(探せばどこかに)あるだろう
それをプロジェクトに含めて一緒にコンパイルしてしまえばいいのではないか
ライセンスには注意すること
505デフォルトの名無しさん:2011/01/08(土) 16:40:52
>>503
namespace AAA {
class Hoge;
}
506503:2011/01/08(土) 16:50:43
>>505
超サンキューです。これどのC++の参考書を見ても書いてないのですが。。。。
507デフォルトの名無しさん:2011/01/08(土) 17:10:26
激しくLGPLだな
508デフォルトの名無しさん:2011/01/08(土) 17:56:19
>>506
書くまでもないってことだ言わせんな恥ずかしい
509デフォルトの名無しさん:2011/01/09(日) 11:28:15
std::arrayってg++だと使えないんですか?
誰も使ってる人がいないしぐぐっても出てこないのですが
510デフォルトの名無しさん:2011/01/09(日) 11:46:18
4.4なら-std=c++0x
511デフォルトの名無しさん:2011/01/09(日) 12:15:40
前にも一度なったんだけど、includeの順番とかそんなので外部参照エラーがでる。
前は順番変えたらいけたけど、今回はどう試しても通らない。どうすればいいの、誰が助けて
環境VS2010

エラー
1>test.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport)
public: __int64 __thiscall std::ios_base::width(__int64)" (__imp_?width@ios_base@std@@QAE_J_J@Z)
が関数 __catch$??$?6U?$char_traits@D@std@@@std@@YAAAV?
$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z$0 で参照されました。
1>test.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public:
__int64 __thiscall std::ios_base::width(void)const " (__imp_?width@ios_base@std@@QBE_JXZ)
が関数 "class std::basic_ostream<char,struct std::char_traits<char> >
& __cdecl std::operator<<<struct std::char_traits<char> >(class
std::basic_ostream<char,struct std::char_traits<char> > &,char)" (??$?6U?$
char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z)
で参照されました。
1>C:\Users\Windows\Documents\test\Debug\test.exe : fatal error LNK1120: 外部参照 2 が未解決です。
512デフォルトの名無しさん:2011/01/09(日) 12:31:25
順番変えたらって・・・

どのライブラリにどのヘッダが必要か位確認しろよ
513デフォルトの名無しさん:2011/01/09(日) 12:34:27
>511
とりあえずコード晒せ、話はそれからだ。
514デフォルトの名無しさん: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 スキップ ==========
515デフォルトの名無しさん:2011/01/09(日) 14:05:44
>514
>ライブリにどのヘッダが必要かってどうやってみるの?
>ヘッダファイル辿っていくだけ?そのライブラリのヘッダ大量にあって、キリがないんだけど。
普通はドキュメントに書いてある。

プロジェクトのプロパティのところから「C/C++」→「コマンドライン」と、「リンカー」→「コマンドライン」コピペするとどうなる?
516デフォルトの名無しさん:2011/01/09(日) 16:36:07
今までググったりして調べててやっと解決した。
共通プロパティのVC++ディレクトリのライブラリディレクトリに一部被ってるライブラリを置いている
パスを設定してたからだった。何故今まではエラー出なかったのか分からないけど、今まではライブリ
そこまで探しに行かなくても全て見つかって有効になってなかったからとかなのかね。

>>515
ありがとう、ライブラリのドキュメントに書いてるのね。今度見てみる。
517デフォルトの名無しさん:2011/01/11(火) 09:41:41
一定時間おき(10-60秒くらい)に実行結果をfputs()でファイルに書き出すとき
書き込み対象ファイルは動作中常にオープンにしておく方が良いのか
書き込むタイミングで開閉したほうがいいのか
どちらが無難でしょうか?
518デフォルトの名無しさん:2011/01/11(火) 09:47:05
>>517
特にあけたままで問題ないと思われる
519デフォルトの名無しさん:2011/01/11(火) 18:45:32
教えてください。
struct CELL {
  int a;
  int b;
};
std::vector<struct CELL> array;

というような、構造体のvectorを持つCSampleクラスがあります。
指定したidxの構造体のメンバを見るための内部関数を作りたいのですが、
次のようなポインタを使った書き方(添字内なら構造体へのポインタ、
添字外ならNULLを返す)を考えたのですが、やっぱり問題あるでしょうか?
C++で普通な書き方(参照と例外を使う?)を教えて欲しいです。

const struct CELL *CSample::GetDataPtr(unsigned long idx)
{
  if(idx < array.size()){
    return &(array.at(idx));
  }else{
    return NULL;
  }
}
520デフォルトの名無しさん:2011/01/11(火) 19:05:47
CELL& CSample::GetDataPtr(unsigned long idx){
  return array.at(idx);
}

範囲外ならout_of_range
521デフォルトの名無しさん:2011/01/12(水) 12:11:36
いまいち初期化子の必要性、有用性が分かりません。
引数を取らないコンストラクタを持つクラスなど、
データを与えて初期化する必要がない場合でも、
初期化子で初期化した方がいいでしょうか?
522デフォルトの名無しさん:2011/01/12(水) 12:21:15
constなメンバが初期化できないし
523デフォルトの名無しさん:2011/01/12(水) 12:22:42
>>521
初期化と代入は異なる演算であるということを肝に銘じておいてください。
524デフォルトの名無しさん:2011/01/12(水) 12:32:42
class A foo;

A hoge(foo);
A hage = foo;

前者はコピーコンストラクタ A::A(const A&)
後者はデフォルトコンストラクタ A::A() 〜 代入 A::operator = (const A&)
だよな?
525デフォルトの名無しさん:2011/01/12(水) 12:34:28
それはどっちもコピコン
526デフォルトの名無しさん:2011/01/12(水) 12:36:59
両者供にコピコンでしたか。 勘違いしてたっぽ
527デフォルトの名無しさん:2011/01/12(水) 12:40:37
>>522-523
ありがとうございます
528デフォルトの名無しさん:2011/01/12(水) 16:34:12
catchブロックに入ると元の例外オブジェクトは消えているのに
受け取り先でその参照は生きています。これはコピーされているんですか?

try {
  std::exception e("auau");
  throw e;
} catch(std::exception &e) {
  std::cout << e.what() << std::endl;
}


また、tryブロックで作成したオブジェクトの、深い階層から例外を投げたときなど
catchブロックでreturnを書いても問題ありませんか?
(デストラクタが呼ばれてからcatchブロックへ移行しますか?)
529デフォルトの名無しさん:2011/01/12(水) 16:43:51
>元の例外オブジェクトは消えているのに

メモリには残ってるんじゃね?
530デフォルトの名無しさん:2011/01/12(水) 19:35:09
>>520
519です。ありがとうございます。
531デフォルトの名無しさん:2011/01/12(水) 23:08:52
>>528
>throw e;
この時点で一時オブジェクトが作成される。その生存期間の保障は
catchハンドラを再スロー以外で抜けるまで。
532デフォルトの名無しさん:2011/01/13(木) 00:08:27
教えてください!
ある計算をしてデータをファイルに書き出したいのです。

double loc1,loc2,loc3;
ofstream ofs("test.txt",ios::trunc);
while(条件){
計算など;
ofs << " " << loc1 << " " << loc2 << " " << loc3 << endl;
};

とすると、なんか書き出したファイルがぐちゃぐちゃになってしまいます。
右に揃えてきれいに整えて出力するにはどう記述すればいいのでしょうか?
533デフォルトの名無しさん:2011/01/13(木) 00:54:27
>>532
ofstream fout;
fout.open("text.txt",ios::out );
if(fout){
 fout << "Hello World!!\n" ;
 fout.close();
}else{
 cout << "ファイルの書き込みオープンに失敗しました。" << endl;
}
の感じでどうでしょう。
534デフォルトの名無しさん:2011/01/13(木) 01:07:12
>>528
コピーコンストラクタやデストラクタにログを仕込んで実験してみるといいよ。
ただし、たまに特定の実装と規格とでずれがあるから、疑問があれば規格を
確認したほうがいいよ。
535デフォルトの名無しさん:2011/01/13(木) 01:09:29
ofs << setw(10) << loc1 << setw(10) << loc2 << setw(10) << loc3 << endl;

右にそろえるだけならこう
たぶん正直見にくい結果になるだろうなあ
536デフォルトの名無しさん:2011/01/13(木) 01:09:36
537532: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

としたいのです。ところが、これだと、揃っていなくてみにくい!
それぞれのデータについて、右揃えでみやすく表示するようなファイルへの書き込みをしたいのです。
538デフォルトの名無しさん:2011/01/13(木) 01:20:18
>>535
ありがとうございます。

0 1 0
0.841471 2.71828 1.55741
0.909297 7.38906 -2.18504
0.14112 20.0855 -0.142547
-0.756802 54.5982 1.15782
-0.958924 148.413 -3.38052
-0.279415 403.429 -0.291006
0.656987 1096.63 0.871448
0.989358 2980.96 -6.79971
0.412118 8103.08 -0.452316
-0.544021 22026.5 0.648361
-0.99999 59874.1 -225.951
-0.536573 162755 -0.63586
0.420167 442413 0.463021
0.9906071.2026e+06 7.24461
0.6502883.26902e+06 -0.855993
-0.2879038.88611e+06 0.300632
-0.9613972.4155e+07 3.49392
-0.750987 6.566e+07 -1.13731
0.1498771.78482e+08 0.151589

こんな感じになりました。
最初の方は少しみやすくなりました。
後半は微妙ですが・・・
539デフォルトの名無しさん:2011/01/13(木) 01:26:49
つまりこういうことだな

ofs << setprecision(5) << setiosflags(ios::fixed) << setw(10) << loc1 << setw(10) << loc2 << setw(10) << loc3 << endl;
540デフォルトの名無しさん:2011/01/13(木) 01:43:55
>>539
0.00000 1.00000 0.00000
0.84147 0.54030 1.55741
0.90930 -0.41615 -2.18504
0.14112 -0.98999 -0.14255
-0.75680 -0.65364 1.15782
-0.95892 0.28366 -3.38052
-0.27942 0.96017 -0.29101
0.65699 0.75390 0.87145
0.98936 -0.14550 -6.79971
0.41212 -0.91113 -0.45232

とてもいい感じになりました。
ありがとうございます!
541デフォルトの名無しさん:2011/01/13(木) 07:29:31
>>534
コピーコンストラクタは省略されるときがあるからなあ。
例外のthrowでもコピーコンストラクタが
呼び出されるかどうかは処理系の自由。
542デフォルトの名無しさん:2011/01/13(木) 09:58:21
>>531,534,541
ありがとうございました
543デフォルトの名無しさん:2011/01/13(木) 18:15:46
丸投げでごめんなさいなんですけど教えてください。

TCHARの文字列をカンマで分割したいです。

分割後の要素はそれぞれ可変長なんですが、
こういう場合はどうやって分割して、
分割後の要素を入れるバッファとかは
どう確保するのが普通なんでしょうか?
544デフォルトの名無しさん:2011/01/13(木) 19:53:10
すなおにstringやwstring使えばいいじゃなーい。
でもTCHAR使ってるとコンパイラおぴっしょんごとに
どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。
APIでは正しく変換できるのになんでやねーん。
545デフォルトの名無しさん:2011/01/13(木) 21:12:19
>>544
>どっち使うかで超迷うし、VCのlocaleはUTF-16を正しく使えないんだよねー。
何を迷うのか不明だし、どこが正しく使えないのか説明きぼぅ。

>>543
vector<TCHAR>にpush_backして文字列を作っていけば?
最後にbasic_string<TCHAR>に変換。
546デフォルトの名無しさん:2011/01/13(木) 21:18:28
カンマで分割ってのは区切るってことかな
C++ならstringにプッシュしていけばいいね
Cでもカンマ分大きく取ったバッファ用意して、頭からコピーすればいい
547デフォルトの名無しさん:2011/01/13(木) 21:29:00
TCHARはcharだったりwchar_tだったり、
wchar_tでもUnicodeだったりUTF-8だったり、
単純にstringには入れられねーだろが。
548デフォルトの名無しさん:2011/01/13(木) 21:34:24
んなもんtstringでも作ればいいだろ
それとutf-8をそのままwchar_tに入れることってあるの?
549デフォルトの名無しさん:2011/01/13(木) 21:38:21
古いCのコードをC#で書き直す作業をしているのですが、

#define XXX "aaaa"
#define YYY XXX "bbbb"

↑こういったdefine文の意味がどうもわかりません
この場合コード中のYYYはどういった文字列で解釈されるんでしょうか?
550デフォルトの名無しさん:2011/01/13(木) 21:43:47
aaabbbに決まってんだろ。
551デフォルトの名無しさん:2011/01/13(木) 21:43:55
01 #include "DxLib.h"
02
03 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
04 ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
05 if( DxLib_Init() == -1 ) return -1;
06
07
08 int SetGraphMode( 256 , 224 , 16 ) ; // 画面モードの変更
09
10
11 WaitKey() ;
12 DxLib_End() ;
13 return 0 ;
14 }

コンパイラー通したら初期化子が大杉って言われます。どこがいけないのかさっぱりわかりません。説明ってこれで足りてます…?
Visual Studio 2010, DXライブラリ関数使用, 256×224の画面を出力したい
552デフォルトの名無しさん:2011/01/13(木) 21:45:47
>>548
それとutf-8をそのままwchar_tに入れることってあるの?
wchar_tはただの整数型なので入れても構わないが、
入れる奴は規格を読まないクレイジー。
553デフォルトの名無しさん:2011/01/13(木) 21:47:16
>>551
説明たりねーよ。エラーメッセージを正確に書け。
554デフォルトの名無しさん:2011/01/13(木) 21:49:38
>553

error C2078: 初期化子の数が多すぎます。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

以上です。よろしくです。
初期化って事はreturnですよね?別に問題あるとは思えないんですが(-_-;
555デフォルトの名無しさん:2011/01/13(木) 21:55:44
>>551
× int SetGraphMode( 256 , 224 , 16 ) ;
○ SetGraphMode( 256 , 224 , 16 ) ;
他はわからん
556デフォルトの名無しさん:2011/01/13(木) 21:55:57
> int SetGraphMode( 256 , 224 , 16 ) ; // 画面モードの変更
557553:2011/01/13(木) 21:57:07
コンパイラがエラーが何行目なのか出力してるだろ。
それ見てもわからんのか?
558デフォルトの名無しさん:2011/01/13(木) 21:58:22
そういえば int i(0); なんてことができたんだなC++は
559デフォルトの名無しさん:2011/01/13(木) 22:00:29
>555-557

わかった&でけた^w^
みんなありがとう!
560デフォルトの名無しさん:2011/01/13(木) 22:01:27
>557氏

使い方をあんまり知らんかったのだw新参なもんで申し訳w
561553:2011/01/13(木) 22:05:14
>>560
ついでにエラーのカーソル位置に赤い下線が出るはず。
マウスでポイントするとエラー内容が表示される。
562543:2011/01/13(木) 23:10:52
レスありがとうございます。

>>545
>>546
言葉が足りなくてすみません。
カンマ入りの文字列を渡されるので、それを各要素に分割したいんです。

>vector<TCHAR>にpush_backして文字列を作っていけば?
>最後にbasic_string<TCHAR>に変換。

文字列の先頭から見ていってカンマじゃなければpush_backして
カンマが現れたらそこまでの長さ分バッファ確保して各要素に分ける
という意味ですか?
563デフォルトの名無しさん:2011/01/13(木) 23:27:27
>>562
「C++ split」でググればコードがでてくるよ。

あともうTCHARはやめてWCHARとかwchar_tきめうちでいいんじゃね。
564543:2011/01/13(木) 23:37:18
>>563

string を使用したsplitの例はググれば沢山コードがあるんですが。。
I/Fを指定されているのでTCHARでないとダメなんです...

もうちょっと探してみます。
565デフォルトの名無しさん:2011/01/14(金) 00:07:06
あえてCで書くとこんな感じ
C++だとstd::vectorとかstd::stringとか使えるんだから楽だろう
まあがんがれ

http://codepad.org/yGLOZi3S
566デフォルトの名無しさん:2011/01/14(金) 00:07:11
C++じゃなくてCのsplitコードを検索してみれ。
そして、string.h内の関数を軒並み_tcsファミリ関数に置き換えればOK。
Cコードなので一般的にバッファは固定長。

C++のstringとか使ったり、wchar_tきめ打ちしたりすると
MBCS使われたときに厄介なことになるよ。
567デフォルトの名無しさん:2011/01/14(金) 00:07:59
もうマルチバイト文字なんて使う機会なくね?
568デフォルトの名無しさん:2011/01/14(金) 00:08:41
って、565がすでに^^
569デフォルトの名無しさん:2011/01/14(金) 22:48:40
>>567
いまさらWin9x対応もないだろうしな。
それに、_tcsとか汎用テキストマッピングつかっていても、ワイド文字とマルチバイト文字と
両方で動くように書いてるやつなんてめったにいないだろうし。
ワイド文字決めうちのほうがトラブルが少なそう。
570デフォルトの名無しさん: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;
}
571デフォルトの名無しさん:2011/01/15(土) 01:14:07
Visual Studio 2010を使う
572デフォルトの名無しさん:2011/01/15(土) 01:28:26
>>570
ファイル名とファイルの中身は別もんだ
imbue()はファイルの中身を読み書きするためのlocaleを設定するための関数

結論だけいうと、ワイド文字版のopen()をつかうといいよ
Windowsのファイル名はどのみちUTF-16なんだから
今時Windowsでchar*でファイル名を扱うほうがありえない

ワイド文字なopen()は非標準だけど、
どうせ_tmain()とかstdafx.hとか使ってるんだから気にしないだろ?
573デフォルトの名無しさん:2011/01/15(土) 03:57:12
裏作業で無限ループしてる副スレッドを停止させるにはどうしたら良いでしょうか
574デフォルトの名無しさん:2011/01/15(土) 05:19:55
TerminateThread
575デフォルトの名無しさん:2011/01/15(土) 10:03:36
>>573
ワーカー側でループの度に、終了をリクエストされているかチェックするようにして
主スレッドから止めたいときには終了をお願いする

概念的にはただのフラグでいいけど、スレッドセーフになるように気をつけて
576デフォルトの名無しさん:2011/01/15(土) 10:07:39
>>567-569の書き込み自体が、マルチバイト文字で扱われているというのに。
577デフォルトの名無しさん:2011/01/15(土) 10:12:55
>>576
汎用テキストマップの話だからとうぜん内部で使うコードの話だよ。
578デフォルトの名無しさん:2011/01/15(土) 10:26:08
567のどこにそんなことが書いてある?
579デフォルトの名無しさん:2011/01/15(土) 10:35:34
>>578
うえのほうのTCHARがどうしたとか_tcsがどうしたって話を受けて、
マルチバイトがって発言なんだろ?
汎用テキストのことだよ。
580デフォルトの名無しさん:2011/01/15(土) 10:52:29
>>578みたいな文章が読めない奴って日本人なんだろうか
581デフォルトの名無しさん:2011/01/15(土) 12:09:28
>>575
VC6だけかも知れないが、
これだと終わらない場合がある。
m_stop=true とかにしてスレッド内でbreakするようにしても
なかなか死んでくれないのよね。
socket()を含んだやつは綺麗に終わるんだけど。
まだ未熟モノ?という事でよしなに。
582デフォルトの名無しさん:2011/01/15(土) 12:13:17
>>581
ちゃんとvolatileしてある?
583デフォルトの名無しさん:2011/01/15(土) 12:18:27
>>581
コンパイラの最適化、アトミック性、メモリバリア
といった概念や問題をちゃんと理解したほうがいいな

WindowsならInterlocked〜系のAPIを使うといいんじゃないの
584デフォルトの名無しさん:2011/01/15(土) 12:28:14
終了判定で変数見るだけなら、そのまま見てもいいでしょ。
585デフォルトの名無しさん:2011/01/15(土) 12:48:14
えっ
586570:2011/01/15(土) 13:05:05
アドバイスありがとうございました。ワイド文字版のopen()というのを使ってみます。
587デフォルトの名無しさん:2011/01/15(土) 13:27:55
>>585
なにがえっなんでしょう?
588デフォルトの名無しさん:2011/01/15(土) 13:55:55
>>582
シングルプロセッサ以外も想定するなら volatile は意味無いでしょ。
589デフォルトの名無しさん:2011/01/15(土) 13:59:58
えっ
590デフォルトの名無しさん:2011/01/15(土) 14:03:50
volatileは最適化を避ける効果「だけ」はあるんじゃないの
591デフォルトの名無しさん:2011/01/15(土) 14:11:43
よくわからん人や>>584やvolatileで解決すると思ってる人は
メモリバリアでぐぐるといいぞ

たとえば↓このへんでも読めば
http://d.hatena.ne.jp/i-saint/20101005/1286208402
592573:2011/01/15(土) 14:24:02
マルチスレッドプログラミングは色々と面倒ごとが多そうですね・・・
今回の場合
副スレッドの1ループと主スレッドからのスレッド停止フラグの操作をCRITICAL_SECTIONで排他すれば良いのでしょうか?
593デフォルトの名無しさん:2011/01/15(土) 14:29:04
なにをするために無限ループさせてるのかによるな
594デフォルトの名無しさん:2011/01/15(土) 14:38:30
>>592
それでもいいけど、上に出てたようにInterlockedCompareExchange()のような
APIのほうが安価だし、このケースではそれで十分

それと、ワーカーでやってるのがI/O待ちのような仕事なら
スレッド間通信にはEventを使って、ワーカーでI/OとEventを一緒に待つように汁
595デフォルトの名無しさん:2011/01/15(土) 16:25:28
>>594
こんな便利なAPIあったのか・・・

副スレッドはシリアルポートを通じて外部に接続した機器の定期的な監視とコントロールをしています
596デフォルトの名無しさん:2011/01/15(土) 16:44:37
volatileはコンパイラがマシン語生成するときに働くキーワードで、
メモリバリアはCPUがマシン語を実行するときに働くもの。
使いどころが違うと思うんだが。
VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。
597デフォルトの名無しさん:2011/01/15(土) 16:55:16
g_message[i/10] = 42;
メモリバリアを呼び出す関数の呼び出し(); // extern関数
g_complete = true;

このコードはコンパイラの順序入れ替えを抑制できないから、
メモリバリアすればいいと思ってる奴はアホ。
598デフォルトの名無しさん:2011/01/15(土) 17:10:37
中で何にアクセスしてるかわからない謎のextern関数を超えて順序を入れ替えたりはしないでしょう
そんなことしたらシングルスレッドでも結果が変わってしまいます
599デフォルトの名無しさん:2011/01/15(土) 17:41:40
>>596
VC6が手元に無いので何ともいえないけど、もしvolatileが無いことで
比較/参照のコードを最適化で消去してしまうのなら、「なかなか」ではなくて
「全く」変わらなくなるのでは?

「なかなか」変わらないのであれば、それはたぶん他のプロセッサから見えない
キャッシュ領域を読み書きしているためで、それこそコード生成時の最適化とは無関係な
実行時のメモリ可視性の問題に見えるけど
600デフォルトの名無しさん:2011/01/15(土) 19:03:40
俺は 名無し手動リセットのイベント使ってるな
WaitForMultipleObjects で複数監視できるので他のイベント待機のついでに
脱出イベントも用意してしまおうという腹
601デフォルトの名無しさん:2011/01/15(土) 19:35:13
TCHARとか_UNICODEって、みなさん使用されているのでしょうか?
Linuxとソースの互換がなくなるのでMSの書き方はできるだけ
したくないのですが。
charで動いているものをwcharにするメリットがよくわかりません
602デフォルトの名無しさん:2011/01/15(土) 19:45:23
他のOSでも動作するソフトを作らないので必要を感じません。
603デフォルトの名無しさん:2011/01/15(土) 20:11:22
>>601
たとえばUnicodeのファイル名などをサポートしなかったり
Unicodeの文字が入力できなかったり
マルチバイトの2バイト目でなにか問題を引き起こしたりしても
誰も文句を言わないようなプログラムなら、好きにすればいいんじゃないの
604デフォルトの名無しさん:2011/01/15(土) 21:40:25
ワイド文字かマルチバイト文字かってのとは別問題だけど、
TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが
機能してないしな。
605デフォルトの名無しさん:2011/01/15(土) 22:58:21
>>596
> VC6で別スレッドの変数がなかなか変わらないのは大抵volatileが原因。

Thanks 調べて見ます。そえいばVCで というかGCCでもvolatileなんて
使った事ないす。 確か実行中に他から変更される可能性あるって意味でしたよね。ちゃう?!
とにかく調べてみます。
606デフォルトの名無しさん:2011/01/16(日) 13:34:27
>>604
>TCHAR使ってマルチバイト文字とワイド文字を一つのコードで対応するってのが
>機能してないしな。
詳細kwsk。
607デフォルトの名無しさん:2011/01/16(日) 13:49:48
>>606
実際にはコスト要らずで安全に切り替えられることを保障できる仕組みではないので、
9x系への対応が不要な状態で、その(無駄な)コストを払いたがる人がいないという
ことを言っているのだと思う

コストってのは、両方で正しく動くプログラムを書き、両方で正しく動くことを
テストするコストね


608デフォルトの名無しさん:2011/01/16(日) 13:53:03
あの、TCHARやtcharのT(t)はどんな意味でつけたの
609606:2011/01/16(日) 14:15:22
>>607
char固有の処理を書くのが面倒でやってないってだけじゃないの?
「#ifdefで若干処理を分ける必要があるが、_UNICODEしか考慮しない人が多い」
ってだけ。それは「機能してない」とは言わないと思うけど。
610デフォルトの名無しさん:2011/01/16(日) 14:28:28
>>606
文字列の編集とか、マルチバイトとワイド文字列の両方で動くように意識してコード書いてる人、
そんなにいないでしょ。
で、両方でコンパイルしてコンパイルが通るかとか、テストまでやってるところなんて
壊滅的でしょ。
世のwindows用のコードは汎用テキストマップを使っていても99.9%は片方でしか動かない
と思う。
611デフォルトの名無しさん:2011/01/16(日) 14:43:32
>>609
言葉の綾程度の話なら、俺にはどうでもいい話だとしか言えん

>char固有の処理を書く
>#ifdefで若干処理を分ける

これって9x系をサポートしないんなら不要なコストじゃん
MSはとっくにそれを切り捨ててる(OSからも、コンパイラからも)

何のために「わざわざ」それを払うの?
612デフォルトの名無しさん:2011/01/16(日) 14:55:04
文章がお粗末な >>604
それに食いつく >>606
ややこしくする >>607
613デフォルトの名無しさん:2011/01/16(日) 15:34:57
自分でも特に有用なことは言えない >>612
614デフォルトの名無しさん:2011/01/16(日) 16:21:09
>>608
typedefと言う人もいるが個人的にはTEXTだと思ってる
615デフォルトの名無しさん:2011/01/16(日) 16:39:18
windows.hで定義されるのは_T()でなくてTEXT()だからtextじゃないの
616デフォルトの名無しさん:2011/01/16(日) 16:44:59
TCHARやTEXTつかってても
Win2000以降しか存在しないAPI使ってます
なんてのはよくあること
617デフォルトの名無しさん:2011/01/16(日) 17:06:29
MBCSで作られたアプリで、画面ではunicodeの文字が打ち込めるけど、
APIを通じて受け取るとSJISになるから文字化けするってあったけど、ああいうのって
UTF-8とかで受け取れるとかってできないのかね。

と一瞬思ったけど、どうせ半角1バイト、全角2バイトとか決めうちのコードばっかりで
ワイド文字に移行するのと同じくらいの手間がかかるだろうな。
618デフォルトの名無しさん:2011/01/16(日) 17:12:52
何が言いたいのかry
619デフォルトの名無しさん:2011/01/16(日) 17:47:54
受け取れるよ。ただ、VC++のLocaleは
Japanese_Japan.65001のようなUCS系の文字符号化方式を受け付けないので
VC++の標準ライブラリを通過するとSJISやEUC(の符号化文字集合)に含まれない
Unicodeの文字がすべて文字化けして落っこちるってだけ。
620デフォルトの名無しさん:2011/01/16(日) 17:56:27
>>617
Windowsでは非常に多くの場所でMBCSがDBCSだと仮定されていて
そのせいでUTF-8コードページ(CP65001)をきちんとサポートするのは
無理と聞いたことがある
まあMultiByteToWideChar()などでは使えるんだが

コンソールでもchcpで一見CP65001を設定できるが
文字幅が全く考慮されていないので、見た目がガタガタになるし
入力中にバックスペースで1文字削除する時などのカーソルの動きがおかしい
大昔のLinuxレベルだな
これはWindows7でも直ってない
621デフォルトの名無しさん:2011/01/16(日) 18:04:06
とりあえずwchar_tに日本語以外が入ってると表示すらできないVC++ランタイムはなんとかしてほしい
622デフォルトの名無しさん:2011/01/16(日) 18:10:04
高々16bitで世界中の文字をすべて表現可能だといきまいていた欧米人に
複雑な日本語の表示なんて不可能に決まってるじゃないか。超漢字使おうぜ。^^
623デフォルトの名無しさん:2011/01/16(日) 18:17:57
dirみたいな組み込みのコマンドは流石にUnicodeの文字でも表示するから
出力がコンソールのときはWriteConsoleW()を使ってるんだろうな

もっともdirもリダイレクトするとCP932のテキストになるが
624デフォルトの名無しさん:2011/01/16(日) 21:51:21
>>614-615
結局、思うぐいですか

でね、wchar_tのtはどんな意味?
625デフォルトの名無しさん:2011/01/16(日) 21:59:03
それは type でしょう
time_t とか div_t とか text と関係ないのにも使われてるし
626デフォルトの名無しさん:2011/01/16(日) 22:48:10
wchar_tはcharと等しいかそれより大きな整数としか規定されていないので
UCS-4とかになると1文字を収めるにはサイズが足らんてぃーの。
そこでC++0xではchar16_tとかchar32_tとか。
でも、じゃあ1文字1変数が実現するかって言うと
UTF-16とか使う限り不可能なんだよね。
627デフォルトの名無しさん:2011/01/16(日) 23:33:36
wchar_tは最大拡張文字集合(largest extended character set)の1メンバを入れられることが保障されている
char16_tとかchar32_tが導入されたのはint32_tのようにどの環境でも共通の文字コードを前提としたコードを実現するため
1バイト固定のcharに収まらないためにwchar_tが用意されたのとは違う

つまりUnicodeの合成文字みたいな複数メンバによって一文字を表す文字集合じゃないものを
最大拡張文字集合として扱える環境でwchar_tを使えば解決
628VCSE:2011/01/17(月) 00:08:28
環境は borand
C++でクラフチック法のプログラムと自動微分(ボトムアップ)のプログラム
作成したいのですが、分からないので教えてください
629デフォルトの名無しさん:2011/01/17(月) 00:20:25
>>628
何がわからないか分からないので教えてください
630VCSE:2011/01/17(月) 00:30:27
どのようにして式などをプログラムで書いていけばよいか
631デフォルトの名無しさん:2011/01/18(火) 00:22:09
if文中で構造体を初期化するとif文から抜けた瞬間消えてしまうのですが何か書き方があるのでしょうか?
if(s=110){
632デフォルトの名無しさん:2011/01/18(火) 00:38:09
if(s==110){
の続きはぁ〜?
ちなみにif文の中で構造体定義してるのであれば
当然if文抜けたら消える。

if文だろうがfor文だろうが{から}の中でint i;定義したら
{から}から抜けたらiは消えるよ。
633デフォルトの名無しさん:2011/01/18(火) 00:51:36
初期化と代入は違うからね。
634デフォルトの名無しさん:2011/01/18(火) 01:45:09
#include <stdio.h>
int main(void){
int num=1;
{int num=2;}
printf("%d\n", num);
return 0;
}
これの結果は 1 と表示される。
実際に動かしてみそ。
635デフォルトの名無しさん:2011/01/18(火) 01:50:14
#include <stdio.h>

int main(void){
int num=1;
{num=2;}
printf("%d\n", num);
return 0;
}
これの結果は 2 と表示される。
>>633の言うように初期化と代入は違うのだ。
分かったかね、>>631
636デフォルトの名無しさん:2011/01/18(火) 02:19:30
>>630
式はこうプログラムする
int a = 1 + 1;
637デフォルトの名無しさん:2011/01/18(火) 12:18:14
そのまま書けばいいと思うがw
638デフォルトの名無しさん:2011/01/18(火) 19:57:04
VC++ 2008 (Pro)で、VC++6で作ってあり、WinSDK 2003(?)ベースのプログラム、
ぶちゃけフリーソフトなんだけども、それをWin7_x64で動くようにしたい。
まず、Visual Studio 2008 Pro で、x64のコードを履かせるやり方は分かったものの、
コード自体がCだがMFCを使うためにC++風にしたコードらしく、C/C++の文法を
【これから】覚えようとはしているが、どうにも難しい。

一体どこから手をつければいいか分からない。
俺の周りにプログラムできるやつがいない。
笑い話だが、俺が一番詳しい。

どこから手をつければいいか教えてくれ。
639デフォルトの名無しさん:2011/01/18(火) 19:57:44
履かせる、は、吐かせるでいいのかな・・?
640デフォルトの名無しさん:2011/01/18(火) 21:21:01
まずVC2008でビルド出来るようにする事だな。
その前で色々考えても禿げるぞ。
641デフォルトの名無しさん:2011/01/18(火) 21:28:17
つか C の文法の範囲で MFC(C++) を呼び出すことできるん?
642デフォルトの名無しさん:2011/01/18(火) 21:38:16
Dekin.
643デフォルトの名無しさん:2011/01/18(火) 23:55:27
道程は遠いな。(高い確率で)挫折しそうだ。
作者様が忙しいというので、俺がやろうと思ったのだよ。
昔さ、C++のコードをJAVAのコードに変えて、
卒業した先輩がいたようだから、俺もどうにかできないかな〜って思ってね。
ところで、MFCを使うソフトをC#とか、勉強しやすいと言われる言語(思い込みだが)、に
コードを書き換えて、変換することってできんのかな。今の俺には無理だがな。

で、どんなソフトかというと、キーバインドに関係するプログラム。
もう分かったか?まあ、書かずに話を進めてくれるとありがたい。
644デフォルトの名無しさん:2011/01/19(水) 12:35:04
はい
645デフォルトの名無しさん:2011/01/19(水) 15:52:01
しょうが無いから自力で情報集めている。
VC++6からVC++2008に移植するとか、そんなサイトをあちこちから集めている。
しかし、「やさしいC」しか読んだことない俺にできるだろうか・・・
646デフォルトの名無しさん:2011/01/19(水) 16:14:09
悩めもがけ それが血肉となる。
647デフォルトの名無しさん:2011/01/19(水) 17:21:42
VC++のwcsファミリ関数(wcslenなど)は
サロゲートペアや合成文字を2文字とカウントしちゃうんだけど
コードページをcp932にしたら
Shift_JIS-2004になってちゃんと1文字とカウントするようになるかしら?
どうなの?
648デフォルトの名無しさん:2011/01/19(水) 17:48:08
ユニコードのほうがコードポイント数というか規模がはるかに大きいので
シフトJISではそもそもユニコードを表現できない
649デフォルトの名無しさん:2011/01/19(水) 21:38:37
>>627
unicodeの合成文字は最大十数バイトらしいんで、めちゃでかくなるな > wchar_t
650デフォルトの名無しさん:2011/01/19(水) 23:03:15
>>648
XPはともかく、JIS X 213に正式対応したVistaや7は
Shift_JISも2004対応になってるんじゃないのん?
Unicodeの全文字は到底無理だけど
サロゲートペアや合成文字で表現される日本の文字は
2バイトで表現可能になったんでないのかな?
651デフォルトの名無しさん:2011/01/20(木) 00:01:28
ヘッダにusingを書くのは良くないらしいですが関数の引数にstd::stringとか書くのもめんどくさいです
どうしたらいいですか
652デフォルトの名無しさん:2011/01/20(木) 00:22:33
typedef std::string s;
653デフォルトの名無しさん:2011/01/20(木) 08:04:36
Shift_JIS-2004なんて、この世のどこで使われてるんだよ
654x86_2_x64:2011/01/20(木) 17:12:36
「やさしいC++」をクラスの前まで読む予定。
これ、あと1回回したら、何をすればいい?
「一目で分かる Visual C++ 2008 アプリケーション開発入門」でいいかな?
655デフォルトの名無しさん:2011/01/20(木) 18:13:21
まず何をやりたいかだ
656デフォルトの名無しさん:2011/01/20(木) 18:19:43
セックスです。脱童貞を目指しています。ご教示お願いします。
657デフォルトの名無しさん:2011/01/20(木) 18:54:31
トルコ風呂逝け
658デフォルトの名無しさん:2011/01/21(金) 01:09:45
古いんだよ。じじぃ。ソプと言いなさい。

親日のトルコに対して失礼だろ。
659デフォルトの名無しさん:2011/01/21(金) 01:16:37
じゃあ、トルコ石のことはなんと呼べば…
660デフォルトの名無しさん:2011/01/21(金) 01:41:15
>>659
それは特産品だからいいんじゃね?
661デフォルトの名無しさん:2011/01/21(金) 01:43:12
まづ見苦しくない服を買いに行きます。
662デフォルトの名無しさん:2011/01/21(金) 12:55:19
visualc++2010でプログラム書いてます。
wcsncpy関数を使うとTEXTマクロ?で囲っても
キャストがうまくいかないみたいなエラーが出るんですがどうすれば出なくなりですか?
環境をマルチバイト文字セットを使用する、にするのはなしな方向でお願いします。
663デフォルトの名無しさん:2011/01/21(金) 13:48:48
そのエラーが出るってことはマルチバイト文字セットを使用する、になってる気がしないでもない
664デフォルトの名無しさん:2011/01/21(金) 14:09:50
TEXT(variable)とか書いてそうな気がする
665デフォルトの名無しさん:2011/01/21(金) 15:12:04
>>662
VC++を捨ててQt4に引っ越す
666デフォルトの名無しさん:2011/01/21(金) 20:35:57
TEXT()とかは_tcs系と使うもので、wcsなら使う必要ないわな。
667デフォルトの名無しさん:2011/01/22(土) 13:14:11
Effective C++で書かれているNon-Virtual Interface(NVI)を採用しようと思うのですが、
いい名前が思いつきません。例えば
void addAnimation (Animation* anim);
という非バーチャル関数があった場合、
virtual void addAnimationImpl (Animation* anim);
というバーチャル関数が考えられますが正直今ひとつ。
なにかいい名前ないですか?

668デフォルトの名無しさん:2011/01/22(土) 16:48:55
NULLではなく本当に何も代入しない代入ってできますか。
×:p[0] = NULL;
○:p[0] = ;
コンパイルエラーが出ます。
669デフォルトの名無しさん:2011/01/22(土) 16:50:46
p[0] = p[0];
670デフォルトの名無しさん:2011/01/22(土) 16:55:13
>>668
できない。
どういう経緯でそういうことをやろうと思ったのか説明できれば代わりの案がでてくるかもしれない。
671デフォルトの名無しさん:2011/01/22(土) 17:02:05
通常のNULLとは異なる「第2のNULL」が欲しいとかか?
672デフォルトの名無しさん:2011/01/22(土) 17:05:24
// p[0] = 0;
何もしない代入
673668:2011/01/22(土) 17:07:57
やりたいことはpinterがNULLも可で、
if (color)
 pointer[n++] = pointer ? color : 代入を無かったことに;

pointerがNULLでない時だけ代入したいのですが、これが難しい。
674デフォルトの名無しさん:2011/01/22(土) 17:10:17
>>673 なぜ if を使わない?
675デフォルトの名無しさん:2011/01/22(土) 17:11:02
NULLが不正なのか代入出来る場合に入っている値が不正なのか
676デフォルトの名無しさん:2011/01/22(土) 17:11:18
if (color && pointer)
pointer[n++] = color;
677デフォルトの名無しさん:2011/01/22(土) 17:17:13
>>673
boost.optional
678デフォルトの名無しさん:2011/01/22(土) 17:17:24
if (color)
 if (pointer)
  pointer[n++] = color;
679デフォルトの名無しさん:2011/01/22(土) 17:19:01
>>676
どう見てもそれで終了だよな

つまりなんでそんなことがしたいかの説明になっていないということだ
680デフォルトの名無しさん:2011/01/22(土) 17:19:37
馬鹿正直に書くと
if (color && pointer)
 pointer[n] = color;
if (color)
 n++
と4行ですが、X10ぐらいあって、何とか1,2行で書けないものかと。
む、難しい
681デフォルトの名無しさん:2011/01/22(土) 17:21:39
行数だけの問題なら、マクロでもテンプレートでもつかえばいい。
がしかしだ、本当の理由は無知だったのを認めたくないだけだろwwwww
682668:2011/01/22(土) 17:27:26
頑張って2行で書くと、
 if (color)
  pointer ? pointer[n++] = color : (poiner*)n++;
か、
 if (color && ++n && pointer)
  poiner[n-1] = color;
が考えられますが、お世辞にも見やすいとは言いがたい。
683デフォルトの名無しさん:2011/01/22(土) 17:32:42
>>682
n++が(pointer*)でキャストされてたり、++nが条件に入ってたり、どういう意味なんだ。
684デフォルトの名無しさん:2011/01/22(土) 17:33:23
なるほど意味は分かった
が、>>681に同意
マクロかテンプレート使うなら、別に特にトリッキーな問題じゃないだろ
685682:2011/01/22(土) 17:34:53
>>683
三項演算子(A?B:C)のBとCは型が一致してないとコンパイルエラーになるから。
colorがNULLでなければn++
686デフォルトの名無しさん:2011/01/22(土) 17:35:54
>>682
それ不定
687668:2011/01/22(土) 17:36:27
>>681, >>684
原則マクロは禁止。テンプレートも禁止。
この問題のためだけに制限を緩めるのはもったいない。
どうしてもいいアイディアが思いつかない。
688682:2011/01/22(土) 17:37:11
>>686
どこが?
689デフォルトの名無しさん:2011/01/22(土) 17:42:07
おまえら遊ぶのもたいがいにしろ。

>>673 (>>687)
if (color) { if (pointer) { pointer[n] = color; } ++n; }
690デフォルトの名無しさん:2011/01/22(土) 17:42:12
同じようなコードが繰り返されるからすっきりさせたいってことらしいけど
関数やらマクロやら使わない条件なら、そのコードを多少いじって工夫しても大差ないだろ。
691デフォルトの名無しさん:2011/01/22(土) 17:44:44
>>685
型を一致させる? color の型は pointer* なのか? pointer は型名なのか?おまえはバカなのか?
692デフォルトの名無しさん:2011/01/22(土) 17:45:20
>>668
これ以上あがいても、恥が上乗りするだけ。
693682:2011/01/22(土) 17:47:40
>>689 長い。却下。
これまでをまとめるとこれが一番良いように思う。

 if (color)
  pointer ? pointer[n] = color, n++ : n++;

完璧?
694デフォルトの名無しさん:2011/01/22(土) 17:49:51
689でFAだな
695682:2011/01/22(土) 17:51:23
(自分で決めた)コーディングスタンダード的に、
マクロ×、テンプレート×、一行に沢山書く×、同じような処理を繰り返す×
やっぱり>>693が一番美しいと思う。
696デフォルトの名無しさん:2011/01/22(土) 17:51:47
>>687
緩めるのがもったいないっていうが、その禁止事項のどこにメリットがあるの?
697デフォルトの名無しさん:2011/01/22(土) 17:53:26
>>693
そんなウンココードにする理由が 56 文字から 51 文字に短縮するためなの?
頭おかしい。
698682:2011/01/22(土) 17:54:08
>>696
プログラマーの見るソースと、コンパイルされるソースが異なるのが最大の問題。
あれはゆるせない。
699デフォルトの名無しさん:2011/01/22(土) 17:54:35
668の時点で頭おかしいとみんな思ってる
700デフォルトの名無しさん:2011/01/22(土) 17:55:37
>>698
なんてことだ!それじゃ #include も使えないな!
701682:2011/01/22(土) 17:56:46
これうんこコードですか?

 if (color)
  pointer ? pointer[n] = color, n++ : n++;

意図が明確で、上から下に、左から右に読めば理解できて、なおかつ見やすい。
これでいいよね?


702デフォルトの名無しさん:2011/01/22(土) 18:11:11
>>701
n++ がダブっている。
理解するのにマイナーな演算子の優先順位やシーケンスポイントのルールを
調べるなり思い出すなりする必要がある。
703デフォルトの名無しさん:2011/01/22(土) 18:12:32
>>701
color の判定と pointer の判定とで不統一になっている。
704デフォルトの名無しさん:2011/01/22(土) 18:13:06
n++++++;
705デフォルトの名無しさん:2011/01/22(土) 18:16:52
>>701
条件演算子使わないでifのほうが明確なんじゃないの?
706デフォルトの名無しさん:2011/01/22(土) 18:19:47
同じコードがx10続くらしいけど、たぶんちょっといじればループでまわせるような処理なんだろうな。
707デフォルトの名無しさん:2011/01/22(土) 18:37:35
>>701
条件演算子って代入の際の右辺値に使うものだって思ってた
はっきり言って気持ち悪い
708デフォルトの名無しさん:2011/01/22(土) 18:39:33
if文を一行で書いた方がマシ
709682:2011/01/22(土) 18:54:07
>>701 評判悪いなぁ
でもこれで行きます。私のコードなので自分がいいと思えばそれが一番。
710デフォルトの名無しさん:2011/01/22(土) 19:52:00
じゃ聞くなよアホか
711デフォルトの名無しさん:2011/01/22(土) 19:55:37
コミュニケーションがとりたかったんだろ。
「こんなコード書いたけどどうっすか?」みたいな。

ググればすぐ分かるのに質問してくる初心者とか、
結論がでてるのにとぼけて質問してるようなやつとか、寂しいからだろ。
712デフォルトの名無しさん:2011/01/22(土) 20:53:45
pointer[n] = color, n++
が鼻から悪魔な件
713デフォルトの名無しさん:2011/01/22(土) 21:25:53
>>712
んなこたーない。カンマ演算子の左と右の間にはシーケンスポイントがある。
714デフォルトの名無しさん:2011/01/22(土) 22:55:38
盛り上がるネタはいいね。
まぁ見やすくてわかり易いのいいかと。
コンパイラは賢いからそんなに差は出ないでしょ。
715デフォルトの名無しさん:2011/01/23(日) 00:04:03
>>711
PGは孤独を楽しめない奴には向いてないよね
716デフォルトの名無しさん:2011/01/23(日) 00:07:19
>>712
pointer[n++] = color
717デフォルトの名無しさん:2011/01/23(日) 00:45:40
>>716
意図が明確じゃないですよね
718デフォルトの名無しさん:2011/01/23(日) 00:53:20
意図はわかるだろ?
719デフォルトの名無しさん:2011/01/23(日) 01:09:38
意図おかし
720デフォルトの名無しさん:2011/01/23(日) 01:12:28
意図が分からないというのは、インクリメント演算子の挙動が分からない人からみたらってこと?
721デフォルトの名無しさん:2011/01/23(日) 01:57:21
>>712 の方が判り難いわ
722デフォルトの名無しさん:2011/01/23(日) 02:49:30
ところで>>689>>693の長さが大差無いように見えるのは俺だけ?
if (color) { if (pointer) { pointer[n] = color; } ++n; }
if (color) pointer ? pointer[n] = color, n++ : n++;
723デフォルトの名無しさん:2011/01/23(日) 03:24:48
>>695
>マクロ×、テンプレート×
って
>同じような処理を繰り返す×
とどう両立させんのw

お前知識ないだけだろ
コーディングスタンダードとか笑わせるw
言い訳でしかないわ
724デフォルトの名無しさん:2011/01/23(日) 04:06:55
>>701のうんこコードをもっと運子にすると
if (color) pointer ? pointer[n++] = color : n++;

これより>>689の方が1万倍マシ。
725デフォルトの名無しさん:2011/01/23(日) 05:00:39
> 代入を無かったことに
if (color) pointer ? pointer[n] : color = color, n++;
726デフォルトの名無しさん:2011/01/23(日) 11:07:34
>>701
IOCCCに出る権利をやろう
727デフォルトの名無しさん:2011/01/23(日) 15:53:38
質問者が無知であったのを認めないで、あがいている図式w
728デフォルトの名無しさん:2011/01/27(木) 00:45:30
C++が出来るって言えるには、MFCぐらい使えないとダメですかね?
私、Cは一応やってましたが、この度C++を勉強することにしました

クラスを作るレベルから始めてますが、どうなることやら
729デフォルトの名無しさん:2011/01/27(木) 01:10:15
MFCはともかくSTLが使えて自分でもテンプレート書けないとな
730デフォルトの名無しさん:2011/01/27(木) 02:36:42
簡単 なクラステンプレトと関数テンプレトぐらいは書けるけどなぁw
STLは便利よね。
MFCはダイアログベースのアプリでデータ変換プログラムぐらいは書けます。
でもやっぱ g++ linux が単純で楽しいかと。
731デフォルトの名無しさん:2011/01/27(木) 02:56:57
二段階検索と引数依存検索を理解できたら
「テンプレートを理解した」と称してもよいんじゃないでしょうか。
732デフォルトの名無しさん:2011/01/27(木) 03:50:35
>>728
MFC は出来なくても問題ない
Win32API は知ってた方が良いが C++ とは関係ない
Qt4 とか wxWidgets とかが使えると楽しい
STL とかテンプレートは使えた方が便利だが使わなくても済む場合も多い
733デフォルトの名無しさん:2011/01/27(木) 03:52:25
テンプレなんてただのマクロだろ
734デフォルトの名無しさん:2011/01/27(木) 07:06:30
なるほど〜STLとテンプレートか
Win32APIは聞いたことあるけど、いろいろ勉強してみる d
735デフォルトの名無しさん:2011/01/27(木) 14:37:27
>>733
俺も最初C++勉強したときはそう思ったな・・・・・・・
736デフォルトの名無しさん:2011/01/27(木) 15:23:53
>>733
http://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回読め
737デフォルトの名無しさん:2011/01/27(木) 15:33:35
便利なマクロくらいの認識でも問題ないな
738デフォルトの名無しさん:2011/01/27(木) 15:45:08
STLはよく出来てるのではありません。
恐ろしく良く出来てるのであります。

C++は最高傑作の言語です。

さて誰の言葉でしょう。
739デフォルトの名無しさん:2011/01/27(木) 15:49:06
おちんちんボーイ
740デフォルトの名無しさん:2011/01/27(木) 15:51:29
>>738
禿げ
741デフォルトの名無しさん:2011/01/27(木) 15:53:57
オリジナルテンプレート多数多重に駆使するプログラムはクソだ。
個人の中だけでやり、外で出てくるな。
742デフォルトの名無しさん:2011/01/27(木) 16:28:57
そうだね。
人に使われてるうちはクソなコードを避けて通ることができないから
クソなコードを書く人間を解雇できる立場にはやくなれるといいね。
743デフォルトの名無しさん:2011/01/27(木) 16:37:13
わらた、深読みしすぎw
744デフォルトの名無しさん:2011/01/27(木) 20:14:29
浅いテンプレートでコンパイルエラー出た場合、おおよそ見当がつくけど
ディープな奴だとちんぷんかんぷんになる
745デフォルトの名無しさん:2011/01/28(金) 00:07:01
おいおい、男女雇用機会均等法に基づき、
「チンぷんかんぷん」だけではなく「マンぷんかんぷん」も
平等に使っていけよ? 人として。
746デフォルトの名無しさん:2011/01/28(金) 03:35:46
マンプイ
747デフォルトの名無しさん:2011/01/28(金) 11:22:16
得意げになってテンプレート振りかざすアホは死ねばいいと思う。
読みにくくてしょうがない。テンプレートは使用禁止が正しい。
748デフォルトの名無しさん:2011/01/28(金) 12:33:07
>>747
テンプレート使ったら即座に全部読みにくくなるわけじゃないだろう。
個別にコードを改善することはできんのか?
749デフォルトの名無しさん:2011/01/28(金) 12:34:16
テンプレートですら理解できないアホはC++から手を引いたほうがいいと思う。
750デフォルトの名無しさん:2011/01/28(金) 12:38:03
むしろお前が理解できてないアホの可能性があるのに
「使用禁止が正しい(キリッ」
とか恥ずかしくないの?

なんか勝手に縛りプレイしてるレスたまに見るけど、適材適所って言葉知らないのかね。
柔軟に行こうぜ。
751デフォルトの名無しさん:2011/01/28(金) 13:55:30
vectorに値を入れたいんだけど、vector.at()は、このような使いかたで良い?

std::vector<int> vec = std::vector<int>(length);
for (int i = 0; i < length; i++)
vec.at(i) = なんらかの処理の戻り値(int型);
752デフォルトの名無しさん:2011/01/28(金) 14:01:10
>>751
おk
0〜lengthのループなら範囲チェックも不要だから
vec[i] =でもいい
753デフォルトの名無しさん:2011/01/28(金) 14:28:58
>>752 ありがとう。

std::unique_ptr<std::vector<int>> とすると、[]演算子使うのが躊躇っゃうんだ。

たしかvectorは、連続性が保証されてたから、上手く動くかもしれないけど
オーバーランしちゃうんじゃないかとか考えちゃって…。
754デフォルトの名無しさん:2011/01/28(金) 14:33:50
なにか勘違いしてる気配を感じるが上手く説明できない
755デフォルトの名無しさん:2011/01/28(金) 14:38:17
>>754 んー… 上手く表現できないけど。

std::unique_ptr<std::vector<int>> vec(new std::vector<int>(length));

この場合、(*vec)[i] と書くと混乱しない? 俺だけ?
756デフォルトの名無しさん:2011/01/28(金) 14:41:53
unique_ptrどうこうじゃなくて
連続性の保証を気にしてる辺りが
データへのポインタに[]使ってるわけじゃないんだから・・・・・・
757デフォルトの名無しさん:2011/01/28(金) 14:55:54
>>750
いやテンプレートを使わないと書けないプログラムは存在しない。
現状ではデメリット方が多いのでテンプレートは一律禁止にしたほうがいい。
あれは技術屋のオナニー。STLだけは許す。

758デフォルトの名無しさん:2011/01/28(金) 15:14:19
1と0で書けないプログラムは存在しない。
759デフォルトの名無しさん:2011/01/28(金) 17:32:49
こういうやつが EC++ みたいなクソを生み出したりしたんだろうな。
760デフォルトの名無しさん:2011/01/28(金) 17:55:07
>>757
>>750は適材適所って言っているよね
テンプレートを使わないとプログラムは書けないなんて
一言も言っていないよね
それとデメリット多いから禁止とか、包丁危ないから
禁止って言ってるのとレベル変わらないよ?
そもそもオナニーって気持ちいいよね、何で否定的なの?
敬虔なカトリックなの?
761デフォルトの名無しさん:2011/01/28(金) 18:46:47
柔軟が重要。 自分でもこの書き方嫌いだけど
今回はこうした方が保守性がいいからこうする、って
ことあるし。

みんなも柔軟にね〜
762デフォルトの名無しさん:2011/01/28(金) 19:54:59
イテレラつかって begin と end の間で
やったほうが作法かと。
どでしょ。
763デフォルトの名無しさん:2011/01/31(月) 02:16:22
C/C++とは直接関係ないんだけど、どこで聞けばいいのか分からんからここで聞かせてくれ

Linuxのtimeコマンドみたいにプログラムの実行時間を測定するWindows 7 64bit用のツールってある?
今までWindows Server 2003 Resource Kit Tools付属のtimeitを使ってたんだけど環境移行して使えなくなってしまった
764デフォルトの名無しさん:2011/01/31(月) 02:40:12
union {
  int pair[2];
  struct {
    int x;
    int y;
  } point;
}

この場合、 pair[0]==point.x と pair[1]==point.y は保証されますか?
765デフォルトの名無しさん:2011/01/31(月) 03:13:35
されない
766デフォルトの名無しさん:2011/01/31(月) 03:31:49
>>763
Server2008の方にある
767デフォルトの名無しさん:2011/01/31(月) 03:31:56
>>765
わからない 教えてくれ。
パディングの問題もないと思うが。
768デフォルトの名無しさん:2011/01/31(月) 03:34:55
わからないならレスしないでください。
769デフォルトの名無しさん:2011/01/31(月) 05:22:56
union のメモリレイアウトが正確に重なることが保証されるのは、
「先頭のメンバの型が同じであるPODな構造体」をメンバに持ち、
かつそれらの構造体の先頭メンバを参照するときだけ。
それ以外は処理系依存。

これはC89の規格だが、C++でもおそらく変わらないはず。

自分の開発環境でどうなのか知りたければコンパイラのドキュメント嫁。
770デフォルトの名無しさん:2011/01/31(月) 13:24:56
union以前に、struct { int x; int y; } point;でのyの位置が実装依存だよね

int並べた構造体とint配列で位置がずれる実装は現実にはなさそうな気はするけど
771デフォルトの名無しさん:2011/01/31(月) 14:22:24
g++使いとしては、テストしておkだったらそのまま使う。
それがだめならウニなんて使う理由がない。
エンディアンの処理に使うぐらいかな。
772デフォルトの名無しさん:2011/01/31(月) 15:04:41
struct pointのサイズがpair[]と一致するかコンパイル時にチェックすれば
いいんじゃないの

この辺参考に
ttp://bytes.com/topic/c/answers/441690-structure-size-check-compile-time
773デフォルトの名無しさん:2011/01/31(月) 15:05:49
そんな規格違反な使い方をしていると
コンパイラのバージョンが上がった途端に
コードが使い物にならなくなったりするじゃないか…。

マイクロソフト製品とかとくにそう。
774デフォルトの名無しさん:2011/01/31(月) 15:06:52
>>771
unionにはvariantや関数型のdiscriminated union(代数データ型)みたいな
用途もあるだろう
っていうかもともとそれが本来の用途だと思うのだが
775デフォルトの名無しさん:2011/01/31(月) 15:10:53
gccだと-O2で暗黙に指定されるstrict aliasingが有効になってると
強引なキャストでのtype punningで不正なコードが生成されるので
そのワークアラウンドとしてunion使ってる人も多いかも

まあ規格違反といえば違反だけど、Cでそういうお上品なことばかり
言ってても仕方が無い
776デフォルトの名無しさん:2011/02/01(火) 16:54:28
俺なら規格で保証されてなくても使うけどな。
俺の環境で動けばそれでいい。
777デフォルトの名無しさん:2011/02/01(火) 17:59:57
なら言わいでええやん
778デフォルトの名無しさん:2011/02/01(火) 23:30:26
>>776
同意
>>777
黙ってろ
779デフォルトの名無しさん:2011/02/02(水) 09:31:48
>>777
同意
>>778
黙ってろ
780デフォルトの名無しさん:2011/02/02(水) 21:52:22
VC++ 2008を使っているのですが、ifstreamってclose()を呼び出しただけでは、
エラービットはクリアされないんんでしょうか?
下のソースコードだと、b.txtとc.txtの中身を表示できないので、
とりあえずclear()呼び出してます。それとも、やっぱり何か使い方を間違っていますか?
どなたかご教示お願いします。
#include <iostream>
#include <fstream>
#include <string>
int main(void)
{
  std::string fileName[3] = { "a.txt", "b.txt", "c.txt"};
  std::ifstream ifs;
  std::string buf;
  
  for(int i=0; i<3; i++){
    ifs.open(fileName[i].c_str());
    if(!ifs.is_open()){
      std::cerr << "Err:" << fileName[i].c_str() << std::endl;
      return (-1);
    }
    while(std::getline(ifs, buf)){
      std::cout << buf << std::endl;
    }
    ifs.close();
    //  ifs.clear();
  }
  return (0);
}

781デフォルトの名無しさん:2011/02/02(水) 22:07:16
C#から転向なんだけど難しいなあ・・・

コピーコンストラクタとかなんのために必要なんですか?
782デフォルトの名無しさん:2011/02/02(水) 22:17:04
783デフォルトの名無しさん:2011/02/02(水) 23:04:52
>>781
単なるコピー以上のことをするため
GCがないからコンテナやスマートポインタをベタにコピーするとまずい
784デフォルトの名無しさん:2011/02/02(水) 23:21:07
>>780
エラービットの細かい仕様は知らなくても、 ifs をループの中に入れてやれば自然だし十分でしょ。
そうすれば open() じゃなくてコンストラクタも使えるし。
785デフォルトの名無しさん:2011/02/03(木) 01:29:56
>>783
そんなことは些細なこと
ポインタの二重解放とかもっとやばいのが潜んでる
786デフォルトの名無しさん:2011/02/03(木) 01:53:00
内側でnewするクラスはたいてい
private:
Hoge(const Hoge&);
void operator=(const Hoge&);
で事足りる
787デフォルトの名無しさん:2011/02/03(木) 02:29:07
開放したポインタにNULLを入れて何回でもdeleteしてやる
788デフォルトの名無しさん:2011/02/03(木) 02:39:31
>>787 スマートポインタ使えよ。
789デフォルトの名無しさん:2011/02/03(木) 12:53:45
スマートポインタは何の本を読んだら分かりますか
790デフォルトの名無しさん:2011/02/03(木) 13:20:09
使えれば分からなくていいです
791デフォルトの名無しさん:2011/02/03(木) 15:07:36
まずはwikipediaで十分だと思う
792デフォルトの名無しさん:2011/02/03(木) 16:49:44
>>789
はい、スマートポインタ
いろいろ機能を追加していったら
shared_ptrとかになる
http://codepad.org/WT7vbhHD
793デフォルトの名無しさん:2011/02/03(木) 17:14:43
譲渡に頼るのは好き好きだな。

ちゃんとコピコンで管理する方が好きだな。
そんなに難しくないでしょ。ちゃう?
794デフォルトの名無しさん:2011/02/03(木) 18:03:41
ポマードポインタ

口が裂けても大丈夫
795デフォルトの名無しさん:2011/02/03(木) 21:51:37
STLって何ですか?
ISO/IEC 14882をぜんぶ読んだのですが、載ってませんでした。
796デフォルトの名無しさん:2011/02/03(木) 22:00:32
ISO/IEC14882で定義されてるテンプレートライブラリをSTLと呼ぶことが多い
797デフォルトの名無しさん:2011/02/03(木) 22:39:51
Superior Temlate Libraryの略。
798デフォルトの名無しさん:2011/02/03(木) 22:59:34
>>797
つっ、釣られないんだからねっ!
799デフォルトの名無しさん:2011/02/04(金) 00:25:48
800デフォルトの名無しさん:2011/02/04(金) 00:38:11
凄いテンプレートライブラリと覚えとけば問題ない。
801デフォルトの名無しさん:2011/02/05(土) 23:46:47
ステキなテンプレートライブラリ
802デフォルトの名無しさん:2011/02/06(日) 11:19:59
こんにちは。この度プログラムでHTML上のsubmitボタンを押す方法がわからなくて質問をさせて頂きます。

MSHTMLを使い、html上のinputの<type = "submi">ボタンを押したいのですがうまくいきません。
inputの<type = "image">や<type = "text">なら以下のようにしてクリックできるのですが、なぜsubmitボタンはうまくいかないのでしょうか?
よろしくお願いいたします。

環境 visual C++ 2008 Express Edition

SHDocVw::IWebBrowser2Pt m_pIE.CreateInstance(L"InternetExplorer.Application");

//希望のページに飛ぶ(中略)

MSHTML::IHTMLDocument3Ptr pDocument( m_pIE->Document );
MSHTML::IHTMLElementCollectionPtr pCollection = pDocument->getElementsByTagName(_bstr_t(L"input"));
for (long i = 0; i < pCollection->length; ++i)
{
MSHTML::IHTMLInputElementPtr pInput(pCollection->item(_variant_t(i)));
if (!_wcsicmp(pInput->type, "submit" ) && pInput->value == _bstr_t( "要素の名前" ) ) {
MSHTML::IHTMLFormElementPtr pForm(pInput->form);
//!クリックする
if (pForm){
pForm->submit();
}
}
}
803デフォルトの名無しさん:2011/02/06(日) 11:43:14
UIAutomation使えばいいよ
押せたの確認できたし
804デフォルトの名無しさん:2011/02/06(日) 12:41:21
IHTMLDocument::createEventObject
IHTMLEventObj::fireEvent
じゃだめ?
submitで実験したことはないんだがたいていのものはこれでなんとかなった
805デフォルトの名無しさん:2011/02/06(日) 19:04:20
int* x = new int()
でメモリを確保した場合
変数名じゃなくてポインタに名前がついてるみたいで何やら気持ち悪いんだが
これはそういうものとして割り切るものなの?
806デフォルトの名無しさん:2011/02/06(日) 19:07:57
p_xとしたりする
807デフォルトの名無しさん:2011/02/06(日) 19:10:57
女湯を覗き見したらおばちゃんの裸だったp_x
808デフォルトの名無しさん:2011/02/06(日) 19:19:51
ポインタ変数も変数だから、xは変数名だ
809デフォルトの名無しさん:2011/02/06(日) 21:27:12
>>803 >>804
この言葉で以下を試してみたらうまくいきました。
MSHTML::IHTMLElementPtr pElement(pInput);
//!クリックする
if(pElement){
pElement->click();
}
UIAutomationも調べてみましたが、かなり汎用性のあるものですね。
考えていただき有難うございます。
810デフォルトの名無しさん:2011/02/06(日) 21:44:50
>>805
int *x = new int[hoge];
811デフォルトの名無しさん:2011/02/06(日) 23:04:35
>>810でnewの配列初期化(全て0とか、全て1とか)も同時にするにはどうするの

int *x = new int(1)[hoge]; じゃダメだった

812デフォルトの名無しさん:2011/02/06(日) 23:12:34
>>811
int* x = new int[hge]();
813デフォルトの名無しさん:2011/02/06(日) 23:18:04
calloc
814デフォルトの名無しさん:2011/02/06(日) 23:19:47
>>812
それC++0xからしか使えないよ
815デフォルトの名無しさん:2011/02/06(日) 23:38:36
>>814 何を根拠にそんなことを?
816デフォルトの名無しさん:2011/02/06(日) 23:42:28
int* x = new int[hge]:{ 1... };
817デフォルトの名無しさん:2011/02/06(日) 23:43:51
>>815
規格票
818デフォルトの名無しさん:2011/02/07(月) 00:00:47
>>817
いつのバージョン見てるの?

これは 2003 のやつから引用。 5.3.4 New p15 より。
> If the new-initializer is of the form (), the item is value-initialized (8.5);

古い奴だとこれが無いのかと思って探してみたけど。
C++98 でも同じく 5.3.4 New p15 にちゃんと書いてある。
http://www.kuzbass.ru:8086/docs/isocpp/expr.html
> If the new-initializer is of the form (), default-initialization shall be performed (dcl.init);
819デフォルトの名無しさん:2011/02/07(月) 00:06:58
int* x = new int[hge](100);
なら、配列は全て100でされるの?
820デフォルトの名無しさん:2011/02/07(月) 00:11:02
>>819
だめ。配列 new ではデフォルト初期化しかできない。

素直に std::vector 使っとけ。
821デフォルトの名無しさん:2011/02/07(月) 00:14:48
>>818
ちゃんと配列newの所見てる?
822デフォルトの名無しさん:2011/02/07(月) 00:20:15
>>821 見てる場所は書いてあるじゃん。
823デフォルトの名無しさん:2011/02/07(月) 00:26:48
>>822
? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.

これが目に入らなかったと見えるな
824デフォルトの名無しさん:2011/02/07(月) 00:34:39
>>823
その中の2つのケースのどちらにも、 POD である int の配列は該当しないな。関係ない。
825デフォルトの名無しさん:2011/02/07(月) 00:44:13
1
direct-new-declarator:
[ expression ]
direct-new-declarator [ constant-expression ]

じゃこれか
配列newにはnew-initializeroptは使えない
826デフォルトの名無しさん:2011/02/07(月) 00:49:45
>>825
direct-new-declarator の後ろに new-initializer が来るんだよ。問題ない。

以下、 C++ 2003 5.3.4 New p1 より。(下付き opt は ,opt に置換してある。)

new-expression:
 ::,opt new new-placement,opt new-type-id new-initializer,opt
 ::,opt new new-placement,opt ( type-id ) new-initializer,opt
new-placement:
 ( expression-list )
new-type-id:
 type-specifier-seq new-declarator,opt
new-declarator:
 ptr-operator new-declarator,opt
 direct-new-declarator
direct-new-declarator:
 [ expression ]
 direct-new-declarator [ constant-expression ]
new-initializer:
 ( expression-list,opt )
827デフォルトの名無しさん:2011/02/07(月) 00:53:20
>>826
あんたもしつこいねえ。gccに-ansiを付けてコンパイルしてごらんよ

..\Array_new1.cpp:14:26: error: ISO C++ forbids initialization in array new

って出るから

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
int* p = new int[100](1);

std::copy(p, p + 100, std::ostream_operator<int>(std::cout, " "));
std::cout << std::endl;
}
828デフォルトの名無しさん:2011/02/07(月) 00:58:48
おっと
×ostream_operator
○ostream_iterator
829デフォルトの名無しさん:2011/02/07(月) 00:59:03
>>827
値の指定はできないって、 >>820 でも書いてるだろ。

g++ を信じるというなら↓をコンパイルしてみるといい。
int main() { new int[100](); }

当然↓はエラーになる。
int main() { new int[100](1); }
830デフォルトの名無しさん:2011/02/07(月) 01:00:55
>>829
なんだ、空の()に限っていたのか
それは付けても付けなくても同じだろ元々
()の中に何か入れるとエラーになるという事を俺は言いたかったのさ
831デフォルトの名無しさん:2011/02/07(月) 01:04:24
>>830
あんた >>814 とは別人だったの?

で、 () 付けたらデフォルト初期化されるが、付けなかったら初期化されない。
これも >>811-812 見てたらわかるはずなんだけど。
832デフォルトの名無しさん:2011/02/07(月) 01:07:03
4064168 4064168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
本当だおかしな値が入るな
833デフォルトの名無しさん:2011/02/11(金) 21:35:57
sprintfなのですが

#define ROMC    const far rom char

sprintf(gLcdBuf, (ROMC *)"CN%-2dCN%-2dCN%-2dCN%-2d", 1, 2, 3, 4);

この場合、(ROMC *)はどのような意味があるのでしょうか?
834デフォルトの名無しさん:2011/02/11(金) 21:42:28
>>833
文字列リテラルを指す char* (あるいは char const* )型の値を const far rom char* 型にキャスト。
far とか rom とかが何を指すのかはコンパイラか開発環境のドキュメントを嫁。
835デフォルトの名無しさん:2011/02/11(金) 21:44:19
far ポインタってMSC6の時にあったと思うが
rom なんてあったのか。
836 ◆QZaw55cn4c :2011/02/11(金) 22:48:49
>>835
ggってみると PIC のコンパイラ(MPLAB-C) にあるようで。
でも PIC に far/near があるとは思えない。
>>833 はどこぞのコピペらしいし、変わった type qualifier をよせ集めてみただけじゃないかなあ。
837デフォルトの名無しさん:2011/02/11(金) 23:09:25
>>834-836
ありがとう。
PICのプログラムをAVRに移植してるところです。
838 ◆QZaw55cn4c :2011/02/11(金) 23:21:57
>>837
それは、それは。
疑って申し訳ない。
839デフォルトの名無しさん:2011/02/11(金) 23:34:46
>>838
こちらこそ、スレ2つに書き込むのはルール違反でした。
840デフォルトの名無しさん:2011/02/12(土) 16:25:25
vc++10の警告についてですが
warning LNK4042: オブジェクトの指定が重複しています。余分なものは無視されます。
とのことですが
オブジェクトの指定とは何でしょうか
841デフォルトの名無しさん:2011/02/12(土) 17:12:04
842デフォルトの名無しさん:2011/02/13(日) 16:54:56
クラスのコンストラクタやメンバ関数の定義を、
クラスの内に書くとコンパイラにインライン化を要求する。
クラスの外に書くとインライン化されない。となるようですが…

ごく短い処理をわざわざクラス外にinline指定して書いてあるコードを見かけました。
かと思えば、同じコード内の非常に似通った機能の別のクラスでは内に書いてあり、混乱しています。
クラス内に書く方法と、クラス外にinline関数として書く方法では厳密な違いがあるのでしょうか?
843デフォルトの名無しさん:2011/02/13(日) 16:58:48
>>841
ありがとう
でもそういうことじゃないんです
そしてPC再起動で直ったってどういうこと
844 ◆QZaw55cn4c :2011/02/13(日) 17:20:45
>>842
二つに違いはないと思います。
私についていえば、そもそも、クラスの定義の中でメソッドを書こうが、inline をつけてみようが、必ずしもインライン化されるとは限らないですから、
私は、クラスの内、外でわざわざ意味づけをしようとも思っていないのです。複数のモジュールに分けるときには、インラインコードはヘッダに書くように気をつけてはいますが。
845842:2011/02/13(日) 17:42:04
>>844
ありがとうございます。
おかげですっきりしました。
846デフォルトの名無しさん:2011/02/13(日) 20:21:07
メソッド内で別クラステンプレートの実体化がおこるとき、
外部定義したときとインライン定義したときで、
微妙に実体化のタイミングが違ったりして
VCではだいじょうぶなのにgccではエラーになったりする
847デフォルトの名無しさん:2011/02/13(日) 20:53:07
>>844
仕事してない中年ニートの癖にw
848デフォルトの名無しさん:2011/02/13(日) 22:43:22
メソッド…ねぇ。まぁいいけど。

実装スキームの違いはあれど
検索ルールやPOIは厳格に決められているのだから
一方でエラーになるなんていうのはどっちかがクソ実装ってだけ
849 ◆QZaw55cn4c :2011/02/13(日) 23:05:40
>>848
失礼しました。「メンバ関数」といいなおします。
850デフォルトの名無しさん:2011/02/13(日) 23:44:10
最近学校の授業でC++を学んでいて、参照・ポインタのあたりを勉強しています。
&記号についての質問なのですが、
int& a と int &a は異なるのでしょうか?
前者が参照を表すということは理解できます。

与えられたサンプルプログラムで、
メンバ関数の宣言では、引数にint& aと書いてあり、
メンバ関数の定義では仮引数にint &aと書かれています。
違いがいまいち理解できません。どなたかご教授お願いします。
851デフォルトの名無しさん:2011/02/13(日) 23:45:18
どっちも一緒
見た目が違うだけ
852850:2011/02/13(日) 23:51:26
>>851
そうなんですか。どうもありがとうございます。
参照を宣言するときは型宣言の直後に&を置く、と習っていました。
一緒ならどうしてこういう教え方をするんでしょうね・・・。
853 ◆QZaw55cn4c :2011/02/14(月) 00:06:11
>>852
C では int *a, C++ では int* a; と書くのが昔からのお作法でした。(C には参照渡しはありませんが。)
854デフォルトの名無しさん:2011/02/14(月) 01:55:15
>1
855デフォルトの名無しさん:2011/02/14(月) 02:58:27
int* a,b; って書くと間違うからね。
856デフォルトの名無しさん:2011/02/14(月) 03:03:04
>>855
C++のハゲ親父は罪作り

int& a,b;
とかどうすんだよって感じ

>>852
>一緒ならどうしてこういう教え方をするんでしょうね・・・。

素人を混乱に陥れてプログラマの仕事を確保するためらしいよ
857デフォルトの名無しさん:2011/02/14(月) 04:17:43
C++は設計コンセプトとして 出来るだけCとの互換性を保持しなければならないからね…
あとFAQ
``int* p;''と``int *p;''はどちらが正しいですか
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace
858デフォルトの名無しさん:2011/02/14(月) 05:37:57
益々判らなくなりました><
859デフォルトの名無しさん:2011/02/14(月) 09:23:50
小規模なプログラムなのでwin32apiをmfcなどを使わず直で記述してるのですが
メッセージハンドルのswitch部分がどうしても汚くなってしまいます

上手く記述する方法はないでしょうか?
860デフォルトの名無しさん:2011/02/14(月) 09:26:48
WTLを参考にすればいいんじゃないかな
ttp://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/message05/index.html
861デフォルトの名無しさん:2011/02/14(月) 09:36:26
>>859
各Handler関数のhash(キーはメッセージID等)を作ってテーブルジャンプにすれば良い
862デフォルトの名無しさん:2011/02/14(月) 11:02:56
VC++ には int32_t は無いのでしょうか?
無いとしたら代わりのものは何でしょうか?
863デフォルトの名無しさん:2011/02/14(月) 11:04:38
>>860
マクロつかってメッセージごとに処理を関数へ渡してるかんじですかね・・・

>>861
ハッシュテーブルを使ったことがないのでまともな実装が出来るか不安ですが
(HWND,LPARAM)を引数に持つ関数のポインタの配列、を要素に持つ配列
にハッシュ関数をつかって配列に処理を割り振って行けばいいのでしょうか?

STLが使えれば楽なのでしょうが自分の環境だとhash_mapが使えないみたいです・・・
864デフォルトの名無しさん:2011/02/14(月) 11:09:15
>>859
ハッシュを使わなくてもメッセージIDと関数ポインタのテーブルを作ればいいんじゃね?
例えばこんな感じ。
--
typedef enum {MessageFoo, MessageBar} MessageID;
typedef void MessageFunc(MessageID id);
static void funcFoo(MessageID id)
{
}
static void funcBar(MessageID id)
{
}

struct {
MessageID id;
MessageFunc * func;
} MessageTable[] = {
{MessageFoo, funcFoo},
{MessageBar, funcBar},
};

void funcCaller(MessageID id)
{
for (int ic = 0; ic < sizeof(MessageTable) / sizeof(* MessageTable); ++ic) {
if (id == MessageTable[ic].id) MessageTable[ic].func(id);
}
}
--
勿論、メッセージIDの型や数値、引き数なんかは調整してね
865デフォルトの名無しさん:2011/02/14(月) 11:21:22
線形検索ですね
866デフォルトの名無しさん:2011/02/14(月) 11:38:56
STLつかえるなら
typedef void Func(HWND,LPARAM);
std::map<UINT,*Func>
をラップするclassつくればいいんじゃない?というのは浅はか?
867デフォルトの名無しさん:2011/02/14(月) 12:03:49
>>862
あるよ。
VS2010 からだけど。
868デフォルトの名無しさん:2011/02/14(月) 17:12:48
#if _MSC_VER < 1600
// 1200 VC6.0
// 1300 VC7.0 VC2003
// 1310 VC7.1 VC2003
// 1400 VC8.0 VC2005
// 1500 VC9.0 VC2008
// 1600 VC10.0 VC2010
typedef unsigned int uint32_t;
#endif

こうですか?
869デフォルトの名無しさん:2011/02/15(火) 05:34:33
インデントやら処理メッセージの一覧性だけならgoto使ったり
#define CASEGOTO(a) case a:goto LABEL_##a;break;
callback(MSG m){
switch(m){
CASEGOTO(WM_PAINT)
CASEGOTO(WM_XX)
default: value=DefWndPorc();
}
LABEL_QUIT: return value;
LABEL_WM_PAINT:
....;goto LABEL_QUIT;
LABEL_WM_XX:
....;goto LABEL_QUIT; }
870デフォルトの名無しさん:2011/02/15(火) 06:06:31
871デフォルトの名無しさん:2011/02/15(火) 10:17:46
>>869
きもっ!!
872デフォルトの名無しさん:2011/02/15(火) 11:03:47
windowsSDKで
もともとMainWndProc()とそのメッセージを処理するOn〜()が有って
ダイアログを追加するときにAddDlgProc()のメッセージを処理するOn〜()と関数名が被ってしまう場合

・関数名を工夫する
・namespaceを利用する
・ソースファイルの分割

どの対応が無難でしょうか?
873デフォルトの名無しさん:2011/02/15(火) 11:28:36
関数名を工夫する
874デフォルトの名無しさん:2011/02/15(火) 11:31:37
ソースファイルの分割
875デフォルトの名無しさん:2011/02/16(水) 00:14:04
電卓作成が難しいでござる

32桁の電卓って・・
876デフォルトの名無しさん:2011/02/16(水) 00:19:27
gmpでおk
877デフォルトの名無しさん:2011/02/16(水) 04:03:29
BCGライブラリを自分で実装汁のが面倒って意味では
878デフォルトの名無しさん:2011/02/16(水) 04:08:05
RDBMS に丸投げでオケ
879デフォルトの名無しさん:2011/02/16(水) 04:23:35
どのDBだとその桁いけるの
880デフォルトの名無しさん:2011/02/16(水) 04:34:56
えっと、Decimal の話で良いんだよね?
手軽な所で MySQL は 65 桁まで行けるらしいよ

http://dev.mysql.com/doc/refman/5.1/ja/precision-math-decimal-changes.html
881デフォルトの名無しさん:2011/02/16(水) 13:12:05
MySQLってそんなところに特長があったなんて
882デフォルトの名無しさん:2011/02/16(水) 13:48:08
そんな機能があったとはな
883デフォルトの名無しさん:2011/02/16(水) 14:21:39
mysql> delimiter //
mysql> select 65536 * 65536 * 65536 * 65535//
| 65536 * 65536 * 65536 * 65535 |
+-------------------------------+
| -281474976710656 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select 65536 * 65536 * 65536 * 65536//
| 65536 * 65536 * 65536 * 65536 |
+-------------------------------+
| 0 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> create procedure testproc()
 begin
  declare d decimal(64, 0) default 0;
  declare m decimal(64, 0) default 0;
  set d = 65536 * 65536;
  set m = 65536 * 65536;
  set d = d * m;
  select d;
 end//
Query OK, 0 rows affected (0.00 sec)
mysql> call testproc()//
| d |
+----------------------+
| 18446744073709551616 |
+----------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> drop procedure testproc//
Query OK, 0 rows affected (0.00 sec)
884デフォルトの名無しさん:2011/02/16(水) 15:44:12
手軽じゃないRDBMSだと何が使えるんだろ。
>>878見ると全部いけそうに見えるけど。
885デフォルトの名無しさん:2011/02/16(水) 22:35:20
多倍長演算ってそんなに難しくないだろ。
電卓で使うようなのなら、遅くても平気だろうし。
886デフォルトの名無しさん:2011/02/18(金) 00:46:24
>>863
どう言うふうにしたいのか分らんけど、ちびっとでも見やすくしたいなら
MS提供のメッセージクラッカー
887デフォルトの名無しさん:2011/02/18(金) 01:07:06
>>863
つboost
888デフォルトの名無しさん:2011/02/18(金) 04:29:53
hash_mapがなくてもmapでいいんじゃないのと思ったんだが
889デフォルトの名無しさん:2011/02/18(金) 15:44:34
ハッシュなんて必要か?
ただの関数ポインタ配列が有れば良いと思うんだけど
890デフォルトの名無しさん:2011/02/18(金) 16:24:13
探索に線形時間かかっちゃうだろ^^
効率は大事だよー。
891デフォルトの名無しさん:2011/02/18(金) 17:30:17
効率が重視で且つswitchブロックにベタ書きが嫌ならgoto一択だべw
892デフォルトの名無しさん:2011/02/18(金) 17:59:51
お前は何を言っているんだ
893デフォルトの名無しさん:2011/02/18(金) 18:35:07
Hashにすると線形探索より速くなるし
なによりテーブルジャンプになるので
CPUパイプラインにも有効なんだな
894デフォルトの名無しさん:2011/02/18(金) 19:33:01
う 難しくてわからん
895デフォルトの名無しさん:2011/02/18(金) 19:46:47
>>894 俺もだ
自分凄いんだぜって自慢していることは分った
896デフォルトの名無しさん:2011/02/18(金) 20:51:41
速い遅いと言ったって、巨大なテーブルでもなければ誤差だよ
897デフォルトの名無しさん:2011/02/18(金) 21:17:37
>>890
いや線形探索なんかしない、単に大きい配列を用意するだけ
ウィンドウメッセージなんてそんなに離散してるわけじゃないからメッセージIDから規定値を減じたものを配列インデックスにすれば良い
処理しないメッセージID用に何もしないハンドラを用意するか関数ポインタをNULLにしておいて条件分岐するだけで良い

まぁメッセージIDから規定値を減ずるってのもハッシュの一種かも知れんけどね
898デフォルトの名無しさん:2011/02/18(金) 21:26:50
0〜0x3fff システム用
0x4000(WM_USER)〜0x7fff コントロールのウィンドウクラス用
0x8000(WM_APP)〜0xBFFF アプリ用
0xC000〜0xFFFF RegisterWindowMessage用

だっけか
まあ実際には自分で処理するハンドラの分だけでいいから
こんなに要らないわな
899デフォルトの名無しさん:2011/02/18(金) 22:33:03
その配列の型が固定できないからこそのメッセージクラッカーなんじゃないのか
900デフォルトの名無しさん:2011/02/18(金) 22:38:40
線形時間が……とかいったいいくつのメッセージを処理するつもりなんだよ
901デフォルトの名無しさん:2011/02/18(金) 22:58:53
>>899
型は普通のWindowProcでしょ?
LRESULT (*msg_table[0x10000])(HWND,UINT,WPARAM,LPARAM);
とかの関数ポインタのテーブルを用意して
if(msg_table[msg])return msg_table[msg](wnd,msg,wp,lp);
で呼び出すだけじゃない?
俺は赤黒木やハッシュで十分だと思うからわざわざやらないけどw
902デフォルトの名無しさん:2011/02/18(金) 23:04:23
>>901
windowsx.hやMFC/WTLのメッセージクラッカーは、ハンドラの引数がメッセージによって
違うでしょ、そのことを言ってるんじゃないの

まあ、全部一緒のほうがある意味分かりやすいし、実装も単純になるが
903デフォルトの名無しさん:2011/02/18(金) 23:05:38
>>899
>その配列の型が固定できない
色々型を入れられる配列コンテナを実現するのがプログラマ
誰かが作った便利なのを利用する(メッセージクラッカーとか)だけのがドカタ

>>900
基本的に全部のメッセージ処理できるようじゃないとな
これやあれは処理できませんじゃ><
904デフォルトの名無しさん:2011/02/18(金) 23:12:37
>>903
色々なものを入れるだけなら困らんだろ、所詮ただのポインタだし
呼ぶときに困るんでしょ?
引数の個数や型がまちまちなんだから
905デフォルトの名無しさん:2011/02/18(金) 23:28:39
>>902
hoge msg_xxx_sub(x,y,z){
}
LRESULT msg_xxx(wnd,msg,wp,lp){
msg_xxx_sub(...);
}
msg_table[xxx] = msg_xxx;
とかにするだけじゃないの?
で、これを扱いやすいよう整えていくと
既存のフレームワークの車輪になるから
わざわざ自作する必要ないのだが。
906デフォルトの名無しさん:2011/02/18(金) 23:29:35
>>904
>引数の個数や型がまちまちなんだから
それを呼ぶときに困るないようにするのがプログラマ

自分のやりたいことを実現するのがプログラマ
あーだこーだと言って実現できないっていうのがドカタ
俺、ドカタだからドカタtraitsはよく分る
907デフォルトの名無しさん:2011/02/18(金) 23:48:16
>>905
それはmsg_xxx -> msg_xxx_dubを「自分で」書かせる時点で
既存のメッセージクラッカーより劣る
で、それを整えたものがメッセージクラッカーで、勿論車輪の再発明で、
最初からやるだけ無駄
908デフォルトの名無しさん:2011/02/18(金) 23:51:38
>>907
> これを扱いやすいよう整えていくと
> 既存のフレームワークの車輪になるから
> わざわざ自作する必要ないのだが。

眼科池よ
909デフォルトの名無しさん:2011/02/19(土) 00:01:32
車輪の再発明っていうけど今の流れでみんなが考えてるのってhash使って
実行時にダイナミックにハンドラの追加削除が出来る新しいタイプの車輪だろ
910897:2011/02/19(土) 00:11:19
>>900 が一番適切だな
恥ずかしいから発言は無かった事にしてくれ
911デフォルトの名無しさん:2011/02/19(土) 00:14:38
>>909
ついや線形探索なんかしない、単に大きい配列を用意するだけ

配列とハッシュは別物だぞ
2行目に至ってはメリットが分からない
大丈夫?
912デフォルトの名無しさん:2011/02/19(土) 00:19:02
実行中にPOPUP作って
メニューが色々変わったりするのあるじゃん
913デフォルトの名無しさん:2011/02/19(土) 00:19:58
配列を関数の返却値の型にできます
int func()[1];

関数ポインタも返却値の型にできます
typedef int (*RET)();
RET func();

でも関数ポインタの配列を返却値の型にしようとするとエラーが起きます
なぜなんでしょ?_?

typedef int (*RET)();
RET func()[1]; // NG
914デフォルトの名無しさん:2011/02/19(土) 00:21:39
int *(*func[])();
915デフォルトの名無しさん:2011/02/19(土) 00:24:17
typedef int (*RET)();
RET func[1];
916デフォルトの名無しさん:2011/02/19(土) 00:24:36
>>911
?????顔のAAを誰か張ってやってくれ
917デフォルトの名無しさん:2011/02/19(土) 00:24:36
>>914
それは関数じゃなくて配列ですし…
918デフォルトの名無しさん:2011/02/19(土) 00:25:26
>>915
それも関数じゃなくて配列…
919デフォルトの名無しさん:2011/02/19(土) 00:27:02
>>912
動的生成するメニューを差し替えるだけじゃん
デザインパターンの入門書でも読みなさい
920デフォルトの名無しさん:2011/02/19(土) 00:36:42
>>913
配列を戻り値で返すなんてどうやるんだよ
921デフォルトの名無しさん:2011/02/19(土) 00:38:14
それはCの構文が悪いんだよな
関数の引数にしてもそうだけどさ
実際には配列はファーストクラスオブジェクトではなくて
関数に渡したり戻り値として返したりできないのに
構文上はそのように見える書き方もできるから……
922デフォルトの名無しさん:2011/02/19(土) 00:39:23
>>920
「どうやるか」は問題ではないんです。規格として許されるのかどうかって話なので…。

なんでこんな質問をするかというと、トレイツテンプレートクラスにおいて
関数型の判別にそのような宣言へのマッチングを利用するからです。
具体的にはメンバ関数テンプレートにおいて以下のようにします。
template < typename T > static char test( ... ); // すべてにマッチ
template < typename T > static int test( T (*)[1] ); // void, 参照, 関数以外にマッチ

boostでこんな感じにやってるんですが、どうしてうまく動くのかしら、と
923デフォルトの名無しさん:2011/02/19(土) 02:17:40
>>922
sizeof
924デフォルトの名無しさん:2011/02/19(土) 03:25:57
>>906
やりたいことがすでに提供されているにもかかわらず、無駄の多いオレオレ実装をするのもドカタ。

>>908
じゃあなんでメッセージクラッカーの話に対して訳わからん自前処理書いたの?
925922:2011/02/20(日) 13:29:28.11
わたしの勘違いでした。おちんちんしゃぶってもいいです
926デフォルトの名無しさん:2011/02/20(日) 15:58:38.95
しゃぶりに行く服がない
927デフォルトの名無しさん:2011/02/20(日) 18:41:49.54
hash の実装とメッセージハンドラが完成した
あとでうpする予定
928デフォルトの名無しさん:2011/02/20(日) 22:33:00.88
いらな〜い
929デフォルトの名無しさん:2011/02/21(月) 13:14:19.06
hashってな〜に
930デフォルトの名無しさん:2011/02/21(月) 15:12:45.13
WTLでいいじゃん
何で再発明しようとすんの?
931デフォルトの名無しさん:2011/02/21(月) 22:06:33.72
>>927
クレクレ
932デフォルトの名無しさん:2011/02/21(月) 22:19:42.57
タコラ
933デフォルトの名無しさん:2011/02/21(月) 22:53:43.03
「パラ任意抽出のハッシュ関数+最終的な分岐処理」が線形探索よりも高効率なら
それだけでアルゴリズム特許獲れるよw
無駄に公開すんじゃねぇ
934デフォルトの名無しさん:2011/02/22(火) 00:34:30.14
よし。特許をとったら公開してくれ。
935デフォルトの名無しさん:2011/02/22(火) 00:44:06.65
アルゴリズムって、特許取れたっけ?
936デフォルトの名無しさん:2011/02/22(火) 01:04:48.91
難しいアルゴリズムだったら特許取れる

簡単なのは、ムリ
937デフォルトの名無しさん:2011/02/22(火) 10:19:25.77
公開してくれって言わんでも特許になったら自動的に公開されるんじゃない
938デフォルトの名無しさん:2011/02/22(火) 15:41:04.35
画像処理関係(含むシェーダー)はアルゴリズムだけで特許とられてたりするが…

非商用ならOKというライセンスを設けてることが多いね
939デフォルトの名無しさん:2011/02/22(火) 21:13:40.53
特許法で色々決まってた気がするけど忘れたw
940デフォルトの名無しさん:2011/02/22(火) 23:56:48.04
昔、圧縮のアルゴリズムの特許が話題になったときにCマガジンで記事に
なってたけど、ランレングス圧縮にちょっと改良を加えただけみたいな
アルゴリズムでも特許になってたりするとかかかれてたな。
941デフォルトの名無しさん:2011/02/23(水) 00:06:57.89
厳密に審査されないこともおおいからねぇ。
ある業界だけど、2つの円の大きさの差を求めるのに、
「直径同士を引き算する」特許が取られている。
一方ロシアは「半径同士を引き算してから2倍した」的な特許もある。
942デフォルトの名無しさん:2011/02/23(水) 00:57:01.20
因みに低レベルなものは実用新案
特許にはならない
943デフォルトの名無しさん:2011/02/23(水) 16:45:38.82
特許庁は内容の審査なんてしない。基本、書式に不備がなければ登録される。
既知のものかとかの調査を申請全部にするなら今の数万倍の予算がいる。
制度の設計自体が、争いになってから無効審判請求とかで解決しろってなスタンス。
944デフォルトの名無しさん:2011/02/23(水) 17:00:48.73
map<K,V>::value_type型(pair<const K, V>)って、
代入演算はできないものなんでしょうか?
コンパイルエラーになるんです。 http://ideone.com/qaGs6
どうしてこうなのか、また解決策をご存知の方
いらっしゃいましたら教えていただけませんか?
945デフォルトの名無しさん:2011/02/23(水) 17:23:11.36
const K型に代入ができるわけ無いだろ
946デフォルトの名無しさん:2011/02/23(水) 17:45:55.47
int main()
{
std::map<std::string, int> hogeMap;
hogeMap["abc"] = 1;
std::map<std::string, int> hoge;
hoge[(*hogeMap.begin()).first] = (*hogeMap.begin()).second;
std::cout << (*hogeMap.begin()).first << std::endl;
}

std::mapの一番目の要素はconst
947デフォルトの名無しさん:2011/02/23(水) 18:01:41.04
ああ・・どうもありがとうございます。
そうですね、constですから、考え直してみたら
代入出来ないのは当たり前でした。すみません。
ちょっと質問を変えます。
このmap::value_typeのキー部分が
constになっていない型が欲しいのですが、
mapのテンプレート引数を同じようにタイプして
型を作るよりもスマートなやり方というのはないでしょうか?
948デフォルトの名無しさん:2011/02/23(水) 18:29:48.47
>>947
std::mapの仕組みについて再考察した方がよい
firstがconstでないと、キーを変える度にツリーを再構築しなければいけない
これは無視できるコストではないのでconstにしたのだと思う
949デフォルトの名無しさん:2011/02/23(水) 18:41:46.49
要素の削除→挿入で同等のことが発生すると思うけれど
950デフォルトの名無しさん:2011/02/23(水) 23:48:25.64
おまえらがプログラマなら特許10件以上は取得しているだろ
それ未満はドカタ
951デフォルトの名無しさん:2011/02/24(木) 00:01:24.81
>>949
それを巨大なmapで何回もやってごらん
ものすごい時間が掛かるから
だからメンバ関数に入れなかったのだろう
自分の責任においてやる分には一向に構わないわけで
952デフォルトの名無しさん:2011/02/24(木) 00:35:18.64
C++なのに、後で使うローカル変数をあえて関数の最初で宣言するのは
VSのデバッグ機能などに寄与するとかあるんでしょうか?
自分はC++覚えたてのときから変数は必要になってから宣言即初期化してたんですが…
953デフォルトの名無しさん:2011/02/24(木) 00:48:34.18
>>952
ないよ。ただの悪習でしかないから、宣言即初期化(そして const )を貫くがいい。
954デフォルトの名無しさん:2011/02/24(木) 01:21:00.51
>>953
ありがとうございます。貫きます。
955デフォルトの名無しさん:2011/02/24(木) 02:01:16.62
>>951
insertとかeraseは使えないのだろうか。
956デフォルトの名無しさん:2011/02/24(木) 02:06:11.69
>>955 なんで使えないと思ったの?
957デフォルトの名無しさん:2011/02/24(木) 02:10:18.88
メンバ関数にないって書いてるから。
958デフォルトの名無しさん:2011/02/24(木) 02:19:05.21
>>957
日本語不自由なやつだな。
「削除→挿入によってキーへの代入と同等のことをする操作は巨大なmapで何回もやると
 ものすごい時間が掛かるから、メンバ関数には入れなかったのだろう」
ということ。
959デフォルトの名無しさん:2011/02/24(木) 02:27:31.89
なんでキーを変更するようなメンバ関数の有無の話になってんだ?
誰かほしがってたのかな。
960デフォルトの名無しさん:2011/02/24(木) 02:35:06.91
>>944がそういうoperator=()を望んでる
961デフォルトの名無しさん:2011/02/24(木) 02:37:59.82
そうは見えないが、日本語不自由だから本当はそれをほしがってることに気づけてないのか
962デフォルトの名無しさん:2011/02/24(木) 04:54:04.78
頭も不自由のようだな
963デフォルトの名無しさん:2011/02/24(木) 07:13:23.63
pair<string, int>を使えとかそういう話じゃないの?
964デフォルトの名無しさん:2011/02/24(木) 07:31:00.16
>>960
かっこいいな。
965デフォルトの名無しさん:2011/02/24(木) 13:29:26.83
だからoperator=の事とちゃうんか?
operator[]と組み合わせて使うとまた別の意味になるけど

hogeMap["abc"] = 1; とか

次のようにするとキーはそのままで値のみが置き換わるのがわかる
std::multimapはまた別の動作をする
(しかしラムダ式使いてーなー)
template <class U, class V>
void print(std::pair<U, V> p)
{
std::cout << '[' << p.first << "] = " << p.second << std::endl;
}

int main()
{
std::map<std::string, int> hogeMap;
hogeMap["abc"] = 1;
std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>);
hogeMap["abc"] = 2;
std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>);
}
966デフォルトの名無しさん:2011/02/24(木) 16:33:31.65
for_eachの練習ならよそでやってくれ
967デフォルトの名無しさん:2011/02/27(日) 08:17:44.82
うめ
968デフォルトの名無しさん:2011/03/01(火) 02:00:25.02
Eclipse CDTでやってるんだけど
Shared Libraryとして作ったプロジェクトのソースにmain()って書けないの?
デバッグはどうやれば?

つまり
-shared
オプションがつけられた場合に
リンカはmain()が含められたオブジェクトファイルをリンクしてくれるのかどうか
ということかな
969デフォルトの名無しさん:2011/03/02(水) 06:56:53.41
Javaみたいにパッケージ内で1つの名前空間を使う方法ってありますか?
いちいちnamespace{}で囲わないといけないんでしょうか
970デフォルトの名無しさん:2011/03/02(水) 13:02:38.51
using namespace
971デフォルトの名無しさん:2011/03/03(木) 20:21:15.68
アドレスってどの型に入れればよいですか?
windowsならLONG_PTR?
972デフォルトの名無しさん:2011/03/03(木) 20:23:40.74
void*
973デフォルトの名無しさん:2011/03/03(木) 20:24:58.33
>>972
値が欲しいんです
974デフォルトの名無しさん:2011/03/03(木) 20:50:10.53
ポインタ型
975デフォルトの名無しさん:2011/03/03(木) 21:42:31.72
>>971
情弱乙
976デフォルトの名無しさん:2011/03/03(木) 23:17:58.81
ヘッダーファイルだけで構成されたライブラリが流行っていますよね。
こういうライブラリで静的な変数をうまく初期化する方法はあるでしょうか?

すぐに考え付く方法として、関数のスコープで静的な局所変数を宣言し関数の戻り値として利用する方法です。
int const * getData()
{
  static int const data[] = { 1, 2, 3, 4, 5 };
  return data;
}
この方法は、現行のC++ではスレッドを利用した時に破綻します。(C++0xでは保障されるようです。)

しかし、ヘッダー内で普通に大域変数として初期化すると、DLLとDLLを利用するプログラムの両方に
実体が出来るため、リンクに失敗します。

こういう場合、一体どうすればいいのでしょう?
977デフォルトの名無しさん:2011/03/03(木) 23:25:16.45
普通にconst int ARRAY[] = {1,2,3,4,5};ではだめなん?
978デフォルトの名無しさん:2011/03/03(木) 23:25:52.83
VC限定だが__declspec(selectany)
979デフォルトの名無しさん:2011/03/03(木) 23:31:03.54
プロセス内に唯一つの大きなテーブルが欲しい。
これは読みだすだけで初期化以外に書き込みは発生しません。
具体的には、構文解析用のAction、Goto、SemanticActionの各テーブルです。
パーサーのインスタンスごとにメモリーを確保、初期化しても最近のコンピューターであれば問題
ないかもしれませんが、できれば無駄をなくしたいと思った次第。
よろしくお願いします。
980デフォルトの名無しさん:2011/03/03(木) 23:45:34.43
new deleteかmalloc free で確保すればいいと思うが、何が疑問なんだ?
981デフォルトの名無しさん:2011/03/03(木) 23:48:45.68
モリマップドファイルとかDB使うとか?
982デフォルトの名無しさん:2011/03/03(木) 23:48:47.83
>>980

>>978の汎用的な方法という意味。
983デフォルトの名無しさん:2011/03/03(木) 23:49:12.56
メモリマップドファイル^^
984デフォルトの名無しさん:2011/03/03(木) 23:56:35.19
>>976
Singleton使ったらうまく行かない?
985デフォルトの名無しさん:2011/03/03(木) 23:58:48.19
>>984
うまくいくけど、クリティカルセクションが必要になってスマートじゃない予感がする。
986デフォルトの名無しさん:2011/03/04(金) 00:30:39.63
文字列化
const char *table = "\x00\x01\x02........";
987デフォルトの名無しさん:2011/03/04(金) 00:40:52.35
ごくありふれた問題ですぐに回答がつくかと思ったらそうでもないのか。
C++0x待つか。
初期化タイミングが保障されるらしいし。
988デフォルトの名無しさん:2011/03/04(金) 01:00:07.29
組み込み型定数なら初期化タイミングなんて気にしなくてよくね?そういう話じゃないの?
989デフォルトの名無しさん:2011/03/04(金) 02:08:05.45
>>985
スマートである必要はないだろ
動けば今はいいんだろ?
規格で保証されてない動作をあれこれ考えるより余程いい
990デフォルトの名無しさん:2011/03/04(金) 03:06:41.08
MinGWで開発中の者です。
struct Info{
int num1;
int num2;
std::string str1;
};
int Delete(struct Info *pinfo,std::list<struct Info>& list){
for(std::list<struct Info>::iterator itr=list.begin();itr!=list.end();itr++){
if(pInfo==(*itr)){//ここで「no match for 'operator==' in 'pinfo == itr'」
//削除処理
}
}
}
int main(){
std::list<struct Info> list1;
struct Info info;
//要素追加処理。
struct Info del;
del={2,3,"foo"};
Delete(&del,list1);
return 0;
}
となってしまいます。
どのようにすれば良いのでしょうか。
991デフォルトの名無しさん:2011/03/04(金) 03:15:55.96
>>990
型が合ってないのが悪いんだから、
if(pInfo==&(*itr))
でいいんじゃね?
992デフォルトの名無しさん:2011/03/04(金) 03:29:53.87

次スレお願いします
993デフォルトの名無しさん:2011/03/04(金) 08:42:53.57
>>990
struct Info の operator == を自前定義したうえで *pInfo == *itr
994デフォルトの名無しさん:2011/03/04(金) 15:02:30.56

次スレ案内

【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

うめ
995デフォルトの名無しさん:2011/03/04(金) 16:45:51.27
char *abc[][3] = {
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
};
で初期化出来ますが、
*abc[][3] の配列(というか *abc[][3] を指すポインタ)は、
char **xyz[][3] = {abc, def, ...};
じゃ代入出来ないんですけど、
どう書いたら良いでしょうか?
996デフォルトの名無しさん:2011/03/04(金) 16:50:14.64
char *(*xyz[])[3] = {abc, def, ...};
997デフォルトの名無しさん:2011/03/04(金) 16:53:54.98
ややこしく書かずに
typedef const char* type[4][3];
type* p = &abc;
とでも書いたらどうだろう
998デフォルトの名無しさん:2011/03/04(金) 16:56:10.84
>>996
出来ました!!
ありがとうございました!!!
999デフォルトの名無しさん:2011/03/04(金) 17:02:16.96
質問いいですか?
1000デフォルトの名無しさん:2011/03/04(金) 17:02:58.99
>>1000ならおk
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。