[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 06/02 12:18 / Filesize : 258 KB / Number-of Response : 992
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.64【環境依存OK】



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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


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なら、コピー時の参照数の管理コストを無視できない、かも。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef