【初心者歓迎】C/C++室 Ver.25【環境依存OK】
3
VC8でopenFileDialogを使いたくて
MSDNのソースを試してみようと
ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx 説明を読み
フォームに Button を配置して
using namespace System;を宣言して、
下記のコードを試したのですがエラーが出ます、何か読み込んでいないファイルがあるか設定のミスだと思うのですが、原因が分かりませんよろしくお願いします。
private:
voidbutton1_Click(Object^/*sender*/,System::EventArgs^/*e*/)
{
Stream^myStream;
OpenFileDialog^openFileDialog1=gcnewOpenFileDialog;
openFileDialog1->InitialDirectory="c:\\";
openFileDialog1->Filter="txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*";
openFileDialog1->FilterIndex=2;
openFileDialog1->RestoreDirectory=true;
if(openFileDialog1->ShowDialog()==::DialogResult::OK)
{
if((myStream=openFileDialog1->OpenFile())!=nullptr)
{
//Insertcodetoreadthestreamhere.
myStream->Close();
}
}
}
error C3083: 'DialogResult': '::' の左側のシンボルには、型を指定しなければなりません
error C2039: 'OK' : '`global namespace'' のメンバではありません。
error C2065: 'OK' : 定義されていない識別子です。
4 :
デフォルトの名無しさん :2006/02/27(月) 01:26:57
すいませんsageは駄目だったんですね ついでにエラーが出ている場所ですが if ( openFileDialog1->ShowDialog() == ::DialogResult::OK ) ここです
6 :
デフォルトの名無しさん :2006/02/27(月) 01:54:24
(>Д<)ゝ”ラジャー!!
7 :
デフォルトの名無しさん :2006/02/27(月) 02:07:23
質問です。まず4種類のプログラムを見て下さい。 void A( int in_no, int *out_no ) { int no = in_no + 10; *out_no = no; } void B( int in_no, int *out_no ) { *out_no = *in_no + 10; } int C( int in_no ) { int no = in_no + 10; return no; } int D( int in_no ) { return (in_no + 10); } 質問したいのは2つです。 まず1つ目は計算結果を返すための関数内のローカル変数を宣言について。 その変数で計算して返す形のほうがいいみたいなことをききました。 これはどうなんでしょうか?ローカル変数でもその関数が呼ばれる回数が 多ければ遅くなりそうです。(コンパイラに依存する部分も多少あるかもしれませんが) 2つ目は関数A・BとC・Dどちらのほうが早くて安全でしょうか? これもコンパイラによりけりだったり好みの問題かもしれませんが教えて頂きたいです。
好きに汁
>>7 最適化でどうなるかわからないのと、
CPUがどういう動きをするのかわからないからわからない。
俺も
>>9 と同じで「速度は実測が基本」だと思う。
また、計測の仕方も問題になると思う。 同じプログラムをループで何回も実行させる形だと、CPUがまたそれ用に最適化してしまってまたわからない。 それだけの機能をもったexeを作ってそれを何回も実行させる形にしてもやはりCPUがそう判断してしまうと計測ができないと思う。 つまり、よくわからいw 実際に速度が問題になってそのときその場所、その場面で速度を測ってやっとこさわかる問題だと思う。 構造的に遅いっつーならアルゴリズムを考える余地はあるけど コード的にどうっつーのは正直、ようわからんw
>>7 コンパイラがまともに最適化できるのなら、AとB、CとDはそれぞれ同じコードを吐くだろう。
#Bは*out_no = in_no + 10;の間違いと仮定して。
次にA或いはBとC或いはDの差だが、A/Bにはアドレスを関数に渡すと言うコードが必要になるので
恐らくは、C/Dよりも効率のいいコードを吐くと言うことはなさそうだ。
まぁなんだ、愚作を弄せず真っ当なプログラミングをしろ、と。
その上で、速度が重要な要素ならば実測しろ。
13 :
デフォルトの名無しさん :2006/02/27(月) 05:54:15
ある結果のときに外部プログラムを呼び出すってのはどうすればよいのでしょう? たとえば、IE起動するとか. よろしくおねがいします.
>>13 質問が曖昧すぎ。
・「ある結果のとき」に意味があるのか。あるなら具体的に。
・外部プログラムを起動してどうしたいのか。ただ起動するだけでいいのか、なんらかの連携をしたいのか。
・そもそもC標準関数だけでやりたいのか、WinAPIを使いたいのか、Unix系関数を使いたいのか、云々。
15 :
デフォルトの名無しさん :2006/02/27(月) 06:08:24
質問・・・。 VC.NET, 標準STL, WinXP SP2 set<int> i; i = { ...とにかく沢山のint、値域はなんだかめっちゃ広い ... }; …という set<int> がある。 ここから任意の範囲の集合について、ある処理を行いたい。 処理したい範囲は [ a , b ) とする。 i の中に a, b が含まれているとは限らない。 この時、処理したい範囲の最初と最後のイテレーターを得るにはどうすればいいんだろう。 これでいいのか?と思って↓みたいなソースを書いたけどダメだった。 i.lower_bound が i.end() になってるかのような結果になる。 set付属の関数だけでなくアルゴリズムの方でも試したけど、同じくダメだった。 for ( set<int>::iteretor itr1 = i.upper_bound( a ) ; itr1 != i.lower_bound( b ) ; itr1++ ){ (ある処理) } STLの解説サイトの情報だと、 > upper_bound … keyより大きな要素の最初を指すイタレーターを返します。 > lower_bound … key以下の要素(pair)の最後を指すイタレーターを返します。 だから、間違っていないような気もするんだけど、解説サイトによって微妙に言い方が変わるから混乱してる。 別の解説サイトの、アルゴリズムの方の lower_bound, upper_bound の説明とも違っているように感じる。 誰か詳しい人に図を付けて説明してもらいたくて仕方がない。
16 :
デフォルトの名無しさん :2006/02/27(月) 06:08:57
速度ってどうやって計るの? コンパイラのプロファイラだとインライン展開や自力で埋め込んだコードは計ってくれないよね。 皆さんの方法教えてください。 実際に最適化したものを計りたいんですが。
埋めたコード呼んでる関数とかでいいじゃん。 マクロの差分がミクロの速度差で。
18 :
デフォルトの名無しさん :2006/02/27(月) 06:26:20
>>13です。 「ある結果のとき」に意味はないです。 演算結果が1ならIE、2ならワードぐらいで考えてください。 ただ起動するだけでいいです。 C標準関数だけでお願いします。 あいまいで申し訳なかったです。
>>15 >処理したい範囲は [ a , b ) とする。
それなら、
for ( set<int>::iteretor itr1 = i.lower_bound( a ) ; itr1 != i.lower_bound( b ) ; itr1++ ){
じゃないか?
>>15 upper_bound(k)は、kより大きな最初の要素を指す。
lower_bound(k)は、k以上の最初の要素を指す。
(23.1.2より)
あと、ループ内でlower_bound()を毎回呼ぶのは禿げしく無駄が多いと思うぞ
22 :
15 :2006/02/27(月) 06:48:45
>>19 自分のソースを修正しました。感謝。
>>20 >lower_bound(k)は、k以上の最初の要素を指す。
lower_boundの定義がこの通りだとしたら、今の処理が上手くいかないのは確かに納得です。
もしかして
>>15 のサイトの説明が間違っていると?
間違っているとしたら、 『 k より小さな( 又は、k以下の ) 最後の要素を指す 』 という関数は何でしょうか?
>>21 forの前に itr2 = i.lower_bound( b ) と代入して、forを高速化しました。感謝。
>>22 >もしかして
>>15 のサイトの説明が間違っていると?
>>20 は規格からの引用。信じられないなら自分で確かめてくれ。
>間違っているとしたら、 『 k より小さな( 又は、k以下の ) 最後の要素を指す 』 という関数は何でしょうか?
用意されていない。あったとしてもそれほど便利じゃないと思うが。
/* kより小さな最後の要素 */
template <typename Assoc>
typename Assoc::iterator f(Assoc &x, const typename Assoc::key_type &k)
{
typename Assoc::iterator i = x.lower_bound(k);
if(i == x.begin()) return x.end();
return --i;
}
>>22 for (xxx::iterator it = i.lower_bound(a), last = i.upper_bound(b); it != last; ++it) {
//
}
に汁。
25 :
15 :2006/02/27(月) 08:05:42
>>23 上手く動きました。感謝。
>>24 forのスコープでメモリ節約感謝。
27 :
デフォルトの名無しさん :2006/02/27(月) 10:25:35
system("iexplore.exe"); だと内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイル として認識されていません。 となってしまいます。 どうすればよいでしょう。
HTMLファイルを開いたり特定のURLを開かせたいのなら、 Internet Explorer固定だなんてやめてくれよ。
Accelerated C++ で C++を勉強中です。 Accelerated C++ の151頁、以下のコードが VC++.NET2002 でコンパイルできません。 *os++ = string( i, j ); でエラーが出ます。本ではコンパイル通るようですが、VC++だと通らないのでしょうか? template < class T > void split( const string &str, T os ) { vector<string> ret; typedef string::const_iterator iter; iter i = str.begin(); while ( i != str.end() ) { i = find_if( i, str.end(), not_space ); iter j = find_if( i, str.end(), space ); if ( i != str.end() ) { *os++ = string( i, j ); } i = j; } }
31 :
30 :2006/02/27(月) 18:30:30
すみません、よく見たら上記関数に std::vector 渡していました。 イテレータ渡したら通りました、ごめんなさい。
まぁ、慌てず落ち着いてやりんさいや
下のプログラムの※1の部分で仮想関数のfoo()を呼び出して欲しいのですが、 B::foo(int)の呼び出しと見做されコンパイルが通りません。 何か、かっちょいい解決方法はないでしょうか? #include <iostream> class A { public: virtual void foo() { std::cout << "foo" << std::endl; } }; class B : public A { public: void foo(int a) {} }; int main() { B b; b.foo(); //※1 return 0; }
>>33 class B : public A {
public:
using A::foo;
void foo(int a);
};
class B : public A { public: void foo(int a) {A::foo();} };
>>34 なんと、3分とたたずに返事がきていたとは……。解決しますた。
ありがとうございます。
>>35 実際はB::foo(int)は引数を使った内容になるのですが、それを抜いても
※1の部分を変更しないと駄目ですので >34さん案でいきます。
ていうかさぁ、 た だ の 関 数 の オ ー バ ー ロ ー ド じ ゃ ね ぇ か バ カ Aの方のvirtual外せばそっちが呼ばれるわ
>>37 お前のレスだけが
質問文のさらに2ターンくらい前の段階で止まってるw
こうですか?わかりません!(><)
42 :
デフォルトの名無しさん :2006/02/28(火) 23:29:49
cを学びたいのですがオススメの本はあるでしょうか?
書籍スレ池
44 :
デフォルトの名無しさん :2006/03/01(水) 04:27:22
VCで、bool型の代わりに、intの別名のBOOLが使われている物が多いのですが、 何か意図があるのでしょうか? trueかfalseの状態しかないのなら、コンパイラのチェックも入るboolを使ったほうが良いと思うのですが。
素朴な疑問なんですが、プログラミングって個人でやる限りAdobeもんとか作るのって不可能に近いじゃないですか〜 猫でも分かるみたいなプログラム組んでもしょーがないような気がするんですけど・・
>>45 個人で書けるレベルのアプリでいまだ実現されていない(あるいは、誰も思い付いていない)
ものは大量にあると思う。
個人で書くのに限界を感じたら集団で書くこともできる。
釣りにしてはお粗末だな
>>44 一般的にVC++でBOOLというとWi32APIで定義されているそれのことである。
Win32APIはC専用ではないし、ましてやC++に特化しているわけではない。
よってBOOLはBOOLであってboolで代用できるものではない。
まー、それ以前に戻り値がBOOLのはずになのに1,0,-1を返す可能性があるAPIが(以下略
>>44 Win16が定義されたときは(Win32はその後継だが) boolは存在し無かった。
当時は Cか Pascalだったから。
>>44 ついでに、trueかfalseかしか無いならboolのほうがいいってのは別にどうでもいい
必要なのはtrueかfalseかという言葉ではなく、
「Aという状態かBという状態か」という概念だけ
そしてBOOLは基本的に「0かそうでないか」
なのでなんの問題も無い
いやTRUEと比較するおばかさんがいるでしょ。
勉強になっていいじゃない?
53 :
50 :2006/03/01(水) 14:21:52
そんな超おバカさんのこと言われてもなぁ 俺はどうせboolだろうがBOOLだろうが条件で==とかしないし・・・
BOOLは思い切りTRUEかFALSEですと書かれているよな あれはいつになったら直すのだ
-1を返すあれがあるから下手にBOOLをboolにすると罠に嵌まる。 だから俺は引数や戻り値がBOOLならBOOLを使うが、それ以外ではboolを使う。 けれど肝心の-1を返す関数の戻り値を受けるときにはintを使うけどな。 ところでダイアログプロシージャもときどきハンドルを返したりするのに昔は戻り値がBOOLだった。
キャストしまくれってことなんだろう
BOOL foo(){...} void hoge() { if(foo()) { ... } else { ... } } なんの問題も無い
んなの、ヘッダを勝手にintに書き換えれば良いだけ。
なんか、釣り糸が絡まってるよ
C++で、あるテキストファイルから特定の文字列(日本語も)を含む行をすべて抜き出すには、どのようにコードを書けばよいですか?
そのように
63 :
デフォルトの名無しさん :2006/03/01(水) 23:13:47
namespaceの中にoperator << とか書いて、 そのoperatorをnamespace外部で使うにはどうすればよいですか? # using namespaceつかわないで。 namespace ns{ class Foo { ... }; ostream &operator << (ostream &o, Foo &foo) { ... } } int main(){ std::cout << Foo(); // using namespace ns; しないと使えないよー } 教えてエライ人!
std::cout << ns::Foo(); にすれば良い 詳しくは Koenig lookup (Koenig の照合規則) で調べてみれ
65 :
デフォルトの名無しさん :2006/03/01(水) 23:29:10
すいません、微妙に例を間違えました。 class Foo{}; namespace ns{ ostream &operator << (ostream &o, Foo &foo) { ... } } int main(){ std::cout << Foo(); // using namespace ns; しないと使えないよー } Fooとoperatorがns内に有ればOKなんですが、 Fooがns外部にあると、コンパイルエラーになるとです。 std::cout ns::<< Foo(); とかやっても駄目だし、using namespace使う以外に方法無いんでしょうか?
すいません、できました。(スマートな書き方じゃないけど・・・) ns::operator << (std::cout, Foo()); すれ汚しスマソです
>>65 なんでFooをnsの中に入れない?
入れられないとしたら、なんでoperator <<を外に出さない?
>>66 のやり方で満足するなら、
class Foo
{
Orz途中で書き込んでしまった。 Class Foo { std::ostream & to_stream() ; } ; これでも十分という気がしてならない。
VisualC++6.0でaccelerated C++を読んでC++の勉強してるんですが、 <algorithm>ヘッダに定義されているmaxという関数を使っています。 と本には書いていて、ソースに #include <algorithm> ... using std::max; と書いてるのですが、コンパイルすると'max' : 'std' のメンバではありません。 と出てしまうのですが、これは何がだめなんでしょうか?
VisualC++6.0がだめなんですかorz その部分は自分で作って脳内補完します・・・
つVC++ express edition つVC++ toolkit 2003
min, maxマクロも悪さをするからヘッダをincludeする前にNOMINMAXも定義しておくと桶
>>76 for (int i=0, int len=strlen(str); i<len;++i) {
str[i] ^= str[len-i];
str[len-i] ^= str[i];
str[i] ^= str[len-i];
}
こういう事か?
79 :
デフォルトの名無しさん :2006/03/02(木) 12:06:55
C++でMKLを使って複素固有値問題を解きたいんですけど、 複素数はMKL_Complex16で定義できるんですけど その行列はどのように定義するんですか? MKL_Complex16 a[N]こんなふうにはできませんよね
>>79 行列といえば二次元配列じゃないのか?
複素固有値問題ってのを知らないから何とも言えんが
81 :
デフォルトの名無しさん :2006/03/02(木) 12:33:14
84 :
デフォルトの名無しさん :2006/03/02(木) 13:09:35
>>79 ちなみにMKLにおける複素数は
/* Complex type (double precision). */
typedef
struct _MKL_Complex16 {
double real;
double imag;
} MKL_Complex16;
このように与えられてる
virtual void end() = 0; の =0 には何の意味があるんですか?
あります。
88 :
デフォルトの名無しさん :2006/03/02(木) 15:20:08
質問です、STLがうまく使えず困っています。 目的は"hogehoge/hugahuga/homehome"という文字列を'/'を境界にした文字列に分割し、 それぞれをstring に格納、それをvectorで配列化するものですが、途中エラーで処理が終わってしまいます。 ● クラスメンバー CCommand::vector<string> m_StringArray; ● クラス関数内の一部 m_StringArray.reserve(10); 要素数分ループ処理 { ... m_StringArray[Index].assign(pStart,StrLength);// ここでエラー } エラー直前でchar* pStart は上記文字列の先頭のポインタを指していることが確認されています。 int StrLength には8(hogehogeの文字数)がしっかり格納されていました。 Index は初回(0)ですでに失敗します。 具体的には std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int 8, unsigned char 1) line 551 + 26 bytes std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * 0x00372fd0, unsigned int 8) line 133 + 43 bytes でスタックは止まっていました。 もしかしてstringをvectorで配列化すると不具合があるのでしょうか? 解決策を教えてください。
reserve resize の違いかな?
使ってるコンパイラのバージョン、及びコンパイラに標準添付以外のSTLを使ってるならその旨書いたほうがいいとは思うが。 Index < m_StringArray.size()ぐらいはチェックしてるか?
92 :
88質問者 :2006/03/02(木) 15:28:52
>>90 resizeにしたら難なく実行できました。
reserveでは実領域が確保されていないのですね、勉強になりました。
ありがとうございます。
>>67-69 レス遅くなってしまいましたが...
今やってるのは、GUIDをstd::ostream/istreamに流すoperator<<, >>を
自作utilライブラリ内に作りたいと思いまして。
んで、グローバルに書くよりnamespace util内の方が名前空間汚さなくていいかな
と思ったんですが、それだとそのnamespace外では結局usingが必要になるんで、
とりあえずグローバルに書くことで落ち着こうかと思います。
>>93 分かってるかもしれないけど
using namespaceはスコープがあるよ
{
using namespace ns;
std::cout << Foo(); // OK
}
std::cout << Foo(); // エラー
VUSUAL C++のインストールしてからプログラミングを動かすまでの設定を することができません、どこか説明がわかりやすいサイトしりませんか?
>>96 ありがとうございました。
>>94 あー、なるほど。使用する部分だけスコープで限定すればいいわけですね。
しかし、非operatorな関数はns::func()で呼べるのに、
operatorはusingつかったり、ns::operator<<(...)みたいに書き方変えないといけなくて、
サクっと書けないのが悲しい今日この頃です。
グローバルに定義するのが正しい あとはラッパーでも書くしかない
VUSUAL C++ってなんですかせんせい
ビュジュアル
>>100 MicrosoftのC/C++コンパイラとIDEとその他ツールのセット。
>>103 それはMucrosoftのC/C++コンパイラとIDEとその他ツールのセット。
106 :
デフォルトの名無しさん :2006/03/03(金) 00:47:03
VC6.0 コンソールAPで使える簡単なJPEGエンコーダ、デコーダってありませんか?
BCBなら標準でTJPEGBitmapが‥‥
libjpegでもGDI+でも好きなの使え
109 :
デフォルトの名無しさん :2006/03/03(金) 01:15:39
別スレッドからcoutをすると出力文字列がバグるんですが、 正しく表示させるにはどうすればよいでしょうか?
111 :
デフォルトの名無しさん :2006/03/03(金) 01:39:14
>>110 排他制御で調べてみましたが、いまのところ方法がみつかっていません。
関数一個で手軽にというわけにはいかないのでしょうか?
環境がわからんからなんとも言えない。
113 :
デフォルトの名無しさん :2006/03/03(金) 04:15:15
System::Windows::Forms::Label って配列として扱えんと? 無理ならJavaに戻らんといけんね C#でもよかと?
114 :
デフォルトの名無しさん :2006/03/03(金) 04:39:31
115 :
デフォルトの名無しさん :2006/03/03(金) 06:31:14
>>114 隣が深夜に45分おきにドン!と音をたてる
死んで欲しい
#include <stdio.h> #include "myfunc.h" int main(void) { int num1,num2,ans; printf("整数入力"); scanf("%d",&num1); printf("整数入力"); scanf("%d",&num2); ans=max(num1,num2); printf("%d\n",ans); return 0; }
int max(int x, int y) { if(x >y) return x; else return y; }
int max(int x,int y);
sample.c Error: 外部シンボル '_max' が未解決をコンパイルしようとするとこういう文が出てきます なぜでしょうかおしえt
>>119 maxの定義を見付けられないから。
詳しくお願いします
maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
追記 分割でやる奴なんです
>>121 >maxの定義はどこに記せばよろしいのでしょうか無知でスマソ
適当なソースファイルに書けばいい。
で、それとsample.cを一緒にコンパイル。
すんまそ 3次元座標をfscanfで読み込んで加工したいのですが エラーの時に吐き出される文字列が入ってプログラムが止まります while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){ データに対して処理 } データ 1 2 3 1 4 5 1 * 6 1 5 6 アスタリスクで止まってしまうのですが どなたか、回避方法教えてくださいませんか
>>124 %c, %sで読んで、*か判定して数値に変えたら?
xyzをstr[]にして、atoiとかで変換ということで上手くいくでしょうか? *か判定するのがstr型だとどうなるのか…そこのところの例とか見せていただけませんか
>>126 エラーがあるかだけ判断する方法。
char buf[LENGTH_AS_YOU_NEED];
while (fgets(buf, sizeof(buf), fp) != NULL) {
if (sscanf(buf, "%d%d%d", x, y, z) < 3) {
// Illegal data.
}
}
>>127 ありがとうございます。参考にしてやってみます
>>125 こんな感じか
#include <string.h>
#include <stdlib.h>
char str[3][9]; int i; int x[3];
中略
for( i=0 ; i<3 ; i++){
if( strcmp( &str[i][0], "*") != 0 ) x[i] = atoi( &str[i][0] );
else x[i] = 0;
}
>>127 個別に検出
while (fgets(buf, sizeof(buf), fp) != NULL) {
char str[3][10];
if (sscanf(buf, "%s%s%s", str[0], str[1], str[2]) < 3) {/* Illegal line.*/}
char * p;
x = strtol(str[0], &p, 0);
if (p == str[0]) {/* Illegal x.*/}
y = strtol(str[1], &p, 0);
if (p == str[1]) {/* Illegal y. */}
z = strtol(str[2], &p, 0);
if (p == str[2]) {/* Illegal z. */}
}
プログラムを一緒にコンパイルする方法がわかりません 入門書にも載ってない
>>131 の意味が分からない。
日本語から勉強してきてね。
>>129-130 なんとか無事にできました
これまでchar→数へ変換したことが無かったので、勉強になりました
ありがとうございました
コンパイラノマニュアルないお;;:::::::::::::::::::: C言語の入門書ってそういうと個おざなりだよな
>>135 コンパイラ何使ってる?
>C言語の入門書ってそういうと個おざなりだよな
コンパイラによって違うんだから書きようがないだろ。
コンパイラの入門書を読めばよかったのに
あ、そっかコンパイラってたくさんあるんだっけ cigwynって奴とBorland C++ Compilerって奴 このcigwynはC言語入門とかについてきた奴だからマニュアルがないし Borland C++ Compileって奴もウェブのC言語入門の奴に入れとけって書いてあっただけ コンパイルの方法も書いてない
・Cygwin →Cygwin関係のみならず、Linux関係、Unix関係の入門書でことが足りる。 #不明な点はCygwinスレへ。 ・BCC →BCC関連の書籍もあるはずだし、これもやはりBCCスレがある。 結論: 調べもしないでぐだらぐだらいってんじゃねぇ。
>>138 cygwinはコンパイラじゃない。コンパイラはgcc。
gccだと、
gcc foo.c bar.c
という具合にすれば良い。
BCCは知らんが、似たようなものだろ。
>>139 コンパイルのしかたが分からんと言ってる奴にLinux, Unixの入門書を勧めてどうするんだ?
gcc foo.c bar.c だと、a.out がデキルケドナー
cygwin だとa.exeだった希ガス
なんで無知な奴ほど特殊な環境使うの?
何が一般的な環境かも知らないから。
>>139 うるせー馬鹿答えやがれ コンパイルできないっつってんじゃん調べてよ
>>140 そのコマンドひらめいて試したけどできなかった。
>>144 無知で悪かったな。じゃあお高く留まってるお前が手ほどきしてくれぃ
>>145 一般的な環境について詳しく
つーか標準的な環境教えてよ
そうすりゃこんなUZEE質問しないんだからさ〜
ただ「できない」と書かれても、「エスパーきぼんぬ」としか答えられん。 コマンドラインとか環境変数とかPATHとかからはじめないとならないのかな・・・
逆ギレする無能ほどたちの悪い物は無い。
>つーか標準的な環境教えてよ >そうすりゃこんなUZEE質問しないんだからさ〜 「優しくしてくんなきゃ暴れるぞ!」みたいな。
おねがいだよおおおおおお bcpadっていうの使ってるんだけどできないの
わkった。じゃあ標準的なC言語を学べる環境を教えて それ用意してprintfカラ勉強しなおすから
別に勉強しなくてもいいと思うよ だってお前が出来なくても、お前以外誰も困らないし つーか氏ねば?^^
勉強しようと思ってる人間が他人に聞くのか。 おまえには無理だから諦めろ。 真性厨房ウザいし。 家に帰ってママのちんちんでもしゃぶってろよw
またわけのわからんこと言う
>>151 は基地外のリア厨だろ
親も頭オカシイからこんな基地外のガキにネット環境を与える
基地外一家だな
あれ・・・ここって厨房板?
>>152-
>>155 こういう奴がいるからだめなんだよな。フゥ
>>151 出直して来い。としか言いようがない
ここは2chのなかでも頭のおかしい基地外が多いから(自分が頭がいいと思ってる
本当に勉強したいならハテナとかあるからそこできいたほうがいいよ
したり顔で溜息ついてみせる奴が一番寒いレス書く傾向は どの板も変わらんな。
>>146 標準的な環境?ないよ。どいつもこいつも一長一短。
山ほどのコンパイラがあり、それだけ選択肢があることがC/C++の利点でもあり欠点でもある。
160 :
デフォルトの名無しさん :2006/03/03(金) 23:04:53
try catch の仕組みって、どうなってるの? 勝手にいろいろと実現方法を妄想してたら、 なんかものすごくオーバヘッドが必要な気が・・・ 考えすぎ?もっと単純にこの仕組みは、実現できるの?
if (関数()==エラー定数) { エラー時の処理 }
つ[ 逆アセンブラ ]
>>160 ぱっと思いつく方法はsetjmp〜longjmpにデストラクタの呼び出しをくっつけること。
どうくっつけるかが問題だけど。
普通に例外つきの関数書いてアセンブラ出力読めば?
166 :
デフォルトの名無しさん :2006/03/04(土) 07:33:10
C++で質問です。 クラスライブラリ(?)を使用してファイルオープンさせたいときは ifstream fin; fin.open("a.txt"); のようにプログラムを書くことはわかったのですが、 WINDOWSのAPIのファイル関連の解説書を読むと、 HANDLE hfile; WIN32_FIND_DATA w32fd; hfile = FindFirstFile("a.txt",&w32fd); のような書き方をしているのですが、 HANDLE hfile; のような文法を、いくらC++の解説書で調べても出てきません。(C言語なら HANDLE *hfileのような書き方は理解できます) これって、構造体HANDLEの変数hfileを使うということなんでしょうか?
言語と環境の区別がついているか微妙だな。
typedef void *HANDLE; と定義されてる typedefはわかるよな?
169 :
デフォルトの名無しさん :2006/03/04(土) 08:35:58
>168 typedef int seisuu; のような使い方はわかります typedef void *HANDLE; の意味よくわかりません
>>169 void*型は知っているか?知らなければそういう型があることを覚えておけ。
typedefは型に別名を付けるためのものだ。
168ではvoid*にHANDLEという別名を付けている。(ただしHANDLEは何からtypedefされているのかと言うことは本来どうでもいい)
かくしてHANDLEはHANDLEという型なのだ。
だからHANDLE hfile;はHANDLE型のhfileという変数の宣言になる。
>>166 そもそも、後者はファイルのオープンじゃない。
FindFirstFileって単にファイルをオープンしたい場合に わざわざ使うようなAPI関数じゃないだろ ファイル列挙の際には便利だが
>>166 全然違います
っていうか定義を調べりゃ分かるだろ
おまいら釣られすぎ・・・
Win32プログラミング って書いてある本を買って来い。
176 :
デフォルトの名無しさん :2006/03/05(日) 01:41:46
>>168 >>170 ありがとうございました。理解できました。
typedef宣言入門レベルより上のレベルの本かってきたら
typedef void の使い方掲載されていました。
>>171 >>172 すみません、CreateFile()の間違いでした。徹夜してたもんで・・・
だけど、これは WIN32_FIND_DATAの構造体の変数w32fdを宣言したと考えていいのでしょうか?
WIN32_FIND_DATA w32fd;
hfile = FindFirstFile("a.txt",&w32fd);
>>176 いいんでないかい。宣言つーか定義だし、
FindFirstFile()で値をセットするための入れ物程度の意味だけど。
178 :
デフォルトの名無しさん :2006/03/05(日) 03:24:00
夜遅くお願いいたします。 UNIXのsched_yield関数やWindows SDKの MSG msg; while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } のように、他のタスクに処理を渡す関数のwindowsコンソールアプリ版を探しています。 一応Windows SDKは利用しているのですが、上記のソースを書くとCPUが振り切れます。 何が使えますでしょうか?
PeekMessage止めてGetMessageに汁
>>178 CPU負荷率はメッセージを握ると一気に100%になる。
大体、コンソールアプリで、そこまで単純なメッセージループを作成する意図が良くわからないけど、
いったい何をしたいの?
他のタスクに処理を渡すなら、Sleep(0);とかになるけど。まさか、Win16じゃないよね?
181 :
デフォルトの名無しさん :2006/03/05(日) 10:04:43
初歩的な質問で申し訳ないですが、 char str[] = "-1.1234567890123456e+000"; な%1.16e形式の文字列をそのままdoubleに変換するにはどうしたらいいですか? sscanf(str, "%1.16e", num); とかやってみましたがうまくいきませんでした
>>181 sscanf(str, "%1.16e", num);
↓
sscanf(str, "%1.16e", &&&&&&&&&&&&&&&&&num);
と&を17(1+16)個並べれば逝ける。
183 :
デフォルトの名無しさん :2006/03/05(日) 10:49:25
BYTE bd[1024]を初期化する際、 BYTE bd[1024]="test"; という風な書き方はできるようなのですが、 char* hoge(char *age) な感じで関数の引数としてもらってきたageの内容をBYTE bdに入れたい場合、 どうやってキャスト(っていうんでしょうか?)して入れたらよいでしょうか? (BYTE bd の初期化と同時に入れなくてもかまいません。) 教えてくださいお願いします。
>>183 完全に勘で答えるが、
strcpyとかいいんじゃない?
>>183 コピーしたいならstrcpy
bdを経由して*ageを書き換えたいなら代入
>>185 に自己レス
後半は無視してくれ。寝ぼけてた
>>183 ポインタと配列について勉強するといいよ。
188 :
デフォルトの名無しさん :2006/03/05(日) 11:25:34
>>182 : error C2059: syntax error : '&&'
と出ますたorz
>>188 少なくともCでは仕様でトークンの区切りが曖昧なときは
なるだけ長く取るというように規定されてるから
あれだけ&が並んでれば&& && && &&(略)と解釈されるだろうな
190 :
デフォルトの名無しさん :2006/03/05(日) 11:54:31
.。oO(どうすればいいのだろう・・・) &
191 :
デフォルトの名無しさん :2006/03/05(日) 12:18:44
std::string str; std::cin >> str; このとき入力された文字列の中にエスケープシークエンスがあれば 有効にしたいんですけどいい解決法教えてエロイ人!
192 :
183 :2006/03/05(日) 12:49:05
ご回答いただいた皆さんありがとうございました。 今、あるサンプルを改造してまして、一瞬解決したと思ったのですが、 ちょっと結果に違いがでてしまいました。 どう違いが出るかを言葉で説明するのは難しいところなので改造した所だけ載せます。 サンプル: BYTE pbData[1024] = "This is a test data."; DWORD dwDataLen = (DWORD)strlen((char*)pbData) + 1; 改造ソース: //エディットボックスに入力した文字列を取得してhoge関数に渡す GetDlgItemText(hDlg,IDC_TEXT,text,sizeof(text)); hoge(text); //hoge関数 char* hoge(char* text){ BYTEpbData[1024]; strcpy((char*)pbData,text); DWORDdwDataLen = (DWORD)strlen((char*)pbData); 〜省略 サンプルではpbDataに直接文字列が入ってるところを、 エディットボックスから取得した文字列を渡すように改造しただけです。 なぜかサンプルのように、dwDataLenに +1 すると、 コンパイルは通るものの、動作させると落ちてしまいます。 なぜでしょうか?正しくはどう書いたらよいでしょうか。 (そもそもサンプルの方で+1する意味がわかりません) 環境は VC++6 、win2k です。よろしくお願いします。
>>192 +1するのは、文字列の最後を表す'\0'が入る領域を取らないといけないからでは。
そしてhoge関数の中では、+1をしていないから、落ちるのでは。
>>188 「&」をいくつも並べるときは、間にスペースを挟んでおかないと、
コンパイラが「&&」と誤認識するよ。
他にも、テンプレートの実体化、つまり、「map<int, vector<int> >」とかの「>」もそう。
195 :
183 :2006/03/05(日) 13:44:41
>>193 レスありがとうございます。
strlenは終端文字は含まないんですね。+1する意味は納得できました。
で、改造の方で落ちるのは「+1」をした場合です。
さっきまでよく意味がわかってなかったので
+1をとりあえず外してみたら動いたのですが、
すると結果がちょっとサンプルとずれたものになりました。
(+1してないので違って当然ですが)
やはり+1をしたほうが正しいはずですが、
そうしたときになぜ落ちるのかが分かりません。
196 :
183 :2006/03/05(日) 13:55:32
なんかよくわかりませんが、 BYTE pbData[1024]=""; と、とりあえず何も入れないで初期化するようにしてみたら +1しても落ちなくなり、結果もサンプルと同じになりました。 でも理由がわからないのですっきりしません。 どなたか分かる方が居たら教えてください。お願いします。
197 :
デフォルトの名無しさん :2006/03/05(日) 14:00:50
>>180 void HandOverExection()
{
#ifdef WIN32
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg); DispatchMessage(&msg);
}
#endif // WIN32
#ifdef UNIX
sched_yield();
#endif // UNIX
}
int main()
{
bool ExitFrag = false;
while(!ExitFrag)
{
// 様々な処理
HandOverExection();
}
return 0;
}
かなり要約するとやっていることはこんな感じです。
最終的にはLINUX上で動かすことを想定していますが、開発が楽なのでwindows上でも動くように機種に依存するところは分けています。
ループしているところには実際にはサーバーとしての機能を持たせてあり、速い速度で一周します。
これではダメなのでとりあえずSleep(10)にしたところ、CPUが振り切れることはなくなりましたが、こんなんでいいのでしょうか。
>何も入れないで初期化 '\0'を入れてるが、何か?
199 :
183 :2006/03/05(日) 14:13:48
>>198 あ、そういう意味になるんですね。
それで、それを入れたときと入れないときで
どういう意味的なというか、処理上の違いが出てくるのでしょうか?
とりあえず意味も理解しないで適当にやってみただけなので。。。
どうしてそうしないと落ちるのでしょうか?
文字列を操作してるんだろ? なんらかの文字(0文字を含む) + 終端'\0' が文字列だって知らないの?
>>199 つまり、終端が入っていないと、どこまで読めば終わりか
分からないってことだ。極めて初歩の内容なので、しっかり
復習しておいた方がいいと思われ。
202 :
デフォルトの名無しさん :2006/03/05(日) 14:22:23
>>194 error C2102: '&' requires l-value
なエラーが出てしまったよぅ
#include <stdio.h>
#include <string.h>
void main(void)
{
char str[] = "-7.6338252785456362e+000";
double num;
sscanf(str, "%1.16e", & & & & & & & & & & & & & & & & & num);
printf("%1.16e\n", num);
}
203 :
183 :2006/03/05(日) 14:23:52
>>200 知ってますが件の不具合とそれがどう関連してるのかわかりません。
204 :
183 :2006/03/05(日) 14:26:23
>>201 でもエディットボックスから取ってきた文字列を
strcpyした時点で終端文字もコピーされてるんじゃないのでしょうか?
BYTEpbData[1024]; こうやった時に何が入ってると思ってんだ? BYTE pbData[1024]=""; こうやったら '\0' が入るのは理解したんだよな?
environ変数ってwindowsでも使えますか?
>エディットボックスから取ってきた文字列 こっちが終端ないのかな?
208 :
183 :2006/03/05(日) 14:44:18
>>205 >BYTEpbData[1024];
>こうやった時に何が入ってると思ってんだ?
分かりませんorz
何も入ってないんじゃないかと。
何も入ってないところにstrcpyで終端文字を含む文字列がコピーされるんじゃなんいでしょうか?
>BYTE pbData[1024]="";
>こうやったら '\0' が入るのは理解したんだよな?
""は文字列の印で、とりあえず文字は空で終端文字列だけ代入されてるんだろうな、というくらいの理解です。
209 :
183 :2006/03/05(日) 14:53:27
>>207 調べてみたらGetDlgItemTextは終端を含まないみたいですね。
でも、そうなると
BYTE pbData[1024]="";
で初期化したところで
終端含まない文字列(らしきもの)をstrcpyして
どうして上手くいってるのでしょう?
210 :
183 :2006/03/05(日) 14:57:36
すいません、
>>209 は違いました。
GetDlgItemTextで取得した文字列にはちゃんと終端が含まれるようです。
この関数自体の戻り値として、「終端を含まない文字数」が返るのだそうです。
>>208 >何も入ってないんじゃないかと。
話にならん。出直してこい
つうかなんで答えるほうも小出し小出しで勿体ぶってんの? 分からないなら答えるなよ。
215 :
183 :2006/03/05(日) 15:28:25
あの、分からないから聞いてるんで、 間違ってたら教えてくださいorz
216 :
デフォルトの名無しさん :2006/03/05(日) 15:33:44
>>211 でたゎぁ!!!
ありがd!!!
特許とったらこのスレで報告しまつ
218 :
217 :2006/03/05(日) 15:52:51
あ、ごめん。 よく見たら、解決策のとこは間違いだ。 急いだので間違えた。
>>216 ちょっとまて。特許って?ひょっとしてすげーエロい人?
220 :
183 :2006/03/05(日) 16:05:09
>>217 はい。その辺の事です。
で、+1の件はとりあえず解決はしたんですが、
BYTE pbData[1024]; のように初期化しないと落ちて
BYTE pbData[1024]="";のように初期化すると落ちない
ってことの意味がよく分からないんでスッキリできないんですが。
>>220 だから出直せと言っただろうが
ついでだから書いておくと、未初期化変数の内容は保証されない
配列を""で初期化することは{ '\0', }で初期化と同値
これの結果がどうなるかすら分からんのなら回線切って氏ね
222 :
183 :2006/03/05(日) 16:17:17
教える気がねぇならいちいち出てくんなよ。うぜぇ。
>>220 は何も質問してないんだからスルーでいいだろ。
224 :
183 :2006/03/05(日) 16:18:58
初期化しないと0で初期化されるんじゃないの?
>>224 ガタガタ言わずにヌルターミネートについて調べてこいヴォケ
229 :
183 :2006/03/05(日) 16:29:34
>>228 知ってるなら教えろよボケ。
答えねぇなら偉そうにいちいち書き込むな。
ウゼーだけだから。
230 :
217 :2006/03/05(日) 16:31:40
なんか火に油注いじゃったみたいだけど、
>>220 なんか情報が錯綜しててわかりにくいんだけど、
落ちる場合の192のhoge関数の先頭3行のコードと
どの辺で落ちてるか提示して。
231 :
183 :2006/03/05(日) 16:33:23
初期化してないがために中身がゴミであっても strcpyでヌル文字含んだ文字列いれたんだから それでいいんでないのですか?
できればOSやコンパイラなど、もう少し情報があった方がいいと思うんだけど。
234 :
183 :2006/03/05(日) 16:57:48
>>230 192で落ちると書きましたが、実際は↓のように書いたときは落ちなくて、
DWORDdwDataLen = (DWORD)strlen((char*)pbData);
サンプルどおりにサイズに「+1」を書いた時に落ちてました。
で、+1を削ったらなぜか落ちずに動いたのですが、
出力結果がたまにサンプルとは異なるものになりました。
(サイズに+1して無いのですから、サンプルとは違いがでて当たり前だったのですが)
文字列のサイズはヌル文字も含めないといけないので、
DWORDdwDataLen = (DWORD)strlen((char*)pbData) + 1;
のように「+1」をしなきゃいけないのは分かったのですが、
192のコードでサイズに+1をして実行するととなぜか落ちてしまう。
で、その後に当てずっぽうで
BYTE pbData[1024];
を
BYTE pbData[1024]="";
というふうに初期化してみたら、+1をしても落ちなくなり
結果も正しい物が出力されるようになった。という次第です。
で、今の疑問は、なぜこうやって初期化する必要があるのか、ということです。
初期化した場合としない場合でどうちがうのかがわかりません。
ゴミが詰まってたとしてもきちんと終端を含んだ文字をstrcpyしてるんだから
問題はないのではないのかなと。
>>234 そもそもpbDataをどう利用するのかすら分からんのに答えられる訳が無い
このスレにエスパーが居るとでも思ってるのなら氏ね
236 :
183 :2006/03/05(日) 17:11:17
>>235 BYTE pbData[1024]を初期化するかしないかで
DWORDdwDataLen = (DWORD)strlen((char*)pbData) + 1;
の部分で落ちるか落ちないかが決まっているのですから、
そこまでの手続きで既に何か違いが出ているのは明らかで、
初期化した時にはそれ以降きちんと動いて
望みどおりの結果が得られていると言っているのですから、
pbDataのその後の利用法は関係ないと思うのですが。
>>236 そこで落ちると言うことはほんとに確認したのか?
#include <assert.h>
int main()
{
int a = 1; // a = 0だと異常終了する
/*
>>235 はここまで読めば、なぜa = 0だと異常終了するのか答えられるんだよね。
すごいなあ。
*/
assert(a == 1);
return 0;
}
>>237 あれだけ断言しているんだから、確認したんじゃない?
240 :
183 :2006/03/05(日) 17:30:04
>>237 普通の文字列もらってきてるだけですから、
strlenに+1をしないといけないのは正しいですよね?
で、BYTE pbData[1024]をきちんと初期化しない時は
strlenに+1をすると落ちてしまうのですから、
そこまでの処理で既に違いが出ているのは明らかですよね?
だって違いはそこ以前の部分だけですから。
初期化をきちんとして、strlenに+1をすれば
正しい結果も出ているのですから、その後の処理も正しいと思います。
っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
キレられてたんですが、そこではないのですか。
>>240 だからまさにその「strlenの行」で確かに落ちてることを確認したのかと聞いてるわけだが?
242 :
217 :2006/03/05(日) 17:35:00
>>234 ,236
いまやってるのは217で書いたような「暗号化」なんだろ。
暗号CryptEncrypt、復号CryptDecryptの両関数は
文字列ではなく単なるBYTE配列を扱うものだから、終端がどうのこうのは関係ない。
(\0で元データの長さを判断しているわけではない)
だからCryptEncryptには第六引数にdwDataLenで長さを指定して
その長さを見て暗号化してるんだと思うよ。
+1してるのは\0の範囲まで暗号化する意思を示しただけであって、
+1しないで暗号化しても何ら構わないはず。
今こっちでVC6,Win2000で確認したところやはり落ちない。
もう一度書くけど、
落ちてるんだとしたらどこで落ちてるか提示して、
落ちるケースのhoge関数の先頭3行ずばりそのものを192と同じように書いてくれ。
>>240 >っていうか、さっきまで「初期化してないのところが悪い、出直して来い」って
>キレられてたんですが、そこではないのですか。
ほかの回答者の方々は「暗号化」の問題だと知らない時点で
回答してくれてるんだから、そのような判断をするのはしかたがない。
一般的な文字列の問題だと思って回答してくれてるんだから。
そっちが情報を出さないのが悪い。
このやりとりよりソースが長いとも思えんなw もうアップすればいいじゃんw
244 :
217 :2006/03/05(日) 17:38:59
>>243 217のリンク先のコードちょっと改変しただけ。
VC6で80行弱なんだが、どう貼り付けたらいいんだっけ?
宿題スレのうpろだ使えばいいんじゃないか?
>>192 #include "stdafx.h"
#include <stdio.h>
char *hoge(char* text);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
hoge("This is a pen");
return 0;
}
char* hoge(char* text){
BYTE pbData[1024];
strcpy((char*)pbData,text);
DWORD dwDataLen = (DWORD)strlen((char*)pbData)+1;
return NULL;
}
ってコードを書いてみたけど落ちないよ。
なんで原因は別のところにあるんじゃない?
リンク先があるなら、答える人はリンク先を見ればいいかもね。 ・・・私はあまりに情報を小出しにするので、悪いけど下ろさせてもらいまする
>>240 初期化してない場合その中がどうなってるのか、見てみればいい
249 :
217 :2006/03/05(日) 17:54:59
>>249 VC8のclに/link advapi32.lib付けて試したが
コンパイル・実行ともに問題なかった
strcpyで警告は出てるがな
まさかとは思うが Unicodeオプションとかじゃなかろうなぁ...
252 :
183 :2006/03/05(日) 18:38:22
> txtだとUPできないのでjpgになってます。そのまま読めると思います キミは実にバ(以下略
戻り値がchar*の時点で怪しいと思ってたけどな。
char*を受け取ってるから戻り値char*でも悪くはない気はする
俺の脳内コンパイラが
>>252 は73行目で落ちるとWarn出してるんだが
おまいらはどうよ?
257 :
183 :2006/03/05(日) 19:12:28
258 :
183 :2006/03/05(日) 19:18:34
char*云々はモンダイなくね?
260 :
183 :2006/03/05(日) 19:27:47
>>259 仮にそこで問題が出るとしても、
そこで問題が出るに至った根本原因は
例の三行くらいの改造個所の部分しかないと思います。
そこをオリジナルのままにすれば落ちないで正常に結果も出るのですから、
少なくとも改造した個所は
オリジナルとは意味的に異なる事をしているのは明らかだと思います。
>>183 おそらくだけど・・・
CryptEncryptはpbDataをdwDataLen分だけ暗号化するんだけど、
そうするとこの場合は文字列終端の\0まで含まれちゃう。
pbDataを初期化している場合はpdData[dwDataLen+1] が\0だから、一応ヌルターミネイト文字列になるんだけど、
初期化されてない場合は\0が無いので、その後のstrlenで落ちてしまうんじゃないかな?
サンプルだとpbDataはたいてい初期化されてるね。
で、この場合の解決策は
1) 暗号化するデータ長に+1を足さない
2) pdDataを事前に初期化(pdData[dwDataLen+1]=\0ならOK)する
のどちらかがいいと思う。
なぁ、どうせコピーした文字列の長さを取得してんなら、 strlen(plaintext)でやっときゃpbDataの初期化だなんだと騒がなくていいじゃねぇかとか そう思った俺は異端なのか?
>>263 異端じゃないと思う。ただ理由は知らんが、どのサンプルソースをみても
暗号化バイト長 = 文字列長 + 1
となっている。
265 :
183 :2006/03/05(日) 19:50:09
>>262 では242の方のソースではなんで落ちないのでしょう?
このソースでもpdDataは初期化されてないようですが。
266 :
183 :2006/03/05(日) 19:51:00
>>262 更に、データ長に+1を足しても足さなくても落ちません。
ていうか、このAPIの仕様は良く知らんが 暗号化後のデータをヌルターミネイト文字列扱いするのがまずいんじゃね? 暗号化後のデータって普通、ヌルターミネート文字列じゃなくて、単なるバイナリだと思うんだが・・・
ねぇ。 もうバイナリになった時点でどこに0がくるかこないかわからないからねぇ。
>>265 CryptEncrypt後のpdDataに対してstrlenを使ってないからじゃない?
270 :
217 :2006/03/05(日) 20:06:20
>>252 「初期化する・しない」と「+1する・しない」で4組あるのでそれぞれ検証
前提:暗号化する文字列は abc
encrypt(char *plaintext)に渡されるのは abc\0(バイト配列で言うと[61 62 63 00])
strlenは3、+1すると4
■初期化しない&+1する
・pbData[1024]:[cc cc cc cc cc cc cc 〜 cc](初期化てされない)
・strcpy後:[61 62 63 00 cc cc 〜 cc]
・暗号化前:[61 62 63 00]
・暗号化後:[89 9a 48 3d]
・pbData[1024]:[89 9a 48 3d cc cc cc 〜 cc](結果が返ってくる)
・plaintextにコピー:[89 9a 48 3d cc cc cc 〜 cc]
・結果:終端を判断する\0がないため、SetDlgItemTextの時に落ちてしまう。
■初期化する&+1する
・pbData[1024]:[00 00 00 00 00 00 〜 00](初期化)
・strcpy後:[61 62 63 00 00 00 00 〜 00]
・暗号化前:[61 62 63 00]
・暗号化後:[89 9a 48 3d]
・pbData[1024]:[89 9a 48 3d 00 00 00 〜 00]
・plaintextにコピー:[89 9a 48 3d 00 00 00 〜 00]
・結果:3dの後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
続く
271 :
183 :2006/03/05(日) 20:09:07
>>269 初期化してなくてもstrcpy使って文字列入れてる時点で
ヌル文字は入ってると思うのですが。
こんなもうおかしいのがわかってるプログラムの変更に検証なんているのだろうか?
>>271 +1してた場合ヌル文字も一緒に暗号化するから、
暗号化後のヌル文字はヌル文字では無くなってしまうのよ。
274 :
217 :2006/03/05(日) 20:18:37
続き
■初期化しない&+1しない
・pbData[1024]:[cc cc cc cc cc cc cc 〜 cc]
・strcpy後:[61 62 63 00 cc cc 〜 cc]
・暗号化前:[61 62 63]
・暗号化後:[89 9a 48]
・pbData[1024]:[89 9a 48 00 cc cc cc 〜 cc]
・plaintextにコピー:[89 9a 48 00 cc cc cc 〜 cc]
・結果:48の後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
■初期化する&+1しない
・pbData[1024]:[00 00 00 00 00 00 〜 00](初期化)
・strcpy後:[61 62 63 00 00 00 00 〜 00]
・暗号化前:[61 62 63]
・暗号化後:[89 9a 48]
・pbData[1024]:[89 9a 48 00 00 00 00 〜 00]
・plaintextにコピー:[89 9a 48 00 00 00 00 〜 00]
・結果:48の後の00で終端が判断でき、ちゃんとSetDlgItemTextで表示される。
>>272 おかしいのは分ってる。それを183に説明してやってるの。
275 :
183 :2006/03/05(日) 20:20:56
>>273 ああ、そういうことですね。納得しました。
276 :
183 :2006/03/05(日) 20:33:58
>>217 お手数をおかけしました。納得しました。
初期化とその後の処理で違いが出るのも理解しました。
ありがとうございました。
ところで単純に
char a[1024];
SetDlgItemText(hDlg,IDC_CIPHERTEXT,a);
とテストしてみたら「フフフフフフ・・・・」でしたが落ちませんでした。
落ちるのは、returnのところのstrcpyじゃね? plaintextはスタックにあるし。
つか、デバッガでちゃんとみればすぐにわかったバグだよね。
279 :
183 :2006/03/05(日) 20:41:45
>>278 デバッガの使い方を今回覚えましたorz
それで納得できました。
最初の方であれだけ値はどうなってるの?とか ホントにそこで落ちてるの?とか聞かれてたのに終わってみれば 結局確認してないわけねw おもしろいな。お前。
281 :
217 :2006/03/05(日) 20:48:46
282 :
183 :2006/03/05(日) 21:05:21
>>280 うるせーよ野郎のくせして小姑みてぇに
ボソボソ言いやがってよ。
何はともあれ解決してよかった。
>>282 そりゃてめーだろ。
そんなもん実行して値確認すりゃ済む話なのになんでなんで聞きにきやがってアホかw
アフォ丸出しだなw
アフォの世界チャンピオンだなw
285 :
183 :2006/03/05(日) 21:17:42
286 :
183 :2006/03/05(日) 21:28:52
ところで今回みたいな場合の関数の文字列の受け渡しって 結局どうやって書くのが普通ですか。 なんか嫌味っぽく変だと言われたままなので気持ち悪いです。
ハンドルを間違えましたすいません。
いつもstrcatとかで普通にうけとってんのと同じでいいんじゃねぇの?
今回みたいなのとかはmemcpyとかと同じでいいんじゃね?
質問も小出し 回答も小出し 中身空っぽのくせに、何をそんな隠し持とうとするの、君ら?
質問が小出しなのに一発回答できるエスパー募集中
途中で寝たが、結局落ちてる行は確認してなかったんだな しかも俺がreturnの所のstrcpyで落ちると言ってるのにスルーしてるしな
>>291 頭わるいなぁ・・・
ここでいう回答が小出しというのは、不完全な質問に完全な回答が無いということではなく
今自分ができる回答の中から言葉を小出しにし、それによって混乱気味の質問者を
さらに混乱に落とし込んで流れを余計しっちゃかめっちゃかにする言動のことだよ
回答者ならアフォでも許されるというわけではないよ
馬鹿は馬鹿にされる
あーでもこれ、アホ回答者は論理を捨てて必死に煽り出すだろうなぁ・・・ 彼らにメチャクチャ都合悪いのに、論理的に完全だもんなぁ・・・
能無しはカエレ
>>296 はいご苦労さん
ま、できもしない回答をするから痛い目に遭うんだ
これが春厨って奴か
投下したジャッジはそれ自体もジャッジされる、という事実に気付いてない人は意外と多いのだよ 他人の不完全性を一方的に叩くだけでいられる、自分の言動は一切不問だ、と思ってた奴に お前アイツと同じ不出来を持ってるよ、と華麗に指摘したあとのファビョりようは各板共通
ここにも春厨って湧くんだな
以後しばらくの間 なんか切れちゃってる人の 不思議系一行レスが続きます
>>297 この人妄想癖でもあるのかな?
ま、俺は回答したことがないわけだが。
>ま、できもしない回答をするから痛い目に遭うんだ
すました回答しても妄想厨は妄想厨
妄想でしかレスできねぇ香具師を相手にすんな。同情を求めてるだけだから。
見事に煽りばかりになったな すべて書いた通り
なんか自分ができると思ってる馬鹿が多いような気がする。 そういう奴が一番痛い。 自分ができないことを分かってないからな。 中途半端でも回答して、 その批評を期待してる奴のほうが向上心があってまだマシ。
目クソ鼻クソの煽り合いは他でやってくださいよ、と /*------------------------------------------------------------*/ 次の方、どうぞ
で、なぜstrcpyで落ちるのか?
310はヌルーしてくれ。
だが、断る!
文字列に終端がないからでそ。終了。
自分から見て「実兄」の「嫁」の姉妹や兄弟は何ていいますか? 実兄の嫁は姉ですよね? 実兄と嫁の間の娘は姪ですよね?
>314 スレタイ読め
余談だが、あの暗号化のキーを一度ハッシュにする意味って何?
>>314 > 実兄の嫁は姉ですよね?
義姉
> 自分から見て「実兄」の「嫁」の姉妹や兄弟は何ていいますか?
義姉妹や義兄弟
・義姉(あね) ・義姉妹(しまい) ・義兄弟(きょうだい)
ここから義姉にハァハァするスレになりました。
しかしここから義妹にハァハァするスレになります
323 :
デフォルトの名無しさん :2006/03/06(月) 18:11:51
てゆうか、いくらグチグチ付け加えたところで 質問者がデバッカも使えないアフォの世界チャンプだった事実は消せないわけですがなにか?
と、タイトルを奪われた元チャンプは語るのであった。 /*------------------------------------------------------------*/ 次の方、どうぞ
浪速の弁慶かどうかは知らないが、 ただの悪ぶっているヤンチャ坊主だろ? 44秒で倒すと言ってるらしいが、 自分にはパワーも手数もあるから、負けるわけがない。 逆に俺の右アッパーをブチ込むよ。
と、巨乳美女は語るのであった。 /*------------------------------------------------------------*/ 次の方、どうぞ
どうして朝しかハッシュポテトを売ってくれないのですか?
ハッシュ?ハッシュとポテトがどう関係あるんだ? ローソンのハッシュドポテトは少々脂っこい。 普通のハッシュドポテトよりかなり脂っこい。
脂っこいというかネチネチしてるんだよな。 だがそれが旨い。
ハッシュ
331 :
デフォルトの名無しさん :2006/03/06(月) 18:45:51
age忘れた
std::mapつかっとけ
ハッシュドポテトは軽く揚げないとな。 #ホントは焼く方が油が少なくていいのだが。
スタックトレースの処理を作ろうと思います。 スタック領域を見れば、どの関数から呼ばれたのかを解析できると聞いたので。 そこで、何か参考とすべきWebサイトはありましたら教えてもらえないでしょうか? とりあえず、BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。
>>335 > BCCで作成してWin上で確認後、SHというCPUでITRON上で動くようにしたいです。
スタック構造に違いがある可能性が高いので、
その手順は踏めないと思われ。
>>335 x86ならcall/ret命令。つまり、機械語かアセンブラについて解説してるページ。
ほかのCPUでも似たようなもん。
return アドレスがどの関数内にあるか調べたらわかると思うけど、 SH とか ITRON とかどうなってるかシラネなので何とも。
339 :
デフォルトの名無しさん :2006/03/06(月) 23:10:11
int形の割り算で端数切り上げで解を求めたいんですけど、どうすればよいですか?
剰余を求めるか、固定小数点を使うといいんじゃないか?
val % dev == 0 ? val / dev : val / dev + 1;
>>339 (val + (dev - 1)) / dev
343 :
339 :2006/03/06(月) 23:59:31
C++でサイズn×n(nが可変)の二次元配列を引数に受け取る関数を作りたいのですが、この場合引数の型などはどうすればよいのでしょうか?
347 :
デフォルトの名無しさん :2006/03/08(水) 01:02:37
すいません、sageてしまいました。
>>346 vectorとかvalarrayとか使うのが吉。
>>348 ありがとうございます。vector< vector<int> >ってところでしょうか。使ってみます。
windows2000でVC8を使っているのですが、 DrawTextの関数を使うときの文字列を指定する2番目の引数の型がLPCWSTRに変換できませんとエラーが出ます。 むりやりキャストをすると表示はされるのですが文字化けしているようでした VC6時代の本についてたサンプルでは#define DrawText DrawTextAとなっていて エラーが出ることが無かったので VC8のデフォルトの#define DrawText DrawTextWを↑の定義に直したら エラーは出なくなったんですが、正しい対処の仕方ではない気がします。 本当はどうすればよかったのでしょうか。
>>350 1. (正攻法)きちんとTCHARやTEXTを使ってプログラムを書く。
2. (逃げ技)プロジェクトのプロパティから文字セットの設定をUnicodeからマルチバイトへ変更する。
派生クラスのインスタンスを生成する時に引数としてもらった値を 基底クラスのコンストラクタの引数にそのまま渡したいのですが どうやって書いたらいいでしょうか?
353 :
デフォルトの名無しさん :2006/03/08(水) 08:34:23
質問です。 構造体のコンストラクタで、以下の様な記述はありですか? SHoge::SHoge() { ZeroMemory(this, sizeof(SHoge)); } 大量のメンバ変数を持つ場合、初期化子を延々と並べると煩雑になります。 これ方法だと、メンバ変数を追加したときにも初期化し忘れることがないというメリットがあり、 特にデメリットも思い当たりませんでした。 ですが、こういった記述は見たことがなく、何か気持ち悪くて不安なのです。
>>352 class Base
{
public:
Base(int n) {}
};
class Derived : public Base
{
public:
Derived(int n) : Base(n) {}
};
>>353 仮想関数を持っていたり、仮想継承していたり、メンバに非PODのクラスがあったり
(移植性を考えるなら)メンバにポインタ・参照・浮動小数点数があったりするのであればやめたほうがよい。
>>354 >353はZeroMemory()の段階で移植性は捨てていると思われ。
未定義動作。鼻から悪魔というやつかな。
357 :
デフォルトの名無しさん :2006/03/08(水) 10:32:34
WIN32に依存しない形でsjis→UTF-8を行ってくれる関数はありませんか? 何か知ってる方がいましたら教えてください
359 :
質問 :2006/03/08(水) 13:00:01
プログラムのSTEP数って何のことですか?
COBOL換算の行数
デバッガにSTEP実行ってあるだろ。 そこから考えればSTEP数が何かはすぐわかるだろ。
362 :
デフォルトの名無しさん :2006/03/09(木) 07:26:55
あるクラスに void m_hoge(int); というメンバ関数があるとして、 この関数を外から呼べるようにポインタをGetできるような 関数って どう書いたらよいでしょうか?(GetHogeとかいう名前にするとして)
>>362 メンバ関数から関数ポインタは取れない。
メンバ関数へのポインタなら取れるが、これには
&classname::m_hoge
と書く。
364 :
デフォルトの名無しさん :2006/03/09(木) 08:07:36
>メンバ関数から関数ポインタは取れない。 >メンバ関数へのポインタなら取れるが、 すいません、違いがよく分からないのですが…
m_hogeが静的メンバなら、普通の関数とまったく同じ。 そうでない場合、メンバ関数へのポインタはただの関数へのポインタとは違う型。 class foo { void m_hoge(int); public: typedef void (foo::*bar)(int); bar get() {return &foo::m_hoge;} }; foo obj; foo::bar fn = obj.get(); obj.*fn(1); &foo::m_hogeはvoid (foo::*)(int)型。 もっと普通の関数ポインタみたいに使いたいならboost::functionとboost::mem_fnで。
そもそも
>>362 の「ポインタをGet」は関数ポインタのことなのか?
>>365 なるほど。納得しました。
分かりやすくありがとうございました。
test
369 :
デフォルトの名無しさん :2006/03/09(木) 10:54:42
VC6で編集しています。エディタ内で開いているファイルを 外部ツールで編集した時に、「このファイルは外部のエディタで 変更されています。ロードしますか?」と、出て更新出来たと思うのですが、 これが全く出なくなってしまいました。 オプションの[外部でファイルの変更時、自動的に再ロード]の話ではなく、 更新自体が感知されていないようで…。 VC6というより、OS側の問題っぽい気もしますが… 原因を御存知の方、アドバイス頂ければ幸いです。
日本語学校にワープロを教わりに来たようなもんだな
372 :
369 :2006/03/09(木) 12:08:40
以前は普通に答えていたけどな
俺はここでいいと思うけど、固有のスレのほうが答えられる人間がいるのではとも思う。
>>375 > 俺はここでいいと思うけど
「アプリの使い方」と「C/C++」に何の関係があるのかと(ry
377 :
デフォルトの名無しさん :2006/03/09(木) 18:09:52
Win32のアプリケーションです ダイアログリソースでダイアログと、そのコントロールを作って、 コントロールに"〜のコントロールにマウスが乗った・外れた""フォーカスが入った" などを調べたいとき、どうしたらいいですか? 最初、素直にダイアログプロシージャのWM_MOUSEMOVEメッセージから来るマウスの位置から調べようと思ったのですが、 Static Text以外のEdit Control上とか、Radio Button上とかではWM_MOUSEMOVEメッセージが来ないので…
>>377 ・サブクラス化
・WM_NCHITTESTを捕まえてポインタ位置とコントロール位置の比較
お好きなようにどうぞ
あとスレ違いな
>>378 これはすまんでした。
え〜っと、WM_NCHITTESTもWM_MOUSEMOVEと同様に、
エディットコントロール上やラジオコントロール上だと、マウスのポインタ位置が取得できません…
(そもそもメッセージが来ない)
Win32APIスレに行ってきます…
381 :
デフォルトの名無しさん :2006/03/10(金) 00:14:07
一般的にどのレベルまでできるようになると 初心者から中級者、上級者というくくりになるんですか?
>>381 そんなくくりは一般的には無い。そんなくくりに意味は無いから気にスンナ。
383 :
デフォルトの名無しさん :2006/03/10(金) 08:46:19
自作のウィンドウシステムみたいなのを作ってるんですが、 どういう設計にしたらよいか分からないので教えてください。 まず、ウィンドウのパーツ(コントロールと呼びます)類のクラスがいろいろあります。 ボタンクラス、スクロールバークラス、フレーム(ウィンドウの枠)クラス、等です。 これらは全て共通の基底クラスから派生していて、その基底クラスには 「それぞれのコントロール類が発行するイベントメッセージを処理させる関数へのポインタ」 をメンバ変数として持たせています。 とりあえず「コントロール自身のID」と「メッセージの種類」を飛ばせればよいので の関数ポインタの型は、「void (*)(int, int)」とします。 それでここが問題なのですが、 例えば「スクロールバークラス」の内部にメンバとして「ボタンクラス」のオブジェクトを持たせ、 上下左右のスクロールボタンとして使いたい場合、 このボタンオブジェクトが持つ「メッセージ処理関数へのポインタ」には 「スクロールバークラスのメンバ関数へのポインタ」を指定したいので、 「void (*)(int, int)」では型が合いません。 また、このウィンドウシステムをライブラリ化してユーザーに使ってもらうときなどを考えた場合、 ウィンドウをまとめて管理したいためにマネージャクラスなんかを作って そのクラスのメンバ関数でメッセージ処理などをしたくなるでしょうから、その時も型の問題が出てきます。 こういう場合、皆さんだったらどういう設計にしますでしょうか? 何か使えるテクニックなどはありますでしょうか?
384 :
383 :2006/03/10(金) 08:51:27
もちろん、全てのメッセージ処理関数を グローバルで定義すればこれでもいけるのですが、 それでは使い勝手も悪いし気持ち悪いので、 どうにかすっきりした方法があれば知りたいです。お願いします。
わからないのに何で作ろうと思うんだろ・・・
>>383 まず、既存のウィンドウ系システム(WindowsやX-Windowなど)が、
どの様な作りになっているのか、を調査するべき。
>>383 void (*)(int, int)ではなく、boost::function<void (int, int)>にすれば解決。
え、ABI?何それ。
この板に初めて来ました 私はある工学部の学生ですが,今の分野ではやりたい就職がないのでC言語をやろうと思ってます。 そこですぐに勉強を始めたいのですが,CやC++などはどの言語を勉強するべきなのでしょうか? 初めはどのような参考書から始めるべきですか?
そんな理由で始められてもどうせ物にならないので、あきらめれ
書店でC++ Primerを手に取る→重さにめげて挫折。 オススメ
392 :
383 :2006/03/10(金) 11:12:54
>>387 なんかとても便利そうなのですが、
それを使えばどんなクラスのメンバ関数へのポインタだろうが
グローバルで宣言された普通の関数へのポインタだろうが
入れられるんですかね?
とりあえず、
boost::function1<void,UINT> m_MsgFunc;
のように「メッセージ処理関数へのポインタ」のメンバ変数を定義して、
void SetMsgFunc(boost::function1<void,UINT> pfunc){m_MsgFunc = pfunc;}
と、ポインタのセッターを作って、
m_hoge->SetMsgFunc(&CBar::MsgFunc)
と呼んでみたらエラーがでました。(boostの中のほうで)
書き方はこれであってますでしょうか。
あとABIってなんですか。
これ使うとなんか問題があるんでしょうか?
>書店でC++ Primerを手に取る→通学時に読破して無事ガテンの道へ こうですか? わかりません。
書店でC++ Primerを手に取る→頭上に持ち上げる→手を離す
必要なページだけ破いて持ち帰ればいいんだよ
398 :
383 :2006/03/10(金) 13:13:06
なんかワケわかんなくなってきました。 「返り値の型」や「引数の数や型」が同じでも、 あるクラスのメンバ関数へのポインタとグローバルな関数へのポインタは 同じ関数ポインタに入れられないのは分かりましたが、 ではまず、boost::functionを使うことでこの問題の何が解決するんですか? これを使うことでメンバ関数かグローバル関数かの違いを吸収できるのかと考えたのですが、 そうかと思っていたらそうでもない様子でboost::bindを使えとのこと。 ではboost::functionの意味とはなんなのでしょうか?
>>398 関数オブジェクト(bindしたものなども含む)と普通の関数の違いを吸収できるとでも言えばいいかな。
>>398 お前、言われたそばからまた自分で調べずにわめいてるだろ。
とりあえず bind 試してみるぐらいしろよ。
401 :
383 :2006/03/10(金) 14:00:59
書き方がさっぱりわかりません。 誰かサンプル書いてください。 もう禿げそうです。
君には無理、あきらめろ
403 :
383 :2006/03/10(金) 14:06:32
お前に聞いてないから返っていいよ。
404 :
402 :2006/03/10(金) 14:18:56
お前に言ってないから返っていいよ。
405 :
383 :2006/03/10(金) 14:26:49
俺に言ってないなら俺は帰らなくていいですね。 よかったです。でもあなたは帰ってくださいね。 質問スレに必要のない邪魔なだけの存在ですから。
#include <iostream> #include <boost/function.hpp> #include <boost/bind.hpp> class Hoge { public: void f(int x, int y) {std::cout << x << ' ' << y << std::endl;} }; typedef boost::function<void (int, int)> Handler; int main() { Hoge x; Handler h = boost::bind(&Hoge::f, x, _1, _2); h(10, 20); } 俺はboost::signalもC#のイベントっぽくて悪くなさそうに思うが。
407 :
402 :2006/03/10(金) 14:29:17
俺に聞いてないなら俺は帰らなくていいですね。 よかったです。でもあなたは帰ってくださいね。 質問スレに必要のない邪魔なだけの存在ですから。
408 :
402 :2006/03/10(金) 14:57:15
あんっ……やめて……そんなに……激しく答えられたら……私の………いゃ……ぁ…………
409 :
383 :2006/03/10(金) 15:01:06
うざいなぁ
>書き方がさっぱりわかりません。 >誰かサンプル書いてください。 こいうことを書く基地外がいるから荒れるんだよ。 本でも買ってくれば?
411 :
383 :2006/03/10(金) 15:12:26
>>406 すいません、↓みたいな事をやりたいとしたら正しくはどう書いたらよいですか?
bind の意味とか書式が解説読んでも何やってるか全く理解できないです。
class Hoge
{
public:
void f(int x, int y) {std::cout << x << ' ' << y << std::endl;}
};
typedef boost::function2<void ,int, int> Handler;
void gfunc(int x, int y) {std::cout << x << ' ' << y << std::endl;}
int main()
{
Hoge x;
Handler h = boost::bind(&Hoge::f, x, _1, _2);
h(10, 20);
Handler g = gfunc;
g(100,200);
}
412 :
383 :2006/03/10(金) 15:15:56
>>410 説明されてもわからないから、サンプル書けって言ってるだけなんだが。
何が悪い?
413 :
383 :2006/03/10(金) 15:17:47
>>412 説明してもわからないから、本買えって言ってるだけなんだが。
何が悪い?
415 :
383 :2006/03/10(金) 15:22:05
>>414 説明の仕方が悪いんじゃね。本買えで済んだらこのスレいらないじゃん。
説明しても分からない奴はこのスレに来る以前の問題だと思う。
いつまで釣られてんだ
>>411 正しいも何もそれでコンパイルできると思うが。
419 :
383 :2006/03/10(金) 15:52:15
>>418 error C2440: 'initializing' : '' から 'class boost::function2<void,int,int,int>' に変換することはできません。(新しい動作 ; ヘルプを参照)
というエラーがでました。VC6ですけど
もしかしてコンパイラが対応してないとか…
言われた事そのまま実行するだけなら、オマイいらないじゃん。
421 :
383 :2006/03/10(金) 16:08:24
消えろキチガイ。
嵐を呼ぶ男だなw
sageて書き込め いけぬまさん
>言われた事そのまま実行するだけなら、オマイいらないじゃん。
その通り、いけぬま
>>383 はこの世に必要ない
少なくとも日本の社会には必要ない
426 :
383 :2006/03/10(金) 16:15:59
ここもID表示するようになればいいのに
テスト
428 :
383 :2006/03/10(金) 16:21:52
Handler g = &gfunc; にしたらいけました。とりあえずなんか凄いのは分かりました。
430 :
383 :2006/03/10(金) 17:10:15
>>429 こういうことをやりたいときに結構ありがちな問題なんですかね、もしかして。
でもちょっと見たところ難しそうです。
きっと後で参考になると思うので保存しておきました。ありがとうございます。
でも、とりあえずbindとfunctionを使ったやり方を知っておきたいです。
ですがいまだにbindの意味がわかりません。
どなたか、↓を日本語ふうに訳していただけませんでしょうか。
Handler h = boost::bind(&Hoge::f, x, _1, _2);
はんどらー えいち いこーる ぶーすところんころんばいんどかっこあんぱさんどほげころんころんえふかんま えっくすかんま あんだーばーいちかんま あんだーばーにとじかっこせみころん
432 :
30 :2006/03/10(金) 17:22:58
今更ながら恥ずかしい限りですが教えてください。 char* s; という変数があって、上記変数に値を代入した後 int hogehoge( const char* a ) という関数に渡したいのですがエラーになります。 どうすればいいのでしょう?
どう渡したらどういうエラーになったのか。
>>430 boost::bind(&Hoge::f, x, _1, _2)は
boost::bind(boost::mem_fn(&Hoge::f), x, _1, _2)と考えることができる。
boost::mem_fnはメンバ関数呼び出しを、普通の関数オブジェクトへ変形する効果がある。
つまりa = boost::mem_fn(&Hoge::f)とすると、
x.f(10, 20)というのはa(x, 10, 20)と同じことになる。
void f(int, int);
b = boost::bind(f, 2, _1);
というのがあったとして、b(5)というのはf(2, 5)と同じことになる。
bindの中の_1は、(bindが返す関数オブジェクトが呼ばれたときの)1番目の引数を意味する。
元のfは2引数あったが、bindで1つ目の引数に2を束縛したので、bは1引数で呼ぶことができるようになったというわけだ。
a(x, 10, 20)のように、aを呼び出すには3引数必要だ。
そこをbindで最初の引数にxを束縛させて、2引数(これはちょうどHoge::fの引数に一致する)で呼べるようにしている。
それをhに代入しているという具合。
435 :
30 :2006/03/10(金) 17:51:06
const char* と char* には互換性がありませんというようなエラーです。
int hogehoge( const char *a ){ char *s; s = a; .... } というふうにはできない 変数aとsの両方ともにconstつけるか、はずせ
あ、ごめん、違うね
439 :
デフォルトの名無しさん :2006/03/10(金) 19:00:04
基本的すぎる話なんですけど… char *ItoS(const int i){ static char DtoS_Buf[32]; sprintf(DtoS_Buf, "%d", i); return DtoS_Buf; } int main(){ int i = 73; //1001001 char str_buf[128]; //動作1 printf( strcat( strcat( strcpy(str_buf, ItoS(i >> 4)) ,ItoS(i & 15)) , ItoS(i))); printf("\n\n\n"); //動作2 strcpy(str_buf, ItoS(i >> 4)); strcat(str_buf, ItoS(i & 15)); strcat(str_buf, ItoS(i)); printf(str_buf); printf("\n\n\n"); } 動作1(444)と動作2(4973)で実行結果が違うのはなぜ?
>>439 よく、そんな鼻から悪魔が出る様なソースを思い付けるね
>>432 char * s = "foo";
hogehoge(s):
でエラーが出ると言うことか?
それならば、
const char * s = "foo";
hogehoge(s);
とすればいい。
>>439 ItoS()の静的バッファは唯一のものなので、呼び出しごとに再利用されることになる。
従って、動作1ではたまたま最後に呼ばれたItoS(i >> 4)の結果が保持され、
それが3回str_bufに連結されたわけだ。
文字列を返す関数を作る場合、以下の3つの戦略があるわけだが、結局1が尤も妥当と言うことになる。
1. 呼び出し側でバッファを用意し、それを関数に渡して格納してもらう。
→呼び出し側で用意したバッファの長さは別途関数に渡す(strftime()流)か、お任せにする(gets()流)。
2. 関数側でメモリをアロケートしそこに格納し、呼び出し側に戻す。
→呼び出し側で後ほど確実に解放する必要がある。これはしばしば忘れられてメモリリークの原因となる。
3. 関数側で静的バッファを用意してそこに格納し、呼び出し側に戻す(>439の戦略)。
→呼び出し側では即座に値を引き取る必要がある。また、マルチスレッド対応できない。
番外. C++の文字列クラスのような安全な文字列を返す。
ファイラーを造りたいと思ってます。 いろいろかんがえてみたのですが(FindFirstFileとレジストリを直接いじってみたり)、右クリックしたらExplorerと同じメニューが出るようにしたいのです。 いろいろなファイラーでもそのようになっているので可能な関数か、構造体などがあると思うのですが。 いちいちレジストリを呼び出しているようにも見えません。 どなたか簡単にその方法を解説していただけませんでしょうか。 参考サイトやソースコードなどもあったらお願いいたします。
>>439 まだ納得いかないかもしれないので
>>442 の説明に補足させてもらう
>>439 のコードでも、処理系によっては動作1と2が同じ結果になることもある
ようするに、関数呼び出しにおいて引数を評価する順番は処理系定義であるからだ
たとえばわかりやすいコードを示すと
int num(){
static int i = 0;
i += 1;
return i;
}
という関数について
printf("%d, %d", num(), num());
とすると、どちらのnum()が先に呼び出されるか次第で、表示される結果が異なるのがわかるだろうか?
ようするに、
>>439 の動作1の結果は後ろの引数から順番に評価された結果ですな
どういうことかしらないけど、自分が試したことについて言うと
Visual C++ 2005で、Debug版とRelease版か、というだけでも
引数を評価する順序が異なることがたびたびあった
最適化の違いかな?
ちなみに
>>439 のコードも2005でReleaseビルドすると同じ結果になった
445 :
439 :2006/03/10(金) 22:57:23
>>440 >>442 >>444 やっと解りました。
関数の評価の順番は必ずしも毎回同じとは限らないんですね
勉強になりました。ありがとうございました。
その辺でバグが出るとやっかいだよなー
>>443 IShellなんちゃらっていうCOMインターフェースを使った希ガス
>>447 ありがとうございます。
早速調べて試してみます。
もしまた解決しないことが出てきたらよろしくお願いします。
>>444 初めて知った。こりゃ順番通りに書いてったほうがいいや
atan2(rand(), rand()); みたいなプログラム書いたときに 「Seed値同じなのに、DebugとReleaseで結果が違うぞ!」 っていうので死ぬほど悩んだな まさかこの式が原因だとは思いつかなくて問題の絞り込みが全然うまくいかなかった
451 :
383 :2006/03/11(土) 07:27:20
>>434 ありがとうございました。
大変丁寧に教えていただいて、
今整理しているところですがこれなら理解できそうです。
ひとまず、ありがとうございました。
452 :
30 :2006/03/11(土) 08:59:41
>442 > それならば、 > const char * s = "foo"; > hogehoge(s); > とすればいい。 そうしたいの山々なのですが、実は某SDKで提供されてるグローバル関数 int acedGetString( int cronly, const char * prompt, char * result); で取得した result を int strcoll( const char *string1, const char *string2 ); に渡して文字列比較したいのですが、互換性がないというエラーがでます。 acedGetString() は使わざるを得ないので頭を痛めてます。 基本的に char* と const char* はキャストできないと考えるべきなのでしょうか?
>>452 char* → const char* は暗黙の変換が効く。
const char* → char* は明示的なキャストが必要。
で、さっきから例で挙げられているパターンでは
暗黙の変換が効くはずなんだけど、ほんとに書いてあるケースで
エラーが出てるの?なんか勘違いしてるんじゃないの?
エラーメッセージもソースもコピペで貼ってほしいな。
454 :
デフォルトの名無しさん :2006/03/11(土) 09:13:05
質問があります。windowsのドスプロンプトでディレクトリのファイル一覧を表示させる プログラムを作成していますがファイルを表示することはできましたがタイムスタンプ の年だけ表示しようと思っても AUTOEXEC.BAT 3204 boot.ini 3204 bootfont.bin 3204 CONFIG.SYS 3204 マイ ダウンロード 3204 のようになり、全然年が表示されません(変な値になる)。 どこがいけないのか教えてください。お願いします(以下プログラムの一部) HANDLE fhandle; WIN32_FIND_DATA win32finfo; FILETIME filetime;//ファイルタイム構造体 SYSTEMTIME systemtime;//システムタイム構造体 fhandle = FindFirstFile("C:\\*.*", &win32finfo); if (fhandle == INVALID_HANDLE_VALUE) exit(0); do { printf("%s", win32finfo.cFileName); GetFileTime(fhandle, &filetime ,NULL ,NULL); FileTimeToSystemTime(&filetime,&systemtime); printf(" %d \n",systemtime.wYear); } while (FindNextFile(fhandle,&win32finfo) != 0); }
>>454 GetFileTime() の引数はファイルハンドル。
fhandle は検索ハンドル。ファイルハンドルじゃない。
>>454 WORD 16-bit unsigned integer.
あ、>456はスルーで。 #何勘違いしたんだろ。
>>454 失敗する可能性のある API の戻り値をテストしてないのがいけない。
459 :
デフォルトの名無しさん :2006/03/11(土) 09:38:48
>>454 です。
有難うございます。でわ恐らく直接
WIN32_FIND_DATA構造体の中のFILETIME ftCreationTimeとFileTimeToSystemTime
を組み合わせて表示するのですね。
皆様有難うございました。
>>459 一般に「タイムスタンプ」って言ったら ftLastWriteTime のことだと思うよ。
461 :
デフォルトの名無しさん :2006/03/11(土) 10:00:30
例えばこのようなファイルがあります 「 あかさたな/ はまやらわ/ いきしちに/ ひみゆらわ/… 」 これをfopenで開きfscanfとforで、は「まやらはから」%s/でtempに検索保存したいのですが「はまやらわ」から検索できません fseekを使わずに正常に検索保存するためにはどうしたらいいでしょうか?
462 :
デフォルトの名無しさん :2006/03/11(土) 10:06:20
環境はMACOS9.2 使用アプリmi2.0、コンパイラMWP SIOW APP
>>461 人に通じる文章になっていないからコードを張りなさい。
464 :
デフォルトの名無しさん :2006/03/11(土) 10:06:54
>>461 ファイルがテキストな時点で上から下まで読んでくしかないでしょ?
465 :
461 :2006/03/11(土) 10:07:46
466 :
デフォルトの名無しさん :2006/03/11(土) 10:33:03
str=%d vit=%d dex=%d men=%d int=%d HP=%d MP=% ---- ファイヤーボール/%d アイスストーム/%d サンダーフレア/%d 実際のファイルです これからfscanfで----\n%s/%dを forを使って繰り返しさせて見たのですがうまくいきません
ファイアーボールの行しか保存できないと言いたいんだろうか。
>>466 それは実際のファイルじゃないっしょ?
実際のファイルってのは
ファイヤーボール/10
アイスストーム/20
サンダーフレア/40
とかなってんじゃないの?
それとも本当に%dとかなってんの?
よく #ifndef AAA #define AAA 1 #endif ってありますが、これってtypedefでも通用するのですか? つまり #ifndef BBB typedef short BBB #endif みたいな
なぜ試さない・・
今、Cの超初心者向けの本を何とか一通り読み終わった程度の理解度なのですが、 C++のコードを読めてなぞれるようになるまでどれくらいの期間が必要なんでしょう コードの内容は大学の物理化学、計算後に簡単な3Dグラフィックの表示を行うものです
>>472 普通の分野では人ごとの能力差は数倍からせいぜい10倍程度のものだけど、
プログラミングにおいては数百倍以上の生産性の差がつくこともあると言われてる。
もし、自分に適性がないと思ったら早々にあきらめるのが吉。
>>472 宿題スレで、人の出したC++の設問に何回か答えてみるといい。
かなりC++を勉強したはずなのに、なかなか答えを書くのに時間が
掛かりすぎるようだと、適性があまりないかもしれんね。
まず
>>474 は人生諦めた方がいいんじゃないだろうか。
人間に適性がなさそうだから。
VC++で、 typedef char sint8; sint8 s[] = "abc"; sint8* a = s; strstr( a, "abc" ); だと通るのですが、 typedef signed char sint8; sint8 s[] = "abc"; sint8* a = s; strstr( a, "abc" ); だと、 error C2664: 'strstr' : 1 番目の引数を 'sint8 *' から 'const char *' に変換できません。 とコンパイルエラーがでるのは何故ですか? char型がsignedかunsignedかは環境依存だからということですか?
>>477 cout << (typeid (char) == typeid (signed char)) << endl;
cout << (typeid (char) == typeid (unsigned char)) << endl;
charとsigned charとunsigned charは全て異なる型。
でも、intとsigned intは同じなんだな。 よくわからん。
481 :
477 :2006/03/11(土) 15:24:32
intは常にsignedですが、charはsignedかunsignedかは環境依存です。
>>482 最近の規格ではどっちかに既定されたんじゃなかったっけ?
char→文字型 signed/unsigned char→整数型
485 :
デフォルトの名無しさん :2006/03/11(土) 16:35:53
VC++6.0を使っていますが、全部のヘッダに#pragma once って書いてるのに error LNK2005: "public: virtual void __thiscall 〜はすでに 〜 で定義されています みたいなエラーがでまくるんですけど、 なぜか分かるエスパーの方はいらっしゃいませんでしょうか?
>>485 リンクの段階だから、その関数の実体が複数あるんじゃないか?
>>485 ヘッダにメンバ関数定義を書いてるんじゃないか?
その場合、クラス定義の内部に書かないといけない。
488 :
デフォルトの名無しさん :2006/03/11(土) 16:47:44
>>486 申し訳ないですがもうちょっと偏差値低い人用に平易に教えていただけないでしょうか。
例えばどんな状態でしょうか?
あと、ヘッダのなかで
class CHoge{
CAge* age;
}
みたいな定義をするとしたら、普通は
CAgeを定義してるヘッダを#includeしないと駄目ですよね?
今眺めてるサンプルは、そのサンプルのオリジナルなクラス型のメンバがあるにもかかわらず
何も#includeしてなくてもなぜかコンパイルできるんですけど、
理由がさっぱりわからないです。
なもんで試しにCHogeの中に自分で適当に作ったクラス型のメンバを追加してみると、
やっぱりそれに関してはちゃんとそれを定義したヘッダを#includeしないと
そこだけエラーになってかなり謎なんですが、いったいどういうことでしょうか。
>>487 あ!!それかも知れません。ちょっと直してみます。
469みたいなのができないなら どうすればtypedefを #ifndef AAA #define AAA 1 #endif みたいにできますか?
>>491 inline付けとけばクラス定義の内部に書かなくても大丈夫
>>492 #ifndef AAA_DEFINED
#define AAA_DEFINED
typedef ほげ AAA;
#endif
>>492 #ifndef AAA_DEFINED
typedef short AAA
#define AAA_DEFINED
#endif
みたいにすればどうでしょうか?
>>493 件のサンプルではinlineは特に見当たらないです。。
ごく普通に別ファイルで定義&実装されているクラスを使っているにもかかわらず
ヘッダーをインクルードしないで使えています。
自分で試しに定義したクラスはやはりヘッダをインクルードしなければ使えません。
むしろこれが普通だと思うのですが、他に何か考えられる事ってあるでしょうか。
>494-495 ありがとうございます。 たしかにこのやり方しかなさそうですね。 なぜこの質問をしたかというと、仕事でOSの入れ替えがあったのですが エラーでBOOLがおかしいと怒られました。 原因は、ユーザ定義ファイルで typedef unsigned char BOOL と設定してあり、昔のOSではそのような定義がされていませんでした。 なので正常でしたが、新しいOSにはあらかじめ typedef int BOOL となっており、エラーが出ました。 その回避方法を探していたんです。 (結局今は、ユーザ定義ファイルのBOOLを削除しました)
499 :
デフォルトの名無しさん :2006/03/11(土) 17:27:38
//超初心者質問で申し訳ありませんがよろしくお願いします。 main() { printf("うるう年を表示します\n"); //←この行を入れるとエラー、消すと正常に作動する int y; for (y = 1900; y <= 2000; y++) { if ((y%4 == 0 && y%100 != 0 )||y%400 == 0) { printf("%d", y); printf("年\n"); } } printf("Enter押せば終了"); rewind(stdin); getchar(); return 0; } //例のprintf行を入れると、なぜかint行あたりで //エラーE2140ここでは宣言はできない(関数 main )というエラーが出ます。 //どうしてなのか教えてくらはい。
500 :
デフォルトの名無しさん :2006/03/11(土) 17:32:38
500!! int y の後ろにprintfをおいてみれば?
表\示
502 :
499 :2006/03/11(土) 17:48:46
ありがとうございました。 int y; の後ろに printf 入れたら上手くいきました。 どうしてなんですか?教えてください。
Cでは変数宣言はブロックの先頭で行わなければならない。
ただし、C99では大丈夫。
505 :
499 :2006/03/11(土) 18:04:17
ブロックとは{}で囲まれた範囲のことですよね。 分かりました、ありがとうございました。
>498 OSの入れ替えでBOOL?よくわからんが・・・
OSと開発ツールの区別がついてないんだろ。
組み込み系です。 OSを大昔のITRON(HI-SH77の昔のもの)から最新のITRON(NORTi4.0)に変えた仕事です。 オープン系とは違い電源投入直後の処理からOSの設定などしないといけないんですよ。 ようやく一人前になりかけた?段階なので、色々とがんばります。
509 :
デフォルトの名無しさん :2006/03/11(土) 18:31:45
最近c始めたんですが皆さんはどういったやりかたで覚えたのでしょうか? 本読んでプログラム書いての繰り返ししかないのかな…周りに知ってる人いないからつらいorz
ここに沢山居るじゃないか。
>>509 おれも周りにプログラミングやる人などいなく、完全に独学だ
たしかに本を読むだけじゃなかなか身に付かないかもしれない
たくさんプログラム書いて、あとは慣れじゃないかな
>>508 老婆心だが、μITRONはOS仕様のバージョンが異なると、
同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
>513 たしかに、今色々調べていたら違いがありました なにしろ旧OSのヘッダが92だの95だの数字がありました。(つまり1995年もの) コンパイラもSHC4.1Aというかなり古いものでしたし(今最新は9.0) ただ、気になったのは私も仕事をするようになり色々とCを勉強するようになりました。 独学はモチベーションが上がりづらいですが、がんばってください。
>>513 >同じAPI名でも振る舞いが異なる可能性があるから気をつけろ
これってAPI設計者が絶対に避けるべき事なんじゃねーの?
まぁその所為で、Win32APIみたいに名前と型・用途が一致してないのが出てくるわけだが
モチベーションが上がらないのは目的のない独学だろ。
>>472-
>>475 ありがとうございます。
適性があるかどうかも分からん状態なので、しばらく勉強してみようと思います。感謝です。
適正なんてものを気にするようではおしまいだ やりたいことをやって生きていけることこそが幸せ
>>515 仕様書に書かれてあることを実装していれば問題ないことになっている。
もっとも、APIの細かい動きが異なると当然再利用がしにくい。
それを解消しようとして、T-Engineが生まれたわけで。
たしかに弱い標準化だからね>ITRON 強い標準化にしようとT-Engineを生んだんだけど実際どうなんだろう・・・
521 :
デフォルトの名無しさん :2006/03/12(日) 05:03:48
ActiveX コントロール初体験です。 FLASH(開発環境の方)は手元にないのですが、 ActiveXコントロールのShockwave Flash Objectを使ってswfファイルを読み込み、 ダイアログ上のFlash Playerコントロールで再生させることはカンタンに出来るのですね。 ところでFlash Player内のオブジェクトがクリックされるなどイベントが起きたとき、 外部に何かメッセージは出しているのでしょうか?またFLASH開発時の設定次第で出すことは可能なのでしょうか? それをFlashPlayerコントロール利用側のwindowsアプリで受け取ることが出来るのかなとふと思ったもので。 また逆に、windowsアプリ側からFlashPlayerコントロールに向けてメッセージを送ることは出来るのでしょうか?
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16); wchar_t foo[16]; memset(foo, 0, 16*sizeof(wchar_t)); _i64tow_s (hoge,foo,16,16); String ^tmp = gcnew String(foo); UInt64 hogeを入力したら、16進数変換して、文字変数tmpを返す処理を 関数化したいのですが、書き方を教えてもらえませんか UInt64 hex_convert(UInt64 hoge) { wchar_t foo[16]; memset(foo, 0, 16*sizeof(wchar_t)); _i64tow_s (hoge,foo,16,16); String ^tmp = gcnew String(foo); return foo; } : error C2440: 'return' : 'wchar_t [16]' から 'System::Type' に変換できません。 となってしまいます。
523 :
522 :2006/03/12(日) 10:12:20
失礼しました 環境はVisual Studio 2005 VC8で CLRオブジェクトを作成しています。
>>523 CLRはスレ違いという気もしなくもないが、hex_convert()は文字列を返すべきなんじゃないの?
String hex_convert(...) {...; return tmp;}とか。
>>524 さん、ありがとうございます
CLRはスレは初心者の質問は今後スルーするそうなので、行き場が無くて
ここで質問させて頂きました
呼び出す形がString型なので
↓の様に書き直したら、: error C2065: 'tmp' : 定義されていない識別子です。
となりました、関数内で
String^tmp=gcnew String(foo);
と定義してるのですが、駄目だと思ったのですが本体側で
String^ tmp;
と定義してもエラーは出ませんが、変数tmpの中身が空になってしまいます。
String^ hex_convert(UInt64 hoge)
{
wchar_t foo[16];
memset(foo,0,16*sizeof(wchar_t));
_i64tow_s(hoge,foo,16,16);
String^tmp=gcnew String(foo);
return tmp;
}
本体側のソース
{
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
//String^ tmp;
hex_convert(hoge);
textBox2->Text = tmp;
}
String^hex_convert(UInt64 hoge){ return String::Format("{0:X}",n); }
527 :
526 :2006/03/12(日) 11:51:13
あ、間違い間違い × hoge ○ n
>>526 さんへ
String^hex_convert(UInt64 hoge)
{
wchar_t foo[16];
memset(foo,0,16*sizeof(wchar_t));
_i64tow_s(hoge,foo,16,16);
String^tmp=gcnew String(foo);
return String::Format("{0:X}",hoge);
}
hoge
: error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)' : 1 番目の引数を 'unsigned __int64' から 'System::String ^' に変換できません。(新しい機能 ; ヘルプを参照)
n
: error C2065: 'n' : 定義されていない識別子です。
となってしまいます。
orz
いいから帰れよ。スレ違いだっての。
>523 だから何で初心者がC++/CLIなんてゲテモノに手を出す? 初心者だと自負するなら、やめろ。
>>528 C++/CLIスレにいたときから全く進歩していないな。
そんなんだから追い出されるんだよ。
inline System::String^ hex_convert(System::UInt64 n)
{
return n.ToString("X");
}
#include <iostream> void newtest(int** test) { *test = new int[5]; //配列確保 printf("%d",sizeof(*test)); //配列のサイズを表示 for(int i=0;i<5;i++) //配列にデータ詰め込み *test[i] = i; } int main() { int* test; newtest(&test);//配列確保 return 0; } int型ポインタを専用の関数にポインタへのポインタの形で渡して配列確保をしたいんだけど、 どうしても1個分しか確保されてないっぽい 以前作ったCのプログラムではこの形でできてたような気がするんだけど・・
>>532 もしかして、sizeof(*test)の値みてそう思っている?
newしたサイズではなく、testのサイズが帰っているんじゃないかな。
実際に入れた値を確認してみたらいいよ
>>532 × *test[i] = i
○ (*test)[i] = i
>>532 sizeof(*test) = sizeof(int *)
であって、要素数とは無関係。
動的に確保した配列の要素数をsizeofで得られますっけ?
得られない。 sizeofはコンパイル時に静的に求められる。
538 :
532 :2006/03/12(日) 17:49:04
質問1 #pragma asmと__asmはどちらもCの中にアセンブリを埋め込むものだと思うのですが 違いがわかりません。違いを教えてください。 質問2 #define AAA int と typedef int AAA はどちらも同じ気がしますが、型名を変更する際は基本的にtypedefを使う理由は何ですか? とりあえず#defineはプリプロセッサでtypedefはコンパイラで解釈するということはわかったのですが それ以上のメリットデメリットなどがわかりません。 教えてください。
>>539 1について
#pragmaも__asmも環境依存だから一概には応えようがない。だから、違いは
あなたの環境に添付されている説明に従う。ヘルプを見ればあるかも。
2について
#defineは、通常置換後の名前でしか表示されないからコンパイラが吐いた
エラーが読みにくくなるしデバッグもしにくい。だから、できる限りインクルード
ガードくらいでしか使わないようにしてる。
C++においては#defineは名前空間をまたいでしまうので、A::AAAとB::AAAが
区別できなくなるために嫌われることが多い。ただ、あえて名前空間を跨ぎたい
時には#defineの方が便利。例えばboost見たいな(いい意味で)変態的ライブラリは
ないと困る部分があるのかもしれない。
>>539 #define AAA int*
typedef int* AAA;
この2つだと const AAA の型が違う結果になる。
>>539 質問2:
前者はshort AAA foo;ができて後者はできない。
543 :
デフォルトの名無しさん :2006/03/12(日) 20:42:55
メンバにwstring m_wtext を持ってるクラスCHogeがあります。 CHogeのコンストラクタのなかで m_wtext.empty(); m_wtext = L"あああ"; MessageBox(NULL,narrow(m_wtext).c_str(),"",NULL); のようなことをしてみると、なぜか文字列がヘヘヘヘへ・・・・ンンンンのように既に壊れて表示されます。 narrowはCHogeの基底クラスで定義されている、wstringをstringに変換する関数です。 string CBase::narrow(const wstring& input) { char* buffer = new char[input.size() * MB_CUR_MAX + 1]; wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX + 1); string result = buffer; delete[] buffer; return result; } 別のもっと単純なアプリの中で同じ事を試しても問題はでないのですが、 なぜか今回ちょっと大きめなプロジェクトに組み込んでみたところおかしくなりました。 アプリごとの何かしらの動作順序の違いかなにかでこういうことは起こり得ることでしょうか? でもコンストラクタのなかで関数を一個挟んだだけなのにアプリによって違いがでるというのは 理由がさっぱりわかりません。何かここが怪しげってところがあったら教えてください。 環境はW2k VC6.0++です。よろしくお願いします。
>>544 それだ!!
もう試す前から間違いないです。絶対それです。
すっかり忘れてました。
あなたは神ですか?
>>543 ちなみにその例なら、MessageBoxW(NULL, m_wtext.c_str(), L"", MB_OK);でいける。
MessageBoxWはWin 9xでも使えるから使っていいと思う。
初心者質問ですみません。 「3人分の番号、指名、給与、評価(a、b、c)を構造体型配列に格納して、 表示する」という問題に対してわけわかめながら以下のプログラムを 作ってみたのですが期待したとおりに動きません。 どこを直せばいいんでしょ、もしくは根本的に間違ってます? #include<stdio.h> struct person{ /* 構造体の宣言 */ int no; char name[20]; int salary; int point; }; int main(void) { int i; struct person menber[30]; /* 構造体変数と構造体配列の宣言 */ for(i = 0; i<3; i++) { scanf("%d", &menber[i].no); scanf("%s", menber[i].name); scanf("%d", &menber[i].salary); scanf("%c", &menber[i].point); } for(i = 0; i<3; i++) { printf("no:%d name:%s salary:%d point:%c\n", menber[i].no, menber[i].name, menber[i].salary, menber[i].point); } return 0; }
>期待したとおりに 期待した内容を書かずに分かるわけねぇだろ もうこなくていいよ。 ついでに氏ねば?
デバッグ放棄する奴って何考えてるんだろう。
頭おかしいんだろ。 それでこのスレで手直ししてもらおうって考えてんじゃねーの。
すみません、スレ汚しだったみたいですね。 ほんとに馬鹿で、情けないです。 もう消えますから、気にせず元の流れに戻ってください。
おまえら容赦ないなwww
初心者なら優しく教えてやるが 基地外に教えてやる必要はない どうせこんな感じだろ プログラムが思い通りに動かない → 何で俺の思い通りに動かねえんだよ 回答者がやりたいことを察してくれない → 何で俺の考えてることが伝わらねえんだよ
初心者以下の教えてクンは氏ね
初心者なのは全然かまわないが、他力本願な奴には教えたくない。
557 :
539 :2006/03/12(日) 23:01:11
>540-542 ありがとうございました。 ところで、Cにアセンブリを埋め込む際に、環境依存ではありますが __asmや#pragma inline_asm などありますが、それらを切り替える際に #if defined(AAA) #pragma inlene_asm 何かしらのしょり #else __asm{ 何かしらの処理 } #endif みたいにするとできると思うのですが、このAAAに何を入れれば よいのでしょうか?たぶんコンパイラごとに分ける必要があると思うので コンパイラごとで定義されているもの(例:_SHなど)を使用すればいいと思うのですが・・・
>>557 >コンパイラごとで定義されているものを使用すればいいと思うのですが・・・
答え出てるじゃん。
>>539 >質問2
・define:コンパイラに渡す前処理で、文字列の単純な置換を行う。
・typedef:ある型に対する別名を定義する。
根本が違う。
>>557 個別のコンパイラごとに調べていくしかない
>>550 ふつーにいる。
VCのコンパイルオプションみただけでぜってー動くはずねーのに終わったつもりでいやがるから、
「コンパイルして自分の環境で動くことは確認しましたか?」
って何回も聞いたのに
「同じこと何度も言わせないでください!確認しましたよ!」
とかブチキレるから「あー、直したのかなー」とか思ってたら、
ただ動かしてないだけでその場で何時間も他の人間の作業止めて悩む馬鹿。マジでいる。
ここまでアフォだと付き合ってられない級の奴はどこにでもいるっぽい。
563 :
デフォルトの名無しさん :2006/03/14(火) 12:01:51
フォーマットが不規則なテキストファイルをfscanfで読み込み変数に書き込むことは可能ですか? 例えば以下のようなファイルがあります 国語/70点 数学/82点 英語/68点 次の目標「平均80点をとる」 点数と目標の中の変数は任意に変化して この試行を5回繰り返します for if fopen fscanfで 何とかなりませんか? fscanf(fp,゙%s/%d%s/%d%s/%d゙,k1,s1,k2,s2,k3,s3);の先のやりかたが思い付きません
n/x点 で科目を表す「n」は家庭科だったり水泳だったり英語だったりなんでも対応できるようにするってこと?
565 :
デフォルトの名無しさん :2006/03/14(火) 12:20:15
文字列に文字列として入っている数値を DWORD型に変換したいのですが、どうしたらよいですか?
C標準にchar*>long変換のatol(const char* str)がある DWORDってunsigned longだけど大丈夫だろうか
素直にsscanf使っとけ
>>563 は、まずフォーマットの意味を辞書で調べ直す事から始めるべき。
>>565 sscanf(str,"%lu",&dwVal) ;
または
dwVal = (DWORD)atol(str);
MFC::CString使いなら
str.Format("%lu",&dwVal);
STL::string使いなら
sscanf(str.c_str(),"%lu",&dwVal);
#汚いコードじゃ…orz
多分boost使いならformatを使ってもっとエレガントにやる。
570だったり。 や、ごめ。嘘書いた。 MFC::CStringのFormatは出力にしか使えない。
>570 boost使いならlexical_castじゃないの?
570=571だったり。
>>572 その通り。
恥の上塗りだ…鬱出汁脳orz
回線切ってry
>>570 STL::stringならstringstreamじゃないの?
無駄に長くて申し訳ないです。。orz 途中までを記載しています。 kaze_tateの部分で計算がむちゃくちゃになるんですが、めちゃくちゃな答えに。 よくわからなくてごめんなさい。 ご教示お願いいたします。 #include <stdio.h> #include <stdio.h> int main(void){ double kaze,kaze_tate,kakudo,kakudo01; printf("風の強さ:"); scanf("%f",&kaze); printf("風の角度:"); scanf("%f",&kakudo); printf("\n"); if(kakudo == 1){ kakudo01 = 0.018; }else if(kakudo == 2){ kakudo01 = 0.035; }else if(kakudo == 3){ kakudo01 = 0.052; }else if(kakudo == 4){ kakudo01 = 0.070; }else{ kakudo01 = 0.087; } kaze_tate = kakudo01 * kaze; printf("%d",kaze_tate); return(0); } kakudo01が1でkazeが5だった場合、kaze_tateは0.09になるはず。 そして結果が表示されるまでに落ちちゃいます…orz
576 :
575 :2006/03/14(火) 18:56:57
動揺しすぎて日本語まで変に。恥ずかしい。
>>575 scanfでdoubleを読むときは%lf
printfは%fね
580 :
575 :2006/03/14(火) 19:03:48
ググルでコンソールを検索しましたが、まだまだ無知なようで意味がわかりませんでした。 ごめんなさい。 "C言語を始めよう"というエディタ?とBCC5を使っています。 実行するとコマンドプロンプトが開きます。
581 :
575 :2006/03/14(火) 19:04:56
>>578 あああ、まるっきり忘れてました…。
ありがとうございます。
>>579 う。それは普通に間違えました…orz
582 :
575 :2006/03/14(火) 19:12:09
最後に…
>>577-579 の方へ。
こんな質問にも答えていただきありがとうございました。
次のようなコードがあるのですが… //... template<typename T> class Queue{ //... template<typename U> friend ostream& operator<< (ostream&, const Queue<U>); //...α }; //実装 int main(){ Queue<class1> hoge; //... cout<<hoge; } コンパイルしようとするとリンカーが「undefined reference to 'std::basic_ostream...... &operator<< <class1>...」 と文句を言ってくるので α の部分を template<typename U> friend ostream& operator<< <>(ostream&, const Queue<U>); と変えてみたら今度は template-id 'operator<< <>' in declaration of primary template というコンパイラエラーが出てくるのですが、どのように対処したらよいのか教えていただけませんか?
すいません、g++の不具合だと分かり事故解決しました。
>>585 finallyはないが、環境によっては__finallyとして定義されてる。
tryブロック内で例外が発生したりして処理が中断されても__finallyブロック内は無条件で処理が行われる。
主にtryブロック内の後始末に使われることが多い。
C++にはRAIIがあるからね finallyは必要ない それにしてもひどいサイトだな>585
いや、だって参考文献から終わってるし
厨房ほど自己顕示欲があるのはどうにかならんのか ホームページなんか作らずに黙って勉強に励んでればいいのに
んなこと言ったら2chはどうなる
Windowsのリストビューコントロールで、仮想リストビューにするために、 各要素をvectorで持っておこうと思いました。 そのvectorの中から、条件に一致するものだけ表示ということがしたいのですが、 どういう風にやるのがいいんでしょうか。 class Elem ; //リストビューに表示する要素のクラス std::vector<Elem> v1 ; //要素のvector std::vector< std::vector<Elem>::iterator > v2 ;//v1の型のイテレータのvector 表示する要素へのイテレータのvectorを作って、 v1にはすべての要素を入れておき、 v2には、実際に表示する要素へのイテレータをいれ、 要素の参照はv2から行うということを考えたのですが、 これは方法としてどうなのでしょうか? もっといい方法はありませんか?
条件に一致したものを std::vector<Elem*> に突っ込んで使うとか?
>>594 それではstd::vector<Elem>::iteratorがElem*になっただけで本質的な違いは無いと思う。
596 :
593 :2006/03/17(金) 23:56:29
>>594 そもそも、vectorのイテレータは、
普通は、たんなる要素へのポインタになると思うのですが。
>>593 iteratorは生存期間が問題になるから、Elemがよっぽど大きくなければ普通に
std::vector<Elem> v2にcopy_if()かなにかでコピーすればいい希ガス。
WIN32APIが使ってあるCで書かれたソースをVC8でコンパイルすると error C2731: 'WinMain' : 関数はオーバーロードできません。 だと言ってくるんだけど、どうしたらええの? 因みにソースは猫のところのこんな奴どえす #include <windows.h> int WINAPI WinMain( HINSTANCE hInstance , HANDLE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL, (LPCSTR)"メッセージ・ボックスのテストです。", (LPCSTR)"猫でもわかるプログラミング", MB_OK); return 0; }
スマソ ×int WINAPI WinMain( HINSTANCE hInstance , ○int WINAPI WinMain( HANDLE hInstance , だった、結果はどっちも失敗だけど
>>598 それ、エラーの出たコード(自分の書いたコード)コピペしてる?
よくあるのが LPSTR と LPTSTR の違いなんだけど。
>>599 HINSTANCE で正解だろ。
第一引数も、第二引数もHINSTANCEだな。
>>601 proのほうです
文字セットはマルチバイトで
共通言語ランタイムサポートは/clr:pure
です
これでもムリッポした
#include "stdafx.h"
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance ,
HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
MessageBox(NULL,
(LPCSTR)"メッセージ・ボックスのテストです。",
(LPCSTR)"猫でもわかるプログラミング",
MB_OK);
return 0;
}
604 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 20:32:11
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
オーバーロードってことはどっかに二重定義しちゃってるんじゃないの?
windows.h の中に WinMain の宣言があるから、それと衝突してるんだろう。
>>603 普通にできたよ。hoge.cに
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
MessageBox(NULL,
(LPCSTR)"メッセージ・ボックスのテストです。",
(LPCSTR)"猫でもわかるプログラミング",
MB_OK);
return 0;
}
ってやって、コマンドラインから
cl hoge.c /link user32.lib
ってコンパイルしてみそ。
あれ、でもこれってC言語用だからオーバーロードもくそもねえよな もしかして拡張子cppにしてるとか? わしWinAPIようわからんが
cpp だったら extern "C" が要る予感。
611 :
607 :2006/03/18(土) 20:54:21
>>609 猫先生も、お疲れ気味かw
.cppにして試してみた。結果、相変わらず問題なかった。
>>609 まぁ、いいじゃねぇの?
HINSTANCEの定義: DECLARE_HANDLE(HINSTANCE)
DECLARE_HANDLEの定義: #define DECLARE_HANDLE(name) typedef HANDLE name
だしな
.\foo.cpp(7) : error C2373: 'WinMain' : 再定義されています。異なる型修飾子です。 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winbase.h(1875) : 'WinMain' の宣言を確認してください。 ビルドログは "file://d:\Visual Studio 2005\Projects\foooo\foo\Debug\BuildLog.htm" に保存されました。 foo - エラー 1、警告 0 winbase.h(1875)みたら WinMain ( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ); 後にも先にもWinMain定義してるのここだけだったし
それをキミが再定義してんだr
616 :
デフォルトの名無しさん :2006/03/18(土) 21:11:57
クラス確保していらなくなったら破棄するとかあるの? 放置プレイ?
あ〜 delete 使えばいいのか!
>>603 #include <windows.h>
を消して
#include "stdafx.h"
だけにしてみ
ちょっとあやふやなので教えてください。 int a[5] = {0,1,2}; と初期化した場合って、a[3]とa[4]て必ず0に初期化されますか? (C言語とC++の両方の規格上)
不定
>>607 コマンドラインから
cl hoge.c /link user32.lib
ってコンパイルしてみそ。
Microsoft .NET Framework SDK v2.0のSDK コマンド プロンプトだよね
>>618 error C2146: 構文エラー : ';' が、識別子 'WinMain' の前に必要です。
error C2065: 'HINSTANCE' : 定義されていない識別子です。
error C2146: 構文エラー : ')' が、識別子 'hInstance' の前に必要です。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
error C2059: 構文エラー : ')'
.\foooo.cpp(5) : error C2143: 構文エラー : ';' が '{' の前にありません。
.\foooo.cpp(5) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
になります
625 :
620 :2006/03/18(土) 21:39:57
レスありがとうございます。 これで安心して眠れます。
>>620 悩むくらいならちゃんと{0,1,2,0,0}って書けばいいじゃない(´・ω・`)
>>620 コンパイラによるけど、ANSI準拠なら、array[2][5] = { 0}で全部0に初期化されるはず
コンパイラ次第によると思う。
>>623 ええ〜違うってばよ〜なんで?
2005proなら、Microsoft Visual Studio 8\VCの下にvcvarsall.batってファイルが
あるでな、cmd.exeからそれを起動すんだ。
>>628 出来たけど、C++で出来ないのが残念だす
猫のHPも一応古くてもC++で解説してあるのに
orz
おお〜い、C++でできるべな〜 hoge.cをhoge.cppにしても問題ないがな。C++でできないって、 どういうことだがや?
>>629 ♪♪♪ d(`Д´)b♪♪♪サンキュ
ヮ(゚д゚)ォ!
できたお
ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
処でvcvarsall.batでコンパイルできるソースって、同じ場所じゃないと駄目なんだね
今までコンパイルできなかった、ソースもできるかも
((o(´∀`)o))ワクワク
しかし何でVC8のファイルダイアログからはコンパイルできへんのや
>>631 いや、ソースどこに置いてもいいがな。vcvarsall.bat実行したら、cdコマンドで
行きたいところ行きや。IDE使うと余計なオプションとか仰山つけおるから、
IDE使うときはよく確認し〜や。
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン cl hoge.c /link user32.lib >> hoge.txt こうしたら、コンパイルの吐き出す情報も良く分かるしNE^^ コマンドラインコンパイル(・∀・)イイ!! 昔に戻ったみたいだおwww
>>609 >>611 今はHINSTANCEだが、昔はHANDLEだった。
>>610 extern "C"を不要にするためにWindows.hの中の中ではextern "C"でWinMainの宣言がなされている。
>>613 それはSTRICTでないときの場合。今はデフォルトでSTRICTになっている。
CTime::TimeChk(2);←だめ obj.TimeChk(2←OK!
関数の名前は MovePos Move_Pos movepos Movepos 変数は map_x Map_X mapx MAPX MAPx どれがいい?
m_O_v_E_p_O_s M_a_P_x
THX がんばってみるわ! でも逆見にくいような・・・?
movePos mapX
クラス宣言で typedef HRESULT (WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD); こういう書き方がしてあったのですが、 (WINAPI *PStoreCreateInstancePtr)(IPStore **, DWORD, DWORD, DWORD)の関数を 呼び出してHRESULTにエラーコードを返すのだけの処理なのでしょうか? typedefに続く構文で括弧が二つ続くものをあまり見たことが無いので戸惑っています。
>>641 「
・IPStore **とDWORDとDWORDとDWORDを取って、
・HRESULTを返す、
・WINAPIな呼び出し規約の
関数」
へのポインタを、PStoreCreateInstancePtrと呼ぶ、という宣言。
>>642 ありがd、
もう一点だけ質問させてください
IPStore **というのはIPStoreの指すポインターのポインターだと
思うのですが、
IPStore *でポインター(メモリー上でIPStore関数を示すアドレス)で
IPStore **となるとどういう解釈になるのでしょうか?
>>643 IPStore *型の値はポインタで、変数に格納できる。
これがIPStore *型の変数。
IPStore *型の変数へのポインタがIPStore **型の値。
645 :
デフォルトの名無しさん :2006/03/19(日) 13:41:37
AA::BB って関数みるんだけど::って何よ!
実際自分でソース書いて検証してみます^^
647 :
デフォルトの名無しさん :2006/03/19(日) 13:43:46
クラスって構造体みたいなものなんだね・・・・orz
わかったーーー!! クラスだと思っていたけど namespace だった!!!! うほぉぉぉ!!!!
あれ、クラスでもつかうよな・・・? 俺間違ってる?(´・ω・)
酔っ払ってんのか。
653 :
デフォルトの名無しさん :2006/03/19(日) 15:23:02
#include <iostream> #include<stdio.h> #include <windows.h> #defineCTIME_MAX5 //time struct st_time { int no; long now; long max; }; namespace GTime { struct st_time time[CTIME_MAX]; void Init() { ZeroMemory(&time,sizeof(st_time)*CTIME_MAX);}; void Set(int nm,int nm2) { time[nm].max=nm2; return; }; } int main() { GTime::Init(); for(int i=0;i<10;i++) GTime::Set(i,5); return 0; } エラーでる
>>653 #includeとか#defineでスペースはいってないとかそういうんじゃなくて?
そんじゃない。
&timeか
そうなのか
time(time[0]じゃなく)の意味、&timeを考えて見ましょう
GTime::Set(i,5); 消すとエラー消える
timeという名前が悪い。 グローバルネームスペースに同名の関数がある。
そりゃあ5以上になったらやばいだろ
>>646 デツ
こんな感じかなポインターのポインターって
#include <stdio.h>
main()
{
int var;
int *p;
int **pp;
int ***ppp;
var = 19;
p=&var;
pp=&p;
ppp=&pp;
printf("varの値は? ⇒ %d\n",var);
printf("varのアドレスpは? ⇒ %d\n",&p);
printf("pのアドレスppは? ⇒ %d\n",&pp);
printf("ppのアドレスpppは? ⇒ %d\n",&ppp);
}
>660 名前変えて、も無理
>>662 ちょっと違う。それからポインタを表示するときは%p。
printf("varのアドレスpは? ⇒ %p\n",p);
printf("pのアドレスppは? ⇒ %p\n",pp);
printf("ppのアドレスpppは? ⇒ %p\n",ppp);
GTime::Set(i,5); 5は配列ではなく代入する値です。 3やに2変えても変わりません。 iが配列の番号
namespace GTime { struct st_time time[CTIME_MAX]; 自分ではここが怪しいと思うんだが。。。
このスレには初心者しかいないのかwwww
>>668 【初心者歓迎】C/C++室 Ver.25【環境依存OK】ですが、なにか?
struct st_time time[5]; void Set(int 9,int nm2) { time[9].max=nm2; return; };
本当だw forよく見たらi<10になってる i<CTIME_MAX(最大値)になってると思ったorz
死にたい・・・・ すごい時間を無駄にしたorz
C/C++を用いてWinsockとSMTP熱い関係語ったサイトご存知ありませんか Winsock+VBのサイトはチラホラ見かけるんですが、 Winsockの解説自体は大体何処のサイトも C/C++なんですがSMTPの解説少ないんですよね 宜しくオナガイシマス
>>674 SMTPだけなら殆どWinsockを意識する必要もないだろ。
Winsock自体を使えるようになっていれば、SMTP喋らせるにはUnix系のソースで充分。
#確か、smtpsendなんてものがソースつきでどっかに転がってた希ガス。
>>675 レスサンクス、書いた後にこの板でネットワークプログラミングのスレがあったので
ちょっとスレ違いだったような気がしたが、答えてもらったのでよかった^^
SMTPでメールを送信するソースは沢山見かけたのですが
漏れのプロバではPOP before SMTPで認証してPOP3サーバーにアクセスするので、
どれも使えなくて自分で実装しようと思い調べていたら、
Berkeleyソケット(Winsock)+SMTPという
組み合わせじゃないと、Outlookや鶴亀メールのようなソフトは作れないの
じゃないかと思い尋ねました、漏れの考え方が外れていたら指摘してください
×Berkeleyソケット ○Berkeley API
>>676 POP3認証をしてからSMTPするだけ。
679 :
デフォルトの名無しさん :2006/03/20(月) 00:59:03
>>648 クラスと構造体はほぼ同じものです。
クラスのアクセス制限を全てpublicにすれば、それはとりもなおさず構造体の事です。
>>679 その説明だと、構造体はメンバをprivateにできないと言っているようだ。
質問です。
環境: VC.NET, WinXP SP2
以下のようなメイン関数を持つアプリケーションを作りたいとする。
-- Winmain.cpp -----------------
Winmain(){
Cscene scene;
while(true){
scene.loop();
}
return 0;
}
------------------------------------
Csceneの宣言 Cscene.h には、メンバ関数 loop(void) 以外のものがどんどん追加されることがわかっている。
Winmainから呼び出すCsceneの関数は、loop(void) だけであり、Winmainの記述はこれで決定である。
Csceneが更新される度に Winmain をビルドしなおすということはしたくないので、Winmain.cpp では Cscene.h を読み込みたくない。
更新作業を楽にするために、Csceneの実装は、実行ファイルの外部で行いたい。
何かいい方法はありますか?
ttp://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/05.html Cdrivenを外部DLLで実装すればよいのではないかと考えてこのページで勉強してみたけど、
このページの方法だと Cscene.h を Winmain.cpp で読み込まないといけないから、適用できなかった。
>>680 構造体、と言ったときは、Cの構造体(C++でいうPOD)のことをさしていると思うのだけれど。
C++のstructはクラスだろ?
おれも、POD型を構造体と呼んで それ以外のstructとclassはクラスと呼んでる
>>684 俺もそれでいいと思うが
679の説明は、おかしいもしくは足りない。
687 :
679 :2006/03/20(月) 09:26:32
ごめ
688 :
デフォルトの名無しさん :2006/03/20(月) 17:02:47
ヌルかもしれないメンバ変数ポインタの参照渡したいんですが やはりヌルだったらどうなりますか?
>>688 ポインタの参照渡すのにヌルかどうかは関係ないだろ。
渡した先でポインタの中身をどう使うかだ。
690 :
デフォルトの名無しさん :2006/03/20(月) 19:31:57
Cではグローバル変数は良くないと聞いていて、↓の作ってみた class CTime { public: struct st_time time[STIME_MAX]; CTime(); void CTime::TimeGo(); }; CTime::CTime() { ZeroMemory(&time,sizeof(st_time)*STIME_MAX);//メモリ初期化 return; } void CTime::TimeGo() { for(int i=0;i<STIME_MAX;i++) time[i].now+=1; return; } namespace STime { class CTime obj; void Go() { obj.TimeGo();}; } どこでも呼び出せるようにしたんだけど どうみても効率が悪そう。 素直にグローバル変数にしたほうがいいでしょうか?
void AA(){ STime::TimeGo(); return; } int main() { STime::TimeGo(); AA(); return 0; } ↑こんな風にどこでも使える。 int mainで変数初期化すると関数にいちいちポインタ渡すのが面倒なので。 ・・・・意味プーかも。
>>690 単純に置き換えればいいってもんじゃなくて、
C++にはC++の「設計」ってもんがあるんだ。
結論からするとどれ?
・グローバル変数でどこからでもアクセス!
・ポインタを渡して渡して渡してがんばるぞ!
・
>>690 のやつでめちゃくちゃにまとめて使うぞ!
ケースバイケース
>>694 エ〜〜〜>< じゃ、グローバルにしようかな一番簡単だし・・・><
別に問題無い
俺もそういうときどうすればいいのかいつも困るんだが、ケースバイケースか、まあそうか・・・
俺の場合
>>693 に加えて、クラスの関数をどれもこれもstaticにしてしまうこともある
もちろん必要なメンバ変数もstatic
デザインパターンとか学ぶと参考になったりするものあるのかな
グローバル変数がよくないのは、 ・どこからからでも参照できるので発見しにくいバグの原因になりやすい。 ・マルチスレッド対応を難しくする といった点である。特に後者の弊害が顕著な糞実装の例としてRubyを挙げておこう。
マルチスレッドじゃなくても、コールバック関数内で グローバル変数扱うときにも注意が必要だな
>>696 OKですか^^ >>697 お互いがんばりましょう>< >>698 やっぱり危ないんですね。 >>690でのやりかたでがんばってみます>< >699 マルチスレットつかってないので平気です^^ コールバック? 分かりません><
>>690の使い方であってますか? クラスと空間。 正常に動くのですが、関数をまた関数でまとめてるし う〜〜ん^^; 適当に作ったので、ちゃんとした書き方なのか、わかりません><
プログラム板で全角英数使う奴って、プログラマに必要な何かが無い気がする。
>>702 突っ込むところ、そこですか><
>>702 なんとなくワカル。
>>より>>の方が無駄がない、という感覚的な話だと思っているが。
>>704 いちいち変えるのが面倒なのです。 見た目は良くないですが><
>いちいち変えるのが面倒 >見た目は良くなくてもOK なるほど
707 :
デフォルトの名無しさん :2006/03/20(月) 23:04:45
>>690 せめてSingletonパターンにしようよ。
べつに、シングルトンにする意味はないんじゃないの? 普通に必要なときにインスタンス作って使えば?
710 :
デフォルトの名無しさん :2006/03/21(火) 05:14:30
例外処理に関して独習C++(P360)を読んで勉強してたのですが、 「・・・例外が投げられると、制御はcatchに写り、tryブロックは終了します。 このときcatchは呼び出されるのではなく、プログラムの制御がcatchに移動します。 このためスタックは自動的に再設定されます・・・」 と説明されていましたが、「スタックが自動的に再設定」とは何がどうなることでしょうか? (stackというとLIFOしか出てこない 誰か説明おねがいします
独習C++ウンコだなwwwww
そこでLoki::SingletonHolderですよ ところでboostに似たようなのあったっけ?
スタック〜の部分は重要じゃないので無視していいよww 制御が移動するってことだけで十分www
スタックレジスタを再設定するっていいたいんだろうが んなこといきなり言われてもな。 混乱するつーの
715 :
710 :2006/03/21(火) 06:45:09
つまり、CPU内部のぷろぐらむかうんたーだとかレジスタのすたっくがどうのこうの、 という認識で宜しいでしょうか //独習Cはまあそれなりに読みやすかったので、著者ではなく訳&監修がイマイチなのではないかと
716 :
710 :2006/03/21(火) 07:17:01
訂正 tryブロックでデフォルト(auto)で宣言された変数などは、スコープからはずれて・・・という解釈でもイイですか?
718 :
710 :2006/03/21(火) 08:16:15
C++で無効ポインタは整数定数0を代入するということを 本に書いてあるとおりやってきましたが、実際なぜにNULLで なくて0なのでしょうか。
そういう仕様だからとしかいえない。
>>719 CでもC++でもヌルポインタは(ポインタ型の)0と決まっている。
しばしばCでは#define NULL (void *)0という定義がなされるが、
C++ではvoid*型から他のポインタ型への変換はできないので、
大抵#define NULL 0という定義になる。
だったら初めから0を使えばいいだろということ。
まあ、俺は NULL を使うけどな。 正直、ヌルポインタとして 0 を直接書くのは マジックナンバーだと思う。
コンパイラ実装者からすれば、ポインタかどうかとは関係なく 数値「0」として一言でまとめたほうが楽だろうしな。 クラスメンバの初期値しかり。
そこでNullClassですよ。
726 :
719 :2006/03/21(火) 14:00:43
レスどうもです。 例えば関数の仮引数がint*型だったとして、 そこに実引数NULLをわたすとコンパイルでエラーになるかも しれないけど、0なら大丈夫ってこと?
>>726 エラーになることはない。どちらを使っても同じ意味。
ただし NULL を使うためにはヘッダのインクルードが必要。
728 :
719 :2006/03/21(火) 14:15:06
#define NULL (void *)0 とされているC++コンパイラはないってこと?
勘違いしていないか? 「無効ポインタが0」というのは、「ポインタ変数の値が0だとコンパイルエラーになる」というわけではないぞ。 ポインタ変数が0だった場合に無効だと判断してエラールーチンを書くのがプログラマの仕事だ。 そして、0ポインタに対するエラー処理を書か書かなければ、それは実行時のエラーとして発現することになる。
731 :
730 :2006/03/21(火) 14:25:03
勘違いは俺か。型の話をしているのね。
0 というリテラルがヌルポインタとして判断されるわけじゃなく、 0 になる整数定数値がヌルポインタとして判断されるんだよね。 static const int a = 0; static const int b = 1; int* p = a; int* q = b - 1; こういうのも通る。 こんな仕様でええんかいとは思うが。
どうでもいいが、STATIC_ASSERTに使えるな。 #define CAT_P(x, y) x##y #define CAT(x, y) CAT_P(x, y) #define STATIC_ASSERT(exp) enum{CAT(STATIC_ASSERTION_FAILURE, __LINE__)=sizeof(static_cast<char *>(!(exp)))}
>>733 つBOOST_STATIC_ASSERT
735 :
デフォルトの名無しさん :2006/03/21(火) 20:19:48
クラスaをメンバに持つクラスbにおいて、 aのデフォルトコンストラクタを定義しておいても bを宣言しただけではメンバのaオブジェクトは初期化されないのですか? bのコンストラクタで初期化しないと駄目ですか?
>>732 D&Eでもそれには呆れるルールだと書いてある。
738 :
デフォルトの名無しさん :2006/03/21(火) 20:30:52
739 :
デフォルトの名無しさん :2006/03/21(火) 20:48:58
ぬるぽ
740 :
デフォルトの名無しさん :2006/03/21(火) 21:23:54
非デフォルトコンストラクタの引数の全てにデフォルト値を記入してある場合、 デフォルトコンストラクタはつくらなくともデフォルトコンストラクタの要請に耐えられますか?
>>740 //例えば
class foo {
type member1;
type member2;
foo(type arg1 = 0, type arg2 = 0) : member1(arg1), member2(arg2) {}
};
//こういうクラスで
foo bar;
//こうできるかってこと?
privateメンバなのでそれはできませんね
>>740 少し勘違いしているようだが、「引数なしで呼び出すことができるコンストラクタ」を
「デフォルトコンストラクタ」と呼ぶことになっているので、すべての引数に
デフォルト値があればそれがデフォルトコンストラクタになる。
744 :
デフォルトの名無しさん :2006/03/21(火) 22:35:09
745 :
デフォルトの名無しさん :2006/03/21(火) 22:58:36
return と exit はどう違うの? どう使い分ければいいの?
e---------!!!
>>745 returnはC/C++の予約語で、exitは標準関数。
C++ではexitは使わない方がいい。オブジェクトのデストラクタが走らない。
748 :
デフォルトの名無しさん :2006/03/22(水) 04:36:10
走らないと即ちメモリリークですか?
メモリは開放されるが、適切な終了処理が行われない。
例えば、設定が保存されないとか。
まあ、どういう実装にしてるかによるけど。
C++ なら、exit じゃなく素直に例外機構を使うべし。
>>745 は main での話っぽいので、その場合は常に return を使うべし。
つーか、C でもそうしろ。
>>745 return … 呼び元に値を返す
exit() … プロセスを終了する
但し、main()でのreturnは、exit()と等価の動作を行う。
>>750 mainでexitしてもグローバルオブジェクトのデストラクタは走らないんじゃね?
>>751 どこでexitしようがグローバルオブジェクトのデストラクタは走る。
753 :
デフォルトの名無しさん :2006/03/22(水) 15:52:10
一体誰を信じて生きてゆけばいいんだ
実際の振る舞いを信じればいいよ
つまりVC++6.0を信じろと。
それは無理
ていうかきちんと終了処理がされないexitは何のためにあるんだ?
STLのstringの派生クラスを作ろうとして class exstring : public std::string { }; てなのを取り合えず書いてexstringのオブジェクトを 生成したんですが、stringのメンバが使えません。 どこが悪いのでしょうか?
exit時に終了処理をさせたいときは、atexit を事前に呼ぶ。 Cで使うときのためにあるんでないの?
>>758 それだけじゃ何も悪いと思えませんが、なぜ使えないんですか?
コンストラクタや演算子が使えないという話かと予想してみる
>>758 よくわからんけどこうしてみたら?
class exstring : public std::string{
public:
exstring() : std::string(){}
exstring(const char *str) : std::string(str) {}
};
763 :
758 :2006/03/22(水) 20:11:54
>>761 すみません、そうでした。
メンバ関数や変数は使えたんですが、演算子が使えません。
>>762 それで大体上手くいきましたが、
exstring es;
es = es + "aaa";
てなコードが通りません。
exstring型を扱える演算子を宣言しなおさないとダメだんでしょうか?
すっぱりと継承するのをあきらめたほうがいい。
宣言しなおさないとダメだと思うおwww
operator string()を実装すれば通ることは通る。 ・・・・・・いまいち使いどころが分からんが。
767 :
758 :2006/03/22(水) 20:42:37
どうもありがとうございます。 継承するのあきらめました。
stringを拡張したいって思っただけだろ?
769 :
758 :2006/03/22(水) 20:51:18
>>768 ええ、そのとおり。
メンバ関数増やしたり、一部の演算子を変えたり
したかったんですが、派生以外の方法でやってみますわ。
関係ないがみんなは return 0;派? return(0);派?
>>770 > return(0);
おれ、こんなの見たことあったかなぁ・・・・
retrun(-1);
return(); が通らないし打つのめんどいし絶対括弧つかわね
>>758 std::stringは仮想デストラクタじゃないし継承しちゃダメ。
直接STLのソースを書き換えるのがいいよwww
>>774 × 継承しちゃダメ
○ 公開継承しちゃダメ
BCC5.5です Cソース内のある関数内の変数の値の変化を全て txt に書き出したいのですが どうすればいいですか fprint などを試したのですがいい方法が浮かびません
>>777 どんな結果を期待しているのかわからない。
値を代入したりするたびにfprintfするの面倒だから自動化できないか とかって言いたいんじゃね?
>>777 > fprint などを試したのですがいい方法が浮かびません
とは何を意味するのか(ただの脱字だよね)?
1.fprintfを試したが上手くいかなかった。
2.fprintfを試し上手くいったが、もっといい方法はないのか。
どちらかな。
「stackクラスを修正し、型の異なる2つのオブジェクトをスタックに格納できるように〜」という問題で、解答が↓の様になっていました template <class X> class stack { X stck[SIZE][2]; int tos; public: void push(X ob1, X ob2) { ... stck[tos][0] = ob1; stck[tos][1] = ob2; } X pop(X &ob2); { ... tos--; ob2 = stck[tos][1]; return stck[tos][0]; } }; ...... これでは「同じ型のオブジェクトを2つ格納できる汎用stack」では無いかと思うのですが、 実際に型の異なるオブジェクトを同時に扱うstackなどは作れるのでしょうか?
>>784 作れる。
学習中っぽいので実際にどう作るかを教えるつもりは無いが、
とりあえずその問題と解答出したやつは殺していい。
超ド級の無能教官だな とりあえず template <class X, class Y> class stack { X stck[SIZE]; Y stck[SIZE]; ... }; ってな感じになるんだろうが、激しく使いづらいなw
BCCの無料バージョンを使っています 自作ヘッダファイルを機能させるには、どうしたらいいですか
インクルードすればいい
789 :
787 :2006/03/23(木) 06:09:59
したのですが、よみこんでくれません
790 :
784 :2006/03/23(木) 06:11:34
>>785-786 分かりました。ありがとうございます。
template <class X, class Y>
class list {
public:
list *head;
list *tail;
list *next;
X data;
list() {head=tail=next=NULL;}
virtual void store(X d);
virtual void store(Y d);
virtual X retrieve();
virtual Y retrieve();
};
template <class X, class Y>
class stack : public list<X,Y> {
void store(X d);
void store(Y d);
X retrieve();
Y retrieve();
};
最初は別の例題を参考に、↑のようなのを作っていて時間がなくて諦めたのですが、これは非現実的でしょうか?
もしくは、単純に汎用クラスstackを2種類(別の型で)生成するのが良いのでしょうか?
>>786 それはスタックなのか?
あえて書くと、こんなものだと思うのだが。
template <typename T1, typename T2>
class Stack
{
size_t pos_ ;
std::vector< boost::any > stack_ ;
public :
void push(T1 t) ;
void push(T2 t) ;
//あるいはこうか?
//void push_first(T1 t) ;
//void push_second(T2 t) ;
T1 const & pop_first() ;
T2 const & pop_second() ;
} ;
何にせよ、こんなもの使いたくないな。
792 :
787 :2006/03/23(木) 06:29:42
といいますか、ヘッダのPATHをMAKEで設定するにはどうしたらいいですか
template<class T1, class T2> class stack2 : public stack<std::pair<T1, T2> > { ... };
>>788 自分のなら#include "〜"でいいだろ。
>>789 #include <XXXX.h> //環境変数 INCLUDE から探してインクルード
#include "XXXX.h" //include元のファイルと同じディレクトリから探して、
//無かったら環境変数 INCLUDE から探してインクルード
いやまあそうだが長くなるので・・・
まぁ要は何かの設定による
オセロ作ってみたけど、馬鹿っぽいソースな気がするので添削してください。 関数の引数で自分の置いた場所をx,yに入れています。 上下左右8方向に走査を繰り返します。 int i = board[x][y];//プレイヤーを判断 int cnt,sx,sy,e; if(i == 1)e=2;//敵を判断 else e=1; for (cnt = 0,sx = x+1,sy = y;board[sx][sy] == e ;sx++)cnt++; //→方向(x+1)を走査し、敵の数をカウント if(board[sx][sy] == i)for(sx--;cnt != 0;cnt--,sx--)board[sx][sy] = i;//ひっくり返す
>799 動くかどうかよく分かってないものを「作ってみた」と言えるかどうかはさておき、 まずは適切に改行をすることから始めてみようか。 あとiやeに代入してるのが1とか言われても意味が良くわからんからenumやらなんやらでわかりやすい名前の定数にするべし。 enum{BLACK, WHITE}とか。 ざっと見た感じ。 ・↓のような並びだと配列外にアクセスしてセグフォる。盤の端っこに来た時の条件も入れれ。 これを打つ ↓ ○●●●●| ↑ 盤の端っこ ・おそらく2人対戦オセロだろうからiやeのとりうる値は2種類だと推測するが、 1個目のforのboard[sx][sy] == eを抜けている時点でboard[sx][sy]==iは確定なのでif(board[sx][sy] == i)が無駄。 あと上下左右は8方向じゃないので斜めもちゃんとやれな。
>>799 >if(i == 1)e=2;//敵を判断
好みもあるけど、こういうのはコメントを入れるよりは
名前のついた関数(あるいはマクロ)を使った方が良いと思う。例えば、
e = opponent_of(i);
>for(...
これも好みだが、for文の第一式、第三式ではループに関係ない変数をいじらない方が良いと思う。
最初のforではcntはループに無関係だし、
二番目ではsxが無関係。
>>800 >・おそらく2人対戦オセロだろうからiやeのとりうる値は2種類だと推測するが、
iやeはそうだが、boardの各要素は俺なら「先手、後手、未着手」の三種類だと推測する。
このコードのままでも外周に「未着手」状態の番兵があれば範囲外アクセスは起こらないな。
いつも思うのだが、 count を cnt と書くといいことがあるのだろうか・・ ってすれ違いだな
ときどき cout を count とタイプミスする。 指がかってに n を追加してしまうのだ。
その昔、C++を始めたころ cout を「コォゥト」と読んでいた。 あるとき、「シーアウト」であることに気づいた。 同時に、cin の読みも「シン」から「シーイン」にかわった。
_____ /二二ヽ ||・ω・|| <いやどっちでもいいし . ノ/ / > <いやどっちでもいいし ノ ̄ゝ
>>804 がcerrをなんと読んでいたのか気になる。
俺なんかいまだに gets() を「ゲッツ」と読んでいるぜ。 あ、当然 puts() は「プッツ」な。
俺はgets()関数を使うときダンディ坂野を思い出してしまう。
>806 804じゃないがセラーと呼んでいた。 今でも脳内では呼ぶが他人と話すときにはシーエラー。 >808 gets()を使っちゃいけませんと茶々を入れてみる。
非標準関数のgetch()をゲッチと呼んでいた。putch()はプッチ。
stdinをストゥドゥインとか。これは誰でもそうか。
>>808 あー懐かしいですね。
このあいだNHK教育で見たぞ坂野
略語の意味もちゃんと説明してほしかった>入門書 ソース音読したらどうみてもオレ語です。
Cは識別子の長さをC89以降でようやく31文字認識するように なったが、それ以前は6文字だったから、やたらと略語が多い。 FORTRANと同じだなそこら辺の事情は。
create()ではなくてcreat()なのが未だに理由がわからん。
>814 そこはKen Thompsonに言え。 むかーーーしの話だし、メモリ節約したかったとか?
>>814 ある音に、どういうアルファベットの羅列を当てるかというのは、かなり曖昧。
言後ごとに、音の崩れや、無音になることもあるし。
日本語だと、そういうことは気にならないけどね。
>816 え?
配列でクラスのコンストラクタに引数を渡したいのですが そういった場合はどのように指定すればいいのでしょうか? myclass data[10][10](1234); と言うようにしたらエラーになってしまいコンパイルすることができませんでした。
myclass data[10][10]; for(int i=0;i<10;i++) for(int j=0;j<10;j++) data[i][j] = new myclass(1234);
>>820 一つ一つやっていくしかないんですね。
ありがとうございます。
考え方はともかくmyclassの配列にmyclass*を代入してどうする
>>823 初心者はシコシコ入門書でも読んでろよw
myclass *data[10][10]; こうだよな?
myclass* data[10][10]; こうだよ。
どう違うんだ?
気持ち
myclass * data[10][10]; 間をとって。
そういう中途半端なのは許せない。
じゃあ思い切って *myclass data[10][10];
typedef myclass *pmyclass; pmyclass data[10][10]; でいいよ
n?
operator =が十分に使えるなら、一時オブジェクトもありだな。 myclass data[10][10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) data[i][j] = myclass(1234);
>>820 std::auto_ptr data[10][10] にして data[i][j].reset(new myclass(1234)) にしないと漏れる。
>>836 デフォルトコンストラクタも必要になってる。
も、もれちゃう
840 :
デフォルトの名無しさん :2006/03/25(土) 03:58:30
DirectXの、あるオブジェクトを初期化するときに コールバック関数を設定する必要のある部分があるんですけど、 それの実装がどういう風になっているのか気になっています。 g_pHoge->Initialize(NULL, MessageHandler, 0 ); 第一引数は、コールバックがグローバルならNULLでよくて、 コールバックがクラスのメンバで、そのクラスの中で初期化するときなどは(PVOID*)thisを渡したります。 第二引数は、指定の型を満たした、ユーザーがコールバックとして使いたい関数へのポインタです。 第三引数は特にここでは関係ないです。 一応、こんな感じの構文です。 HRESULT Initialize( PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags ); このようにクラスの型(グローバルならNULL)と関数へのポインタを渡したとして、 ライブラリ内部ではどんな感じで呼んでいるのでしょうか? こんな感じで書かれてるんじゃないか?というのがありましたら、 可能でしたら具体的に例示して教えてください。お願いします。
if(pvUserContext) (pvUserContext->*pfn)(〜); else (*pfn)(〜); こんな感じだっけ。
842 :
840 :2006/03/25(土) 04:37:54
(pvUserContext->*pfn)(〜); なるほどこういう書き方ができるんですね。 以前コールバックの実装について伺ったときに、boostを使った 実装法などを教えていただいて結構勉強になったのですが、 呼ぶときに分岐するのさえ我慢すれば グローバルかメンバかを問わないコールバックは 簡単につくれるんですね。ありがとうございました。
俺、コールバック使わせるAPI嫌いだから使わなーいw
844 :
デフォルトの名無しさん :2006/03/25(土) 04:49:35
コールバック使えないとソートもできない罠
は?
あれだろ。
リストビューのあの上っちょにあるボタンを押したときの動作をソートっていってんだろ?
あんなもんメッセージ拾って自前で格納しなおせばできるんだよ。>
>>844 コールバックなんて強制されるのはウィンドウプロシージャとかDirectXのデバイスの列挙ぐらいなもんだろ。
>>840-842 なに言ってんの?
その pfn には非 static メンバ関数は渡せないだろ。
PFNDPNMESSAGEHANDLER の第1引数を
pvUserContext で設定できるだけ。
848 :
840 :2006/03/25(土) 06:19:16
>>847 ああ、ほんとですね、staticでした。
コールバック関数としたいのがメンバの場合はstaticにしないといけないけど、
実際それが呼ばれるときには、設定時にあらかじめ一緒に渡しておいたthisを貰うことで、
同クラスの非staticなメンバ変数とかにアクセスできるようにしてるって感じでしょうか。
849 :
デフォルトの名無しさん :2006/03/25(土) 06:20:58
つか、
>>840 は何が気になっててそんなこと調べてるのかわからん。
どうせ聞くなら問題そのものをズバっと聞きたまえ。
「どんな感じで呼んでるのでしょうか?」それが予想できたところで
アホなんだからどうすればいいか?までどうせわからないんでしょw
どうせ聞くなら全部聞いてけやw
850 :
840 :2006/03/25(土) 06:26:57
なにこのキチガイ。
851 :
デフォルトの名無しさん :2006/03/25(土) 06:33:38
>>850 それはお前のほうでしょ?
さっきから、何が問題なのかいいもしないで「どんななってますか?」みたいな
あいまいな質問して時間の無駄まるだしなことしてんだから。
いきてる時間が無駄だと思わないの?w
852 :
840 :2006/03/25(土) 06:39:15
いやもういいです。 話の通じる人に答えてもらって解決してるんで。 酔っ払いは新でください。
853 :
840 :2006/03/25(土) 06:40:33
キチガイは氏ね。
おまいら落ち着けw
855 :
840 :2006/03/25(土) 06:42:44
>>854 私は落ち着いてますよ。
そういうことは
>>851 みたいな嫌がらせしかできないキチガイに言ったらどうですか。
856 :
840 :2006/03/25(土) 06:45:43
やはりここはID表示した方がいいと思う。
857 :
840 ◆bknIp0a9D. :2006/03/25(土) 06:47:28
->*とか.*演算子って美しいと思いませんか?
859 :
デフォルトの名無しさん :2006/03/25(土) 06:48:46
>>855 いや、俺はちゃんと「何が問題」で「どうしてそれを知る必要があるのか?」ってのをちゃんと書けといっただけなんだけど?
なんでいきなり「嫌がらせ」なのかわけわからんね。
だいたい知りたいのはAPIの使い方なんだろ?
そしたら、「どうなってます?」ってより、「こうしたいです。」の方が得られるリターンが多いとは思わん?
レスから君にも考えがあることはわかるけど、ライブラリの内部の処理とかわからんこと聞くより、
APIをどう使っているか?の詳細を聞いたほうがよっぽどいいんじゃないの?
ってことだけど。
いきなり怒り出すし、沸点無駄に低いと損するよw
>>858 たしかにそれらはかなり美しいのだが
operator,()には負けると思う
なんかカオスになってますね
>860 boost::spiritの演算子の変態的使いっぷりには負けるな
>>856 ID表示の変更は一切受け付けないのが2chの方針。
VC8です、なんか荒れているみたいで質問しずらいのですが 宜しくオナガイシマス comboBox1のプロパティItemsに hoge1 hoge2 hoge3 を追加して comboBox1から選択してbutton1をクリックしたら、変数fooに代入したいのですが どう書いたらいいですか?
>863 それっていつの話? 明文化されてる? 途中からID表示制になった例を2件ほど知ってるけど。
866 :
864 :2006/03/25(土) 11:15:11
スマソ続きです this->comboBox1->Items->AddRange( objectArray ); String^ foo; comboBox1->Items->Add( foo ); MessageBox::Show( foo ); こう書いたんですが アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。 中略 値をNullにすることはできません。 パラメーター名:item となってしまいます。
String^ foo = comboBox1->SelectedItem->ToString(); とかじゃね?C++/CLIはようわからん。
>>867 氏
どうもありがとうございました
例外エラーも発生せずに、プログラムが動きました
Addじゃあなく、SelectedItemメソッドだったのか
MSDNで使い方よく調べます。
>869 なるほど、「設定変更依頼に答えるという形では」一切ダメなわけね。 ちなみに、ライトノベル板とアーケード板。
871 :
初心者 :2006/03/25(土) 12:17:54
質問 コマンドラインから int main(int argc , char * argv[]){---------------------------} みたいな ポインタポインタが引き数であるmain関数に ポインタポインタを引数を指定するにはどうしたら良いのですか? また、 int main(int argc , char * argv){---------------------------} みたいな時は、どう指定したら良いの?
main関数はOSから呼ばれます その際の引数は、プログラム実行時の文字列となります また、int main(int argc, char * argv)のような引数は コンパイルは通りますが正しくないと考えてください int main(int argc, char *argv[]){ ... int main(void){ ... }
(出来上がったファイル名abc.exe) 中身 int main(int argc , char * argv[]){---------------------------} にコマンドラインから数値と文字列(例:abc)を与えると argvと*argvと**argvは何になりますか? (その与え方もわからないですすいません) ファイル名+スペース区切りですか? 例の場合の与え方を教えてください
argcとargvでググレ
与え方とか気にする必要無いし
ヒント:引数を全部列挙するプログラム #include<stdio.h> main(int argc, char *argv[]) { int i; printf("引数の数:%d\n", argc); for(i = 0; i < argc; i++) printf("%dつ目の引数:%s\n", i, argv[i]); } 実行例 C:\...\sample>sample.exe test "test" 引数の数:3 0つ目の引数:sample.exe 1つ目の引数:test 2つ目の引数:test
どうも親切にありがとう
>>876 argv:OSから与えられるポインターポインターで
(sample.exe test test )の3つの要素の配列の1つめを指して全体を指す
そしてアスタリスクをつけて
*argv=argv[0]="test"
って事でOK?
ごめん間違った *argv=argv[0]=sampleを指すポインター ですね printf("%dつ目の引数:%s\n", i, argv[i]); ってつまり、ポインターから文字列を表示してくれるのかな?
試してみれば?
自分でやってみれば尤も手っ取り早くかつ確実なものを・・・
自分で試したら教えてクンになれないだろ?
質問スレなんだし答える気があるやつ以外書き込むなと
尤も 犬も 太も 大も 木も ホモ
自演乙
C++で、nullポインタに対してDeleteしても何も行われないことが 保証されているようですが、C言語で同様のポインタにfreeすると 何か危険はありますか?
void __cdecl _free_base (void * pBlock) { if (pBlock == NULL) return;
>>888 これってANSI C標準の実装ですか?
とすると、やはりC言語ではnullに対してfreeしまくっては まずいかもという感じですか
>>891 規格上はfreeにNULLを渡すと無視することになってたはずだが。
それお前の規格?
そもそもNULLを渡すという状況が信じられない。糞コードの可能性大。
普通にあると思うが。
>>896 はif(p) free(p);とかやってるド低脳
if(x) x->Release();
K&Rに書いてますな・・・。 free(p); pがNULLのときは何も起きないと。
901 :
初心者 :2006/03/25(土) 21:30:13
nullポインタを書き換えなければOKと違うの?
出張してきますた。 ∧_∧ ( ´∀`) <NullPointerException
>>902 \ / / _ , .. - .....
┼┐\ \ | / _________----- ̄ ̄ /、):.:.:.:.:.:.:.:.:.:.:ヽ
││ ツ イ 。 ‐‐‐‐‐‐‐───‐ /.:.::/::.:.:.:.:.:.:.:.:.:.:.:.:.:..i
/ | \  ̄ ̄──___ /.:.:.::ト;::::::::.:.::.:.:.:.;':.:.:.:.:}>
/ / | \ l:;:i:.:.l、ノ;;:::.::::::.::::::::.::.:./::.:ヽ
/ / │ \ 川:.::|ゝ-'';;::;''"';:;::_:ノ ´!::.:.:l
/ / | __ .. - ─ ナ!:lヽ  ̄ `ヽ l::.:.:!
/ / │ __ --‐‐ ´ _リ ノ,,.:' } !::.:!
/ ./ / _ -'ー-'/:: '、 l:i.:l
/ ノ._ノ´ヽ _ -‐ ´ / .. : : : : . ヽ 〃ノ
_ -"´ }. / / _..=_.ニ,~_ヽ、 ヽ
__ -‐ ´ / / ///::.::.::.::.::`:..、ヽ、 ヽ
__.. -‐ ´ ̄ ヽ / ..∠ノ /, '/::.::.::.::.::.; -‐  ̄` 、_ヽ、l
__ -‐ ´ ヽ /ー "´ { /::.::.::.::.:/ ヽヽ}
l. / ヽ|::.:::::::::/ | /
l/ {::::::::::/ l´
/ |、:_::/ /
/ l / /
/ V /、
/ / / ヽ
ぱんつみえた
┼─┐─┼─ / ,. `゙''‐、_\ | / /
│ │─┼─ /| _,.イ,,.ィ' ─────‐‐‐‐ 。 ←
>>902 │ | │ | | | イン ,'´ ̄`ヘ、 // | \
__{_从 ノ}ノ/ / ./ | \
..__/ .` `,)((/ ./ |
/, -‐===≡==‐-`つ/ /| ノ ./' ))) / ;∵|:・.
_,,,...//〃ー,_/(. / /ミ ノ .{´ (('´ ./ .∴・|∵’
,,イ';;^;;;;;;;:::::""""'''''''' ::"〃,,__∠_/ ./ ., .|゙
/;;::◎'''::; );_____ @巛 ( .,i. ゙}
≧_ノ __ノ))三= _..、'、"^^^ \ ! }
~''''ー< ___、-~\( ,'~"'/
\( ,'.. /
しかし。厳密に、「何も起きない」コードって何よ? nopですら、タイミングをとる役目があるのに…。 free(NULL)をコンパイルすると、最適化では削除されると言うことか?
質問です。 unsigned long l = 0; LPCTSTR s = reinterpret_cast<LPCTSTR>(l); ↑をコンパイルすると、 warning C4312: 'reinterpret_cast' : 'unsigned long' からより大きいサイズの 'LPCTSTR' へ変換します。 と出ます。sizeofで調べても、共に4になるのですが、なぜwarningなのでしょうか。 VS2005です。
908 :
デフォルトの名無しさん :2006/03/25(土) 23:12:01
C++のトレンドは?
>>907 C4312で調べてみた?
「この警告は、/Wp64 が使用されている場合にのみ出されます。」とあるから
このオプション切ってみたら?
910 :
nlp :2006/03/25(土) 23:23:58
>>909 ありがとうございます。解決しました。
64ビットで問題になるのは、intだけだと勘違いしていました。
>>907 現在のVC++はWin64移行の手助けとして、/Wp64オプションがあり、それを使うと、
Win64で8バイトになる型とWin64でも4バイトのままの型との相互の変換は警告になる。
ようするにunsigned longをULONG_PTRにしてみろ。
質問です。 A,B,Cという異なるクラスのオブジェクトへのポインタを、ある ひとつの変数に保持し、任意のタイミングでそのオブジェクトを 呼び出したいのですが、Void型で保持するとそのままだとメンバ を呼び出せないので困っています。 class A{省略}; class B{省略}; class C{省略}; A a; B b; C c; void * ActivePtr; ActivePtr = (void *)a; ActivePtr->call();←ここでクラス型がわからないのでエラーになる。 上でAもBもCもcallというメンバ関数を持っているとして、ActivePtrから その型を意識せずにそのメンバ関数を呼び出したいのですが、この場合 どうするのがスマートでしょうか。 環境はVC6.0です。
>>912 void*なんて使わないにこしたことはないこと、こんな設計になること自体がすでに糞ってのはわかった上での質問だよな?
現在じゃコールバック関数とかを無理やりクラスの中に封じ込めようとすると必要になるぐらいだろう。
まあ、そういうときはポインタを強引にキャストする。
ここ↓を
ActivePtr->call();←ここでクラス型がわからないのでエラーになる。
こう↓する
((A*)ActivePtr)->call();
だ。
せめてもうちょっとマイルドに、 static_cast にしとけ。
>>912 call() を定義したインターフェースクラスを作る。
>>912 class Parent {
・
・
・
virtual void call() = 0;
};
class A : public Parent{...};
class B : public Parent{...};
class C : public Parent{...};
Parent* p;
p = &a;
p->call();
これじゃダメなのか?
ポリモーフィズム
漏れは
>>915 と同じことくらいしか思いつかなかったが、
これだけのためにクラスを一つ追加するのもなんだか気が進まないなぁ
interace callable { void call(); }
#include<memory> struct call_handle { virtual void call()=0; virtual ~call_handle(){} }; template<typename T> struct call_impl : call_handle{ T&ref; call_impl(T&ref):ref(ref){} void call(){ref.call();} }; struct call_body{ std::auto_ptr<call_handle>p; call_body(){} template<typename T> call_body&operator=(T&body){p.reset(new call_impl<T>(body));return *this;} call_handle*operator->(){return p.get();} }; struct A{void call(){}};struct B{void call(){}};struct C{void call(){}}; main(){ A a;B b;C c; call_body ActivePtr; ActivePtr = a; ActivePtr->call(); }
921 :
912 :2006/03/26(日) 15:30:44
>>913 なにぶんCからC++をはじめたばっかりで設計もぼろぼろ
なのは自覚しております。
キャストしようにもActivePtrに保持しているのがどのクラス
のポインタなのかを意識せずに行いたいのですよね。
>>914 〜919
実はC++はじめたばっかりなのでインターフェースもポリモー
フィズムもなんのことかいまいちよくわかっておりません。
せっかくアドバイス下さったのに不甲斐なくて申し訳ない。
これから調べてやってみますね。
アドバイス下さった方々、有り難うございました。
>>918 なんとなく気持ちはわかるが作らんとどうしようもないんじゃないかね
>>921 ならばひとつ聞くが、Cでそのような場合、同じ名前のメンバにアクセスする方法あるか?
よく考えたらポインタしか格納しないから、 void* + 関数ポインタで十分か...... template<typename T>void call_impl(void*ptr){return ((T*)ptr)->call();} class call_body{ void*ptr; void(*call_fp)(void*); public: void call(){call_fp(ptr);}; call_body():ptr(0),call_fp(0){} template<typename T> call_body(T*ptr):ptr(ptr),call_fp(call_impl<T>){} }; #include<stdio.h> struct A{void call(){}}; struct B{void call(){}}; struct C{void call(){}}; int main(){ A a;B b;C c; call_body ActivePtr; ActivePtr = &a; ActivePtr.call(); }
925 :
デフォルトの名無しさん :2006/03/26(日) 16:18:11
unsigned int x = 1; signed int y = -1; (x > y); // => false ( gcc on i386 ) ビット列をそのまま unsigned とみなして比較したらこうなるというのは 分かるんだけど、これってどう対処すべき? 最初から↓みたいになっていればいいのに…。 bool operator>(unsigned int x, signed int y) { return (y < 0) ? true : (x > unsigned(y)); }
(signed)xじゃだめなの?
>>926 x が signed int の上限を超えるとアウト。
unsigned int x = ~0;
signed int y = 1;
(signed)x > y; // => false
>>925 signedとunsignedを比較するとき、signedはunsignedに型変換されるというルールがあるからね
自分で明示的にunsignedな変数をsingedにキャストするか、もっと大きなサイズの型にキャストするといい
んじゃ(signed long)x って、こんな表現あったっけw
>>929 多くのコンパイラで sizeof(int) == sizeof(long) なので、それはダメ。
じゃあlong long
932 :
デフォルトの名無しさん :2006/03/26(日) 19:52:34
前略 ifstream fin("hoge.txt"); int a,b,c,d; char hoge[20]; //"ABC"の文字列があったときに、ファイルのint型データをa,bに入力する。 while(!fin){ fin >> hoge; if(fin=="ABC"){ fin >> a; fin >> b; break; } } *ここにfinをファイル初期に戻す文を挿入したい* //"DEF"の文字列があったときに、ファイルのint型データをc,dに入力する。 while(!fin){ fin >> hoge; if(fin=="DEF"){ fin >> c; fin >> d; break; } } 後略 このとき、finをファイル初期に戻す構文として ifstream fin("hoge.txt"); をもう一度使うのは良くないでしょうか?他によい方法があったら教えてください。
seekg()は入力ストリームに対して使用される。この関数は現在のストリームの"読み込み"位置を開始位置 からオフセット バイト分移動した位置か、位置 で指定された場所まで移動する。
>>932 同じファイルを繰り返し読み込むのはよくないな。
"ABC" の検索と "DEF" の検索を両方1度にやればいいんじゃないの?
>>933 上手くいきました、ありがとうございます。
>>934 そうですね、そちらの方法だとよりコードが綺麗になるかもしれないので試してみます。
皆様ありがとうございました。
環境:VC2005 Express Edition //-- const wchar_t* strW = L"テストtest"; size_t strWLength = wcslen(strW); int strALength = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL); if ( strALength <= 0 ) { //error } char* strA = new char[strALength]; ::memset((void*)strA, '\0', strALength); WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL); strA[strALength] = '\0'; //適当な処理 delete[] strA; //--
937 :
デフォルトの名無しさん :2006/03/26(日) 22:48:40
質問を書いている途中に送信してしまいましたorz 環境:VC2005 Express Edition 下記コードをデバッグモードで実行中、 delete[] strA の部分で、 HEAP CORRUPTION DETECTEDと出てプログラムが強制終了してしまいます。 //-- const wchar_t* strW = L"テストtest"; size_t strWLength = wcslen(strW); int strALength = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL); if ( strALength <= 0 ) { //error } char* strA = new char[strALength]; ::memset((void*)strA, '\0', strALength); WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL); strA[strALength] = '\0'; //適当な処理 delete[] strA; //-- なにか変なところあるのでしょうか。 WideCharToMultiByteで書き込まれた領域はうまく開放できないのでしょうか?
>>937 char* strA = new char[strALength];
strA[strALength] = '\0';
delete[] strA;
これだけで死ねるだろう。
940 :
デフォルトの名無しさん :2006/03/26(日) 22:58:09
937です。
とりあえず回線切って吊ってきます・・・orz
char* strA = new char[strALength + 1];
::memset((void*)strA, '\0', strALength + 1);
WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, strALength, NULL, NULL);
strA[strALength] = '\0';
delete[] strA;
ということでFAということですね。
>>938 すばやいご指摘ありがとうございました。
/つ /つ 〈( ゚д゚) |( ゚д゚) ヽ ⊂ニ) ヽ__と/ ̄ ̄ ̄/ |  ̄\/___/ /つ /つ 〈( ゚д゚ ) |( ゚д゚ ) ヽ ⊂ニ) ヽ__と/ ̄ ̄ ̄/ |  ̄\/___/
>>940 memset() に渡すときのキャストは不要。っていうかヤメロ。
実は new char[strALength + 1]() と書けばゼロ埋めできる。
std::vector 使うと delete を書かなくて良くなる。ゼロ埋めも不要。
API の戻り値はチェックしとけよ。
こっち見んな
>>942 いろいろとご指摘ありがとうございます。参考にします。
独学だと気づいていない変なところいっぱいあるんだろうな・・・
だから参考書を買うんだよ #なかには char str = '本'; みたいなキチガイじみた参考書もあるけどねえ
最初からあるint型とかdouble型とかに対してoperatorで演算子のオーバーロードってできないですか?
やる意味があるかどうかはさておき、 class One{}; int operator+(One one, int i){ return i+1; } int operator+(int i, One one){ return i+1; } とかみたいなことはできるよ 組み込み型同士の演算子は再定義できないけど
>>947 ありがとうございます。やっぱり無理なんですね。
C#とか
>>945 それ、前にどこかのスレで出てたな
見て驚愕した覚えがある
ちなみに確かにCの本だった
>>951 うはwww夢がポンデリングwwwwwww
うp
>951 前スレで出てたと思う
Cをより原始的に簡単にしたC--があるとおもろいかも
>>951 大当たり
ちなみにタイトルは「図解入門 よくわかる最新C言語の基本と仕組み」
エラッタ見てみるとおもろいな。 >※お詫びと訂正: 編集プロダクションとの行き違いにより、本書には多くの誤字があります。 なんじゃそりゃ。
こいつが書いてるC#の本ちょっと読んだけどすさまじくだめそうだったなぁ・・・w
libc(ランタイム)ってCの仕様に書かれてましたっけ?
>>960 ライブラリ関数の事なら規格票(JIS X3010:1999)の第7章に列挙してある
>>961 ライブラリ関数のことです。
未だにライブラリ関数がないOSがあるんで困るんだよね・・・
そうそう、BTRONとかBTRONとかBTRONとか。 #ディレクトリの概念がないのはいいけど、そこに無理やりシェルを移植するから……
>>963 そういやBTRONにも泣かされたなw
今はMona OSで中途半端なlibcが複数あるから困ってるww
構造体Aのメンバに構造体Bを指すポインタを持たせ、 構造体Bのメンバに構造体Aを指すポインタを持たせるにはどうすればいい? もちろん↓の様に書いてもだめなことはわかってるんだが。 struct A{ B *p; }; struct B{ A *p; };
>965 struct B; struct A{ B *p; }; struct B{ A *p; }; あ、あと前スレのごたごたの蒸し返し禁止ね。>各位
ごたごた
>>968 クラスでも同じことできるから覚えておくといい
>>957 STEP2がまともに表示されないんですが
971 :
デフォルトの名無しさん :2006/03/28(火) 20:02:59
質問です しょうもない関数 例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合 オブジェクト指向で考えるとどこ設置するのでしょうか? 色々と調べた感じだと、名前空間をどうのこうのってのがあったんですが・・。 メソッドとするにはあまりにもひどすぎるし・・。
大きいか小さいか、の定義はそのオブジェクト自身が知ることじゃない?
>>971 そんなものオブジェクト指向にせず、ただの関数にしろ。
そして名前空間はオブジェクト指向と直接の関係があるのでは無い。
全部が全部クラスに閉じ込めればオブジェクト指向になるわけではないし、完璧なオブジェクト指向なんて存在できない。
たとえばグローバルな変数や関数を廃止したJavaやC#だとそんな関数は静的メソッドになっていて、クラスのありがたみは0だ。
ちなみにその例なら<algorithm>のstd::maxが使える。
>>971 >例えば、値を比較して大きいほうを返すだけの関数などを作りたい場合
何と何の値を比較するかによる。
1つのインスタンスの中の値を2つ比べるだけならクラスのメンバ関数になる。
でも、2つのインスタンスが比べる対象になるならその関数は1つ上の存在を管理している奴にあずけなければならない。
また、1つはクラス、もう1つの値は別のどっかの変数の場合でも同様。
975 :
デフォルトの名無しさん :2006/03/28(火) 20:18:33
すみません。 ちょっと、記述が足りませんでした。 int とか dubule です。 つまるところ、math.h みたいな感じで使えるのかな〜?と思ったんです。 C言語なら、そういったモジュールを自作でつくって、使いまわしてたんで・・。
inline int gyaaa(int a, int b){return (a>b)?a:b;}; ヘッダファイルに置いて比較を使いたいファイル内でインクルード 色々対応したいならテンプレート使うといいかも
977 :
デフォルトの名無しさん :2006/03/28(火) 20:23:21
ふむふむ。 mymath.h inlinle ナンチャラ inlinle ナンチャラ みたいな感じで使えるってことですね。 ていうか、こんなやり方でいいんでしょうかね・・? スマートなやりかたってないんだろうか。
979 :
デフォルトの名無しさん :2006/03/28(火) 20:39:09
int max(int a, int b){ return ((a^b)&((a-b)
>>31 ))^a
};
xの2次方程式です。Cのプログラムで答えを書いてください。 a*x*x + b*x + c = 0
>980 宿題片付けて欲しいんなら宿題スレで
C99使えばこんなんかな? #include <complex.h> double complex x1 = (-b + csqrt(b * b - 4 * a * c)) / 2 * a double complex x2 = (-b - csqrt(b * b - 4 * a * c)) / 2 * a
んじゃあ3次以降はどうするよ?
3, 4次は公式に当てはめる。 5次以上はシラネ。
>>982 確か絶対値の大きい方をまず求めて、
その値を使って他方を求める。
そうしないと引き算の桁落ちで
真値と大きく異なる値が得られることがある。
classオブジェクトをnewで作成するときにlistに そのポインタを保存して、終了するときにまとめて deleteしたいんですが、異なるclassもまとめて管理 しようとしてvoid*で保存すると、deleteでデストラクタが 呼ばれないんですが、呼び出すべきデストラクタを listに一緒に保存する上手い方法は無いものでしょうか?
listに登録する異なるクラスに共通のスーパクラスを作り void*でなくこのスーパクラスのポインタを持つようにする それか、void*の代わりにboost::shared_ptr<void>を使う
>>988 boostを調べてみたら、他にも色々面白いクラスがあるみたいですね。
教えていただいて感謝。
>>989 ていうか、そんなのが普通に出てくる設計って何かがおかしいと思わないのか?w
>>990 いや、要はdeleteしなくて済む(し忘れてもいい)方法は
無いものかと思っただけで。
shared_ptrやarrayなんてのがあることを知らなかったので。
スマートポインタぐらいは知っておこうぜ・・・
993 :
デフォルトの名無しさん :2006/03/29(水) 11:02:49
ブースト無いとC++はカスだってJava信者さんにいじめられました。
C++にはC++にしかできないことがある
operator, operator->* とか
演算子再定義さえできんJavaに言われたくはないな。なぜかStringだけ+やら+=やら使えるが。 boost::spiritは実にアレゲで素敵ですよコンパイル速度遅すぎだけど
存在からしてカスのJavaに言われたく無い
C++は匿名クラスかラムダ式か、そのあたりの使い捨ての仕組みが あればいいんだがなー。 そうすると、クロージャとか考え出して、メモリ管理の問題にいきつくので、 ガベコレなしでクロージャはきついな、クロージャなしだと、無名関数の パワーは半減だなーと思う。 ちょっと構文を拡張してくれれば、あとはboostの人がshared_ptr使って、 なんとかしてくれそうな気がするんだけど。
>>998 クロージャ無しで十分使えるboost::lamdaがあるじゃないか。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。