09/04/07 12:02:32
>>909
こちらへどうぞ。
スレリンク(tech板)
911:デフォルトの名無しさん
09/04/07 12:02:34
ARToolKitだろ。
そういう環境ちゃんと書かないとわからんよ。
912:デフォルトの名無しさん
09/04/07 14:53:46
ええー?
そんなのインストールしてません。
913:デフォルトの名無しさん
09/04/07 17:50:35
>>902
その解放は、delete[] pで問題ない。
914:デフォルトの名無しさん
09/04/07 22:52:47
スマートポインタの一つがvectorって解釈でいいの?分からないので
質問。
915:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/07 23:09:12
>>914
よくない
917:デフォルトの名無しさん
09/04/07 23:16:22
>>915
URLリンク(gimite.net)
一応こんなのが見つかった
918:デフォルトの名無しさん
09/04/07 23:25:06
じゃvectorはスマートポインタじゃないんだね?
何が違うの?vectorも勝手にデストラクタ呼ばれて解放される
919:デフォルトの名無しさん
09/04/07 23:29:27
vectorインスタンスはポインタとして使えない。
ただ内部実装にポインタを使っているクラス。
内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。
920:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/07 23:51:19
>>919
つまりvectorで確保した領域は、関数などでポインタ渡しが
できないってことですね?それは不便かも・・。
922:デフォルトの名無しさん
09/04/08 00:06:51
クラスメンバのポインタにもアクセスすることも可能だと書いたんだけども。
923:デフォルトの名無しさん
09/04/08 00:23:43
vector(コンテナ)は、vector自身がコピーされれば、中身のメモリ領域も丸ごとコピーされる。
スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。
メモリ領域は2つのスマートポインタで共有される。
みたいな。
924:902
09/04/08 01:41:17
>>913,917
どもです。
同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが
delete [] p; でちゃんとできてました^^
925:デフォルトの名無しさん
09/04/08 06:11:47
>>924
本当だ。
この方法で、3次元配列も出来た!
しらんかった。
あと、後ろの括弧は無しでも問題ないようだけど。。。
なんでこれで出来るのか、よくわからん。
でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、
あまり使い道はないかも。
926:デフォルトの名無しさん
09/04/08 08:12:35
VC++.NETを使ってツールを作成しています。
ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、
それをShowControlBar関数を使って消したり出したりしているのですが、
表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、
変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。
クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには
どうすればよいでしょうか?
知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。
よろしくお願いします。
927:デフォルトの名無しさん
09/04/08 09:47:39
意外と難しいかもな
DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る
逆に言えば入力フォーカスが移らない限り前面には出てこない
NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも
928:デフォルトの名無しさん
09/04/08 10:22:39
MainFrame を owner にして ダイアログバーを Create すれば良いんでないの?
929:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 11:23:14
DialogBarにメッセージハンドラを追加してみたが
メッセージが思うように飛んでこないので調べてみると
URLリンク(www.ne.jp)
ダイアログバー上のイベントが、CDialogBarクラスまで来ないようだ。
したがって、イベントはCChildFrameで処理しなければならない。
CChildFrameをサブクラス化するなりしないとならないようだ
やれなくはないが、もっと簡単な方法はないだろうか・・・
931:926
09/04/08 12:25:22
色々教えていただきありがとうございました。
>>927
おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると
フォーカスは移りました。
>>928
元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。
>>929
Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。
ただツールをしるきっかけを教えていただきありがとうございます。
>>930
教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。
試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の
マウスダウンイベントを拾える事を確認したので、そのイベント検知時に
this->SetFocus(); ・・・ダイアログバーのクラス内
をする事で、タイトルバー以外は思い通りの挙動にする事ができました。
これで今は妥協することにします。ありがとうございました。
932:デフォルトの名無しさん
09/04/08 18:27:59
a<<1とa<<=1の違いを教えてください。
933:デフォルトの名無しさん
09/04/08 18:30:25
実行後のaの内容が違う
a<<=1
は
a = a << 1
934:デフォルトの名無しさん
09/04/08 19:26:37
>>925
後ろの括弧とはdeleteの右の[]のこと?
intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。
デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。
935:デフォルトの名無しさん
09/04/08 21:03:45
最近Visual C++ 2008を使い始めたものです。
あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。
#define _SCL_SECURE_NO_WARNINGS
をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード
されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい
のですが、どうやればいいのでしょうか?
どうかよろしくお願いします。
936:デフォルトの名無しさん
09/04/08 21:12:31
コンパイラオプションに
/D_SCL_SECURE_NO_WARNINGS
を指定する
937:デフォルトの名無しさん
09/04/08 21:26:56
>>934
int (*p)[10] = new int [3][10]();
の最後の()のことじゃない?
938:デフォルトの名無しさん
09/04/08 21:27:13
>>936
ありがとうございます。
コンパイラオプションってどこで指定できますか?
プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。
939:デフォルトの名無しさん
09/04/08 21:54:34
質問です。
一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して
とある処理をしています。ウィンドウにフォーカスがある時より、ない時の
ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう
理由なんでしょうか?
ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが
独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも
思いましたが、特に過剰に呼ばれているわけでは無さそうでした。
940:デフォルトの名無しさん
09/04/08 22:20:28
>>938
ツリービュー:構成プロパティ→C/C++→プリプロセッサ
構成:すべての構成
プリプロセッサの定義(/D[マクロ])
_SCL_SECURE_NO_WARNINGS
941:デフォルトの名無しさん
09/04/08 22:21:05
URLリンク(www.01-tec.com)
ここの、●バグその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:デフォルトの名無しさん
09/04/08 22:25:00
構成:すべての構成
にするとまずいんで(WIN32やら_DEBUGが消えてしまう)
Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で
943:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 22:32:38
>>941
ちゃんとそこ読んだのか?
strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、
buffに'\0'が入っている保証はどこにもない
945:デフォルトの名無しさん
09/04/08 22:42:19
>プログラマの都合よく '\0' で初期化されているわけではないのです。
初期化されないのは仕様だしな(スタックポインタを加減するだけ)
高級アセンブラは使う人を選ぶ
946:デフォルトの名無しさん
09/04/08 22:47:38
>>944,943
ありがとうございます、
自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは
たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた
という認識で良いでしょうか
947:デフォルトの名無しさん
09/04/08 22:49:25
C++ は「高度な抽象」とか「型安全」とかいうくせに
ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。
どういうことなんだ。ぷんぷん。
948:デフォルトの名無しさん
09/04/08 22:50:19
どちらもできる柔軟な特性と前向きに捉えてみる
949:デフォルトの名無しさん
09/04/08 23:05:04
C++はbetterなC
オブジェクト思考したいならJavaをやれ
C#・・・何それ?
950:デフォルトの名無しさん
09/04/08 23:14:55
C#はVBみたいなもんだよな。
951:デフォルトの名無しさん
09/04/08 23:19:37
C#使うぐらいならVBのほうがいいよ
952:デフォルトの名無しさん
09/04/08 23:21:17
>933
ありがとうございます。
昔そんなことを習ったような気がします。
953:デフォルトの名無しさん
09/04/08 23:21:31
VBなんか死んでもやらない。理由は無い。
954:デフォルトの名無しさん
09/04/08 23:50:21
「無い」というのも立派な理由だよ
955:デフォルトの名無しさん
09/04/08 23:58:29
同じ.NET frameworkを使っているだけで、VBとC#を一緒にするのはないわ
956:デフォルトの名無しさん
09/04/09 00:04:13
似たようなもんだけどな。
957:デフォルトの名無しさん
09/04/09 00:41:18
VB.netとC#は似たようなもん。
958:デフォルトの名無しさん
09/04/09 02:11:18
>>947
言語のせいじゃないだろ。ライブラリの作者に文句言え。
959:デフォルトの名無しさん
09/04/09 07:52:07
困っています。
URLリンク(www.kattch.com)
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
09/04/09 07:53:41
追記。
count = mysql_num_rows(result); の部分でも落ちます。
961:959
09/04/09 08:02:44
ソースファイルは
mysqltest.cではなくmysqlclient.cの間違いです。
962:デフォルトの名無しさん
09/04/09 08:20:45
result = mysql_store_result(&mysql_buf); ← SQL回答領域ハンドルの取得
このハンドルでエラーになってる可能性が高いな
963:959
09/04/09 08:29:51
>>962
解決方法とか……何かあるでしょうか。。。
964:959
09/04/09 09:01:17
>>962
おっしゃる通り、取得に失敗していました。
if(result = mysql_store_result(&mysql_buf)){
}
else
{
printf("QUERY Error\n");
}
965:959
09/04/09 09:19:30
>>962
判った!!!!!!!!!!!!!!!!!!!!!!
ありです。ばかやってました。
966:デフォルトの名無しさん
09/04/09 09:30:25
>>963
ソースもなしで他人のデバッグなんかできませんが。
それとも、デバッグのノウハウを0から教えろと言うことでしょうか。
967:デフォルトの名無しさん
09/04/09 09:41:09
esp
968:デフォルトの名無しさん
09/04/09 10:08:03
関数の戻り値チェックはちゃんとしましょうということだろ
969:デフォルトの名無しさん
09/04/09 11:26:47
PHPからCをCからPHPを呼び出す、もとい実行する方法ってある?
970:デフォルトの名無しさん
09/04/09 11:40:46
>>969
systemやexec系の関数で出来るだろ
971:デフォルトの名無しさん
09/04/09 12:01:34
そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな?
時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの
あるんだけど。
972:デフォルトの名無しさん
09/04/09 12:03:17
過去ログ見ろとか言われても困るよなw
973:デフォルトの名無しさん
09/04/09 12:57:43
boost::shared_ptr<Test> MemberFunction();
boost::shared_ptr<Test>& MemberFunction();
あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。
(名前はMemberFunction)。
このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか?
自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を
返すことに意味はあるでしょうか?
974:デフォルトの名無しさん
09/04/09 13:14:58
参照を返したら外部からインスタンス内部のポインタをresetできる。
コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
975:デフォルトの名無しさん
09/04/09 13:20:34
>>974
外部から触って欲しくない時にはコピーインスタンスを返すべきということですか?
でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは
ないですか?
976:デフォルトの名無しさん
09/04/09 14:42:25
scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、
呼出し元が破棄されたポインタを持たされる危険がある。
というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。
そもそもスマポは、Testインスタンスを参照する手段であって、
MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
977:デフォルトの名無しさん
09/04/09 20:46:08
スマポってセマンティクスはポインタだからな
Test*& MemberFunction();
と同じ事をしようとしてる
978:デフォルトの名無しさん
09/04/09 20:57:10
>>975
コピーをお前はTest自体のコピーと考えているように見えて、
974はshared_ptrのコピーのことを指しているように見えるぞ。
979:デフォルトの名無しさん
09/04/09 21:17:13
&じゃなくてconst&ならありなんじゃね?
値をコピーすると参照カウンタの操作が入って遅いだろうし。
980:975
09/04/09 22:10:14
でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか?
スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより
30倍近く時間がかかってました。
でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
981:デフォルトの名無しさん
09/04/09 23:02:14
速度を本当に気にするような場面ならそもそもスマポを使うな。
しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。
30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、
それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
982:デフォルトの名無しさん
09/04/09 23:06:31
shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。
そもそもオブジェクトが何かの参照を返す事自体問題がある。
983:975
09/04/10 01:02:41
そうなんですか。。。
実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し
(スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、
最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、
なんでかなとおもってたのですが。、。
984:デフォルトの名無しさん
09/04/10 01:24:38
スマポの参照返すくらいなら普通に参照返せばいいんじゃ?
985:デフォルトの名無しさん
09/04/10 01:37:00
ぬるりーは怖いぜよ
986:デフォルトの名無しさん
09/04/10 02:03:51
返ってきたスマポの参照が本当に有効なスマポを指してるのか
知らない間に外からいじくられないか
いつまで生きてることが保証されてるのか
そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ
危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて
ストーブ炊いて暑いからってクーラーかけるようなもの
馬鹿げてる
987:デフォルトの名無しさん
09/04/10 02:26:16
ぬるぽは怖いぜよ
988:975
09/04/10 06:56:20
じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。
ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない
と思ったんだよな。
ちょっと聞いてみます。
989:デフォルトの名無しさん
09/04/10 07:25:22
30倍遅いっても怪しい感じだな
そんなに遅くなるか?
誰か試してくれ
990:デフォルトの名無しさん
09/04/10 07:28:34
991:デフォルトの名無しさん
09/04/10 08:19:19
shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。