5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2009/02/10(火) 00:25:51
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1231499251/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


2 :デフォルトの名無しさん:2009/02/10(火) 03:24:45
C++のコードから、ファイルをオープンするときに、
ウィンドウを開いてユーザーにディレクトリを選ばせて、そこから
ファイルを開くようにしたいのですが、どう書けばよいですか?
しょぼい質問ですいませんがお願いします


3 :デフォルトの名無しさん:2009/02/10(火) 03:35:20
C#だったら簡単だよ。

4 :デフォルトの名無しさん:2009/02/10(火) 04:01:04
そんなこといったら全部C#で書けばもっと楽だろうけどなw

5 :デフォルトの名無しさん:2009/02/10(火) 07:43:22
全角空白か 

6 :デフォルトの名無しさん:2009/02/10(火) 09:50:58
他クラス型のメンバをprivateで持つ際、
ヘッダでのクラス宣言時にそのクラスのヘッダまでインクルードして
外に見せているのが違和感あるのですが、これは仕方の無いことなのでしょうか?

それとも、ヘッダでは最初に
class COther;
と宣言だけしておいて、
private:
  COther* m_pOther;
とポインタでメンバを定義して、ヘッダはソース内でインクルードして
実体はコンストラクタでnewするとかの方法のほうが
よく使われるものなのでしょうか?

7 :デフォルトの名無しさん:2009/02/10(火) 10:39:22
>>6
こういう話か?
--OtherClass.h
class OtherClass {
};
--SomeClass.h
#include <OtherClass.h>
class SomeClass {
OtherClass member;
};
--
だとしたら、使う方は#include <SomeClass.h>だけで済むがそれの何が不満なんだ?

8 :デフォルトの名無しさん:2009/02/10(火) 10:41:39
>>6
pimplイディオムだな

9 :デフォルトの名無しさん:2009/02/10(火) 10:53:06
>>7
たとえばクラスをエクスポートするライブラリを作る場合、
そのクラスのメンバに使っているクラスもエクスポートする必要が出てきます。
privateで使っているだけで、利用者側には全く関係無いクラスなのに、
なんでそれらまでエクスポートしなくてはいけないのかと思いました
(カプセル化できてないのではと思いました)。

>>8
この単語は初めて知りました。
さっそく検索してみます。

10 :デフォルトの名無しさん:2009/02/10(火) 12:49:30
基本クラスの純粋仮想メンバ関数を継承クラスで仮想なしで実態を作った場合、
その継承クラスを継承したクラスでオーバーライドすることはもうできないんでしょうか?

11 :デフォルトの名無しさん:2009/02/10(火) 12:54:11
派生クラスでvirtual付けようが付けまいが
基本クラスでvirtualならオーバライドしたものもvirtual

12 :デフォルトの名無しさん:2009/02/10(火) 19:50:17
>>9
インタフェースクラスを作って、
実際にはその実装クラスを new して返す
static メンバ関数を用意する、という手法もある。

// IA.h
class IA {
public:
 static IA* Create();
 virtual ~IA() { }
 virtual void Hoge() = 0;
};

// IA.cpp
#include "IA.h"

class A : public IA {
public:
 virtual void Hoge() { /* ここで実装 */ }
};

IA* IA::Create() { return new A; }

こっちはメンバへのアクセスが楽だという利点と、
public メンバ関数を追加するのが面倒臭いという欠点がある。

13 :デフォルトの名無しさん:2009/02/11(水) 02:20:51
if( a == b && c == d )
でa == bの時点でもうどっちに分岐するか結果出てると思うんですが、この場合c==d計算されないんですか?
if(a==b){
 if(c==d){}
}
こう書いた方が安全ですか?もしa==bがFalseの場合c==dを評価するとエラーになる場合なんです

14 :デフォルトの名無しさん:2009/02/11(水) 02:26:08
>>13
C / C++ において && の左辺が偽なら右辺は評価しないことは
保障されてる

一応例外として、 &&演算子がオーバーロードされてればその限りではない

15 :デフォルトの名無しさん:2009/02/11(水) 02:30:57
どうもです

16 :デフォルトの名無しさん:2009/02/11(水) 02:37:45
型ごとに処理を書いてるんですが、どうしてもテンプレートで書けそうもありません。
そんな状況ってありえますか?頑張っても無理な場合はあるんでしょうか?
//class A
vector< int> vInt;
vector< double> vDouble;
BOOL flag;

//class B
void func(){
 if(A::flag==0){
  A::vInt.resize(0);
 }else{
  A::vDouble.resize(0);
 }
}

このflag値での分岐内の処理がダブってるのを何とかしたいんです

17 :デフォルトの名無しさん:2009/02/11(水) 02:39:22
A::flag==0がコンパイル時に決まる条件ではないなら、無理。

18 :デフォルトの名無しさん:2009/02/11(水) 02:48:48
ダブってるコードが大量にあるなら
テンプレート関数にすれば?

19 :デフォルトの名無しさん:2009/02/11(水) 03:06:00
そうすると今度は引数としてどう渡せばいいのかがわからなくなってしまったんです

// class A
if(flag==0){ // .hに書けないので.cpp
 vector< int> vData = new vector<int>(); // new の書き方が不明
}else{
 vector< double> vData = new vector< double>();
}

// class B
template <typename T>void Func(T, vData){
 vData.resize()
}

20 :デフォルトの名無しさん:2009/02/11(水) 03:09:32
はぁ? 16 と 19 意味が全然違ってるジャン

21 :デフォルトの名無しさん:2009/02/11(水) 03:14:08
型ごとに処理って話ならそもそも

template<typename T>
void func(T t)
{
t.resize(0);
}
じゃだめなの?

22 :デフォルトの名無しさん:2009/02/11(水) 03:52:05
class A{
union {
vector <int> _i(10);
vector <double> _d(10);
} u;
int flag; // 0 or 1
template<T> f0(T u);
void f1(){f0(u._i); 〜;};
void f2(){f0(u._d); 〜;};
void (*f[2])() ={ f1, f2};

void pub(){ (*f[flag])();};
}
19 実現はテンプレ関係なしバージョンで十分

23 :デフォルトの名無しさん:2009/02/11(水) 04:08:29
すごいwハイレベルすぎる
ありがとう

24 :デフォルトの名無しさん:2009/02/11(水) 05:29:22
>>22
vectorは共用体に入れられない

25 :デフォルトの名無しさん:2009/02/11(水) 06:17:08
継承の根底クラスポインタを使った振り分け
B→A:B{<int>}, C:B{<double>}
D{B *b; D(f){f?b = new A: b = new B;}; };

26 :デフォルトの名無しさん:2009/02/11(水) 12:04:43
>>25
俺なら D を用意する変わりに factory 作るだろうな。
そんで map<key, factory> みたいなので get して Create()。

27 :デフォルトの名無しさん:2009/02/11(水) 14:24:46
そもそも実行時の型判断を望んでるのかどうか本人が理解してないのかも
もしかしたらテンプレートクラスで済む話なのかもしれない。

28 :デフォルトの名無しさん:2009/02/11(水) 14:29:09
つか、フラグで使い分けるような、int配列と double配列を
一つのクラス内に持たせていることが疑問。
設計がおかしい。

29 :デフォルトの名無しさん:2009/02/11(水) 14:55:48
int func(int a)
{
if(a>10)
a=10;
return a+1;
}
のように引数で渡された変数を変更しても問題ありませんか?

30 :デフォルトの名無しさん:2009/02/11(水) 14:59:21
>>29
大丈夫

31 :デフォルトの名無しさん:2009/02/11(水) 20:01:43
>>29
大丈夫ではあるけど、
関数内で二度と a の元の値を使えなくなってしまうので注意。
後になって処理を追加した際に、
途中で値が変更されてるのを忘れて処理を追加して
上手く動かねーとかなるといけないから、
なるべくなら別変数を作った方が好ましいし、
それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。

32 :デフォルトの名無しさん:2009/02/11(水) 20:28:26
>>30-31
ありがとうございます

33 :デフォルトの名無しさん:2009/02/11(水) 21:19:28
int func(int& a, int* b = &a)
{
if(a>10)
a=10;
return *b++;
}


34 :デフォルトの名無しさん:2009/02/11(水) 21:44:16
int func(const int a){ return (a>10)? 10+1: a+1; }

wwww


35 :デフォルトの名無しさん:2009/02/13(金) 23:05:14
急に過疎ってどうしたんだ?

36 :デフォルトの名無しさん:2009/02/13(金) 23:29:01
春だからさ・・・・・

37 :デフォルトの名無しさん:2009/02/14(土) 02:10:04
Cとgrassのハイブリッド言語かと思った。

38 :デフォルトの名無しさん:2009/02/14(土) 02:43:26
grass と 常用単語の堺は3文字あたりから?

void fp(int (*s)[8]);
void fr(int& s[8]);

any(){
int s[8];
int sx[32][8];
int* sp[8];
int* sxp[32][8];
int o[16];
enum{a...b=32}x;

fp(&s);
fp(&(sx[x]));
fp(sp);
fp(*(sxp[x]));
fp(&((int*[8])o));
fr(s);
fr(sx[x]);
fr(*sp);
fr(**(sxp[x]));
fr(*((int*[8])o));
}
どっかに考え方が判り易くまとまった資料ない?
正解不正解はコンパイル通してみるまで判らない自分。


39 :デフォルトの名無しさん:2009/02/14(土) 03:23:09
windowsアプリケーションなんですが
Borland C Compiler 5.5にて
MAKELONGマクロが警告にひっかかってしまいます。
windef.hの定義を見るに括弧が足りないのが原因のようです。
これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?

40 :デフォルトの名無しさん:2009/02/14(土) 07:52:34
>>39
windef.hのミスだね
本家のWinDef.hは括弧が多かった
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))


41 :デフォルトの名無しさん:2009/02/14(土) 07:55:25
調べなおしてみたらVC+2008EEに付属のSDKは括弧が多かったが昔のPlatformSDKのは少なかったわ


42 :39:2009/02/14(土) 11:12:03
>>40-41
ありがとうございます。
MAKELONGを(あとMAKEWORDも)
#undefして括弧増やした#defineしなおしてもいいもんでしょうかね?

43 :デフォルトの名無しさん:2009/02/14(土) 11:43:07
>>42
しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ
簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか



44 :43:2009/02/14(土) 11:45:56
( B << 16 )に括弧が必要
の間違いでした

45 :39:2009/02/14(土) 12:34:59
>>43-44
どうもでした。

46 :デフォルトの名無しさん:2009/02/15(日) 08:59:26
LPTSTRを使って
char hoge[40];
みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?


47 :デフォルトの名無しさん:2009/02/15(日) 09:13:07
TCHAR s[40];
がいいかな

48 :デフォルトの名無しさん:2009/02/15(日) 09:18:16
ありがとうです。
それでできました!


49 :デフォルトの名無しさん:2009/02/15(日) 09:24:24
もう一個だけ質問させてください。
_T("ddd");
TEXT("ddd");
これって書き方が違うだけで同じですか?


50 :デフォルトの名無しさん:2009/02/15(日) 09:39:22
同じ。
強いて言うなら、前者はCライブラリの拡張で、後者はWin32。
ちなみに前者のバリエーションで_TEXTもある。

51 :デフォルトの名無しさん:2009/02/15(日) 23:26:08
ありがとうございます。なるほど。
TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。


52 :デフォルトの名無しさん:2009/02/15(日) 23:33:30
背景とカーソルを同時に表示しようと思うんですが、
その画像をまとめてメモリデバイスコンテキストに選択して、
「最終的に表示する画面」を先に作る方法が分からないので、
どなたか教えていただけないでしょうか。

環境は WinAPIです。

よろしくおねがいします

53 :デフォルトの名無しさん:2009/02/16(月) 00:09:31
それはカーソルじゃなくてキャレットのことかね?

54 :デフォルトの名無しさん:2009/02/16(月) 00:45:17
関数の引数に関数を渡すことはできませんか?
処理の途中で指定した関数を入れたいんです。

55 :デフォルトの名無しさん:2009/02/16(月) 00:46:34
>>54
関数ポインタというのがあってだな

56 :デフォルトの名無しさん:2009/02/16(月) 00:51:08
thx出てきました!

57 :デフォルトの名無しさん:2009/02/16(月) 01:02:45
// class A
void Func(){}
X.pfFunc = Func;

// class X
void (*pfFunc)();
void Shori(void pfFunc()){
(*pfFunc)();

これどうやって引数に渡す時と、使うとき書けばいいですか?



58 :デフォルトの名無しさん:2009/02/16(月) 01:09:27
>>53
すいません言い方が悪かったです

画像2枚だと考えてください
背景の画像と 矢印の画像です。

よろしくおねがいします

59 :デフォルトの名無しさん:2009/02/16(月) 01:51:58
>>58
WinAPIスレにでもどうぞ。

>>57
メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。
「メンバ関数のポインタ」とでもして、検索してみることをお勧め。

60 :デフォルトの名無しさん:2009/02/16(月) 03:19:29
コンストラクタってパブリックにしないとだめですよね?
newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?

61 :デフォルトの名無しさん:2009/02/16(月) 03:53:17
ポインタは使い終わったらNULLしたほうがいいんですか?
NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか?
というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?

62 :デフォルトの名無しさん:2009/02/16(月) 04:04:37
>>61
NULLするってなんだよ?

63 :デフォルトの名無しさん:2009/02/16(月) 04:08:33
>>61
どうやんお? でちょっと笑た

ポインタとメモリの動的確保についてもーちょい学ぶべき
NULLするってのはNULL入れるってことかい

64 :デフォルトの名無しさん:2009/02/16(月) 04:12:26
ポインタはオマエ自身から持つ手綱
データはペットの犬
手綱は他人のペットにも付けられるが そのペットは苦しい。

自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが
他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。
他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が

65 :デフォルトの名無しさん:2009/02/16(月) 04:22:53
難読Cコンテストを思い出した

66 :デフォルトの名無しさん:2009/02/16(月) 04:28:14
メンバ関数ポインタは入れる時と使うときクラス名が必要なことがわかりました!
これじゃあライブラリとして使えなく無いですか?
設計を見直せですか?

67 :デフォルトの名無しさん:2009/02/16(月) 04:29:23
定数へのポインタは渋谷のハチ公に首輪をつけるようなもの
全くの無意味ではないが楽しく一緒に遊んでくれない。

土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。
だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある

68 :デフォルトの名無しさん:2009/02/16(月) 04:37:03
やばい
全く集中できなくなった

69 :デフォルトの名無しさん:2009/02/16(月) 05:07:23
関数の中で
static int a = 0;
とした場合このaは関数を抜けても保持されるんでしょうか?
起動時最初の一回しか変数が存在しないことになるんでしょうか?

70 :デフォルトの名無しさん:2009/02/16(月) 05:38:57
>>69
スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える

だからアドレスを渡して関数外からアクセスしようが問題ない



71 :デフォルトの名無しさん:2009/02/16(月) 06:06:42
ありがとうございます!!!
>>60>>61>>66
もお願いします!

72 :デフォルトの名無しさん:2009/02/16(月) 06:50:02
構造体の配列を引数に渡して使うにはどうすれば書けばいいでしょうか

structA a[] = { { 1, 2, }, {3, 4,}, };

//ClassX.h
Class* Z;

//ClassX.cpp
Z = new ClassZ();
Z->func(a);

//ClassZ.h
void func(structA bufa);

//ClassZ.cpp
func(structA bufa){
sizeof(bufa);
}

このときsizeofで帰ってくる値はどういう値ですか?

73 :デフォルトの名無しさん:2009/02/16(月) 06:57:12
>>72
structAが何バイトか(C99だとそういいきれないけど別にいいだろう)


配列渡すなら

void func(structA bufa[]);
//ClassZ.cpp
func(structA bufa[]){
sizeof(bufa);
}

とでもすればいい、ただしこれは

void func(structA *bufa);
//ClassZ.cpp
func(structA *bufa){
sizeof(bufa);
}
と等価なのでsizeof(bufa)はどちらもポインタのサイズになる(配列のサイズではない)

74 :デフォルトの名無しさん:2009/02/16(月) 07:12:22
構造体の各値がintだとすると
{ { 1, 2, }, {3, 4,}, }

4個*4バイト=16バイト
が返るようにするにはどうすればいいですか?

[]付けたんですけど
funcの中で

structA b[];
b = bufa;

としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか

75 :デフォルトの名無しさん:2009/02/16(月) 07:24:43
structA b[100];
bに代入はできない
b[0] = とかはできるけど


76 :デフォルトの名無しさん:2009/02/16(月) 07:27:03
>>66
C# の delegate を参考にしてみれ。

class delegate {
public:
 virtual ~delegate() { }
 virtual void operator()() = 0;
};

template <typename T>
class delegateT : public delegate {
public:
 typedef void (T::*Mfn)();
 delegateT(T* obj, Mfn mfn) : m_obj(obj), m_mfn(mfn) { }
 virtual void operator()() { (m_obj->*m_mfn)(); }
private:
 T* m_obj;
 Mfn m_mfn;
};

77 :デフォルトの名無しさん:2009/02/16(月) 07:31:00
boost::bind.hpp
boost::function.hpp
を使うとか


78 :デフォルトの名無しさん:2009/02/16(月) 10:57:01
>>75
C++でも出来ないとこってあるんですね
サイズは送り元で計算して引数は増えますが一緒におくることにしました。
受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、
サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。
が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?

79 :デフォルトの名無しさん:2009/02/16(月) 12:11:20
C#の中のコード全然意味わかりません
boost調べたら簡単にできました。
ありがとうです!

//classA
CC* pC;
CB* pB;
pB->Func(bind(&CC::Update, ref(pC)));

//classB
void CB::Func(function<void ()> f_buf)
{
f_buf();
}

// classC
void CC::Update(){}

80 :デフォルトの名無しさん:2009/02/16(月) 12:38:17
いややっぱりなにも進展してませんでした
function<void ()> f_buf

function<int ()> f_buf
だったり
function<bool ()> f_buf
だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか?
メンバ関数ポインタと結局同じなことに気づきました・・・

81 :デフォルトの名無しさん:2009/02/16(月) 12:39:55
operator()()
これはどういう意味なんでしょうか

82 :デフォルトの名無しさん:2009/02/16(月) 12:49:04
>>81
関数オブジェクトでぐぐったら使い方含めてわかるかもよ

83 :デフォルトの名無しさん:2009/02/16(月) 13:16:23
>>60
こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。
class Hoge
{
public:
static Hoge* Craete(int x) {return new Hoge(x);}
private:
Hoge(int);
}

84 :デフォルトの名無しさん:2009/02/16(月) 13:19:07
出来そうな気がしてきました。
実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、
クラスの変数();
とすれば処理が実行されるということですね
ありがとうございました。

85 :デフォルトの名無しさん:2009/02/16(月) 13:20:31
>>80
実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。
戻り値を見ないなら全部function<void ()>型にすればいい。

86 :デフォルトの名無しさん:2009/02/17(火) 16:24:20
sprintfの逆のことをしたいのですがそういう関数なかったでしょうか?
char str[]="年齢は10,性別は男";
例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると
age=10,sex=男が得られるようにする関数です。
よろしくお願いします。

87 :デフォルトの名無しさん:2009/02/17(火) 16:26:24
sscanf のこと?

88 :デフォルトの名無しさん:2009/02/17(火) 16:40:27
>>87
それです。^^;
あったような気がしていたのですがprintが
入っている名前の関数だと思い込んで探していました。
助かりました。ありがとうございました。

89 :デフォルトの名無しさん:2009/02/18(水) 11:39:57
コールバック関数が今だに理解できないです。教えてください。

90 :43:2009/02/18(水) 11:43:30
>>89
関数ポインタはわかるか

91 :デフォルトの名無しさん:2009/02/18(水) 12:00:21
わかります。
void Func(){}
void * f = Func;
(*f)();

92 :デフォルトの名無しさん:2009/02/18(水) 12:03:45
オブジェクトを作成するアプリケーションのインスタンスハンドルが必要だとヘルプに書いてあるんですが
この場合thisを入れればいいんですか?

93 :43:2009/02/18(水) 12:22:54
>>91
コールバック関数のポインタを引数にして渡す
#include <stdio.h>

/* callback用関数 1*/
int add(int a, int b)
{
return a+b;
}
/* callback用関数 2*/
int sub(int a, int b)
{
return a-b;
}
void func(int (*callback)(int, int))
{
int x = callback(1, 2);
printf("%d\n", x);
}
int main(void)
{
/* "addへコールバックしてね" */
func(add);
/* "subへコールバックしてね" */
func(sub);
return 0;
}


94 :デフォルトの名無しさん:2009/02/18(水) 12:26:57
>>92
状況によるだろう。
でもハンドルと書いてあるからthisはないと思うよ。
なんとなく、hInstanceいれるとこみたいだが。

95 :デフォルトの名無しさん:2009/02/18(水) 12:38:56
>>93
ありがとうです!
その場合CALLBACKがつくのはどれなんでしょうか
メンバ関数もコールバックとして渡せるんですか?

96 :デフォルトの名無しさん:2009/02/18(水) 12:41:45
Win32アプリの
LRESULT CALLBACK WndProc
はまた別物ですか?

97 :デフォルトの名無しさん:2009/02/18(水) 14:22:14
WaitForSingleObjectは普通マルチスレッドで使うんですよね?
勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?

98 :デフォルトの名無しさん:2009/02/18(水) 14:25:43
まあそうだが、シングルスレッドでもオブジェクトがシグナル状態か確認する時も使う。

99 :デフォルトの名無しさん:2009/02/18(水) 14:43:22
>>96
CALLBACKがどう#defineされてるか見てみるといい

100 :デフォルトの名無しさん:2009/02/18(水) 14:49:12
gdb 用のGUI ツールお勧め教えて
class 関連 CUI じゃツライす

101 :43:2009/02/18(水) 16:26:59
>>95
コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ
メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない

102 :デフォルトの名無しさん:2009/02/18(水) 17:09:50
>>96
そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う

103 :デフォルトの名無しさん:2009/02/18(水) 20:51:27
struct V4 {
 union {
  struct { float x, y, z, w; };
  float m[4];
 };
};
と書いた時、
xのアドレス == &m[0] 、yのアドレス == &m[1]、 …
になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?

104 :デフォルトの名無しさん:2009/02/18(水) 21:43:59
xのアドレス == &m[0]だけは保証されてる
あとはコンパイラ次第

105 :デフォルトの名無しさん:2009/02/18(水) 21:45:58
>>96
LRESULTは戻り値の型、>>91でのvoid、
WndProcは関数名、>>91でのFuncにあたる。
CALLBACKは他の人の言うとおり。

106 :デフォルトの名無しさん:2009/02/18(水) 21:46:44
キーボード押しっぱなし時のWM_KEYDOWNは、一回発行された後に
少し時間を置いてから連続で発行されるんですか?

キーボードからの入力でキャラクタを動かしているのですが、
キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応
→キャラクタが連続で動く、となってしまいます。

ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる
処理をしたいのですが・・

107 :デフォルトの名無しさん:2009/02/18(水) 21:53:06
>>106
GetAsyncKeyState

108 :デフォルトの名無しさん:2009/02/18(水) 22:08:17
>>107
こんな便利なものが・・・
ありがとうございます。

109 :デフォルトの名無しさん:2009/02/19(木) 04:45:06
マルチスレッドの関数はグローバル領域に作ったほうがいいですか?
クラスの中に入れるとめたくそ難しいんですが

110 :デフォルトの名無しさん:2009/02/19(木) 05:12:32
難しいと思うのならクラス内に作らなくても構いません。

111 :デフォルトの名無しさん:2009/02/19(木) 05:24:48
なんでメンバ関数だとコンパイルできないんですか?
静的関数ならいんでしょうか

112 :デフォルトの名無しさん:2009/02/19(木) 05:34:41
そりゃぁ、スレッド生成するAPIがクラスに対応してなければインスタンスへのポインタ(this)を渡せませんから。
thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。

まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。

113 :デフォルトの名無しさん:2009/02/19(木) 05:55:23
いやいります。見捨てないでください

AfxBeginThread(CView::Proc, this);

//h
static UINT __cdecl Proc( LPVOID pParam );
static UINT __cdecl ProcAfter( LPVOID pParam );

//cpp
UINT CView::Proc( LPVOID pParam )
{
 CView *const this_ptr = (CView *)pParam;
 return this_ptr->ProcAfter();
}
UINT CView::ProcAfter( LPVOID pParam )
{
 //実際にマルチスレッドで実行したい処理
}

なぜこう書かないといけないのかが理解できません。直接
AfxBeginThread(CView::ProcAfter, this);
こうしたいんですが、エラー出まくります。&CView::ProcAfterにしろとか、やっても仮想関数だとかになるんです。
Afxじゃくても_beginthreadexでも同じなんです。マルチスレッドをクラスのメンバでやるのはそうとう強引で特殊ですか?

114 :デフォルトの名無しさん:2009/02/19(木) 06:19:42
>>113
にほんごよめますか?

>112
>まぁ、環境も書かなきゃエラーメッセージも書かないということは

115 :デフォルトの名無しさん:2009/02/19(木) 13:37:43
Win32アプリのメッセージループ内で独自の処理をする時クラスのインスタンスとかを作るのはどこがいいんですか?
ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です

116 :デフォルトの名無しさん:2009/02/19(木) 13:42:45
#define _T("test.txt") fileName
マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。
どう書けばいいんですか?

117 :デフォルトの名無しさん:2009/02/19(木) 13:56:14
あきらかに変だがどう使いたいわけ?

118 :デフォルトの名無しさん:2009/02/19(木) 14:19:28
文字を置き換えたいだけです。
プログラム中のどこだかわからなくなるので
先頭に置いてファイル名を変えられるようにしたいんです

119 :デフォルトの名無しさん:2009/02/19(木) 14:38:07
だったら逆だろ?
#define filename _T("test.txt")

120 :デフォルトの名無しさん:2009/02/19(木) 14:56:56
逆でしたか!どうもです

121 :デフォルトの名無しさん:2009/02/19(木) 17:46:10
>>113
(非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない
という点はエラーメッセージの言うとおり。

そうやってメンバ関数へのポインタを得たところで、>>113のようにできないわけは、
メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。
その主な理由は、仮想関数にもきちんと対応しないといけないことから。

メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。

122 :デフォルトの名無しさん:2009/02/19(木) 17:47:35
というわけでやってみた。普通は関数オブジェクトを引数にすべきだろうけど。改行制限厳しい。VC++ 2008。SP1ならもう少し簡単になる。
#include <utility>
#include <memory>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <atlbase.h>
class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}};
template<typename T>
UINT __stdcall beginthread2_entry(void* p) {
  typedef std::pair<T*, UINT (T::*)()> thread_data_t;
  thread_data_t* ptd = static_cast<thread_data_t*>(p);
  T* px = ptd->first;
  mem_fn_t mf = ptd->second;
  delete ptd;
  return (px->*mf)();
}
template<typename T>
HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) {
  typedef std::pair<T*, UINT (T::*)()> thread_data_t;
  std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn));
  uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0);
  if (ret != 0)
    ptd.release();
  return reinterpret_cast<HANDLE>(ret);
}
int main() {
  Hoge hoge;
  ATL::CHandle h(beginthread2(hoge, &Hoge::Proc));
  if (h != 0)
    WaitForSingleObject(h, INFINITE);
}

123 :デフォルトの名無しさん:2009/02/19(木) 18:10:21
AfxBeginThread(boost::bind(&CView::ProcAfter, boost::ref(CView), this);
これでよくね?

124 :デフォルトの名無しさん:2009/02/19(木) 18:50:29
LPSTRからLPCWSTRに変換するにはどうすればいいでしょうか

125 :デフォルトの名無しさん:2009/02/19(木) 19:50:16
>>124
Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。
無いなら、MultiByteToWideChar使え。

126 :デフォルトの名無しさん:2009/02/19(木) 19:50:41
>>123
AfxBeginThreadって関数オブジェクト引数に取れるのか?

127 :デフォルトの名無しさん:2009/02/20(金) 10:01:57
>>122
難しすぎて誰もわからないに一票

128 :デフォルトの名無しさん:2009/02/20(金) 10:33:23
だいたい なんでメンバ関数に固執するんだろう?
インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?

129 :デフォルトの名無しさん:2009/02/20(金) 14:14:09
以下のソースで、読み込んだデータの改行コードが削除されてしまう。
istream_iteratorを使ってるせい?
環境はmingw(gcc 4.3.3)

ifstream fin("data.bin", ios::in | ios::binary);
if (fin.good()) {
  typedef vector<char> Data;
  istream_iterator<char> begin(fin), end;
  shared_ptr<Data> data(new Data(begin, end));
}

130 :デフォルトの名無しさん:2009/02/20(金) 14:15:53
>>129 istreambuf_iterator

131 :デフォルトの名無しさん:2009/02/20(金) 14:19:08
>>130
それだ!どうもありがとう。ペコリ。

132 :デフォルトの名無しさん:2009/02/21(土) 09:23:53
!って人が使ってるの見てはじめて気づいた
すごいいらいらする


133 :デフォルトの名無しさん:2009/02/21(土) 11:02:58
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!! !!!!!!!   !!!!!!!!!!!!!!!! !!!!!!!   !!!!!!!!
!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!! ! !!!!!!     !!!!!!!! ! !!!!!!     !!!!!!
!!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!!
!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!
!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
しますか?

134 :デフォルトの名無しさん:2009/02/21(土) 11:44:57
VS2005 C++でWindows Mobileの開発してます(CはDOS以来の初心者です)。
頻繁に呼ばれる文字列処理をする関数内の最初のオート変数として
void hoge(void){
TCHAR szReadBuf[2048];
の様な宣言をしているのですが、この処理を呼んでるループ処理辺りで
[Stack fault] Thread= といった様なエラーがでるので
void hoge(void){
static TCHAR szReadBuf[2048];
ZeroMemory(szReadBuf, sizeof(szReadBuf));
の様に解放されない処理にした所、最初のコード時より幾分か多く回せるようになりました。
そうゆうもんでしょうか?

135 :デフォルトの名無しさん:2009/02/21(土) 11:54:54
>>134
スタック領域は特にモバイルなら大きく取られていないことが多いので、
2048要素の配列で溢れてしまったのでしょう。
後者なら、スタックは消費しないのでその点は大丈夫です。

それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。
# 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。

136 :デフォルトの名無しさん:2009/02/21(土) 12:36:50
早速ありがとう御座います。
前者はその下でこのようにしてます。
szReadBuf[0]='\0';
後者でもこうすべきですね?
内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が
残ってると紛らわしいのでZeroMemoryしてました。

あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが
ZeroMemoryで無いほうがいいのでしょうか?

137 :デフォルトの名無しさん:2009/02/21(土) 12:45:23
連投すいません
訂正)
× 前回内容が残ってると紛らわしいのでZeroMemoryしてました。
○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。


138 :デフォルトの名無しさん:2009/02/21(土) 13:16:23
BC++です。
クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを
コンパイルするとUnresolved external '_main'となってしまいます。
一つにまとめて書くしかないのでしょうか?

139 :デフォルトの名無しさん:2009/02/21(土) 14:01:03
「EXE 作る気はないぜオプション」をBCCに渡す。

140 :デフォルトの名無しさん:2009/02/21(土) 14:57:58
-cを付けたらいきました。
ありがとうございます。

141 :デフォルトの名無しさん:2009/02/21(土) 15:50:40
>>136
初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?

142 :134:2009/02/21(土) 16:06:00
>>135 >>141
ありがとうございます。
とりあえず、今のレベルはエラー無く動かす事が目標なので、余裕がでたら考えたいと思います。

143 :デフォルトの名無しさん:2009/02/21(土) 16:06:40
memsetだとなんでダメなの?

144 :デフォルトの名無しさん:2009/02/21(土) 16:16:15
C++厨はmemset大嫌いだから

Cプログラマはmemsetが使える場面をいつも血眼で探してるから
C++作法に改宗する時に一番拒むのがここだよな

145 :デフォルトの名無しさん:2009/02/21(土) 16:27:38
memsetいいじゃん
初期化楽だし
俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし

146 :デフォルトの名無しさん:2009/02/21(土) 16:35:24
C++厨は全部のメンバを代入文で初期化してんの?

147 :デフォルトの名無しさん:2009/02/21(土) 16:36:31
あ、馬鹿が居る。

148 :デフォルトの名無しさん:2009/02/21(土) 16:36:42
メンバ初期化子に決まってるだろ

149 :デフォルトの名無しさん:2009/02/21(土) 16:49:31
C厨はポインタもmemsetで初期化してんのか?

150 :デフォルトの名無しさん:2009/02/21(土) 16:51:45
>>122
大先生、なんか凄いことしてるみたいだから、一部修正してVC2005でコンパイルしてみたけど、
できないよYo。どうすれば良い?
#include <utility>
#include <memory>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <functional>
#include <atlbase.h>

class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}};
template<typename T>
UINT __stdcall beginthread2_entry(void* p) {
typedef std::pair<T*, UINT (T::*)()> thread_data_t;
thread_data_t* ptd = static_cast<thread_data_t*>(p);
T* px = ptd->first;
std::mem_fun_t<UINT, T> mf(ptd->second);
delete ptd;
return (px->*mf)(); // <======C2297: '->*' : 無効です。右オペランドには型 'std::mem_fun_t<_Result,_Ty>' が指定されています。
}
// To be continued

151 :デフォルトの名無しさん:2009/02/21(土) 16:52:10
template<typename T>
HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) {
typedef std::pair<T*, UINT (T::*)()> thread_data_t;
std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn));
uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0);
if (ret != 0)
ptd.release();
return reinterpret_cast<HANDLE>(ret);
}
int main() {
Hoge hoge;
ATL::CHandle h(beginthread2(hoge, &Hoge::Proc));
if (h != 0)
WaitForSingleObject(h, INFINITE);
}


152 :デフォルトの名無しさん:2009/02/21(土) 17:21:28
すまん。元の122のコードのmem_fn_tのmem_fn_t mf = ptd->second;の行は
UINT (T::*mf)() = ptd->second;が正しい。
改行制限でtypedefをやめたのに直すのを忘れていたみたいだ。

そしたらVC++2005でも通る。

153 :デフォルトの名無しさん:2009/02/21(土) 17:46:34
>>152
超早いレス熱烈感謝あげ
typedef UINT (T::*mem_fn_t)();
が抜けていたんですか
mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた

154 :デフォルトの名無しさん:2009/02/21(土) 17:55:31
>>141は医者か

155 :150,152:2009/02/21(土) 18:25:38
>>150
あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ
でオブジェクトを指定するっての忘れてたYo,orz
return mf(px); が正解だな



156 :デフォルトの名無しさん:2009/02/21(土) 18:44:46
C++で可変長引数の関数を作るときは、Cと同じように
#include <stdarg.h>
とやって、
va_list, va_arg
を使えばいいでしょうか?


157 :デフォルトの名無しさん:2009/02/21(土) 19:06:54
Cと同じでおk
ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な

158 :デフォルトの名無しさん:2009/02/21(土) 20:25:07
↓がg++4なら通るけどVC9など通らない。
これって自分何か勘違いしてますか?VC9のバグってことはありませんか?

struct MyClass {
int value;
void set_value(int v) { value = v; }
int get_value(void) const { return value; }
};
vector<std::tr1::shared_ptr<MyClass> > v;
...vに適当に要素を入れる...
for_each(v.begin(), v.end(),
std::tr1::bind(&MyClass::set_value, std::tr1::placeholders::_1,
std::tr1::bind(&MyClass::get_value, std::tr1::placeholders::_1)));
// bindでintがint&に変えられないというエラー

159 :デフォルトの名無しさん:2009/02/22(日) 10:48:07
参照変数の初期化の右辺値で三項演算子使うのはマトモな所業の範疇?

160 :デフォルトの名無しさん:2009/02/22(日) 12:13:57
右辺値じゃなくて右辺だな。
A ? B : C の B と C が両方左辺値なら問題ないし、
const 参照なら右辺値でも問題ない。

161 :デフォルトの名無しさん:2009/02/22(日) 20:58:16
C++ コーディングスタンダードで、

int n;
if (cond) n = X;
else n = Y;

みたいにするなら、

int n = cond ? X : Y;

のほうがいいって書いてあったよな。


162 :デフォルトの名無しさん:2009/02/22(日) 21:38:05
cond次第だろ

163 :デフォルトの名無しさん:2009/02/22(日) 22:39:03
参照だとそもそも if-else が使えないから
? : を使わざるを得ないけどね。

164 :デフォルトの名無しさん:2009/02/23(月) 00:53:15
int n = Y;
if (cond) n = X;

変数には初期値いれとこうぜ

165 :デフォルトの名無しさん:2009/02/23(月) 01:06:47
俺のソースは>>161,164のすべてを気分で使い分けて、
ソースを読む人間を翻弄する

166 :デフォルトの名無しさん:2009/02/23(月) 09:12:42
テンプレートクラスのコンストラクタ引数にその実態クラスのstaticメンバを使用する記述は問題ない?

template<T> class BB{
BB(const T &);
static const T func(T a){retunr a + 1;};
};

int x = 0;
BB<int> i(i.func(x)); // BB<int> i(BB<int>::func(x)); と同じ意味になる筈

167 :デフォルトの名無しさん:2009/02/23(月) 20:33:23
質問ですが、例えば"net localgroup Administrators GroupX"というコマンドを
C++で実現するにはどうすればいいでしょうか?
一応自分なりに調べましたが、ShellExecute()やCreateProcess()を使うのは
個人的に美しくないかな、、、と思います。
知人に相談したら、vbsで
set objShell = WScript.CreateObject("WScript.Shell")
objShell.Exec "net localhost〜"
ってやればいいんじゃない、とアドバイスを受けましたが、
vbsは全くわかららず、正直、自分でメンテナンスできるとは思えません。
C++のライブラリ関数で実現する方法があったら教授お願いします。

C言語では組み込み系を少しやっていました。
最近、C++でちょっとしたwindows用のプログラムを作ることになりました。
C++は初心者レベルだと思います。
開発環境はwindows XP + Visual studioです。
よろしくお願いします。

168 :デフォルトの名無しさん:2009/02/23(月) 20:38:57
C++のライブラリにはないから、
APIをたたくしかないな。Win32スレに行ってみたら。


169 :デフォルトの名無しさん:2009/02/23(月) 20:40:47
>>167
プロセスを起動するのはOSの役割なのでOSのAPIを使う
って頭になれば問題ない

170 :デフォルトの名無しさん:2009/02/23(月) 20:43:22
>>167
騙されているぞ。
そのVBSのコードはShellExecuteを呼ぶのと同じだ。

171 :デフォルトの名無しさん:2009/02/23(月) 21:11:43
>>167です。
>>168-170 回答ありがとうございました。
C++のライブラリにはないのですね。
なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな
という浅い考えで、ライブラリを使いたいと思っていました。

>>168さんの忠告どおりWin32スレに行こうと思いますが、
もうちょっと自分でWin32を調べてからにしたいと思います。
正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、
(結局、>>169さんの忠告どおり、割り切りそうな気がしますが)
>>170さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、
っていう感じだったので、悪意はなかったと思います

どうもありがとうございました。

172 :デフォルトの名無しさん:2009/02/23(月) 22:04:01
コンソールアプリケーションで実用的なプログラムってありますか?
C++で学んだことを生かす練習のためにもなにか作りたいのですが・・

173 :デフォルトの名無しさん:2009/02/23(月) 22:10:57
>>172
コンパイラ&リンカ

174 :デフォルトの名無しさん:2009/02/23(月) 22:41:03
>>173
ありがとうございます
自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います

175 :デフォルトの名無しさん:2009/02/24(火) 10:15:53
圧縮アルゴリズムおもろいよ

176 :デフォルトの名無しさん:2009/02/24(火) 15:37:21
構造体A(メンバchar a , int b)をsizeofした値を求めろって問題は
5と8どちらを答えるべきなんですかね。
パディングも含めた値が実際の答えなのでしょうか?

177 :デフォルトの名無しさん:2009/02/24(火) 15:43:08
intのサイズすら環境依存でFA

178 :デフォルトの名無しさん:2009/02/24(火) 16:17:40
>>176
答えはsizeof( A )だろ


179 :デフォルトの名無しさん:2009/02/24(火) 19:12:55
>>178
お前まぢ頭いいな

180 :デフォルトの名無しさん:2009/02/24(火) 19:43:18
('A`)に見えた


181 :デフォルトの名無しさん:2009/02/24(火) 19:44:54
sizeof に目がなくて

182 :デフォルトの名無しさん:2009/02/24(火) 20:08:55
sizeof('A`)だと8なのでやはり8が答えみたいですね
ありがとうございました。

183 :デフォルトの名無しさん:2009/02/24(火) 22:27:13
>>182
俺の環境では5になるんだが

184 :デフォルトの名無しさん:2009/02/24(火) 23:19:58
>>182 環境依存
#include<stdio.h>

#define MACRO(type) printf("sizeof(%s)=%d\n", #type, sizeof(type))

#pragma pack(push, 1)
struct pack1{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 2)
struct pack2{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 4)
struct pack4{
char a;
int b;
};
#pragma pack(pop)

int main(void){
MACRO(struct pack1);
MACRO(struct pack2);
MACRO(struct pack4);
return 0;
}

185 :デフォルトの名無しさん:2009/02/25(水) 01:13:18
なんと…
処理系依存なのでどれも正解ということですか!
コードまでご丁寧にありがとうございました。


186 :デフォルトの名無しさん:2009/02/25(水) 09:51:49
処理系というか、自分で決められるといった方が正しい

187 :デフォルトの名無しさん:2009/02/25(水) 11:38:22
#include <stdio.h>
#include <string.h>

struct address{
char name[20];
char jusyo[21];
int age;
};

int main(void)
{
struct address abc;

int s = 1;
if(s = 1){
char name[30];
char jusyo[70];
int age;

printf("名前? "); scanf("%s", &name);
printf("住所? "); scanf("%s", &jusyo);
printf("年齢? "); scanf("%d", &age);

abc.age = age;
strcpy(abc.name, jusyo);
}
return(0);
}
C言語を学習しています。
上プログラムでキーボードから日本語を入力し出力させたいのですが、どうすればいいのでしょうか?
Cygwinを使っています。


188 :デフォルトの名無しさん:2009/02/25(水) 11:47:00
printf使えば良い

189 :デフォルトの名無しさん:2009/02/25(水) 11:47:45
>>187
やったことないけど
http://pinoki.la.coocan.jp/wiki/?Cygwin%2FInstall%2F%C6%FC%CB%DC%B8%EC%B2%BD


190 :デフォルトの名無しさん:2009/02/25(水) 12:08:46
>>187
cygwin自体が日本語の入出力をできない状態なら>189へ。
gccのコンパイルオプションについて知りたいならcygwinスレへ。
まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。
使わないに越したことはないが、scanf("%29s", name)とするのが無難。

191 :デフォルトの名無しさん:2009/02/25(水) 12:11:18
構造体のメンバとローカル変数の配列サイズが違うじゃん。それは拙いっしょ。

192 :デフォルトの名無しさん:2009/02/25(水) 15:13:30
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>C:\Documents and Settings\\デスクトップ\Game\ActionGame\/GameAppli\ActionGame.exe : fatal error LNK1120: 外部参照 2 が未解決です。

#include <fstream>

をインクルードすると上記のエラーが出ます

どうすればいいのですか;;

193 :デフォルトの名無しさん:2009/02/25(水) 15:24:46
プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリ
を、どれか正しいものに変更する

なんか他の外部ライブラリ使ってるだろ?

194 :デフォルトの名無しさん:2009/02/25(水) 15:26:17
デバッグ版とリリース版のオブジェクトが混在しているように見える
いったんすべてのオブジェクトを削除してビルドしなおせばいい

ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる

195 :デフォルトの名無しさん:2009/02/26(木) 06:44:15
staticメンバ関数を利用するメリットってあるんでしょうか?

196 :195:2009/02/26(木) 06:51:07
すいません
スレ移動します

197 :195 ◆Ci3UmwhFqY :2009/02/26(木) 07:18:27
>>196 は他人です

198 :デフォルトの名無しさん:2009/02/26(木) 10:37:07
何でメリットがないと思ったのか、それが知りたい。

199 :デフォルトの名無しさん:2009/02/26(木) 12:19:36
つnew, singleton

200 :デフォルトの名無しさん:2009/02/26(木) 12:23:18
コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに

201 :デフォルトの名無しさん:2009/02/27(金) 02:01:54
質問です。

class Foo { void Bar(void* ptr); };
void Foo::Bar(void* const ptr) {}

VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。
疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。

これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。

202 :デフォルトの名無しさん:2009/02/27(金) 02:10:38
文法的にOK

203 :デフォルトの名無しさん:2009/02/27(金) 02:21:40
>>201

class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}

が問題ないのと同じこと。

204 :デフォルトの名無しさん:2009/02/27(金) 02:51:20
>>202-203
仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。

205 :デフォルトの名無しさん:2009/02/28(土) 05:09:10
とても基本的なことなのですが、
符号なし整数の変数で与えられた数 N - 1 から 0 まで順番に処理をするループは、どう書くのが一般的ですか。
for (size_t i = N - 1; i >= 0; --i) だとダメですよね。

自分が考えた書き方は、
const size_t N = ...;
for (size_t i = N; i > 0; --i) hoge(i - 1);
for (size_t i = 0; i < N; ++i) hoge(N - i - 1);
for (size_t i = N - 1; i != ~0; --i) hoge(i);
ですが、どれも使われるのでしょうか。

206 :デフォルトの名無しさん:2009/02/28(土) 05:13:20
size_t i = N;
do { --i; hoge(i); } while (i > 0);


207 :206:2009/02/28(土) 05:14:35
ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね

208 :デフォルトの名無しさん:2009/02/28(土) 05:36:00
T i = M; //M = N - 1ということで
do {
hoge(i);
} while (i-- != 0);
これだと、MがT型の最大値でも対応できるはず。

209 :デフォルトの名無しさん:2009/02/28(土) 06:46:33
>>205
普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない

210 :デフォルトの名無しさん:2009/02/28(土) 08:29:35
>>209
メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな

211 :デフォルトの名無しさん:2009/02/28(土) 11:52:40
>>209
> i >= 0;

↑は符合無しだと常に真だろ。

212 :デフォルトの名無しさん:2009/02/28(土) 11:53:48
何か問題でも?

213 :デフォルトの名無しさん:2009/02/28(土) 11:54:56
for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。
if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。
while 系をカウントループに使うのは愚策と考える。

214 :デフォルトの名無しさん:2009/02/28(土) 12:02:05
>>212
やめられない、とまらない

215 :デフォルトの名無しさん:2009/02/28(土) 12:33:44
while(N-->0)は普通に使うだろ
--が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん

216 :デフォルトの名無しさん:2009/02/28(土) 12:39:17
その考えはなかった

217 :デフォルトの名無しさん:2009/02/28(土) 12:43:37
>>215
そんな餌にクマー
まあでも>>205の要求にあってるしシンプルでわかりやすいな

218 :デフォルトの名無しさん:2009/02/28(土) 13:16:49
>>215
ああ、意外と面白い使い方かも・・・

視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か

219 :デフォルトの名無しさん:2009/02/28(土) 14:09:16
有名だろ、それ

220 :デフォルトの名無しさん:2009/02/28(土) 14:16:21
ぶっちゃけ初めて見た

221 :デフォルトの名無しさん:2009/02/28(土) 14:20:36
ソース自体は見た事があるような気もするけど、考え方は初めて見た。

222 :デフォルトの名無しさん:2009/02/28(土) 16:14:42
減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ

223 :デフォルトの名無しさん:2009/02/28(土) 17:18:11
>>215
while(N-->0) って見た目が素敵だな


224 :デフォルトの名無しさん:2009/02/28(土) 17:23:55
AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・

225 :デフォルトの名無しさん:2009/02/28(土) 17:39:46
befungeのことですね!!

226 :デフォルトの名無しさん:2009/02/28(土) 17:41:03
面白そうだけど絶対コーディングしにくいな
ほぼ記号だろw

227 :デフォルトの名無しさん:2009/02/28(土) 20:31:33
さすがショートコーディングスレ。
ためにな・・・って、あれ?


228 :デフォルトの名無しさん:2009/03/01(日) 18:45:19
繰り返し処理のことを何ていいますか?
専門的にお願いします。

229 :デフォルトの名無しさん:2009/03/01(日) 18:49:47
反復処理とか繰り返し処理とか

230 :デフォルトの名無しさん:2009/03/01(日) 20:00:35
繰り返し処理のことを何ていいますか?
専門的にお願いします。

231 :デフォルトの名無しさん:2009/03/01(日) 20:01:14
反復処理とか繰り返し処理とか

232 :デフォルトの名無しさん:2009/03/01(日) 20:38:29
>>210
メモリのサイズを入れる型ってsize_t以外になんかなかった?

233 :デフォルトの名無しさん:2009/03/01(日) 20:50:58
繰り返し処理のことを何ていいますか?
専門的にお願いします。

234 :デフォルトの名無しさん:2009/03/01(日) 20:55:57
ループ処理じゃね?w
反復も繰り返しだろうけど、お前は違い分からないだろう

235 :デフォルトの名無しさん:2009/03/01(日) 21:26:00
ぶっちゃけC/C++の話じゃないからスレ違い

236 :デフォルトの名無しさん:2009/03/01(日) 21:29:11
>>234>>231>>229
もうちょっとかっこいい言い方あるだろ
それを教えろ

237 :デフォルトの名無しさん:2009/03/01(日) 21:31:09
>>236
死ねハゲ

238 :デフォルトの名無しさん:2009/03/01(日) 21:31:47
反復処理とか繰り返し処理とか

239 :デフォルトの名無しさん:2009/03/01(日) 21:47:20
リピート

240 :デフォルトの名無しさん:2009/03/01(日) 22:14:30
>>228-231
見事な繰り返し処理
>>232は空気嫁

241 :デフォルトの名無しさん:2009/03/01(日) 22:19:39
>>232
ssize_tとか、でもCでもC++でも標準ではないけど。

242 :デフォルトの名無しさん:2009/03/01(日) 22:24:27
>>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが

243 :デフォルトの名無しさん:2009/03/01(日) 22:34:14
>>241 >>242
そうだな。size_tでよかった。


244 :デフォルトの名無しさん:2009/03/03(火) 05:50:11
まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので

ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);

と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL

245 :デフォルトの名無しさん:2009/03/03(火) 06:13:52
>>244
何故、どう巧くいかないのか書かないのですか?

246 :デフォルトの名無しさん:2009/03/03(火) 06:28:56
実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;

247 :デフォルトの名無しさん:2009/03/03(火) 06:39:59
batの最後に

pause

入れとけ


248 :デフォルトの名無しさん:2009/03/03(火) 07:00:46
>>247
ありがとうございます。

やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?

249 :デフォルトの名無しさん:2009/03/03(火) 07:08:14
ファイルパスをちゃんと指定すればいいじゃん・・・

250 :デフォルトの名無しさん:2009/03/03(火) 07:12:19
できました!
こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。

251 :デフォルトの名無しさん:2009/03/03(火) 18:34:32
以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか?

static unsigned int * ADDR;

スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。

よろしくお願いいたします。

252 :デフォルトの名無しさん:2009/03/03(火) 19:01:49
vector<string> * const (&u)[buf]; // こんな感じですか?

253 :デフォルトの名無しさん:2009/03/03(火) 19:06:04
>>251
おんなじ。空白類がいくらあろうと関係ない。

254 :デフォルトの名無しさん:2009/03/03(火) 19:47:28
>>252
static unsigned int * ADDR;

全くこのままのコードです。

>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。

255 :デフォルトの名無しさん:2009/03/04(水) 03:11:45
VC++9の質問です。Unicode環境で
Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?


256 :デフォルトの名無しさん:2009/03/04(水) 03:14:42
>>255
_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。

257 :デフォルトの名無しさん:2009/03/04(水) 03:25:58
>>256
なるほど、ありがとうございました。

258 :デフォルトの名無しさん:2009/03/04(水) 13:36:24
初歩的過ぎてすいませんが...

すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?

よろしくお願いします。

259 :デフォルトの名無しさん:2009/03/04(水) 13:39:38
>>258
配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど


260 :デフォルトの名無しさん:2009/03/04(水) 13:44:40
>>258
状況がよくわからん

261 :259:2009/03/04(水) 13:44:42
sizeof(配列) / sizeof(型)
でいいか
マクロで定義して同じマクロ使うとか


262 :デフォルトの名無しさん:2009/03/04(水) 13:49:06
char a[]={10, 10, 10};
char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]

263 :258:2009/03/04(水) 13:53:28
すいません言葉が足りなすぎました。。

int a[]= {1,2,...};

size=sizeof(a)/sizeof(a[0]);

int b[size];

として同じ配列数の新しい配列を宣言しようとしてもできません。

264 :デフォルトの名無しさん:2009/03/04(水) 13:56:39
C++ なら const int size
Cなら int b[sizeof(a)]

265 :デフォルトの名無しさん:2009/03/04(水) 13:57:14
>>263
size の型は何か

言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか

266 :デフォルトの名無しさん:2009/03/04(水) 13:57:33
>>263
コンパイラも

267 :デフォルトの名無しさん:2009/03/04(水) 14:03:12
>>265
C++です。
size の型はintです
>>266
gccです。

268 :258:2009/03/04(水) 14:08:43
const int size = sizeof(a)/sizeof(a[0]);

int b[size];

として宣言できました。

ありがとうございました。

269 :デフォルトの名無しさん:2009/03/04(水) 15:03:27
配列の要素に変数が使える規格って無かったっけ


270 :デフォルトの名無しさん:2009/03/04(水) 15:30:51
>>269
C99だろ

271 :デフォルトの名無しさん:2009/03/04(水) 17:19:24
連立方程式のを渡したら戻ってくる関数ってありますか?

272 :デフォルトの名無しさん:2009/03/04(水) 17:20:51
>>271
標準にはない
標準じゃなくていいならある

273 :デフォルトの名無しさん:2009/03/05(木) 09:53:35
assert()と_ASSERT()ってなにか違いがあるのでしょうか?

274 :デフォルトの名無しさん:2009/03/05(木) 10:11:11
assertはC/C++標準
結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能

275 :デフォルトの名無しさん:2009/03/05(木) 18:14:15
メンバ関数のポインタの宣言はCxxx::*funcなのに
取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?

276 :デフォルトの名無しさん:2009/03/05(木) 18:40:47
>>275
発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。

277 :デフォルトの名無しさん:2009/03/05(木) 18:51:32
俺としては逆なんだが
なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが

278 :デフォルトの名無しさん:2009/03/05(木) 20:41:28
大変だー
さっぱりわからん

279 :デフォルトの名無しさん:2009/03/05(木) 20:43:44
>>278
何が分からないんだかさっぱり分からないぞ

280 :デフォルトの名無しさん:2009/03/05(木) 20:44:43
>>275
単に文法的な曖昧さを除いた結果そうなっただけ。

class A {
public:
 static void (*A::func)();
};

としてしまうと、static メンバ変数の実体定義がこうなってしまう。

void (*A::A::func)();

どっちがどっちの A:: やら分からん。

281 :デフォルトの名無しさん:2009/03/05(木) 21:16:46
もうクラスのメンバ関数のポインタは無しで

282 :デフォルトの名無しさん:2009/03/05(木) 22:09:09
9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。

283 :デフォルトの名無しさん:2009/03/05(木) 22:41:19
delegate パターンで使うね

284 :デフォルトの名無しさん:2009/03/06(金) 01:31:13
じゃあdeleteパターンで

285 :276:2009/03/06(金) 19:49:52
>>276, >>280
すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><

あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?

286 :デフォルトの名無しさん:2009/03/06(金) 20:12:15
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません

287 :デフォルトの名無しさん:2009/03/06(金) 20:16:31
>>286
まずは、その抽象クラスへのポインタ型か参照型を引数にしている?

288 :デフォルトの名無しさん:2009/03/06(金) 20:24:22
>>287
ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です

289 :デフォルトの名無しさん:2009/03/06(金) 20:27:48
>>286
派生クラスがない、ではなく、派生クラスは自分で作れということでは?

290 :デフォルトの名無しさん:2009/03/06(金) 20:29:59
ああ、そうかもしれない

291 :デフォルトの名無しさん:2009/03/06(金) 20:43:25
"派生クラスの無い抽象クラスが型な引数をとる関数"
これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ

292 :デフォルトの名無しさん:2009/03/06(金) 20:56:18
覚えておきます、ありがとうございました

293 :デフォルトの名無しさん:2009/03/06(金) 22:13:20
>>285
普通の関数でも&(func)はよくないだろ?
そういうこと

294 :デフォルトの名無しさん:2009/03/06(金) 22:51:58
>>293
普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?

>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?

295 :デフォルトの名無しさん:2009/03/06(金) 23:05:45
>>294
関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない

一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる


と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん

296 :デフォルトの名無しさん:2009/03/07(土) 23:59:08
グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので

//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
 memset(EDIT_DATA, 0, sizeof(EDIT_DATA));

という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。

297 :デフォルトの名無しさん:2009/03/08(日) 00:16:13
おまいの使ってるOSが
書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には
アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。

298 :デフォルトの名無しさん:2009/03/08(日) 01:38:45
>>297
私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?

私の使っているOS(WinsowsXP)の場合
・関数内で宣言するローカル変数の場合
void main(){
  int a;        //この時点で非初期化データ領域に変数aの存在が知らされる。
  printf("%d\n", a);  //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない)
  a = 0;        //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
  printf("%d\n", a);  //0が表示される(物理メモリにはaが存在する)
}

・関数外で宣言するグローバル変数の場合
int b;          //この時点で非初期化データ領域に変数bの存在が知らされる。
void main(){
  printf("%d\n", b);  //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える)
  b = 0;        //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
  printf("%d\n", b);  //0が表示される(物理メモリにはbが存在する)
}

299 :デフォルトの名無しさん:2009/03/08(日) 06:38:13
>298
とりあえず環境依存の話だというのは認識しておいてくれ。

まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。
ローカル変数は BSS には確保されない(スタックに確保される)。
非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に
「知らされる」という表現はおかしい。
物理メモリの割り当ては OS、ローダが行う。
恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。
なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか?

「仮想記憶」でぐぐるといいと思う。

300 :デフォルトの名無しさん:2009/03/08(日) 08:00:03
void fn(int x){〜;};
void fn_nul(int){};


if(a){ fn(a);}


static void (*const_f[2])(int) = {fn, fn_nul};
f[(a>>3)&0x1](a);

どっちが効率いいかな?

301 :300 訂正:2009/03/08(日) 08:01:30
static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a>>3)&0x1](a);

302 :デフォルトの名無しさん:2009/03/08(日) 08:08:17
>>299
やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。

303 :デフォルトの名無しさん:2009/03/08(日) 10:23:48
CPUアーキテクチャ側から勉強するといいかもね。
俺は「はじめて読む486」という本が参考になった。

304 :デフォルトの名無しさん:2009/03/08(日) 10:46:03
>>301
下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。

305 :デフォルトの名無しさん:2009/03/08(日) 17:01:16
>>303
CPUじゃなくOS

306 :デフォルトの名無しさん:2009/03/08(日) 19:10:52
困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。


307 :デフォルトの名無しさん:2009/03/08(日) 19:12:40
>>306
環境依存なので利用環境を書いてね

308 :デフォルトの名無しさん:2009/03/08(日) 19:31:42
306です。
環境:linux. gcc version 4.3.2 ,SDL(Callback)
マルチスレッドではないのですが、CallBack関数側から、
MAINスレッドの寝ている状態を起こせないものかと、、、
MAINスレッドでやっている処理は、標準入力から
データ読み込み、固定領域にバッファリングしています。
バッファが一杯だったら、標準入力からの読み込みは
しないで寝かせたいのです。(BusyWaitやポーリングはNG)
gdk_input_addとgtk_mainの組み合わせで
とりあえずできたのですが、gtkを使うのは目的外かと、
よろしくお願いします。





309 :デフォルトの名無しさん:2009/03/08(日) 20:08:54
>>308
pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう

310 :デフォルトの名無しさん:2009/03/08(日) 21:11:29
>>309
サンクスです。チューw
  pthread_cond_wait(&cond,&mutex);
  pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)



311 :デフォルトの名無しさん:2009/03/09(月) 03:45:12
ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが
(ただのパクリですが・・・もちろん勉強のためです)
CStatic : public CWindow {
public:
 CStatic(HWND hWnd) : CWindow(hWnd) {}
 CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; }
 ...
};
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
などのCStaticコンストラクタの初期化がコンパイル通りません。
>error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません)
考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが
ATL/WTLではこれが上手くいっているのは何故なんでしょうか?
ATL/WTL見たことある方で分かられる方があればご教示ください。

312 :デフォルトの名無しさん:2009/03/09(月) 04:09:36
CStatic& operator=(HWND hWnd)
それ以前にこれ間違ってね?

313 :デフォルトの名無しさん:2009/03/09(月) 04:16:54
>>312
レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?

314 :デフォルトの名無しさん:2009/03/09(月) 04:27:45
いや、それだけしかないなら
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
これに当てはまるoperator=が無いじゃん

315 :デフォルトの名無しさん:2009/03/09(月) 04:47:48
>>314
すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。

316 :デフォルトの名無しさん:2009/03/09(月) 10:11:14
IDC_STATICは実際にこう書いてるの?
IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。

317 :デフォルトの名無しさん:2009/03/09(月) 19:02:57
>>316
遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。
例えばATL/WTL解説で有名な↓ここ
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/stdctrl05/index.html
では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。

318 :デフォルトの名無しさん:2009/03/09(月) 20:03:55
>>315
コンストラクタにexplicit付いてんじゃねぇの

319 :デフォルトの名無しさん:2009/03/09(月) 20:49:52
>>318
explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;

試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
class A { // 基底クラス
public:
 DWORD_PTR a; // データメンバ
 operator DWORD_PTR() { return a; }
 A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ
 A getData() { return A(a); } // 自クラスでキャスト
};
class B : public A { // 派生クラス
public:
 B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ
 B& operator=(DWORD_PTR x) { a = x; return *this; }
};

A aaa;
B bbb = aaa.getData(); // NG
bbb = aaa.getData(); // OK
それともこの再現自体が間違ってるのでしょうか・・・?

320 :デフォルトの名無しさん:2009/03/09(月) 20:53:33
>>319
class A に A(a)のコンストラクタは付けないの?

321 :デフォルトの名無しさん:2009/03/09(月) 21:06:28
>>319
VC2008EEで通ったけど

322 :デフォルトの名無しさん:2009/03/09(月) 21:42:54
class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?

323 :デフォルトの名無しさん:2009/03/09(月) 21:59:40
[質問内容]
C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、
メンバ配列についてお行儀のよい書き方を教えてください。
メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、
文字列や値は同様にメンバ変数として持つのか? それとも、
cppの上の方に無名空間で切った変数を新たに宣言するのか?

そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで
cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか?
ちょっと、わからないので教えてください。






324 :デフォルトの名無しさん:2009/03/09(月) 22:34:42
static constならクラス内で初期化しない?

325 :323:2009/03/09(月) 22:42:56
簡単に言うと、以下のようなクラスを考えてください。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 10 };
static const int Array[END];
};
<hoge.cpp>
const int CHoge::Array[END] = {
0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか?
};

>>324
レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?


326 :デフォルトの名無しさん:2009/03/09(月) 22:52:04
>>325
そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。

327 :323:2009/03/09(月) 23:05:52
>>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 3 };
struct BTN_TAG {
int X;
int Y;
int W;
int H;
char *Str;
};
static const BTN_TAG m_BTN[END];
};
<hoge.cpp>
const CHoge::BTN_TAG CHoge::m_BTN[END] = {
{ 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値
{ 100, 300, 200, 50, "ボタン2" },
{ 100, 400, 200, 50, "ボタン3" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?


328 :デフォルトの名無しさん:2009/03/09(月) 23:14:02
文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?

329 :デフォルトの名無しさん:2009/03/09(月) 23:26:46
>>327
そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。

でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。

330 :デフォルトの名無しさん:2009/03/09(月) 23:27:48
>>328 
返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?


331 :デフォルトの名無しさん:2009/03/09(月) 23:35:33
template<TwidthX, TwidthY>class Btn{
static struct{int x, y; char *c;}m_BTN[3];
}
追い出すメリットが勝つるメンバは追い出す。

332 :デフォルトの名無しさん:2009/03/09(月) 23:46:04
>>329
返信ありがとうございます。
考え方として了解しました。



333 :デフォルトの名無しさん:2009/03/09(月) 23:59:08
>>331
返信ありがとうございます。
Btnクラスを作って、CHogeで参照するということでいいでしょうか?
(CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?)
templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?


334 :デフォルトの名無しさん:2009/03/10(火) 04:18:48
class Game {
char **board;
public:
void init() {
board = reinterpret_cast<char**>(new char[9][9]);
}
};
こう書くとコンパイルは通るんですが、boardにはBadpointerの値が
入ってます。なにか間違ってますでしょうか?


335 :デフォルトの名無しさん:2009/03/10(火) 04:36:16
何もかもが間違っているような・・・

なんでキャストしてるのん?
そして何ゆえそんな危険なキャストしてるのん?
あと、配列の配列は配列のポインタで受けることはできても
ポインタのポインタで受けることはできないよ?

っていうか、僕も初心者だから意味わからん^^

336 :デフォルトの名無しさん:2009/03/10(火) 05:50:54
>>335
ありがとうございます。
char *p[10] = new (char*)[10];
とか出来なくて、あんなコードになってしまいました。
どうすればいいですか?
char **p;
char *p[10];
とかをnewで初期化するにはどうすればいいですか?



337 :デフォルトの名無しさん:2009/03/10(火) 06:55:33
p = new char[10];

338 :デフォルトの名無しさん:2009/03/10(火) 10:30:43
そもそもinit()を呼んでいるのだろうか。

339 :デフォルトの名無しさん:2009/03/10(火) 13:26:15
char** p;
p = new char*[10];

340 :デフォルトの名無しさん:2009/03/10(火) 15:44:07
void init(int sfx1,int sfx2){ // 素敵な cast をどうしても使いたい場合。
board = reinterpret_cast<char**>(new char[sfx1*(sizeof(char*)+sfx2)]);
for(int i = 0; i< sfx1; ++i)board[i] = new(reinterpret_cast<char*>(board)+sfx1*sizeof(char*)+(sfx2*i))char[sfx2];
}

341 :デフォルトの名無しさん:2009/03/10(火) 16:09:07
>>340
何がなにやらわけわからんw

342 :デフォルトの名無しさん:2009/03/10(火) 17:33:37
>>340 を理解した上で
char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ
って寸法だ。

343 :デフォルトの名無しさん:2009/03/10(火) 18:27:00
newってtry-catchするのとnothrowするのどっちがいいの?

344 :デフォルトの名無しさん:2009/03/10(火) 18:52:35
>>343
try-cathc も nothrowも付けずにほっとく

345 :デフォルトの名無しさん:2009/03/10(火) 20:13:46
膝を打った後どっちに進むかは読み書きしたコード量に因るかな


346 :デフォルトの名無しさん:2009/03/11(水) 01:31:35
ptr_arrayつかうか、吹っ切れてmallocに先祖返りするかってことかい?

347 :デフォルトの名無しさん:2009/03/11(水) 01:48:32
パッディングの罠に嵌りに逝くか[]演算子のくっ付き方を考えるか

348 :デフォルトの名無しさん:2009/03/11(水) 07:51:57
初心者が配列 new なんか使うんじゃねーよ。 std::vector にしとけ。

349 :デフォルトの名無しさん:2009/03/11(水) 15:13:45
vector 使うのが正解
下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて
他人のクソコードをメンテする係に抜擢されちまうよ

350 :デフォルトの名無しさん:2009/03/11(水) 15:37:46
C++ Coding Standradsでは
生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。

Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。

351 :デフォルトの名無しさん:2009/03/11(水) 16:08:52
スコティッシュポールド

352 :デフォルトの名無しさん:2009/03/11(水) 16:10:08
最近の若い子の省略はよくわからんのぉ

353 :デフォルトの名無しさん:2009/03/11(水) 16:13:29
シコスでは
生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。

グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。

354 :デフォルトの名無しさん:2009/03/11(水) 16:22:02
スコポ の検索結果 約 495 件中 1 - 10 件目 (0.43 秒)
スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)

355 :デフォルトの名無しさん:2009/03/11(水) 17:25:01
>>350
scoped_ptrもスマートポインタの一種だよ。

356 :デフォルトの名無しさん:2009/03/11(水) 18:42:06
局所的、たとえば小さな関数内とかじゃ、なまぽで良いだろ
出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ
達人がその部分をプログラムする。

357 :デフォルトの名無しさん:2009/03/11(水) 18:47:38
スマポってのも曖昧な言葉だな
auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし
*とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし
逆にshared_ptr以外はスマポじゃないって奴もいるし

スマポって何?

358 :デフォルトの名無しさん:2009/03/11(水) 18:50:02
アホコードを書くDQNを隔離しておくための足かせ

359 :デフォルトの名無しさん:2009/03/11(水) 19:00:48
ポインタのような動きをするものは全てスマートポインタ
具体的に言うと*とか->が使える生ポインタ以外の物

360 :デフォルトの名無しさん:2009/03/11(水) 19:02:12
そーなのかー

361 :デフォルトの名無しさん:2009/03/11(水) 19:20:52
>>358
お舞! それは絶対に正しい。

ポインタすら使えない、つまりC++を扱ってはいけないような奴に、
C++を使わせるのに必要なものだよな

362 :デフォルトの名無しさん:2009/03/11(水) 19:27:16
自己も相対的にDQNかも知れない場合に備え
自主的に足かせを装着する訳だが

363 :デフォルトの名無しさん:2009/03/11(水) 20:32:27
>>362
ですよね〜。

364 :デフォルトの名無しさん:2009/03/11(水) 21:43:09
ほんとDQNですみません。

365 :デフォルトの名無しさん:2009/03/12(木) 02:06:14
ここでC++の勉強法を質問するのはスレ違いでしょうか?
それらしいスレがなかったので、一度ここで聞いてみようかなと…
独学のため、先輩方の意見などをお聞きしたいと思っています。

366 :デフォルトの名無しさん:2009/03/12(木) 02:54:55
おれも知りたいかも
Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う
C++は、モノにするには、やる範囲が広そうだし、Javaなのかな

ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?

367 :デフォルトの名無しさん:2009/03/12(木) 06:58:49
スレ違い

368 :デフォルトの名無しさん:2009/03/12(木) 12:20:28
まずビジネス的な意味というのがわからん訳だが

369 :デフォルトの名無しさん:2009/03/12(木) 19:44:28
Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには
/MT
/MTd
/MD
/MDd
の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、
/MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。
どういう場合に/MTdにしなければだめになるのでしょうか?


370 :デフォルトの名無しさん:2009/03/12(木) 20:13:31
>>369
ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ

371 :デフォルトの名無しさん:2009/03/12(木) 20:22:34
ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか?
例えば
\\Server\folder\test.txt
にあるファイルに対して
FindFirstFile( "\\\\Server\\folder\\test.txt",&data );
とやっても失敗になってしまいます。
ショートパスからロングパスにしたいのですが、、、、

372 :デフォルトの名無しさん:2009/03/12(木) 21:58:54
ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?

373 :デフォルトの名無しさん:2009/03/13(金) 14:45:20
2chトリップ生成プログラム教えてください。
ライブラリ作った人とかいますか?

374 :デフォルトの名無しさん:2009/03/13(金) 15:17:00
団子さんの出番ですね!!

375 :デフォルトの名無しさん:2009/03/13(金) 15:21:22
やばい、>>374と同じ事が頭に浮かんだ

376 :デフォルトの名無しさん:2009/03/13(金) 15:37:46
>>373
2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ

377 :デフォルトの名無しさん:2009/03/13(金) 15:40:55
[環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります)
GoogleCalendarとの同期を取るアプリを作りたいんですが、
最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば
いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?





378 :デフォルトの名無しさん:2009/03/13(金) 15:44:06
>>373
PHPのを探してきた
$trip = '';
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) {
$salt = substr($match[2]."H.", 1, 2);
$salt = preg_replace("/[^\.-z]/", ".", $salt);
$salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
$trip = substr(crypt($match[2], $salt),-10);
$_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>';
}
cryptがDESかMD5かで結果が変わる

379 :デフォルトの名無しさん:2009/03/13(金) 15:55:43
>>373
Cのソースがあった
http://www.geocities.com/tk2001b/utripper/

380 :デフォルトの名無しさん:2009/03/14(土) 20:40:26
using namespace std;
とソースの上に書くのと、
ソース全体を
namespace std {
...
}
というようにnamespaceの中に書くのとは、同じ意味ですか?


381 :デフォルトの名無しさん:2009/03/14(土) 20:45:14
違います

382 :デフォルトの名無しさん:2009/03/14(土) 21:00:19
ありがとうございます。
どう違うか、教えてください。


383 :デフォルトの名無しさん:2009/03/14(土) 21:04:06
利用と宣言の違い棚。

384 :デフォルトの名無しさん:2009/03/14(土) 21:11:37
わかりました。
後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは
できないということですね。
ありがとうございました。

385 :デフォルトの名無しさん:2009/03/14(土) 21:22:45
std 名前空間内に自分で宣言を追加してはいけない。
規格上未定義動作になる。

386 :デフォルトの名無しさん:2009/03/15(日) 00:23:57
std::swapの特殊化は置いてもいいけどね。

387 :デフォルトの名無しさん:2009/03/15(日) 00:31:35
std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね

388 :デフォルトの名無しさん:2009/03/16(月) 01:03:47
stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど
エラーチェックは↓見たいな感じで十分ですかね?

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

void read(char *file, vector<string> &lines);
void write(char *file, vector<string> &lines);

int main(void)
{

vector<string> lines;

read("C:/Work/from.txt", lines);
write("C:/Work/to.txt", lines);

cout << "正常終了" << endl;

return 0;
}

389 :デフォルトの名無しさん:2009/03/16(月) 01:04:39
void read(char *file, vector<string> &lines)
{
ifstream ifs(file);

if(!ifs.is_open()){
cout << "コピー元ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}

while(ifs.good()){
string line;

getline(ifs, line);
lines.push_back(line);
}

if(!ifs.good() && !ifs.eof()){
cout << "読み込み途中でエラー" << endl;
ifs.close();
exit(EXIT_FAILURE);
}
}

390 :デフォルトの名無しさん:2009/03/16(月) 01:05:31
void write(char *file, vector<string> &lines)
{
ofstream ofs(file);

if(!ofs.is_open()){
cout << "コピー先ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}

vector<string>::iterator i = lines.begin();

while(ofs.good())
{
ofs << *i;

if(++i == lines.end())
break;

ofs << endl;
}

if(!ofs.good() && !ofs.eof())
{
cout << "書き込み途中でエラー" << endl;
ofs.close();
exit(EXIT_FAILURE);
}
}

391 :デフォルトの名無しさん:2009/03/16(月) 01:39:45
while (!feof()) {}
と同じ匂いを感じる。

ところで、
while (...) {
 string str;
 ...
}
より
string str;
while (...) {
 ...
}
の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね?
でも、スコープを限定した方が可読性等の面からは好ましいよね?
どっちが良いのかな。

392 :デフォルトの名無しさん:2009/03/16(月) 01:44:22
その辺を言い出したらvectorから見直しだけどな。

393 :デフォルトの名無しさん:2009/03/16(月) 02:11:37
>>391

{string str; while(...){...}}

394 :デフォルトの名無しさん:2009/03/16(月) 02:26:56
for(string str; ifs.good();)

395 :デフォルトの名無しさん:2009/03/16(月) 02:36:54
初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。

396 :デフォルトの名無しさん:2009/03/16(月) 02:40:10
getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。

397 :デフォルトの名無しさん:2009/03/16(月) 07:38:25
VC++9での質問です。

あるライブラリをインクルードする必要があるのですが、
ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、
プロジェクト→プロパティ→リンカ→追加のライブラリ
のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。
リンクの順序が関係してるのかと思ったのですが、よくわかりません。
どういう基準で方法を選べばいいですか?


398 :デフォルトの名無しさん:2009/03/16(月) 07:41:35
>>397
ライブラリのパスを通せばいいと思う

399 :デフォルトの名無しさん:2009/03/16(月) 07:50:49
>>398
ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。

書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?


400 :デフォルトの名無しさん:2009/03/16(月) 13:38:45
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ
それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。

データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);

余った桁に半角スペースが入るようなsprintf指定方法はありませんか?


401 :デフォルトの名無しさん:2009/03/16(月) 14:41:57
>>399
もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする

402 :デフォルトの名無しさん:2009/03/16(月) 14:44:55
>>400
いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?

403 :デフォルトの名無しさん:2009/03/16(月) 16:44:14
400です。
おかげさまで解決です。

404 :デフォルトの名無しさん:2009/03/16(月) 16:54:03
おかげさまってマルチでよそで答えもらっただけだろ。

405 :デフォルトの名無しさん:2009/03/16(月) 20:22:15
std::cinで矢印キーの入力を取得することはできますか?


406 :デフォルトの名無しさん:2009/03/16(月) 20:29:07
質問です
WM_NCHITTESTをフックしたいのですが
SetWindowsHookEXの中のどの項目ならフックできるでしょうか?

407 :デフォルトの名無しさん:2009/03/16(月) 22:16:04
>406
>The WM_NCHITTEST message is sent to a window when the cursor moves
より、このメッセージは Send される。
従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。
別途処理したいならサブクラス化とかが必要。

408 :デフォルトの名無しさん:2009/03/16(月) 22:17:02
っつーか、Win32API質問箱の管轄だな。

409 :406:2009/03/16(月) 22:53:13
>>407
ありがとうございます。
メッセージの変更ができなかった謎も解けました。

410 :デフォルトの名無しさん:2009/03/17(火) 00:11:37
const stringのイテレーターってどうやって宣言するんでしょうか?
std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです

411 :デフォルトの名無しさん:2009/03/17(火) 00:13:31
>>410
#include <string>

412 :デフォルトの名無しさん:2009/03/17(火) 00:15:06
>>411
#include <string>はちゃんとしてます

413 :デフォルトの名無しさん:2009/03/17(火) 00:17:51
>>412
ならイテレータの宣言は済んでる。

何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の
変数を宣言したいってこと?

414 :デフォルトの名無しさん:2009/03/17(火) 00:19:17
あ、const_iteratorってやるんですね。解決しました。ありがとうございます

415 :デフォルトの名無しさん:2009/03/17(火) 00:19:30
const stringのイテレータという言い方は無い。
stringのconst_iteratorならstd::string::const_iteratorで宣言できる。

416 :デフォルトの名無しさん:2009/03/18(水) 17:14:42
newが失敗するのってメモリが足りない時以外にどんな状況が考えられますか?

417 :デフォルトの名無しさん:2009/03/18(水) 17:27:57
何をnewするかに拠る

418 :デフォルトの名無しさん:2009/03/18(水) 17:42:35
コンストラクタがエラー投げてることもある

419 :デフォルトの名無しさん:2009/03/18(水) 17:46:41
そもそもメモリが足りてなくても失敗するとは限らない。

420 :デフォルトの名無しさん:2009/03/18(水) 18:52:06
STLの出す例外一覧みたいなのってありませんか?

421 :デフォルトの名無しさん:2009/03/18(水) 19:54:38
これ格納すればあらゆる例外投げてくれるよ

struct Hoge{
Hoge(){throw new MyFavoriteException;}
};

422 :デフォルトの名無しさん:2009/03/19(木) 16:14:20
そうかなあ

423 :デフォルトの名無しさん:2009/03/20(金) 02:41:10
VC++でCGIを作ってます(ただの興味本位です
HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、
ソースコードをUTF-8で保存して、コンパイルしました。
すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、
更に文法エラーが出てきてコンパイルできませんでした。
ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから?
文字列にUTF-8を使うことは不可能なんですか?

424 :デフォルトの名無しさん:2009/03/20(金) 03:11:19
ソースファイルの文字コードとプログラムの出力は別物
ソースはShift_JISでもUTF-8でもコンパイルすれば内容は同じ

で、出力をUTF-8にするためにはプログラムで文字列を組み立ててから
最後にUTF-8に自力で変換してやらなくてはいけない
UTF-8への変換はWin32APIを使う必要がある
たぶんIMultiLanguage2のあたりつかえばできると思うので検索して調べてみてくれ

あと、Shift_JIS以外の文字コードをstdoutに出力するなら、stdoutをバイナリモードに
する必要があるような気がするので、fprintfとかfwriteの前に以下のようなコードが必要かも
setmode( fileno(stdout), O_BINARY );

425 :デフォルトの名無しさん:2009/03/20(金) 04:28:22
2005以降なら、fopenなどでccs=UTF-8を付加すればいいのではと思う

426 :デフォルトの名無しさん:2009/03/20(金) 12:00:07
あー、fopenなんてここ何年も使ってないからすっかり忘れてたわ

427 :デフォルトの名無しさん:2009/03/20(金) 13:06:36
環境依存しない方法で変換するにはどうすればよかろうの?

428 :デフォルトの名無しさん:2009/03/20(金) 13:15:48
無理
環境ごとに#ifdefしまくるのが精一杯

429 :デフォルトの名無しさん:2009/03/20(金) 13:45:03
CGIやるならLinuxだろ
>>425
stdoutには使えないよね

430 :デフォルトの名無しさん:2009/03/20(金) 15:38:25
ソースが Shift_JIS なら、環境に依存してない。

431 :デフォルトの名無しさん:2009/03/20(金) 16:55:09
Visual Studioで画面に複数のソースを表示させる方法ってありますか?
Source.cppとSource.hを横に並べて表示したいんですが、、

432 :デフォルトの名無しさん:2009/03/20(金) 17:01:15
タブを右クリ→垂直タブグループの新規製作

433 :デフォルトの名無しさん:2009/03/20(金) 17:04:01
すごい、出来ました!
ありがとうございました。

434 :デフォルトの名無しさん:2009/03/20(金) 23:07:02
http://page4.auctions.yahoo.co.jp/jp/auction/d91264064

435 :デフォルトの名無しさん:2009/03/21(土) 13:22:55
opendialogを使うと
ShellExeCuteを使いバッチファイルを起動すると
パスが見つからなくなってしまいます。
opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。
何かディレクトリを指定するようなコマンドがあったら教えてください。



436 :デフォルトの名無しさん:2009/03/21(土) 14:24:00
chdir

437 :デフォルトの名無しさん:2009/03/21(土) 14:42:32
436>>
バッチファイルのほうで探したら見つかりました
ありがとうございます。

438 :デフォルトの名無しさん:2009/03/21(土) 20:56:55
Visual C++の質問なんですが、
新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に
ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに
全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので
しょうか?



439 :デフォルトの名無しさん:2009/03/21(土) 20:59:56
ファイルシステム上のフォルダとは別物だ。

440 :デフォルトの名無しさん:2009/03/21(土) 21:03:40
>>439
ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。
じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか?
ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません
でした。
フィルタって何の意味があるんだろう。。

441 :デフォルトの名無しさん:2009/03/21(土) 21:10:07
自己レスです。
自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、
フィルターもあわせて設定すれば、やりたいことができそうです。
でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。
プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?


442 :デフォルトの名無しさん:2009/03/21(土) 21:21:54
hoge/srcフォルダにソースもヘッダもぶち込む

443 :デフォルトの名無しさん:2009/03/21(土) 21:51:18
>>442
ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。
自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に
PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、
リンクでエラーになります。(LNK2019とかLNK2001とか)
同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか?
何度もすいません。



444 :デフォルトの名無しさん:2009/03/21(土) 22:13:52
http://image.space.rakuten.co.jp/lg01/91/0000075291/80/img97a425ffzik9zj.jpeg


445 :デフォルトの名無しさん:2009/03/21(土) 22:23:20
>>444
浦賀湾のあたり?

解決しました。
出力ファイルのオブジェクトファイル名を変更すればできました。
ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定
しないとだめなのが、分かりにくかった。
片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。
ありがとうございました。


446 :デフォルトの名無しさん:2009/03/21(土) 22:33:42
>>444

テラナツカシス

447 :デフォルトの名無しさん:2009/03/22(日) 13:01:45
昨日VSいれてみました。いきなり分りません。
System::Object^
の^ってなんですか

448 :デフォルトの名無しさん:2009/03/22(日) 13:12:49
>>447
C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ

449 :デフォルトの名無しさん:2009/03/22(日) 13:12:55
検索すればわかることだと思うけれど、
http://www.google.com/search?hl=en&q=VC%2B%2B+%E3%82%AD%E3%83%A3%E3%83%AC%E3%83%83%E3%83%88&btnG=Search&lr=lang_ja
の3番目

450 :デフォルトの名無しさん:2009/03/22(日) 13:27:51
C++builderでTreeViewを使っているのですが、子を持つノードだけそのままの位置にして
他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい
うまくいきません。

何か良い方法があったら教えてください。

451 :デフォルトの名無しさん:2009/03/22(日) 13:34:07
C++の入門書には載ってないだろうな。
C++/CLIの入門書嫁。

452 :デフォルトの名無しさん:2009/03/22(日) 13:54:28
CLIだったのか。どうりで。
ありがとね。

453 :デフォルトの名無しさん:2009/03/22(日) 15:29:42
int hoge(int n) { return n; }
int hoge(const int n) { return n; }
int hoge(int &n) { return n; }
int hoge(const int &n) { return n; }
だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。
呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では
int であろうがconst int であろうが区別していないのでしょうか。

454 :デフォルトの名無しさん:2009/03/22(日) 15:41:21
>>453
そう。関数引数の型としてはトップレベルの const は無視され、区別されない。

ただし定義においてはローカル変数への const と同様に働く。

455 :デフォルトの名無しさん:2009/03/22(日) 16:58:39
暗号の本で一通りのアルゴリズムのようなものは理解したのですが、
Cに組み込むにはどうすればいいのでしょうか?
アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか?

たとえば全てのバイトにn加算するという暗号化を施す場合、
その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、
そうさせないために何か対策する必要はないのでしょうか?

456 :デフォルトの名無しさん:2009/03/22(日) 17:04:17
アルゴリズムが判明して脆弱になるような暗号は、その時点で脆弱なのです。

457 :デフォルトの名無しさん:2009/03/22(日) 17:21:23
例が悪かったですね。
AES等安全性の確立されたアルゴリズムを使うことを前提とします。
ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。
その鍵は逆アセンブル等で簡単に解ったりしないんですか?

458 :デフォルトの名無しさん:2009/03/22(日) 17:24:55
>>457
分かります

AES暗号化を使っていることが分かるだけでも
どこを調べればいいか分かってしまいます

ある程度以上は諦めるしかないです

459 :デフォルトの名無しさん:2009/03/22(日) 18:09:08
MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、

_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。

普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?

460 :デフォルトの名無しさん:2009/03/22(日) 18:53:39
#include <iostream>
int main(){return 0;}
というプログラムなんですが、プロジェクトを新規作成するときに、
(1)最初から空のプロジェクト
(2)Win32プロジェクトを選択して、空のプロジェクト
という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが
通らず、LNK2019というエラーになります。
この2つの方法って何が違うのでしょうか?



461 :デフォルトの名無しさん:2009/03/22(日) 18:55:39
Win32プロジェクトはGUIプログラム用です

462 :デフォルトの名無しさん:2009/03/22(日) 19:01:50
>>460
プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。
そのエラーの元になっている違いはエントリポイントの違い。
Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。

他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。

463 :デフォルトの名無しさん:2009/03/22(日) 19:24:03
>>461-462
ありがとうです。
でもmainをWinMainに書き直しても駄目でした。
>他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
本当にほかにも色々違うんですね。


464 :デフォルトの名無しさん:2009/03/22(日) 20:09:48
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0}

これが一応の最小プログラムね
Windowsプログラミングでは初めて見る型がたくさん出てくるけど
ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ

465 :デフォルトの名無しさん:2009/03/22(日) 20:15:12
>>464
何のためのtypedefだよ…

466 :デフォルトの名無しさん:2009/03/22(日) 20:23:08
typedef元の型が変化しても書き直す必要をなくすため

467 :デフォルトの名無しさん:2009/03/22(日) 20:26:11
個人的にはAPIENTRYの方が好きだなあ

468 :デフォルトの名無しさん:2009/03/22(日) 22:28:20
可読性のためだろ

469 :デフォルトの名無しさん:2009/03/23(月) 00:16:56
memcpy.asmの
mov [edi],al ;U - write second byte to destination
でエラーが発生してしまいます。なぜでしょうか?

以下 プログラムです。
class ErrorDiffusion{
public:
ErrorDiffusion(int campussize);
~ErrorDiffusion();
void Upperandlowerreversing(int width,int height,unsigned char *Grey);
private:
unsigned char *Output;
};

//上下反転
void ErrorDiffusion::Upperandlowerreversing(int width,int height,unsigned char *Grey)
{
int i,flag=1;

printf("上下反転\n");
for(i=0;i<height;i++)
{ //printf("memcpy mae\n");
memcpy(&OutPut[(height-flag)*width],&Grey[i*width],width);
//printf("%d loop\n",i);
flag++;
}
}
//ここで関数を呼んでいます。
errordiffusion.Upperandlowerreversing(width,height,&Grey[0]);

470 :デフォルトの名無しさん:2009/03/23(月) 00:47:52
private:
unsigned char *Output; にして、コンストラクタで、メモリを確保していて
NULLにはなっていないのですが・・。privateへのアクセスは、普通に
Outputでいいはずだとおもうのですが違うのかな?

471 :デフォルトの名無しさん:2009/03/23(月) 01:09:47
自己解決しまsちあ

472 :デフォルトの名無しさん:2009/03/23(月) 09:55:51
ifstream ifs(filename, ifstream::binary);
Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら
どうしてだめなのでしょうか?

473 :デフォルトの名無しさん:2009/03/23(月) 10:16:20
テキストファイルの読み込みとか、書かなくてもいい場合があるじゃん。

Cの"r" "rb" と同じ関係。

474 :デフォルトの名無しさん:2009/03/23(月) 10:58:52
>>473
ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。
ついでにあと1個質問させてください。
Ifstream.seekg()で、
Ifstream.seekg(0,ifstream::end)
Ifstream.seekg(ifstream::end)
はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、


475 :デフォルトの名無しさん:2009/03/23(月) 11:02:37
>>474
省略時はどの値を渡したのと同じってのを意識するといい。

476 :デフォルトの名無しさん:2009/03/23(月) 11:36:04
>>475
なるほど。
省略時は0を渡したのと同じですね。


477 :デフォルトの名無しさん:2009/03/23(月) 11:46:00
念のため書くけど、省略時にどの値を採用するかはその関数を書いた人が決めるのよ。
さっきのIfstream::binaryも同じ

478 :デフォルトの名無しさん:2009/03/23(月) 12:35:15
>>477
本当ですね。
VC9++で試したら、ゼロじゃなかったです。
どういう値になっているのか調べられなかったけど、
ちゃんと読めてなかったです。


479 :デフォルトの名無しさん:2009/03/23(月) 12:50:29
ああそうか、binary modeとcooked modeはCP/M、ひいてはMS-DOSの
ためにC言語時代から受け継いでいる伝統だったな

unix系は意識不要

480 :デフォルトの名無しさん:2009/03/23(月) 14:42:51
おまえFTPとか知らないだろ

481 :デフォルトの名無しさん:2009/03/23(月) 14:54:43
File Transfer Proturk がどうかなさいましたか?

482 :デフォルトの名無しさん:2009/03/23(月) 15:09:04
TDateTime now = Date();

String hiduke=DateTimeToStr(now);
SaveDialog1->FileName=hiduke;

日付をFileNameのところに表示したいのですが、上記のようにやっても
うまくいきません原因の分かる方教えてくださいー。

483 :デフォルトの名無しさん:2009/03/23(月) 15:39:00
482です
解決しました
2009/03/23の
/がダメだったようです。

484 :デフォルトの名無しさん:2009/03/23(月) 22:00:05
free(array);
すると、プログラムが止まってしまいます。
メモリは確保しているし、なぜfreeするとエラーになるかわからないです
メモリのエラーはerrorno でチェックしろとかいてあったのですが
どうやってチェックすればいいかサンプルコードをください


485 :デフォルトの名無しさん:2009/03/23(月) 22:07:14
エスパーさんたのみます!

486 :デフォルトの名無しさん:2009/03/23(月) 22:13:31
間違えたアドレスを開放しようとしてる

487 :高橋:2009/03/23(月) 22:15:23
>>485
情報がこれだけじゃ、いかに魔美くんでも無理だよ。


488 :Cの達人:2009/03/23(月) 22:27:56
Cの達人と申します。
ネイティブCのことなら、お任せください。

                   by Cの達人

489 :デフォルトの名無しさん:2009/03/23(月) 22:29:38
http://www.kouno.jp/home/c_faq/c7.html#19

490 :デフォルトの名無しさん:2009/03/23(月) 22:35:46
TCPで他のマシンから要求を受け付けるサーバーを書いてるのですが、過去の一定の時間内(例えば1時間)で処理した
要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。
そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク
リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間
たってないものの数をカウントして、処理する/しないを決めます。

ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない
でしょうか?こういう処理って結構色々な場面で使われると思うのですが。
よろしくお願いします。



491 :デフォルトの名無しさん:2009/03/23(月) 22:38:48
10万とかのオーダーになったら、DB 使うことを考えちゃうな。

492 :デフォルトの名無しさん:2009/03/23(月) 22:43:43
>>490
deque を使ってみるといいよ
新しい要求がきたときに

1.一番古い [0] の時刻が1時間より前だったら pop_front で削除
2.1.で削除が行われた場合1.に戻る
3.deque のサイズが 100 未満であれば要求を受け付ける
4.deque に push_back で追加


最近同じような質問があった気がする

493 :デフォルトの名無しさん:2009/03/23(月) 22:50:42
>>491
DB使ったほうがいいですかね。
出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、
上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ
リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり
多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。
リトライのタイミングは相手まかせです。

ありがとうございます。


494 :デフォルトの名無しさん:2009/03/23(月) 22:56:09
C++には便利な仕組みがいっぱいあるよねー。

495 :デフォルトの名無しさん:2009/03/23(月) 22:57:02
>>492
ありがとうございます。
dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので
(重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります)
dequeは使えないか、と思ったんですが、どうですか?

>最近同じような質問があった気がする
ありがとうございます。探してみます。


496 :デフォルトの名無しさん:2009/03/23(月) 23:09:23
処理中のものは一時的に別のmapとかに保存しておいて、処理が終了したらlistに積むとか

497 :デフォルトの名無しさん:2009/03/23(月) 23:09:26
処理の軽さがあらかじめわかるなら
あの、あれ、なんていったっけ、常にソートされるコンテナ、
それ。

498 :デフォルトの名無しさん:2009/03/23(月) 23:21:09
時刻をキーにしてstd::set使えばよさげだね
重さ?シラネ

499 :デフォルトの名無しさん:2009/03/23(月) 23:35:58
どうも自分の環境だと、30万件を越えたあたりからマシンが応答なくなります。
30万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も
回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。
この処理を減らせれば、もっといけそうな気がする。
メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず
なんですがね、、、

500 :デフォルトの名無しさん:2009/03/23(月) 23:41:11
それは「新しい要求が1秒とかの間に何度も何度も」来てるからじゃろ?
そして「受け付けた全要求」、つまりここでは30万件を
要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る
からじゃろ? 仕様どおりじゃないのかな?

501 :デフォルトの名無しさん:2009/03/23(月) 23:48:29
>>500
そうですね。
負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。
1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。
そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。



502 :デフォルトの名無しさん:2009/03/23(月) 23:52:40
>>497-498
ありがとうございます。
でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも
しれないんですが、なんとかCでやりたいと思ってます。
自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、
常にソートされるコンテナって重そうな感じがするし、、、、


503 :デフォルトの名無しさん:2009/03/23(月) 23:53:31
全体的に仕様がおかしい気がするけど
そういう仕様なら仕方ないのであきらめましょう。

プログラマは仕様について意見することはできても
仕様を変える力はありません。しようがないのです。なんちて・・・


コマネチ!

504 :デフォルトの名無しさん:2009/03/24(火) 00:08:07
>>501
それは仕事でやってるの?

505 :デフォルトの名無しさん:2009/03/24(火) 00:11:58
>>501
そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。


506 :デフォルトの名無しさん:2009/03/24(火) 00:22:25
すげー社内システムだな。

507 :デフォルトの名無しさん:2009/03/24(火) 00:27:16
>>492の方法なら一番軽いと思うんだけどな。処理が終了してからlistとかdequeに積めばいいだけだし。

全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して
調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。

508 :デフォルトの名無しさん:2009/03/24(火) 00:30:19
結構大きな会社で、ストレージ管理ソフトも自社製のがあるんですが、
そういうのは管理できる人を手配するのが大変らしいです、、、


509 :デフォルトの名無しさん:2009/03/24(火) 00:30:50
STLは偉大だなぁ。ちゃんと処理時間についても言及されてる。

510 :デフォルトの名無しさん:2009/03/24(火) 00:40:32
>>507
そうですね。
じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは
dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。
過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。
これで実装してみます。
明日の朝までにできるかな。


511 :デフォルトの名無しさん:2009/03/24(火) 00:41:40
STLは元々Adaに組み込もうと研究されてたようですね
C++にtemplate機能が付け加えられたのに目を付けた
Stephanov(だっけ)がC++に移植したのが初めだとか

512 :デフォルトの名無しさん:2009/03/24(火) 07:02:35
template に関してだけど、オーバーロードにするか、templateを書くかといつも
使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?

513 :デフォルトの名無しさん:2009/03/24(火) 07:23:59
オーバーロードで済むならオーバーロード。
テンプレートが必要な時だけテンプレート。

514 :デフォルトの名無しさん:2009/03/24(火) 08:09:13
時間がないとき以外は全部テンプレート。自分が成長するため。

515 :デフォルトの名無しさん:2009/03/24(火) 08:30:05
演算子のオーバーロードについて質問があります。STLのIteratorみたいに、
List<int> *list = new List<int>();
llist.push_back(1);
llist.push_back(2);
for(Iterator* iter = (ListIterator<int>*)list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
このような書き方ができるようにソースコードを書きたいのですがうまくいきません。
以下が(全部載せるには少し長いので)自分のソースの抜粋です。
class Iterator{
public:
//省略
virtual bool hasNext() = 0;
virtual Iterator<Type> &next() = 0;
virtual Iterator<Type> &operator++() = 0;
virtual Type& operator*() = 0;

};
template <class Type> class ListIterator : Iterator<Type>{
public:
//省略
Iterator<Type>& operator++ (int dummy){
return next();:
}
Type& operator*(){
return value;//現在イテレータが指しているセルの内容
}
}
このように定義したものを上のように実行すると、4227856のような数字が連続して表示されてしまいます。また、for文のところで実行時エラーが出ます。
どう書き直せばよいでしょうか……。
(素直にSTL使えって話なんですがね……OTL)

516 :デフォルトの名無しさん:2009/03/24(火) 08:41:56
>>515
よく1回のカキコにおさめたな。

517 :デフォルトの名無しさん:2009/03/24(火) 08:48:26
>>516
載せるところ選ぶのに苦労しました……。
重要そうなところだけ抜粋してます。

テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。
こんなことしてるのは、単に興味とステップアップのためなんですが。
ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。
サンプルコードまねるだけでろくなソフトも作れませんが……OTL
(っとこんなことはどうでもいいですよね……)

518 :デフォルトの名無しさん:2009/03/24(火) 10:05:31

あるサイトを参考にして、下記のような半角全角変換関数を
作成したのですが、試しに適当にint型の変数を入れて
動かそうとすると下記のようなエラーが出ます。
参考サイトにあるものをほぼそのまま使用しており、
修正したところはcase文の中の変換する文字のみです。
参考サイトには、そのまま使用できるようなことが
書いてあったのですが、何が間違っているのか教えてください。


519 :デフォルトの名無しさん:2009/03/24(火) 10:06:52

int han2zen(char *str)
{
char *buf, *p, *ptr;

buf=(char *)calloc(strlen(str)*2+1,sizeof(char));
for(ptr=str,p=buf; *ptr!='0\'; *ptr++){
switch((int)*ptr){
case '0': strcpy(p,"0");p+=2;break;
case '1': strcpy(p,"1");p+=2;break;
case '2': strcpy(p,"2");p+=2;break;
case '3': strcpy(p,"3");p+=2;break;
case '4': strcpy(p,"4");p+=2;break;
case '5': strcpy(p,"5");p+=2;break;
case '6': strcpy(p,"6");p+=2;break;
case '7': strcpy(p,"7");p+=2;break;
case '8': strcpy(p,"8");p+=2;break;
case '9': strcpy(p,"9");p+=2;break;
case default:
*p=*ptr;
p++;
*p='\0';
break;
}
}
strcpy(str,buf);
free(buf);

return(0);

520 :デフォルトの名無しさん:2009/03/24(火) 10:07:57
(1849) : error C2001: 定数が 2 行目に続いています。
(1849) : error C2015: 定数の文字数が多すぎます。
(1850) : error C2143: 構文エラー : ';' が 'switch' の前にありません。
(1850) : error C2143: 構文エラー : ')' が 'switch' の前にありません。
(1861) : error C2059: 構文エラー : 'default'
(1868) : error C2040: 'strcpy' : 'int ()' は 'char *(char *,const char *)' と間接操作のレベルが異なります。
(1869) : error C2371: 'free' : 再定義されています。異なる基本型です。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\\include\malloc.h(123) : 'free' の宣言を確認してください。
(1871) : error C2059: 構文エラー : 'return'
(1872) : error C2059: 構文エラー : '}'

521 :デフォルトの名無しさん:2009/03/24(火) 10:10:37
>>515
printf("%d ", (**iter));
正直混乱するのでiteratorで多態はやめた方がいいんじゃない?
Listの実装でListIteratorを返すようにして
for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}

522 :デフォルトの名無しさん:2009/03/24(火) 11:12:35
>>519
'0\'
'\0'
case default:
default;

523 :515:2009/03/24(火) 12:20:00
>>521
レスありがとうございます。
>printf("%d ", (**iter)
なんでうまくいかないんだろうと4時間くらい混乱してました。
List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。
とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。

ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。
初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。

List::iterator()は、
ListIterator<Type> iterator(){
return ListIterator<Type>(this);
}
現在のソースコードはポインタじゃなくてこんな感じにしてみました。

>多態はやめたほうが……
Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。

アドバイスありがとうございました。
スレ汚し失礼しました。

524 :デフォルトの名無しさん:2009/03/24(火) 13:59:10
518,519,520です。

ありがとうございます。
おかげで動くようにはなったのですが、
期待する値を得ることができません。

下記のような値が返ってきてしまいます。
何がいけないんでしょうか?

INPUT OUTPUT

HAN2ZEN("9") NULL
HAN2ZEN("99") 結果なし
HAN2ZEN("999") 9
HAN2ZEN("9999") 結果なし
HAN2ZEN("99999") 9
HAN2ZEN("999999") 99
HAN2ZEN("9999999") 999
HAN2ZEN("99999999") 99
HAN2ZEN("999999999") 999
HAN2ZEN("9999999999") 9999

525 :デフォルトの名無しさん:2009/03/24(火) 14:24:58
>>524
int main()
{
char s[100];
for (int i = 1; i <= 10; i++)
{
s[0] = '\0';
for (int j = 0; j < i; j++)
{
strcat(s, "9");
}
printf("HAN2ZEN(\"%s\")", s);
han2zen(s);
printf("%s\n", s);
}
return 0;
}
これでちゃんと出たけどな?

526 :デフォルトの名無しさん:2009/03/24(火) 14:43:54
ありがとうございました。han2zen関数の使用方法を間違って、
例えばprintf("%s\n", han2zen(s));のように使用していたため
変な値が返ってきていただけでした。助かりました。

527 :デフォルトの名無しさん:2009/03/24(火) 16:19:10
VS2005を使っているのですが、iostreamをインクルードすると
error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。

をはじめ100以上のエラーがでます。
xutilityというファイルが原因のようですが、特に書き換え等行っていません。
プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。

アドバイスを御願いします。

528 :デフォルトの名無しさん:2009/03/24(火) 16:37:17
VSを入れ直す

529 :デフォルトの名無しさん:2009/03/24(火) 17:06:31
ところで、
C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、
需要ありますか?
機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。

これ見られたら、ダメ出しをたくさんくらいそうだけど。

530 :デフォルトの名無しさん:2009/03/24(火) 18:13:44
需要ありますか?じゃなくて
ダメ出しして欲しいんで見てくれませんか?だろ

boost::threadがあるしな

531 :デフォルトの名無しさん:2009/03/24(火) 18:16:28
>>530
だよな
いらないよな

532 :デフォルトの名無しさん:2009/03/24(火) 18:20:01
えー。マルチスレッドなprintfとか欲しいよ。
文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。
どう?

533 :デフォルトの名無しさん:2009/03/24(火) 18:21:22
>>529
最近ねたが無いからうpれ

534 :デフォルトの名無しさん:2009/03/24(火) 18:40:22
土下座して頼むならうpってあげてもいいんですが。

535 :デフォルトの名無しさん:2009/03/24(火) 19:05:54
>>530,531,533
それが本音で、ネタのためにも、うpしたかったと>>529が申しております。
よかったら見てやってくださいとのこと。

多分、これだ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8998.zip

536 :デフォルトの名無しさん:2009/03/24(火) 20:31:51
>>535
このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど

537 :デフォルトの名無しさん:2009/03/24(火) 20:44:13
オレは踏んだ
そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した

538 :デフォルトの名無しさん:2009/03/24(火) 20:59:44
svg形式を解析・出力するようなオープンなライブラリないのかな
なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・
改めてブラウザって大変なんだなって思うわ

539 :デフォルトの名無しさん:2009/03/24(火) 21:13:22
ないわけないやろが

540 :デフォルトの名無しさん:2009/03/25(水) 00:34:19
>>538
オープンの意味による。
GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。
ていうかあるなら俺に教えてくれ。

OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。
リファレンス実装をGPLで配布するとかマジやめて欲しい。



541 :デフォルトの名無しさん:2009/03/25(水) 00:42:20
ハノイの塔を解くプログラムを書いたのですが、結果が正しいのかわかりません。
どなたか検証していただけないでしょうか?

↓ソース
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c

ちなみに、円盤の個数が5までなら正しいのを確認してます。


542 :デフォルトの名無しさん:2009/03/25(水) 01:14:36
5個まで正しいなら、6個目も正しいのは簡単にわかるよ。
なぜなら、6個目の解法は

5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う)

だから。
ちなみに7個目の解法は

6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う)

以下同様。ハノイは簡単。

543 :デフォルトの名無しさん:2009/03/25(水) 01:19:59
>>541
危なっかしい警告が出てるので、まず潰したほうがいい。
結果はこれと比べとき。
#include <stdio.h>
int Solve(int num, int step, int from, int to, int tmp)
{
if (num) {
step = Solve(num-1, step, from, tmp, to);
printf("%d 手目: %d -> %d\n", step++, from, to);
step = Solve(num-1, step, tmp, to, from);
}
return step;
}
int main(void)
{
int num;
printf("円盤の個数を入力して下さい: ");
scanf("%d", &num);
Solve(num, 1, 0, 2, 1);
return 0;
}

544 :デフォルトの名無しさん:2009/03/25(水) 08:23:34
for (list<int>::iterator i = lists.begin(); i != lists.end(); ++i) {
if (iが何かの条件を満たしているとき)
lists.erase(i);
}
とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?

545 :デフォルトの名無しさん:2009/03/25(水) 08:46:11
remove_if

546 :デフォルトの名無しさん:2009/03/25(水) 09:02:16
RemoveとEraseはなにが違うんですか?

547 :デフォルトの名無しさん:2009/03/25(水) 10:27:35
>>546
あなたのお使いのライブラリの仕様によります。
STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。

removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。
但し、removeは対象となるコンテナがlistの場合のみ使用できます。
尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。

548 :デフォルトの名無しさん:2009/03/25(水) 10:34:29
>>541
円盤の番号を上から1〜n、手順を1から数えるとして、手順mに動かす円盤は手順mを
二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。

例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。
これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。

要は、再帰は必須ではない。

549 :デフォルトの名無しさん:2009/03/25(水) 12:19:05
>>547
ありがとうございます。VC++9を使ってます。
listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で
デバッグエラーに引っかかります。何が間違ってるのでしょうか?



550 :デフォルトの名無しさん:2009/03/25(水) 12:26:29
要素の追加、削除した後のiteratorって保障されないんじゃないの?
remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか

551 :デフォルトの名無しさん:2009/03/25(水) 12:35:17
>>544
erase() に渡されたイテレータは無効にり、無効なイテレータは
インクリメントできない(未定義動作になる)。
http://www.google.co.jp/search?q=%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF+%E7%84%A1%E5%8A%B9


552 :541:2009/03/25(水) 17:06:53
お礼が遅くなってすみません。
大丈夫みたいですね。どうもありがとうございました。

553 :デフォルトの名無しさん:2009/03/25(水) 17:32:34
list< int >::iterator i = lists.begin();
while ( i != lists.end() ) {
i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す
}

こんなかな。っていうか、STLでは自前のループはなるべく書かない。

554 :デフォルトの名無しさん:2009/03/25(水) 17:54:06
C++で変数(例えばdouble型)に#INFを代入する方法はないでしょうか?
出来れば環境依存しない方法を探しています。

555 :デフォルトの名無しさん:2009/03/25(水) 17:59:03
依存無しは無理だろ
浮動小数にIEEE754を使うことが定められてるわけじゃないから
INFなんてものが存在するとは限らないし

556 :デフォルトの名無しさん:2009/03/25(水) 18:40:44
>>554
std::numeric_limits<double> infinity()

存在するかどうかのテストも用意されてたはず。

557 :デフォルトの名無しさん:2009/03/25(水) 18:41:42
>>554
環境依存だろうけど
x=1e+1000;

558 :デフォルトの名無しさん:2009/03/25(水) 21:59:14
Windows(Vistaです)のC++でsleep(秒)を使おうと思っているのですが、どのヘッダを
インクルードすればよいのかわかりません。結局
#include <windows.h>
をインクルードして、
Sleep(ミリ秒);
を使ってますが、Windowsでsleep()はつかえるのでしょうか?


559 :sage:2009/03/25(水) 21:59:39
すみません。古い技術で恐縮ですが、
VB6用のDLLをVC++で作成するとき、
VB6で使用するタイプライブラリはどのように作成するのでしょうか?

560 :デフォルトの名無しさん:2009/03/25(水) 22:21:08
>>558
それしかありません

561 :デフォルトの名無しさん:2009/03/25(水) 22:53:14
>>560
わかりました。
ありがとうございます。


562 :デフォルトの名無しさん:2009/03/26(木) 00:48:06
VC6.0でビットマップAの特定座標にビットマップBをコピーして、
それらを一切表示せずにビットマップCとして保存したいのですが、
BitBltという関数を用いれば可能なのでしょうか?

563 :デフォルトの名無しさん:2009/03/26(木) 01:26:02
C++で、名前なし名前空間に関数を書いた場合とただのスタティック関数は、機能面から
考えたら同じと思っていいですか?
そのファイル内からだけ使えるという点で。


564 :デフォルトの名無しさん:2009/03/26(木) 01:37:41
おい、誰か答えろや。
答えんかい!

565 :デフォルトの名無しさん:2009/03/26(木) 02:43:02
関数使わなくても
座標計算してあとは合成すればいい
まああれだ

566 :デフォルトの名無しさん:2009/03/26(木) 03:26:22
>>564
ちょっとだけ違う

567 :デフォルトの名無しさん:2009/03/26(木) 03:54:26
そのへんは週刊 名前空間・創刊号に詳しく載ってるから買ってくるといい
確か初回は特製boost::binderがついてくるはず

568 :デフォルトの名無しさん:2009/03/26(木) 05:27:59
>>566-567
ほんとに役に立たないスレだな。
もっとちゃんと答えろ。
こっちは眠いのを我慢してレス待ってんだから。
早くしてくれや。


569 :デフォルトの名無しさん:2009/03/26(木) 06:28:20
あー眠い眠い。早く教えてくれ。寝ちまうぞ。


570 :デフォルトの名無しさん:2009/03/26(木) 06:55:12
いいよ。

571 :デフォルトの名無しさん:2009/03/26(木) 06:57:10
おやすみー

572 :デフォルトの名無しさん:2009/03/26(木) 07:04:18
>>570-571
はやく助けろや。
こっちは急いでんだわ。


573 :デフォルトの名無しさん:2009/03/26(木) 07:15:17
おぅ。わかった。すぐに答えるからちょっと待ってろ

574 :デフォルトの名無しさん:2009/03/26(木) 07:21:27
>>563
リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで
あまり実用上の違いはない。

「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。
他にもあるかもしれないけどね。

template<void (*)()> int t() { return 0; }
namespace { void an() {} }
static void st() {}
int main() { return t<an>(); } // t<st> はコンパイルエラー


575 :デフォルトの名無しさん:2009/03/26(木) 07:28:56
もっとわかりやすく説明しろよカスども

576 :デフォルトの名無しさん:2009/03/26(木) 08:39:31
あたまだいじょうぶでちゅかあ?
ことばわかりまちゅかあ?

577 :デフォルトの名無しさん:2009/03/26(木) 08:44:02
わからないでちゅ・・・

578 :デフォルトの名無しさん:2009/03/26(木) 08:56:46
意味もなく盛り上げてんじゃね〜よ

579 :デフォルトの名無しさん:2009/03/26(木) 09:10:06
>>574
ダメだよこういう時は嘘を教えなきゃ。

580 :デフォルトの名無しさん:2009/03/26(木) 09:47:06
浅く寝ちまったよ。

>>574
ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも
コンパイルできたけど?ほかの環境でも試したほうがいいのかな?


>>579
うるせーやつだな。


581 :デフォルトの名無しさん:2009/03/26(木) 11:50:38
>>580
> ほかの環境でも試したほうがいいのかな?
試さなくていいよ。

582 :デフォルトの名無しさん:2009/03/26(木) 12:45:35
>>581
そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、
ほんとかどうかついでに教えてよ。


C 言語と C++ 言語では const キーワードを使うことで定数を宣言することができます。
例えば const int cardmax=13; のように使用できます。これが単一のモジュールだけで
使われるのならば問題がないのですが、複数のモジュールにわたって使われる場合、
C言語と C++ 言語では constのリンケージが違うので、注意が必要です。具体的には
C言語では外部リンケージをもち、C++ 言語では内部リンケージを持ちます。つまり
C 言語では他のモジュールから使用する場合、そのモジュール内で
extern const int cardmax;
と宣言すればこの定数は使用可能ですが、C++ 言語では同じようにしても参照する
ことはできません。C++ 言語で外部から const オブジェクトを参照したい場合には、
定数を定義するときに、
extern const int cardmax=13;
のように定義する必要があります。


583 :デフォルトの名無しさん:2009/03/26(木) 12:49:13
>>582
正しいよ。
ちなみにCでconstで内部リンケージを持たせるなら
static const cardmax=13;
ってやる。

584 :デフォルトの名無しさん:2009/03/26(木) 15:14:19
>>580
へぇ VC++ だと通るのか。独自拡張じゃないかな? /Za でエラーになるかも。

ちなみに Cygwin の gcc 3.4.4 ではこんなエラーになる。
: In function `int main()':
:4: error: `st' is not a valid template argument
:4: error: no matching function for call to `t()'


585 :デフォルトの名無しさん:2009/03/26(木) 22:18:37
>>584
/Zaのつけ方を教えて。


586 :デフォルトの名無しさん:2009/03/26(木) 22:36:10
>>585
つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも
結果は同じ。どっちでも通るけどな。

587 :デフォルトの名無しさん:2009/03/27(金) 02:07:55
まったくお前らのせいで昼夜逆転しちゃったよ。
はやく解クレや。
今はカップ麺にお湯入れたんで、完成待ち。
やっぱ夜はいいな、静かでな。

588 :デフォルトの名無しさん:2009/03/27(金) 13:02:08
なんかカキコが減っちゃったな。
俺のせいかな。
悪かったよ。もう消えるわ。
じゃあな。


589 :デフォルトの名無しさん:2009/03/27(金) 23:33:13
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。
それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。

C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar

見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?

590 :デフォルトの名無しさん:2009/03/27(金) 23:50:42
>>589
_beginthreadex

591 :デフォルトの名無しさん:2009/03/28(土) 00:04:52
つ _kbhit()

592 :589:2009/03/28(土) 01:09:16
ありがとうございます。

593 :デフォルトの名無しさん:2009/03/28(土) 05:28:17
>>589
スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力
させてみろ。話はそれからだ。
あとは環境を書けや。WindowsかLinuxか。


594 :デフォルトの名無しさん:2009/03/28(土) 07:06:38
スレッド信者ウゼ

595 :デフォルトの名無しさん:2009/03/28(土) 07:30:11
>>594
信者もなにも、基本だろ。
クソな書き込みするくれーなら、意味のあること書いてミロ。


596 :デフォルトの名無しさん:2009/03/28(土) 07:57:08
_kbhit()にしてもどんなタイミングでも実行させるならマルチスレッドでやるしかないだろう

597 :デフォルトの名無しさん:2009/03/28(土) 08:19:14
USBから自作した機器の制御とかをやりたいと思い、Windowsのドライバのプログラミング
について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて
何が必要なのか、どのようにして作るのかがまったく分かりません。
どこか基本的なところから作り方解説してくれてるサイトありませんか?
本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか
知って、本当にやってみようか考えてから買いたいんです。

598 :デフォルトの名無しさん:2009/03/28(土) 08:26:05
めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
下記のように、CHogeHogeのクラス変数を初期化するのに、別のシングルトンクラス(CHoge)のメソッドの
戻り値を与えるコードを書いたところ、CHogeHogeのクラス変数を初期化するタイミングではまだCHogeが
生成されておらず、落ちます。コメント内のコードもうまくいきそうですがNGです
恐らくリンクオプションとか、pragmaで逃げられそうに思うのですが
対策方法を教えてください。処理系はVC6 SP5です

「CHogeHoge.cpp」
CHogeHoge* CHogeHoge::s_pInstance = new CHogeHoge(); // static
CHogeHoge* CHogeHoge::GetInstance()
{
return s_pInstance;
}
int CHogeHoge::GetValue()
{
return m_Value;
}

/* -- これもNG
CHogeHoge CHogeHoge::s_Instance; // static
CHogeHoge* CHogeHoge::GetInstance()
{
return &s_Instance;
}
*/

「CHoge.cpp」
const int CHoge::STATIC_VALUE = CHogeHoge::GetInstance()->GetValue();
なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。


599 :デフォルトの名無しさん:2009/03/28(土) 08:32:03
>>598
言ってることと書いていることが違う気がするのは気の所為か?
私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。
つーか、設計を見直すと言う選択肢はないのだろうか。

600 :デフォルトの名無しさん:2009/03/28(土) 08:46:03
CHogeの実装をCHogeHoge.cppに入れればいいんじゃね?

601 :デフォルトの名無しさん:2009/03/28(土) 08:51:34
class CHoge {
CHoge & instance() { static CHoge h; return h; }
};

void CHogeHoge::init()
{
m_Value = CHoge::instance().value;
}


602 :デフォルトの名無しさん:2009/03/28(土) 09:05:29
>>596
入力反応に対応出来る範囲をうまく見積ればどうとでもなる
for(){
int i = 0;
l_c:
switch(_kbhit()?0:++i){
case 0: printf("time");goto lc;
case 1: ~;goto lc;
case 2: ~;goto lc;
default:
}}

603 :デフォルトの名無しさん:2009/03/28(土) 09:27:12
>>597
ググった結果から microsoft のサイトのものを見るといい

604 :デフォルトの名無しさん:2009/03/28(土) 10:10:15
>598
>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
なんでそれだと駄目なん?

>めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
問題そのものは静的オブジェクトの初期化順序問題として割と有名。
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13
>601 みたいに関数内 static にするのも駄目?

605 :598:2009/03/28(土) 12:22:45
>601さんの方法でうまくいきました。
しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、
今後シングルトンはこの方法を愛用することになりそうです。

>604さん
有名な問題なのですね、勉強になります。

>>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
>なんでそれだと駄目なん?
出来るだけシンプルにしたかったのと、
正攻法の攻略法を知っておこうと思ったからです。

ありがとうございました。

606 :デフォルトの名無しさん:2009/03/28(土) 13:44:42
>>605
> 正攻法の攻略法を知っておこうと思ったからです。

わかってないから質問してるんだろうに、
正攻法で無いと決め付けてるのは何で?

607 :デフォルトの名無しさん:2009/03/28(土) 16:26:26
>606
私の設計意図から外れるから。

http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
のJavaの例の後者の方の例でどうしてもやりたかったから。

608 :デフォルトの名無しさん:2009/03/28(土) 16:28:50
そしてスルーされる>599と>600。
>599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w

609 :デフォルトの名無しさん:2009/03/28(土) 16:33:39
どう転んでも無理なんだから、どこかで妥協するなら、静的メンバで持つのを否定することも選択肢のうちだぜ

610 :デフォルトの名無しさん:2009/03/28(土) 16:34:50
設計を見直す、は設計の正攻法だけど、設計を変えないといけないから、
対処法の正攻法ではない、と。
単に言葉の問題。変なところに噛み付いてこないでね。

>599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。
>600は
うーん、
実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。
で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。

611 :デフォルトの名無しさん:2009/03/28(土) 16:38:28
後出しウザい

612 :デフォルトの名無しさん:2009/03/28(土) 16:41:27
まさかとは思うが、1クラス1ファイルじゃないといけないなんて思ってないよな?
そんな阿呆みたいな糞言語と一緒にされたら困るんだが。

613 :デフォルトの名無しさん:2009/03/28(土) 17:03:07
型情報から定数作りたいだけならmy_traitsクラスでも作ってろよ

614 :デフォルトの名無しさん:2009/03/28(土) 17:11:28
相変わらず終わった話に食いつく奴の多いこと。

615 :デフォルトの名無しさん:2009/03/28(土) 17:17:35
上から目線の質問者が、中途半端な認識で勝手に終了宣言しただけだと
なかなかスパッとはいかないね。

616 :デフォルトの名無しさん:2009/03/28(土) 17:49:51
>>610
設計が正攻法じゃないのに正攻法な解決っておかしいだろJK

617 :デフォルトの名無しさん:2009/03/28(土) 21:51:53
class Sample {
public:
static void func();
};
という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、
staticを取って、
void Sample::func() {....}
と書けばいいですか?
staticはつけてはだめなんですか?


618 :デフォルトの名無しさん:2009/03/28(土) 22:02:28
>>584
たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか
ぜんぜんわからん、、、
結構C++歴長いんだけどな。誰かわかる人いる?


619 :デフォルトの名無しさん:2009/03/28(土) 22:03:01
そうだね。そっちにはstaticは付けない。

620 :デフォルトの名無しさん:2009/03/28(土) 22:03:20
>>617
そのとおり。っていうか試せばわかるだろ。

621 :デフォルトの名無しさん:2009/03/28(土) 22:11:39
>>618
ポインタや参照型のテンプレート実引数には外部リンケージを持つ
オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない)

14.4.2 Template non-type arguments p1 より
> A template-argument for a non-type, non-template template-parameter shall be one of:
> - an integral constant expression; or
> - the name of a non-type template-parameter; or
> - the address of an object or function with external linkage, including
> function templates and function template-ids but excluding non-static
> class members, expressed as & id-expression where the & is optional if
> the name refers to a function or array, or if the corresponding
> template-parameter is a reference; or
(以下略)


622 :621:2009/03/28(土) 22:12:41
ごめん。
× 外部リンケージを持つオブジェクト
○ 外部リンケージを持つオブジェクトまたは関数

623 :デフォルトの名無しさん:2009/03/28(土) 22:24:28
内部リンケージだと、テンプレートを実体化した先から見えないかもしんないからな。
まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。

624 :デフォルトの名無しさん:2009/03/28(土) 22:32:26
すごい。
そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の
動作の違いを作り出すなんて、あんた頭いいね。
ありがとう。


625 :デフォルトの名無しさん:2009/03/28(土) 22:39:16
>>624
昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって
半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、
頭がいいとか言わんよ。

626 :デフォルトの名無しさん:2009/03/28(土) 22:40:26
ということは、625はLinux使い?


627 :デフォルトの名無しさん:2009/03/28(土) 22:46:26
gcc なら Linux 使いというのは Windows しか知らない奴の思考パターンだな。
PC 以外では gcc や gcc ベースのコンパイラがたくさん使われてるし、 >584 の
ように Cygwin だってある。それに規格がああなってる以上、 VC++ が異端なだけ。

628 :デフォルトの名無しさん:2009/03/28(土) 22:56:20
でもstaticな関数引数をとるテンプレートを使うようなプログラムでgccを使うような人って、
普段はLinux使ってるという気がするけど。
BSD系使いとかSolaris使い?
最近は見かけないし。


629 :デフォルトの名無しさん:2009/03/28(土) 23:06:44
>>628
なんという俺統計。

630 :デフォルトの名無しさん:2009/03/28(土) 23:19:23
じゃあ結局何使いなの?
俺統計かもしれないが、結構同意してもらえると思うけどな。
Linux使ってんでしょ?


631 :625:2009/03/28(土) 23:39:47
なんか変わった人がいるなぁ。
625 の話は「PC 以外」の話で、普段使ってるのは Windows だよ。
>627 も言ってるとおり、 Linux はまったく関係ない。

632 :デフォルトの名無しさん:2009/03/29(日) 00:08:03
俺も普段は Windows で gcc (Mingw版) 使ってるしなぁ。
Linux と決め付ける根拠も「気がする」とか曖昧な割にしつこい。
まぁ、釣りなんだろうけど。

633 :デフォルトの名無しさん:2009/03/29(日) 03:25:48
ごめん。
俺プログラマ結構たくさん知ってると思ってたんだけど、その中にWindows+gccという
組み合わせの人がいなかったもんでついつい変な書き方をしちゃった。


634 :デフォルトの名無しさん:2009/03/29(日) 04:07:54
OSXが触れられてなくて泣いた

635 :デフォルトの名無しさん:2009/03/29(日) 04:39:41
>>633 自分が知ってることが世の中のすべてだと思い込めるその思考回路が信じ難い。

636 :デフォルトの名無しさん:2009/03/29(日) 09:10:55
たかがこれっぽっちのやりとりで
相手の思考回路を把握したと思い込める思考回路とかもな。

637 :デフォルトの名無しさん:2009/03/29(日) 09:25:07
C++ではファイルスコープの宣言として、無名名前空間を使うことが推奨らしいですけど、
これってグローバル名前空間の中に無名名前空間を作ればいいのですか?
逆に、たとえばMyAppという名前空間に無名名前空間を追加しても、ファイルスコープの宣言とはならないのでしょうか。

638 :デフォルトの名無しさん:2009/03/29(日) 09:51:02
>>637
ならない。

639 :デフォルトの名無しさん:2009/03/29(日) 10:45:05
1>GameMain.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>GameTitle.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>CSelect.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>C:\.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ヘッダーファイルで定義されているクラスにstaticをつけないと上のエラーが出るのですが
何故ですか・・・?

640 :デフォルトの名無しさん:2009/03/29(日) 10:57:16
例のスレの人かな。

>>639
そのヘッダファイルがインクルードされる度にm_dxmusicが定義されているからです。

staticを付けると消えるのは、そのシンボルがエクスポートされずファイルスコープになるからです。インクルードしたファイル毎に別々のm_dxmusicが存在する状態になります。

これが意図した動作ではなく、m_dxmusicが複数のファイルで共有するシンボルなのであれば、ヘッダファイルでextern付きの宣言のみを行い、適当な.cppファイルで1度だけ定義しましょう。

641 :デフォルトの名無しさん:2009/03/29(日) 11:40:43
>>637
名前空間の中でもいいよ。あんまり意味無いけど。

642 :637:2009/03/29(日) 12:05:28
ありがとうございます。
うちのIDEでは、グローバル名前空間の無名空間がどれも同じ括りで表示されるので、名前空間ごとに把握できたら、
と思ってのことでしたが、グローバル空間に作ることにしました。

643 :デフォルトの名無しさん:2009/03/29(日) 12:12:40
いや、名前空間の中でいいってば。

644 :デフォルトの名無しさん:2009/03/29(日) 12:19:03
>>640
ありがとうございます

645 :デフォルトの名無しさん:2009/03/29(日) 15:03:01
http://ruffnex.oc.to/kenji/text/listexport/
↑のツールと例を使ってkernel32.DLLの書き換えに挑戦してるのですが、
上手く行きません。
DLLを作成しようとすると 「 Error 12: Number Overflow : 」というエラーがdefファイルから検出されます。
エラーが出ている箇所は、「HeapSize=d_HeapSize @680」です。
自分で書き換えた箇所を戻して、コンパイルしてみても駄目でした。
コンパイラはdigital Marsのやつです。OSはvista

原因が特定できなくて困ってます






646 :デフォルトの名無しさん:2009/03/29(日) 16:17:12
OSはvista

647 :637:2009/03/29(日) 16:25:23
両方の意見が出たから、安全側とっといた方がいいかなあと思ったんで。
>あんまり意味無いけど。
ということであったし、とりあえずグローバル名前空間の方に書いときます。

648 :デフォルトの名無しさん:2009/03/29(日) 16:39:15
>>647
無名名前空間の効果は名前付き名前空間の中でも変わらない。 >638 はデマ。
そして「あんまり意味無い」のは >642 のような事情が無いことが前提。
名前空間の中に入れたほうが便利なのに、わざわざグローバルに持っていく必要は無い。

649 :デフォルトの名無しさん:2009/03/29(日) 16:52:09
「ファイルスコープの宣言」ということなら >638 は正しいだろ。
「ファイルローカルな宣言」ということなら間違いだけど。

650 :デフォルトの名無しさん:2009/03/29(日) 17:00:39
そもそも C++ に「ファイルスコープ」などというスコープは無い。

651 :デフォルトの名無しさん:2009/03/29(日) 20:46:44
コモンダイアログを用いてファイルの保存等を実装したいのですが、
OPENFILENAMEは定義されていない識別子です、とエラーが表示されてしまいます
何かをincludeすれば良いのでしょうか

652 :589:2009/03/29(日) 20:48:04
あのですね、何度も申し訳ありませんが、kbhitじゃダメでした。
while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。
do〜whileとか色々試してみたけどやっぱりダメです。
何かいい方法をよろしくお願いします。>>589

653 :デフォルトの名無しさん:2009/03/29(日) 20:52:33
>>651
http://msdn.microsoft.com/en-us/library/ms646839.aspx

654 :589:2009/03/29(日) 21:05:25
いいなー、凄いなー

655 :589:2009/03/29(日) 21:06:51
>>654
 ↑
これ無しwwww
NHK見てて間違ったwww

因みに589はマジレスですのでよろしくお願いします。

656 :デフォルトの名無しさん:2009/03/29(日) 21:12:35
void foo()
{
while(1)
{
Sleep(100);
if( _kbhit() )
{
printf("Time:%d\n", clock() );
_getch();
}
}
}

int _tmain(void){
HANDLE handle;
int id;
handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)foo, NULL, 0, (LPDWORD)&id);
while(1)
{
Sleep(1000);
printf("var\n");
}
}

657 :デフォルトの名無しさん:2009/03/29(日) 21:17:44
// VC++6.0 SP6
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>

void main()
{
time_t tm;
int i;

while (1) {
if (_kbhit()) {
i = getch();
if (i == 'e') {
break;
}
time(&tm);
printf("%d\n", tm);
}
Sleep(100);
}
}

658 :デフォルトの名無しさん:2009/03/29(日) 21:20:53
>>651です
Commdlg.hが足りていませんでした
事前調べ不足でした。>>653さんありがとうございます

659 :デフォルトの名無しさん:2009/03/29(日) 22:58:15
>>652
ちゃんとやろうとすると C/C++ の規格内では出来ない。
環境が Windows ならメッセージループを作るべきだろうけど…
あるいは既にレスがあるとおりスレッドを作るにしても、
メインスレッドとのやり取りには注意点は多いし。
初心者に説明するには結構こみいった話なんだわ。
ここで全てを説明するのはちょっと無理ってことをわかってくれ。
メッセージループやスレッドの基礎をわかってからまた来い。

660 :デフォルトの名無しさん:2009/03/30(月) 07:24:29
状態移管さえ把握すればCで出来ん訳ない。

661 :デフォルトの名無しさん:2009/03/30(月) 08:25:21
VC++を使ってますが、NULLを使おうとすると
#include <iostream>
とかしないとコンパイラが受け付けてくれません。
でも自前のヘッダがあるのでできるならインクルードしたくありません。
このばあいどうすればよいでしょうか
インクルードするしかないですか

662 :デフォルトの名無しさん:2009/03/30(月) 08:28:19
>>661
C++であるなら
NULL は確実に 0 のdefineなので
0 つかっとけ

663 :デフォルトの名無しさん:2009/03/30(月) 08:44:19
でもポインタの初期化であることをはっきりさせるためにNULLを使いたいんです。
自分で定義するのはだめですか


664 :デフォルトの名無しさん:2009/03/30(月) 08:51:44
>>661
VCバージョンいくつよ?
VC6なら窓から投げ捨てろ

665 :デフォルトの名無しさん:2009/03/30(月) 08:54:40
NULLが欲しいなら
#include <cstddef>
だろ

666 :デフォルトの名無しさん:2009/03/30(月) 08:55:40
>>663
#ifndef 使ってちゃんと囲っておけば
コンパイルや動作上の意味では問題は起こらないから
好きにすればいいんじゃないかな
重ねて言うがC++では 0 で定義されてるから

>>664
なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ

667 :デフォルトの名無しさん:2009/03/30(月) 09:15:52
>>662
実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。

668 :デフォルトの名無しさん:2009/03/30(月) 09:22:26
ほとんどのプログラムはstdio.hかwindows.hをインクルードするから
どっかでNULLは定義されるな
iostreamは知らん

669 :デフォルトの名無しさん:2009/03/30(月) 09:49:25
>>667
調べたらほんとに違うんだな

C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた
どうもありがとう


670 :デフォルトの名無しさん:2009/03/30(月) 09:58:13
>>668
NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。
それ以外を #include して定義されても処理系依存の動作。


671 :デフォルトの名無しさん:2009/03/30(月) 10:27:02
boost::shared_ptr<Test> p = new Test();
boost::shared_ptr<Test> p(new Test());
この2つはどう違いますか?
上のやつだとコンパイルできません。


672 :デフォルトの名無しさん:2009/03/30(月) 10:32:30
shared_ptrはポインタを取るコンストラクタがexplicitなので、
暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。

673 :デフォルトの名無しさん:2009/03/30(月) 10:33:19
>>670
NULL は cstddef のほかに cstring, ctime, cwchar, clocale, cstdio でも定義されることに
なっている。

C.2.2.4 Macro NULL より
> The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or
> <cwchar>, is an implementation-defined C++ null pointer constant in this International Standard.

674 :デフォルトの名無しさん:2009/03/30(月) 10:37:20
>>672
ありがとうです。
でもよくわかりませんでした。
boost::shared_ptr<Test> p = new Test();
という書き方は明示的にコンストラクタを読んでないということですか?


675 :デフォルトの名無しさん:2009/03/30(月) 10:47:49
明示的に呼ぶとこうなる

boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);


676 :デフォルトの名無しさん:2009/03/30(月) 10:55:12
>>675
それでできました!
Testクラス内にboost::shared_ptr<Test> mInstance;
というポインタを持たせてたのですが、初期化できずにこまってました。
(初期化をコンストラクタ以外の場所で行いたかったため、
mInstance(new Test())
とかってかけなかった。
ありがとうございました!


677 :デフォルトの名無しさん:2009/03/30(月) 10:56:47
>671の前者だと、Test *をboost::shared_ptr<Test>にキャストしようとして失敗するわけだね。

678 :デフォルトの名無しさん:2009/03/30(月) 11:16:02
>>677
なるほど。
あと、676のような場合は、scoped_ptr<Test>は使えませんよね?
コンストラクタで初期化しないから。


679 :デフォルトの名無しさん:2009/03/30(月) 11:21:53
>>677,678
微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと
>>675
の形でもshared_ptrのコンストラクタは一回しか呼ばれない


680 :デフォルトの名無しさん:2009/03/30(月) 11:25:43
>>676
reset(new Test()) 使えよ。

681 :デフォルトの名無しさん:2009/03/30(月) 11:34:23
>>678
コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。


682 :デフォルトの名無しさん:2009/03/30(月) 11:46:43
>>680-681
たしかに、scoped_ptr()でreset(new Test())使うとできました。
ありがとうございました。

683 :デフォルトの名無しさん:2009/03/30(月) 12:00:18
すいません。boostをucLinuxに入れようとしてます。
boost_1.38なんですが、boost::conditionが解決できません。
それ以外はコンパイルは通ります。
普通にfedora core7に入れてもだめです。

yum install boost-develだとうまくいくのですが、
なにかやり方があるのでしょうか?初心者ですいません。

684 :デフォルトの名無しさん:2009/03/30(月) 12:57:04
クラス内にスタティックなポインタを持たせたいのですが、そのポインタをスマートポインタにできるでしょうか?
class Test {
static boost::scoped_ptr<MyClass> m_MyClass;
};
これの実体を書くところで初期化までしようとしているのですがうまくかけません。



685 :デフォルトの名無しさん:2009/03/30(月) 13:04:21
>>684
とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。
それでもわからなければ、以上の全部を添えて相談するといい。

686 :デフォルトの名無しさん:2009/03/30(月) 13:24:56
>>685
言われたとおりにもう一回見直してみたらできました。
初期化は
boost::scoped_ptr<MyClass> Test::m_MyClass;
と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは
privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。
ありがとうございました。


687 :デフォルトの名無しさん:2009/03/30(月) 15:43:17
>>683
自己解決しました。
バージョンによって、ソース変えないといけないんですね。
インクルードを適度に増やして解決しました。

さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには
ライブラリがうまく出来ていません。

bjamの設定でコンパイラにオプションつけるにはどうしたら
いいんでしょうか?

クロス開発なんてしてる人はいないですかねw



688 :デフォルトの名無しさん:2009/03/30(月) 20:18:14
要はビルド時のコンパイラをクロスのものにしたいんだろ?
bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"...
でいいんじゃないのか

689 :デフォルトの名無しさん:2009/03/30(月) 23:56:13
WindowsXP
VisualStudio2005のVC++

フォームビューに配置したエディットコントロールで
「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが
これはなんなんでしょうか?
他アプリからコピーした文字列をそのエディットコントロールにペースト
して処理したいのですが。

ググってもどうにも見つからなくて…。

690 :デフォルトの名無しさん:2009/03/30(月) 23:59:03
カスタムからショートカットキーが消えてるとか言うオチはないか?w

691 :デフォルトの名無しさん:2009/03/31(火) 00:12:30
そのエディットコントロールにフォーカスした状態で
メニューバーの「編集」をドロップダウンすると
「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。
なんか悪いことしたっけ?

692 :デフォルトの名無しさん:2009/03/31(火) 00:19:59
>>689
ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?

693 :デフォルトの名無しさん:2009/03/31(火) 00:22:34
>>689
とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?

694 :デフォルトの名無しさん:2009/03/31(火) 00:34:31
あれ?
ID_EDIT_COPY等の
OnEditCopyとかを自分で記述しなきゃいけないん?
エディットコントロールって初めからコピー・カット・ペーストくらい
できるんじゃなかったっけ…。

695 :589:2009/03/31(火) 00:42:17
>>659
そうなんですか。どうもありがとうございます。
もっと勉強します。

696 :デフォルトの名無しさん:2009/03/31(火) 00:42:46
編集不可になってるとかってオチじゃないのか?

697 :デフォルトの名無しさん:2009/03/31(火) 01:04:16
>>696
エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。

今試したら,ダイアログベースのプログラムにエディットコントロールを配置して
ビルドすると普通にカット・コピー・ペーストできますね。
でもフォームビューだとできない…。
どちらにしても「Ctrl+A」はきかないし。

こんな超重要ポイントがなんで入門書で触れられていないんだろう。w

698 :デフォルトの名無しさん:2009/03/31(火) 01:16:47
OnEditCut()
{
m_edit1.Cut();
}

等を追加してなんとか解決しました。
エディットコントロールが勝手にやってくれると思い込んでいたもので…。
初心者の質問に付き合って下さった方々ありがとうございました。

699 :デフォルトの名無しさん:2009/03/31(火) 01:20:34
>>698
それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな?
まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。

700 :デフォルトの名無しさん:2009/03/31(火) 01:33:40
IsDialogMessage

701 :デフォルトの名無しさん:2009/03/31(火) 01:34:42
>>699
複数あるんです。w
今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。
あと「Ctrl+A」もぜひ装備したいし…。

702 :デフォルトの名無しさん:2009/03/31(火) 02:03:50
>>701
フォームビューだと勝手にやってくれなかったんだっけなぁ・・・?
と気になって試しにプロジェクト作ってみたら、やっぱできないわwww
というかむしろ、CDialogやCEditViewなら親切にやってくれてる、という話なんだろう。
ttp://www.vcppclub.com/bbs11/wforum.cgi?no=4256&reno=no&oya=4256&mode=msgview
ttp://support.microsoft.com/kb/145616/ja

703 :デフォルトの名無しさん:2009/03/31(火) 02:24:15
>>702
参照先ありがとうございます。
今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに
ペーストされる」みたいな珍妙な動作になっています。w
GetFocus()を試してみます。

704 :デフォルトの名無しさん:2009/03/31(火) 04:54:38
シングルトンで多態のクラスを作ったのですが、Baseクラスのコンストラクタとデストラクタを
プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected
に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか?
ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。


705 :デフォルトの名無しさん:2009/03/31(火) 06:30:49
生成と廃棄のコードをBaseの関数テンプレートにする。

706 :デフォルトの名無しさん:2009/03/31(火) 06:32:13
あ、廃棄はいいのか。寝起きだとボケてていかん。

707 :デフォルトの名無しさん:2009/03/31(火) 09:47:34
最近スマポについて色々質問させてもらっているものです。
もうちょっとだけ質問させてください。
スマポに保存しているポインタを取り出して関数とかに渡すとき、関数はスマポの形の
引数でポインタを受けるべきですか?それとも生のポインタで受けるべきですか?
class Hoge {
public:
boost::scoped_ptr<MyClass> m_MyClass;
};
というクラスがあるとして、このm_MyClassが持っているポインタを別の関数に渡すとき、
void func(MyClass *pMyClass);
void func(boost::scoped_ptr<MyClass> pMyClass);
このどっちの形にするべきなのか、わかりません。
どうかお願いします。


708 :デフォルトの名無しさん:2009/03/31(火) 09:50:50
scoped_ptrはコピーできないだろ

709 :デフォルトの名無しさん:2009/03/31(火) 10:24:57
>>688
mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。
bjamもバージョンで指定の仕方が違うなぁ。
試行錯誤しますです。

710 :デフォルトの名無しさん:2009/03/31(火) 11:03:04
>>706
ありがとうございます。
Baseをテンプレートクラスにして、関数テンプレートを受けとり
コンストラクタの代わりにつかう、ということですか?
すげえややこしそうな気が、、、

711 :デフォルトの名無しさん:2009/03/31(火) 12:26:30
>>688
gcc,g++等をシェルスクリプトで作ったらコンパイルできました!
引数もシェルスクリプトに入れたらスッキリインストール完了しました。

ところが、ucLibにはn_procs()というglibの関数がないんですね。
mips用のboostできたのに、ここからコンパイルできないや…
どこまでひっかかるんだか…


712 :デフォルトの名無しさん:2009/03/31(火) 12:38:57
大抵はシングルトンをペチペチ叩く棒が多態になってれば十分だよね?

713 :デフォルトの名無しさん:2009/03/31(火) 13:08:32
>>707
どっちでもない。参照を使え。

714 :デフォルトの名無しさん:2009/03/31(火) 13:09:36
>>704
よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。

715 :デフォルトの名無しさん:2009/03/31(火) 14:34:12
std::string buf;
std::ifstream ifs;
ifs.exceptions(std::ios_base::failbit);

//前半
ifs.open("a.txt");
std::getline(ifs, buf, '\0');
ifs.close();
buf.clear();

//後半
ifs.open("b.txt");
std::getline(ifs, buf, '\0');
ifs.close();

これを実行すると例外std::ios_base::failureが投げられるんですけど、どうすればファイルを2つ読み込めますか?
ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。

716 :デフォルトの名無しさん:2009/03/31(火) 14:41:47
>>715
前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも
同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の
ような気がする。

できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に
分けるとかするのがおすすめ。

717 :デフォルトの名無しさん:2009/03/31(火) 14:47:06
>>716
ありがとうございます。

718 :デフォルトの名無しさん:2009/03/31(火) 15:25:57
>>688
結局自力で解決できました。
boost::threadに相当するソースのget_nprocs(CPUの数)
を1にして、再度staticリンク指定したことで、
mips/ucLinuxのboostを作成でき、動作しました。

719 :デフォルトの名無しさん:2009/03/31(火) 17:35:41
質問なんですが、Effective C++を読んで
func(boost::scoped_ptr<X>(new X), boost::scoped_ptr<X>(new X));
としたらメモリリークの危険があるのは引数の実行順が不定だからであり、それは分かります
(前者のnew Xが実行の後、後者のnew Xが実行中そのコンストラクタで例外が出たときとか)

その本では、スマートポインタへnewしたポインタを渡すのは独立したステートメントでやろう、となっているのですが
func(boost::scoped_ptr<X>(new X));
とした場合も危険はあるのでしょうか
new X → shared_ptr → 引数呼び出しの順番は変わらないような気がするので


720 :デフォルトの名無しさん:2009/03/31(火) 18:39:42
それなら問題ないよ。

721 :デフォルトの名無しさん:2009/04/01(水) 04:19:11
>>719
危険性があるかどうかって話なら >720 のとおり無いんだけど、
あとで func() に引数を足した場合に問題が発生する形に変更されてしまう
可能性が高いんだからそんなコードを書いていいってことには
ならないよ。

722 :デフォルトの名無しさん:2009/04/01(水) 10:28:14
// value.cpp
namespace { int value = 5; }
int getValue() { return ++value; }

// use.cpp
int useValue() {
  return 2 * getValue();
}

// test.cpp
namespace { int n = useValue(); }

というようなコードを書いた場合、test.cppでuseValueが呼び出されると、
getValueのコードも既に実在しているハズだからvalueも初期化済みということになりますか?

723 :デフォルトの名無しさん:2009/04/01(水) 10:32:33
初期化順をコントロールするならシングルトンにしとけと、ばっちゃが(ry

724 :デフォルトの名無しさん:2009/04/01(水) 11:15:30
>>722
value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に
初期化されることは決まっている。

だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。

725 :デフォルトの名無しさん:2009/04/01(水) 12:36:59
ということは、関数の定義位置などとは関係なしに、変数の初期化順が決まるということですね。
そこら辺については未熟なので、勉強して理解できるようになるまでは、
何とか自分で扱えるような方法で考えてみます。ありがとうございました。

726 :デフォルトの名無しさん:2009/04/01(水) 14:36:43
>>166 を誰か考察して。

727 :デフォルトの名無しさん:2009/04/01(水) 15:30:21
class File {
public:
const char* data() const;
private:
boost::shared_array<char> m_Data;
};
こういうクラスがあって、m_Dataがcharの配列で、そこにデータが入ってます。
データは画像(バイナリ)です。そのデータにアクセスする手段として、
const char* data() const;
というのを作ったんですが、これは参照にすべきなのでしょうか?それとも
boost::shared_ptr<const char> data() const;
とかのように、ここでもスマポを使うべきでしょうか?
よろしくお願いします。


728 :デフォルトの名無しさん:2009/04/01(水) 18:47:12
>>727
そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。

getData(int index) でだめな理由はなんだろうか?
execute() で、内部にアルゴリズムを実装してはどうだろうか?
とか、考える方が先かも。


729 :デフォルトの名無しさん:2009/04/01(水) 18:49:35
>728には>727の書いていることが理解できないらしい。

・アクセス関数の戻り値の型をどうしたらいいか
というのが質問の趣旨ですぜ。

730 :デフォルトの名無しさん:2009/04/01(水) 19:34:11
ほうほうそれでそれで

731 :デフォルトの名無しさん:2009/04/01(水) 19:37:54
スマポへの参照がいいんじゃないかな。
生ポならそのままコピーしちゃうけど
スマポはクラスでおっきいから。

boost使ったことないからよくわからんけど

732 :デフォルトの名無しさん:2009/04/01(水) 19:41:47
>>727
template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);}
変な受け皿用意されたらコンパイル時に蹴る。

733 :デフォルトの名無しさん:2009/04/01(水) 22:36:19
C言語の質問です。
以下のコードがbus errorで死ぬんですが、何が間違っているのですか?

#include <stdio.h>
#include <stdlib.h>

void f(char **p);
int main(void)
{
char *p;
f(&p);
free(*p);
return 0;
}
void f(char **p)
{
*p = (char *)malloc(2);
*p[1] = 0;
}

734 :733:2009/04/01(水) 22:38:27
あ、すみません。free(*p)はfree(p)の間違いです。
それと、どうやら*p[1] = 0;のところで死ぬようです。

735 :デフォルトの名無しさん:2009/04/01(水) 22:42:41
> それと、どうやら*p[1] = 0;のところで死ぬようです。
(*p)[1] = 0;


736 :デフォルトの名無しさん:2009/04/01(水) 22:42:54
mmalock( sizeof(char *) * 2 );

737 :736:2009/04/01(水) 22:45:23
あれ、俺の頭がおかしい

738 :デフォルトの名無しさん:2009/04/01(水) 22:56:48
ああ、疲れてんだな

739 :デフォルトの名無しさん:2009/04/01(水) 23:18:38
>>735
演算子の優先順位の問題でしたか。ありがとうございます。

740 :デフォルトの名無しさん:2009/04/02(木) 02:44:47
>>166,726
未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。

741 :デフォルトの名無しさん:2009/04/02(木) 05:14:00
int *p = new int;
int *p = new int(1);
int *p = new int(100);
これってどう違うんですか?
全部コンパイル出来てしまいます。



742 :デフォルトの名無しさん:2009/04/02(木) 05:22:10
>>741
int *p = new int; ← 不定値
int *p = new int(1); ← 1で初期化
int *p = new int(100); ← 100で初期化


743 :デフォルトの名無しさん:2009/04/02(木) 08:48:19
>>742
ありがとうございました。

744 :デフォルトの名無しさん:2009/04/02(木) 14:51:45
メモリリークを検出しようと思い
#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

とやったのですが__CrtSetDbgFlagを呼ぶと
1>Frame.obj : error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _wWinMain@16 で参照されました。
と出ます アドバイスください;;

745 :デフォルトの名無しさん:2009/04/02(木) 14:56:26
>>744
リリースビルドでやってないよね?

746 :744:2009/04/02(木) 14:57:41
デバッグでやってます

747 :744:2009/04/02(木) 14:59:04
c/c++ コード生成 ランタイムライブラリ
がマルチスレッド(/MT)ですけど関係ありますかね

748 :デフォルトの名無しさん:2009/04/02(木) 15:06:57
/MTdじゃないのか?

749 :デフォルトの名無しさん:2009/04/02(木) 15:07:44
/MT は、リリースビルド用・・・

750 :744:2009/04/02(木) 15:10:18
すみません・・・・
勉強になりました
ありがとうございます

751 :デフォルトの名無しさん:2009/04/02(木) 23:31:23
>発注額929億円のうち地元業者が受注したのは13%の122億円だった。

スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。

752 :デフォルトの名無しさん:2009/04/02(木) 23:33:24
談合必要論か

753 :デフォルトの名無しさん:2009/04/02(木) 23:36:38
誤爆乙

754 :デフォルトの名無しさん:2009/04/02(木) 23:56:14
shared_ptrのスマポをNULLで初期化できますか?


755 :デフォルトの名無しさん:2009/04/02(木) 23:57:21
boost::shared_ptr<MyClass> m_MyClass =
boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0));
とやってできました。


756 :デフォルトの名無しさん:2009/04/03(金) 00:03:38
>>754-755
単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?

757 :デフォルトの名無しさん:2009/04/03(金) 00:19:11
>>756
そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?


758 :デフォルトの名無しさん:2009/04/03(金) 01:23:15
すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。
char data[100];
というデータがあるとき、
unsigned int func1(int i)
{
unsigned char* p = reinterpret_cast<unsigned char*>(data);
unsigned int r = p[i];
r |= p[i + 1] << 8;
r |= p[i + 2] << 16;
r |= p[i + 3] << 24;
return r;
}

unsigned int func2(int i)
{
unsigned int ret = data[i];
ret += data[i+1] << 8;
ret += data[i+2] << 16;
ret += data[i+3] << 24;
return ret;
}
この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合)
for (int i = 0; i < 100; ++i)
{
data[i] = 129;
}
どうしてでしょうか?


759 :デフォルトの名無しさん:2009/04/03(金) 01:30:10
>>757
デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ

760 :デフォルトの名無しさん:2009/04/03(金) 01:35:56
>>758
129 が CHAR_MAX より大きい可能性が高いな。

761 :デフォルトの名無しさん:2009/04/03(金) 05:59:03
ありがとうです。CHAR_MAXは127でした。
色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?


762 :デフォルトの名無しさん:2009/04/03(金) 06:23:45
>>761
その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる



763 :デフォルトの名無しさん:2009/04/03(金) 07:45:19
(1) unsigned char a = 0xff;
a = 0xff (255) を int 型にすると 0x000000ff (255)
※符号拡張の際、unsigned int 型を経由

(2) char a = 0xff;
a = 0xff (-1) を int 型にすると 0xffffffff (-1)

まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が
いちいちキャストしたりとか面倒なことをせずに済む

764 :デフォルトの名無しさん:2009/04/03(金) 08:12:15
>>761
そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。

一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763

765 :デフォルトの名無しさん:2009/04/03(金) 09:13:17
char を unsigned int に型変換するときは
int に符号拡張してから unsigned int に変換される

char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され
unsigned int 4,294,967,295 (0xffffffff) に変換される

766 :デフォルトの名無しさん:2009/04/03(金) 10:56:18
while(!(ret_cd = fetch_data())){
:
(フェッチしたレコードに関する処理部)
:
}
--------------------------
関数
int fetch_data(void)
{
:
(レコードデータ取得部)
:
return(0)
}
-------------------------
上記のようなプログラムで
while文の条件文の意味がよくわかりません。

全体の流れが「レコードが存在する間、処理を繰り返す」ような
処理ということはわかるのですが、
!(ret_cd=fetch_data())ときいている意味が
はっきりわからないのでどなたかお願いします。

767 :デフォルトの名無しさん:2009/04/03(金) 11:03:57
>>766
> !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?

768 :デフォルトの名無しさん:2009/04/03(金) 11:44:08
fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1)
を返すのだろう

レコードが存在する !(0) → 真となり、処理継続
レコードが存在しない !(-1) → 偽となり、処理終了

ぱっと見に分かりづらいから
while(!(ret_cd = fetch_data())){
  ↓
while((ret_cd = fetch_data()) == 0){
と書き換えてもいいかもしらん

769 :デフォルトの名無しさん:2009/04/03(金) 12:02:29
技術的な面以外で..
「〜をする意味」は有効な回答が付きづらい
概して「考えれば分かる」とか言われるのが落ち

質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは,
必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難

770 :デフォルトの名無しさん:2009/04/03(金) 12:06:14
単に、代入と検査を一緒にやってるだけだろ

771 :デフォルトの名無しさん:2009/04/03(金) 12:29:49
まあ>>768の通りだが、
おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。

!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。

772 :デフォルトの名無しさん:2009/04/03(金) 14:14:14
766です。
質問の仕方も曖昧ですみません。
レスいただきありがとうございます。
しかしまだ消化不足…といいますか、流れについて
いけてないです。現在修正中のプログラムが下記のような流れです。

@カーソルセット
EXEC SQL DECLARE cur_TEST CURSOR FOR
SELECT・・・
FROM・・・
WHERE・・・

EXEC SQL OPEN cur_TEST;

773 :デフォルトの名無しさん:2009/04/03(金) 14:15:05
Aフェッチしながら項目セット
while(!(ret_cd=fetch_data())){

 /* 中間ファイル構造体の各項目に値セット */
 sprintf(・・・)
 sprintf(・・・)

 /* 中間ファイルに出力 */
 if(temp_write(Ofp, &out)){
 fclose ( Ofp );
 strcat( Errmsg, "temp_write:write_error" );
 AB_sjmsg( Errmsg );
 putenv( Errmsg );
 return(-1);
 }
}

中間ファイルクローズ
fclose(Ofp)

return(ret_cd);

774 :デフォルトの名無しさん:2009/04/03(金) 14:15:48
(出力関数)
int temp_write( FILE *Ofp, struct TEST *dat )
{
int ret;

ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1;
ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1;
ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1;

return(ret ? 0 : -1);
}


775 :デフォルトの名無しさん:2009/04/03(金) 14:16:34
実は今回このwhile(!(ret_cd=fetch_data()))の中で
もうひとつテーブルを読み、そこで抽出したレコード(複数件)が
なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。

単純にやり方を真似てfetch_data2という関数をつくり、
while(!(ret_cd=fetch_data()))の中で
while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが
エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の
意味をはっきりさせようと思った次第です。

776 :デフォルトの名無しさん:2009/04/03(金) 14:16:45
で?

777 :デフォルトの名無しさん:2009/04/03(金) 15:04:11
>>776
死ね

778 :デフォルトの名無しさん:2009/04/03(金) 15:30:31
で、どこまで理解できて、どこが理解できなくて、
どんなエラーが出るの?

779 :デフォルトの名無しさん:2009/04/03(金) 15:40:55
途中で止まっており失礼しました。
わからない点は、!(ret_cd=fetch_data())の部分で、
ret_cdになんの値がセットされているかです。
int型で定義されてはいますが、これに値がセットされるところを
探しても見つけきれないので。
fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら)
return(1)」という処理が入っているので、セットされる値の変わり目が
はっきりとわかります。
なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。
もう少し詮索してみます。

780 :デフォルトの名無しさん:2009/04/03(金) 15:42:44
>>779
何の値、って、fetch_data() 関数の戻り値でしょ。

デバッガで一行ずつ追ってみれば? もしくは、printf とかで。

781 :デフォルトの名無しさん:2009/04/03(金) 15:59:14
>>779
ret_cd=fetch_data()
のところでret_cdには0か1がセットされる

782 :デフォルトの名無しさん:2009/04/03(金) 17:23:37
もうクビになっちゃえば

783 :デフォルトの名無しさん:2009/04/03(金) 18:00:59
>>766から>>779までの5時間を
本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw

784 :デフォルトの名無しさん:2009/04/03(金) 19:46:00
C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、
#include <stdio.h>
FILE *fopen(const char *, const char *);
int fileno(FILE *);
int fclose(FILE *);
#include <sys\stat.h>
int fstat(int handle, struct stat *statbuf);
の関数や構造体を使って作ったものの、あまり良くないようだ。
大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。
VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに
ほとんどアクセスしなくて済んでる。
ファイルを開かなくて取得できんのかな。いい方法ないもんか。

785 :デフォルトの名無しさん:2009/04/03(金) 19:51:09
まあそういうなよ。
おれたちも、766みたいな頃を経てきたわけだろ。
なんとなく、766はできないプログラマになりそうな気もするけど

786 :デフォルトの名無しさん:2009/04/03(金) 19:54:54
fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを
使った方が速いのかもね。

787 :デフォルトの名無しさん:2009/04/03(金) 19:57:55
じゃあ _stat(const char *, struct _stat *) とか
FindFirstFile/FindNextFileでもつかっとけよ。
Windowsならディレクトリエントリだけの話になるから。

788 :デフォルトの名無しさん:2009/04/03(金) 20:00:43
そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。
実際の値が必要なときは、これを使わざるを得ないんだけど。

789 :デフォルトの名無しさん:2009/04/03(金) 20:21:42
windowの関数を勉強しないとならんな
低レベルなプログラム書けるように勉強しないとならんな

790 :デフォルトの名無しさん:2009/04/03(金) 20:32:15
代入と評価を同時にしたら、読みにくくなるだろう。
横着やな。

791 :デフォルトの名無しさん:2009/04/03(金) 20:51:09
いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが

792 :デフォルトの名無しさん:2009/04/03(金) 20:55:16
日本語

793 :デフォルトの名無しさん:2009/04/03(金) 20:56:58
どこの方言か知らんけど意味わからん


794 :デフォルトの名無しさん:2009/04/03(金) 21:00:19
しらてと?

795 :デフォルトの名無しさん:2009/04/03(金) 21:03:05
すなみ
はにりいと
とんとかいも

796 :デフォルトの名無しさん:2009/04/03(金) 21:07:14
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ほら!(得意げに)』
彼女 『何これ?PC98じゃない!幻滅!』
おいら『え、だってみんなPC98が普通だし....』
彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。
    大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
    シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『...』
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
    こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
    スーファミじゃないんだからさ。分かるでしょ?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
    PCMは?MIDIは?使ってないの?』
おいら『....』
彼女 『動きが汚ーい!遅ーい!最低ー!
    スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
    なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『....』
彼女 『しょうがないからうちでX68000で遊ぶ?
    出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...』

以上実話です。


797 :デフォルトの名無しさん:2009/04/03(金) 21:13:35
1989年のWinしらてとて、386 2.1か。
WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。

798 :デフォルトの名無しさん:2009/04/03(金) 21:15:58
間違えた。
WinしらてとのAPIどころか、Winしらてと自体(以下略)

799 :デフォルトの名無しさん:2009/04/03(金) 21:23:15
うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ
20年前ってどうよ

800 :デフォルトの名無しさん:2009/04/03(金) 22:17:03
>>796
悔しいがワラタ

801 :デフォルトの名無しさん:2009/04/03(金) 22:35:23
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』
彼女 『うん!』
おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ
よ(得意げに)』
彼女 『何それ?ニフティとかのこと?幻滅!』
おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる
ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに
あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』
彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。
    大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
    シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った
基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の
情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ
のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる
と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う
し、、』


802 :デフォルトの名無しさん:2009/04/03(金) 22:38:38
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が
あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面
もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
    PCMは?MIDIは?使ってないの?』
おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』
彼女 『動きが汚ーい!遅ーい!最低ー!
    スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
    なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』
彼女 『しょうがないからうちでX68000で遊ぶ?
    出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』


803 :デフォルトの名無しさん:2009/04/03(金) 22:39:50
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
おんな『シネよキモデブ。二度と話しかけんな』

804 :デフォルトの名無しさん:2009/04/03(金) 23:40:26
>803
ついでに此処へも書き込みしないでいいよ。

805 :デフォルトの名無しさん:2009/04/03(金) 23:42:50
コピペとしてはまだまだいけてないな
もっとブラッシュアップしてくれ

806 :デフォルトの名無しさん:2009/04/03(金) 23:48:07
ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」
やりたいことは「stdin(fd=0)からCALLBACK関数」で、
順次データを読み出すだけなんですが、私の環境ではうまく動かないです。
止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、
もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか?
よろしくお願いします。以下、サンプルソース
#include <unistd.h>
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc,char **argv);
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data);
GIOChannel *gio;
int main(int argc,char **argv){
gtk_set_locale();
gtk_init(&argc,&argv);
gio = g_io_channel_unix_new(0);
fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN);
g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL);
gtk_main();
return 0;
}
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){
char temp;
fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr);
read(0,&temp,1);
fprintf(stderr,"temp(%d)\n",temp);fflush(stderr);
return TRUE;
}

807 :デフォルトの名無しさん:2009/04/04(土) 11:28:40
スマポで質問があります。

class MainClass;
class SubClass {
public:
void func2(MainClass* mc) {}
};
class MainClass {
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか?
}
private:
boost::shared_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}

どうかよろしくお願いします。


808 :デフォルトの名無しさん:2009/04/04(土) 11:31:52
お前どう見てもスマポの使い方判ってないからやめとけ

809 :デフォルトの名無しさん:2009/04/04(土) 11:39:33
scoped_ptrでいいじゃん

810 :デフォルトの名無しさん:2009/04/04(土) 11:39:47
>>808
どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。


811 :デフォルトの名無しさん:2009/04/04(土) 11:39:49
>>808
なんつー的確な指摘w

812 :デフォルトの名無しさん:2009/04/04(土) 11:40:58
どっちかとういうとthisがまったくわかってないじゃないか?

813 :デフォルトの名無しさん:2009/04/04(土) 11:46:52
なんつーか、『オムレツ作りたいんです! 教えてください!』と言って来た奴が
材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。
ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。

814 :デフォルトの名無しさん:2009/04/04(土) 11:49:53
色々返事くれてありがとう。
void func2(MainClass* mc) {}
ここなんですが、最初は
void func2(boost::shared_ptr<MainClass>& mc) {}
こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき
コンパイルが通りませんでした。スマポの使い方として、生のポインタは
基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると
thisはどうやって渡せばいいかわからなかったので。。。

815 :デフォルトの名無しさん:2009/04/04(土) 11:50:37
オムレツ作りたいんです!
はいいけど、君それ、手に持ってるのゆで卵だよね?

みたいな。

816 :デフォルトの名無しさん:2009/04/04(土) 11:51:37
>>813
なにか肝心なもの(フライパン)が抜けてるということですか?


817 :デフォルトの名無しさん:2009/04/04(土) 11:59:38
とりあえずconst

818 :デフォルトの名無しさん:2009/04/04(土) 12:08:37
m_SubClass->func2(boost::shared_ptr<MainClass>(this));
こう書くとAssertionに引っかかるし、、、
これって循環参照になってるから?


819 :デフォルトの名無しさん:2009/04/04(土) 12:26:50
プログラム中に可変で動的にメモリ確保をしたいのですが
Animationset m_animset;
という構造体があり、m_anim->GetAnimset();
というメソッドで個数が取得できます
m_animsetを最初から配列で100個くらい作っておけば問題ないのですが
可変で作る場合はどうすればいいのですか?

820 :デフォルトの名無しさん:2009/04/04(土) 12:28:59
>>819
vectorつかう

821 :デフォルトの名無しさん:2009/04/04(土) 12:29:56
>>820
ありがとうございますvectorについて調べてみます

822 :デフォルトの名無しさん:2009/04/04(土) 12:36:32
ダブルポインタでいいだろ

Animationset **m_animset;

823 :デフォルトの名無しさん:2009/04/04(土) 12:57:52
vector<AnimationSet> m_animset;

for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
m_animset.push_back(i);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}

という風にしたのですが
'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません
とエラーが出ます

メモリを確保するにはどうすればいいのでしょうか・・・・

824 :823:2009/04/04(土) 13:05:05
for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
AnimationSet anim;
m_animset.push_back(anim);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}

という風にしたらできました

825 :デフォルトの名無しさん:2009/04/04(土) 13:39:00
何が出来たの?

826 :デフォルトの名無しさん:2009/04/04(土) 13:50:42
>>807
enable_shared_from_this使えばいいんでないの?

827 :デフォルトの名無しさん:2009/04/04(土) 13:55:39
>>825
欲しい分だけメモリ確保です

828 :デフォルトの名無しさん:2009/04/04(土) 14:20:58
コピコンあるのね把握した

829 :デフォルトの名無しさん:2009/04/04(土) 17:57:33
>>822
ダブルポインタって、ただのポインタのポインタとなにが違うんですか?

830 :>>829:2009/04/04(土) 18:37:39
Ragnarok **m_ragna;

831 :デフォルトの名無しさん:2009/04/04(土) 18:39:38
>>829
その言葉を使う人間ができるプログラマかどうか。

832 :デフォルトの名無しさん:2009/04/04(土) 20:14:39
ダブルポインタ、なんて変な言葉使う人間こそプログラマじゃないだろうな

833 :デフォルトの名無しさん:2009/04/04(土) 20:35:11
>>826
enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると
Boostが例外を投げます。

class MainClass;
class SubClass {
public:
template <class T>
void func2(boost::shared_ptr<T>& mc) {}
};
class MainClass : public boost::enable_shared_from_this<MainClass>
{
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(shared_from_this());
}
private:
boost::scoped_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}

834 :デフォルトの名無しさん:2009/04/04(土) 20:42:29
>>833
ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。

835 :デフォルトの名無しさん:2009/04/04(土) 20:54:19
>>834
ありがとうございます。
>大元のm自体をshared_ptrに格納する
というのは、
boost::scoped_ptr<SubClass> m_SubClass;

boost::scoped_ptr<SubClass> m_SubClass;
とするということですよね?
そうしてもBoostから例外を投げられます。聞いてばかりですいません。。

836 :デフォルトの名無しさん:2009/04/04(土) 20:59:29
>>835
違う違う、こっち。
int main() {
boost::shared_ptr<MainClass> pm(new MainClass);
pm->func1();
return 0;
}


837 :デフォルトの名無しさん:2009/04/04(土) 21:09:54
>>832
俺、ポッぽインタって言っている
で、3つはぽっぽっぽインタだな

838 :デフォルトの名無しさん:2009/04/04(土) 21:10:23
>>836
なるほど、動きました!
thisがboost::shared_ptr<MainClass>でなければならなかったということですね。
本当にありがとうございました。

839 :デフォルトの名無しさん:2009/04/04(土) 21:17:04
C++再考 という本のサンプルコードの一部です、コンパイルすると、下記のエラーが出ます
何処がおかしいのでしょうか?

VS2005 pro SP1
winXP SP3

#include <iostream>

using namespace std;

class Expr_node {
  friend ostream& operator<<(ostream&, const Expr&);
  friend class Expr;

  int use;
protected:
  Expr_node():use(1){}
  virtual void print(ostream&) const = 0;
  virtual ~Expr_node(){}
};

error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

error C2143: 構文エラー : ',' が '&' の前にありません。

840 :デフォルトの名無しさん:2009/04/04(土) 21:22:15
>>839
friend ostream& operator<<(ostream&, const Expr_node&);
Exprなんて型ないからExprを変数名だと推定してる

841 :デフォルトの名無しさん:2009/04/04(土) 21:28:37
>>839
なぜエラー行を抜いた
class Expr;を前方宣言か?

842 :デフォルトの名無しさん:2009/04/04(土) 22:05:38
>>814
> スマポの使い方として、生のポインタは
> 基本的に全部スマポで置き換えるのが正しい

どこからそんなアホな理屈が出てきたんだ?

843 :デフォルトの名無しさん:2009/04/04(土) 22:10:59
全部が全部正しいとは思わないが
C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし
Googleコーディング標準でもスマポがいいねって書いてあるから
まぁ初心者はそのくらいの気持ちでもいいかも。

ただ、だからといってboostを使うのではなく
一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。
ちんぽちんぽ。

844 :デフォルトの名無しさん:2009/04/04(土) 22:16:10
Accelerated C++でもネタになってるな>スマポの自作

845 :デフォルトの名無しさん:2009/04/04(土) 22:17:31
>>843
貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ

846 :デフォルトの名無しさん:2009/04/04(土) 22:30:40
>>843
>807 の例は参照に置き換えれば済むだろう。

所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。

847 :デフォルトの名無しさん:2009/04/04(土) 22:33:15
>>846
ああなるほど。
確かに、参照が使えるところには
ポインタよりも参照を使うべきだというのには同意。

848 :デフォルトの名無しさん:2009/04/04(土) 22:33:25
もうね、スマポ

849 :デフォルトの名無しさん:2009/04/04(土) 23:01:56
>>840
>>841
スマンカッタ
大きな勘違いというか、錯誤していた
前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた
もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら
スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが
多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです
なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね

850 :デフォルトの名無しさん:2009/04/04(土) 23:13:03
今写経していた、C++再考 第8章 オブジェクト指向プログラムにもスマートポインタの原型のような、技法が載っていたよ
コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、
オブジェクトを破棄するという、実に巧妙な仕組みだね

851 :デフォルトの名無しさん:2009/04/05(日) 00:35:28
コピーコンストラクタ....ってなんだっけ。忘れちゃったよ、だめぽ

852 :デフォルトの名無しさん:2009/04/05(日) 02:50:30
関数にクラスを値渡しするときに呼ばれるやつ

853 :デフォルトの名無しさん:2009/04/05(日) 02:51:41
>>846
Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?


854 :デフォルトの名無しさん:2009/04/05(日) 02:59:29
>>853
所有権の移動や共有が必要ないなら、当然。

855 :デフォルトの名無しさん:2009/04/05(日) 06:56:41
下のクラスをビルドして実行するとコンストラクタでvectorがエラーになります
どこがまずいのでしょうか??

struct pointV
{
  int x ;
  int y ;
};

class Test
{
  std::vector<pointV> vecTest ;
public:
  Test()
  {
    vecTest.reserve(8) ;
    vecTest[0].x = 0 ; ←ここで発生するみたいです
  }
};

よろしくお願いします

856 :デフォルトの名無しさん:2009/04/05(日) 07:19:16
reserveじゃなくて、resize

857 :デフォルトの名無しさん:2009/04/05(日) 07:50:26
reserveだと配列の大きさ自体はそのままだったんですね
有難うございました

858 :デフォルトの名無しさん:2009/04/05(日) 13:08:57
weak_ptrを使ってよかった、という例があったら教えてください。
自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば
いいんじゃないか、と思ったんですが。


859 :デフォルトの名無しさん:2009/04/05(日) 13:21:17
>>858 http://www.google.co.jp/search?q=boost+weak_ptr

860 :デフォルトの名無しさん:2009/04/05(日) 14:25:12
256の倍数を入力すると正常な数値を出してくれません
内容はVBのテキストボックスに入力した数値をマイコンに送信し
マイコンに転送したCで作った制御プログラムで受け取り外部に転送するものです
いろいろ考えてみましたがさっぱりわかりません。よろしくお願いします
VB側
dim data(1) as Byte
data(0) = CByte(inputData Mod 256)
data(1) = CByte(inputData \ 256)
comSerial.Output = data
comSerial.Output = chr(0)

/*c言語*/
/*データ受信(マイコン側のフラグ処理は省略してます*/
unsigned char receive(void)
     unsigned char data;
     data = RDR;/*PCから受け取ったデータがあるレジスタRDR
     return(data);
int main(void)
{
unsigned char data[2];
int i;

while(1){
      i=0;
      do{
        data[i]=receive();
        i++;
       }while(data[i-1]!='\0');
};

861 :デフォルトの名無しさん:2009/04/05(日) 14:45:50
>>860
じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ…
あとVBガワのCOMポートはバイナリ?

862 :デフォルトの名無しさん:2009/04/05(日) 14:54:23
>>861
たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか
1024と入れるとほんの少ししか動きません。
VBがフリーズするときもあります。

VB側はバイナリーです。
よろしくお願いします

863 :デフォルトの名無しさん:2009/04/05(日) 14:57:07
256の倍数の値ということはdata(0)は0ということなので、マイコンの動作は正常なのでは?

864 :デフォルトの名無しさん:2009/04/05(日) 15:04:18
>>863
つまり0が送信された段階で'\0'と同じと判断されるのですね
0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました
データの終了判断は他の数値にした方がよさそうですね

865 :デフォルトの名無しさん:2009/04/05(日) 15:05:18
>>862
実機ないから試せないけど,1000まではちゃんと動作確認できたと.
あとは 1023 とか 1025 だとどうなる?正常?

ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる?

> VBがフリーズするときもあります。 
なんとなくパリティかボーレートが怪しい気がする.

プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない.
for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.

866 :デフォルトの名無しさん:2009/04/05(日) 15:06:30
>>864
そっちかー

867 :デフォルトの名無しさん:2009/04/05(日) 15:38:56
>>865
1023と1025は正常に動作しました

Cとは関係ない話になりますがPC側のフリーズは
1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか)
→VBの反応なくなる→タスクマネージャーで強制終了→VB再起動
→「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ
→後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない

こんな感じです。

C側はH8に転送してますので確認は出来ませんが
VB側は出来ると思います。
手元にシステムがないので今は無理ですが。

>>864
VBの送信も悪いですが受け取るC側にも問題があるようです

868 :デフォルトの名無しさん:2009/04/05(日) 16:28:42
>>867
VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん.
シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\

データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります

869 :デフォルトの名無しさん:2009/04/05(日) 16:50:15
>>858
すいません。まだやってません
というか\0\0というのは2回送信してCで受け取れってことでしょうか?

870 :デフォルトの名無しさん:2009/04/05(日) 17:08:45
>>869
まず仕様を確認しろよ

\0(=0x00) を終端としてるようだが、それだと 256の倍数で
おかしくなるのは当然に思える。



871 :デフォルトの名無しさん:2009/04/05(日) 17:12:01
そうそう。例えば、inputDataが256のとき、
data(0) = CByte(inputData Mod 256)
data(1) = CByte(inputData \ 256)
上は下と同じことだと忘れていない?
data(0) = 0
data(1) = 1

872 :デフォルトの名無しさん:2009/04/05(日) 17:13:52
まずはベーシック手順から

873 :デフォルトの名無しさん:2009/04/05(日) 17:21:54
エスパーすると、do〜whileのところは

data[0] = receive();
data[1] = receive();

にするのが正しいんじゃないかと思う

874 :デフォルトの名無しさん:2009/04/05(日) 17:54:13
みなさんありがとうございます
実習用のテキストだけどこういう感じです(´・ω・`)

>>870-871
アッー!!(;゙゚'ω゚')
そうだった。1バイト文字だからを終端にしたら256の倍数だと0ですよね

>>873
すいません。このプログラムは他の部分を除いて書いてるので
実は受信したデータが'O'だと次の文字見て'F'で正転、'R'で逆転みたいなことしています
でも受信したデータでdo〜whileを分ければいいだけでしょうけど

ちなみに数値データがある場合は
comSerial.Output = chr(80)←数値データあるよ
comSerial.Output = data
comSerial.Output = chr(0)←データ終わり
としています

入力されたデータはこんな感じです
dim inputData as Integer
inputData = Val(txtData.Text)

875 :デフォルトの名無しさん:2009/04/06(月) 00:13:00
C++で関数のグラフを作る問題があるんですけど、
グラフィックを表示するにあたって追加でインストール
しなきゃいけないものってあるんでしょうか?
OSはXP、visual c++ 2005を使用しています。

876 :デフォルトの名無しさん:2009/04/06(月) 00:16:03
VCありゃいける
GDI使うだろうし

877 :デフォルトの名無しさん:2009/04/06(月) 00:36:12
>>876
ですが教科書の通りにプログラムしても
なぜか動いてくれないんですよね・・・
これが問題ありそうな5,6,7、8行目なんですけど、

void CVc31view::OnDraw(CDC* pDC)
{
CVc31Doc* pDoc=GetDocument();
ASSERT_VALID(pDoc);

で、エラーがこう出ます。

ex3.1.cpp
.\ex3.1.cpp(5) : error C2653: 'CVc31view' : 識別子がクラス名でも名前空間名でもありません。
.\ex3.1.cpp(5) : error C2065: 'CDC' : 定義されていない識別子です。
.\ex3.1.cpp(5) : error C2065: 'pDC' : 定義されていない識別子です。
.\ex3.1.cpp(6) : error C2448: 'OnDraw' : 関数の定義が間違っています。



878 :デフォルトの名無しさん:2009/04/06(月) 00:51:24
>>877
CVc31view クラスの宣言はどうなってる?

879 :デフォルトの名無しさん:2009/04/06(月) 13:14:25
>>877
たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?


880 :デフォルトの名無しさん:2009/04/06(月) 13:54:04
int* pValue = new int[10];
pValue[1] = 10;

のように配列をnewすると、
代入時に*が付かないのに変数にpが付くのがシックリ来ません。

vector使えとか、そういう話とは別に
ポインタ変数にpを付けられているかたにお聞きしたいのですが、
こういう場合にもpを付けられていますか?
それとも、int value = new int[10]; と書かれてますか?

881 :デフォルトの名無しさん:2009/04/06(月) 14:02:57
宗教論争の予感。

882 :デフォルトの名無しさん:2009/04/06(月) 14:05:42
>>880
コーディング規約に従うだけ。
ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。


883 :デフォルトの名無しさん:2009/04/06(月) 14:09:59
おれは vector 使うし、ポインタだからって p 付けたりしないし、
話には参加できないな。うれしいぜ。

884 :デフォルトの名無しさん:2009/04/06(月) 14:12:42
>>880
その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。
# なんでvaluesじゃないのか、その方が気になる。

885 :デフォルトの名無しさん:2009/04/06(月) 15:39:41
それはpointerだから

886 :デフォルトの名無しさん:2009/04/06(月) 20:30:01
クラス内に性的なメンバがあってメモリ割り当てが必要な場合、それを初期化するタイミングは
クラスの外部でするべきでしょうか?



887 :886:2009/04/06(月) 20:37:48
すいません、間違えました。
-性的なメンバ
+静的なメンバ
あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには
publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか
わからずにいます。
目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で
1個あればいいんですが。



888 :デフォルトの名無しさん:2009/04/06(月) 20:44:33
最初のインスタンスが作られるときにクラスの内側で割り当ててもいいし、そうでなくてもいい。

889 :デフォルトの名無しさん:2009/04/06(月) 21:37:18
性的結合..いやらしい

890 :デフォルトの名無しさん:2009/04/06(月) 22:43:42
>>887
静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?

891 :デフォルトの名無しさん:2009/04/06(月) 23:20:39
スマートポインタについて最もよく解説されている本や
webページを教えて下さい。お願いします。

892 :デフォルトの名無しさん:2009/04/06(月) 23:23:47
使い方の解説? 実装の解説?

893 :デフォルトの名無しさん:2009/04/06(月) 23:50:57
実装の解説でお願いします。
概念はある程度わかるんですが実際 どうやって実装しているのか
分からないんです

894 :デフォルトの名無しさん:2009/04/06(月) 23:58:06
検索すればでてこない・・・?
boostのコードでも見たらどうか。

895 :デフォルトの名無しさん:2009/04/07(火) 00:14:27
あと、スマートポインタにもいろいろあるけど、どれのこと?
もっとも、基本はデストラクタでdeleteするという点は共通だけど。

896 :デフォルトの名無しさん:2009/04/07(火) 00:26:07
auto_ptr

897 :デフォルトの名無しさん:2009/04/07(火) 00:35:54
質問させていただきます
変数を宣言するときに
char buf[1000];
とするのと
char buf_0[100];
char buf_1[100];
...
...
char buf_9[100];
として確保するのでは、必要なメモリの量は変わってくるのでしょうか?

898 :デフォルトの名無しさん:2009/04/07(火) 00:37:02
>>897
やってみればいいじゃん。

899 :デフォルトの名無しさん:2009/04/07(火) 00:59:46
メモリが連続になるかならないかではないかな

900 :デフォルトの名無しさん:2009/04/07(火) 01:17:09
Cから見えるメモリの使用量は等しいけど、
実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない

901 :デフォルトの名無しさん:2009/04/07(火) 02:07:25
>>897
CPUのアラインメントの関係で違ってくるかもしれんな

902 :デフォルトの名無しさん:2009/04/07(火) 05:58:06
例えば、以下のように二次元配列の確保方法はありですか?
コンパイラは通ったんですが、なんか怪しいような。
そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか?

int (*p)[10] = new int [3][10]();

903 :デフォルトの名無しさん:2009/04/07(火) 09:53:36
テンプレートクラスが、std::vector<T>のメンバーを持っています。
ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと
初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、
vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?


904 :デフォルトの名無しさん:2009/04/07(火) 09:57:01
>>903
コンストラクタを実行していないクラスを生成する…
無理ぽ

905 :デフォルトの名無しさん:2009/04/07(火) 10:17:47
reserve(ほしい要素数); ってこと?

906 :デフォルトの名無しさん:2009/04/07(火) 10:37:15
C言語でHTMLを出力したいのですが
わかりやすく解説してるHPとかありますか?
QueryStringのやりとりが分からなくて困ってます

907 :デフォルトの名無しさん:2009/04/07(火) 10:45:44
>>906
http://pc11.2ch.net/test/read.cgi/php/1077753522/
http://pc11.2ch.net/test/read.cgi/php/1048393217/

908 :デフォルトの名無しさん:2009/04/07(火) 10:49:58
アリガトン
>>907


909 :デフォルトの名無しさん:2009/04/07(火) 11:56:23
VC++2008で開発しているものです。
F5で実行するたびに以下のようなMemoryManager::write()というログが出るのですが、
これはなにか問題があるのでしょうか?


[ MemoryManager::write() ]
totalSize = 16777216 ( 1000000 ) : 16.00MB
address size file line
02FF4B04 16392 unknown 0
02FFBE14 1152 unknown 0
02FFC294 1152 unknown 0
02FFC714 1152 unknown 0
02FFF384 32 unknown 0
02FFF3A4 32 unknown 0
02FFF3C4 24 unknown 0
02FFF3DC 48 unknown 0
02FFF474 24 unknown 0
02FFF48C 24 unknown 0
02FFF514 32 unknown 0

910 :デフォルトの名無しさん:2009/04/07(火) 12:02:32
>>909
こちらへどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/

911 :デフォルトの名無しさん:2009/04/07(火) 12:02:34
ARToolKitだろ。
そういう環境ちゃんと書かないとわからんよ。

912 :デフォルトの名無しさん:2009/04/07(火) 14:53:46
ええー?
そんなのインストールしてません。

913 :デフォルトの名無しさん:2009/04/07(火) 17:50:35
>>902
その解放は、delete[] pで問題ない。

914 :デフォルトの名無しさん:2009/04/07(火) 22:52:47
スマートポインタの一つがvectorって解釈でいいの?分からないので
質問。

915 :デフォルトの名無しさん:2009/04/07(火) 22:57:27
>>902
>>913
おれもそれが何を確保してるのかよくわからん。
int (*p)[10] = new int [3][10]();
コンパイルも通るし、
913の言うように、
delete [] p;
で開放できてるけど。
pはintのポインタの配列の先頭か?
それが3個配列になってるのを確保したのかな?


+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[0][0]

+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[1][0]

+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[2][0]

こんな感じ?
二次元配列はC++のnewでは一度には確保できないと思ったけどな。


916 :デフォルトの名無しさん:2009/04/07(火) 23:09:12
>>914
よくない

917 :デフォルトの名無しさん:2009/04/07(火) 23:16:22
>>915
ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=424
一応こんなのが見つかった

918 :デフォルトの名無しさん:2009/04/07(火) 23:25:06
じゃvectorはスマートポインタじゃないんだね?
何が違うの?vectorも勝手にデストラクタ呼ばれて解放される

919 :デフォルトの名無しさん:2009/04/07(火) 23:29:27
vectorインスタンスはポインタとして使えない。
ただ内部実装にポインタを使っているクラス。

内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。

920 :デフォルトの名無しさん:2009/04/07(火) 23:35:20
// VC++6.0
#include <stdio.h>

int main()
{
int (*ai)[4] = new int[3][4];
for (int i = 0; i < 3; i++) {
printf("%p\n", ai[i]);
}
delete[] ai;
return 0;
}

・実行結果
00380FE0
00380FF0
00381000

ま、2次元配列も割と簡単に扱えるみたいだ

921 :デフォルトの名無しさん:2009/04/07(火) 23:51:19
>>919
つまりvectorで確保した領域は、関数などでポインタ渡しが
できないってことですね?それは不便かも・・。

922 :デフォルトの名無しさん:2009/04/08(水) 00:06:51
クラスメンバのポインタにもアクセスすることも可能だと書いたんだけども。

923 :デフォルトの名無しさん:2009/04/08(水) 00:23:43
vector(コンテナ)は、vector自身がコピーされれば、中身のメモリ領域も丸ごとコピーされる。
スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。
メモリ領域は2つのスマートポインタで共有される。
みたいな。

924 :902:2009/04/08(水) 01:41:17
>>913,917
どもです。

同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが
delete [] p; でちゃんとできてました^^

925 :デフォルトの名無しさん:2009/04/08(水) 06:11:47
>>924
本当だ。
この方法で、3次元配列も出来た!
しらんかった。
あと、後ろの括弧は無しでも問題ないようだけど。。。
なんでこれで出来るのか、よくわからん。
でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、
あまり使い道はないかも。



926 :デフォルトの名無しさん:2009/04/08(水) 08:12:35
VC++.NETを使ってツールを作成しています。

ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、
それをShowControlBar関数を使って消したり出したりしているのですが、
表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、
変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。
クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには
どうすればよいでしょうか?

知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。

よろしくお願いします。

927 :デフォルトの名無しさん:2009/04/08(水) 09:47:39
意外と難しいかもな
DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る
逆に言えば入力フォーカスが移らない限り前面には出てこない
NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも

928 :デフォルトの名無しさん:2009/04/08(水) 10:22:39
MainFrame を owner にして ダイアログバーを Create すれば良いんでないの?

929 :デフォルトの名無しさん:2009/04/08(水) 10:23:54
Spy++でDialogBarへのメッセージを監視し、背面時にタイトルバーをクリックしたら

S WM_NCHITTEST x y
R WM_NCHITTEST HTCAPTION
S WM_MOUSEACTIVATE HTCAPTION WM_LBUTTONDOWN
R WM_MOUSEACTIVATE MA_NOACTIVATE

という感じになったので
WM_MOUSEACTIVATEのメッセージハンドラを作ってMA_ACTIVATEを返せばいいんじゃないかと思う

930 :デフォルトの名無しさん:2009/04/08(水) 11:23:14
DialogBarにメッセージハンドラを追加してみたが
メッセージが思うように飛んでこないので調べてみると

ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dlgbar.html
ダイアログバー上のイベントが、CDialogBarクラスまで来ないようだ。
したがって、イベントはCChildFrameで処理しなければならない。

CChildFrameをサブクラス化するなりしないとならないようだ
やれなくはないが、もっと簡単な方法はないだろうか・・・

931 :926:2009/04/08(水) 12:25:22
色々教えていただきありがとうございました。

>>927
おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると
フォーカスは移りました。

>>928
元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。

>>929
Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。
ただツールをしるきっかけを教えていただきありがとうございます。

>>930
教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。

試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の
マウスダウンイベントを拾える事を確認したので、そのイベント検知時に
this->SetFocus();   ・・・ダイアログバーのクラス内
をする事で、タイトルバー以外は思い通りの挙動にする事ができました。
これで今は妥協することにします。ありがとうございました。

932 :デフォルトの名無しさん:2009/04/08(水) 18:27:59
a<<1とa<<=1の違いを教えてください。

933 :デフォルトの名無しさん:2009/04/08(水) 18:30:25
実行後のaの内容が違う

a<<=1

a = a << 1

934 :デフォルトの名無しさん:2009/04/08(水) 19:26:37
>>925
後ろの括弧とはdeleteの右の[]のこと?
intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。
デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。

935 :デフォルトの名無しさん:2009/04/08(水) 21:03:45
最近Visual C++ 2008を使い始めたものです。
あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。
#define _SCL_SECURE_NO_WARNINGS
をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード
されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい
のですが、どうやればいいのでしょうか?
どうかよろしくお願いします。


936 :デフォルトの名無しさん:2009/04/08(水) 21:12:31
コンパイラオプションに
/D_SCL_SECURE_NO_WARNINGS
を指定する

937 :デフォルトの名無しさん:2009/04/08(水) 21:26:56
>>934
int (*p)[10] = new int [3][10]();
の最後の()のことじゃない?

938 :デフォルトの名無しさん:2009/04/08(水) 21:27:13
>>936
ありがとうございます。
コンパイラオプションってどこで指定できますか?
プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。


939 :デフォルトの名無しさん:2009/04/08(水) 21:54:34
質問です。

一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して
とある処理をしています。ウィンドウにフォーカスがある時より、ない時の
ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう
理由なんでしょうか?

ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが
独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも
思いましたが、特に過剰に呼ばれているわけでは無さそうでした。

940 :デフォルトの名無しさん:2009/04/08(水) 22:20:28
>>938
ツリービュー:構成プロパティ→C/C++→プリプロセッサ

構成:すべての構成

プリプロセッサの定義(/D[マクロ])
_SCL_SECURE_NO_WARNINGS

941 :デフォルトの名無しさん:2009/04/08(水) 22:21:05
ttp://www.01-tec.com/document/without_pointer.html

ここの、●バグその3「'\0'終端」
のサンプルプログラムの事なんですが、

#include <stdio.h> /* puts() */
#include <string.h> /* strcat() */

int main()
{
char buff[128] ;

strcat( buff, "ABC" ) ;

puts( buff ) ; /* ABCと表示したい */

return 0 ;
}

buffに終端NULLが入っていない為、putsの表示がうまくいかない事が
このプログラムの意図するところらしいのですが、"で囲まれた文字列には
暗黙的に'\0'が付加されるのでこのプログラムのように
strcat( buff, "ABC" ) ;
としても問題ないですよね?

942 :デフォルトの名無しさん:2009/04/08(水) 22:25:00
構成:すべての構成
にするとまずいんで(WIN32やら_DEBUGが消えてしまう)
Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で

943 :デフォルトの名無しさん:2009/04/08(水) 22:31:21
>>941
C言語の文字列では,終端記号があることを前提にしています。
しかし,charの配列を確保しただけでは文字列として初期化されているわけではないのです。
以下の例は,終端記号の存在(文字列としての初期化)を忘れたために失敗してしまった例です

#include <stdio.h> /* puts() */
#include <string.h> /* strcat() */

int main()
{
char buff[128] = ""; // こうすればおk

strcat( buff, "ABC" ) ;
puts( buff ) ; /* ABCと表示したい */
return 0 ;
}

944 :デフォルトの名無しさん:2009/04/08(水) 22:32:38
>>941
ちゃんとそこ読んだのか?
strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、
buffに'\0'が入っている保証はどこにもない

945 :デフォルトの名無しさん:2009/04/08(水) 22:42:19
>プログラマの都合よく '\0' で初期化されているわけではないのです。

初期化されないのは仕様だしな(スタックポインタを加減するだけ)
高級アセンブラは使う人を選ぶ

946 :デフォルトの名無しさん:2009/04/08(水) 22:47:38
>>944,943
ありがとうございます、
自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは
たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた
という認識で良いでしょうか

947 :デフォルトの名無しさん:2009/04/08(水) 22:49:25
C++ は「高度な抽象」とか「型安全」とかいうくせに
ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。
どういうことなんだ。ぷんぷん。

948 :デフォルトの名無しさん:2009/04/08(水) 22:50:19
どちらもできる柔軟な特性と前向きに捉えてみる

949 :デフォルトの名無しさん:2009/04/08(水) 23:05:04
C++はbetterなC
オブジェクト思考したいならJavaをやれ
C#・・・何それ?

950 :デフォルトの名無しさん:2009/04/08(水) 23:14:55
C#はVBみたいなもんだよな。

951 :デフォルトの名無しさん:2009/04/08(水) 23:19:37
C#使うぐらいならVBのほうがいいよ

952 :デフォルトの名無しさん:2009/04/08(水) 23:21:17
>933
ありがとうございます。
昔そんなことを習ったような気がします。


953 :デフォルトの名無しさん:2009/04/08(水) 23:21:31
VBなんか死んでもやらない。理由は無い。

954 :デフォルトの名無しさん:2009/04/08(水) 23:50:21
「無い」というのも立派な理由だよ

955 :デフォルトの名無しさん:2009/04/08(水) 23:58:29
同じ.NET frameworkを使っているだけで、VBとC#を一緒にするのはないわ

956 :デフォルトの名無しさん:2009/04/09(木) 00:04:13
似たようなもんだけどな。

957 :デフォルトの名無しさん:2009/04/09(木) 00:41:18
VB.netとC#は似たようなもん。

958 :デフォルトの名無しさん:2009/04/09(木) 02:11:18
>>947
言語のせいじゃないだろ。ライブラリの作者に文句言え。

959 :デフォルトの名無しさん:2009/04/09(木) 07:52:07

困っています。
http://www.kattch.com/~kattch/MySQL/06_3.html
fedoracore4でC言語とMySQLを接続しようとしているのですが、
実行するとセグメンテーションエラーが出ます。
record = mysql_fetch_row(result); の
mysql_fetch_row関数を使用しているところで落ちているのは
判ったのですが何が原因か判りません。
コンパイル時の指定が間違っているような気がしますが
わかる人がいたら教えてください。


関係ファイルのパス
/usr/include/mysql/mysql.h
/usr/lib/mysql/libmysqlclient.so
/usr/lib/mysql/libmysqlclient.a

コンパイル
gcc -o mysqlclient \
-I /usr/include/mysql/ \
-L /usr/lib/mysql/ \
-l mysqlclient \
mysqlclient.c

ソースファイル
mysqltest.c



960 :959:2009/04/09(木) 07:53:41
追記。
count = mysql_num_rows(result); の部分でも落ちます。

961 :959:2009/04/09(木) 08:02:44
ソースファイルは
mysqltest.cではなくmysqlclient.cの間違いです。

962 :デフォルトの名無しさん:2009/04/09(木) 08:20:45
result = mysql_store_result(&mysql_buf); ← SQL回答領域ハンドルの取得
このハンドルでエラーになってる可能性が高いな

963 :959:2009/04/09(木) 08:29:51
>>962
解決方法とか……何かあるでしょうか。。。

964 :959:2009/04/09(木) 09:01:17
>>962
おっしゃる通り、取得に失敗していました。

if(result = mysql_store_result(&mysql_buf)){
}
else
{
 printf("QUERY Error\n");
}


965 :959:2009/04/09(木) 09:19:30
>>962
判った!!!!!!!!!!!!!!!!!!!!!!
ありです。ばかやってました。

966 :デフォルトの名無しさん:2009/04/09(木) 09:30:25
>>963
ソースもなしで他人のデバッグなんかできませんが。
それとも、デバッグのノウハウを0から教えろと言うことでしょうか。

967 :デフォルトの名無しさん:2009/04/09(木) 09:41:09
esp

968 :デフォルトの名無しさん:2009/04/09(木) 10:08:03
関数の戻り値チェックはちゃんとしましょうということだろ

969 :デフォルトの名無しさん:2009/04/09(木) 11:26:47
PHPからCをCからPHPを呼び出す、もとい実行する方法ってある?

970 :デフォルトの名無しさん:2009/04/09(木) 11:40:46
>>969
systemやexec系の関数で出来るだろ

971 :デフォルトの名無しさん:2009/04/09(木) 12:01:34
そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな?
時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの
あるんだけど。


972 :デフォルトの名無しさん:2009/04/09(木) 12:03:17
過去ログ見ろとか言われても困るよなw

973 :デフォルトの名無しさん:2009/04/09(木) 12:57:43
boost::shared_ptr<Test> MemberFunction();
boost::shared_ptr<Test>& MemberFunction();
あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。
(名前はMemberFunction)。
このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか?
自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を
返すことに意味はあるでしょうか?


974 :デフォルトの名無しさん:2009/04/09(木) 13:14:58
参照を返したら外部からインスタンス内部のポインタをresetできる。
コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。

975 :デフォルトの名無しさん:2009/04/09(木) 13:20:34
>>974
外部から触って欲しくない時にはコピーインスタンスを返すべきということですか?
でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは
ないですか?

976 :デフォルトの名無しさん:2009/04/09(木) 14:42:25
scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、
呼出し元が破棄されたポインタを持たされる危険がある。
というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。

そもそもスマポは、Testインスタンスを参照する手段であって、
MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。


977 :デフォルトの名無しさん:2009/04/09(木) 20:46:08
スマポってセマンティクスはポインタだからな
Test*& MemberFunction();
と同じ事をしようとしてる

978 :デフォルトの名無しさん:2009/04/09(木) 20:57:10
>>975
コピーをお前はTest自体のコピーと考えているように見えて、
974はshared_ptrのコピーのことを指しているように見えるぞ。

979 :デフォルトの名無しさん:2009/04/09(木) 21:17:13
&じゃなくてconst&ならありなんじゃね?
値をコピーすると参照カウンタの操作が入って遅いだろうし。

980 :975:2009/04/09(木) 22:10:14
でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか?
スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより
30倍近く時間がかかってました。
でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?




981 :デフォルトの名無しさん:2009/04/09(木) 23:02:14
速度を本当に気にするような場面ならそもそもスマポを使うな。

しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。
30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、
それが30倍になろうとも余程の大量コピーでない限り全く気にならない。

982 :デフォルトの名無しさん:2009/04/09(木) 23:06:31
shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。
そもそもオブジェクトが何かの参照を返す事自体問題がある。

983 :975:2009/04/10(金) 01:02:41
そうなんですか。。。
実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し
(スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、
最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、
なんでかなとおもってたのですが。、。

984 :デフォルトの名無しさん:2009/04/10(金) 01:24:38
スマポの参照返すくらいなら普通に参照返せばいいんじゃ?

985 :デフォルトの名無しさん:2009/04/10(金) 01:37:00
ぬるりーは怖いぜよ

986 :デフォルトの名無しさん:2009/04/10(金) 02:03:51
返ってきたスマポの参照が本当に有効なスマポを指してるのか
知らない間に外からいじくられないか
いつまで生きてることが保証されてるのか
そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ

危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて
ストーブ炊いて暑いからってクーラーかけるようなもの
馬鹿げてる

987 :デフォルトの名無しさん:2009/04/10(金) 02:26:16
ぬるぽは怖いぜよ

988 :975:2009/04/10(金) 06:56:20
じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。
ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない
と思ったんだよな。
ちょっと聞いてみます。


989 :デフォルトの名無しさん:2009/04/10(金) 07:25:22
30倍遅いっても怪しい感じだな
そんなに遅くなるか?

誰か試してくれ

990 :デフォルトの名無しさん:2009/04/10(金) 07:28:34


991 :デフォルトの名無しさん:2009/04/10(金) 08:19:19
shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。

992 :975:2009/04/10(金) 09:00:38
この前30倍近く遅かったと書いたけど、こんなコードでやってました。
Forループの中を入れ替えて時間計ったら、素のポインタだと2秒、
スマポだと70秒だった。(最適化は無し)
ちなみに自分の環境は、VistaでCPUはT8100の2.1Ghz

#include <iostream>
#include <ctime>
#include <boost/shared_ptr.hpp>
class Test {
public:
Test() {}
~Test() {}
};
int main() {
boost::shared_ptr<Test> sp1(new Test());
Test* p1(new Test());
time_t t1,t2;
time(&t1);
for (int i = 0; i < 300000000; ++i) {
boost::shared_ptr<Test> sp2(sp1);
// Test* p2(p1);
}
time(&t2);
std::cout << t2-t1 << std::endl;
return 0;
}


993 :デフォルトの名無しさん:2009/04/10(金) 09:08:36
ume

994 :デフォルトの名無しさん:2009/04/10(金) 09:16:24
最適化なしで較べるなよ。JK

995 :975:2009/04/10(金) 09:53:52
だって最適化してもポインタのコピーがちゃんと行われるように書くの
面倒じゃないですか?
最適化しないとだめですか?


996 :デフォルトの名無しさん:2009/04/10(金) 09:57:16
実際のソフトで時間計らないと意味がない。
1ms秒が30msかかった所で、もし同じ頻度で呼ばれる関数が1秒かかっていたら
初めの差は無視できる。

997 :デフォルトの名無しさん:2009/04/10(金) 10:00:57
自分の場合は、スマートポインタやGCなどは使わない。使いこなせない。
STLの変数生成速度でも気になるから、グローバルに定義してしまうなどする。
全てではなく多く回数使うやつなどね。

998 :デフォルトの名無しさん:2009/04/10(金) 10:07:03
気になるからとか気分じゃなくて実測して、
それが本当にボトルネックになってるか確認してからにしようぜ。
意味の無い自己満足な最適化はコードを読みにくくするだけで、
何のメリットないからな。

999 :デフォルトの名無しさん:2009/04/10(金) 10:12:36
gotoは除外すべきという説があるが、多重ifの方を無くすべきだ。
if else を続けるとかなり難解になってしまう。

1000 :デフォルトの名無しさん:2009/04/10(金) 10:15:53
>>998
実際にstringを使うアルゴリズムで実測してみた経験から。
string、resizeを頻繁にするとcopyや生成でかなり食っている。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

261 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)