- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
- 784 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:46:00 ]
- C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、
#include <stdio.h> FILE *fopen(const char *, const char *); int fileno(FILE *); int fclose(FILE *); #include <sys\stat.h> int fstat(int handle, struct stat *statbuf); の関数や構造体を使って作ったものの、あまり良くないようだ。 大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。 VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに ほとんどアクセスしなくて済んでる。 ファイルを開かなくて取得できんのかな。いい方法ないもんか。
- 785 名前:デフォルトの名無しさん [2009/04/03(金) 19:51:09 ]
- まあそういうなよ。
おれたちも、766みたいな頃を経てきたわけだろ。 なんとなく、766はできないプログラマになりそうな気もするけど
- 786 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:54:54 ]
- fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを
使った方が速いのかもね。
- 787 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:57:55 ]
- じゃあ _stat(const char *, struct _stat *) とか
FindFirstFile/FindNextFileでもつかっとけよ。 Windowsならディレクトリエントリだけの話になるから。
- 788 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:00:43 ]
- そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。
実際の値が必要なときは、これを使わざるを得ないんだけど。
- 789 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:21:42 ]
- windowの関数を勉強しないとならんな
低レベルなプログラム書けるように勉強しないとならんな
- 790 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:32:15 ]
- 代入と評価を同時にしたら、読みにくくなるだろう。
横着やな。
- 791 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:51:09 ]
- いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが
- 792 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:55:16 ]
- 日本語
- 793 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:56:58 ]
- どこの方言か知らんけど意味わからん
- 794 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:00:19 ]
- しらてと?
- 795 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:03:05 ]
- すなみ
はにりいと とんとかいも
- 796 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:07:14 ]
- 女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ほら!(得意げに)』 彼女 『何これ?PC98じゃない!幻滅!』 おいら『え、だってみんなPC98が普通だし....』 彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『...』 彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『....』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『....』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...』 以上実話です。
- 797 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:13:35 ]
- 1989年のWinしらてとて、386 2.1か。
WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。
- 798 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:15:58 ]
- 間違えた。
WinしらてとのAPIどころか、Winしらてと自体(以下略)
- 799 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:23:15 ]
- うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ
20年前ってどうよ
- 800 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:17:03 ]
- >>796
悔しいがワラタ
- 801 名前:デフォルトの名無しさん [2009/04/03(金) 22:35:23 ]
- 女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』 彼女 『うん!』 おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ よ(得意げに)』 彼女 『何それ?ニフティとかのこと?幻滅!』 おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』 彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った 基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の 情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う し、、』
- 802 名前:デフォルトの名無しさん [2009/04/03(金) 22:38:38 ]
- 彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面 もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』
- 803 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:39:50 ]
- 女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 おんな『シネよキモデブ。二度と話しかけんな』
- 804 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:40:26 ]
- >803
ついでに此処へも書き込みしないでいいよ。
- 805 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:42:50 ]
- コピペとしてはまだまだいけてないな
もっとブラッシュアップしてくれ
- 806 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:48:07 ]
- ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」
やりたいことは「stdin(fd=0)からCALLBACK関数」で、 順次データを読み出すだけなんですが、私の環境ではうまく動かないです。 止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、 もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか? よろしくお願いします。以下、サンプルソース #include <unistd.h> #include <stdio.h> #include <gtk/gtk.h> int main(int argc,char **argv); gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data); GIOChannel *gio; int main(int argc,char **argv){ gtk_set_locale(); gtk_init(&argc,&argv); gio = g_io_channel_unix_new(0); fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN); g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL); gtk_main(); return 0; } gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){ char temp; fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr); read(0,&temp,1); fprintf(stderr,"temp(%d)\n",temp);fflush(stderr); return TRUE; }
- 807 名前:デフォルトの名無しさん [2009/04/04(土) 11:28:40 ]
- スマポで質問があります。
class MainClass; class SubClass { public: void func2(MainClass* mc) {} }; class MainClass { public: MainClass() : m_SubClass(new SubClass()) {} ~MainClass() {} void func1() { m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか? } private: boost::shared_ptr<SubClass> m_SubClass; }; int main() { MainClass m; m.func1(); return 0; } どうかよろしくお願いします。
- 808 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:31:52 ]
- お前どう見てもスマポの使い方判ってないからやめとけ
- 809 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:33 ]
- scoped_ptrでいいじゃん
- 810 名前:デフォルトの名無しさん [2009/04/04(土) 11:39:47 ]
- >>808
どうしてですか? private:でshared_ptrにしたからですか? なんとか使えるようになりたいんです。 どうかお願いします。
- 811 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:49 ]
- >>808
なんつー的確な指摘w
- 812 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:40:58 ]
- どっちかとういうとthisがまったくわかってないじゃないか?
- 813 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:46:52 ]
- なんつーか、『オムレツ作りたいんです! 教えてください!』と言って来た奴が
材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。 ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。
- 814 名前:デフォルトの名無しさん [2009/04/04(土) 11:49:53 ]
- 色々返事くれてありがとう。
void func2(MainClass* mc) {} ここなんですが、最初は void func2(boost::shared_ptr<MainClass>& mc) {} こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき コンパイルが通りませんでした。スマポの使い方として、生のポインタは 基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると thisはどうやって渡せばいいかわからなかったので。。。
- 815 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:50:37 ]
- オムレツ作りたいんです!
はいいけど、君それ、手に持ってるのゆで卵だよね? みたいな。
- 816 名前:デフォルトの名無しさん [2009/04/04(土) 11:51:37 ]
- >>813
なにか肝心なもの(フライパン)が抜けてるということですか?
- 817 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:59:38 ]
- とりあえずconst
- 818 名前:デフォルトの名無しさん [2009/04/04(土) 12:08:37 ]
- m_SubClass->func2(boost::shared_ptr<MainClass>(this));
こう書くとAssertionに引っかかるし、、、 これって循環参照になってるから?
- 819 名前:デフォルトの名無しさん [2009/04/04(土) 12:26:50 ]
- プログラム中に可変で動的にメモリ確保をしたいのですが
Animationset m_animset; という構造体があり、m_anim->GetAnimset(); というメソッドで個数が取得できます m_animsetを最初から配列で100個くらい作っておけば問題ないのですが 可変で作る場合はどうすればいいのですか?
- 820 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:28:59 ]
- >>819
vectorつかう
- 821 名前:デフォルトの名無しさん [2009/04/04(土) 12:29:56 ]
- >>820
ありがとうございますvectorについて調べてみます
- 822 名前:デフォルトの名無しさん [2009/04/04(土) 12:36:32 ]
- ダブルポインタでいいだろ
Animationset **m_animset;
- 823 名前:デフォルトの名無しさん [2009/04/04(土) 12:57:52 ]
- vector<AnimationSet> m_animset;
for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) { m_animset.push_back(i); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたのですが 'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません とエラーが出ます メモリを確保するにはどうすればいいのでしょうか・・・・
- 824 名前:823 [2009/04/04(土) 13:05:05 ]
- for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
AnimationSet anim; m_animset.push_back(anim); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたらできました
- 825 名前:デフォルトの名無しさん [2009/04/04(土) 13:39:00 ]
- 何が出来たの?
- 826 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:50:42 ]
- >>807
enable_shared_from_this使えばいいんでないの?
- 827 名前:デフォルトの名無しさん [2009/04/04(土) 13:55:39 ]
- >>825
欲しい分だけメモリ確保です
- 828 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:20:58 ]
- コピコンあるのね把握した
- 829 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:57:33 ]
- >>822
ダブルポインタって、ただのポインタのポインタとなにが違うんですか?
- 830 名前:>>829 [2009/04/04(土) 18:37:39 ]
- Ragnarok **m_ragna;
- 831 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:39:38 ]
- >>829
その言葉を使う人間ができるプログラマかどうか。
- 832 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:14:39 ]
- ダブルポインタ、なんて変な言葉使う人間こそプログラマじゃないだろうな
- 833 名前:デフォルトの名無しさん [2009/04/04(土) 20:35:11 ]
- >>826
enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると Boostが例外を投げます。 class MainClass; class SubClass { public: template <class T> void func2(boost::shared_ptr<T>& mc) {} }; class MainClass : public boost::enable_shared_from_this<MainClass> { public: MainClass() : m_SubClass(new SubClass()) {} ~MainClass() {} void func1() { m_SubClass->func2(shared_from_this()); } private: boost::scoped_ptr<SubClass> m_SubClass; }; int main() { MainClass m; m.func1(); return 0; }
- 834 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:42:29 ]
- >>833
ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。
- 835 名前:デフォルトの名無しさん [2009/04/04(土) 20:54:19 ]
- >>834
ありがとうございます。 >大元のm自体をshared_ptrに格納する というのは、 boost::scoped_ptr<SubClass> m_SubClass; を boost::scoped_ptr<SubClass> m_SubClass; とするということですよね? そうしてもBoostから例外を投げられます。聞いてばかりですいません。。
- 836 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:59:29 ]
- >>835
違う違う、こっち。 int main() { boost::shared_ptr<MainClass> pm(new MainClass); pm->func1(); return 0; }
- 837 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:09:54 ]
- >>832
俺、ポッぽインタって言っている で、3つはぽっぽっぽインタだな
- 838 名前:デフォルトの名無しさん [2009/04/04(土) 21:10:23 ]
- >>836
なるほど、動きました! thisがboost::shared_ptr<MainClass>でなければならなかったということですね。 本当にありがとうございました。
- 839 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:17:04 ]
- C++再考 という本のサンプルコードの一部です、コンパイルすると、下記のエラーが出ます
何処がおかしいのでしょうか? VS2005 pro SP1 winXP SP3 #include <iostream> using namespace std; class Expr_node { friend ostream& operator<<(ostream&, const Expr&); friend class Expr; int use; protected: Expr_node():use(1){} virtual void print(ostream&) const = 0; virtual ~Expr_node(){} }; error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2143: 構文エラー : ',' が '&' の前にありません。
- 840 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:22:15 ]
- >>839
friend ostream& operator<<(ostream&, const Expr_node&); Exprなんて型ないからExprを変数名だと推定してる
- 841 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:28:37 ]
- >>839
なぜエラー行を抜いた class Expr;を前方宣言か?
- 842 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:05:38 ]
- >>814
> スマポの使い方として、生のポインタは > 基本的に全部スマポで置き換えるのが正しい どこからそんなアホな理屈が出てきたんだ?
- 843 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:10:59 ]
- 全部が全部正しいとは思わないが
C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし Googleコーディング標準でもスマポがいいねって書いてあるから まぁ初心者はそのくらいの気持ちでもいいかも。 ただ、だからといってboostを使うのではなく 一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。 ちんぽちんぽ。
- 844 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:16:10 ]
- Accelerated C++でもネタになってるな>スマポの自作
- 845 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:17:31 ]
- >>843
貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ
- 846 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:30:40 ]
- >>843
>807 の例は参照に置き換えれば済むだろう。 所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。
- 847 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:15 ]
- >>846
ああなるほど。 確かに、参照が使えるところには ポインタよりも参照を使うべきだというのには同意。
- 848 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:25 ]
- もうね、スマポ
- 849 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:01:56 ]
- >>840
>>841 スマンカッタ 大きな勘違いというか、錯誤していた 前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが 多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね
- 850 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:13:03 ]
- 今写経していた、C++再考 第8章 オブジェクト指向プログラムにもスマートポインタの原型のような、技法が載っていたよ
コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、 オブジェクトを破棄するという、実に巧妙な仕組みだね
- 851 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:35:28 ]
- コピーコンストラクタ....ってなんだっけ。忘れちゃったよ、だめぽ
- 852 名前:デフォルトの名無しさん [2009/04/05(日) 02:50:30 ]
- 関数にクラスを値渡しするときに呼ばれるやつ
- 853 名前:デフォルトの名無しさん [2009/04/05(日) 02:51:41 ]
- >>846
Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?
- 854 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:59:29 ]
- >>853
所有権の移動や共有が必要ないなら、当然。
- 855 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 06:56:41 ]
- 下のクラスをビルドして実行するとコンストラクタでvectorがエラーになります
どこがまずいのでしょうか?? struct pointV { int x ; int y ; }; class Test { std::vector<pointV> vecTest ; public: Test() { vecTest.reserve(8) ; vecTest[0].x = 0 ; ←ここで発生するみたいです } }; よろしくお願いします
- 856 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:19:16 ]
- reserveじゃなくて、resize
- 857 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:50:26 ]
- reserveだと配列の大きさ自体はそのままだったんですね
有難うございました
- 858 名前:デフォルトの名無しさん [2009/04/05(日) 13:08:57 ]
- weak_ptrを使ってよかった、という例があったら教えてください。
自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば いいんじゃないか、と思ったんですが。
- 859 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:21:17 ]
- >>858 www.google.co.jp/search?q=boost+weak_ptr
- 860 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:25:12 ]
- 256の倍数を入力すると正常な数値を出してくれません
内容はVBのテキストボックスに入力した数値をマイコンに送信し マイコンに転送したCで作った制御プログラムで受け取り外部に転送するものです いろいろ考えてみましたがさっぱりわかりません。よろしくお願いします VB側 dim data(1) as Byte data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) comSerial.Output = data comSerial.Output = chr(0) /*c言語*/ /*データ受信(マイコン側のフラグ処理は省略してます*/ unsigned char receive(void) unsigned char data; data = RDR;/*PCから受け取ったデータがあるレジスタRDR return(data); int main(void) { unsigned char data[2]; int i; while(1){ i=0; do{ data[i]=receive(); i++; }while(data[i-1]!='\0'); };
- 861 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:45:50 ]
- >>860
じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ… あとVBガワのCOMポートはバイナリ?
- 862 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:54:23 ]
- >>861
たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか 1024と入れるとほんの少ししか動きません。 VBがフリーズするときもあります。 VB側はバイナリーです。 よろしくお願いします
- 863 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:57:07 ]
- 256の倍数の値ということはdata(0)は0ということなので、マイコンの動作は正常なのでは?
- 864 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:04:18 ]
- >>863
つまり0が送信された段階で'\0'と同じと判断されるのですね 0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました データの終了判断は他の数値にした方がよさそうですね
- 865 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:05:18 ]
- >>862
実機ないから試せないけど,1000まではちゃんと動作確認できたと. あとは 1023 とか 1025 だとどうなる?正常? ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる? > VBがフリーズするときもあります。 なんとなくパリティかボーレートが怪しい気がする. プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない. for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.
- 866 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:06:30 ]
- >>864
そっちかー
- 867 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:38:56 ]
- >>865
1023と1025は正常に動作しました Cとは関係ない話になりますがPC側のフリーズは 1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか) →VBの反応なくなる→タスクマネージャーで強制終了→VB再起動 →「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ →後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない こんな感じです。 C側はH8に転送してますので確認は出来ませんが VB側は出来ると思います。 手元にシステムがないので今は無理ですが。 >>864 VBの送信も悪いですが受け取るC側にも問題があるようです
- 868 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:28:42 ]
- >>867
VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん. シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\ データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります
- 869 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:50:15 ]
- >>858
すいません。まだやってません というか\0\0というのは2回送信してCで受け取れってことでしょうか?
- 870 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:08:45 ]
- >>869
まず仕様を確認しろよ \0(=0x00) を終端としてるようだが、それだと 256の倍数で おかしくなるのは当然に思える。
- 871 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:12:01 ]
- そうそう。例えば、inputDataが256のとき、
data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) 上は下と同じことだと忘れていない? data(0) = 0 data(1) = 1
- 872 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:13:52 ]
- まずはベーシック手順から
- 873 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:21:54 ]
- エスパーすると、do〜whileのところは
data[0] = receive(); data[1] = receive(); にするのが正しいんじゃないかと思う
- 874 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:54:13 ]
- みなさんありがとうございます
実習用のテキストだけどこういう感じです(´・ω・`) >>870-871 アッー!!(;゙゚'ω゚') そうだった。1バイト文字だからを終端にしたら256の倍数だと0ですよね >>873 すいません。このプログラムは他の部分を除いて書いてるので 実は受信したデータが'O'だと次の文字見て'F'で正転、'R'で逆転みたいなことしています でも受信したデータでdo〜whileを分ければいいだけでしょうけど ちなみに数値データがある場合は comSerial.Output = chr(80)←数値データあるよ comSerial.Output = data comSerial.Output = chr(0)←データ終わり としています 入力されたデータはこんな感じです dim inputData as Integer inputData = Val(txtData.Text)
- 875 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:13:00 ]
- C++で関数のグラフを作る問題があるんですけど、
グラフィックを表示するにあたって追加でインストール しなきゃいけないものってあるんでしょうか? OSはXP、visual c++ 2005を使用しています。
- 876 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:16:03 ]
- VCありゃいける
GDI使うだろうし
- 877 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:36:12 ]
- >>876
ですが教科書の通りにプログラムしても なぜか動いてくれないんですよね・・・ これが問題ありそうな5,6,7、8行目なんですけど、 void CVc31view::OnDraw(CDC* pDC) { CVc31Doc* pDoc=GetDocument(); ASSERT_VALID(pDoc); で、エラーがこう出ます。 ex3.1.cpp .\ex3.1.cpp(5) : error C2653: 'CVc31view' : 識別子がクラス名でも名前空間名でもありません。 .\ex3.1.cpp(5) : error C2065: 'CDC' : 定義されていない識別子です。 .\ex3.1.cpp(5) : error C2065: 'pDC' : 定義されていない識別子です。 .\ex3.1.cpp(6) : error C2448: 'OnDraw' : 関数の定義が間違っています。
- 878 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:51:24 ]
- >>877
CVc31view クラスの宣言はどうなってる?
- 879 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 13:14:25 ]
- >>877
たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?
- 880 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 13:54:04 ]
- int* pValue = new int[10];
pValue[1] = 10; のように配列をnewすると、 代入時に*が付かないのに変数にpが付くのがシックリ来ません。 vector使えとか、そういう話とは別に ポインタ変数にpを付けられているかたにお聞きしたいのですが、 こういう場合にもpを付けられていますか? それとも、int value = new int[10]; と書かれてますか?
- 881 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:02:57 ]
- 宗教論争の予感。
- 882 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:05:42 ]
- >>880
コーディング規約に従うだけ。 ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。
- 883 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:09:59 ]
- おれは vector 使うし、ポインタだからって p 付けたりしないし、
話には参加できないな。うれしいぜ。
- 884 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:12:42 ]
- >>880
その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。 # なんでvaluesじゃないのか、その方が気になる。
- 885 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 15:39:41 ]
- それはpointerだから
- 886 名前:デフォルトの名無しさん [2009/04/06(月) 20:30:01 ]
- クラス内に性的なメンバがあってメモリ割り当てが必要な場合、それを初期化するタイミングは
クラスの外部でするべきでしょうか?
- 887 名前:886 [2009/04/06(月) 20:37:48 ]
- すいません、間違えました。
-性的なメンバ +静的なメンバ あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか わからずにいます。 目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で 1個あればいいんですが。
- 888 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:44:33 ]
- 最初のインスタンスが作られるときにクラスの内側で割り当ててもいいし、そうでなくてもいい。
- 889 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:37:18 ]
- 性的結合..いやらしい
- 890 名前:デフォルトの名無しさん mailto:safe [2009/04/06(月) 22:43:42 ]
- >>887
静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?
- 891 名前:デフォルトの名無しさん mailto:age [2009/04/06(月) 23:20:39 ]
- スマートポインタについて最もよく解説されている本や
webページを教えて下さい。お願いします。
- 892 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:23:47 ]
- 使い方の解説? 実装の解説?
- 893 名前:デフォルトの名無しさん mailto:age [2009/04/06(月) 23:50:57 ]
- 実装の解説でお願いします。
概念はある程度わかるんですが実際 どうやって実装しているのか 分からないんです
- 894 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:58:06 ]
- 検索すればでてこない・・・?
boostのコードでも見たらどうか。
- 895 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:14:27 ]
- あと、スマートポインタにもいろいろあるけど、どれのこと?
もっとも、基本はデストラクタでdeleteするという点は共通だけど。
- 896 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:26:07 ]
- auto_ptr
- 897 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:35:54 ]
- 質問させていただきます
変数を宣言するときに char buf[1000]; とするのと char buf_0[100]; char buf_1[100]; ... ... char buf_9[100]; として確保するのでは、必要なメモリの量は変わってくるのでしょうか?
- 898 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:37:02 ]
- >>897
やってみればいいじゃん。
- 899 名前:デフォルトの名無しさん [2009/04/07(火) 00:59:46 ]
- メモリが連続になるかならないかではないかな
- 900 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:17:09 ]
- Cから見えるメモリの使用量は等しいけど、
実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない
- 901 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 02:07:25 ]
- >>897
CPUのアラインメントの関係で違ってくるかもしれんな
- 902 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 05:58:06 ]
- 例えば、以下のように二次元配列の確保方法はありですか?
コンパイラは通ったんですが、なんか怪しいような。 そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか? int (*p)[10] = new int [3][10]();
- 903 名前:デフォルトの名無しさん [2009/04/07(火) 09:53:36 ]
- テンプレートクラスが、std::vector<T>のメンバーを持っています。
ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと 初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、 vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?
- 904 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:57:01 ]
- >>903
コンストラクタを実行していないクラスを生成する… 無理ぽ
- 905 名前:デフォルトの名無しさん [2009/04/07(火) 10:17:47 ]
- reserve(ほしい要素数); ってこと?
- 906 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:37:15 ]
- C言語でHTMLを出力したいのですが
わかりやすく解説してるHPとかありますか? QueryStringのやりとりが分からなくて困ってます
- 907 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:45:44 ]
- >>906
pc11.2ch.net/test/read.cgi/php/1077753522/ pc11.2ch.net/test/read.cgi/php/1048393217/
- 908 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:49:58 ]
- アリガトン
>>907
- 909 名前:デフォルトの名無しさん [2009/04/07(火) 11:56:23 ]
- VC++2008で開発しているものです。
F5で実行するたびに以下のようなMemoryManager::write()というログが出るのですが、 これはなにか問題があるのでしょうか? [ MemoryManager::write() ] totalSize = 16777216 ( 1000000 ) : 16.00MB address size file line 02FF4B04 16392 unknown 0 02FFBE14 1152 unknown 0 02FFC294 1152 unknown 0 02FFC714 1152 unknown 0 02FFF384 32 unknown 0 02FFF3A4 32 unknown 0 02FFF3C4 24 unknown 0 02FFF3DC 48 unknown 0 02FFF474 24 unknown 0 02FFF48C 24 unknown 0 02FFF514 32 unknown 0
- 910 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 12:02:32 ]
- >>909
こちらへどうぞ。 pc12.2ch.net/test/read.cgi/tech/1187922645/
- 911 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 12:02:34 ]
- ARToolKitだろ。
そういう環境ちゃんと書かないとわからんよ。
- 912 名前:デフォルトの名無しさん [2009/04/07(火) 14:53:46 ]
- ええー?
そんなのインストールしてません。
- 913 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 17:50:35 ]
- >>902
その解放は、delete[] pで問題ない。
- 914 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 22:52:47 ]
- スマートポインタの一つがvectorって解釈でいいの?分からないので
質問。
- 915 名前:デフォルトの名無しさん [2009/04/07(火) 22:57:27 ]
- >>902
>>913 おれもそれが何を確保してるのかよくわからん。 int (*p)[10] = new int [3][10](); コンパイルも通るし、 913の言うように、 delete [] p; で開放できてるけど。 pはintのポインタの配列の先頭か? それが3個配列になってるのを確保したのかな? +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[0][0] +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[1][0] +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[2][0] こんな感じ? 二次元配列はC++のnewでは一度には確保できないと思ったけどな。
- 916 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:09:12 ]
- >>914
よくない
- 917 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:16:22 ]
- >>915
ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=424 一応こんなのが見つかった
- 918 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 23:25:06 ]
- じゃvectorはスマートポインタじゃないんだね?
何が違うの?vectorも勝手にデストラクタ呼ばれて解放される
- 919 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:29:27 ]
- vectorインスタンスはポインタとして使えない。
ただ内部実装にポインタを使っているクラス。 内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。
- 920 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:35:20 ]
- // VC++6.0
#include <stdio.h> int main() { int (*ai)[4] = new int[3][4]; for (int i = 0; i < 3; i++) { printf("%p\n", ai[i]); } delete[] ai; return 0; } ・実行結果 00380FE0 00380FF0 00381000 ま、2次元配列も割と簡単に扱えるみたいだ
- 921 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 23:51:19 ]
- >>919
つまりvectorで確保した領域は、関数などでポインタ渡しが できないってことですね?それは不便かも・・。
- 922 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:06:51 ]
- クラスメンバのポインタにもアクセスすることも可能だと書いたんだけども。
- 923 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:23:43 ]
- vector(コンテナ)は、vector自身がコピーされれば、中身のメモリ領域も丸ごとコピーされる。
スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。 メモリ領域は2つのスマートポインタで共有される。 みたいな。
- 924 名前:902 mailto:sage [2009/04/08(水) 01:41:17 ]
- >>913,917
どもです。 同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが delete [] p; でちゃんとできてました^^
- 925 名前:デフォルトの名無しさん [2009/04/08(水) 06:11:47 ]
- >>924
本当だ。 この方法で、3次元配列も出来た! しらんかった。 あと、後ろの括弧は無しでも問題ないようだけど。。。 なんでこれで出来るのか、よくわからん。 でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、 あまり使い道はないかも。
- 926 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:12:35 ]
- VC++.NETを使ってツールを作成しています。
ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、 それをShowControlBar関数を使って消したり出したりしているのですが、 表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、 変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。 クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには どうすればよいでしょうか? 知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。 よろしくお願いします。
- 927 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:47:39 ]
- 意外と難しいかもな
DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る 逆に言えば入力フォーカスが移らない限り前面には出てこない NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも
- 928 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:22:39 ]
- MainFrame を owner にして ダイアログバーを Create すれば良いんでないの?
- 929 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:23:54 ]
- Spy++でDialogBarへのメッセージを監視し、背面時にタイトルバーをクリックしたら
S WM_NCHITTEST x y R WM_NCHITTEST HTCAPTION S WM_MOUSEACTIVATE HTCAPTION WM_LBUTTONDOWN R WM_MOUSEACTIVATE MA_NOACTIVATE という感じになったので WM_MOUSEACTIVATEのメッセージハンドラを作ってMA_ACTIVATEを返せばいいんじゃないかと思う
- 930 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:23:14 ]
- DialogBarにメッセージハンドラを追加してみたが
メッセージが思うように飛んでこないので調べてみると ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dlgbar.html ダイアログバー上のイベントが、CDialogBarクラスまで来ないようだ。 したがって、イベントはCChildFrameで処理しなければならない。 CChildFrameをサブクラス化するなりしないとならないようだ やれなくはないが、もっと簡単な方法はないだろうか・・・
- 931 名前:926 mailto:sage [2009/04/08(水) 12:25:22 ]
- 色々教えていただきありがとうございました。
>>927 おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると フォーカスは移りました。 >>928 元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。 >>929 Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。 ただツールをしるきっかけを教えていただきありがとうございます。 >>930 教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。 試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の マウスダウンイベントを拾える事を確認したので、そのイベント検知時に this->SetFocus(); ・・・ダイアログバーのクラス内 をする事で、タイトルバー以外は思い通りの挙動にする事ができました。 これで今は妥協することにします。ありがとうございました。
- 932 名前:デフォルトの名無しさん [2009/04/08(水) 18:27:59 ]
- a<<1とa<<=1の違いを教えてください。
- 933 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:30:25 ]
- 実行後のaの内容が違う
a<<=1 は a = a << 1
- 934 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:26:37 ]
- >>925
後ろの括弧とはdeleteの右の[]のこと? intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。 デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。
- 935 名前:デフォルトの名無しさん [2009/04/08(水) 21:03:45 ]
- 最近Visual C++ 2008を使い始めたものです。
あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。 #define _SCL_SECURE_NO_WARNINGS をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい のですが、どうやればいいのでしょうか? どうかよろしくお願いします。
- 936 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:12:31 ]
- コンパイラオプションに
/D_SCL_SECURE_NO_WARNINGS を指定する
- 937 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:26:56 ]
- >>934
int (*p)[10] = new int [3][10](); の最後の()のことじゃない?
- 938 名前:デフォルトの名無しさん [2009/04/08(水) 21:27:13 ]
- >>936
ありがとうございます。 コンパイラオプションってどこで指定できますか? プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。
- 939 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:54:34 ]
- 質問です。
一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して とある処理をしています。ウィンドウにフォーカスがある時より、ない時の ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう 理由なんでしょうか? ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが 独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも 思いましたが、特に過剰に呼ばれているわけでは無さそうでした。
- 940 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:20:28 ]
- >>938
ツリービュー:構成プロパティ→C/C++→プリプロセッサ 構成:すべての構成 プリプロセッサの定義(/D[マクロ]) _SCL_SECURE_NO_WARNINGS
- 941 名前:デフォルトの名無しさん [2009/04/08(水) 22:21:05 ]
- ttp://www.01-tec.com/document/without_pointer.html
ここの、●バグその3「'\0'終端」 のサンプルプログラムの事なんですが、 #include <stdio.h> /* puts() */ #include <string.h> /* strcat() */ int main() { char buff[128] ; strcat( buff, "ABC" ) ; puts( buff ) ; /* ABCと表示したい */ return 0 ; } buffに終端NULLが入っていない為、putsの表示がうまくいかない事が このプログラムの意図するところらしいのですが、"で囲まれた文字列には 暗黙的に'\0'が付加されるのでこのプログラムのように strcat( buff, "ABC" ) ; としても問題ないですよね?
- 942 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:25:00 ]
- 構成:すべての構成
にするとまずいんで(WIN32やら_DEBUGが消えてしまう) Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で
- 943 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:31:21 ]
- >>941
C言語の文字列では,終端記号があることを前提にしています。 しかし,charの配列を確保しただけでは文字列として初期化されているわけではないのです。 以下の例は,終端記号の存在(文字列としての初期化)を忘れたために失敗してしまった例です #include <stdio.h> /* puts() */ #include <string.h> /* strcat() */ int main() { char buff[128] = ""; // こうすればおk strcat( buff, "ABC" ) ; puts( buff ) ; /* ABCと表示したい */ return 0 ; }
- 944 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:32:38 ]
- >>941
ちゃんとそこ読んだのか? strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、 buffに'\0'が入っている保証はどこにもない
- 945 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:42:19 ]
- >プログラマの都合よく '\0' で初期化されているわけではないのです。
初期化されないのは仕様だしな(スタックポインタを加減するだけ) 高級アセンブラは使う人を選ぶ
- 946 名前:デフォルトの名無しさん [2009/04/08(水) 22:47:38 ]
- >>944,943
ありがとうございます、 自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた という認識で良いでしょうか
- 947 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:49:25 ]
- C++ は「高度な抽象」とか「型安全」とかいうくせに
ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。 どういうことなんだ。ぷんぷん。
- 948 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:50:19 ]
- どちらもできる柔軟な特性と前向きに捉えてみる
- 949 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:05:04 ]
- C++はbetterなC
オブジェクト思考したいならJavaをやれ C#・・・何それ?
- 950 名前:デフォルトの名無しさん mailto:age [2009/04/08(水) 23:14:55 ]
- C#はVBみたいなもんだよな。
- 951 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:19:37 ]
- C#使うぐらいならVBのほうがいいよ
- 952 名前:デフォルトの名無しさん [2009/04/08(水) 23:21:17 ]
- >933
ありがとうございます。 昔そんなことを習ったような気がします。
- 953 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:21:31 ]
- VBなんか死んでもやらない。理由は無い。
- 954 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:50:21 ]
- 「無い」というのも立派な理由だよ
- 955 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:58:29 ]
- 同じ.NET frameworkを使っているだけで、VBとC#を一緒にするのはないわ
- 956 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:04:13 ]
- 似たようなもんだけどな。
- 957 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:41:18 ]
- VB.netとC#は似たようなもん。
- 958 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:11:18 ]
- >>947
言語のせいじゃないだろ。ライブラリの作者に文句言え。
- 959 名前:デフォルトの名無しさん mailto:age [2009/04/09(木) 07:52:07 ]
-
困っています。 www.kattch.com/~kattch/MySQL/06_3.html fedoracore4でC言語とMySQLを接続しようとしているのですが、 実行するとセグメンテーションエラーが出ます。 record = mysql_fetch_row(result); の mysql_fetch_row関数を使用しているところで落ちているのは 判ったのですが何が原因か判りません。 コンパイル時の指定が間違っているような気がしますが わかる人がいたら教えてください。 関係ファイルのパス /usr/include/mysql/mysql.h /usr/lib/mysql/libmysqlclient.so /usr/lib/mysql/libmysqlclient.a コンパイル gcc -o mysqlclient \ -I /usr/include/mysql/ \ -L /usr/lib/mysql/ \ -l mysqlclient \ mysqlclient.c ソースファイル mysqltest.c
- 960 名前:959 mailto:age [2009/04/09(木) 07:53:41 ]
- 追記。
count = mysql_num_rows(result); の部分でも落ちます。
- 961 名前:959 mailto:sage [2009/04/09(木) 08:02:44 ]
- ソースファイルは
mysqltest.cではなくmysqlclient.cの間違いです。
- 962 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:20:45 ]
- result = mysql_store_result(&mysql_buf); ← SQL回答領域ハンドルの取得
このハンドルでエラーになってる可能性が高いな
- 963 名前:959 mailto:sage [2009/04/09(木) 08:29:51 ]
- >>962
解決方法とか……何かあるでしょうか。。。
- 964 名前:959 mailto:sage [2009/04/09(木) 09:01:17 ]
- >>962
おっしゃる通り、取得に失敗していました。 if(result = mysql_store_result(&mysql_buf)){ } else { printf("QUERY Error\n"); }
- 965 名前:959 mailto:sage [2009/04/09(木) 09:19:30 ]
- >>962
判った!!!!!!!!!!!!!!!!!!!!!! ありです。ばかやってました。
- 966 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:30:25 ]
- >>963
ソースもなしで他人のデバッグなんかできませんが。 それとも、デバッグのノウハウを0から教えろと言うことでしょうか。
- 967 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:41:09 ]
- esp
- 968 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:08:03 ]
- 関数の戻り値チェックはちゃんとしましょうということだろ
- 969 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:26:47 ]
- PHPからCをCからPHPを呼び出す、もとい実行する方法ってある?
- 970 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:40:46 ]
- >>969
systemやexec系の関数で出来るだろ
- 971 名前:デフォルトの名無しさん [2009/04/09(木) 12:01:34 ]
- そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな?
時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの あるんだけど。
- 972 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:03:17 ]
- 過去ログ見ろとか言われても困るよなw
- 973 名前:デフォルトの名無しさん [2009/04/09(木) 12:57:43 ]
- boost::shared_ptr<Test> MemberFunction();
boost::shared_ptr<Test>& MemberFunction(); あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。 (名前はMemberFunction)。 このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか? 自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を 返すことに意味はあるでしょうか?
- 974 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:14:58 ]
- 参照を返したら外部からインスタンス内部のポインタをresetできる。
コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
- 975 名前:デフォルトの名無しさん [2009/04/09(木) 13:20:34 ]
- >>974
外部から触って欲しくない時にはコピーインスタンスを返すべきということですか? でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは ないですか?
- 976 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:42:25 ]
- scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、
呼出し元が破棄されたポインタを持たされる危険がある。 というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。 そもそもスマポは、Testインスタンスを参照する手段であって、 MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
- 977 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:46:08 ]
- スマポってセマンティクスはポインタだからな
Test*& MemberFunction(); と同じ事をしようとしてる
- 978 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:57:10 ]
- >>975
コピーをお前はTest自体のコピーと考えているように見えて、 974はshared_ptrのコピーのことを指しているように見えるぞ。
- 979 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:17:13 ]
- &じゃなくてconst&ならありなんじゃね?
値をコピーすると参照カウンタの操作が入って遅いだろうし。
- 980 名前:975 [2009/04/09(木) 22:10:14 ]
- でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか?
スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより 30倍近く時間がかかってました。 でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
- 981 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:02:14 ]
- 速度を本当に気にするような場面ならそもそもスマポを使うな。
しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。 30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、 それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
- 982 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:06:31 ]
- shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。
そもそもオブジェクトが何かの参照を返す事自体問題がある。
- 983 名前:975 [2009/04/10(金) 01:02:41 ]
- そうなんですか。。。
実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し (スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、 最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、 なんでかなとおもってたのですが。、。
- 984 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:24:38 ]
- スマポの参照返すくらいなら普通に参照返せばいいんじゃ?
- 985 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:37:00 ]
- ぬるりーは怖いぜよ
- 986 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:03:51 ]
- 返ってきたスマポの参照が本当に有効なスマポを指してるのか
知らない間に外からいじくられないか いつまで生きてることが保証されてるのか そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ 危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて ストーブ炊いて暑いからってクーラーかけるようなもの 馬鹿げてる
- 987 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:26:16 ]
- ぬるぽは怖いぜよ
- 988 名前:975 [2009/04/10(金) 06:56:20 ]
- じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。
ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない と思ったんだよな。 ちょっと聞いてみます。
- 989 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 07:25:22 ]
- 30倍遅いっても怪しい感じだな
そんなに遅くなるか? 誰か試してくれ
- 990 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 07:28:34 ]
-
- 991 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 08:19:19 ]
- shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。
|

|