【初心者歓迎】C/C++室 Ver.64【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/02/10(火) 00:25:51ただしその場合、質問者は必ず環境を書きましょう。
※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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2009/02/10(火) 03:24:45ウィンドウを開いてユーザーにディレクトリを選ばせて、そこから
ファイルを開くようにしたいのですが、どう書けばよいですか?
しょぼい質問ですいませんがお願いします
0003デフォルトの名無しさん
2009/02/10(火) 03:35:200004デフォルトの名無しさん
2009/02/10(火) 04:01:040005デフォルトの名無しさん
2009/02/10(火) 07:43:220006デフォルトの名無しさん
2009/02/10(火) 09:50:58ヘッダでのクラス宣言時にそのクラスのヘッダまでインクルードして
外に見せているのが違和感あるのですが、これは仕方の無いことなのでしょうか?
それとも、ヘッダでは最初に
class COther;
と宣言だけしておいて、
private:
COther* m_pOther;
とポインタでメンバを定義して、ヘッダはソース内でインクルードして
実体はコンストラクタでnewするとかの方法のほうが
よく使われるものなのでしょうか?
0007デフォルトの名無しさん
2009/02/10(火) 10:39:22こういう話か?
--OtherClass.h
class OtherClass {
};
--SomeClass.h
#include <OtherClass.h>
class SomeClass {
OtherClass member;
};
--
だとしたら、使う方は#include <SomeClass.h>だけで済むがそれの何が不満なんだ?
0008デフォルトの名無しさん
2009/02/10(火) 10:41:39pimplイディオムだな
0009デフォルトの名無しさん
2009/02/10(火) 10:53:06たとえばクラスをエクスポートするライブラリを作る場合、
そのクラスのメンバに使っているクラスもエクスポートする必要が出てきます。
privateで使っているだけで、利用者側には全く関係無いクラスなのに、
なんでそれらまでエクスポートしなくてはいけないのかと思いました
(カプセル化できてないのではと思いました)。
>>8
この単語は初めて知りました。
さっそく検索してみます。
0010デフォルトの名無しさん
2009/02/10(火) 12:49:30その継承クラスを継承したクラスでオーバーライドすることはもうできないんでしょうか?
0011デフォルトの名無しさん
2009/02/10(火) 12:54:11基本クラスでvirtualならオーバライドしたものもvirtual
0012デフォルトの名無しさん
2009/02/10(火) 19:50:17インタフェースクラスを作って、
実際にはその実装クラスを 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 メンバ関数を追加するのが面倒臭いという欠点がある。
0013デフォルトの名無しさん
2009/02/11(水) 02:20:51でa == bの時点でもうどっちに分岐するか結果出てると思うんですが、この場合c==d計算されないんですか?
if(a==b){
if(c==d){}
}
こう書いた方が安全ですか?もしa==bがFalseの場合c==dを評価するとエラーになる場合なんです
0014デフォルトの名無しさん
2009/02/11(水) 02:26:08C / C++ において && の左辺が偽なら右辺は評価しないことは
保障されてる
一応例外として、 &&演算子がオーバーロードされてればその限りではない
0015デフォルトの名無しさん
2009/02/11(水) 02:30:570016デフォルトの名無しさん
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値での分岐内の処理がダブってるのを何とかしたいんです
0017デフォルトの名無しさん
2009/02/11(水) 02:39:220018デフォルトの名無しさん
2009/02/11(水) 02:48:48テンプレート関数にすれば?
0019デフォルトの名無しさん
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()
}
0020デフォルトの名無しさん
2009/02/11(水) 03:09:320021デフォルトの名無しさん
2009/02/11(水) 03:14:08template<typename T>
void func(T t)
{
t.resize(0);
}
じゃだめなの?
0022デフォルトの名無しさん
2009/02/11(水) 03:52:05union {
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 実現はテンプレ関係なしバージョンで十分
0023デフォルトの名無しさん
2009/02/11(水) 04:08:29ありがとう
0024デフォルトの名無しさん
2009/02/11(水) 05:29:22vectorは共用体に入れられない
0025デフォルトの名無しさん
2009/02/11(水) 06:17:08B→A:B{<int>}, C:B{<double>}
D{B *b; D(f){f?b = new A: b = new B;}; };
0026デフォルトの名無しさん
2009/02/11(水) 12:04:43俺なら D を用意する変わりに factory 作るだろうな。
そんで map<key, factory> みたいなので get して Create()。
0027デフォルトの名無しさん
2009/02/11(水) 14:24:46もしかしたらテンプレートクラスで済む話なのかもしれない。
0028デフォルトの名無しさん
2009/02/11(水) 14:29:09一つのクラス内に持たせていることが疑問。
設計がおかしい。
0029デフォルトの名無しさん
2009/02/11(水) 14:55:48{
if(a>10)
a=10;
return a+1;
}
のように引数で渡された変数を変更しても問題ありませんか?
0030デフォルトの名無しさん
2009/02/11(水) 14:59:21大丈夫
0031デフォルトの名無しさん
2009/02/11(水) 20:01:43大丈夫ではあるけど、
関数内で二度と a の元の値を使えなくなってしまうので注意。
後になって処理を追加した際に、
途中で値が変更されてるのを忘れて処理を追加して
上手く動かねーとかなるといけないから、
なるべくなら別変数を作った方が好ましいし、
それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。
0032デフォルトの名無しさん
2009/02/11(水) 20:28:26ありがとうございます
0033デフォルトの名無しさん
2009/02/11(水) 21:19:28{
if(a>10)
a=10;
return *b++;
}
0034デフォルトの名無しさん
2009/02/11(水) 21:44:16wwww
0035デフォルトの名無しさん
2009/02/13(金) 23:05:140036デフォルトの名無しさん
2009/02/13(金) 23:29:010037デフォルトの名無しさん
2009/02/14(土) 02:10:040038デフォルトの名無しさん
2009/02/14(土) 02:43:26void 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));
}
どっかに考え方が判り易くまとまった資料ない?
正解不正解はコンパイル通してみるまで判らない自分。
0039デフォルトの名無しさん
2009/02/14(土) 03:23:09Borland C Compiler 5.5にて
MAKELONGマクロが警告にひっかかってしまいます。
windef.hの定義を見るに括弧が足りないのが原因のようです。
これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?
0040デフォルトの名無しさん
2009/02/14(土) 07:52:34windef.hのミスだね
本家のWinDef.hは括弧が多かった
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
0041デフォルトの名無しさん
2009/02/14(土) 07:55:25004239
2009/02/14(土) 11:12:03ありがとうございます。
MAKELONGを(あとMAKEWORDも)
#undefして括弧増やした#defineしなおしてもいいもんでしょうかね?
0043デフォルトの名無しさん
2009/02/14(土) 11:43:07しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ
簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか
004443
2009/02/14(土) 11:45:56の間違いでした
0046デフォルトの名無しさん
2009/02/15(日) 08:59:26char hoge[40];
みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?
0047デフォルトの名無しさん
2009/02/15(日) 09:13:07がいいかな
0048デフォルトの名無しさん
2009/02/15(日) 09:18:16それでできました!
0049デフォルトの名無しさん
2009/02/15(日) 09:24:24_T("ddd");
TEXT("ddd");
これって書き方が違うだけで同じですか?
0050デフォルトの名無しさん
2009/02/15(日) 09:39:22強いて言うなら、前者はCライブラリの拡張で、後者はWin32。
ちなみに前者のバリエーションで_TEXTもある。
0051デフォルトの名無しさん
2009/02/15(日) 23:26:08TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。
0052デフォルトの名無しさん
2009/02/15(日) 23:33:30その画像をまとめてメモリデバイスコンテキストに選択して、
「最終的に表示する画面」を先に作る方法が分からないので、
どなたか教えていただけないでしょうか。
環境は WinAPIです。
よろしくおねがいします
0053デフォルトの名無しさん
2009/02/16(月) 00:09:310054デフォルトの名無しさん
2009/02/16(月) 00:45:17処理の途中で指定した関数を入れたいんです。
0055デフォルトの名無しさん
2009/02/16(月) 00:46:34関数ポインタというのがあってだな
0056デフォルトの名無しさん
2009/02/16(月) 00:51:080057デフォルトの名無しさん
2009/02/16(月) 01:02:45void Func(){}
X.pfFunc = Func;
// class X
void (*pfFunc)();
void Shori(void pfFunc()){
(*pfFunc)();
これどうやって引数に渡す時と、使うとき書けばいいですか?
0058デフォルトの名無しさん
2009/02/16(月) 01:09:27すいません言い方が悪かったです
画像2枚だと考えてください
背景の画像と 矢印の画像です。
よろしくおねがいします
0059デフォルトの名無しさん
2009/02/16(月) 01:51:58WinAPIスレにでもどうぞ。
>>57
メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。
「メンバ関数のポインタ」とでもして、検索してみることをお勧め。
0060デフォルトの名無しさん
2009/02/16(月) 03:19:29newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?
0061デフォルトの名無しさん
2009/02/16(月) 03:53:17NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか?
というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?
0062デフォルトの名無しさん
2009/02/16(月) 04:04:37NULLするってなんだよ?
0063デフォルトの名無しさん
2009/02/16(月) 04:08:33どうやんお? でちょっと笑た
ポインタとメモリの動的確保についてもーちょい学ぶべき
NULLするってのはNULL入れるってことかい
0064デフォルトの名無しさん
2009/02/16(月) 04:12:26データはペットの犬
手綱は他人のペットにも付けられるが そのペットは苦しい。
自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが
他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。
他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が
0065デフォルトの名無しさん
2009/02/16(月) 04:22:530066デフォルトの名無しさん
2009/02/16(月) 04:28:14これじゃあライブラリとして使えなく無いですか?
設計を見直せですか?
0067デフォルトの名無しさん
2009/02/16(月) 04:29:23全くの無意味ではないが楽しく一緒に遊んでくれない。
土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。
だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある
0068デフォルトの名無しさん
2009/02/16(月) 04:37:03全く集中できなくなった
0069デフォルトの名無しさん
2009/02/16(月) 05:07:23static int a = 0;
とした場合このaは関数を抜けても保持されるんでしょうか?
起動時最初の一回しか変数が存在しないことになるんでしょうか?
0070デフォルトの名無しさん
2009/02/16(月) 05:38:57スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える
だからアドレスを渡して関数外からアクセスしようが問題ない
0071デフォルトの名無しさん
2009/02/16(月) 06:06:42>>60>>61>>66
もお願いします!
0072デフォルトの名無しさん
2009/02/16(月) 06:50:02structA 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で帰ってくる値はどういう値ですか?
0073デフォルトの名無しさん
2009/02/16(月) 06:57:12structAが何バイトか(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)はどちらもポインタのサイズになる(配列のサイズではない)
0074デフォルトの名無しさん
2009/02/16(月) 07:12:22{ { 1, 2, }, {3, 4,}, }
4個*4バイト=16バイト
が返るようにするにはどうすればいいですか?
[]付けたんですけど
funcの中で
structA b[];
b = bufa;
としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか
0075デフォルトの名無しさん
2009/02/16(月) 07:24:43bに代入はできない
b[0] = とかはできるけど
0076デフォルトの名無しさん
2009/02/16(月) 07:27:03C# の 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;
};
0077デフォルトの名無しさん
2009/02/16(月) 07:31:00boost::function.hpp
を使うとか
0078デフォルトの名無しさん
2009/02/16(月) 10:57:01C++でも出来ないとこってあるんですね
サイズは送り元で計算して引数は増えますが一緒におくることにしました。
受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、
サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。
が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?
0079デフォルトの名無しさん
2009/02/16(月) 12:11:20boost調べたら簡単にできました。
ありがとうです!
//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(){}
0080デフォルトの名無しさん
2009/02/16(月) 12:38:17function<void ()> f_buf
が
function<int ()> f_buf
だったり
function<bool ()> f_buf
だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか?
メンバ関数ポインタと結局同じなことに気づきました・・・
0081デフォルトの名無しさん
2009/02/16(月) 12:39:55これはどういう意味なんでしょうか
0082デフォルトの名無しさん
2009/02/16(月) 12:49:04関数オブジェクトでぐぐったら使い方含めてわかるかもよ
0083デフォルトの名無しさん
2009/02/16(月) 13:16:23こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。
class Hoge
{
public:
static Hoge* Craete(int x) {return new Hoge(x);}
private:
Hoge(int);
}
0084デフォルトの名無しさん
2009/02/16(月) 13:19:07実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、
クラスの変数();
とすれば処理が実行されるということですね
ありがとうございました。
0085デフォルトの名無しさん
2009/02/16(月) 13:20:31実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。
戻り値を見ないなら全部function<void ()>型にすればいい。
0086デフォルトの名無しさん
2009/02/17(火) 16:24:20char str[]="年齢は10,性別は男";
例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると
age=10,sex=男が得られるようにする関数です。
よろしくお願いします。
0087デフォルトの名無しさん
2009/02/17(火) 16:26:240088デフォルトの名無しさん
2009/02/17(火) 16:40:27それです。^^;
あったような気がしていたのですがprintが
入っている名前の関数だと思い込んで探していました。
助かりました。ありがとうございました。
0089デフォルトの名無しさん
2009/02/18(水) 11:39:570091デフォルトの名無しさん
2009/02/18(水) 12:00:21void Func(){}
void * f = Func;
(*f)();
0092デフォルトの名無しさん
2009/02/18(水) 12:03:45この場合thisを入れればいいんですか?
009343
2009/02/18(水) 12:22:54コールバック関数のポインタを引数にして渡す
#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;
}
0094デフォルトの名無しさん
2009/02/18(水) 12:26:57状況によるだろう。
でもハンドルと書いてあるからthisはないと思うよ。
なんとなく、hInstanceいれるとこみたいだが。
0095デフォルトの名無しさん
2009/02/18(水) 12:38:56ありがとうです!
その場合CALLBACKがつくのはどれなんでしょうか
メンバ関数もコールバックとして渡せるんですか?
0096デフォルトの名無しさん
2009/02/18(水) 12:41:45LRESULT CALLBACK WndProc
はまた別物ですか?
0097デフォルトの名無しさん
2009/02/18(水) 14:22:14勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?
0098デフォルトの名無しさん
2009/02/18(水) 14:25:430099デフォルトの名無しさん
2009/02/18(水) 14:43:22CALLBACKがどう#defineされてるか見てみるといい
0100デフォルトの名無しさん
2009/02/18(水) 14:49:12class 関連 CUI じゃツライす
010143
2009/02/18(水) 16:26:59コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ
メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない
0102デフォルトの名無しさん
2009/02/18(水) 17:09:50そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う
0103デフォルトの名無しさん
2009/02/18(水) 20:51:27union {
struct { float x, y, z, w; };
float m[4];
};
};
と書いた時、
xのアドレス == &m[0] 、yのアドレス == &m[1]、 …
になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?
0104デフォルトの名無しさん
2009/02/18(水) 21:43:59あとはコンパイラ次第
0105デフォルトの名無しさん
2009/02/18(水) 21:45:58LRESULTは戻り値の型、>>91でのvoid、
WndProcは関数名、>>91でのFuncにあたる。
CALLBACKは他の人の言うとおり。
0106デフォルトの名無しさん
2009/02/18(水) 21:46:44少し時間を置いてから連続で発行されるんですか?
キーボードからの入力でキャラクタを動かしているのですが、
キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応
→キャラクタが連続で動く、となってしまいます。
ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる
処理をしたいのですが・・
0107デフォルトの名無しさん
2009/02/18(水) 21:53:06GetAsyncKeyState
0108デフォルトの名無しさん
2009/02/18(水) 22:08:17こんな便利なものが・・・
ありがとうございます。
0109デフォルトの名無しさん
2009/02/19(木) 04:45:06クラスの中に入れるとめたくそ難しいんですが
0110デフォルトの名無しさん
2009/02/19(木) 05:12:320111デフォルトの名無しさん
2009/02/19(木) 05:24:48静的関数ならいんでしょうか
0112デフォルトの名無しさん
2009/02/19(木) 05:34:41thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。
まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。
0113デフォルトの名無しさん
2009/02/19(木) 05:55:23AfxBeginThread(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でも同じなんです。マルチスレッドをクラスのメンバでやるのはそうとう強引で特殊ですか?
0114デフォルトの名無しさん
2009/02/19(木) 06:19:42にほんごよめますか?
>112
>まぁ、環境も書かなきゃエラーメッセージも書かないということは
0115デフォルトの名無しさん
2009/02/19(木) 13:37:43ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です
0116デフォルトの名無しさん
2009/02/19(木) 13:42:45マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。
どう書けばいいんですか?
0117デフォルトの名無しさん
2009/02/19(木) 13:56:140118デフォルトの名無しさん
2009/02/19(木) 14:19:28プログラム中のどこだかわからなくなるので
先頭に置いてファイル名を変えられるようにしたいんです
0119デフォルトの名無しさん
2009/02/19(木) 14:38:07#define filename _T("test.txt")
0120デフォルトの名無しさん
2009/02/19(木) 14:56:560121デフォルトの名無しさん
2009/02/19(木) 17:46:10(非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない
という点はエラーメッセージの言うとおり。
そうやってメンバ関数へのポインタを得たところで、>>113のようにできないわけは、
メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。
その主な理由は、仮想関数にもきちんと対応しないといけないことから。
メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。
0122デフォルトの名無しさん
2009/02/19(木) 17:47:35#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);
}
0123デフォルトの名無しさん
2009/02/19(木) 18:10:21これでよくね?
0124デフォルトの名無しさん
2009/02/19(木) 18:50:290125デフォルトの名無しさん
2009/02/19(木) 19:50:16Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。
無いなら、MultiByteToWideChar使え。
0126デフォルトの名無しさん
2009/02/19(木) 19:50:41AfxBeginThreadって関数オブジェクト引数に取れるのか?
0127デフォルトの名無しさん
2009/02/20(金) 10:01:57難しすぎて誰もわからないに一票
0128デフォルトの名無しさん
2009/02/20(金) 10:33:23インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?
0129デフォルトの名無しさん
2009/02/20(金) 14:14:09istream_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));
}
0130デフォルトの名無しさん
2009/02/20(金) 14:15:530131デフォルトの名無しさん
2009/02/20(金) 14:19:08それだ!どうもありがとう。ペコリ。
0132デフォルトの名無しさん
2009/02/21(土) 09:23:53すごいいらいらする
0133デフォルトの名無しさん
2009/02/21(土) 11:02:58!!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!! !!!!!!! !!!!!!!!
!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!! ! !!!!!! !!!!!!!! ! !!!!!! !!!!!!
!!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!!
!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!
!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
しますか?
0134デフォルトの名無しさん
2009/02/21(土) 11:44:57頻繁に呼ばれる文字列処理をする関数内の最初のオート変数として
void hoge(void){
TCHAR szReadBuf[2048];
の様な宣言をしているのですが、この処理を呼んでるループ処理辺りで
[Stack fault] Thread= といった様なエラーがでるので
void hoge(void){
static TCHAR szReadBuf[2048];
ZeroMemory(szReadBuf, sizeof(szReadBuf));
の様に解放されない処理にした所、最初のコード時より幾分か多く回せるようになりました。
そうゆうもんでしょうか?
0135デフォルトの名無しさん
2009/02/21(土) 11:54:54スタック領域は特にモバイルなら大きく取られていないことが多いので、
2048要素の配列で溢れてしまったのでしょう。
後者なら、スタックは消費しないのでその点は大丈夫です。
それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。
# 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。
0136デフォルトの名無しさん
2009/02/21(土) 12:36:50前者はその下でこのようにしてます。
szReadBuf[0]='\0';
後者でもこうすべきですね?
内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が
残ってると紛らわしいのでZeroMemoryしてました。
あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが
ZeroMemoryで無いほうがいいのでしょうか?
0137デフォルトの名無しさん
2009/02/21(土) 12:45:23訂正)
× 前回内容が残ってると紛らわしいのでZeroMemoryしてました。
○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。
0138デフォルトの名無しさん
2009/02/21(土) 13:16:23クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを
コンパイルするとUnresolved external '_main'となってしまいます。
一つにまとめて書くしかないのでしょうか?
0139デフォルトの名無しさん
2009/02/21(土) 14:01:030140デフォルトの名無しさん
2009/02/21(土) 14:57:58ありがとうございます。
0141デフォルトの名無しさん
2009/02/21(土) 15:50:40初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?
0143デフォルトの名無しさん
2009/02/21(土) 16:06:400144デフォルトの名無しさん
2009/02/21(土) 16:16:15Cプログラマはmemsetが使える場面をいつも血眼で探してるから
C++作法に改宗する時に一番拒むのがここだよな
0145デフォルトの名無しさん
2009/02/21(土) 16:27:38初期化楽だし
俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし
0146デフォルトの名無しさん
2009/02/21(土) 16:35:240147デフォルトの名無しさん
2009/02/21(土) 16:36:310148デフォルトの名無しさん
2009/02/21(土) 16:36:420149デフォルトの名無しさん
2009/02/21(土) 16:49:310150デフォルトの名無しさん
2009/02/21(土) 16:51:45大先生、なんか凄いことしてるみたいだから、一部修正して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
0151デフォルトの名無しさん
2009/02/21(土) 16:52:10HANDLE 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);
}
0152デフォルトの名無しさん
2009/02/21(土) 17:21:28UINT (T::*mf)() = ptd->second;が正しい。
改行制限でtypedefをやめたのに直すのを忘れていたみたいだ。
そしたらVC++2005でも通る。
0153デフォルトの名無しさん
2009/02/21(土) 17:46:34超早いレス熱烈感謝あげ
typedef UINT (T::*mem_fn_t)();
が抜けていたんですか
mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた
0154デフォルトの名無しさん
2009/02/21(土) 17:55:310155150,152
2009/02/21(土) 18:25:38あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ
でオブジェクトを指定するっての忘れてたYo,orz
return mf(px); が正解だな
0156デフォルトの名無しさん
2009/02/21(土) 18:44:46#include <stdarg.h>
とやって、
va_list, va_arg
を使えばいいでしょうか?
0157デフォルトの名無しさん
2009/02/21(土) 19:06:54ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な
0158デフォルトの名無しさん
2009/02/21(土) 20:25:07これって自分何か勘違いしてますか?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&に変えられないというエラー
0159デフォルトの名無しさん
2009/02/22(日) 10:48:070160デフォルトの名無しさん
2009/02/22(日) 12:13:57A ? B : C の B と C が両方左辺値なら問題ないし、
const 参照なら右辺値でも問題ない。
0161デフォルトの名無しさん
2009/02/22(日) 20:58:16int n;
if (cond) n = X;
else n = Y;
みたいにするなら、
int n = cond ? X : Y;
のほうがいいって書いてあったよな。
0162デフォルトの名無しさん
2009/02/22(日) 21:38:050163デフォルトの名無しさん
2009/02/22(日) 22:39:03? : を使わざるを得ないけどね。
0164デフォルトの名無しさん
2009/02/23(月) 00:53:15if (cond) n = X;
変数には初期値いれとこうぜ
0165デフォルトの名無しさん
2009/02/23(月) 01:06:47ソースを読む人間を翻弄する
0166デフォルトの名無しさん
2009/02/23(月) 09:12:42template<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)); と同じ意味になる筈
0167デフォルトの名無しさん
2009/02/23(月) 20:33:23C++で実現するにはどうすればいいでしょうか?
一応自分なりに調べましたが、ShellExecute()やCreateProcess()を使うのは
個人的に美しくないかな、、、と思います。
知人に相談したら、vbsで
set objShell = WScript.CreateObject("WScript.Shell")
objShell.Exec "net localhost〜"
ってやればいいんじゃない、とアドバイスを受けましたが、
vbsは全くわかららず、正直、自分でメンテナンスできるとは思えません。
C++のライブラリ関数で実現する方法があったら教授お願いします。
C言語では組み込み系を少しやっていました。
最近、C++でちょっとしたwindows用のプログラムを作ることになりました。
C++は初心者レベルだと思います。
開発環境はwindows XP + Visual studioです。
よろしくお願いします。
0168デフォルトの名無しさん
2009/02/23(月) 20:38:57APIをたたくしかないな。Win32スレに行ってみたら。
0169デフォルトの名無しさん
2009/02/23(月) 20:40:47プロセスを起動するのはOSの役割なのでOSのAPIを使う
って頭になれば問題ない
0170デフォルトの名無しさん
2009/02/23(月) 20:43:22騙されているぞ。
そのVBSのコードはShellExecuteを呼ぶのと同じだ。
0171デフォルトの名無しさん
2009/02/23(月) 21:11:43>>168-170 回答ありがとうございました。
C++のライブラリにはないのですね。
なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな
という浅い考えで、ライブラリを使いたいと思っていました。
>>168さんの忠告どおりWin32スレに行こうと思いますが、
もうちょっと自分でWin32を調べてからにしたいと思います。
正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、
(結局、>>169さんの忠告どおり、割り切りそうな気がしますが)
>>170さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、
っていう感じだったので、悪意はなかったと思います
どうもありがとうございました。
0172デフォルトの名無しさん
2009/02/23(月) 22:04:01C++で学んだことを生かす練習のためにもなにか作りたいのですが・・
0173デフォルトの名無しさん
2009/02/23(月) 22:10:57コンパイラ&リンカ
0174デフォルトの名無しさん
2009/02/23(月) 22:41:03ありがとうございます
自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います
0175デフォルトの名無しさん
2009/02/24(火) 10:15:530176デフォルトの名無しさん
2009/02/24(火) 15:37:215と8どちらを答えるべきなんですかね。
パディングも含めた値が実際の答えなのでしょうか?
0177デフォルトの名無しさん
2009/02/24(火) 15:43:080178デフォルトの名無しさん
2009/02/24(火) 16:17:40答えはsizeof( A )だろ
0179デフォルトの名無しさん
2009/02/24(火) 19:12:55お前まぢ頭いいな
0180デフォルトの名無しさん
2009/02/24(火) 19:43:180181デフォルトの名無しさん
2009/02/24(火) 19:44:540182デフォルトの名無しさん
2009/02/24(火) 20:08:55ありがとうございました。
0183デフォルトの名無しさん
2009/02/24(火) 22:27:13俺の環境では5になるんだが
0184デフォルトの名無しさん
2009/02/24(火) 23:19:58#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;
}
0185デフォルトの名無しさん
2009/02/25(水) 01:13:18処理系依存なのでどれも正解ということですか!
コードまでご丁寧にありがとうございました。
0186デフォルトの名無しさん
2009/02/25(水) 09:51:490187デフォルトの名無しさん
2009/02/25(水) 11:38:22#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を使っています。
0188デフォルトの名無しさん
2009/02/25(水) 11:47:000189デフォルトの名無しさん
2009/02/25(水) 11:47:45やったことないけど
http://pinoki.la.coocan.jp/wiki/?Cygwin%2FInstall%2F%C6%FC%CB%DC%B8%EC%B2%BD
0190デフォルトの名無しさん
2009/02/25(水) 12:08:46cygwin自体が日本語の入出力をできない状態なら>189へ。
gccのコンパイルオプションについて知りたいならcygwinスレへ。
まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。
使わないに越したことはないが、scanf("%29s", name)とするのが無難。
0191デフォルトの名無しさん
2009/02/25(水) 12:11:180192デフォルトの名無しさん
2009/02/25(水) 15:13:301>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>
をインクルードすると上記のエラーが出ます
どうすればいいのですか;;
0193デフォルトの名無しさん
2009/02/25(水) 15:24:46を、どれか正しいものに変更する
なんか他の外部ライブラリ使ってるだろ?
0194デフォルトの名無しさん
2009/02/25(水) 15:26:17いったんすべてのオブジェクトを削除してビルドしなおせばいい
ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる
0195デフォルトの名無しさん
2009/02/26(木) 06:44:150196195
2009/02/26(木) 06:51:07スレ移動します
0198デフォルトの名無しさん
2009/02/26(木) 10:37:070199デフォルトの名無しさん
2009/02/26(木) 12:19:360200デフォルトの名無しさん
2009/02/26(木) 12:23:180201デフォルトの名無しさん
2009/02/27(金) 02:01:54class Foo { void Bar(void* ptr); };
void Foo::Bar(void* const ptr) {}
VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。
疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。
これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。
0202デフォルトの名無しさん
2009/02/27(金) 02:10:380203デフォルトの名無しさん
2009/02/27(金) 02:21:40class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}
が問題ないのと同じこと。
0204デフォルトの名無しさん
2009/02/27(金) 02:51:20仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。
0205デフォルトの名無しさん
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);
ですが、どれも使われるのでしょうか。
0206デフォルトの名無しさん
2009/02/28(土) 05:13:20do { --i; hoge(i); } while (i > 0);
0208デフォルトの名無しさん
2009/02/28(土) 05:36:00do {
hoge(i);
} while (i-- != 0);
これだと、MがT型の最大値でも対応できるはず。
0209デフォルトの名無しさん
2009/02/28(土) 06:46:33普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない
0210デフォルトの名無しさん
2009/02/28(土) 08:29:35メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな
0211デフォルトの名無しさん
2009/02/28(土) 11:52:40> i >= 0;
↑は符合無しだと常に真だろ。
0212デフォルトの名無しさん
2009/02/28(土) 11:53:480213デフォルトの名無しさん
2009/02/28(土) 11:54:56if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。
while 系をカウントループに使うのは愚策と考える。
0214デフォルトの名無しさん
2009/02/28(土) 12:02:05やめられない、とまらない
0215デフォルトの名無しさん
2009/02/28(土) 12:33:44--が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん
0216デフォルトの名無しさん
2009/02/28(土) 12:39:170217デフォルトの名無しさん
2009/02/28(土) 12:43:37そんな餌にクマー
まあでも>>205の要求にあってるしシンプルでわかりやすいな
0218デフォルトの名無しさん
2009/02/28(土) 13:16:49ああ、意外と面白い使い方かも・・・
視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か
0219デフォルトの名無しさん
2009/02/28(土) 14:09:160220デフォルトの名無しさん
2009/02/28(土) 14:16:210221デフォルトの名無しさん
2009/02/28(土) 14:20:360222デフォルトの名無しさん
2009/02/28(土) 16:14:420223デフォルトの名無しさん
2009/02/28(土) 17:18:11while(N-->0) って見た目が素敵だな
0224デフォルトの名無しさん
2009/02/28(土) 17:23:550225デフォルトの名無しさん
2009/02/28(土) 17:39:460226デフォルトの名無しさん
2009/02/28(土) 17:41:03ほぼ記号だろw
0227デフォルトの名無しさん
2009/02/28(土) 20:31:33ためにな・・・って、あれ?
0228デフォルトの名無しさん
2009/03/01(日) 18:45:19専門的にお願いします。
0229デフォルトの名無しさん
2009/03/01(日) 18:49:470230デフォルトの名無しさん
2009/03/01(日) 20:00:35専門的にお願いします。
0231デフォルトの名無しさん
2009/03/01(日) 20:01:140232デフォルトの名無しさん
2009/03/01(日) 20:38:29メモリのサイズを入れる型ってsize_t以外になんかなかった?
0233デフォルトの名無しさん
2009/03/01(日) 20:50:58専門的にお願いします。
0234デフォルトの名無しさん
2009/03/01(日) 20:55:57反復も繰り返しだろうけど、お前は違い分からないだろう
0235デフォルトの名無しさん
2009/03/01(日) 21:26:000236デフォルトの名無しさん
2009/03/01(日) 21:29:11もうちょっとかっこいい言い方あるだろ
それを教えろ
0237デフォルトの名無しさん
2009/03/01(日) 21:31:09死ねハゲ
0238デフォルトの名無しさん
2009/03/01(日) 21:31:470239デフォルトの名無しさん
2009/03/01(日) 21:47:200240デフォルトの名無しさん
2009/03/01(日) 22:14:30見事な繰り返し処理
>>232は空気嫁
0241デフォルトの名無しさん
2009/03/01(日) 22:19:39ssize_tとか、でもCでもC++でも標準ではないけど。
0242デフォルトの名無しさん
2009/03/01(日) 22:24:27ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
0243デフォルトの名無しさん
2009/03/01(日) 22:34:14そうだな。size_tでよかった。
0244デフォルトの名無しさん
2009/03/03(火) 05:50:11ボタンを押したら実行するようにしたいので
ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);
と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
0245デフォルトの名無しさん
2009/03/03(火) 06:13:52何故、どう巧くいかないのか書かないのですか?
0246デフォルトの名無しさん
2009/03/03(火) 06:28:56バッチファイルの中身自体が実行されません;;
0247デフォルトの名無しさん
2009/03/03(火) 06:39:59pause
入れとけ
0248デフォルトの名無しさん
2009/03/03(火) 07:00:46ありがとうございます。
やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?
0249デフォルトの名無しさん
2009/03/03(火) 07:08:140250デフォルトの名無しさん
2009/03/03(火) 07:12:19こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。
0251デフォルトの名無しさん
2009/03/03(火) 18:34:32入っている場合もポインタの宣言なんでしょうか?
static unsigned int * ADDR;
スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。
よろしくお願いいたします。
0252デフォルトの名無しさん
2009/03/03(火) 19:01:490253デフォルトの名無しさん
2009/03/03(火) 19:06:04おんなじ。空白類がいくらあろうと関係ない。
0254デフォルトの名無しさん
2009/03/03(火) 19:47:28static unsigned int * ADDR;
全くこのままのコードです。
>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。
0255デフォルトの名無しさん
2009/03/04(水) 03:11:45Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
0256デフォルトの名無しさん
2009/03/04(水) 03:14:42_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。
0257デフォルトの名無しさん
2009/03/04(水) 03:25:58なるほど、ありがとうございました。
0258デフォルトの名無しさん
2009/03/04(水) 13:36:24すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?
よろしくお願いします。
0259デフォルトの名無しさん
2009/03/04(水) 13:39:38配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど
0260デフォルトの名無しさん
2009/03/04(水) 13:44:40状況がよくわからん
0261259
2009/03/04(水) 13:44:42でいいか
マクロで定義して同じマクロ使うとか
0262デフォルトの名無しさん
2009/03/04(水) 13:49:06char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
0263258
2009/03/04(水) 13:53:28int a[]= {1,2,...};
size=sizeof(a)/sizeof(a[0]);
int b[size];
として同じ配列数の新しい配列を宣言しようとしてもできません。
0264デフォルトの名無しさん
2009/03/04(水) 13:56:39Cなら int b[sizeof(a)]
0265デフォルトの名無しさん
2009/03/04(水) 13:57:14size の型は何か
言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか
0266デフォルトの名無しさん
2009/03/04(水) 13:57:33コンパイラも
0267デフォルトの名無しさん
2009/03/04(水) 14:03:12C++です。
size の型はintです
>>266
gccです。
0268258
2009/03/04(水) 14:08:43int b[size];
として宣言できました。
ありがとうございました。
0269デフォルトの名無しさん
2009/03/04(水) 15:03:270270デフォルトの名無しさん
2009/03/04(水) 15:30:51C99だろ
0271デフォルトの名無しさん
2009/03/04(水) 17:19:240272デフォルトの名無しさん
2009/03/04(水) 17:20:51標準にはない
標準じゃなくていいならある
0273デフォルトの名無しさん
2009/03/05(木) 09:53:350274デフォルトの名無しさん
2009/03/05(木) 10:11:11結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能
0275デフォルトの名無しさん
2009/03/05(木) 18:14:15取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?
0276デフォルトの名無しさん
2009/03/05(木) 18:40:47発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。
0277デフォルトの名無しさん
2009/03/05(木) 18:51:32なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが
0278デフォルトの名無しさん
2009/03/05(木) 20:41:28さっぱりわからん
0279デフォルトの名無しさん
2009/03/05(木) 20:43:44何が分からないんだかさっぱり分からないぞ
0280デフォルトの名無しさん
2009/03/05(木) 20:44:43単に文法的な曖昧さを除いた結果そうなっただけ。
class A {
public:
static void (*A::func)();
};
としてしまうと、static メンバ変数の実体定義がこうなってしまう。
void (*A::A::func)();
どっちがどっちの A:: やら分からん。
0281デフォルトの名無しさん
2009/03/05(木) 21:16:460282デフォルトの名無しさん
2009/03/05(木) 22:09:090283デフォルトの名無しさん
2009/03/05(木) 22:41:190284デフォルトの名無しさん
2009/03/06(金) 01:31:130285276
2009/03/06(金) 19:49:52すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><
あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?
0286デフォルトの名無しさん
2009/03/06(金) 20:12:15派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
0287デフォルトの名無しさん
2009/03/06(金) 20:16:31まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
0288デフォルトの名無しさん
2009/03/06(金) 20:24:22ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
0289デフォルトの名無しさん
2009/03/06(金) 20:27:48派生クラスがない、ではなく、派生クラスは自分で作れということでは?
0290デフォルトの名無しさん
2009/03/06(金) 20:29:590291デフォルトの名無しさん
2009/03/06(金) 20:43:25これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
0292デフォルトの名無しさん
2009/03/06(金) 20:56:180293デフォルトの名無しさん
2009/03/06(金) 22:13:20普通の関数でも&(func)はよくないだろ?
そういうこと
0294デフォルトの名無しさん
2009/03/06(金) 22:51:58普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?
>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?
0295デフォルトの名無しさん
2009/03/06(金) 23:05:45関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない
一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる
と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん
0296デフォルトの名無しさん
2009/03/07(土) 23:59:08C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので
//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
memset(EDIT_DATA, 0, sizeof(EDIT_DATA));
という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
0297デフォルトの名無しさん
2009/03/08(日) 00:16:13書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には
アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
0298デフォルトの名無しさん
2009/03/08(日) 01:38:45私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?
私の使っている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が存在する)
}
0299デフォルトの名無しさん
2009/03/08(日) 06:38:13とりあえず環境依存の話だというのは認識しておいてくれ。
まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。
ローカル変数は BSS には確保されない(スタックに確保される)。
非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に
「知らされる」という表現はおかしい。
物理メモリの割り当ては OS、ローダが行う。
恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。
なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか?
「仮想記憶」でぐぐるといいと思う。
0300デフォルトの名無しさん
2009/03/08(日) 08:00:03void fn_nul(int){};
if(a){ fn(a);}
と
static void (*const_f[2])(int) = {fn, fn_nul};
f[(a>>3)&0x1](a);
どっちが効率いいかな?
0302デフォルトの名無しさん
2009/03/08(日) 08:08:17やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。
0303デフォルトの名無しさん
2009/03/08(日) 10:23:48俺は「はじめて読む486」という本が参考になった。
0304デフォルトの名無しさん
2009/03/08(日) 10:46:03下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。
0305デフォルトの名無しさん
2009/03/08(日) 17:01:16CPUじゃなくOS
0306デフォルトの名無しさん
2009/03/08(日) 19:10:521つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。
0307デフォルトの名無しさん
2009/03/08(日) 19:12:40環境依存なので利用環境を書いてね
0308デフォルトの名無しさん
2009/03/08(日) 19:31:42環境:linux. gcc version 4.3.2 ,SDL(Callback)
マルチスレッドではないのですが、CallBack関数側から、
MAINスレッドの寝ている状態を起こせないものかと、、、
MAINスレッドでやっている処理は、標準入力から
データ読み込み、固定領域にバッファリングしています。
バッファが一杯だったら、標準入力からの読み込みは
しないで寝かせたいのです。(BusyWaitやポーリングはNG)
gdk_input_addとgtk_mainの組み合わせで
とりあえずできたのですが、gtkを使うのは目的外かと、
よろしくお願いします。
0309デフォルトの名無しさん
2009/03/08(日) 20:08:54pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう
0310デフォルトの名無しさん
2009/03/08(日) 21:11:29サンクスです。チューw
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)
0311デフォルトの名無しさん
2009/03/09(月) 03:45:12(ただのパクリですが・・・もちろん勉強のためです)
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見たことある方で分かられる方があればご教示ください。
0312デフォルトの名無しさん
2009/03/09(月) 04:09:36それ以前にこれ間違ってね?
0313デフォルトの名無しさん
2009/03/09(月) 04:16:54レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?
0314デフォルトの名無しさん
2009/03/09(月) 04:27:45CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
これに当てはまるoperator=が無いじゃん
0315デフォルトの名無しさん
2009/03/09(月) 04:47:48すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
0316デフォルトの名無しさん
2009/03/09(月) 10:11:14IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
0317デフォルトの名無しさん
2009/03/09(月) 19:02:57遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。
例えばATL/WTL解説で有名な↓ここ
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/stdctrl05/index.html
では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。
0318デフォルトの名無しさん
2009/03/09(月) 20:03:55コンストラクタにexplicit付いてんじゃねぇの
0319デフォルトの名無しさん
2009/03/09(月) 20:49:52explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;
試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
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
それともこの再現自体が間違ってるのでしょうか・・・?
0320デフォルトの名無しさん
2009/03/09(月) 20:53:33class A に A(a)のコンストラクタは付けないの?
0321デフォルトの名無しさん
2009/03/09(月) 21:06:28VC2008EEで通ったけど
0322デフォルトの名無しさん
2009/03/09(月) 21:42:540323デフォルトの名無しさん
2009/03/09(月) 21:59:40C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、
メンバ配列についてお行儀のよい書き方を教えてください。
メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、
文字列や値は同様にメンバ変数として持つのか? それとも、
cppの上の方に無名空間で切った変数を新たに宣言するのか?
そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで
cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか?
ちょっと、わからないので教えてください。
0324デフォルトの名無しさん
2009/03/09(月) 22:34:420325323
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
レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?
0326デフォルトの名無しさん
2009/03/09(月) 22:52:04そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。
0327323
2009/03/09(月) 23:05:52ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<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" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?
0328デフォルトの名無しさん
2009/03/09(月) 23:14:020329デフォルトの名無しさん
2009/03/09(月) 23:26:46そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。
でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。
0330デフォルトの名無しさん
2009/03/09(月) 23:27:48返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?
0331デフォルトの名無しさん
2009/03/09(月) 23:35:33static struct{int x, y; char *c;}m_BTN[3];
}
追い出すメリットが勝つるメンバは追い出す。
0332デフォルトの名無しさん
2009/03/09(月) 23:46:04返信ありがとうございます。
考え方として了解しました。
0333デフォルトの名無しさん
2009/03/09(月) 23:59:08返信ありがとうございます。
Btnクラスを作って、CHogeで参照するということでいいでしょうか?
(CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?)
templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?
0334デフォルトの名無しさん
2009/03/10(火) 04:18:48char **board;
public:
void init() {
board = reinterpret_cast<char**>(new char[9][9]);
}
};
こう書くとコンパイルは通るんですが、boardにはBadpointerの値が
入ってます。なにか間違ってますでしょうか?
0335デフォルトの名無しさん
2009/03/10(火) 04:36:16なんでキャストしてるのん?
そして何ゆえそんな危険なキャストしてるのん?
あと、配列の配列は配列のポインタで受けることはできても
ポインタのポインタで受けることはできないよ?
っていうか、僕も初心者だから意味わからん^^
0336デフォルトの名無しさん
2009/03/10(火) 05:50:54ありがとうございます。
char *p[10] = new (char*)[10];
とか出来なくて、あんなコードになってしまいました。
どうすればいいですか?
char **p;
char *p[10];
とかをnewで初期化するにはどうすればいいですか?
0337デフォルトの名無しさん
2009/03/10(火) 06:55:330338デフォルトの名無しさん
2009/03/10(火) 10:30:430339デフォルトの名無しさん
2009/03/10(火) 13:26:15p = new char*[10];
0340デフォルトの名無しさん
2009/03/10(火) 15:44:07board = 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];
}
0341デフォルトの名無しさん
2009/03/10(火) 16:09:07何がなにやらわけわからんw
0342デフォルトの名無しさん
2009/03/10(火) 17:33:37char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ
って寸法だ。
0343デフォルトの名無しさん
2009/03/10(火) 18:27:000344デフォルトの名無しさん
2009/03/10(火) 18:52:35try-cathc も nothrowも付けずにほっとく
0345デフォルトの名無しさん
2009/03/10(火) 20:13:460346デフォルトの名無しさん
2009/03/11(水) 01:31:350347デフォルトの名無しさん
2009/03/11(水) 01:48:320348デフォルトの名無しさん
2009/03/11(水) 07:51:570349デフォルトの名無しさん
2009/03/11(水) 15:13:45下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて
他人のクソコードをメンテする係に抜擢されちまうよ
0350デフォルトの名無しさん
2009/03/11(水) 15:37:46生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。
Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。
0351デフォルトの名無しさん
2009/03/11(水) 16:08:520352デフォルトの名無しさん
2009/03/11(水) 16:10:080353デフォルトの名無しさん
2009/03/11(水) 16:13:29生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。
グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。
0354デフォルトの名無しさん
2009/03/11(水) 16:22:02スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)
0355デフォルトの名無しさん
2009/03/11(水) 17:25:01scoped_ptrもスマートポインタの一種だよ。
0356デフォルトの名無しさん
2009/03/11(水) 18:42:06出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ
達人がその部分をプログラムする。
0357デフォルトの名無しさん
2009/03/11(水) 18:47:38auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし
*とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし
逆にshared_ptr以外はスマポじゃないって奴もいるし
スマポって何?
0358デフォルトの名無しさん
2009/03/11(水) 18:50:020359デフォルトの名無しさん
2009/03/11(水) 19:00:48具体的に言うと*とか->が使える生ポインタ以外の物
0360デフォルトの名無しさん
2009/03/11(水) 19:02:120361デフォルトの名無しさん
2009/03/11(水) 19:20:52お舞! それは絶対に正しい。
ポインタすら使えない、つまりC++を扱ってはいけないような奴に、
C++を使わせるのに必要なものだよな
0362デフォルトの名無しさん
2009/03/11(水) 19:27:16自主的に足かせを装着する訳だが
0363デフォルトの名無しさん
2009/03/11(水) 20:32:27ですよね〜。
0364デフォルトの名無しさん
2009/03/11(水) 21:43:090365デフォルトの名無しさん
2009/03/12(木) 02:06:14それらしいスレがなかったので、一度ここで聞いてみようかなと…
独学のため、先輩方の意見などをお聞きしたいと思っています。
0366デフォルトの名無しさん
2009/03/12(木) 02:54:55Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う
C++は、モノにするには、やる範囲が広そうだし、Javaなのかな
ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?
0367デフォルトの名無しさん
2009/03/12(木) 06:58:490368デフォルトの名無しさん
2009/03/12(木) 12:20:280369デフォルトの名無しさん
2009/03/12(木) 19:44:28/MT
/MTd
/MD
/MDd
の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、
/MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。
どういう場合に/MTdにしなければだめになるのでしょうか?
0370デフォルトの名無しさん
2009/03/12(木) 20:13:31ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
0371デフォルトの名無しさん
2009/03/12(木) 20:22:34例えば
\\Server\folder\test.txt
にあるファイルに対して
FindFirstFile( "\\\\Server\\folder\\test.txt",&data );
とやっても失敗になってしまいます。
ショートパスからロングパスにしたいのですが、、、、
0372デフォルトの名無しさん
2009/03/12(木) 21:58:540373デフォルトの名無しさん
2009/03/13(金) 14:45:20ライブラリ作った人とかいますか?
0374デフォルトの名無しさん
2009/03/13(金) 15:17:000375デフォルトの名無しさん
2009/03/13(金) 15:21:220376デフォルトの名無しさん
2009/03/13(金) 15:37:462chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
0377デフォルトの名無しさん
2009/03/13(金) 15:40:55GoogleCalendarとの同期を取るアプリを作りたいんですが、
最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば
いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
0378デフォルトの名無しさん
2009/03/13(金) 15:44:06PHPのを探してきた
$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かで結果が変わる
0379デフォルトの名無しさん
2009/03/13(金) 15:55:43Cのソースがあった
http://www.geocities.com/tk2001b/utripper/
0380デフォルトの名無しさん
2009/03/14(土) 20:40:26とソースの上に書くのと、
ソース全体を
namespace std {
...
}
というようにnamespaceの中に書くのとは、同じ意味ですか?
0381デフォルトの名無しさん
2009/03/14(土) 20:45:140382デフォルトの名無しさん
2009/03/14(土) 21:00:19どう違うか、教えてください。
0383デフォルトの名無しさん
2009/03/14(土) 21:04:060384デフォルトの名無しさん
2009/03/14(土) 21:11:37後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは
できないということですね。
ありがとうございました。
0385デフォルトの名無しさん
2009/03/14(土) 21:22:45規格上未定義動作になる。
0386デフォルトの名無しさん
2009/03/15(日) 00:23:570387デフォルトの名無しさん
2009/03/15(日) 00:31:350388デフォルトの名無しさん
2009/03/16(月) 01:03:47エラーチェックは↓見たいな感じで十分ですかね?
#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;
}
0389デフォルトの名無しさん
2009/03/16(月) 01:04:39{
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);
}
}
0390デフォルトの名無しさん
2009/03/16(月) 01:05:31{
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);
}
}
0391デフォルトの名無しさん
2009/03/16(月) 01:39:45と同じ匂いを感じる。
ところで、
while (...) {
string str;
...
}
より
string str;
while (...) {
...
}
の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね?
でも、スコープを限定した方が可読性等の面からは好ましいよね?
どっちが良いのかな。
0392デフォルトの名無しさん
2009/03/16(月) 01:44:220393デフォルトの名無しさん
2009/03/16(月) 02:11:37{string str; while(...){...}}
0394デフォルトの名無しさん
2009/03/16(月) 02:26:560395デフォルトの名無しさん
2009/03/16(月) 02:36:540396デフォルトの名無しさん
2009/03/16(月) 02:40:100397デフォルトの名無しさん
2009/03/16(月) 07:38:25あるライブラリをインクルードする必要があるのですが、
ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、
プロジェクト→プロパティ→リンカ→追加のライブラリ
のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。
リンクの順序が関係してるのかと思ったのですが、よくわかりません。
どういう基準で方法を選べばいいですか?
0398デフォルトの名無しさん
2009/03/16(月) 07:41:35ライブラリのパスを通せばいいと思う
0399デフォルトの名無しさん
2009/03/16(月) 07:50:49ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。
書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?
0400デフォルトの名無しさん
2009/03/16(月) 13:38:45それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。
データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);
余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
0401デフォルトの名無しさん
2009/03/16(月) 14:41:57もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする
0402デフォルトの名無しさん
2009/03/16(月) 14:44:55いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?
0403デフォルトの名無しさん
2009/03/16(月) 16:44:14おかげさまで解決です。
0404デフォルトの名無しさん
2009/03/16(月) 16:54:030405デフォルトの名無しさん
2009/03/16(月) 20:22:150406デフォルトの名無しさん
2009/03/16(月) 20:29:07WM_NCHITTESTをフックしたいのですが
SetWindowsHookEXの中のどの項目ならフックできるでしょうか?
0407デフォルトの名無しさん
2009/03/16(月) 22:16:04>The WM_NCHITTEST message is sent to a window when the cursor moves
より、このメッセージは Send される。
従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。
別途処理したいならサブクラス化とかが必要。
0408デフォルトの名無しさん
2009/03/16(月) 22:17:020410デフォルトの名無しさん
2009/03/17(火) 00:11:37std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです
0411デフォルトの名無しさん
2009/03/17(火) 00:13:31#include <string>
0412デフォルトの名無しさん
2009/03/17(火) 00:15:06#include <string>はちゃんとしてます
0413デフォルトの名無しさん
2009/03/17(火) 00:17:51ならイテレータの宣言は済んでる。
何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の
変数を宣言したいってこと?
0414デフォルトの名無しさん
2009/03/17(火) 00:19:170415デフォルトの名無しさん
2009/03/17(火) 00:19:30stringのconst_iteratorならstd::string::const_iteratorで宣言できる。
0416デフォルトの名無しさん
2009/03/18(水) 17:14:420417デフォルトの名無しさん
2009/03/18(水) 17:27:570418デフォルトの名無しさん
2009/03/18(水) 17:42:350419デフォルトの名無しさん
2009/03/18(水) 17:46:410420デフォルトの名無しさん
2009/03/18(水) 18:52:060421デフォルトの名無しさん
2009/03/18(水) 19:54:38struct Hoge{
Hoge(){throw new MyFavoriteException;}
};
0422デフォルトの名無しさん
2009/03/19(木) 16:14:200423デフォルトの名無しさん
2009/03/20(金) 02:41:10HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、
ソースコードをUTF-8で保存して、コンパイルしました。
すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、
更に文法エラーが出てきてコンパイルできませんでした。
ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから?
文字列にUTF-8を使うことは不可能なんですか?
0424デフォルトの名無しさん
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 );
0425デフォルトの名無しさん
2009/03/20(金) 04:28:220426デフォルトの名無しさん
2009/03/20(金) 12:00:070427デフォルトの名無しさん
2009/03/20(金) 13:06:360428デフォルトの名無しさん
2009/03/20(金) 13:15:48環境ごとに#ifdefしまくるのが精一杯
0429デフォルトの名無しさん
2009/03/20(金) 13:45:03>>425
stdoutには使えないよね
0430デフォルトの名無しさん
2009/03/20(金) 15:38:250431デフォルトの名無しさん
2009/03/20(金) 16:55:09Source.cppとSource.hを横に並べて表示したいんですが、、
0432デフォルトの名無しさん
2009/03/20(金) 17:01:150433デフォルトの名無しさん
2009/03/20(金) 17:04:01ありがとうございました。
0434デフォルトの名無しさん
2009/03/20(金) 23:07:020435デフォルトの名無しさん
2009/03/21(土) 13:22:55ShellExeCuteを使いバッチファイルを起動すると
パスが見つからなくなってしまいます。
opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。
何かディレクトリを指定するようなコマンドがあったら教えてください。
0436デフォルトの名無しさん
2009/03/21(土) 14:24:000437デフォルトの名無しさん
2009/03/21(土) 14:42:32バッチファイルのほうで探したら見つかりました
ありがとうございます。
0438デフォルトの名無しさん
2009/03/21(土) 20:56:55新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に
ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに
全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので
しょうか?
0439デフォルトの名無しさん
2009/03/21(土) 20:59:560440デフォルトの名無しさん
2009/03/21(土) 21:03:40ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。
じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか?
ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません
でした。
フィルタって何の意味があるんだろう。。
0441デフォルトの名無しさん
2009/03/21(土) 21:10:07自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、
フィルターもあわせて設定すれば、やりたいことができそうです。
でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。
プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?
0442デフォルトの名無しさん
2009/03/21(土) 21:21:540443デフォルトの名無しさん
2009/03/21(土) 21:51:18ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。
自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に
PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、
リンクでエラーになります。(LNK2019とかLNK2001とか)
同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか?
何度もすいません。
0444デフォルトの名無しさん
2009/03/21(土) 22:13:520445デフォルトの名無しさん
2009/03/21(土) 22:23:20浦賀湾のあたり?
解決しました。
出力ファイルのオブジェクトファイル名を変更すればできました。
ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定
しないとだめなのが、分かりにくかった。
片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。
ありがとうございました。
0446デフォルトの名無しさん
2009/03/21(土) 22:33:42テラナツカシス
0447デフォルトの名無しさん
2009/03/22(日) 13:01:45System::Object^
の^ってなんですか
0448デフォルトの名無しさん
2009/03/22(日) 13:12:49C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ
0449デフォルトの名無しさん
2009/03/22(日) 13:12:55http://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番目
0450デフォルトの名無しさん
2009/03/22(日) 13:27:51他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい
うまくいきません。
何か良い方法があったら教えてください。
0451デフォルトの名無しさん
2009/03/22(日) 13:34:07C++/CLIの入門書嫁。
0452デフォルトの名無しさん
2009/03/22(日) 13:54:28ありがとね。
0453デフォルトの名無しさん
2009/03/22(日) 15:29:42int hoge(const int n) { return n; }
int hoge(int &n) { return n; }
int hoge(const int &n) { return n; }
だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。
呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では
int であろうがconst int であろうが区別していないのでしょうか。
0454デフォルトの名無しさん
2009/03/22(日) 15:41:21そう。関数引数の型としてはトップレベルの const は無視され、区別されない。
ただし定義においてはローカル変数への const と同様に働く。
0455デフォルトの名無しさん
2009/03/22(日) 16:58:39Cに組み込むにはどうすればいいのでしょうか?
アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか?
たとえば全てのバイトにn加算するという暗号化を施す場合、
その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、
そうさせないために何か対策する必要はないのでしょうか?
0456デフォルトの名無しさん
2009/03/22(日) 17:04:170457デフォルトの名無しさん
2009/03/22(日) 17:21:23AES等安全性の確立されたアルゴリズムを使うことを前提とします。
ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。
その鍵は逆アセンブル等で簡単に解ったりしないんですか?
0458デフォルトの名無しさん
2009/03/22(日) 17:24:55分かります
AES暗号化を使っていることが分かるだけでも
どこを調べればいいか分かってしまいます
ある程度以上は諦めるしかないです
0459デフォルトの名無しさん
2009/03/22(日) 18:09:08動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
0460デフォルトの名無しさん
2009/03/22(日) 18:53:39int main(){return 0;}
というプログラムなんですが、プロジェクトを新規作成するときに、
(1)最初から空のプロジェクト
(2)Win32プロジェクトを選択して、空のプロジェクト
という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが
通らず、LNK2019というエラーになります。
この2つの方法って何が違うのでしょうか?
0461デフォルトの名無しさん
2009/03/22(日) 18:55:390462デフォルトの名無しさん
2009/03/22(日) 19:01:50プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。
そのエラーの元になっている違いはエントリポイントの違い。
Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。
他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
0463デフォルトの名無しさん
2009/03/22(日) 19:24:03ありがとうです。
でもmainをWinMainに書き直しても駄目でした。
>他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
本当にほかにも色々違うんですね。
0464デフォルトの名無しさん
2009/03/22(日) 20:09:48int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0}
これが一応の最小プログラムね
Windowsプログラミングでは初めて見る型がたくさん出てくるけど
ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ
0465デフォルトの名無しさん
2009/03/22(日) 20:15:12何のためのtypedefだよ…
0466デフォルトの名無しさん
2009/03/22(日) 20:23:080467デフォルトの名無しさん
2009/03/22(日) 20:26:110468デフォルトの名無しさん
2009/03/22(日) 22:28:200469デフォルトの名無しさん
2009/03/23(月) 00:16:56mov [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]);
0470デフォルトの名無しさん
2009/03/23(月) 00:47:52unsigned char *Output; にして、コンストラクタで、メモリを確保していて
NULLにはなっていないのですが・・。privateへのアクセスは、普通に
Outputでいいはずだとおもうのですが違うのかな?
0471デフォルトの名無しさん
2009/03/23(月) 01:09:470472デフォルトの名無しさん
2009/03/23(月) 09:55:51Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら
どうしてだめなのでしょうか?
0473デフォルトの名無しさん
2009/03/23(月) 10:16:20Cの"r" "rb" と同じ関係。
0474デフォルトの名無しさん
2009/03/23(月) 10:58:52ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。
ついでにあと1個質問させてください。
Ifstream.seekg()で、
Ifstream.seekg(0,ifstream::end)
Ifstream.seekg(ifstream::end)
はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、
0475デフォルトの名無しさん
2009/03/23(月) 11:02:37省略時はどの値を渡したのと同じってのを意識するといい。
0476デフォルトの名無しさん
2009/03/23(月) 11:36:04なるほど。
省略時は0を渡したのと同じですね。
0477デフォルトの名無しさん
2009/03/23(月) 11:46:00さっきのIfstream::binaryも同じ
0478デフォルトの名無しさん
2009/03/23(月) 12:35:15本当ですね。
VC9++で試したら、ゼロじゃなかったです。
どういう値になっているのか調べられなかったけど、
ちゃんと読めてなかったです。
0479デフォルトの名無しさん
2009/03/23(月) 12:50:29ためにC言語時代から受け継いでいる伝統だったな
unix系は意識不要
0480デフォルトの名無しさん
2009/03/23(月) 14:42:510481デフォルトの名無しさん
2009/03/23(月) 14:54:430482デフォルトの名無しさん
2009/03/23(月) 15:09:04String hiduke=DateTimeToStr(now);
SaveDialog1->FileName=hiduke;
日付をFileNameのところに表示したいのですが、上記のようにやっても
うまくいきません原因の分かる方教えてくださいー。
0483デフォルトの名無しさん
2009/03/23(月) 15:39:00解決しました
2009/03/23の
/がダメだったようです。
0484デフォルトの名無しさん
2009/03/23(月) 22:00:05すると、プログラムが止まってしまいます。
メモリは確保しているし、なぜfreeするとエラーになるかわからないです
メモリのエラーはerrorno でチェックしろとかいてあったのですが
どうやってチェックすればいいかサンプルコードをください
0485デフォルトの名無しさん
2009/03/23(月) 22:07:140486デフォルトの名無しさん
2009/03/23(月) 22:13:310487高橋
2009/03/23(月) 22:15:23情報がこれだけじゃ、いかに魔美くんでも無理だよ。
0488Cの達人
2009/03/23(月) 22:27:56ネイティブCのことなら、お任せください。
by Cの達人
0489デフォルトの名無しさん
2009/03/23(月) 22:29:380490デフォルトの名無しさん
2009/03/23(月) 22:35:46要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。
そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク
リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間
たってないものの数をカウントして、処理する/しないを決めます。
ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない
でしょうか?こういう処理って結構色々な場面で使われると思うのですが。
よろしくお願いします。
0491デフォルトの名無しさん
2009/03/23(月) 22:38:480492デフォルトの名無しさん
2009/03/23(月) 22:43:43deque を使ってみるといいよ
新しい要求がきたときに
1.一番古い [0] の時刻が1時間より前だったら pop_front で削除
2.1.で削除が行われた場合1.に戻る
3.deque のサイズが 100 未満であれば要求を受け付ける
4.deque に push_back で追加
最近同じような質問があった気がする
0493デフォルトの名無しさん
2009/03/23(月) 22:50:42DB使ったほうがいいですかね。
出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、
上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ
リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり
多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。
リトライのタイミングは相手まかせです。
ありがとうございます。
0494デフォルトの名無しさん
2009/03/23(月) 22:56:090495デフォルトの名無しさん
2009/03/23(月) 22:57:02ありがとうございます。
dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので
(重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります)
dequeは使えないか、と思ったんですが、どうですか?
>最近同じような質問があった気がする
ありがとうございます。探してみます。
0496デフォルトの名無しさん
2009/03/23(月) 23:09:230497デフォルトの名無しさん
2009/03/23(月) 23:09:26あの、あれ、なんていったっけ、常にソートされるコンテナ、
それ。
0498デフォルトの名無しさん
2009/03/23(月) 23:21:09重さ?シラネ
0499デフォルトの名無しさん
2009/03/23(月) 23:35:5830万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も
回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。
この処理を減らせれば、もっといけそうな気がする。
メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず
なんですがね、、、
0500デフォルトの名無しさん
2009/03/23(月) 23:41:11そして「受け付けた全要求」、つまりここでは30万件を
要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る
からじゃろ? 仕様どおりじゃないのかな?
0501デフォルトの名無しさん
2009/03/23(月) 23:48:29そうですね。
負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。
1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。
そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。
0502デフォルトの名無しさん
2009/03/23(月) 23:52:40ありがとうございます。
でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも
しれないんですが、なんとかCでやりたいと思ってます。
自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、
常にソートされるコンテナって重そうな感じがするし、、、、
0503デフォルトの名無しさん
2009/03/23(月) 23:53:31そういう仕様なら仕方ないのであきらめましょう。
プログラマは仕様について意見することはできても
仕様を変える力はありません。しようがないのです。なんちて・・・
コマネチ!
0504デフォルトの名無しさん
2009/03/24(火) 00:08:07それは仕事でやってるの?
0505デフォルトの名無しさん
2009/03/24(火) 00:11:58そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。
0506デフォルトの名無しさん
2009/03/24(火) 00:22:250507デフォルトの名無しさん
2009/03/24(火) 00:27:16全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して
調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。
0508デフォルトの名無しさん
2009/03/24(火) 00:30:19そういうのは管理できる人を手配するのが大変らしいです、、、
0509デフォルトの名無しさん
2009/03/24(火) 00:30:500510デフォルトの名無しさん
2009/03/24(火) 00:40:32そうですね。
じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは
dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。
過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。
これで実装してみます。
明日の朝までにできるかな。
0511デフォルトの名無しさん
2009/03/24(火) 00:41:40C++にtemplate機能が付け加えられたのに目を付けた
Stephanov(だっけ)がC++に移植したのが初めだとか
0512デフォルトの名無しさん
2009/03/24(火) 07:02:35使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?
0513デフォルトの名無しさん
2009/03/24(火) 07:23:59テンプレートが必要な時だけテンプレート。
0514デフォルトの名無しさん
2009/03/24(火) 08:09:130515デフォルトの名無しさん
2009/03/24(火) 08:30:05List<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)
0516デフォルトの名無しさん
2009/03/24(火) 08:41:56よく1回のカキコにおさめたな。
0517デフォルトの名無しさん
2009/03/24(火) 08:48:26載せるところ選ぶのに苦労しました……。
重要そうなところだけ抜粋してます。
テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。
こんなことしてるのは、単に興味とステップアップのためなんですが。
ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。
サンプルコードまねるだけでろくなソフトも作れませんが……OTL
(っとこんなことはどうでもいいですよね……)
0518デフォルトの名無しさん
2009/03/24(火) 10:05:31あるサイトを参考にして、下記のような半角全角変換関数を
作成したのですが、試しに適当にint型の変数を入れて
動かそうとすると下記のようなエラーが出ます。
参考サイトにあるものをほぼそのまま使用しており、
修正したところはcase文の中の変換する文字のみです。
参考サイトには、そのまま使用できるようなことが
書いてあったのですが、何が間違っているのか教えてください。
0519デフォルトの名無しさん
2009/03/24(火) 10:06:52int 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);
0520デフォルトの名無しさん
2009/03/24(火) 10:07:57(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: 構文エラー : '}'
0521デフォルトの名無しさん
2009/03/24(火) 10:10:37printf("%d ", (**iter));
正直混乱するのでiteratorで多態はやめた方がいいんじゃない?
Listの実装でListIteratorを返すようにして
for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
0522デフォルトの名無しさん
2009/03/24(火) 11:12:35'0\'
'\0'
case default:
default;
0523515
2009/03/24(火) 12:20:00レスありがとうございます。
>printf("%d ", (**iter)
なんでうまくいかないんだろうと4時間くらい混乱してました。
List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。
とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。
ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。
初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。
List::iterator()は、
ListIterator<Type> iterator(){
return ListIterator<Type>(this);
}
現在のソースコードはポインタじゃなくてこんな感じにしてみました。
>多態はやめたほうが……
Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。
アドバイスありがとうございました。
スレ汚し失礼しました。
0524デフォルトの名無しさん
2009/03/24(火) 13:59:10ありがとうございます。
おかげで動くようにはなったのですが、
期待する値を得ることができません。
下記のような値が返ってきてしまいます。
何がいけないんでしょうか?
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
0525デフォルトの名無しさん
2009/03/24(火) 14:24:58int 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;
}
これでちゃんと出たけどな?
0526デフォルトの名無しさん
2009/03/24(火) 14:43:54例えばprintf("%s\n", han2zen(s));のように使用していたため
変な値が返ってきていただけでした。助かりました。
0527デフォルトの名無しさん
2009/03/24(火) 16:19:10error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。
をはじめ100以上のエラーがでます。
xutilityというファイルが原因のようですが、特に書き換え等行っていません。
プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。
アドバイスを御願いします。
0528デフォルトの名無しさん
2009/03/24(火) 16:37:170529デフォルトの名無しさん
2009/03/24(火) 17:06:31C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、
需要ありますか?
機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。
これ見られたら、ダメ出しをたくさんくらいそうだけど。
0530デフォルトの名無しさん
2009/03/24(火) 18:13:44ダメ出しして欲しいんで見てくれませんか?だろ
boost::threadがあるしな
0531デフォルトの名無しさん
2009/03/24(火) 18:16:28だよな
いらないよな
0532デフォルトの名無しさん
2009/03/24(火) 18:20:01文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。
どう?
0533デフォルトの名無しさん
2009/03/24(火) 18:21:22最近ねたが無いからうpれ
0534デフォルトの名無しさん
2009/03/24(火) 18:40:220535デフォルトの名無しさん
2009/03/24(火) 19:05:54それが本音で、ネタのためにも、うpしたかったと>>529が申しております。
よかったら見てやってくださいとのこと。
多分、これだ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8998.zip
0536デフォルトの名無しさん
2009/03/24(火) 20:31:51このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど
0537デフォルトの名無しさん
2009/03/24(火) 20:44:13そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した
0538デフォルトの名無しさん
2009/03/24(火) 20:59:44なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・
改めてブラウザって大変なんだなって思うわ
0539デフォルトの名無しさん
2009/03/24(火) 21:13:220540デフォルトの名無しさん
2009/03/25(水) 00:34:19オープンの意味による。
GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。
ていうかあるなら俺に教えてくれ。
OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。
リファレンス実装をGPLで配布するとかマジやめて欲しい。
0541デフォルトの名無しさん
2009/03/25(水) 00:42:20どなたか検証していただけないでしょうか?
↓ソース
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c
ちなみに、円盤の個数が5までなら正しいのを確認してます。
0542デフォルトの名無しさん
2009/03/25(水) 01:14:36なぜなら、6個目の解法は
5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う)
だから。
ちなみに7個目の解法は
6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う)
以下同様。ハノイは簡単。
0543デフォルトの名無しさん
2009/03/25(水) 01:19:59危なっかしい警告が出てるので、まず潰したほうがいい。
結果はこれと比べとき。
#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;
}
0544デフォルトの名無しさん
2009/03/25(水) 08:23:34if (iが何かの条件を満たしているとき)
lists.erase(i);
}
とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?
0545デフォルトの名無しさん
2009/03/25(水) 08:46:110546デフォルトの名無しさん
2009/03/25(水) 09:02:160547デフォルトの名無しさん
2009/03/25(水) 10:27:35あなたのお使いのライブラリの仕様によります。
STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。
removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。
但し、removeは対象となるコンテナがlistの場合のみ使用できます。
尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。
0548デフォルトの名無しさん
2009/03/25(水) 10:34:29円盤の番号を上から1〜n、手順を1から数えるとして、手順mに動かす円盤は手順mを
二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。
例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。
これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。
要は、再帰は必須ではない。
0549デフォルトの名無しさん
2009/03/25(水) 12:19:05ありがとうございます。VC++9を使ってます。
listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で
デバッグエラーに引っかかります。何が間違ってるのでしょうか?
0550デフォルトの名無しさん
2009/03/25(水) 12:26:29remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか
0551デフォルトの名無しさん
2009/03/25(水) 12:35:17erase() に渡されたイテレータは無効にり、無効なイテレータは
インクリメントできない(未定義動作になる)。
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
0552541
2009/03/25(水) 17:06:53大丈夫みたいですね。どうもありがとうございました。
0553デフォルトの名無しさん
2009/03/25(水) 17:32:34while ( i != lists.end() ) {
i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す
}
こんなかな。っていうか、STLでは自前のループはなるべく書かない。
0554デフォルトの名無しさん
2009/03/25(水) 17:54:06出来れば環境依存しない方法を探しています。
0555デフォルトの名無しさん
2009/03/25(水) 17:59:03浮動小数にIEEE754を使うことが定められてるわけじゃないから
INFなんてものが存在するとは限らないし
0556デフォルトの名無しさん
2009/03/25(水) 18:40:44std::numeric_limits<double> infinity()
存在するかどうかのテストも用意されてたはず。
0557デフォルトの名無しさん
2009/03/25(水) 18:41:42環境依存だろうけど
x=1e+1000;
0558デフォルトの名無しさん
2009/03/25(水) 21:59:14インクルードすればよいのかわかりません。結局
#include <windows.h>
をインクルードして、
Sleep(ミリ秒);
を使ってますが、Windowsでsleep()はつかえるのでしょうか?
0559sage
2009/03/25(水) 21:59:39VB6用のDLLをVC++で作成するとき、
VB6で使用するタイプライブラリはどのように作成するのでしょうか?
0560デフォルトの名無しさん
2009/03/25(水) 22:21:08それしかありません
0561デフォルトの名無しさん
2009/03/25(水) 22:53:14わかりました。
ありがとうございます。
0562デフォルトの名無しさん
2009/03/26(木) 00:48:06それらを一切表示せずにビットマップCとして保存したいのですが、
BitBltという関数を用いれば可能なのでしょうか?
0563デフォルトの名無しさん
2009/03/26(木) 01:26:02考えたら同じと思っていいですか?
そのファイル内からだけ使えるという点で。
0564デフォルトの名無しさん
2009/03/26(木) 01:37:41答えんかい!
0565デフォルトの名無しさん
2009/03/26(木) 02:43:02座標計算してあとは合成すればいい
まああれだ
0566デフォルトの名無しさん
2009/03/26(木) 03:26:22ちょっとだけ違う
0567デフォルトの名無しさん
2009/03/26(木) 03:54:26確か初回は特製boost::binderがついてくるはず
0568デフォルトの名無しさん
2009/03/26(木) 05:27:59ほんとに役に立たないスレだな。
もっとちゃんと答えろ。
こっちは眠いのを我慢してレス待ってんだから。
早くしてくれや。
0569デフォルトの名無しさん
2009/03/26(木) 06:28:200570デフォルトの名無しさん
2009/03/26(木) 06:55:120571デフォルトの名無しさん
2009/03/26(木) 06:57:100572デフォルトの名無しさん
2009/03/26(木) 07:04:18はやく助けろや。
こっちは急いでんだわ。
0573デフォルトの名無しさん
2009/03/26(木) 07:15:170574デフォルトの名無しさん
2009/03/26(木) 07:21:27リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで
あまり実用上の違いはない。
「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。
他にもあるかもしれないけどね。
template<void (*)()> int t() { return 0; }
namespace { void an() {} }
static void st() {}
int main() { return t<an>(); } // t<st> はコンパイルエラー
0575デフォルトの名無しさん
2009/03/26(木) 07:28:560576デフォルトの名無しさん
2009/03/26(木) 08:39:31ことばわかりまちゅかあ?
0577デフォルトの名無しさん
2009/03/26(木) 08:44:020578デフォルトの名無しさん
2009/03/26(木) 08:56:460579デフォルトの名無しさん
2009/03/26(木) 09:10:06ダメだよこういう時は嘘を教えなきゃ。
0580デフォルトの名無しさん
2009/03/26(木) 09:47:06>>574
ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも
コンパイルできたけど?ほかの環境でも試したほうがいいのかな?
>>579
うるせーやつだな。
0581デフォルトの名無しさん
2009/03/26(木) 11:50:38> ほかの環境でも試したほうがいいのかな?
試さなくていいよ。
0582デフォルトの名無しさん
2009/03/26(木) 12:45:35そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、
ほんとかどうかついでに教えてよ。
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;
のように定義する必要があります。
0583デフォルトの名無しさん
2009/03/26(木) 12:49:13正しいよ。
ちなみにCでconstで内部リンケージを持たせるなら
static const cardmax=13;
ってやる。
0584デフォルトの名無しさん
2009/03/26(木) 15:14:19へぇ 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()'
0585デフォルトの名無しさん
2009/03/26(木) 22:18:37/Zaのつけ方を教えて。
0586デフォルトの名無しさん
2009/03/26(木) 22:36:10つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも
結果は同じ。どっちでも通るけどな。
0587デフォルトの名無しさん
2009/03/27(金) 02:07:55はやく解クレや。
今はカップ麺にお湯入れたんで、完成待ち。
やっぱ夜はいいな、静かでな。
0588デフォルトの名無しさん
2009/03/27(金) 13:02:08俺のせいかな。
悪かったよ。もう消えるわ。
じゃあな。
0589デフォルトの名無しさん
2009/03/27(金) 23:33:13それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。
C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar
見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
0590デフォルトの名無しさん
2009/03/27(金) 23:50:42_beginthreadex
0591デフォルトの名無しさん
2009/03/28(土) 00:04:520592589
2009/03/28(土) 01:09:160593デフォルトの名無しさん
2009/03/28(土) 05:28:17スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力
させてみろ。話はそれからだ。
あとは環境を書けや。WindowsかLinuxか。
0594デフォルトの名無しさん
2009/03/28(土) 07:06:380595デフォルトの名無しさん
2009/03/28(土) 07:30:11信者もなにも、基本だろ。
クソな書き込みするくれーなら、意味のあること書いてミロ。
0596デフォルトの名無しさん
2009/03/28(土) 07:57:080597デフォルトの名無しさん
2009/03/28(土) 08:19:14について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて
何が必要なのか、どのようにして作るのかがまったく分かりません。
どこか基本的なところから作り方解説してくれてるサイトありませんか?
本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか
知って、本当にやってみようか考えてから買いたいんです。
0598デフォルトの名無しさん
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すれば問題解決するとは思いますが、それ以外の方法でお願いします。
0599デフォルトの名無しさん
2009/03/28(土) 08:32:03言ってることと書いていることが違う気がするのは気の所為か?
私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。
つーか、設計を見直すと言う選択肢はないのだろうか。
0600デフォルトの名無しさん
2009/03/28(土) 08:46:030601デフォルトの名無しさん
2009/03/28(土) 08:51:34CHoge & instance() { static CHoge h; return h; }
};
void CHogeHoge::init()
{
m_Value = CHoge::instance().value;
}
0602デフォルトの名無しさん
2009/03/28(土) 09:05:29入力反応に対応出来る範囲をうまく見積ればどうとでもなる
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:
}}
0603デフォルトの名無しさん
2009/03/28(土) 09:27:12ググった結果から microsoft のサイトのものを見るといい
0604デフォルトの名無しさん
2009/03/28(土) 10:10:15>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
なんでそれだと駄目なん?
>めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
問題そのものは静的オブジェクトの初期化順序問題として割と有名。
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13
>601 みたいに関数内 static にするのも駄目?
0605598
2009/03/28(土) 12:22:45しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、
今後シングルトンはこの方法を愛用することになりそうです。
>604さん
有名な問題なのですね、勉強になります。
>>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
>なんでそれだと駄目なん?
出来るだけシンプルにしたかったのと、
正攻法の攻略法を知っておこうと思ったからです。
ありがとうございました。
0606デフォルトの名無しさん
2009/03/28(土) 13:44:42> 正攻法の攻略法を知っておこうと思ったからです。
わかってないから質問してるんだろうに、
正攻法で無いと決め付けてるのは何で?
0607デフォルトの名無しさん
2009/03/28(土) 16:26:26私の設計意図から外れるから。
http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
のJavaの例の後者の方の例でどうしてもやりたかったから。
0608デフォルトの名無しさん
2009/03/28(土) 16:28:50>599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w
0609デフォルトの名無しさん
2009/03/28(土) 16:33:390610デフォルトの名無しさん
2009/03/28(土) 16:34:50対処法の正攻法ではない、と。
単に言葉の問題。変なところに噛み付いてこないでね。
>599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。
>600は
うーん、
実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。
で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。
0611デフォルトの名無しさん
2009/03/28(土) 16:38:280612デフォルトの名無しさん
2009/03/28(土) 16:41:27そんな阿呆みたいな糞言語と一緒にされたら困るんだが。
0613デフォルトの名無しさん
2009/03/28(土) 17:03:070614デフォルトの名無しさん
2009/03/28(土) 17:11:280615デフォルトの名無しさん
2009/03/28(土) 17:17:35なかなかスパッとはいかないね。
0616デフォルトの名無しさん
2009/03/28(土) 17:49:51設計が正攻法じゃないのに正攻法な解決っておかしいだろJK
0617デフォルトの名無しさん
2009/03/28(土) 21:51:53public:
static void func();
};
という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、
staticを取って、
void Sample::func() {....}
と書けばいいですか?
staticはつけてはだめなんですか?
0618デフォルトの名無しさん
2009/03/28(土) 22:02:28たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか
ぜんぜんわからん、、、
結構C++歴長いんだけどな。誰かわかる人いる?
0619デフォルトの名無しさん
2009/03/28(土) 22:03:010620デフォルトの名無しさん
2009/03/28(土) 22:03:20そのとおり。っていうか試せばわかるだろ。
0621デフォルトの名無しさん
2009/03/28(土) 22:11:39ポインタや参照型のテンプレート実引数には外部リンケージを持つ
オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない)
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
(以下略)
0622621
2009/03/28(土) 22:12:41× 外部リンケージを持つオブジェクト
○ 外部リンケージを持つオブジェクトまたは関数
0623デフォルトの名無しさん
2009/03/28(土) 22:24:28まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。
0624デフォルトの名無しさん
2009/03/28(土) 22:32:26そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の
動作の違いを作り出すなんて、あんた頭いいね。
ありがとう。
0625デフォルトの名無しさん
2009/03/28(土) 22:39:16昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって
半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、
頭がいいとか言わんよ。
0626デフォルトの名無しさん
2009/03/28(土) 22:40:260627デフォルトの名無しさん
2009/03/28(土) 22:46:26PC 以外では gcc や gcc ベースのコンパイラがたくさん使われてるし、 >584 の
ように Cygwin だってある。それに規格がああなってる以上、 VC++ が異端なだけ。
0628デフォルトの名無しさん
2009/03/28(土) 22:56:20普段はLinux使ってるという気がするけど。
BSD系使いとかSolaris使い?
最近は見かけないし。
0629デフォルトの名無しさん
2009/03/28(土) 23:06:44なんという俺統計。
0630デフォルトの名無しさん
2009/03/28(土) 23:19:23俺統計かもしれないが、結構同意してもらえると思うけどな。
Linux使ってんでしょ?
0631625
2009/03/28(土) 23:39:47625 の話は「PC 以外」の話で、普段使ってるのは Windows だよ。
>627 も言ってるとおり、 Linux はまったく関係ない。
0632デフォルトの名無しさん
2009/03/29(日) 00:08:03Linux と決め付ける根拠も「気がする」とか曖昧な割にしつこい。
まぁ、釣りなんだろうけど。
0633デフォルトの名無しさん
2009/03/29(日) 03:25:48俺プログラマ結構たくさん知ってると思ってたんだけど、その中にWindows+gccという
組み合わせの人がいなかったもんでついつい変な書き方をしちゃった。
0634デフォルトの名無しさん
2009/03/29(日) 04:07:540635デフォルトの名無しさん
2009/03/29(日) 04:39:410636デフォルトの名無しさん
2009/03/29(日) 09:10:55相手の思考回路を把握したと思い込める思考回路とかもな。
0637デフォルトの名無しさん
2009/03/29(日) 09:25:07これってグローバル名前空間の中に無名名前空間を作ればいいのですか?
逆に、たとえばMyAppという名前空間に無名名前空間を追加しても、ファイルスコープの宣言とはならないのでしょうか。
0638デフォルトの名無しさん
2009/03/29(日) 09:51:02ならない。
0639デフォルトの名無しさん
2009/03/29(日) 10:45:051>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をつけないと上のエラーが出るのですが
何故ですか・・・?
0640デフォルトの名無しさん
2009/03/29(日) 10:57:16>>639
そのヘッダファイルがインクルードされる度にm_dxmusicが定義されているからです。
staticを付けると消えるのは、そのシンボルがエクスポートされずファイルスコープになるからです。インクルードしたファイル毎に別々のm_dxmusicが存在する状態になります。
これが意図した動作ではなく、m_dxmusicが複数のファイルで共有するシンボルなのであれば、ヘッダファイルでextern付きの宣言のみを行い、適当な.cppファイルで1度だけ定義しましょう。
0641デフォルトの名無しさん
2009/03/29(日) 11:40:43名前空間の中でもいいよ。あんまり意味無いけど。
0642637
2009/03/29(日) 12:05:28うちのIDEでは、グローバル名前空間の無名空間がどれも同じ括りで表示されるので、名前空間ごとに把握できたら、
と思ってのことでしたが、グローバル空間に作ることにしました。
0643デフォルトの名無しさん
2009/03/29(日) 12:12:400644デフォルトの名無しさん
2009/03/29(日) 12:19:03ありがとうございます
0645デフォルトの名無しさん
2009/03/29(日) 15:03:01↑のツールと例を使ってkernel32.DLLの書き換えに挑戦してるのですが、
上手く行きません。
DLLを作成しようとすると 「 Error 12: Number Overflow : 」というエラーがdefファイルから検出されます。
エラーが出ている箇所は、「HeapSize=d_HeapSize @680」です。
自分で書き換えた箇所を戻して、コンパイルしてみても駄目でした。
コンパイラはdigital Marsのやつです。OSはvista
原因が特定できなくて困ってます
0646デフォルトの名無しさん
2009/03/29(日) 16:17:120647637
2009/03/29(日) 16:25:23>あんまり意味無いけど。
ということであったし、とりあえずグローバル名前空間の方に書いときます。
0648デフォルトの名無しさん
2009/03/29(日) 16:39:15無名名前空間の効果は名前付き名前空間の中でも変わらない。 >638 はデマ。
そして「あんまり意味無い」のは >642 のような事情が無いことが前提。
名前空間の中に入れたほうが便利なのに、わざわざグローバルに持っていく必要は無い。
0649デフォルトの名無しさん
2009/03/29(日) 16:52:09「ファイルローカルな宣言」ということなら間違いだけど。
0650デフォルトの名無しさん
2009/03/29(日) 17:00:390651デフォルトの名無しさん
2009/03/29(日) 20:46:44OPENFILENAMEは定義されていない識別子です、とエラーが表示されてしまいます
何かをincludeすれば良いのでしょうか
0652589
2009/03/29(日) 20:48:04while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。
do〜whileとか色々試してみたけどやっぱりダメです。
何かいい方法をよろしくお願いします。>>589
0653デフォルトの名無しさん
2009/03/29(日) 20:52:33http://msdn.microsoft.com/en-us/library/ms646839.aspx
0654589
2009/03/29(日) 21:05:250655589
2009/03/29(日) 21:06:51↑
これ無しwwww
NHK見てて間違ったwww
因みに589はマジレスですのでよろしくお願いします。
0656デフォルトの名無しさん
2009/03/29(日) 21:12:35{
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");
}
}
0657デフォルトの名無しさん
2009/03/29(日) 21:17:44#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);
}
}
0658デフォルトの名無しさん
2009/03/29(日) 21:20:53Commdlg.hが足りていませんでした
事前調べ不足でした。>>653さんありがとうございます
0659デフォルトの名無しさん
2009/03/29(日) 22:58:15ちゃんとやろうとすると C/C++ の規格内では出来ない。
環境が Windows ならメッセージループを作るべきだろうけど…
あるいは既にレスがあるとおりスレッドを作るにしても、
メインスレッドとのやり取りには注意点は多いし。
初心者に説明するには結構こみいった話なんだわ。
ここで全てを説明するのはちょっと無理ってことをわかってくれ。
メッセージループやスレッドの基礎をわかってからまた来い。
0660デフォルトの名無しさん
2009/03/30(月) 07:24:290661デフォルトの名無しさん
2009/03/30(月) 08:25:21#include <iostream>
とかしないとコンパイラが受け付けてくれません。
でも自前のヘッダがあるのでできるならインクルードしたくありません。
このばあいどうすればよいでしょうか
インクルードするしかないですか
0662デフォルトの名無しさん
2009/03/30(月) 08:28:19C++であるなら
NULL は確実に 0 のdefineなので
0 つかっとけ
0663デフォルトの名無しさん
2009/03/30(月) 08:44:19自分で定義するのはだめですか
0664デフォルトの名無しさん
2009/03/30(月) 08:51:44VCバージョンいくつよ?
VC6なら窓から投げ捨てろ
0665デフォルトの名無しさん
2009/03/30(月) 08:54:40#include <cstddef>
だろ
0666デフォルトの名無しさん
2009/03/30(月) 08:55:40#ifndef 使ってちゃんと囲っておけば
コンパイルや動作上の意味では問題は起こらないから
好きにすればいいんじゃないかな
重ねて言うがC++では 0 で定義されてるから
>>664
なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ
0667デフォルトの名無しさん
2009/03/30(月) 09:15:52実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。
0668デフォルトの名無しさん
2009/03/30(月) 09:22:26どっかでNULLは定義されるな
iostreamは知らん
0669デフォルトの名無しさん
2009/03/30(月) 09:49:25調べたらほんとに違うんだな
C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた
どうもありがとう
0670デフォルトの名無しさん
2009/03/30(月) 09:58:13NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。
それ以外を #include して定義されても処理系依存の動作。
0671デフォルトの名無しさん
2009/03/30(月) 10:27:02boost::shared_ptr<Test> p(new Test());
この2つはどう違いますか?
上のやつだとコンパイルできません。
0672デフォルトの名無しさん
2009/03/30(月) 10:32:30暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。
0673デフォルトの名無しさん
2009/03/30(月) 10:33:19NULL は 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.
0674デフォルトの名無しさん
2009/03/30(月) 10:37:20ありがとうです。
でもよくわかりませんでした。
boost::shared_ptr<Test> p = new Test();
という書き方は明示的にコンストラクタを読んでないということですか?
0675デフォルトの名無しさん
2009/03/30(月) 10:47:49boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);
0676デフォルトの名無しさん
2009/03/30(月) 10:55:12それでできました!
Testクラス内にboost::shared_ptr<Test> mInstance;
というポインタを持たせてたのですが、初期化できずにこまってました。
(初期化をコンストラクタ以外の場所で行いたかったため、
mInstance(new Test())
とかってかけなかった。
ありがとうございました!
0677デフォルトの名無しさん
2009/03/30(月) 10:56:470678デフォルトの名無しさん
2009/03/30(月) 11:16:02なるほど。
あと、676のような場合は、scoped_ptr<Test>は使えませんよね?
コンストラクタで初期化しないから。
0679デフォルトの名無しさん
2009/03/30(月) 11:21:53微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと
>>675
の形でもshared_ptrのコンストラクタは一回しか呼ばれない
0680デフォルトの名無しさん
2009/03/30(月) 11:25:43reset(new Test()) 使えよ。
0681デフォルトの名無しさん
2009/03/30(月) 11:34:23コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。
0682デフォルトの名無しさん
2009/03/30(月) 11:46:43たしかに、scoped_ptr()でreset(new Test())使うとできました。
ありがとうございました。
0683デフォルトの名無しさん
2009/03/30(月) 12:00:18boost_1.38なんですが、boost::conditionが解決できません。
それ以外はコンパイルは通ります。
普通にfedora core7に入れてもだめです。
yum install boost-develだとうまくいくのですが、
なにかやり方があるのでしょうか?初心者ですいません。
0684デフォルトの名無しさん
2009/03/30(月) 12:57:04class Test {
static boost::scoped_ptr<MyClass> m_MyClass;
};
これの実体を書くところで初期化までしようとしているのですがうまくかけません。
0685デフォルトの名無しさん
2009/03/30(月) 13:04:21とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。
それでもわからなければ、以上の全部を添えて相談するといい。
0686デフォルトの名無しさん
2009/03/30(月) 13:24:56言われたとおりにもう一回見直してみたらできました。
初期化は
boost::scoped_ptr<MyClass> Test::m_MyClass;
と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは
privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。
ありがとうございました。
0687デフォルトの名無しさん
2009/03/30(月) 15:43:17自己解決しました。
バージョンによって、ソース変えないといけないんですね。
インクルードを適度に増やして解決しました。
さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには
ライブラリがうまく出来ていません。
bjamの設定でコンパイラにオプションつけるにはどうしたら
いいんでしょうか?
クロス開発なんてしてる人はいないですかねw
0688デフォルトの名無しさん
2009/03/30(月) 20:18:14bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"...
でいいんじゃないのか
0689デフォルトの名無しさん
2009/03/30(月) 23:56:13VisualStudio2005のVC++
フォームビューに配置したエディットコントロールで
「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが
これはなんなんでしょうか?
他アプリからコピーした文字列をそのエディットコントロールにペースト
して処理したいのですが。
ググってもどうにも見つからなくて…。
0690デフォルトの名無しさん
2009/03/30(月) 23:59:030691デフォルトの名無しさん
2009/03/31(火) 00:12:30メニューバーの「編集」をドロップダウンすると
「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。
なんか悪いことしたっけ?
0692デフォルトの名無しさん
2009/03/31(火) 00:19:59ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?
0693デフォルトの名無しさん
2009/03/31(火) 00:22:34とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?
0694デフォルトの名無しさん
2009/03/31(火) 00:34:31ID_EDIT_COPY等の
OnEditCopyとかを自分で記述しなきゃいけないん?
エディットコントロールって初めからコピー・カット・ペーストくらい
できるんじゃなかったっけ…。
0695589
2009/03/31(火) 00:42:17そうなんですか。どうもありがとうございます。
もっと勉強します。
0696デフォルトの名無しさん
2009/03/31(火) 00:42:460697デフォルトの名無しさん
2009/03/31(火) 01:04:16エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。
今試したら,ダイアログベースのプログラムにエディットコントロールを配置して
ビルドすると普通にカット・コピー・ペーストできますね。
でもフォームビューだとできない…。
どちらにしても「Ctrl+A」はきかないし。
こんな超重要ポイントがなんで入門書で触れられていないんだろう。w
0698デフォルトの名無しさん
2009/03/31(火) 01:16:47{
m_edit1.Cut();
}
等を追加してなんとか解決しました。
エディットコントロールが勝手にやってくれると思い込んでいたもので…。
初心者の質問に付き合って下さった方々ありがとうございました。
0699デフォルトの名無しさん
2009/03/31(火) 01:20:34それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな?
まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。
0700デフォルトの名無しさん
2009/03/31(火) 01:33:400701デフォルトの名無しさん
2009/03/31(火) 01:34:42複数あるんです。w
今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。
あと「Ctrl+A」もぜひ装備したいし…。
0702デフォルトの名無しさん
2009/03/31(火) 02:03:50フォームビューだと勝手にやってくれなかったんだっけなぁ・・・?
と気になって試しにプロジェクト作ってみたら、やっぱできないわ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
0703デフォルトの名無しさん
2009/03/31(火) 02:24:15参照先ありがとうございます。
今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに
ペーストされる」みたいな珍妙な動作になっています。w
GetFocus()を試してみます。
0704デフォルトの名無しさん
2009/03/31(火) 04:54:38プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected
に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか?
ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。
0705デフォルトの名無しさん
2009/03/31(火) 06:30:490706デフォルトの名無しさん
2009/03/31(火) 06:32:130707デフォルトの名無しさん
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);
このどっちの形にするべきなのか、わかりません。
どうかお願いします。
0708デフォルトの名無しさん
2009/03/31(火) 09:50:500709デフォルトの名無しさん
2009/03/31(火) 10:24:57mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。
bjamもバージョンで指定の仕方が違うなぁ。
試行錯誤しますです。
0710デフォルトの名無しさん
2009/03/31(火) 11:03:04ありがとうございます。
Baseをテンプレートクラスにして、関数テンプレートを受けとり
コンストラクタの代わりにつかう、ということですか?
すげえややこしそうな気が、、、
0711デフォルトの名無しさん
2009/03/31(火) 12:26:30gcc,g++等をシェルスクリプトで作ったらコンパイルできました!
引数もシェルスクリプトに入れたらスッキリインストール完了しました。
ところが、ucLibにはn_procs()というglibの関数がないんですね。
mips用のboostできたのに、ここからコンパイルできないや…
どこまでひっかかるんだか…
0712デフォルトの名無しさん
2009/03/31(火) 12:38:570713デフォルトの名無しさん
2009/03/31(火) 13:08:32どっちでもない。参照を使え。
0714デフォルトの名無しさん
2009/03/31(火) 13:09:36よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。
0715デフォルトの名無しさん
2009/03/31(火) 14:34:12std::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つ読み込めますか?
ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。
0716デフォルトの名無しさん
2009/03/31(火) 14:41:47前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも
同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の
ような気がする。
できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に
分けるとかするのがおすすめ。
0717デフォルトの名無しさん
2009/03/31(火) 14:47:06ありがとうございます。
0718デフォルトの名無しさん
2009/03/31(火) 15:25:57結局自力で解決できました。
boost::threadに相当するソースのget_nprocs(CPUの数)
を1にして、再度staticリンク指定したことで、
mips/ucLinuxのboostを作成でき、動作しました。
0719デフォルトの名無しさん
2009/03/31(火) 17:35:41func(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 → 引数呼び出しの順番は変わらないような気がするので
0720デフォルトの名無しさん
2009/03/31(火) 18:39:420721デフォルトの名無しさん
2009/04/01(水) 04:19:11危険性があるかどうかって話なら >720 のとおり無いんだけど、
あとで func() に引数を足した場合に問題が発生する形に変更されてしまう
可能性が高いんだからそんなコードを書いていいってことには
ならないよ。
0722デフォルトの名無しさん
2009/04/01(水) 10:28:14namespace { 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も初期化済みということになりますか?
0723デフォルトの名無しさん
2009/04/01(水) 10:32:330724デフォルトの名無しさん
2009/04/01(水) 11:15:30value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に
初期化されることは決まっている。
だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。
0725デフォルトの名無しさん
2009/04/01(水) 12:36:59そこら辺については未熟なので、勉強して理解できるようになるまでは、
何とか自分で扱えるような方法で考えてみます。ありがとうございました。
0726デフォルトの名無しさん
2009/04/01(水) 14:36:430727デフォルトの名無しさん
2009/04/01(水) 15:30:21public:
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;
とかのように、ここでもスマポを使うべきでしょうか?
よろしくお願いします。
0728デフォルトの名無しさん
2009/04/01(水) 18:47:12そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。
getData(int index) でだめな理由はなんだろうか?
execute() で、内部にアルゴリズムを実装してはどうだろうか?
とか、考える方が先かも。
0729デフォルトの名無しさん
2009/04/01(水) 18:49:35・アクセス関数の戻り値の型をどうしたらいいか
というのが質問の趣旨ですぜ。
0730デフォルトの名無しさん
2009/04/01(水) 19:34:110731デフォルトの名無しさん
2009/04/01(水) 19:37:54生ポならそのままコピーしちゃうけど
スマポはクラスでおっきいから。
boost使ったことないからよくわからんけど
0732デフォルトの名無しさん
2009/04/01(水) 19:41:47template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);}
変な受け皿用意されたらコンパイル時に蹴る。
0733デフォルトの名無しさん
2009/04/01(水) 22:36:19以下のコードが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;
}
0734733
2009/04/01(水) 22:38:27それと、どうやら*p[1] = 0;のところで死ぬようです。
0735デフォルトの名無しさん
2009/04/01(水) 22:42:41(*p)[1] = 0;
0736デフォルトの名無しさん
2009/04/01(水) 22:42:540737736
2009/04/01(水) 22:45:230738デフォルトの名無しさん
2009/04/01(水) 22:56:480739デフォルトの名無しさん
2009/04/01(水) 23:18:38演算子の優先順位の問題でしたか。ありがとうございます。
0740デフォルトの名無しさん
2009/04/02(木) 02:44:47未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。
0741デフォルトの名無しさん
2009/04/02(木) 05:14:00int *p = new int(1);
int *p = new int(100);
これってどう違うんですか?
全部コンパイル出来てしまいます。
0742デフォルトの名無しさん
2009/04/02(木) 05:22:10int *p = new int; ← 不定値
int *p = new int(1); ← 1で初期化
int *p = new int(100); ← 100で初期化
0743デフォルトの名無しさん
2009/04/02(木) 08:48:19ありがとうございました。
0744デフォルトの名無しさん
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 で参照されました。
と出ます アドバイスください;;
0745デフォルトの名無しさん
2009/04/02(木) 14:56:26リリースビルドでやってないよね?
0746744
2009/04/02(木) 14:57:410747744
2009/04/02(木) 14:59:04がマルチスレッド(/MT)ですけど関係ありますかね
0748デフォルトの名無しさん
2009/04/02(木) 15:06:570749デフォルトの名無しさん
2009/04/02(木) 15:07:440750744
2009/04/02(木) 15:10:18勉強になりました
ありがとうございます
0751デフォルトの名無しさん
2009/04/02(木) 23:31:23スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。
0752デフォルトの名無しさん
2009/04/02(木) 23:33:240753デフォルトの名無しさん
2009/04/02(木) 23:36:380754デフォルトの名無しさん
2009/04/02(木) 23:56:140755デフォルトの名無しさん
2009/04/02(木) 23:57:21boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0));
とやってできました。
0756デフォルトの名無しさん
2009/04/03(金) 00:03:38単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?
0757デフォルトの名無しさん
2009/04/03(金) 00:19:11そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?
0758デフォルトの名無しさん
2009/04/03(金) 01:23:15char 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;
}
どうしてでしょうか?
0759デフォルトの名無しさん
2009/04/03(金) 01:30:10デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ
0760デフォルトの名無しさん
2009/04/03(金) 01:35:56129 が CHAR_MAX より大きい可能性が高いな。
0761デフォルトの名無しさん
2009/04/03(金) 05:59:03色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?
0762デフォルトの名無しさん
2009/04/03(金) 06:23:45その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる
0763デフォルトの名無しさん
2009/04/03(金) 07:45:19a = 0xff (255) を int 型にすると 0x000000ff (255)
※符号拡張の際、unsigned int 型を経由
(2) char a = 0xff;
a = 0xff (-1) を int 型にすると 0xffffffff (-1)
まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が
いちいちキャストしたりとか面倒なことをせずに済む
0764デフォルトの名無しさん
2009/04/03(金) 08:12:15そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。
一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763
0765デフォルトの名無しさん
2009/04/03(金) 09:13:17int に符号拡張してから unsigned int に変換される
char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され
unsigned int 4,294,967,295 (0xffffffff) に変換される
0766デフォルトの名無しさん
2009/04/03(金) 10:56:18:
(フェッチしたレコードに関する処理部)
:
}
--------------------------
関数
int fetch_data(void)
{
:
(レコードデータ取得部)
:
return(0)
}
-------------------------
上記のようなプログラムで
while文の条件文の意味がよくわかりません。
全体の流れが「レコードが存在する間、処理を繰り返す」ような
処理ということはわかるのですが、
!(ret_cd=fetch_data())ときいている意味が
はっきりわからないのでどなたかお願いします。
0767デフォルトの名無しさん
2009/04/03(金) 11:03:57> !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?
0768デフォルトの名無しさん
2009/04/03(金) 11:44:08を返すのだろう
レコードが存在する !(0) → 真となり、処理継続
レコードが存在しない !(-1) → 偽となり、処理終了
ぱっと見に分かりづらいから
while(!(ret_cd = fetch_data())){
↓
while((ret_cd = fetch_data()) == 0){
と書き換えてもいいかもしらん
0769デフォルトの名無しさん
2009/04/03(金) 12:02:29「〜をする意味」は有効な回答が付きづらい
概して「考えれば分かる」とか言われるのが落ち
質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは,
必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難
0770デフォルトの名無しさん
2009/04/03(金) 12:06:140771デフォルトの名無しさん
2009/04/03(金) 12:29:49おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。
!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。
0772デフォルトの名無しさん
2009/04/03(金) 14:14:14質問の仕方も曖昧ですみません。
レスいただきありがとうございます。
しかしまだ消化不足…といいますか、流れについて
いけてないです。現在修正中のプログラムが下記のような流れです。
�@カーソルセット
EXEC SQL DECLARE cur_TEST CURSOR FOR
SELECT・・・
FROM・・・
WHERE・・・
EXEC SQL OPEN cur_TEST;
0773デフォルトの名無しさん
2009/04/03(金) 14:15:05while(!(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);
0774デフォルトの名無しさん
2009/04/03(金) 14:15:48int 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);
}
0775デフォルトの名無しさん
2009/04/03(金) 14:16:34もうひとつテーブルを読み、そこで抽出したレコード(複数件)が
なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。
単純にやり方を真似てfetch_data2という関数をつくり、
while(!(ret_cd=fetch_data()))の中で
while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが
エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の
意味をはっきりさせようと思った次第です。
0776デフォルトの名無しさん
2009/04/03(金) 14:16:450777デフォルトの名無しさん
2009/04/03(金) 15:04:11死ね
0778デフォルトの名無しさん
2009/04/03(金) 15:30:31どんなエラーが出るの?
0779デフォルトの名無しさん
2009/04/03(金) 15:40:55わからない点は、!(ret_cd=fetch_data())の部分で、
ret_cdになんの値がセットされているかです。
int型で定義されてはいますが、これに値がセットされるところを
探しても見つけきれないので。
fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら)
return(1)」という処理が入っているので、セットされる値の変わり目が
はっきりとわかります。
なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。
もう少し詮索してみます。
0780デフォルトの名無しさん
2009/04/03(金) 15:42:44何の値、って、fetch_data() 関数の戻り値でしょ。
デバッガで一行ずつ追ってみれば? もしくは、printf とかで。
0781デフォルトの名無しさん
2009/04/03(金) 15:59:14ret_cd=fetch_data()
のところでret_cdには0か1がセットされる
0782デフォルトの名無しさん
2009/04/03(金) 17:23:370783デフォルトの名無しさん
2009/04/03(金) 18:00:59本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw
0784デフォルトの名無しさん
2009/04/03(金) 19:46:00#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()関数使ったプログラムのほうが速いし、ハードディスクに
ほとんどアクセスしなくて済んでる。
ファイルを開かなくて取得できんのかな。いい方法ないもんか。
0785デフォルトの名無しさん
2009/04/03(金) 19:51:09おれたちも、766みたいな頃を経てきたわけだろ。
なんとなく、766はできないプログラマになりそうな気もするけど
0786デフォルトの名無しさん
2009/04/03(金) 19:54:54使った方が速いのかもね。
0787デフォルトの名無しさん
2009/04/03(金) 19:57:55FindFirstFile/FindNextFileでもつかっとけよ。
Windowsならディレクトリエントリだけの話になるから。
0788デフォルトの名無しさん
2009/04/03(金) 20:00:43実際の値が必要なときは、これを使わざるを得ないんだけど。
0789デフォルトの名無しさん
2009/04/03(金) 20:21:42低レベルなプログラム書けるように勉強しないとならんな
0790デフォルトの名無しさん
2009/04/03(金) 20:32:15横着やな。
0791デフォルトの名無しさん
2009/04/03(金) 20:51:090792デフォルトの名無しさん
2009/04/03(金) 20:55:160793デフォルトの名無しさん
2009/04/03(金) 20:56:580794デフォルトの名無しさん
2009/04/03(金) 21:00:190795デフォルトの名無しさん
2009/04/03(金) 21:03:05はにりいと
とんとかいも
0796デフォルトの名無しさん
2009/04/03(金) 21:07:14おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ほら!(得意げに)』
彼女 『何これ?PC98じゃない!幻滅!』
おいら『え、だってみんなPC98が普通だし....』
彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。
大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『...』
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
PCMは?MIDIは?使ってないの?』
おいら『....』
彼女 『動きが汚ーい!遅ーい!最低ー!
スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『....』
彼女 『しょうがないからうちでX68000で遊ぶ?
出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...』
以上実話です。
0797デフォルトの名無しさん
2009/04/03(金) 21:13:35WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。
0798デフォルトの名無しさん
2009/04/03(金) 21:15:58WinしらてとのAPIどころか、Winしらてと自体(以下略)
0799デフォルトの名無しさん
2009/04/03(金) 21:23:1520年前ってどうよ
0800デフォルトの名無しさん
2009/04/03(金) 22:17:03悔しいがワラタ
0801デフォルトの名無しさん
2009/04/03(金) 22:35:23おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』
彼女 『うん!』
おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ
よ(得意げに)』
彼女 『何それ?ニフティとかのこと?幻滅!』
おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる
ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに
あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』
彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。
大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った
基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の
情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ
のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる
と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う
し、、』
0802デフォルトの名無しさん
2009/04/03(金) 22:38:38こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が
あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面
もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
PCMは?MIDIは?使ってないの?』
おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』
彼女 『動きが汚ーい!遅ーい!最低ー!
スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』
彼女 『しょうがないからうちでX68000で遊ぶ?
出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』
0803デフォルトの名無しさん
2009/04/03(金) 22:39:50おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
おんな『シネよキモデブ。二度と話しかけんな』
0804デフォルトの名無しさん
2009/04/03(金) 23:40:26ついでに此処へも書き込みしないでいいよ。
0805デフォルトの名無しさん
2009/04/03(金) 23:42:50もっとブラッシュアップしてくれ
0806デフォルトの名無しさん
2009/04/03(金) 23:48:07やりたいことは「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;
}
0807デフォルトの名無しさん
2009/04/04(土) 11:28:40class 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;
}
どうかよろしくお願いします。
0808デフォルトの名無しさん
2009/04/04(土) 11:31:520809デフォルトの名無しさん
2009/04/04(土) 11:39:330810デフォルトの名無しさん
2009/04/04(土) 11:39:47どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。
0811デフォルトの名無しさん
2009/04/04(土) 11:39:49なんつー的確な指摘w
0812デフォルトの名無しさん
2009/04/04(土) 11:40:580813デフォルトの名無しさん
2009/04/04(土) 11:46:52材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。
ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。
0814デフォルトの名無しさん
2009/04/04(土) 11:49:53void func2(MainClass* mc) {}
ここなんですが、最初は
void func2(boost::shared_ptr<MainClass>& mc) {}
こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき
コンパイルが通りませんでした。スマポの使い方として、生のポインタは
基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると
thisはどうやって渡せばいいかわからなかったので。。。
0815デフォルトの名無しさん
2009/04/04(土) 11:50:37はいいけど、君それ、手に持ってるのゆで卵だよね?
みたいな。
0816デフォルトの名無しさん
2009/04/04(土) 11:51:37なにか肝心なもの(フライパン)が抜けてるということですか?
0817デフォルトの名無しさん
2009/04/04(土) 11:59:380818デフォルトの名無しさん
2009/04/04(土) 12:08:37こう書くとAssertionに引っかかるし、、、
これって循環参照になってるから?
0819デフォルトの名無しさん
2009/04/04(土) 12:26:50Animationset m_animset;
という構造体があり、m_anim->GetAnimset();
というメソッドで個数が取得できます
m_animsetを最初から配列で100個くらい作っておけば問題ないのですが
可変で作る場合はどうすればいいのですか?
0820デフォルトの名無しさん
2009/04/04(土) 12:28:59vectorつかう
0821デフォルトの名無しさん
2009/04/04(土) 12:29:56ありがとうございますvectorについて調べてみます
0822デフォルトの名無しさん
2009/04/04(土) 12:36:32Animationset **m_animset;
0823デフォルトの名無しさん
2009/04/04(土) 12:57:52for(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 &' に変換できません
とエラーが出ます
メモリを確保するにはどうすればいいのでしょうか・・・・
0824823
2009/04/04(土) 13:05:05AnimationSet anim;
m_animset.push_back(anim);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}
という風にしたらできました
0825デフォルトの名無しさん
2009/04/04(土) 13:39:000826デフォルトの名無しさん
2009/04/04(土) 13:50:42enable_shared_from_this使えばいいんでないの?
0827デフォルトの名無しさん
2009/04/04(土) 13:55:39欲しい分だけメモリ確保です
0828デフォルトの名無しさん
2009/04/04(土) 14:20:580829デフォルトの名無しさん
2009/04/04(土) 17:57:33ダブルポインタって、ただのポインタのポインタとなにが違うんですか?
0830>>829
2009/04/04(土) 18:37:390831デフォルトの名無しさん
2009/04/04(土) 18:39:38その言葉を使う人間ができるプログラマかどうか。
0832デフォルトの名無しさん
2009/04/04(土) 20:14:390833デフォルトの名無しさん
2009/04/04(土) 20:35:11enable_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;
}
0834デフォルトの名無しさん
2009/04/04(土) 20:42:29ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。
0835デフォルトの名無しさん
2009/04/04(土) 20:54:19ありがとうございます。
>大元のm自体をshared_ptrに格納する
というのは、
boost::scoped_ptr<SubClass> m_SubClass;
を
boost::scoped_ptr<SubClass> m_SubClass;
とするということですよね?
そうしてもBoostから例外を投げられます。聞いてばかりですいません。。
0836デフォルトの名無しさん
2009/04/04(土) 20:59:29違う違う、こっち。
int main() {
boost::shared_ptr<MainClass> pm(new MainClass);
pm->func1();
return 0;
}
0837デフォルトの名無しさん
2009/04/04(土) 21:09:54俺、ポッぽインタって言っている
で、3つはぽっぽっぽインタだな
0838デフォルトの名無しさん
2009/04/04(土) 21:10:23なるほど、動きました!
thisがboost::shared_ptr<MainClass>でなければならなかったということですね。
本当にありがとうございました。
0839デフォルトの名無しさん
2009/04/04(土) 21:17:04何処がおかしいのでしょうか?
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: 構文エラー : ',' が '&' の前にありません。
0840デフォルトの名無しさん
2009/04/04(土) 21:22:15friend ostream& operator<<(ostream&, const Expr_node&);
Exprなんて型ないからExprを変数名だと推定してる
0841デフォルトの名無しさん
2009/04/04(土) 21:28:37なぜエラー行を抜いた
class Expr;を前方宣言か?
0842デフォルトの名無しさん
2009/04/04(土) 22:05:38> スマポの使い方として、生のポインタは
> 基本的に全部スマポで置き換えるのが正しい
どこからそんなアホな理屈が出てきたんだ?
0843デフォルトの名無しさん
2009/04/04(土) 22:10:59C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし
Googleコーディング標準でもスマポがいいねって書いてあるから
まぁ初心者はそのくらいの気持ちでもいいかも。
ただ、だからといってboostを使うのではなく
一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。
ちんぽちんぽ。
0844デフォルトの名無しさん
2009/04/04(土) 22:16:100845デフォルトの名無しさん
2009/04/04(土) 22:17:31貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ
0846デフォルトの名無しさん
2009/04/04(土) 22:30:40>807 の例は参照に置き換えれば済むだろう。
所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。
0847デフォルトの名無しさん
2009/04/04(土) 22:33:15ああなるほど。
確かに、参照が使えるところには
ポインタよりも参照を使うべきだというのには同意。
0848デフォルトの名無しさん
2009/04/04(土) 22:33:250849デフォルトの名無しさん
2009/04/04(土) 23:01:56>>841
スマンカッタ
大きな勘違いというか、錯誤していた
前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた
もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら
スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが
多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです
なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね
0850デフォルトの名無しさん
2009/04/04(土) 23:13:03コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、
オブジェクトを破棄するという、実に巧妙な仕組みだね
0851デフォルトの名無しさん
2009/04/05(日) 00:35:280852デフォルトの名無しさん
2009/04/05(日) 02:50:300853デフォルトの名無しさん
2009/04/05(日) 02:51:41Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?
0854デフォルトの名無しさん
2009/04/05(日) 02:59:29所有権の移動や共有が必要ないなら、当然。
0855デフォルトの名無しさん
2009/04/05(日) 06:56:41どこがまずいのでしょうか??
struct pointV
{
int x ;
int y ;
};
class Test
{
std::vector<pointV> vecTest ;
public:
Test()
{
vecTest.reserve(8) ;
vecTest[0].x = 0 ; ←ここで発生するみたいです
}
};
よろしくお願いします
0856デフォルトの名無しさん
2009/04/05(日) 07:19:160857デフォルトの名無しさん
2009/04/05(日) 07:50:26有難うございました
0858デフォルトの名無しさん
2009/04/05(日) 13:08:57自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば
いいんじゃないか、と思ったんですが。
0859デフォルトの名無しさん
2009/04/05(日) 13:21:170860デフォルトの名無しさん
2009/04/05(日) 14:25:12内容は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');
};
0861デフォルトの名無しさん
2009/04/05(日) 14:45:50じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ…
あとVBガワのCOMポートはバイナリ?
0862デフォルトの名無しさん
2009/04/05(日) 14:54:23たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか
1024と入れるとほんの少ししか動きません。
VBがフリーズするときもあります。
VB側はバイナリーです。
よろしくお願いします
0863デフォルトの名無しさん
2009/04/05(日) 14:57:070864デフォルトの名無しさん
2009/04/05(日) 15:04:18つまり0が送信された段階で'\0'と同じと判断されるのですね
0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました
データの終了判断は他の数値にした方がよさそうですね
0865デフォルトの名無しさん
2009/04/05(日) 15:05:18実機ないから試せないけど,1000まではちゃんと動作確認できたと.
あとは 1023 とか 1025 だとどうなる?正常?
ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる?
> VBがフリーズするときもあります。
なんとなくパリティかボーレートが怪しい気がする.
プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない.
for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.
0866デフォルトの名無しさん
2009/04/05(日) 15:06:30そっちかー
0867デフォルトの名無しさん
2009/04/05(日) 15:38:561023と1025は正常に動作しました
Cとは関係ない話になりますがPC側のフリーズは
1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか)
→VBの反応なくなる→タスクマネージャーで強制終了→VB再起動
→「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ
→後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない
こんな感じです。
C側はH8に転送してますので確認は出来ませんが
VB側は出来ると思います。
手元にシステムがないので今は無理ですが。
>>864
VBの送信も悪いですが受け取るC側にも問題があるようです
0868デフォルトの名無しさん
2009/04/05(日) 16:28:42VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん.
シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\
データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります
0869デフォルトの名無しさん
2009/04/05(日) 16:50:15すいません。まだやってません
というか\0\0というのは2回送信してCで受け取れってことでしょうか?
0870デフォルトの名無しさん
2009/04/05(日) 17:08:45まず仕様を確認しろよ
\0(=0x00) を終端としてるようだが、それだと 256の倍数で
おかしくなるのは当然に思える。
0871デフォルトの名無しさん
2009/04/05(日) 17:12:01data(0) = CByte(inputData Mod 256)
data(1) = CByte(inputData \ 256)
上は下と同じことだと忘れていない?
data(0) = 0
data(1) = 1
0872デフォルトの名無しさん
2009/04/05(日) 17:13:520873デフォルトの名無しさん
2009/04/05(日) 17:21:54data[0] = receive();
data[1] = receive();
にするのが正しいんじゃないかと思う
0874デフォルトの名無しさん
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)
0875デフォルトの名無しさん
2009/04/06(月) 00:13:00グラフィックを表示するにあたって追加でインストール
しなきゃいけないものってあるんでしょうか?
OSはXP、visual c++ 2005を使用しています。
0876デフォルトの名無しさん
2009/04/06(月) 00:16:03GDI使うだろうし
0877デフォルトの名無しさん
2009/04/06(月) 00:36:12ですが教科書の通りにプログラムしても
なぜか動いてくれないんですよね・・・
これが問題ありそうな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' : 関数の定義が間違っています。
0878デフォルトの名無しさん
2009/04/06(月) 00:51:24CVc31view クラスの宣言はどうなってる?
0879デフォルトの名無しさん
2009/04/06(月) 13:14:25たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?
0880デフォルトの名無しさん
2009/04/06(月) 13:54:04pValue[1] = 10;
のように配列をnewすると、
代入時に*が付かないのに変数にpが付くのがシックリ来ません。
vector使えとか、そういう話とは別に
ポインタ変数にpを付けられているかたにお聞きしたいのですが、
こういう場合にもpを付けられていますか?
それとも、int value = new int[10]; と書かれてますか?
0881デフォルトの名無しさん
2009/04/06(月) 14:02:570882デフォルトの名無しさん
2009/04/06(月) 14:05:42コーディング規約に従うだけ。
ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。
0883デフォルトの名無しさん
2009/04/06(月) 14:09:59話には参加できないな。うれしいぜ。
0884デフォルトの名無しさん
2009/04/06(月) 14:12:42その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。
# なんでvaluesじゃないのか、その方が気になる。
0885デフォルトの名無しさん
2009/04/06(月) 15:39:410886デフォルトの名無しさん
2009/04/06(月) 20:30:01クラスの外部でするべきでしょうか?
0887886
2009/04/06(月) 20:37:48-性的なメンバ
+静的なメンバ
あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには
publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか
わからずにいます。
目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で
1個あればいいんですが。
0888デフォルトの名無しさん
2009/04/06(月) 20:44:330889デフォルトの名無しさん
2009/04/06(月) 21:37:180890デフォルトの名無しさん
2009/04/06(月) 22:43:42静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?
0891デフォルトの名無しさん
2009/04/06(月) 23:20:39webページを教えて下さい。お願いします。
0892デフォルトの名無しさん
2009/04/06(月) 23:23:470893デフォルトの名無しさん
2009/04/06(月) 23:50:57概念はある程度わかるんですが実際 どうやって実装しているのか
分からないんです
0894デフォルトの名無しさん
2009/04/06(月) 23:58:06boostのコードでも見たらどうか。
0895デフォルトの名無しさん
2009/04/07(火) 00:14:27もっとも、基本はデストラクタでdeleteするという点は共通だけど。
0896デフォルトの名無しさん
2009/04/07(火) 00:26:070897デフォルトの名無しさん
2009/04/07(火) 00:35:54変数を宣言するときに
char buf[1000];
とするのと
char buf_0[100];
char buf_1[100];
...
...
char buf_9[100];
として確保するのでは、必要なメモリの量は変わってくるのでしょうか?
0898デフォルトの名無しさん
2009/04/07(火) 00:37:02やってみればいいじゃん。
0899デフォルトの名無しさん
2009/04/07(火) 00:59:460900デフォルトの名無しさん
2009/04/07(火) 01:17:09実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない
0901デフォルトの名無しさん
2009/04/07(火) 02:07:25CPUのアラインメントの関係で違ってくるかもしれんな
0902デフォルトの名無しさん
2009/04/07(火) 05:58:06コンパイラは通ったんですが、なんか怪しいような。
そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか?
int (*p)[10] = new int [3][10]();
0903デフォルトの名無しさん
2009/04/07(火) 09:53:36ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと
初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、
vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?
0904デフォルトの名無しさん
2009/04/07(火) 09:57:01コンストラクタを実行していないクラスを生成する…
無理ぽ
0905デフォルトの名無しさん
2009/04/07(火) 10:17:470906デフォルトの名無しさん
2009/04/07(火) 10:37:15わかりやすく解説してるHPとかありますか?
QueryStringのやりとりが分からなくて困ってます
0907デフォルトの名無しさん
2009/04/07(火) 10:45:44http://pc11.2ch.net/test/read.cgi/php/1077753522/
http://pc11.2ch.net/test/read.cgi/php/1048393217/
0908デフォルトの名無しさん
2009/04/07(火) 10:49:58>>907
0909デフォルトの名無しさん
2009/04/07(火) 11:56:23F5で実行するたびに以下のような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
0910デフォルトの名無しさん
2009/04/07(火) 12:02:32こちらへどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0911デフォルトの名無しさん
2009/04/07(火) 12:02:34そういう環境ちゃんと書かないとわからんよ。
0912デフォルトの名無しさん
2009/04/07(火) 14:53:46そんなのインストールしてません。
0913デフォルトの名無しさん
2009/04/07(火) 17:50:35その解放は、delete[] pで問題ない。
0914デフォルトの名無しさん
2009/04/07(火) 22:52:47質問。
0915デフォルトの名無しさん
2009/04/07(火) 22:57:27>>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では一度には確保できないと思ったけどな。
0916デフォルトの名無しさん
2009/04/07(火) 23:09:12よくない
0917デフォルトの名無しさん
2009/04/07(火) 23:16:22ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=424
一応こんなのが見つかった
0918デフォルトの名無しさん
2009/04/07(火) 23:25:06何が違うの?vectorも勝手にデストラクタ呼ばれて解放される
0919デフォルトの名無しさん
2009/04/07(火) 23:29:27ただ内部実装にポインタを使っているクラス。
内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。
0920デフォルトの名無しさん
2009/04/07(火) 23:35:20#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次元配列も割と簡単に扱えるみたいだ
0921デフォルトの名無しさん
2009/04/07(火) 23:51:19つまりvectorで確保した領域は、関数などでポインタ渡しが
できないってことですね?それは不便かも・・。
0922デフォルトの名無しさん
2009/04/08(水) 00:06:510923デフォルトの名無しさん
2009/04/08(水) 00:23:43スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。
メモリ領域は2つのスマートポインタで共有される。
みたいな。
0924902
2009/04/08(水) 01:41:17どもです。
同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが
delete [] p; でちゃんとできてました^^
0925デフォルトの名無しさん
2009/04/08(水) 06:11:47本当だ。
この方法で、3次元配列も出来た!
しらんかった。
あと、後ろの括弧は無しでも問題ないようだけど。。。
なんでこれで出来るのか、よくわからん。
でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、
あまり使い道はないかも。
0926デフォルトの名無しさん
2009/04/08(水) 08:12:35ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、
それをShowControlBar関数を使って消したり出したりしているのですが、
表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、
変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。
クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには
どうすればよいでしょうか?
知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。
よろしくお願いします。
0927デフォルトの名無しさん
2009/04/08(水) 09:47:39DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る
逆に言えば入力フォーカスが移らない限り前面には出てこない
NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも
0928デフォルトの名無しさん
2009/04/08(水) 10:22:390929デフォルトの名無しさん
2009/04/08(水) 10:23:54S WM_NCHITTEST x y
R WM_NCHITTEST HTCAPTION
S WM_MOUSEACTIVATE HTCAPTION WM_LBUTTONDOWN
R WM_MOUSEACTIVATE MA_NOACTIVATE
という感じになったので
WM_MOUSEACTIVATEのメッセージハンドラを作ってMA_ACTIVATEを返せばいいんじゃないかと思う
0930デフォルトの名無しさん
2009/04/08(水) 11:23:14メッセージが思うように飛んでこないので調べてみると
ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dlgbar.html
ダイアログバー上のイベントが、CDialogBarクラスまで来ないようだ。
したがって、イベントはCChildFrameで処理しなければならない。
CChildFrameをサブクラス化するなりしないとならないようだ
やれなくはないが、もっと簡単な方法はないだろうか・・・
0931926
2009/04/08(水) 12:25:22>>927
おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると
フォーカスは移りました。
>>928
元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。
>>929
Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。
ただツールをしるきっかけを教えていただきありがとうございます。
>>930
教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。
試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の
マウスダウンイベントを拾える事を確認したので、そのイベント検知時に
this->SetFocus(); ・・・ダイアログバーのクラス内
をする事で、タイトルバー以外は思い通りの挙動にする事ができました。
これで今は妥協することにします。ありがとうございました。
0932デフォルトの名無しさん
2009/04/08(水) 18:27:590933デフォルトの名無しさん
2009/04/08(水) 18:30:25a<<=1
は
a = a << 1
0934デフォルトの名無しさん
2009/04/08(水) 19:26:37後ろの括弧とはdeleteの右の[]のこと?
intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。
デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。
0935デフォルトの名無しさん
2009/04/08(水) 21:03:45あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。
#define _SCL_SECURE_NO_WARNINGS
をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード
されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい
のですが、どうやればいいのでしょうか?
どうかよろしくお願いします。
0936デフォルトの名無しさん
2009/04/08(水) 21:12:31/D_SCL_SECURE_NO_WARNINGS
を指定する
0937デフォルトの名無しさん
2009/04/08(水) 21:26:56int (*p)[10] = new int [3][10]();
の最後の()のことじゃない?
0938デフォルトの名無しさん
2009/04/08(水) 21:27:13ありがとうございます。
コンパイラオプションってどこで指定できますか?
プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。
0939デフォルトの名無しさん
2009/04/08(水) 21:54:34一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して
とある処理をしています。ウィンドウにフォーカスがある時より、ない時の
ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう
理由なんでしょうか?
ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが
独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも
思いましたが、特に過剰に呼ばれているわけでは無さそうでした。
0940デフォルトの名無しさん
2009/04/08(水) 22:20:28ツリービュー:構成プロパティ→C/C++→プリプロセッサ
構成:すべての構成
プリプロセッサの定義(/D[マクロ])
_SCL_SECURE_NO_WARNINGS
0941デフォルトの名無しさん
2009/04/08(水) 22:21:05ここの、●バグその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" ) ;
としても問題ないですよね?
0942デフォルトの名無しさん
2009/04/08(水) 22:25:00にするとまずいんで(WIN32やら_DEBUGが消えてしまう)
Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で
0943デフォルトの名無しさん
2009/04/08(水) 22:31:21C言語の文字列では,終端記号があることを前提にしています。
しかし,charの配列を確保しただけでは文字列として初期化されているわけではないのです。
以下の例は,終端記号の存在(文字列としての初期化)を忘れたために失敗してしまった例です
#include <stdio.h> /* puts() */
#include <string.h> /* strcat() */
int main()
{
char buff[128] = ""; // こうすればおk
strcat( buff, "ABC" ) ;
puts( buff ) ; /* ABCと表示したい */
return 0 ;
}
0944デフォルトの名無しさん
2009/04/08(水) 22:32:38ちゃんとそこ読んだのか?
strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、
buffに'\0'が入っている保証はどこにもない
0945デフォルトの名無しさん
2009/04/08(水) 22:42:19初期化されないのは仕様だしな(スタックポインタを加減するだけ)
高級アセンブラは使う人を選ぶ
0946デフォルトの名無しさん
2009/04/08(水) 22:47:38ありがとうございます、
自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは
たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた
という認識で良いでしょうか
0947デフォルトの名無しさん
2009/04/08(水) 22:49:25ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。
どういうことなんだ。ぷんぷん。
0948デフォルトの名無しさん
2009/04/08(水) 22:50:190949デフォルトの名無しさん
2009/04/08(水) 23:05:04オブジェクト思考したいならJavaをやれ
C#・・・何それ?
0950デフォルトの名無しさん
2009/04/08(水) 23:14:550951デフォルトの名無しさん
2009/04/08(水) 23:19:370952デフォルトの名無しさん
2009/04/08(水) 23:21:17ありがとうございます。
昔そんなことを習ったような気がします。
0953デフォルトの名無しさん
2009/04/08(水) 23:21:310954デフォルトの名無しさん
2009/04/08(水) 23:50:210955デフォルトの名無しさん
2009/04/08(水) 23:58:290956デフォルトの名無しさん
2009/04/09(木) 00:04:130957デフォルトの名無しさん
2009/04/09(木) 00:41:180958デフォルトの名無しさん
2009/04/09(木) 02:11:18言語のせいじゃないだろ。ライブラリの作者に文句言え。
0959デフォルトの名無しさん
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
0960959
2009/04/09(木) 07:53:41count = mysql_num_rows(result); の部分でも落ちます。
0961959
2009/04/09(木) 08:02:44mysqltest.cではなくmysqlclient.cの間違いです。
0962デフォルトの名無しさん
2009/04/09(木) 08:20:45このハンドルでエラーになってる可能性が高いな
0964959
2009/04/09(木) 09:01:17おっしゃる通り、取得に失敗していました。
if(result = mysql_store_result(&mysql_buf)){
}
else
{
printf("QUERY Error\n");
}
0966デフォルトの名無しさん
2009/04/09(木) 09:30:25ソースもなしで他人のデバッグなんかできませんが。
それとも、デバッグのノウハウを0から教えろと言うことでしょうか。
0967デフォルトの名無しさん
2009/04/09(木) 09:41:090968デフォルトの名無しさん
2009/04/09(木) 10:08:030969デフォルトの名無しさん
2009/04/09(木) 11:26:470970デフォルトの名無しさん
2009/04/09(木) 11:40:46systemやexec系の関数で出来るだろ
0971デフォルトの名無しさん
2009/04/09(木) 12:01:34時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの
あるんだけど。
0972デフォルトの名無しさん
2009/04/09(木) 12:03:170973デフォルトの名無しさん
2009/04/09(木) 12:57:43boost::shared_ptr<Test>& MemberFunction();
あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。
(名前はMemberFunction)。
このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか?
自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を
返すことに意味はあるでしょうか?
0974デフォルトの名無しさん
2009/04/09(木) 13:14:58コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
0975デフォルトの名無しさん
2009/04/09(木) 13:20:34外部から触って欲しくない時にはコピーインスタンスを返すべきということですか?
でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは
ないですか?
0976デフォルトの名無しさん
2009/04/09(木) 14:42:25呼出し元が破棄されたポインタを持たされる危険がある。
というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。
そもそもスマポは、Testインスタンスを参照する手段であって、
MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
0977デフォルトの名無しさん
2009/04/09(木) 20:46:08Test*& MemberFunction();
と同じ事をしようとしてる
0978デフォルトの名無しさん
2009/04/09(木) 20:57:10コピーをお前はTest自体のコピーと考えているように見えて、
974はshared_ptrのコピーのことを指しているように見えるぞ。
0979デフォルトの名無しさん
2009/04/09(木) 21:17:13値をコピーすると参照カウンタの操作が入って遅いだろうし。
0980975
2009/04/09(木) 22:10:14スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより
30倍近く時間がかかってました。
でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
0981デフォルトの名無しさん
2009/04/09(木) 23:02:14しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。
30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、
それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
0982デフォルトの名無しさん
2009/04/09(木) 23:06:31そもそもオブジェクトが何かの参照を返す事自体問題がある。
0983975
2009/04/10(金) 01:02:41実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し
(スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、
最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、
なんでかなとおもってたのですが。、。
0984デフォルトの名無しさん
2009/04/10(金) 01:24:380985デフォルトの名無しさん
2009/04/10(金) 01:37:000986デフォルトの名無しさん
2009/04/10(金) 02:03:51知らない間に外からいじくられないか
いつまで生きてることが保証されてるのか
そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ
危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて
ストーブ炊いて暑いからってクーラーかけるようなもの
馬鹿げてる
0987デフォルトの名無しさん
2009/04/10(金) 02:26:160988975
2009/04/10(金) 06:56:20ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない
と思ったんだよな。
ちょっと聞いてみます。
0989デフォルトの名無しさん
2009/04/10(金) 07:25:22そんなに遅くなるか?
誰か試してくれ
0990デフォルトの名無しさん
2009/04/10(金) 07:28:340991デフォルトの名無しさん
2009/04/10(金) 08:19:190992975
2009/04/10(金) 09:00:38Forループの中を入れ替えて時間計ったら、素のポインタだと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;
}
0993デフォルトの名無しさん
2009/04/10(金) 09:08:360994デフォルトの名無しさん
2009/04/10(金) 09:16:240995975
2009/04/10(金) 09:53:52面倒じゃないですか?
最適化しないとだめですか?
0996デフォルトの名無しさん
2009/04/10(金) 09:57:161ms秒が30msかかった所で、もし同じ頻度で呼ばれる関数が1秒かかっていたら
初めの差は無視できる。
0997デフォルトの名無しさん
2009/04/10(金) 10:00:57STLの変数生成速度でも気になるから、グローバルに定義してしまうなどする。
全てではなく多く回数使うやつなどね。
0998デフォルトの名無しさん
2009/04/10(金) 10:07:03それが本当にボトルネックになってるか確認してからにしようぜ。
意味の無い自己満足な最適化はコードを読みにくくするだけで、
何のメリットないからな。
0999デフォルトの名無しさん
2009/04/10(金) 10:12:36if else を続けるとかなり難解になってしまう。
1000デフォルトの名無しさん
2009/04/10(金) 10:15:53実際にstringを使うアルゴリズムで実測してみた経験から。
string、resizeを頻繁にするとcopyや生成でかなり食っている。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。