#define 等の#がつくプリプロセッサ関連はグローバルらしい
例えば、
class {
#define std::deque MYQUEUE
#define COUNT 100
//省略
};
としてしまった場合、これを宣言した後、MYQUEUE,COUNTはソース全体に影響を及ぼします。
クラス内だけではないのです!!!!
でも、typedef enumは大丈夫みたいです。
class {
typedef std::deque MYQUEUE
enum{ COUNT = 100,};
//省略
};
これならクラス内のみに影響を及ぼします。
うーん。この方が無難だ。
#defineはコンパイルの設定だけに使うのが良いと思いますが、どう思いますか?
(むか〜し、どっかに#defineを多用して自作言語を作ろうなる記事があったがかなり邪道だなぁとつくづく思う。
インタプリタ(スクリプト言語?)くらい作らんかい!!!
あ、そうだ、インタプリタの作り方の記事をまだ書いていないなぁ。( 12:47 2003/05/05現在 )
抽象クラスの派生先にZeroMemoryを使うな!ヴぉけ!
タイトルどおりです。
DxLibSetupというライブラリを作っていた時、アップキャストができないんですよ!!!
なんでやねん!!!デヴァッカ(debugger)で見ると、関数へのポインタテーブルの中身がすべてNULLなんですよ!!
確かに派生先にZeroMemoryを使って、コンストラクタでクラスの内容をすべて抹消してた。
なので、アップキャストした時、コンストラクタが呼び出され、せっかく代入された
関数のポインタテーブルのアドレスを抹消されてしまうんです。
この事については、私の師匠のDxLibの管理人さんに指摘していただきました。ありがとうございました。
以下にサンプルを示します。
d金魚はやっぱり馬鹿だった!
ヾ(`◇´)ノ彡☆コノ!バカチンガァ!!
前に、
こんな記事を書いた。
ほんとに馬鹿だった。確かに、C言語の教科書に書いていることと違ってて私は大発見?
とまで、思っていたのだ。しかし、甘かった。
ヴァレンタインのチョコより甘いのだ(2月14日に執筆)
私の環境だと、以下のような
馬鹿プログラムも易々と動くのだ。
やっぱり、
d金魚はヴァカだったのね!
と、見事に曝け出してしまった。
(/ω\) ハジュカシィー・・・(/ω・\)チロ・・
なんか、上手くビルドできなかったら中間ファイルやいろんなものは捨てちゃえ!
特にstdafx等のプリコンパイル済みヘッダを使っているとこういう事態になったりします。
私としては原因がわからないのでタイトルどおりの方法をとっています。
つまり、VisualC++が丁寧に作ってくれるDebugとReleaseフォルダを捨ててしまいます!
(DebugやReleaseに入っている大事なファイル(自分が作った画像ファイル等)を除いて)
これでコンパイルできなかったらこのページに書いていることの中にヒントがあるかもしれません。
inline関数はあヴない,危ない!?
inline void my_inline(){}みたいな関数しってますよね^^;
先頭にinlineつけるやつ。わずか数行の関数の場合は高速化が期待できる関数です。
ヴっちゃけ、マクロみたいな事(あくまで"みたい"な事)が関数で表現できるってやつです。
さて、デバックビルドだと関数類はインライン展開されないんだそうです。
で、リリースビルドの時にインライン展開されるんだそうです。
よって、以下の関数でヴァぐっちゃいました。
ぐふ!stdafx.hをstdafxだけだからプリコンパイル済みヘッダが機能しない…
タイトルのとおりです。
stdafx.cppの作成の設定の所がstdafxだけになっていたのでいつまでたってもエラー。
はうう。…ぐふ。もう(´ρヾ) ネムネムゥー。
~~(*/>_<)oシ・シヌー (~△~)ネムイ。。。(~ε~)マジネムイ。。。( ~◇)Zzz
睡魔が。。。(;ωゞゴシゴシ・・・
ウトウト(〃´`)〜o○◯・・・
(-o-;) お(^◇^;)や(◎。◎;)す(T0T) み・・・
参照の配列を作らせろ!!!!
error C2234: '' :参照の配列は宣言できません。
ふざけるなヴァカ野郎!!
ジャンプテーブルつくっていてテンプレートでかつ参照にしてやったのになんだよ!C++!
よって引数にアクセスするのにすべてアロー演算子に直すはめに…
C++のバカヤロー!
クラスを使っていてアップキャストとかしてデリートするとメモリがうまく開放できない言語なんて糞だぁ!
いつかdKingyo言語というコンピューター言語を作るぞ!
略してD言語…なんかもう存在しそう…
ヘッダーを間違えるとすごいエラー
ヘッダーを間違えるとすごいエラーになる。
以下のエラー数を見よ!
どうだぁ!!!!!!!(暴爆!
さて?原因はなんなのでしょうか?
答えは簡単!!!!!
ヘッダファイルのプロトタイプ宣言のところの;を:にしていたのだ…情けない。
以下のような感じ。
extern _inline void TaskOfDrawChipMap(DATA& g):
#endif
//訂正
extern _inline void TaskOfDrawChipMap(DATA& g);
#endif
ポインタの配列の最後はNULLだ!!
ポインタ配列の最後はNULLらしい。
前回のすべての配列を初期化するには注意が必要
で述べたように+1をすると書いたが、ポインタの配列では最後はNULLでないといけないらしいので+1とするとエラーである。
最後の配列がなぜか初期化されない日
どもども。d金魚で〜す。
初心者d金魚がよく陥るバグ最後の配列が初期化されない。
たとえ〜ば、
と,やっていくと最後の100番目の配列は初期化されない(爆
何故なら、配列は0番目も実体を持っているからである。
よって100+1で101個持っている。
しかし、charの配列は例外である。
最後にNULL文字が入るらしいので宣言した数しか使えない。
char str[100]だったら100個の1バイト文字列しか入らないと思った。
えーっと初期化には配列よりポインタの方が使われるからあまり意識しなくていいかな^^;
char *str="abcdefghijklmnopqrstuvwxyz";
また、初期化にはmemset関数やZeroMemory関数があるのでそれについても調べた。
そしたら意外な事実が…。sizeof(a) (aは配列の名前)として渡しても、aの最後の配列の中身は初期化されないのだ!
うーん。つまり完璧に初期化するには+1とかするべきなんだなぁ。と。実感。
以下にテストプログラムを示す。
もしかしたらこれはVisualC++の仕様か!?
んなわけね〜か^^;(秘儀:仕様のせいにするプログラマー)
加筆修正:2003年2月14日
以上に示したのは私の間違いです。信用しないで下さい。
そして信用してしまった皆様(見ている人はいないと思いますが^^;
ごめんなさい ペコm(_ _;m)三(m;_ _)mペコ
構造体でNULL==無効。よってアクセスするなボゲェ^^
あうう。赤てんが…な日
構造体の配列を宣言し最後まで使いきったら、使いきる前にその配列にいらないデータがあって、
それを削除するとフラグメンテーションが起き、その時、空いた時の配列のアドレスをポインタで
指し示す配列を用意していた。(なんか伝わりにくいな。フラグメンテーションって何?みたいな^^;
よって配列がNULLの時にはさししめす場所がないのでその構造体の示すアドレスを元にアクセスするとエラーである。
なぜ、こんなのに気づかないかな。わたし^^;
forの恐怖
もうすぐで2期試験の火
さて、以下のプログラムを見て欲しい。
以下が例