|
・今日もお便り紹介〜。
|
|
・これは /STACK オプションですね。メニューの【プロジェクト】−【設定】ダイアログの【リンク】−【アウトプット】ページの【スタック アロケーション】の部分でも設定できます。こういうのってリンカの設定なんだなー。確かに Exe 全体での設定だからそうなのかも。でも DLL と別々に設定したらどうなるんだろう……。
・でわまたっ! |
・今日もお便り紹介〜。
|
|
・どうもですー。やっぱそういうところへんが焦点になっちゃいますね。 fscanf() がいけないってゆー文を見ると「 scanf() と同じくエラーチェックができない」みたいなことが書かれてること多いです。だからちょっと違うみたいですね。でもこー見てると、エラーチェックよりもオーバーフローとかファイルアクセスのボトルネックとかの方が重要な気もする(爆)。まーあんま気にしなくていーか、とりあえず fgets() と sscanf() でいいっぽいし。
・おまけ。 gcc や BCC の最新コンパイラ(つまり Visual C++ 6.0 は除く(汗))なら、 NULL の代わりに次のようなクラスを使用することができます。 class CNuller { public: // Effective C++ P.131 のもの。 // 下のメンバ関数は VC6 では通りません。 template< class type_Ret > operator type_Ret *() { return reinterpret_cast< type_Ret * >( 0 ); } }; CNuller null; // 使用例。 void use_null() { int *pi = null; printf( "%X\n", pi ); // 0 // int i = null; // エラー。 } ・整数値には変換できない、ポインタとしてのみ機能する 0 、それが null 変数。もし必要なら値を 0 以外にも変更できるし、 == とかの比較にも使えるし、なにより NULL とまったく同じように使える。問題は、知らない人が見たら混乱の元ってことだな(爆)。しかも使えるコンパイラえらい制限されるし。こーゆーのが広まる頃には C++ に組み込まれちゃいそうな気もするし。むー。 ・でわまたっ! |
・最近お便り多くてうれしいにょ〜。では今日のお便りっ!
|
|
・こんばんわー。どうやら MSDN を見る限りそういうことみたいです。 SetWindowText() から WM_SETTEXT が送られるのはほぼ確実。成功か失敗かを戻り値として返すってことから、たぶん SendMessage() で処理が終わるまで待ってるんでしょう。 VB は持ってないんで、そっちの対処方法はちょっと分からないです。ごめん。
・ふたつめのお便り〜。 |
|
・それだ! そうそう、知りたかったのはその関係なんです。なるほど、 fgets() で取り込んだあと isdigit() とかでチェックしてから sscanf() することでエラー回避ができるってことなんですね。わてはずっと「 fscanf() と sscanf() は同じようにエラー返すんだから、 fscanf() の方が悪いってことないやん」とか思ってたんですが、実際には scanf() 系のエラーチェックを信用しないで自前で処理すべきなんですな。
・いやーこれでひと安心。ってゆーのも、この辺がはっきりしないと「 std::fstream の方が良いぞよ」とか言えないんで(爆)。 std::fstream は fgetc() でひとつずつ取り込んで値のチェックしてから値返すっていう実装になってるんでまったく問題なし。オーバーロードを使ってるからタイプセーフだし。しかし、ってことはぷらとわのはやや間違ってることに? うむ、ちょっと考えてみよう。とにかく情報ありがとう!! ・でわまたっ! |
・今日はお便りなし〜。代わりと言ってはなんだけど、今日から STL & iostream 入門の再放送がスタートしました。「1週間経つまでに読まないと、っていうプレッシャーがある方がいい」っていう方は購読登録しましょう(爆)。マイペースなあなたには、9日公開予定のCodian版をご期待ください。 C++ やってる人なら少しは気になるでしょー、 STL や iostream って。うふふ。
・でわまたっ! |
・ぐはぁ、 scanf() 系の問題をやっとこさ理解しました!!
void Test() { char ch[] = "10000000000"; int i = 0; int iRes = sscanf( ch, "%d", &i ); TRACE( "ch: %d, iRes: %d\n", i, iRes ); // ch: 1410065408, iRes: 1 } ・と、「型はあってるけどオーバーフローしてる」場合、 scanf() 系はエラー返さないうえに無理矢理読み込んじゃうんですね(汗)。こりゃやべーや。このチェックをするために、まず fgets() で取り込んで、オーバーフローチェックをして、 sscanf() する、って手順になるわけですな。ちなみにもちろん std::fstream はオーバーフローチェックもしてくれるんで大安全(爆)。ぷろとわ書き直さなくっちゃ。 ・もとい。これは sscanf( ch, "%10d", &i ) って書けば解決しちゃうな。って、オーバーフローが解決するだけで値は変なまま(無理矢理切り捨て)だから問題の解決にはなってないですな。むしろこっちの方が問題かも。結局値のチェックは必要ってことやね。でも自前でチェックするコード書くの大変だなー。 iostream の方が100倍楽だもんなー。 ・今日のお便り! |
|
・ウィンドウ全体の再描画……どうすればいいんだろう(汗)。 InvalidateRect() 系はクライアントエリアだけだし、 WM_NCPAINT 送ってもダメだった。うーむ、やっぱ送ってくれたサンプルコードどおり、最小化しちゃって戻すって方法が一番楽かも(爆)。ばれやしないし。あとウィンドウを1ドット縮小するようリサイズしてもいーかも。
RECT stRect; pFrame->GetWindowRect( &stRect ); pFrame->SetWindowPos( NULL, 0, 0, stRect.right - 1, stRect.bottom - 1 , SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE ); ・でもなんか……むぅ。 ・でわまたっ! |
・今日のお便り!!
|
|
・こんばんわー。うむ、この辺の情報って少ないんですよねー。初心者向けの本とかでももっとやればいーのに。で、このエラーは VC のデバッグ版 new でメモリ確保して、 delete しなかった時に呼ばれます。メモリリークを検出する機能が、デバッグ版 new に付いてるわけです(注:正確には _Crtなんたら() なランタイムの機能ね)。
・このエラー、「 Dumping objects -> 」のあとに「 C:\Programing\Test\MainDlg.cpp(103) 」とか表示されると思うです。これが最重要。最後の (103) は行番号で、このファイルのこの行で new されたメモリが delete されてないんですよ、って教えてくれてるわけです。 ・ {161} は new したものに付けられるインデックスナンバー、「 at 0x01102490 」は new が返したポインタ、「 136 bytes long 」は new が確保したサイズ、 <> の間に書かれてる文字列は確保したメモリ上を ASCII 文字に置き換えたもの、そのあとの「 94 01 07 01 」は置き換える前、つまりメモリ上をそのまま16進表示したもの(いわゆる「ダンプ」)。 ・つまり! これらの情報を元に「どの new で確保したメモリが delete されてないか」を特定して、見つかったら任意のタイミングで delete するようにすればいい、というわけです。まー結局は最初のファイル名と行番号さえ分かればいいわけで、それ以外の(あまり役に立たない)情報がいっぱい付いてるんで分かりにいとゆーことですな。 ・……そのファイル名が表示されない場合がある?(汗) そしたらきついかも。とりあえずメモリリークしてそうな new を探して、その new のあとに _CrtMemDumpAllObjectsSince() を呼ぶようにして、その new のインデックスナンバーをチェック、で、最後に出てくるメモリリーク情報のインデックスナンバーと照らし合わせて、どの new で作ったものが解放されてないのか調べる、って感じかなー。ちょっとめんどいね。 ・でわまたっ! |
・はにゃ〜ん、今日はお休みよん。久しぶりやねぇ。
|
・今日もお休み〜。そいや、最近、フリーウェアのバージョンアップをしたいなー感がちょっと高くなってます。とりあえずほんのちょっとでもいいから、バージョンアップしてみるかなー。
|
・ Codian で STL & iostream 入門を公開中! と宣伝したところで、今日のお便り。
|
|
・おお、こういう使い方があったのか(爆)。うんうん、こういうのオッケーです。 a.data = 100 とかしてみれば「error C2440: '=' : 'const int' から 'char [8]' に変換することはできません。」ってエラーが出るからちゃんと char[8] になってますね。この「無理矢理代入でコンパイルエラー起こして確認」は typedef とかの確認によく使います(汗)。
・テンプレートって、使い始めは「型の置き換えだよね」とか思うかもしんないけど、それは考えなくていいです(爆)。むしろ「 #define の代わり」、つまり単に置き換えるだけって考えた方がいいかも。指定したテンプレート引数に置き換えて、とにかく無理矢理コンパイルして、コンパイルできたらOK、って形式。だからこういう使い方もできるわけです。うん、こういう質問が一番好きだ(爆)。 ・あっと、ひとつ補足。テンプレート引数には「整数値」も使えます。 template< int int_size > ってすれば int_size を定数値として使えるんで char[int_size] ってできます。もし char の配列ってことが確定してるんならこっちの方がいいかもしんないってことで。知ってたらごめん。 ・でわまたっ! |
・今日もお便り紹介〜。
|
|
・情報どうもですー。そっか、浮動小数点として読み込んでから整数値にって方法もあるんだなー。あと、ファイルの中身のチェックはした方がいいと思うです(汗)。まーウィンドウズは拡張子があるからいいけど、うにくす系とかだとどんなファイル渡されるか分かんないし、拡張子が同じで中身が違う場合とかもあるかもしんないから。まーユーザーの使い方が悪いって言えばそれまでだけど(爆)。
・でわまたっ! |
・うにゃー、辞書の方に CPU のこととかの難しいこと送らないで〜、と思いつつも、そういったことを調べるからこそ CPU の内部構造に詳しくなれる、って面もあるんで難しいところですにゃ。では今日のお便り!
|
|
・どうもはじめましてー。とりあえずひとつずつ確認していきましょう。まず、もう一度最初から DLL のプロジェクトを作って、まだ「Microsoft FlexGridControl Version6.0」を貼り付けない状態でビルドしてみて、ダイアログが表示されるか確認してみましょう。こうしてみないと、どこら辺に問題があるのか絞りきれないんで。
・もし表示されなかったら「Microsoft FlexGridControl Version6.0」とは関係ない問題ってことになります。そのときは「ダイアログのクラスも作ったか」「クラスはちゃんとエクスポートされているか」「 Exe から使っている DLL は最新のものか」といった部分をチェックしてみてください。 ・ダイアログが表示されたら「Microsoft FlexGridControl Version6.0」の問題ってことになります。このコントロールのプロパティを色々変えるともしかしたらそういうことになるのかもしんない。ま、実はわては ActiveX にはあんまり詳しくないんでちょっと分かんないんだけど(汗)。中身の仕組みは分かるんだけど、 VB 使ったことないからその辺で知識不足……。 ・でわまたっ! |
・うわー、辞書が更新できないかもしれん。それは置いといて、今日のお便りはみっつ〜。
|
|
・あ、それ考えてなかった(汗)。わては拡張 DLL で CDialog から派生して作ったんで、 MFC 使ってたからそーゆーことになんなかったんですね。非 MFC な DLL の時には DLL 側のリソースを読み込まなきゃいけないってこと忘れてました。情報ありがとうですー。ちなみに昨日の投稿者さんによると問題は解決したそうです。とりあえず良かった〜。
・次のお便り。 |
|
・あう〜ごめんなさい、わては通信関係全然分かんないんです(泣)。エラーも謎だしねぇ。 0x80004005 って IMAPISession::OpenEntry() のリファレンスに載ってるエラーコードの中にないし( MAPI だと MAPI_E_CALL_FAILED がこれに当たるみたいです)。誰か分かる人いたら教えて〜。
・最後のお便り。 |
|
・ぎく!(汗) はい、実はこれ確信犯です。確かに std::strstream は std::stringstream に置き換わることになってます。 traits にも対応されてないから、ちょっと見捨てられてる状態ですね。でも std::stringstream だと、まず std::string について解説しなきゃいけない。それだと初心者には敷居が高すぎるんですよね。初めて iostream を使う人にとって、操作対象が標準入出力でもファイルでも std::string でもなく、文字配列だっていうことはとても安心感があると思うんです。
・まー C++ の性格上、 std::strstream がなくなるってことはないような気がする(汗)ってこともあるんで、とりあえずこのままでいこうと思ってます。でも確かに、 std::strstream しか知らないからこれを使ってくってことになったらそれは困るかも。Codian版で、最後に std::string と std::stringstream の解説を加えた方がいいかもしんない。 ・でわまたっ! |
・プログラミング辞書は問題なく更新できそうです。とりあえずひと安心。秀丸はやっぱすごい……。では今日のお便り!
|
|
・指摘ありがとうです! explicit 、気付かないうちにコンパイルが通っちゃってるのがまずいってこと書いてなかったです。なんか、引数ひとつの変換コンストラクタが諸悪の根元って気がしてきたなー。 TCHAR はこの前ぷらとわで「 typdef だ」って確認したのに(汗)。 return void 、とりあえず次のようなプログラムを作ってみました。
void RetVoid() { return; } void Test() { return RetVoid(); } ・うお、 gcc と bcb でコンパイル通った!!(喜) うわすごー、ちゃんとテンプレート用に C++ が変化してるんだなー。あと return void() も通ったけどちょっとこっちは不安(汗)。あとでプログラミング言語 C++ を見てみよう(実は持ってない(汗))。それにしてもこれはめっけもんだ。結局は VC.NET 待ちってことか〜。 ・ volatile はよく分かんない(汗)。一応 Java ではマルチスレッドと関係あるみたいだけど、 C++ じゃあんま関係ないんじゃないかなー。仮想関数はミスでした、たぶんここ書くときに手抜きしたんだな(爆)。この辺は次の更新時に直しておきます。やっぱ結構穴があるなー。実際、こっち側ではまったくチェックできない分量なんで、気付いたところはどんどん指摘してくださいねー。 ・でわまたっ! |
・うにゃ、今日はお休みにゃの。
|
・今日もお休み。
|
(C)KAB-studio 2000 ALL RIGHTS RESERVED. |