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


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

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



1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


730 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:43:11 ]
こんばんは、皆さんに質問です
テンプレートの定数の引数をエレガントに記述する方法が分かりません

template <class Type, int Length> Array
{
   …Arrayの実装…
};

class Color : public Array< unsigned char, 3 > // RGBなので3
{
public:
   static const int ColorDimension = 3; // これは使えない…
   …Arrayの実装…
};

ここに出てくる3をエレガントに記述する方法が分かりません
グローバルで定義したりdefineディレクティブで定義したりは汚いですし、
無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。

731 名前:デフォルトの名無しさん [2007/06/18(月) 20:48:52 ]
元々汚いんだからエレガントなんて求めなくて良い

732 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:50:52 ]
少しはきれいに書ける方法としては派生元で定義してしまう方法ですが…

template <class Type, int Length> Array
{ …Arrayの実装… };

class ColorBase
{
public:
  const static int Dimension = 3;
}

class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3
{  …Arrayの実装… };

なんか微妙です…第一、継承する意味があるのかと…う〜ん。
でもnamespaceだと関連性の記述があいまいです。

さらにはこんな方法もあるのですが…
class TColor<int Length> : public ColorBase, public Array< unsigned char, Length >
{  …Arrayの実装… };

typedef TColor<3> Color;

結局これでは定数をtypedefに移しただけで意味がなく、
const TColor::Dimension=3;
typedef TColor<TColor::Dimension> Color;
とまでして構造をめちゃくちゃにするのなら、
そのまま3って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?

733 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:53:19 ]
>>731
では、その元々汚いものを綺麗にする方法を教えてください。

734 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:00:58 ]
>>730
Arrayに手を付けていいなら、

template <class Type, int Length_> Array
{
public:
  static const int Length = Length_;
  //...
};

class Color : public Array<unsigned char, 3> // RGBなので3
{
public:
  static const int ColorDimension = Length;
  //...
};


735 名前:デフォルトの名無しさん [2007/06/18(月) 21:10:10 ]
int g1;int g2; int ga[10];
main(){
int li;int l2; int la[10]; int lb[10][10];

printf("%d\n", &g1);
printf("%d\n", &g2);
printf("%d\n", &l1);
printf("%d\n", &l2);

printf("%d\n", &l1-&l2);
}


↑のようなプログラムの
printf("%d\n", &l1-&l2);の表示結果の意味と
大局変数ga と局所変数la がどのように並んでいるのかを答えろって
課題なのですが、全くもって意味が分かりませんorz

ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
これはどういう事を意味しているのでしょうか?

ga[10]とla[10]に関してですが、これは[0]〜[9]までの配列が用意されてるって事で良いんですかね?

ヒントの方よろしくお願いしますorz



736 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:14:01 ]
なぜに&

737 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:15:51 ]
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」

738 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:16:17 ]
すみません、いくつか質問させてください。
1、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか?
  int i = Array<int, 3>::Length;
  とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に
  初期化が行われるのでしょうか?

2、int i = Color::ColorDimension;
  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?

ちなみに、せっかく答えていただいたのに恐縮ですが、
class Color : public Array<unsigned char, 3>
の、3がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。



739 名前:730 mailto:sage [2007/06/18(月) 21:18:19 ]
あ、私は730で>>734さんに対してのコメントです

740 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:20:20 ]
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。


741 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:23:23 ]
>>735
>printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]〜[9]までの配列が用意されてるって事で
おk。

742 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:27:19 ]
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。

743 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:44:32 ]
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど

744 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:49:54 ]
>>741
理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。

745 名前:デフォルトの名無しさん [2007/06/18(月) 21:51:47 ]
>>736
頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。

>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。

>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。


>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。



746 名前:730 mailto:sage [2007/06/18(月) 21:54:59 ]
>>742
グローバルの名前空間は絶対に汚せない環境というのがございまして…
#define COLOR_DIMENSION 3
class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3
{
  …Arrayの実装…
};
#undef COLOR_DIMENSION
とかwww、もう何がなんだか…
#undef _COLOR_DIMENSION 3
あたりで我慢っすかねぇ

>>743
しかし、ArrayはColorとはあんまり関係なかったりして…
そもそも、public継承なのかprivate継承なのかという問題までありまして…

template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3
{
public:
   Color() { assert(Dimension==3); }
}
とか…いや、assertで比較している3がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも

747 名前:594デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:57:33 ]
C言語の全角半角処理について二点程分からないので、宜しかったらアドバイスを頂けたらと思います。
仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。
(CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。
現在、入力された文字列に「@全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」
(つまり@の処理は漢字や平仮名カタカナや英字は入力出来ます)
という処理と、「A全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」
(Aは、@の通過可能な条件に、全角半角数字が含まれます)
という処理と、「B全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。
半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで
どうにかなってますが、Aのハイフンの判別ができずに詰まってます。
使ってるソースは、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3606
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。

748 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:58:46 ]
>>745
とりあえずグダグダうるせえ。






749 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:00:47 ]
>730
というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。

750 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:03:07 ]
>747
ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。

751 名前:デフォルトの名無しさん [2007/06/18(月) 22:17:19 ]
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか?
継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?

752 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:21:47 ]
classでレガシーな初期化はできなかった希ガス。
class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。

753 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:39:10 ]
>752
全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。

754 名前:デフォルトの名無しさん [2007/06/18(月) 22:49:14 ]
サンクス。
しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。

755 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:00:50 ]
質問
 1. 死ぬまでenumハックを使うべきなのか。
 2. 死ぬまでexportは使ってはならないのか。

756 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:07:21 ]
>>755
1. そうです
2. そうです

早死にしないように気をつけて

757 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:10:24 ]
1 VC6を窓から投げ捨てりゃいいんじゃね
2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね

758 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:16:47 ]
>>754
www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014




759 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:44:18 ]
>738
初期化は実行時に起こる。
テンプレートが使用された時、というのはコンパイル時の話。

件の場合、定数化されてしまうというのを無視すると

int i = Array<int, 3>::Length;

とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。
で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも
初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。

>2、int i = Color::ColorDimension;
>  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。

760 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:38:16 ]
いくつかのサイトで見られたのですが、
STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。

761 名前:760 mailto:sage [2007/06/19(火) 07:24:58 ]
あ、すみません。
構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?


762 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:59:43 ]
>>760
定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。

>STARTUPINFO si = {};
コンパイル通った?

763 名前:760 mailto:sage [2007/06/19(火) 08:56:24 ]
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。
コンパイル通らない可能性もあるんですね。それなら使いません。

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?

764 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 08:56:28 ]
>>761
全部省略できるのは C++ だけ。

765 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 09:59:42 ]
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。

766 名前:デフォルトの名無しさん [2007/06/19(火) 10:21:17 ]
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。

767 名前:760 mailto:sage [2007/06/19(火) 11:07:01 ]
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。

768 名前:766 mailto:sage [2007/06/19(火) 12:48:11 ]
解決しますた



769 名前:デフォルトの名無しさん [2007/06/19(火) 12:57:26 ]
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。

770 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:01:28 ]
>>769
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。

771 名前:デフォルトの名無しさん [2007/06/19(火) 13:10:27 ]
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>

int main(){
printf("今現在BMPの画像");
return 0;
}

772 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:11:07 ]
どうせWindowsだろ
猫でも読んどけ

773 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:47:09 ]
丸投げは宿題スレ以外はだめ
今どこまで理解しててどこら辺がわからないのか書け

774 名前:デフォルトの名無しさん [2007/06/19(火) 14:38:22 ]
>>729
ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)



775 名前:デフォルトの名無しさん [2007/06/19(火) 14:46:23 ]
すいません、ソース貼り忘れた

#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {
a=x;
cout << "x=" << x << endl;
}
};
class sub1 : virtual public base {
public: sub1() : base(0) {}
};
class sub2 : virtual public base {
public: sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {
public: sub3() : base(33) {}
};
class sub4 : public sub3 {
public: sub4() : base(1) {}
};
int main()
{
sub4 obj;
obj.a = 10;
return 0;
}

776 名前:デフォルトの名無しさん [2007/06/19(火) 14:49:43 ]
win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり
win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか?
また、両者の使い分け基準って何かあるのですか?
たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか

777 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 14:56:41 ]
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?

778 名前:デフォルトの名無しさん [2007/06/19(火) 16:30:34 ]
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています



779 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:40:49 ]
try catchじゃ例外は出せない

780 名前:デフォルトの名無しさん [2007/06/19(火) 16:42:51 ]
tryの中でcatchに飛ばす方法を教えてください

781 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:48:03 ]
「C++ 例外」でググれ

782 名前:デフォルトの名無しさん [2007/06/19(火) 17:01:37 ]
このソースで
LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。
がでるんだけど、何が悪いか教えてください。
どうやったらwarning消せますか。ちゃんと.shareが使える形で。

#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
HANDLE x = NULL;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

783 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 17:24:35 ]
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1

784 名前:デフォルトの名無しさん [2007/06/19(火) 17:35:43 ]
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。

785 名前:783 mailto:sage [2007/06/19(火) 18:05:35 ]
releaseでもでなかった printfでx見たいからコンソールにした 複数プロセス起動させるとxの値が増加したからshareされてると思う@vc7.1 winxp sp2
#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/SECTION:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int main(int ac, char** av)
{
 printf("%d\n", x);
 x += 1;
 MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK);
 return 0;
}

786 名前:デフォルトの名無しさん [2007/06/19(火) 18:59:16 ]
>>785
まじですか。
こちらの環境はVS2005のExpress。
調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。

コンパイルエラーが出ないソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 ++x;
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

つづく

787 名前:デフォルトの名無しさん [2007/06/19(火) 19:01:28 ]
コンパイルエラーが出るソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

++x; がないだけ。
↑のは ×初期化されない ○一度も利用されることがない
かと思っています。

788 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 20:14:08 ]
最適化で消されてるだけじゃないかな
/Faで.asm見ればわかるよ



789 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:00:05 ]
スカトロCGを激しく集めるスレver27
sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537

537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528

 試 し た の か ? 

IDがC++

790 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:08:56 ]
よりにもよってスカかよw

791 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:12:52 ]
しかも logK か。
何か化学的な雰囲気を感じるぞ。

792 名前:730 mailto:sage [2007/06/19(火) 22:17:42 ]
>>759
Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?


793 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:19 ]
>>792
テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない

794 名前:730 mailto:sage [2007/06/19(火) 23:51:30 ]
>>793
ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。
コンパイル時に行われるということを考えると文法も分かりますね。

・OKな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B;
};
const int Base::  A = 1;
const int Derived:: B = A;

・ダメな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B = A;
};
const int Base::  A = 1;

たしかにwww。ありがとうございました。

795 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:55:57 ]
いかん
最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん

796 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 01:49:32 ]
例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで
template<typename T> value_t
{
public:
  T get() const { return value; }
  void set(T n) { value = n; }
private:
  T value;
};
という感じになると思います。value_t<int> とかなら問題ないと思いますが、
(普通は参照を使って渡す)クラスや構造体が型に指定されると、
無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。
ということで、最初から参照を使って、
template<typename T> value_t
{
public:
  const T & get() const { return value; }
  void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする
private:
  T value;
};
こう書いても問題ないですか?(というか、こう書くべきですか?)

797 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:00:31 ]
問題はないけど、
プリミティブ型だと結構遅くなる。


798 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:37:39 ]
>>796
boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか



799 名前:デフォルトの名無しさん [2007/06/20(水) 08:26:49 ]
>>783
>>788
ありがとう。「最適化で消された」みたいです。腑に落ちました。

800 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:49:37 ]
ofstream ofs("a.txt",ios::app);
ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl;
や、
if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName"))
だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも)

ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl;
や、
if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName"))
のようにhwndParentならクラッシュしません。これは何が原因でしょうか?

801 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:51:30 ]
>>800
各変数の値がどうなってるかくらい調べろよ

802 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:56:12 ]
>>800
とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?

803 名前:800 mailto:sage [2007/06/20(水) 13:04:12 ]
>>801
すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。

>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。

804 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:13:25 ]
C++で安全なコードを書きたいなら、キャスト前のチェックとか、
->の元がNULLでないことを保証するassertなんかは必須かと

というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?

805 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:17:03 ]
>>803
予測なんてしなくていいから、デバッグ実行しろ。

806 名前:800 mailto:sage [2007/06/20(水) 13:41:47 ]
>>804
lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。

>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。

807 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:56:34 ]
MSDNのCREATESTRUCTに関するヘルプには
Because the lpszClass member can contain a pointer to a local
(and thus inaccessable) atom, do not obtain the class name
by using this member. Use the GetClassName function instead.
と書かれているようだが。
lpszClassに直接アクセスしてクラス名を取得しようとするな
ってことじゃねえの。

808 名前:800 mailto:sage [2007/06/20(水) 15:24:02 ]
>>807
わざわざありがとうございました。



809 名前:デフォルトの名無しさん [2007/06/20(水) 19:21:18 ]
class Stone{
public:
Stone();
int color, groupNumber;
Stone *nextStone, * groupHead, *nextGroup;
};

Stone::Stone(){
color = groupNumber = 0;
*nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない
}
というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、
Boardオブジェクトを作りたいと考えています。

改行が多いといわれたので続きます

810 名前:809の続き [2007/06/20(水) 19:22:32 ]
class Board{
public:
   Board();
   Stone board[21][21];
   Stone *boardHead;
};

Board::Board{
*boardHead = &board; // (2).Stone(*)型はStone型に変換できない
for(int i; i < 20; i++){
int j;
for(j; j < 19; j++){
board[i][j].color = 3;
board[i][j].(*nextGroup) = board[i][j + 1];
   }
board[i][j].color = 3;
board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様
}
と表記したところ、(1).(2)のエラーが起きました。
配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?

811 名前:809、810 [2007/06/20(水) 19:24:44 ]
すいません。書き忘れです。

(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。

812 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:29:47 ]
(1)のところには、余計なカンマが付いている
(2)の最初の箇所は、余計な*が付いている
2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ

813 名前:デフォルトの名無しさん [2007/06/20(水) 19:31:34 ]
(1)で*付ける意味も分からんし

nextStone = groupHead = nextGroup = 0;

とか

814 名前:デフォルトの名無しさん [2007/06/20(水) 19:33:43 ]
すみません、質問させてください。

void foo(const char *const& hoge);

のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします


815 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:42:09 ]
constな(C++の)参照

宣言自体の読み解き方がわからなければ、ここでも読んでおけ
kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ

816 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:19:12 ]
>>812-813
あ、*の扱い方が間違ってたのか。ありがとうございました。

817 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:05:47 ]
windowsで、C++builder使用してます。

質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。

これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
 とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
 で、できそうでしょうか?

2番目だと簡単そうですか?

818 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:56:04 ]
ソフト単体ならパケット監視してどうこうということもできるだろうけど、
windowsのばあい、システムに対してユーザーが介入するのは難しい。

アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。




819 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:05:58 ]
>>817
ttp://www.wilderssecurity.com/showthread.php?t=112582
でも読んでみたら

820 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:29:39 ]
>>818
レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。

>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。

821 名前:デフォルトの名無しさん [2007/06/20(水) 22:47:33 ]
>>820
そんなあなたにフィルタドライバか、DLLインジェクション。

822 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:07:41 ]
なんで具体的にそのソフト名をいわんのかね。

823 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:36:12 ]
改造する気?

824 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:45:03 ]
C++でLinkポインタというのを作りました
所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります

質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…

825 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:53:56 ]
Lockできないboost::weak_ptrを実装したって話?

826 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:31:22 ]
あのー

(unsigned int) ((context->count[0] >> 3) & 0x3F)

これがなぜ64のあまりになるのですか?

827 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:33:42 ]
>>826
0x3fは2^6-1だから。

828 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:47:40 ]
0x3f=16*3+1*15



829 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:50:06 ]
えーとじゃあ
45と120の場合いくらになるんだろ
なんか計算あわない

830 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:52:38 ]
>>826
一瞬、LISPあたりのコードかと思った。






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

前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