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;

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)