CからC++に移行中の人が質問するためのスレ

このエントリーをはてなブックマークに追加
901デフォルトの名無しさん:2008/03/07(金) 00:03:12
C++への移行とはなんの関係もないな。

stdcallは関数呼出の方法の1つ。引数を渡すのに使ったスタックポインタを戻す役目が
呼び出された関数側にあるのが普通と違う。

呼び出された関数側でスタックを戻すと、x86ではややコードを短くできるので
16ビット時代には重宝された。今では結構どうでもいい。
(16ビットのときにはstdcallなんてなかったけど)

32ビットWindowsが__stdcallを多用している関係上、
こっちが作る関数でも__stdcallの指定を要求されることがある。
また、Windowsでは他の言語でも
stdcallのDLL関数は呼び出せるというものが多い(VBとか)というのは利点と言える。
だから、DLLで公開する関数には付けておけ。
あとはWinMainとか必要なものに付けるという感じ。




902デフォルトの名無しさん:2008/03/07(金) 06:54:41
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
574 名前:デフォルトの名無しさん[] 投稿日:2008/03/08(土) 14:23:43
585 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/08(土) 14:20:47
http://yutori.2ch.net/test/read.cgi/news4vip/1204952244/

   1 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2008/03/08(土) 13:57:24.68 ID:oVsMTN3J0
     次世代言語”D言語”を使ってプログラミングをしてみよう!
     C++で挫折した君も、プログラミング初心者の君も今日からプログラマーだ!

     D言語入門 http://www.geocities.jp/tor_park/Dlang/d2.html
906デフォルトの名無しさん:2008/03/10(月) 00:07:27
初歩的な質問ですみません、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();
}
907デフォルトの名無しさん:2008/03/10(月) 00:35:43
Test1の定義より先にclass Test2;と書いておく。
これ、前方宣言という。
908デフォルトの名無しさん:2008/03/10(月) 01:24:45
>>907
ご教授ありがとうございます。
前方宣言をしてみたところ、
クラス、構造体、共用体にデフォルト コンストラクタがありませんなど、
他3つのエラーが出て困っていたのですが、”前方宣言 c++”で検索をして
同様な処理の対処方法が書いてある下記のページにたどり着きました。
ttp://archive.mag2.com/0000251805/20080129090000000.html

ありがとうございました。
909デフォルトの名無しさん:2008/03/10(月) 01:35:35
上記を元にこのように修正しました。
// 前方宣言
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
お世話になりました。
910デフォルトの名無しさん:2008/03/10(月) 14:27:03
>>908
そのメルマガ、著者の知識が偏っているから要注意ね。
--
C++言語では、

struct _stFoo
{
int member1;
double member2;
};

と定義すればそのまま、

_stFoo stfoo;

と、型として変数定義することができる。
--
流石にこれはないだろw
911デフォルトの名無しさん:2008/03/10(月) 22:23:13
>>910
引用箇所の問題点がよく分からん。予約名を使ってるのが悪いのか?
912デフォルトの名無しさん:2008/03/11(火) 22:39:53
Cだと、
struct hoge { ... };
struct hoge hage;
としなければならないのを、
C++では、
struct hoge { ... };
hoge hage;
でもおkだよ、というのを説明してるんだろうけど、何が問題なのかはよく分からんな。
913デフォルトの名無しさん:2008/03/12(水) 19:59:14
namespaceの意味が分からん・・
914デフォルトの名無しさん:2008/03/12(水) 20:13:57
事務課の田中小枝子さんと
秘書課の田中小枝子さんを区別するためにある

秘書課に田中小枝子さんが二人いた場合は
部長の愛人の田中小枝子さんと
課長の愛人の田中小枝子さんで区別しろ
915デフォルトの名無しさん:2008/03/13(木) 10:19:20
>>914
みな同一人物のヤリマンというわけですね!
916デフォルトの名無しさん:2008/03/13(木) 10:30:11
>>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つけるとなにがいいのかな?
918デフォルトの名無しさん:2008/03/18(火) 07:33:27
タイプ数削減。virtual HRESULT __stdcallの短縮になっている。
919デフォルトの名無しさん:2008/03/23(日) 01:36:00
ありがとう
920age:2008/03/23(日) 22:11:20
ユニドライバのソースにでてくるPOEMDEV とはなんですか?
型なのはわかるんですが。。。あとユニドライバの開発に詳しい人
いたらお金を出すので専属で俺に指導してくれませんか?

質問はメール。場合により電話
報酬は月5万円固定。

でお願いします。「俺はユニドライバにくわしいぜ!」というやつ
いたら [email protected] におねがいします。m(_ _)m
921デフォルトの名無しさん:2008/03/25(火) 22:16:50
>>920
pOemDev
922デフォルトの名無しさん:2008/03/31(月) 12:34:24
__stdcallの中でDのクラス生成したりすると速攻で落ちるのはなぜですか?
923デフォルトの名無しさん:2008/03/31(月) 15:39:16
ma ti ga i ma si ta
924デフォルトの名無しさん:2008/04/03(木) 09:32:35
>>921
いい事いうじゃねえか。
で、やれるんだな?
今すぐ頼むぞ。
925デフォルトの名無しさん:2008/07/07(月) 21:22:41
すいませんが、
構造体の代入についてなんですけど、

struct papa{
int number; int mama_number;
}

struct papa menber[5000];

for(i=0;i<5000;i++){
menber[i]={i,i};
}

これをC++なら実現可能ということなので、
ヒントだけでも教えてください。すいません。
926デフォルトの名無しさん:2008/07/07(月) 21:47:13
Cでもキャストしたら入らないかな?
= (struct papa){i,i}
とりあえず手元のGCC4.1.2ではできたけど...
927926:2008/07/07(月) 21:50:07
連投失礼。C++の場合はCスタイルのキャストは余り好ましくないとされるので注意。
メンバ変数はprivateにして、メンバ関数でアクセスが普通のやり方じゃないかな?
928デフォルトの名無しさん:2008/07/08(火) 05:44:24
>>926
それ確か//なんかと同じでgcc拡張
929デフォルトの名無しさん:2008/07/08(火) 08:16:13
>>928
C99から標準。
930デフォルトの名無しさん:2008/07/17(木) 21:39:08
クラス指向の概念は理解できましたが、その設計構築がいまいち理解できません
どこかクラス設計の解説に長けているサイトや書籍はありませんか?
931デフォルトの名無しさん:2008/08/11(月) 00:52:55
VC2005以外のC++でも1つのクラスに属する関数を複数のcppファイルに
分けて記述することは可能ですか?
Cのextern宣言みたいなものは必要でしょうか。
932デフォルトの名無しさん:2008/08/11(月) 06:39:01
#include
933デフォルトの名無しさん:2008/08/11(月) 20:01:46
できるお
classを宣言したヘッダをインクルードしておけばいいお
934デフォルトの名無しさん:2008/08/11(月) 20:36:17
>>932-933
ありがとうございました
935デフォルトの名無しさん:2008/09/22(月) 13:08:26
char[]ではなくstringクラスを使うにあたって
itoa()やatoi()にあたるコードはC++ではどう書くべきでしょうか
936デフォルトの名無しさん:2008/09/22(月) 13:14:23
>>935
std::istringstream is(str);
is >> a;
937デフォルトの名無しさん:2008/09/22(月) 13:15:10
もしくはboost::lexical_cast

というかlexical_castは内部的に>>936のようなPSEUDOコードを
使っている
938デフォルトの名無しさん:2008/09/22(月) 13:17:40
>>935
大仰にしたくなければatoi(str.c_str())でもOK。
itoa()は使わないに越したことはないからstringstreamかね。
939デフォルトの名無しさん:2008/09/22(月) 14:42:12
>936
なるほど、stringstream系を通すと変換できるのですね。

>937
boost はまだ試していないのですが、色々便利そうです。
そのうち試してみます。

>938
折角C++なのでC++流に書いてみます。
本来ならCでもsprintf()やsnprintf()を使う場面ですが
説明しやすいためitoa()と書いてしまいました。
940デフォルトの名無しさん:2008/09/22(月) 17:58:05
凄い基本的な(?)ことで申し訳ないんですが

coutとprintfは同時に使えないんでしょうか?
コンパイルは通りますが、実行時にprintfのところでエラーが出ます。
ヘッダを色々変えてみたり、using namespace std;をつけたり外したりしましたが駄目でした。

よろしければお願いいたします。
941デフォルトの名無しさん:2008/09/22(月) 18:12:39
確か使える保証はないと書かれてたはず……だがどこに書いてあったか思い出せない。
一応バッファリングの問題とかがあるからね。
Boostが使える環境ならcout、そうでないならprintfの方が便利だと、俺は思う。
942デフォルトの名無しさん:2008/09/22(月) 18:18:21
>>940
処理系は?
943デフォルトの名無しさん:2008/09/22(月) 18:20:03
>>940
エラーメッセージは何て言ってる?
944デフォルトの名無しさん:2008/09/22(月) 18:42:31
>>940
混在させるとバッファリングの関係で出力に影響があるかも知らんが、
実行時エラーにはならないと思うんだ。
何かprintf()の使い方を間違っているんじゃないか?
# printf(str.c_str())していて、strの中身に%が含まれているとかw
945デフォルトの名無しさん:2008/09/22(月) 19:29:56
>>944
初心者の頃にやったなあw
最初の頃はprintf("%s",str);とか思いつかなかった。
946940:2008/09/22(月) 20:26:06
ありがとうございます
てことは私が何かポカしてる可能性が高いんですね
明日もう一度確認してみます

>>942
VC2005です

>>943>>944
今手元に無いんですが
「メモリが“read”になることができない」
「メモリが"written"になることはありませんでした」みたいなエラーです
まずい領域を参照したみたいな
でも printf("a"); でもエラー吐くんですよね
947デフォルトの名無しさん:2008/09/22(月) 20:26:35
げ、sage忘れたorz
948デフォルトの名無しさん:2008/09/22(月) 20:46:28
>>940
std::sync_with_stdio()はtrueを返すよね?
949デフォルトの名無しさん:2008/09/23(火) 05:36:17
>944-945
って言うか printf(変数) は危ないよ
第一引数は必ずフォーマットか文字列中に%を含まないと確実に保証できる文字列にすべき
それが問題になったソフトウェアは結構あるらしいしな
950940
解決しました
別の場所で配列に値を入れるところで、変なアドレスに値を入れていたみたなんですが
どういうわけかprintfの部分でエラーが出るようになっていたようです
そもそも最小構成で試してみたら全く問題ありませんでした

お騒がせして申し訳ありません