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


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" ) ;
としても問題ないですよね?






[ 続きを読む ] / [ 携帯版 ]

前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