C++への移行とはなんの関係もないな。
stdcallは関数呼出の方法の1つ。引数を渡すのに使ったスタックポインタを戻す役目が
呼び出された関数側にあるのが普通と違う。
呼び出された関数側でスタックを戻すと、x86ではややコードを短くできるので
16ビット時代には重宝された。今では結構どうでもいい。
(16ビットのときにはstdcallなんてなかったけど)
32ビットWindowsが__stdcallを多用している関係上、
こっちが作る関数でも__stdcallの指定を要求されることがある。
また、Windowsでは他の言語でも
stdcallのDLL関数は呼び出せるというものが多い(VBとか)というのは利点と言える。
だから、DLLで公開する関数には付けておけ。
あとはWinMainとか必要なものに付けるという感じ。
DLLで公開する関数って WINAPI でないの?
903 :
デフォルトの名無しさん:2008/03/07(金) 07:06:10
__stdcallの別名がWINAPI
904 :
デフォルトの名無しさん:2008/03/08(土) 14:09:51
関数名におまんこぜんかいって名付けると運気アップ
905 :
デフォルトの名無しさん:2008/03/08(土) 14:24:16
初歩的な質問ですみません、c++で下記のような動作をするクラスを作る場合、
Test2宣言についてどうやればいいのかわかりません。
検索エンジンでクラス定義について調べたのですが参考となるものが見つからなくて…
ご教授してくださると助かります。
#include <stdio.h>
class Test1{
public:
Test2 *pT2; // ←意図的にTest2のクラスを呼び出したい
void print(){printf("test1\n");}
void test(){
pT2 = new Test2();pT2->print();delete pT2;
print();
}
};
class Test2{
public:
Test1 *pT1;
void print(){printf("test2\n");}
void test(){
pT1 = new Test1();pT1->print();delete pT1;
print();
}
};
void main(){
Test1 t1;Test2 t2;
t1.test();t2.test();
}
Test1の定義より先にclass Test2;と書いておく。
これ、前方宣言という。
上記を元にこのように修正しました。
// 前方宣言
class Test2;
class Test1{public: Test2 *pT2;void print();void test();};
class Test2{public: Test1 *pT1;void print();void test();};
void Test1::print(){printf("test1\n");}
void Test1::test(){printf("Test1::test()の呼び出し :");pT2 = new Test2();pT2->print();delete pT2;}
void Test2::print(){printf("test2\n");}
void Test2::test(){printf("Test2::test()の呼び出し :");pT1 = new Test1();pT1->print();delete pT1;}
void main(){Test1 t1;Test2 t2;t1.test();t2.test();}
出力結果
Test1::test()の呼び出し :test2
Test2::test()の呼び出し :test1
お世話になりました。
>>908 そのメルマガ、著者の知識が偏っているから要注意ね。
--
C++言語では、
struct _stFoo
{
int member1;
double member2;
};
と定義すればそのまま、
_stFoo stfoo;
と、型として変数定義することができる。
--
流石にこれはないだろw
>>910 引用箇所の問題点がよく分からん。予約名を使ってるのが悪いのか?
Cだと、
struct hoge { ... };
struct hoge hage;
としなければならないのを、
C++では、
struct hoge { ... };
hoge hage;
でもおkだよ、というのを説明してるんだろうけど、何が問題なのかはよく分からんな。
namespaceの意味が分からん・・
事務課の田中小枝子さんと
秘書課の田中小枝子さんを区別するためにある
秘書課に田中小枝子さんが二人いた場合は
部長の愛人の田中小枝子さんと
課長の愛人の田中小枝子さんで区別しろ
>>914 みな同一人物のヤリマンというわけですね!
>>913 俺ライブラリ
namespace oreore{
template<class Ty>
void foo(Ty x) {
bar();
}
}
自作プログラム
namespace oreore {
void bar() {
}
}
int main() { ... }
このように既存のライブラリに機能を付け加えて、
どの関数が呼ばれるのか分かりにくくする目的がある
917 :
デフォルトの名無しさん:2008/03/18(火) 01:09:24
STDMETHODつけるとなにがいいのかな?
タイプ数削減。virtual HRESULT __stdcallの短縮になっている。
919 :
デフォルトの名無しさん:2008/03/23(日) 01:36:00
ありがとう
920 :
age:2008/03/23(日) 22:11:20
ユニドライバのソースにでてくるPOEMDEV とはなんですか?
型なのはわかるんですが。。。あとユニドライバの開発に詳しい人
いたらお金を出すので専属で俺に指導してくれませんか?
質問はメール。場合により電話
報酬は月5万円固定。
でお願いします。「俺はユニドライバにくわしいぜ!」というやつ
いたら
[email protected] におねがいします。m(_ _)m
__stdcallの中でDのクラス生成したりすると速攻で落ちるのはなぜですか?
ma ti ga i ma si ta
>>921 いい事いうじゃねえか。
で、やれるんだな?
今すぐ頼むぞ。
すいませんが、
構造体の代入についてなんですけど、
struct papa{
int number; int mama_number;
}
struct papa menber[5000];
for(i=0;i<5000;i++){
menber[i]={i,i};
}
これをC++なら実現可能ということなので、
ヒントだけでも教えてください。すいません。
Cでもキャストしたら入らないかな?
= (struct papa){i,i}
とりあえず手元のGCC4.1.2ではできたけど...
927 :
926:2008/07/07(月) 21:50:07
連投失礼。C++の場合はCスタイルのキャストは余り好ましくないとされるので注意。
メンバ変数はprivateにして、メンバ関数でアクセスが普通のやり方じゃないかな?
クラス指向の概念は理解できましたが、その設計構築がいまいち理解できません
どこかクラス設計の解説に長けているサイトや書籍はありませんか?
VC2005以外のC++でも1つのクラスに属する関数を複数のcppファイルに
分けて記述することは可能ですか?
Cのextern宣言みたいなものは必要でしょうか。
#include
できるお
classを宣言したヘッダをインクルードしておけばいいお
935 :
デフォルトの名無しさん:2008/09/22(月) 13:08:26
char[]ではなくstringクラスを使うにあたって
itoa()やatoi()にあたるコードはC++ではどう書くべきでしょうか
>>935 std::istringstream is(str);
is >> a;
もしくはboost::lexical_cast
というかlexical_castは内部的に
>>936のようなPSEUDOコードを
使っている
>>935 大仰にしたくなければatoi(str.c_str())でもOK。
itoa()は使わないに越したことはないからstringstreamかね。
>936
なるほど、stringstream系を通すと変換できるのですね。
>937
boost はまだ試していないのですが、色々便利そうです。
そのうち試してみます。
>938
折角C++なのでC++流に書いてみます。
本来ならCでもsprintf()やsnprintf()を使う場面ですが
説明しやすいためitoa()と書いてしまいました。
凄い基本的な(?)ことで申し訳ないんですが
coutとprintfは同時に使えないんでしょうか?
コンパイルは通りますが、実行時にprintfのところでエラーが出ます。
ヘッダを色々変えてみたり、using namespace std;をつけたり外したりしましたが駄目でした。
よろしければお願いいたします。
確か使える保証はないと書かれてたはず……だがどこに書いてあったか思い出せない。
一応バッファリングの問題とかがあるからね。
Boostが使える環境ならcout、そうでないならprintfの方が便利だと、俺は思う。
>>940 混在させるとバッファリングの関係で出力に影響があるかも知らんが、
実行時エラーにはならないと思うんだ。
何かprintf()の使い方を間違っているんじゃないか?
# printf(str.c_str())していて、strの中身に%が含まれているとかw
>>944 初心者の頃にやったなあw
最初の頃はprintf("%s",str);とか思いつかなかった。
946 :
940:2008/09/22(月) 20:26:06
ありがとうございます
てことは私が何かポカしてる可能性が高いんですね
明日もう一度確認してみます
>>942 VC2005です
>>943>>944 今手元に無いんですが
「メモリが“read”になることができない」
「メモリが"written"になることはありませんでした」みたいなエラーです
まずい領域を参照したみたいな
でも printf("a"); でもエラー吐くんですよね
げ、sage忘れたorz
>>940 std::sync_with_stdio()はtrueを返すよね?
>944-945
って言うか printf(変数) は危ないよ
第一引数は必ずフォーマットか文字列中に%を含まないと確実に保証できる文字列にすべき
それが問題になったソフトウェアは結構あるらしいしな
950 :
940:
解決しました
別の場所で配列に値を入れるところで、変なアドレスに値を入れていたみたなんですが
どういうわけかprintfの部分でエラーが出るようになっていたようです
そもそも最小構成で試してみたら全く問題ありませんでした
お騒がせして申し訳ありません