【初心者歓迎】C/C++室 Ver.42【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/09/03(月) 01:00:06ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.41【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1186410368/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/09/03(月) 01:17:26はじめは、書きたいように書けばいいんだよ
それより、まず1行、書き始めようや
昨年書いた自分のコードを、今の自分ならイチから書き直したくなる
そんな気持ちにすらなる アマチュアなら、それでいいのではないかと
処理系を聞いてるくらいだから、まずコンパイラセットアップからはじめようや
VCExpressでもいいよ 他言語経験者なら、まずhello world 通すことからはじめようや
プロ(ルーキー)なら、先輩に聞け 聞ける先輩がいないなら、そんな先輩を探せ
>>1 乙です
0003デフォルトの名無しさん
2007/09/03(月) 01:20:14同じように感じる人って少ないのかな?
0004デフォルトの名無しさん
2007/09/03(月) 01:20:4730過ぎると普通だよそれ
0005デフォルトの名無しさん
2007/09/03(月) 01:23:11玉石混交なのはもちろん、動くことを優先に、意図的にやっつけコード書いてることもある
コメントも読んで、書いた人の心理まで読んで欲しい
>>3
あるある、今の自分の鈍り具合を見て萎える
昨年のほうがましだったってね 正直なにくそだ
0006デフォルトの名無しさん
2007/09/03(月) 19:55:21代わりにどんなメンバポインタでも入る型は存在しないの?
0007デフォルトの名無しさん
2007/09/03(月) 20:26:12971さんの言う通りqのシグナルを送ってみたいと考えていました
いろいろありがとうございます
system使わないで実装がんばります(´・ω・`)ゞ
0008デフォルトの名無しさん
2007/09/03(月) 20:40:52そもそも変数のサイズが違うことがあるからねえ。
メンバポインタへのポインタなら入るyp
0009デフォルトの名無しさん
2007/09/03(月) 21:10:190010デフォルトの名無しさん
2007/09/03(月) 21:42:350011デフォルトの名無しさん
2007/09/03(月) 22:50:03ポぃンタってアドレスの入る箱でしょ.アドレス格納箱って32bitOSだと4バイトじゃないの?
それが、12バイトなんて信じられないぞなもし....なんで肥ったの????
0012デフォルトの名無しさん
2007/09/03(月) 22:54:450013デフォルトの名無しさん
2007/09/03(月) 23:05:49「メンバポインタは、変数ポインタや関数ポインタとは異なり、メモリの位置を指すポインタではない。
メンバポインタは、ポインタというよりも構造体オフセット、配列の添え字に近い。」
0014デフォルトの名無しさん
2007/09/03(月) 23:22:19非仮想関数の場合アドレスを、
仮想関数の場合vtblのオフセットを保持するようになっている。
もちろんどっちを保持しているかのフラグも要るし、
多重継承などで複数のvtblがある場合も考えなければいけないし、
そうしてぶくぶくふくれていく。
0015デフォルトの名無しさん
2007/09/03(月) 23:22:590016デフォルトの名無しさん
2007/09/04(火) 03:07:04>>9のは、独自拡張のいわゆる__closureの影響。
0017デフォルトの名無しさん
2007/09/04(火) 10:28:56LPARAMの値lpを
SetWindowLongPtr(wnd, DWLP_USER, lp);
として設定すると、「LPARAMからLONGへの変換。データが失われる可能性がある」と出てきます。
LPARAMもLONGも、元をたどれば同じlongなので、データが変わることはないと思ったんですが…
また、hoge *h; ていうクラスのポインタがあって、
h = reinterpret_cast<hoge *>(GetWindowLongPtr(wnd, DWLP_USER));
とすると、「LONGからより大きいサイズの hoge * へ変換します」と出てきます。
↑2つとも、自分の環境だと自分の期待通り動いてるんですが、
64ビット環境とか、他の環境だと動かない可能性があると言うことでしょうか。
# そもそも、SetWindowLongPtrの第3引数や、GetWindowLongPtrの戻り値の型はLONG_PTRだと、
MSDNライブラリに書いてあるんですが、なぜLONGなのだろう…
0018デフォルトの名無しさん
2007/09/04(火) 10:47:52http://msdn2.microsoft.com/en-us/library/aa383751.aspx
0019デフォルトの名無しさん
2007/09/04(火) 10:52:00>64ビット環境とか、他の環境だと動かない可能性があると言うことでしょうか。
そのとおり。
ただし、32ビットOSでは現在でもSetWindowLongPtrはSetWindowLongの別名として
マクロ定義されているだけなので、MSDNでは第3パラメタがLONG_PTRになっているが、
ヘッダの宣言ではSetWindowLongと同じLONGのままの扱い。
そのために警告として表示されると思われる。
>なぜLONGなのだろう…
WindowsAPIは当初から64ビット対応されてたわけではない。
以前はポインタやハンドルをLONGやDWORDで扱っている箇所があった。
64ビット対応したとき、単純にいままでLONGだった箇所はLONG_PTRに、
DWORDだった箇所はDWORD_PTRに変更したと思われ。
0020デフォルトの名無しさん
2007/09/04(火) 10:57:1019に書いたとおり、32ビットOSでの警告は現在の実装(ヘッダ)の問題と
思われるので、その警告は無視してよい、かな。
0021デフォルトの名無しさん
2007/09/04(火) 22:10:11このテンプレート部分はどうやって取得すればいいんでしょうか。
ああああああああああああああああああああああああ
0022デフォルトの名無しさん
2007/09/04(火) 22:13:18ひきすう いんすう
hikisuu innsuu
hikky
0023デフォルトの名無しさん
2007/09/04(火) 22:21:34template<class T>
void func(boost::function<T> &f) { ... }
じゃダメなん?
0024デフォルトの名無しさん
2007/09/04(火) 22:32:31からどうやって、 type1 type2 type3 type4 をそれぞれ得るか?
0025デフォルトの名無しさん
2007/09/04(火) 23:28:43どこかのヘッダファイル(VC2005だとcrtdefs.hにありました)にtypedefされている型だと思うんですが…。
でも「何も」includeしなくてもsizeof演算子は使える…。
というかsize_tも使える…。なんでsize_tが定義されてないのに使えるのでしょうか。コンパイラマジック?
こんなこと気にしてたら禿げますかね
0026デフォルトの名無しさん
2007/09/04(火) 23:30:370027デフォルトの名無しさん
2007/09/04(火) 23:33:28sizeofは、コンパイラがsize_tのtypedef元として
使うであろう整数型を結果とするということ。
コンパイラとライブラリは、全くの別物が
無関係に作るということが(おそらく)ないので、
これでうまくいくはず。
0028デフォルトの名無しさん
2007/09/04(火) 23:34:35使える→どこかで定義されている
探せ
0029デフォルトの名無しさん
2007/09/05(水) 00:25:42C言語でSocketを用いて通信する場合は
サーバー・クライアント両方とも
C言語で設計されていなくとも通信できるのですか?
0030デフォルトの名無しさん
2007/09/05(水) 00:29:58出来る。
あたりまえだろ。
0031デフォルトの名無しさん
2007/09/05(水) 00:32:02まったく問題ない
極端にいえば、アセンブラでソケットライブラリ叩いても結構
一見ばかばかしいとも思えるけど、FAQらしいのでマジレス
0032デフォルトの名無しさん
2007/09/05(水) 00:37:38たぶん、こういうニュアンスもあるんじゃないかと思う
2.5 - Can I use Winsock with { My Favorite Language }?
http://tangentsoft.net/wskfaq/newbie.html#langcompat
0033デフォルトの名無しさん
2007/09/05(水) 01:03:39それぞれ FF と C8 と D6 を取り出したいんですが
どうすればいいんですか?
何となくシフトすれば良いって気もしないでもないんですが・・・
0034デフォルトの名無しさん
2007/09/05(水) 01:06:25FFC8D6 >> 8 & 0xFF
FFC8D6 >> 16
かな
0035デフォルトの名無しさん
2007/09/05(水) 01:08:17シフトと論理積
union使う手もあるな。
0036デフォルトの名無しさん
2007/09/05(水) 01:22:15だったらGetRValue(),GetGValue(),GetBValue()とか
0037デフォルトの名無しさん
2007/09/05(水) 01:26:03右シフトするときは、ちゃんと unsigned にしてやらないと、
signed では、MSB が 1 だったときの振る舞いが処理系依存なので
気をつけないとダメよん。
>>35
union を使うってのは、ビットフィールドと、unsigned int あたりを
union にするっつーことかしら。サイズと各ビットの意味が固定な
ハードウェアレジスタの表現なんかだと、各ビットに名前つけられて
良いですな。
0038デフォルトの名無しさん
2007/09/05(水) 01:26:18unsigned char *p = &val;
で、p[0]~p[3]で取り出すとか。怒られるかな。
0039デフォルトの名無しさん
2007/09/05(水) 01:35:29C++だと怒られた
0040デフォルトの名無しさん
2007/09/05(水) 01:53:300041デフォルトの名無しさん
2007/09/05(水) 02:40:08多分こう
template<class R. class A1>
void func(boost::function<R (A1)> &f) { ... }
template<class R. class A1, . class A2>
void func(boost::function<R (A1.A2)> &f) { ... }
0042デフォルトの名無しさん
2007/09/05(水) 20:43:24union my_long {
unsigned long value;
unsigned char bytes[4];
};
union my_long tmp;
tmp.value = 0xFFC8D6;
printf("%02x %02x %02x %02x\n",
tmp.bytes[0],tmp.bytes[1],tmp.bytes[2],tmp.bytes[3]);
こんな感じか?
まぁビットフィールドは要らんだろ。
unionしばらく使ってないから、なんか間違えとるかも知らん
004335
2007/09/05(水) 20:57:23>>42みたいなのを考えてた。
ビットフィールドは、存在自体忘れてたよ。
ちなみにC++(覚えたて)なら無名の共用体を使えるから、"tmp."を省けるんだね。
0044デフォルトの名無しさん
2007/09/05(水) 20:59:520045デフォルトの名無しさん
2007/09/05(水) 21:25:11C言語でやってる限りはエンディアンと型のバイト数を
意識せにゃならんのはしょうがないんじゃね?
C++はよー分からんが。
まぁ、とりあえずエンディアン気にしないならこうか?
unsigned long val = 0xFFC8D6;
unsigned long a,b,c,d;
a = val / 0x1000000;
val = val % 0x1000000;
b = val / 0x10000;
val = val % 0x10000;
c = val / 0x100;
val = val % 0x100;
d = val;
printf("%02x %02x %02x %02x\n", a, b, c, d);
本質的には、やってることはビット演算と変わらんな。
バイト数は、まぁsizeofか何か使ってループ回すのかね。
0046デフォルトの名無しさん
2007/09/05(水) 21:36:29ビット演算もバイト順独立だよ
整数を整数として扱っている限りバイト順は気にしなくて良い
0047デフォルトの名無しさん
2007/09/05(水) 21:51:51あれ?そうだっけ?
こりゃ失礼しました。
0048デフォルトの名無しさん
2007/09/05(水) 21:54:12の方法ならパッと見スッキリ書ける。
union使うなら場合によっては「うまいこと書けたな」と満足を得ることが出来る。
>>34 >>45
は愚直に見えるが、多くの環境でまず間違いなく動く。
こんな感じか?
0049デフォルトの名無しさん
2007/09/05(水) 22:28:22○FFC8D6 >> 8 & 0xFF 派
A型、正論、頑固、まじめ。
ナンピトたりとも彼の信念を曲げることは出来ない。
頭が固くて時代についていけないタイプも含まれる。
ハマレばあらゆる環境に容易に移植できるすばらしい
コードを書く。
○union 派
AB型、革新的、短絡。
新しいもの好きで、すぐに飛びつく(union自体は新しくも無いが)。
好奇心旺盛のあまり、大怪我をすることもシバシバ。
時代を変革する革新的なコードを書く可能性を秘める。
○unsigned char *p = (unsigned char *)&val 派
O型、現実的、楽天家、適当。
とにかく動けばOK。ソースはスパゲッティーになりがち。
このタイプの優秀な奴は、あらゆる環境に即座に対応し、
理論よりも現実に沿ったコードを書く。
尚、B型は分類不能。
0050デフォルトの名無しさん
2007/09/05(水) 22:29:490051デフォルトの名無しさん
2007/09/05(水) 22:33:070053デフォルトの名無しさん
2007/09/05(水) 22:54:25かなーり古い方法でっせ。適用される場面がデバドラ系で、
一般的なコードではほとんど出てこないんで、縁のない人は
一生見ないで終わるかも知れんけどw
0054デフォルトの名無しさん
2007/09/05(水) 23:04:59A型で一番上。真ん中はunion作るのが面倒くさい(でも、実際は面倒じゃないよな)
0055デフォルトの名無しさん
2007/09/05(水) 23:46:43sprintf( buf, "%08X", val);
memset( buf1, 0, BUF_SIZE);
memcpy( buf1, buf, 2 );
a = strtol(buf1, 0, 16);
memset( buf1, 0, BUF_SIZE);
memcpy( buf1, buf+2, 2 );
b = strtol(buf1, 0, 16);
....
以下略みたいな
0056デフォルトの名無しさん
2007/09/05(水) 23:50:460057デフォルトの名無しさん
2007/09/05(水) 23:50:49#include <cstdio>
using namespace std;
union my_long {
my_long( long val ): value(val){}
void show();
unsigned long value;
unsigned char bytes[4];
};
void my_long::show() {
printf("%08X\n", value );
printf("%02X %02X %02X %02X\n", bytes[0], bytes[1], bytes[2], bytes[3]);
}
int main(){
my_long ore = 0xFFEEDDCC;
ore.show();
return 0;
}
0058デフォルトの名無しさん
2007/09/05(水) 23:52:14なんかコンパイル通っちゃったんだけど
C++じゃなくても使えるようになった?
コンパイラが機転利かせてくれただけ?
0059デフォルトの名無しさん
2007/09/06(木) 00:05:16C++としてコンパイルすることはできるわけだが。
0060デフォルトの名無しさん
2007/09/06(木) 00:39:39デストラクタがないのがきつい。
0061デフォルトの名無しさん
2007/09/06(木) 01:17:340062デフォルトの名無しさん
2007/09/06(木) 23:06:31デフォルトで「C++としてコンパイルする」とかいう謎のオプションが付いてるよーだ?
0063デフォルトの名無しさん
2007/09/06(木) 23:08:390064デフォルトの名無しさん
2007/09/06(木) 23:43:10char* str = "a";
char ch = str[0];
printf("%s", &ch);
とすると"a"の後ろにゴミのようなものがついて出力されてしまいます。
これは何故なんでしょうか?
そして、&chを"a"だけにするにはどうすればいいでしょうか?
printf("%c", ch);なら大丈夫なんですが、
strcmp(char* s1, char* s2);で使うので、
ポインタかアドレスにしたいです。
0065デフォルトの名無しさん
2007/09/06(木) 23:47:35printf("%s", str);
0066デフォルトの名無しさん
2007/09/06(木) 23:56:00char* str = "abc";
char ch = str[0];
strcmp(&ch, "a");
という感じに1文字目が"a"か判定するのに使いたいので、
strそのままじゃなく、strを1文字に分解したものが欲しいんです。
0067デフォルトの名無しさん
2007/09/06(木) 23:56:39C言語で文字列ってのはナル終端文字列で、
char配列で文字の並びを表して最後に'\0'を付加したもの。
>char ch = str[0];
これだと'a'のうしろに'\0'をがないでしょ。
char ch[2];
ch[0] = str[0];
ch[1] = '\0';
printf("%s", ch);
0068デフォルトの名無しさん
2007/09/07(金) 00:00:260069デフォルトの名無しさん
2007/09/07(金) 00:00:33それなら文字列を比較してるんじゃなくて文字を比較してるんだからstrcmpは不要
if(str[0]=='a')
0070デフォルトの名無しさん
2007/09/07(金) 00:02:130071デフォルトの名無しさん
2007/09/07(金) 00:09:45とりあえず入門書読んでみたら?
ネット上にもいくつかあるし。
http://wisdom.sakura.ne.jp/programming/c/index.html
http://homepage3.nifty.com/mmgames/c_guide/index.html
007266
2007/09/07(金) 00:14:410073デフォルトの名無しさん
2007/09/07(金) 07:47:030074デフォルトの名無しさん
2007/09/07(金) 08:02:500075デフォルトの名無しさん
2007/09/07(金) 16:27:09一々これINT あれは、DWORDってくそめんどくさいぞ
0076デフォルトの名無しさん
2007/09/07(金) 16:34:260077デフォルトの名無しさん
2007/09/07(金) 16:35:080078デフォルトの名無しさん
2007/09/07(金) 16:59:150079デフォルトの名無しさん
2007/09/07(金) 17:07:320080デフォルトの名無しさん
2007/09/07(金) 17:07:390081デフォルトの名無しさん
2007/09/07(金) 19:37:03型推論はもっと抽象的なところでやっててくれ。
0082デフォルトの名無しさん
2007/09/07(金) 19:46:07CやC++でコードを書くときに、どのみち型推論よりもずっと複雑なことを
色々考慮しながらコード書いてると思うが
ポインタは単なるアドレスとだけ理解をしていると、C++の多重継承時の
ポインタのキャスト操作などでハマるし
008382
2007/09/07(金) 19:57:10abstractionが不要だと言うのならクラスやテンプレートは要らないし
コンパイラが裏で仕事をするのがイヤだというのならC++なんぞは悪のカタマリだ
そんならアセンブラだけ使っていればいい
0084デフォルトの名無しさん
2007/09/07(金) 20:16:560085デフォルトの名無しさん
2007/09/07(金) 20:28:430086デフォルトの名無しさん
2007/09/07(金) 23:04:250087デフォルトの名無しさん
2007/09/08(土) 00:09:30関数テンプレートにおける実引数からのテンプレート実引数の導出は、
まさに抽象的なところだと俺は思うよ。
0088デフォルトの名無しさん
2007/09/08(土) 00:32:530089デフォルトの名無しさん
2007/09/08(土) 06:27:090090デフォルトの名無しさん
2007/09/08(土) 06:31:40演繹な
0091デフォルトの名無しさん
2007/09/08(土) 06:48:28SetFilePointer(hFile, 0L, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
0092デフォルトの名無しさん
2007/09/08(土) 06:50:52ありがとう
0093デフォルトの名無しさん
2007/09/08(土) 09:17:45Accelerated C++では仮想デストラクタは継承されると書いてありました。
これは仮想でないデストラクタは継承されないが、仮想にすると継承される
という解釈で良いのですか?
ストラウスストラップのプログラミング言語C++第3版には特に言及された
箇所が見当たりませんでした。
実際はどうなのでしょうか?
0094デフォルトの名無しさん
2007/09/08(土) 09:44:51using namespace std;
class B {
public:
~B(){ cout << "B::~B()" << endl; }
};
class D : public B {
public:
~D(){ B::~B(); }
};
int main()
{
D obj;
return 0;
}
このコードですが、bcc32ではコンパイルが成功し実行できました。
結果は
B::~B()
B::~B()
解釈すると、objが破棄されるときに~D()がコールされ、その定義の中身B::~B()が
実行された後で、Dの基底部分のBが解体されるので再度B::~B()が呼ばれた。
しかしg++では ~D(){ B::~B(); } の部分で以下のエラーが表示されコンパイルできませんでした。
no matching function for call to D::~B()
bcc32は怪しい部分が多いので信用していないのですが、g++でコンパイル
できない理由はやはり仮想でないデストラクタは継承されないからなのでしょうか?
0095デフォルトの名無しさん
2007/09/08(土) 09:50:44これを試せ。
class B {
public:
/* virtual */ ~B(){ cout << "B::~B()" << endl; }
};
class D : public B {
public:
~D(){ cout << "D::~D()" << endl; }
};
int main()
{
B *obj = new D;
delete B;
}
0096デフォルトの名無しさん
2007/09/08(土) 09:52:37おまえの頭の中よりは、ずっと規格(当時)を理解して、それに沿った挙動をしてくれるよ。
0097デフォルトの名無しさん
2007/09/08(土) 10:11:23レスありがとうございます。
そのコードの動作は分かってます。
virtualをコメントアウトした場合は、
静的バインド機構によって、delete obj; では B::~B()がコールされる
virtualを付けた場合は、
動的バインド機構によって、D::~D()がコールされ、続いてB::~B()がコールされる
知りたいのは、デストラクタを仮想にしなかった場合に派生クラスに継承
されているのかどうかということです。
ですから、あえて派生クラスのデストラクタから明示的に仮想でない
基底クラスのデストラクタをコールしてみたのです。オブジェクトをヒープ
にとるかどうかは問題にしていません。
0098デフォルトの名無しさん
2007/09/08(土) 10:13:19そうは思いませんけど。
constオブジェクトから非constメンバー関数が呼び出せてしまいますよ。
警告は出ますが。
0099デフォルトの名無しさん
2007/09/08(土) 10:26:340100デフォルトの名無しさん
2007/09/08(土) 10:27:11gccは配列の要素数が変数で指定できますよ?
0101デフォルトの名無しさん
2007/09/08(土) 10:28:00警告が出るなら、わかっていてそれに沿った挙動をしてるのでは。
(そのあとの「配慮」がお節介だな、とは感じるけれども)
というか、詰まるところ「規格と実装の違い」についての質問をしている人間が、
自分のほうが規格がわかってる自信を持つのっておかしいよ。
0102デフォルトの名無しさん
2007/09/08(土) 10:34:49B *obj1 = new D;
delete obj1;
B obj2;
上の二つデストラクタ呼び出しが違うよ。
0103デフォルトの名無しさん
2007/09/08(土) 10:37:09「規格と実装の違い」についての質問をしているのではありません。
標準C++準拠と謳っている書籍に書いてある内容、つま規格について
知りたいのです。それを検証するために、参考までに二つのコンパイラを
使ってみたということです。
規格上、仮想でないデストラクタが継承されるのかどうかを知りたいのです。
もし継承されるなら ~D(){ B::~B(); } のとおり派生クラスで明示的に仮想でない
基底クラスのデストラクタが呼べるはずと考えたわけです。
0104102
2007/09/08(土) 10:37:13B obj2;×
D obj2;○
0105デフォルトの名無しさん
2007/09/08(土) 10:37:44お前は何を言いたいのだ。配列の要素数に変数を指定できるのはC99の正当な仕様だ。
gccを使って仕様を云々するなら、-std=c++98をつけるくらいのことはしてから言え。
0106デフォルトの名無しさん
2007/09/08(土) 10:42:29そうなんですか?
基底クラスのデストラクタが仮想でない場合は、どちらもBのデストラクタだけが
呼ばれると思いますが。
delete obj1 はDクラスオブジェクトのB部分のみを解体する。
B obj2はクラスBオブジェクト自身が解体される。
0107デフォルトの名無しさん
2007/09/08(土) 10:47:48訂正後のコードならもちろん違います。
virtualなしの時、
B *obj1 = new D;
delete obj1;
D obj2;
D obj2;については当然クラスDのデストラクタがコールされ、その後
クラスDオブジェクトの基底部分が解体されるのでクラスBのデストラクタ
がコールされる。
ということだと思います。
Bのデストラクタもコールされるということは継承されているということですかね?
何かわからなくなってきました。
0108デフォルトの名無しさん
2007/09/08(土) 10:56:12>>101で言ってるのは、「規格について知りたい」状態の人間が
なんで規格の知識でコンパイラに負けてないなんて自負ができるのかってこと。
0109デフォルトの名無しさん
2007/09/08(土) 11:05:59D obj2;の時は静的に結合されたコードが生成されるため、
virtualのあるなしに関わらずB::~B()がコールされる。
virtualを付けるのは、ポインタにしてしまうと元のオブジェクトが
基底クラスをさすのか派生クラスをさすのかを区別できる情報を
付けるため。
0110デフォルトの名無しさん
2007/09/08(土) 11:16:55問題は、ポインタのとき、Dのデストラクタ呼び出しをするにはvirtualが必要ってことでは?
そうしないと、Dで確保したリソースが、開放できなかったりする。
0111デフォルトの名無しさん
2007/09/08(土) 11:20:370112デフォルトの名無しさん
2007/09/08(土) 11:21:31デストラクタを継承という概念で説明するのは正しくない気がするね。
規格では、コンスラクタの呼ばれる順番とデストラクタの呼ばれる順番は
逆になることを定めている。つまり、クラス B から派生した D を構築する
時は B → D の順でコンストラクタが呼ばれ、D を解体する時は D → B の
順でデストラクタが呼ばれる。
この挙動はデストラクタが仮想であるかどうかと無関係。デストラクタ
は普通のメソッドと違い、特別扱いされるということ。
一方、基底クラスのポインタを介して派生クラスのオブジェクトを削除する
場合、基底クラスに仮想デストラクタがないとその動作は不定であり、派生
クラスのデストラクタが呼ばれない可能性がある。これも規格で定められて
いる。
つまり、仮想デストラクタというのは、多態を利用するなら従わざるを得ない
ルールということ。派生クラスを多態として使わないのであれば、仮想
デストラクタを宣言しなくても良い。
12.2.2、12.4.2、15.4.3 あたりを参照。Effective C++ と RAII もね。
0113デフォルトの名無しさん
2007/09/08(土) 11:38:18なぜ規格を見ないのかわからない。
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
10.3の第4段落にこう書いてある
> デストラクタは継承されないが、
> 仮想であると宣言された基底クラスのデストラクタは、
> 派生クラスのデストラクタによって上書きされる(12.4及び12.5参照)。
あと、>>94がg++でコンパイルエラーになるのは~がビット否定演算子と解釈されるため。
(5.3.1 9段落や12.4 12段落 参考)
明示的なデストラクタ呼出は . または ->を介して行わないといけない。
this->B::~B()やthis->~B()とすれば、g++でもコンパイル・実行可能。
(bccと同じ挙動になる)
0114デフォルトの名無しさん
2007/09/08(土) 11:47:270115デフォルトの名無しさん
2007/09/08(土) 11:56:480116デフォルトの名無しさん
2007/09/08(土) 12:04:13そうは思いませんけど。
constオブジェクトから非constメンバー関数が呼び出せてしまいますよ。
警告は出ますが。
0117デフォルトの名無しさん
2007/09/08(土) 12:05:27そういうあからさまなバグは自ずからわかるだろ
0118デフォルトの名無しさん
2007/09/08(土) 12:15:42そりゃ(少なくとも今となっては)規格に
追いついていないコンパイラを使うのは反則だ。
もちろん例えばg++なんかでも高度にテンプレートを
使ったプログラムなら、その確立は99.9999%からがくっと下がる。
0119デフォルトの名無しさん
2007/09/08(土) 12:17:10Comeau C++とかか?
0120デフォルトの名無しさん
2007/09/08(土) 12:30:08ひょっとして問題なのは、「アクセス可能なこと」と「継承」の用語の問題?
JISX3014の10章では、
継承されたメンバはその名前が隠蔽されているか、あいまいな場合を除き、
派生クラスの他のメンバと同様に、式で参照することができる。
と書かれているけど、>>94の例とか見ても、スコープを指定しなければいけない
時点で、継承といえないということでは?
例えば、
class C1 {
public: void foo();
}
class C2 : public C1 {
public: void foo();
}
class C3 : public C2 {
public: void foo();
}
と定義した場合、C3 は C1::foo() にアクセスできるけど、C3 が C1::foo()を継承してるとは
普通に言わないよね。
ついでに言えば、コンパイラがオブジェクトを破棄するときの手順に基底クラスの
破棄が含まれていることと、基底クラスのデストラクタを継承することの間に
何からの関連を見出そうととしているあたりも混乱してる気がする。これも言葉の問題か。
0121デフォルトの名無しさん
2007/09/08(土) 13:12:47つまりコンパイラが規格を知っていることは
あまり期待できないということですね。
>>96さんの言ってることはやはりデマだったのですね。
0122デフォルトの名無しさん
2007/09/08(土) 14:14:33あんまりスレの流れ見てないが。
言語の規格は何度か改定されているのが1つ。
大体のコンパイラは「独自の拡張機能」を持っているのが1つ。
コンパイラが「どの規格」に「どのように」準拠してるのか、知るのが必要じゃない?
結局何が言いたいのかというと、C99、もうちょい流行れ。
0123デフォルトの名無しさん
2007/09/08(土) 14:18:28Boost対応ってテスト全部通す気なのだろうか
いやそうなってもらわないと困るのだが無理だと思う
0124デフォルトの名無しさん
2007/09/08(土) 14:23:27VCがC99対応するのはいつなんだろう。
0125デフォルトの名無しさん
2007/09/08(土) 14:30:030126デフォルトの名無しさん
2007/09/08(土) 15:12:51>>113
理解できました。確認不足で失礼しました。
AcceleratedC++で仮想デストラクタが継承されると言っているのは
他の仮想関数と同様に派生クラスのデストラクタも仮想性を持つ
ということで納得できました。
>あと、>>94がg++でコンパイルエラーになるのは~がビット否定演算子と解釈されるため。
そういうことなのですね。勉強になりました。
ありがとうございました。
>>120
読んでいた書籍で『仮想デストラクタは継承される』という記載
があったので混乱していました。
デストラクタは継承されないけれども基底クラスのデストラクタを
仮想にしておかないと、基底のポインタや参照が指している実際の
のオブジェクトが派生クラスのオブジェクトであった場合、
派生クラスのデストラクタが呼び出されなくなってしまうということ
で理解しました。
0127デフォルトの名無しさん
2007/09/08(土) 15:25:13例えば、
class C1 {
public: void foo();
}
class C2 : public C1 {
public: void foo();
}
class C3 : public C2 {
public: void foo();
}
と定義した場合、C3 は C1::foo() にアクセスできるけど、C3 が C1::foo()を継承してるとは
普通に言わないよね。
インターフェースを継承している、つまりC3はC1::foo()を継承していると思っている
のですが問題ですかね?(この場合は、もちろん名前は隠蔽されてしまいますが)
0129デフォルトの名無しさん
2007/09/08(土) 15:47:07すべてのメンバは継承してるって解釈じゃダメですか?
基底クラスの private メンバも継承している。でも自分でもどうにもできないのは、
言うなれば、自分の骨とか内臓を直接見ることができないのと同じ様な事かと思った。
0130127
2007/09/08(土) 15:47:07デストラクタが継承されないのにthis->~B()で呼び出せる
ということが結びつきません。。名前が隠蔽されてるわけでもないし、
あいまいでもないので、>>120さんが書かれているとおり
継承されたメンバに含まれる気がします。
0131127
2007/09/08(土) 15:50:31確かにprivateなメンバも継承されていて、それは派生クラスから
直接アクセスはできないだけで、派生オブジェクトの基底部分とし
ては存在していますからね。
0132デフォルトの名無しさん
2007/09/08(土) 19:15:08[piyo.h]
#include "Enemy.h"
class piyo{
...
public:
...
Hit( CEnemy *pEnemy ); // 当たり判定に敵クラスが欲しい
};
このpiyoクラスを拡張してEnemyクラスにも持たせたくなったんですが無理ですよね?
何かいい方法ありませんか?
0133デフォルトの名無しさん
2007/09/08(土) 19:23:32なんで無理だと思うのさ
0134デフォルトの名無しさん
2007/09/08(土) 19:26:030135デフォルトの名無しさん
2007/09/08(土) 19:49:47使い方による。
以下のようにお互いが相手の実体をメンバに持つことは不可能だが、
class piyo {
Enemy e;
};
class Enemy {
piyo p;
};
以下のように片方(または両方)がポインタのみの保持であれば問題ない。
class Eme,u;
class piyo {
Enemy* e;
};
class Enemy {
piyo p;
};
0136デフォルトの名無しさん
2007/09/08(土) 19:53:570137デフォルトの名無しさん
2007/09/08(土) 20:07:55ありがとうございます
0138デフォルトの名無しさん
2007/09/08(土) 22:41:13> 一方、基底クラスのポインタを介して派生クラスのオブジェクトを削除する
> 場合、基底クラスに仮想デストラクタがないとその動作は不定であり、派生
> クラスのデストラクタが呼ばれない可能性がある。これも規格で定められて
> いる。
未定義動作だよ。 5.3.5p3 ね。
0139デフォルトの名無しさん
2007/09/09(日) 01:04:440140デフォルトの名無しさん
2007/09/09(日) 01:08:550141デフォルトの名無しさん
2007/09/09(日) 01:14:260142デフォルトの名無しさん
2007/09/09(日) 01:16:48あとテキストも結局バイナリなので、判別するというのは無いかな。
この辺が、まぁ参考になるかと。
http://www.void.in/wiki/Universalchardet
0143デフォルトの名無しさん
2007/09/09(日) 02:18:14単純にどちらの効率がいいのでしょうか?
0144デフォルトの名無しさん
2007/09/09(日) 02:19:33これがわかれば(すんなり割り切れれば)、ニーズに合った実装が自力でできるかと
0145デフォルトの名無しさん
2007/09/09(日) 02:23:51実際にCStringW等の実装を覗いてみるといいと思う。逆汗とかで。
…煽りじゃなくて。実際にライブラリを覗くことが、こういった疑問への一般解を実感させるかと。
俺?必要に応じて、毎度見てるよ
0146デフォルトの名無しさん
2007/09/09(日) 02:29:23効率は実測が基本。
0147デフォルトの名無しさん
2007/09/09(日) 03:08:380148デフォルトの名無しさん
2007/09/09(日) 03:09:540149デフォルトの名無しさん
2007/09/09(日) 03:13:47>>148は使えないSE
0150デフォルトの名無しさん
2007/09/09(日) 08:13:00特に低学歴に多い
プログラムは書けるがそれを活かす分野の知識がまるで無い
大学1年並の一般教育の知識すらない専門卒は最悪だった
0151デフォルトの名無しさん
2007/09/09(日) 08:22:210152デフォルトの名無しさん
2007/09/09(日) 09:09:48プログラムを活かす分野の専門知識に欠けていた訳だな
中卒の俺は。
参考になったありがとう!
0153デフォルトの名無しさん
2007/09/09(日) 09:33:03CStringT<>はヘッダに実装されているぞ。
逆汗するまでもない。
0154デフォルトの名無しさん
2007/09/09(日) 10:21:02class 貞操帯 {
friend ご主人様;
void Unlock();
public:
void Lock();
void 浣腸(液体& 浣腸液);
};
0155デフォルトの名無しさん
2007/09/09(日) 10:22:360156デフォルトの名無しさん
2007/09/09(日) 13:21:12↑のようの文字列からダブルクォーテーションを一撃で消し去ってくれるような
素敵な関数は存在しますか?
0157デフォルトの名無しさん
2007/09/09(日) 13:26:360158デフォルトの名無しさん
2007/09/09(日) 13:42:20C++だとstringクラスのreplaceとかで。
0159デフォルトの名無しさん
2007/09/09(日) 13:47:19int length;
.......
str++;
length -= 2;
ぷ
0160デフォルトの名無しさん
2007/09/09(日) 13:50:280161デフォルトの名無しさん
2007/09/09(日) 14:01:31char* pos = str;
if (*pos != '\"') return;
do {
if (*(pos+1) == '\"') {
*pos = '\0';
break;
}
*pos = *(pos+1);
pos++;
} while(*pos != '\0');
0162デフォルトの名無しさん
2007/09/09(日) 15:03:38自分も前から気になってるんだが、ちゃんとみれてない
まあ、shlwapiすら重くて糞だという応用ならしょうがないが
0163デフォルトの名無しさん
2007/09/09(日) 15:04:430164デフォルトの名無しさん
2007/09/09(日) 15:57:330165デフォルトの名無しさん
2007/09/09(日) 17:04:32strncpyでよくね?
0166デフォルトの名無しさん
2007/09/09(日) 17:13:23#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string path("¥"d:¥¥temp¥¥file.txt¥"");
std::string result;
std::cerr << path << std::endl;
std::remove_copy(path.begin(), path.end(), std::back_inserter(result), '"');
std::cerr << result << std::endl;
}
0167デフォルトの名無しさん
2007/09/09(日) 17:25:25boost::trim_if(hoge, boost::is_any_of("\"")); // hoge -> d:\temp\file.txt
0168デフォルトの名無しさん
2007/09/09(日) 18:02:20PathUnquoteSpacesA(str);
0169デフォルトの名無しさん
2007/09/09(日) 20:10:28vector<hoge*> m_vecHoge;
とかでもってるメンバを
vector<hoge*>::iterator itr = m_vecHoge.begin();
while( itr != m_vecHoge.end() )
{
itr->hogefunc();
++itr;
}
のように使おうとしたら
オーバーロードされた 'operator ->' の戻り値の型 'hoge **' が無効です。
と怒られました。
よく分からないので
*itr->hogefunc();
とか
itr++;
とか変えてみてもダメでした。
iteratorを使わずに[]でアクセスすればコンパイルできるんですが、なぜでしょうか?
他の場所では同じ方法でiteratorを使えてるんですが(要素は別のクラスですが)、
ここだけなぜかつかえないです。
何が原因でしょうか?
0170デフォルトの名無しさん
2007/09/09(日) 20:13:15(*itr)->hogefunc();
これじゃだめ?
0171デフォルトの名無しさん
2007/09/09(日) 20:15:27いけました!
他の場所も良くみたら->を使うときはカッコで囲ってました。
ありがとうございました。
0172169
2007/09/09(日) 20:52:42for(; itr != m_listHoge.end(); itr++)
{
if((*itr)->GetLife() < 0.0f)
{
delete *itr;
*itr = NULL;
m_listHoge.erase(itr);
}
}
連続ですいません。今度はlistなんですが、
上のような感じで、listの要素が持ってるLifeがゼロになったら、listからその要素を消したいです。
が、実行画面上で消えた瞬間、
list iterator not incrementable
とかいうstlのエラーがでて強制終了します。
なんでですか?
ちなみに、このlistを使ってるのはここ一箇所なので、エラーは間違いなくここで起きていると思います。
また、listに入ってる要素は一個です。
0173デフォルトの名無しさん
2007/09/09(日) 20:55:10イテレータで回している間に、要素数の変化する操作は未定義じゃないかな?
0174デフォルトの名無しさん
2007/09/09(日) 21:00:36イテレータはコンテナごとに定められたルールに従って無効になることがある。
無効になったイテレータは ++ でのインクリメントも要素へのアクセスもできない。
list では erase() したイテレータは無効になる。 erase() の前に次のイテレータを
取っておくか、 erase() の戻り値を使うといい。
0175デフォルトの名無しさん
2007/09/09(日) 21:10:47ども。いけました。
0176デフォルトの名無しさん
2007/09/10(月) 00:29:15「やさしいC」と「新C言語入門ビギナー編」まではものにできたド初心者です。
基本情報の擬似言語対策でアルゴリズムの勉強しようと思ってるんですが、
お薦めの参考書はないでしょうか?
とりあえずヤフオクで「Cアルゴリズム全科」って分厚い本買ったんですが・・・・
もっとわかりやすいの・・・プリーズ・・・
0177デフォルトの名無しさん
2007/09/10(月) 01:25:08d:\"temp"\file.txtみたいなものはいいのか?
Windows XPなんかでは使えるんだこれが。98とかだとしらないけど。
0178デフォルトの名無しさん
2007/09/10(月) 01:45:36Vistaで試したが使えないぞ
0179デフォルトの名無しさん
2007/09/10(月) 02:11:00ごめん、試してみたらコマンドプロンプトだけっぽい。
0180デフォルトの名無しさん
2007/09/10(月) 08:13:00基本情報の過去問題集のがいい気がする
0181デフォルトの名無しさん
2007/09/10(月) 11:18:30正直基本情報の擬似言語はちゃんとCでプログラム書けるなら勉強しなくても
分かるぐらい簡単
0182デフォルトの名無しさん
2007/09/10(月) 18:09:44>>181
レスサンクス。
ですよね。ソース打てない人が理解する為に擬似言語があるんですよね・・・
とりあえず過去問をCで打ち変えるとこからやってみようと思います。
でわ
0183デフォルトの名無しさん
2007/09/10(月) 19:23:02std::string s = "hoge";
c_api_func(s.c_str()); // error: c_api_func(char *);
これらのAPIは文字列のコピーを作成して使うので、ポインタの指す文字列が変わらないことはないだろう、
と分かっていても、const_castするのは勇気がいると思います。
ここで、プロの人はどうしますか?
std::string s = "hoge";
std::vector<char> v(s.begin(), s.end());
c_api_func(&v[0]);
はどうでしょうか。
0184デフォルトの名無しさん
2007/09/10(月) 19:36:29s.c_strはヌル終端文字列で、vector vはヌルを最後に持ってない気がする
けど、この違いは大丈夫?
c_api_func()がどういう処理をするかによるけど
0185デフォルトの名無しさん
2007/09/10(月) 19:43:230186185
2007/09/10(月) 19:53:480187デフォルトの名無しさん
2007/09/10(月) 19:56:000188デフォルトの名無しさん
2007/09/10(月) 20:00:13おれさあ何とかcastとか色々あるけど、よくわかんねえ
てか使う機会に出会ったことねえ
申し訳なさげにstatic_castは使ったことある
0189デフォルトの名無しさん
2007/09/10(月) 20:34:29http://www.s34.co.jp/cpptechdoc/article/newcast/
何とか_cast構文は従来のキャストを全て置き換え可能。
(例外がないわけではないが困らない)
0190デフォルトの名無しさん
2007/09/10(月) 20:39:34正直不安に思ってたりして、笑えねえよ
_bstr_tあたりにちょっと持たせるとか、
allocaするとかしないといけないかなあとか思ってみたり
使い捨てのものだから、まあ大体は結局ほったらかしてるけど…。
0191デフォルトの名無しさん
2007/09/10(月) 20:57:180192デフォルトの名無しさん
2007/09/10(月) 21:13:22#define turu true
#define faruse false
#define wtyaa wchar_t
#define kurasu class
#define storuct struct
#define yunion union
#define dexisu this
#define pabrick public
#define purotekuteddo protected
#define puribate private
#define ekusuprist explicit
#define hurend friend
#define baatyuaru virtual
#define opereetaa operator
#define konsuto const
#define inrine inline
#define sutatikku static
#define ekusuteen extern
#define nyuu new
#define deriito delete
#define torai try
#define kyatti catch
#define suroo throw
0193デフォルトの名無しさん
2007/09/10(月) 21:14:390194デフォルトの名無しさん
2007/09/10(月) 21:16:39なんじゃこりゃw
0195デフォルトの名無しさん
2007/09/10(月) 21:19:400196デフォルトの名無しさん
2007/09/10(月) 21:23:08まさか、これ程とは…
大した奴だ
0197デフォルトの名無しさん
2007/09/10(月) 21:23:510198デフォルトの名無しさん
2007/09/10(月) 21:31:36これ萌えていい?w
0199デフォルトの名無しさん
2007/09/10(月) 21:35:46微妙だなw
0200デフォルトの名無しさん
2007/09/10(月) 21:40:20余計覚えられねえよ!
0201デフォルトの名無しさん
2007/09/10(月) 21:46:15ttp://pc11.2ch.net/test/read.cgi/prog/1187102925/
0202デフォルトの名無しさん
2007/09/10(月) 21:48:380203デフォルトの名無しさん
2007/09/10(月) 21:50:100204デフォルトの名無しさん
2007/09/10(月) 21:50:500205デフォルトの名無しさん
2007/09/10(月) 21:51:130206デフォルトの名無しさん
2007/09/10(月) 21:52:31#define ture true
これは外せん
0207デフォルトの名無しさん
2007/09/10(月) 21:53:54#define unsgined unsigned
#define retrun return
0208デフォルトの名無しさん
2007/09/10(月) 21:58:550209デフォルトの名無しさん
2007/09/10(月) 22:23:43#define retrun return
#define signed singed
#define unsigned unsinged
こいつは要らんな。
#define トントカイモ system
#define スイカナスミ return
0210デフォルトの名無しさん
2007/09/10(月) 22:28:34やっぱり同じ内容でも別々に書かないといけないものなんですか?
まったく同じ引数(自クラスのconst参照)を取って、代入する内容も同じなのに、
同じメンバ代入や複製のコードをそれぞれに書くのがどうも解せないんですけど。
なにか一つにまとめる方法とかがあれば教えていただきたいです。
0211デフォルトの名無しさん
2007/09/10(月) 22:33:49class MyString {
private: char *ptr;
public:
MyString(const MyString& s) {
ptr = new char[strlen(s.ptr) + 1];
strcpy(ptr, s.ptr);
}
MyString &opetator=(const MyString& s) {
delete[] ptr;
ptr = new char[strlen(s.ptr) + 1];
strcpy(ptr, s.ptr);
}
};
0212デフォルトの名無しさん
2007/09/10(月) 22:36:02MyString(const MyString& s) {
*this = s;
}
この例だとゴミポインタを delete[] してふっとぶけど。
0213デフォルトの名無しさん
2007/09/10(月) 22:48:16if (ptr) delete[] ptr;
ptr = new char[strlen(s.ptr) + 1];
strcpy(ptr, s.ptr);
}
};
これで解決
0214デフォルトの名無しさん
2007/09/10(月) 22:50:45って聞いたんだが、やめとけって答えられた覚えがある。
#include <new>
class Hoge
{
public:
Hoge();
Hoge(const Hoge&);
Hoge& operator =(const Hoge& y);
{
if (this != &y)
{
this->~Hoge();
::new(this) Hoge(y);
}
return *this;
}
};
0215デフォルトの名無しさん
2007/09/10(月) 23:02:06>if (ptr) delete[] ptr;
ptr がゴミ値のときにふっとぶのは一緒
だいたい NULL 判定しなくても delete[] NULL; は許容されている
0216デフォルトの名無しさん
2007/09/10(月) 23:06:06ご意見ありがとうございます。
コピーコンストラクタの中で
*this = s;
ってやる方法、自分も同じこと考えました。
この方法でコピーコンストラクタとoperator=を一緒にしてしまっても、
基本的には問題無いですよね?
0217デフォルトの名無しさん
2007/09/10(月) 23:20:49>基本的には問題無いですよね?
だから、一般的には問題あるってんの。
問題ない場合は、 *this = another; していいけど、
そんなものはケースバイケース。
0218デフォルトの名無しさん
2007/09/10(月) 23:24:10メンバーがクラス型の時も大丈夫か?
メンバーが先に生成されるからコンストラクタもメンバーから呼ばれると思う。
メンバーのコンストラクタに引数渡したい場合とかに無理がないかな?
0219デフォルトの名無しさん
2007/09/10(月) 23:24:42おまえC++ディスってんの?
0220デフォルトの名無しさん
2007/09/11(火) 00:02:450221デフォルトの名無しさん
2007/09/11(火) 00:21:53せめてこう
{
std::string tmp(s);
c_api_func( const_cast<char*>( tmp.c_str() ) );
}
0222デフォルトの名無しさん
2007/09/11(火) 00:35:46実際には書き換えないことがわかっているという場合だろ。
そこまでする必要は無いと思う。
0223デフォルトの名無しさん
2007/09/11(火) 00:40:24とりあえず、↑はまずいと言いたかった。
0224デフォルトの名無しさん
2007/09/11(火) 03:43:330225デフォルトの名無しさん
2007/09/11(火) 09:10:51テンポラリ用意しても、c_str()で返されるconstな領域に書き込まれたらダメだよ。
そこまでするんだったら
std::vector<char> tmp(s.begin(), s.end());
tmp.push_back('\0');
c_api_func( &tmp[0] );
とした方がいい。
0226デフォルトの名無しさん
2007/09/11(火) 10:43:52std::vector<char> tmp( BEGIN_TO_END(s) );
0227えいいち ◆GRGSIBERIA
2007/09/11(火) 17:09:38int main(){
int a[5], b[5], c[5], i;
int *p;
p = c;
for(i = 0;i < 15;i++){ //初期化
*p = 0;
cout << *p << endl;
p++;
}
for(i = 0;i < 5;i++){ //確認
cout << a[i] << "," << b[i] << "," << c[i] << endl;
}
return 0;
}
0228デフォルトの名無しさん
2007/09/11(火) 17:11:120229えいいち ◆GRGSIBERIA
2007/09/11(火) 17:14:56コンパイラによってはa,b,cの順、つまり宣言の前から順に変数がメモリに割り当てられますか?
あと、別の場所で宣言した変数がa,b,cのいずれかの間に割り当てられることもありますか?
0230デフォルトの名無しさん
2007/09/11(火) 17:27:560231デフォルトの名無しさん
2007/09/11(火) 17:30:14連続である保証はない。
0232デフォルトの名無しさん
2007/09/11(火) 17:36:25コンパイラの内部仕様なので、並び順に依存したコードの動作は保証されない。
例えば、VCの場合、/O1オプションを付けると、領域を最小化するため、
変数の要素サイズの順に並べ替えが行われたりするが、/O1を付けない場合には
また別の順番になる。いずれも、宣言順がそのまま反映されることはない。
0234デフォルトの名無しさん
2007/09/11(火) 18:40:07一時オブジェクトの解放のタイミングについて教えてください。
CString s1 = "C:\\hoge\\";
HANDLE hFile = CreateFile(s1 + "fuga.txt", …);
これって、>>223でダメ出しされてるのと同じようなコードだと思うけど(実引数でCString
の一時オブジェクトを作成し、一時オブジェクト内で管理する領域のアドレス
を関数に渡す)、やはり仕様的に問題があるのでしょうか?
JISX3014 12.2
一時オブジェクトの解体は、それを生成した地点を(字句的に)含む完結式の評価の
最終段階で行う。
1.9
他の式の部分式となっていない式を完結式と呼ぶ。
実引数の評価は、その関数本体の式又は文の実行に先行する。
調べて、上の記述までは見つけたけど、以下の3点の疑問が残り、よく理解できていません。
- 完結式の定義について。実引数の場合はカンマで区切られた一つ一つの事を指すのか?
それとも、カンマで区切られた一つ一つは部分式で、完結式は関数呼び出し全体を指すのか?
- 実引数の評価直後(関数を呼び出す前)に一時オブジェクトは解体される可能性があるのか?
それとも、完結式が関数呼出し全体なら、破棄は関数呼び出し完了まで待ってもらえるのか?
- VC2005では実引数内で上記のような一時オブジェクトを使う演算を行った場合、
デストラクタは関数の呼び出し後に動作しますが、これはたまたまなのか? 想定される動作なのか?
この疑問について、教えていただけないでしょうか。
0235デフォルトの名無しさん
2007/09/11(火) 19:22:56s1 + "fuga.txt"の一時オブジェクトは
HANDLE hFile = CreateFile(s1 + "fuga.txt", …); のあとに消滅する
hFileがその一時オブジェクトに依存しているとクラッシュする
がそんなことは実際起こらない。CreateFileは一時オブジェクトを
コピーして使うから。そしてそれはドキュメントされてない
だからOS依存のAPIは出来る限り使うべきではない。
たとえばPathFindFileNameはコピーしないので本当にクラッシュする
0236デフォルトの名無しさん
2007/09/11(火) 20:48:39完結式はその場合、初期化子全体なので、そこではその関数呼出式全体。
なので残りの2つの問いも、それぞれ問題ないということになる。
>>235
本当は、constなポインタの引数なのに
指す先を書き換えるほうがいけないんだよな。
0237デフォルトの名無しさん
2007/09/11(火) 20:52:160238234
2007/09/11(火) 21:24:40ありがとうございます。
さすがに後続行までの保証は考えていません。
1行分が完結するまでの間有効ならば十分です。
>>236
ありがとうございます。
完結式の示す範囲が関数全体と聞いて安心しました。
とすると、>>223 も動作的には>>221とほぼ等価で問題ないって事ですよね。
指摘がスタイルとかの問題ならば別ですが。
0239デフォルトの名無しさん
2007/09/12(水) 12:43:50{
if( m_listHoge.empty()) return;
list<Hoge*>::iterator itr = m_listHoge.begin();
while(itr != m_listHoge.end())
{
(*itr)->Update(elapsed);
if((*itr)->IsExpired() == true)
{
delete *itr;
*itr = NULL;
itr = m_listHoge.erase(itr);//消すときは次のiteratorを取って置く
}
if(m_listHoge.empty())break;
++itr;
}
}
なんかstlのlist使ったら
list iterator not inclementableとかいうエラーがでます。
以前同じような質問をしたときに
listのiteratorはeraseした後無効になるから、戻り値をとっておけといわれて
これで直ったような気がしてたんですが、やっぱエラーがでました。
listを消したりインクリメントしたりする操作はこの関数内でしか行ってません。
iteratorの使い方とか間違ってるでしょうか?
0240デフォルトの名無しさん
2007/09/12(水) 13:04:32> if(m_listHoge.empty())break;
を
if (itr == m_listHoge.end()) break;
じゃない?
eraseの戻り値がend()でも、リストが空とは限らないでしょ。
0241240
2007/09/12(水) 13:08:01むしろこうするべきか。
if ((*itr)->IsExpired()) {
...
itr = m_listHoge.erase(itr);
} else {
++itr;
}
そうしないと、eraseしたときにiteratorが進みすぎてしまう。
0242デフォルトの名無しさん
2007/09/12(水) 13:19:03elaseして戻り値貰った時点で
そのitrはすでに次に進んでるわけですね。
それがendだったときに
さらに++itrしてたからエラーが出ていた、と。
なるほどありがとうございました。
0243デフォルトの名無しさん
2007/09/12(水) 13:24:42と、>241は指摘していると思う。
0244デフォルトの名無しさん
2007/09/12(水) 17:43:00なぜに?
0245デフォルトの名無しさん
2007/09/12(水) 17:49:241はtrueだがtrueは1だけではないから
0246デフォルトの名無しさん
2007/09/12(水) 17:55:50{
if (m_listHoge.empty()) return;
typedef list<Hoge*>::iterator Iter;
for (Iter i = m_listHoge.begin(), end = m_listHoge.end(); i != end; ) {
(*i)->Update(elapsed);
if ((*i)->IsExpired()) {
delete *i;
i = m_listHoge.erase(i);
}
else {
++i;
}
}
}
0247デフォルトの名無しさん
2007/09/12(水) 18:17:53どういうことですか?よくわかりませぬ・・・
コンパイラによって違うとか?
>>246
delete *i;
*i = NULL; ←これって必要ないんですか?
よくSAFE_RELEASEマクロとかでこんな風になってるのがあったような気がして。
0248デフォルトの名無しさん
2007/09/12(水) 18:26:24(*i)はdelete後にeraseによって消えるのでわざわざそんなことする必要は無い
0249デフォルトの名無しさん
2007/09/12(水) 18:27:03int main()
{
for(int i=-2; i<3; i++) printf("%2d %s\n", i, (i==true ? "true" : i==false ? "false" : "???"));
putchar('\n');
for(int i=-2; i<3; i++) printf("%2d %s\n", i, (i ? "true" : !i ? "false" : "???"));
return 0;
}
//実行結果
-2 ???
-1 ???
0 false
1 true
2 ???
-2 true
-1 true
0 false
1 true
2 true
0250デフォルトの名無しさん
2007/09/12(水) 18:27:18trueとの比較について
・boolを返すプロトタイプを持つ関数が、true(実体は1)の代わりに2を返すかもしれない
・一般的なCPUでは0との比較のほうがコストが低いかもしれない
・C/C++ではif文の意味は、()の中が「0でなかったら」なので== trueと書くべき理由が無く、読み取りにくくなるだけ
deleteしたポインタへの代入について
・そのポインタを再利用するなら意味はあるが、直後に更新するのだから意味が無い
・マクロで更新しておくのはまぁ勝手だが、あまり意味がないことには変わりが無い
0251デフォルトの名無しさん
2007/09/12(水) 18:38:27> true(実体は1)の代わりに2を返すかもしれない
たとえそれでもtrueとの比較は真でなければおかしい。
プロトタイプ宣言はboolのくせに、
戻り値intという定義だというのでもない限り。
> 一般的なCPUでは0との比較のほうがコストが低いかもしれない
そんなこと、最適化でどうにでもなる。
> == trueと書くべき理由が無く、読み取りにくくなるだけ
これは同意。== trueと書くやつの気が知れない。
少し違う例だけど。
http://www.kouno.jp/home/c_faq/c9.html#2
> もし君が「if((a == b) == TRUE)」が「if(a == b)」の改良版であると信じるのなら、
> なぜそこで止めるのか。なぜ「if (((a == b) == TRUE) == TRUE)」を使わないのか
0252デフォルトの名無しさん
2007/09/12(水) 18:40:35>プロトタイプ宣言はboolのくせに、戻り値intという定義
市販ライブラリではホントにこんなのがあるんだ。流石に2は戻ってこないが。
0253デフォルトの名無しさん
2007/09/12(水) 18:48:47そういうのとの統一感が取れてるって意味で視認性はむしろいいと思うんだけど。
0254デフォルトの名無しさん
2007/09/12(水) 18:53:36if(i)では中身が何型を想定してるのか分かりにくい。
0255デフォルトの名無しさん
2007/09/12(水) 18:53:40#define NOT(exp) (!(exp))
if (predicate())
if (NOT(predicate()))
0256デフォルトの名無しさん
2007/09/12(水) 18:57:050257デフォルトの名無しさん
2007/09/12(水) 18:57:57名前の付け方しだいによるでしょう。
if (something->isExpired() == true) は、いかにも冗長。
bool値を返すことが名前だけから判断できないような関数なら
if (p->doSomething() == true) もありかも。
自分で命名する関数が論理値を返すなら、そんな命名はしないけど、
システムコールやライブラリの名前が、一見して論理値を返すように見えなければ
true や false と比較するコードを書いてもいいんじゃないかな。
0258257
2007/09/12(水) 18:59:530259デフォルトの名無しさん
2007/09/12(水) 19:02:490260デフォルトの名無しさん
2007/09/12(水) 19:04:22これは「aがTRUE(の実体)とFALSE(の実体)のどちらとも等しくない」ことを防止するためにやってるのでしょうか?
0261デフォルトの名無しさん
2007/09/12(水) 19:05:31http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getmessage.asp
BOOL GetMessage(
LPMSG lpMsg, // メッセージ情報
HWND hWnd, // ウィンドウのハンドル
UINT wMsgFilterMin, // 最初のメッセージ
UINT wMsgFilterMax // 最後のメッセージ
);
> GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。
> したがって、次のようなコードは避けてください。
> while (GetMessage(lpMsg, hWnd, 0, 0)) ...
0262デフォルトの名無しさん
2007/09/12(水) 19:06:13aが0なら0(false)
aが0以外なら1(true)
0263デフォルトの名無しさん
2007/09/12(水) 19:16:13if (obj->isAlive() == true) {}
前者の解釈は「もしaが10なら」
後者の場合は「もし『objが生存しているなら』が真実なら」
となって後者の方は少し長冗。
0265デフォルトの名無しさん
2007/09/12(水) 19:35:17(aは整数型、is_newlineはbool型)
1,原則として条件式にはbool型を使う。
if(a) はたまに見かけるが、「もしaなら」というのは論理的には意味不明。
2,整数型の比較には ! を使わず、他の比較演算子を使う。
if(!a) よりも if(a==0) の方が圧倒的に分かりやすいし、1と同様に「もしaでないなら」というのは理論的には解釈不能。
3,bool型の最比較はしない。
if(is_newline==true) は少し無駄がある。if(is_newline)で十分。
4,bool型の反転には比較演算子ではなく、! を使う。
if(is_newline==false) よりも if(!is_newline)。後者の方が「改行ではない」ことが分かりやすい(と思う)。
bool型は単独でも論理学的な論理の意味をなすが、
整数型は単なる整数であり、そういった性質を持たないという点が両者の最大の違い。
この指針が絶対だとは思わないので、まあ一つの参考として見たって下さい。
0266デフォルトの名無しさん
2007/09/12(水) 19:48:110267デフォルトの名無しさん
2007/09/12(水) 20:10:210268デフォルトの名無しさん
2007/09/12(水) 20:15:38> if(a) はたまに見かけるが、「もしaなら」というのは論理的には意味不明。
値がゼロかどうかで判断したいんでしょう。
0269デフォルトの名無しさん
2007/09/12(水) 20:17:40菊池 真の判定ではなく偽の判定をするなら==を使うだろ
0270デフォルトの名無しさん
2007/09/12(水) 21:02:310271デフォルトの名無しさん
2007/09/12(水) 21:18:230272デフォルトの名無しさん
2007/09/12(水) 21:20:23メンバ関数宣言、定義って普通別々のファイルにするのですか?
たとえば、.hファイルには関数宣言だけして、定義は.cppファイルにする。
それとも、.hファイルにメンバ関数宣言、定義(クラス外に)をする
0273デフォルトの名無しさん
2007/09/12(水) 21:46:18OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = wnd;
...; // 構造体メンバのポインタでNULLでかまわないところは設定しない
GetOpenFileName(&ofn);
よく考えたら、このプログラムは「ヌルポインタのビット表現は0」であることを前提にしてるので、やばいのではないかと思った。
やはり
ofn.lpstrFilter = 0; // ヌルポインタにしていく
ofn.lpstrCustomFilter = 0;
というように、全て設定しないといけないよね?
ところで、初期化するときに、
OPENFILENAME ofn = {0};
とした場合はどうなるのだろう。ZeroMemory/memset(..., 0, ...)と同じなのか、全てのメンバに対して = 0 を設定しているように動くのか。
0274デフォルトの名無しさん
2007/09/12(水) 21:50:47メンバに代入とかprivateメンバの値を返すだけとかは当然.hに書く。
クラスで使う他のヘッダをクラスのヘッダで#includeしてクラスの.cppではクラスの.hだけを#includeする。
基本的に.cppを書くようなクラスなら、そこに関数定義を書く
0275デフォルトの名無しさん
2007/09/12(水) 22:20:14Win32ベッタリなコードでヌルポインタのビット表現など気にしても
仕方が無い気がするが……
= { 0 };
でもいいし、どっちでも好きに汁
0276デフォルトの名無しさん
2007/09/12(水) 22:49:45それを「順位」順で並べ替えたいんですが、できる方法ってありますか?
0277デフォルトの名無しさん
2007/09/12(水) 22:52:450278デフォルトの名無しさん
2007/09/12(水) 22:53:281.関数で配列全体を呼び出しもとに帰すにはどう記述すればよいのでしょうか?
例)a[0],a[1],a[2],a[3]といった、算出した値を配列要素としてではなく、配列全体をreturn文で返す
方法がわからずにおります。
2. 1+X+X^15で生成する疑似ランダムデータの作製法がわからずにおります。
どうかご教示願います。
0279デフォルトの名無しさん
2007/09/12(水) 22:55:17書き方の例を教えてください
0280デフォルトの名無しさん
2007/09/12(水) 22:59:23C/C++ではそもそも配列全体を値渡しすることができないので、参照渡しかポインタの値渡しになる。
従って、戻す方法を考える必要がない。と言うか、戻す方法はない。
0281デフォルトの名無しさん
2007/09/12(水) 23:04:26先月から始めたプログラミング初心者なので、もうしわけありませんが、具体的な記述例を教えて頂けないでしょうか?
参照渡しとは何でしょうか?
main()
関数呼び出し
関数本体
[配列要素に値を代入して、代入した配列全てを呼び出しもとに返す]
0282デフォルトの名無しさん
2007/09/12(水) 23:04:271. についてはC++ならvectorで返すのが良いと思う
2. については
int myrand(void){
static int x;
x=1+x+pow(x,15); // or x=1+x+x^15; ???
return x;
}
0283デフォルトの名無しさん
2007/09/12(水) 23:06:32void hoge(int *piyo)
こんな感じに(配列の)ポインタを渡して、書き込む
0284276
2007/09/12(水) 23:06:52失礼しました。
0285デフォルトの名無しさん
2007/09/12(水) 23:19:322.についてはハードウエアではシフトレジスタで合成可能(Verilog)なんですけど、
おしえていただいたものも、シフトレジスタ相当なものでしょうか?
初心者から見ると数式に見えるんですけど。回路は以下のとおりです。
|〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜EXOR|
| |〜〜|
→X→X→X→X→X→X→X→X→X→X→X→X→X→X→X|→
0286デフォルトの名無しさん
2007/09/12(水) 23:19:55そんなものを#defineせずとも、こう書ける。
if (not predicate())
Cなら<iso646.h>をインクルード、
C++なら何もインクルードすることなく(notはキーワードだから)可能。
0287デフォルトの名無しさん
2007/09/12(水) 23:23:21この記述は関数呼出し元に書くのでしょうか?それとも関数本体に書くのでしょうか?
すみませんが、具体的に書いて頂けないでしょうか?1ヶ月もしない初心者なもので、
わからずにおります。
0288デフォルトの名無しさん
2007/09/12(水) 23:26:13| |〜〜|
→X→X→X→X→X→X→X→X→X→X→X→X→X→X→X|→
0289デフォルトの名無しさん
2007/09/12(水) 23:28:24うまく書けなくてすみません。一番右側のXの出力と右から2番目のXのEXORをとり、
それを一番左側のXの入力とするものです。
0290デフォルトの名無しさん
2007/09/12(水) 23:32:48もし、SystemC なら malloc の類は使えないと思ってください
ついでにいうなら文法が似ているだけで別の言語です
ハードウェア板に行ったほうが良いと思います
0291デフォルトの名無しさん
2007/09/12(水) 23:33:322は間違ってる
0292デフォルトの名無しさん
2007/09/12(水) 23:39:10配列を構造体に閉じ込めれば、その構造体ごと返すことは可能。(制限はある)
ただし、そのために構造体を作りたくないという場合、他の人の言うようにポインタでやりとりする。
0293デフォルトの名無しさん
2007/09/12(水) 23:40:17bool a = true;
if(not a) ;
って使ってみたらコンパイルエラーだったんですが…。(bcc)
未定義のシンボル not(関数 main() )
0294デフォルトの名無しさん
2007/09/12(水) 23:43:32int myrand(void)
{
int x[15];
// シフトレジスタ
for(int i=15-1;i>0;i--) x[i]=x[i-1];
x[0]=x[13]^x[14];
return x[0];
}
0295デフォルトの名無しさん
2007/09/12(水) 23:47:39こんな感じでしょうか
#include <stdio.h>
void hoge(int *piyo)
int main()
{
int *piyo2;
a=hoge(piyo2);
}
int hoge(int *piyo)
{
piyo=c+d;
return piyo;
}
0296290
2007/09/12(水) 23:51:11SystemC、SpecCについてのスレ 2
ttp://science6.2ch.net/test/read.cgi/denki/1104436852/
0297デフォルトの名無しさん
2007/09/12(水) 23:51:37それで未だそんなことを書いているようではどうしようもないな。
0298デフォルトの名無しさん
2007/09/12(水) 23:52:09ありがとうございます。
0299デフォルトの名無しさん
2007/09/13(木) 00:05:49先月からといっても5日間しか触れていませんが、与えられたことをこなさなければならず、困っております。
どうか正解を教えて頂きたいとねがいます。
0300294
2007/09/13(木) 00:08:35なんか >>294 は違う気がしてきた
仮に x= 0001101110110001 <- 2進数表現
が与えられた時、これだけで次の x の値は決定される?
もし決定されるとしたら x の値はどうなる?
0301デフォルトの名無しさん
2007/09/13(木) 00:12:07int reg[16];
Random() {
// オールzeroだとまずいので適当に初期化
// reg[i] は 0 or 1 です
for (int i=0; i<16; ++i) {
reg[i] = i % 2;
}
}
int rand() {
// EXOR
int bit = reg[0] ^ reg[1];
// reg[14:0] <= reg[15:1]
for (int i=0; i<=14; ++i) {
reg[i] = reg[i+1];
}
// reg[15] <= reg[0] ^ reg[1]
reg[15] = bit;
return bit;
}
};
0302デフォルトの名無しさん
2007/09/13(木) 00:16:08決まります。
1000110111011000=X
とすると、次のXは0になります。XとX[1]のEXORをとって一番左側のX[15]に代入して全体を1ビット
左にシフトして、次の出力を得ます。
0303294
2007/09/13(木) 00:25:51ってことは
>>301 の通りってことか
(>>301 ESPレベル高いよ。すごいよ。)
> 全体を1ビット左にシフトして
全体を1ビット 右 にシフトして の間違い?
0304デフォルトの名無しさん
2007/09/13(木) 00:29:32この程度しか思い浮かびません。手元に教科書も無く、感で書きました。申し訳ございませんが、
間違いを指摘して頂きたいと願います。お手数お掛けしますが、どうかよろしくお願いいたします。
#include <stdio.h>
void hoge(int *piyo)
int main()
{
int *piyo2,x;
piyo2=&x;
a=hoge(piyo2);
}
int hoge(int *piyo)
{
piyo=c+d;
return piyo;
}
0305デフォルトの名無しさん
2007/09/13(木) 00:30:46右にシフトしての間違いでした。
0306294
2007/09/13(木) 00:33:38int myrand(void){
static unsigned short x=0x8DD8;
int bit;
bit=(x&1)^((x>>1)&1); // x[0]^x[1]
x=(bit<<15)|(x>>1);
return bit;
}
0307デフォルトの名無しさん
2007/09/13(木) 00:36:34{
int piyopiyo[] = { 5, 6, 7, 8 }
piyo = piyopiyo;
}
int main()
{
int piyo[] = { 0, 0, 0, 0 };
GetArray( piyo );
return 0;
}
0308デフォルトの名無しさん
2007/09/13(木) 00:48:28それ無意味だろ
0309294
2007/09/13(木) 00:58:15RTL では piyo[15:0] として
piyo = 16'b0010101000111011
みたいに代入できたような気がするから
下みたいにすればいける*かも*しれない
void hoge(int *piyo) // piyo[15:0]
{
*piyo=0x1234;
}
もうスレ違いとしか言えないや…
0311デフォルトの名無しさん
2007/09/13(木) 01:05:50ありがとうございます。307は正解だと思ってよろしいのでしょうか?
0312デフォルトの名無しさん
2007/09/13(木) 01:07:18間違いが多すぎて突っ込むのも面倒なくらいだけど、
まず何より、配列に要素を入れて返したいという話なのに、どこにも配列が存在しないのはなぜ?
勘で書いたというが、何も考えていないのではないか?
0313デフォルトの名無しさん
2007/09/13(木) 01:09:04>>307だけど、指摘の通りこれじゃ配列piyopiyoの値は取得できない
0314デフォルトの名無しさん
2007/09/13(木) 01:09:38IDの出ない板なのだから、せめて名前欄に何か書いたら?
それと307は不正解。
0315デフォルトの名無しさん
2007/09/13(木) 01:14:46これは推測だけど
おそらくはC/C++に似ている言語についての質問だから
配列といっているのはビットアレイ(すなわち整数型)って意味で、
結局 >>309 みたいなのでいいんじゃないかな
もしくは
int add(int a, int b){return a+b;}
でもよさそうな気がする
0316デフォルトの名無しさん
2007/09/13(木) 01:21:04void foo(int *p, n)
{
//ここでpが指す配列(p[0]〜p[n-1])に値を設定する
}
int main(int argc, char *argv[])
{
int a[100];
foo(a, 100);
// 配列aには関数foo()で設定した内容が入っている
}
0317316
2007/09/13(木) 01:21:38○ void foo(int *p, int n)
0318hiro
2007/09/13(木) 01:45:48どうか間違いを指摘して頂きたいと願います。5日間しかCに触れていないので、
全く解らない状態です。教科書は学校に置いてあり、手元にありません。
#include <stdio.h>
void hoge(int *piyo)
int main()
{
int *piyo2,x;
int a[15];
piyo2=&x;
a=hoge(piyo2);
}
int hoge(int *piyo)
{ int i;
for(i=0;i<15;++i)
{
a[i]=a & B;
piyo=a[15];
return piyo;
}
0319デフォルトの名無しさん
2007/09/13(木) 01:47:420320デフォルトの名無しさん
2007/09/13(木) 02:03:17まずだな、間違いを指摘して欲しいというまえに
何がしたいか書きなさい。
あんたのソースは間違い以前に、読めない。
ソースから何がしたいかなんてわかるわけない。
素直に、「僕ちん、こういう処理をするプログラムが書きたいの」
ていえ。
0321デフォルトの名無しさん
2007/09/13(木) 02:07:49使用するプログラミング言語は何?
ごく普通のCでいいの?
回路設計に使うような表現をしているのが、とても気になるんだが…
0322hiro
2007/09/13(木) 02:25:29ターゲットは回路設計で、仕様言語はCです。
したいことは
「1+x+x^15のシフトレジスタで構成される疑似ランダムデータを出力する関数を設計したい。main()から関数に
シフトレジスタ初期値とシフトする回数を引数で渡す。関数側ではシフトレジスタに
初期値を設定し、上記生成多項式をシフトする回数分だけ回して出力値をメインに渡す。
出力値は1ビットでよろしい(配列要素全てではありませんでした。すみません)」
以上が行いたい処理です。
0323デフォルトの名無しさん
2007/09/13(木) 02:44:43どうすれば良いでしょうか。
C++を使用しています。
まったくの初心者なので、わかりやすく教えて頂けるとありがたいです。
おねがいします。
0324デフォルトの名無しさん
2007/09/13(木) 02:49:100325デフォルトの名無しさん
2007/09/13(木) 02:53:16using namespace std;
int main(int,char**)
{
cout << "<html><head><title>センタリング例</title></head><body><center>センタリング</center></body></html>" << endl;
return 0;
}
0327hiro
2007/09/13(木) 02:57:50このような説明で解りましたでしょうか?Cの初心者で、どう設計したら良いか
解らずにおります。どうか、ご教示頂きたいと願います。
0328デフォルトの名無しさん
2007/09/13(木) 03:00:39そうです
0329デフォルトの名無しさん
2007/09/13(木) 03:03:23適当にヘッダに載ってた構造体と関数使ったらできた。
#include <iostream>
#include <iomanip>
#include <string>
#include <conio.h>
void print_text_centering(const std::string &str)
{
text_info ti;
gettextinfo(&ti);
std::cout << std::setw(ti.screenwidth / 2 + str.size() / 2) << str << '\n';
}
int main(int argc, char* argv[])
{
print_text_centering("ほげ");
return 0;
}
0330デフォルトの名無しさん
2007/09/13(木) 03:08:23みなさんありがとうございます。
はい、コンソールです。
#include <stdio.h>
void main(void)
{
int cnt1 , cnt2 , n;
scanf("%d",&n);
for(cnt1=0;cnt1<n;cnt1++)
{
for(cnt2=1;cnt2<=n;cnt2++)
{
printf("*");
}
printf("\n");
}
}
例えは上のようなプログラム(正方形が表示されます)
の出力をセンタリングさせるにはどうすれば良いでしょうか?
全くの初心者ですみません…。
0331デフォルトの名無しさん
2007/09/13(木) 03:13:45×例えは
○例えば
0332デフォルトの名無しさん
2007/09/13(木) 03:23:59#include <stdio.h>
int func(int,size_t);
int main()
{
const int INIT = 1;
const size_t NUM = 10;
printf( "%d", func(INIT, NUM) & 0x01 );
}
int func(int init, size_t n)
{
int ret = init;
size_t i;
for (i = 0; i < n; ++i)
ret = ret^15 + ret + 1;
return ret;
}
よくわからんがこう?
A0 = INIT = 1でAn+1 = An^15 + An + 1のA15の値を返す関数func
mainではその戻り値の下1bitを標準出力に表示
0333hiro
2007/09/13(木) 03:46:12流れとしてはそうです。せっかく作成して頂いた物ですが、関数本体の疑似ランダム生成回路が
>>301
さんのほうが近いように感じられます。ビットシフトがされていないからです。
せっかく教えて頂いたのに、無理を言って申し訳ありません。関数のfor文の中身はどれでしょうか?
見受けられませんが。
0334デフォルトの名無しさん
2007/09/13(木) 03:47:47int x, y;
}n, m;
の様に無名構造体を多用するんですが、この場合は n 及び m のメモリ空間は全て 0 で埋まってる事は仕様上保証されてるんでしょうか?
コードがかさばるのでデフォルトコンストラクタを書くのは嫌です。かといって後ろの方で
n.x = n.y = m.x = m.y = 0;
なんて埋めるのも面倒くさいし...
0335デフォルトの名無しさん
2007/09/13(木) 04:50:19自動オブジェクト:初期化されない。不定。
0336デフォルトの名無しさん
2007/09/13(木) 04:56:47struct{
int x, y, z;
} n = {0}, m = {0};
0337デフォルトの名無しさん
2007/09/13(木) 06:59:18それならこんなので@VC2005
#include <stdio.h>
void func(int* x, size_t size, size_t num) {
size_t i, j;
int bit;
for (i = 0; i < num; ++i) {
bit = x[0] ^ x[1]; /* xor */
for (j = 0; j < size - 1; ++j) /* shift */
x[j] = x[j+1];
x[size - 1] = bit;
}
}
void dec2bits(int dec, int* dest, size_t size) {
size_t i;
for (i = 0; i < size; ++i)
dest[i] = (dec & 1<<i) != 0;
}
int main() {
int x0 = 1234;
size_t n = 10;
int x[16] = {0};
dec2bits(x0, x, 16);
func(x, 16, n);
putchar('0' + x[0]); /* 最下位bitを出力 */
}
0338デフォルトの名無しさん
2007/09/13(木) 09:22:01>全て 0 で埋まってる事は仕様上保証されてるんでしょうか?
基本的には保証されない。
/* for C
static int ZEROCLEAR_COUNTER_i;
#define ZEROCLEAR(ioClassZeroFill) for(ZEROCLEAR_COUNTER_i=sizeof(ioClassZeroFill)-1;ZEROCLEAR_COUNTER_i>=0;--ZEROCLEAR_COUNTER_i){*((char*)(&ioClassZeroFill))=0;}
*/
//template<class T> ZEROCLEAR(T &ioClassZeroFill){int i;for(i=sizeof(ioClassZeroFill);i>=0;--i){*((char*)(&x))=0;}}//forC++
struct{
int x, y;
} n, m; ZEROCLEAR(n);ZEROCLEAR(m);
イマイチだな・・・
0339デフォルトの名無しさん
2007/09/13(木) 13:25:59音量の調整の仕方が分からず困っています。
音量の調整方法が分かる方いたら教えてください。
お願いします。
環境
OS:Windows xp sp2
Borland C++Builder 6.0
0340デフォルトの名無しさん
2007/09/13(木) 13:32:07ボリュームコントロール(sndvol32.exe)を眺めると示唆があるか
0341デフォルトの名無しさん
2007/09/13(木) 13:43:50このへんはどう?
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpperiod/period98/VBDev/Feb/vb0298.asp
0342デフォルトの名無しさん
2007/09/13(木) 13:48:31ttp://www.vector.co.jp/soft/winnt/art/se355641.html
0343339
2007/09/13(木) 14:02:04>>341
>>342
返信ありがとうございます。
教えていただいた方法で、システムの方の音量ではなく、
TMediaPlayerの方の音量だけを変更する事はできるでしょうか?
初心者なので、意味不明な事を言っていたらすみません。
0344デフォルトの名無しさん
2007/09/13(木) 14:34:46ワトソン博士を使って、アプリケーションが落ちたときの状態のスナップショットを
取得させようと考えています。しかし、条件によっては、取得されないことがあります。
いろいろ調べたら、
○ NULLポインタへの書き込み (構造化例外)
× throw による、例外 (C++の例外?)
だということがわかりました。
後者の場合もワトソンにわかる限りの状態を記録させたいのですが、これは不可能
なのでしょうか?
0345344
2007/09/13(木) 14:35:42XP Pro SP2
VC8 SP1
0346デフォルトの名無しさん
2007/09/13(木) 14:43:52TMediaPlayer のことは知らないけど、Windows Media Player のラッパのクラスなら、
ボリュームを制御することも可能と思う
ただし、TMediaPlayer について知らないので具体的にどうすればいいかは何もいえない
TMediaPlayerのヘルプを探すしかないと思う
それでダメなら、Media Playyer自身のインタフェースを取り出して自力で制御する必要があるかも知れない
Media Playyerの仕様は以下
Windows Media Player Object Model
http://msdn2.microsoft.com/en-us/library/bb249672.aspx
0347デフォルトの名無しさん
2007/09/13(木) 14:44:27スローはソフト的に処理される例外
後者はその開発ソフトがキャッチして例外だしてるから
言い方は変かも知れないけど、正常処理されている異常状態。
外部からは正常に見えるのでワトソンでは厳しいですよ。
ソースがないならVCについてくるスパイで監視か
イベントログもチェックが正解。いずれににしよ期待薄。
0348デフォルトの名無しさん
2007/09/13(木) 14:59:46ワトソン博士じゃないけどADPlusのcreshモードなら、C++ EH 例外も拾えると書いてある
http://support.microsoft.com/kb/286350/ja
アプリの実装によっては、性能に影響がでるみたいだが
0349デフォルトの名無しさん
2007/09/13(木) 15:36:06>>344
一番外にcatch(...){DebugBreak();}とでもしてみればどうかと
libcのバージョンによっては、invoke_watsonみたいな名前の内部関数が
マップファイルにあったけど、こんなときに使えるかどうかはよくワカラン
0350デフォルトの名無しさん
2007/09/13(木) 17:34:42>> 347
>> 348
ありがとうございます。ちょっとよくわから無いので、
少し調べてきます。
0351デフォルトの名無しさん
2007/09/13(木) 22:13:25↑のように引数を変化できる関数の作り方オスエテー
0352デフォルトの名無しさん
2007/09/13(木) 22:20:140353デフォルトの名無しさん
2007/09/13(木) 22:27:04printf("%d %d %d")(a)(b)(c);
みたいなのにするのがカレー化っていうんですか?
0354デフォルトの名無しさん
2007/09/13(木) 22:27:13thx
0355デフォルトの名無しさん
2007/09/13(木) 22:38:48const char * get_string()
{
return "hoge";
}
int main()
{
std::cout << get_string(); // 必ず "hoge" が出力されるか
return 0;
}
は問題ありますか?スタックに置かれた配列とかを返すのは問題だと言うことは分かりますが。
0356デフォルトの名無しさん
2007/09/13(木) 22:47:29文字列リテラルの生存期間はstaticと同一なので何の問題もない。
つーか、マクロを使わないための常套手段だ。
0357デフォルトの名無しさん
2007/09/13(木) 23:10:01うん
0358デフォルトの名無しさん
2007/09/13(木) 23:25:230359デフォルトの名無しさん
2007/09/14(金) 00:33:01自分は参考書を読むよりも、実際に問題を解いて理解するタイプなので、問題集型を
希望します。カーニハン&リッチーは挫折しました。
0360デフォルトの名無しさん
2007/09/14(金) 00:34:32カーニハン&リッチー
0361デフォルトの名無しさん
2007/09/14(金) 00:35:18カーニハン&リッチー
0362デフォルトの名無しさん
2007/09/14(金) 00:35:49カーニハン&リッチー
0363デフォルトの名無しさん
2007/09/14(金) 00:49:58宿題スレ
0364デフォルトの名無しさん
2007/09/14(金) 00:52:25ミッチー&サッチー
0365デフォルトの名無しさん
2007/09/14(金) 00:57:11ニッチーも&サッチーも
0366デフォルトの名無しさん
2007/09/14(金) 00:58:08コンソールやシェル上に実際にコンパイルするコマンドがズラ〜っと出てくると思うのですが
あれってコマンドライン上からは出るように設定できないんですか?
0367デフォルトの名無しさん
2007/09/14(金) 01:09:46とりま、make/nmakeにはいっぱいコマンドラインオプションがあるけど
0368デフォルトの名無しさん
2007/09/14(金) 01:50:09ターミナル上に自分の手で走らせたいとか?
0369デフォルトの名無しさん
2007/09/14(金) 04:36:42ズラ〜っと出てるんじゃないの? え?
0370デフォルトの名無しさん
2007/09/14(金) 06:04:440371デフォルトの名無しさん
2007/09/14(金) 07:34:570372デフォルトの名無しさん
2007/09/14(金) 08:29:27というのであれば、nulにリダイレクトすればいいと思う。
0373デフォルトの名無しさん
2007/09/14(金) 09:14:47hoge | piyo( _1 == 0, std::cout << "hagehage" << '\n );
でhogeの戻り値が0のときにpiyoの第二引数に指定した匿名関数を実行する
みたいにoperator|とpiyoのクラスを実装したいんですがなんかいい方法ありますか?
さらに
int hogehoge(int i){
return i | piyo( _1 > 0, hoge(--_1) );
}
のような使いかたもできるようにしたいです
0374デフォルトの名無しさん
2007/09/14(金) 14:26:19Boost.Lambdaでやってみたが、ラムダファンクタにresult_ofが使えないようで、
operator |に戻り値を持たせられなかった。もちろん型を決め打ちするのは可能。
#include <iostream>
#include <boost/lambda/lambda.hpp>
template<typename Pred, typename Functor>
class impl_piyo {
public:
impl_piyo(Pred p, Functor then) : p(p), then(then) {}
impl_piyo(const impl_piyo& y) : p(y.p), then(y.then) {}
impl_piyo& operator =(const impl_piyo& y) {p = y.p; then = y.then;}
template<typename Pred, typename Functor>
friend void operator |(int x, const impl_piyo<Pred, Functor>& y);
private:
Pred p;
Functor then;
};
template<typename Pred, typename Functor>
void operator |(int x, const impl_piyo<Pred, Functor>& y) {if (y.p(x)) y.then(x);}
template<typename Pred, typename Functor>
impl_piyo<Pred, Functor> piyo(Pred p, Functor then) {
return impl_piyo<Pred, Functor>(p, then);
}
int main() {
using boost::lambda::_1; using boost::lambda::constant;
int hoge; std::cin >> hoge;
hoge | piyo(_1 == 0, std::cout << constant("hagehage") << constant('\n'));
}
0375デフォルトの名無しさん
2007/09/14(金) 19:26:03なるほど
piyo()で別のオブジェクトを生成してやって、それに対して|を特殊化してやればいいんですね
ラムダファンクタの問題に関しては、result_ofをこれに対して特殊化してやればできるらしいです
とここまではできましたが、Predを満さない場合の戻り値に対して以降のoperator |を実行しないようにする方法はまだできてません
提示されたコードを元にもう少し実験してみます、どうもありがとうございました。
0376デフォルトの名無しさん
2007/09/14(金) 19:33:120377デフォルトの名無しさん
2007/09/14(金) 23:14:55羽ばたく準備はOK?(HEY!HEY!HEY!HEY!)
僕ら革命も起こせるさ
電撃Chu Chu Chuビームで!
0378デフォルトの名無しさん
2007/09/15(土) 01:21:03ここにあるソースパクって来たんだけど、コンパイルエラーが取れない。
http://decibel.fi.muni.cz/~oslejsek/docs/doxygen/vecmath/Matrix3d_8h-source.html
エラーメッセージはこんな感じ。
「.\vecmath\_matrix3.h(4) : fatal error C1083: include ファイルを開けません。'vecmath/Export': No such file or directory」
ソースで言うとこの部分
#include <vecmath/Export>
誰か分かる人いますか?
0379デフォルトの名無しさん
2007/09/15(土) 01:27:320380デフォルトの名無しさん
2007/09/15(土) 01:33:00もちろん、調べましたがExportって名前のファイルは無いし、どこからゲットするかも分かりませんでした。
フォルダかなと思って、空のフォルダ作ってみましたがそれもダメでした。
誰かやったことがある人いませんか?
ちなみにGMatrixのファイルは↓で、これが>>378に貼ったリンク先のファイルを呼んでいます。
http://decibel.fi.muni.cz/~oslejsek/docs/doxygen/vecmath/GMatrix_8h-source.html
0381デフォルトの名無しさん
2007/09/15(土) 01:38:110382デフォルトの名無しさん
2007/09/15(土) 01:40:150383デフォルトの名無しさん
2007/09/15(土) 01:41:34documentation じゃなくて download から取ってくるんだよ。きっと。
0384デフォルトの名無しさん
2007/09/15(土) 01:43:25Downloadからアーカイブを落としてみたら、中にちゃんとinclude/vecmath/Exportが入ってたよ。
0385デフォルトの名無しさん
2007/09/15(土) 01:44:13そうするとその部分のコンパイルエラーは取れますが、別のところでエラーが残ってしまいます。
エラーメッセージは以下のとおりです。
...\vecmath\_tuple3.h(31) : error C2146: 構文エラー : ';' が、識別子 '_Tuple3' の前に必要です。
...\vecmath\_tuple3.h(31) : error C2470: '_Tuple3' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
...\vecmath\_tuple4.h(25) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
対応する、ソースコードは以下の一行です。
template <class Type> class VECMATH_EXPORT _Tuple3 {
templateとか意味不明です。
何ですか?
0386デフォルトの名無しさん
2007/09/15(土) 01:47:41とりあえずわからない言葉は聞く前に調べるクセをつけた方が(反感を買わずに済んで)いいと思う
0387デフォルトの名無しさん
2007/09/15(土) 01:47:53>>385
寝たら? そうだな、100年くらい。
0388デフォルトの名無しさん
2007/09/15(土) 01:48:04サンクス、ちょっと試してみます。
0389デフォルトの名無しさん
2007/09/15(土) 01:56:09ありがとうございます。
解決しました。
>>386
そうですね。
以後気をつけます。
>>387
うるせー
糞蛆虫、一刻も早く死ね。
迅速にな。
人に迷惑かけるなよ。
0390384=387
2007/09/15(土) 01:57:490391383
2007/09/15(土) 01:58:490392デフォルトの名無しさん
2007/09/15(土) 02:00:05イ�`
0393デフォルトの名無しさん
2007/09/15(土) 02:02:59うるせー
糞蛆虫、一刻も早く死ね。
迅速にな。
人に迷惑かけるなよ。
0394デフォルトの名無しさん
2007/09/15(土) 07:50:25蟻のレポート提出がまだ済んでいないぞ。
0395デフォルトの名無しさん
2007/09/15(土) 09:13:54まだ拾える場所知らないか?
0396デフォルトの名無しさん
2007/09/15(土) 09:20:57そうなのか?
じゃあ付録についてる本を買え
それかLinuxにしろ
0397デフォルトの名無しさん
2007/09/15(土) 09:29:01http://www.codegear.com/jp/downloads/free/cppbuilder
0398デフォルトの名無しさん
2007/09/15(土) 09:32:33http://www.turboexplorer.com/jp/cpp
0399デフォルトの名無しさん
2007/09/15(土) 09:38:53アホ過ぎです、ム板に来ないで下さい。
0400デフォルトの名無しさん
2007/09/15(土) 10:02:10すまん、一番下の
「無償版のダウンロードサービスは終了しています。」
を読んで諦めてたわ
>>399
すまん、帰るわ
0401デフォルトの名無しさん
2007/09/15(土) 10:04:010402デフォルトの名無しさん
2007/09/15(土) 10:06:18アホが来ると非常に迷惑です。
0403デフォルトの名無しさん
2007/09/15(土) 10:20:12.hでクラスの定義して.cppでメンバ関数の定義したのをdllにしたいんだけど、どうextern宣言したら良いのかわからないんですが、解決策はないですか?又は基本的にメンバ関数はdllから呼び出せないとか?
0404デフォルトの名無しさん
2007/09/15(土) 10:44:130405デフォルトの名無しさん
2007/09/15(土) 12:13:01クラス定義に__declspec(dllexport)や__declspec(dllimport)を付ければいい。
http://msdn2.microsoft.com/en-us/library/81h27t8c(VS.71).aspx
でも同じところの同じバージョンのコンパイラでないと問題が起こりやすいので、
クラスのdllexport/importはあまり使われない。
それをなんとかするにはCOMに頼るしかないから。
0406デフォルトの名無しさん
2007/09/15(土) 12:26:160407デフォルトの名無しさん
2007/09/15(土) 12:42:420408デフォルトの名無しさん
2007/09/15(土) 12:51:010409デフォルトの名無しさん
2007/09/15(土) 12:56:12#include <string>
などとしてプリコンパイルだけしてみる。
0410デフォルトの名無しさん
2007/09/15(土) 18:06:20使ってるんだが、DebugとReleaseで挙動が違ってびっくりなんだ。
Releaseで出力して、なんか変な動きするから、しばらくバグかと原因をあさったけど見つからない。
その後Debugでデバッグしてみようと思ったら意図したとおりの挙動・・・。
ソースはちょっとでか過ぎるから上げられないけどこれって普通に起こることなの?
0411デフォルトの名無しさん
2007/09/15(土) 18:09:07変数を初期化し忘れているとか
変数を初期化し忘れているとか
の場合によくおきる
0412デフォルトの名無しさん
2007/09/15(土) 18:09:180413デフォルトの名無しさん
2007/09/15(土) 18:09:500414デフォルトの名無しさん
2007/09/15(土) 18:12:40>>412
ありがとう。
初期化か・・・ソース見直してくる
0415デフォルトの名無しさん
2007/09/15(土) 18:31:25DebugとReleaseってどうちがうんだろ
0416デフォルトの名無しさん
2007/09/15(土) 18:48:26>>415
DebugとReleaseの違いは色々違いすぎて俺には上手く説明出来んけど、
とりあえずコンパイラ/リンカのオプションとリンクしてるライブラリが違う。
0417デフォルトの名無しさん
2007/09/15(土) 19:00:05バッファオーバーフローでなくて?
0418デフォルトの名無しさん
2007/09/15(土) 19:01:290419デフォルトの名無しさん
2007/09/15(土) 19:05:08この項目ってなんですかね?さっきから質問ばっかですまん(´・ω・`)
0420デフォルトの名無しさん
2007/09/15(土) 19:10:35どっちも同じだろ?
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
>>419
ヘルプぐらい嫁。
http://msdn2.microsoft.com/ja-jp/library/8wtf2dfz(VS.80).aspx
これ読む限り、変数の初期化し忘れっぽくね?
0421デフォルトの名無しさん
2007/09/15(土) 19:25:34Releaseでもデバッグできるよ。
デフォルトでは、ステップ実行がアレになったり
エディトコンティニューができなかったりして、
Debugほど自由自在ではないが。
0422デフォルトの名無しさん
2007/09/15(土) 19:38:34Debug だと初期化してない変数の値を 0xCC(半角フ)で埋める。
これはデバッグしやすくするためにそうするんだが、逆に悪さをすることもある。
NULL かどうかチェックして、NULL じゃねえやって判定されても、
有効なアドレスが入ってるとは限らんからな。
0423デフォルトの名無しさん
2007/09/15(土) 19:47:43フフフフフ
0424デフォルトの名無しさん
2007/09/15(土) 19:50:22そしてNULLが0云々の議論に発展だな
0425デフォルトの名無しさん
2007/09/15(土) 19:51:51お察しの通り初期値の問題でした
皆ありがとう!
>>420
次回からはヘルプ見て分かるところは自己解決できるようにがんばりやす
0426デフォルトの名無しさん
2007/09/15(土) 20:46:56リテラルからの変換はLをつければできそうですけども
変数で変換をしたい
0427デフォルトの名無しさん
2007/09/15(土) 20:57:530428デフォルトの名無しさん
2007/09/15(土) 21:00:07そうです
0429デフォルトの名無しさん
2007/09/15(土) 21:08:56って言ってる時点で、string じゃなくて wstring だと思うんだが…
本当に string めんどいぞ?ってか違い分かってる?
0430デフォルトの名無しさん
2007/09/15(土) 21:09:53#include <clocale>
// wchar_t*型をchar*型に変換
std::setlocale(LC_ALL, "");
std::sprintf(代入先(char*), "%ls", (wcharの文字列));
0431デフォルトの名無しさん
2007/09/15(土) 21:17:13wchar_t const* pws = L"hoge";
std::size_t const srcLen = std::wcslen(pws);
std::vector<char> buf(srcLen * MB_LEN_MAX);
std::size_t dstLen = std::wcstombs(&buf[0], pws, buf.size());
std::string s(buf.begin(), buf.begin() + srcLen);
0432デフォルトの名無しさん
2007/09/15(土) 21:58:52newでのdelete忘れも解消、動的確保もラクラク
new&deleteいらねーぜ
0433デフォルトの名無しさん
2007/09/15(土) 22:10:12ん?単なる動的配列の話か。
0434デフォルトの名無しさん
2007/09/15(土) 22:17:430435デフォルトの名無しさん
2007/09/15(土) 22:45:170436デフォルトの名無しさん
2007/09/15(土) 22:47:45よくわからんがallocator<>が失敗するとかか?
ほとんど無いとは思うがnewもbado_alloc投げる
0437デフォルトの名無しさん
2007/09/15(土) 22:48:48暗黙の処理とかが多いからかな
初期化と代入の違いを意識するとか面倒くさい
けど、そこが興味深くもある
0438デフォルトの名無しさん
2007/09/16(日) 00:11:37参照があるから随分楽になると思うけど
0439デフォルトの名無しさん
2007/09/16(日) 00:15:220440デフォルトの名無しさん
2007/09/16(日) 00:17:20むしろCやってポインタの危険性を理解しているからこそ
参照を適切に利用出来るのだと思う。
0441デフォルトの名無しさん
2007/09/16(日) 00:20:470442デフォルトの名無しさん
2007/09/16(日) 00:31:420443デフォルトの名無しさん
2007/09/16(日) 00:34:020444デフォルトの名無しさん
2007/09/16(日) 00:35:170445デフォルトの名無しさん
2007/09/16(日) 09:04:170446デフォルトの名無しさん
2007/09/16(日) 09:33:390447デフォルトの名無しさん
2007/09/16(日) 09:41:250448デフォルトの名無しさん
2007/09/16(日) 10:27:200449デフォルトの名無しさん
2007/09/16(日) 12:42:41せめて
ポインタ=アドレス+型
0450デフォルトの名無しさん
2007/09/16(日) 13:38:34ポインタ=間接的にオブジェクト実体を参照するための変数
レファレンス=直接オブジェクト実体を参照するための変数
0451デフォルトの名無しさん
2007/09/16(日) 13:41:340452デフォルトの名無しさん
2007/09/16(日) 13:50:19リファレンス=参照を説明するのに参照ということばを使ってどうする
リファレンスの実装はほぼポインタだが、参照はあくまでもオブジェクトの
別名だろ
0453デフォルトの名無しさん
2007/09/16(日) 13:58:390454デフォルトの名無しさん
2007/09/16(日) 13:58:49ポインタ→シンボリックリンク
参照→ハードリンク
の違いみたいなものってこと?
ttp://... みたいな URL はポインタだね
0455デフォルトの名無しさん
2007/09/16(日) 14:00:370456デフォルトの名無しさん
2007/09/16(日) 14:02:160457デフォルトの名無しさん
2007/09/16(日) 14:07:580458デフォルトの名無しさん
2007/09/16(日) 14:07:26ポインタそのものを操作できることを忘れてる
0459デフォルトの名無しさん
2007/09/16(日) 14:12:50手間の要る実体アクセス:ポインタ
手間不要の実体アクセス:リファレンス
0460デフォルトの名無しさん
2007/09/16(日) 14:17:43「ポインタ」と「リファレンス」を調べてみるといいよ。
こういうプログラミング概念は、
他の言語でも使われているので、
理解しておいても損はない。
0461デフォルトの名無しさん
2007/09/16(日) 14:17:510462デフォルトの名無しさん
2007/09/16(日) 14:18:430463デフォルトの名無しさん
2007/09/16(日) 14:28:55理解しようと努力して幾年も過ぎてしまった....今でもポインタ、リファレンスの区別すらできぬ
その俺様が、得た答えが>>459だ。
リファレンスって operatorを実現するために導入されたんだろ、違うのか?
0464デフォルトの名無しさん
2007/09/16(日) 15:32:01>operatorを実現するために導入
さすがにそれは違う
0465デフォルトの名無しさん
2007/09/16(日) 16:02:25ポインタ=反復子
0466デフォルトの名無しさん
2007/09/16(日) 16:06:04まったくの初心者なので
よう分かりません
0467デフォルトの名無しさん
2007/09/16(日) 16:24:56ポインタ=反復子 は正しいな
でも
参照=カモフラージュ じゃないか
0468デフォルトの名無しさん
2007/09/16(日) 16:48:22ところがD&Eにはそう書いてあるんだ。
値渡しは効率悪いし、ポインタ渡しは([]、+、-など)演算子多重定義できないし
というわけでリファレンスを導入することにしたとな。
手間をdereferenceするときに*演算子が必要という意味で使っているのなら、
ポインタとリファレンスの大まかな違いは459の理解でいいと俺は思う。
0469デフォルトの名無しさん
2007/09/16(日) 17:24:54リファレンス演算というものはない
あくまでも別名に過ぎない
0470デフォルトの名無しさん
2007/09/16(日) 17:47:12{
CSome s;
GetSome(&s);
if(s.id == i)
}
0471デフォルトの名無しさん
2007/09/16(日) 17:49:05for(int i = 0 ; i < 10 ; i++)
{
CSome s;
GetSome(i, &s);
if(s.id == i)
{
break;
}
}
みたいな処理をしたいのですが、この場合、CSome sは毎回Construct・Destructされるでしょうか?
0472デフォルトの名無しさん
2007/09/16(日) 17:56:020473デフォルトの名無しさん
2007/09/16(日) 17:56:48されるんじゃね?
{ }スコープに出たり入ったりで
0474デフォルトの名無しさん
2007/09/16(日) 18:00:380475デフォルトの名無しさん
2007/09/16(日) 18:27:48forの外に出されると怖いので、{}でくくることにしますた
0476デフォルトの名無しさん
2007/09/16(日) 18:28:50最適化はロジックが変更されないことが前提
単純な整数型や実数型の演算ならループ外に共通処理を出すのは普通だが、
オブジェクトの場合は複数のオブジェクトを集約すると意味が変わって
しまうため、通常そのような最適化はなされないはず
0477デフォルトの名無しさん
2007/09/16(日) 18:34:16この`con'と`deってなに?'
0478デフォルトの名無しさん
2007/09/16(日) 18:38:46単語の途中で切っちゃダメだ
でも接頭辞 con- とか de- とか re- un- im- とかって
習わなかったっけ?
0479デフォルトの名無しさん
2007/09/16(日) 20:22:50思い出したよ。ありがとう、ボケてた。
0480デフォルトの名無しさん
2007/09/16(日) 23:04:43#include<string.h>
char *search(char *s,char *p){
char *x;
int i;
x=p;
i=strlen(p);
while(1){
p=x;
if(*s=='\0')return (char*)0;
for(;*s==*p;s++,p++){
if(*s=='\0')return (char*)0;
if(*p=='\0')break;
}
if(*p=='\0')return s-i;
s++;
}
}
int main(){
char *x;
x=search("international","nat");
printf("%s",x);
return 0;
}
これで結果が「national」になるようにしたいんですが
"international"を"internanational"にすると1文字ずれてNULLが戻ります。
改善点を教えて下さい
よろしくです
0481デフォルトの名無しさん
2007/09/16(日) 23:08:450482デフォルトの名無しさん
2007/09/16(日) 23:12:56> for(;*s==*p;s++,p++){
この部分がマズイ
1.新しい変数(char*型)を二つ用意して…後は考えろ
2.比較する時に strlen で得た長さを利用して…後は考えろ
1.か2.のいずれかの方法で改善するだろう
あとは
search("international","ional");
の返り値はどうなるかやってみた?
0483デフォルトの名無しさん
2007/09/16(日) 23:15:30> if(*s=='\0')return (char*)0;
> if(*p=='\0')break;
> }
ここで進めたsを復元する必要がある
0484デフォルトの名無しさん
2007/09/16(日) 23:17:41search("international","onal");
だった
0485デフォルトの名無しさん
2007/09/16(日) 23:23:16char *xって使わないんですね・・・
失礼しました
>>482
ありがとうございます
考え直してみます
>>483
ありがとうございます
0486デフォルトの名無しさん
2007/09/16(日) 23:34:14naが一回一致するのでその時にズレると予想した。未確認だが、、
あと第一引数が"nat"で終わるパターンも試した方が良さそうだ。
if(*s=='\0') return (char *)0;
の行が気になる。
あと、アドバイス。
引数はいずれもconst char * にした方が良い。
文字列自体は書き換えないでしょ。
0487デフォルトの名無しさん
2007/09/16(日) 23:34:46>char *xって使わないんですね・・・
自由だけどxって16進数の値を入れたり、xyzの1つとして数値を入れる人が多いと思う。
0488デフォルトの名無しさん
2007/09/16(日) 23:35:53char *search(const char *str, const char *key) {
while (*str != '\0') {
const char *s = str;
const char *k = key;
while (*s == *k) {
++s, ++k; // while (*s++ == *k++)
if (*k == '\0') return str;
if (*s == '\0') return NULL;
}
++str;
}
return NULL;
}
0489デフォルトの名無しさん
2007/09/17(月) 01:09:350490デフォルトの名無しさん
2007/09/17(月) 01:51:130491デフォルトの名無しさん
2007/09/17(月) 03:07:12これちゃんと結果でない
0492デフォルトの名無しさん
2007/09/17(月) 03:39:220493デフォルトの名無しさん
2007/09/17(月) 09:01:06#include <iostream>
#include <string>
std::string search(const std::string& target, const std::string& str) {
if(target.find(str) != std::string::npos) {
return target.substr(target.find(str));
} else {
return ""; // or assert or exception
}
}
int main() {
std::cerr << search("international", "nat") << std::endl;
std::cerr << search("international", "onal") << std::endl;
std::cerr << search("international", "not found") << std::endl;
}
0494デフォルトの名無しさん
2007/09/17(月) 11:07:09基本クラスのメンバ変数を
1:protectedにして派生クラスのメンバ関数でアクセスすべきなのか
2:privateにして派生クラスのメンバ関数から基本クラスのメンバ関数を介してアクセスすべきなのか
2-a:派生クラスのメンバ変数を引数として基本クラスのメンバ関数に渡す(関数の本質的な処理は基本クラスのメンバ関数で行う)
2-b:派生クラスの関数内で基本クラスのゲッタ関数で取ってきて派生関数内で本質的な処理をする
迷うところが多数あるのですが、これはどっちでやるのが基本なのでしょうか?
派生クラスのメンバ変数も基本クラスのメンバ変数も使う処理なので、
基本クラスのメンバ関数だけというのは無理という前提でお願いします
0495デフォルトの名無しさん
2007/09/17(月) 11:13:59趣味
0496デフォルトの名無しさん
2007/09/17(月) 11:17:17出来る限り 2-a 次善で 2-b
0497デフォルトの名無しさん
2007/09/17(月) 11:21:42悪趣味
0498デフォルトの名無しさん
2007/09/17(月) 11:25:09抽象的な質問には抽象的な回答しかできない。具体的に困っているケースが
あるならそれを書いたほうがいいよ。
0499デフォルトの名無しさん
2007/09/17(月) 11:25:28基底クラスに変数を持たせてるなら
本質的な処理?も基底クラスで行うだろう。
あと、俺なら変数の入出力が激しいならprotectedにする。
0500デフォルトの名無しさん
2007/09/17(月) 11:37:08少なくとも1.は避けたほうがいい。
派生は誰にでも可能で、protectedメンバ変数は事実上writable by worldだ。
つまり保護されていないも同然だ。
publicにしたくないデータなら、privateにすべき。
0501デフォルトの名無しさん
2007/09/17(月) 11:46:430502デフォルトの名無しさん
2007/09/17(月) 11:47:460503デフォルトの名無しさん
2007/09/17(月) 11:48:43時代に取り残されるとCOBOL技術者みたいな末路が待っているかもよ
0504デフォルトの名無しさん
2007/09/17(月) 12:08:34それならprivateメンバ変数も基本クラスのpublicメンバ関数を用いて変更可能だったら
事実上writable by worldってことではないの?
0505デフォルトの名無しさん
2007/09/17(月) 12:26:46publicメンバ関数がprivate メンバ変数の参照を返すようだと無意味だが、
ちゃんとルールに沿った形でしか変更出来ないって意味だろ。
0506デフォルトの名無しさん
2007/09/17(月) 12:28:39ケースバイケース
0507デフォルトの名無しさん
2007/09/17(月) 12:32:51「何でカプセル化なんてするの?」ってのと同質の質問だなw
0508デフォルトの名無しさん
2007/09/17(月) 12:36:15自分で人に使ってもらうライブラリでも書いてみればわかる
0509デフォルトの名無しさん
2007/09/17(月) 12:53:01怒る人が多いんだけど、なんで?
0510デフォルトの名無しさん
2007/09/17(月) 12:55:20参照も基本的に使用は最小限
0511デフォルトの名無しさん
2007/09/17(月) 13:14:47そのうち21個の関数の引数がなし(void)だったんですが
これっておかしいですか?
関数内ではほとんどメンバ変数をいじったりしてるのですが
0512デフォルトの名無しさん
2007/09/17(月) 13:17:11エスパーじゃないので、なんともいえない
0513デフォルトの名無しさん
2007/09/17(月) 13:17:52熟考した結果そうなったんだろ?
別にいいじゃないか
常識に囚われるな
0514デフォルトの名無しさん
2007/09/17(月) 13:19:44クラスに対しての操作をそうする事で必要分隠蔽できているのなら、それでいいんじゃないかな
0515デフォルトの名無しさん
2007/09/17(月) 13:20:2823個もメンバ関数を持ったクラスの方が気になるが
基盤となるクラス作ってたらその位になるのかな
0516511
2007/09/17(月) 13:23:14とりあえず思ったとおりの動作になってくれているのでこのまま行こうと思います
>>515
クラス3つで合計23個です
でもまだまだ増えそうですが・・・
0517デフォルトの名無しさん
2007/09/17(月) 13:23:16それを実現するためにoperatorがあるんじゃないの?
これならシームレスにカプセル化できるっしょ?
0518デフォルトの名無しさん
2007/09/17(月) 13:25:45基本的に閉鎖的の方が良いから
上手く機能しているなら全然おkだね
0519デフォルトの名無しさん
2007/09/17(月) 14:05:42うちの親だわ
0520デフォルトの名無しさん
2007/09/17(月) 14:15:54とか言われてるんだけど、これってリファクタリング全否定なんでしょうか?
0521デフォルトの名無しさん
2007/09/17(月) 14:16:06いいな。今でもCOBOL技術者ってひっぱりだこだろ。
0522デフォルトの名無しさん
2007/09/17(月) 14:18:110523デフォルトの名無しさん
2007/09/17(月) 14:23:21採用している開発手法によるな。ウォーターフォール型では一度完成して
検証済みのものに手を入れるのは御法度。まあ、リファクタリングを導入
するなら、上層部の意識改革+強力なリーダーシップ+開発者へのユニット
テスト文化の浸透が不可欠だね。そんなに簡単なことじゃないよ。
0524デフォルトの名無しさん
2007/09/17(月) 14:30:59上層部の意識改革+強力なリーダーシップ
日本ではここが一番難しい
米より15年遅れてるソフト業界と言われる所以
0525デフォルトの名無しさん
2007/09/17(月) 14:41:45俺が書いたクラスで一番メンバ関数が多いのは、趣味で作ってる俺Lispの基底型SExpressionで、
いま数えたら、メンバ関数が54個、そのうち24個が引数無しだった。
0526デフォルトの名無しさん
2007/09/17(月) 14:44:470527デフォルトの名無しさん
2007/09/17(月) 14:48:51それらはpublicなのかな?下請け的な関数もありそうだ。
あとgetterも引数が無いのは馬頭らしくないしね。
0528デフォルトの名無しさん
2007/09/17(月) 14:55:32馬頭
これなんて読むの?
0529デフォルトの名無しさん
2007/09/17(月) 15:04:53めず
むかしむかし、ある地獄にとても仲のいい二人組がいました。
その子達は名前をゴズとメズといい、
0530デフォルトの名無しさん
2007/09/17(月) 15:13:560531デフォルトの名無しさん
2007/09/17(月) 15:25:010532デフォルトの名無しさん
2007/09/17(月) 15:43:46そんなに需要があるの?
何故?
うちの親が作ったのは
鶏の卵の市場予想プログラムと計算機ぐらい
大学生のときに作ったものばっかで
今は何もやってないわ
ちなみに、大学は武蔵工業大学らしいわ
0533デフォルトの名無しさん
2007/09/17(月) 15:45:32修正
大学かどうかは分からんが
かなり何もやってないことは確か
大学の頃はカードだったみたいだし
0534デフォルトの名無しさん
2007/09/17(月) 15:52:240535デフォルトの名無しさん
2007/09/17(月) 15:52:540536デフォルトの名無しさん
2007/09/17(月) 15:55:46COBOLは時代遅れの言語と見られてて
若い人がやりたがらないから。
0537デフォルトの名無しさん
2007/09/17(月) 15:56:02コボルは今の若い衆には受けが悪いだろ。
時代遅れの仕様に需要もいつまで続くかも分からないし。
だから技術者の数が少ない。反面一定の需要は根強く続いている。
だから相対的に技術者の需要がある。
0538デフォルトの名無しさん
2007/09/17(月) 16:05:14...
};
class D d;
class B b = d;
これでBの要素だけコピーできたのですが、
このコピーコンストラクタを自動で作ってくれるのって言語の仕様ですか?
それともコンパイラ依存ですか?
0539デフォルトの名無しさん
2007/09/17(月) 16:11:430540デフォルトの名無しさん
2007/09/17(月) 16:13:180541デフォルトの名無しさん
2007/09/17(月) 16:13:34へー、すごい気が利くんだね、すごいや。
0542デフォルトの名無しさん
2007/09/17(月) 16:20:130543デフォルトの名無しさん
2007/09/17(月) 16:22:05わざわざ使えなくしなきゃいけないことも多いし。
0544デフォルトの名無しさん
2007/09/17(月) 18:11:42処理に必要なメンバ変数はストラテジ基底クラスをfriend指定して
ストラテジ基底クラスからprotectedでgetterを作って
実装部に当たる派生クラスに限定公開している。んで、思いの外getterの数が多くなったから
いっそストラテジ派生クラスを全てfriend指定しようかとも検討しているんだが
どっちの方が良いかな。始めからクラスのメンバに全てgetterを付ける、と言う手もあるけど。
やっぱりこの辺は好みの問題?
0545デフォルトの名無しさん
2007/09/17(月) 18:35:46もっと具体的に書いてよ
0546デフォルトの名無しさん
2007/09/17(月) 18:44:07class Enemy
{
public:
action(){ m_pstrategy->action() }
private:
int m_hp;
float m_speed;
float m_direction;
friend class EnemyStrategy;
EnemyStrategy* m_pstrategy;
};
class EnemyStrategy
{
public:
virtual void action()=0;
private:
Enemy* enemy;
protected:
int getHP(){ return enemy->m_hp; }
float getSpeed(){ return enemy->m_speed; }
};
みたいな感じになってる。規模はもうちっと大きいけどね。
あくまでみたいな、だから↑のコードの意図したとこ以外のツッコミは無しの方向で・・・
0547デフォルトの名無しさん
2007/09/17(月) 19:18:39Enemy から頻繁にアクセスされる属性を抜き出して EnemyParameter
クラスを作り、EnemyStrategy.action(EnemyParameter&) とする。
EnemyParameter には public な getter を用意し、Enemy の private
メンバとする。俺ならこの場面で friend と protected は使わない。
0548544
2007/09/17(月) 19:34:09死亡権限や影響権限等を少々凝った形で持たせてるがなんとかなる範囲だし
回答�d
0549デフォルトの名無しさん
2007/09/17(月) 21:44:22天国にいけますか?
0550デフォルトの名無しさん
2007/09/17(月) 22:12:02天国へはいけまへん。理解出来なければ地獄堕ち。
0551デフォルトの名無しさん
2007/09/17(月) 22:17:38ポインタ程度理解できようができまいが、
あなたは地獄行きが決定しています。
0552デフォルトの名無しさん
2007/09/17(月) 22:58:45→ その業務で優れた成績を残し昇格 → 天国へ
ポインタが理解できる → プログラマの能力を認められる → ひたすらプログラムを作り続ける → 終
0553デフォルトの名無しさん
2007/09/17(月) 23:11:33→その管理職になり「腐れ上司」のレッテルを貼られる。
→憎まれながらも(気付かないので)幸せな人生を送る→天国へ
....あれ?
0554デフォルトの名無しさん
2007/09/17(月) 23:17:24ポインタ程度の壁で行き詰ってるようじゃその先の壁なんて越えられるかどうか
0555デフォルトの名無しさん
2007/09/17(月) 23:20:110556デフォルトの名無しさん
2007/09/17(月) 23:29:49最後だけ上下が逆だと思う。
0557デフォルトの名無しさん
2007/09/18(火) 08:08:05そのときは以下のようにすればよいのですか?
クラスAの中でクラスBを使う
class A {
B *b;
public:
A() {
bの初期化
}
};
もしこのように書けば良いとすると、bの初期化をどうやって
書けばよいかが分りません。
どうか教えてください。
0558デフォルトの名無しさん
2007/09/18(火) 08:52:22/ ―\ ┏┛
/ノ (●)\ ・
. | (●) ⌒)\
. | (__ノ ̄ |
\ /
\ _ノ
/´ `\
| |
| |
0559デフォルトの名無しさん
2007/09/18(火) 09:00:45ttp://www.tohoho-web.com/java/class.htm
こういうネストしたインナークラスがやりたいのか
俺は使いたくないな
0560557
2007/09/18(火) 09:10:35あるクラスのなかにインナークラスのインスタンスを保持したいのと、
そのインナークラスのコンストラクタに自由に引数をわたしたいのです。
インナークラスへ引数をわたさなくてよいなら、たんにクラス内でクラスを
宣言すればできましたが、そうじゃないばあいができなかったです。
0561デフォルトの名無しさん
2007/09/18(火) 09:13:17new すればいいよ。
0562デフォルトの名無しさん
2007/09/18(火) 09:21:09日本語もコードも、どう見ても単なる外部クラスの集約だよなあ。
0563デフォルトの名無しさん
2007/09/18(火) 09:34:01初期化リスト使えばいいよ。
0564デフォルトの名無しさん
2007/09/18(火) 13:36:19BとかCのヘッダをインクルードしてるのにもかかわらず、
Cだけはさらに前方宣言しなきゃいけなくて、
Bはなぜかしなくてもいい場合とかがあります。
そのしなきゃいけない場合としなくてもいい場合のルールがさっぱり分からないんですが、
一体どういうことなんでしょうか?
いつも、メンバにもたせた瞬間に山の様なコンパイルエラーがでたら、
理由は分からないけど前方宣言してみたら消えるかな
とか思ってなんとか適当に対処してきたんですが。
0565デフォルトの名無しさん
2007/09/18(火) 13:44:180566デフォルトの名無しさん
2007/09/18(火) 13:52:42-- a.h --
#ifndef a_h
#define a_h
#include "b.h"
class A { B *b; ...... };
#endif
-- b.h --
#ifndef b_h
#define b_h
#include "a.h"
class B { A *a; ...... };
#endif
-- x.c --
#include "a.h"
↓展開すると
#define a_h
#define b_h
class B { A *a; ...... }; // Aが未定義
class A { B *b; ...... };
0567デフォルトの名無しさん
2007/09/18(火) 14:02:25そういう単純な循環なら分かるんですが、
そうでもないっぽいんです。
もうすこし複雑で同じ問題が起きる状況ってありえますか。
初心者には気づきにくいけど遠まわしに同じようなことがおきてる、
っていうような。
0568デフォルトの名無しさん
2007/09/18(火) 14:26:44死ね
0569デフォルトの名無しさん
2007/09/18(火) 14:33:28解決策のひとつとしては、ヘッダから別のヘッダをインクルードするのを極力やめるとか。
例えば A へのポインタを持つだけの場合、A の定義は必要ないから、a.h をインクルードせずに
#ifndef b_h
#define b_h
class A;
class B { A *a; ...... };
#endif
だけにする。同様に a.h の方も
#ifndef a_h
#define a_h
class B;
class A { B *b; ...... };
#endif
だけにする。すべてのヘッダをそのようにする。
継承してる場合や実体を含んでる場合やtypedefやマクロやなんやらを参照する場合は必要だから、
そのとき *だけ* ヘッダから別のヘッダをインクルードしても良いことにすれば、そういう問題はあまり起きなくなるんじゃないかな。
0570デフォルトの名無しさん
2007/09/18(火) 14:48:05まぁ結局、常に前方宣言するか、インクルードの循環に神経尖らすか、エラーが起きるごとに対処するか、くらいしかないのでは。
あと↓みたいな案もあるけど、あんまり見ないような気がする。
#ifndef a_h
#define a_h
class A;
#include "b.h"
class A { B *b; ...... };
#endif
#ifndef b_h
#define b_h
class B;
#include "a.h"
class B { A *a; ...... };
#endif
0571デフォルトの名無しさん
2007/09/18(火) 14:48:460572デフォルトの名無しさん
2007/09/18(火) 14:54:00今までクラスAのメンバに
クラスBへのポインタを持たせるために、
Aのヘッダに
Bのヘッダをインクルードしてましたが、
助言に従いBの前方宣言だけにしてみました。
が、A.cppの方で
Bへのポインタのメンバ変数を使おうとしたら
「認識できない型がB使われています」
と怒られました・・・なぜでしょうか。
0573572
2007/09/18(火) 15:09:280574デフォルトの名無しさん
2007/09/18(火) 15:15:48あほ死ね
0575デフォルトの名無しさん
2007/09/18(火) 15:18:060576デフォルトの名無しさん
2007/09/18(火) 15:25:48生きる!
0577デフォルトの名無しさん
2007/09/18(火) 15:27:45みたいに遠くで使われてたりするとわけわからなくなってきて
発狂しそうになります。
0578デフォルトの名無しさん
2007/09/18(火) 15:36:18早めに精神科に行け
0579デフォルトの名無しさん
2007/09/18(火) 15:45:42if( test() ){ retrun; }
上記のプログラムを#defineでtestの部分を引数にしてマクロ化したいのですが
#includeを#define内に組み込むことは可能でしょうか?
0580デフォルトの名無しさん
2007/09/18(火) 15:49:530581デフォルトの名無しさん
2007/09/18(火) 15:54:500582デフォルトの名無しさん
2007/09/18(火) 19:16:01constでグローバル変数を宣言して値を代入するのって
いったい何が違うの?
(´・ω・`)
0583デフォルトの名無しさん
2007/09/18(火) 19:18:56俺達が普通ということ
0584デフォルトの名無しさん
2007/09/18(火) 19:31:23const は変数っていうか定数かを宣言するから
メモリにその実体が存在することになる。
っていうのが初心者的理解です。
間違ってたらすみません
0585デフォルトの名無しさん
2007/09/18(火) 20:10:020586デフォルトの名無しさん
2007/09/18(火) 20:16:10言いえて妙
0587デフォルトの名無しさん
2007/09/18(火) 20:30:17最適化次第では色々起きるので、constな変数が必ず変数として実態を持つかは微妙。
「#define」はCプリプロセッサが処理する。
「const」な変数はCコンパイラが処理する。
0588デフォルトの名無しさん
2007/09/18(火) 20:46:32なんで誰も問いたださないんだ?
0589デフォルトの名無しさん
2007/09/18(火) 20:54:32プリプロセッサの領分とコンパイラの領分を理解したら、次は君のいうディテールの話になるけれど、
まずは第一段階が大事かと。
0590デフォルトの名無しさん
2007/09/18(火) 21:09:47え?今何してるかって?
プリプリプリプリプリプリプロセスだよ
同僚はブリブリブリブリブリブリブリブリブリブリブロセスしてるよ
0591デフォルトの名無しさん
2007/09/18(火) 21:11:44const変数に値を代入することはできません(C99/C++)。
const変数は仮令グローバルでも実体を持たない場合があります(C++)。
static const変数は実体を持たない場合があります(C89/C99/C++)。
0592デフォルトの名無しさん
2007/09/18(火) 21:54:25普通の人より彼女ができ安かったり
セクロスしまくりなんですか?
0593デフォルトの名無しさん
2007/09/18(火) 22:00:180594デフォルトの名無しさん
2007/09/18(火) 22:20:16int hoge(void);
int main (void){
quit;
return 0;
}
int hoge(void){
printf("hogehoge¥n");
return 0;
}
とやってもhogehogeと表示されません
どうしてでしょうか?
0595デフォルトの名無しさん
2007/09/18(火) 22:22:160596デフォルトの名無しさん
2007/09/18(火) 22:26:35バックスラッシュ (U+5C)ではなく、本当に円記号 (U+A5)なのが気になる。
0597デフォルトの名無しさん
2007/09/18(火) 22:41:360598デフォルトの名無しさん
2007/09/18(火) 22:48:280599デフォルトの名無しさん
2007/09/18(火) 22:50:170600デフォルトの名無しさん
2007/09/18(火) 22:54:570601デフォルトの名無しさん
2007/09/18(火) 22:58:190602デフォルトの名無しさん
2007/09/18(火) 22:58:260603デフォルトの名無しさん
2007/09/18(火) 23:02:440604デフォルトの名無しさん
2007/09/18(火) 23:04:180605デフォルトの名無しさん
2007/09/18(火) 23:07:500606デフォルトの名無しさん
2007/09/18(火) 23:16:390607デフォルトの名無しさん
2007/09/18(火) 23:34:580608デフォルトの名無しさん
2007/09/18(火) 23:58:310609デフォルトの名無しさん
2007/09/18(火) 23:59:16市販のライブラリであれば利用者に中身が見られないようにする、
個人ではプログラムがすっきりして見やすくなったり拡張しやすくなる ぐらいしか思い浮かばないのですが。
0610デフォルトの名無しさん
2007/09/19(水) 00:00:26hoge.exe > NUL
0611デフォルトの名無しさん
2007/09/19(水) 00:03:13十分じゃねーか
0612デフォルトの名無しさん
2007/09/19(水) 00:39:51環境:VC6.0
ADOXを用いてACCESS(MDB)のフィールドの設定方法を教えていただきたいです。
具体的には、フィールドの既定値・UNICODE圧縮・空白の許可の3つの要素です。
propertyを取得することはできたのですが、更新方法がわかりません。
ご教授願います。
0613デフォルトの名無しさん
2007/09/19(水) 00:50:30Accessのヘルプからオブジェクトモデルのマニュアルを見つけ出せ!
0614デフォルトの名無しさん
2007/09/19(水) 00:55:44こんな感じ。。
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado_11.aspx
値をセットしてもMDBに反演fされない。。
なぜだ??型はあっているはず。。
0615デフォルトの名無しさん
2007/09/19(水) 01:01:49すっきりしてないごちゃごちゃで見にくいソースをメンテしたいなら別にしなくていいんじゃない
0616デフォルトの名無しさん
2007/09/19(水) 15:24:49そのポインタ値をコンストラクタで要求するように設計したいのですが、
そのときに不正な値が送られて来ないかチェックする方法ってありますか?
やはりリファレンスを持たせるべき?
0617デフォルトの名無しさん
2007/09/19(水) 16:26:54class Foo{
Bar *bar;
public:
Foo(Bar *bar);
};
Foo::Foo(Bar *bar)
{
if (bar == NULL) {
throw std::invalid_argument();
}
this->bar = bar;
}
0618デフォルトの名無しさん
2007/09/19(水) 16:34:27ファクトリメソッドを用意してみては。
class Foo {
// 略
public:
Foo(Bar *bar) : _bar(bar) {}
Foo *create(Bar *bar) {
return bar ? new Foo(bar) : NULL;
}
}
0619デフォルトの名無しさん
2007/09/19(水) 16:45:43ぬるぽかどうかをチェックするだけなら簡単だが、それでいいのか?
まず本当にそんなことが必要かどうか、考えたほうがいい
リファレンスを受け取って、アドレスを取ってポインタを保持するという
方法もあるでよ
0620デフォルトの名無しさん
2007/09/19(水) 20:00:36隠蔽化にそれ以上何をもとめる?
0621デフォルトの名無しさん
2007/09/19(水) 20:05:32プログラムのバグってのは大抵は状態=データを何か不正なものにしてしまうこと
によって起きるので、データを触る人が少なければ少ないほど
訳の分からないバグは起きにくくなるし、バグが出た場合も問題を
局所化しやすくなるよ
まあCやC++のような言語では、言語レベルでのクラスの保護なんぞ容易に
破られ壊されることがあるが、それは仕方が無い
0622デフォルトの名無しさん
2007/09/19(水) 23:24:300623デフォルトの名無しさん
2007/09/19(水) 23:27:450624デフォルトの名無しさん
2007/09/20(木) 01:53:00・fopen
・ファイルへの書き込み
・fclose
・system(外部プログラム呼び出し)
・結果を保存
という作業をループで何千回〜数万回処理するプログラムを作ってるんですが、途中から
"Too many open files"というエラーが出てきてファイルへの書き込みが出来なくなります
fcloseで閉じてるのに開きすぎとはこれ如何に
それとも、そういう意味のエラーじゃないんですかね?
0625デフォルトの名無しさん
2007/09/20(木) 02:01:410626デフォルトの名無しさん
2007/09/20(木) 02:05:320627デフォルトの名無しさん
2007/09/20(木) 02:22:520628デフォルトの名無しさん
2007/09/20(木) 02:25:31そのエラーが出るのが繰り返しの20回目くらいなのか250回目くらいなのか
それとも数千回までは大丈夫なのかによっても原因が変わってくるかもしれないし。
0629デフォルトの名無しさん
2007/09/20(木) 02:26:47OSとか詳しくないから予測だけど。
開けなかったらしばらく待って、再試行。長時間だめならタイムアウトエラー吐き出しでいいんじゃね?
closeきちっとしてればだけど。
0630デフォルトの名無しさん
2007/09/20(木) 02:27:360631デフォルトの名無しさん
2007/09/20(木) 02:30:040632デフォルトの名無しさん
2007/09/20(木) 02:46:34ttp://msdn2.microsoft.com/ja-jp/library/6e3b887c(VS.80).aspx
500前後でエラーになるなら、そもそもfcloseできてない
それを超えているなら、なんらかの条件(ループの途中脱出等)により
fcloseを迂回するパターンが存在しないかをまず見直すべき
0633デフォルトの名無しさん
2007/09/20(木) 03:16:50ファイル閉じるのを待つため次のようにやっている
fp.open("file" , ios::out );
fp.close();
while(fp.fail())Sleep(100);
0634デフォルトの名無しさん
2007/09/20(木) 03:22:24あの程度の練度までいくのに何年掛かるかな
0635デフォルトの名無しさん
2007/09/20(木) 03:28:250636デフォルトの名無しさん
2007/09/20(木) 03:31:03.netもあの調子だし
0637デフォルトの名無しさん
2007/09/20(木) 11:41:51「バッファオーバーラン」の項目なんですけど、
strncat(s, ".exe", sizeof(s) / sizeof(char) - strlen(s));
じゃなくて
strncat(s, ".exe", sizeof(s) / sizeof(char) - strlen(s) - 1);
の間違いですよね?
(sizeof(char)は環境によらず常に1だろってのはともかく)
0638デフォルトの名無しさん
2007/09/20(木) 11:49:010639デフォルトの名無しさん
2007/09/20(木) 12:02:190640デフォルトの名無しさん
2007/09/20(木) 12:27:360641967
2007/09/20(木) 12:55:44単体テストをしたいんですが、どうしたらいいでしょうか。
整数だけの判定ならできます。
0642デフォルトの名無しさん
2007/09/20(木) 13:07:01どうせ直すなら、ついでにおかしな日本語も訂正しておいてくれ。
>バッファオーバーランを防ぐ最も最適な方法は、字数制限付き文字列連結関数であるstrncatを使うことがある。
「最も最適」とか「方法は〜ことがある」とか。
--
バッファオーバーランを防ぐ方法の一つとして、字数制限付き文字列連結関数であるstrncatを使う例を挙げる。
--
こんな感じでいい気もするけどね。
0643デフォルトの名無しさん
2007/09/20(木) 13:13:13>整数だけの判定ならできます。
それができているなら、その応用でできるでしょ。
試しにそのコードを晒して味噌。
0644641
2007/09/20(木) 13:27:15int arrInput[4]; // 乱数配列
int retResult; // 結果受け取り変数
// int cntLoop; // ループカウンタ
// int cntCk1; // チェックカウンタ
// int cntCk2; // チェックカウンタ
// int cntDbl; // 重複回数
/* 正常系テスト1
1234入力
*/
printf( "正常系テスト1\n");
printf( "ユーザ入力で1234入力\n");
retResult = GetUserInput(arrInput);
printf( "・戻り値:\n" );
printf( "期待される値:ERR_RET_NORMAL(0)\n");
改行多すぎって怒られたので2回にわけます
0645641
2007/09/20(木) 13:28:25printf( "・整数配列:\n" );
printf( "期待される値\n");
printf( "arrInput[0]:1\n");
printf( "arrInput[2]:2\n");
printf( "arrInput[3]:3\n");
printf( "arrInput[4]:4\n");
printf( "実行結果:\n" );
printf( "arrInput[0]:%d\n", arrInput[0] );
printf( "arrInput[1]:%d\n", arrInput[1] );
printf( "arrInput[2]:%d\n", arrInput[2] );
printf( "arrInput[3]:%d\n", arrInput[3] );
if( retResult==ERR_RET_NORMAL
&& arrInput[0]==1
&& arrInput[1]==2
&& arrInput[2]==3
&& arrInput[3]==4
)
{
printf( "正常系テスト1成功\n" );
}
else
{
printf( "正常系テスト1失敗\n" );
やはり半角英数字のあらわし方がわかりません。
0646デフォルトの名無しさん
2007/09/20(木) 13:40:15つーか、GetUserInput()の段階で数字以外をどう扱ってるってのよ。
0648641
2007/09/20(木) 14:02:38******************************************************************************/
/* ヘッダファイルの読み込み */
#include<stdio.h>
#include "../00_common.h"
/*******************************************************************************
関数名 :main関数
戻り値型 :int
引数 :無し
仕様 :GetUserInputに対する各テストケースを実施する
戻り値 :ERR_RET_NORMAL 0 // 正常終了
*******************************************************************************/
0649デフォルトの名無しさん
2007/09/20(木) 14:07:40>>647
乙。
0650デフォルトの名無しさん
2007/09/20(木) 14:11:13オレは >>646 ではないが
>>646 はどうやって入力を受け付けているのかが知りたいんだと思うよ
scanf fscanf fgetc getchar fgets なんかで入力を受けてから
変換してるんじゃないかとは思うんだが
あと、気になったので突っ込んでおく
> 00_common.h
かなり危険な香りがする
> 引数:無し
!!!
0651デフォルトの名無しさん
2007/09/20(木) 14:11:49char s[80];
strncat(s, ".exe", sizeof(s) - strlen(s) - 1);
なんだこれ。charはautoの配列であって、ゴミだよな中身は。
strlenは世界の果てまで0を探しに行ってSEGVを起こすかもな。
こんなコードは窓から投げ捨ててしまえ。
0652デフォルトの名無しさん
2007/09/20(木) 14:16:12吊ってくる
0653デフォルトの名無しさん
2007/09/20(木) 14:17:260654デフォルトの名無しさん
2007/09/20(木) 14:19:160655マターリ ◆AbENcvTP5o
2007/09/20(木) 14:27:03ttp://sports2.2ch.net/test/read.cgi/entrance2/1190215633/l50
0656デフォルトの名無しさん
2007/09/20(木) 14:37:54設計の話なんですが、出席番号と氏名が一緒になっている文字列から【出席番号】と【氏名】を
別々に取り出すにはどうしたらいいか教えてください。
出席番号は3桁で氏名は10桁です。
ついでに聞きたいのですが、文字長ってなんですか?
出席番号の桁や氏名の桁と関係あるんですか?
0657デフォルトの名無しさん
2007/09/20(木) 14:47:50コンパイラが吐き出すデフォルトの動作のままでよい場合でも、
それらをprotectedにしたい場合は、自分で中身を書かないとダメなものですか?
publicをprotectedにするだけの宣言方法は無いですか?
0658デフォルトの名無しさん
2007/09/20(木) 14:50:04市長 市の長
村長 村の長
ってことは
文字長 が何か分かるよね
0659まり
2007/09/20(木) 14:50:10文字列からデータを取り出したいのですがどうしたらよいでしょうか。
詳細を記しますと
同じ文字列に入っている出席番号と氏名を別々に取り出し、構造体に格納したいのです。
出席番号は3桁、氏名は10桁とされています。
ちなみに文字の長さとはなんでしょうか
文字のサイズのことですか?
この場合出席番号は半角数字で3桁なので3Byteってことですか?
氏名は全角で20Byteでいいのでしょうか?
0660デフォルトの名無しさん
2007/09/20(木) 14:51:55規則性を見出してコーディング
>>657
class a{
private:
void operator=(const a&){}
};
の様に空実装するだけで防げる。
0661まり
2007/09/20(木) 14:52:00ごめんなさい。
書き込まれていないと思ってもう一度書いてしまいました。
>>658さん
文字の長さってことですよね。
ただいまいち理解し切れなくて。。。
0662まり
2007/09/20(木) 14:54:14今PAD作成中でして、文字列の文字長が○○なら。。。って分岐をつくろうかなと思っているんですが
もう何がなんだかわからなくて
0663デフォルトの名無しさん
2007/09/20(木) 14:56:07職場の教育係に聞いたほうが良いですよ
0664デフォルトの名無しさん
2007/09/20(木) 14:58:26空実装にしてしまうと、実際の代入処理も行われなくなりませんか?
派生クラスのほうでこの基本クラスのoperator=を使うので、
代入処理自体はコンパイラが吐き出すものを使いたいのですが。
0665デフォルトの名無しさん
2007/09/20(木) 15:00:48const char * str = "123abcdefghij";
struct Foo {
int num;
char name[11];
} foo;
sscanf(str, "%3d%s", & foo.num, foo.name);
0666デフォルトの名無しさん
2007/09/20(木) 15:03:05宣言だけ置いておいたらどうなる?
protected:
void operator=(const a&);
0667デフォルトの名無しさん
2007/09/20(木) 15:05:36「外部参照が未解決です」って言われます…。
0668まり
2007/09/20(木) 15:25:23自分で調べなさいと。。。
そして自分で調べてわからなければ誰かに聞きなさいと、、、
0669デフォルトの名無しさん
2007/09/20(木) 15:38:08文字長ってのは書いた人がいい加減なだけで、文字列長のことだと思いますよ。
文字列の長さ(文字数またはバイト/ワード数。環境や定義による)のこと。
0670まり
2007/09/20(木) 15:55:530671デフォルトの名無しさん
2007/09/20(木) 16:10:25書くしかなだろ
0672デフォルトの名無しさん
2007/09/20(木) 16:31:550673デフォルトの名無しさん
2007/09/20(木) 16:46:26んで「文字の長さって・・・?」となっちゃったわけだ。
0674デフォルトの名無しさん
2007/09/20(木) 17:11:01やっぱりprotectedにするためだけに、
デフォルトで吐き出されるものと同じで済むものでも
自分で書かないといけなくなるんですね。
protected:
void operator=(const a&) default;
みたいな記述があればよかったのに…。
0675デフォルトの名無しさん
2007/09/20(木) 17:24:380676デフォルトの名無しさん
2007/09/20(木) 17:52:51こういう用途にも使えるのかどうかは知らないけど。
0677デフォルトの名無しさん
2007/09/20(木) 18:00:58そいつに聞けばいいんじゃないか?
0678デフォルトの名無しさん
2007/09/20(木) 18:39:38template <class T> A<T>;
template <class T>
class B {
friend class A<T>;
};
template <class T> A<T>;
の部分がエラーとなりコンパイルできません。
ただの前方宣言なのに何故でしょうか?
0679デフォルトの名無しさん
2007/09/20(木) 18:44:54テンプレートクラスのfriendは規格外だったはず
0680デフォルトの名無しさん
2007/09/20(木) 18:49:00template <class T> class A;
0681デフォルトの名無しさん
2007/09/20(木) 18:55:06>>679
テンプレートクラスのfriend宣言はいろいろな書籍に載っていました。
>>680
なるほど、微妙ですね。。
template <class T> A<T>;
は文法違反ですか
この文法の説明が載っている
良い書籍はありますでしょうか?
プログラミング言語C++第3版
を見たのですが、明確な説明を見つけられませんでした。
0682デフォルトの名無しさん
2007/09/20(木) 19:45:45gcc 4.1になると、同じプログラムなのにコンパイルはできても
実行すると途中でアボートしてしまうのですがなんででしょうか?
gcc 4.1になるとコンパイルできないとかだったら、ソースのミスと
考えられるのですが、gccのバージョンによってコンパイルはできるのに
実行だけできないなんてことが起こるのでしょうか?
0683デフォルトの名無しさん
2007/09/20(木) 19:47:180684デフォルトの名無しさん
2007/09/20(木) 19:47:270685デフォルトの名無しさん
2007/09/20(木) 19:53:14起こります
特に下のようなコードになっている部分が怪しいです
#include<stdio.h>
int main(void){
char *ptr;
scanf("%s", ptr);
printf("%s\n", ptr);
return 0;
}
0686デフォルトの名無しさん
2007/09/20(木) 20:08:48自分でも B の方は
template <class T>
class B {
って書いてるじゃないか。だったら A も
template <class T> class A;
になるのが自然だと思わない?
0687デフォルトの名無しさん
2007/09/20(木) 20:10:49もともとダメなプログラムが、それまではたまたま偶然運良く動いてただけ
0688デフォルトの名無しさん
2007/09/20(木) 20:11:17え?今何してるかって?
プリプリプリプリプリプリプロセスだよ
同僚はブリブリブリブリブリブリブリブリブリブリブロセスしてるよ
0689デフォルトの名無しさん
2007/09/20(木) 20:12:51確かに。
記述に惑わされていた気がします。
A<T>という形はオブジェクトの定義のときの
記述でした。{ } ; があるとクラス定義、無ければ宣言
ですね。
0690682
2007/09/20(木) 20:13:41もう一度ソースを見直してみることにします・・・
0691デフォルトの名無しさん
2007/09/20(木) 20:13:55それが業務プログラムでリリース済みだったらガクブルだな
0692デフォルトの名無しさん
2007/09/20(木) 20:16:530693デフォルトの名無しさん
2007/09/20(木) 20:18:37炎上した後でもない限りは
0694デフォルトの名無しさん
2007/09/20(木) 20:20:18新しいコンパイラが出てても、それまでと同じ古いコンパイラをずっと使い続けさせられるんDA
0695デフォルトの名無しさん
2007/09/20(木) 20:34:52今までは動いてたけど、それが変わるとダメになったとかな
0696デフォルトの名無しさん
2007/09/20(木) 21:29:050697デフォルトの名無しさん
2007/09/20(木) 21:31:53「printf一杯入れたら治った!」
とか言ってるアホがいたなぁ
0698デフォルトの名無しさん
2007/09/20(木) 21:56:170699デフォルトの名無しさん
2007/09/20(木) 21:57:30同じだよ。
0700デフォルトの名無しさん
2007/09/20(木) 21:57:32return 0;//正常
0701デフォルトの名無しさん
2007/09/20(木) 21:57:440702デフォルトの名無しさん
2007/09/20(木) 21:59:12sizeof unary-expression
sizeof ( type-name )
0703デフォルトの名無しさん
2007/09/20(木) 22:07:14どういうこと? 下のほうが正しいの?
0704デフォルトの名無しさん
2007/09/20(木) 22:10:22b = ((a) + (1)); // 話ししたくない人
0705デフォルトの名無しさん
2007/09/20(木) 22:10:52sizeof(int); // マル
int i; sizeof i; // マル
0706デフォルトの名無しさん
2007/09/20(木) 22:10:55ただ括弧付きなのは冗長
0707デフォルトの名無しさん
2007/09/20(木) 22:11:03int a = 0;
と同じ。本来括弧は不要。だが、括弧があっても当然値は変わらないので問題はない
0708デフォルトの名無しさん
2007/09/20(木) 22:11:08...
(((f())));
0709デフォルトの名無しさん
2007/09/20(木) 22:11:42無くてもいいのにつけてるってことだと思われ。
まあ、どっちでもいい。
気にすることはない。
0710デフォルトの名無しさん
2007/09/20(木) 22:18:310711デフォルトの名無しさん
2007/09/20(木) 22:19:50return(0)は 古い書き方 って、確か昔読んだ本に書いてあった気がする。
察するに制御構文の一種として考えると ... if(1), switch(2), while(3), for(;;)
みんなカッコ付いてるから合わせてんじゃないか?
0712デフォルトの名無しさん
2007/09/20(木) 22:22:220713デフォルトの名無しさん
2007/09/20(木) 22:45:530714デフォルトの名無しさん
2007/09/20(木) 23:51:19UNIX上で、dateコマンドの代替になるプログラムをCで作りたいのですが、
strftime関数に(char *)0を渡したときに戻すデフォルトの出力が
普通にコマンドラインからdateコマンドを実行した時の出力と
異なってしまいます。
(具体的には、日付の日本語表示などのロケールが適用されてない)
マニュアルには「デフォルトは%cと同義」とあるのですが…
strftime関数にロケールを反映させる方法は無いのでしょうか?
0715デフォルトの名無しさん
2007/09/21(金) 00:03:400716デフォルトの名無しさん
2007/09/21(金) 00:05:54#include <stdio.h>
#include <time.h>
#include <locale.h>
void main(void)
{
time_t t;
struct tm *date;
char str[256];
t = time(NULL);
date = localtime(&timer);
setlocale(LC_ALL, "");
strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date);
printf("%s\n", str);
}
0717デフォルトの名無しさん
2007/09/21(金) 03:46:42_wfopenの所にある
if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
↑ ↑
この「L」ってどういう意味合いなんですか?
0718デフォルトの名無しさん
2007/09/21(金) 03:48:000719デフォルトの名無しさん
2007/09/21(金) 03:56:39void func(int cnt)
{
int a[cnt];
...
}
int a[cnt]; の行でエラーが出ます。C++ではできないがCではできると聞きました。でもコンパイルできません。
BCBで上記のエラーメッセージは「C++エラー」とでるので、CでなくC++としてコンパイルされてる模様です。
Cとしてコンパイルするにはどうしたらいいのでしょうか。このソースの拡張子は .c なんですが。
0720デフォルトの名無しさん
2007/09/21(金) 03:58:340721デフォルトの名無しさん
2007/09/21(金) 03:59:28大人しくmalloc使っとけ
0722デフォルトの名無しさん
2007/09/21(金) 04:00:34動的配列を使いたいなら、C なら malloc() 、C++なら new を使え。
0723デフォルトの名無しさん
2007/09/21(金) 05:00:16その形で配列を宣言するにはコンパイル時に要素数が定まってないとだめだよ
0724デフォルトの名無しさん
2007/09/21(金) 05:12:100725デフォルトの名無しさん
2007/09/21(金) 05:20:540726デフォルトの名無しさん
2007/09/21(金) 05:43:110727デフォルトの名無しさん
2007/09/21(金) 07:30:58C++ の動的配列は std::vector だろ。
0728デフォルトの名無しさん
2007/09/21(金) 09:37:33>Cとしてコンパイルするにはどうしたらいいのでしょうか。
bcc32 -c func.cでobjファイル作ってobjファイルをプロジェクトに突っ込むしかなかった希ガス
BCBはC99対応してないからどのみちコンパイルは通らないけど
0729デフォルトの名無しさん
2007/09/21(金) 10:29:21文字列A,文字列B,数値データで入っているファイルがあるんですが
こんなの↓
strA1,strB1,0.76
strA2,strB2,0.80
strA3,strB3,0.72
...(ウン万行)
このデータを3列目の数値データをキーにソートして、上位100個程度を取り出したいです。
C++のpartial_sortを使えば良さそうだと思ったのですが、数値データをキーに他データも並べ替える方法があれば教えてください
C,C++に限らずある程度高速にソートできる手段があればなんでもかまいません
0730デフォルトの名無しさん
2007/09/21(金) 10:51:380731デフォルトの名無しさん
2007/09/21(金) 10:58:32母数が大きくて上位100件なら全件ソートしない方法の方が速いかもしれない。
まず100件読み込む。適当なアルゴリズムでソート。
次の1件を読み込み100番目より上位ならば100番目を削除して挿入ソート。
同順位の扱いが必要ならもう一工夫必要にはなる。
0732デフォルトの名無しさん
2007/09/21(金) 11:01:510733デフォルトの名無しさん
2007/09/21(金) 11:02:56数値データのファイルサイズはどのくらいになる?
サイズによってはデータを全てメモリに読み込んでから
処理したほうが早くなるので
0734デフォルトの名無しさん
2007/09/21(金) 11:24:30#include <string>
#include <vector>
#include <list>
#include <pstade/oven/algorithm.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <pstade/oven/sorted.hpp>
#include <pstade/oven/copied_to.hpp>
#include <pstade/oven/foreach.hpp>
struct Data {
std::string strA;
std::string strB;
int nA;
int nB;
};
int main(int,char*[]) {
namespace bll = boost::lambda; namespace oven = pstade::oven;
typedef boost::shared_ptr<Data> pData;
std::list<pData> src_data;
std::vector<pData> dest_data;
PSTADE_OVEN_FOREACH
( i, src_data |
oven::sorted(bll::bind(&Data::nA, *bll::_1) > bll::bind(&Data::nB, *bll::_2)) )
{ dest_data.push_back(i); }
}
その辺のオープンソースライブラリを使って作ってみました
よければ実験してください><
0735デフォルトの名無しさん
2007/09/21(金) 11:25:58なるほど、そういう方法も考えてみます
>>733
おおよそ10Mのセットをまたいくつかソートする必要あります
Rという解析ソフトで値を全部変数にぶっこんで処理させると、3Gのメモリもスワップにつっこむ有様す
0736デフォルトの名無しさん
2007/09/21(金) 12:32:190737デフォルトの名無しさん
2007/09/21(金) 13:29:28手間はないけど、処理速度は期待できないよね
0738デフォルトの名無しさん
2007/09/21(金) 19:34:440739デフォルトの名無しさん
2007/09/21(金) 19:50:43sscanf( str, "%d", &data );
こうやってsscanfを使うとき、time_t型に対応する変換指定子は普通何を使うもんなんでしょうか??
%dで問題は無いものの、warningが出て気持ち悪いです。
キャストして
sscanf( str, "%d", (int *)&data );
にすればwarningは出なくなるんですが、、、
0740デフォルトの名無しさん
2007/09/21(金) 20:26:31処理系によって 32 ビットだったり 64 ビットだったりするので、そういう使い方は無理。
やるとすれば
time_t data;
long long x;
sscanf(str, "%lld", &x);
data = (time_t) x;
とかかな。
0741デフォルトの名無しさん
2007/09/21(金) 20:32:33[2] 問題文(含コード&リンク):
#include <stdio.h>
int main(void)
{
int num;
printf("整数:"); scanf("%d",&num);
if (num)
printf("その数は0ではない。");
else
printf("その数は0。");
return (0);
}
をif分ではなく、条件演算子を用いて書き換えよ。
[3] 環境:Windows Bcc C
[4] 期限: (2007年9月25日まで)
[5] その他の制限:
0742デフォルトの名無しさん
2007/09/21(金) 20:32:500743デフォルトの名無しさん
2007/09/21(金) 20:50:400744デフォルトの名無しさん
2007/09/21(金) 20:59:53__closureとか__finallyとか__delphiclassとか
0745デフォルトの名無しさん
2007/09/21(金) 21:01:200746デフォルトの名無しさん
2007/09/21(金) 21:05:210747デフォルトの名無しさん
2007/09/21(金) 21:07:35どこの世界の話?
0748デフォルトの名無しさん
2007/09/21(金) 22:13:16わかんない。
とりあえず、知らないなら黙ってて。
0749デフォルトの名無しさん
2007/09/21(金) 22:13:22そっちのがいいな
0750デフォルトの名無しさん
2007/09/22(土) 00:41:21timer_startだとエスパーしてみる。
0751デフォルトの名無しさん
2007/09/22(土) 02:48:240752デフォルトの名無しさん
2007/09/22(土) 02:49:41そう言ったやつに聞けよ。
何かの間違いだと思うけどね。
0753デフォルトの名無しさん
2007/09/22(土) 03:11:24一般的にstaticがない(=自動変数)場合はスタックに確保される。
一般的にstaticをつければヒープに確保される。
スタックはヒープに比べ容量が小さいのが普通。
よって、大きな配列などだと確保できない可能性が出てくる。
ってな感じの理由だと思う。
環境によって異なるだろうし、じゃあでかいのは全部ヒープに確保すれば
万事解決かっていやそうでもないだろうし、一概に絶対なんてことは言えないとは思う。
0754デフォルトの名無しさん
2007/09/22(土) 03:25:03それに確保する時の処理がスタックの方が早いとは思うが
容量が違うって訳分からんぞ。
0755デフォルトの名無しさん
2007/09/22(土) 03:40:47(やっぱ使ってないと徐々に忘れていくのかね・・・)
謝罪ついでに参考になりそうなURL
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050096.txt
0756デフォルトの名無しさん
2007/09/22(土) 03:41:04???
0757デフォルトの名無しさん
2007/09/22(土) 03:45:33とりあえず
#include<stdio.h>
main(){
char str[256][256][256];
memcpy( str,"hello,world", sizeof(str));
printf("%s\n", str);
}
を動かしてみろ。コンパイルは通るがたぶん動かない。
次に、charの前にstaticを付けてみれ。
staticの有る無しで、strが収まる場所が変わる。staticが無い場合に格納される所は、
大きさの制限が厳しい。
0758デフォルトの名無しさん
2007/09/22(土) 03:46:43それ言ったらこのスレの意味ねーだろが
0759デフォルトの名無しさん
2007/09/22(土) 03:54:45そう言ったやつに聞かないのは、何故でしょうか??
0760デフォルトの名無しさん
2007/09/22(土) 03:58:530761デフォルトの名無しさん
2007/09/22(土) 05:18:38のような文字列から、1文字ずつ機械的に取り出す方法はありあせんか?
s[0]、s[1]はできても、s[2]はできないので困っています。
0762デフォルトの名無しさん
2007/09/22(土) 05:23:44全体的にunicodeに統一してみたら?
0763デフォルトの名無しさん
2007/09/22(土) 05:30:39UTF-8やUTF-16は一文字ずつ扱いにくいので、1文字=1要素のUTF-32とかUCS-4にするってこと?どうやってリテラル書くの?
0764デフォルトの名無しさん
2007/09/22(土) 05:33:460765デフォルトの名無しさん
2007/09/22(土) 07:49:39#include <iostream>
int main(){
std::wcout.imbue( std::locale("") );
std::wstring s = L"0aあい";
std::wcout << s.substr(2,3);
}
でそれっぽい事はできたけど環境によってはコンソールで文字化けする
0766デフォルトの名無しさん
2007/09/22(土) 10:24:30結合文字列があるから結局1要素1文字とは限らない。
0767デフォルトの名無しさん
2007/09/22(土) 10:33:030768ICU
2007/09/22(土) 10:36:480769デフォルトの名無しさん
2007/09/22(土) 10:53:31ICUのUCharはUTF-16なので、処理系のwchar_tと異なる場合には
ワイド文字リテラルが使いにくいという悩ましさもある。
0770デフォルトの名無しさん
2007/09/22(土) 11:00:28sizeof(type) * (プログラマからは見えない、確保された要素数)
の分だけのバイトを開放するという挙動でしょうか?
0771デフォルトの名無しさん
2007/09/22(土) 11:05:09すみません。無視してください。
0772デフォルトの名無しさん
2007/09/22(土) 15:43:18完全に書き込まれる前に終了してしまうんですが
何か良い方法ないですか?
バッファをフラッシュするだけでは不十分ですかね?
0773デフォルトの名無しさん
2007/09/22(土) 15:45:42Win32API なら終了前に WaitForSingleObject
0774デフォルトの名無しさん
2007/09/22(土) 15:56:36環境も言語もファイルの読み書きの手段も何もわからんが、
取り合えず、ファイルはちゃんとクローズしてんのか?
stdioのようなものでは、明示的にユーザがフラッシュせずとも、
クローズ時にユーザメモリ側のバッファはフラッシュされる。
が、OSカーネル側でも普通はバッファリングされている。
ダーティページをディスクにいつ書くかはOSの都合による。
ファイルの開き方によってその辺は変わることもあるし、色々だ。
その辺の制御を細かくやる必要があるのなら、
stdioやiostreamsなんてものは使うな。
あーそれと、VC++なら、CreateThread()は使うな。
_beginthreadex()にしとけ。
0775デフォルトの名無しさん
2007/09/22(土) 16:11:21posix なら pthread_join
0776722
2007/09/22(土) 16:42:52基本的にWin32API使ってます。
またご指摘通り_beginthreadex()にしてます。
WaitForSingleObjectでINFINITYにしてやってみましたが、やっぱり書き込まれてないです。
ファイルのクローズはしていて、ダメ押しでフラッシュしているんですが…。
0777デフォルトの名無しさん
2007/09/22(土) 16:43:28プログラミングやめちまえ
0778772
2007/09/22(土) 16:44:140779デフォルトの名無しさん
2007/09/22(土) 16:58:00プロセスが終了しているのではないだろうか。
0780デフォルトの名無しさん
2007/09/22(土) 17:01:44んじゃ、実験的にメインスレッドを終了しないでキー入力待ちで放っておいたら書き込まれるか試して味噌。
0781デフォルトの名無しさん
2007/09/22(土) 17:07:58#include<windows.h>
#include<stdio.h>
#include<process.h>
void write_file(void *dummy){
char *filename="write.txt";
FILE *fp;
fp=fopen(filename, "w");
if(fp!=NULL){
fprintf(fp, "File write start ... ");
Sleep(5000);
fprintf(fp, "finish!\n");
fclose(fp);
}
_endthread();
}
int main(void){
HANDLE th;
th=(HANDLE)_beginthread(write_file, 0, NULL);
Sleep(1000);
WaitForSingleObject(th, INFINITE); // この行をコメントアウトするかどうかで動作が変わるよ
printf("\nmain finished.\n");
return 0;
}
0782デフォルトの名無しさん
2007/09/22(土) 17:24:53実行はできるが問題あるコードだ
例えば
#include<stdio.h>
#include <string.h>
main(){
char str[256][256][256];
char hello[] = "hello,world";
memcpy( str[0][0], hello, sizeof(hello));
printf("%s\n", str[0][0]);
}
0783デフォルトの名無しさん
2007/09/22(土) 17:33:20それって正しく動くと保障されるのかな?
_beginthread()ってスレッド終了時に自分でスレッドハンドル閉じてしまう
んじゃなかったっけ?
0784781
2007/09/22(土) 17:35:100785772
2007/09/22(土) 17:36:590786781
2007/09/22(土) 17:42:26#include<windows.h>
#include<stdio.h>
#include<process.h>
unsigned __stdcall write_file(void *dummy){
char *filename="write.txt";
FILE *fp;
fp=fopen(filename, "w");
if(fp!=NULL){
fprintf(fp, "File write start ... ");
Sleep(5000);
fprintf(fp, "finish!\n");
fclose(fp);
}
_endthreadex(0);
return 0;
}
int main(void){
HANDLE th;
unsigned thId;
th=(HANDLE)_beginthreadex(NULL, 0, write_file, NULL, 0, &thId);
Sleep(1000);
WaitForSingleObject(th, INFINITE); // この行をコメントアウトするかどうかで動作が変わるよ
CloseHandle(th);
printf("\nmain finished.\n");
return 0;
}
0787デフォルトの名無しさん
2007/09/22(土) 17:43:210788デフォルトの名無しさん
2007/09/22(土) 17:44:18{
object o;
return o;
}
みたいな書き方って、メソッド内のオブジェクトは破壊されるよね?
std:stringとかはどうやってそこらへんを解決してるの?
0789776
2007/09/22(土) 17:46:25>>781 のような形で書いているんですけどね…。
現状では、完全に書き込まれることもあれば、
中途半端なままファイルが生成されてしまうこともある、といった状況です。
しかし、スレッドの終了直前で、ブレークポイントやMessageBoxで時間稼ぎすると
完全に書き込まれるようです。
また、メインスレッドはサブスレッドの終了にともなってすぐに終了することはないです。
0790776
2007/09/22(土) 17:47:44・メインダイアログからウィザードを呼び出す
・ウィザード上で実行ボタンを押すと別スレッドでファイル処理
・ファイル処理が完了すると同時にウィザードを閉じてメインダイアログに戻る
といった感じの処理です。
メインダイアログでオブジェクトの実体を保持しているので、
プログラムを終了するまでは元のデータは残っているはずです。
0791デフォルトの名無しさん
2007/09/22(土) 17:49:58CreateFile()でFILE_FLAG_WRITE_THROUGHを指定するか
最後にFlushFileBuffers()を呼んだらどうかな
0792デフォルトの名無しさん
2007/09/22(土) 17:50:46書き込みが終わる前にメインスレッドの方でファイルを閉じてたりしない?
0793デフォルトの名無しさん
2007/09/22(土) 17:52:23>みたいな書き方って、メソッド内のオブジェクトは破壊されるよね?
はい。そこに何か問題はありますか?
# 勿論、objectがコピーされるコストは掛かるけれど。
0794デフォルトの名無しさん
2007/09/22(土) 17:57:50C++では参照だけが呼び出し側に渡されるんではなくて、オブジェクトが
コピーされるんだよ(参照を戻すように明示的に書くことも出来るけど)。
だから元が壊されても問題はない。
勿論正しくコピーが動作するようにクラスを書かなければいけないし、
コピーのコストはかかるがね。場合によっては最適化によって
コピーが削られることもある(それが言語仕様のレベルで認められている)が、
あまり過大な期待はしないように。
コピーのコストがバカにならないようなら、古き良き引数での参照渡しを
検討したほうがいいだろう。
0795デフォルトの名無しさん
2007/09/22(土) 17:58:120796790
2007/09/22(土) 17:59:25772で言っていたのはFlushFileBuffers()のことです。
ファイルをクローズする前に入れていました。。
FILE_FLAG_WRITE_THROUGHは試してないのでやってみます。
>>790
ファイルの操作はサブスレッドにすべて任せているのでそれはないです。
0797デフォルトの名無しさん
2007/09/22(土) 18:02:12コピーが終わった後だから、そうだと思うよ
0798デフォルトの名無しさん
2007/09/22(土) 18:02:45test* clone()
{
new test(*this);
}
とかせんか?
0799デフォルトの名無しさん
2007/09/22(土) 18:04:10newの前にreturn忘れた
0800デフォルトの名無しさん
2007/09/22(土) 18:05:030801デフォルトの名無しさん
2007/09/22(土) 18:05:510802デフォルトの名無しさん
2007/09/22(土) 18:06:20それが適切な場面ではそうすればよいが
そうでなければコピーはコピーコンストラクタにやらせるのがC++の流儀だと思う
継承とポリモーフィズムを多用したコードなら、そうしたコードを
書きたくなることが多いかもしれない
0803デフォルトの名無しさん
2007/09/22(土) 18:10:01ハンドルクラスを作るときにはやるときがある
とくに継承関係があるクラスに対して
0804788
2007/09/22(土) 18:20:52フィールドに参照持たせた場合は
shallow or deepに気をつけんと死ねそうだね
0805デフォルトの名無しさん
2007/09/22(土) 18:42:44woutとかICUって初めて聞きました。
調べてみます。
ありがとうございます。
0806デフォルトの名無しさん
2007/09/22(土) 19:29:10100% Windows ではなく 790 の作ったプログラムのバグだと思う。
再現できるコードを見せられますか?
0807796
2007/09/22(土) 19:32:58すいません、解決しました。
どうもスレッドにファイル処理クラスのポインタを渡して操作していたのが良くないようです。
スレッド内で生成する方法に変えたら
ファイルに書き込み終わってから終了するようになりました。
↓こんな感じで
UINT __stdcall ThreadProc(LPVOID pParam){
// CFileCtrl *hoge = (CFileCtrl*) pParam;
CFileCtrl hoge;
// hoge->Write();
hoge.Write();
...
}
みなさんどうもありがとうございました。
0808デフォルトの名無しさん
2007/09/22(土) 19:36:27親スレッドのほうで元のCFileCtrlオブジェクトを先に解放してたとか?
0809デフォルトの名無しさん
2007/09/22(土) 19:54:11マルチコア/マルチプロセッサのPCで試験したほうがいいよ
問題のあるコードでもシングルコアでは普通に動いてしまうこともある
0810デフォルトの名無しさん
2007/09/22(土) 19:58:40死んだほうがいいよ
問題のあるコードで世界一恨まれることもある
0811デフォルトの名無しさん
2007/09/22(土) 20:02:11パフォーマンスが落ちないように作らない?
綺麗にスケールするよう心がけて。
0812デフォルトの名無しさん
2007/09/22(土) 20:07:29それはそうだな。
全然C/C++ではないが、今日PythonでJavaのPipedStreamモドキをこしらえて、
それを使ってマルチスレッドでフィルタをパイプライン風にチェインして
並行処理をするようなプログラムを書いた。
俺の貧弱なシングルコアのノートでは、綺麗にスケールどころか
無駄にオーバーヘッドがデカくて、単にシングルスレッドで直列で
処理させたほうが格段に高速だったよ。
0813デフォルトの名無しさん
2007/09/22(土) 20:46:45昇順に並んでいる連結リストに要素を挿入する関数が以下のように書かれていました
/* List 5.3 関数insert */
#include <stdlib.h> /* @@@@ */
struct CELL {
struct CELL *next;
int value;
} header;
insert(int a)
{
struct CELL *p, *q, *new;
/* 挿入すべき場所を探す */
p = header.next;
q = &header;
while (p != NULL && a > p->value) {
q = p;
p = p->next;
}
/* セルを挿入する */
if ((new = malloc(sizeof(struct CELL))) == NULL)
new->next = p;
new->value = a;
q->next = new;
}
0814デフォルトの名無しさん
2007/09/22(土) 20:47:29ポインタ一つで可能な気がしたので、自分で以下のように書いてみたんですが
insert2(int a) {
struct CELL *p, *new;
/* 挿入すべき場所の直前の要素を探す */
for (p = &header; p->next != NULL && p->next->value < a; p = p->next)
;
/* セルを挿入する */
if ((new = malloc(sizeof(struct CELL))) == NULL)
fatal_error("メモリが足りません");
new->next = p->next;
new->value = a;
p->next = new;
}
正直、違いが解りません
何故ポインタは二つ必要なのでしょうか
0815デフォルトの名無しさん
2007/09/22(土) 20:57:27同じアルゴリズムを実現するのに、書き方がひとつしかないなんてことはない
書きやすい&読みやすい方をどうぞ
0816デフォルトの名無しさん
2007/09/22(土) 22:07:14headerは基点を表すだけの変数なので、本来値(value)は不要であり
CELLの実体でなくポインタで十分
この場合、コードは以下のようになり、pおよびqの2変数を使うのがよくあるやり方
(実際にはこの例でも1変数でできないことはないが若干記述がややこしくなり入門書として不適)
本の筆者が途中でコードを簡略化しようとしてheaderをポインタからCELLの
実体にしたとき、見直しが不十分だったと勝手に推測してみる
struct CELL* header = NULL;
…
struct CELL *p, **q;
p = NULL;
q = &header;
while (p != NULL && a > p->value) {
q = &p->next;
p = p->next;
}
if ((new = malloc(sizeof(struct CELL))) == NULL)
new->next = p;
new->value = a;
*q = new;
}
0817816
2007/09/22(土) 22:21:20mallocの後に
fatal_error("メモリが足りません");
が抜けてる
0818デフォルトの名無しさん
2007/09/23(日) 11:11:010819デフォルトの名無しさん
2007/09/23(日) 12:37:040820デフォルトの名無しさん
2007/09/23(日) 12:41:170821816
2007/09/23(日) 12:53:53×p = NULL;
○p = header;
10年くらい前、開発環境がVC++に移る前はこんなリスト操作を量産して
したので懐かしくて動作確認もせずに適当に書いてしまった
ちょっとボケはじめているようです
0822デフォルトの名無しさん
2007/09/23(日) 12:55:16こんな関数を作ってるのですが
map::insertの引数が const参照になってます。
この関数のローカル変数をinsertしても、
関数から抜けたら消えてしまいますか?
0823デフォルトの名無しさん
2007/09/23(日) 13:08:47問題ない
map<string, string> は自分で実体を管理すると宣言しているわけので、
insert した時のパラメタがそのまま格納されるわけではない
0824デフォルトの名無しさん
2007/09/23(日) 16:00:43関数で数値を変更してreturnで返す時、たくさん返すにはどうすればよいのでしょうか?
配列を使う事を考えたのですが、それだと結局たくさんの変数全てに代入していかないといけなくなると思います
もっと効率の良い方法はないのでしょうか?
0825デフォルトの名無しさん
2007/09/23(日) 16:03:580826デフォルトの名無しさん
2007/09/23(日) 16:04:58初期化関数に構造体のポインタを渡す
関数内で初期値を代入する
0827デフォルトの名無しさん
2007/09/23(日) 16:17:38やってみます
ありがとうございました
0828デフォルトの名無しさん
2007/09/23(日) 16:54:570829デフォルトの名無しさん
2007/09/23(日) 17:02:140830デフォルトの名無しさん
2007/09/23(日) 17:22:160831デフォルトの名無しさん
2007/09/23(日) 19:23:17オレのビール返せw
0832デフォルトの名無しさん
2007/09/23(日) 19:29:150833デフォルトの名無しさん
2007/09/23(日) 19:31:090834デフォルトの名無しさん
2007/09/23(日) 20:44:090835デフォルトの名無しさん
2007/09/23(日) 20:48:290836デフォルトの名無しさん
2007/09/23(日) 20:50:070837デフォルトの名無しさん
2007/09/23(日) 20:51:27全てのメンバ変数に対してそれぞれ operator= を実行することと同じですか?
それとも、ただの memcpy ですか?
0838デフォルトの名無しさん
2007/09/23(日) 20:59:33コピーコンストラクタはそれぞれのコピーコンストラクタ。
コピー代入演算子はそれぞれのコピー代入演算子。
0839デフォルトの名無しさん
2007/09/23(日) 21:42:44st_b->st_a->メンバ
みたいにアクセスしたいのですが、それぞれどうやってtypedefすればいいでしょうか?
0840デフォルトの名無しさん
2007/09/23(日) 21:44:57さっぱりわからんが、それは typedef で解決する問題なのか?
0841デフォルトの名無しさん
2007/09/23(日) 21:54:37すみません、自己解決しました。
typedef {
int i;
st_a_t *st_a;
} st_b_t;
typedef {
int j;
} st_a_t;
st_a_t *p;
st_b_t *st_b;
st_b->st_a = p;
printf("%d", st_b->st_a->j);
みたいなことがやりたかったのですが、先にst_aへのポインタを宣言して、
それをst_b->st_aへ代入すればいいんですね。
0842デフォルトの名無しさん
2007/09/23(日) 22:07:01st_b_tの前でst_a_tを宣言品。
0843841
2007/09/23(日) 22:12:31適当に書いちゃいました。一応誰が見るかわからないので、修正しておきますね…
typedef struct {
int j;
} st_a_t;
typedef struct {
int i;
st_a_t *st_a;
} st_b_t;
st_a_t *p;
st_b_t *st_b;
st_b->st_a = p;
st_b->st_a->j = 123;
printf("%d", st_b->st_a->j);
return 0;
0844デフォルトの名無しさん
2007/09/24(月) 01:21:15あるところから、停止している時間が短くなりません。
・・・
int sec=1; //この値を色々変えている
struct timespec treq, trem;
treq.tv_sec = (time_t)0;
treq.tv_nsec = (time_t)sec;
と定義して、nanosleep(&treq, &trem) をfor()文中で使用しているという
状況です。
詳しく調べていないのですが、見た目では、
sec=999999999 からら secの値を下げていくと、だいたい、
sec=9999999 より値が小さいと、停止時間が一定となってしまいます。
sec=9999999 でも、sec=1 でも停止時間が同じです。
使い方が間違っているのでしょうか?
0845デフォルトの名無しさん
2007/09/24(月) 01:24:340846デフォルトの名無しさん
2007/09/24(月) 01:26:56Red Hat Enterprise Linux 3 です。
0847デフォルトの名無しさん
2007/09/24(月) 01:32:22http://www.linux.or.jp/JM/html/LDP_man-pages/man2/nanosleep.2.html
>現在の nanosleep() の実装は普通のカーネルのタイマ機構に基づいている。
>カーネルのタイマ機構は 1/HZ 秒の分解能をもっている (time(7) 参照)。
>このため、 nanosleep() は少なくとも指定された時間必ず停止するが、
>プロセスが再び実行できるようになるまでに指定された時間より最大 10 ms 余計にかかる。
0848デフォルトの名無しさん
2007/09/24(月) 01:38:320849デフォルトの名無しさん
2007/09/24(月) 01:40:130850デフォルトの名無しさん
2007/09/24(月) 02:11:19ありがとうございます。
あんまり使いたくないですが、
for()で一時停止(っぽく)します。
0851デフォルトの名無しさん
2007/09/24(月) 02:32:00(とりあえずしちゃいますが)
VC6.0でSDKを使ってボタンを2つ配置したウィンドウを作っています。
そのとき、ボタンのウィンドウプロシージャだけを別にしたくて
サブクラス化しているのですが、どこのHPを探してもボタンを2つ配置した
場合、ウィンドウプロシージャも、そのボタン用として2つになっています。
これを1つにすることはできないのでしょうか?
何がしたいかというと、ボタンやエディットボックスなどを複数個配置しても、
ウィンドウプロシージャは、メインのプロシージャと、ボタン用のプロシージャ
エディットボックス用のプロシージャ、というようにしたいのです。
0852デフォルトの名無しさん
2007/09/24(月) 02:36:190853デフォルトの名無しさん
2007/09/24(月) 02:56:27間違いなくあんたより初心者はわんさかいる。
0854デフォルトの名無しさん
2007/09/24(月) 02:57:140855デフォルトの名無しさん
2007/09/24(月) 03:00:00キーワードありがとうございます!また調査ができます!
>>853さん
いるかもしれませんが、いろいろな掲示板を見ていると痛感します。
理解できないことが多すぎです。
0856デフォルトの名無しさん
2007/09/24(月) 03:01:48for()にでかい値を与えてループさせることで10ms以下の間隔を得る方法より、
もっと効率が良い、リソースの消費が少ないというような方法はありますか?
0857デフォルトの名無しさん
2007/09/24(月) 03:10:59間違いなくあんたより初心者は>>853だけ。
0858デフォルトの名無しさん
2007/09/24(月) 03:28:20>for()にでかい値を与えてループさせる
再現性もないし、うっかり最適化すると消えてなくなるぞ。
カーネルを再コンパイルする気があるなら、切り換え時間を10msより短くできたと思うがお勧めしない。
0859デフォルトの名無しさん
2007/09/24(月) 11:44:48> 1/HZ 秒の分解能をもっている
昔はHZが100だったので10ms余計にかかるんですね。
このHZが例えば1000だっt
0860デフォルトの名無しさん
2007/09/24(月) 11:47:31ウィンドウプロシージャって何?
0861デフォルトの名無しさん
2007/09/24(月) 12:02:050862デフォルトの名無しさん
2007/09/24(月) 12:07:44http://pc11.2ch.net/test/read.cgi/tech/1190555031/
0863デフォルトの名無しさん
2007/09/24(月) 12:35:35基礎から学ぼうと思ってるんですが、プロジェクトは何を選んだらいいんですかね?
0864デフォルトの名無しさん
2007/09/24(月) 12:36:130865デフォルトの名無しさん
2007/09/24(月) 13:34:110866デフォルトの名無しさん
2007/09/24(月) 14:28:34例えば CFoo と言うクラスがあったとして
CFoo foo;
と宣言するのと
CFoo* foo = new CFoo();
と宣言するのとの違いが良く把握できません。
後者はインスタンス作成と同時にコンストラクタを呼び出して、
インスタンスのポインタを foo に代入しているんですよね?
で、前者の方はCFoo型の変数 foo は宣言のみで中身はカラッポかと思いきや、
. でメンバ変数やメンバ関数にアクセスできますし・・・
これがよく判りません。これはどういう扱いになってるのでしょうか?
0867デフォルトの名無しさん
2007/09/24(月) 14:29:500868デフォルトの名無しさん
2007/09/24(月) 14:30:520869デフォルトの名無しさん
2007/09/24(月) 14:31:04寿命が違う。
コンパイラの実装の仕方は必ずしも同じでないが、
スタックとヒープの違いで説明されることが多い。
そのあたりの用語でググれば妥当な解説が見つかるだろう。
0870デフォルトの名無しさん
2007/09/24(月) 14:34:14C++では、必要がない限り前者を使えば充分です。
0871デフォルトの名無しさん
2007/09/24(月) 14:39:57即レスどうもです。
スタックとヒープですか・・・早速ググってみました。
つまり、前者の場合は
スタックにインスタンスが作成され、
関数の終了(グローバルならプラグラムの終了?)にインスタンスは削除される
後者の場合は、
ヒープにインスタンスが作成され、
明示的に削除(deleteですよね?)しない限りインスタンスは削除されない?
と言う認識でいんでしょうか・・・?
と言う事は、後者の場合はキチンとしないとメモリリークしまくりって事なんですかね?
0872デフォルトの名無しさん
2007/09/24(月) 14:41:12きちんと解説読め
0873デフォルトの名無しさん
2007/09/24(月) 14:41:39心配することないです
0874デフォルトの名無しさん
2007/09/24(月) 14:44:36正確には関数ではなくスコープが切れたらだけど。
ループ構造の複雑なプログラムだとエラい事になるな。
それを回避する為にjavaやC#なんかにはガーベジコレクションが用意されている。
0875デフォルトの名無しさん
2007/09/24(月) 14:47:20再度即レスどうもです。
とりあえずは>>870さんの言うとおり、前者を使っておけば問題ないと言う事なんですね。
気になる部分は焦らずに解説サイトじっくり読む事にします・・・。
ありがとうございました。
0876デフォルトの名無しさん
2007/09/24(月) 15:07:060877デフォルトの名無しさん
2007/09/24(月) 15:07:49なんかかっこいい
0878デフォルトの名無しさん
2007/09/24(月) 16:39:29関数の内部で定義した構造体を他の関数から呼び出すことは無理でしょうか?
やはりグローバルで定義しなければ呼び出せないのでしょうか?
よろしくお願いします。
0879デフォルトの名無しさん
2007/09/24(月) 16:41:210880デフォルトの名無しさん
2007/09/24(月) 16:42:43staticを付けて静的記憶領域に確保。
0881デフォルトの名無しさん
2007/09/24(月) 16:45:240882デフォルトの名無しさん
2007/09/24(月) 16:59:53関数の中で定義しようが、外で定義しようが
構造体を“呼び出す”ことはできない。
0883デフォルトの名無しさん
2007/09/24(月) 17:09:10struct bb{};
};
void function(){
aa;
aa::bb;
}
0884デフォルトの名無しさん
2007/09/24(月) 17:18:41http://pc11.2ch.net/test/read.cgi/tech/1190555031/
0885デフォルトの名無しさん
2007/09/24(月) 18:23:49端末エミュ:gnome-terminal
Shell:zsh 4.3.2
g++:4.1.2
日本語のディレクトリ名が文字化けせずに表示可能
以上の環境下で以下のコードをコンパイルし実行すると
#include <string>
#include <iostream>
int main(){
std::wcout.imbue( std::locale("ja_JP.utf8") );
std::wstring s = L"0aあ亜\n";
std::wcout << s;
}
0a??とコンソールが対応しているにもかかわらず文字が化けてしまいます
windowsではlocale("japanese")で上手くいったんですが…
文字化けさせずにワイド文字をコンソールに出力させる方法ってないんでしょうか?
0886デフォルトの名無しさん
2007/09/24(月) 18:24:19webで色々情報収集していたら
http://hw001.gate01.com/eggplant/tcf/cpp/forgotten.html
上記のページのexplicitの項について
>if(a == ArrayA(100)) {
>と解釈して、コンパイルを通してしまいます。
>これを防ぐためのキーワードが、explicitです。
とありましたが、Visual C++ 2005ではコンパイル不可でした。
ArrayAに関して変換関数やoperator==を実装することによって正しく動作
するのは把握してますがexplicitとは無関係だと思うのでArrayAの右辺値が
ArrayA型に非明示的に型変換されるということはありえないと考えてよろしいでしょうか?
0887886
2007/09/24(月) 18:33:58ArrayAのコンストラクタをint型を引数に取る変換コンストラクタとして利用し、
operator==の右辺値の引数としてArrayAをとる場合に、
>if(a == Arraya(100)
という解釈が行われるってことですかね。その変換コンストラクタにexplicitが
無い場合はコンパイルが通り、explicit付だと不可でした。
0888デフォルトの名無しさん
2007/09/24(月) 18:47:57>文字化けさせずにワイド文字をコンソールに出力させる方法ってないんでしょうか?
あります。
0889デフォルトの名無しさん
2007/09/24(月) 18:48:52>文字化けさせずにワイド文字をコンソールに出力させる方法ってないんでしょうか?
ないです。
0891デフォルトの名無しさん
2007/09/24(月) 19:00:02>それは標準ライブラリだけでできるでしょうか?
できます。
0892デフォルトの名無しさん
2007/09/24(月) 19:02:17>>890
>それは標準ライブラリだけでできるでしょうか?
できません。
0893デフォルトの名無しさん
2007/09/24(月) 19:13:10bool operator==(const ArrayA& r1, const ArrayA& r2);
があって(これは必要)、 r2を100で初期化するときに
const ArrayA& r2 = 100 を許すかどうかがexplicitによって決まる
引数を一つとるコンストラクタによる型変換を禁止するのがexplicit
この場合コンストラクタとして明示的に呼び出すことしか許されない
ArrayA a(123); みたいに
0895デフォルトの名無しさん
2007/09/24(月) 19:47:51>>892
つまりはこれはコードの問題じゃなくて、実行環境、コンパイル環境の問題ということですね?
まぁ確かに標準ライブラリのみ使用のコードがwindows cl.exeとLinux g++で違う動作をする
ってのはおかしいと思いましたが
0896デフォルトの名無しさん
2007/09/24(月) 19:51:48標準ライブラリも各ベンダが実装している。
Locale周りは結構動作がまちまちだよ。
0897デフォルトの名無しさん
2007/09/24(月) 20:07:48coLinuxのDebian serge環境(gcc 3.4.4)という怪しげな環境で試してみたが
imbue()効かないようだな。
std::locale::global()で設定してやるとおkだった。
VC++もこの辺未だに腐ってるし、localeまわりが完璧に動く環境って
あまり見ないが。
ああ、勿論g++のオプションでinput-charset, exec-charsetはちゃんと指定するのは
前提な。
0898デフォルトの名無しさん
2007/09/24(月) 20:12:270899デフォルトの名無しさん
2007/09/24(月) 20:14:34ワイド文字ってutf8でいいの?
0900デフォルトの名無しさん
2007/09/24(月) 20:14:510901デフォルトの名無しさん
2007/09/24(月) 20:17:17違う違う、それはchar側のエンコーディングだ
0902デフォルトの名無しさん
2007/09/24(月) 22:58:59http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4963.txt
上記のソースでポインタのポインタを関数にわたして
mallocでヒープ領域確保して値を代入して
関数から戻った後、値を確認しようとしたら
無効な領域にアクセスしてしまうようで、値を表示できません。
どなたか「ここが間違ってる」と指摘していただけませんでしょうか
お願いいたします。
0903デフォルトの名無しさん
2007/09/24(月) 23:01:060904デフォルトの名無しさん
2007/09/24(月) 23:01:280905デフォルトの名無しさん
2007/09/24(月) 23:05:26C++でリストボックスのに記載されている文字列を
選択・未選択に関わらず全て取得するにはどうすればよいでしょうか?
0906デフォルトの名無しさん
2007/09/24(月) 23:06:110907デフォルトの名無しさん
2007/09/24(月) 23:08:050908デフォルトの名無しさん
2007/09/24(月) 23:10:39>>897
>>897の方法ならどうやら上手くいくようです
この方法はvisual studioでは上手くいかなかった記憶があるんですが、
最近のgccだと上手くいくようですね
オプションの設定はgcc-4.1.2ではどうやら必要ないようです(g++ filenameという記述でも上手く動作した)
助言ありがとうございました
>>899
全然違うものという気もしますが
ワイド文字の型でutf-8コードを表示するって分には問題無いように思えます
0909デフォルトの名無しさん
2007/09/24(月) 23:13:04C++にリストボックスはないから・・・ちゃんと環境書いてくれ。
0910デフォルトの名無しさん
2007/09/24(月) 23:16:03ただのアホでカウント取得してループって方法が思い浮かばない
0911デフォルトの名無しさん
2007/09/24(月) 23:28:02すみません。環境はVisual C++ 2005です。
im = (int)SendMessage(GetDlgItemhDlg(hDlg, IDC_LIST), LB_GETCOUNT, 0, 0);
for(i=0;i<im;i++) {
SendMessage(GetDlgItem(hDlg, IDC_LIST), LB_SETCURSEL, i, 0);
GetDlgItemText(hDlg, IDC_LIST, data, sizeof(data));
MessageBox(hDlg, data, _T("確認"), MB_OK);
}
みたいにしてメッセージボックスで取得できたかどうか確認してるんですが、
文字列がカラッポです。何がいけないんでしょうか・・・?
リストボックスにはちゃんと値が入っています。
0912デフォルトの名無しさん
2007/09/24(月) 23:33:50LB_GETTEXT
0913デフォルトの名無しさん
2007/09/24(月) 23:45:05LB_GETTEXTと言うメッセージがあるんですね・・・。
助かりました。ありがとうございます。
0914デフォルトの名無しさん
2007/09/25(火) 00:12:30void test(char ****N,int n)
…
*N = (char ***)malloc(sizeof(char**)*n);
for(i = 0; i < n; i++)
(*N)[i] = (char **)malloc(sizeof(char*)*n);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
(*N)[i][j]= (char *)malloc(sizeof(char)*4);
}
}
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
sprintf((*N)[i][j],"%d",++k);
…
printf("%s ",(*N)[i][j]);
…
int main()
…
char ***N;
…
for(i = 0; i < k; i++){
for(j = 0; j < k; j++){
…
0915デフォルトの名無しさん
2007/09/25(火) 00:37:16ありがとうございました。
勉強になりました。
0916デフォルトの名無しさん
2007/09/25(火) 00:38:380917デフォルトの名無しさん
2007/09/25(火) 01:38:06どうやら参考書自体が間違ってるようです。どこが間違ってるのか教えていただけませんか?
参考書:これからはじめるC言語 基礎の基礎
コンパイラ:lsi-c ver3.30c (試食版)
#include <stdio.h>
#include <string.h>
/* 構造体の定義 */
struct person
{
char name[20]; /* 体重 */
double height; /* 身長 */
double weight; /* 体重 */
}
/* 関数のプロトタイプ宣言 */
int set_struct(struct person* p_dat);
/* main関数 */
int main(void)
{
/* 変数の宣言 */
struct person dat;
/* set_struct関数を実行 */
set_struct(&dat);
↓↓↓↓↓
0918デフォルトの名無しさん
2007/09/25(火) 01:38:37/* メンバーの値を出力 */
printf("%s\n", dat.name);
printf("%f\n", dat.height);
printf("%f\n", dat.weight);
return 0;
}
/* set_struct関数 */
int set_struct(struct person* p_dat)
{
/* 構造体のメンバーに値を代入 */
strcpy(p_dat->name, "山田太郎");
p_dat->height = 173.5;
p_dat->weight = 63.0;
return 0;
}
長文失礼いたしました。
0919デフォルトの名無しさん
2007/09/25(火) 01:39:56コンパイルエラーは何て言ってるの?
0920デフォルトの名無しさん
2007/09/25(火) 01:40:05エラー内容
c13:illegal type specifier combination
連レス失礼しました。
0921デフォルトの名無しさん
2007/09/25(火) 01:41:06struct person の定義の最後、セミコロンがない。
0922デフォルトの名無しさん
2007/09/25(火) 01:47:22ありがとうございましたコンパイルできました。こんな単純なミスで無駄にレス使ってすみませんでした。
参考書にはちゃんと書いてありました。単なる見落としです。
あなたはすぐにわかったのに、こんな間違いに気づかず2時間も悩み続け
挙句の果てに参考書のせいにした自分がとんでもなく情けないです・・・
0923デフォルトの名無しさん
2007/09/25(火) 01:55:410924デフォルトの名無しさん
2007/09/25(火) 02:21:21エラーメッセージに行数も出てるはずだからエラー1個とか単純なものなら
その周辺を探せばすぐ見つかることが多い。後メッセージの内容にも
'type'って書いてあるから型関連のエラーと当たりを付けることができる
(今回は少し違ったけども)。
0925デフォルトの名無しさん
2007/09/25(火) 03:34:56気にすんな
長いプログラム書いてても、しょーもないミスはするもんだ
ただ、そのしょーもないミスのレベルが経験重ねると
ミスのレベルも上がってくる。
ま、とりあえず気長にね
0926デフォルトの名無しさん
2007/09/25(火) 03:58:49気にしろ!
短いプログラム書いてても、しょーもないミスをするもんはする
ただ、そのしょーもないミスを経験重ねても繰り返してるなんて
いつまで経っても使えない奴。
ま、とりあえず死ね
0927デフォルトの名無しさん
2007/09/25(火) 05:32:14何おこってんの?
ミスのレベルも上がるって書いてるでしょ?
どこに同じミスを繰り返すって書いてる?
ま、いいや
お前も死ね
0928デフォルトの名無しさん
2007/09/25(火) 05:47:47どこに同じミスを繰り返すって書いてる?
ミスを繰り返すって書いてあるだけだぜ?
0929デフォルトの名無しさん
2007/09/25(火) 05:59:570930デフォルトの名無しさん
2007/09/25(火) 06:08:540931デフォルトの名無しさん
2007/09/25(火) 06:29:400932デフォルトの名無しさん
2007/09/25(火) 13:03:03int hoge[] = {1,3,5,6,7,9,};
int n;
for (int = i; i < n; i++) // n は要素数
{
cout << hoge[i];
}
のように順番に取り出したいのですが明示的にnを指定せずに
自動的に要素数を所得させたいのです
0933デフォルトの名無しさん
2007/09/25(火) 13:06:29http://pc11.2ch.net/test/read.cgi/tech/1185377587/892-925
0934デフォルトの名無しさん
2007/09/25(火) 13:11:52ありがとうございました
0935デフォルトの名無しさん
2007/09/25(火) 13:23:220936デフォルトの名無しさん
2007/09/25(火) 13:45:25> この方法はvisual studioでは上手くいかなかった記憶があるんですが、
VC++8.0(VS2005)ではそうだな
> オプションの設定はgcc-4.1.2ではどうやら必要ないようです
UTF-8なソースの場合は要らない、というだけだと思われ
0937デフォルトの名無しさん
2007/09/25(火) 14:04:24ありがとうございます
boostは便利そうなんですが、どんなものがあるのか
どんな事が出来るのか、またどうやって利用すれば良いのか
を知るまでが大変そうですね・・・
0938デフォルトの名無しさん
2007/09/25(火) 14:28:25やっぱり time.h 使うんですか?
0939デフォルトの名無しさん
2007/09/25(火) 14:31:37Cに対して時間に関しては特に追加のライブラリはない。
標準の範囲内では <time.h>, <ctime> で。
boost になんかあったかもね。
0940デフォルトの名無しさん
2007/09/25(火) 14:33:15どうもです
0941デフォルトの名無しさん
2007/09/25(火) 15:09:22それぞれの位置づけがよくわかんない
どれが標準でどれがセミ標準でどれが趣味なのか
体系付けて一覧できるHPってある?
0942デフォルトの名無しさん
2007/09/25(火) 15:18:51http://www.google.com/
0943デフォルトの名無しさん
2007/09/25(火) 15:22:480944デフォルトの名無しさん
2007/09/25(火) 15:25:560945デフォルトの名無しさん
2007/09/25(火) 15:31:25C++ ライブラリ 一覧 体系
で検索したけど駄目だったよ。
>>943
42らしいよ
0946デフォルトの名無しさん
2007/09/25(火) 16:09:19それ以外って何?
0947デフォルトの名無しさん
2007/09/25(火) 16:16:420948デフォルトの名無しさん
2007/09/25(火) 16:39:46スマートポインタとかなら#includeするだけで使えるしスゲー便利だから
その辺から徐々に使っていくといい。
0949デフォルトの名無しさん
2007/09/25(火) 16:52:58もう半年ぐらい費やしてるんですが、まだ「こういう機能があると知っている」程度にしか理解できてません
使いこなせるまでに死んでそうな気がします…
0950デフォルトの名無しさん
2007/09/25(火) 16:57:27それは確かなんだが、星の数ほどもある既存の道具を探して学ぶにも限度があるよな
0951デフォルトの名無しさん
2007/09/25(火) 17:23:55そこまで悩むなら自作した方が早くね?
0952デフォルトの名無しさん
2007/09/25(火) 18:22:31なぜtm_monは0〜11であり、
なぜtm_mdayは1〜31なのでしょうか。
どちらか一方にそろえる形で両方を0から起算、1から起算とするわけには
いかなかったのでしょうか。
0953デフォルトの名無しさん
2007/09/25(火) 18:25:050954デフォルトの名無しさん
2007/09/25(火) 18:29:530955デフォルトの名無しさん
2007/09/25(火) 18:49:08英語では月を 1, 2, ..., 12 と書くよりも January, February, ..., December のように書くので、
配列のインデックスとして直接使える方が良かった(例:↓)という説がある
const char *monthNames[12] = { "January", "February", ..., "December" };
printf("%s", monthNames[t.tm_mon]);
日は英語でも 1st, 2nd, ..., 31st のように書くので、1...31 そのままなんだろ、たぶん
0956デフォルトの名無しさん
2007/09/25(火) 21:01:400957デフォルトの名無しさん
2007/09/25(火) 21:33:23挙句の果てに「使ってから文句家」「自分で分解して調べろ」だろ。
これじゃどうしようもない
0958デフォルトの名無しさん
2007/09/25(火) 21:38:27ばらしながら使い方覚えないと駄目だしね
しかし教材として考えればなかなかいいかもしれん
膨大なMLにヒントは用意されているし
0959デフォルトの名無しさん
2007/09/25(火) 22:31:51これ、Borland Turbo C++ だとコンパイルできない。
g++だとできる。
"C++"を string("C++")にするとTurbo C++はコンパイルできる。
単なる実装の違いということ?
0960デフォルトの名無しさん
2007/09/25(火) 22:39:300961デフォルトの名無しさん
2007/09/25(火) 22:43:16コンパイラじゃなくてライブラリじゃないの?
0962デフォルトの名無しさん
2007/09/25(火) 22:45:46何を期待してるの?
どうしようもない。っていう意味には、
あなたのスキルが低いからという理由も含まれるんだよね?
少なくとも車輪を分解して調べられる。
これをメリットととるかデメリットととるかだな。
サポート期待するなら、商用製品買えばいい。
分解するのがめんどくさいなら、自分で作ればいい。
選択する自由は自分にあるだろ。
0963デフォルトの名無しさん
2007/09/25(火) 22:49:22個人の技術レベルをあげるほうがのほうが先だろうけど。
0964デフォルトの名無しさん
2007/09/26(水) 04:10:19const list<const CHoge * const> &の参照で返す関数を作りたいんですが
単純にキャストすると怒られます
どうすればいいんでしょうか
今は仕方ないので別にlist<const CHoge * const>を作ってコピーしてますが
const参照させるためだけに全く同じ内容のリストを作るのが嫌なんです
何とかならないでしょうか
0965デフォルトの名無しさん
2007/09/26(水) 04:16:07CHoge * と const CHoge * const はバイナリレベルで互換することが保証されて
いるので、 list 自体も const な参照ならキャストしちゃっても安全だと言えると思う。
コメント添えてキャストすればいいんじゃない?
ただし public なインターフェースであればメンバへの参照を返すのは実装を
固定することに繋がるのでお勧めしない。
0966デフォルトの名無しさん
2007/09/26(水) 09:17:36仕様書くらい用意しろボケ
という話です
0967デフォルトの名無しさん
2007/09/26(水) 09:30:42いえーい!
0968デフォルトの名無しさん
2007/09/26(水) 16:54:45なるほどthx、ちょうど友人と配列に英語での名前取った時に都合がいいんじゃ
ないかって議論もしてました。
0969デフォルトの名無しさん
2007/09/26(水) 17:17:33なるほどthx、ちょうど友人と配列に英語での名前取った時に都合がいいんじゃ
ないかって議論もしてるんじゃないかって議論もしてました。
0970デフォルトの名無しさん
2007/09/26(水) 20:28:09ポインタを固定して表示させる処理とポインタを変化させて表示させる処理の2つ作成しなさい
この内容がわからないので教えて下さいお願い致します
0971デフォルトの名無しさん
2007/09/26(水) 20:33:27マルチポスト死ね
0972デフォルトの名無しさん
2007/09/26(水) 20:55:350973デフォルトの名無しさん
2007/09/26(水) 20:59:400974デフォルトの名無しさん
2007/09/26(水) 21:02:35>配列の内容を実行結果のように表示する
実行結果がわからんから答えられないなあ
要は添え字で処理するかポインタで処理するかということか?
添え字なら data[i] で扱って i を変えてく
ポインタなら
int *p = data; pを順番に進めていけばいいんでないか?
0975デフォルトの名無しさん
2007/09/26(水) 21:05:540976デフォルトの名無しさん
2007/09/26(水) 21:21:46[2] OS Windows
[3]問題
int data[10] ={5,8,10,2,1,14,35,6,12}:
配列中の最大値と最小値を表示するプログラムをポインタを使用して作成するプログラムが解らないので教えて貰えませんか?
0977デフォルトの名無しさん
2007/09/26(水) 21:39:090978デフォルトの名無しさん
2007/09/26(水) 22:48:23min_element
0979デフォルトの名無しさん
2007/09/26(水) 23:22:39int a = 10;
って実質的に同じ?
0980デフォルトの名無しさん
2007/09/26(水) 23:23:30全然違う
0981デフォルトの名無しさん
2007/09/26(水) 23:25:43int b = 10;
*(a + 0) == a[0] == b
0982デフォルトの名無しさん
2007/09/27(木) 00:22:250983デフォルトの名無しさん
2007/09/27(木) 01:11:21蟹炒飯を読むと、問題ないと書いてある
0984デフォルトの名無しさん
2007/09/27(木) 02:15:10そしてコンパイルは通らなかった。(VSEE 2008)
C99からの仕様?俺の無知?だんだん不安になってきた・・・
0985デフォルトの名無しさん
2007/09/27(木) 02:21:40{
DWORD dammy ;
BYTE x ;
DWORD dammy2;
BYTE y;
};
TEST Test ;
ZeroMemory(&Test, sizeof(TEST)) ;
Test.x = 0xAA ;
Test.y = 0xBB ;
脳内結果予想
00 00 00 00 AA 00 00 00 00 BB
現実
00 00 00 00 AA 00 00 00 00 00 00 00 BB 00 00 00
なんです?
0986985
2007/09/27(木) 02:23:54なんでこういう結果になるのかわからないです。よろしくお願いします。
0987デフォルトの名無しさん
2007/09/27(木) 02:25:23DWORDが4バイト境界に配置されたため。
0988デフォルトの名無しさん
2007/09/27(木) 02:26:24バイナリはファイルに保存したときに思い通りにならないって話です
0989デフォルトの名無しさん
2007/09/27(木) 02:34:14アライメント、パディング、構造体とかでぐぐれば幸せになれるよ。
0990デフォルトの名無しさん
2007/09/27(木) 02:47:12( ・∀・)わかった!ありがと〜
0991デフォルトの名無しさん
2007/09/27(木) 11:08:00こういう初期化を std::string 使って表現出来ないのでしょうか?
0992デフォルトの名無しさん
2007/09/27(木) 11:20:060993デフォルトの名無しさん
2007/09/27(木) 11:27:27newする意味はあるのか…
0994デフォルトの名無しさん
2007/09/27(木) 11:39:57http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
0995デフォルトの名無しさん
2007/09/27(木) 11:50:57クラスのメンバ関数の関数ポインタを統一的に保持しておきたいです。
(どんな自作クラスのメンバにでも対応したい)
実現する方法があれば書き方を具体的に教えてください。
class CFuncHolder{
private:
void (*m_pFunc)(char*);
public:
CFuncHolder(){};
void SetFunc(void (*pfunc)(char*)){m_pFunc = pfunc;}
void RunFunc(char* str){m_pFunc(str);}
};
void gfunc(char* str){
MessageBox(NULL,str,"",NULL);
}
class cfunc{
public:
void func(char* str){MessageBox(NULL,str,"",NULL);}
void (cfunc::*GetFuncPtr())(char*){return &cfunc::func;}
};
void main(){
CFuncHolder fh;
fh.SetFunc(gfunc);
fh.RunFunc("hohoho");
//cfunc cf;
//fh.SetFunc(cf.GetFuncPtr());
}
0996デフォルトの名無しさん
2007/09/27(木) 11:56:120997デフォルトの名無しさん
2007/09/27(木) 12:43:20ども。保持する方は、
class CFuncHolder{
private:
boost::function1<void, char*> m_func;
public:
CFuncHolder(){};
void SetFunc(void (*pfunc)(char*)){m_func = pfunc;}
void RunFunc(char* str){m_func(str);}
};
とかでいいんですよね?
で、渡す方は、boost::bindとやらが使えるっぽいのですが、書き方がさっぱり分かりません。
void gfunc(char* str){
MessageBox(NULL,str,"",NULL);
}
class cfunc{
public:
void func(char* str){MessageBox(NULL,str,"",NULL);}
void (cfunc::*GetFuncPtr())(char*){return &cfunc::func;}
};
void main(){
CFuncHolder fh;
//グローバルの関数ポインタを渡す
fh.SetFunc(gfunc);
fh.RunFunc("hohoho");
//クラスメンバの関数ポインタを渡す
cfunc cf;
//fh.SetFunc( boost::bind(/*?????*/) );←ここの書き方教えてください。
fh.RunFunc("hehehe");
}
0998デフォルトの名無しさん
2007/09/27(木) 12:55:300999デフォルトの名無しさん
2007/09/27(木) 12:58:201000デフォルトの名無しさん
2007/09/27(木) 12:59:3910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。