【初心者歓迎】C/C++室 Ver.71【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.71【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
10/01/29 23:15:45
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(codepad.org) (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。


2:デフォルトの名無しさん
10/01/30 00:01:59
 codepad
 URLリンク(codepad.org)

長いソースを貼るときはここへ!

3:デフォルトの名無しさん
10/01/30 14:18:17
相談があるので乗ってほしい。

ターゲットは組み込みプロセッサで、メモリマップドレジスタのマクロ宣言で困ってる。

あるレジスタREG_Aがあって、そのレジスタの
- アドレスは 0X12345678、
- レジスタは4バイト長、
- 内部の値は符号無し整数
とする。コンパイラの整数長が4バイトとすると、こういう場合次のようなマクロ定義が定石になってる。

#define REG_A *( volatile unsigned int * ) 0x12345678

こうすると、REG_Aはプログラム中で変数のように使える。当然だけど、この「変数」へのアクセスはレジスタへのアクセスになる。で、困っているのは次のような場合。あるレジスタREG_Bがあって、そのレジスタの
- アドレスは 0XFFFF1234
- レジスタ、整数型、ポインタ型はそれぞれ4バイト長
- 内部の値は関数へのポインタ
- 関数は void ()
つまり、引数も取らず、何も返さない。関数へのポインタ。こういうレジスタは割り込みハンドラのアドレス指定時に使う。

gccを使って試しているんだけど、どうしてもうまくいかない。今はあきらめて*( volatile unsigned int *)としてプログラム中でキャストしているんだけど、気持ちわるい。だれか教えて。試験に使っているプログラムはこんな感じ。

URLリンク(codepad.org)

4:デフォルトの名無しさん
10/01/30 14:30:36
volatileって関数の返却値に使っても有効なの?
規格ではどうなってるんだろ

5:デフォルトの名無しさん
10/01/30 14:37:29
関数ポインタを使うときは、ちょっとでもわかりにくくなったら
必ずtypedefを使うようにするのが鉄則だと思う。
typedef void vfn_t(void);
#define REG_B (*(volatile vfn_t *) 0x11223344)
とか。
いや、これが正常に動くか、そもそも望みのものなのかも知らないけどね。

6:デフォルトの名無しさん
10/01/30 18:40:07
>>5
typedef void (*vfn_t)(void) で正解だな。

7:デフォルトの名無しさん
10/01/30 21:15:46
>>3
>>今はあきらめて*( volatile unsigned int *)としてプログラム中で
>>キャストしているんだけど

それでいいんじゃない?別に気持ち悪くない

8:デフォルトの名無しさん
10/01/30 22:16:06
>>4-7
ありがとう、提案された方法を試したあとに結果を報告する。

>>4
関数の返却値に使いたいんじゃなくて、レジスタの中身がvolatileであることを
宣言したい。だけどそのやり方がわからなくて、貼り付けたコードはめちゃめちゃに
なってる。

>>7
折角だしプログラムの中でいちいちキャストしたくないんだよ。キャストって、
この場合は正しく宣言していれば不要だし、間違った型の代入を防ぐことも
できる。

9:デフォルトの名無しさん
10/01/30 22:26:18
サンキュー、 >>6 の言うとおりにしたら動いたよ。

ソースはこれ。コンパイル結果を読みやすいようにレジスタアドレスを10進に変えてある。
URLリンク(codepad.org)

GCCのコンパイル結果。見事にREG_A、REG_Bへの代入に成功している。
.loc 1 10 0
movl $12345678, %edx
movl $foo, %eax
movl %eax, (%edx)
.loc 1 11 0
movl $12345674, %edx
movl $foo, %eax
movl %eax, (%edx)
.loc 1 12 0
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret

本当にありがとう。

10:デフォルトの名無しさん
10/01/30 23:46:26
敢えて一行で書くならこうかな?
#define REG_B (*(void(*volatile*)()) 0XFFFF1234)

11:デフォルトの名無しさん
10/01/31 01:04:51
>>9
#define の値は括弧で囲っといたほうがいいよ。
それから引数無しの引数リストに void を入れるかどうかはそろえといたほうがいいよ。
C なら必須。

12:デフォルトの名無しさん
10/01/31 09:19:40
任意のクラスのオブジェクトの情報をまるごとバイナリファイルに保存・復元みたいなことはできるんだろうか?

13:デフォルトの名無しさん
10/01/31 09:40:27
>>9
代入がアトミックになってないぞ
mutexか何かでバリアしておいた方が良くないか?

14:デフォルトの名無しさん
10/01/31 09:56:49
>>12
シリアライズで出来るんじゃない?
自分はやったことないけどね

15:デフォルトの名無しさん
10/01/31 10:32:39
>>12
boost::serializationかな

16:デフォルトの名無しさん
10/01/31 11:24:01
>>12
もうまさにboost::serializationだな。


17:デフォルトの名無しさん
10/01/31 17:21:13
>>12
保存中の進捗表示はboost::progress_displayにお任せ!

18:デフォルトの名無しさん
10/01/31 18:06:17
環境ですが、
OSはWindouwsXP
コンパイラ名はMicrosoft VisualC++2008 Express Edition
言語はC
です。

解決できず困っている事があるので、よろしくお願いします。
質問 → URLリンク(kansai2channeler.hp.infoseek.co.jp)

19:デフォルトの名無しさん
10/01/31 18:26:32
WindowsでフリーでVC++ライクの総合環境ってなんか無い?

20:デフォルトの名無しさん
10/01/31 18:42:37
>>19 VC++ EE

21:デフォルトの名無しさん
10/01/31 23:02:34
void (*handle) ();


int address = 0x00000;

handle = (void (*) () )address;


このコードがよくわかりません。
関数ポインタを宣言していることはわかるんですが、3行目のキャストが何を意味しているかが不明です。教えてください

22:デフォルトの名無しさん
10/01/31 23:05:05
代入先を考えろ

23:デフォルトの名無しさん
10/01/31 23:21:49
>>21
関数へのポインタにキャストしているだけです。
void (*x)(); という宣言が理解できるのであれば、それから識別子をとりのぞくと、そのままキャストに使う書き方になるだけです。

24:デフォルトの名無しさん
10/01/31 23:45:44
ちょうど関数ポインタの話題が出てるので聞きたいんだけど、
クラス内でstaticな2次元配列の関数ポインタを扱いたいときってどうすればいいんだろうか。

class ObjectManeger{
public:
 static bool (*Collision[2][2])(const Object &a, const Object &b);

 static bool A(const Object &a, const Object &b){};
 static bool B(const Object &a, const Object &b){};
 static bool C(const Object &a, const Object &b){};
 static bool D(const Object &a, const Object &b){};
};
bool (ObjectManeger::*Collision[2][2])(const Object &a, const Object &b);

って感じの所まではたぶん合ってると思うんだけど・・・。
2×2の配列にABCDの各関数を入れたいんだ。

25:デフォルトの名無しさん
10/01/31 23:48:12
>>21
単に警告でないように強制型合わせしているだけ
違うものを強制挿入する時よくやる



26:デフォルトの名無しさん
10/01/31 23:56:43
>>24
static な関数だと ObjectManeger::* じゃなくてただの * でいいよ。
っていうかコンパイルしてみればいいじゃない。

27:デフォルトの名無しさん
10/02/01 00:02:47
>>26
外部シンボルは未解決だ、って怒られるんだ。
あと、ABCDの各関数を初期化時に入れるのはどうやってやるのか・・・。
色々試したんだけど、コンパイルでエラーの嵐で分からないんだぜ・・・。

28:デフォルトの名無しさん
10/02/01 00:07:11
class Object;

class ObjectManeger
{
public:
  static bool (*Collision[2][2])(const Object &a, const Object &b);

  static bool A(const Object &a, const Object &b) { return true; }
  static bool B(const Object &a, const Object &b) { return true; }
  static bool C(const Object &a, const Object &b) { return true; }
  static bool D(const Object &a, const Object &b) { return true; }
};

bool (*ObjectManeger::Collision[2][2])(const Object &a, const Object &b) = {
  &ObjectManeger::A,
  &ObjectManeger::B,
  &ObjectManeger::C,
  &ObjectManeger::D
};

29:デフォルトの名無しさん
10/02/01 00:08:26
関ポはtypedef
これ、常識ね

30:デフォルトの名無しさん
10/02/01 00:10:17
bool (*ObjectManeger::Collision[2][2])(const Object &a, const Object &b) = {
{ &ObjectManeger::A, &ObjectManeger::B },
{ &ObjectManeger::C, &ObjectManeger::D }
};
ミスった

31:デフォルトの名無しさん
10/02/01 00:18:05
>>30
通った! ありがとう!
そう書けばよかったのか・・・。

>>29
可読性的な意味で、なのかな。
確かに見づらい・・・。

32:デフォルトの名無しさん
10/02/01 00:56:26
>>14-16
virtual 使ってるクラスでもできる?

33:デフォルトの名無しさん
10/02/01 01:20:53
class ObjectManager {
 typedef bool collision_t(const Object& lhs, const Object& rhs);
 static collision_t *Collision[2][2];
 ...
};
ObjectManager::collision_t ObjectManager::Collision[2][2] = {
 &ObjectManager::A,
 ...
};
て感じか。
メンバ関数ポインタじゃないから、そんなに複雑な見た目にはならないかな。

34:デフォルトの名無しさん
10/02/01 08:01:37
関数ポインタって
typedef void (*func_ptr_t)(void);
func_ptr_t fp = &func;
だけじゃなくて
typedef void func_t(void);
func_t * fp = &func;
でも通るんだ
はじめて知ったよ
これって標準?

35:デフォルトの名無しさん
10/02/01 09:09:07
>>34 うん。

36:デフォルトの名無しさん
10/02/01 21:48:30
javaだとIDEの補完機能を使うとimport *を勝手に書いてくれるけど、
C++のIDEはそんな機能がないのかな?

いちいち、#inluce <*>って書くのが面倒くさい
それとも、Qt Creatorは新しいから無いのかな?

37:デフォルトの名無しさん
10/02/01 22:10:21
だから無理してC/C++なんかやらなくていいよ
ずっとJavaで良いじゃん

38:デフォルトの名無しさん
10/02/01 22:10:24
>>36

C++はないよ

C# ならある

39:デフォルトの名無しさん
10/02/01 22:17:59
>>38
わかったよ、ありがとう

40:デフォルトの名無しさん
10/02/02 10:59:32
C++では普通の関数は使わないのですか?
普通の関数の代わりに、staticのメンバ関数を使うのが常識なのですか?

41:デフォルトの名無しさん
10/02/02 11:08:43
>>40
べつにクラスを使わないんだったらバシバシ普通の関数も使うよ

ただクラスを定義しとくとデバッグがめっちゃ楽になんのよ

42:デフォルトの名無しさん
10/02/02 11:15:45
普通の関数ももちろん使うよ
algoritmヘッダなんかには普通の関数もたくさん入ってる(ほとんどテンプレート関数だけど)
もちろん普通の関数を使うところで
staticメンバ関数を使っても問題は起こらないから
すべてstaticメンバ関数で統一したければすればいい
むしろ可視性の操作とかネストクラスとかできることが増えるから
staticメンバのほうが俺はいいと思う

43:デフォルトの名無しさん
10/02/02 16:28:40
template <typename T> class Hoge
と言うクラスがあるとき

実装をcppファイルに記述するには明示的実体化するしかないのでしょうか?
.hファイルに実装を記述するととても見苦しい状態になってしまうのですがどうにかならないでしょうか

44:デフォルトの名無しさん
10/02/02 16:30:30
コンパイラによります

45:デフォルトの名無しさん
10/02/02 16:32:45
使用環境はVS2005standard editionです

46:デフォルトの名無しさん
10/02/02 18:38:51
>>43
仕方がありません
Comeau C++を買いましょう

47:40
10/02/02 19:25:32
>>41-42
ありがとうございます

static関数はクラスに属していますが、それ以外は普通の関数と同じなのですか?

48:デフォルトの名無しさん
10/02/02 20:33:42
クラスの名前空間に属して、そのクラスのprivate/protectedメンバを触れること以外は同じと見て差し支えない
細かい違いはあるけど

49:デフォルトの名無しさん
10/02/02 20:36:50
>>43
いいんじゃね
boostの.hppってっ拡張子は
実装も含んでるヘッダだよ、っていうような意味なんじゃないかね

50:デフォルトの名無しさん
10/02/02 20:39:53
>>48
thx

51:デフォルトの名無しさん
10/02/02 21:45:20
>>49
Boost FAQには以下のようにあるけど。

>なぜ Boost のヘッダファイルはどれもこれも .hpp を使い、 .h や拡張子なしにしないのですか?

>ファイルの拡張子は、人間とコンピュータプログラムの両方にそのファイルの "型" を伝えるものである。
>'.h' という拡張子は C のヘッダファイルで用いられており、 C++ のヘッダファイルに関して間違ったことを伝えてしまう。
>拡張子無しのものを用いると何も伝わらず、型を断定するためにファイルの中身を調べることを強制する。
>'.hpp' を使うことで、そのファイルが C++ のヘッダファイルであることを明確に特定することができ、 また実際に使う際にもきちんと動作する。 (Rainer Deyke)

52:デフォルトの名無しさん
10/02/02 22:00:10
>>51
つまりC++は静的型付け言語だから、
同じように型の発想をしよう、ということか。

・・・それって守らなきゃダメなん?
Boost以外でも守られるのが標準的なC++の文化なの?


53:デフォルトの名無しさん
10/02/02 22:24:15
拡張子なんてただの飾りだから何でもいいよ
.fuckとか.javaとか.exeとか付けるのも自由だ

54:デフォルトの名無しさん
10/02/02 22:30:12
>>53
まあ自由だけど、それをまねした
小学生がぶん殴られたら可哀想じゃないか!


55:デフォルトの名無しさん
10/02/02 22:32:54
The Loki Library
を見てみたら、ふつーに.hだったわ。


56:デフォルトの名無しさん
10/02/02 22:34:27
.exe とか .lnk とか拡張子によってはシステムべったりだから飾りじゃすまないな

57:デフォルトの名無しさん
10/02/02 22:50:13
ゲームのパラメータをファイルに置いておきたいんですが
c++から使えて暗号化もできるシンプルなデータベースってありますか?

58:デフォルトの名無しさん
10/02/02 22:53:42
Linuxにてgprofでプロファイルを見てみたのですが、全関数の処理の合計時間が実測した時間よりも短くなっていました。
この差分は何に起因するものなのでしょうか?

59:デフォルトの名無しさん
10/02/02 22:57:07
>>58
cputime と usertime の差?

60:デフォルトの名無しさん
10/02/02 23:12:30
>>57
URLリンク(www.moongift.jp)
これとかどうだろう

61:デフォルトの名無しさん
10/02/03 05:05:32
gccでAみたいに書くとstrict aliasing rules警告されるんで、
Bみたいに書いたんだけど、これって正しい、というか、
-fno-strict-aliasingを指定した場合と同じ意味になるって保証されてる?

struct Vec { int x, y, z; };
int  data[3][3] = {{0,1,2},{3,4,5},{6,7,8}};
int main() {
  Vec* v0 = (Vec*)data; // A 警告される
  Vec* v1 = (Vec*)(void*)data; // B 警告されない
  return 0;
}


62:デフォルトの名無しさん
10/02/03 06:37:25
警告残した方が後々の為に良い気も

63:デフォルトの名無しさん
10/02/03 06:39:24
>>61
基本的にstrict aliasing ruleに対する違反は
キャストでは解決できないと思った方がいい

じゃあどうすればいいの?ってところでは
GCC3.3.0以上なら__attibute__((may_alias))っていうのがある

けど、そのコードはダーティすぎるからそこから直した方がいい

64:デフォルトの名無しさん
10/02/03 09:35:07
namespaceとはどういうときに使用するのですか?

65:デフォルトの名無しさん
10/02/03 09:42:43
>>64 名前衝突の可能性を最小限にしながら、面倒なプリフィックス付けもしたくないとき。

66:デフォルトの名無しさん
10/02/03 10:13:04
めんどうっていうけど
std_hogeもstd::hogeも変わらねーよ

67:デフォルトの名無しさん
10/02/03 10:24:18
じゃあインテリセンスで一覧表示させたい場合

68:デフォルトの名無しさん
10/02/03 10:34:05
>>66
たとえば関数 hoge の宣言や定義で同じ名前空間にある名前を何度も使うことを考えると
話が違ってくるはず。

std_result std_hoge(std_arg1 a1, std_arg2 a2)
{
  std_detail d;
  std_impl(d, a1, a2);
}

namespace std {
result hoge(arg1 a1, arg2 a2)
{
  detail d;
  impl(d, a1, a2);
}
}

69:デフォルトの名無しさん
10/02/03 10:43:42
DQN的プログラミングにnamespaceは不要

70:デフォルトの名無しさん
10/02/03 11:32:37
DLLとかでエクスポートするときに邪魔なんだよ名前空間
いちいちラップしないといけない

71:デフォルトの名無しさん
10/02/03 11:42:06
クラス内の複数箇所でstd::out_of_range("適当なエラーメッセージ")
このまま文字列リテラルがコード各所に散らばるのは気持ち悪いので

1.あらかじめエラーメッセージをメンバ変数に持たせておく
2.例外を投げるメンバ関数を用意する
3.std::out_of_range("適当なエラーメッセージ")をマクロ定義しておく

どれがスマートな方法でしょうか?

72:デフォルトの名無しさん
10/02/03 11:54:58
俺はマクロかなぁ
const文字列にしてもいいけどマクロのが楽じゃわい

73:デフォルトの名無しさん
10/02/03 12:09:13
void check_range(int min, int max, int value) {
if (value < min || value > max) throw std::out_of_range("~");
}

74:デフォルトの名無しさん
10/02/03 12:14:27
>>73
それじゃどこからエラー出たか特定できないじゃん

75:デフォルトの名無しさん
10/02/03 12:18:23
どのみち例外に行番号情報は含まれないから、元から特定できないと思うけど

76:デフォルトの名無しさん
10/02/03 12:28:21
__FILE__と__LINE__をパラメータで渡せばいい

77:デフォルトの名無しさん
10/02/03 14:24:53
別に何も対策はしないな
それで問題が出るわけじゃないし

78:デフォルトの名無しさん
10/02/03 15:43:49
C++ で継承不可能なクラスを宣言することはできますか?
C# や Java の static class みたいに。

79:デフォルトの名無しさん
10/02/03 15:49:27
残念なことにできません
(C#やJavaのsealedやfinalのことだよね?)
仮想関数にあたるものにvirtualを付けないことで
これ以上継承しないでね、という意思表示にすることぐらいしか
現状できないと思う
ただ、次期C++だとたぶんあるんじゃないかな

80:デフォルトの名無しさん
10/02/03 15:52:22
例外をマクロ化するのは良いアイデアだなとおもったけど
標準例外のコンストラクタに__LINE__と__FILE__を渡す方法を思いつかなくてガッカリ・・・

どういうマクロにすれば良いでしょうか?

81:デフォルトの名無しさん
10/02/03 16:00:32
class out_of_range_with_line_number : public std::out_of_range {
...........
};

82:デフォルトの名無しさん
10/02/03 16:13:05
行番号とかよりも
どの関数から/どのデータが原因で投げられたのか、といった情報を入れたほうがいいんでないかい
out_of_rangeなら、どの配列からout_of_rangeが出たのかによって
それが分かるような例外クラスを作ってrethrowするとか


83:デフォルトの名無しさん
10/02/03 16:37:42
つ boost::exception

84:デフォルトの名無しさん
10/02/03 17:48:55
>>81>>83
やっぱり継承するなりなんなりするしかないか

85:デフォルトの名無しさん
10/02/03 18:37:02
>>78
デストラクタを private にしてみるとか。

class Hoge {
private:
 ~Hoge() {}
};


86:デフォルトの名無しさん
10/02/03 18:50:11
まともに使えねえよ

87:デフォルトの名無しさん
10/02/03 19:06:09
C++0xの[[final]]も継承禁止じゃないしな

88:デフォルトの名無しさん
10/02/03 19:08:30
iface *create(...) { class local : public iface { ... }; return new local(...); }

制限はあるけどこれでfinalだよ

89:デフォルトの名無しさん
10/02/03 20:52:17
教えて下さい。

今お仕事のデバッグ用にSDカードのセクタをFATではなく
セクタ直接アクセスするコードを今使ってます。

そのソフトでドライブ選択をGetDriveType()でリムーバブルディスクのみを
選択できるようにしておるのですが、これではカードリーダーライターに
刺さったディスク全て選択できてしまいます。(例えばCFとかUSBメモリとか)

自分だけで使う場合は注意すればいいだけなのですが、チームで使ってるんで
できればドライブ選択をSDカードONLYにしたいと思っているのですが、
どのようなコードにすればいいでしょうか?

環境
WindowsXP
Microsoft VisualC++ 6.0 MFC

90:デフォルトの名無しさん
10/02/04 00:22:22
>>71
どの方法にも何のメリットも感じられない。
そのままにしとくのが一番スマートな気がする。

>>80
#define OUT_OF_RANGE(what) (std::out_of_range(std::string(__FILE__":"BOOST_PP_STRINGIZE(__LINE__)": ") + (what)))

91:デフォルトの名無しさん
10/02/04 01:59:50
>>62-63
ありがとう。できるだけ根本的に修正するようにしてみる。
ついでに、このコードについても教えてくれないか。

URLリンク(codepad.org)

これ、仕事で使ってるgcc4.1.1とcodepad(gcc4.1.2)では警告されるのに、cygwinのgcc4.3.2だと、
-fstrict-aliasingと-Wstrict-aliasingを指定しても警告されないんだ(-Wstrict-aliasing=2を加えれば警告される)。
このへんの動作って4.1.2以降で変更されてる?
gccのchangesを見たけど、関係ありそうなのは4.2の
The C++ frontend now also produces strict aliasing warnings when -fstrict-aliasing -Wstrict-aliasing is in effect.
くらいしか見つけられんかった。

92:デフォルトの名無しさん
10/02/04 05:32:31
>>91
どうしてそんな碌でも無いコードばかり書くんだ…

GCCのchangelogに書いてあるのは大きなものだけだから
知らないうちに内部の動作が少々変わることはありうるよ

無印の-Wstrict-aliasingで警告がでないのが正しいかはわからん
そこらへんの加減はgccの中の人にしかわからんだろうから…

93:デフォルトの名無しさん
10/02/04 09:36:50
#include <iostream>
#include <fstream>

#pragma pack(push, 1)

struct POD
{
int a, b;
char str[5];
int x, y, z;
};

#pragma pack(pop)

void test(POD &pod)
{
std::cout << "a: " << pod.a << std::endl;
std::cout << "b: " << pod.b << std::endl;
std::cout << "str: " << pod.str << std::endl;
std::cout << "x: " << pod.x << std::endl;
std::cout << "y: " << pod.y << std::endl;
std::cout << "z: " << pod.z << std::endl;
}

94:デフォルトの名無しさん
10/02/04 09:37:33
void save(POD &pod)
{
std::ofstream out("test.bin", std::ios::binary);
out.write((char*)&pod, sizeof(POD));
}

void load(POD &pod)
{
std::ifstream in("test.bin", std::ios::binary);
POD tmp;
in.read((char*)&tmp, sizeof(POD));
pod = tmp;
}

95:デフォルトの名無しさん
10/02/04 09:39:19
int main(void)
{
POD pod1 = {1, 2, "test", 3, 4, 5};
test(pod1);
save(pod1);

POD pod2 = {0};
load(pod2);
test(pod2);

return 0;
}

上記のコードは自分のマシンだと期待通りに動いてるようなんですが
ほかのマシンに移植しても大丈夫でしょうか?

96:デフォルトの名無しさん
10/02/04 09:44:54
intの奇数番地アクセスに問題ないCPUだったら、大丈夫かも

97:デフォルトの名無しさん
10/02/04 10:01:24
>>96
レスありがとうございます
念のためpack(push, 4)にしてみます

98:デフォルトの名無しさん
10/02/04 10:07:15
移植性考えるなら
stdint.hを読み込んで
int

int32_t
とかに

99:デフォルトの名無しさん
10/02/04 12:44:50
>>98
レスありがとうございます
バイト数も揃えてみます
vc++にstdintが無いのが困りものですがvs2010にはあるようなので・・・

100:デフォルトの名無しさん
10/02/04 13:21:04
>>92
>どうしてそんな碌でも無いコードばかり書くんだ… 
ごめんw
実は>>91は、社内製コードでLoadFileAsync(const char* filename, void** buffer)っていうのがあるんだけど、
これがgcc4.1.1にしたら警告が出たので、調査用に書いたんだわ。
動作は、filenameを非同期にディスクから読み出して、読み出したメモリ領域のアドレスをbufferに返す。
非同期ロード用クラスでも作って、void**を置き換えればいいんだろうが、
既にあちこちで呼ばれてる関数だから手を出しづらいんだよね。

101:デフォルトの名無しさん
10/02/04 16:21:27
>>99
URLリンク(www.kijineko.co.jp)
こういうのがあるよ

102:デフォルトの名無しさん
10/02/04 23:42:27
>>100
それでもその強引なキャストは要らんのでは?

A a;
void* p;
f(&p);
a.str = static_cast<char*>(p);

もしかしてメモリ領域の確保も非同期なの?

103:デフォルトの名無しさん
10/02/05 01:25:07
ヘッダファイルの中で#includeの替わりに,classが使われている時があります
#includeをclassにすると、何かいい事があるのでしょうか?

また、QWidgetは#includeもclassも書かれていませんが
なぜ、使う事ができるのでしょうか?
URLリンク(calmlight.s2.zmx.jp)

104:デフォルトの名無しさん
10/02/05 01:34:59
「#includeの替わりに,classが使われている」わけじゃない
前方宣言でググれ
というかC/C++の#includeはJavaのimport、C#のusingとは違うぞ

105:デフォルトの名無しさん
10/02/05 06:58:32
>>103
もうC言語やC++のプリプロセッサっていう勉強をした方がいいんじゃないか?

106:デフォルトの名無しさん
10/02/05 09:24:40
継承元クラスを引数で受けた時に、そのprotectedメンバにアクセスできないのは
どういう理由でそうなっているのでしょうか?

class A {
protected:
 int x;
};

class B : public A {
public:
 void operator=(const A& a) {
  x = a.x; //a.xはprotectedで操作できない
 };
};

107:デフォルトの名無しさん
10/02/05 09:30:31
>>106
別のクラス class C : public A (略)などが、 B とは違う都合でそいつを使っている
かもしれないから。

めんどくさいから protected なんて最初から使わなけりゃいいんだよ。
private or public でいけないのか、よく考えたほうがいい。

108:デフォルトの名無しさん
10/02/05 09:45:32
>>107
適当なこというな

>>106
自分がAをpublicに継承してアクセス可能になるのは
this->aであって
引数としてAを受けた時は外部からのアクセスになる
つまりAのpublicなメンバにしかアクセスできない
(自分がAを継承してるかなんて全く関係ない)

上のケースでやろうとしてるのはこれと変わらない
void f(const A& a){
int a=a.x;
}

protectedなメンバは
「この機能は継承してから使えな」、っていう意思表示なのに
継承前のAのデータにアクセスできたらおかしいでしょ

109:デフォルトの名無しさん
10/02/05 10:04:23
だったら外からアクセスしてるのに同じクラスのprivateにアクセス出来るのはおかしいはず

110:デフォルトの名無しさん
10/02/05 10:05:47
>>108
あんたのそれは何か根拠があるのかね?

> 自分がAをpublicに継承してアクセス可能になるのは
> this->aであって
> 引数としてAを受けた時は外部からのアクセスになる

protected がそうなってる( private と違う)理由を聞かれてるんだよ。

ちなみに、 A の継承が public であるかどうかは関係ないし、
this->a 以外にも B& b という引数に対してなら b.a でアクセスできる。

> protectedなメンバは
> 「この機能は継承してから使えな」、っていう意思表示なのに
> 継承前のAのデータにアクセスできたらおかしいでしょ

その説明だと、別の派生クラス C の C& c について B のメンバ関数内で
c.a にアクセスできない理由の説明にならないね。

111:デフォルトの名無しさん
10/02/05 10:17:53
>>100
>>92に追記しておくけど
-Wstrict-aliasingは全ての問題があるケースを警告するとは限らない
-Wstrict-aliasingは-Wstrict-aliasing=3と同じで
-Wstrict-aliasing=1が最も「少しでも怪しければ警告にする」けど
それでもit has very few false negativesとしか言われてない
URLリンク(gcc.gnu.org)

製品としてgccの最適化によるバグを絶対回避したいなら
-fno-strict-aliasingにしてこの種の最適化を無効にするしかない

112:デフォルトの名無しさん
10/02/05 10:23:47
>>111
> -Wstrict-aliasing=1が最も「少しでも怪しければ警告にする」けど
> それでもit has very few false negativesとしか言われてない

それ、 "when higher levels do not ... , as it has very few false negatives" の
ところで、 1 より上のレベルについて言ってるところだよ。レベル 1 については
"it has many false positives" ってなってる。

113:112
10/02/05 10:28:46
ん?ごめん、読み違えた。

Level 1 だと false negative が少なくて(でもゼロじゃなくて)、かわりに false positive は多いってことか。

112 は忘れて。

114:デフォルトの名無しさん
10/02/05 15:57:26
ifstream と Win32 ReadFile のメリットとデメリットを教えてください

ReadFileはwindows依存していることは知ってます、ifstreamの内部ではReadFileを使っている(?)とかどってでみた気がする
速度を比較してみたらifstreamの方がはやかったです

115:デフォルトの名無しさん
10/02/05 16:02:59
1バイトずつReadFileを呼び出したりしていないか?
ifstream等は内部にバッファを持って一度の呼び出しで多くのデータを読み込むようにしてAPIの呼び出し回数を抑えているはず

116:114
10/02/05 16:10:02
ReadFile引数のブッファ指定のところでファイルサイズ渡しているので1バイトずつではないはず

117:デフォルトの名無しさん
10/02/05 16:45:56
普通のファイルを普通に読むとOSは勝手にディスクキャッシュするよ

118:デフォルトの名無しさん
10/02/05 17:24:52
それだとReadFileが遅い理由にならんのでは

119:デフォルトの名無しさん
10/02/05 17:28:37
いきなりファイル全体キャッシュするわけじゃないから

120:デフォルトの名無しさん
10/02/05 18:04:54
ディスクアクセスのコストはOSのディスクキャッシュで隠蔽できても
システムコール(カーネルとのモード遷移)のコストは隠蔽できません。
ReadFileを何度も何度も呼び出している限り。

121:デフォルトの名無しさん
10/02/05 19:48:25
ifstreamが速い理由にならんぞ

122:デフォルトの名無しさん
10/02/05 20:15:36
ナニ言ってんだオマエは

123:デフォルトの名無しさん
10/02/05 20:16:50
ちなみに
stdioと比較してifstreamは全然速くない。

124:デフォルトの名無しさん
10/02/05 20:23:02
比較しちゃだめだろ

iostreamの良い所は別にあるんだから。
何かというとそれは次の人どうぞ
↓↓↓


125:デフォルトの名無しさん
10/02/05 20:39:29
継承によって作られている所です

つまり入力元や出力先だけではなくstringstreamのように
根本的な構造が異なっても全く同じイメージで操作できる事です

とでも言って欲しいのか?

126:デフォルトの名無しさん
10/02/05 21:52:34
>>114 どんなコードで比較したのかわかるようにコードを晒さないと答えられないな。


127:デフォルトの名無しさん
10/02/05 22:16:09
>>114
ReadFileの使い方を間違ってるんじゃないか?
ifstreamを書いた人はReadFileの使い方をよく知ってるんだと思うよ。

128:デフォルトの名無しさん
10/02/05 23:44:41
メッセーッジについて教えてくれ
WM_NOTIFYとON_NOTIFY_REFLECTの関係がわからない

調べたところWM_NOTIFYのメッセージが贈られるとるとON__NOTIFY_REFLECTが呼び出されれウ
みたく書いてあったけど
じゃあON_NOTIFY_REFLECTがもってる通知メッセージは何よ?

わかりやすくおしえてね

129:デフォルトの名無しさん
10/02/05 23:49:40
>>128
は?
頭おかしいの?

130:デフォルトの名無しさん
10/02/05 23:50:12
>>128
Win32API質問箱 Build86
スレリンク(tech板)

131:デフォルトの名無しさん
10/02/05 23:52:04
どっちかというとMFCのほうだな

132:デフォルトの名無しさん
10/02/06 02:27:22
PaintDCの描画領域のクリア方法教えて

133:デフォルトの名無しさん
10/02/06 10:22:50
InvalidateRectもしくはValidateRectのことか
それともFillRectのことだろうか

134:デフォルトの名無しさん
10/02/06 13:22:55
template< int Foo >
class CHoge
{
public:
  CHoge(int ini) : m_hoge(ini){}
  int m_hoge;
  char m_foo[Foo];

  static const CHoge<Foo> sc_Zero;
};
//const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0); // Foo : 定義されていない識別子です。

 sc_Zero を初期化したいんだけど,どのようにすればいいでしょうか?

135:デフォルトの名無しさん
10/02/06 13:38:26
Fooの値は決まる必要があるんじゃね?

template< int Foo >
class CHoge
{
public:
CHoge(int ini) : m_hoge(ini){}
int m_hoge;
char m_foo[Foo];
static const CHoge<Foo> sc_Zero;
};

CHoge<1> h(10);
const CHoge<1> CHoge<1>::sc_Zero(h);


136:デフォルトの名無しさん
10/02/06 13:41:57
template < int Foo >
const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0);

137:134
10/02/06 13:51:57

>>135-136
ありがとうございます.初期化出来ました.

138:デフォルトの名無しさん
10/02/06 17:31:35
前方宣言をすると普通に#includeするよりも、コンパイルが速くなりますか?

139:デフォルトの名無しさん
10/02/06 17:33:57
前方宣言はコンパイル依存性を減らしたりするために
あると思うんだけど

140:デフォルトの名無しさん
10/02/06 17:39:20
>>138
コンパイルが速くなるっていうよりも、コンパイルしなおさなければいけなくなるファイルが
減るっていうのが正しいかと。

141:デフォルトの名無しさん
10/02/06 18:05:26
前方宣言が必要なパターン

class B;

class A {
B b;
};

class B {
A *a;
};

あとはpimplイディオムで少し似た使い方したり。

142:138
10/02/06 18:06:41
>>140
やっぱり、そうだよね
thx

143:デフォルトの名無しさん
10/02/06 22:06:12
newとmallocは似たような動作をしますが、
バックグラウンドではnewがmallocを呼び出しているのですか?

144:デフォルトの名無しさん
10/02/06 22:09:27
>>143
そういう実装も多いけども、そうとは限らない。
それが問題になるようなプログラムを書くべきではないし、書く必要も無い。

145:デフォルトの名無しさん
10/02/06 22:48:57
WinAPIを使わずにマウスをプログラム側から操作するにはどうしたらよいでしょうか?

146:デフォルトの名無しさん
10/02/06 22:50:12
そういうライブラリを探す。

147:デフォルトの名無しさん
10/02/06 22:57:22
>>145
それは不可能だろう。

ラッパライブラリがあれば可能だろうが、
そのラッパもやはりWinAPIは使っているだろうな。

148:デフォルトの名無しさん
10/02/06 23:43:39
VS2005、C/C++でコントローラ(Joystick)の状態を取得するにはどうすれば良いのでしょうか?
調べても中々出てこないみたいなので。助けてください。
プロジェクト設定はWin32コンソールアプリケーションです。
ひどいくらい初心者ですが、よろしくお願いします。

149:デフォルトの名無しさん
10/02/06 23:53:46
GetJoystickState

150:デフォルトの名無しさん
10/02/07 00:13:35
>>148
Windows APIか、DirectXのDirectInputを使う

Joystick Reference (Windows)
URLリンク(msdn.microsoft.com)(VS.85).aspx

DirectInput
URLリンク(msdn.microsoft.com)(VS.85).aspx
URLリンク(msdn.microsoft.com)(VS.85).aspx

151:デフォルトの名無しさん
10/02/07 00:30:49
DirectInputは使っています。

printf("%d\r\n",js.lX);
で一応、初期値の -8 とプリントされているのですが、
動かしても変動がありません。どうも倒しながらキーボードを入力すると数値が変動するようです。

現在はキーボード入力で入力したときだけOpenGLが再描画されるのですが
これをJoystickを倒した時に再描画されるようにするにはどうすればよいのでしょうか?

switch (key) {

case 'd':
{
Point NextPos( PosX+0.2, PosY );
if( !ColCheck( NextPos ) )PosX +=0.2;
glutPostRedisplay();
}
ソースはこんな感じになっています。キーボード入力時のみの再描画ではなく、常に?描画するにはどうすればよいのですか?
初心者ですみません。書き込んでいて何を言ってるのかわからなくなってきました。

152:デフォルトの名無しさん
10/02/07 00:45:10
OpenGLスレで聞いてみれば?

153:デフォルトの名無しさん
10/02/07 00:50:10
はい、そうしてみます。ありがとうございました。

154:デフォルトの名無しさん
10/02/07 02:47:37
void *型から何かの型へのポインタへキャストする時にそれが有効か調べるいい方法はあります?
今のところハッシュにアドレスとtype_infoのペア保存しておくという微妙な方法しか思いつきません

155:デフォルトの名無しさん
10/02/07 07:03:04
>154
dynamic_cast かな。
でもどっちかっていうと型判別しなきゃいけないこと自体がどっかおかしいような気がする。

156:デフォルトの名無しさん
10/02/07 07:19:04
void * にdynamic_castは無理

157:デフォルトの名無しさん
10/02/07 08:14:09
C++にはリフレクションがないから無理だろ

158:デフォルトの名無しさん
10/02/07 10:01:05
>>154
shared_ptr があるよ

159:デフォルトの名無しさん
10/02/07 11:15:33
struct hoge {
int bar1;
char *buf;
int bar2;
};

こんな構造体のbufに文字列入れるなりmallocするなりするとメモリ的にはどうなるの?
bar2がその分後ろにずれたりするの?

160:デフォルトの名無しさん
10/02/07 11:22:14
template<size_t T_size>struct hoge {
int bar1;
char buf[T_size];
int bar2;
};

161:デフォルトの名無しさん
10/02/07 11:22:50
>>155
void*なんか使わないほうがいいと言えばそのとおりなんですが
スクリプトと拡張型のポインタをやり取りするのに一回void*に変換されて型情報がなくなってしまうのです
スクリプト側で変なことしなければ問題はないんですが、間違えるとエラーも出せずに落ちてしまうのでどうにかできないかな、と

>>156,157
やっぱり無理・・・でしょうか

>>158
すいません
詳しくお願いできますか?

162:デフォルトの名無しさん
10/02/07 11:45:30
void*のポインタ先をデータの生ポインタではなく、

struct ptr_holder {
void *ptr;
type_info ty;
};

のポインタとかにはできないの?

163:デフォルトの名無しさん
10/02/07 11:54:49
>>161
void*を何かのクラスに変換するのはプログラマの責任になるんだね。
変換方法はプログラマから決めないといけないけど、1種類のクラスしか扱えないのが実情。
そこで、複数のクラスを扱うには、>>162のように1種類のクラスを挟んでクラスを識別できるようにして変換する。
それをやっているのが>>158の方法。shared_ptr<void>へのポインタshared_ptr<void>*をvoid*として渡し、shared_ptr<void>*に戻す。その後、shared_polymorphic_cast<Hoge>(*Ptr);で変換。型が違えば例外が投げられる。

164:デフォルトの名無しさん
10/02/07 11:56:54
>>159
ずれない
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ---> NULL
                 |------|
0x11111108 | bar2   |
                +------+
↑こんな感じのが ↓こんな感じになるだけ
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ----+
                 |------|        |
0x11111108 | bar2   |        |
                +------+        |
                 +------+       |
0x22222200 | 文字列 |  <--+
                 +------+

165:デフォルトの名無しさん
10/02/07 12:13:53
>>163
shared_ptrのその使い方はshared_ptrの本来の使い方の一部にしかすぎない。
shared_ptrの本来の使い方を知った上で使うべき。

166:デフォルトの名無しさん
10/02/07 12:13:58
>>162
残念ながら、ptr_holder*をvoid*にして渡すという形になりますので
結局のところvoid*がptr_holder*に戻せるかという、ほぼ同じ問題に戻ってしまいます

>>163
やはりvoid*がshared_ptr<void>に変換できる保証はないので、完全では無いですね


でも同一プロジェクト内でならshared_ptrに統一することは可能なので試してみたいと思います
みなさんレスありがとうございました

167:デフォルトの名無しさん
10/02/07 12:39:16
>void*がptr_holder*に戻せるか

そこは当然ptr_holderしか使わないという縛りが必要になる

168:デフォルトの名無しさん
10/02/07 12:50:54
void*やshared_ptr<void>ではなく、boost::any(あるいはany*やshared_ptr<any>)にしたらいい。

169:デフォルトの名無しさん
10/02/07 15:23:09
LinuxでC++勉強したいんだけど
ライブラリって何が標準なの?

170:デフォルトの名無しさん
10/02/07 15:25:02
gccとかのこと?

171:デフォルトの名無しさん
10/02/07 15:25:38
>>169
まずは C 標準ライブラリと C++ 標準ライブラリだな。

172:デフォルトの名無しさん
10/02/07 15:29:38
>>171
boostというのが標準ですか?それともSTLというのですか?

173:デフォルトの名無しさん
10/02/07 15:35:08
>>172
boost は標準ではないが、将来の標準に含まれるものを含んでいる。
STL は昔の名前で、今は C++ 標準ライブラリに含まれている。

174:デフォルトの名無しさん
10/02/07 15:38:54
>>172
boostは標準ライブラリではない。
だが信頼性・移植性のある外部ライブラリだと思う。
あとboostのすごいところは最先端をめっちゃ追求しているところかな。



175:デフォルトの名無しさん
10/02/07 15:45:36
boostは盛りだくさんだから、ひとくくりで全部OKとかダメだとは言いにくいな。

176:progress_display
10/02/07 15:49:25
>>175
私のことお呼び?

177:デフォルトの名無しさん
10/02/07 16:40:18
昨日違うスレで質問しましたが、質問させてください

public void setXXX(Foo* f)というメソッドがあった場合、
1.setXXX(f);→fはポインタ
2.setXXX(&f);→fはポインタではなく、fのアドレスを渡している

普通にプログラミングをした場合は、1 or 2のどちらでも大丈夫だと思います
しかし、GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが
結局はGUI Tool Kitに依存するといいうことでしょうか?

178:デフォルトの名無しさん
10/02/07 16:47:07
fがFooのポインタなら1だし、Fooのインスタンスなら2
ツールキットとかそういう問題じゃない
そもそもpublic void setXXXは通常なら構文エラー

179:177
10/02/07 16:51:15
>>178
1はFoo* f = new Foo();
2はFoo f;
で宣言しています

>そもそもpublic void setXXXは通常なら構文エラー
何故?

180:デフォルトの名無しさん
10/02/07 16:58:25
そのGUIオブジェクトがローカルスコープ限りで削除されるような場合は別に2でも問題ないと思うけれど
デバイスコンテキストとかはそういう使い方をしそうだがウィンドウとかはあまりそういう使い方をしないだろう

181:デフォルトの名無しさん
10/02/07 17:06:54
>>179
エラーってのは、publicの後ろにコロンが付いてないだけのことだと思う。

182:デフォルトの名無しさん
10/02/07 17:06:54
>>177
> GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが

なんで?
意味わかんない。

可能性が高いとかグダグダ言ってないで、関数の仕様を確認すればいいのに。

183:デフォルトの名無しさん
10/02/07 17:15:50
スタックやヒープといったメモリ領域はご存じ?

184:177
10/02/07 17:56:51
>>180
それもそうですね

>>181
java出身なもので、うっかりやってしまいました

>>183
yes

185:デフォルトの名無しさん
10/02/07 18:14:18
177がなんでそんな疑問を持ったかのほうが気になる
そもそも実引数fの型がFOOへのポインタだとしたら
上の1と2は全く同じ意味だというのは分かってる?

186:デフォルトの名無しさん
10/02/07 18:17:44
185は忘れてくれ

187:デフォルトの名無しさん
10/02/07 18:21:54
>>185
ドンマイ。たまにうっかりしちゃうよな。

188:デフォルトの名無しさん
10/02/07 18:39:49
>>177は何かを勘違いしてる気がする。

public : void setXXX(Foo* f);

Foo fOrg;
Foo* f = &fOrg;

1.setXXX(f);→fはポインタ
2.setXXX(&fOrg);→fOrgはポインタではなく、fOrgのアドレスを渡している

これでどっちも同じになるんだが。

189:デフォルトの名無しさん
10/02/07 18:47:44
>>188いや、たぶんそれ自体は理解してるんじゃないかな
GUIアプリで、長期間あるオブジェクトを使うような場合に、
ヒープにとるべきか(1)スタックにとるべきか(2)という質問なんじゃないの

190:デフォルトの名無しさん
10/02/07 18:54:41
じゃあ、インスタンスの寿命を気にしてるってことか。
そんなのJavaもC++も一緒じゃないの?
スコープを抜けたらデストラクタが実行されるでしょうよ。

191:190
10/02/07 18:56:52
ごめん違った。Javaはfinalizeがいつ実行されるのか分からんのね。

192:177
10/02/07 19:11:12
>>189
その通りです。そういう質問です
URLリンク(gihyo.jp)
>1.子ウィジェットのメモリ解放の自動化
を読んでいたら疑問が湧きました

>>188 には↓と書いていますが、
>これでどっちも同じになるんだが。

1.Foo fOrg;←スタックにインスタンスが確保されるハズ
2.Foo* f = new Foo();←ヒープにインスタンスが確保される

2の方法だとヒープにあるインスタンスはdeleteしないと削除されませんが、
1の方法だと自動的に削除されるのでは?と考えました

もしも、1の方法で自動的に削除されなかった場合、
スタック(first in first out)なので「他の変数も削除されなくなる可能性」があるんじゃないかな~と

わかりずらくて、スマソ

193:デフォルトの名無しさん
10/02/07 19:18:21
1のやり方で自動的に削除されるよ
f自体は削除されるが
fのメンバにポインタがあった場合
そのポインタがさしてる先が削除されるかは
ちゃんとそういう処理を書いたかってことによる


194:デフォルトの名無しさん
10/02/07 19:20:45
いや、スタックってLIFO: Last In First OutまたはFILO: First In Last Outだから。
スタックに確保したインスタンスは、スコープを外れれば自動的に削除されます。
つまりスコープを外れない限りは自動的に削除されることは無い。
削除されないならそのシステムが腐ってる。
LIFOをイメージ出来れば今回の疑問は解決するはず。

195:177
10/02/07 19:35:38
>>193-194
なるほど、いろいろと勝手にやってくれて
やってくれなかった場合はシステムが腐っているってことですね
---------------------------------------------------------------------
qt4を参考に、適当に考えてみたコードなのですが

class MainWindow { //ウインドウ関係のクラス
public:
void setWindowTitle(string* s);

void init() {
string s = "これの方法は安全なのか?";
mainWindow.setWindowTitle(&s);
mainWindow.show(); //guiのイベントループを開始する
}

mainWindowが終了した段階で、MainWindowがstring sをdeleteする
また、mainWindow.show();はブラックボックスかされていて、
init()の方が最初に終わるかもしれないという条件の場合  //かなり、腐っている気がするけど

string s;はやっぱり、string *s = new string("テスト");とした方がいいんですね?
最後にこの質問だけ教えてください

196:デフォルトの名無しさん
10/02/07 19:38:41
「1の方法で自動的に削除されなかった場合」ってどういう状況でそうなると思った?
システム的には、>>194の通り、スコープを外れたら自動的にデストラクタが呼ばれる。
>>193の言うようにそのデストラクタ内の処理で必要なものを解放していなければメモリリークになる。

Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。
無効なアドレスに対してアクセスが発生して、運が良ければ落ちるし、最悪の場合は黙って動き続けることに…

197:デフォルトの名無しさん
10/02/07 19:39:48
>>195
string*はやめてconst string&で受け取った方がいい
MainWindowにWindowTitleのメンバを用意して、
コピーコンストラクタでコピーするべき

198:デフォルトの名無しさん
10/02/07 19:41:20
コピーコンストラクタは間違いだった。

199:177
10/02/07 19:56:45
>>196
>Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
>もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。

なるほど、それが聞きたかった
わかりました、ありがとうございます

>>197
>string*はやめてconst string&で受け取った方がいい
うーん、それは危なくないですか?
>init()の方が最初に終わるかもしれないという条件の場合
という条件があるので

200:196
10/02/07 19:56:46
更新してなかった
>>195の条件ならどっちもダメ
newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある

>>192のQtの場合は、親ウィジェットから辿れる子ウィジェットについては、
親ウィジェットのデストラクタ内でdeleteを呼んでくれてるってことだと思う
そういうフレームワークを使うなら自分でdeleteする必要はない(というかしたらまずい)

あと直接関係ないけど、
スタックを使う場合は、Javaには真似できないRAIIって技法があるから調べてみると面白いかも
ヒープの場合はスマートポインタ(boost::shared_ptrとか)を使うと安全度が高まる

201:177
10/02/07 20:07:03
>>200
>Javaには真似できないRAII
これ調べておきます

>mainWindowが終了した段階で、MainWindowがstring sをdeleteする
こういう条件があるので↓は気にしなくていいのでは?
>newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある


202:196
10/02/07 20:15:39
>>201すまん、見落としてましたw
じゃあnew以外ないね(逆に、スタックに確保したインスタンスをdeleteするのは駄目)。
ただ、関数レベルでそんな実装するのはC++的じゃないので、普通ないとは思うけど。

203:デフォルトの名無しさん
10/02/07 20:26:02
C++を習得する場合、
Java→C++よりC→C++の流れの方がやっぱりまともだな

204:デフォルトの名無しさん
10/02/07 20:28:11
なぜわざわざ荒れそうな方向へ持っていく

205:デフォルトの名無しさん
10/02/07 20:30:31
>>204
そういう荒れそうな発言は、メッ!ですよ

206:177
10/02/07 20:32:25
>>202
いろいろと、ありがとうございました

207:デフォルトの名無しさん
10/02/07 20:33:14
>>203
Cはクラスがないじゃん
だから面倒くさい

208:デフォルトの名無しさん
10/02/07 20:34:52
これがゆとりか…

209:デフォルトの名無しさん
10/02/07 21:09:47
2ちゃんねるブラウザで一番難しい所は、スレを表示する機能だと思うんだよね
しかし、既存の専ブラはそれをどうやって解決しているのか?って所が問題

210:209
10/02/07 21:13:17
ごめん、誤爆した

211:デフォルトの名無しさん
10/02/07 21:36:08
C++を学ぶのにCを学ぶ必要はないよ
Cの古くて危険なやり方はやらない方がいい

212:デフォルトの名無しさん
10/02/07 21:48:26
URLリンク(www1.axfc.net)

CodeSynthesis XSD/eのサンプルプログラムをVisual C++ 2008 Express EditionのIDE上でビルドしたいのですが、リンカエラーが
大量に出てしまい出来ません。うpしたのはXSDEのライブラリとサンプル1つだけ取って小さくしたものです。
nmakeだとビルド出来るのですが、IDEの「既存のコードからプロジェクトを作成」で作成したプロジェクトでビルドすると失敗してしまいます。

URLリンク(www.codesynthesis.com)

213:デフォルトの名無しさん
10/02/07 21:51:40
>>211
その古くて危険なもので、今現在もどれほど多くのものが作られているか。

バカには使いこなせない、って点では確かにC++以上だとは思うけどな。

214:デフォルトの名無しさん
10/02/07 21:56:39
C++はポインタ操作をクラス内に隠蔽できるメリットを理解して使ってる人はどれくらいの割合いるんだろうか。
Cを知らずにSTLをいきなり使ったほうが幸せになれるのではないかと思う今日この頃。


215:デフォルトの名無しさん
10/02/07 22:00:19
>>213
CはCで今でもあちこちで使われているのは俺も同意だけど、それとこれとは別。

216:デフォルトの名無しさん
10/02/07 22:03:24
そこでAccelerated C++ですよ

217:デフォルトの名無しさん
10/02/07 23:50:57
>>214
deleteをほとんど出さない入門書があってもいいのではないかと思うと気がある

218:デフォルトの名無しさん
10/02/08 02:48:34
「~の数」ってときにつける変数名、皆さんはどうしてますか。
たとえばりんごの数とか…。

219:デフォルトの名無しさん
10/02/08 03:13:16
num_apples

220:デフォルトの名無しさん
10/02/08 03:16:40
人に薦めるならcountかなぁ。

自分のプロジェクトでは、数はnum、番目はnoを使ってる。
それ一緒や!元ネタ一緒やで!というツッコミは甘んじて受けよう。
大事なことはプロジェクト内での一貫性。(あと検索一意性)
それさえ見失わなければhogeでも構わん。

221:デフォルトの名無しさん
10/02/08 03:35:36
>>219>>220
レスありがとうございます!
私はthe number of ~とか考えてました。でもこれじゃあなんかな~…と。
これからはnum、noを一貫してつけていくことにします。

222:デフォルトの名無しさん
10/02/08 07:03:31
プログラムからPukiWikiのページを書き換えるにはどうやればいいですか?

223:デフォルトの名無しさん
10/02/08 07:59:00
HTTPでしかるべきPOSTメソッドを送信すればいいと思うけど

224:デフォルトの名無しさん
10/02/08 08:19:06
>>223
どうもです。
HTTPというと、C++で使うのはwininetですかね。
HTTPの事も調べないといけないなぁ。

225:デフォルトの名無しさん
10/02/08 08:52:24
個数ならcount
量ならamountだな

226:デフォルトの名無しさん
10/02/08 09:26:00
変数名スレでやれ

227:デフォルトの名無しさん
10/02/08 09:36:02
Boost.Asioを使ったHTTP通信のサンプルコードはよく転がってるよ

228:デフォルトの名無しさん
10/02/08 14:39:57
int n;
cin >> n;
char buf[4096];
for(int i=0;i<n;++i){
cin.getline(buf,4096);
cout << buf << endl;
}
このプログラムで
1
hello world
という入力をしてhello worldを出力したいんですが
1 Enterの時点でプログラムが終わってしまいます
最初のcin>>nで一つ目の改行が読まれていないみたいなので驚いたんですが
getlineと通常の>>は混ぜて使わないほうがいいんでしょうか?

229:デフォルトの名無しさん
10/02/08 15:06:36
cin>>n は数値を読むだけで改行は読まないから
改行が来るまで吐き出させるとか
char c;
do {
cin >> c;
} while (c != '\n');

230:デフォルトの名無しさん
10/02/08 20:56:46
string s = "str";
if( s ) {
  std::cout << "true" << std::endl;
}
このスレで条件式にインスタンスを渡してもいいと教えてもらったのですが
シンタックスエラー?が出ました
>/Test/main.cpp:9: error: could not convert ‘str’ to ‘bool’

why?



231:デフォルトの名無しさん
10/02/08 20:58:47
stringはデフォでboolに変換できない。
s.c_str()とかやりなされ

232:230
10/02/08 21:14:31
>>231
s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが

233:デフォルトの名無しさん
10/02/08 21:33:46
>>232
それは騙されたんだよ。
char* ならそうなるけど、string はそうはならない。


234:デフォルトの名無しさん
10/02/08 21:45:34
>>232
妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ??

stringはクラスで>>230の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。
適当な型変換をクラスの実装による変換で要求するが、
stringは変換機構を実装してないからコンパイラさんが評価できないよ~。ってエラーを返している。

235:230
10/02/08 21:45:55
>>233
stringだからダメなんですかね?
その時は、if(オブジェクト)はなぜシンタックスエラーにならないの?って質問したんですが

236:デフォルトの名無しさん
10/02/08 21:51:23
>>235
ifは論理式の評価の後に最終的にはboolを要求する。
boolの基本は、0がfalse、それ以外がtrueなので、
ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。
凄い細かい話なんだが。。。

237:230
10/02/08 21:53:01
>>236
わかりました
ありがとうございます

238:デフォルトの名無しさん
10/02/08 22:21:43
C++テンプレートテクニックスという本に載っていた
vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが
これって普通に仮想関数を使った場合とどっちが早いんですか?

239:デフォルトの名無しさん
10/02/08 22:38:26
if(boolean-expression) {}

boolean-expression が object だった場合、
コンパイラは次の優先順序で変換を試みる。

1. operator bool() {}
2. operator 数値型() {}
3. operator ポインタ型() {}

operator bool() が実装されていない場合、
かつ operator 数値型() が複数実装されている場合は、
曖昧であるためコンパイルエラーとなる。

VC2008EEで確認したら、こんな動作だった。
これは言語仕様で定義されてるのかな?


240:デフォルトの名無しさん
10/02/08 22:51:23
>>238
実装によるとしか。
大抵ほぼ同じになると思うが。

241:デフォルトの名無しさん
10/02/08 23:09:16
>>238
最適化うんぬんやらスレッド安全性などを考えても、
vtableを自分で実装なんてしなくていいともうけどね。

だいたい、仮想関数のスピードがネックになる設計なんて
今まで俺はみたことないよ。

80-20の法則ってやつを思い出すしか。


242:デフォルトの名無しさん
10/02/08 23:10:36
>229
おまいは今 ignore さんの存在意義を否定した。

243:デフォルトの名無しさん
10/02/08 23:29:37
__FreeList* element = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));
__freeList_ = element;
__for (int i = 1; i < BLOCK_SIZE; ++i) {
____element->next = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));
____element = element->next;
__}
__element->next = 0;

これの意味が解りません



244:デフォルトの名無しさん
10/02/08 23:30:57
どこが分からないの?

245:デフォルトの名無しさん
10/02/08 23:44:11
>239
もうちょい周辺の記述も有った方が分かりやすそうだけど、とりあえず以下の規定から導かれる動作だと思われ。
> 14882:2003
> 13.3.3p1
>(略)
> - the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the standard
> conversion sequence from the return type of F1 to the destination type (i.e., the type of the entity
> being initialized) is a better conversion sequence than the standard conversion sequence from the return
> type of F2 to the destination type.
>
> 13.3.3.2p4
> Standard conversion sequences are ordered by their ranks: an Exact Match is a better conversion than a Promotion,
> which is a better conversion than a Conversion. Two conversion sequences with the same rank are
> indistinguishable unless one of the following rules applies:
> - A conversion that is not a conversion of a pointer, or pointer to member, to bool is better than another
>   conversion that is such a conversion.
>(略)

246:デフォルトの名無しさん
10/02/08 23:52:36
>>244
この辺がよくわかりません。
static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));

配列を確保してるのですよね?

247:デフォルトの名無しさん
10/02/09 00:40:32
>>241
vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。
速度目的は聞いたことないなあ。

248:デフォルトの名無しさん
10/02/09 00:55:02
自前vtableっていまいち使い道が不明だと思ってたんだけど、そういうところで使うのね

249:デフォルトの名無しさん
10/02/09 01:01:23
ああ、自前vtableで速度向上になるって話も思い出した。
どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り
非仮想関数だから最適化されやすいという理屈。

今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを
検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。

250:デフォルトの名無しさん
10/02/09 01:41:35
>>246
::operator new()というのは、
要求されたメモリを確保して
void*として返す関数。
(bad_allocを投げるmalloc()、と考えてよい)

したがって、sizeof(Integer)のメモリを確保して
それを(void*から)Integer*にキャストしてる。

251:222
10/02/09 08:05:12
うーん、通信のプログラム難しい・・・。
HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。
ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。
何か良いサンプルはないでしょうか?

252:デフォルトの名無しさん
10/02/09 10:25:13
そもそもHTTPはわかってるの?

253:デフォルトの名無しさん
10/02/09 11:43:02
>>252
軽く調べた程度の知識しかないです。

254:デフォルトの名無しさん
10/02/09 11:52:52
じゃあまずは簡単なCGIを自作して、そいつにPOSTするようなの書いてみては

255:デフォルトの名無しさん
10/02/09 12:58:56
サブクラスを普通に使いつつ、スーパークラスをインスタンス化を禁止する方法ってありますか?


256:デフォルトの名無しさん
10/02/09 13:06:01
virtual function-name() = 0

257:デフォルトの名無しさん
10/02/09 13:06:21
スーパークラスのコンストラクタをprivate/protectedにして実装を書かない
って技があったと思う
iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった

258:デフォルトの名無しさん
10/02/09 13:10:25
抽象クラスっていうんでしょうか?
ただスーパークラスの関数はすべてvirtualながらも定義していて、
必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです

スーパークラスのデフォルトコンストラクタをprotectedにしてみました
これはアリでしょうか?

259:デフォルトの名無しさん
10/02/09 13:12:07
>>257
リロードしてなかった・・・
いまその記事発見しました
ありがとうございます

260:デフォルトの名無しさん
10/02/09 13:30:30
>>254
どうもです。
CGI作成の方を調べたら、だいぶ分かってきました。

261:デフォルトの名無しさん
10/02/09 13:33:30
URLリンク(codepad.org)

こういうやり方もあるようだが
これは正しい方法なのかな?
vc++とcodepadでは期待通りになる

262:257
10/02/09 14:08:02
むしろそれが普通のやり方だね
257は訂正、protectedにして(コピーコンストラクタや代入演算子を)実装しないってのは
インスタンス化は許すけどコピーは出来ないようにする
といった要求がある時に使う技だった

263:デフォルトの名無しさん
10/02/09 15:08:46
std::tr1::unordered_set<Foo>

Fooはoperator std::size_tを定義していないとだめだと聞いたんですが
これはいったいどんな値を返すべきなんでしょうか?

264:デフォルトの名無しさん
10/02/09 17:17:16
>>249
vc++ee2008で試したら仮想関数のほうが3倍速かったわ

265:デフォルトの名無しさん
10/02/09 17:39:16
>>263
たぶんハッシュ値

266:デフォルトの名無しさん
10/02/09 18:19:00
template <typename T> class Hoo : public T
という使い方は可能なのでしょうか?

例えば

template <typename T>
class ExceptionEX : public T
としてテンプレート引数を標準例外とし、任意の標準例外を継承して
通常のメッセージの他に
行番号__LINE__やファイル名__FILE__等の情報を含む汎用的な例外を作りたいと考えています。

最終的には
#define divide_by_zero_error() ExceptionEX<std::logic_error>(/*追加情報+0で除算メッセージ*/)
こんな形でマクロ定義で楽ができればな、と考えています

こういう事は可能なのでしょうか?

267:デフォルトの名無しさん
10/02/09 18:26:01
CRTPで調べてみるといいかもよ

268:デフォルトの名無しさん
10/02/09 18:49:29
>>266
できるよ。

269:デフォルトの名無しさん
10/02/09 19:08:32
指定したAというフォルダのなかに何が入ってるか
知る方法ってありますか

270:デフォルトの名無しさん
10/02/09 19:13:49
コンセプトさん早くこないかな

271:デフォルトの名無しさん
10/02/09 19:21:03
>>265
ありがとうございます

272:デフォルトの名無しさん
10/02/09 20:00:13
質問です
普段はVC++ 2008 Express Editionで開発しているのですが
ふと別のコンパイラでコンパイルしたところ、エラーが出ました
エラーの内容は「ここでは宣言は出来ない」という文章で4箇所
47,82,93.96行の場所です
どうも構造体のポインタを宣言する事が引っかかっているようです

ちなみに、VC++の方ではエラーは検出されませんでした

構造体へのポインタは、サイトをざっと見て試行錯誤しながらやったものなので
何かが間違っているのだろうとは思いますが、どの辺りかがよく分かりません
どなたかご指摘お願いします

ソースコードです↓
URLリンク(codepad.org)

273:デフォルトの名無しさん
10/02/09 20:03:29
C言語としてコンパイルするなら途中で変数の宣言は出来ない。関数の頭へ移動されればOK

274:デフォルトの名無しさん
10/02/09 20:09:10
>>273
つまりそれぞれの宣言を、関数の一番先頭に持ってくればよいと言う事でしょうか?
それはint型などの変数でも同じなのですか?

275:デフォルトの名無しさん
10/02/09 20:17:20
そうだよ

276:デフォルトの名無しさん
10/02/09 20:26:43
>>273,>>275
順序を変えてみたところ、素直にコンパイルしてくれました
こんな些細なことでもエラーが出るとは思いませんでした

ありがとうございました

277:デフォルトの名無しさん
10/02/09 20:40:17
>>276
> こんな些細なことでもエラーが出るとは思いませんでした
C/C++ではそんなんしょっちゅうだよ。
・・・まあコンパイルエラーが出ているウチは楽だよ。
実行時エラーが出ると発狂しそうになる。



278:デフォルトの名無しさん
10/02/09 20:54:45
>>269
あるよ

279:デフォルトの名無しさん
10/02/09 20:55:38
オブジェクトの比較は演算子をオーバーロードするのが一般的なのですか?

280:デフォルトの名無しさん
10/02/09 20:59:23
>>279
うん
でも比較用の関数やファンクタを使うこともしばしばある

281:デフォルトの名無しさん
10/02/09 21:04:04
templeteってジェネリックってことで、おk?

282:296
10/02/09 21:06:55
>>278
どうすればできますか?

また、その方法が紹介されているサイトとかあったら教えてください

283:デフォルトの名無しさん
10/02/09 21:09:04
>>282
環境別な方法(一般的)と、大抵の環境で出来る方法があるが、どっちがいい?

284:デフォルトの名無しさん
10/02/09 21:13:43
>>281
まあ表面的にはそう。


285:281
10/02/09 21:21:48
>>284
thx

286:デフォルトの名無しさん
10/02/09 21:24:06 BE:1620859469-2BP(0)
>>282

1. boost::filesystem
2. dirent.h
3. Win32 APIなどの環境別API
4. system("dir > temp");
5. __asm { 中略 int 1bh }

287:デフォルトの名無しさん
10/02/09 23:00:41
#include <Hoge>としただけなのに、Hoge* h = new Hoge();とできるクラスには
namespaceが設定されていないんですか?

288:デフォルトの名無しさん
10/02/09 23:20:01
#includeとクラスとnamespaceに何の関係が?

289:デフォルトの名無しさん
10/02/09 23:29:29
>>288
いまいわからないから、質問しているわけで

290:デフォルトの名無しさん
10/02/09 23:33:31 BE:960508984-2BP(0)
#define Hoge foo::HogeImpl

namespace foo
{
class HogeImpl { };
}

かもしれん

291:デフォルトの名無しさん
10/02/09 23:34:50
基本的に指定しなければグロバールのネームスペースに所属させられる。
明示的にくくってやればおk。

292:デフォルトの名無しさん
10/02/09 23:38:41
>>289
#include は、そこに書いてある名前のファイル (この場合では Hoge) の内容を、
あたかも直接書いたかのように取り込むだけです
例えばファイル Hoge の中身が

class Hoge {};

で、以下のソースコード

#include <Hoge>
int main(){ Hoge *h = new Hoge(); }

をコンパイルした場合、この #include <Hoge> の部分がファイル Hoge の中身に置き換わって

class Hoge {};
int main(){ Hoge *h = new Hoge(); }

と書いたかのようにコンパイルされます
ファイル Hoge に namespace が書いてあればそれは書いてあるように適用されるし、書いてなければ何もなしです

293:デフォルトの名無しさん
10/02/09 23:41:15
C++では、enum型を==で比較するのはダメなのでしょうか。

294:デフォルトの名無しさん
10/02/09 23:41:35
別にダメくない

295:デフォルトの名無しさん
10/02/09 23:44:11
というか比較しまくる

296:デフォルトの名無しさん
10/02/09 23:48:20 BE:720382346-2BP(0)
他にどうやって比較するのじゃ

297:デフォルトの名無しさん
10/02/09 23:49:04
引き算

298:デフォルトの名無しさん
10/02/09 23:51:21
多重定義

299:デフォルトの名無しさん
10/02/09 23:52:11 BE:480255528-2BP(0)
2重switch

300:デフォルトの名無しさん
10/02/09 23:55:33
>>291-292
thx

301:デフォルトの名無しさん
10/02/10 00:07:33
あのーplacement new[]の使い方がいまいち解りません。

Hoge* h = new Hoge[100];っていうのを
placement new[]でやるには、Hogeにどんなnewを定義すればいいでしょうか?

302:デフォルトの名無しさん
10/02/10 00:30:29
void *p = operator new(sizeof(Hoge)*100);
Hoge *h = (Hoge *)(new (p) Hoge[100]);

で大丈夫かな?
コンパイルは通るはずだけど。
(当然、Hogeにはデフォルトコンストラクタが必要。
デフォルト引数がある引数を持つコンストラクタで可能かは知らない)

ていうか、こうすると、
全部の要素に対して個々にデストラクタを呼び出してからメモリを解放するわけだし
だったらコンストラクタだって、(placement newを使って)個々に呼び出すだけで良いじゃない、という話になる。
それだったら、引数の制限も無いしね。

303:デフォルトの名無しさん
10/02/10 00:32:59
placement newって実装に依存するって話を聞いたんだが正確な話ではどうなってんの?

304:デフォルトの名無しさん
10/02/10 00:34:48
えー?
new[]が要素数をどこかに保存しているから実装依存、という話ではなくて?

305:デフォルトの名無しさん
10/02/10 00:38:33
URLリンク(homepage2.nifty.com)

ここの配置newのところに
コンパイラによって動作が異なるという問題があり
って書いてあるのが気になって

306:デフォルトの名無しさん
10/02/10 00:47:35
void *p = ::operator new(sizeof(Hoge));
Hoge *h = new (p) Hoge;
// ここで普通にhを使う
h->~Hoge();
::operator delete(h);

というコードは、どのコンパイラでも通るし正常に動くと思う。
(例外対応してない点を除けば)
普通のnew演算子とdelete演算子のやっていることを
エミュレートしているだけだから。

307:デフォルトの名無しさん
10/02/10 01:11:53
>>302
それ危ない。領域が足りない可能性が高い。
安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。
URLリンク(www.open-std.org)

308:デフォルトの名無しさん
10/02/10 01:59:04
int main() {
  printf("xx");
}
returnを書かなくてもエラーにも警告にもならないのですが、
これはC++の仕様なんでしょうか、それとも環境依存なのでしょうか。
VC++2008を使っています。

309:デフォルトの名無しさん
10/02/10 02:13:03
仕様

310:デフォルトの名無しさん
10/02/10 09:22:17
using namespace とテンプレートの特殊化についてですが

template<> class hoge<std::string>
という特殊化を定義してて
使用者側がusing namespace std;を宣言していて
hoge<string>とした場合呼ばれるクラスは汎用のものなのか特殊化された物なのかどちらになるのでしょうか

311:デフォルトの名無しさん
10/02/10 09:23:03
>>308
URLリンク(www.open-std.org) からたどれる current draft の
58、59頁には

If control reaches the end
of main without encountering a return statement, the effect is that of executing
return 0;

とある

312:デフォルトの名無しさん
10/02/10 11:52:32
クラスのメンバ関数はいつから使用可能なのでしょうか?
コンストラクタの初期化子にメンバ関数の返り値をあてることは出来るのでしょうか?

313:デフォルトの名無しさん
10/02/10 12:15:13
>>312
コンストラクタでメソッドが利用するメンバを初期化してたりしなければ問題ない;

314:デフォルトの名無しさん
10/02/10 14:02:13
Microsoft Visual C++ 2008 Express Edition SP1 のフォームアプリケーションでの質問です。
char配列若しくはwchar_t配列をテキストボックス(this->textBox1->Text)に表示したいのですが
単純に下のように代入しようと
 char str[256];
 this->textBox1->Text = str;
すると下のように出てしまいます。
 理由: 'char *' から 'System::String ^' へは変換できません。

テキストボックスにchar配列の内容を表示する方法を勉強できるサイトを教えてください。
よろしくお願いします。

315:デフォルトの名無しさん
10/02/10 14:15:35
>>314
フォームだとC++の範疇じゃない、C++/CLIになる。
this->textBox1->Text = gcnew String(str);
とかかな。
とにかく、C++のサイト探しても見つかりにくいよ、C++/CLIで

316:デフォルトの名無しさん
10/02/10 14:17:43
>>315
本当にありがとうございます!!
C++/CLIで検索しつつ精進します。

317:デフォルトの名無しさん
10/02/10 14:17:56
>>312
初期化子でthisを使うのは直接・間接を問わずバグの原因になりうる
だから初期化子でthisやメンバ関数を使うのは避けるべき
スコープに入ってからならthisやメンバも使っておk

318:デフォルトの名無しさん
10/02/10 14:35:09
>>313
>>317
大丈夫かも知れないけど変なバグの温床になりやすいと言うことでしょうか
ならばstaticなメンバにすれば大丈夫なのでしょうか

319:デフォルトの名無しさん
10/02/10 14:48:45
初期化子リストを使う段階ではオブジェクトが構築されてないのでthisが危険
初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険
メンバ関数は基本的に構築が正確に済んでいるオブジェクトから呼び出されることを前提にしているから初期化子への代入目的には基本的には使えない
staticメンバは問題無いので使っていい

320:デフォルトの名無しさん
10/02/10 16:09:31
vc2003+MFCのコンソールアプリについてですが、
入力待ち、処理中に閉じるボタンを押された際の処理方法を
教えてもらえないでしょうか。


321:デフォルトの名無しさん
10/02/10 18:28:27
>初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険
メンバの初期化順はメンバ変数が定義された順と決まってるだろう。

322:デフォルトの名無しさん
10/02/10 18:30:04
あれちゃんと順番に書いてる奴いんの?めんどくさいんだけど

323:デフォルトの名無しさん
10/02/10 18:42:19
危険 (キリッ

を放置するのが楽しいんじゃないか余計な突っ込み入れるなよぅ

324:デフォルトの名無しさん
10/02/10 18:49:19
プログラマって性格悪いやつすごく多くね?

325:デフォルトの名無しさん
10/02/10 18:57:01
以下のプログラムで、shori内のa[][]の値をそっくりメインのdata[][]に渡すにはどうすればいいのかが分かりません。教えてください。グローバル変数にしないとだめですか?

void shori()
{
int a[2][4];

a[1][1] = 10;//などと適当な処理
}

int main()
{
int data[2][4];

shori();
return 0;
}

326:デフォルトの名無しさん
10/02/10 18:59:31
void shori(int a[2][4])
{
a[1][1] = 10;
}

int main()
{
int data[2][4];
shori(data);
return 0;
}

327:デフォルトの名無しさん
10/02/10 21:01:50
>>326
解決しました ありがとうございます

328:デフォルトの名無しさん
10/02/10 21:24:52
#include <iostream>
#include <fstream>
#include <iterator>

void cat(std::istream &s)
{
std::istreambuf_iterator<char> it = s, end;

while(it != end)
{
std::cout << *it;

++it;
}
}

int main(void)
{
std::ifstream s("Test.cpp");

cat(s);

return 0;
}

EffectiveC++のサンプルコードではこういう感じでファイル名を渡す形ではなくそのままストリームを渡していました
なぜこの形式を使うんでしょうか?ファイル名を渡すのと比べてどんな利点があるんでしょう?

329:デフォルトの名無しさん
10/02/10 21:28:29 BE:540287429-2BP(0)
ファイル以外にも使えるようにじゃないか

330:デフォルトの名無しさん
10/02/10 21:29:41
>>328
ストリームをfstreamからiostreamやstringstreamに置き換えても
そのまま動くからじゃね?汎用化というか

331:デフォルトの名無しさん
10/02/10 21:37:35
Oh! ナルホド!

332:デフォルトの名無しさん
10/02/10 22:07:19
>>322
コンパイラによっては順番に書けやって怒られるぞ。

333:デフォルトの名無しさん
10/02/10 22:26:25
>310
string が std::string を指していて、かつ hoge<std::string> が可視なら特殊化されたものを使うだろ。
template だからって変なこと考える必要はないと思うよ。

334:デフォルトの名無しさん
10/02/10 22:30:57
別のファイルでstd::stringを自分で定義してhoge<std::string>ってしたらどうなるの?

335:デフォルトの名無しさん
10/02/10 22:32:18 BE:1080572494-2BP(0)
std内に何かを追加した時点で
動作が保障されないんだっけ?

336:デフォルトの名無しさん
10/02/10 22:33:25
stdに追加していいのはテンプレートの特殊化だけだったような

337:デフォルトの名無しさん
10/02/10 22:36:57
>>332
> コンパイラによっては順番に書けやって怒られるぞ。
そんなクソコンパイラもあるのか。


338:デフォルトの名無しさん
10/02/10 22:39:51
> std内に何かを追加した時点で
> 動作が保障されないんだっけ?
そう。未定義の動作になる。
ただし特殊化を除く。

> stdに追加していいのはテンプレートの特殊化だけだったような
その通り。



339:デフォルトの名無しさん
10/02/10 22:59:33
定義したくらを

class Hoge
{
....
}

Hoge h[100];

ってやるとエラーになっちゃうんですけど
h[100]って定義するためには何を自分のクラスに
記述すればいいのでしょうか。



340:デフォルトの名無しさん
10/02/10 23:02:32
デフォルトコンストラクタ

341:デフォルトの名無しさん
10/02/10 23:02:36
Hoge* h = new Hoge[100];

配列形式はPODしか使えない
おそらくコンストラクタを持っているのだろう

342:デフォルトの名無しさん
10/02/10 23:08:47
class Hoge {
int i;
public:
void seti(int j) { i = j; }
void printi() const { std::cout << i << std::endl; }
} hoge[100];

int main()
{
for (int i = 0; i < 100; i++)
hoge[i].seti(i);
for (int i = 0; i < 100; i++)
hoge[i].printi();
}

悪い、勘違いしていたようだ
>>340さんの言う通りデフォルトコンストラクタが抜けているんだろうな
デフォルト引数などを使って解決する事もできる

343:デフォルトの名無しさん
10/02/11 14:56:12
DLLの中の人が使うための共有メモリがあるとします
このメモリの確保・開放はDllMainでやるか、グローバルスマポでやるか
どっちが安全でしょうか?

344:デフォルトの名無しさん
10/02/11 15:10:31
DLLの中の人次第

345:デフォルトの名無しさん
10/02/11 15:40:54
>>343
グローバル変数やDllMainは使わない方法を考えるべきだね。


346:デフォルトの名無しさん
10/02/11 17:20:02
エディタのCPad for bccを
VisualC++のコンパイラに適応させるにはどうしたらいいですか?
コンパイラの場所以外になにか設定が必要でしょうか?


347:デフォルトの名無しさん
10/02/11 17:31:28
>>346
普通はそんな使い方しない。
IDE使えばいいんじゃないかな??

348:デフォルトの名無しさん
10/02/11 17:42:06
>>347
IDEがちょっと重いのでエディタでと変えようとしてたんですが、無理ですかね?


349:デフォルトの名無しさん
10/02/11 17:49:19
>>348
一応、CL自体はコマンドラインから使えるようにはなってるはずだが、もうズーットつかってないなぁ。
>cl /help でヘルプが見れたので適時変換して使えるようにすればできるかも。
ただ、労力には見合わないと思う。

350:デフォルトの名無しさん
10/02/11 17:52:25 BE:1200636858-2BP(0)
プロジェクトを用意してdevenvがいいんじゃないか

351:296
10/02/11 17:56:53
たしかにVC++は重い(スタートメニューが)

352:デフォルトの名無しさん
10/02/11 17:58:15
名前間違えた

353:デフォルトの名無しさん
10/02/11 18:22:28
-lm でlibm.aをリンクするらしいですが、
じゃあ僕もlib?.aファイル作ってみたいです
mingw32 gcc 4.4.1 Windows2000 SP4ですが
どうやって生成するんですか?

354:デフォルトの名無しさん
10/02/11 19:31:27
ld使え

355:デフォルトの名無しさん
10/02/11 19:55:04
コンストラクにstd::bad_allocをつける
場合、宣言の部分にだけかけばいいのでしょうか。

誰かサンプル書いて

356:デフォルトの名無しさん
10/02/11 20:16:48
つーかコンストラクタがstd::bad_allocを投げる場合は大抵のOSでは
後処理も出来ない状態の事が多いな

357:デフォルトの名無しさん
10/02/11 21:05:47
「bad_allocをつける」って意味がわからない。
例外指定のことだろうか。

358:デフォルトの名無しさん
10/02/11 21:42:47
>>356
じゃあ書かない方がいいのですね。

コンストラクタでメモリ確保とか何か重要な
C++は言語の不備なのでしょうけど、失敗が
ある場合放置するしかないのですよね?

359:デフォルトの名無しさん
10/02/11 21:47:28
bad_allocに限って言えばなにも考えずにmainでキャッチしてエラー通知して終了でいいと思う

360:デフォルトの名無しさん
10/02/11 21:48:06
>>358
メモリが足らないって、どの言語を使っていてもあるでしょ。

361:デフォルトの名無しさん
10/02/11 23:50:56
includeする時に、*.hが有るのと無いのがあるじゃん
あれって何が違うの?

362:デフォルトの名無しさん
10/02/11 23:57:16
>>361
C の標準ヘッダは .h。
C++ の標準ヘッダは拡張子なし。
非標準ヘッダは適当。

363:デフォルトの名無しさん
10/02/11 23:58:00
ファイル名が違う
#include は *.h でも *.txt でも *.hoge でもC言語の文法に合った内容のテキストファイルならなんでも #include できる

364:361
10/02/12 00:00:33
>>362-363
ありがとう。知らなかったよ

365:デフォルトの名無しさん
10/02/12 07:48:20
便乗で

""と<>両方あるけどあれもあんまり意味はない?

366:デフォルトの名無しさん
10/02/12 09:02:22
""だとカレントディレクトリを最初に検索
<>だとシステムのヘッダのみを検索

367:デフォルトの名無しさん
10/02/12 12:53:22
>>366
URLリンク(www.kijineko.co.jp)

368:デフォルトの名無しさん
10/02/12 16:37:15
inlineにするときに、これはまず展開されねーなっていう場合ってどんなのがある?
確実にダメなのって関数ポインタを使ってる時ぐらいかな?

369:デフォルトの名無しさん
10/02/12 16:45:49
関数ポインタって、それ仮想関数のことも当てはまるじゃん。

370:デフォルトの名無しさん
10/02/12 17:48:18
おまいら配置new/deleteって普段つこうとるの?

371:デフォルトの名無しさん
10/02/12 18:11:38
特殊な状況でしか塚湾だろう。

372:デフォルトの名無しさん
10/02/12 18:37:22
C言語で、windows.hのSleep()ではないウエイトをかける方法ありませんか?

373:デフォルトの名無しさん
10/02/12 18:41:14
timeGetTimeを使う

374:デフォルトの名無しさん
10/02/12 18:49:39
FindFirstFileを使いたいんですけれど
どうすれば使えるかがわかりません

何をどうすればいいのですか?

375:デフォルトの名無しさん
10/02/12 18:51:26
まずwinapiスレに行きます

376:デフォルトの名無しさん
10/02/12 18:53:04
次に手を洗います

377:デフォルトの名無しさん
10/02/12 18:53:52
ググって出たソースをパクる

378:デフォルトの名無しさん
10/02/12 18:54:10
URLリンク(schiphol.2ch.net)

379:デフォルトの名無しさん
10/02/12 18:54:53
誤爆

380:デフォルトの名無しさん
10/02/12 21:59:09
extern って、

#ifdef _MAIN_
int a, b, c;
char d, e, f;
struct _ST g, h, i;
class _CL j, k, l;
#else
extern int a, b, c;
extern char d, e, f;
extern struct _ST g, h, i;
extern class _CL j, k, l;
#endif

こういう風に使いますよね。
でも、これだと宣言と不便ですよね。

#ifndef _MAIN_
extern {
#endif
int a, b, c;
char d, e, f;
struct _ST g, h, i;
class _CL j, k, l;
#ifndef _MAIN_
}
#endif

こんな感じに一気に extern できないのでしょうか?

381:デフォルトの名無しさん
10/02/12 22:03:01
#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int a, b, c;

382:デフォルトの名無しさん
10/02/12 22:07:25
>>381
うお、すげー!
Thanks!

383:デフォルトの名無しさん
10/02/12 22:13:24
>>380-382
そんなウンコマクロが欲しくなるほどグローバル変数をばらまくんじゃねぇよ。

あと、インクルードガードに予約識別子使うな。

384:デフォルトの名無しさん
10/02/12 22:16:51
>>383
断る。

385:デフォルトの名無しさん
10/02/12 22:17:28
>>383
> 予約識別子
今知った。
指摘Thanks!

386:デフォルトの名無しさん
10/02/12 22:18:20
>>383
これみてるとC/C++って糞だよな

387:デフォルトの名無しさん
10/02/12 22:19:32
何を今更。

388:デフォルトの名無しさん
10/02/12 22:34:27
int &a(void) { static int a; return a; }

プロはどうしてもグローバル変数が欲しい時はこう書く
真似していいぞ

389:デフォルトの名無しさん
10/02/12 22:37:19
プロ・・・
クラスのメンバみたいにアクセスさせる形にすればいいだけなので
クラスを扱う言語経験者なら思いつくと思うけど

390:デフォルトの名無しさん
10/02/12 23:01:57
オススメの命名規則(C++)を教えてください
ハンガリアン記法は過去のものみたいなので

391:デフォルトの名無しさん
10/02/12 23:02:31
ドトネト式

392:デフォルトの名無しさん
10/02/12 23:08:16
perlのuse constantはそれと全く同等のことやってるな

393:デフォルトの名無しさん
10/02/12 23:19:49
FindFirstFile(path, &fd);
でD:\下のファイルの情報取得で

if(fd.dwFileAttributes!=0x00000002)

printf("%s\n", fd.~)


としたんですけど
D:\のSystem Volume Infomatonというフォルダが
条件から外れてくれません

どうすれば隠しフォルダを避けることができますか?

394:デフォルトの名無しさん
10/02/12 23:22:21
>>393
ビットフラグじゃね?

395:デフォルトの名無しさん
10/02/12 23:23:21
>>390
URLリンク(www.possibility.com)

396:デフォルトの名無しさん
10/02/13 00:43:24
/* 個人データ */
typedef struct{
char name[100];
double height;
double weight;
}member;

int main(void) {
member *ma;
int a=5;

if ((ma = calloc(a, sizeof(member))) == NULL) {
puts("calloc error");
exit(1);
}


カロックのところでエラーになるんだけどなんでかな?

397:デフォルトの名無しさん
10/02/13 00:50:09
>>396
ヒープが足りんのだろう。
戻り値の仕様ぐらい読め。

398:デフォルトの名無しさん
10/02/13 00:51:45
>>396
ライブラリを使うためのヘッダのインクルードが無い。
中括弧がいっこ足りない。

399:デフォルトの名無しさん
10/02/13 00:51:57
>>396
出ませんが
ただ '}' が一つ抜けています

400:デフォルトの名無しさん
10/02/13 00:52:43
ああ #include <stdlib.h> が抜けてるとかいうオチ?

401:デフォルトの名無しさん
10/02/13 01:13:45
返信はやっ!

URLリンク(kansai2channeler.hp.infoseek.co.jp)

全部はりつけてきました しゅくだい

データは
2
TARO 170 64
ICHIRO 180 54

とかで入ってます
1行目に人数

402:デフォルトの名無しさん
10/02/13 01:21:38
動かすの面倒なんでエラーメッセージ張ってくれ
callocってヒープから取るんだろ
doublex2 charx100(正確には101)とアライメント入れてもそれほど大きくないしなあ

403:デフォルトの名無しさん
10/02/13 01:26:35
>>401
fscanf() のエラーもチェックしろ。
calloc() のエラーとは関係ないだろうが、 "%lf" に渡す引数は double じゃなくて double* な。
やっぱりヘッダのインクルード足りないし。

404:デフォルトの名無しさん
10/02/13 01:38:26
>>403
しゅくだいなんだけど,ヘッダのとこは変更できないのよ・・・
ここに解答を書くってところだけ

ヘッダのインクルードなしでどうすればできるかなぁ

405:デフォルトの名無しさん
10/02/13 01:40:59
>>404
動かすためにとりあえずヘッダ入れて
確認ができたらはずせばいい

406:デフォルトの名無しさん
10/02/13 01:48:47
コピー多いな
文字列へのポインタ持ってポインタソートした方がすっきりする

407:デフォルトの名無しさん
10/02/13 02:05:31
>>405
ヘッダ入れたらコンパイルできたけど,実行するとフリーズする・・・

408:デフォルトの名無しさん
10/02/13 02:44:46
>>403
fscanfのとこの&でしたorz

ありがと(^ω^)

409:デフォルトの名無しさん
10/02/13 06:42:23
URLリンク(www.not-enough.org)
にあるレイトレーシングのソースコードをコンパイルしてみたのですがエラーが出てしまいます
URLリンク(codepad.org)

どこをどうすればよいのでしょうか?
お助けください。

410:デフォルトの名無しさん
10/02/13 13:12:43
>>409
URLリンク(codepad.org)

正しいかどうか知らんよ
しかし基本的なC++文法エラーを犯しているなこの作者は


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch