【初心者歓迎】C/C++室 Ver.64【環境依存OK】
2 :
デフォルトの名無しさん :2009/02/10(火) 03:24:45
C++のコードから、ファイルをオープンするときに、 ウィンドウを開いてユーザーにディレクトリを選ばせて、そこから ファイルを開くようにしたいのですが、どう書けばよいですか? しょぼい質問ですいませんがお願いします
3 :
デフォルトの名無しさん :2009/02/10(火) 03:35:20
C#だったら簡単だよ。
4 :
デフォルトの名無しさん :2009/02/10(火) 04:01:04
そんなこといったら全部C#で書けばもっと楽だろうけどなw
全角空白か
他クラス型のメンバをprivateで持つ際、 ヘッダでのクラス宣言時にそのクラスのヘッダまでインクルードして 外に見せているのが違和感あるのですが、これは仕方の無いことなのでしょうか? それとも、ヘッダでは最初に class COther; と宣言だけしておいて、 private: COther* m_pOther; とポインタでメンバを定義して、ヘッダはソース内でインクルードして 実体はコンストラクタでnewするとかの方法のほうが よく使われるものなのでしょうか?
>>6 こういう話か?
--OtherClass.h
class OtherClass {
};
--SomeClass.h
#include <OtherClass.h>
class SomeClass {
OtherClass member;
};
--
だとしたら、使う方は#include <SomeClass.h>だけで済むがそれの何が不満なんだ?
>>7 たとえばクラスをエクスポートするライブラリを作る場合、
そのクラスのメンバに使っているクラスもエクスポートする必要が出てきます。
privateで使っているだけで、利用者側には全く関係無いクラスなのに、
なんでそれらまでエクスポートしなくてはいけないのかと思いました
(カプセル化できてないのではと思いました)。
>>8 この単語は初めて知りました。
さっそく検索してみます。
基本クラスの純粋仮想メンバ関数を継承クラスで仮想なしで実態を作った場合、 その継承クラスを継承したクラスでオーバーライドすることはもうできないんでしょうか?
派生クラスでvirtual付けようが付けまいが 基本クラスでvirtualならオーバライドしたものもvirtual
>>9 インタフェースクラスを作って、
実際にはその実装クラスを new して返す
static メンバ関数を用意する、という手法もある。
// IA.h
class IA {
public:
static IA* Create();
virtual ~IA() { }
virtual void Hoge() = 0;
};
// IA.cpp
#include "IA.h"
class A : public IA {
public:
virtual void Hoge() { /* ここで実装 */ }
};
IA* IA::Create() { return new A; }
こっちはメンバへのアクセスが楽だという利点と、
public メンバ関数を追加するのが面倒臭いという欠点がある。
if( a == b && c == d ) でa == bの時点でもうどっちに分岐するか結果出てると思うんですが、この場合c==d計算されないんですか? if(a==b){ if(c==d){} } こう書いた方が安全ですか?もしa==bがFalseの場合c==dを評価するとエラーになる場合なんです
>>13 C / C++ において && の左辺が偽なら右辺は評価しないことは
保障されてる
一応例外として、 &&演算子がオーバーロードされてればその限りではない
どうもです
型ごとに処理を書いてるんですが、どうしてもテンプレートで書けそうもありません。 そんな状況ってありえますか?頑張っても無理な場合はあるんでしょうか? //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値での分岐内の処理がダブってるのを何とかしたいんです
A::flag==0がコンパイル時に決まる条件ではないなら、無理。
ダブってるコードが大量にあるなら テンプレート関数にすれば?
そうすると今度は引数としてどう渡せばいいのかがわからなくなってしまったんです // 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() }
はぁ? 16 と 19 意味が全然違ってるジャン
型ごとに処理って話ならそもそも template<typename T> void func(T t) { t.resize(0); } じゃだめなの?
class A{ union { vector <int> _i(10); vector <double> _d(10); } u; int flag; // 0 or 1 template<T> f0(T u); void f1(){f0(u._i); 〜;}; void f2(){f0(u._d); 〜;}; void (*f[2])() ={ f1, f2}; void pub(){ (*f[flag])();}; } 19 実現はテンプレ関係なしバージョンで十分
すごいwハイレベルすぎる ありがとう
継承の根底クラスポインタを使った振り分け B→A:B{<int>}, C:B{<double>} D{B *b; D(f){f?b = new A: b = new B;}; };
>>25 俺なら D を用意する変わりに factory 作るだろうな。
そんで map<key, factory> みたいなので get して Create()。
そもそも実行時の型判断を望んでるのかどうか本人が理解してないのかも もしかしたらテンプレートクラスで済む話なのかもしれない。
つか、フラグで使い分けるような、int配列と double配列を 一つのクラス内に持たせていることが疑問。 設計がおかしい。
int func(int a) { if(a>10) a=10; return a+1; } のように引数で渡された変数を変更しても問題ありませんか?
>>29 大丈夫ではあるけど、
関数内で二度と a の元の値を使えなくなってしまうので注意。
後になって処理を追加した際に、
途中で値が変更されてるのを忘れて処理を追加して
上手く動かねーとかなるといけないから、
なるべくなら別変数を作った方が好ましいし、
それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。
int func(int& a, int* b = &a) { if(a>10) a=10; return *b++; }
int func(const int a){ return (a>10)? 10+1: a+1; } wwww
急に過疎ってどうしたんだ?
春だからさ・・・・・
Cとgrassのハイブリッド言語かと思った。
grass と 常用単語の堺は3文字あたりから? void fp(int (*s)[8]); void fr(int& s[8]); any(){ int s[8]; int sx[32][8]; int* sp[8]; int* sxp[32][8]; int o[16]; enum{a...b=32}x; fp(&s); fp(&(sx[x])); fp(sp); fp(*(sxp[x])); fp(&((int*[8])o)); fr(s); fr(sx[x]); fr(*sp); fr(**(sxp[x])); fr(*((int*[8])o)); } どっかに考え方が判り易くまとまった資料ない? 正解不正解はコンパイル通してみるまで判らない自分。
39 :
デフォルトの名無しさん :2009/02/14(土) 03:23:09
windowsアプリケーションなんですが Borland C Compiler 5.5にて MAKELONGマクロが警告にひっかかってしまいます。 windef.hの定義を見るに括弧が足りないのが原因のようです。 これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?
>>39 windef.hのミスだね
本家のWinDef.hは括弧が多かった
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
調べなおしてみたらVC+2008EEに付属のSDKは括弧が多かったが昔のPlatformSDKのは少なかったわ
42 :
39 :2009/02/14(土) 11:12:03
>>40-41 ありがとうございます。
MAKELONGを(あとMAKEWORDも)
#undefして括弧増やした#defineしなおしてもいいもんでしょうかね?
>>42 しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ
簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか
44 :
43 :2009/02/14(土) 11:45:56
( B << 16 )に括弧が必要 の間違いでした
45 :
39 :2009/02/14(土) 12:34:59
46 :
デフォルトの名無しさん :2009/02/15(日) 08:59:26
LPTSTRを使って char hoge[40]; みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?
TCHAR s[40]; がいいかな
48 :
デフォルトの名無しさん :2009/02/15(日) 09:18:16
ありがとうです。 それでできました!
49 :
デフォルトの名無しさん :2009/02/15(日) 09:24:24
もう一個だけ質問させてください。 _T("ddd"); TEXT("ddd"); これって書き方が違うだけで同じですか?
同じ。 強いて言うなら、前者はCライブラリの拡張で、後者はWin32。 ちなみに前者のバリエーションで_TEXTもある。
51 :
デフォルトの名無しさん :2009/02/15(日) 23:26:08
ありがとうございます。なるほど。 TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。
52 :
デフォルトの名無しさん :2009/02/15(日) 23:33:30
背景とカーソルを同時に表示しようと思うんですが、 その画像をまとめてメモリデバイスコンテキストに選択して、 「最終的に表示する画面」を先に作る方法が分からないので、 どなたか教えていただけないでしょうか。 環境は WinAPIです。 よろしくおねがいします
それはカーソルじゃなくてキャレットのことかね?
関数の引数に関数を渡すことはできませんか? 処理の途中で指定した関数を入れたいんです。
thx出てきました!
// class A void Func(){} X.pfFunc = Func; // class X void (*pfFunc)(); void Shori(void pfFunc()){ (*pfFunc)(); これどうやって引数に渡す時と、使うとき書けばいいですか?
>>53 すいません言い方が悪かったです
画像2枚だと考えてください
背景の画像と 矢印の画像です。
よろしくおねがいします
>>58 WinAPIスレにでもどうぞ。
>>57 メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。
「メンバ関数のポインタ」とでもして、検索してみることをお勧め。
コンストラクタってパブリックにしないとだめですよね? newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?
ポインタは使い終わったらNULLしたほうがいいんですか? NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか? というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?
>>61 どうやんお? でちょっと笑た
ポインタとメモリの動的確保についてもーちょい学ぶべき
NULLするってのはNULL入れるってことかい
ポインタはオマエ自身から持つ手綱 データはペットの犬 手綱は他人のペットにも付けられるが そのペットは苦しい。 自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが 他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。 他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が
難読Cコンテストを思い出した
メンバ関数ポインタは入れる時と使うときクラス名が必要なことがわかりました! これじゃあライブラリとして使えなく無いですか? 設計を見直せですか?
定数へのポインタは渋谷のハチ公に首輪をつけるようなもの 全くの無意味ではないが楽しく一緒に遊んでくれない。 土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。 だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある
やばい 全く集中できなくなった
関数の中で static int a = 0; とした場合このaは関数を抜けても保持されるんでしょうか? 起動時最初の一回しか変数が存在しないことになるんでしょうか?
>>69 スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える
だからアドレスを渡して関数外からアクセスしようが問題ない
構造体の配列を引数に渡して使うにはどうすれば書けばいいでしょうか structA a[] = { { 1, 2, }, {3, 4,}, }; //ClassX.h Class* Z; //ClassX.cpp Z = new ClassZ(); Z->func(a); //ClassZ.h void func(structA bufa); //ClassZ.cpp func(structA bufa){ sizeof(bufa); } このときsizeofで帰ってくる値はどういう値ですか?
>>72 structAが何バイトか(C99だとそういいきれないけど別にいいだろう)
配列渡すなら
void func(structA bufa[]);
//ClassZ.cpp
func(structA bufa[]){
sizeof(bufa);
}
とでもすればいい、ただしこれは
void func(structA *bufa);
//ClassZ.cpp
func(structA *bufa){
sizeof(bufa);
}
と等価なのでsizeof(bufa)はどちらもポインタのサイズになる(配列のサイズではない)
構造体の各値がintだとすると { { 1, 2, }, {3, 4,}, } 4個*4バイト=16バイト が返るようにするにはどうすればいいですか? []付けたんですけど funcの中で structA b[]; b = bufa; としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか
structA b[100]; bに代入はできない b[0] = とかはできるけど
>>66 C# の delegate を参考にしてみれ。
class delegate {
public:
virtual ~delegate() { }
virtual void operator()() = 0;
};
template <typename T>
class delegateT : public delegate {
public:
typedef void (T::*Mfn)();
delegateT(T* obj, Mfn mfn) : m_obj(obj), m_mfn(mfn) { }
virtual void operator()() { (m_obj->*m_mfn)(); }
private:
T* m_obj;
Mfn m_mfn;
};
boost::bind.hpp boost::function.hpp を使うとか
>>75 C++でも出来ないとこってあるんですね
サイズは送り元で計算して引数は増えますが一緒におくることにしました。
受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、
サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。
が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?
C#の中のコード全然意味わかりません boost調べたら簡単にできました。 ありがとうです! //classA CC* pC; CB* pB; pB->Func(bind(&CC::Update, ref(pC))); //classB void CB::Func(function<void ()> f_buf) { f_buf(); } // classC void CC::Update(){}
いややっぱりなにも進展してませんでした function<void ()> f_buf が function<int ()> f_buf だったり function<bool ()> f_buf だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか? メンバ関数ポインタと結局同じなことに気づきました・・・
operator()() これはどういう意味なんでしょうか
>>81 関数オブジェクトでぐぐったら使い方含めてわかるかもよ
>>60 こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。
class Hoge
{
public:
static Hoge* Craete(int x) {return new Hoge(x);}
private:
Hoge(int);
}
出来そうな気がしてきました。 実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、 クラスの変数(); とすれば処理が実行されるということですね ありがとうございました。
>>80 実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。
戻り値を見ないなら全部function<void ()>型にすればいい。
sprintfの逆のことをしたいのですがそういう関数なかったでしょうか? char str[]="年齢は10,性別は男"; 例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると age=10,sex=男が得られるようにする関数です。 よろしくお願いします。
sscanf のこと?
>>87 それです。^^;
あったような気がしていたのですがprintが
入っている名前の関数だと思い込んで探していました。
助かりました。ありがとうございました。
コールバック関数が今だに理解できないです。教えてください。
90 :
43 :2009/02/18(水) 11:43:30
わかります。 void Func(){} void * f = Func; (*f)();
オブジェクトを作成するアプリケーションのインスタンスハンドルが必要だとヘルプに書いてあるんですが この場合thisを入れればいいんですか?
93 :
43 :2009/02/18(水) 12:22:54
>>91 コールバック関数のポインタを引数にして渡す
#include <stdio.h>
/* callback用関数 1*/
int add(int a, int b)
{
return a+b;
}
/* callback用関数 2*/
int sub(int a, int b)
{
return a-b;
}
void func(int (*callback)(int, int))
{
int x = callback(1, 2);
printf("%d\n", x);
}
int main(void)
{
/* "addへコールバックしてね" */
func(add);
/* "subへコールバックしてね" */
func(sub);
return 0;
}
>>92 状況によるだろう。
でもハンドルと書いてあるからthisはないと思うよ。
なんとなく、hInstanceいれるとこみたいだが。
>>93 ありがとうです!
その場合CALLBACKがつくのはどれなんでしょうか
メンバ関数もコールバックとして渡せるんですか?
Win32アプリの LRESULT CALLBACK WndProc はまた別物ですか?
WaitForSingleObjectは普通マルチスレッドで使うんですよね? 勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?
まあそうだが、シングルスレッドでもオブジェクトがシグナル状態か確認する時も使う。
>>96 CALLBACKがどう#defineされてるか見てみるといい
gdb 用のGUI ツールお勧め教えて class 関連 CUI じゃツライす
101 :
43 :2009/02/18(水) 16:26:59
>>95 コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ
メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない
>>96 そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う
struct V4 { union { struct { float x, y, z, w; }; float m[4]; }; }; と書いた時、 xのアドレス == &m[0] 、yのアドレス == &m[1]、 … になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?
xのアドレス == &m[0]だけは保証されてる あとはコンパイラ次第
>>96 LRESULTは戻り値の型、
>>91 でのvoid、
WndProcは関数名、
>>91 でのFuncにあたる。
CALLBACKは他の人の言うとおり。
キーボード押しっぱなし時のWM_KEYDOWNは、一回発行された後に 少し時間を置いてから連続で発行されるんですか? キーボードからの入力でキャラクタを動かしているのですが、 キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応 →キャラクタが連続で動く、となってしまいます。 ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる 処理をしたいのですが・・
>>107 こんな便利なものが・・・
ありがとうございます。
マルチスレッドの関数はグローバル領域に作ったほうがいいですか? クラスの中に入れるとめたくそ難しいんですが
難しいと思うのならクラス内に作らなくても構いません。
なんでメンバ関数だとコンパイルできないんですか? 静的関数ならいんでしょうか
そりゃぁ、スレッド生成するAPIがクラスに対応してなければインスタンスへのポインタ(this)を渡せませんから。 thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。 まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。
いやいります。見捨てないでください AfxBeginThread(CView::Proc, this); //h static UINT __cdecl Proc( LPVOID pParam ); static UINT __cdecl ProcAfter( LPVOID pParam ); //cpp UINT CView::Proc( LPVOID pParam ) { CView *const this_ptr = (CView *)pParam; return this_ptr->ProcAfter(); } UINT CView::ProcAfter( LPVOID pParam ) { //実際にマルチスレッドで実行したい処理 } なぜこう書かないといけないのかが理解できません。直接 AfxBeginThread(CView::ProcAfter, this); こうしたいんですが、エラー出まくります。&CView::ProcAfterにしろとか、やっても仮想関数だとかになるんです。 Afxじゃくても_beginthreadexでも同じなんです。マルチスレッドをクラスのメンバでやるのはそうとう強引で特殊ですか?
>>113 にほんごよめますか?
>112
>まぁ、環境も書かなきゃエラーメッセージも書かないということは
Win32アプリのメッセージループ内で独自の処理をする時クラスのインスタンスとかを作るのはどこがいいんですか? ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です
#define _T("test.txt") fileName マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。 どう書けばいいんですか?
あきらかに変だがどう使いたいわけ?
文字を置き換えたいだけです。 プログラム中のどこだかわからなくなるので 先頭に置いてファイル名を変えられるようにしたいんです
だったら逆だろ? #define filename _T("test.txt")
逆でしたか!どうもです
>>113 (非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない
という点はエラーメッセージの言うとおり。
そうやってメンバ関数へのポインタを得たところで、
>>113 のようにできないわけは、
メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。
その主な理由は、仮想関数にもきちんと対応しないといけないことから。
メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。
というわけでやってみた。普通は関数オブジェクトを引数にすべきだろうけど。改行制限厳しい。VC++ 2008。SP1ならもう少し簡単になる。 #include <utility> #include <memory> #include <stdio.h> #include <process.h> #include <windows.h> #include <atlbase.h> class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}}; template<typename T> UINT __stdcall beginthread2_entry(void* p) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; thread_data_t* ptd = static_cast<thread_data_t*>(p); T* px = ptd->first; mem_fn_t mf = ptd->second; delete ptd; return (px->*mf)(); } template<typename T> HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn)); uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0); if (ret != 0) ptd.release(); return reinterpret_cast<HANDLE>(ret); } int main() { Hoge hoge; ATL::CHandle h(beginthread2(hoge, &Hoge::Proc)); if (h != 0) WaitForSingleObject(h, INFINITE); }
AfxBeginThread(boost::bind(&CView::ProcAfter, boost::ref(CView), this); これでよくね?
LPSTRからLPCWSTRに変換するにはどうすればいいでしょうか
>>124 Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。
無いなら、MultiByteToWideChar使え。
>>123 AfxBeginThreadって関数オブジェクト引数に取れるのか?
だいたい なんでメンバ関数に固執するんだろう? インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?
以下のソースで、読み込んだデータの改行コードが削除されてしまう。 istream_iteratorを使ってるせい? 環境はmingw(gcc 4.3.3) ifstream fin("data.bin", ios::in | ios::binary); if (fin.good()) { typedef vector<char> Data; istream_iterator<char> begin(fin), end; shared_ptr<Data> data(new Data(begin, end)); }
>>129 istreambuf_iterator
!って人が使ってるの見てはじめて気づいた すごいいらいらする
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!! !!!!!!! !!!!!!!! !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ! !!!!!! !!!!!!!! ! !!!!!! !!!!!! !!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! しますか?
VS2005 C++でWindows Mobileの開発してます(CはDOS以来の初心者です)。 頻繁に呼ばれる文字列処理をする関数内の最初のオート変数として void hoge(void){ TCHAR szReadBuf[2048]; の様な宣言をしているのですが、この処理を呼んでるループ処理辺りで [Stack fault] Thread= といった様なエラーがでるので void hoge(void){ static TCHAR szReadBuf[2048]; ZeroMemory(szReadBuf, sizeof(szReadBuf)); の様に解放されない処理にした所、最初のコード時より幾分か多く回せるようになりました。 そうゆうもんでしょうか?
>>134 スタック領域は特にモバイルなら大きく取られていないことが多いので、
2048要素の配列で溢れてしまったのでしょう。
後者なら、スタックは消費しないのでその点は大丈夫です。
それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。
# 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。
早速ありがとう御座います。 前者はその下でこのようにしてます。 szReadBuf[0]='\0'; 後者でもこうすべきですね? 内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が 残ってると紛らわしいのでZeroMemoryしてました。 あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが ZeroMemoryで無いほうがいいのでしょうか?
連投すいません 訂正) × 前回内容が残ってると紛らわしいのでZeroMemoryしてました。 ○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。
BC++です。 クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを コンパイルするとUnresolved external '_main'となってしまいます。 一つにまとめて書くしかないのでしょうか?
「EXE 作る気はないぜオプション」をBCCに渡す。
-cを付けたらいきました。 ありがとうございます。
>>136 初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?
142 :
134 :2009/02/21(土) 16:06:00
>>135 >>141 ありがとうございます。
とりあえず、今のレベルはエラー無く動かす事が目標なので、余裕がでたら考えたいと思います。
memsetだとなんでダメなの?
C++厨はmemset大嫌いだから Cプログラマはmemsetが使える場面をいつも血眼で探してるから C++作法に改宗する時に一番拒むのがここだよな
memsetいいじゃん 初期化楽だし 俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし
C++厨は全部のメンバを代入文で初期化してんの?
あ、馬鹿が居る。
メンバ初期化子に決まってるだろ
C厨はポインタもmemsetで初期化してんのか?
>>122 大先生、なんか凄いことしてるみたいだから、一部修正してVC2005でコンパイルしてみたけど、
できないよYo。どうすれば良い?
#include <utility>
#include <memory>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <functional>
#include <atlbase.h>
class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}};
template<typename T>
UINT __stdcall beginthread2_entry(void* p) {
typedef std::pair<T*, UINT (T::*)()> thread_data_t;
thread_data_t* ptd = static_cast<thread_data_t*>(p);
T* px = ptd->first;
std::mem_fun_t<UINT, T> mf(ptd->second);
delete ptd;
return (px->*mf)(); // <======C2297: '->*' : 無効です。右オペランドには型 'std::mem_fun_t<_Result,_Ty>' が指定されています。
}
// To be continued
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); }
すまん。元の122のコードのmem_fn_tのmem_fn_t mf = ptd->second;の行は UINT (T::*mf)() = ptd->second;が正しい。 改行制限でtypedefをやめたのに直すのを忘れていたみたいだ。 そしたらVC++2005でも通る。
>>152 超早いレス熱烈感謝あげ
typedef UINT (T::*mem_fn_t)();
が抜けていたんですか
mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた
>>150 あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ
でオブジェクトを指定するっての忘れてたYo,orz
return mf(px); が正解だな
156 :
デフォルトの名無しさん :2009/02/21(土) 18:44:46
C++で可変長引数の関数を作るときは、Cと同じように #include <stdarg.h> とやって、 va_list, va_arg を使えばいいでしょうか?
Cと同じでおk ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な
↓がg++4なら通るけどVC9など通らない。 これって自分何か勘違いしてますか?VC9のバグってことはありませんか? struct MyClass { int value; void set_value(int v) { value = v; } int get_value(void) const { return value; } }; vector<std::tr1::shared_ptr<MyClass> > v; ...vに適当に要素を入れる... for_each(v.begin(), v.end(), std::tr1::bind(&MyClass::set_value, std::tr1::placeholders::_1, std::tr1::bind(&MyClass::get_value, std::tr1::placeholders::_1))); // bindでintがint&に変えられないというエラー
参照変数の初期化の右辺値で三項演算子使うのはマトモな所業の範疇?
右辺値じゃなくて右辺だな。 A ? B : C の B と C が両方左辺値なら問題ないし、 const 参照なら右辺値でも問題ない。
C++ コーディングスタンダードで、 int n; if (cond) n = X; else n = Y; みたいにするなら、 int n = cond ? X : Y; のほうがいいって書いてあったよな。
cond次第だろ
参照だとそもそも if-else が使えないから ? : を使わざるを得ないけどね。
int n = Y; if (cond) n = X; 変数には初期値いれとこうぜ
俺のソースは
>>161 ,164のすべてを気分で使い分けて、
ソースを読む人間を翻弄する
テンプレートクラスのコンストラクタ引数にその実態クラスのstaticメンバを使用する記述は問題ない? template<T> class BB{ BB(const T &); static const T func(T a){retunr a + 1;}; }; int x = 0; BB<int> i(i.func(x)); // BB<int> i(BB<int>::func(x)); と同じ意味になる筈
167 :
デフォルトの名無しさん :2009/02/23(月) 20:33:23
質問ですが、例えば"net localgroup Administrators GroupX"というコマンドを C++で実現するにはどうすればいいでしょうか? 一応自分なりに調べましたが、ShellExecute()やCreateProcess()を使うのは 個人的に美しくないかな、、、と思います。 知人に相談したら、vbsで set objShell = WScript.CreateObject("WScript.Shell") objShell.Exec "net localhost〜" ってやればいいんじゃない、とアドバイスを受けましたが、 vbsは全くわかららず、正直、自分でメンテナンスできるとは思えません。 C++のライブラリ関数で実現する方法があったら教授お願いします。 C言語では組み込み系を少しやっていました。 最近、C++でちょっとしたwindows用のプログラムを作ることになりました。 C++は初心者レベルだと思います。 開発環境はwindows XP + Visual studioです。 よろしくお願いします。
C++のライブラリにはないから、 APIをたたくしかないな。Win32スレに行ってみたら。
>>167 プロセスを起動するのはOSの役割なのでOSのAPIを使う
って頭になれば問題ない
>>167 騙されているぞ。
そのVBSのコードはShellExecuteを呼ぶのと同じだ。
171 :
デフォルトの名無しさん :2009/02/23(月) 21:11:43
>>167 です。
>>168-170 回答ありがとうございました。
C++のライブラリにはないのですね。
なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな
という浅い考えで、ライブラリを使いたいと思っていました。
>>168 さんの忠告どおりWin32スレに行こうと思いますが、
もうちょっと自分でWin32を調べてからにしたいと思います。
正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、
(結局、
>>169 さんの忠告どおり、割り切りそうな気がしますが)
>>170 さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、
っていう感じだったので、悪意はなかったと思います
どうもありがとうございました。
コンソールアプリケーションで実用的なプログラムってありますか? C++で学んだことを生かす練習のためにもなにか作りたいのですが・・
>>173 ありがとうございます
自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います
圧縮アルゴリズムおもろいよ
構造体A(メンバchar a , int b)をsizeofした値を求めろって問題は 5と8どちらを答えるべきなんですかね。 パディングも含めた値が実際の答えなのでしょうか?
intのサイズすら環境依存でFA
('A`)に見えた
sizeof に目がなくて
sizeof('A`)だと8なのでやはり8が答えみたいですね ありがとうございました。
>>182 環境依存
#include<stdio.h>
#define MACRO(type) printf("sizeof(%s)=%d\n", #type, sizeof(type))
#pragma pack(push, 1)
struct pack1{
char a;
int b;
};
#pragma pack(pop)
#pragma pack(push, 2)
struct pack2{
char a;
int b;
};
#pragma pack(pop)
#pragma pack(push, 4)
struct pack4{
char a;
int b;
};
#pragma pack(pop)
int main(void){
MACRO(struct pack1);
MACRO(struct pack2);
MACRO(struct pack4);
return 0;
}
なんと… 処理系依存なのでどれも正解ということですか! コードまでご丁寧にありがとうございました。
処理系というか、自分で決められるといった方が正しい
#include <stdio.h> #include <string.h> struct address{ char name[20]; char jusyo[21]; int age; }; int main(void) { struct address abc; int s = 1; if(s = 1){ char name[30]; char jusyo[70]; int age; printf("名前? "); scanf("%s", &name); printf("住所? "); scanf("%s", &jusyo); printf("年齢? "); scanf("%d", &age); abc.age = age; strcpy(abc.name, jusyo); } return(0); } C言語を学習しています。 上プログラムでキーボードから日本語を入力し出力させたいのですが、どうすればいいのでしょうか? Cygwinを使っています。
printf使えば良い
>>187 cygwin自体が日本語の入出力をできない状態なら>189へ。
gccのコンパイルオプションについて知りたいならcygwinスレへ。
まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。
使わないに越したことはないが、scanf("%29s", name)とするのが無難。
構造体のメンバとローカル変数の配列サイズが違うじゃん。それは拙いっしょ。
192 :
デフォルトの名無しさん :2009/02/25(水) 15:13:30
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 1>C:\Documents and Settings\\デスクトップ\Game\ActionGame\/GameAppli\ActionGame.exe : fatal error LNK1120: 外部参照 2 が未解決です。 #include <fstream> をインクルードすると上記のエラーが出ます どうすればいいのですか;;
プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリ を、どれか正しいものに変更する なんか他の外部ライブラリ使ってるだろ?
デバッグ版とリリース版のオブジェクトが混在しているように見える いったんすべてのオブジェクトを削除してビルドしなおせばいい ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる
staticメンバ関数を利用するメリットってあるんでしょうか?
196 :
195 :2009/02/26(木) 06:51:07
すいません スレ移動します
何でメリットがないと思ったのか、それが知りたい。
つnew, singleton
コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに
質問です。 class Foo { void Bar(void* ptr); }; void Foo::Bar(void* const ptr) {} VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。 疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。 これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。
文法的にOK
>>201 class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}
が問題ないのと同じこと。
>>202-203 仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。
とても基本的なことなのですが、 符号なし整数の変数で与えられた数 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); ですが、どれも使われるのでしょうか。
size_t i = N; do { --i; hoge(i); } while (i > 0);
207 :
206 :2009/02/28(土) 05:14:35
ああ、書いてから気づいたけど
>>206 は N が初めから 0 だったらダメだね
T i = M; //M = N - 1ということで do { hoge(i); } while (i-- != 0); これだと、MがT型の最大値でも対応できるはず。
>>205 普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない
>>209 メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな
>>209 > i >= 0;
↑は符合無しだと常に真だろ。
何か問題でも?
for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。 if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。 while 系をカウントループに使うのは愚策と考える。
while(N-->0)は普通に使うだろ --が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん
その考えはなかった
>>215 ああ、意外と面白い使い方かも・・・
視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か
有名だろ、それ
ぶっちゃけ初めて見た
ソース自体は見た事があるような気もするけど、考え方は初めて見た。
減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ
>>215 while(N-->0) って見た目が素敵だな
AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・
befungeのことですね!!
面白そうだけど絶対コーディングしにくいな ほぼ記号だろw
さすがショートコーディングスレ。 ためにな・・・って、あれ?
繰り返し処理のことを何ていいますか? 専門的にお願いします。
反復処理とか繰り返し処理とか
繰り返し処理のことを何ていいますか? 専門的にお願いします。
反復処理とか繰り返し処理とか
>>210 メモリのサイズを入れる型ってsize_t以外になんかなかった?
繰り返し処理のことを何ていいますか? 専門的にお願いします。
ループ処理じゃね?w 反復も繰り返しだろうけど、お前は違い分からないだろう
ぶっちゃけC/C++の話じゃないからスレ違い
反復処理とか繰り返し処理とか
リピート
>>232 ssize_tとか、でもCでもC++でも標準ではないけど。
>>232 ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
まだ初心者なのですが、batファイルをC++builder6で ボタンを押したら実行するようにしたいので ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW); と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
>>244 何故、どう巧くいかないのか書かないのですか?
実行はされるのですが(コマンドプロントが一瞬表示される) バッチファイルの中身自体が実行されません;;
batの最後に pause 入れとけ
>>247 ありがとうございます。
やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?
ファイルパスをちゃんと指定すればいいじゃん・・・
できました! こんな時間に、質問に答えてくださりありがとうございました 大変助かりました。
251 :
デフォルトの名無しさん :2009/03/03(火) 18:34:32
以下のような感じで「*」の前後にスペースが 入っている場合もポインタの宣言なんでしょうか? static unsigned int * ADDR; スペースが、後だけのもは参考書にも紹介されていますが 前後両方ともスペースのものは見つかりませんでした。 よろしくお願いいたします。
vector<string> * const (&u)[buf]; // こんな感じですか?
>>251 おんなじ。空白類がいくらあろうと関係ない。
254 :
デフォルトの名無しさん :2009/03/03(火) 19:47:28
>>252 static unsigned int * ADDR;
全くこのままのコードです。
>>253 ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。
255 :
デフォルトの名無しさん :2009/03/04(水) 03:11:45
VC++9の質問です。Unicode環境で Void Func(LPCSTR pMsg); みたいな関数があって、ここに文字列を渡すのですが、 Func("xxx"); というように普通に書くと問題ないのですが、 Func(_T("xxx")); とやると、 const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。 全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
>>255 _Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。
257 :
デフォルトの名無しさん :2009/03/04(水) 03:25:58
258 :
デフォルトの名無しさん :2009/03/04(水) 13:36:24
初歩的過ぎてすいませんが... すでに宣言してある配列の配列数を求めて それと同じ配列数の配列を宣言するには どうすればいいですか? よろしくお願いします。
>>258 配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど
261 :
259 :2009/03/04(水) 13:44:42
sizeof(配列) / sizeof(型) でいいか マクロで定義して同じマクロ使うとか
char a[]={10, 10, 10}; char b[sizeof(a)]; int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
263 :
258 :2009/03/04(水) 13:53:28
すいません言葉が足りなすぎました。。 int a[]= {1,2,...}; size=sizeof(a)/sizeof(a[0]); int b[size]; として同じ配列数の新しい配列を宣言しようとしてもできません。
C++ なら const int size Cなら int b[sizeof(a)]
>>263 size の型は何か
言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか
268 :
258 :2009/03/04(水) 14:08:43
const int size = sizeof(a)/sizeof(a[0]); int b[size]; として宣言できました。 ありがとうございました。
配列の要素に変数が使える規格って無かったっけ
連立方程式のを渡したら戻ってくる関数ってありますか?
>>271 標準にはない
標準じゃなくていいならある
assert()と_ASSERT()ってなにか違いがあるのでしょうか?
assertはC/C++標準 結果としてabort() _ASSERTはVC++独自 _CrtSetReportMode等で動作の調整が可能
メンバ関数のポインタの宣言はCxxx::*funcなのに 取得はCxxx::&funcでなく&Cxxx::funcなの? &がなんで宣言の時の*の位置より移動するの?
>>275 発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。
俺としては逆なんだが なんでCxxx::&funcなの? どこのクラスのメンバ関数のアドレスか分からんが
278 :
デフォルトの名無しさん :2009/03/05(木) 20:41:28
大変だー さっぱりわからん
>>278 何が分からないんだかさっぱり分からないぞ
>>275 単に文法的な曖昧さを除いた結果そうなっただけ。
class A {
public:
static void (*A::func)();
};
としてしまうと、static メンバ変数の実体定義がこうなってしまう。
void (*A::A::func)();
どっちがどっちの A:: やら分からん。
もうクラスのメンバ関数のポインタは無しで
9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。
delegate パターンで使うね
じゃあdeleteパターンで
285 :
276 :2009/03/06(金) 19:49:52
>>276 ,
>>280 すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><
あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?
286 :
デフォルトの名無しさん :2009/03/06(金) 20:12:15
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか? 派生クラスは無いのですが その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
>>286 まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
>>287 ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
>>286 派生クラスがない、ではなく、派生クラスは自分で作れということでは?
ああ、そうかもしれない
"派生クラスの無い抽象クラスが型な引数をとる関数" これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
覚えておきます、ありがとうございました
>>285 普通の関数でも&(func)はよくないだろ?
そういうこと
>>293 普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?
>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?
>>294 関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない
一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる
と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん
グローバル変数についての質問です。 C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」 と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、 プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので //EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。 memset(EDIT_DATA, 0, sizeof(EDIT_DATA)); という処理を加えたところ途端にメモリの使用量が跳ね上がりました。 最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので いったい初期化処理を行っていない宣言した直後のグローバル変数と memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
おまいの使ってるOSが 書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
>>297 私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?
私の使っているOS(WinsowsXP)の場合
・関数内で宣言するローカル変数の場合
void main(){
int a; //この時点で非初期化データ領域に変数aの存在が知らされる。
printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない)
a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", a); //0が表示される(物理メモリにはaが存在する)
}
・関数外で宣言するグローバル変数の場合
int b; //この時点で非初期化データ領域に変数bの存在が知らされる。
void main(){
printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える)
b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", b); //0が表示される(物理メモリにはbが存在する)
}
>298 とりあえず環境依存の話だというのは認識しておいてくれ。 まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。 ローカル変数は BSS には確保されない(スタックに確保される)。 非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に 「知らされる」という表現はおかしい。 物理メモリの割り当ては OS、ローダが行う。 恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。 なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか? 「仮想記憶」でぐぐるといいと思う。
void fn(int x){〜;};
void fn_nul(int){};
if(a){ fn(a);}
と
static void (*const_f[2])(int) = {fn, fn_nul};
f[(a
>>3 )&0x1](a);
どっちが効率いいかな?
static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a
>>3 )&0x1](a);
>>299 やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。
CPUアーキテクチャ側から勉強するといいかもね。 俺は「はじめて読む486」という本が参考になった。
>>301 下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。
困ってます。教えてください。 1つはサウンドバッファ書き込み用のCALLBACK関数で、 もう一つはMAINスレッドにあるリードルーチン。 MAINスレッドにあるリードルーチンをある条件時に寝かせ、 CALLBACK関数側から寝てる状態を起こしたい処理なのですが、 何か良い方法ありますでしょうか? sigwait()を使ってできそうなんだが、通常処理なので signalは使いたくないのです。よろしくお願いします。
306です。 環境:linux. gcc version 4.3.2 ,SDL(Callback) マルチスレッドではないのですが、CallBack関数側から、 MAINスレッドの寝ている状態を起こせないものかと、、、 MAINスレッドでやっている処理は、標準入力から データ読み込み、固定領域にバッファリングしています。 バッファが一杯だったら、標準入力からの読み込みは しないで寝かせたいのです。(BusyWaitやポーリングはNG) gdk_input_addとgtk_mainの組み合わせで とりあえずできたのですが、gtkを使うのは目的外かと、 よろしくお願いします。
>>308 pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう
>>309 サンクスです。チューw
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)
ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが (ただのパクリですが・・・もちろん勉強のためです) CStatic : public CWindow { public: CStatic(HWND hWnd) : CWindow(hWnd) {} CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; } ... }; CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す などのCStaticコンストラクタの初期化がコンパイル通りません。 >error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません) 考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが ATL/WTLではこれが上手くいっているのは何故なんでしょうか? ATL/WTL見たことある方で分かられる方があればご教示ください。
CStatic& operator=(HWND hWnd) それ以前にこれ間違ってね?
>>312 レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?
いや、それだけしかないなら CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す これに当てはまるoperator=が無いじゃん
>>314 すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
IDC_STATICは実際にこう書いてるの? IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
>>315 コンストラクタにexplicit付いてんじゃねぇの
>>318 explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;
試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
class A { // 基底クラス
public:
DWORD_PTR a; // データメンバ
operator DWORD_PTR() { return a; }
A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ
A getData() { return A(a); } // 自クラスでキャスト
};
class B : public A { // 派生クラス
public:
B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ
B& operator=(DWORD_PTR x) { a = x; return *this; }
};
A aaa;
B bbb = aaa.getData(); // NG
bbb = aaa.getData(); // OK
それともこの再現自体が間違ってるのでしょうか・・・?
>>319 class A に A(a)のコンストラクタは付けないの?
class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?
[質問内容] C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、 メンバ配列についてお行儀のよい書き方を教えてください。 メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、 文字列や値は同様にメンバ変数として持つのか? それとも、 cppの上の方に無名空間で切った変数を新たに宣言するのか? そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか? ちょっと、わからないので教えてください。
static constならクラス内で初期化しない?
325 :
323 :2009/03/09(月) 22:42:56
簡単に言うと、以下のようなクラスを考えてください。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 10 };
static const int Array[END];
};
<hoge.cpp>
const int CHoge::Array[END] = {
0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか?
};
>>324 レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?
>>325 そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。
327 :
323 :2009/03/09(月) 23:05:52
>>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 3 };
struct BTN_TAG {
int X;
int Y;
int W;
int H;
char *Str;
};
static const BTN_TAG m_BTN[END];
};
<hoge.cpp>
const CHoge::BTN_TAG CHoge::m_BTN[END] = {
{ 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値
{ 100, 300, 200, 50, "ボタン2" },
{ 100, 400, 200, 50, "ボタン3" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?
文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?
>>327 そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。
でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。
>>328 返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?
template<TwidthX, TwidthY>class Btn{ static struct{int x, y; char *c;}m_BTN[3]; } 追い出すメリットが勝つるメンバは追い出す。
>>329 返信ありがとうございます。
考え方として了解しました。
>>331 返信ありがとうございます。
Btnクラスを作って、CHogeで参照するということでいいでしょうか?
(CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?)
templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?
334 :
デフォルトの名無しさん :2009/03/10(火) 04:18:48
class Game { char **board; public: void init() { board = reinterpret_cast<char**>(new char[9][9]); } }; こう書くとコンパイルは通るんですが、boardにはBadpointerの値が 入ってます。なにか間違ってますでしょうか?
何もかもが間違っているような・・・ なんでキャストしてるのん? そして何ゆえそんな危険なキャストしてるのん? あと、配列の配列は配列のポインタで受けることはできても ポインタのポインタで受けることはできないよ? っていうか、僕も初心者だから意味わからん^^
336 :
デフォルトの名無しさん :2009/03/10(火) 05:50:54
>>335 ありがとうございます。
char *p[10] = new (char*)[10];
とか出来なくて、あんなコードになってしまいました。
どうすればいいですか?
char **p;
char *p[10];
とかをnewで初期化するにはどうすればいいですか?
337 :
デフォルトの名無しさん :2009/03/10(火) 06:55:33
p = new char[10];
そもそもinit()を呼んでいるのだろうか。
char** p; p = new char*[10];
void init(int sfx1,int sfx2){ // 素敵な cast をどうしても使いたい場合。 board = reinterpret_cast<char**>(new char[sfx1*(sizeof(char*)+sfx2)]); for(int i = 0; i< sfx1; ++i)board[i] = new(reinterpret_cast<char*>(board)+sfx1*sizeof(char*)+(sfx2*i))char[sfx2]; }
>>340 を理解した上で
char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ
って寸法だ。
newってtry-catchするのとnothrowするのどっちがいいの?
>>343 try-cathc も nothrowも付けずにほっとく
膝を打った後どっちに進むかは読み書きしたコード量に因るかな
ptr_arrayつかうか、吹っ切れてmallocに先祖返りするかってことかい?
パッディングの罠に嵌りに逝くか[]演算子のくっ付き方を考えるか
初心者が配列 new なんか使うんじゃねーよ。 std::vector にしとけ。
vector 使うのが正解 下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて 他人のクソコードをメンテする係に抜擢されちまうよ
C++ Coding Standradsでは 生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。 同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。 Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。
スコティッシュポールド
最近の若い子の省略はよくわからんのぉ
シコスでは 生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。 同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。 グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。
スコポ の検索結果 約 495 件中 1 - 10 件目 (0.43 秒) スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)
>>350 scoped_ptrもスマートポインタの一種だよ。
局所的、たとえば小さな関数内とかじゃ、なまぽで良いだろ 出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ 達人がその部分をプログラムする。
スマポってのも曖昧な言葉だな auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし *とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし 逆にshared_ptr以外はスマポじゃないって奴もいるし スマポって何?
アホコードを書くDQNを隔離しておくための足かせ
ポインタのような動きをするものは全てスマートポインタ 具体的に言うと*とか->が使える生ポインタ以外の物
そーなのかー
>>358 お舞! それは絶対に正しい。
ポインタすら使えない、つまりC++を扱ってはいけないような奴に、
C++を使わせるのに必要なものだよな
自己も相対的にDQNかも知れない場合に備え 自主的に足かせを装着する訳だが
ほんとDQNですみません。
365 :
デフォルトの名無しさん :2009/03/12(木) 02:06:14
ここでC++の勉強法を質問するのはスレ違いでしょうか? それらしいスレがなかったので、一度ここで聞いてみようかなと… 独学のため、先輩方の意見などをお聞きしたいと思っています。
おれも知りたいかも Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う C++は、モノにするには、やる範囲が広そうだし、Javaなのかな ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?
スレ違い
まずビジネス的な意味というのがわからん訳だが
369 :
デフォルトの名無しさん :2009/03/12(木) 19:44:28
Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには /MT /MTd /MD /MDd の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、 /MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。 どういう場合に/MTdにしなければだめになるのでしょうか?
>>369 ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか? 例えば \\Server\folder\test.txt にあるファイルに対して FindFirstFile( "\\\\Server\\folder\\test.txt",&data ); とやっても失敗になってしまいます。 ショートパスからロングパスにしたいのですが、、、、
ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?
373 :
デフォルトの名無しさん :2009/03/13(金) 14:45:20
2chトリップ生成プログラム教えてください。 ライブラリ作った人とかいますか?
団子さんの出番ですね!!
>>373 2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
[環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります) GoogleCalendarとの同期を取るアプリを作りたいんですが、 最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
>>373 PHPのを探してきた
$trip = '';
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) {
$salt = substr($match[2]."H.", 1, 2);
$salt = preg_replace("/[^\.-z]/", ".", $salt);
$salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
$trip = substr(crypt($match[2], $salt),-10);
$_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>';
}
cryptがDESかMD5かで結果が変わる
380 :
デフォルトの名無しさん :2009/03/14(土) 20:40:26
using namespace std; とソースの上に書くのと、 ソース全体を namespace std { ... } というようにnamespaceの中に書くのとは、同じ意味ですか?
違います
382 :
デフォルトの名無しさん :2009/03/14(土) 21:00:19
ありがとうございます。 どう違うか、教えてください。
利用と宣言の違い棚。
384 :
デフォルトの名無しさん :2009/03/14(土) 21:11:37
わかりました。 後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは できないということですね。 ありがとうございました。
std 名前空間内に自分で宣言を追加してはいけない。 規格上未定義動作になる。
std::swapの特殊化は置いてもいいけどね。
std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね
stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど エラーチェックは↓見たいな感じで十分ですかね? #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; void read(char *file, vector<string> &lines); void write(char *file, vector<string> &lines); int main(void) { vector<string> lines; read("C:/Work/from.txt", lines); write("C:/Work/to.txt", lines); cout << "正常終了" << endl; return 0; }
void read(char *file, vector<string> &lines) { ifstream ifs(file); if(!ifs.is_open()){ cout << "コピー元ファイルを開けない" << endl; exit(EXIT_FAILURE); } while(ifs.good()){ string line; getline(ifs, line); lines.push_back(line); } if(!ifs.good() && !ifs.eof()){ cout << "読み込み途中でエラー" << endl; ifs.close(); exit(EXIT_FAILURE); } }
void write(char *file, vector<string> &lines) { ofstream ofs(file); if(!ofs.is_open()){ cout << "コピー先ファイルを開けない" << endl; exit(EXIT_FAILURE); } vector<string>::iterator i = lines.begin(); while(ofs.good()) { ofs << *i; if(++i == lines.end()) break; ofs << endl; } if(!ofs.good() && !ofs.eof()) { cout << "書き込み途中でエラー" << endl; ofs.close(); exit(EXIT_FAILURE); } }
while (!feof()) {} と同じ匂いを感じる。 ところで、 while (...) { string str; ... } より string str; while (...) { ... } の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね? でも、スコープを限定した方が可読性等の面からは好ましいよね? どっちが良いのかな。
その辺を言い出したらvectorから見直しだけどな。
393 :
デフォルトの名無しさん :2009/03/16(月) 02:11:37
>>391 {string str; while(...){...}}
for(string str; ifs.good();)
初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。
getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。
397 :
デフォルトの名無しさん :2009/03/16(月) 07:38:25
VC++9での質問です。 あるライブラリをインクルードする必要があるのですが、 ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、 プロジェクト→プロパティ→リンカ→追加のライブラリ のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。 リンクの順序が関係してるのかと思ったのですが、よくわかりません。 どういう基準で方法を選べばいいですか?
399 :
デフォルトの名無しさん :2009/03/16(月) 07:50:49
>>398 ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。
書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?
400 :
デフォルトの名無しさん :2009/03/16(月) 13:38:45
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める) 下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに セットするときに、現状のままだと余った桁に0が入ってしまいます。 データセット部 sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID); 余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
>>399 もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする
>>400 いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?
403 :
デフォルトの名無しさん :2009/03/16(月) 16:44:14
400です。 おかげさまで解決です。
おかげさまってマルチでよそで答えもらっただけだろ。
405 :
デフォルトの名無しさん :2009/03/16(月) 20:22:15
std::cinで矢印キーの入力を取得することはできますか?
質問です WM_NCHITTESTをフックしたいのですが SetWindowsHookEXの中のどの項目ならフックできるでしょうか?
>406 >The WM_NCHITTEST message is sent to a window when the cursor moves より、このメッセージは Send される。 従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。 別途処理したいならサブクラス化とかが必要。
っつーか、Win32API質問箱の管轄だな。
409 :
406 :2009/03/16(月) 22:53:13
>>407 ありがとうございます。
メッセージの変更ができなかった謎も解けました。
const stringのイテレーターってどうやって宣言するんでしょうか? std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです
>>411 #include <string>はちゃんとしてます
>>412 ならイテレータの宣言は済んでる。
何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の
変数を宣言したいってこと?
あ、const_iteratorってやるんですね。解決しました。ありがとうございます
const stringのイテレータという言い方は無い。 stringのconst_iteratorならstd::string::const_iteratorで宣言できる。
newが失敗するのってメモリが足りない時以外にどんな状況が考えられますか?
何をnewするかに拠る
コンストラクタがエラー投げてることもある
そもそもメモリが足りてなくても失敗するとは限らない。
STLの出す例外一覧みたいなのってありませんか?
これ格納すればあらゆる例外投げてくれるよ struct Hoge{ Hoge(){throw new MyFavoriteException;} };
そうかなあ
VC++でCGIを作ってます(ただの興味本位です HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、 ソースコードをUTF-8で保存して、コンパイルしました。 すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、 更に文法エラーが出てきてコンパイルできませんでした。 ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから? 文字列にUTF-8を使うことは不可能なんですか?
ソースファイルの文字コードとプログラムの出力は別物 ソースはShift_JISでもUTF-8でもコンパイルすれば内容は同じ で、出力をUTF-8にするためにはプログラムで文字列を組み立ててから 最後にUTF-8に自力で変換してやらなくてはいけない UTF-8への変換はWin32APIを使う必要がある たぶんIMultiLanguage2のあたりつかえばできると思うので検索して調べてみてくれ あと、Shift_JIS以外の文字コードをstdoutに出力するなら、stdoutをバイナリモードに する必要があるような気がするので、fprintfとかfwriteの前に以下のようなコードが必要かも setmode( fileno(stdout), O_BINARY );
2005以降なら、fopenなどでccs=UTF-8を付加すればいいのではと思う
あー、fopenなんてここ何年も使ってないからすっかり忘れてたわ
環境依存しない方法で変換するにはどうすればよかろうの?
無理 環境ごとに#ifdefしまくるのが精一杯
CGIやるならLinuxだろ
>>425 stdoutには使えないよね
ソースが Shift_JIS なら、環境に依存してない。
431 :
デフォルトの名無しさん :2009/03/20(金) 16:55:09
Visual Studioで画面に複数のソースを表示させる方法ってありますか? Source.cppとSource.hを横に並べて表示したいんですが、、
タブを右クリ→垂直タブグループの新規製作
433 :
デフォルトの名無しさん :2009/03/20(金) 17:04:01
すごい、出来ました! ありがとうございました。
434 :
デフォルトの名無しさん :2009/03/20(金) 23:07:02
opendialogを使うと ShellExeCuteを使いバッチファイルを起動すると パスが見つからなくなってしまいます。 opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。 何かディレクトリを指定するようなコマンドがあったら教えてください。
chdir
436>> バッチファイルのほうで探したら見つかりました ありがとうございます。
438 :
デフォルトの名無しさん :2009/03/21(土) 20:56:55
Visual C++の質問なんですが、 新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに 全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので しょうか?
ファイルシステム上のフォルダとは別物だ。
440 :
デフォルトの名無しさん :2009/03/21(土) 21:03:40
>>439 ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。
じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか?
ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません
でした。
フィルタって何の意味があるんだろう。。
441 :
デフォルトの名無しさん :2009/03/21(土) 21:10:07
自己レスです。 自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、 フィルターもあわせて設定すれば、やりたいことができそうです。 でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。 プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?
hoge/srcフォルダにソースもヘッダもぶち込む
443 :
デフォルトの名無しさん :2009/03/21(土) 21:51:18
>>442 ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。
自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に
PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、
リンクでエラーになります。(LNK2019とかLNK2001とか)
同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか?
何度もすいません。
445 :
デフォルトの名無しさん :2009/03/21(土) 22:23:20
>>444 浦賀湾のあたり?
解決しました。
出力ファイルのオブジェクトファイル名を変更すればできました。
ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定
しないとだめなのが、分かりにくかった。
片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。
ありがとうございました。
447 :
デフォルトの名無しさん :2009/03/22(日) 13:01:45
昨日VSいれてみました。いきなり分りません。 System::Object^ の^ってなんですか
>>447 C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ
C++builderでTreeViewを使っているのですが、子を持つノードだけそのままの位置にして 他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい うまくいきません。 何か良い方法があったら教えてください。
C++の入門書には載ってないだろうな。 C++/CLIの入門書嫁。
452 :
デフォルトの名無しさん :2009/03/22(日) 13:54:28
CLIだったのか。どうりで。 ありがとね。
453 :
デフォルトの名無しさん :2009/03/22(日) 15:29:42
int hoge(int n) { return n; } int hoge(const int n) { return n; } int hoge(int &n) { return n; } int hoge(const int &n) { return n; } だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。 呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では int であろうがconst int であろうが区別していないのでしょうか。
>>453 そう。関数引数の型としてはトップレベルの const は無視され、区別されない。
ただし定義においてはローカル変数への const と同様に働く。
455 :
デフォルトの名無しさん :2009/03/22(日) 16:58:39
暗号の本で一通りのアルゴリズムのようなものは理解したのですが、 Cに組み込むにはどうすればいいのでしょうか? アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか? たとえば全てのバイトにn加算するという暗号化を施す場合、 その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、 そうさせないために何か対策する必要はないのでしょうか?
アルゴリズムが判明して脆弱になるような暗号は、その時点で脆弱なのです。
457 :
デフォルトの名無しさん :2009/03/22(日) 17:21:23
例が悪かったですね。 AES等安全性の確立されたアルゴリズムを使うことを前提とします。 ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。 その鍵は逆アセンブル等で簡単に解ったりしないんですか?
>>457 分かります
AES暗号化を使っていることが分かるだけでも
どこを調べればいいか分かってしまいます
ある程度以上は諦めるしかないです
459 :
デフォルトの名無しさん :2009/03/22(日) 18:09:08
MFCでアプリを作っているのですが、 動作確認のため、コンソールも起動しております。 _cprintf_sや_cscanf_s関数を使っているのですが、 _cscanf_s関数でバックスペースのキーを入力すると、 プログラムが無限ループで暴走してしまいます。 普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには どうすればよいでしょうか?
460 :
デフォルトの名無しさん :2009/03/22(日) 18:53:39
#include <iostream> int main(){return 0;} というプログラムなんですが、プロジェクトを新規作成するときに、 (1)最初から空のプロジェクト (2)Win32プロジェクトを選択して、空のプロジェクト という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが 通らず、LNK2019というエラーになります。 この2つの方法って何が違うのでしょうか?
Win32プロジェクトはGUIプログラム用です
>>460 プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。
そのエラーの元になっている違いはエントリポイントの違い。
Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。
他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
463 :
デフォルトの名無しさん :2009/03/22(日) 19:24:03
>>461-462 ありがとうです。
でもmainをWinMainに書き直しても駄目でした。
>他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
本当にほかにも色々違うんですね。
#include <windows.h> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0} これが一応の最小プログラムね Windowsプログラミングでは初めて見る型がたくさん出てくるけど ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ
typedef元の型が変化しても書き直す必要をなくすため
467 :
デフォルトの名無しさん :2009/03/22(日) 20:26:11
個人的にはAPIENTRYの方が好きだなあ
可読性のためだろ
469 :
デフォルトの名無しさん :2009/03/23(月) 00:16:56
memcpy.asmの mov [edi],al ;U - write second byte to destination でエラーが発生してしまいます。なぜでしょうか? 以下 プログラムです。 class ErrorDiffusion{ public: ErrorDiffusion(int campussize); ~ErrorDiffusion(); void Upperandlowerreversing(int width,int height,unsigned char *Grey); private: unsigned char *Output; }; //上下反転 void ErrorDiffusion::Upperandlowerreversing(int width,int height,unsigned char *Grey) { int i,flag=1; printf("上下反転\n"); for(i=0;i<height;i++) { //printf("memcpy mae\n"); memcpy(&OutPut[(height-flag)*width],&Grey[i*width],width); //printf("%d loop\n",i); flag++; } } //ここで関数を呼んでいます。 errordiffusion.Upperandlowerreversing(width,height,&Grey[0]);
470 :
デフォルトの名無しさん :2009/03/23(月) 00:47:52
private: unsigned char *Output; にして、コンストラクタで、メモリを確保していて NULLにはなっていないのですが・・。privateへのアクセスは、普通に Outputでいいはずだとおもうのですが違うのかな?
471 :
デフォルトの名無しさん :2009/03/23(月) 01:09:47
自己解決しまsちあ
472 :
デフォルトの名無しさん :2009/03/23(月) 09:55:51
ifstream ifs(filename, ifstream::binary); Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら どうしてだめなのでしょうか?
テキストファイルの読み込みとか、書かなくてもいい場合があるじゃん。 Cの"r" "rb" と同じ関係。
474 :
デフォルトの名無しさん :2009/03/23(月) 10:58:52
>>473 ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。
ついでにあと1個質問させてください。
Ifstream.seekg()で、
Ifstream.seekg(0,ifstream::end)
Ifstream.seekg(ifstream::end)
はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、
>>474 省略時はどの値を渡したのと同じってのを意識するといい。
476 :
デフォルトの名無しさん :2009/03/23(月) 11:36:04
>>475 なるほど。
省略時は0を渡したのと同じですね。
念のため書くけど、省略時にどの値を採用するかはその関数を書いた人が決めるのよ。 さっきのIfstream::binaryも同じ
478 :
デフォルトの名無しさん :2009/03/23(月) 12:35:15
>>477 本当ですね。
VC9++で試したら、ゼロじゃなかったです。
どういう値になっているのか調べられなかったけど、
ちゃんと読めてなかったです。
ああそうか、binary modeとcooked modeはCP/M、ひいてはMS-DOSの ためにC言語時代から受け継いでいる伝統だったな unix系は意識不要
おまえFTPとか知らないだろ
File Transfer Proturk がどうかなさいましたか?
TDateTime now = Date(); String hiduke=DateTimeToStr(now); SaveDialog1->FileName=hiduke; 日付をFileNameのところに表示したいのですが、上記のようにやっても うまくいきません原因の分かる方教えてくださいー。
482です 解決しました 2009/03/23の /がダメだったようです。
484 :
デフォルトの名無しさん :2009/03/23(月) 22:00:05
free(array); すると、プログラムが止まってしまいます。 メモリは確保しているし、なぜfreeするとエラーになるかわからないです メモリのエラーはerrorno でチェックしろとかいてあったのですが どうやってチェックすればいいかサンプルコードをください
エスパーさんたのみます!
間違えたアドレスを開放しようとしてる
487 :
高橋 :2009/03/23(月) 22:15:23
>>485 情報がこれだけじゃ、いかに魔美くんでも無理だよ。
Cの達人と申します。 ネイティブCのことなら、お任せください。 by Cの達人
490 :
デフォルトの名無しさん :2009/03/23(月) 22:35:46
TCPで他のマシンから要求を受け付けるサーバーを書いてるのですが、過去の一定の時間内(例えば1時間)で処理した 要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。 そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間 たってないものの数をカウントして、処理する/しないを決めます。 ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない でしょうか?こういう処理って結構色々な場面で使われると思うのですが。 よろしくお願いします。
10万とかのオーダーになったら、DB 使うことを考えちゃうな。
>>490 deque を使ってみるといいよ
新しい要求がきたときに
1.一番古い [0] の時刻が1時間より前だったら pop_front で削除
2.1.で削除が行われた場合1.に戻る
3.deque のサイズが 100 未満であれば要求を受け付ける
4.deque に push_back で追加
最近同じような質問があった気がする
493 :
デフォルトの名無しさん :2009/03/23(月) 22:50:42
>>491 DB使ったほうがいいですかね。
出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、
上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ
リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり
多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。
リトライのタイミングは相手まかせです。
ありがとうございます。
C++には便利な仕組みがいっぱいあるよねー。
495 :
デフォルトの名無しさん :2009/03/23(月) 22:57:02
>>492 ありがとうございます。
dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので
(重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります)
dequeは使えないか、と思ったんですが、どうですか?
>最近同じような質問があった気がする
ありがとうございます。探してみます。
処理中のものは一時的に別のmapとかに保存しておいて、処理が終了したらlistに積むとか
処理の軽さがあらかじめわかるなら あの、あれ、なんていったっけ、常にソートされるコンテナ、 それ。
時刻をキーにしてstd::set使えばよさげだね 重さ?シラネ
499 :
デフォルトの名無しさん :2009/03/23(月) 23:35:58
どうも自分の環境だと、30万件を越えたあたりからマシンが応答なくなります。 30万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も 回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。 この処理を減らせれば、もっといけそうな気がする。 メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず なんですがね、、、
それは「新しい要求が1秒とかの間に何度も何度も」来てるからじゃろ? そして「受け付けた全要求」、つまりここでは30万件を 要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る からじゃろ? 仕様どおりじゃないのかな?
501 :
デフォルトの名無しさん :2009/03/23(月) 23:48:29
>>500 そうですね。
負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。
1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。
そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。
502 :
デフォルトの名無しさん :2009/03/23(月) 23:52:40
>>497-498 ありがとうございます。
でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも
しれないんですが、なんとかCでやりたいと思ってます。
自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、
常にソートされるコンテナって重そうな感じがするし、、、、
全体的に仕様がおかしい気がするけど そういう仕様なら仕方ないのであきらめましょう。 プログラマは仕様について意見することはできても 仕様を変える力はありません。しようがないのです。なんちて・・・ コマネチ!
505 :
デフォルトの名無しさん :2009/03/24(火) 00:11:58
>>501 そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。
すげー社内システムだな。
>>492 の方法なら一番軽いと思うんだけどな。処理が終了してからlistとかdequeに積めばいいだけだし。
全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して
調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。
508 :
デフォルトの名無しさん :2009/03/24(火) 00:30:19
結構大きな会社で、ストレージ管理ソフトも自社製のがあるんですが、 そういうのは管理できる人を手配するのが大変らしいです、、、
STLは偉大だなぁ。ちゃんと処理時間についても言及されてる。
510 :
デフォルトの名無しさん :2009/03/24(火) 00:40:32
>>507 そうですね。
じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは
dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。
過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。
これで実装してみます。
明日の朝までにできるかな。
STLは元々Adaに組み込もうと研究されてたようですね C++にtemplate機能が付け加えられたのに目を付けた Stephanov(だっけ)がC++に移植したのが初めだとか
template に関してだけど、オーバーロードにするか、templateを書くかといつも 使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?
オーバーロードで済むならオーバーロード。 テンプレートが必要な時だけテンプレート。
514 :
デフォルトの名無しさん :2009/03/24(火) 08:09:13
時間がないとき以外は全部テンプレート。自分が成長するため。
演算子のオーバーロードについて質問があります。STLのIteratorみたいに、 List<int> *list = new List<int>(); llist.push_back(1); llist.push_back(2); for(Iterator* iter = (ListIterator<int>*)list->iterator(); iter->hasNext(); iter++){ printf("%d ", (*iter)); } このような書き方ができるようにソースコードを書きたいのですがうまくいきません。 以下が(全部載せるには少し長いので)自分のソースの抜粋です。 class Iterator{ public: //省略 virtual bool hasNext() = 0; virtual Iterator<Type> &next() = 0; virtual Iterator<Type> &operator++() = 0; virtual Type& operator*() = 0; }; template <class Type> class ListIterator : Iterator<Type>{ public: //省略 Iterator<Type>& operator++ (int dummy){ return next();: } Type& operator*(){ return value;//現在イテレータが指しているセルの内容 } } このように定義したものを上のように実行すると、4227856のような数字が連続して表示されてしまいます。また、for文のところで実行時エラーが出ます。 どう書き直せばよいでしょうか……。 (素直にSTL使えって話なんですがね……OTL)
516 :
デフォルトの名無しさん :2009/03/24(火) 08:41:56
>>516 載せるところ選ぶのに苦労しました……。
重要そうなところだけ抜粋してます。
テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。
こんなことしてるのは、単に興味とステップアップのためなんですが。
ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。
サンプルコードまねるだけでろくなソフトも作れませんが……OTL
(っとこんなことはどうでもいいですよね……)
518 :
デフォルトの名無しさん :2009/03/24(火) 10:05:31
あるサイトを参考にして、下記のような半角全角変換関数を 作成したのですが、試しに適当にint型の変数を入れて 動かそうとすると下記のようなエラーが出ます。 参考サイトにあるものをほぼそのまま使用しており、 修正したところはcase文の中の変換する文字のみです。 参考サイトには、そのまま使用できるようなことが 書いてあったのですが、何が間違っているのか教えてください。
519 :
デフォルトの名無しさん :2009/03/24(火) 10:06:52
int han2zen(char *str) { char *buf, *p, *ptr; buf=(char *)calloc(strlen(str)*2+1,sizeof(char)); for(ptr=str,p=buf; *ptr!='0\'; *ptr++){ switch((int)*ptr){ case '0': strcpy(p,"0");p+=2;break; case '1': strcpy(p,"1");p+=2;break; case '2': strcpy(p,"2");p+=2;break; case '3': strcpy(p,"3");p+=2;break; case '4': strcpy(p,"4");p+=2;break; case '5': strcpy(p,"5");p+=2;break; case '6': strcpy(p,"6");p+=2;break; case '7': strcpy(p,"7");p+=2;break; case '8': strcpy(p,"8");p+=2;break; case '9': strcpy(p,"9");p+=2;break; case default: *p=*ptr; p++; *p='\0'; break; } } strcpy(str,buf); free(buf); return(0);
520 :
デフォルトの名無しさん :2009/03/24(火) 10:07:57
(1849) : error C2001: 定数が 2 行目に続いています。 (1849) : error C2015: 定数の文字数が多すぎます。 (1850) : error C2143: 構文エラー : ';' が 'switch' の前にありません。 (1850) : error C2143: 構文エラー : ')' が 'switch' の前にありません。 (1861) : error C2059: 構文エラー : 'default' (1868) : error C2040: 'strcpy' : 'int ()' は 'char *(char *,const char *)' と間接操作のレベルが異なります。 (1869) : error C2371: 'free' : 再定義されています。異なる基本型です。 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\\include\malloc.h(123) : 'free' の宣言を確認してください。 (1871) : error C2059: 構文エラー : 'return' (1872) : error C2059: 構文エラー : '}'
>>515 printf("%d ", (**iter));
正直混乱するのでiteratorで多態はやめた方がいいんじゃない?
Listの実装でListIteratorを返すようにして
for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
>>519 '0\'
'\0'
case default:
default;
523 :
515 :2009/03/24(火) 12:20:00
>>521 レスありがとうございます。
>printf("%d ", (**iter)
なんでうまくいかないんだろうと4時間くらい混乱してました。
List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。
とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。
ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。
初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。
List::iterator()は、
ListIterator<Type> iterator(){
return ListIterator<Type>(this);
}
現在のソースコードはポインタじゃなくてこんな感じにしてみました。
>多態はやめたほうが……
Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。
アドバイスありがとうございました。
スレ汚し失礼しました。
524 :
デフォルトの名無しさん :2009/03/24(火) 13:59:10
518,519,520です。 ありがとうございます。 おかげで動くようにはなったのですが、 期待する値を得ることができません。 下記のような値が返ってきてしまいます。 何がいけないんでしょうか? INPUT OUTPUT HAN2ZEN("9") NULL HAN2ZEN("99") 結果なし HAN2ZEN("999") 9 HAN2ZEN("9999") 結果なし HAN2ZEN("99999") 9 HAN2ZEN("999999") 99 HAN2ZEN("9999999") 999 HAN2ZEN("99999999") 99 HAN2ZEN("999999999") 999 HAN2ZEN("9999999999") 9999
>>524 int main()
{
char s[100];
for (int i = 1; i <= 10; i++)
{
s[0] = '\0';
for (int j = 0; j < i; j++)
{
strcat(s, "9");
}
printf("HAN2ZEN(\"%s\")", s);
han2zen(s);
printf("%s\n", s);
}
return 0;
}
これでちゃんと出たけどな?
526 :
デフォルトの名無しさん :2009/03/24(火) 14:43:54
ありがとうございました。han2zen関数の使用方法を間違って、 例えばprintf("%s\n", han2zen(s));のように使用していたため 変な値が返ってきていただけでした。助かりました。
527 :
デフォルトの名無しさん :2009/03/24(火) 16:19:10
VS2005を使っているのですが、iostreamをインクルードすると error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。 をはじめ100以上のエラーがでます。 xutilityというファイルが原因のようですが、特に書き換え等行っていません。 プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。 アドバイスを御願いします。
VSを入れ直す
ところで、 C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、 需要ありますか? 機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。 これ見られたら、ダメ出しをたくさんくらいそうだけど。
需要ありますか?じゃなくて ダメ出しして欲しいんで見てくれませんか?だろ boost::threadがあるしな
えー。マルチスレッドなprintfとか欲しいよ。 文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。 どう?
土下座して頼むならうpってあげてもいいんですが。
>>535 このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど
オレは踏んだ そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した
svg形式を解析・出力するようなオープンなライブラリないのかな なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・ 改めてブラウザって大変なんだなって思うわ
ないわけないやろが
>>538 オープンの意味による。
GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。
ていうかあるなら俺に教えてくれ。
OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。
リファレンス実装をGPLで配布するとかマジやめて欲しい。
ハノイの塔を解くプログラムを書いたのですが、結果が正しいのかわかりません。 どなたか検証していただけないでしょうか? ↓ソース kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c ちなみに、円盤の個数が5までなら正しいのを確認してます。
5個まで正しいなら、6個目も正しいのは簡単にわかるよ。 なぜなら、6個目の解法は 5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う) だから。 ちなみに7個目の解法は 6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う) 以下同様。ハノイは簡単。
>>541 危なっかしい警告が出てるので、まず潰したほうがいい。
結果はこれと比べとき。
#include <stdio.h>
int Solve(int num, int step, int from, int to, int tmp)
{
if (num) {
step = Solve(num-1, step, from, tmp, to);
printf("%d 手目: %d -> %d\n", step++, from, to);
step = Solve(num-1, step, tmp, to, from);
}
return step;
}
int main(void)
{
int num;
printf("円盤の個数を入力して下さい: ");
scanf("%d", &num);
Solve(num, 1, 0, 2, 1);
return 0;
}
544 :
デフォルトの名無しさん :2009/03/25(水) 08:23:34
for (list<int>::iterator i = lists.begin(); i != lists.end(); ++i) { if (iが何かの条件を満たしているとき) lists.erase(i); } とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?
remove_if
546 :
デフォルトの名無しさん :2009/03/25(水) 09:02:16
RemoveとEraseはなにが違うんですか?
>>546 あなたのお使いのライブラリの仕様によります。
STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。
removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。
但し、removeは対象となるコンテナがlistの場合のみ使用できます。
尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。
>>541 円盤の番号を上から1〜n、手順を1から数えるとして、手順mに動かす円盤は手順mを
二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。
例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。
これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。
要は、再帰は必須ではない。
549 :
デフォルトの名無しさん :2009/03/25(水) 12:19:05
>>547 ありがとうございます。VC++9を使ってます。
listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で
デバッグエラーに引っかかります。何が間違ってるのでしょうか?
要素の追加、削除した後のiteratorって保障されないんじゃないの? remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか
552 :
541 :2009/03/25(水) 17:06:53
お礼が遅くなってすみません。 大丈夫みたいですね。どうもありがとうございました。
list< int >::iterator i = lists.begin(); while ( i != lists.end() ) { i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す } こんなかな。っていうか、STLでは自前のループはなるべく書かない。
C++で変数(例えばdouble型)に#INFを代入する方法はないでしょうか? 出来れば環境依存しない方法を探しています。
依存無しは無理だろ 浮動小数にIEEE754を使うことが定められてるわけじゃないから INFなんてものが存在するとは限らないし
>>554 std::numeric_limits<double> infinity()
存在するかどうかのテストも用意されてたはず。
>>554 環境依存だろうけど
x=1e+1000;
558 :
デフォルトの名無しさん :2009/03/25(水) 21:59:14
Windows(Vistaです)のC++でsleep(秒)を使おうと思っているのですが、どのヘッダを インクルードすればよいのかわかりません。結局 #include <windows.h> をインクルードして、 Sleep(ミリ秒); を使ってますが、Windowsでsleep()はつかえるのでしょうか?
559 :
sage :2009/03/25(水) 21:59:39
すみません。古い技術で恐縮ですが、 VB6用のDLLをVC++で作成するとき、 VB6で使用するタイプライブラリはどのように作成するのでしょうか?
561 :
デフォルトの名無しさん :2009/03/25(水) 22:53:14
>>560 わかりました。
ありがとうございます。
VC6.0でビットマップAの特定座標にビットマップBをコピーして、 それらを一切表示せずにビットマップCとして保存したいのですが、 BitBltという関数を用いれば可能なのでしょうか?
563 :
デフォルトの名無しさん :2009/03/26(木) 01:26:02
C++で、名前なし名前空間に関数を書いた場合とただのスタティック関数は、機能面から 考えたら同じと思っていいですか? そのファイル内からだけ使えるという点で。
564 :
デフォルトの名無しさん :2009/03/26(木) 01:37:41
おい、誰か答えろや。 答えんかい!
565 :
デフォルトの名無しさん :2009/03/26(木) 02:43:02
関数使わなくても 座標計算してあとは合成すればいい まああれだ
そのへんは週刊 名前空間・創刊号に詳しく載ってるから買ってくるといい 確か初回は特製boost::binderがついてくるはず
568 :
デフォルトの名無しさん :2009/03/26(木) 05:27:59
>>566-567 ほんとに役に立たないスレだな。
もっとちゃんと答えろ。
こっちは眠いのを我慢してレス待ってんだから。
早くしてくれや。
569 :
デフォルトの名無しさん :2009/03/26(木) 06:28:20
あー眠い眠い。早く教えてくれ。寝ちまうぞ。
いいよ。
おやすみー
572 :
デフォルトの名無しさん :2009/03/26(木) 07:04:18
おぅ。わかった。すぐに答えるからちょっと待ってろ
>>563 リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで
あまり実用上の違いはない。
「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。
他にもあるかもしれないけどね。
template<void (*)()> int t() { return 0; }
namespace { void an() {} }
static void st() {}
int main() { return t<an>(); } // t<st> はコンパイルエラー
もっとわかりやすく説明しろよカスども
あたまだいじょうぶでちゅかあ? ことばわかりまちゅかあ?
577 :
デフォルトの名無しさん :2009/03/26(木) 08:44:02
わからないでちゅ・・・
意味もなく盛り上げてんじゃね〜よ
580 :
デフォルトの名無しさん :2009/03/26(木) 09:47:06
浅く寝ちまったよ。
>>574 ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも
コンパイルできたけど?ほかの環境でも試したほうがいいのかな?
>>579 うるせーやつだな。
>>580 > ほかの環境でも試したほうがいいのかな?
試さなくていいよ。
582 :
デフォルトの名無しさん :2009/03/26(木) 12:45:35
>>581 そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、
ほんとかどうかついでに教えてよ。
C 言語と C++ 言語では const キーワードを使うことで定数を宣言することができます。
例えば const int cardmax=13; のように使用できます。これが単一のモジュールだけで
使われるのならば問題がないのですが、複数のモジュールにわたって使われる場合、
C言語と C++ 言語では constのリンケージが違うので、注意が必要です。具体的には
C言語では外部リンケージをもち、C++ 言語では内部リンケージを持ちます。つまり
C 言語では他のモジュールから使用する場合、そのモジュール内で
extern const int cardmax;
と宣言すればこの定数は使用可能ですが、C++ 言語では同じようにしても参照する
ことはできません。C++ 言語で外部から const オブジェクトを参照したい場合には、
定数を定義するときに、
extern const int cardmax=13;
のように定義する必要があります。
>>582 正しいよ。
ちなみにCでconstで内部リンケージを持たせるなら
static const cardmax=13;
ってやる。
>>580 へぇ VC++ だと通るのか。独自拡張じゃないかな? /Za でエラーになるかも。
ちなみに Cygwin の gcc 3.4.4 ではこんなエラーになる。
: In function `int main()':
:4: error: `st' is not a valid template argument
:4: error: no matching function for call to `t()'
585 :
デフォルトの名無しさん :2009/03/26(木) 22:18:37
586 :
デフォルトの名無しさん :2009/03/26(木) 22:36:10
>>585 つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも
結果は同じ。どっちでも通るけどな。
587 :
デフォルトの名無しさん :2009/03/27(金) 02:07:55
まったくお前らのせいで昼夜逆転しちゃったよ。 はやく解クレや。 今はカップ麺にお湯入れたんで、完成待ち。 やっぱ夜はいいな、静かでな。
588 :
デフォルトの名無しさん :2009/03/27(金) 13:02:08
なんかカキコが減っちゃったな。 俺のせいかな。 悪かったよ。もう消えるわ。 じゃあな。
589 :
デフォルトの名無しさん :2009/03/27(金) 23:33:13
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。 それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。 C言語は上から順番に処理されるんだよね。 そうすると、割り込むみたいなことは許されないんだよね? 例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理? for( ) ・・・・・・・・・ if(getchar 見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、 その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
つ _kbhit()
592 :
589 :2009/03/28(土) 01:09:16
ありがとうございます。
593 :
デフォルトの名無しさん :2009/03/28(土) 05:28:17
>>589 スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力
させてみろ。話はそれからだ。
あとは環境を書けや。WindowsかLinuxか。
スレッド信者ウゼ
595 :
デフォルトの名無しさん :2009/03/28(土) 07:30:11
>>594 信者もなにも、基本だろ。
クソな書き込みするくれーなら、意味のあること書いてミロ。
_kbhit()にしてもどんなタイミングでも実行させるならマルチスレッドでやるしかないだろう
USBから自作した機器の制御とかをやりたいと思い、Windowsのドライバのプログラミング について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて 何が必要なのか、どのようにして作るのかがまったく分かりません。 どこか基本的なところから作り方解説してくれてるサイトありませんか? 本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか 知って、本当にやってみようか考えてから買いたいんです。
598 :
デフォルトの名無しさん :2009/03/28(土) 08:26:05
めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。 下記のように、CHogeHogeのクラス変数を初期化するのに、別のシングルトンクラス(CHoge)のメソッドの 戻り値を与えるコードを書いたところ、CHogeHogeのクラス変数を初期化するタイミングではまだCHogeが 生成されておらず、落ちます。コメント内のコードもうまくいきそうですがNGです 恐らくリンクオプションとか、pragmaで逃げられそうに思うのですが 対策方法を教えてください。処理系はVC6 SP5です 「CHogeHoge.cpp」 CHogeHoge* CHogeHoge::s_pInstance = new CHogeHoge(); // static CHogeHoge* CHogeHoge::GetInstance() { return s_pInstance; } int CHogeHoge::GetValue() { return m_Value; } /* -- これもNG CHogeHoge CHogeHoge::s_Instance; // static CHogeHoge* CHogeHoge::GetInstance() { return &s_Instance; } */ 「CHoge.cpp」 const int CHoge::STATIC_VALUE = CHogeHoge::GetInstance()->GetValue(); なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
>>598 言ってることと書いていることが違う気がするのは気の所為か?
私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。
つーか、設計を見直すと言う選択肢はないのだろうか。
CHogeの実装をCHogeHoge.cppに入れればいいんじゃね?
class CHoge { CHoge & instance() { static CHoge h; return h; } }; void CHogeHoge::init() { m_Value = CHoge::instance().value; }
>>596 入力反応に対応出来る範囲をうまく見積ればどうとでもなる
for(){
int i = 0;
l_c:
switch(_kbhit()?0:++i){
case 0: printf("time");goto lc;
case 1: ~;goto lc;
case 2: ~;goto lc;
default:
}}
>>597 ググった結果から microsoft のサイトのものを見るといい
605 :
598 :2009/03/28(土) 12:22:45
>601さんの方法でうまくいきました。 しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、 今後シングルトンはこの方法を愛用することになりそうです。 >604さん 有名な問題なのですね、勉強になります。 >>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。 >なんでそれだと駄目なん? 出来るだけシンプルにしたかったのと、 正攻法の攻略法を知っておこうと思ったからです。 ありがとうございました。
>>605 > 正攻法の攻略法を知っておこうと思ったからです。
わかってないから質問してるんだろうに、
正攻法で無いと決め付けてるのは何で?
そしてスルーされる>599と>600。 >599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w
どう転んでも無理なんだから、どこかで妥協するなら、静的メンバで持つのを否定することも選択肢のうちだぜ
設計を見直す、は設計の正攻法だけど、設計を変えないといけないから、 対処法の正攻法ではない、と。 単に言葉の問題。変なところに噛み付いてこないでね。 >599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。 >600は うーん、 実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。 で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。
後出しウザい
まさかとは思うが、1クラス1ファイルじゃないといけないなんて思ってないよな? そんな阿呆みたいな糞言語と一緒にされたら困るんだが。
型情報から定数作りたいだけならmy_traitsクラスでも作ってろよ
相変わらず終わった話に食いつく奴の多いこと。
上から目線の質問者が、中途半端な認識で勝手に終了宣言しただけだと なかなかスパッとはいかないね。
>>610 設計が正攻法じゃないのに正攻法な解決っておかしいだろJK
617 :
デフォルトの名無しさん :2009/03/28(土) 21:51:53
class Sample { public: static void func(); }; という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、 staticを取って、 void Sample::func() {....} と書けばいいですか? staticはつけてはだめなんですか?
618 :
デフォルトの名無しさん :2009/03/28(土) 22:02:28
>>584 たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか
ぜんぜんわからん、、、
結構C++歴長いんだけどな。誰かわかる人いる?
そうだね。そっちにはstaticは付けない。
>>617 そのとおり。っていうか試せばわかるだろ。
>>618 ポインタや参照型のテンプレート実引数には外部リンケージを持つ
オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない)
14.4.2 Template non-type arguments p1 より
> A template-argument for a non-type, non-template template-parameter shall be one of:
> - an integral constant expression; or
> - the name of a non-type template-parameter; or
> - the address of an object or function with external linkage, including
> function templates and function template-ids but excluding non-static
> class members, expressed as & id-expression where the & is optional if
> the name refers to a function or array, or if the corresponding
> template-parameter is a reference; or
(以下略)
622 :
621 :2009/03/28(土) 22:12:41
ごめん。 × 外部リンケージを持つオブジェクト ○ 外部リンケージを持つオブジェクトまたは関数
内部リンケージだと、テンプレートを実体化した先から見えないかもしんないからな。 まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。
624 :
デフォルトの名無しさん :2009/03/28(土) 22:32:26
すごい。 そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の 動作の違いを作り出すなんて、あんた頭いいね。 ありがとう。
>>624 昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって
半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、
頭がいいとか言わんよ。
626 :
デフォルトの名無しさん :2009/03/28(土) 22:40:26
ということは、625はLinux使い?
gcc なら Linux 使いというのは Windows しか知らない奴の思考パターンだな。 PC 以外では gcc や gcc ベースのコンパイラがたくさん使われてるし、 >584 の ように Cygwin だってある。それに規格がああなってる以上、 VC++ が異端なだけ。
628 :
デフォルトの名無しさん :2009/03/28(土) 22:56:20
でもstaticな関数引数をとるテンプレートを使うようなプログラムでgccを使うような人って、 普段はLinux使ってるという気がするけど。 BSD系使いとかSolaris使い? 最近は見かけないし。
630 :
デフォルトの名無しさん :2009/03/28(土) 23:19:23
じゃあ結局何使いなの? 俺統計かもしれないが、結構同意してもらえると思うけどな。 Linux使ってんでしょ?
631 :
625 :2009/03/28(土) 23:39:47
なんか変わった人がいるなぁ。 625 の話は「PC 以外」の話で、普段使ってるのは Windows だよ。 >627 も言ってるとおり、 Linux はまったく関係ない。
俺も普段は Windows で gcc (Mingw版) 使ってるしなぁ。 Linux と決め付ける根拠も「気がする」とか曖昧な割にしつこい。 まぁ、釣りなんだろうけど。
633 :
デフォルトの名無しさん :2009/03/29(日) 03:25:48
ごめん。 俺プログラマ結構たくさん知ってると思ってたんだけど、その中にWindows+gccという 組み合わせの人がいなかったもんでついつい変な書き方をしちゃった。
OSXが触れられてなくて泣いた
>>633 自分が知ってることが世の中のすべてだと思い込めるその思考回路が信じ難い。
たかがこれっぽっちのやりとりで 相手の思考回路を把握したと思い込める思考回路とかもな。
C++ではファイルスコープの宣言として、無名名前空間を使うことが推奨らしいですけど、 これってグローバル名前空間の中に無名名前空間を作ればいいのですか? 逆に、たとえばMyAppという名前空間に無名名前空間を追加しても、ファイルスコープの宣言とはならないのでしょうか。
639 :
デフォルトの名無しさん :2009/03/29(日) 10:45:05
1>GameMain.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>GameTitle.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>CSelect.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>C:\.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ヘッダーファイルで定義されているクラスにstaticをつけないと上のエラーが出るのですが 何故ですか・・・?
例のスレの人かな。
>>639 そのヘッダファイルがインクルードされる度にm_dxmusicが定義されているからです。
staticを付けると消えるのは、そのシンボルがエクスポートされずファイルスコープになるからです。インクルードしたファイル毎に別々のm_dxmusicが存在する状態になります。
これが意図した動作ではなく、m_dxmusicが複数のファイルで共有するシンボルなのであれば、ヘッダファイルでextern付きの宣言のみを行い、適当な.cppファイルで1度だけ定義しましょう。
>>637 名前空間の中でもいいよ。あんまり意味無いけど。
642 :
637 :2009/03/29(日) 12:05:28
ありがとうございます。 うちのIDEでは、グローバル名前空間の無名空間がどれも同じ括りで表示されるので、名前空間ごとに把握できたら、 と思ってのことでしたが、グローバル空間に作ることにしました。
いや、名前空間の中でいいってば。
644 :
デフォルトの名無しさん :2009/03/29(日) 12:19:03
645 :
デフォルトの名無しさん :2009/03/29(日) 15:03:01
http://ruffnex.oc.to/kenji/text/listexport/ ↑のツールと例を使ってkernel32.DLLの書き換えに挑戦してるのですが、
上手く行きません。
DLLを作成しようとすると 「 Error 12: Number Overflow : 」というエラーがdefファイルから検出されます。
エラーが出ている箇所は、「HeapSize=d_HeapSize @680」です。
自分で書き換えた箇所を戻して、コンパイルしてみても駄目でした。
コンパイラはdigital Marsのやつです。OSはvista
原因が特定できなくて困ってます
OSはvista
647 :
637 :2009/03/29(日) 16:25:23
両方の意見が出たから、安全側とっといた方がいいかなあと思ったんで。 >あんまり意味無いけど。 ということであったし、とりあえずグローバル名前空間の方に書いときます。
>>647 無名名前空間の効果は名前付き名前空間の中でも変わらない。 >638 はデマ。
そして「あんまり意味無い」のは >642 のような事情が無いことが前提。
名前空間の中に入れたほうが便利なのに、わざわざグローバルに持っていく必要は無い。
「ファイルスコープの宣言」ということなら >638 は正しいだろ。 「ファイルローカルな宣言」ということなら間違いだけど。
そもそも C++ に「ファイルスコープ」などというスコープは無い。
コモンダイアログを用いてファイルの保存等を実装したいのですが、 OPENFILENAMEは定義されていない識別子です、とエラーが表示されてしまいます 何かをincludeすれば良いのでしょうか
652 :
589 :2009/03/29(日) 20:48:04
あのですね、何度も申し訳ありませんが、kbhitじゃダメでした。
while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。
do〜whileとか色々試してみたけどやっぱりダメです。
何かいい方法をよろしくお願いします。
>>589
654 :
589 :2009/03/29(日) 21:05:25
いいなー、凄いなー
655 :
589 :2009/03/29(日) 21:06:51
>>654 ↑
これ無しwwww
NHK見てて間違ったwww
因みに589はマジレスですのでよろしくお願いします。
void foo() { while(1) { Sleep(100); if( _kbhit() ) { printf("Time:%d\n", clock() ); _getch(); } } } int _tmain(void){ HANDLE handle; int id; handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)foo, NULL, 0, (LPDWORD)&id); while(1) { Sleep(1000); printf("var\n"); } }
// VC++6.0 SP6 #include <conio.h> #include <stdio.h> #include <time.h> #include <windows.h> void main() { time_t tm; int i; while (1) { if (_kbhit()) { i = getch(); if (i == 'e') { break; } time(&tm); printf("%d\n", tm); } Sleep(100); } }
>>651 です
Commdlg.hが足りていませんでした
事前調べ不足でした。
>>653 さんありがとうございます
>>652 ちゃんとやろうとすると C/C++ の規格内では出来ない。
環境が Windows ならメッセージループを作るべきだろうけど…
あるいは既にレスがあるとおりスレッドを作るにしても、
メインスレッドとのやり取りには注意点は多いし。
初心者に説明するには結構こみいった話なんだわ。
ここで全てを説明するのはちょっと無理ってことをわかってくれ。
メッセージループやスレッドの基礎をわかってからまた来い。
状態移管さえ把握すればCで出来ん訳ない。
661 :
デフォルトの名無しさん :2009/03/30(月) 08:25:21
VC++を使ってますが、NULLを使おうとすると #include <iostream> とかしないとコンパイラが受け付けてくれません。 でも自前のヘッダがあるのでできるならインクルードしたくありません。 このばあいどうすればよいでしょうか インクルードするしかないですか
>>661 C++であるなら
NULL は確実に 0 のdefineなので
0 つかっとけ
663 :
デフォルトの名無しさん :2009/03/30(月) 08:44:19
でもポインタの初期化であることをはっきりさせるためにNULLを使いたいんです。 自分で定義するのはだめですか
>>661 VCバージョンいくつよ?
VC6なら窓から投げ捨てろ
NULLが欲しいなら #include <cstddef> だろ
>>663 #ifndef 使ってちゃんと囲っておけば
コンパイルや動作上の意味では問題は起こらないから
好きにすればいいんじゃないかな
重ねて言うがC++では 0 で定義されてるから
>>664 なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ
>>662 実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。
ほとんどのプログラムはstdio.hかwindows.hをインクルードするから どっかでNULLは定義されるな iostreamは知らん
>>667 調べたらほんとに違うんだな
C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた
どうもありがとう
>>668 NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。
それ以外を #include して定義されても処理系依存の動作。
671 :
デフォルトの名無しさん :2009/03/30(月) 10:27:02
boost::shared_ptr<Test> p = new Test(); boost::shared_ptr<Test> p(new Test()); この2つはどう違いますか? 上のやつだとコンパイルできません。
shared_ptrはポインタを取るコンストラクタがexplicitなので、 暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。
>>670 NULL は cstddef のほかに cstring, ctime, cwchar, clocale, cstdio でも定義されることに
なっている。
C.2.2.4 Macro NULL より
> The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or
> <cwchar>, is an implementation-defined C++ null pointer constant in this International Standard.
674 :
デフォルトの名無しさん :2009/03/30(月) 10:37:20
>>672 ありがとうです。
でもよくわかりませんでした。
boost::shared_ptr<Test> p = new Test();
という書き方は明示的にコンストラクタを読んでないということですか?
明示的に呼ぶとこうなる boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);
676 :
デフォルトの名無しさん :2009/03/30(月) 10:55:12
>>675 それでできました!
Testクラス内にboost::shared_ptr<Test> mInstance;
というポインタを持たせてたのですが、初期化できずにこまってました。
(初期化をコンストラクタ以外の場所で行いたかったため、
mInstance(new Test())
とかってかけなかった。
ありがとうございました!
>671の前者だと、Test *をboost::shared_ptr<Test>にキャストしようとして失敗するわけだね。
678 :
デフォルトの名無しさん :2009/03/30(月) 11:16:02
>>677 なるほど。
あと、676のような場合は、scoped_ptr<Test>は使えませんよね?
コンストラクタで初期化しないから。
>>677 ,678
微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと
>>675 の形でもshared_ptrのコンストラクタは一回しか呼ばれない
>>676 reset(new Test()) 使えよ。
>>678 コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。
682 :
デフォルトの名無しさん :2009/03/30(月) 11:46:43
>>680-681 たしかに、scoped_ptr()でreset(new Test())使うとできました。
ありがとうございました。
すいません。boostをucLinuxに入れようとしてます。 boost_1.38なんですが、boost::conditionが解決できません。 それ以外はコンパイルは通ります。 普通にfedora core7に入れてもだめです。 yum install boost-develだとうまくいくのですが、 なにかやり方があるのでしょうか?初心者ですいません。
684 :
デフォルトの名無しさん :2009/03/30(月) 12:57:04
クラス内にスタティックなポインタを持たせたいのですが、そのポインタをスマートポインタにできるでしょうか? class Test { static boost::scoped_ptr<MyClass> m_MyClass; }; これの実体を書くところで初期化までしようとしているのですがうまくかけません。
>>684 とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。
それでもわからなければ、以上の全部を添えて相談するといい。
686 :
デフォルトの名無しさん :2009/03/30(月) 13:24:56
>>685 言われたとおりにもう一回見直してみたらできました。
初期化は
boost::scoped_ptr<MyClass> Test::m_MyClass;
と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは
privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。
ありがとうございました。
>>683 自己解決しました。
バージョンによって、ソース変えないといけないんですね。
インクルードを適度に増やして解決しました。
さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには
ライブラリがうまく出来ていません。
bjamの設定でコンパイラにオプションつけるにはどうしたら
いいんでしょうか?
クロス開発なんてしてる人はいないですかねw
要はビルド時のコンパイラをクロスのものにしたいんだろ? bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"... でいいんじゃないのか
689 :
デフォルトの名無しさん :2009/03/30(月) 23:56:13
WindowsXP VisualStudio2005のVC++ フォームビューに配置したエディットコントロールで 「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが これはなんなんでしょうか? 他アプリからコピーした文字列をそのエディットコントロールにペースト して処理したいのですが。 ググってもどうにも見つからなくて…。
カスタムからショートカットキーが消えてるとか言うオチはないか?w
691 :
デフォルトの名無しさん :2009/03/31(火) 00:12:30
そのエディットコントロールにフォーカスした状態で メニューバーの「編集」をドロップダウンすると 「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。 なんか悪いことしたっけ?
>>689 ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?
>>689 とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?
694 :
デフォルトの名無しさん :2009/03/31(火) 00:34:31
あれ? ID_EDIT_COPY等の OnEditCopyとかを自分で記述しなきゃいけないん? エディットコントロールって初めからコピー・カット・ペーストくらい できるんじゃなかったっけ…。
695 :
589 :2009/03/31(火) 00:42:17
>>659 そうなんですか。どうもありがとうございます。
もっと勉強します。
編集不可になってるとかってオチじゃないのか?
697 :
デフォルトの名無しさん :2009/03/31(火) 01:04:16
>>696 エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。
今試したら,ダイアログベースのプログラムにエディットコントロールを配置して
ビルドすると普通にカット・コピー・ペーストできますね。
でもフォームビューだとできない…。
どちらにしても「Ctrl+A」はきかないし。
こんな超重要ポイントがなんで入門書で触れられていないんだろう。w
698 :
デフォルトの名無しさん :2009/03/31(火) 01:16:47
OnEditCut() { m_edit1.Cut(); } 等を追加してなんとか解決しました。 エディットコントロールが勝手にやってくれると思い込んでいたもので…。 初心者の質問に付き合って下さった方々ありがとうございました。
>>698 それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな?
まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。
IsDialogMessage
701 :
デフォルトの名無しさん :2009/03/31(火) 01:34:42
>>699 複数あるんです。w
今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。
あと「Ctrl+A」もぜひ装備したいし…。
703 :
デフォルトの名無しさん :2009/03/31(火) 02:24:15
>>702 参照先ありがとうございます。
今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに
ペーストされる」みたいな珍妙な動作になっています。w
GetFocus()を試してみます。
704 :
デフォルトの名無しさん :2009/03/31(火) 04:54:38
シングルトンで多態のクラスを作ったのですが、Baseクラスのコンストラクタとデストラクタを プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか? ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。
生成と廃棄のコードをBaseの関数テンプレートにする。
あ、廃棄はいいのか。寝起きだとボケてていかん。
707 :
デフォルトの名無しさん :2009/03/31(火) 09:47:34
最近スマポについて色々質問させてもらっているものです。 もうちょっとだけ質問させてください。 スマポに保存しているポインタを取り出して関数とかに渡すとき、関数はスマポの形の 引数でポインタを受けるべきですか?それとも生のポインタで受けるべきですか? class Hoge { public: boost::scoped_ptr<MyClass> m_MyClass; }; というクラスがあるとして、このm_MyClassが持っているポインタを別の関数に渡すとき、 void func(MyClass *pMyClass); void func(boost::scoped_ptr<MyClass> pMyClass); このどっちの形にするべきなのか、わかりません。 どうかお願いします。
scoped_ptrはコピーできないだろ
>>688 mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。
bjamもバージョンで指定の仕方が違うなぁ。
試行錯誤しますです。
710 :
デフォルトの名無しさん :2009/03/31(火) 11:03:04
>>706 ありがとうございます。
Baseをテンプレートクラスにして、関数テンプレートを受けとり
コンストラクタの代わりにつかう、ということですか?
すげえややこしそうな気が、、、
>>688 gcc,g++等をシェルスクリプトで作ったらコンパイルできました!
引数もシェルスクリプトに入れたらスッキリインストール完了しました。
ところが、ucLibにはn_procs()というglibの関数がないんですね。
mips用のboostできたのに、ここからコンパイルできないや…
どこまでひっかかるんだか…
大抵はシングルトンをペチペチ叩く棒が多態になってれば十分だよね?
>>704 よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。
std::string buf; std::ifstream ifs; ifs.exceptions(std::ios_base::failbit); //前半 ifs.open("a.txt"); std::getline(ifs, buf, '\0'); ifs.close(); buf.clear(); //後半 ifs.open("b.txt"); std::getline(ifs, buf, '\0'); ifs.close(); これを実行すると例外std::ios_base::failureが投げられるんですけど、どうすればファイルを2つ読み込めますか? ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。
>>715 前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも
同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の
ような気がする。
できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に
分けるとかするのがおすすめ。
>>688 結局自力で解決できました。
boost::threadに相当するソースのget_nprocs(CPUの数)
を1にして、再度staticリンク指定したことで、
mips/ucLinuxのboostを作成でき、動作しました。
質問なんですが、Effective C++を読んで func(boost::scoped_ptr<X>(new X), boost::scoped_ptr<X>(new X)); としたらメモリリークの危険があるのは引数の実行順が不定だからであり、それは分かります (前者のnew Xが実行の後、後者のnew Xが実行中そのコンストラクタで例外が出たときとか) その本では、スマートポインタへnewしたポインタを渡すのは独立したステートメントでやろう、となっているのですが func(boost::scoped_ptr<X>(new X)); とした場合も危険はあるのでしょうか new X → shared_ptr → 引数呼び出しの順番は変わらないような気がするので
それなら問題ないよ。
>>719 危険性があるかどうかって話なら >720 のとおり無いんだけど、
あとで func() に引数を足した場合に問題が発生する形に変更されてしまう
可能性が高いんだからそんなコードを書いていいってことには
ならないよ。
// value.cpp namespace { int value = 5; } int getValue() { return ++value; } // use.cpp int useValue() { return 2 * getValue(); } // test.cpp namespace { int n = useValue(); } というようなコードを書いた場合、test.cppでuseValueが呼び出されると、 getValueのコードも既に実在しているハズだからvalueも初期化済みということになりますか?
初期化順をコントロールするならシングルトンにしとけと、ばっちゃが(ry
>>722 value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に
初期化されることは決まっている。
だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。
725 :
デフォルトの名無しさん :2009/04/01(水) 12:36:59
ということは、関数の定義位置などとは関係なしに、変数の初期化順が決まるということですね。 そこら辺については未熟なので、勉強して理解できるようになるまでは、 何とか自分で扱えるような方法で考えてみます。ありがとうございました。
727 :
デフォルトの名無しさん :2009/04/01(水) 15:30:21
class File { public: const char* data() const; private: boost::shared_array<char> m_Data; }; こういうクラスがあって、m_Dataがcharの配列で、そこにデータが入ってます。 データは画像(バイナリ)です。そのデータにアクセスする手段として、 const char* data() const; というのを作ったんですが、これは参照にすべきなのでしょうか?それとも boost::shared_ptr<const char> data() const; とかのように、ここでもスマポを使うべきでしょうか? よろしくお願いします。
>>727 そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。
getData(int index) でだめな理由はなんだろうか?
execute() で、内部にアルゴリズムを実装してはどうだろうか?
とか、考える方が先かも。
>728には>727の書いていることが理解できないらしい。 ・アクセス関数の戻り値の型をどうしたらいいか というのが質問の趣旨ですぜ。
ほうほうそれでそれで
スマポへの参照がいいんじゃないかな。 生ポならそのままコピーしちゃうけど スマポはクラスでおっきいから。 boost使ったことないからよくわからんけど
>>727 template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);}
変な受け皿用意されたらコンパイル時に蹴る。
C言語の質問です。 以下のコードがbus errorで死ぬんですが、何が間違っているのですか? #include <stdio.h> #include <stdlib.h> void f(char **p); int main(void) { char *p; f(&p); free(*p); return 0; } void f(char **p) { *p = (char *)malloc(2); *p[1] = 0; }
734 :
733 :2009/04/01(水) 22:38:27
あ、すみません。free(*p)はfree(p)の間違いです。 それと、どうやら*p[1] = 0;のところで死ぬようです。
> それと、どうやら*p[1] = 0;のところで死ぬようです。 (*p)[1] = 0;
mmalock( sizeof(char *) * 2 );
737 :
736 :2009/04/01(水) 22:45:23
あれ、俺の頭がおかしい
ああ、疲れてんだな
>>735 演算子の優先順位の問題でしたか。ありがとうございます。
>>166 ,726
未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。
741 :
デフォルトの名無しさん :2009/04/02(木) 05:14:00
int *p = new int; int *p = new int(1); int *p = new int(100); これってどう違うんですか? 全部コンパイル出来てしまいます。
>>741 int *p = new int; ← 不定値
int *p = new int(1); ← 1で初期化
int *p = new int(100); ← 100で初期化
743 :
デフォルトの名無しさん :2009/04/02(木) 08:48:19
744 :
デフォルトの名無しさん :2009/04/02(木) 14:51:45
メモリリークを検出しようと思い #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> とやったのですが__CrtSetDbgFlagを呼ぶと 1>Frame.obj : error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _wWinMain@16 で参照されました。 と出ます アドバイスください;;
746 :
744 :2009/04/02(木) 14:57:41
デバッグでやってます
747 :
744 :2009/04/02(木) 14:59:04
c/c++ コード生成 ランタイムライブラリ がマルチスレッド(/MT)ですけど関係ありますかね
/MTdじゃないのか?
/MT は、リリースビルド用・・・
750 :
744 :2009/04/02(木) 15:10:18
すみません・・・・ 勉強になりました ありがとうございます
>発注額929億円のうち地元業者が受注したのは13%の122億円だった。 スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。
談合必要論か
誤爆乙
754 :
デフォルトの名無しさん :2009/04/02(木) 23:56:14
shared_ptrのスマポをNULLで初期化できますか?
755 :
デフォルトの名無しさん :2009/04/02(木) 23:57:21
boost::shared_ptr<MyClass> m_MyClass = boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0)); とやってできました。
>>754-755 単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?
757 :
デフォルトの名無しさん :2009/04/03(金) 00:19:11
>>756 そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?
758 :
デフォルトの名無しさん :2009/04/03(金) 01:23:15
すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。 char data[100]; というデータがあるとき、 unsigned int func1(int i) { unsigned char* p = reinterpret_cast<unsigned char*>(data); unsigned int r = p[i]; r |= p[i + 1] << 8; r |= p[i + 2] << 16; r |= p[i + 3] << 24; return r; } unsigned int func2(int i) { unsigned int ret = data[i]; ret += data[i+1] << 8; ret += data[i+2] << 16; ret += data[i+3] << 24; return ret; } この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合) for (int i = 0; i < 100; ++i) { data[i] = 129; } どうしてでしょうか?
>>757 デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ
>>758 129 が CHAR_MAX より大きい可能性が高いな。
761 :
デフォルトの名無しさん :2009/04/03(金) 05:59:03
ありがとうです。CHAR_MAXは127でした。 色々と理由を考えてたのですが、 (1) unsigned char a = 0xff; (2) char a = 0xff; cout << static_cast<int>(a<<8) << endl; (1)のように書くと0xff00と出力され、 (2)のように書くと0xffffff00と出力されます。 unsigned charとcharではシフトの方法が違うんでしょうか?
>>761 その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる
(1) unsigned char a = 0xff; a = 0xff (255) を int 型にすると 0x000000ff (255) ※符号拡張の際、unsigned int 型を経由 (2) char a = 0xff; a = 0xff (-1) を int 型にすると 0xffffffff (-1) まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が いちいちキャストしたりとか面倒なことをせずに済む
>>761 そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。
一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763
char を unsigned int に型変換するときは int に符号拡張してから unsigned int に変換される char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され unsigned int 4,294,967,295 (0xffffffff) に変換される
766 :
デフォルトの名無しさん :2009/04/03(金) 10:56:18
while(!(ret_cd = fetch_data())){ : (フェッチしたレコードに関する処理部) : } -------------------------- 関数 int fetch_data(void) { : (レコードデータ取得部) : return(0) } ------------------------- 上記のようなプログラムで while文の条件文の意味がよくわかりません。 全体の流れが「レコードが存在する間、処理を繰り返す」ような 処理ということはわかるのですが、 !(ret_cd=fetch_data())ときいている意味が はっきりわからないのでどなたかお願いします。
>>766 > !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?
fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1) を返すのだろう レコードが存在する !(0) → 真となり、処理継続 レコードが存在しない !(-1) → 偽となり、処理終了 ぱっと見に分かりづらいから while(!(ret_cd = fetch_data())){ ↓ while((ret_cd = fetch_data()) == 0){ と書き換えてもいいかもしらん
技術的な面以外で.. 「〜をする意味」は有効な回答が付きづらい 概して「考えれば分かる」とか言われるのが落ち 質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは, 必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難
単に、代入と検査を一緒にやってるだけだろ
まあ
>>768 の通りだが、
おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。
!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。
772 :
デフォルトの名無しさん :2009/04/03(金) 14:14:14
766です。 質問の仕方も曖昧ですみません。 レスいただきありがとうございます。 しかしまだ消化不足…といいますか、流れについて いけてないです。現在修正中のプログラムが下記のような流れです。 @カーソルセット EXEC SQL DECLARE cur_TEST CURSOR FOR SELECT・・・ FROM・・・ WHERE・・・ EXEC SQL OPEN cur_TEST;
773 :
デフォルトの名無しさん :2009/04/03(金) 14:15:05
Aフェッチしながら項目セット while(!(ret_cd=fetch_data())){ /* 中間ファイル構造体の各項目に値セット */ sprintf(・・・) sprintf(・・・) /* 中間ファイルに出力 */ if(temp_write(Ofp, &out)){ fclose ( Ofp ); strcat( Errmsg, "temp_write:write_error" ); AB_sjmsg( Errmsg ); putenv( Errmsg ); return(-1); } } 中間ファイルクローズ fclose(Ofp) return(ret_cd);
774 :
デフォルトの名無しさん :2009/04/03(金) 14:15:48
(出力関数) int temp_write( FILE *Ofp, struct TEST *dat ) { int ret; ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1; ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1; ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1; return(ret ? 0 : -1); }
775 :
デフォルトの名無しさん :2009/04/03(金) 14:16:34
実は今回このwhile(!(ret_cd=fetch_data()))の中で もうひとつテーブルを読み、そこで抽出したレコード(複数件)が なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。 単純にやり方を真似てfetch_data2という関数をつくり、 while(!(ret_cd=fetch_data()))の中で while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の 意味をはっきりさせようと思った次第です。
で?
777 :
デフォルトの名無しさん :2009/04/03(金) 15:04:11
で、どこまで理解できて、どこが理解できなくて、 どんなエラーが出るの?
779 :
デフォルトの名無しさん :2009/04/03(金) 15:40:55
途中で止まっており失礼しました。 わからない点は、!(ret_cd=fetch_data())の部分で、 ret_cdになんの値がセットされているかです。 int型で定義されてはいますが、これに値がセットされるところを 探しても見つけきれないので。 fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら) return(1)」という処理が入っているので、セットされる値の変わり目が はっきりとわかります。 なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。 もう少し詮索してみます。
>>779 何の値、って、fetch_data() 関数の戻り値でしょ。
デバッガで一行ずつ追ってみれば? もしくは、printf とかで。
>>779 ret_cd=fetch_data()
のところでret_cdには0か1がセットされる
もうクビになっちゃえば
>>766 から
>>779 までの5時間を
本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw
C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、 #include <stdio.h> FILE *fopen(const char *, const char *); int fileno(FILE *); int fclose(FILE *); #include <sys\stat.h> int fstat(int handle, struct stat *statbuf); の関数や構造体を使って作ったものの、あまり良くないようだ。 大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。 VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに ほとんどアクセスしなくて済んでる。 ファイルを開かなくて取得できんのかな。いい方法ないもんか。
785 :
デフォルトの名無しさん :2009/04/03(金) 19:51:09
まあそういうなよ。 おれたちも、766みたいな頃を経てきたわけだろ。 なんとなく、766はできないプログラマになりそうな気もするけど
fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを 使った方が速いのかもね。
じゃあ _stat(const char *, struct _stat *) とか FindFirstFile/FindNextFileでもつかっとけよ。 Windowsならディレクトリエントリだけの話になるから。
そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。 実際の値が必要なときは、これを使わざるを得ないんだけど。
windowの関数を勉強しないとならんな 低レベルなプログラム書けるように勉強しないとならんな
代入と評価を同時にしたら、読みにくくなるだろう。 横着やな。
いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが
日本語
どこの方言か知らんけど意味わからん
しらてと?
すなみ はにりいと とんとかいも
女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ほら!(得意げに)』 彼女 『何これ?PC98じゃない!幻滅!』 おいら『え、だってみんなPC98が普通だし....』 彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『...』 彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『....』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『....』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...』 以上実話です。
1989年のWinしらてとて、386 2.1か。 WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。
間違えた。 WinしらてとのAPIどころか、Winしらてと自体(以下略)
うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ 20年前ってどうよ
801 :
デフォルトの名無しさん :2009/04/03(金) 22:35:23
女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』 彼女 『うん!』 おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ よ(得意げに)』 彼女 『何それ?ニフティとかのこと?幻滅!』 おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』 彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った 基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の 情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う し、、』
802 :
デフォルトの名無しさん :2009/04/03(金) 22:38:38
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面 もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』
女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 おんな『シネよキモデブ。二度と話しかけんな』
>803 ついでに此処へも書き込みしないでいいよ。
コピペとしてはまだまだいけてないな もっとブラッシュアップしてくれ
ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」 やりたいことは「stdin(fd=0)からCALLBACK関数」で、 順次データを読み出すだけなんですが、私の環境ではうまく動かないです。 止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、 もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか? よろしくお願いします。以下、サンプルソース #include <unistd.h> #include <stdio.h> #include <gtk/gtk.h> int main(int argc,char **argv); gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data); GIOChannel *gio; int main(int argc,char **argv){ gtk_set_locale(); gtk_init(&argc,&argv); gio = g_io_channel_unix_new(0); fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN); g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL); gtk_main(); return 0; } gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){ char temp; fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr); read(0,&temp,1); fprintf(stderr,"temp(%d)\n",temp);fflush(stderr); return TRUE; }
807 :
デフォルトの名無しさん :2009/04/04(土) 11:28:40
スマポで質問があります。 class MainClass; class SubClass { public: void func2(MainClass* mc) {} }; class MainClass { public: MainClass() : m_SubClass(new SubClass()) {} ~MainClass() {} void func1() { m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか? } private: boost::shared_ptr<SubClass> m_SubClass; }; int main() { MainClass m; m.func1(); return 0; } どうかよろしくお願いします。
お前どう見てもスマポの使い方判ってないからやめとけ
scoped_ptrでいいじゃん
810 :
デフォルトの名無しさん :2009/04/04(土) 11:39:47
>>808 どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。
どっちかとういうとthisがまったくわかってないじゃないか?
なんつーか、『オムレツ作りたいんです! 教えてください!』と言って来た奴が 材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。 ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。
814 :
デフォルトの名無しさん :2009/04/04(土) 11:49:53
色々返事くれてありがとう。 void func2(MainClass* mc) {} ここなんですが、最初は void func2(boost::shared_ptr<MainClass>& mc) {} こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき コンパイルが通りませんでした。スマポの使い方として、生のポインタは 基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると thisはどうやって渡せばいいかわからなかったので。。。
オムレツ作りたいんです! はいいけど、君それ、手に持ってるのゆで卵だよね? みたいな。
816 :
デフォルトの名無しさん :2009/04/04(土) 11:51:37
>>813 なにか肝心なもの(フライパン)が抜けてるということですか?
とりあえずconst
818 :
デフォルトの名無しさん :2009/04/04(土) 12:08:37
m_SubClass->func2(boost::shared_ptr<MainClass>(this)); こう書くとAssertionに引っかかるし、、、 これって循環参照になってるから?
819 :
デフォルトの名無しさん :2009/04/04(土) 12:26:50
プログラム中に可変で動的にメモリ確保をしたいのですが Animationset m_animset; という構造体があり、m_anim->GetAnimset(); というメソッドで個数が取得できます m_animsetを最初から配列で100個くらい作っておけば問題ないのですが 可変で作る場合はどうすればいいのですか?
821 :
デフォルトの名無しさん :2009/04/04(土) 12:29:56
>>820 ありがとうございますvectorについて調べてみます
822 :
デフォルトの名無しさん :2009/04/04(土) 12:36:32
ダブルポインタでいいだろ Animationset **m_animset;
823 :
デフォルトの名無しさん :2009/04/04(土) 12:57:52
vector<AnimationSet> m_animset; for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) { m_animset.push_back(i); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたのですが 'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません とエラーが出ます メモリを確保するにはどうすればいいのでしょうか・・・・
824 :
823 :2009/04/04(土) 13:05:05
for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) { AnimationSet anim; m_animset.push_back(anim); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたらできました
825 :
デフォルトの名無しさん :2009/04/04(土) 13:39:00
何が出来たの?
>>807 enable_shared_from_this使えばいいんでないの?
827 :
デフォルトの名無しさん :2009/04/04(土) 13:55:39
コピコンあるのね把握した
>>822 ダブルポインタって、ただのポインタのポインタとなにが違うんですか?
830 :
>>829 :2009/04/04(土) 18:37:39
Ragnarok **m_ragna;
>>829 その言葉を使う人間ができるプログラマかどうか。
ダブルポインタ、なんて変な言葉使う人間こそプログラマじゃないだろうな
833 :
デフォルトの名無しさん :2009/04/04(土) 20:35:11
>>826 enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると
Boostが例外を投げます。
class MainClass;
class SubClass {
public:
template <class T>
void func2(boost::shared_ptr<T>& mc) {}
};
class MainClass : public boost::enable_shared_from_this<MainClass>
{
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(shared_from_this());
}
private:
boost::scoped_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}
>>833 ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。
835 :
デフォルトの名無しさん :2009/04/04(土) 20:54:19
>>834 ありがとうございます。
>大元のm自体をshared_ptrに格納する
というのは、
boost::scoped_ptr<SubClass> m_SubClass;
を
boost::scoped_ptr<SubClass> m_SubClass;
とするということですよね?
そうしてもBoostから例外を投げられます。聞いてばかりですいません。。
>>835 違う違う、こっち。
int main() {
boost::shared_ptr<MainClass> pm(new MainClass);
pm->func1();
return 0;
}
>>832 俺、ポッぽインタって言っている
で、3つはぽっぽっぽインタだな
838 :
デフォルトの名無しさん :2009/04/04(土) 21:10:23
>>836 なるほど、動きました!
thisがboost::shared_ptr<MainClass>でなければならなかったということですね。
本当にありがとうございました。
C++再考 という本のサンプルコードの一部です、コンパイルすると、下記のエラーが出ます 何処がおかしいのでしょうか? VS2005 pro SP1 winXP SP3 #include <iostream> using namespace std; class Expr_node { friend ostream& operator<<(ostream&, const Expr&); friend class Expr; int use; protected: Expr_node():use(1){} virtual void print(ostream&) const = 0; virtual ~Expr_node(){} }; error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2143: 構文エラー : ',' が '&' の前にありません。
>>839 friend ostream& operator<<(ostream&, const Expr_node&);
Exprなんて型ないからExprを変数名だと推定してる
>>839 なぜエラー行を抜いた
class Expr;を前方宣言か?
>>814 > スマポの使い方として、生のポインタは
> 基本的に全部スマポで置き換えるのが正しい
どこからそんなアホな理屈が出てきたんだ?
全部が全部正しいとは思わないが C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし Googleコーディング標準でもスマポがいいねって書いてあるから まぁ初心者はそのくらいの気持ちでもいいかも。 ただ、だからといってboostを使うのではなく 一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。 ちんぽちんぽ。
Accelerated C++でもネタになってるな>スマポの自作
>>843 貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ
>>843 >807 の例は参照に置き換えれば済むだろう。
所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。
>>846 ああなるほど。
確かに、参照が使えるところには
ポインタよりも参照を使うべきだというのには同意。
もうね、スマポ
>>840 >>841 スマンカッタ
大きな勘違いというか、錯誤していた
前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた
もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら
スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが
多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです
なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね
今写経していた、C++再考 第8章 オブジェクト指向プログラムにもスマートポインタの原型のような、技法が載っていたよ コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、 オブジェクトを破棄するという、実に巧妙な仕組みだね
コピーコンストラクタ....ってなんだっけ。忘れちゃったよ、だめぽ
852 :
デフォルトの名無しさん :2009/04/05(日) 02:50:30
関数にクラスを値渡しするときに呼ばれるやつ
853 :
デフォルトの名無しさん :2009/04/05(日) 02:51:41
>>846 Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?
>>853 所有権の移動や共有が必要ないなら、当然。
下のクラスをビルドして実行するとコンストラクタでvectorがエラーになります どこがまずいのでしょうか?? struct pointV { int x ; int y ; }; class Test { std::vector<pointV> vecTest ; public: Test() { vecTest.reserve(8) ; vecTest[0].x = 0 ; ←ここで発生するみたいです } }; よろしくお願いします
reserveじゃなくて、resize
reserveだと配列の大きさ自体はそのままだったんですね 有難うございました
858 :
デフォルトの名無しさん :2009/04/05(日) 13:08:57
weak_ptrを使ってよかった、という例があったら教えてください。 自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば いいんじゃないか、と思ったんですが。
256の倍数を入力すると正常な数値を出してくれません 内容はVBのテキストボックスに入力した数値をマイコンに送信し マイコンに転送したCで作った制御プログラムで受け取り外部に転送するものです いろいろ考えてみましたがさっぱりわかりません。よろしくお願いします VB側 dim data(1) as Byte data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) comSerial.Output = data comSerial.Output = chr(0) /*c言語*/ /*データ受信(マイコン側のフラグ処理は省略してます*/ unsigned char receive(void) unsigned char data; data = RDR;/*PCから受け取ったデータがあるレジスタRDR return(data); int main(void) { unsigned char data[2]; int i; while(1){ i=0; do{ data[i]=receive(); i++; }while(data[i-1]!='\0'); };
>>860 じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ…
あとVBガワのCOMポートはバイナリ?
>>861 たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか
1024と入れるとほんの少ししか動きません。
VBがフリーズするときもあります。
VB側はバイナリーです。
よろしくお願いします
256の倍数の値ということはdata(0)は0ということなので、マイコンの動作は正常なのでは?
>>863 つまり0が送信された段階で'\0'と同じと判断されるのですね
0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました
データの終了判断は他の数値にした方がよさそうですね
>>862 実機ないから試せないけど,1000まではちゃんと動作確認できたと.
あとは 1023 とか 1025 だとどうなる?正常?
ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる?
> VBがフリーズするときもあります。
なんとなくパリティかボーレートが怪しい気がする.
プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない.
for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.
>>865 1023と1025は正常に動作しました
Cとは関係ない話になりますがPC側のフリーズは
1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか)
→VBの反応なくなる→タスクマネージャーで強制終了→VB再起動
→「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ
→後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない
こんな感じです。
C側はH8に転送してますので確認は出来ませんが
VB側は出来ると思います。
手元にシステムがないので今は無理ですが。
>>864 VBの送信も悪いですが受け取るC側にも問題があるようです
>>867 VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん.
シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\
データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります
>>858 すいません。まだやってません
というか\0\0というのは2回送信してCで受け取れってことでしょうか?
>>869 まず仕様を確認しろよ
\0(=0x00) を終端としてるようだが、それだと 256の倍数で
おかしくなるのは当然に思える。
そうそう。例えば、inputDataが256のとき、 data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) 上は下と同じことだと忘れていない? data(0) = 0 data(1) = 1
まずはベーシック手順から
エスパーすると、do〜whileのところは data[0] = receive(); data[1] = receive(); にするのが正しいんじゃないかと思う
みなさんありがとうございます
実習用のテキストだけどこういう感じです(´・ω・`)
>>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)
C++で関数のグラフを作る問題があるんですけど、 グラフィックを表示するにあたって追加でインストール しなきゃいけないものってあるんでしょうか? OSはXP、visual c++ 2005を使用しています。
VCありゃいける GDI使うだろうし
>>876 ですが教科書の通りにプログラムしても
なぜか動いてくれないんですよね・・・
これが問題ありそうな5,6,7、8行目なんですけど、
void CVc31view::OnDraw(CDC* pDC)
{
CVc31Doc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
で、エラーがこう出ます。
ex3.1.cpp
.\ex3.1.cpp(5) : error C2653: 'CVc31view' : 識別子がクラス名でも名前空間名でもありません。
.\ex3.1.cpp(5) : error C2065: 'CDC' : 定義されていない識別子です。
.\ex3.1.cpp(5) : error C2065: 'pDC' : 定義されていない識別子です。
.\ex3.1.cpp(6) : error C2448: 'OnDraw' : 関数の定義が間違っています。
>>877 CVc31view クラスの宣言はどうなってる?
>>877 たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?
int* pValue = new int[10]; pValue[1] = 10; のように配列をnewすると、 代入時に*が付かないのに変数にpが付くのがシックリ来ません。 vector使えとか、そういう話とは別に ポインタ変数にpを付けられているかたにお聞きしたいのですが、 こういう場合にもpを付けられていますか? それとも、int value = new int[10]; と書かれてますか?
宗教論争の予感。
>>880 コーディング規約に従うだけ。
ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。
おれは vector 使うし、ポインタだからって p 付けたりしないし、 話には参加できないな。うれしいぜ。
>>880 その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。
# なんでvaluesじゃないのか、その方が気になる。
それはpointerだから
886 :
デフォルトの名無しさん :2009/04/06(月) 20:30:01
クラス内に性的なメンバがあってメモリ割り当てが必要な場合、それを初期化するタイミングは クラスの外部でするべきでしょうか?
887 :
886 :2009/04/06(月) 20:37:48
すいません、間違えました。 -性的なメンバ +静的なメンバ あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか わからずにいます。 目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で 1個あればいいんですが。
最初のインスタンスが作られるときにクラスの内側で割り当ててもいいし、そうでなくてもいい。
性的結合..いやらしい
>>887 静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?
スマートポインタについて最もよく解説されている本や webページを教えて下さい。お願いします。
使い方の解説? 実装の解説?
実装の解説でお願いします。 概念はある程度わかるんですが実際 どうやって実装しているのか 分からないんです
検索すればでてこない・・・? boostのコードでも見たらどうか。
あと、スマートポインタにもいろいろあるけど、どれのこと? もっとも、基本はデストラクタでdeleteするという点は共通だけど。
auto_ptr
質問させていただきます 変数を宣言するときに char buf[1000]; とするのと char buf_0[100]; char buf_1[100]; ... ... char buf_9[100]; として確保するのでは、必要なメモリの量は変わってくるのでしょうか?
899 :
デフォルトの名無しさん :2009/04/07(火) 00:59:46
メモリが連続になるかならないかではないかな
Cから見えるメモリの使用量は等しいけど、 実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない
>>897 CPUのアラインメントの関係で違ってくるかもしれんな
例えば、以下のように二次元配列の確保方法はありですか? コンパイラは通ったんですが、なんか怪しいような。 そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか? int (*p)[10] = new int [3][10]();
903 :
デフォルトの名無しさん :2009/04/07(火) 09:53:36
テンプレートクラスが、std::vector<T>のメンバーを持っています。 ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと 初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、 vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?
>>903 コンストラクタを実行していないクラスを生成する…
無理ぽ
905 :
デフォルトの名無しさん :2009/04/07(火) 10:17:47
reserve(ほしい要素数); ってこと?
C言語でHTMLを出力したいのですが わかりやすく解説してるHPとかありますか? QueryStringのやりとりが分からなくて困ってます
909 :
デフォルトの名無しさん :2009/04/07(火) 11:56:23
VC++2008で開発しているものです。 F5で実行するたびに以下のようなMemoryManager::write()というログが出るのですが、 これはなにか問題があるのでしょうか? [ MemoryManager::write() ] totalSize = 16777216 ( 1000000 ) : 16.00MB address size file line 02FF4B04 16392 unknown 0 02FFBE14 1152 unknown 0 02FFC294 1152 unknown 0 02FFC714 1152 unknown 0 02FFF384 32 unknown 0 02FFF3A4 32 unknown 0 02FFF3C4 24 unknown 0 02FFF3DC 48 unknown 0 02FFF474 24 unknown 0 02FFF48C 24 unknown 0 02FFF514 32 unknown 0
ARToolKitだろ。 そういう環境ちゃんと書かないとわからんよ。
912 :
デフォルトの名無しさん :2009/04/07(火) 14:53:46
ええー? そんなのインストールしてません。
>>902 その解放は、delete[] pで問題ない。
スマートポインタの一つがvectorって解釈でいいの?分からないので 質問。
915 :
デフォルトの名無しさん :2009/04/07(火) 22:57:27
>>902 >>913 おれもそれが何を確保してるのかよくわからん。
int (*p)[10] = new int [3][10]();
コンパイルも通るし、
913の言うように、
delete [] p;
で開放できてるけど。
pはintのポインタの配列の先頭か?
それが3個配列になってるのを確保したのかな?
+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[0][0]
+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[1][0]
+------+------+------+------+------+------+------+------+------+------+
| int* | int* | int* | int* | int* | int* | int* | int* | int* | int* |
+------+------+------+------+------+------+------+------+------+------+
<=先頭がp[2][0]
こんな感じ?
二次元配列はC++のnewでは一度には確保できないと思ったけどな。
じゃvectorはスマートポインタじゃないんだね? 何が違うの?vectorも勝手にデストラクタ呼ばれて解放される
vectorインスタンスはポインタとして使えない。 ただ内部実装にポインタを使っているクラス。 内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。
// VC++6.0 #include <stdio.h> int main() { int (*ai)[4] = new int[3][4]; for (int i = 0; i < 3; i++) { printf("%p\n", ai[i]); } delete[] ai; return 0; } ・実行結果 00380FE0 00380FF0 00381000 ま、2次元配列も割と簡単に扱えるみたいだ
>>919 つまりvectorで確保した領域は、関数などでポインタ渡しが
できないってことですね?それは不便かも・・。
クラスメンバのポインタにもアクセスすることも可能だと書いたんだけども。
vector(コンテナ)は、vector自身がコピーされれば、中身のメモリ領域も丸ごとコピーされる。 スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。 メモリ領域は2つのスマートポインタで共有される。 みたいな。
924 :
902 :2009/04/08(水) 01:41:17
>>913 ,917
どもです。
同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが
delete [] p; でちゃんとできてました^^
925 :
デフォルトの名無しさん :2009/04/08(水) 06:11:47
>>924 本当だ。
この方法で、3次元配列も出来た!
しらんかった。
あと、後ろの括弧は無しでも問題ないようだけど。。。
なんでこれで出来るのか、よくわからん。
でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、
あまり使い道はないかも。
VC++.NETを使ってツールを作成しています。 ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、 それをShowControlBar関数を使って消したり出したりしているのですが、 表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、 変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。 クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには どうすればよいでしょうか? 知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。 よろしくお願いします。
意外と難しいかもな DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る 逆に言えば入力フォーカスが移らない限り前面には出てこない NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも
MainFrame を owner にして ダイアログバーを Create すれば良いんでないの?
Spy++でDialogBarへのメッセージを監視し、背面時にタイトルバーをクリックしたら S WM_NCHITTEST x y R WM_NCHITTEST HTCAPTION S WM_MOUSEACTIVATE HTCAPTION WM_LBUTTONDOWN R WM_MOUSEACTIVATE MA_NOACTIVATE という感じになったので WM_MOUSEACTIVATEのメッセージハンドラを作ってMA_ACTIVATEを返せばいいんじゃないかと思う
931 :
926 :2009/04/08(水) 12:25:22
色々教えていただきありがとうございました。
>>927 おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると
フォーカスは移りました。
>>928 元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。
>>929 Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。
ただツールをしるきっかけを教えていただきありがとうございます。
>>930 教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。
試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の
マウスダウンイベントを拾える事を確認したので、そのイベント検知時に
this->SetFocus(); ・・・ダイアログバーのクラス内
をする事で、タイトルバー以外は思い通りの挙動にする事ができました。
これで今は妥協することにします。ありがとうございました。
932 :
デフォルトの名無しさん :2009/04/08(水) 18:27:59
a<<1とa<<=1の違いを教えてください。
実行後のaの内容が違う a<<=1 は a = a << 1
>>925 後ろの括弧とはdeleteの右の[]のこと?
intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。
デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。
935 :
デフォルトの名無しさん :2009/04/08(水) 21:03:45
最近Visual C++ 2008を使い始めたものです。 あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。 #define _SCL_SECURE_NO_WARNINGS をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい のですが、どうやればいいのでしょうか? どうかよろしくお願いします。
コンパイラオプションに /D_SCL_SECURE_NO_WARNINGS を指定する
>>934 int (*p)[10] = new int [3][10]();
の最後の()のことじゃない?
938 :
デフォルトの名無しさん :2009/04/08(水) 21:27:13
>>936 ありがとうございます。
コンパイラオプションってどこで指定できますか?
プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。
質問です。 一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して とある処理をしています。ウィンドウにフォーカスがある時より、ない時の ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう 理由なんでしょうか? ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが 独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも 思いましたが、特に過剰に呼ばれているわけでは無さそうでした。
>>938 ツリービュー:構成プロパティ→C/C++→プリプロセッサ
構成:すべての構成
プリプロセッサの定義(/D[マクロ])
_SCL_SECURE_NO_WARNINGS
941 :
デフォルトの名無しさん :2009/04/08(水) 22:21:05
ttp://www.01-tec.com/document/without_pointer.html ここの、●バグその3「'\0'終端」
のサンプルプログラムの事なんですが、
#include <stdio.h> /* puts() */
#include <string.h> /* strcat() */
int main()
{
char buff[128] ;
strcat( buff, "ABC" ) ;
puts( buff ) ; /* ABCと表示したい */
return 0 ;
}
buffに終端NULLが入っていない為、putsの表示がうまくいかない事が
このプログラムの意図するところらしいのですが、"で囲まれた文字列には
暗黙的に'\0'が付加されるのでこのプログラムのように
strcat( buff, "ABC" ) ;
としても問題ないですよね?
構成:すべての構成 にするとまずいんで(WIN32やら_DEBUGが消えてしまう) Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で
>>941 C言語の文字列では,終端記号があることを前提にしています。
しかし,charの配列を確保しただけでは文字列として初期化されているわけではないのです。
以下の例は,終端記号の存在(文字列としての初期化)を忘れたために失敗してしまった例です
#include <stdio.h> /* puts() */
#include <string.h> /* strcat() */
int main()
{
char buff[128] = ""; // こうすればおk
strcat( buff, "ABC" ) ;
puts( buff ) ; /* ABCと表示したい */
return 0 ;
}
>>941 ちゃんとそこ読んだのか?
strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、
buffに'\0'が入っている保証はどこにもない
>プログラマの都合よく '\0' で初期化されているわけではないのです。 初期化されないのは仕様だしな(スタックポインタを加減するだけ) 高級アセンブラは使う人を選ぶ
946 :
デフォルトの名無しさん :2009/04/08(水) 22:47:38
>>944 ,943
ありがとうございます、
自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは
たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた
という認識で良いでしょうか
C++ は「高度な抽象」とか「型安全」とかいうくせに ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。 どういうことなんだ。ぷんぷん。
どちらもできる柔軟な特性と前向きに捉えてみる
C++はbetterなC オブジェクト思考したいならJavaをやれ C#・・・何それ?
C#はVBみたいなもんだよな。
C#使うぐらいならVBのほうがいいよ
952 :
デフォルトの名無しさん :2009/04/08(水) 23:21:17
>933 ありがとうございます。 昔そんなことを習ったような気がします。
VBなんか死んでもやらない。理由は無い。
「無い」というのも立派な理由だよ
同じ.NET frameworkを使っているだけで、VBとC#を一緒にするのはないわ
似たようなもんだけどな。
VB.netとC#は似たようなもん。
>>947 言語のせいじゃないだろ。ライブラリの作者に文句言え。
困っています。
http://www.kattch.com/~kattch/MySQL/06_3.html fedoracore4でC言語とMySQLを接続しようとしているのですが、
実行するとセグメンテーションエラーが出ます。
record = mysql_fetch_row(result); の
mysql_fetch_row関数を使用しているところで落ちているのは
判ったのですが何が原因か判りません。
コンパイル時の指定が間違っているような気がしますが
わかる人がいたら教えてください。
関係ファイルのパス
/usr/include/mysql/mysql.h
/usr/lib/mysql/libmysqlclient.so
/usr/lib/mysql/libmysqlclient.a
コンパイル
gcc -o mysqlclient \
-I /usr/include/mysql/ \
-L /usr/lib/mysql/ \
-l mysqlclient \
mysqlclient.c
ソースファイル
mysqltest.c
960 :
959 :2009/04/09(木) 07:53:41
追記。 count = mysql_num_rows(result); の部分でも落ちます。
961 :
959 :2009/04/09(木) 08:02:44
ソースファイルは mysqltest.cではなくmysqlclient.cの間違いです。
result = mysql_store_result(&mysql_buf); ← SQL回答領域ハンドルの取得 このハンドルでエラーになってる可能性が高いな
963 :
959 :2009/04/09(木) 08:29:51
>>962 解決方法とか……何かあるでしょうか。。。
964 :
959 :2009/04/09(木) 09:01:17
>>962 おっしゃる通り、取得に失敗していました。
if(result = mysql_store_result(&mysql_buf)){
}
else
{
printf("QUERY Error\n");
}
965 :
959 :2009/04/09(木) 09:19:30
>>962 判った!!!!!!!!!!!!!!!!!!!!!!
ありです。ばかやってました。
>>963 ソースもなしで他人のデバッグなんかできませんが。
それとも、デバッグのノウハウを0から教えろと言うことでしょうか。
esp
関数の戻り値チェックはちゃんとしましょうということだろ
PHPからCをCからPHPを呼び出す、もとい実行する方法ってある?
>>969 systemやexec系の関数で出来るだろ
971 :
デフォルトの名無しさん :2009/04/09(木) 12:01:34
そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな? 時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの あるんだけど。
過去ログ見ろとか言われても困るよなw
973 :
デフォルトの名無しさん :2009/04/09(木) 12:57:43
boost::shared_ptr<Test> MemberFunction(); boost::shared_ptr<Test>& MemberFunction(); あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。 (名前はMemberFunction)。 このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか? 自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を 返すことに意味はあるでしょうか?
参照を返したら外部からインスタンス内部のポインタをresetできる。 コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
975 :
デフォルトの名無しさん :2009/04/09(木) 13:20:34
>>974 外部から触って欲しくない時にはコピーインスタンスを返すべきということですか?
でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは
ないですか?
scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、 呼出し元が破棄されたポインタを持たされる危険がある。 というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。 そもそもスマポは、Testインスタンスを参照する手段であって、 MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
スマポってセマンティクスはポインタだからな Test*& MemberFunction(); と同じ事をしようとしてる
>>975 コピーをお前はTest自体のコピーと考えているように見えて、
974はshared_ptrのコピーのことを指しているように見えるぞ。
&じゃなくてconst&ならありなんじゃね? 値をコピーすると参照カウンタの操作が入って遅いだろうし。
980 :
975 :2009/04/09(木) 22:10:14
でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか? スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより 30倍近く時間がかかってました。 でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
速度を本当に気にするような場面ならそもそもスマポを使うな。 しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。 30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、 それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。 そもそもオブジェクトが何かの参照を返す事自体問題がある。
983 :
975 :2009/04/10(金) 01:02:41
そうなんですか。。。 実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し (スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、 最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、 なんでかなとおもってたのですが。、。
スマポの参照返すくらいなら普通に参照返せばいいんじゃ?
ぬるりーは怖いぜよ
返ってきたスマポの参照が本当に有効なスマポを指してるのか 知らない間に外からいじくられないか いつまで生きてることが保証されてるのか そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ 危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて ストーブ炊いて暑いからってクーラーかけるようなもの 馬鹿げてる
ぬるぽは怖いぜよ
988 :
975 :2009/04/10(金) 06:56:20
じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。 ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない と思ったんだよな。 ちょっと聞いてみます。
30倍遅いっても怪しい感じだな そんなに遅くなるか? 誰か試してくれ
shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。
992 :
975 :2009/04/10(金) 09:00:38
この前30倍近く遅かったと書いたけど、こんなコードでやってました。 Forループの中を入れ替えて時間計ったら、素のポインタだと2秒、 スマポだと70秒だった。(最適化は無し) ちなみに自分の環境は、VistaでCPUはT8100の2.1Ghz #include <iostream> #include <ctime> #include <boost/shared_ptr.hpp> class Test { public: Test() {} ~Test() {} }; int main() { boost::shared_ptr<Test> sp1(new Test()); Test* p1(new Test()); time_t t1,t2; time(&t1); for (int i = 0; i < 300000000; ++i) { boost::shared_ptr<Test> sp2(sp1); // Test* p2(p1); } time(&t2); std::cout << t2-t1 << std::endl; return 0; }
ume
最適化なしで較べるなよ。JK
995 :
975 :2009/04/10(金) 09:53:52
だって最適化してもポインタのコピーがちゃんと行われるように書くの 面倒じゃないですか? 最適化しないとだめですか?
996 :
デフォルトの名無しさん :2009/04/10(金) 09:57:16
実際のソフトで時間計らないと意味がない。 1ms秒が30msかかった所で、もし同じ頻度で呼ばれる関数が1秒かかっていたら 初めの差は無視できる。
997 :
デフォルトの名無しさん :2009/04/10(金) 10:00:57
自分の場合は、スマートポインタやGCなどは使わない。使いこなせない。 STLの変数生成速度でも気になるから、グローバルに定義してしまうなどする。 全てではなく多く回数使うやつなどね。
気になるからとか気分じゃなくて実測して、 それが本当にボトルネックになってるか確認してからにしようぜ。 意味の無い自己満足な最適化はコードを読みにくくするだけで、 何のメリットないからな。
999 :
デフォルトの名無しさん :2009/04/10(金) 10:12:36
gotoは除外すべきという説があるが、多重ifの方を無くすべきだ。 if else を続けるとかなり難解になってしまう。
1000 :
デフォルトの名無しさん :2009/04/10(金) 10:15:53
>>998 実際にstringを使うアルゴリズムで実測してみた経験から。
string、resizeを頻繁にするとcopyや生成でかなり食っている。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。