1 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:29:45 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sageは禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.36【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1175436073/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2 名前:1 mailto:sage [2007/05/06(日) 15:30:35 ] 埋めるなら次スレ建てろよなまったく
3 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:59:20 ] 埋めるならじゃなくて、こういう板では埋めは荒らしってスタンスじゃないと(ry
4 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 17:25:42 ] 埋めたの1000だけじゃん
5 名前:デフォルトの名無しさん [2007/05/06(日) 22:22:07 ] 初めまして、C++の内部クラスについて質問があります。 例えば、OUTというクラスの中にINNERというクラスがありまして、 そのINNERクラスのメンバ関数から、OUTクラスのメンバ変数にアクセスしたいのですが、 どうすればいいのか分かりません。クラスの宣言の仕方がポイントのような気がするのですが、 メンバ関数の実装は宣言の外で個別に行いたいと思います。 どうか、ご指導、助言等よろしくお願いします。
6 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 22:29:41 ] Javaとは違うのだよJavaとは
7 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 22:33:07 ] >>5 #include <iostream> using namespace std; class Outer { friend class Inner; class Inner { Outer& outer; public: Inner(Outer* theOuter) : outer(*theOuter) { } void hoge() { cout << outer.foo << endl; } }; private: int foo; public: Outer() : foo(3) { } void hoge() { Inner inner(this); inner.hoge(); } }; int main() { Outer outer; outer.hoge(); }
8 名前:デフォルトの名無しさん [2007/05/06(日) 23:14:14 ] >>6 レスありがとうございます。 確かに検索してもJAVAの情報ばかりでした。 C++ではあまりしないのでしょうか。 >>7 プログラムまで書いて頂きありがとうございます! まだ全ては理解できていないですが、 Outerクラスのインスタンスを作った時点では、 まだInnerクラスのインスタンスは出来てないんですね。 だから、thisポインタを渡して、インスタンスを作っていると、 そこまでは分かりました。 この方法で私のしたいことが出来そうです。 本当にありがとうございました。
9 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 23:25:16 ] いやだから Javaでは親子関係がある(から外側のメンバにアクセスできる)けど C++ではただのnamespaceみたいなもんだから。 内部クラス単独のインスタンスも作れる。
10 名前:デフォルトの名無しさん [2007/05/06(日) 23:40:27 ] 質問です int hoge(char inputStr) { return inputStr == '\t' || inputStr == ' '; } 入力された引数inputStr を数値で返すというのは分かるんですが、 returnの行の動作は if(inputStr == '\t'){ return 1; } else if(inputStr == ' '){ return 0; } と同じ意味ですか?
11 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 23:48:02 ] いや、キミの書き方にあわせるとこうなる if(inputStr == '\t'){ return 1; } else if(inputStr == ' '){ return 1; } else { return 0; }
12 名前:デフォルトの名無しさん [2007/05/06(日) 23:56:29 ] >>11 ありがとうございます 解決しました
13 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 14:58:22 ] >>10 int hoge(char inputStr) { if (inputStr == '\t') { return 1; } if (inputStr == ' ') { return 1; } return 0; }
14 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:49:32 ] 振り子の振動をオイラー法を使って解析して 理論上の振動と比較するプログラムをC言語でつくっているのですが、 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3951.c このプログラムだと周期が異常に多く、何十秒にもなっていたりします。 位相が小さかったら、この場合だと大体6秒ちょっとだとおもうのですが・・・ どこをどう直せばいいのでしょうか?
15 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 09:34:21 ] まだ見てないけど、プロファイラとってみては
16 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 09:37:35 ] って実行時間じゃないのか
17 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 14:31:51 ] >>14 > /* 理論上の微分方程式の一般解 */ > double differentiation_function(double t){return ( theta_i*cos(sqrt(g/r)*t*RADIAN) );} DEG → RAD 化係数の場所が違うんでない? return (theta_i *RADIAN) * cos(sqrt(g/r)*t);
18 名前:14 [2007/05/09(水) 00:31:24 ] そもそも三角関数の使い方って、こんな感じでよかったものか・・・
19 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:31:16 ] size_t と uintptr_t って、違いが出る環境あるのか?
20 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:48:56 ] 例えばDOSのlargeモデルは ポインタ32bitでsize_tは16bit。 まあ当時uintptr_tなんて名前は無かったが。
21 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:53:20 ] >>19 違う環境は見たことないけど、 Intel 8086 あたりは違うかもしれない。
22 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:54:47 ] なるほど。
23 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:01:17 ] ファイルサイズってなぜかsize_tではないんだよな。
24 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:18:41 ] long > size_t の環境もまさに16ビット環境だな。
25 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:19:34 ] size_tを64bitの型にしなきゃいけないからね。
26 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:32:42 ] fgetpos/fsetpos の方か。
27 名前:デフォルトの名無しさん [2007/05/09(水) 19:10:40 ] Linux or OS X + GCCです。 foo.cとfoo.hがあって、 foo.hの中でvoid foo()を宣言、 foo.cの中でvoid foo()を定義してるとします。 で、bar.hとbar.cxxがあって、 class barのメンバ関数の内部でfoo()を呼んでいます。 で、これを1つにまとめてライブラリlibfoobar.aにしたいんですが、 1) ccでfoo.cをコンパイル 2) g++でbar.cxxをコンパイル 3) arでlibfoobar.aに合体 という手順を踏みました。 ところが、libfoobar.aを利用したプログラムを書くと、 libfoobar.aとリンクさせたときに undefined reference to foo() などと怒られてしまいます。 CとC++を混在させてライブラリ作る時って、 何か違う手順を踏まないといけないんでしょうか?
28 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:12:03 ] extern "C" はしてるの? あとは、cc って gcc ?
29 名前:27 mailto:sage [2007/05/09(水) 19:21:50 ] extern "C"が必要なのか。 foo.cのほうは他所から持ってきたパッケージだったので、 中をいじっておりませんでした。 extern "C"をしてきます。 さんくす。
30 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:22:09 ] foo.c の方じゃなくて、foo.h の方に必要。
31 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:24:42 ] コンパイラが違えば、 オブジェクトファイル内で識別子名に _ が付くか付かないか、 付くならどこに付くか、 とかいうややこしい問題があるんだけど、 それは大丈夫なのかね?
32 名前:27 mailto:sage [2007/05/09(水) 19:33:48 ] ccはGCCです。 foo.hはいじりたくないので、 extern "C" { #include "foo.h" } とbar.hの頭に書いたんですが、 これで問題ないでしょうか。 コンパイルは通るようになったのですが、 普通はfoo.hの中でexternすると思うので、 後になにか弊害を起こすとかありますか?
33 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:39:13 ] >>32 なら、 // foo.hpp #ifndef FOO_HPP_ #define FOO_HPP_ #ifdef __cplusplus extern "C" { #endif #include "foo.h" #ifdef __cplusplus } #endif #endif // #ifndef FOO_HPP_ ってのを作って、C++ からは foo.hpp をインクルードするといいよ。 別に弊害はないかと。
34 名前:デフォルトの名無しさん [2007/05/09(水) 19:53:46 ] s-io.net/up/3/_/jump/1178543434819723.8FBNkd
35 名前:27 mailto:sage [2007/05/09(水) 20:03:18 ] >>33 ありがとうございます。 CとC++の部分は解決したのですが、 その他所から持ってきたfoo.c/foo.hがですね、 hoge.fも使ってるんです。 hoge.fの中にSUBROUTINE hoge()があって、 今度はリンクするときにhogeがundefinedだと怒られました。 hoge.fはg77でコンパイルしています。 何か、.fも混在させる時の方法があるんでしょうか。 ググっても、1回ライブラリにしてから、というのが見つからない。 何度もすみません。
36 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:23:17 ] F77 もあるのかw すげーチャンポンだな。 それはまさに >>31 の問題があるはず。 nm コマンドを使うとオブジェクトファイル内のシンボル名一覧が表示されるけど、 gcc の出すシンボル名と g77 の出すシンボル名に違いがあるんじゃないかと思う。 gcc はシンボル名の先頭にアンダースコアを付けるけど、 g77 はまた別の形になってるんじゃないかと。 それが両方で同じになるようにアンダースコアを付けて調整すればうまくいくと思う。 あとは、そのライブラリを使う際に、 F77, C, C++ の標準ライブラリが全てリンクされる状態にしないといけない点にも注意。
37 名前:27 mailto:sage [2007/05/09(水) 21:01:49 ] >>36 なるほど。 確かにnmすると、アンダースコアがついてました。 そこを直して動きました。 ありがとうございます。
38 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:30:46 ] STLのmapのeraseなんだけど size_type erase(const key_type& x) ってことは、xはキーを指定するんだよね?
39 名前:デフォルトの名無しさん [2007/05/09(水) 23:39:49 ] class Base{ virtual void Complete(); protected: int m_nStatus; }; class A : public Base{ void Complete(){ /* A固有の処理(m_nStatusを更新) */ }; }; class B : public Base{ void Complete(){ /* B固有の処理(m_nStatusを更新) */ }; }; ↑こんなクラス構成があって、↓に格納されています。 std::vector<Base*> BaseList; 仕様変更で、新規クラスが追加されました。 これが曲者でして、Updateを呼び出すと、自分自身をベクタから削除すると いう変な仕様でして…。 class C : public Base{ void Complete(){ /* C固有の処理(自分を削除) */ }; }; これを実装するとしたら、どんな方法があるでしょうか? ヒントでもいいので、教えていただけないでしょうか?
40 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:10:05 ] Updateってやつの記述がないけど、Completeでいいのかな。 問題は自分を管理しているvectorをどうやって知るか、 どのタイミングで知るべきかってことだよね。 CのインスタンスよりもBaseListの寿命が長いことが確実なら、 std::vector<Base *> *m_pBaseList; をCに追加してコンストラクタで渡すのが手っ取り早いと思うけど。
41 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:11:58 ] >>38 それくらい、ヘルプや規格書読んだりググったりして自分で確認しようよ
42 名前:デフォルトの名無しさん [2007/05/10(木) 01:00:19 ] 環境:Linux gcc X上CUIで、マッピングが施される前のキーコード(物理的キーコード)をキーが押下された際に取得したいです。 スキャンコードまで低レベルでなくてよく、xmodmap -pk や xev で調べられる KeyCode に相当するものが丁度いいのですが、 showkey のソースを参考にした方法では /dev/console を Xサーバが握ってしまっていて不可能、 xev のソースの方法ではXウィンドウを生成せねばならず、CUI上で実装する方法が見つかりません…。 ncurses の keybound なども試してみましたがこちらはマッピング後のキー情報しか得られませんでした。 最悪 xmodmap した結果をパースして利用するなりでなんとかなるとは思うのですが、 何か都合の良い方法があるのではないかと諦めきれず質問させて頂きました。 識者の方がいらっしゃいましたらご教授くださいませ。
43 名前:39 [2007/05/10(木) 01:43:10 ] >>40 レスありがとうございます。 参考にさせていただきます。
44 名前:デフォルトの名無しさん [2007/05/10(木) 11:03:54 ] std::stringのリテラルを埋め込むにはどうすりゃいいのですか
45 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:13:12 ] リテラルの意味が分かってるんだろうか
46 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:22:21 ] >>42 その種の質問はUnixプログラミング質問スレかUnix/Linux板のほうが 回答を得られやすいと思われ
47 名前:デフォルトの名無しさん [2007/05/10(木) 22:01:06 ] 環境:タブ幅4, XP, bcc5.5.1, Cpad 猫でもわかるプログラミング / C言語編 第1部 / 第69章 ttp://www.kumei.ne.jp/c_lang/intro/no_69.htm 第70章 ttp://www.kumei.ne.jp/c_lang/intro/no_70.htm 第70章について、#include <stdlib.h>,<ctype.h>,<string.h> が抜けているのはすぐに解かるのですが、 第69章から第70章になり、変数宣言などが書き換えられてから 実行結果で"A1"が入力できずに以下のように判定されてしまいます。 if (check_location(row, col) != 0) { Locate(hOut, 0, MASU + 3); printf("そこには置けません!"); goto INP; } また、後手を選択すると"A2"も入力できず同様に判定されます、このときコンピュータは"A2"に置けます。
48 名前:デフォルトの名無しさん [2007/05/10(木) 22:01:48 ] 入力した"A1","A2"に何が入っているか調べるため printf("そこには置けません! %d,%d", row, col); とすると、(0,0)、(0,1) となり問題は無いはずなのですが 何処を直したら良いのかわかりません。第70章、第71章をコピペしても同様な状態です。 ソースどす ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3962.c 以下のsけいしさんのサイトではチェックされていませんでした。 sけいし発のホームページたち / DevC++でC++入門 ttp://skeishi.web.fc2.com/dev-cpp/neko/neko.html コメントまみれで汚いですが突っ込みお願いします。
49 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 00:09:56 ] 惜しい、猫の話じゃなければ相談に乗るんだが。
50 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 00:10:27 ] >>42 つ[XLibスレ]
51 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 14:58:41 ] >>48 printf("そこには置けません! %d,%d, %d", row, col, ban[row][col] ); こうすると、A1の時にはban[0][0]になんか値が入ってるぞ。 値が入ってたら、check_locationが!0を返すのは仕方ない事だな。 で、main()の宣言直後に初期化してみたが、 // init for ( row=0; row<MASU; ++row ) for ( col=0; col<MASU; ++col ) ban[row][col] = 0; それでも現象が変わらんね。 調べるのが面倒になったから、check_locationを改変してお茶を濁す。 int check_location(int row, int col) { if (ban[row][col]!=1 && ban[row][col]!=2) return 0; else return -1; } これでA1に置けるようになったぞ。 でもなんか石を取るロジックとかバグ多くないか?w
52 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:30:51 ] class A { public: virtual A& a() { return *this; } }; class B : public A {}; int main() { B b = A().a(); } とするとAをBに変換できないって怒られるけど、いちいちBでもa()をオーバーライドしないとダメ? 理屈は分かるんだけど、継承してるんだから勝手に変換してくれりゃいいのに・・・ ↑みたいなことやるのに何か良い方法ないですか?
53 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:42:31 ] >>52 > B b = A().a(); では B(const A&) というコンストラクタが呼ばれる事になる。 だから、それを作る必要がある。
54 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:55:35 ] >>53 サンクス。派生するたびにいちいち面倒な・・・ Bから呼ばれたa()のthisはBのポインタなんだからBに代入できても良いと思うんだけどなぁ。 なんで勝手に virtual B& a() を定義してくれないんだろう。
55 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:58:34 ] 情報が足りないんだから当たり前じゃ。
56 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:03:58 ] >>54 Bから呼ばれたってどういうこと? >>52 では A() に対して a() を呼び出してるんだろ。 B& なんて返せるわけ無い。
57 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:10:59 ] virtual B& a() が勝手に定義されるなど、なんて恐ろしい((((;゚Д゚)))ガクガクブルブル
58 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:00:41 ] sizeof(A) != sizeof(B) だったらどうなると思う?
59 名前:42 [2007/05/11(金) 23:25:57 ] アドバイス・誘導をして頂いた方、ありがとうございます。 微妙なスレ違いで申し訳ありませんでした。
60 名前:デフォルトの名無しさん [2007/05/12(土) 00:10:17 ] printf("%s/n","Hello World"); 上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。 どなたかご教授して下さい。
61 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:23:25 ] XのCUIってどういうこと?xterm上で起動してたりしたら、 それを検出してX->xtermの入力を掻っ払うってはなし? ktermとかmltermとかだったり、間にscreenがはさまってたり、 したらどうするわけ?
62 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:29:52 ] 爪楊枝でとる
63 名前:デフォルトの名無しさん [2007/05/12(土) 00:34:05 ] すいません,c++勉強始めたばかりの超初心者です. とあるc++のソースをc#に書き換えるという作業をしているのですが,下記記述の意味がわかりませんでした. MyClass* mc; mc = (Myclass*) aList -> at(n); aListは List* aListで宣言してあります. なぜリスト型のポインタの前で,再度クラスのポインタを()の中に記述するのでしょうか? どうぞよろしくお願いいたします.
64 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:36:25 ] 優先順位。 mc = (Myclass*) ( aList -> at(n) );
65 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:47:46 ] >>63 それはキャスト演算。 aListは、T型のオブジェクトを要素としてやりとりするようになっているのだと思う。 (Tが何なのか俺にはわからないので、これは仮称) そしてaList->atの戻り値の型はT*。 MyClassはTから派生しており、MyClassへのポインタへダウンキャストしているのだろう。 C#はわかるというなら、aListの型がSystem.Collections.ArrayList、 T*はobject、atをインデクサだと思えば事情は大体同じ。
66 名前:63 mailto:sage [2007/05/12(土) 01:02:07 ] >>64 >>65 ありがとうございました. キャストだったんですね...ポインタにキャストできるって初めて知りました. また考えてみます.
67 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 01:18:27 ] >>60 const char* str = "Hello World"; printf("%s/n", str); こう書けばわかるか?
68 名前:デフォルトの名無しさん [2007/05/12(土) 01:53:38 ] >>67 strのポインタが指す'H'のアドレスから'\0'までの文字を%sが文字列として表示してくれる ということですか?
69 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 01:57:00 ] >>51 ban[row][col]、気がつきませんでした、値が入ってしまってますね。 初期化と改変の流れまで教えていただきありがとうございました。 ロジックは猫に習ってということで、 あとあとリバーシのアルゴリズムを勉強するときにちゃんとしたものをゴリゴリします。
70 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 10:32:53 ] >>68 「printf 書式指定」でググるか、開発環境に付いてるマニュアル読め
71 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:52:41 ] sprintf使ってみ
72 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 20:23:20 ] std::stringを継承して、メンバ関数を増やしたクラスを作りたいんですが、 (具体的には、中身UTF-8nに特化した文字列クラスを作りたい) class my_string : public std::string { public: my_string() : std::string() {} my_string(const char* src) : std::string(src) {} my_string(const my_string& src) : std::string(src) {} … } こんな感じでコンストラクタをずらずら書いていって、 あとは自分の好きなだけメンバ関数増やしていくだけで大丈夫ですか?
73 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 20:43:44 ] >>72 std::string はデストラクタがバーチャルじゃ無いので、 オブジェクトの削除時には注意が必要。 具体的には、 std::string *str = new my_string("('A')"); ... delete str; とやるとstd::stringのデストラクタが呼ばれてしまう。 ほとんどの場合は大丈夫だと思うのだけど、 ふとした拍子にはまることになるかもしれない。
74 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 09:14:28 ] wstringでも使っとけ
75 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 14:59:30 ] 関数の前にコロンを二つ付けるのは 何の意味があるんでしょうか?
76 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:21:14 ] aが1かそれ以外になるタイミングはプログラマが完全に把握でき、 処理nanntokaが頻繁に起こる場合において、 //hinnpann if(a==1){ //nanntoka } とするか //junnbi void voidfunc(){}//何もしない関数 void nanntokafunc(){ /* nanntoka */ } void(*pfunc)();//a==1ならnanntokafuncが、それ以外ならvoidfunc //hinnpann pfunc(); とするかでは、後者の方が条件判断をしない分早いんですか? それとも無駄に何もしない関数にジャンプする分だけ遅いんですか? あと歯を磨くのが面倒くさいので、 手軽に口内の歯垢を生成する菌そのものを除去するオススメの方法って知りませんか?
77 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:26:54 ] >>76 速度は実測が基本。 菌の除去には強酸を使うのはどうだろう? 塩酸とか硫酸とかでよーくうがいすれば、きっと菌なんて生きてられないはず。
78 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:27:45 ] >>75 スコープ解決演算子
79 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:32:41 ] やっぱりCPUによって違いますよね・・・。 「頻繁」とか、曖昧な表現をしてすみませんでした。 塩酸や硫酸は、練り歯磨き粉に入ってる分だけでも痛いのに リステインなどは泣きそうになるほど厳しいです。 ミュータンス菌も生きるために必死だから、そうそううまい話なんてありませんよね。
80 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 18:11:27 ] 水酸化ナトリウムや水酸化カリウムなんかの強塩基でも菌を破壊できます。
81 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 19:35:17 ] >>75 グローバルスコープだね。 ローカルと明示的に分ける場合に必要
82 名前:デフォルトの名無しさん mailto:age [2007/05/13(日) 20:29:41 ] // Foo.h class Foo { private: int a; public: static int GetA() const }; // Foo.cxx #include "Foo.h" int Foo::GetA const { return a; } っていうのは、なんか間違ってますか? GCCで ./include/Foo.h:6: error: static member function 'static int GetA()' cannot have cv-qualifier src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers と怒られます。 staticメンバ関数ってconstに出来ないんでしょうか。
83 名前:82 mailto:sage [2007/05/13(日) 20:31:18 ] 簡略化して書くときに書き間違えました。 実際には、int aはstaticになっていて、 Foo.cxxの中で定義されてます。
84 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:34:34 ] staticはthisがないという指定なのに、 thisをconstにする指定を併用しても仕方ない
85 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:34:35 ] >src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers intt? セミコロンもないし、単純ミスじゃね?
86 名前:82 mailto:sage [2007/05/13(日) 20:40:11 ] >>84 あー、なるほど。そういうことですか。 >>85 実際のコードはもっと長いので、 抜き出して書いてます。 inttとか、GetAに()がついてないのとかは、 簡略化したときの打ち間違い。 ってーことは、例えばGetAの中でa++とかやったりとかして、 const関数にしておけばコンパイラが注意してくれるのに、 っていうのは期待できないということですか。
87 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:44:51 ] 簡略化するときに何カ所も間違えるようなうっかりさんは、 実際のコードでもミスしてそうだな
88 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:48:20 ] エラーメッセージはコピペだろうから、 intt ってのはリアルで間違ってんじゃね?って思って指摘したんだけどな
89 名前:82 mailto:sage [2007/05/13(日) 21:00:52 ] 本当に申し訳ございませんでした。 皆さん、ありがとうございます。
90 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 21:56:10 ] すみません。ポインタの素朴な疑問です。 いれこの構造体enemyを固定領域に確保したいときは struct enemy { short mainface; short b; struct POS Pos[32]; }; struct POS { short X; short Y; }; struct enemy *enemy_struct; enemy_struct = (enemy*)malloc(sizeof(struct enemy)); でいいんですか? あとsizeof(struct enemy*)=4ってなるんですけど struct enemy *enemy_struct;で消費されるenemy型へのポインタの メモリ領域は4Byteってことですか? よろしくお願いします。
91 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:04:45 ] >struct enemy *enemy_struct; >enemy_struct = (enemy*)malloc(sizeof(struct enemy)); >でいいんですか? だめです。型違いです。 >あとsizeof(struct enemy*)=4ってなるんですけど struct enemy *enemy_struct;で消費される4byteでおけ
92 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:11:23 ] んんん?問題なくね?
93 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:17:37 ] ... = (enemy*)malloc( ...
94 名前:90 mailto:sage [2007/05/13(日) 23:18:34 ] すんません。型違いということは ..=(struct enemy *)malloc(.. と訂正すればいいんですか?
95 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 01:01:39 ] >>94 そうだね。それでおk。 実際コンパイルしてみて確認すればいいと思うよ。 入れ子であっても特に使い方に変わりはないよ。 自己参照構造体と呼ばれる特殊な入れ子は慣れるまで厄介(慣れれば便利) なんだけど、今回はそれじゃないし。 にしても、short変数とか微妙なの使うなあ。 ところでstructが省略できないって事はCを使用しているんだね。 C++では省略が許されたはず。「//」によるコメントみたいに C++で先に作られてから後になって、ANSIがCの文法として認めたものも あるから将来は>>90 のような書き方も許されるかも。 まあtypedefすれば良いだけなんだけどね。
96 名前:デフォルトの名無しさん [2007/05/14(月) 01:08:45 ] printf("1¥n"); printf("2¥n"); printf("3¥n"); としたあとに1、2、3を4、5、6と上書きしたいんですが、 CRで先頭に戻るのは分かるのですが(最終行は上書き可能)、 1行前に戻るってのはできるんでしょうか?
97 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 01:18:53 ] それは処理系依存な方法を使わないとダメ エスケープシーケンスとか、ConsoleAPIとか
98 名前:96 mailto:sage [2007/05/14(月) 01:26:38 ] >>97 すいません。環境書き忘れてました。(VT100相当) エスケープシーケンスでググって、 printf("¥x1b[3A"); で解決しました。 ありがとうございます。
99 名前:デフォルトの名無しさん [2007/05/14(月) 01:52:37 ] >>90 のやり方でもコンパイルは通るんだな。
100 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 12:50:17 ] asdf<int (int)> a; みたいな事がしたいんですが、asdfの定義はどういう風にすれば良いかはなんてググれば詳しく出てくるんでしょうか