d金魚のC言語(C++も混じる)の愚痴



明鏡止水に戻る
更新情報はTOPページにかいています。

swapプログラムの罠


メモリをスワップさせる関数を作った。
見事にバグった。何故だろう・・・。バグは無いはず・・・。 そう、簡単なことだった。

//char *ok="okOK";//こっちだとAccess Violation
char ok[5] = "okOK";//配列が5なのはNULL文字付加のため

ポインタで初期化した配列をスワップさせてしまっていたのだ。
無念。


static 宣言でのイテレータ。

staticで宣言したイテレータを取得するbeginとendは凄く遅いことが判明!!。
static iterator begin(){return container.begin();}見たいにラップすると超遅い。
特にデバッグビルド時は非常に遅い・・・。
気を付けるべし!



マクロで文法エラー

2003/10/11 意味不明な文法エラーでコンパイルが通らないことはないだろうか? 例えば、普通に
だった場合、コンパイルが通らなかった場合・・・
このような原因が考えられる。
特に、ライブラリ同士を一緒にコンパイルするときなんかに非常にこのコンパイルエラーに陥りやすい。
なので、ライブラリをインクルードしたら、いらない、マクロや#define定数を削除してやる必要がある。
dkutil開発中に、FOX toolkitdKingyo Utility Toolkitを一緒に上手くコンパイルできなかった原因が、これである。



Destructorに注意!

2003/10/04
ぎゃぁぁぁぁ!!クラスを変更して、Releaseビルド時しか出ないエラーがデタ〜〜!!!o┤*´Д`*├o アァー
この手のエラーはコンストラクタでthrowしているとか等、かなりコンストラクタ系が悪さをしている場合が多い。
実は、その原因は私の使っているSTLPortのstatic libraryに問題があったのだ。(後々、コンパイルオプション変えてコンパイルする)
で、STLPortのDLL版を一時的に利用して、そのエラーはでなくなったのだが、以下のようなのが出た。
Invalid Address specified to RtlFreeHeap
なんじゃ!こら〜〜!!!!
英語読めん!( ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∧ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄)えっへん!
オィッ! ( ・_・)o/☆(ノ゜凵K)ノ イテッ!
以下のようにしてたのがいけなかったと・・・

あれ、まだでるよ・・・ あ〜あ〜〜川の流れのよ〜〜に〜〜〜q(T▽Tq)(pT▽T)p

いちおうそのソース

答えは明白!!
std::stringのデストラクタを呼び出してから、progress_baseのデストラクタを呼び出している。 よって、GetFileName()先は無効!!!!
がが〜〜ん!こんなエラーってアリ〜〜〜!!!!!! 壁 |дT)o エーン
しかしだ!私の実験(クラスの開放順序(クラス内部に内部にクラスオブジェクト?がある時)では どうも、これは成り立たないらしい。
では、何故・・・・・・
(私が宣言していたグローバルなクラスオブジェクトが悪さをしていたようです。合掌。)
ボカッ(*▼▼)ノ゛☆(*△☆)イタッ
2003/10/7(追記)
実は、そのグローバルなクラスオブジェクトの悪さの原因の話題だが、 実験した結果はここ 「ヘッダで宣言したstaticクラスは何回もコンストラクタが呼び出される」を参照してほしい。
結論からすると、どうも、staticなものを宣言するのは.cppや.cファイルに宣言して参照した方が良いらしい・・・。
皆さんも気をつけよう・・・(もしかしたら、VCとかいう糞コンパイラのせいだったりして!?
MinGWしかねぇ!CodeWarriorしかねぇ!C++ Builder Xしかねぇ!



既に存在するファイルを作成することができません

この原因はズヴァリ!VisualC++の場合、リソースが追加されていないからでしょう!(タブン・・・


ファイルサイズ != テキストファイルのEOF

タイトルどおりです。以下のようにヴァカなことやってました。
まずはヴぁっかっぷりを見てみてください^^
そうです。こんな感じなんです。しっかり、 テキストファイル等を読み込むのならば 実際読み込んだ数(またはバイト数)をチェックして\0をつけなくちゃいけないんですよ!
かなりヴぁかですね〜〜!!。タイトルどおりのヴぁかをやってますね!!これでデバックするなんてかなりヴぁかだなぁ私。

構造体のメンバ順番を変えちゃダメだと思うが

17:00 2003/05/10
タイトルどおりです。私はそう思う!
だって、以下のような感じになっちゃうつーの!!!

って事で!!!
私はこの構造体の初期化が大嫌いである!!!
以上也!



やっぱりもっと柔軟さがほしいなぁ16:59 2003/05/05

error C2898: 'int __thiscall IAMWarehouser::GPDataSet(K,V)' : メンバ関数テンプレートを仮想にすることはできません。
このやろう!!!!!!!!!!!!!!!!!!!
こんな使い方してもいいじゃないかよぉ!!!!!!!!!!!!!!!
じゃぁこうしたら?
template<class T>
class a{
	T result(){return T の変数;}
};
これじゃぁだめなんだってば! どんな型でも入れられる奴が欲しいのよ!
staticでも汎用性のアル型を入れたいのよ!
(じゃぁvoid *にすれば!?)
って、typeidが使えないじゃないのよぉ!!!!(使えないと思った)
あ〜〜〜なんだかなぁ〜〜〜〜〜〜〜〜〜



#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期試験の火
さて、以下のプログラムを見て欲しい。
以下が例

座標を間違えGoodBye

座標を間違えて挫折している日
座標の代入の誤りは危険である。
以下が例



VC++6.0SEはアホカイ?

まだ、修羅花 日
開発ツールであるVisualC++がバグってどうする?
起動するとバグってByeBye(TT)/~ エーン



ポインタ演算 一億里 の巻

20002年 バグを直して18000年もかかった日
さて、あなたは以下のプログラムのどこがやばいかわかるか?
私はたいしてやばく無いと思い、そのままつかっていた。が、…このバグのおかげで 1日を潰してしまった。(なむ〜〜



見よ!私のエラーの数々を!!!!!

2002年プログラムを組んでいる修羅場の日



どうしてbreak;忘れちゃうかな??

2002年 break;を付け忘れてデバッグ3年な日
ああ。なんで私は馬鹿なのでしょう。はい。馬鹿ですね。
さて、以下のようなプログラムがあったとします
さて、このプログラムは何を表示するでしょう?
はい!”0”です。って方は…少なくとも私と同レベルです。
正答は"すべて表示されるデス。"
実は、caseごとにbreakがありませんね。タイトル通り
return等があれば話は別ですが、
しかし、プログラムを追加するときにreturnだと多少厄介になるのでbreakの方がいいでしょう
あとは直し方は分かりますよね。こんな誰も読みもしないようなHPを眺められるのならば
ワカンナカッタラ?
掲示板へ…

Theめちゃ簡単マクロ

2002年 ネムイ日
//メッセージボックスを表示
#define EBOX(str) MessageBox(NULL,str,"CAUTION",MB_OK);
//矩形領域をSET
#define RECT_SET(r, l, t, r, b) { r##.left = l;r##.top = t;r##.right = r;r##.bottom = b;}
//Debug情報を出力
#define DOUT(x) OutputDebugString(x);
//DirectX系のオブジェクト???を開放
IFRELEASE(x) if(x){x->Release();x=NULL;}

//すべて保証しません以上



OSのVersionを取得

2002年7月2日
ふう、やっと組み終わった。(こんなので疲れるなよ!
Win32系では使えるのではないでしょうか?OSのバージョン取得…
正確には取得できないかもしれないけど…バグありだったら教えてくれ!
しかし、Windows3.1等を返すのもあるが、実際Windows3.1では使えないらしい
3.1ではGetVersionを使うんだったような?これはGetVersionEx使ってる。
しかもMSDNにGetVersionの解説のってないし…まあ、いいや
著作権語る前に、こんなのパブリックドメインソースじゃん。
コピペする勇気のあるヤツはコピペだ!d金魚が許す。

えーっと戻り値解説。
-1 = 純粋なエラー
-2 = OSが定義されているもの以外
0以上 OSの名前。詳しくはenumで…(多分分かるでしょう!

うらうら、一番下に書いてあるCopyrightをクリックすると分かるけど
責任はとらんぞ!責任は!
d金魚は一切関係ないぞ!
チョウシニノリスミマセンデシタ---

右指が動く前に左指が動く

2002年6月28日
どうして、printfを使うときいつも"pinrtf"と書いてしまうんだ!
なんか右指が動く前に左指が動く。
こんなことって結構あったりしたり。
また、LPDIRECTDRAWSURFACEをLPDIRECTDAEWSURFACEとか書いて。エラーとか出るとなんか嫌だ。
タイプが下を見て打っていたころより今は速くなっていると遅いころに比べてちょっと違和感が…

staticを付けて初期化

2002年6月28日
昔の話
static int number= num;(引数)
と宣言した。このnumberという変数は関数内で条件分岐に使われる変数だった。
何故、staticにしたかと言うと、この関数が呼び出しが頻繁だから。
他の変数もstatic化してたが、その他の変数は初期化はしていなかった。
が、しかし、他の変数と間違えてなのか、関数内だから変数はすべてまた呼び出すときは初期化するんだ!
みたいな固定された考え方がまだ頭の中にあったのだろう。
そして、しばらくして、この変数のおかげで5時間ものデバックに費やされた。
static int number;
number=num;
と、すればいいだけだったのである。あああああああ!関数内は普通見ないよ!(見ないの私だけか?
だって、この関数、何回も呼び出ししててバグなかったし!
第一この関数の条件分岐あまり使わないし!
すべて正しいのにバグが出るのはほんとにムカツク!HTML時代が懐かしい。
ああ。プログラムって大変。(才能Nothing…

TRUE=trueまたFALSE=falseなのであろうか?

2002念某日(感じ間違ってるし
タイトルのようにと思ったので以下のサンプルを実行してみた。
結構わたしにとっては意外な結果が…
ちなみにVisualC++6.0 Win32 Console Applicationでテストしました。

0だとifは作用しないみたいです。それは分かってたが、
1でも2でもー1でもtrueだったんだ。あははY(^^Yお手上げ!
少しは羞恥心もてよ!(ツッコミ


SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送