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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:15:45 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/

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

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


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

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

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

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

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

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

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

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 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:46:26 ]
敢えて一行で書くならこうかな?
#define REG_B (*(void(*volatile*)()) 0XFFFF1234)

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

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

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

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

15 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 10:32:39 ]
>>12
boost::serializationかな



16 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:24:01 ]
>>12
もうまさにboost::serializationだな。


17 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 17:21:13 ]
>>12
保存中の進捗表示はboost::progress_displayにお任せ!

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

解決できず困っている事があるので、よろしくお願いします。
質問 → kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10478.txt

19 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 18:26:32 ]
WindowsでフリーでVC++ライクの総合環境ってなんか無い?

20 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 18:42:37 ]
>>19 VC++ EE

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


int address = 0x00000;

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


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

22 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 23:05:05 ]
代入先を考えろ

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

24 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 23:48:12 ]
>>21
単に警告でないように強制型合わせしているだけ
違うものを強制挿入する時よくやる





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

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

28 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 00:08:26 ]
関ポはtypedef
これ、常識ね

30 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 00:18:05 ]
>>30
通った! ありがとう!
そう書けばよかったのか・・・。

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

32 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 00:56:26 ]
>>14-16
virtual 使ってるクラスでもできる?

33 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 09:09:07 ]
>>34 うん。



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

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

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

38 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:10:24 ]
>>36

C++はないよ

C# ならある

39 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:17:59 ]
>>38
わかったよ、ありがとう

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

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

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

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

43 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 16:28:40 ]
template <typename T> class Hoge
と言うクラスがあるとき

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

44 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 16:30:30 ]
コンパイラによります

45 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 16:32:45 ]
使用環境はVS2005standard editionです



46 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:38:51 ]
>>43
仕方がありません
Comeau C++を買いましょう

47 名前:40 mailto:sage [2010/02/02(火) 19:25:32 ]
>>41-42
ありがとうございます

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

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

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

50 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 20:39:53 ]
>>48
thx

51 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 21:45:20 ]
>>49
Boost FAQには以下のようにあるけど。

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

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

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

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


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

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


55 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 22:32:54 ]
The Loki Library
を見てみたら、ふつーに.hだったわ。




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

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

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

59 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 22:57:07 ]
>>58
cputime と usertime の差?

60 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 23:12:30 ]
>>57
www.moongift.jp/2010/01/sqlcipher/
これとかどうだろう

61 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 06:37:25 ]
警告残した方が後々の為に良い気も

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

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

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

64 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 09:35:07 ]
namespaceとはどういうときに使用するのですか?

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



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

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

68 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:43:42 ]
DQN的プログラミングにnamespaceは不要

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

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

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

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

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

73 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 12:14:27 ]
>>73
それじゃどこからエラー出たか特定できないじゃん

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



76 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 12:28:21 ]
__FILE__と__LINE__をパラメータで渡せばいい

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

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

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

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

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

81 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 16:00:32 ]
class out_of_range_with_line_number : public std::out_of_range {
...........
};

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


83 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 16:37:42 ]
つ boost::exception

84 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:48:55 ]
>>81>>83
やっぱり継承するなりなんなりするしかないか

85 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:37:02 ]
>>78
デストラクタを private にしてみるとか。

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




86 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:50:11 ]
まともに使えねえよ

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

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

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

89 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 20:52:17 ]
教えて下さい。

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

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

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

環境
WindowsXP
Microsoft VisualC++ 6.0 MFC

90 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 01:59:50 ]
>>62-63
ありがとう。できるだけ根本的に修正するようにしてみる。
ついでに、このコードについても教えてくれないか。

ttp://codepad.org/novJOf5Z

これ、仕事で使ってる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 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 05:32:31 ]
>>91
どうしてそんな碌でも無いコードばかり書くんだ…

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

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

93 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:44:54 ]
intの奇数番地アクセスに問題ないCPUだったら、大丈夫かも

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

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

int32_t
とかに

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

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

101 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:21:27 ]
>>99
ttp://www.kijineko.co.jp/node/63
こういうのがあるよ

102 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 23:42:27 ]
>>100
それでもその強引なキャストは要らんのでは?

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

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

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

また、QWidgetは#includeもclassも書かれていませんが
なぜ、使う事ができるのでしょうか?
calmlight.s2.zmx.jp/Qt4Examples/SimpleMenu.html

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

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



106 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 09:30:31 ]
>>106
別のクラス class C : public A (略)などが、 B とは違う都合でそいつを使っている
かもしれないから。

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

108 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:04:23 ]
だったら外からアクセスしてるのに同じクラスのprivateにアクセス出来るのはおかしいはず

110 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:17:53 ]
>>100
>>92に追記しておくけど
-Wstrict-aliasingは全ての問題があるケースを警告するとは限らない
-Wstrict-aliasingは-Wstrict-aliasing=3と同じで
-Wstrict-aliasing=1が最も「少しでも怪しければ警告にする」けど
それでもit has very few false negativesとしか言われてない
gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#index-Wstrict_002daliasing_003dn-317

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

112 名前:デフォルトの名無しさん mailto:sage [2010/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 mailto:sage [2010/02/05(金) 10:28:46 ]
ん?ごめん、読み違えた。

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

112 は忘れて。

114 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 15:57:26 ]
ifstream と Win32 ReadFile のメリットとデメリットを教えてください

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

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



116 名前:114 mailto:sage [2010/02/05(金) 16:10:02 ]
ReadFile引数のブッファ指定のところでファイルサイズ渡しているので1バイトずつではないはず

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

118 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 17:24:52 ]
それだとReadFileが遅い理由にならんのでは

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

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

121 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 19:48:25 ]
ifstreamが速い理由にならんぞ

122 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:15:36 ]
ナニ言ってんだオマエは

123 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:16:50 ]
ちなみに
stdioと比較してifstreamは全然速くない。

124 名前:デフォルトの名無しさん [2010/02/05(金) 20:23:02 ]
比較しちゃだめだろ

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


125 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:39:29 ]
継承によって作られている所です

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

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



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


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

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

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

わかりやすくおしえてね

129 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 23:49:40 ]
>>128
は?
頭おかしいの?

130 名前:デフォルトの名無しさん [2010/02/05(金) 23:50:12 ]
>>128
Win32API質問箱 Build86
pc12.2ch.net/test/read.cgi/tech/1265350980/

131 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 23:52:04 ]
どっちかというとMFCのほうだな

132 名前:デフォルトの名無しさん [2010/02/06(土) 02:27:22 ]
PaintDCの描画領域のクリア方法教えて

133 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 10:22:50 ]
InvalidateRectもしくはValidateRectのことか
それともFillRectのことだろうか

134 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:41:57 ]
template < int Foo >
const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0);

137 名前:134 mailto:sage [2010/02/06(土) 13:51:57 ]

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

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

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

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

141 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 18:05:26 ]
前方宣言が必要なパターン

class B;

class A {
B b;
};

class B {
A *a;
};

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

142 名前:138 mailto:sage [2010/02/06(土) 18:06:41 ]
>>140
やっぱり、そうだよね
thx

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

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

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



146 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:50:12 ]
そういうライブラリを探す。

147 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:57:22 ]
>>145
それは不可能だろう。

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

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

149 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 23:53:46 ]
GetJoystickState

150 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 00:13:35 ]
>>148
Windows APIか、DirectXのDirectInputを使う

Joystick Reference (Windows)
ttp://msdn.microsoft.com/en-us/library/dd757121(VS.85).aspx

DirectInput
ttp://msdn.microsoft.com/en-us/library/ee416842(VS.85).aspx
ttp://msdn.microsoft.com/ja-jp/library/bb219802(VS.85).aspx

151 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 00:45:10 ]
OpenGLスレで聞いてみれば?

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

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

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



156 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 07:19:04 ]
void * にdynamic_castは無理

157 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 08:14:09 ]
C++にはリフレクションがないから無理だろ

158 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 10:01:05 ]
>>154
shared_ptr があるよ

159 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:15:33 ]
struct hoge {
int bar1;
char *buf;
int bar2;
};

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

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

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

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

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

162 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:45:30 ]
void*のポインタ先をデータの生ポインタではなく、

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

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

163 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:56:54 ]
>>159
ずれない
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ---> NULL
                 |------|
0x11111108 | bar2   |
                +------+
↑こんな感じのが ↓こんな感じになるだけ
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ----+
                 |------|        |
0x11111108 | bar2   |        |
                +------+        |
                 +------+       |
0x22222200 | 文字列 |  <--+
                 +------+

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



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

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


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

167 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:39:16 ]
>void*がptr_holder*に戻せるか

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

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

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

170 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:02 ]
gccとかのこと?

171 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:38 ]
>>169
まずは C 標準ライブラリと C++ 標準ライブラリだな。

172 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:29:38 ]
>>171
boostというのが標準ですか?それともSTLというのですか?

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

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



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



176 名前:progress_display mailto:sage [2010/02/07(日) 15:49:25 ]
>>175
私のことお呼び?

177 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:47:07 ]
fがFooのポインタなら1だし、Fooのインスタンスなら2
ツールキットとかそういう問題じゃない
そもそもpublic void setXXXは通常なら構文エラー

179 名前:177 mailto:sage [2010/02/07(日) 16:51:15 ]
>>178
1はFoo* f = new Foo();
2はFoo f;
で宣言しています

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

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

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

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

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

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

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

184 名前:177 mailto:sage [2010/02/07(日) 17:56:51 ]
>>180
それもそうですね

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

>>183
yes

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



186 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:17:44 ]
185は忘れてくれ

187 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:21:54 ]
>>185
ドンマイ。たまにうっかりしちゃうよな。

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

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

191 名前:190 mailto:sage [2010/02/07(日) 18:56:52 ]
ごめん違った。Javaはfinalizeがいつ実行されるのか分からんのね。

192 名前:177 mailto:sage [2010/02/07(日) 19:11:12 ]
>>189
その通りです。そういう質問です
ttp://gihyo.jp/dev/feature/01/qt/0003?page=2
>1.子ウィジェットのメモリ解放の自動化
を読んでいたら疑問が湧きました

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

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

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

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

わかりずらくて、スマソ

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


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

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

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

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

198 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:41:20 ]
コピーコンストラクタは間違いだった。

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

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

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

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

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

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

201 名前:177 mailto:sage [2010/02/07(日) 20:07:03 ]
>>200
>Javaには真似できないRAII
これ調べておきます

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


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

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

204 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:28:11 ]
なぜわざわざ荒れそうな方向へ持っていく

205 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:30:31 ]
>>204
そういう荒れそうな発言は、メッ!ですよ



206 名前:177 mailto:sage [2010/02/07(日) 20:32:25 ]
>>202
いろいろと、ありがとうございました

207 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:33:14 ]
>>203
Cはクラスがないじゃん
だから面倒くさい

208 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:34:52 ]
これがゆとりか…

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

210 名前:209 mailto:sage [2010/02/07(日) 21:13:17 ]
ごめん、誤爆した

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

212 名前:デフォルトの名無しさん [2010/02/07(日) 21:48:26 ]
www1.axfc.net/uploader/Sc/so/80610.zip

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

www.codesynthesis.com/products/xsde/

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

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

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


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



216 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:03:24 ]
そこでAccelerated C++ですよ

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

218 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 02:48:34 ]
「〜の数」ってときにつける変数名、皆さんはどうしてますか。
たとえばりんごの数とか…。

219 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:13:16 ]
num_apples

220 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:16:40 ]
人に薦めるならcountかなぁ。

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

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

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

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

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

225 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 08:52:24 ]
個数ならcount
量ならamountだな



226 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 09:26:00 ]
変数名スレでやれ

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

228 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 15:06:36 ]
cin>>n は数値を読むだけで改行は読まないから
改行が来るまで吐き出させるとか
char c;
do {
cin >> c;
} while (c != '\n');

230 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:58:47 ]
stringはデフォでboolに変換できない。
s.c_str()とかやりなされ

232 名前:230 mailto:sage [2010/02/08(月) 21:14:31 ]
>>231
s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが

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


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

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

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



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

237 名前:230 mailto:sage [2010/02/08(月) 21:53:01 ]
>>236
わかりました
ありがとうございます

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

239 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:38:26 ]
if(boolean-expression) {}

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

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

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

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


240 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:51:23 ]
>>238
実装によるとしか。
大抵ほぼ同じになると思うが。

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

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

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


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

243 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:30:57 ]
どこが分からないの?

245 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:52:36 ]
>>244
この辺がよくわかりません。
static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));

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

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

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

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

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

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

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

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

252 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 10:25:13 ]
そもそもHTTPはわかってるの?

253 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:43:02 ]
>>252
軽く調べた程度の知識しかないです。

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

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




256 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:01 ]
virtual function-name() = 0

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

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

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

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

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

261 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:33:30 ]
codepad.org/TMxmPZN4

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

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

263 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 15:08:46 ]
std::tr1::unordered_set<Foo>

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

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

265 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:39:16 ]
>>263
たぶんハッシュ値



266 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:26:01 ]
CRTPで調べてみるといいかもよ

268 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:49:29 ]
>>266
できるよ。

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

270 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:13:49 ]
コンセプトさん早くこないかな

271 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:21:03 ]
>>265
ありがとうございます

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

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

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

ソースコードです↓
codepad.org/bPyH9hRl

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

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

275 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:17:20 ]
そうだよ



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

ありがとうございました

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



278 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:54:45 ]
>>269
あるよ

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

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

281 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:04:04 ]
templeteってジェネリックってことで、おk?

282 名前:296 mailto:sage [2010/02/09(火) 21:06:55 ]
>>278
どうすればできますか?

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

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

284 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:13:43 ]
>>281
まあ表面的にはそう。


285 名前:281 mailto:sage [2010/02/09(火) 21:21:48 ]
>>284
thx



286 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:00:41 ]
#include <Hoge>としただけなのに、Hoge* h = new Hoge();とできるクラスには
namespaceが設定されていないんですか?

288 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:20:01 ]
#includeとクラスとnamespaceに何の関係が?

289 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:29:29 ]
>>288
いまいわからないから、質問しているわけで

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

namespace foo
{
class HogeImpl { };
}

かもしれん

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

292 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:15 ]
C++では、enum型を==で比較するのはダメなのでしょうか。

294 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:35 ]
別にダメくない

295 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:44:11 ]
というか比較しまくる



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

297 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:49:04 ]
引き算

298 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:51:21 ]
多重定義

299 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:52:11 BE:480255528-2BP(0)]
2重switch

300 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:55:33 ]
>>291-292
thx

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

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

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

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

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

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

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

305 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:38:33 ]
homepage2.nifty.com/well/Operator.html

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



306 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:11:53 ]
>>302
それ危ない。領域が足りない可能性が高い。
安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。
www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476

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

309 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:13:03 ]
仕様

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

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

311 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 09:23:03 ]
>>308
ttp://www.open-std.org/jtc1/sc22/wg21/ からたどれる 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 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 11:52:32 ]
クラスのメンバ関数はいつから使用可能なのでしょうか?
コンストラクタの初期化子にメンバ関数の返り値をあてることは出来るのでしょうか?

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

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



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

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

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

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

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


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

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

323 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:42:19 ]
危険 (キリッ

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

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

325 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん [2010/02/10(水) 21:01:50 ]
>>326
解決しました ありがとうございます

328 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:28:29 BE:540287429-2BP(0)]
ファイル以外にも使えるようにじゃないか

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

331 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:37:35 ]
Oh! ナルホド!

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

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

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

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



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

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


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

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



339 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:59:33 ]
定義したくらを

class Hoge
{
....
}

Hoge h[100];

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



340 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:02:32 ]
デフォルトコンストラクタ

341 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:02:36 ]
Hoge* h = new Hoge[100];

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

342 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 14:56:12 ]
DLLの中の人が使うための共有メモリがあるとします
このメモリの確保・開放はDllMainでやるか、グローバルスマポでやるか
どっちが安全でしょうか?

344 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 15:10:31 ]
DLLの中の人次第

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




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


347 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:31:28 ]
>>346
普通はそんな使い方しない。
IDE使えばいいんじゃないかな??

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


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

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

351 名前:296 mailto:sage [2010/02/11(木) 17:56:53 ]
たしかにVC++は重い(スタートメニューが)

352 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:58:15 ]
名前間違えた

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

354 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 19:31:27 ]
ld使え

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

誰かサンプル書いて



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

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

358 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:42:47 ]
>>356
じゃあ書かない方がいいのですね。

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

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

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

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

362 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:57:16 ]
>>361
C の標準ヘッダは .h。
C++ の標準ヘッダは拡張子なし。
非標準ヘッダは適当。

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

364 名前:361 mailto:sage [2010/02/12(金) 00:00:33 ]
>>362-363
ありがとう。知らなかったよ

365 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 07:48:20 ]
便乗で

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



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

367 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 12:53:22 ]
>>366
www.kijineko.co.jp/tech/superstitions/quoted-headername-is-searched-for-from-cwd.html

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

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

370 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 17:48:18 ]
おまいら配置new/deleteって普段つこうとるの?

371 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:11:38 ]
特殊な状況でしか塚湾だろう。

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

373 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:41:14 ]
timeGetTimeを使う

374 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:49:39 ]
FindFirstFileを使いたいんですけれど
どうすれば使えるかがわかりません

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

375 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:51:26 ]
まずwinapiスレに行きます



376 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:53:04 ]
次に手を洗います

377 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:53:52 ]
ググって出たソースをパクる

378 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:54:10 ]
schiphol.2ch.net/gameurawaza/

379 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:54:53 ]
誤爆

380 名前:デフォルトの名無しさん [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:03:01 ]
#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int a, b, c;

382 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:07:25 ]
>>381
うお、すげー!
Thanks!

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

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

384 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:16:51 ]
>>383
断る。

385 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:17:28 ]
>>383
> 予約識別子
今知った。
指摘Thanks!



386 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:18:20 ]
>>383
これみてるとC/C++って糞だよな

387 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:19:32 ]
何を今更。

388 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:34:27 ]
int &a(void) { static int a; return a; }

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

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

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

391 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:02:31 ]
ドトネト式

392 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:08:16 ]
perlのuse constantはそれと全く同等のことやってるな

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

if(fd.dwFileAttributes!=0x00000002)

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


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

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

394 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:22:21 ]
>>393
ビットフラグじゃね?

395 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:23:21 ]
>>390
www.possibility.com/Cpp/CppCodingStandard.html#descriptive



396 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:50:09 ]
>>396
ヒープが足りんのだろう。
戻り値の仕様ぐらい読め。

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

399 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:51:57 ]
>>396
出ませんが
ただ '}' が一つ抜けています

400 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:52:43 ]
ああ #include <stdlib.h> が抜けてるとかいうオチ?

401 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:13:45 ]
返信はやっ!

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10523.c

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

データは
2
TARO 170 64
ICHIRO 180 54

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

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

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

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

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

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



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

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

408 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 02:44:46 ]
>>403
fscanfのとこの&でしたorz

ありがと(^ω^)

409 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 06:42:23 ]
www.not-enough.org/abe/manual/ray-project/cc.html
にあるレイトレーシングのソースコードをコンパイルしてみたのですがエラーが出てしまいます
codepad.org/fErUOLbG

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

410 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:12:43 ]
>>409
codepad.org/m4SeoRfu

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

411 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:16:11 ]
g++の拡張文法を使っているのかもしれない
ポータビリティを考えるなら標準C++に従って書いた方がいいね

412 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:50:32 ]
>>410
コンパイルしてちゃんとppmファイルを得ることが出来ました
ありがとうございました!

413 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:05:09 ]
超初歩的な質問で恐縮なんですが
CとC++ではCを先に学んだ方がいいんですか?
それとおすすめのサイトとか書籍があったら教えてもらえませんか?

414 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:08:20 ]
>>413
歴史をなぞるなら C から。
何か早く作りたいものがあるなら C++ からのほうが早いかもしれない。
ただし C に由来する落とし穴も多く残っているので、危ないかもしれない。

どっちからと考えずに、必要なときに必要な情報を確認しながら学ぶのが
おすすめ。

お勧めサイト。
www.google.co.jp/

415 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:11:04 ]
>>413
プログラミングしたことあるの?




416 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:11:48 ]
C++入門といってもクラスやSTLは後半!とか続刊!とかの入門書なら
内容はCとかわらないよ。


417 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:15:19 ]
あと面倒なのが最近はunicodeベースでコンパイルしちゃう物があるのに
古い標準関数はマルチバイトベースだったりととにかく古いだけあってめんどくさい>C/C++

418 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:15:25 ]
>>414
特に急ぎ足では無く、ゆっくり学ぼうと思ってるんでCからいこうと思います。
ググるのは大切ですね、しかし紹介されてるサイトや書籍があまりにも多いので戸惑います。

>>415
すごい勢いでド素人です。

419 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:17:25 ]
>>417
CとC++はわりと古いから、やり難い事があるという事だけわかりました!・

420 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:20:05 ]
>>413
お勧め書籍。
www.stroustrup.com/Programming/

421 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:20:11 ]
C++を学びたいならC++から
Cも学びたいからCから
C++をやるとCなんて馬鹿らしくてやってられないから

422 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:25:03 ]
>>420
おぅふ・・・なんかすげぇのきた。これは理解できそうにない

>>421
++というだけあって発展形なんですね。


423 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:37:34 ]
>>422
> ++というだけあって発展形なんですね。
今もC++はC言語のコードを(割と互換性があるので)使える。
でも厳密な互換性じゃないので使えないこともある。

424 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:38:41 ]
>>418
windowsしか使わないなら、C#あたりからやった方がいいよ
C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい

425 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:43:20 ]
>>424
> windowsしか使わないなら、C#あたりからやった方がいいよ
いや、俺の意見としては
C#だけは止めた方が良い。
> C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
そんならP言語(Python, Pascal, PHP)をやれば良いと思う。
Rubyはよーしらんが。



426 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:43:29 ]
>>423
なるほど!参考になります。

>>424
#ですか、比較的敷居が低いんでしょうか。
まずそれから弄るのもいいかもしれませんね、ありがとうございます。

427 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:45:23 ]
qmakeとcmakeって何が違うわけ
makeファイルを作っているだけなのか

428 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:46:22 ]
まぁC#使っても、あれは出来ないだの、これはC経由しろだの、あるけどな。

429 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:47:41 ]
C#使うくらいならJavaでいいじゃん

430 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:50:08 ]
C, C++をやってから、GCのありがたみを感じるべき

431 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:51:47 ]
>>428
API使えるしまあいろいろ方法はあるよ
C#->C++に戻ってみるとC#で当たり前に使ってる部品がなくて自作することになったり
文字コード関連ではまるよりよっぽどいい

432 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:54:50 ]
昔の言語関連って無意味に省略しまくってるから直感で意味が通じないんだよな

C->C#とC++すっとばして覚えたところでC++にいったけどさ

c_strとかなんだよそれ

433 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:57:21 ]
好きなのを選ぶが良い
ttp://vintage-digital.com/hefner/misc/lisp-programmers.jpg


434 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:58:17 ]
俺ロキュータスいくわ

435 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:58:37 ]
>>433
怪しすぎるww
特にC++は何だこりゃw



436 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:00:01 ]
>>432
仕方ねーんだよ
昔のリンカは識別子を最大6文字しか認識しない時代があって
Cはその時に作られた物だから

C++はとっくにその制限は撤廃されているがなぜかCの癖を無意味に
引きずって省略しまくっている
タイプ量を減らすためか?

437 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:01:01 ]
>>433
ASP.NETにいかざるをえない

というか皆さん千差万別ですね、そりゃネットのおすすめの書籍も色々あるわけだ・・・
ここにテンプレがないのもそのせいか!

438 名前:デフォルトの名無しさん [2010/02/13(土) 18:03:32 ]
>>436
まあギークが「ぼくのかんがえたさいきょうのげんごかくちょう」がC++だからタイプ量減らすためじゃね?
std::stringのstringからcharに変換するやつね
stringだからC++からの物だよね

439 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:04:57 ]
Haskellやべえ


440 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:05:06 ]
C++やるならQt Creator + VCのコンパイラがいいよ

441 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:17:54 ]
>>426
いや、俺の意見としては
C#だけは止めた方が良い。

442 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:18:13 ]
>>440
メモっときます、ありがとう。

皆ありがとう。感謝します。
とりあえず色々触ってみた上で何か一つに絞って、学んでいこうと思う!

443 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:03:26 ]
>>441
いやいや、C#は便利だぞ。
C++よりも綺麗だし。

444 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:46:45 ]
>>443
そんなこと言ってまた不幸になる人を増やすのか!

> C++よりも綺麗だし。
そんな言語いっぱいあるじゃないかw


445 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 21:45:41 ]
>>444
C#で不幸になるやつは、もともと不幸なやつだけだ。



446 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:14:59 ]
C#は.NETで出来ないことしようとすると、途端に不幸になる気がする。
MFCだと、のっけから不幸にだが・・・

447 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:27:06 ]
ぶっちゃけCから始めるのがいいよ
C99ならC++の便利なところは大体使えるし

448 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:06:35 ]
Cを覚えてenumや構造体や関数で取り敢えずなんとか実用になるライブラリとか書く。
しかしC++でnamespaceやクラスを知ると、それまで書いたのを全部書き直したくなるんだよ。
で、書き直した頃にtemplateに手を出して、また書き直したくなるわけ。
その後もSTLやらEffectiveC++やらBoostやらにかぶれるたびに、今まで書いたものがゴミに見える。
さらにC++0.xなんてので、今また過去の糞化現象が起こるんです。

449 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:11:09 ]
それを楽しめるマゾ向け

450 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:14:47 ]
最近はもう逆に余計なものみんな取り払って++も付かない99でもないCだけでいいんじゃないかと思えてきた

451 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:15:35 ]
99より前にもいくつかあるんだが

452 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:18:56 ]
shop99 と shop100 だと500円の買い物で
5円とか半端な数字出る出ないの違いが有るよね

453 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 05:48:56 ]
入門書とかで「解説のためにわざと非効率なコード書いてます」とか出ると混乱するよな。

454 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:02:18 ]
>>447
C99に完全準拠しているコンパイラはIntel C++などごく一部だけだぞ
g++も部分準拠だし移植性がないしだいたいg++はC++0xへの改訂作業で
手一杯で今は時代遅れのC99に携わっている暇はないだろう

455 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:07:15 ]
C++0xへの改訂作業なんて、
考えるだけで頭痛くなってくるなww



456 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:11:50 ]
C99への準拠を強化するよかまだ0xに力入れた方がマシということ

457 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:11:59 ]
でもnullptrとdecltype、auto、右辺値参照、コンテナの初期化子
など痒い所に手が届くようになるのはありがたいよな

458 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 11:36:08 ]
今までが届かなさすぎだったんだよ!

459 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 12:53:10 ]
/usr/include/を見ていたら、*.hと*.cppがありました
*.cppには#include "*.h"としか書いてありません
一体何がしたいんですか?


460 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 12:57:27 ]
>>459 知るか。書いた奴に聞けよ。

461 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:00:38 ]
イテレータから元の変数にアクセスできますか。

vector<int>::iterator p;だと、配列要素の値と位置がわかるだけ気がしますが
pの前方に要素追加したり削除したりとか。

462 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:04:23 ]
>>461
「元の変数」って何?
vector インスタンスのことなら、無理。

463 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:06:31 ]
サンクス

464 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:24:40 ]
スタティックリンクライブラリ作成についての質問なんですが

1.C言語でも扱えるようにAPIの引数や戻り値部分だけあわせておけば
内部でC++で書いていようが問題はない?

2.スタティックリンクライブラリをコンパイルする際にスタティックリンクライブラリが
利用する外部の機能を取り込まないようにするにはどうすればいいですか?
(VC++2008

465 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:33:30 ]
親クラスを継承して子クラスを作るときには、
子クラスのヘッダファイルにもオーバーライドするメソッドを、定義しないとダメなんですか?

一応自分でも試してみたんですが、コンパイラ様に怒られたので



466 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:35:30 ]
>>465
そんなことはない。

エラーメッセージは?できればソースも出して。

467 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:36:57 ]
純粋仮想関数を持つ親クラスを継承した子クラスをインスタンスとして使おうとしたとか?

468 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:38:57 ]
>>465
あとメソッドっていう用語は存在しないので、
今後はメンバ関数member functionと
呼ぶようにしなさいね。



469 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:42:06 ]
>>464
1は、extern "C"もつければおk

2は、「取り込まない」の意味が微妙。
作ってるライブラリをAとして、
AはBというライブラリを使用しているとき、
AにBを含ませたくないという意味?

特殊なことしなければ「取り込まない」状態だと思う。

Aのプロジェクトの中にBのlibファイルを追加すれば
「取り込む」状態になるけど。

470 名前:465 mailto:sage [2010/02/14(日) 15:48:08 ]
ひとまず、ヘッダファイルだけ晒します
class Super{
public:
 Super();
 virtual void print();
 ~Super();
};

class Sub : public Super{
public:
Sub();
void print();
~Sub();
};

エラー
${HOME}/Test/sub.cpp:8: error: no ‘void Sub::print()’ member function declared in class ‘Sub’

471 名前:デフォルトの名無しさん [2010/02/14(日) 15:57:10 ]
Visal C++ 2008 ExpレッsEditionでWindowsXP向けの開発です。
ウィンドウごとに音量を調整、若しくは開いているフラッシュオブジェクトの音量を調整する関数
または手法は無いでしょうか?

472 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:16:59 ]
イテレータは挿入しても保たれるけど、end()とbegin()はそうでないのね。
不便。何でこんな事にしたの。

473 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:24:09 ]
>>472
??保たれない場合もあるだろ。何を言いたいのかよく分からんぞ。

474 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:28:15 ]
そうなのか。気をつける。

475 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:41:04 ]
何が保たれるんだ?



476 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:42:04 ]
*.cppに直接宣言している変数って何なんですか?

477 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:44:46 ]
どんなコード?

478 名前:476 mailto:sage [2010/02/14(日) 16:48:30 ]
>>477
こんなコードです
DownloadManager *BrowserApplication::s_downloadManager = 0;
HistoryManager *BrowserApplication::s_historyManager = 0;
NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;

479 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:53:36 ]
googleのコード検索で見たけど
グローバル変数だね

480 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:57:51 ]
prefix の s_ はstatic変数のsを表しているのかもしれない

481 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:58:43 ]
>>478
staticのメンバ変数は、どっかに実体を宣言しないといけない。

482 名前:479 mailto:sage [2010/02/14(日) 17:01:50 ]
そうだったw
479は間違い

483 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:04:26 ]
boost::tuples or tuple
の使い方が分かる日本語のサイトを教えてください。

名前空間が
boost::tuplesなのかboost::tupleなのか、
色々混ざっているようなので
ググっても謎です。

現行仕様のboost.タプルのの使い方が分かる日本語のサイトを教えてください。

よろしくお願い申し上げます。

484 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:05:53 ]
アキラさんのboost本買うといいよ

485 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:18:10 ]
テンプレート本?



486 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:41:35 ]
>>483
boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html

487 名前:483 mailto:sage [2010/02/14(日) 17:49:05 ]
>>486
お返事ありがとうございます。
拝読致します。

488 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 18:41:11 ]
>>481
ありがとう

489 名前:デフォルトの名無しさん [2010/02/14(日) 19:06:37 ]
C++なのですが
1行目 n個、2行目(n-1)個、・・・、n行目 1個の配列をつくるコードって
これであっているのかどうかチェックしていただきたいのですが
どうでしょう?
---------------------------
int **a = new int*[N];

a[0] = new int[(int)(N * (N + 1) /2)];
int j = N;
for(int i=1; i<N; i++){
  a[i] = a[0] + i * (j-1);
 j--;
}

delete[] a[0];
delete[] a;
---------------------------

490 名前:デフォルトの名無しさん [2010/02/14(日) 19:10:50 ]
CやC++を今から勉強したいんですけど、
全くの初心者ですがオススメの本ってありますか?
将来仕事にすることも考えてます。

491 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:14:57 ]
>>490
独習シリーズ

本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。

492 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:19:28 ]
>>489
ありとあらゆる意味でダメ。
期待したとおりに動かないし、(直したとして)保守性も最悪。
窓からソースを投げ捨てるレベル。

493 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:20:11 ]
ワロタw

494 名前:デフォルトの名無しさん [2010/02/14(日) 19:20:53 ]
>>491
ありがとうございます
明日にでも買ってこようと思います

495 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:23:33 ]
>>489
動くのかもしれんけどなんかおかしいような
普通はこんな感じじゃない?
とかいって、普段vectorばっか使ってるから
初めてこういうコードを書いたわけだが

int n=10;
int **a=new int*[n];
for(int i=0;i<n;++i){
a[i]=new int[n-i];
for(int j=0;j<n-i;++j){a[i][j]=j;}
}
for(int i=0;i<n;++i){
for(int j=0;j<n-i;++j){
cout << a[i][j];
}
cout << endl;
}
for(int i=0;i<n;++i)
delete[] a[i];
delete[] a;




496 名前:デフォルトの名無しさん [2010/02/14(日) 20:15:00 ]
>>495
ちなみにvectorだったらどんな感じになるんですか?

497 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 20:30:02 ]
>>495
元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?

498 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:17:12 ]
>>496
std::vector<int> a[N];
for (int i = 0; i < N; ++i)
{
 a[i].resize(N - i);
}

499 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:31:18 ]
ポインタ配列は愚行でしょ
struct C{size_t sz;int*p;
C(size_t x):sz(x),p(new sz(int)){}
C(size_t x,int*a):sz(x),p(a){}};

template<size_t N>struct L:C{
size_t am(size_t x){return x*N-((N+1)*N)/2;}
L():C(am(N)){}
C operator[](size_t x){return C(N-x+1,p+sz-am(x));}};

500 名前:デフォルトの名無しさん [2010/02/14(日) 21:37:35 ]
>>497
そこが問題になるんですよね・・・

>>498
なるほど

501 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:41:14 ]
上でC99に準拠しているコンパイラが少ないって話が出ていたけど、
実際に試してみたら
 VC, gcc, bcc, dmc, OpenWatcom
で全部ガン無視されててフイタwww

むしろIntelの仕様がおかしいって言われそうで不憫だ。


502 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:45:10 ]
gcc?

503 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:47:11 ]
>>502
GNU C Compiler ですけど?

504 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:48:49 ]
gnu compiler collection

505 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:53:13 ]
gccじゃなくてg++じゃ、と>>502は言いたかったに1ペリカね。



506 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:05 ]
こまけぇことはいいんだよ

507 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:26 ]
>>504
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。

>>502
お前人の揚げ足取ろうとする嫌な性格のやつなのね?
そのくらい分かることだろ?

さらに言えば今回の文脈ではg++じゃなくてgccが正しい。


508 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:56:51 ]
gccで全然問題ない

509 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:05:20 ]
>>502
がフルボッコw

510 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:06:32 ]
俺は502じゃないが、-std=c99つけてもあかんの
あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね

511 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:10:18 ]
>>510
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。



512 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:11:56 ]
>>510
> 俺は502じゃないが、-std=c99つけてもあかんの
いやだれ一人としてダメなんて言ってないぞ?


513 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:12:37 ]
>>499
大きな領域を一度に確保してからplacement newを発動するとか

デストラクタが面倒臭い事になるけど

514 名前:507 mailto:sage [2010/02/14(日) 23:13:42 ]
>>512
いや言ってるんじゃね?


515 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:13:48 ]
GCCがC99ガン無視って事は無いな




516 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:14:45 ]
どうみても>>499は愚行だと思うんだが


517 名前:502 mailto:sage [2010/02/14(日) 23:19:43 ]
俺の疑問は>>510の1行目が理由で>>515なのではないかということ。
ok?


518 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:21:18 ]
お前ら全員いい加減にしようぜ


519 名前:499 mailto:sage [2010/02/14(日) 23:21:22 ]
うん。適当に打ち過ぎて矛盾やイミフメイな所がいっぱいあったんだ。気付いた処なおしたよ
template<bool F=false>struct C{size_t sz;int*p;
C(size_t x):sz(x),p(new int[sz]){}
C(size_t x,int*a):sz(x),p(a){}};
typedef C<> E;

template<size_t N>struct L:C{
size_t am(size_t x){return x*N-((N+1)*N)/2;}
L():C<true>(am(N)){}
E operator[](size_t x){return E(N-x+1,p+sz-am(x));}};

520 名前:483 mailto:sage [2010/02/14(日) 23:29:10 ]
boost::tuple
勉強してきました。

感動しました。


521 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:30:29 ]
> 広く使われている処理系でも、タプルのこの種の用途について
> 最適化をしくじるものが存在する(例えば bcc 5.5.1)
> ことに注意されたい。
Boostに名指しされとるww


522 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:32:42 ]
まあ普通にstd::pairの拡張版だと捉えているがな

523 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:34:19 ]
bcc 5.5.1は今から見るとひでぇからな。


524 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:35:47 ]
仕方ねえよ
標準C++にできるだけ準拠しようとして精一杯で
最適化まで手が回らなかったんだろ

525 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:49:33 ]
>>519
何がしたいのかわからん。
new した領域はいつ delete されるの?
なんで std::vector 使わないの?



526 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:52:14 ]
テンプレートについて教えて下さい。

下記のようなテンプレートクラスを書いたところ
コンパイルエラーになってしまいます。

template <class T>
class TestClass {
public:
TestClass(){};
~TestClass(){};
struct SS {
int a;
char b;
long c;
T d;
};
SS * TestCode(void);
};
template <class T>
TestClass<T>::SS * TestClass<T>::TestCode(void)
{
return NULL;
}
gccでコンパイルすると、
error: expected constructor, destructor, or type conversion before '*' token
error: expected `;' before '*' token
となります。

どこが悪いのでしょうか。
教えて下さい。
宜しくお願いします。

527 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:57:10 ]
>>526 typename

528 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:27 ]
>>527
ありがとうございます。
何か追記する必要がありますでしょうか?

529 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:31 ]
>>526
typename TestClass<T>::SS* TestClass<T>::TestCode(void)

530 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:59:46 ]
>>529
ありがとうございます。
コンパイル通りました。

なぜ、先頭に typename と入れる必要があるのでしょうか?
教えて下さい。
宜しくお願いします。

531 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:01:57 ]
>>530 ja.lmgtfy.com/?q=template+typename

532 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:05:55 ]
>>531
ありがとうございました。

533 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:07:47 ]
>>531
こんなサイトがあるんだw

>これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!

534 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:17:13 ]
C++を勉強中の初心者です

std::string Hoge(int Num)
{
   std::string Data
   Data.clear();

   処理

   return Data;
}

こういう関数があった場合Hoge関数の中で確保したstd::string Dataは
C言語のころのmallocで確保された領域とどう違うのでしょうか?

GCがあるような言語の場合参照が一定以下だと開放されるとかありますが
C++はそういうのが無かったはずですし

535 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:22:07 ]
Cでも構造体を返すことが出来るのは当然知ってるよな?
で、当然、その構造体のメンバとして、
(mallocで確保した領域への)ポインタを持てることも知ってるよね?



536 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:17 ]
>>534
mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。
つまり、あんまり気にしなくていい。

537 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:26 ]
>>535
はい

std::stringで確保したデータが不要になった場合は
clear()しておけば従来のfreeに相当する動作ということでいいんですかね?

538 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:34:49 ]
ああ・・・いろいろ勘違いを・・・

テンプレートクラスということなので

std::string* Data = new std::string();
stringの確保をこういう感じにしてこれを返せばいいんですね

539 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 08:06:25 ]
>>538
ちがーう。
std::string をそのまま int か何かと思って同じように扱えばいい。


540 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 11:46:06 ]
>>537
オブジェクト指向を根本的に勘違いしているな

std::stringは一種のクラスであり、それ自体データとメンバ関数の
集まりとして完結しているものだ

だから普通のPOD型の変数や構造体と同じように値返しが出来る

但しこれは当たり前だが、関数の中で定義したローカルstringを
参照返しするような事をすれば、これはstringに限らずどんなデータ型
だとしても未定義の動作となる

541 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:52:32 ]
回答側がバラバラすぎて、それぞれ何を主張してるのかよくわからん

542 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:53:01 ]
>>538
C++初心者にオススメ。

ロベールの部屋
www7b.biglobe.ne.jp/~robe/
Codian
www.kab-studio.biz/Programing/Codian/
猫でもわかるプログラミング
www.kumei.ne.jp/c_lang/
少なくともこれぐらいは読んで
初めて質問が出来るレベルになるだろう
と思います。



543 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:12:47 ]
素直にCから学べばよかったのに

544 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:14:20 ]
Cから学ぶとC++の習得に余計な時間がかかるぜ

545 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:26:47 ]
Javaだのを習得して、おかしな脳内回路ができるよりマシ



546 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:03 ]
プログラミング経験皆無から始めるとして
Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週
これぐらいかかるかな

547 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:22 ]
>>545
それはあるわ。Javaって結構綺麗な言語だから、
C++みたいな清濁併せ持ったカオスな言語だと
勉強がいやになってしまうんだよな。

548 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:46:21 ]
>>546
あとたくさん本を買わなければならないよ
C++について学べば学ぶほど、たくさんの本が必要になる
中には絶版になってしまったものもあって残念だが

俺は絶版扱いのC++標準ライブラリを一番多用している
手垢が付いてもう真っ黒だぞ

549 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:59:56 ]
>>547
> Javaって結構綺麗な言語だから、
そうか?
Javaも結局 謎の仕様を覚えなきゃならんことがあるし、
落ち目の感が否めない

550 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:02:30 ]
>>549
謎仕様も多いけど、C++くんに言われとうないわ!

まぁそうだな、綺麗だった、と言い直しとくわ。


551 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:11:28 ]
多くのプラットフォームで使えるC言語以上の
高級言語の内、
仕様が最も綺麗な言語って何だろう?

実際に役立つかとかはおいといて。

D言語かPython 3系(2系でなく)かな?


552 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:12:54 ]
>>551
brainfuck とか whitespace とか

553 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:13:00 ]
後でできた言語の方が綺麗な構文になるのは仕方ないこと
Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない

しかしC#からC++に戻るとゲシュタルト崩壊?するわ
C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと
割り切ることができるけどC++のような中途半端だとスゲー悩む

554 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:17:12 ]
ゲシュタルト崩壊 - Wikipedia
ja.wikipedia.org/wiki/%E3%82%B2%E3%82%B7%E3%83%A5%E3%82%BF%E3%83%AB%E3%83%88%E5%B4%A9%E5%A3%8A


555 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:32:17 ]
教えて下さい。

テンプレートクラスから派生したクラスから、
基底クラスのメンバ関数をオーバーライド
することは出来ないのでしょうか?

なんどやってもエラーになってしまいます。
よろしくおねがいします。



556 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:35:27 ]
codepadあたりにエラーになるコードを貼ってくれ

557 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:43:15 ]
>>556
ありがとうございます。

template <class T>
class A {
public:
  A(){}; ~A(){};
  struct S {
    long a;
    T   b;
  };
  S * TestFunc( S *p );
};
template <class T>
typename A<T>::S * A<T>::TestFunc( S *p ){
  return 0;
}
template <class T>
class B : public A<T> {
public:
  B(){}; ~B(){};
  struct S : A<T>::S {
    double c;
  };
  A<T>::S * TestFunc( A<T>::S *p );
};
template <class T>
typename A<T>::S * B<T>::TestFunc( A<T>::S *p ){
  return 1;
}
よろしくお願いします。

558 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:54:05 ]
>>557 >>527-

あと、ポインタ返す関数で return 1 は無いだろう。

559 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:10:51 ]
>>558
ありがとうございます。

return 0; と return 1; を return p; に書き換えてコンパイルしてみました。

: error: expected `;' before '*' token
: error: `typename A<T>::S*B<T>::TestFunc' is not a static member of `class B<T>'
: error: template definition of non-template `typename A<T>::S*B<T>::TestFunc'
: error: `p' was not declared in this scope
: error: expected `;' before '{' token

よろしくお願いします。

560 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:14:06 ]
>>559 >>527-

サルかお前は?

561 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:43:17 ]
template <class T>
class A {
public:
A(){};
~A(){};
struct S {
long a;
T b;
};
S* TestFunc( S *p );
};
template <class T>
typename A<T>::S* A<T>::TestFunc( S* p ){
return 0;
}

template <class T>
class B : public A<T> {
public:
B(){};
~B(){};
struct S : A<T>::S {
double c;
};
S* TestFunc( S* p );
};
template <class T>
typename B<T>::S* B<T>::TestFunc( S *p ){
return 0;
}

562 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:01:13 ]
>>561
ありがとうございました。

563 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 07:48:40 ]
typename A<T>::S * TestFunc( typename A<T>::S *p );

564 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:43:57 ]
テンプレートクラスを特殊化する場合
メンバ全てを宣言・実装し直さないといけないのでしょうか?
それとも変更点のみで良いのでしょうか?

あと、
template <typename T ,typename S = T>
というデフォルト引数の設定は可能なのでしょうか?

565 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:03:13 ]
>>564
クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。
クラステンプレートのメンバ関数ごとに特殊化できなかったっけ?

> template <typename T ,typename S = T>
やってみればいいじゃない。



566 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:25:55 ]
デフォルトパラメータも使えたような気がしたが、こういうやり方もある

template<class A, class B>
class Base {
---
};

template<class A, class B = hoge>
struct DefType {
typedef Base<A,B> type;
};


{
 DefType<hoge>::type fuga;
}

567 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:31:38 ]
ごめん、間違えた

template<class A>
struct DefTypeA {
typedef Base<A, nanika> type;
};

568 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:04:17 ]
テンプレート引数が異なるクラステンプレートの実体は関連が無いので、
同じクラステンプレートの異なる実体を継承することも出来る。
使いどころは限られるが。

template<typename T>
class A { ... }; // デフォルト実装

template<>
class A<int>: public A<...> // int以外を与えた場合のAを継承
{ ... }; // 追加の実装

569 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:54:38 ]
less を定義すれば greater とかも(特別な処理がない限り)自動で決まると思うのですが
そういった処理(less がら greater を作製)をするテンプレートは標準であるのでしょうか?

class CHoge
{
public:
CHoge(int i, const std::string& str) : m_i(i), m_str(str){}

int m_i;
std::string m_str;

struct Less
{
bool operator()(const CHoge& lh, const CHoge& rh) const
{
return lh.m_i < rh.m_i;
}
};
};



570 名前:569 mailto:sage [2010/02/17(水) 19:55:26 ]

//こんなの
template<typename T, typename FuncT>
struct GeaterFromLess
{
bool operator()(const T& lh, const T& rh) const
{
return FuncT()(rh,lh);
}
};

std::vector<CHoge> vtHoge;
vtHoge.push_back( CHoge( 4, "hoge" ) );
vtHoge.push_back( CHoge( 1, "foo" ) );
vtHoge.push_back( CHoge( 0, "bar" ) );
vtHoge.push_back( CHoge( 2, "alpha" ) );
vtHoge.push_back( CHoge( 3, "omega" ) );
vtHoge.push_back( CHoge( 1, "hotel" ) );

std::sort( vtHoge.begin(), vtHoge.end(), CHoge::Less() );
std::sort( vtHoge.begin(), vtHoge.end(), GeaterFromLess<CHoge,CHoge::Less>() ); // CHoge::Less() から Greator を作って逆順ソートしたい

571 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:31:44 ]
>>569
標準ではなかった気がする
自分で作るかboost::operatorsだな

572 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:41 ]
std::vector<class A>  のpush_back() ってどんな動作してるんだ?
たとえば
vector<string> vec;
vec.push_back("test");
ってやったら
stringの何を呼び出してstringクラスに"test"を入れているんだ?
自作の文字列クラスをvecにつっこんで機能を使わせたいのです

573 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:13:46 ]
コンストラクタ

574 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:09 ]
STLを使うならEffectiveSTLには絶対に目を通しておけ

575 名前:572 mailto:sage [2010/02/18(木) 01:18:05 ]
>>573
コンストラクタに(const char* )を追加して実行してみました.
ttp://codepad.org/8ai16KPo
どうやら大分ひどいことをしているようなんですが,
コンパイルは通ってしまいます.
ご指導をよろしくおねがいします.
もしくは>>574さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?



576 名前:デフォルトの名無しさん [2010/02/18(木) 01:21:03 ]
クロージャで出来て関数ポインタで出来ない例が思いつかない。

577 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:32:58 ]
>>575
暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。
デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。

578 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:47:45 ]
>>576
関ポじゃ状態を持てないじゃん

579 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 02:01:11 ]
>>575
codepad.org/kAeUsq2i
これでいいと思われます
要するにクラス内部でnew/deleteを行うような場合は
必ずコピーコンストラクタと代入演算子関数は自前で用意
しなければならないという事です

そうしないとクラッシュしたり、メモリリークしたりします

580 名前:572 mailto:sage [2010/02/18(木) 02:59:22 ]
>>579 >>577 ありがとうございます!
コピーコンストラクタと代入演算子を作らないといけなかったんですね
わかりやすくコードもひいてくださりありがとうございました

581 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:36:28 ]
>>579
operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど)
strlen() してから strcpy() するのってもったいないね。
date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。)

こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス
なんて作るもんじゃないね。みんなわかってると思うけど。

582 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 09:51:30 ]
>>578
やっと理解した。Cというか関数ポインタだと代替にならないな。

でもこれC++ならクラスでやれって話になるな。

583 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:18:58 ]
乱暴に言うと、クラスはデータとそれに付随する振る舞いをまとめたもの。
クロージャは振る舞いとそれに付随するデータをまとめたもの。
・・・っていうのはどの本の説明だったかな。

584 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:38:06 ]
データ構造を決めれば操作は大体決まるから
俺にとっては前者のほうが自然に感じるが
一方、振る舞いだけでデータも記述できるんだよな
抽象データ型とかは操作ありき、だし
object is a poor man's closure
closure is a poor man's object

585 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:11:05 ]
クロージャって要は関数オブジェクトみたいなもんでしょ?



586 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:45:33 ]
>>581
>delete の前のヌルチェックは要らないよ。

デタラメ言うんじゃないよ
代入前に既に値が入ってたらどうするつもりだ
それともtextが0だったらdeleteしても何も起きないというつもりか
それだったら個人の自由だ

プログラム上値が入っていたら消すんだよという意味を強調している

それから
>operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
文句言うなら自分でもっといいプログラム貼れや

>strlen() してから strcpy() するのってもったいないね。
>date() じゃなくて data() だよね?

元のプログラムをそのまま使っただけだ
自分が1から書いたらもちろんこういう書き方はしない

もう一度言う 文句あるなら自分で貼れ

587 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:20:25 ]
>プログラム上値が入っていたら消すんだよという意味を強調している
んなの強調して何の意味が。deleteなんだから消すに決まってる。
「値が入っていたら」はdeleteがやってくれる。

588 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:24:06 ]
delete null 規格上は許されてるよ。
でもまあ、nullチェックしたほうが自然だろな。

589 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:29:38 ]
そのnullチェックがそのコードで意味があってのことならやるが
機械的にチェックするだけ、という意味しかないのなら消すわ

590 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:34:14 ]
if(p) Delete(p);

void Delete(Obj *p)
{
if(p) _Delete(p);
}

void _Delete(Obj *p)
{
if(p) __Delete(p);
}

・・・

591 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:45:25 ]
上の実装だと内部データ返せるから
dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。
そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが
ノーチェックで問題ないんかえ?

592 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:47:07 ]
は?NULLチェックするに決まってるだろ
んでdelete後にはNULL入れとけボケ

593 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:53:36 ]
俺は暗にあんたを擁護したんだが・・日本語勉強しる

594 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:05:06 ]
ID出ないと誰が誰だか分からない
まあとりあえずみんな落ちつけ

595 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:06:13 ]
なんでID無しなんだろうな
おかげで自演し放題だわ



596 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:44:11 ]
●持ちには隠しID丸見えだよ
自演はほどほどに

597 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:54:03 ]
あちゃー、このスレ全部俺だったのバレてたか

598 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:58:48 ]
いやいや、俺俺。

599 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:11:47 ]
>>591
「deleteしたらNULL入れる」だけで二重deleteは防げる。
NULLチェックしたって二重deleteは全く防げない。

600 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:11:57 ]
>>599
C++は規格票でもNULLより0が推奨されています

601 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:35:47 ]
もう>>498はいないだろうが
n行m列のvectorの二次元配列の確保で
vector<vector<int> > v(n,vector<int>(m));
こういう書き方って異端?

602 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:55:40 ]
>>601
別に
三次元の場合もその書き方でよく書いてるけど

603 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 17:49:15 ]
異端じゃないけど効率悪いよ
n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい

つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念
せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが

604 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:27:19 ]
>>602
なるほど、了解

>>603
>n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
直感的にはループの中で剰余と割り算でインデックス計算したりするほうが
遅くなるように思うけど
領域が連続でないことでそんなに遅くなるもん?

605 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:30:37 ]
>>604
連続でないってことは内部的に管理する仕組みが動いてるだろうから
インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ



606 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:58:58 ]
(n, m)のインデックス算出に剰余と割り算使うのか?
普通はかけ算と足し算だと思うが

607 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:59:25 ]
>>604
剰余も割り算も使わないよ
v[siz1 * idx2 + idx1]
乗算と和だけ
あとベクタのベクタはメモリに関するコストが増える

608 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:01:36 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10537.c

クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz

609 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:17:17 ]
>>605-607
確かにorz
自分の勘違いも含めたベンチコード
codepad.org/FTA8SWtA
vectorにしたら結果が大きく変わるってことはないと思うんで
思ったほど差はない模様

610 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:52:26 ]
>>608
まずpartitionがうまく動いてるか調べてみたら?

611 名前:569 mailto:sage [2010/02/18(木) 22:35:34 ]
>>571 レスありがとう.

boost::operators 調べてみたけど,クラスに operator を自動追加してくれるだけで
関数オブジェクトには利用できないのかな?

ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して,
逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して
ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…

612 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:01:17 ]
#if defined(Q_WS_MAC)
何これ?

613 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:34:01 ]
#define TEST 5でマクロを定義し、char型の配列等に文字列TESTを代入すると、
"5"が判断されなくなってしまいます。
マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?

614 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:53:02 ]
こんな感じの??

codepad.org/M0mcikaJ 

615 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:54:44 ]
何かエラー出るな。

ttp://codepad.org/M0mcikaJ



616 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:02:39 ]
#define TEST "5" じゃダメなん?

617 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:07:15 ]
>>616
まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv

618 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:22:07 ]
>>591
dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。
どうにもならない。

619 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:24:05 ]
>>599
二重deleteを防ぎたいなら「deleteしたらNULL入れる」なんてせずに、
auto_ptr/vectorをはじめとするRAIIスタイルのライブラリを使ったほうがいい。
無駄なNULL代入が減る分、効率も向上する可能性が高い。

620 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:29:02 ]
ご返答ありがとうございます。
試してみたけど駄目でした…

やりたいことは、
#define TEST 5

char * a = { "TEST" };
この変数aがどうやってもTESTという文字列でしか認識されず、5が出せないのです。
char型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?

621 名前:620 mailto:sage [2010/02/19(金) 01:37:42 ]
型がLPCTSTRの所で変数aを入れてるのが原因かなぁ

622 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:37:50 ]
なんか>>616でいいような気がするが。。。
文字列を結合したいならそういう関数を使う。sprintfとか


623 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:05 ]
情報の後出しは基本的にご法度だぜ。。。
ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。

624 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:47 ]
む、LPCTSTR・・・・・とかhoge_sとか・・・

この辺の話はどうにかならんのかね・・・?

625 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:00:42 ]
>>620
文字列リテラルの中はマクロ展 されない。




626 名前:620 mailto:sage [2010/02/19(金) 02:01:49 ]
char型の配列使わずにint型の配列にTESTを入れて処理を進められました('A`)
大変ありがとうございました

627 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:03 ]
#define TEST "5"

char * a = { TEST };

これでいいんでないの?

628 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:12 ]
お前それで良いのか

629 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:09 ]
おっと>>628>>626向け

630 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:37 ]
>>586 codepad.org/eoOEH0RH

631 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:11:36 ]
>>620
#include "boost/preprocessor/stringize.hpp"

#define TEST 5
char const* a = BOOST_PP_STRINGIZE(TEST);

632 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:13:03 ]
手を抜くつもりが黒魔術になってしまった。
後悔はしてるが反省はしていない。

#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <windows.h>
#define TEST 5
#define BufSize 1024
int main(){

    TCHAR BUF[BufSize];
    _tsetlocale(LC_ALL, TEXT("Japanese"));
    /*wsprintf(BUF,TEXT("ほげほげ戦隊 ほげほげ%d"),TEST);*/
    _sntprintf_s(BUF,BufSize,TEXT("ほげほげファイブ「%d」"),TEST);
    _tprintf(TEXT("%s"),BUF);
    return 0;
}

633 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:23:19 ]
>>610
なんかうちの環境が悪いだけでしたあざす

634 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:29:21 ]
>>630
これってstaticにする意味って何?
あおりじゃなくてただの素人です

635 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:30:09 ]
俺は文字列リテラル外すマクロが欲しい



636 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:35:19 ]
>>635
文字コードすべて暗記してint型の配列を確保してエンディアン考慮して
文字を16進数にでもして並べていけばリテラルいらないよ

637 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:40:11 ]
>>634
static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。

638 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:44:40 ]
リテラル嫌なら

int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);

639 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:52:21 ]
>>638
で、そう書く利点は?

640 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:53:55 ]
無いよ
リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ

641 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:56:11 ]
表示サンプルがhogeだったからまずかったのかね?

642 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:05:36 ]
>>637
private な static メンバ関数ってそういう目的があるんすね
ありがとうございます

643 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:07:01 ]
文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな

644 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:10:34 ]
>>643
いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・

645 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:12:21 ]
>>640
誰も嫌とはいってなくね?



646 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:13:55 ]
おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。

647 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:15:07 ]
vsくらいになるとsettingとかあるんだけどな
勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが

648 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:24:32 ]
文字列リテラル外部化って今でもできるんじゃね?
文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?

649 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:23:21 ]
>>613
解決しちゃったの?
こういう話だと思ったんだけど。
#include <stdio.h>

#define TEST 5

#define TO_STRING2(s) #s
#define TO_STRING(s) TO_STRING2(s)
int main()
{
const char *p = TO_STRING(TEST);
puts(p);
}

650 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:29:54 ]
メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか
std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが

651 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:35:09 ]
>環境化
環境下

652 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 08:21:59 ]
>>650
相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。

653 名前:620 mailto:sage [2010/02/19(金) 12:18:39 ]
>>625
>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。








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

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

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