2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

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

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

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

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


2 :デフォルトの名無しさん:2010/01/30(土) 00:01:59
 codepad
 ttp://codepad.org/

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

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

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

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

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

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

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

http://codepad.org/iid7z1G1

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

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

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

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

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

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

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

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

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

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


17 :デフォルトの名無しさん: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
です。

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

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

20 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/01/31(日) 23:05:05
代入先を考えろ

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

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



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

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

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

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

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

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

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

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

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

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

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

C++はないよ

C# ならある

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

環境
WindowsXP
Microsoft VisualC++ 6.0 MFC

90 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/04(木) 05:32:31
>>91
どうしてそんな碌でも無いコードばかり書くんだ…

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

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

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

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

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

int32_t
とかに

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

112 は忘れて。

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


127 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/05(金) 23:49:40
>>128
は?
頭おかしいの?

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

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

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

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

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

137 :134:2010/02/06(土) 13:51:57

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

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

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

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

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

class B;

class A {
B b;
};

class B {
A *a;
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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



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

176 :progress_display:2010/02/07(日) 15:49:25
>>175
私のことお呼び?

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

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

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

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

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

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

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

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

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

184 :177:2010/02/07(日) 17:56:51
>>180
それもそうですね

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

>>183
yes

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

210 :209:2010/02/07(日) 21:13:17
ごめん、誤爆した

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

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

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

http://www.codesynthesis.com/products/xsde/

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ありがとうございました

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



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

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

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

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

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

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

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

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


285 :281:2010/02/09(火) 21:21:48
>>284
thx

286 :デフォルトの名無しさん:2010/02/09(火) 21:24:06 ?2BP(0)
>>282

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

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

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

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

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

namespace foo
{
class HogeImpl { };
}

かもしれん

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

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

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

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

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

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

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

299 :デフォルトの名無しさん:2010/02/09(火) 23:52:11 ?2BP(0)
2重switch

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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



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

class Hoge
{
....
}

Hoge h[100];

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



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

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

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

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

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

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


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


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

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


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

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

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

352 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/11(木) 19:31:27
ld使え

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

誰かサンプル書いて

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EXTERN int a, b, c;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if(fd.dwFileAttributes!=0x00000002)

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ありがと(^ω^)

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

c_strとかなんだよそれ

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


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

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

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

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

437 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/13(土) 18:04:57
Haskellやべえ


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

470 :465: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 :デフォルトの名無しさん:2010/02/14(日) 16:16:59
イテレータは挿入しても保たれるけど、end()とbegin()はそうでないのね。
不便。何でこんな事にしたの。

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

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

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

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

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

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

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

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

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

482 :479:2010/02/14(日) 17:01:50
そうだったw
479は間違い

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

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

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

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

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

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

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

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

488 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/14(日) 19:14:57
>>490
独習シリーズ

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

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

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

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

495 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/14(日) 20:30:02
>>495
元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?

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

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


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

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

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

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

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

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

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

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


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

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

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

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



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


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

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

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


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


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


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


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


519 :499: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:2010/02/14(日) 23:29:10
boost::tuple
勉強してきました。

感動しました。


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


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

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


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

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

526 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/14(日) 23:57:10
>>526 typename

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

554 :デフォルトの名無しさん:2010/02/15(月) 23:17:12
ゲシュタルト崩壊 - Wikipedia
http://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 :デフォルトの名無しさん:2010/02/16(火) 00:32:17
教えて下さい。

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

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

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

557 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/16(火) 00:54:05
>>557 >>527-

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

559 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/16(火) 01:14:06
>>559 >>527-

サルかお前は?

561 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/17(水) 01:01:13
>>561
ありがとうございました。

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

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

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

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

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

566 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/17(水) 13:31:38
ごめん、間違えた

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

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

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

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

569 :デフォルトの名無しさん: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: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 :デフォルトの名無しさん:2010/02/17(水) 20:31:44
>>569
標準ではなかった気がする
自分で作るかboost::operatorsだな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

611 :569:2010/02/18(木) 22:35:34
>>571 レスありがとう.

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

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

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

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

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

http://codepad.org/M0mcikaJ 

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

ttp://codepad.org/M0mcikaJ

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

char * a = { TEST };

これでいいんでないの?

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

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

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

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

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

632 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/19(金) 02:23:19
>>610
なんかうちの環境が悪いだけでしたあざす

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

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

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

637 :デフォルトの名無しさん:2010/02/19(金) 02:40:11
>>634
static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。

638 :デフォルトの名無しさん:2010/02/19(金) 02:44:40
リテラル嫌なら

int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);

639 :デフォルトの名無しさん:2010/02/19(金) 02:52:21
>>638
で、そう書く利点は?

640 :デフォルトの名無しさん:2010/02/19(金) 02:53:55
無いよ
リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ

641 :デフォルトの名無しさん:2010/02/19(金) 02:56:11
表示サンプルがhogeだったからまずかったのかね?

642 :デフォルトの名無しさん:2010/02/19(金) 03:05:36
>>637
private な static メンバ関数ってそういう目的があるんすね
ありがとうございます

643 :デフォルトの名無しさん:2010/02/19(金) 03:07:01
文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな

644 :デフォルトの名無しさん:2010/02/19(金) 03:10:34
>>643
いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・

645 :デフォルトの名無しさん:2010/02/19(金) 03:12:21
>>640
誰も嫌とはいってなくね?

646 :デフォルトの名無しさん:2010/02/19(金) 03:13:55
おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。

647 :デフォルトの名無しさん:2010/02/19(金) 03:15:07
vsくらいになるとsettingとかあるんだけどな
勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが

648 :デフォルトの名無しさん:2010/02/19(金) 03:24:32
文字列リテラル外部化って今でもできるんじゃね?
文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?

649 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2010/02/19(金) 07:29:54
メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか
std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが

651 :デフォルトの名無しさん:2010/02/19(金) 07:35:09
>環境化
環境下

652 :デフォルトの名無しさん:2010/02/19(金) 08:21:59
>>650
相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。

653 :620:2010/02/19(金) 12:18:39
>>625
>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。



654 :デフォルトの名無しさん:2010/02/19(金) 14:32:42
>>620
キミがやりたかった事は↓こうする。

#define XSTR(s) #s
#define STR(s) XSTR(s)
#define TEST 5

char * a = { STR(TEST) };

655 :デフォルトの名無しさん:2010/02/19(金) 14:33:32
↑すまん、外出

656 :デフォルトの名無しさん:2010/02/19(金) 18:37:56
中学生の割れ厨みつけちゃったよぉ
http://yutori7.2ch.net/test/read.cgi/news4vip/1266562555/

657 :デフォルトの名無しさん:2010/02/19(金) 22:42:43
演算子をオーバーロードする時は、
自分(インスタンス) 演算子 相手(インスタンス)
と書くことが文法で決まっているのですか?


658 :デフォルトの名無しさん:2010/02/19(金) 22:48:21
>>657
うん。
2項演算子だよね?

z = x + y;
ってのはC++の世界では
z = operator ( x ,y );
と等価ってのは知ってる?(x,y,zは組み込み型でないとして。)

659 :デフォルトの名無しさん:2010/02/19(金) 22:49:44
z = x + y;
ってのはC++の世界では
z = operator + ( x ,y );
と等価ってのは知ってる?(x,y,zは組み込み型でないとして。)

の間違い。

660 :658:2010/02/19(金) 22:50:52
さらにいえば
operator = ( z, operator + ( x ,y ) );
と等価ってのも知ってる?


661 :658:2010/02/19(金) 22:52:08
あ、ごめん、メンバ関数として定義している場合は別だ。
その場合は
z.operator=( x.operator+(y) );
となる。



662 :デフォルトの名無しさん:2010/02/19(金) 23:04:54
>>658
全くoperatorがわかりません
オーバーロードされた演算子を使う時は、std::cout << "hoge"みたいにな奴ばっかりなので
オーバーロードされた演算子を使う時は書かないとダメなのかな〜と思いました
>自分(インスタンス) 演算子 相手(インスタンス)

663 :デフォルトの名無しさん:2010/02/19(金) 23:12:29
explicit つけたら明示的に書かないとダメ
引数が明確に違ったら別に省略してもいけるはず

664 :657:2010/02/19(金) 23:14:35
つまり、左側のインスタンスは絶対必要ってことで、おk?

665 :658:2010/02/19(金) 23:17:55
>>662
君の聞いている意味が分かった気がする。

もしかして、
メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
関数によるoperatorの定義の区別が付いていないのでは?


666 :デフォルトの名無しさん:2010/02/19(金) 23:19:19
いや単項演算子のこと言ってるのかもよ

667 :657:2010/02/19(金) 23:19:28
>>665
>メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
operatorが2種類あるなんて、まったく知りませんでした

668 :658:2010/02/19(金) 23:19:58
まあメンバ関数によるoperatorの定義でも、
コンパイラが自動的に*thisを第1引数として渡しているので、
あながち
>左側のインスタンスは絶対必要
と言えなくもない。


669 :658:2010/02/19(金) 23:23:08
とりあえず2項演算子の話に限っておkですか?

メンバ関数によるoperatorの定義ってのは


ttp://www.kumei.ne.jp/c_lang/cpp/cpp_16.htm
これより引用
class A
{
public:
//いろいろ・・・
void operator + (int i);
void operator + (A Z);
};
void A::operator + (int i)
{
//なんたらかんたら
}
void A::operator + (A Z)
{
//あーしろ、こーしろ
}





670 :658:2010/02/19(金) 23:24:44
猫のページの例が悪すぎた。
そのページの下部の

Compクラスの実装をみてくれ。
これがメンバ関数によるoperatorの定義だ。



671 :デフォルトの名無しさん:2010/02/19(金) 23:25:26
657的に気になるのはこういうことかな
1+xはエラーで
x+1はx.operator+(1)となるのでエラーにならないってケースがあるよ

グローバルに定義すれば上のどちらもOKになる

672 :658:2010/02/19(金) 23:26:47
C++マニアック,オペレータのオーバーロード,operator overload,演算子のオーバーロード,演算子
ttp://homepage2.nifty.com/well/Operator.html
これで決着だった。
このサイトには
クラスのメンバ関数として定義する方法
グローバル関数として定義する方法
が紹介されていたわ。

とりあえずこれを2回は読むこと!


673 :デフォルトの名無しさん:2010/02/19(金) 23:33:32
同一クラスとの二項演算は文法的に可換だからメンバだけ定義すればいい
他のクラスとの演算は非メンバじゃないと対称性が崩れてしまう

674 :デフォルトの名無しさん:2010/02/19(金) 23:36:01
>>658
まだわからない所があるので、少し調べてからまた質問します
ありがとうございました

675 :デフォルトの名無しさん:2010/02/20(土) 15:38:17
bool GetPathHogeFooBar(std::string* pstrHoge, std::string* pstrFoo = 0, std::string* pstrBar = 0)
{
  if( !pstrHoge && !pstrFoo && !pstrBar ) return false;
  if( pstrHoge ) *pstrHoge = "Hoge";
  if( pstrFoo ) *pstrFoo = "Foo";
  if( pstrBar ) *pstrBar = "Bar";
  return true;
}


void func()
{
  const std::string strHoge;
  const std::string strFoo;
  bool bOk = GetPathHogeFooBar( const_cast<std::string*>(&strHoge), const_cast<std::string*>(&strFoo) );
  //以下で strHoge strFoo が変更されないことを保証したいので const で std::string を宣言して
  //GetPathHogeFooBar() で一時的に const を外す
}

 こういった const の付け方はやめたほうがいいんだろうか?

676 :デフォルトの名無しさん:2010/02/20(土) 16:12:38
そんな糞コードは今すぐ捨てろ

677 :デフォルトの名無しさん:2010/02/20(土) 16:16:07
ここまで来ると、あえて荒行か何かをしてるように見える。

678 :デフォルトの名無しさん:2010/02/20(土) 16:39:50
> 変更されないことを保証したい

自分で定義した変数を自分で変更してしまうのを防ぎたいってこと?
んなことあるわけないか

変更されるのを禁止したいならクラス等でラップすればいいじゃん

679 :デフォルトの名無しさん:2010/02/20(土) 16:54:57
>>675
const_castは使うべきじゃないよ。
#include <string>
using namespace std;
struct Path
{
string Hoge;
string Foo;
string Bar;
};
Path GetPathHogeFooBar()
{
Path P;
P.Hoge="Hoge";
P.Foo="Foo";
P.Bar="Bar";
return P;
}

int _tmain(int argc, _TCHAR* argv[])
{
const Path& b=GetPathHogeFooBar();
//なんか
return 0;
}


680 :デフォルトの名無しさん:2010/02/20(土) 17:00:03
他の回避手段があるなら const_cast は使わない派なので、>679 のように初期化でやれよと思うけど、あるいは、

std::string strHoge, strFoo;
const std::string &cstrHoge = strHoge, &cstrFoo = strFoo;

ってしといて、基本 cstrHoge, cstrFoo しか使わないとか。

681 :デフォルトの名無しさん:2010/02/20(土) 17:00:10
struct hoge
{
hoge &fuga() { ...; return *this; }
};

void func(const hoge &h) { ...; }


int main(void)
{
func(hoge().fuga().fuga().fuga());

return 0;
}


こーゆーことって、していいの?

682 :デフォルトの名無しさん:2010/02/20(土) 17:00:37
>>675
ポインターなんか使わずに参照を使えばぬるぽのチェックは要らないのに

683 :デフォルトの名無しさん:2010/02/20(土) 17:04:11
>>681
OK

684 :675:2010/02/20(土) 17:18:07
みんなレスありがとう

>自分で定義した変数を自分で変更してしまうのを防ぎたいってこと?

yes

関数の冒頭で宣言と初期化はするけど,それ以降は参照だけされて変更はされない
というよくあるシチュエーションを明示しておきたいんです

なので >>680 さんみたいに const を後付けしたいけど,non const を残しておきたくない…

void func_sub(const std::string& strHoge, const std::string& strFoo)
{
//処理
}

void func()
{
  std::string strHoge;
  std::string strFoo;
  bool bOk = GetPathHogeFooBar( &strHoge, &strFoo );
  func_sub( strHoge, strFoo );
}

 というわけでこういうのも考えた.やりたいことはまさにこういったことなんだが
strHoge, strFoo 以外の変数が多数あると引数の数が大変なことになるか…
やはり >>679 さんみたいなやり方のが良いかな…

>>682 Bar がいらない場合もあるんですよ.パスを分解して全部ほしいとか,フォルダだけほしいとか…


685 :デフォルトの名無しさん:2010/02/20(土) 17:22:53
>>684
こんなクラス作って必要なのだけゲットすればポインタは無くせられる。
class PathDivider
{
public:
PathDivider(const string& OrginFileName);
string getFile()const;
string getPath()const;
string getFullPath()const;
};


686 :デフォルトの名無しさん:2010/02/20(土) 17:30:30
const 付けるために func_sub() 作るとか struct, class 増やすとか間違っている気がしないでもない…
あれ? const 外せば全部解決じゃね?
goto >>675

687 :デフォルトの名無しさん:2010/02/20(土) 17:33:11
constつけるためにって言うか、引数増えたら>>685みたいな
クラスつくるとかってパターンあるよね。

688 :デフォルトの名無しさん:2010/02/20(土) 17:35:41
const化のためにパス分解クラスを作ったとしても、パス分解は便利だから再利用できて問題ない。
てか、むしろ作ることを勧める。


689 :デフォルトの名無しさん:2010/02/20(土) 17:55:00
>>686
boost::tupleもあるよ

690 :デフォルトの名無しさん:2010/02/20(土) 18:32:30
structHOGE: public huga
{

};


こういう構造体があります。
これはhugaというクラスを継承した構造体ですか?
構造体が継承ってできるんでしたっけ?

691 :デフォルトの名無しさん:2010/02/20(土) 18:34:52
できる

692 :デフォルトの名無しさん:2010/02/20(土) 18:36:58
いつの頃からか構造体にもメンバー関数やら継承とかできるようになったようですね。


693 :デフォルトの名無しさん:2010/02/20(土) 18:38:32
>>692
最初からできてる。

694 :デフォルトの名無しさん:2010/02/20(土) 18:51:04
classとstructの違いってデフォルトがprivateかpublicくらいじゃないの?

695 :デフォルトの名無しさん:2010/02/20(土) 18:53:09
PODのクラスってあるんかな??
普通は構造体にすると思うけど。

696 :デフォルトの名無しさん:2010/02/20(土) 18:55:17
>>694
メンバ関数関連はどうだろう
一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ

697 :デフォルトの名無しさん:2010/02/20(土) 18:59:33
>>694
その通り

698 :デフォルトの名無しさん:2010/02/20(土) 19:01:02
template <class T>
とは書けるが
template <struct T>
とは書けないんだっけ?

699 :デフォルトの名無しさん:2010/02/20(土) 19:10:14
>>696
こういうことだぞ。

namespace TagHoge{
 struct Hoge
 {
  void show()const{ std:: cout << "struct Hoge" << std::endl; }
 };
};
namespace ClsHoge{
 class Hoge
 {
  void show()const{ std:: cout << "class Hoge" << std::endl; }
 };
}

int main()
{
 TagHoge::Hoge h1;
 ClsHoge::Hoge h2;

 h1.show();  // publicなのでOK
 h2.show();  // privateなのでNG
}

700 :デフォルトの名無しさん:2010/02/22(月) 01:12:31
Visual Studio 2008 Express を使っています
自作した関数のインテリセンスに関数の説明というかコメントも追加したいのですが
どうすればいでしょうか?
ヘッダファイルに書けばいいのでしょうか?


701 :デフォルトの名無しさん:2010/02/22(月) 07:07:06
関数の宣言のすぐ上にコメント書けば表示される

702 :デフォルトの名無しさん:2010/02/22(月) 07:09:51
インテリセンスが表示される関数でソースが公開されてるものを参考にする

703 :デフォルトの名無しさん:2010/02/22(月) 11:17:59
PODになりうるのはstructだけだよな

704 :デフォルトの名無しさん:2010/02/22(月) 13:46:38
これもPOD

class foo{
static std::string a;
void bar();
public:
std::string baz();
operator std::vector<char>();
};

705 :デフォルトの名無しさん:2010/02/22(月) 13:54:47
foo*を持たせるつもりだったけど抜けてしまった
これだから携帯は…

706 :703:2010/02/22(月) 14:38:18
うそつきましたごめんなさい

707 :デフォルトの名無しさん:2010/02/22(月) 21:01:41
>>696
> メンバ関数関連はどうだろう
> 一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ
何を言っているんだ?
いったいどこの言語のお話?

708 :デフォルトの名無しさん:2010/02/22(月) 21:09:48
クラスと構造体の違いはデフォルトの可視性が非公開か公開かでしかない

さらにCとの互換性のある構造体をPODと言う

709 :デフォルトの名無しさん:2010/02/22(月) 21:14:00
>>708
>さらにCとの互換性のある構造体をPODと言う
違わないか

710 :デフォルトの名無しさん:2010/02/22(月) 21:45:24
structのほうは名前空間的な意味での違いもなかったっけ
普通の変数と名前がバッティングするかしないかとかそんなやつ

Cのstructとの違い、っだったかもしれんが

711 :デフォルトの名無しさん:2010/02/22(月) 21:51:20
>>710
C++では違いはprivate/publicをのぞき皆無だったと思いますんね。


712 :デフォルトの名無しさん:2010/02/22(月) 22:17:48
そうみたいだな
調べたらやっぱりCのstructとの違いだったわ
C allows “compatible types” in several places, C + + does not
For example, otherwise-identical struct types with different tag names are “compatible” in C but are distinctly
different types in C + +.

ついでにPodの記述
A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct,
non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator
and no user-defined destructor.

713 :デフォルトの名無しさん:2010/02/22(月) 22:31:48
>>712
決定打ありがとうございます。

714 :デフォルトの名無しさん:2010/02/22(月) 22:36:40
質問です。

コンパイル環境に特定のヘッダファイルがあるかどうかをプリプロセッサで判定するにはどうしたらよいですか?

#if defined ( __windows_h__ )
 ・
 ・
 ・
#elif defined ( __unistd_h__ )
 ・
 ・
 ・
#endif

みたいに書けたらいいけど、必ず __xxx_h__ が設定されているって保証はありませんよね?

715 :デフォルトの名無しさん:2010/02/22(月) 22:40:21
張った俺がいうのもあれだけど
podってのはplain old dataの略だからintとかも含む
PODとは書いてなく、POD-structと書いてあるだろ
感謝しる

Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member types (3.9.2), and cvqualified
versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD-struct types,
POD-union types (clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively
called POD types.


716 :デフォルトの名無しさん:2010/02/22(月) 22:58:34
>>714
ヘッダファイルがなかったらどうなるの

717 :デフォルトの名無しさん:2010/02/22(月) 23:03:52
>714
単独では無理。
強いて言えば configure とかを使う。

718 :デフォルトの名無しさん:2010/02/23(火) 07:08:25
ありがとうございました

719 :デフォルトの名無しさん:2010/02/23(火) 11:23:44
関数にstatic付けずにローカル変数にstatciつけると
関数はそれぞれ独立するけどローカル変数は共有されるって認識でおk?
つまりバグる?

720 :デフォルトの名無しさん:2010/02/23(火) 11:27:28
>>719
バグなのかどうかは自分の書くプログラム次第だろ
staticをつけることで自分の予期していない動作になるならバグだろうし
そうじゃなければ立派な仕様だよ

721 :デフォルトの名無しさん:2010/02/23(火) 11:29:35
>>719 NOT OK
関数のstaticはスコープの制限なので、
関数にstaticをつけようがつけまいが関数の実体は一つ。

(C++のメンバ関数の話なら、static は this が渡されるか否かの違い。)



722 :719:2010/02/23(火) 11:57:52
実体一つなら同時アクセスしたら詰まないのか?

723 :デフォルトの名無しさん:2010/02/23(火) 11:59:37
>>722
関数内でstaticな領域持たなければ問題ないよ

724 :719:2010/02/23(火) 12:03:58
マルチスレッド利用して
staticの変数持っている関数にアクセスすると問題ありって認識でおk?

725 :デフォルトの名無しさん:2010/02/23(火) 12:07:42
>>724
あるかもしれないし、ないかもしれない。

ひとつのスレッドの都合で読み書きしてるんならマズイだろうし、
スレッド間で情報を共有するつもりで static にしてるんなら、適切な同期さえ
入れてあれれば問題ないだろう。

726 :デフォルトの名無しさん:2010/02/23(火) 12:08:55
>>724
だから自分で想定した動作するならどう使おうが問題ないって
期待した動作しないなら駄目なんだって

727 :デフォルトの名無しさん:2010/02/23(火) 12:09:29
#include <iostream>
using namespace std;

void sub( const char* p[] )
{
cout << sizeof(p) << endl;
}

int main()
{
const char* str[] = { "Apple", "Banana", "Orange" };
cout << sizeof(str) << endl;
sub( str );
}


sub の中で str のサイズを取得したいんだけど
どうやったらできるの?
参照で渡せばいいかと思ってやってみたけどエラーだった
void sub( const char* (&str)[] )
void sub( const char*[] (&str) )


728 :デフォルトの名無しさん:2010/02/23(火) 12:11:29
>>727
何のサイズが欲しいの?

729 :デフォルトの名無しさん:2010/02/23(火) 12:13:10
>>727 template<std::size_t N> void sub( const char* const (&p)[N] )

730 :デフォルトの名無しさん:2010/02/23(火) 12:18:44
>>728
>>729

ありがとう
テンプレートってsugoiですね

731 :デフォルトの名無しさん:2010/02/23(火) 12:24:05
const char* p[]
const char* p
この違いをわかってないだろうなあ・・・

732 :デフォルトの名無しさん:2010/02/23(火) 12:46:40
>>724
MSのeraい人のお言葉だ
http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

あと"-fthreadsafe-statics"もぐぐっとけ

733 :デフォルトの名無しさん:2010/02/23(火) 12:53:22
まあなんというか情報処理の基本のような話だな
http://page.freett.com/cardno4/SelfStudy/1syu/IStady1Syu04_004.html

734 :デフォルトの名無しさん:2010/02/23(火) 13:37:48
テンプレート関係ねぇ〜

735 :デフォルトの名無しさん:2010/02/23(火) 14:02:38
関係ないことはないだろうが、テンプレートがすごいっていうよりか、
関数に渡すとサイズ情報が消える(ポインタに成り下がる)という C の
ルールがわかりにくいって話だろうね。

736 :デフォルトの名無しさん:2010/02/23(火) 14:06:21
>>735
成り下がるというかCなんてアセンブラで書いてらんねえという
のでできたような言語なのでそもそもそんな親切機能はないよ
最近のVM上で動くような言語だとVM側が管理してるので容易に
アクセスできるけどさ

あとC++のstd::stringあたりも一応持ってるのか
あれも実体はテンプレートじゃなかったっけ?

737 :デフォルトの名無しさん:2010/02/23(火) 14:09:55
>>736
何言ってんのかわけわからねぇ。

親切機能って何のこと?それはVMが管理することと関係あるの?
std::string が何を持ってるって?それはテンプレートであることと関係あるの?

まぁ初心者スレで適当なことフイてんじゃねーよ。

738 :デフォルトの名無しさん:2010/02/23(火) 14:15:05
サイズ情報の話だろ

頭大丈夫か?

739 :デフォルトの名無しさん:2010/02/23(火) 14:17:11
煽るほどの話かとは思うが、サイズ情報の話だとすればVMだとかテンプレートだとか関係ないな。

740 :デフォルトの名無しさん:2010/02/23(火) 14:30:40
まあまずは>>731の指摘した箇所を理解してからの話だな

741 :デフォルトの名無しさん:2010/02/23(火) 14:42:55
>>736
あちこちだめ。

742 :デフォルトの名無しさん:2010/02/23(火) 14:54:18
http://uproda.2ch-library.com/216146DUl/lib216146.png
これであってたっけ?
もう普段無意識で書いてるから間違ってたらごめん

743 :デフォルトの名無しさん:2010/02/23(火) 14:57:19
下の一段目は何だ

744 :デフォルトの名無しさん:2010/02/23(火) 15:03:16
const char* p[]だろ
その次がconst char* p

745 :デフォルトの名無しさん:2010/02/23(火) 15:04:42
配列を学び直せ

746 :デフォルトの名無しさん:2010/02/23(火) 15:08:57
>>745
どれにいってるのかわからん

でも左の箱が関数が貰う部分だろ?

747 :デフォルトの名無しさん:2010/02/23(火) 15:17:10
仮引数ではconst char** p

748 :デフォルトの名無しさん:2010/02/23(火) 15:25:26
>>742
配列は指し示すものじゃない
http://codepad.org/lua0iFiJ

749 :デフォルトの名無しさん:2010/02/23(火) 15:38:00
便乗質問いいですか?
char const **pp = &(char const *){"abc", "def", "ghi"};
これってメモリ配置としてみるとどうなってるんです?

>>742のような図で書くと・・・

750 :デフォルトの名無しさん:2010/02/23(火) 15:45:20
>>742の下の図が**だよ

751 :デフォルトの名無しさん:2010/02/23(火) 15:56:44
>>748
> char const **pp = &(char const *){"abc", "def", "ghi"};
これ規格上有りか? gccは警告出力する。


752 :デフォルトの名無しさん:2010/02/23(火) 16:00:30
>>751
警告を書けって
C99は有効にしたか?

753 :デフォルトの名無しさん:2010/02/23(火) 16:31:42
個人の趣味でツールやゲーム作りたくて、
HTMLとCSSくらいしか出来ないから土台作りからやろうと思ってJavaやってます

最終的にはC++で作りたいんだけど、
多少苦労してもちゃんと理解できるならそのままC++にいっていいんだろうか

754 :デフォルトの名無しさん:2010/02/23(火) 16:44:51
やさしいCより素数に関しての問題がありました。
本書の答えとして下記の式があったのですが、どうして素数が導きだされるのか分かりません。
どなたか解説宜しくお願いします。
#include <stdio.h>

int main(void)
{
int i,num;
printf("2以上の整数を入力¥n");
scanf("%d",&num);
for(i=2;i<=num;i++){
if(i==num){
printf("%dは素数¥n",num);
}
else if((num%i)==0){
printf("%dは素数ではない¥n",num);
}
}
return 0;
}

else以降は素数でない数が導きだされる理由がわかるのですが、
「if(i==num)」ここの部分で素数と判別される構造がどうしても分かりません。

755 :デフォルトの名無しさん:2010/02/23(火) 16:48:52
>>753
学習そのものを面白がれる人なら、「まずは○○言語から」とかそういう順序は
まったく考えなくていいんだけどね。この辺はその人その人の性質次第。
頭の良し悪しもあまり関係ない、と思う。

756 :デフォルトの名無しさん:2010/02/23(火) 16:50:00
iは1ずつ増えていくわけだから
numに来たってことは
それまでのすべての数で割りきれなかったってこと
これって素数の定義でしょ


757 :デフォルトの名無しさん:2010/02/23(火) 16:54:35
else if((num%i)==0){
printf("%dは素数ではない\n",num);
break; /* これ重要 */
}

こういうことか?

758 :デフォルトの名無しさん:2010/02/23(火) 16:56:46
>>753
順番が違う気がする。普通、C言語から始めるもんじゃないのか。

759 :デフォルトの名無しさん:2010/02/23(火) 17:14:26
すみません、break;を入れ忘れていました。
例えばscanf("%d",&num);に8を入れたとして
for内にi<=numがあるからnum==8は真に。
この時点でどんな数を入れても真になるような気がして。

760 :デフォルトの名無しさん:2010/02/23(火) 17:15:09
breakしたら、真になるまえにforループは終わるよ

761 :デフォルトの名無しさん:2010/02/23(火) 17:25:24
トレース表作ってやった
どこでループが終わるか考慮しながら
num=7 と 8 で表を埋めてみろ

i | i<=num  | i==num | num%i==0
-+--------+-------+--------
2 |        |        |
3 |        |        |
4 |        |        |
5 |        |        |
6 |        |        |
7 |        |        |
8 |        |        |


762 :デフォルトの名無しさん:2010/02/23(火) 17:29:53
>>756,757,760
みなさんのおかげで分かりました。
scanf("%d",&num)に8を入れても、iは2からスタート。
まずは2から始まって、最初のi==numは偽になり、
次の(num % i)==0で真が返ってきてbreak
7を入れた場合は2-6間のループで全て偽で来て
最後の7で(i==num)が真で返されて成立という解釈でいいでしょうか?

numに8をscanfで読み込ませた時点で2の存在(ループそのものの存在)を忘れていました。


763 :デフォルトの名無しさん:2010/02/23(火) 17:59:15
>>761
返信おくれました、ありがとうございました。
こうやって表にしてみると考えやすいです。
またループで分からなくなったらこういった表を作って理論付けていきたいと思います。
ホント慣れないとダメですね…8を入れたんだからnum==8じゃないかと端から決め付けている自分がいたり。
みなさん本当に感謝です。

764 :デフォルトの名無しさん:2010/02/23(火) 18:24:52
>>752
$ gcc -std=c99 748.c
gcc -std=c99 748.c
748.c:2: warning: excess elements in scalar initializer
748.c:2: warning: (near initialization for '(anonymous)')
748.c:2: warning: excess elements in scalar initializer
748.c:2: warning: (near initialization for '(anonymous)')

765 :デフォルトの名無しさん:2010/02/23(火) 20:54:49
>>754
if(i>sqr(num)){
にするとループ回数が減らせられるね。

766 :デフォルトの名無しさん:2010/02/23(火) 20:57:31
>>765
それもそうだけど、毎回そうやって判定したいのならループの終了判定処理はいらなくね

767 :デフォルトの名無しさん:2010/02/23(火) 21:31:39
質問です。
環境はWindowsのVC++6.0です。
コンソールアプリを作っています。
子プロセスの処理終了後、親プロセスに子プロセスの終了と結果を返したいのですが、どうすればよいのでしょうか。
子プロセス生成後、親プロセスは別処理を行いたいため(子プロセスの終了をwaitしない)シグナルでプロセスの終了を検知しようとしたのですが、
SIGCHLDがVC++6では使えないとお聞きしました。
何か別の方法がありましたら、ご教授お願いいたします。

768 :デフォルトの名無しさん:2010/02/23(火) 21:42:57
「ご教授」っていう日本語の使い方があまりにも多くて、だんだん自然に見え始めた

769 :デフォルトの名無しさん:2010/02/23(火) 21:46:13
別スレッドで待つかGetExitCodeThread()がSTILL_ACTIVEを返す間何かやってれば
非同期シグナルなんぞやれてもやるもんじゃねえよ

770 :デフォルトの名無しさん:2010/02/23(火) 21:48:40
子の処理が完了して親を呼び出して結果渡すけど
親としてみると子の処理結果はそんなにどうでもいいものなの?
アプリ終了時にファイルに書き出すだけでいいとかその程度なのかな?

771 :デフォルトの名無しさん:2010/02/23(火) 22:07:09
>>769
別にスレッドを作成して、そこでwaitをするということでしょうか。

>>770
最良はこの処理が完了して、その結果を親に受け渡してそれを受けてまた処理を・・・ということなんですが、それが無理そうであればこの処理が完了した。
ということだけでも受け取りたいと思っています。


772 :770:2010/02/23(火) 22:08:39
>>この処理

子プロセスの処理です。
すみません。

773 :デフォルトの名無しさん:2010/02/23(火) 22:24:13
>>772
・子プロセスを逐次処理するスレッドを作る
・メインで子プロセスを逐次処理し、他にやりたいことを別スレッドでやる

774 :デフォルトの名無しさん:2010/02/24(水) 00:27:20
C++学ぶのにいい本ありませんか?

775 :デフォルトの名無しさん:2010/02/24(水) 00:55:47
>>774 http://pc12.2ch.net/test/read.cgi/tech/1266070683/4-5

776 :デフォルトの名無しさん:2010/02/24(水) 03:40:27
>>772
WaitForSingleObject(handle, 0)
で待たないですぐ帰ってくるよ

777 :デフォルトの名無しさん:2010/02/24(水) 06:50:02
>>774
こいつはマルチポストだから相手にしないように!


778 :770:2010/02/24(水) 08:00:24
>>773 >>776
ありがとうございます
試してみます


779 :デフォルトの名無しさん:2010/02/24(水) 17:35:19
DirectX初心者スレでちょっと話題になり、こちらのスレが適切かと思い質問させていただきにきました。
よろしくお願いします。

float a = 0.54351f;
float b = 0.21356f;
a *= b;

というC++のプログラムがあったとします。(aとbは実際にはローカル変数ではなく、最適化により式が消えることはないとしてください)
この時、aの結果が「PC環境によって異なる」かどうかが知りたいのです。

DirectXにあるD3DXというライブラリでは、内部でSSEやらSSE2やら3DNow!やら、色々
「そのPC環境で、もっとも浮動小数点計算が高速な手段を探し、それを使う」
という挙動をします。
もともと描画ライブラリなので、この挙動自体素晴らしいものだとは思います。

ただ、互換性が重要な場合に困ってしまうのです。
そこで自前の浮動小数点計算ライブラリを作るべきという話になったのですが、最初にあげたように
普通にfloatを使っているだけなら互換性が保証されるのか?という点においてまったく自信がありません。


少し調べたところ「互換性重視ならx87FPUを使うべき」という意見も見かけました。
ただ「x87FPUと使え」と指定する方法も分かりません。

「x86用コンパイラは、通常小数点計算をx87FPUにやらせるようにコンパイルする」とあるのですが、実際のところどうなのでしょうか?
http://msdn.microsoft.com/ja-jp/library/e7s85ffb%28VS.80%29.aspx
コンパイラオプションでSSEを有効にする、しないのようなオプションもあるにはあるのですが…。

分からないことだらけな上、長文ですが、ご意見よろしくお願いいたします。

780 :デフォルトの名無しさん:2010/02/24(水) 17:42:05
>>749
型おかしくない?

781 :デフォルトの名無しさん:2010/02/24(水) 17:53:38
>>779
32ビットx86向けならVC++だと/arch、gccだと-mfpmath/-marchのようなオプションを使わないとSSEとか勝手に使わない
だってSSEの無いCPUで動かないじゃん
同じ命令が実行されるなら別PCでも同じ結果だよ

782 :デフォルトの名無しさん:2010/02/24(水) 17:58:45
アルファベットの認識は
a <= z
とかでできるけど、日本語のひらがなカタカナ漢字はどうすりゃええの?

783 :デフォルトの名無しさん:2010/02/24(水) 17:59:16
>>781
レスありがとうございます。
「SSEとか勝手に使わない」という場合、それは「x87FPUを使う」という意味なのでしょうか?
それとも「x87FPUすら使わない」という意味なのでしょうか?

もし、素っ頓狂な質問してたらすいません。

784 :デフォルトの名無しさん:2010/02/24(水) 18:02:11
>>782
文字コードに合わせて範囲チェック

785 :デフォルトの名無しさん:2010/02/24(水) 18:15:10
正規表現でウ冠の漢字抽出とか出来たら素敵やん
と一瞬思いかけたけど、別に素敵でもなかった。

786 :デフォルトの名無しさん:2010/02/24(水) 18:19:39
使用する場面が思いつかないな

787 :デフォルトの名無しさん:2010/02/24(水) 18:26:40
>>786
誤字抽出に使えるかもしれん。
熟語でも片方の漢字でツクリを間違ってるとかが取り出せるかも。
ほんとどうでもいいけどな。

788 :デフォルトの名無しさん:2010/02/24(水) 18:35:17
>>783
x86向けでsoft-floatがデフォルトの処理系が有ったら知りたい

789 :デフォルトの名無しさん:2010/02/24(水) 19:16:01
漢字コードみつけてやってみたけど
亜の一バイトめがffffff88になるんだが
なんでじゃ

790 :デフォルトの名無しさん:2010/02/24(水) 19:17:47
>>788
普通にfloat変数を使っていれば、x87FPUが使われ、環境依存は受けない
ということですね。

ありがとうございました。
安心して自前演算ライブラリ作れます。

791 :デフォルトの名無しさん:2010/02/24(水) 19:17:49
>>787
そういうとこに浪漫を見つけるのがプログラマっぽいな

792 :デフォルトの名無しさん:2010/02/24(水) 19:18:20
>>789
符号付整数のまま char → int の拡張を行ってるから
unsigned char → int なら 0x088 になるよ

793 :デフォルトの名無しさん:2010/02/24(水) 19:20:45
>>792
ふはは
できおったわ

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

794 :デフォルトの名無しさん:2010/02/25(木) 02:26:00
>>790
ところでそういう用途ならfloatよりdoubleのほうがよくない?
floatの精度ってコンパイラに依存したりするし。

795 :デフォルトの名無しさん:2010/02/25(木) 02:32:09
>>794
double でも環境依存なのは同じなんだけど、誤差が問題になりにくくなるってことだよね?

796 :デフォルトの名無しさん:2010/02/25(木) 09:26:42
D3Dのデフォ精度がfloatになってるんだから仕方がない

797 :デフォルトの名無しさん:2010/02/25(木) 10:58:09
>>794-796
求めているのは「同EXEを実行したときに環境依存にならないこと」です。
>>794さんのおっしゃるような「コンパイラ依存」であれば問題はありません。

798 :デフォルトの名無しさん:2010/02/25(木) 11:34:38
今時はieee 754だから環境依存は無い。x86のFPUは80ビットの拡張フォーマットを
使うけれど、SSE2の方が早いのでこっちを使う。64ビットなので環境依存は無い。

799 :デフォルトの名無しさん:2010/02/25(木) 11:44:18
32bit版のVC++ではFPUは53bit仮数モード(64bit整数)が標準。
つまり内部でも64bit仮数モード(temporary real)は使っていない。


800 :デフォルトの名無しさん:2010/02/25(木) 11:50:03
floatの場合もFPU内部では53bit仮数モードで動くのでその部分の過精度による誤差は発生する。
それが気になるなら/fp:strictを使うしかない。パフォーマンスが大きく落ちるけど。

> fast - "fast" 浮動小数点モデルです。結果の予測が困難になります
> precise - "precise" 浮動小数点モデルです。結果は予測可能です
> strict - "strict" 浮動小数点モデルです (/fp:except を暗示)


801 :デフォルトの名無しさん:2010/02/25(木) 11:58:06
>>799 (64bit整数) は 実数 の間違い。

64bitWindows用のVC++では関数の呼び出しや戻値の規約で
実数はXMMレジスタを使うことになってる。
で関数の中の計算はFPU使っててワロス(オプションで変わるけど)

802 :デフォルトの名無しさん:2010/02/25(木) 12:11:01
>>779
アセンブリ出力見て、各命令の仕様を調べればいいんじゃないの?

CPU 命令の動作として環境ごとに動作を振り分けるようなことは無いと思うんだけどね。

803 :デフォルトの名無しさん:2010/02/25(木) 12:38:56
>>799
FPU制御ワードで、単精度(24)、倍精度(53)、拡張精度(64)選べるな。
それじゃ、誤差が処理系に依存というのも正しく使えば避けられると
いう結論。

804 :デフォルトの名無しさん:2010/02/25(木) 13:10:08
>>798
すいません。Pen4時代くらいまではサポートしたいので、今どきで統一するわけには(需要の関係で)

>>799-801
計算誤差自体はあまり問題ありません。
環境によって計算誤差の誤差量が異なるのならダメですが、そういうわけではないですよね?

>>802
D3DXが、環境ごとに動作を振り分けていました。
ただこれは、D3DX自体が「そういう機能を持っている」のだと思います。
思いますが、あくまで自分の推測でしかなかったので

float計算ってそもそも環境によって勝手にSSEやらSSE2やら3DNow!やらが使われちゃったりするのかな?

という疑問が晴れなかったのです

>>803
_controlfp_s とかでしょうか?
これで例えば単精度を設定すれば、どこの環境でもfloat計算は同じ結果になるのでしょうか?
というか、逆にやらないと結果が異なるのでしょうか?

余談ですが、Direct3Dを一般的な方法で初期化すると、floatは単精度(24bit)になるようです。
そもそも描画が目的なので、精度は荒くても良いとう考え方なんでしょうね。

805 :デフォルトの名無しさん:2010/02/25(木) 13:12:14
環境に関係なく動くコードにしちゃったほうがいいんじゃないの?
何をやるところでそういう環境依存の影響がでてるのやら

806 :デフォルトの名無しさん:2010/02/25(木) 13:19:42
>>805
すいません。話を整理しますと

「3Dの行列演算など」をD3DXというMicrosoftのライブラリで行うと、環境によって結果に差がでてしまうのです。
これは、D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
(SSE使ったり、3DNow!使ったり)

描画だけであればそれでいいのですが、ゲームの当たり判定などのロジック部分でも使っていると、
通信対戦やリプレイファイルの再生などで差がでてしまいます。

では、自前でライブラリ作ろう。という話になったのですが、3Dゲームが作れようがCPUの仕組みなどについてはド素人。
「float の単純な掛け算とか足し算は、まさか環境によって差が出たりしないよな?まさかな?」
という不安がぬぐえず、相談しに来ました。

現状のところ問題はなさそうなのかな。といった感じですが…。

今まで分かったと思っていることは
・SSEやSSE2を使う場合、コンパイルオプションをいじったり、インラインアセンブラなどを使う必要がある
・つまり、そうしなければSSE2などは使われない
・そうするとデフォのx87FPUが使われる
・x87FPUは古くからあり、Windows環境で使えない環境はもはや無い。また、環境によって計算結果が変わることもない

ツッコミどころあれば、よろしくお願いします。

807 :デフォルトの名無しさん:2010/02/25(木) 13:43:20
>>806
そこまで気になるならソフト書いてログを取ればいいんじゃないの?
試したい判定処理とかを数フレーム分行うようなロジック書いて
各フレームごとの計算結果を出力して送ってもらうとか

でexeばら撒いて結果集めればいいだけのような気もするし

808 :デフォルトの名無しさん:2010/02/25(木) 14:03:49
キー操作だけでなく差が出たら困る主要な情報も一緒に通信・リプレイデータに押し込んで補正しながら再生すればいいんじゃない

809 :デフォルトの名無しさん:2010/02/25(木) 14:13:25
>>807
お前、見ず知らずの人間がテストと称してばらまいたexeを実行してやるのか?

810 :デフォルトの名無しさん:2010/02/25(木) 14:21:24
喧嘩はすんな
しかし質問者の意図と離れて、場当たり的な解決方法を提示するのはいかがなもんだ?
どうやら3Dゲーム自体を作る能力はあるようだし、場当たり的解決法は言われなくてもできる人間だろ

811 :デフォルトの名無しさん:2010/02/25(木) 14:39:31
つか、そんなに統一した精度が必要なら
必要になった時に1/1000なりして整数型から落とし込めば良くね?
使いたくないのはdirectxのベクトル計算くらいだろうし

812 :デフォルトの名無しさん:2010/02/25(木) 14:41:53
代替案を勝手に出してる連中は、統一動作が不可能だと確信してるってことだよな?
ソースを出してくれんか

813 :デフォルトの名無しさん:2010/02/25(木) 14:44:42
>>812
不可能かどうかもわからんからデータ集めろといったんだが

同じテストプログラムをいろんな環境で動かしてその際の数字を比べれば一目両全だろう

上でやった話は規格をあわせてるから「たぶん」同じのはず・・・ということだろ?

814 :デフォルトの名無しさん:2010/02/25(木) 14:48:37
不可能かどうかわからないからここに聞きにきているのであって、
答えられない人間が「データ集めろ」というのは筋違いすぎると思うんだが

データ集めて確認する気とできる環境ががありゃ、聞くまでもなくチェックするだろJK

815 :デフォルトの名無しさん:2010/02/25(木) 14:52:27
じゃああきらめろ

816 :デフォルトの名無しさん:2010/02/25(木) 14:53:39
小数点以下の計算アルゴリズムを統一させたいんだろ
ゲームならそこまで精密にしなくていいし

817 :デフォルトの名無しさん:2010/02/25(木) 14:58:54
んなこといったらFPSすら厳密に統一できないことになるわ

818 :デフォルトの名無しさん:2010/02/25(木) 15:00:53
なんで質問者不在でそんなに話脱線させまくるん?

819 :デフォルトの名無しさん:2010/02/25(木) 15:05:01
データ集めて誤差がないよならそれでOK
あるならどれくらいの誤差がでるかでどうごまかすかを考えればいいだけだろ
データが無いのにあれこれ考えたって始まるわけがない

820 :デフォルトの名無しさん:2010/02/25(木) 15:11:46
FPUの仕様、もしくはコンパイラの互換性についての仕様を知っている人が答えればいいだけの話。
何も知らずに騒ぐだけの人は、親切しているつもりかもしれんけど脱線させてるだけだよ

821 :デフォルトの名無しさん:2010/02/25(木) 15:18:56
単純明快な質問として
printfの結果が全てのWindows環境で一致するのか?って質問だろ?
どうなん実際?

float f = 0.1657387f;
for(int i = 0; i < 100; ++i)
{
f *= 1.123458381f;
}
printf("%f", f);


822 :デフォルトの名無しさん:2010/02/25(木) 15:36:36
> SSE使ったり、3DNow!使ったり
SSE使う時と3DNow!使う時の動作の違いに関して説明出来なきゃダメ。
「わからないけど、ライブラリ作り直してみよう」なんてのは徒労に
終わる可能性大。

823 :デフォルトの名無しさん:2010/02/25(木) 16:20:38
>>822
お前なんの話してんの?(苦笑)

824 :デフォルトの名無しさん:2010/02/25(木) 16:24:21
SSE2が使える環境では違う結果になる例

void foo()
{
double hoge = pow(1.1, 1.1);
for(int i = 0; i < 10; ++i)
hoge += pow(hoge, 1.1);
printf("%.14f\n", hoge);
}

int main()
{
foo();
_set_SSE2_enable(0);
foo();
}

825 :デフォルトの名無しさん:2010/02/25(木) 16:25:28
>>824
え、デフォルトって_set_SSE2_enableが1の状態だっけ?

826 :デフォルトの名無しさん:2010/02/25(木) 16:29:11
http://msdn.microsoft.com/library/bthd138d
SSE2 の実装を有効にする場合は 1。SSE2 の実装を無効にする場合は 0。既定では、SSE2 の実装をサポートするプロセッサでは有効になっています。

827 :デフォルトの名無しさん:2010/02/25(木) 16:36:36
横からちょっとすまん
>>826
その言い回しって、つまりどういうこと?
SSE2がある実行環境なら、勝手にSSE2が使われるってこと?算術関数の中で。

プロセッサって実行環境側の話だよね?

828 :デフォルトの名無しさん:2010/02/25(木) 16:42:44
>>827
>>826にこんなのがあった
使用例
// crt_set_SSE2_enable.c
// processor: x86
#include <math.h>
#include <stdio.h>

int main()
{
int i = _set_SSE2_enable(1);

if (i)
printf("SSE2 enabled.\n");
else
printf("SSE2 not enabled; processor does not support SSE2.\n");
}

829 :デフォルトの名無しさん:2010/02/25(木) 16:42:46
SSE2のスカラ演算はFPUと比べて速くはなかったと思うけどどうなんだろ。
今のところ自動ベクトル化をサポートしてるのはインテルのコンパイラくらいかな。

830 :デフォルトの名無しさん:2010/02/25(木) 16:43:04
>>824
doubleの有効桁は15,6しか無いんだから不思議じゃ無い。

831 :デフォルトの名無しさん:2010/02/25(木) 16:52:43
>>830
流れ嫁

832 :デフォルトの名無しさん:2010/02/25(木) 17:13:01
FYL2Xを使ってるな。このあたりで過精度になるんかな。

833 :デフォルトの名無しさん:2010/02/25(木) 18:01:59
>>824
これについては「SSE2が使える環境同士」なら互換性はありそうだな。
まあ怖ければ無効にしておくのも手か。

結局のところ(俺も気にしたことなかったので知らんのだが)
普通にfloatの計算を書く限りは、全部x87で動作するみたいね?

834 :デフォルトの名無しさん:2010/02/25(木) 18:16:53
SSE2が無いx86CPUなんて無くなってしまえばいいのに

835 :デフォルトの名無しさん:2010/02/25(木) 18:18:57
Pentium寄り古い486SXとかだとFPUが無いので、FPU使う/使わないなコンパイルオプションもあるんじゃ?

836 :デフォルトの名無しさん:2010/02/25(木) 18:21:06
>>835
そこまでくるとそもそもバス帯域から整数演算能力までバランス取れてないよ

837 :デフォルトの名無しさん:2010/02/25(木) 18:36:56
Win32以降はx87のエミュレーションはOS側で面倒を見てたはずだから、
コンパイラはx87のコードを生成して問題ない。


838 :デフォルトの名無しさん:2010/02/25(木) 18:50:22
構造体 TES{
char a[2];
}
この構造体の実体を10個作成し(TES tes[10])、それぞれのメンバaには"A","B","C","D"…と順番に
文字が入っているとします。
10個の実体をvector配列に入れ、例えばメンバaが"C"のtesだけを削除したい場合どのような操作をすれば
よいのでしょうか?
eraseで削除したい場所を指しているイテレータを指定すればよいことは分かっているのですが、3番目の
要素をイテレータで指定する方法が分かりません…


839 :デフォルトの名無しさん:2010/02/25(木) 18:57:02
>>837のソース
http://support.microsoft.com/kb/102555/en

840 :デフォルトの名無しさん:2010/02/25(木) 19:20:30
>>838
v.begin() + 2


841 :デフォルトの名無しさん:2010/02/25(木) 19:28:27
>>840
begin()に整数足せたんですか… てっきりエラーになると思っていました。
お蔭様でうまくいきました。ありがとうございます。

842 :デフォルトの名無しさん:2010/02/25(木) 19:31:01
>>838
find_ifで探す

843 :デフォルトの名無しさん:2010/02/25(木) 19:40:28
>>841
蛇足だけど、+ 使えるのは random access iterator の時だけなんで、list の時なんかは無理。
一応、std::advance ってのがある。

844 :デフォルトの名無しさん:2010/02/25(木) 19:45:54
struct foo{
const char* a;
foo(const char* bar):a(bar){}
bool operator()(const TES &tes) const{
return strcmp(a, tes.a) == 0;
}
}

v.erase( std::remove_if( v.begin(), v.end(), foo("C") ), v.end() );

845 :デフォルトの名無しさん:2010/02/25(木) 19:52:32
なんでダメなんだろうな
整数足したら内部でadvanceしてくれてもいいじゃんって思う

846 :デフォルトの名無しさん:2010/02/25(木) 19:59:43
>>845
パフォーマンスがガタ落ちしてることに気づかない人が出るから

847 :デフォルトの名無しさん:2010/02/25(木) 20:10:26
それは気づかないひとが勉強不足だから悪いって話じゃね?

848 :デフォルトの名無しさん:2010/02/25(木) 21:27:10
直接 std::list<>を使ってれば解るけど、間接的に使われてた場合やオリジナルのコンテナだとわからないし。


849 :デフォルトの名無しさん:2010/02/25(木) 21:30:50
キャストみたいに推奨されない使い方をする際は使いにくいデザインにってやつじゃないかね


850 :デフォルトの名無しさん:2010/02/25(木) 22:43:54
>>806
> D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
これは、D3DXの実装として、そのような動作を組み込んでいるからだということが分かれば後は分かりそうなもんだけど


851 :デフォルトの名無しさん:2010/02/25(木) 22:45:22
>850
3DXの内部がやるように、SSE2を使う!とか明示的にしない限り、x87だってこと?
でも算術演算系が実は勝手にSSE2使ったりとか、結構色々あるね
FLOAT使って環境誤差無しってのは超難しいのかしら

852 :デフォルトの名無しさん:2010/02/25(木) 22:48:52
>>851
それってmsvcrtをスタティックリンクにしても環境依存しちゃうの?
そうなら俺無知でごめん

853 :デフォルトの名無しさん:2010/02/25(木) 22:50:05
ライブラリの中で使われてたら対応できないね。
全てソースで入手可能でコンパイルできるなら、/fp:strictで大丈夫なんだけど。


854 :デフォルトの名無しさん:2010/02/25(木) 22:52:42
そなんだ。。結構根が深いのね。
ちなみにだけど、>>804のいう、Pen4時代ってSSE2標準搭載だよね
AMDがどうなのかとか、むしろいまどきのatomとかでどうなるのか分からないから結局アレだけども。。

855 :デフォルトの名無しさん:2010/02/25(木) 22:58:34
>>824
SSE2が使えない環境でそれは動くのか?という。

856 :デフォルトの名無しさん:2010/02/25(木) 23:04:15
ランタイムの中は
if(__sse2_available)
{
}
else
{
}
的になってる
用意してくれたものなら動くかどうかの心配はいらない

857 :デフォルトの名無しさん:2010/02/25(木) 23:20:08
>>856
それなら_set_SSE2_enableって何のために使うの?

858 :デフォルトの名無しさん:2010/02/25(木) 23:21:29
自己レス
if(__sse2_enable && __sse2_available)
{
}
else
{
}
ってな感じになってるってことかな?

859 :デフォルトの名無しさん:2010/02/25(木) 23:23:59
浮動小数点の問題って根が深いんですね
同じプログラムが、環境によって結果が変わるなんて考えたこともなかったです

860 :デフォルトの名無しさん:2010/02/25(木) 23:37:10
そういえばjavaにはstrictfpなるキーワードがあった。

861 :デフォルトの名無しさん:2010/02/25(木) 23:39:48
>>857
VC10RCだとこんな感じ
int _set_SSE2_enable(int flag)
{
return __sse2_available = !!flag & IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)
}

実際にはIsProcessorFeaturePresentの結果はまた別の変数に保存して有るけどな

862 :デフォルトの名無しさん:2010/02/25(木) 23:39:58
>>857
_set_SSE2_enable(0)はSSE2が使えるCPUでFPUを使いたい場合に指定する。
SSE2のない場合に1にしようとしてもエラーになるはず。


863 :デフォルトの名無しさん:2010/02/25(木) 23:57:56
>>861
_set_SSE2_enable(0)とすれば、実行環境にかかわらず、SSE2が無効になるってこと?

>>862
_set_SSE2_enable(1)としておけば、SSE2が使えない環境で実行できないアセンブリができるってこと?

ってことはさ、SSE2が使えるCPUではデフォで_set_SSE2_enableが1となっているわけだから、
環境に依存した結果にはならないってことになるでおk?

864 :デフォルトの名無しさん:2010/02/25(木) 23:58:40
> ってことはさ、SSE2が使えるCPUではデフォで_set_SSE2_enableが1となっているわけだから、
ここ余計でした。

865 :デフォルトの名無しさん:2010/02/26(金) 00:41:11
SSE2が使えるかの返り値を返す関数との積を取るのになぜそういう疑問が出る

866 :デフォルトの名無しさん:2010/02/26(金) 01:44:43
#include <iostream>
#include <cstddef>

main()
{
char* s = NULL;
char* p = s;

std::cout << p;
}

を実行すると出力のところでエラーが出て強制終了するのですがなぜでしょう

867 :デフォルトの名無しさん:2010/02/26(金) 01:46:49
だってNULLだし

868 :デフォルトの名無しさん:2010/02/26(金) 01:48:33
コンパイラのバグです

869 :デフォルトの名無しさん:2010/02/26(金) 01:48:39
>>867
char*をint*にすると0000000が出力されるのですが・・・

870 :デフォルトの名無しさん:2010/02/26(金) 01:50:04
>>869
NULLを0とする環境?だかコンパイラってことでしょ

871 :デフォルトの名無しさん:2010/02/26(金) 01:50:11
>>866
cout は char* を受け取ったら
もしかして文字列なんじゃね?
と判断してメモリの内容を読もうとするから

872 :デフォルトの名無しさん:2010/02/26(金) 01:51:51
char* s = "hoge";
とかかけるからなあ

まあcの構文が分かりにくいってのもあるんだろうな

873 :866:2010/02/26(金) 02:04:57
すみませんいまいち理解できないのですが、
int*の場合はアドレスとして解釈されており、
char*の場合はたとえ文字列として解釈されても
NULL文字を出力すること自体に問題はない気がするのですが

874 :デフォルトの名無しさん:2010/02/26(金) 02:07:34
>>873
NULL と NUL文字 は全く関係ないよ

875 :デフォルトの名無しさん:2010/02/26(金) 02:08:09
ポインターの中を出力なら
std::cout << &p;
std::cout << *p;
あれどっちだっけ?w

876 :デフォルトの名無しさん:2010/02/26(金) 02:15:08
>>873
まあどっちもアドレスなんだけど数値と文字じゃあ扱いが違うからねえ
intの場合だと今もっとも多いので4バイトか
charの場合\0がでるまでひたすら読み込もうとするからねえ

それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ

877 :デフォルトの名無しさん:2010/02/26(金) 02:21:31
>>865
_set_SSE2_enable(0)だと、__sse2_availableは常にfalse
_set_SSE2_enable(1)だと
 SSE2が使えないCPUではエラーが出る
 SSE2が使えるCPUでは__sse2_availableは常にtrue
てことは、動作する環境である以上、差異は出ないと思ったんだけど、そうではないとなると、
「SSE2が使えないCPUではエラーが出る」これがダウトなんかね

878 :デフォルトの名無しさん:2010/02/26(金) 02:32:43
>>874
そうでしたか。ありがとうございます。

>>876
「charの場合\0がでるまでひたすら読み込もうとする」ことが上記のエラーとどう関連しているのかわからないのですが・・・
それと、「触れない」というのは触ることができない、という意味でしょうか。それとも目にすることがない、という意味でしょうか。

879 :デフォルトの名無しさん:2010/02/26(金) 02:58:14
>>842-844
〜if等の条件指定もできるんですね。
イテレータのことはあまり知らないので勉強します
ありがとうございました。

880 :デフォルトの名無しさん:2010/02/26(金) 03:02:56
char *s = "hogehoge"; // "hogehoge"という文字列を格納したアドレスを指すポインタ
char *s = NULL; // 0番アドレスを指すポインタ(NUL文字を格納したアドレスでは無い)

881 :デフォルトの名無しさん:2010/02/26(金) 03:25:58
>>880
その0番アドレスがcoutで出力されないのはどうしてなのでしょう

882 :デフォルトの名無しさん:2010/02/26(金) 03:36:17
operator<<がそういうふうにオーバーロードされてるから

883 :デフォルトの名無しさん:2010/02/26(金) 03:52:20
>>881
アクセス出来ないように保護されてるから。
それが>>876の言う
>それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ

884 :866:2010/02/26(金) 04:02:08
なるほど。疑問が氷解しました。
理解力に乏しく何度も質問してしまいましたが、見捨てずに答えてくださった皆さんありがとうございます。

885 :デフォルトの名無しさん:2010/02/26(金) 04:07:20
>>883
それはアクセス違反で落ちるはずだが

886 :デフォルトの名無しさん:2010/02/26(金) 04:27:04
だから>>866はそう言ってるじゃない。強制終了するって。

887 :デフォルトの名無しさん:2010/02/26(金) 06:00:08
アドレス0x00000000ってwindowsマシンだとBIOSのハードウェア割り込みの0番が
予約してたりするんじゃないかな?
ユーザーが使えるのはメモリ空間のうち真ん中くらいで0x0000000とか0xFFFFFFFF付近なんて
システム予約で一般的なプログラムはほぼ触れない領域になってるはず

だからこそ何もセットされてないという意味のNULLに0x00000000だったりするんだけどね

888 :デフォルトの名無しさん:2010/02/26(金) 07:19:16
> windowsマシン
ここいらへんに素人臭を感じる。

889 :デフォルトの名無しさん:2010/02/26(金) 07:24:51
>>888
PC9801やPC/AT互換機とか言ってもわからねーだろ
DOS時代にすでに予約されててそのまま来ちゃってるのは知ってるよ
インタラプトいじってたんだし

890 :デフォルトの名無しさん:2010/02/26(金) 07:27:40
わかって無い事はわかったから、もう引っ込んでていいよ。

891 :デフォルトの名無しさん:2010/02/26(金) 07:32:17
分かった風な俺すげーな人が朝から常駐するスレはここですか?

892 :デフォルトの名無しさん:2010/02/26(金) 08:00:11
ヒント:論理アドレス

893 :デフォルトの名無しさん:2010/02/26(金) 08:33:11
いいえ、わかっていない素人がわかったつもりで蘊蓄を語るスレです。

894 :デフォルトの名無しさん:2010/02/26(金) 09:07:28
std::vector<int> A;
A.resize(2);
ってやるとA[0],A[1]が確保されるの?
A[2]までは確保されないよね?

895 :デフォルトの名無しさん:2010/02/26(金) 10:22:19
>>894 それであってる。

896 :デフォルトの名無しさん:2010/02/26(金) 12:25:50
>>887
NULL = (void *)0 が実アドレスでも 0 であるとはかぎらない。

897 :デフォルトの名無しさん:2010/02/26(金) 12:32:11
http://www.kouno.jp/home/c_faq/c5.html
以降ヌルポインタの実装に関わる話は無しでおねがいします。

898 :デフォルトの名無しさん:2010/02/26(金) 12:32:50
>>894
end()の関係で値返さないとならないので、物理的には[2]も確保されている。
但し使用してはいけない。

899 :デフォルトの名無しさん:2010/02/26(金) 12:40:08
>>898 ねーよ。

900 :デフォルトの名無しさん:2010/02/26(金) 12:45:49
>>898
それはない。


901 :デフォルトの名無しさん:2010/02/26(金) 13:29:02
昨日の話に便乗して少し質問なのですが
http://msdn.microsoft.com/ja-jp/library/7t5yh4fd%28VS.80%29.aspx

VCコンパイラの/archオプション。
これでSSE2を指定すると

全てのfloat/double の計算が、x87FPUではなくSSE2で行われるようになる。

のでしょうか?

902 :デフォルトの名無しさん:2010/02/26(金) 13:29:54
すいません。質問がおかしかったです。
>>901は忘れてください。
SSE2のほうが高速だったらって書いてありました

903 :デフォルトの名無しさん:2010/02/26(金) 15:09:58
>>898
resize(2) なら size() は 2 を返すだろうが
capacity() が 2 かどうかは判らない。大抵は 2 だろうけども。

904 :デフォルトの名無しさん:2010/02/26(金) 17:08:07
最近話題になっている浮動小数点の話について。
SSEやらSSE2を使うためには
・アセンブラ、インラインアセンブラで書く
・コンパイルオプションでSSEやSSE2を指定する(ただし、SSEを指定した場合、SSEが無い環境では動作しなくなる。SSE2も同様)

という明示的な方法が必要なもよう。
つまり、単なるfloat計算をして、デフォのコンパイル設定でコンパイルしている限りはSSEなどが使われることはない。

D3DXが内部できちんと使い分けてくれるのは、D3DXがそのようにきっちり実装されているからということですね。

よって
「D3DXを使わないで、自前のfloat計算ライブラリを使えば、環境依存によるバグは発生しない」
と言えるのではなかろうか。

それとは別に、 _set_SSE2_enableを適切に使っておかないと、SSE2がある環境と無い環境で、atanなどの結果が異なってしまうと思われ?


905 :デフォルトの名無しさん:2010/02/26(金) 17:53:06
x64環境ではSSE/SSE2が基本になることを考えると
今新規で書き下ろすなら誤差が出ても問題ないつくりにするべきだとは思う

906 :デフォルトの名無しさん:2010/02/26(金) 18:12:43
誤差がでても問題ない作りで作ることが、どれだけハイコストだかわかっててそう言ってるの?

通信対戦で自分の情報を送るとか、チートしてくださいと叫んでるようなもんだし
サーバーで一元処理するのは高負担

互換性が確保できればそれにこしたことない。

907 :デフォルトの名無しさん:2010/02/26(金) 18:13:31
x87用コンパイルで、全てSSE/SSE2を使うようにさせることってできないのかね?

908 :デフォルトの名無しさん:2010/02/26(金) 18:21:53
ハイコストだわな
全てのキャラの位置、向いている方向、色々なパラメータ、全ての弾の位置
通信で送りあったらたまったもんじゃないし、書き換えもあるだろうしきついね

909 :デフォルトの名無しさん:2010/02/26(金) 18:36:52
いやいや、そこの話じゃないでしょう

910 :デフォルトの名無しさん:2010/02/26(金) 18:43:59
だからこそ「今新規で書き下ろすなら」って付けたつもりだったし
浮動小数精度で誤差が出ても同じ結果が得られるような実装なら通信時も問題ないと思う

まあ限定された環境内で互換性が確保できればなんでもいいんだけど

911 :デフォルトの名無しさん:2010/02/26(金) 18:50:54
>>910
ちょっとスレの趣旨とは離れちゃうけど「浮動小数点で誤差が出ても同じ結果が得られる実装」なんてのが
手軽に実装できるなら、そもそも浮動小数点を(描画以外で)使わないだろって話かと。

912 :デフォルトの名無しさん:2010/02/26(金) 18:58:24
楽するために浮動小数点を使っている(固定小数点使うよりは楽だろ?)のに、互換保証機能とかに労力かけたら本末転倒かと

913 :デフォルトの名無しさん:2010/02/26(金) 19:09:11
それが問題になるなら過去にどこかで議論されてるだろうし、すでに解決されてる可能性が高い
議論された形跡がどこにも見つからないならそれは取るに足らない問題で
議論されていたにも関わらず解決されていない問題ならこんなところでグダグダしてる連中には手に余る問題ということだ

914 :デフォルトの名無しさん:2010/02/26(金) 19:22:28
いや、浮動小数点問題は昔から何度か話題にはあがってるよ
あと「こんなところでグダグダしてる連中」とか言うな
何度ここの「連中」に良くしてもらったことか・・・

915 :デフォルトの名無しさん:2010/02/26(金) 19:40:00
SSE2版powのバグのような気がする。↓で一致する。本来デフォルトは53ビットのはず。

pow
void foo()
{
double hoge = pow(1.1, 1.1);
double x;
int i;

for(i = 0; i < 10; ++i) {
_control87(_PC_64, _MCW_PC);
x = pow(hoge, 1.1);
_control87(_PC_53, _MCW_PC);
hoge += x;
}
printf("%.14f %016llx\n", hoge, *(long long*)&hoge);
}


916 :デフォルトの名無しさん:2010/02/26(金) 20:05:56
>>915
横レスだが、最初のpowはコンパイラがSSEを使うようになっていない限りx87だから80bitの拡張倍精度で64bitの精度がある。

MicrosoftのコンパイラはSSEを明示的に指示しなければ使わないし、
IntelのコンパイラはSSE/SSE2より前の世代を切り捨てたので
明示的に指示しない限りSSE/SSE2を使う。

917 :デフォルトの名無しさん:2010/02/26(金) 20:14:31
>>915
最適化してないからメモリへの書き出し時の丸めが起きてる

>>916
それは自分でコンパイルするコードの場合だろう
_set_SSE2_enableのページに挙げられてる関数は両実装なんだってば

918 :916:2010/02/26(金) 21:37:52
>>917
すまん、>>915だけ読んで反射付随レスした。
この流れは>>779からなのかな。それ以降はたったいま全部読んだ。
>>904への補足としてはこうだ。

x87世代と互換性をもたせる場合:
・演算にSSE/SSE2を用いるコンパイラではSSE/SSE2を使用しないようにしておく(Intel)
・_set_SSE2_enable(0)を実行しておく。

SSE2世代以降で互換性をもたせる場合:
・単一のexeで互換性が取れればいい場合は特にやるべきことはなし。

積極的にSSEシリーズを使用したい場合:
・コンパイラオプションの自動ベクトル化を利用する(Intel/gcc)
・intrin.h, fvec.h, dvec.h, ivec.hをincludeして、floatの代わりにF32vec4などを利用する。

919 :デフォルトの名無しさん:2010/02/26(金) 22:58:34
デフォルト引数って、void func (int n = GetDefaultNumber());
みたいに関数でもいいですか

920 :デフォルトの名無しさん:2010/02/26(金) 23:04:21
>>919 いいですよ。

921 :デフォルトの名無しさん:2010/02/26(金) 23:09:08
ありがとうございます。ずっと定数のみだと思い込んでました。

922 :デフォルトの名無しさん:2010/02/26(金) 23:56:23
>>919
関係ないが、その柔軟な発想がうらやましい。
http://codepad.org/CZPjKZS9

923 :デフォルトの名無しさん:2010/02/27(土) 00:29:12
おもしれーな
ttp://codepad.org/NYifDLmF

924 :デフォルトの名無しさん:2010/02/27(土) 01:07:46

ttp://codepad.org/Y9ftRqxS

関数ポインタにいれてデフォルト引数を適用したい場合はどうやるの?
無理なの?

925 :デフォルトの名無しさん:2010/02/27(土) 01:10:04
どこが柔軟なんだろうか

926 :デフォルトの名無しさん:2010/02/27(土) 01:38:48
>>924
デフォルト引数を暗黙に受け渡す方法がないので、明示的に渡さないといけないが、
それでよければこんな方法はどうか。
ttp://codepad.org/zMjARsjk

927 :デフォルトの名無しさん:2010/02/27(土) 01:43:30
bind使えよ

928 :デフォルトの名無しさん:2010/02/27(土) 01:50:24
迷走してきたな

929 :デフォルトの名無しさん:2010/02/27(土) 02:28:58
届かないメッセージ 不可視なラビリンス

930 :デフォルトの名無しさん:2010/02/27(土) 05:39:17
迷走bind

931 :デフォルトの名無しさん:2010/02/27(土) 17:26:42
C++の開発環境はみなさんどれを使ってるんでしょうか

932 :デフォルトの名無しさん:2010/02/27(土) 17:28:10
Bcc使ってた
今VC++

933 :デフォルトの名無しさん:2010/02/27(土) 17:31:02
おれもVC++というかVC++以外使ったことない。

934 :デフォルトの名無しさん:2010/02/27(土) 17:31:58
VC++だけで通ればいいやと思ってる

935 :デフォルトの名無しさん:2010/02/27(土) 17:46:04
VC++とg++

936 :デフォルトの名無しさん:2010/02/27(土) 17:48:47
bcc32 の日本語エラーを重宝していますが。

937 :デフォルトの名無しさん:2010/02/27(土) 17:53:48
cxx

938 :デフォルトの名無しさん:2010/02/27(土) 19:21:09
VC++, g++かな。
Comeau C++はいつか買いたい。
それ以外はなぁ。。。


939 :デフォルトの名無しさん:2010/02/27(土) 19:54:36
VC++2008EEでC++0xで遊びたいときはGCCかな

940 :デフォルトの名無しさん:2010/02/28(日) 08:32:27
低スペッコマシンで動くvc++6.0とg++は最高っすね。

941 :デフォルトの名無しさん:2010/02/28(日) 10:03:54
int n= (1>=0);
こうやった時にnが1になるのは実装依存ですか?

942 :デフォルトの名無しさん:2010/02/28(日) 10:33:05
>>941 いいえ、規格で定められた動作です。

943 :デフォルトの名無しさん:2010/02/28(日) 10:54:33
>>942 ありがとうございます

944 :デフォルトの名無しさん:2010/02/28(日) 12:11:45
「0以外になる」じゃなくて「1になる」って規格で決まってたのか

945 :デフォルトの名無しさん:2010/02/28(日) 12:16:27
今までC#をやっていてC++をはじめたんですが
C++のヘッダファイルとソースファイルに分けるのが面倒(というか慣れてない)ので
ヘッダファイルのクラス定義の中で(C#みたいに)実装もしちゃおうと思ってるんですが(慣れるまで)
注意すべき落とし穴とか教えてください

946 :デフォルトの名無しさん:2010/02/28(日) 12:17:39
>>945
書き忘れました
環境はMinGW+EclipseCDTです

947 :デフォルトの名無しさん:2010/02/28(日) 12:28:38
修正する度にコンパイル時間がかかる。

948 :デフォルトの名無しさん:2010/02/28(日) 12:33:12
クラスに直接実装すると、暗黙的にinlineが付く
そのため量が多いコードを書いて
それが多数の箇所で引用されるようなら
無駄にインライン展開された分のオーバーヘッドがかかる

949 :デフォルトの名無しさん:2010/02/28(日) 12:44:02
>>944
決まってるよ
>=演算子の結果は0か1

ISO/IEC 9899 Programming languages ― C
6.5.8 Relational operators
6 Each of the operators < (less than), > (greater than), <= (less than or equal to), and >=
(greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.90)
The result has type int.

950 :デフォルトの名無しさん:2010/02/28(日) 12:46:39
>>945
実装を分けて書くのになれると、C#は実装を別けられなくて不便だって思うようになるよ。


951 :デフォルトの名無しさん:2010/02/28(日) 12:51:20
>>950
それはないだろ…分けたけりゃinterface使えばいいだけ

952 :デフォルトの名無しさん:2010/02/28(日) 12:57:01
ttp://chadaustin.me/cppinterface.html
これ読むと脱力するなあ
クラスをインタフェース、ファクトリ、実装に分割する
インタフェースではPOD以外の型や例外を使えない
多分不便すぎるから、さらにstaticリンクやヘッダオンリーのラッパーも書くんだろう
手間かかりすぎだ

953 :デフォルトの名無しさん:2010/02/28(日) 12:59:57
>>947,948,950
レスありがとう
とりあえず(学習レベルでは)致命的な問題が生じることを意識せずに
書いても大丈夫そうですね

954 :デフォルトの名無しさん:2010/02/28(日) 14:01:22
>>952
virtualってバイナリ互換性ないんじゃなかったっけ?

955 :デフォルトの名無しさん:2010/02/28(日) 14:06:10
>>954
その文書では、Windows環境でかつ、COMが使える(つまりvtblのレイアウトに
関してはCOMとABI互換性がある)コンパイラに関することが書いてあるから、
完全な一般論ではないはず

956 :デフォルトの名無しさん:2010/02/28(日) 15:11:15
cで

void test(char str1[], char str2[])
{
strcat(str1, str2);
        
      //いろいろ 
return ;
}

int main()
{
char path[]="D:\"
char filename[]= "test";

  printf("%s", path); ←D:\と表示される
   test(path, filename);
  printf("%s", path); ←△D:\test と表示される

return 0;
}

△のとこは普通D:\と表示されるんではないんですか?
しかしD:\testと表示されてしまいます。

D:\にもどすにはどうすればいいんでしょうか。

957 :デフォルトの名無しさん:2010/02/28(日) 15:18:36
その前にリテラルにstrcatするな。

958 :デフォルトの名無しさん:2010/02/28(日) 15:18:40
>>956
「普通」とか言ってないで、どうしてそうなるのかよく考えてみろ。

まず "D:\" では最後のクォートがエスケープされてコンパイルエラーになるはずだ。
そこを直したとしても、そのコードでは strcat() の時点でバッファオーバーランを
起こしてしまっているはず。何が起こっても文句は言えない。

959 :デフォルトの名無しさん:2010/02/28(日) 15:19:22
>>957 リテラルじゃぁない。領域サイズに問題がある。

960 :956:2010/02/28(日) 15:37:16
ちょっとわかりにくかったんで
http://www.dotup.org/uploda/www.dotup.org692367.png

試しに
char path[40] とかでもだめでした

961 :デフォルトの名無しさん:2010/02/28(日) 15:40:41
test()のなかでstr1を変更してるからじゃないの?
str1とstr2を連結した新しい変数を使用してはいかがでしょうか?

962 :デフォルトの名無しさん:2010/02/28(日) 15:47:10
#include <stdio.h>
void test(char str1[], char str2[])
{
  strcat(str1, str2); // ここでpathを変更してるので元には戻せない。変更しなければ良い。
        //いろいろ  
  return ;
}
int main()
{
  char work[20];
  char path[20]="D:\\";
  char filename[20]= "test";
  puts(path); // D:\ と表示される
  strcpy(work, path);
  test(work, filename);
  puts(path); // D:\test と表示される
  return 0;
}
D:\My Documents\Cplus\初心者_956>cl mondai.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
mondai.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
/out:mondai.exe
mondai.obj
D:\My Documents\Cplus\初心者_956>mondai
D:\
D:\
D:\My Documents\Cplus\初心者_956>

963 :デフォルトの名無しさん:2010/02/28(日) 15:47:18
>>956
根本的に分かってないだろ。

>△のとこは普通D:\と表示されるんではないんですか?
されません。
文字列連結(strcat)してるんだから、path[]のケツにfilename[]がくっ付くに決まってる。
>しかしD:\testと表示されてしまいます。
それで正常です。バッファオーバーランしてるけどな。

ディレクトリ名とファイル名以外に、フルパス用の配列でも作ってろ。
よう分からんならstd::string使ってろ。

964 :デフォルトの名無しさん:2010/02/28(日) 15:48:07
>>961の言うとおり
strcatは最初の引数に与えたものも変更してしまう
ttp://www9.plala.or.jp/sgwr-t/lib/strcat.html

void test(char str2[]){
char temp[MAXPATH];
strcat(temp, str2);
        
      //いろいろ 
return ;
}
こんな風にしたら?

965 :デフォルトの名無しさん:2010/02/28(日) 15:49:27
ああ、微妙に変だけど細かいことは気にしない

966 :デフォルトの名無しさん:2010/02/28(日) 15:50:26
>>956
testの前後でprintf("%p", path);としてみればpath自体の値は変わってないことが確認できると思う
あとは文字列について勉強して、ポインタについて勉強すればおk

967 :デフォルトの名無しさん:2010/02/28(日) 15:56:51
>>957-959,961-966
できました!ありがとうございます

968 :デフォルトの名無しさん:2010/02/28(日) 16:08:49
 板違いかもしれないが、教えてください。
 Windows環境で関数の実行アドレスを取得したいのですよ

 void funcA(void);

main()
{
GetFuncAddress((void*)&func);
}

GetFuncAddress(void* pFunc)
{
//pFuncの中をダンプすると
//0xff,0x25,0x..(4Byteアドレス)
}
 となっており、0xff,0x25がJMP命令の絶対相対nearコール
になっているんだが、ここからなんとか、関数の実行アドレス
を割り出したいのです。
 知っていたら教えてください。


969 :デフォルトの名無しさん:2010/02/28(日) 16:36:33
>>968
なんでダンプしちゃうのw
pFunc で取れてるだろ。 printf("%p", pFunc) とか。

970 :デフォルトの名無しさん:2010/02/28(日) 16:42:25
968です
 pFuncで取れているのは、関数の実行アドレスではないです。
 このときのアドレスの中身は、関数の実体へのジャンプ命令なんです。
 で、ほしいのはセグメント上に展開されているはずの、この
ジャンプ命令の示しているジャンプする先のアドレスがほしいのです。


971 :デフォルトの名無しさん:2010/02/28(日) 16:46:15
>>970
よくわからんが、ジャンプ命令のジャンプ先が欲しいんならジャンプ命令の
仕様どおりに(CPUの動作をなぞって)アドレス計算するんじゃダメなの?

972 :デフォルトの名無しさん:2010/02/28(日) 16:57:08
 えと、JMP命令の後ろに記述されているやつが、
nearポインタのアドレスだと思うのだけど、
nearポインタだからセグメントの先頭アドレス
が必要なのですよ、で、C言語(Win32APIなどを使っても
良いので)が必要。

 知りたいのは、
 1.JMP命令の次の4バイトがnearポインタでよいのか?
  →この4バイトのアドレスが示している場所に、オフセット値が記述されている
   という解釈でよいのか?
 2.そのばあい、オフセットなのでセグメントの先頭アドレスをどうやって取ればよいのか?
という2点なのです


973 :デフォルトの名無しさん:2010/02/28(日) 16:58:39
セグメントなんて使ってねえから
フラットメモリモデルだから
そのまんま解釈すればいいから

974 :デフォルトの名無しさん:2010/02/28(日) 17:01:42
 そうですか、それではもう少し調べてみます。
 解釈が間違っていたようです。
 ありがとうございました。


975 :デフォルトの名無しさん:2010/02/28(日) 21:28:14
コンソールアプリケーションでMessageBoxって使えないんですか?
うまくいかないんですがもし使えるならどうやれば使えるでしょうか?

976 :デフォルトの名無しさん:2010/02/28(日) 21:36:30
使えてるぞ
// cl hello.cpp user32.lib
#include <windows.h>
int main() {
MessageBox(NULL,"aaaaaaa", "bbbbbb", 0);
}


977 :デフォルトの名無しさん:2010/02/28(日) 21:40:09
あ、できました
ありがとうございます

978 :デフォルトの名無しさん:2010/03/01(月) 11:06:21
とりあえず色々と試してみることさね

979 :デフォルトの名無しさん:2010/03/01(月) 11:25:25
>>972
Windowsのdllはstubを介してジャンプする事になっている。
セグメントの先頭アドレスは必要ない。jumpのオペランドは
そのジャンプ命令からの相対アドレス。

980 :デフォルトの名無しさん:2010/03/01(月) 15:41:46
↓これって安全でしょうか?

// dll
extern "C" void _cdecl func(const tr1::shared_ptr<hoge> &p); // c++のための公開関数

// def
EXPORTS
func

// main
pfunc = my::get_dll_function("func");

tr1::shared_ptr<hoge> p(new hoge, my::deleter);

pfunc(p);


dllはC++で使われることが前提ですが、mainをコンパイルするコンパイラは不定です

981 :デフォルトの名無しさん:2010/03/01(月) 15:55:05
今C++でフォームアプリケーションを作ってるのですが、ファイルからテキストを読み取ってラベルに表示したいのですが
while(fgets(data, 1000, fp) != 0){
strcat(temp,data);
}
String^ filetext = gcnew String(temp);
label1->Text = filetext;

とすると文字化けしてしまいます、どうすれば良いのでしょうか?

982 :デフォルトの名無しさん:2010/03/01(月) 16:28:02
ファイルの文字コードはなんなのとか
System::IO::File::ReadAllText使えとかいろいろあるけど
C++/CLIはこっちできこうね
http://pc12.2ch.net/test/read.cgi/tech/1206447234/

983 :デフォルトの名無しさん:2010/03/01(月) 16:32:48
文字コードを指定してStreamReaderを使う

984 :デフォルトの名無しさん:2010/03/01(月) 16:36:21
できたぽ
サンクスだぽ(`・ω・´)

985 :デフォルトの名無しさん:2010/03/01(月) 16:39:08
ちなみにフォームアプリケーションって
C#で作るのと
C++でフォームアプリケーションから作るのと
C++で空のプロジェクトから作るのと
軽さはどれくらい違いますか?

244 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)