【初心者歓迎】C/C++室 Ver.74【環境依存OK】 at TECH
【初心者歓迎】C/C++室 Ver.74【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
10/11/09 17:42:35
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
スレリンク(tech板)
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
スレリンク(tech板)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か  に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(codepad.org) (コンパイルもできるし出力結果も得られる[]privateをチェック)
URLリンク(ideone.com) (時間帯によってはcodepadが重い事があるのでここも利用)

2:デフォルトの名無しさん
10/11/09 18:27:54
URLリンク(d.hatena.ne.jp)のプログラムを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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/09 19:07:23
よう無能ども。w

5:2
10/11/09 22:40:12
上記に#include <sstream>加えてwifstream→ifstreamで何の問題も無く実行出来ました。
スレ汚し失礼しました。

6:デフォルトの名無しさん
10/11/10 07:41:44
詳しくは知らないのですが、xpだとC++で.NET使わない方法でプログラミングしたソフトは処理が高速なんですよね?
win7の場合もやっぱりC++で.NET使わないほうが高速なのですか?
それとも、.NET使った場合とあまり処理速度は変わりませんか?

7:デフォルトの名無しさん
10/11/10 09:21:39
最近は.NETの方が高速だよ

8:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/10 09:56:50
きもいです^^

10:デフォルトの名無しさん
10/11/11 10:16:09
test kakiko.

11:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/11 22:13:28
すみません
ageてしまいましたorz

13:デフォルトの名無しさん
10/11/11 22:36:22
double (*)(int) から int (*)(int) のキャストって
どのように定義されてるのでしょうか

14:デフォルトの名無しさん
10/11/11 23:26:34
>>11
ユニバーサルキャラクタ名
URLリンク(seclan.dll.jp)

この絡みかな知らんけどw

15:デフォルトの名無しさん
10/11/12 01:10:48
iostream に Unicode は鬼門。

16:デフォルトの名無しさん
10/11/12 02:00:21
Windows.hをインクルードしてるのですが、
これによって使えるPOINT構造体は
int func(POINT pt);

func(POINT(0, 0));のように使えないのでしょうか?

17:デフォルトの名無しさん
10/11/12 02:18:15
windows.hはCでも使えるように、C++固有の機能を使わないで作られてる
そしてPOINT(0,0)のようなコンストラクタ構文は、C++固有の機能だ

18:デフォルトの名無しさん
10/11/12 02:27:40
C++やってるのかお前ら
かっこいいな
俺もやりたいけど難しすぎるよ
ランタイムなしで高速に起動するアプリ
かっこよすぎる
おれには無理だが
おまえらがんばってくれ
グフッ・・・・

19:デフォルトの名無しさん
10/11/12 02:44:49
>>18
早まるな。たいていのお客さんは起動の速さより納期の短さを優先する。

20:デフォルトの名無しさん
10/11/12 11:12:37
>>11
cygwinだと問題ないんだがなぁ。尤も、localeは"C"で試したけど。
vc固有の問題っぽいから回答つかないようならvcスレで聞きなおしてみたら?

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

>>16
MFCならCPointがPOINTをラップしてたと思うけど、それを使えないなら自作するしか。

21:デフォルトの名無しさん
10/11/12 13:45:23
s-jisコードをユニコードに変換する方法教えてください。

22:デフォルトの名無しさん
10/11/12 13:50:23
>>21
libiconvかなにか、適当なライブラリを使う。

23:デフォルトの名無しさん
10/11/12 15:25:12
ライブラリーですか・・・・
できれば手動で変換したいのですが
やり方とかしりませんか?

24:デフォルトの名無しさん
10/11/12 16:06:15
手動でやりたいとか正気か?
あんたが思っている以上にめんどくさいぞ
おとなしくライブラリ使っとけ

25:デフォルトの名無しさん
10/11/12 16:58:04
>>24
一度Wikipediaで漢字コード表を見比べてみるといい。
URLリンク(ja.wikipedia.org)
unicodeは例えばここの4e00から見て判るように、部首画数順に並んでいる。
一方SJISはJISc6226がベースになっているのであいうえお順に並んでいる。
とてもじゃないが、手作業でできるようなものじゃない。

26:デフォルトの名無しさん
10/11/12 17:16:32
ライブラリ作った人は手作業でやったの?

27:デフォルトの名無しさん
10/11/12 17:43:16
少なくとも最初の一回はコード表を睨めっこしたんじゃない?
コード表をOCRしたかもしらんが。

28:デフォルトの名無しさん
10/11/12 18:25:15
fURLリンク(ftp.unicode.org)
これとかを取り込めばとりあえずは変換できるんじゃないかな

29:デフォルトの名無しさん
10/11/12 18:50:14
単純に一対一で変換すればいいってもんでもないからな。
というか、どうして自前での変換にこだわるのかわからん。
>>21 の環境がなんなのかわからないけど、Windows環境ならAPI関数ひとつ
呼ぶだけだぞ。

30:デフォルトの名無しさん
10/11/12 20:45:59
VC++2008EEを使っています

struct A
{
int a;
float b;
};

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

int型のポインタに構造体のアドレスを入れ、ポインタからbに少数を代入しようとすると
'float' から 'int' への変換です。データが失われる可能性があります。
という警告が出て、bの値がが整数に直されます
float型のポインタに構造体のアドレスを入れようとすると今度はまた別なエラーが出ます
どうすればいいのでしょうか?

31:デフォルトの名無しさん
10/11/12 20:51:05
なぜA型のポインタを使わない

32:デフォルトの名無しさん
10/11/12 21:04:16
基礎の基礎でしたね・・・
すいません。最初のほうから勉強しなおします

33:デフォルトの名無しさん
10/11/12 22:56:15
>> 20
std::locale("C")で解決でした。
実際には日本語を利用したいのでlocaleはC->japaneseにする必要があるのですが
日本語文字列を出力する場合は"C"だと日本語出ず、
日本語出したくて"japanese"だと"\u00a0"以降文字列出ずorz

SDKでwindow作ってそっちに出してみます。
レスくれた方、thx


34:デフォルトの名無しさん
10/11/15 03:08:01
ここで質問していいものか分かりませんがC++で書いてるのでここで
Win32API/GDI+の質問です

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

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

どうすれば解決するでしょうか

35:デフォルトの名無しさん
10/11/15 04:21:16
よくあるパターンだね

36:デフォルトの名無しさん
10/11/15 04:53:34
ヒープの管理ブロックを壊してる可能性が大。
もちろん、壊している場所は、deleteを呼んでいる場所ではない。

37:デフォルトの名無しさん
10/11/15 04:59:28
単純にファイル開きっぱなしなのでは

38:34
10/11/15 15:32:22
>>36
エラーメッセージはその通りでヒープが壊れてると言われます

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

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

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


newで確保しなければ問題は一応回避できるのですが
やはり解決策を知っておかないと後々苦労しそうなので是非おねがいします

39:デフォルトの名無しさん
10/11/15 15:40:02
new で得たアドレスが実はNULLとか。
またはImageのGetLastStatus()で0以外(エラー)が入っていないかどうか。

40:34
10/11/15 15:53:16
>>39
ウォッチしてみてもアドレスがNULLということは無いみたいです
GetLastStatus()の戻り値もOk(=0)でした
画像描画自体も問題なく行われているのですが・・・
deleteがなぜ上手くいかないのかよく分かりません

41:デフォルトの名無しさん
10/11/15 15:55:11
スマポ使えスマポ

42:デフォルトの名無しさん
10/11/15 16:01:24
うまく動かない最小のコードを出せ

43:デフォルトの名無しさん
10/11/15 16:03:01
それが一番だね。コンパイラのバージョンも提示してくれると判りやすい。

44:34
10/11/15 16:18:11
>>41
スマートポインタですか?
勉強してみます、ありがとうございました

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

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

>>43
コンパイラはVC++2008Express Edition
Version 9.0.30729.1 SP 今年の8月ごろにインストールしたものです。

45:34
10/11/15 18:47:24
皆様お騒がせしました、自己解決しましたので報告します
原因はメモリリークの検出用に記述したデバッグ用定義が原因でした
前提条件の説明不足、大変失礼しました

#if _DEBUG
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

こんな感じの記述をする例のアレ(?)です
GDI+のクラスでnewをオーバーロードする際にこの部分が引っかかるようです

URLリンク(d.hatena.ne.jp)
上記のサイト様の通りに手直ししたところ無事解決しました

質問に答えてくださった方々、ありがとうございました

46:デフォルトの名無しさん
10/11/15 21:00:14
(a<b)?a=1 : b=0;
これって
if (a<b) a=1;
else
b=0;
ってことですよね。
このような式の使い方を説明してるサイトってありますか?

47:デフォルトの名無しさん
10/11/15 21:01:39
すいません自己解決しました。
条件演算子って言うんですね。

48:デフォルトの名無しさん
10/11/15 21:25:29
>>46
いやな使い方だな。

49:デフォルトの名無しさん
10/11/15 22:39:41
>>46
#include <ctype.h>
char c;
printf("%c\n", (isprint(c)) ? c : '.');
というふうに、値を返すときに便利です。
条件演算子をネストに使うと便利さが倍増します。

50:デフォルトの名無しさん
10/11/15 22:50:20
難解さも倍増するけどな

51:デフォルトの名無しさん
10/11/15 23:14:20
そう、Cの世界に関数型言語のような条件式を持ち込めるのです
なんと便利なことか  ああ便利便利

52:デフォルトの名無しさん
10/11/15 23:16:26
条件演算子、目のカタキにするのやめてほしい。

53:デフォルトの名無しさん
10/11/18 01:25:22
ツリービューの項目をドラッグ&ドロップして移動しようと思ってます。
ところがTreeView_CreateDragImageの戻り値がNULLになってしまいます。
原因として考えられることはなんでしょうか。

54:デフォルトの名無しさん
10/11/18 09:24:26
>>53
お使いのGUIライブラリ、フレームワークなどのスレへどうぞ。

55:デフォルトの名無しさん
10/11/18 12:03:48
シリアルポートを利用するとき
ポートが開けない、もしくは通信中タイムアウトになった場合は
引数でエラーを通知するべきか例外を送出するべきでしょうか?

また例外を送出する場合と引数などでエラーを通知する場合の使い分けの指針のような物はあるのでしょうか

56:デフォルトの名無しさん
10/11/18 14:54:27
#define IF
#define THEN ?
#define ELSE :

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

みたいなコードを見たことがあるが、なるほど関数型言語かぶれだったのか

57:デフォルトの名無しさん
10/11/18 15:01:13
俺はそんな表記法の関数型言語は知らん
どことなくFORTHくさい気がしたが・・・微妙に違うなぁ
何の言語だろう
BASICか?

58:デフォルトの名無しさん
10/11/18 20:47:20
一瞬BASICっぽいように見えたけど、BASICにはIF文に戻り値があるなんて発想はないな。
むしろExcelかぶれなのかもしれん。

59:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/18 21:48:07
cond といえば元祖 lisp 様ではないか?

61:よろしくお願いします
10/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:デフォルトの名無しさん
10/11/19 00:50:13
不適切だから捨てろ

63:デフォルトの名無しさん
10/11/19 00:55:45
ではどうすればよいのですか?はなからグローバル変数として定義したほうがいいですかね?

64:53
10/11/19 01:11:38
>>54
Win32APIスレで聞きましたが相手にされませんでした・・・。
もしよければ教えてください。
TreeView_CreateDragImageを使うには何か下準備がいるんでしょうか?

65:デフォルトの名無しさん
10/11/19 01:15:46
URLリンク(support.microsoft.com)
この通りにしてもできないのか?

66:デフォルトの名無しさん
10/11/19 01:21:41
>>61
1翻訳単位内であれば定義順

67:53
10/11/19 01:30:03
>>65
ありがとうございます。結論から言うと出来ました。
まずTreeView_SetImageListでイメージリストを関連付けなくてはならなかったようです。
そちらなども色々と見てましたが書いてなかったもので迂闊でした。
どうもありがとうございました。

68:61
10/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:デフォルトの名無しさん
10/11/19 15:36:59
ホゲとかフガとかキモい

70:デフォルトの名無しさん
10/11/19 15:47:37
>>69
ようハゲ

71:デフォルトの名無しさん
10/11/19 15:57:38
hogeとかfugaとか使いたくなる年頃ってあるよなwww
俺は恥ずかしくて使わないが

72:デフォルトの名無しさん
10/11/19 16:19:18
恥ずかしいっていうか、発想が貧困な子なのかなって思うな

73:デフォルトの名無しさん
10/11/19 20:09:14
AとかBとかってのもひどいな

74:デフォルトの名無しさん
10/11/20 19:30:09
田中太郎
田中花子
田中・・・・・
田中一家で統一してしまえ

75:デフォルトの名無しさん
10/11/20 23:09:51
msg1とかmsg2とか手抜きしたっていいじゃない

76:デフォルトの名無しさん
10/11/21 00:37:04
自分の作った関数を勝手にシリーズ化されると腹が立つよな。

77:デフォルトの名無しさん
10/11/21 06:54:15
String型をconst char*に変換って出来ますか?
PtrToStringCharsとかいうのはあるんですが、
なんかclrがどうとかでて使えません…

78:デフォルトの名無しさん
10/11/21 10:32:51
ググったらこんな回答が・・・

URLリンク(soudan1.biglobe.ne.jp)

79:デフォルトの名無しさん
10/11/21 10:34:23
>>77
そのString型がどこに由来するか、どんなエラーメッセージが出るのか、それによって答えが異なるでしょう。
一般的には、できるはずです。

80:デフォルトの名無しさん
10/11/21 11:20:05
ハッシュ関数作りました。
C言語で書いたのですが、どなたかレビューお願いします。
URL
URLリンク(sky.geocities.jp)

81:デフォルトの名無しさん
10/11/21 11:38:53
C++/CLIでこのスレ汚すのやめてくれない?これC++じゃないから

82:デフォルトの名無しさん
10/11/21 11:49:23
>>80
人に読ませるのならコメントくらいつけて欲しい
あと、コメントアウトしてる部分は削除して

83:デフォルトの名無しさん
10/11/21 14:07:24
>>80
>>82の言うとおり、レビュー以前に書類不備で却下

84:デフォルトの名無しさん
10/11/21 14:17:04
gcc(4.5.1)のc-parser.cだけを利用しようと思っています。
で、VC++でコンパイルしているわけだが(w、
gimple
という構造体を参照していて、この構造体が未定義(インクルードなし)
のためにエラーが出てます。構造体のありかをご存じの人いますか?
一応、gimple.h/cを観てみたが、見つけられなかった。。。

85:デフォルトの名無しさん
10/11/21 14:30:50
>gimpleという構造体を参照していて
gimpleという構造体の宣言の間違いですた。
たとえば、
gimple stmt;
とか。
よろしくお願いします。

86:デフォルトの名無しさん
10/11/21 16:00:11
>>84
スレ違い。gccスレへgo.

GCCについて part9
スレリンク(tech板)
Cygwin + MinGW + GCC 相談室 Part 5
スレリンク(tech板)

あとC言語のパーサ使いたいなら自分で書いたほうが数倍早いぞ。

87:デフォルトの名無しさん
10/11/21 17:21:52
>>86

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

#そうそう、今自分でかこうか考えてた所(w

88:デフォルトの名無しさん
10/11/21 17:45:56
ついでに質問させて。

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

ご返答よろしくお願いします。

89:デフォルトの名無しさん
10/11/21 18:42:19
文字列操作なんて入力からトークンを切り出すのと2つの識別子が同じか比較する以外になんかやることあるけ?

90:デフォルトの名無しさん
10/11/21 23:52:43
Linux(GCC)ですが、Cのlocaltimeってマルチスレッドで使えるんでしょうか?
Visual C++だと戻り値がスレッドごとにメモリ確保されていますが、
Linuxでどうなのか調べがつきませんでした。

91:デフォルトの名無しさん
10/11/21 23:57:13
localtime_r でぐぐれ

92:デフォルトの名無しさん
10/11/22 04:35:54
class Something
{
public:
static int num;
};

このnumにほかのクラスから代入するにはどうしたらいいのですか?
これがstatic関数ならばその関数を使うことはできるのですがstatic変数が利用できません。

93:デフォルトの名無しさん
10/11/22 04:56:34
>>89

トークンの切り出しでトリム機能があるとさくっと作れそうなんス。
Tclで半分パーサの機能を作った時の経験からそう思うんス。

94:デフォルトの名無しさん
10/11/22 08:01:02
char *trim(char *s) {
return strtok(s, " \n\r\t");
}

95:デフォルトの名無しさん
10/11/22 08:06:14
そんな関数にするぐらいなら
strtok(s, " \n\r\t");
普通に呼び出したほうがマシだろ

96:デフォルトの名無しさん
10/11/22 12:36:46
>>92
なんでやねん
publicなんだからクラス関係ないだろ
Something::numで見えるだろ?

97:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/22 13:13:45
>>94
>>95
アドバイスありがと。
>>95
多分ラッパー関数と自分が書いたからだと思います。
彼の優しさだす。

切り出しに良い関数ですね。

99:デフォルトの名無しさん
10/11/22 13:14:16
Something::num = 123; ではなくて int Something::num = 123; にしないと定義できないよ。

100:デフォルトの名無しさん
10/11/22 13:27:11
>>99
そうなってるんだけど
お前の目はフシアナか?

101:デフォルトの名無しさん
10/11/22 14:07:51
まさか二重定義されてるとは思わなかったw

102:デフォルトの名無しさん
10/11/22 14:10:41
>>101
お前は一体なにを言ってるんだ


103:デフォルトの名無しさん
10/11/22 14:21:48
>>101
もしかしてクラスの中で定義してないので変だと思ったのか

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

みたいな感じで

これだとstatic intしか初期化出来ないので、俺はいつも外部で定義している

104:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/22 14:45:52
>>104
特に問題ないと思うから、ファイル名を変えてみたら?

106:デフォルトの名無しさん
10/11/22 14:49:30
>>105
positon.cpp⇒sample_p.cppに変更してみましたが、
同様のエラーが出ました。
ヘッダーファイル名も変更すべきでしょうか?

107:デフォルトの名無しさん
10/11/22 14:51:27
例のC++としてコンパイルするオプション・・・なんだっけ忘れた。

108:デフォルトの名無しさん
10/11/22 14:53:20
>> 107
bcc32 -P positon.h sample_p.cpp
でコンパイルしてみたら通りました。
-Pオプションが必要だったとは・・・・。
ありがとうございました。

109:デフォルトの名無しさん
10/11/22 14:55:47
C++やるなら無料のBCCなんて捨てろ


110:デフォルトの名無しさん
10/11/22 14:58:17
>>109
学習用にサクッとコンパイル通すには便利だったんですが
他のコンパイラおすすめありますか?

111:デフォルトの名無しさん
10/11/22 15:02:06
>>108
インクルードファイルはインクルードされるのに任せればいいからコンパイルしちゃダメ。

112:デフォルトの名無しさん
10/11/22 15:03:45
>>110
食いつくと思わなったが一応解説しておくと
BCCの無料版は古いのでC++新しい機能を駆使しようとすると問題が多い
でも初心者が勉強していく上でそれにひっかかることはまず無いので忘れてください

113:デフォルトの名無しさん
10/11/22 15:09:39
質問ばっかりすみません!
>>111
どういう意味でしょうか・・・?

114:デフォルトの名無しさん
10/11/22 15:16:23
>>113
bcc32 sample_p.cppだけでOK。
position.hは、sample_p.cppに「インクルードせよ」と書かれているので勝手にインクルードされる。

115:デフォルトの名無しさん
10/11/22 15:20:19
>>113
とりあえずbccでコンパイルしてみます
>>114
たしかにbcc sample_p.cppだけでコンパイルが通りました。
勉強になりました。ありがとうございます。

116: ◆/91kCCQXBo
10/11/22 15:59:39
>>284
>以前152
>で書き込ませていただいた者なんですが、教えていただいた通り、打ち込んでみたのですが、実行結果がでませんでした。
>なぜでしょうか?

7行目>>164
i=0; を
i=0; puts("数値を入力>"); に変えてみようか?

117:デフォルトの名無しさん
10/11/22 16:37:11
>>110
勉強用ならgccがいいよ
bccはもう終わったコンパイラ

118:デフォルトの名無しさん
10/11/22 17:28:18
Σ(゚∀゚) bccは終わコン!

119:デフォルトの名無しさん
10/11/22 17:32:22
Σ(゚∀゚) bccは終っパイ!

120:デフォルトの名無しさん
10/11/22 19:57:56
Σ(゚∀゚) b(ボインで)cc(CC)はオっパイ!


121:デフォルトの名無しさん
10/11/23 11:20:30
C+でプログラミングしたいと思うのですが、オススメの書籍やソフトなどありますでしょうか??

122:デフォルトの名無しさん
10/11/23 15:17:24
ifstream ifs( "data.txt" );
して、ファイルdata.txtを利用できるかって
ifs.good() == true で判断するの?
他になんか定石的な判断法あったら教えてね

123:デフォルトの名無しさん
10/11/23 17:28:50
if (ifs) または if(!ifs) でよい

124:デフォルトの名無しさん
10/11/23 20:50:27
>>123
ありがとうございます
そんなんで良いですか! 
駄目な時ifsを0にするって規格で決まっているですか?

125:デフォルトの名無しさん
10/11/23 21:26:13
bool operator ! () const;
が有るんだよ

126:デフォルトの名無しさん
10/11/23 22:15:03
>>123
if(!!ifs) か if(!ifs) じゃないか?

127:デフォルトの名無しさん
10/11/23 22:24:36
if (ifs)って書けるようにoperator void*() constが定義されている。
C++0xのドラフトN3126だとexplict operator bool() constに変更されている模様。

128:デフォルトの名無しさん
10/11/23 22:38:49
可読性低くなるからわかりやすいのを使ったほうがいいな

129:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/24 23:26:27
すみません、質問させてください。
環境はwindows7、コンパイラはBorland C++ Compiler 5.5です。
オイラー法で数値計算をして出力するEuler.exeという簡単なプログラムを作成したのですが、
コマンドプロンプト上で
>Euler.exe
とするときちんと計算結果がプロンプト上に表示されるのですが、
>Euler.exe>Euler.txt
とテキストファイル上に書き出すようにリダイレクトすると、プログラムが停止してしまいます。
プロンプト上では動作するので、プログラムの問題ではなくwindows7かコンパイラの問題だと思うのですが、
どなたか原因を教えていただけませんでしょうか。(今までの他のプログラムは出力できていました)
よろしくお願いいたします。

131:デフォルトの名無しさん
10/11/25 03:46:17
>>130
7なら権限の問題ではないかね。
あ、でも他のプログラムではできたのか。
書き出すより先にプログラムが終了しちゃうとかかな?終了間際にウェイトを置いてみるとか。

ひっじょーにしょうもない質問ですが、Cで
getchar();
のようなEnter入力待ちって、C++でcinとか使ってできるのでしょうか?

132:デフォルトの名無しさん
10/11/25 04:17:10
cin,get()

133:デフォルトの名無しさん
10/11/25 14:47:18
>>132
あ、なるほど
ホンとしょーもない質問で失礼しました
こんな関数持ってたのね

134:デフォルトの名無しさん
10/11/25 17:14:09
プログラム中でクラスの名前を表示したくて
cout << "node = " << typeid(*node).name() << "\n";
と書いて実行すると、
node = N3m3g8Sprite3DE
とかいう謎の文字列が得られるのですが、ただしくクラス名Sprite3Dだけを表示するにはどうすればいいですか?



135:デフォルトの名無しさん
10/11/25 17:38:18
環境に依存しない方法では存在しない。
てっとりばやく何とかしたいなら、Visual C++を使え。

136:デフォルトの名無しさん
10/11/25 17:39:48
>>134
自分で謎文字例からクラス名を取り出せば
たぶんこういうルールじゃね
N
3 m3g (3文字)
8 Sprite3D (8文字)
E

137:134
10/11/25 17:48:38
面倒くさいので1行でお願いします。

138:じゃあ1行で
10/11/25 17:55:17
デマングルでぐぐれ

139:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/25 18:37:56
>>134
g++ならabi::__cxa_demangle

141:デフォルトの名無しさん
10/11/25 20:17:49
リフレクションみたいな機能が欲しいのか
decltypeはあれ何だっけ

142:デフォルトの名無しさん
10/11/26 02:00:17
C言語の勉強をしたいのですが、無料の練習環境はありますか?
初心者用テキストに載っているコードが実行できる程度のもので構わないので、オススメがあったら教えてください。

143:デフォルトの名無しさん
10/11/26 02:13:59
OSすら書かないとかマジパネェっすよ

144:デフォルトの名無しさん
10/11/26 02:27:01
>>142
>初心者用テキスト
テキストに書いてあるオススメ


145:デフォルトの名無しさん
10/11/26 10:07:15
練習用にcodepadまじオススメ

146:デフォルトの名無しさん
10/11/26 12:04:27
>>142
Tiny C Compiler使ったのがいくつかあったような

147:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/11/27 20:01:34
冗長の何が悪いというんだ
書くのが面倒くさい、ぐらいしか思いつかない

149:デフォルトの名無しさん
10/11/27 20:11:51
>>147
さっきのvectorのアホに感化されたか

150:デフォルトの名無しさん
10/11/27 20:15:03
>>147
C++ってんならスコープを必要最小限に狭める上のほうが一般的だろう
下勧めてるとかどこのアホだ?

それはそれとして、ループのたびに確保ってvalueの方だよな?
なら全体をスコープで囲っちゃえば?

151:デフォルトの名無しさん
10/11/27 20:19:43
回答ありがとうございます
下みたいな書き方にしなくて良いようで安心しました

152:デフォルトの名無しさん
10/11/27 20:25:55
また犠牲者が一人・・・

153:デフォルトの名無しさん
10/11/27 22:45:20
for (int i = 0; i < length; i++) {
register int value = func();
}
C++はこうするのが正しい



154:デフォルトの名無しさん
10/11/27 22:47:36
registerって何だよ
死語になってるキーワードじゃないか

155:デフォルトの名無しさん
10/11/27 22:56:25
仮にregisterが有効に働いたとしても、valueをregisterにするのが
いいか悪いかは状況によるよな。

156:デフォルトの名無しさん
10/11/28 01:04:33
ここは昭和の自転車置き場の議論を引きずっているインターネットですね。

157:デフォルトの名無しさん
10/11/28 18:10:05
for (int i = 0, value; i < length; i++) {
value = func();
}
こうしたら?普通ありえんけど

158:デフォルトの名無しさん
10/11/28 18:35:24
>>157 何がうれしいの?

159:デフォルトの名無しさん
10/11/28 18:53:19
いや>>147の意を汲んだだけ

160:デフォルトの名無しさん
10/11/28 20:01:44
>>156
javaで仕事やってて、ループ内でプリミティブ型の変数を宣言してたら
ループのたびにメモリが確保されてパフォーマンスが落ちるとかいいがり
つけられたことがある。
古い話題じゃなくて、わかってないやつは今でもいっぱいいそう。

161:デフォルトの名無しさん
10/11/28 21:36:01
>>160
メモリ確保するコードが出力されないことは保証されていないし、パフォーマンス
落ちるかも知れないだろ。
落ちた所でそれが何なのとは思うし、そんなコードを生成するJITは嫌だが、
別に言いがかりじゃない。説明できなかったお前が悪い。

162:デフォルトの名無しさん
10/11/28 21:40:24
少なくともこれだけは間違いない。おまいらスレ違い。

163:デフォルトの名無しさん
10/11/28 22:11:44
>>161
いや完全にいいがかり。
しっかり反論した。
自分の作ったところがパフォーマンス悪いって指摘されて、おれが
書いたコードに責任をかぶせようとしてた。
一回リクエストがあるたびに、数十M、数百Mメモリを浪費してることろが
あるのに、(仮にループ中のintの宣言がメモリを浪費するとして)リクエスト一回で
数十回しかループしていないところのintを指して、これが原因とか言ってた。

それ以前にC++でだってループ中のint宣言はメモリを浪費しない保障がない、
やめるべきだとか言ってたらそいつ頭おかしいだろ。
それと同じだ。


164:デフォルトの名無しさん
10/11/28 22:39:31
↓落ちつけよバカ

165:デフォルトの名無しさん
10/11/28 22:49:09
Cみたいに関数の先頭で変数宣言するスタイルがいいって信じ込んで、
変数は使う直前で宣言&初期化するってスタイルが理解できない
連中とか珍しくないし、そういうレベルからみたらループ中で宣言って
驚天動地のできごとなんだろな。

166:デフォルトの名無しさん
10/11/28 23:35:09
速度じゃなくてメモリ消費を指摘されたのか? 先頭で宣言しようがforの中だろうが同じだな。
速度の話なら、毎回メモリ確保したとしてもスタックポインタ加算・減算に1ナノ秒くらい?
100万回実行しても人間は認識できない時間。

167:デフォルトの名無しさん
10/11/29 01:00:50
>>165
ループ内で宣言すると「お前のコードは汚い」といわれたことがある、ついさっき。

168:デフォルトの名無しさん
10/11/29 01:09:52
もういっそ関数内の宣言もやめてグローバル変数で確保しちゃいなよ。

169:デフォルトの名無しさん
10/11/29 01:10:28
>>167
それはあんたの価値観が古臭いだけだ。
と言い返してやれ。

170:デフォルトの名無しさん
10/11/29 01:25:55
1999年にCでも途中での宣言が許されるようになったんだがなあ

171:デフォルトの名無しさん
10/11/29 14:02:30
Aがdouble型のとき (bool)A ってどういう意味?
A != 0 でいいの?

172:デフォルトの名無しさん
10/11/29 14:51:38
>>171
その通り

173:デフォルトの名無しさん
10/11/30 12:03:19
std::exceptionを継承したclassがA , B・・・と複数あって
例外をキャッチするとき例外AとBの時は同一の処理をしたい場合catch()の指定の仕方はどうすればよいでしょうか?

174:デフォルトの名無しさん
10/11/30 12:10:12
catchでもっかいthrowすればいいじゃない

175:デフォルトの名無しさん
10/11/30 12:20:27
>>173 URLリンク(codepad.org)

176:175
10/11/30 12:22:17
throw ~ catch で型判定するぐらいなら dynamic_cast 使ったほうがまだ軽くていいような気がしてきた。

177:デフォルトの名無しさん
10/11/30 14:18:07
URLリンク(codepad.org)

178:デフォルトの名無しさん
10/11/30 23:11:00
std::exceptionのデストラクタがわざわざvirtualになっていることから、
dynamic_castしてくれというのがライブラリ設計者の考えではないだろうか。

179:デフォルトの名無しさん
10/12/01 01:11:39
>>178
んなわけない。

仮想関数を持つクラスはほぼすべて virtual デストラクタを持つことになるわけで、
その考え方だと dynamic_cast 推奨と勘違いするケースが多すぎる。

180:デフォルトの名無しさん
10/12/01 07:30:09
virtual関数持ってる(=型情報あり)なんだから素直にdynamic_castすればいいじゃん
>>174-177なんかよりよっぽど見やすいコードだし、使わない手はない

181:デフォルトの名無しさん
10/12/01 07:57:43
dynamic_cast の使いどころであることに異存は無いが >>178 の理由付けはおかしい。

182:デフォルトの名無しさん
10/12/02 20:46:21
例外が飛んできてる時点で軽いとか重いとかは無意味だよ。

183:デフォルトの名無しさん
10/12/02 21:03:19
DLLから例外投げたら『ヤバイ』っすか~?

184:デフォルトの名無しさん
10/12/03 06:47:39
>>183 URLリンク(ja.lmgtfy.com)

185:デフォルトの名無しさん
10/12/03 08:45:42
classにstaticとstatic以外のものが混ざる場合ってよくあるんでしょうか?

186:デフォルトの名無しさん
10/12/03 09:34:44
まれによくある

187:デフォルトの名無しさん
10/12/03 13:26:02
俺はあまり無い。

188:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/03 16:12:48
Singletonパターンではあるかもな
1つでもクラスを生成したら以降は無視するようにするためにカウンタを
staticメンバ変数で作る

190:デフォルトの名無しさん
10/12/03 16:13:30
>>188
死ね
たいがいにしとけや

191:デフォルトの名無しさん
10/12/04 02:51:00
>>183
DLLを利用するコードがDLL作る時と同じコンパイラの同じバージョンでコンパイルされるなら問題無い。
もしくはクラスのメモリレイアウトと例外の実装方式に変更がないという自信があるなら良い。
要するにコンパイラメーカー以外は気安くスローするなってことだ。

192:デフォルトの名無しさん
10/12/05 23:14:03
同じコンパイラならバージョンぐらい変わってもいいだろ、とか思ってたが
Visual C++のtime_tのサイズが途中で変わったりしてて驚いた。めんどくせ

193:デフォルトの名無しさん
10/12/06 13:25:04
size_tって何のためにあるんですか?

194:デフォルトの名無しさん
10/12/06 14:37:06
sizeof の戻り値を表現するために

195:デフォルトの名無しさん
10/12/06 15:10:41
intじゃなんだめなの?

196:デフォルトの名無しさん
10/12/06 15:22:48
for (int i = 0; i < (int)v.size(); i++)

この(int)が激しくウザい。だれだよsize_tとか作った奴。

197:デフォルトの名無しさん
10/12/06 15:58:15
>>195
intが32ビットでsize_tが64ビットの環境もあるから (VC++の64ビット版とか)
64ビットのくせに2GBまでしか扱えなくていいのならintにキャストしとけばいいんじゃない

198:デフォルトの名無しさん
10/12/06 16:50:56
まじかよ。
俺は今まで64ビットの環境ではintが64bitになるかと思ってたよwww

199:デフォルトの名無しさん
10/12/06 19:00:34
パンピーにゃ32ビットありゃ十分でしょ

200:デフォルトの名無しさん
10/12/06 21:37:31
パンピーはプログラムなんか書かねーよ。
for (size_t i = 0; i < v.size(); i++) でいいだろ。

201:デフォルトの名無しさん
10/12/06 21:44:05
サイズの小さいのに、62ビット計算は無駄な気がするな~
最適化で32ビットにでもなれば…
いや、気にする必要もないのか?(64bitOS持ってないんだ)

202:デフォルトの名無しさん
10/12/06 21:58:53
>>201
お前は一生shortでも使ってろ。
for (short i = 0; i < 100; i++) ; // メモリの節約(^^)

203:デフォルトの名無しさん
10/12/06 21:59:56
いやいや、100くらいならcharにするべき

204:デフォルトの名無しさん
10/12/06 22:00:36
>>201
そんな無駄を意識する前に、ループ回るたびに size() 呼び出してる点を先に考えろ。

205:デフォルトの名無しさん
10/12/06 22:23:19
それは、普通に最適化で外に出るだろ

206:デフォルトの名無しさん
10/12/06 22:25:30
>>202,203
ちょっと待て、普通にどうなるか聞きたいのだが?
メモリー以外変わらないのか?

207:デフォルトの名無しさん
10/12/06 22:39:54
>>206
十分に最適化の聞くコンパイラなら同じこと。ただし下手に小さい整数型をループ変数にすると
100 を 200 にしたり 300 にしたり 40000 にしたりすると意図しない結果になる可能性がある。

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

基本的にはデメリットしかない。

208:デフォルトの名無しさん
10/12/07 01:24:00
>204
for (int i = 0, size = v.size(); i < size; ++i)
ということか。

まあ面倒くさいってのは一緒だけど。

209:デフォルトの名無しさん
10/12/07 01:34:54
>>208のケースはvがconstなら一時変数に入れなくても最適化されるだろうけどねぇ。

210:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/07 10:15:42
俺には同じに見える・・・

212:デフォルトの名無しさん
10/12/07 20:53:12
32ビットターゲットで比較してアホだろ

213:デフォルトの名無しさん
10/12/07 22:56:33
/usr/lib と ${HOME}/lib に同じ名前のライブラリがあります。
リンクすると/usr/libの方をリンクしてしまうのですが、
自分の${HOME}/libの下にある奴を優先的にリンクさせるには
Makefileをどう書けばいいでしょうか

214:213
10/12/07 23:08:14
LD_LIBRARY_PATHを指定していませんでした。
指定したらローカルの方をリンクしてくれました。
お騒がせしました

215:デフォルトの名無しさん
10/12/08 07:55:41
std::set<string,less<string>,MyAllocator> Set;
というコードがあったのですが、MyAllocatorが複雑でなにをやってるのか
なかなか分かりません。一般的にset::set()で独自アロケータを指定する場合というのは
どういうことがやりたい場合でしょうか?


216:デフォルトの名無しさん
10/12/08 08:34:12
んなもん、作った奴に聞け。

217:デフォルトの名無しさん
10/12/08 09:11:05
コードを読むうちに、やっぱりメモリプールを使った独自アロケータかな、、という気がして来ました。
それ以外ないですよね。

218:デフォルトの名無しさん
10/12/08 09:23:15
>>217
boost::boolのドキュメントでも読め

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

URLリンク(boost.cppll.jp)

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

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



220:デフォルトの名無しさん
10/12/08 13:24:12
catch (...)

221:デフォルトの名無しさん
10/12/08 14:15:31
エラーコードでもthrowしとけば?

222:デフォルトの名無しさん
10/12/08 14:24:27
throw "This is meaningless value";

223:デフォルトの名無しさん
10/12/08 20:57:18
ここまでstdexceptについての言及なし。

224:デフォルトの名無しさん
10/12/08 21:24:08
new しなくても関数使えますが new を使う必要ない場合は使わないほうがいいんですか?


225:デフォルトの名無しさん
10/12/08 21:36:47
必要なときニュ~する、必要でないときはニュ~しない。
にゅ~にゅ~

226:デフォルトの名無しさん
10/12/08 21:42:13
new した方が早いとかそういう噂を聞いたものでな

227:デフォルトの名無しさん
10/12/08 21:44:07
いや速くないでしょ、にゅ~する時間かかるし。
使用だけなら、時間は同じ。

228:デフォルトの名無しさん
10/12/08 21:48:31
いやまて、スタックに配置されるのとグローバルに配置される分は。
たぶん少し速いかもしれん。

229:デフォルトの名無しさん
10/12/08 22:37:56
どちらかと言えば、キャッシュヒット率が期待できる分だけスタックの方が速いね。
いずれにしろ、誤差だ誤差。

230:デフォルトの名無しさん
10/12/09 07:15:24
>>196
わかる
ズレてるよね
こんなところでバグらねーよボケがって思うわ

糞MS、str~系の関数全部エラー出しやがってマジで馬鹿じゃないの?
お前、これの何が危険なんだと
サイズ指定してないから危険?は?
こんなところでバグなんてでやしねぇよ
ちょっとはプログラム組んだことある奴社内にいねーの?
すげー、チンカスども余計なもんいれんなお前等の「安全」とかちっとも役に立たないんだわ

231:デフォルトの名無しさん
10/12/09 07:55:45
なるほど、間抜けはウォーニングとエラーの区別がつかないらしい。

232:デフォルトの名無しさん
10/12/09 12:31:53
|for (int i = 0; i < (int)v.size(); i++)

for(size_t i=0;<v.size();i++)
じゃだめなの?

233:デフォルトの名無しさん
10/12/09 12:51:05
>>232
警告が出るよ

「符号付き値と符号無し値の比較」みたいな

234:デフォルトの名無しさん
10/12/09 12:57:42
>>233
size_tだから大丈夫じゃね

235:デフォルトの名無しさん
10/12/09 13:05:10
forループのカウンタってなんでintが多いの

236:デフォルトの名無しさん
10/12/09 13:11:03
>>234
規格を見てないけどsize_tは大抵unsigned longなんだぜ

237:デフォルトの名無しさん
10/12/09 13:11:54
負の数が表現できて普通に使う分には十分大きくて多分他の整数より速い

238:デフォルトの名無しさん
10/12/09 13:11:56
>>235
タイプ量が少なくて楽だから

239:デフォルトの名無しさん
10/12/09 19:54:44
WOW64で32ビットアプリケーションが実行された場合、
使用できるメモリは4ギガまでなのでしょうか?

240:デフォルトの名無しさん
10/12/09 20:30:19
いえす

241:デフォルトの名無しさん
10/12/09 21:38:24
アプリで使用できるの2ギガじゃないの?

242:デフォルトの名無しさん
10/12/09 21:39:59
RAM DISKを使うと使えるってだけの話でわ?

243:デフォルトの名無しさん
10/12/09 21:49:10
>>235
iを使って計算するときに楽だからじゃないか
負数と足すとき大概はキャストの必要があるし

244:デフォルトの名無しさん
10/12/10 01:19:39
>>232
size_tが64ビットの場合もあるので、size_tでループを回すと効率が落ちる場合もある。

245:デフォルトの名無しさん
10/12/10 01:40:37
>>244
どの処理系で効率が落ちると?

246:デフォルトの名無しさん
10/12/10 03:04:26
>>244
きちんとした説明をしてもらおうか。

247:デフォルトの名無しさん
10/12/10 09:38:23
>>244じゃないが、
x86_64とかREXプレフィックス等でコードがでかくなって遅くなりそう。
問題になるほどの差があるかどうかはともかく。

248:デフォルトの名無しさん
10/12/10 11:00:57
URLリンク(msdn.microsoft.com)(v=vs.80).aspx
へー 64bit Windows持ってないから試せないな
誰かどっちの方が効率いいか実測してくれ

249:デフォルトの名無しさん
10/12/10 11:09:36
いくら出せますか?

250:デフォルトの名無しさん
10/12/10 12:00:26
>>247
プリフィックスが付く事で遅くなる事はないとIntelは言ってる
ただコードが膨れた分キャッシュ効率は間違いなく低下するだろうけど
だからあんな巨大なL2キャッシュを積んだんじゃね?

251:デフォルトの名無しさん
10/12/10 20:52:39
たまにCで書くとC++の偉大さが解かるな
コードめちゃ綺麗になるわ

252:デフォルトの名無しさん
10/12/10 23:14:47
ちょと複雑になってデバグとかなると
Cの簡潔さが欲しくなるよ。

253:デフォルトの名無しさん
10/12/10 23:18:52
いやそれ、単に設計が悪いだけ

254:デフォルトの名無しさん
10/12/10 23:48:58
寿命の短い変数のために
{
int i = ・・・
}
って書いたら気味悪がられたことある
これだからC使いは嫌いだよ

255:デフォルトの名無しさん
10/12/11 00:21:56
俺はCで(99以前で)書くときは関数の先頭に全部の変数宣言をまとめてる
int i, j, k, ...;
char *p, *q, ...;
ってな感じで
無理にスコープ狭めても醜いし、もうCだしいっかと割り切ることにした

256:デフォルトの名無しさん
10/12/11 22:26:57
気味悪がられた程度で嫌になるとか・・・
もう少し大人になりなさい

257:デフォルトの名無しさん
10/12/12 01:38:22
>>254
C使いです。タスタスも少し出来ます。
なんでこれで気味悪がれるの?
なかなかの上級テクだと思うが。

258:デフォルトの名無しさん
10/12/12 10:01:15
>257
上級テクどころか、普通のTIPSだろ。
それを気味悪いだとか言うような奴に限って300行もあるような関数の先頭で変数を宣言したがる。
おまけに、ポインタ変数に整数値を入れてフラグ代わりにするような使い回しも厭わない。
要は感性が違うのだと諦めて、適当にあしらうしかないね。

259:デフォルトの名無しさん
10/12/12 12:09:35
曰くスコープのネストが深くなるのがキモイんだと

260:デフォルトの名無しさん
10/12/12 12:23:31
その感覚自体は正常だろ
あんまり酷くなるならスコープ切るより関数分けることを考えるべきでしょ

261:デフォルトの名無しさん
10/12/12 12:45:49
所詮他言語なんてそんなもんだろ
古いfortranの感覚だと、関数なんて使ってんじゃねーよ馬鹿みたいに言われてたとか聞いたし

262:デフォルトの名無しさん
10/12/12 13:18:47
VBの仕事で、普通の感覚で、関数やらサブルーチンやら作ってたら、
イベントハンドラにコピペコピペで長い処理書いてるおっさんから
「お前のコードはあちこち飛んで分かりにくい」って苦情を言われた
ことがある。

263:デフォルトの名無しさん
10/12/12 13:36:46
で みなさんは goto を使ってます?
俺最近使ったw
ループ一気脱出には便利よね。

264:デフォルトの名無しさん
10/12/12 13:40:41
gotoつかわないと抜けられないようなループは書かないので使いません

265:デフォルトの名無しさん
10/12/12 13:41:29
ここ10年ほど、ネタ以外で使った事がない

266:デフォルトの名無しさん
10/12/12 15:37:57
Cで例外処理っぽく書くときに使うな。

267:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/12 17:23:27
URLリンク(www.jpcert.or.jp)

269:デフォルトの名無しさん
10/12/12 17:47:22
>>267
その例で言えば、メモリ確保を集約できるならそれでもいいけどね。

270:デフォルトの名無しさん
10/12/12 17:59:48
>>268
の例はあまり綺麗じゃないぞ。
おれなら、リソースのポインターやハンドラーNOに正常オープンの情報が入って。
ポインターならNULL以外。 ハンドラなら-1以外。
解放時にその情報を見て解放している。
これなら、何時終わろうが何処で終了処理されようが問題なく解放できる。
gotoラベルも気にする必要がない。

271:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/12 19:44:21
だから多重ループ一気脱出の時に便利なだけだよ。
break が関数でネストレベルがパラメータにあればいいのかもね。

273:デフォルトの名無しさん
10/12/12 19:47:01
その為の例外機構です

274:デフォルトの名無しさん
10/12/12 19:47:55
例外で脱出とかアリなの?

275:デフォルトの名無しさん
10/12/12 19:48:36
例外を通常の制御フローに使うな

276:デフォルトの名無しさん
10/12/12 19:50:18
だいたい、多重ループしなきゃ行けないような設計自体が問題だ

277:デフォルトの名無しさん
10/12/12 19:51:58
for (~) {
switch(~) {
}

278:デフォルトの名無しさん
10/12/12 19:52:37
途中送信しちまった
このswitchでfor脱出したいときとかないの?

279:デフォルトの名無しさん
10/12/12 20:01:08
ifで書けば解決

280:デフォルトの名無しさん
10/12/12 20:03:22
goto使うぐらいなら、終了フラグ作るよ

281:デフォルトの名無しさん
10/12/12 20:09:49
ループ脱出のgotoくらい許せや

282:デフォルトの名無しさん
10/12/12 20:16:30
絶対に許さない! 絶対にだ

283:デフォルトの名無しさん
10/12/12 20:21:31
>>281
許す許さないの問題じゃない。ただ単にポリシーの問題だ。
使いたければ使うがいい。ただな、ループを抜けたいだけの理由でgoto
使えば、当然飛び先を変えて処理をしたいと思うのが人間、普通にそう思うだろう。
それがいやなんだよ。

284:デフォルトの名無しさん
10/12/12 20:26:21
ループを工夫して一重で書けよ

285:デフォルトの名無しさん
10/12/12 21:05:24
>>283
思わん。

>>284
それで読みやすいプログラムになるならそうするさ。

286:デフォルトの名無しさん
10/12/12 21:08:25
これからも多重ループ脱出にはgotoを使うであろう。予言

287:デフォルトの名無しさん
10/12/12 21:10:30
多重ループ平気で書くやつを多重ルーピーと呼ぶことにしよう

288:デフォルトの名無しさん
10/12/12 21:39:30
#define LOOPBREAK {i=ENDVALUE;continue;}

289:デフォルトの名無しさん
10/12/12 23:24:07
ループ制御変数がi限定なのか。

290:デフォルトの名無しさん
10/12/12 23:25:45
時代はラムダ式とreturn、アルゴリズムにして追い出す方向に向うのかな

291:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/13 01:18:59
googleは後者

293:デフォルトの名無しさん
10/12/13 01:21:47
アンダーバーで始まる識別子は敬遠される。
私は横着だから、
class hoge {
int data_;
public:
// construction
hoge() : data_(0) {}
~hoge() {};
// operation
int get() const {return data_;}
};
こんな感じになるかな。

294:デフォルトの名無しさん
10/12/13 01:39:42
やぱメンバ変数は
m_付きがいいのでしょうか。

295:デフォルトの名無しさん
10/12/13 02:01:02
>>294
賛否両論ある話なので好きにしたらいいと思うよ

296:デフォルトの名無しさん
10/12/13 02:11:53
人には言えないけどアンダーバー開始にしてる
理由、VC++のインテリセンスで下にまとまって便利だから
VC++stlもそうなってるし趣味プログラムだから許してちょ

297:デフォルトの名無しさん
10/12/13 02:19:10
処理系が提供しているライブラリだから
処理系予約の識別子記法で書いてるだけ。

もちろん、絶対に個人でしか扱わないものなら
どうしようと(それで将来不具合が出ようと)自由だけどね。

298:デフォルトの名無しさん
10/12/13 12:17:26
俺は member data は _ で終わりにしてるけど
_ で始める人もいる(ちょっと気持ち悪いけど)

なんとなく何かと衝突しそうで怖い
__ で始めるとヤバそうだけど一個なら安全なのかな

299:デフォルトの名無しさん
10/12/13 14:52:52
_からはじめない派の人は、_の後に大文字が使えない(規格に違反する)ことを気にしているのですか?

300:デフォルトの名無しさん
10/12/13 16:24:55
でもぶつかればコンパイルエラーになるのでわ?

301:デフォルトの名無しさん
10/12/13 17:10:07
グローバルな関数に使ったりするのはダメだけどそれ以外はいいよ
名前空間に入れるなりクラスのメンバにするなりする分にはいい

302:デフォルトの名無しさん
10/12/13 17:10:53
>>296
アンスコ2つで始まるのは標準ヘッダのマクロで使われてるかもしれないから問題あるが
アンスコ一つならグローバルとstd名前空間で予約されてるだけだから
問題無い。

303:デフォルトの名無しさん
10/12/13 17:20:50
アンダースコア2つで「始まる」じゃなくてアンダースコア2つを「含む」識別子じゃなかったっけ

304:302
10/12/13 17:26:57
>>303
アンスコ二つは「含む」でした。失礼したでござる。

305:デフォルトの名無しさん
10/12/13 17:53:04
どうせタイプ一回ならmHogeでよくねーかアンスコだとシフト押さないといかんし

306:デフォルトの名無しさん
10/12/13 17:54:40
麻雀プログラム書くときに卑猥になるからダメだ。
bool mAnko;

307:デフォルトの名無しさん
10/12/13 17:54:45
キャピタライズのときにもシフトは押すわけだが

308:デフォルトの名無しさん
10/12/13 18:05:24
インテリセンスのためにも m_ を愛用してる。

309:デフォルトの名無しさん
10/12/13 20:06:28
でもm以下の関数呼ぶのに邪魔じゃね?

310:デフォルトの名無しさん
10/12/13 20:20:40
俺は_だな。
先頭に_が付いてるってことで触って欲しくないとアピールできる。

311:デフォルトの名無しさん
10/12/13 20:44:42
同じような話題で
ヘッダの2重読み込み禁止のdefineの記述はちょっと悩まない?
多分ぶつからんとは思うけどぉって。
VCだと適当に付けてくれるんだけどね。

#ifndef __HOGE_H__
#define __HOGE_H__
・・・
#endif


312:デフォルトの名無しさん
10/12/13 20:50:12
#define PROJECTNAME_ROOTDIR_・・・_HEADERNAME_HPP

これでおk
衝突したこと一度も無い

313:デフォルトの名無しさん
10/12/13 21:04:01
#pragma once最強。
他の処理系でもサポートしてくれれば・・・

314:デフォルトの名無しさん
10/12/13 21:08:22
>>309
邪魔かもしれんけど、プログラムリストが一目で、ローカル変数と区別が付くのがいい

315:デフォルトの名無しさん
10/12/13 21:23:08
>>311
アンスコ二つを含む名前はコンパイラ以外が使っちゃいかん。

ぶつからないよう氏名生年月日を入れるのがマジオススメ
#define _山田太郎_19801231_プロジェクトA_TEST_H_

316:デフォルトの名無しさん
10/12/13 21:23:32
メンバもほかの変数も区別せんけどなぁ
実装書くときに変数を省略形にするから被ることないし

317:デフォルトの名無しさん
10/12/13 21:37:39
>>315
てか作成時の時間を入れておけば大丈夫だよね

318:デフォルトの名無しさん
10/12/13 22:05:33
アプリケーション命名規則じゃなく。
作成時間命名規則、又は、作者名命名規則かw

319:デフォルトの名無しさん
10/12/13 22:48:09
他のソースを参考に読み、理解したらそれをパクるのではなく自分なりに書き換えたほうがいいのでしょうか?
こんなのよく考えるなぁーって思うときが多くて、、、

320:デフォルトの名無しさん
10/12/13 22:57:05
そのまま流用できるコードならそれでいいんじゃないの
まあでも著作権はいろいろ難しいから業務だったら詳しい人に聞いたほうがいいよ

321:デフォルトの名無しさん
10/12/14 09:38:28
__int64より大きい整数扱いたい場合はどないすればいいんですか?
doubleだと桁が足りませんよね…こまった

322:デフォルトの名無しさん
10/12/14 09:58:58
自分でそういう整数を扱うクラスを作るか、既存のライブラリを探してきてそれを使うか。

323:デフォルトの名無しさん
10/12/14 15:56:19
たぶんboostライブラリーにあるよ。

324:デフォルトの名無しさん
10/12/14 15:57:51
ねぇよ

325:デフォルトの名無しさん
10/12/14 16:04:34
それならクヌースの2巻を読むといいよ

326:デフォルトの名無しさん
10/12/14 17:05:35
BigNumでぐぐれ

327:デフォルトの名無しさん
10/12/14 17:16:33
Linux+g++ で socketとかpthreadとかやりたい時、namespaceがないでしょ。
そもそもヘッダが sys/***.h だったりするし。
そんときはやっぱgccでコンパイルしてextern C でリンクするしかないんかな。
みなさんはどうやってます?

328:デフォルトの名無しさん
10/12/14 17:26:25
何言ってんだ?
C++からでも普通に使える。

329:デフォルトの名無しさん
10/12/14 18:32:02
reallib でググれ

330:デフォルトの名無しさん
10/12/14 19:35:59
>>327
①sys/***.hをインクルードする
②そのまま使うコードを書く
③-lpthreadでリンク
gccコンパイルもextern "C"も要らない。

331:デフォルトの名無しさん
10/12/14 21:49:05
>>321
「__int64」ってことはVisual C++かな。/clrオプションでDecimal型使うのが楽。

332:デフォルトの名無しさん
10/12/15 01:42:26
>>330
それはわかるんだけど、cstdlib とか cstring とか
namespace std じゃん。
でもそういうヘッダがない システムコール系は グロバル空間じゃん。

そういうのが作法として気になってるだけなんです。
気にしなくていいってならそれしかないんですけどぉ。。


333:デフォルトの名無しさん
10/12/15 02:02:49
>>332 気にしたところでそれしかない。

334:デフォルトの名無しさん
10/12/15 02:48:09
>>333
へへぇ 恐れ入ります。
それしかないならそうですね。
ありがとうございました。

またACEでもやるかw

335:デフォルトの名無しさん
10/12/15 07:21:08
>>332
C++リンケージのシンボルは名前空間で名前を整理する。
Cリンケージのシンボルは全てがグローバル扱い。
CのモノとリンクするんだからCのやり方に従うのが筋。
C関数を呼び出す変なラッパーをC++で作るのだけはマジ勘弁。

336:デフォルトの名無しさん
10/12/15 23:11:35
>Linux+g++ で socketとかpthreadとかやりたい
>みなさんはどうやってます?
まず言語の選択を間違えている。マルチスレッドでソケット通信するだけなら
Javaの方が10倍マシ。C++でやるメリットなど無い。
無駄なことにエネルギー使うのはやめた方がいい。

337:デフォルトの名無しさん
10/12/15 23:55:10
悪名高き Java をインストールさせるなど愚の骨頂

338:デフォルトの名無しさん
10/12/15 23:55:16
>>335
C++でソケット使う場合どうするの?

339:デフォルトの名無しさん
10/12/15 23:56:51
>>336
Javaは遅いし怪しいし気持ちわるいし
なにより出来ませんw 結局これ。

340:デフォルトの名無しさん
10/12/15 23:59:25
>>338
C++でできなかったらJavaでどうやんの?
ソケットどころかJavaの処理系すら存在しない世界になるよ?

341:デフォルトの名無しさん
10/12/16 03:14:18
ちょと何言ってるかわからない

342:デフォルトの名無しさん
10/12/16 07:25:35
変なラッパなんか使わず、Cの流儀で書けばいいだけだ。
まさか、アプリケーションレイヤーで直接ソケットを操作するわけじゃなし。

343:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/16 20:02:31
B unko;
auto_ptr<A> a(new A);
unko.SetA(a.get());
a.release();

345:デフォルトの名無しさん
10/12/16 21:21:34
>>343
>b.SetA( shared_ptr<A>(this)
shared_ptrをテンポラリで使ったらすぐにdeleteが走るに決まってるだろ。
shared_ptr使ってるのをやめればいいんじゃね?

346:デフォルトの名無しさん
10/12/16 21:43:02
enable_shared_from_thisでぐぐると幸せに慣れるかもな

347:デフォルトの名無しさん
10/12/16 21:43:11
わからんw

348:デフォルトの名無しさん
10/12/16 22:11:21
INT64 (__int64)等はVCのコンパイラ独自拡張ですか?

349:デフォルトの名無しさん
10/12/16 23:10:06
long long intならC99の正式規格だな
64ビット整数という保証はないけど

350:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/16 23:16:23
>>349
ありがとうございます。感謝です。

353:デフォルトの名無しさん
10/12/16 23:17:57
>>350-351
さらに詳しく解説感謝しますっ

354:デフォルトの名無しさん
10/12/16 23:41:41
>343 >346
こんな感じ?
URLリンク(ideone.com)

355:デフォルトの名無しさん
10/12/16 23:56:33
Cygwinを使ってvc++のclを呼び出すみたいなことって出来るんですか?
それともgccじゃないとだめなんでしょうか?

356:デフォルトの名無しさん
10/12/17 00:05:04
環境変数設定すれば普通にできるんじゃねえの

357:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/17 00:15:07
cout << static_cast<int>(b) <<endl;

359:デフォルトの名無しさん
10/12/17 00:30:11
>>358
それはやったんですけど、どうしてcharだとだめなのかなぁと。

360:デフォルトの名無しさん
10/12/17 00:35:00
char b='a';
cout << b <<endl;

で97とか表示されても困るだろうが

361:デフォルトの名無しさん
10/12/17 00:49:31
なるほど。最履修します。ありがとうございます。

362:デフォルトの名無しさん
10/12/17 00:50:31
>>346
横レスしつれいするけどenable_shared_from_thisってコンストラクタで渡せなかったり
自身が必ずshared_ptrの管理下に無いとダメみたいだけど上手く回避する方法はないかな・・・?

363:デフォルトの名無しさん
10/12/17 08:25:25
>>362 どっちも無理だろjk

364:デフォルトの名無しさん
10/12/17 21:24:07
明らかに不正なポインターを見分ける方法はありませんか?
例えばこういうポインターです。

Foo* foo = (Foo*)0x12345689;

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



365:デフォルトの名無しさん
10/12/17 21:35:45
if (foo == (Foo*)0x12345678) {

366:デフォルトの名無しさん
10/12/17 21:41:17
実際にそこへアクセスしてみて EXCEPTION_ACCESS_VIOLATION なり SIGSEGV なりを捕まえる

367:デフォルトの名無しさん
10/12/17 21:44:38
いやいやいや、エスパーするに、たぶん例外的なアクションをしない、
不正なポインターでしょw。例外的な物ならすぐ分かるからw

368:364
10/12/17 21:45:00
すいません、まじめに教えてください。
ポインターの指す先が有効なオブジェクトなのか、未定義なのかを判別しないといけないのです。


369:デフォルトの名無しさん
10/12/17 21:45:49
ほらやっぱりw

370:デフォルトの名無しさん
10/12/17 21:50:13
Cをやめるのが一番だと思うよ

371:デフォルトの名無しさん
10/12/17 21:50:56
有効なオブジェクトのリストを持っておき、そのポインタがリストに載っていれば有効、でいいんじゃね

372:デフォルトの名無しさん
10/12/17 21:52:37
無効なポインタはNULLポインタにしておけば良いんじゃね?

373:364
10/12/17 22:01:15
もういいです。自分で何とかします。
有難うございました。

374:デフォルトの名無しさん
10/12/17 22:03:45
結構本気だったのになぁ

自分はポインタはNULLで初期化してDeleteしたり使わなくなったらNULL代入しておくようにしておくんだが

375:デフォルトの名無しさん
10/12/17 22:12:37
クラスの関数を使うときに
Class().func();
とすると使えてしまいますが、このテクニックはよくつかわれるのでしょうか?

376:デフォルトの名無しさん
10/12/17 22:16:30
結構本気だったんだがな
有効なオブジェクトのリストを持っておくのはデバッグ中はまれによくやるぞ
(どっちかというと解放漏れチェックのためにだが)

377:デフォルトの名無しさん
10/12/17 22:17:31
というかスマポ使えよ、と言うのは無しなのだろうか

378:デフォルトの名無しさん
10/12/17 22:17:39
NULLチェックでダメな場合がそもそも思いつかない

379:デフォルトの名無しさん
10/12/17 22:20:41
いやいやいや、スタック上のオブジェクトですでに消えたスタックデータとか。
何かがオーバーランしてポインター潰したとか。
ポインター演算又は配列の添え字間違えたとか。
色々あるよ

380:デフォルトの名無しさん
10/12/17 22:35:48
自分でオブジェクトの管理もできないならポインタを使わないようにするのが一番だろ。

381:デフォルトの名無しさん
10/12/17 23:19:15
変数は初期化して
deleteしたらnullを代入が作法かと。

ポインタ先が本物か偽者かを判定するなんてわかんのかい?

382:デフォルトの名無しさん
10/12/17 23:24:29
ポインタにNULLを入れて何回でもdeleteしてやる

383:デフォルトの名無しさん
10/12/17 23:33:36
ダブルポインタで参照しとけばどこからアクセスされてても生存確認できるんじゃ

384:デフォルトの名無しさん
10/12/17 23:55:20
結局 ワッチャかトレサを入れておくってのは解かもしれんが、
やってる人おるん?
そんなにポインタって危ないもん?
ポインタの使い方しらんかちゃんとモドリチみてないか
単にめちゃくちゃなプログラムなのでわ? とw

385:デフォルトの名無しさん
10/12/18 01:37:53
>>374
最近、これを忘れてえらいめにあいました。
NULL 代入忘れを検出する方法を思案中。

386:デフォルトの名無しさん
10/12/18 02:01:40
結局可能なら素直にスマポっておけって結論になるんだよなぁ

387:デフォルトの名無しさん
10/12/18 03:33:43
>>385
必ずマクロ(もしくはテンプレート)経由でdeleteするとかでだいたい防げるんじゃね?
まぁNULL初期化を忘れそうだけど

388:デフォルトの名無しさん
10/12/18 04:33:21
だから、忘れる可能性のある対策なんて無意味なんだって。
自分できちんと管理できない馬鹿は大人しくJava使えばいいんだよ。
あ、C#でもいいか。

389:デフォルトの名無しさん
10/12/18 05:55:22
覚悟がないなら生でやるな、でいいだろ。

390:デフォルトの名無しさん
10/12/18 06:00:46
忘れる可能性なんて言ってたら何もかけないだろ

391:デフォルトの名無しさん
10/12/18 10:58:59
C++を0の状態から勉強している者です。

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

URLリンク(codepad.org)
が自分の書いたソースです。

私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?

392:デフォルトの名無しさん
10/12/18 11:03:11
マルチ氏ね

393:391
10/12/18 11:25:06
すいません、聞いておいてなんなんですが、事故解決しました。

absoluteの略で私は「abs」と勝手に略していたのですが、
偶然にも数学関数の中ですでに定義されていた型のようで、そこでエラーが出ていたみたいです。
「Abs」と最初を大文字にしてやると無事オーバーロード出来ました。

394:デフォルトの名無しさん
10/12/18 11:27:14
std::'double abs(double)'が既に定義されているから再定義はできない。
知らない間に誰かがcmathあたりをインクルードしてる。


395:デフォルトの名無しさん
10/12/18 12:19:09
>>381,385,387
スマポ使えって結論が出てる脇でヌル代入するテンプレート自作とか
マヌケな話が続く意味がわからない。

396:デフォルトの名無しさん
10/12/18 13:03:43
deleteしたあとにNULL入れるって、変数の使い回しが横行してるような
ソースでのお作法だろ。
方向性があさってすぎる。

397:デフォルトの名無しさん
10/12/18 13:29:30
ポインタにNULLを入れて何回でもdeleteしてやる


398:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/18 13:52:04
てめぇSAFE_RELEASEさんdisってんのかあぁ?

400:デフォルトの名無しさん
10/12/18 13:54:59
>>398
未初期化変数の値を使っているのが問題なのであって、
ヌルを代入したからって何も問題は解決しないだろうが。

401:デフォルトの名無しさん
10/12/18 13:57:06
>>399 「えーマジマクロ?」「キモーイ」「キャハハ」

402:デフォルトの名無しさん
10/12/18 14:02:20
>>399
それはたとえば auto_ptr ごときと比べても何かメリットがあるのかというレベル。

403:デフォルトの名無しさん
10/12/18 14:23:56
SAFE_RELEASEで十分

404:デフォルトの名無しさん
10/12/18 14:25:26
>>400
だからただのセーフティだよ
初期化だってひょっとすると忘れるかもしれないだろ
忘れてんのにそれっぽく動かれるのと、NULLアクセスで一発で落ちるのと
バグ消ししてる時にどっちがありがたいかって話だよ

405:デフォルトの名無しさん
10/12/18 14:26:18
>>400
これ使った攻撃方法もあるのでセキュリティには注意しましょうね

406:デフォルトの名無しさん
10/12/18 14:28:34
int GetX()
{
return X;
}

void SetX( int _X )
{

X = _X;
}

メンバ変数の代入はこんな感じの関数でおk?
もっとスマートな書き方ある?

407:デフォルトの名無しさん
10/12/18 14:28:44
>>398
こういう単純な未初期化は警告でるな。

408:デフォルトの名無しさん
10/12/18 14:33:23
コーディングスタイルの話題になると、普通に書いてたらそんなミスしないだろ
っていうのに備えて、へんな書き方主張する流れになるな。


409:デフォルトの名無しさん
10/12/18 14:34:51
>>406 予約識別子使わないで

410:デフォルトの名無しさん
10/12/18 14:36:01
>>404 スマポ使えば初期化が抜けることも無い。

411:デフォルトの名無しさん
10/12/18 14:43:09
auto_ptr作ったやつが開発段階で心臓発作で死んで
unique_ptrが最初からstlに入ってればもっと住みやすい世界になっていたのに
だれだよauto_ptrとか作ったバカは切腹しろや

412:デフォルトの名無しさん
10/12/18 14:48:00
auto_ptr 怖がりすぎじゃね?いいやつだよ。
可搬性の広さとオーバーヘッドの小ささでは数あるスマポの中でも最強だろう。

413:デフォルトの名無しさん
10/12/18 14:51:46
いきなり「所有権の移動」なんて概念を持ち込まれても・・・
ていう感じだったしな

414:デフォルトの名無しさん
10/12/18 14:55:02
const auto_ptrでおk

415:デフォルトの名無しさん
10/12/18 16:46:02
参照つかえ

416:デフォルトの名無しさん
10/12/18 16:56:48
VCにて、Unicode文字セット設定でビルドした場合で、
マルチバイト文字の関数を使ってもエラーは出ませんが、
これは非推奨ですか?

417:デフォルトの名無しさん
10/12/18 17:02:23
使ってもいい

418:デフォルトの名無しさん
10/12/18 17:03:43
>>417
ありがとうございます

419:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/18 17:46:37
どうすればよいのか書いてあるじゃないか....ねぇ、日本語読めないの
Outputの設定が悪いんだろ

421:デフォルトの名無しさん
10/12/18 17:55:23
素直にディレクトリの末尾にスラッシュを追加するがよろし

422:デフォルトの名無しさん
10/12/18 17:56:37
法律で文字コード統一してほしい
何年までに移行せよみたいな

423:デフォルトの名無しさん
10/12/18 18:36:45
何で統一すんだよ
unicodeすらアレなのに

424:デフォルトの名無しさん
10/12/19 14:10:16
friendクラスってできれば使わない方が良いんでしょうか?
便利なんですが、設計が悪いのを誤魔化してるんじゃないかという気になってきて・・・

425:デフォルトの名無しさん
10/12/19 14:12:12
自分で設計が悪いと薄々思ってるんならfriendどうこうじゃなしに見直すべきだろう

426:デフォルトの名無しさん
10/12/19 14:25:15
設計段階で結びつきが強いことが解ってるならfriendが最良の解決案で問題ない
オブザーバーとか相互参照してるパターンでfriend使うことが多いかな(毎回使うわけでもないが)
後付とか全然関係ないクラス間でfriend使うのがだめなんだよ

427:デフォルトの名無しさん
10/12/19 16:24:30
friend は operator とか cppunit とか piml とかくらいかなぁ

428:デフォルトの名無しさん
10/12/19 17:03:02
どうしようもなくなって最後は友達に泣きつくって事でしょう。
そうなる前になんとかしないとね。

429:デフォルトの名無しさん
10/12/19 22:12:30
ファクトリクラスをfriendにして
ファクトリクラスを通してしかオブジェクトを生成できないようにしたりとか
そういう使い方もある

430:デフォルトの名無しさん
10/12/19 22:50:39
class Hoge {
public:
class Factory;
private:
/* CTORS */
};

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

でいいじゃんfriendとかダサいよ

431:デフォルトの名無しさん
10/12/20 22:44:10
VISUAL C++でSalTalkのようにテキストをWAVファイルの音声で読み上げるようなプログラミングはできますでしょうか。
外見はwindowsのテキストツールで下に読み上げボタンが付いているようなものです。

432:デフォルトの名無しさん
10/12/20 22:47:34
できる

433:デフォルトの名無しさん
10/12/20 23:09:14
今からはじめるならC++より他言語の方がよくね?w
C#あたりの方が触りやすい気がする

434:デフォルトの名無しさん
10/12/20 23:11:02
連結部の波形合成まで考えると、C#じゃ処理落ちすると思う。

435:デフォルトの名無しさん
10/12/20 23:13:56
その程度で処理落ちするわけない

436:デフォルトの名無しさん
10/12/20 23:14:33
STLやBOOSTつかいまくっても処理速度って維持できる?
ライブラリの挙動を理解してて適切にチューンできるならともかく動くコードがかけるレベルだとどんな感じ?

437:デフォルトの名無しさん
10/12/20 23:18:23
>>436
動くコードが書けるレベルっていうなら
むしろヘタに自力で実装するより素直に使ったほうが速いと思われる

438:デフォルトの名無しさん
10/12/20 23:20:08
間違った使い方をしないなら遅くなることはないと思われる

439:デフォルトの名無しさん
10/12/20 23:20:39
そういうのは99%杞憂
遅かったらそこだけ直せば十分

440:デフォルトの名無しさん
10/12/20 23:25:31
そう言うレベルは何処が遅いかも分からんと思うけどな。
またぞろ、プログラマーなら分かった当たり前と主張するのかw

441:デフォルトの名無しさん
10/12/20 23:25:41
STLやBOOSTより性能いいものって、そんなのそう簡単には作れんぞ
つか、その程度のレベルだと速度云々より安全性が気になるから素直にライブラリ使わせたほうがいいと思う

442:デフォルトの名無しさん
10/12/20 23:26:39
確かに考えてみればC++のライブラリがボトルネックになるほど重たい処理なんてそうそう無いよね

知人にライブラリなんて重くなるから使わんよ、とCライクにコード書くのがいたのでそんなに変わるのか気になったんだ


443:デフォルトの名無しさん
10/12/20 23:29:59
いやいや STLは下手に使うと、オブジェクトの配置換えによるコンスト・ディストの嵐

444:デフォルトの名無しさん
10/12/20 23:31:17
多数のオブジェクトをSTLコンテナで管理したときは直配列とくらべて遅くなったかなぁ
一つ一つは大したこと無いけど積もり積もって遅くなるかんじ

445:デフォルトの名無しさん
10/12/20 23:33:35
ほとんどの場合は積もり積もらないんだよな
積もり積もるところを探し出して直す

446:デフォルトの名無しさん
10/12/20 23:33:45
Cで書いたら速くなるなんてのは処理が簡単な場合だけだよ
boostでやってることをそのままCで再現してかつ速くするにはそれなりの技術がいる
コンパイル時計算のことも考えるとCでは追いつけない場合だって有る

447:デフォルトの名無しさん
10/12/20 23:35:10
だからそれは、熟知している人がうまくboost使った場合だろ

448:デフォルトの名無しさん
10/12/20 23:36:18
くだらないこと気にする前にさっさと完成させてボトルネック直せって感じ

449:デフォルトの名無しさん
10/12/20 23:39:00
ハード屋の尻叩いて高速化させるほうが先決

450:デフォルトの名無しさん
10/12/21 14:43:49
>>447
普通に書くとどう非効率になるの?具体例出してくれない?
変な書き方しなければ boost 使ったからって有意な差が出る程
遅くなる事はまずないと思うんだが

451:デフォルトの名無しさん
10/12/21 15:15:50
初心がboost使った場合どちらかというと意味不明すぎるエラーで死ねると思う

452:デフォルトの名無しさん
10/12/21 15:17:27
template使うとエラー出力が意味不明すぎてもうね

453:デフォルトの名無しさん
10/12/21 18:25:34
boost初心者はまだしも C++初心者なら説明がわからんだろう
他の人のコードを写して,今度はエラーがわからないだろうね

454:デフォルトの名無しさん
10/12/22 00:13:32
boostは何の問題もないが、コンパイルだけが遅くなるのは
なんとかならんか。 ならんだろうなぁ。
結局 実行時に型が決まるからプリコンパイルは出来ないんだよね。
ってエピステメさんとどっかやりとりした記憶が。
人違いだったらごめんなさい。

あ そうそう boost/asio って動いてます?
うちのCentOSにソスから入れてビルドしたら
コンパイルでほげほげなエラーがw

455:デフォルトの名無しさん
10/12/22 00:32:58
日本語でおk

456:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/12/22 08:06:22
エラーがわからなきゃスレに書き込めばいいだけ
頭使えよお前ら

このインターネット時代に全然上級者向きとは言えない

458:デフォルトの名無しさん
10/12/22 08:23:02
Q.100行も書き込めません
A.ちったあ頭使えや

459:デフォルトの名無しさん
10/12/22 11:21:06
>>457
コーディングしてるの? template 関係のエラーを貼り付けて
スレに書き込めってかなり無理があるなぁ
肝心な数行だけなら良いとしてもそれがわかるなら元々悩まんだろうし

460:デフォルトの名無しさん
10/12/22 11:37:03
適当にテキストファイルに書き込んでうpろだにでもあげればいいだろう

461:デフォルトの名無しさん
10/12/22 12:27:17
boost_systemとpthreadをリンクしてないなんていう凡ミスじゃないよね?

462:456
10/12/22 12:28:49
お騒がせしてすみませんでした。
皆さんが使えてるのであれが使い方がヘボいという事で。

463:デフォルトの名無しさん
10/12/22 13:24:53
エラーなんて最初のあたりだけ見れば結構わかるもんなんだけどな

464:デフォルトの名無しさん
10/12/22 13:27:07
テンプレート関係はむしろ最後の方じゃないか?
俺が見てるのがgccの奴だからだろうか

465:デフォルトの名無しさん
10/12/22 13:28:12
エラーメッセージのtemplateクラスを脳内typedefで置き換えていけば割と読める

466:デフォルトの名無しさん
10/12/22 16:54:21
cppメーリングリストで見れない記事があるのは何故だろう

467:デフォルトの名無しさん
10/12/23 02:52:34
boost::tupleと構造体の違い教えてください
タプルのほうが簡潔でよいと思うのですが

468:デフォルトの名無しさん
10/12/23 02:55:03
>>467 構造体のメンバには名前が付けられます。

469:デフォルトの名無しさん
10/12/23 03:01:39
>>468
あ、たしかにそうですね

470:デフォルトの名無しさん
10/12/23 04:25:06
binary_search(vec.begin(),vec.end(),xxx);
という検索で、実際にはもう少し範囲が狭められるのが分かっているので
binary_search(vec[idx],vec.end(),xxx);
とやりたいです。(idxは動的に決まる)
どうすればよいでしょうか?


471:デフォルトの名無しさん
10/12/23 04:29:59
binary_search(vec.begin() + idx, vec.end(), xxx);

472:デフォルトの名無しさん
10/12/23 08:03:43
>>471
動きました。ありがとうございました。


473:デフォルトの名無しさん
10/12/23 08:58:52
binary_search(vec.begin()+idx,vec.end(),xxx);

474:デフォルトの名無しさん
10/12/23 12:09:07
10以下の計算だったらbool使ってもよくないか

475:デフォルトの名無しさん
10/12/23 14:08:50
>>474 使う事の利点は?

476:デフォルトの名無しさん
10/12/23 14:12:36
利点はなんか俺テクニカルでかっこいいと思える事かな

477:デフォルトの名無しさん
10/12/23 16:45:29
スレリンク(tech板:683番)
URLリンク(ideone.com)

478:デフォルトの名無しさん
10/12/27 11:42:34
ファイルストリームのイテレーターの使い方教えてください。

479:デフォルトの名無しさん
10/12/27 12:30:59
>>478
とりあえず使ってみて。わかんなかったらソースを添えて相談しよう。

480:デフォルトの名無しさん
10/12/27 14:43:05
ファイルの終端のイテレーターって引数なしのイテレーターでいいのですか?

481:デフォルトの名無しさん
10/12/27 14:49:42
>>480 URLリンク(ja.lmgtfy.com)

482:デフォルトの名無しさん
10/12/28 18:49:30
以下のように引数の名前とメンバ変数の名前が同じ場合正常に初期化されますが保証されているのですか?
Hoge::Hoge(int no) : no(no){}


483:デフォルトの名無しさん
10/12/28 18:51:37
はい

484:デフォルトの名無しさん
10/12/28 19:12:41
>>483
ども


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch