トップページ⇒tech
985コメント304KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0002デフォルトの名無しさん2010/01/30(土) 00:01:59
 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!
0003デフォルトの名無しさん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
0004デフォルトの名無しさん2010/01/30(土) 14:30:36
volatileって関数の返却値に使っても有効なの?
規格ではどうなってるんだろ
0005デフォルトの名無しさん2010/01/30(土) 14:37:29
関数ポインタを使うときは、ちょっとでもわかりにくくなったら
必ずtypedefを使うようにするのが鉄則だと思う。
typedef void vfn_t(void);
#define REG_B (*(volatile vfn_t *) 0x11223344)
とか。
いや、これが正常に動くか、そもそも望みのものなのかも知らないけどね。
0006デフォルトの名無しさん2010/01/30(土) 18:40:07
>>5
typedef void (*vfn_t)(void) で正解だな。
0007デフォルトの名無しさん2010/01/30(土) 21:15:46
>>3
>>今はあきらめて*( volatile unsigned int *)としてプログラム中で
>>キャストしているんだけど

それでいいんじゃない?別に気持ち悪くない
0008デフォルトの名無しさん2010/01/30(土) 22:16:06
>>4-7
ありがとう、提案された方法を試したあとに結果を報告する。

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

>>7
折角だしプログラムの中でいちいちキャストしたくないんだよ。キャストって、
この場合は正しく宣言していれば不要だし、間違った型の代入を防ぐことも
できる。
0009デフォルトの名無しさん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

本当にありがとう。
0010デフォルトの名無しさん2010/01/30(土) 23:46:26
敢えて一行で書くならこうかな?
#define REG_B (*(void(*volatile*)()) 0XFFFF1234)
0011デフォルトの名無しさん2010/01/31(日) 01:04:51
>>9
#define の値は括弧で囲っといたほうがいいよ。
それから引数無しの引数リストに void を入れるかどうかはそろえといたほうがいいよ。
C なら必須。
0012デフォルトの名無しさん2010/01/31(日) 09:19:40
任意のクラスのオブジェクトの情報をまるごとバイナリファイルに保存・復元みたいなことはできるんだろうか?
0013デフォルトの名無しさん2010/01/31(日) 09:40:27
>>9
代入がアトミックになってないぞ
mutexか何かでバリアしておいた方が良くないか?
0014デフォルトの名無しさん2010/01/31(日) 09:56:49
>>12
シリアライズで出来るんじゃない?
自分はやったことないけどね
0015デフォルトの名無しさん2010/01/31(日) 10:32:39
>>12
boost::serializationかな
0016デフォルトの名無しさん2010/01/31(日) 11:24:01
>>12
もうまさにboost::serializationだな。
0017デフォルトの名無しさん2010/01/31(日) 17:21:13
>>12
保存中の進捗表示はboost::progress_displayにお任せ!
0018デフォルトの名無しさん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
0019デフォルトの名無しさん2010/01/31(日) 18:26:32
WindowsでフリーでVC++ライクの総合環境ってなんか無い?
0020デフォルトの名無しさん2010/01/31(日) 18:42:37
>>19 VC++ EE
0021デフォルトの名無しさん2010/01/31(日) 23:02:34
void (*handle) ();


int address = 0x00000;

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


このコードがよくわかりません。
関数ポインタを宣言していることはわかるんですが、3行目のキャストが何を意味しているかが不明です。教えてください
0022デフォルトの名無しさん2010/01/31(日) 23:05:05
代入先を考えろ
0023デフォルトの名無しさん2010/01/31(日) 23:21:49
>>21
関数へのポインタにキャストしているだけです。
void (*x)(); という宣言が理解できるのであれば、それから識別子をとりのぞくと、そのままキャストに使う書き方になるだけです。
0024デフォルトの名無しさん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の各関数を入れたいんだ。
0025デフォルトの名無しさん2010/01/31(日) 23:48:12
>>21
単に警告でないように強制型合わせしているだけ
違うものを強制挿入する時よくやる

0026デフォルトの名無しさん2010/01/31(日) 23:56:43
>>24
static な関数だと ObjectManeger::* じゃなくてただの * でいいよ。
っていうかコンパイルしてみればいいじゃない。
0027デフォルトの名無しさん2010/02/01(月) 00:02:47
>>26
外部シンボルは未解決だ、って怒られるんだ。
あと、ABCDの各関数を初期化時に入れるのはどうやってやるのか・・・。
色々試したんだけど、コンパイルでエラーの嵐で分からないんだぜ・・・。
0028デフォルトの名無しさん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
};
0029デフォルトの名無しさん2010/02/01(月) 00:08:26
関ポはtypedef
これ、常識ね
0030デフォルトの名無しさん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 }
};
ミスった
0031デフォルトの名無しさん2010/02/01(月) 00:18:05
>>30
通った! ありがとう!
そう書けばよかったのか・・・。

>>29
可読性的な意味で、なのかな。
確かに見づらい・・・。
0032デフォルトの名無しさん2010/02/01(月) 00:56:26
>>14-16
virtual 使ってるクラスでもできる?
0033デフォルトの名無しさん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,
 ...
};
て感じか。
メンバ関数ポインタじゃないから、そんなに複雑な見た目にはならないかな。
0034デフォルトの名無しさん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;
でも通るんだ
はじめて知ったよ
これって標準?
0035デフォルトの名無しさん2010/02/01(月) 09:09:07
>>34 うん。
0036デフォルトの名無しさん2010/02/01(月) 21:48:30
javaだとIDEの補完機能を使うとimport *を勝手に書いてくれるけど、
C++のIDEはそんな機能がないのかな?

いちいち、#inluce <*>って書くのが面倒くさい
それとも、Qt Creatorは新しいから無いのかな?
0037デフォルトの名無しさん2010/02/01(月) 22:10:21
だから無理してC/C++なんかやらなくていいよ
ずっとJavaで良いじゃん
0038デフォルトの名無しさん2010/02/01(月) 22:10:24
>>36

C++はないよ

C# ならある
0039デフォルトの名無しさん2010/02/01(月) 22:17:59
>>38
わかったよ、ありがとう
0040デフォルトの名無しさん2010/02/02(火) 10:59:32
C++では普通の関数は使わないのですか?
普通の関数の代わりに、staticのメンバ関数を使うのが常識なのですか?
0041デフォルトの名無しさん2010/02/02(火) 11:08:43
>>40
べつにクラスを使わないんだったらバシバシ普通の関数も使うよ

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

実装をcppファイルに記述するには明示的実体化するしかないのでしょうか?
.hファイルに実装を記述するととても見苦しい状態になってしまうのですがどうにかならないでしょうか
0044デフォルトの名無しさん2010/02/02(火) 16:30:30
コンパイラによります
0045デフォルトの名無しさん2010/02/02(火) 16:32:45
使用環境はVS2005standard editionです
0046デフォルトの名無しさん2010/02/02(火) 18:38:51
>>43
仕方がありません
Comeau C++を買いましょう
0047402010/02/02(火) 19:25:32
>>41-42
ありがとうございます

static関数はクラスに属していますが、それ以外は普通の関数と同じなのですか?
0048デフォルトの名無しさん2010/02/02(火) 20:33:42
クラスの名前空間に属して、そのクラスのprivate/protectedメンバを触れること以外は同じと見て差し支えない
細かい違いはあるけど
0049デフォルトの名無しさん2010/02/02(火) 20:36:50
>>43
いいんじゃね
boostの.hppってっ拡張子は
実装も含んでるヘッダだよ、っていうような意味なんじゃないかね
0050デフォルトの名無しさん2010/02/02(火) 20:39:53
>>48
thx
0051デフォルトの名無しさん2010/02/02(火) 21:45:20
>>49
Boost FAQには以下のようにあるけど。

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

>ファイルの拡張子は、人間とコンピュータプログラムの両方にそのファイルの "型" を伝えるものである。
>'.h' という拡張子は C のヘッダファイルで用いられており、 C++ のヘッダファイルに関して間違ったことを伝えてしまう。
>拡張子無しのものを用いると何も伝わらず、型を断定するためにファイルの中身を調べることを強制する。
>'.hpp' を使うことで、そのファイルが C++ のヘッダファイルであることを明確に特定することができ、 また実際に使う際にもきちんと動作する。 (Rainer Deyke)
0052デフォルトの名無しさん2010/02/02(火) 22:00:10
>>51
つまりC++は静的型付け言語だから、
同じように型の発想をしよう、ということか。

・・・それって守らなきゃダメなん?
Boost以外でも守られるのが標準的なC++の文化なの?
0053デフォルトの名無しさん2010/02/02(火) 22:24:15
拡張子なんてただの飾りだから何でもいいよ
.fuckとか.javaとか.exeとか付けるのも自由だ
0054デフォルトの名無しさん2010/02/02(火) 22:30:12
>>53
まあ自由だけど、それをまねした
小学生がぶん殴られたら可哀想じゃないか!
0055デフォルトの名無しさん2010/02/02(火) 22:32:54
The Loki Library
を見てみたら、ふつーに.hだったわ。
0056デフォルトの名無しさん2010/02/02(火) 22:34:27
.exe とか .lnk とか拡張子によってはシステムべったりだから飾りじゃすまないな
0057デフォルトの名無しさん2010/02/02(火) 22:50:13
ゲームのパラメータをファイルに置いておきたいんですが
c++から使えて暗号化もできるシンプルなデータベースってありますか?
0058デフォルトの名無しさん2010/02/02(火) 22:53:42
Linuxにてgprofでプロファイルを見てみたのですが、全関数の処理の合計時間が実測した時間よりも短くなっていました。
この差分は何に起因するものなのでしょうか?
0059デフォルトの名無しさん2010/02/02(火) 22:57:07
>>58
cputime と usertime の差?
0060デフォルトの名無しさん2010/02/02(火) 23:12:30
>>57
http://www.moongift.jp/2010/01/sqlcipher/
これとかどうだろう
0061デフォルトの名無しさん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;
}
0062デフォルトの名無しさん2010/02/03(水) 06:37:25
警告残した方が後々の為に良い気も
0063デフォルトの名無しさん2010/02/03(水) 06:39:24
>>61
基本的にstrict aliasing ruleに対する違反は
キャストでは解決できないと思った方がいい

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

けど、そのコードはダーティすぎるからそこから直した方がいい
0064デフォルトの名無しさん2010/02/03(水) 09:35:07
namespaceとはどういうときに使用するのですか?
0065デフォルトの名無しさん2010/02/03(水) 09:42:43
>>64 名前衝突の可能性を最小限にしながら、面倒なプリフィックス付けもしたくないとき。
0066デフォルトの名無しさん2010/02/03(水) 10:13:04
めんどうっていうけど
std_hogeもstd::hogeも変わらねーよ
0067デフォルトの名無しさん2010/02/03(水) 10:24:18
じゃあインテリセンスで一覧表示させたい場合
0068デフォルトの名無しさん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);
}
}
0069デフォルトの名無しさん2010/02/03(水) 10:43:42
DQN的プログラミングにnamespaceは不要
0070デフォルトの名無しさん2010/02/03(水) 11:32:37
DLLとかでエクスポートするときに邪魔なんだよ名前空間
いちいちラップしないといけない
0071デフォルトの名無しさん2010/02/03(水) 11:42:06
クラス内の複数箇所でstd::out_of_range("適当なエラーメッセージ")
このまま文字列リテラルがコード各所に散らばるのは気持ち悪いので

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

どれがスマートな方法でしょうか?
0072デフォルトの名無しさん2010/02/03(水) 11:54:58
俺はマクロかなぁ
const文字列にしてもいいけどマクロのが楽じゃわい
0073デフォルトの名無しさん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("〜");
}
0074デフォルトの名無しさん2010/02/03(水) 12:14:27
>>73
それじゃどこからエラー出たか特定できないじゃん
0075デフォルトの名無しさん2010/02/03(水) 12:18:23
どのみち例外に行番号情報は含まれないから、元から特定できないと思うけど
0076デフォルトの名無しさん2010/02/03(水) 12:28:21
__FILE__と__LINE__をパラメータで渡せばいい
0077デフォルトの名無しさん2010/02/03(水) 14:24:53
別に何も対策はしないな
それで問題が出るわけじゃないし
0078デフォルトの名無しさん2010/02/03(水) 15:43:49
C++ で継承不可能なクラスを宣言することはできますか?
C# や Java の static class みたいに。
0079デフォルトの名無しさん2010/02/03(水) 15:49:27
残念なことにできません
(C#やJavaのsealedやfinalのことだよね?)
仮想関数にあたるものにvirtualを付けないことで
これ以上継承しないでね、という意思表示にすることぐらいしか
現状できないと思う
ただ、次期C++だとたぶんあるんじゃないかな
0080デフォルトの名無しさん2010/02/03(水) 15:52:22
例外をマクロ化するのは良いアイデアだなとおもったけど
標準例外のコンストラクタに__LINE__と__FILE__を渡す方法を思いつかなくてガッカリ・・・

どういうマクロにすれば良いでしょうか?
0081デフォルトの名無しさん2010/02/03(水) 16:00:32
class out_of_range_with_line_number : public std::out_of_range {
...........
};
0082デフォルトの名無しさん2010/02/03(水) 16:13:05
行番号とかよりも
どの関数から/どのデータが原因で投げられたのか、といった情報を入れたほうがいいんでないかい
out_of_rangeなら、どの配列からout_of_rangeが出たのかによって
それが分かるような例外クラスを作ってrethrowするとか
0083デフォルトの名無しさん2010/02/03(水) 16:37:42
つ boost::exception
0084デフォルトの名無しさん2010/02/03(水) 17:48:55
>>81>>83
やっぱり継承するなりなんなりするしかないか
0085デフォルトの名無しさん2010/02/03(水) 18:37:02
>>78
デストラクタを private にしてみるとか。

class Hoge {
private:
 ~Hoge() {}
};
0086デフォルトの名無しさん2010/02/03(水) 18:50:11
まともに使えねえよ
0087デフォルトの名無しさん2010/02/03(水) 19:06:09
C++0xの[[final]]も継承禁止じゃないしな
0088デフォルトの名無しさん2010/02/03(水) 19:08:30
iface *create(...) { class local : public iface { ... }; return new local(...); }

制限はあるけどこれでfinalだよ
0089デフォルトの名無しさん2010/02/03(水) 20:52:17
教えて下さい。

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

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

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

環境
WindowsXP
Microsoft VisualC++ 6.0 MFC
0090デフォルトの名無しさん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)))
0091デフォルトの名無しさん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.
くらいしか見つけられんかった。
0092デフォルトの名無しさん2010/02/04(木) 05:32:31
>>91
どうしてそんな碌でも無いコードばかり書くんだ…

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

無印の-Wstrict-aliasingで警告がでないのが正しいかはわからん
そこらへんの加減はgccの中の人にしかわからんだろうから…
0093デフォルトの名無しさん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;
}
0094デフォルトの名無しさん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;
}
0095デフォルトの名無しさん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;
}

上記のコードは自分のマシンだと期待通りに動いてるようなんですが
ほかのマシンに移植しても大丈夫でしょうか?
0096デフォルトの名無しさん2010/02/04(木) 09:44:54
intの奇数番地アクセスに問題ないCPUだったら、大丈夫かも
0097デフォルトの名無しさん2010/02/04(木) 10:01:24
>>96
レスありがとうございます
念のためpack(push, 4)にしてみます
0098デフォルトの名無しさん2010/02/04(木) 10:07:15
移植性考えるなら
stdint.hを読み込んで
int
を
int32_t
とかに
0099デフォルトの名無しさん2010/02/04(木) 12:44:50
>>98
レスありがとうございます
バイト数も揃えてみます
vc++にstdintが無いのが困りものですがvs2010にはあるようなので・・・
0100デフォルトの名無しさん2010/02/04(木) 13:21:04
>>92
>どうしてそんな碌でも無いコードばかり書くんだ… 
ごめんw
実は>>91は、社内製コードでLoadFileAsync(const char* filename, void** buffer)っていうのがあるんだけど、
これがgcc4.1.1にしたら警告が出たので、調査用に書いたんだわ。
動作は、filenameを非同期にディスクから読み出して、読み出したメモリ領域のアドレスをbufferに返す。
非同期ロード用クラスでも作って、void**を置き換えればいいんだろうが、
既にあちこちで呼ばれてる関数だから手を出しづらいんだよね。
0101デフォルトの名無しさん2010/02/04(木) 16:21:27
>>99
ttp://www.kijineko.co.jp/node/63
こういうのがあるよ
0102デフォルトの名無しさん2010/02/04(木) 23:42:27
>>100
それでもその強引なキャストは要らんのでは?

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

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

また、QWidgetは#includeもclassも書かれていませんが
なぜ、使う事ができるのでしょうか?
http://calmlight.s2.zmx.jp/Qt4Examples/SimpleMenu.html
0104デフォルトの名無しさん2010/02/05(金) 01:34:59
「#includeの替わりに,classが使われている」わけじゃない
前方宣言でググれ
というかC/C++の#includeはJavaのimport、C#のusingとは違うぞ
0105デフォルトの名無しさん2010/02/05(金) 06:58:32
>>103
もうC言語やC++のプリプロセッサっていう勉強をした方がいいんじゃないか?
0106デフォルトの名無しさん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で操作できない
 };
};
0107デフォルトの名無しさん2010/02/05(金) 09:30:31
>>106
別のクラス class C : public A (略)などが、 B とは違う都合でそいつを使っている
かもしれないから。

めんどくさいから protected なんて最初から使わなけりゃいいんだよ。
private or public でいけないのか、よく考えたほうがいい。
0108デフォルトの名無しさん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のデータにアクセスできたらおかしいでしょ
0109デフォルトの名無しさん2010/02/05(金) 10:04:23
だったら外からアクセスしてるのに同じクラスのprivateにアクセス出来るのはおかしいはず
0110デフォルトの名無しさん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 にアクセスできない理由の説明にならないね。
0111デフォルトの名無しさん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にしてこの種の最適化を無効にするしかない
0112デフォルトの名無しさん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" ってなってる。
01131122010/02/05(金) 10:28:46
ん?ごめん、読み違えた。

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

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

ReadFileはwindows依存していることは知ってます、ifstreamの内部ではReadFileを使っている(?)とかどってでみた気がする
速度を比較してみたらifstreamの方がはやかったです
0115デフォルトの名無しさん2010/02/05(金) 16:02:59
1バイトずつReadFileを呼び出したりしていないか?
ifstream等は内部にバッファを持って一度の呼び出しで多くのデータを読み込むようにしてAPIの呼び出し回数を抑えているはず
01161142010/02/05(金) 16:10:02
ReadFile引数のブッファ指定のところでファイルサイズ渡しているので1バイトずつではないはず
0117デフォルトの名無しさん2010/02/05(金) 16:45:56
普通のファイルを普通に読むとOSは勝手にディスクキャッシュするよ
0118デフォルトの名無しさん2010/02/05(金) 17:24:52
それだとReadFileが遅い理由にならんのでは
0119デフォルトの名無しさん2010/02/05(金) 17:28:37
いきなりファイル全体キャッシュするわけじゃないから
0120デフォルトの名無しさん2010/02/05(金) 18:04:54
ディスクアクセスのコストはOSのディスクキャッシュで隠蔽できても
システムコール(カーネルとのモード遷移)のコストは隠蔽できません。
ReadFileを何度も何度も呼び出している限り。
0121デフォルトの名無しさん2010/02/05(金) 19:48:25
ifstreamが速い理由にならんぞ
0122デフォルトの名無しさん2010/02/05(金) 20:15:36
ナニ言ってんだオマエは
0123デフォルトの名無しさん2010/02/05(金) 20:16:50
ちなみに
stdioと比較してifstreamは全然速くない。
0124デフォルトの名無しさん2010/02/05(金) 20:23:02
比較しちゃだめだろ

iostreamの良い所は別にあるんだから。
何かというとそれは次の人どうぞ
↓↓↓
0125デフォルトの名無しさん2010/02/05(金) 20:39:29
継承によって作られている所です

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

とでも言って欲しいのか?
0126デフォルトの名無しさん2010/02/05(金) 21:52:34
>>114 どんなコードで比較したのかわかるようにコードを晒さないと答えられないな。
0127デフォルトの名無しさん2010/02/05(金) 22:16:09
>>114
ReadFileの使い方を間違ってるんじゃないか?
ifstreamを書いた人はReadFileの使い方をよく知ってるんだと思うよ。
0128デフォルトの名無しさん2010/02/05(金) 23:44:41
メッセーッジについて教えてくれ
WM_NOTIFYとON_NOTIFY_REFLECTの関係がわからない

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

わかりやすくおしえてね
0129デフォルトの名無しさん2010/02/05(金) 23:49:40
>>128
は?
頭おかしいの?
0130デフォルトの名無しさん2010/02/05(金) 23:50:12
>>128
Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0131デフォルトの名無しさん2010/02/05(金) 23:52:04
どっちかというとMFCのほうだな
0132デフォルトの名無しさん2010/02/06(土) 02:27:22
PaintDCの描画領域のクリア方法教えて
0133デフォルトの名無しさん2010/02/06(土) 10:22:50
InvalidateRectもしくはValidateRectのことか
それともFillRectのことだろうか
0134デフォルトの名無しさん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 を初期化したいんだけど,どのようにすればいいでしょうか?
0135デフォルトの名無しさん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);
0136デフォルトの名無しさん2010/02/06(土) 13:41:57
template < int Foo >
const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0);
01371342010/02/06(土) 13:51:57

>>135-136
ありがとうございます.初期化出来ました.
0138デフォルトの名無しさん2010/02/06(土) 17:31:35
前方宣言をすると普通に#includeするよりも、コンパイルが速くなりますか?
0139デフォルトの名無しさん2010/02/06(土) 17:33:57
前方宣言はコンパイル依存性を減らしたりするために
あると思うんだけど
0140デフォルトの名無しさん2010/02/06(土) 17:39:20
>>138
コンパイルが速くなるっていうよりも、コンパイルしなおさなければいけなくなるファイルが
減るっていうのが正しいかと。
0141デフォルトの名無しさん2010/02/06(土) 18:05:26
前方宣言が必要なパターン

class B;

class A {
B b;
};

class B {
A *a;
};

あとはpimplイディオムで少し似た使い方したり。
01421382010/02/06(土) 18:06:41
>>140
やっぱり、そうだよね
thx
0143デフォルトの名無しさん2010/02/06(土) 22:06:12
newとmallocは似たような動作をしますが、
バックグラウンドではnewがmallocを呼び出しているのですか?
0144デフォルトの名無しさん2010/02/06(土) 22:09:27
>>143
そういう実装も多いけども、そうとは限らない。
それが問題になるようなプログラムを書くべきではないし、書く必要も無い。
0145デフォルトの名無しさん2010/02/06(土) 22:48:57
WinAPIを使わずにマウスをプログラム側から操作するにはどうしたらよいでしょうか?
0146デフォルトの名無しさん2010/02/06(土) 22:50:12
そういうライブラリを探す。
0147デフォルトの名無しさん2010/02/06(土) 22:57:22
>>145
それは不可能だろう。

ラッパライブラリがあれば可能だろうが、
そのラッパもやはりWinAPIは使っているだろうな。
0148デフォルトの名無しさん2010/02/06(土) 23:43:39
VS2005、C/C++でコントローラ(Joystick)の状態を取得するにはどうすれば良いのでしょうか?
調べても中々出てこないみたいなので。助けてください。
プロジェクト設定はWin32コンソールアプリケーションです。
ひどいくらい初心者ですが、よろしくお願いします。
0149デフォルトの名無しさん2010/02/06(土) 23:53:46
GetJoystickState
0150デフォルトの名無しさん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
0151デフォルトの名無しさん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();
}
ソースはこんな感じになっています。キーボード入力時のみの再描画ではなく、常に?描画するにはどうすればよいのですか?
初心者ですみません。書き込んでいて何を言ってるのかわからなくなってきました。
0152デフォルトの名無しさん2010/02/07(日) 00:45:10
OpenGLスレで聞いてみれば?
0153デフォルトの名無しさん2010/02/07(日) 00:50:10
はい、そうしてみます。ありがとうございました。
0154デフォルトの名無しさん2010/02/07(日) 02:47:37
void *型から何かの型へのポインタへキャストする時にそれが有効か調べるいい方法はあります?
今のところハッシュにアドレスとtype_infoのペア保存しておくという微妙な方法しか思いつきません
0155デフォルトの名無しさん2010/02/07(日) 07:03:04
>154
dynamic_cast かな。
でもどっちかっていうと型判別しなきゃいけないこと自体がどっかおかしいような気がする。
0156デフォルトの名無しさん2010/02/07(日) 07:19:04
void * にdynamic_castは無理
0157デフォルトの名無しさん2010/02/07(日) 08:14:09
C++にはリフレクションがないから無理だろ
0158デフォルトの名無しさん2010/02/07(日) 10:01:05
>>154
shared_ptr があるよ
0159デフォルトの名無しさん2010/02/07(日) 11:15:33
struct hoge {
int bar1;
char *buf;
int bar2;
};

こんな構造体のbufに文字列入れるなりmallocするなりするとメモリ的にはどうなるの?
bar2がその分後ろにずれたりするの?
0160デフォルトの名無しさん2010/02/07(日) 11:22:14
template<size_t T_size>struct hoge {
int bar1;
char buf[T_size];
int bar2;
};
0161デフォルトの名無しさん2010/02/07(日) 11:22:50
>>155
void*なんか使わないほうがいいと言えばそのとおりなんですが
スクリプトと拡張型のポインタをやり取りするのに一回void*に変換されて型情報がなくなってしまうのです
スクリプト側で変なことしなければ問題はないんですが、間違えるとエラーも出せずに落ちてしまうのでどうにかできないかな、と

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

>>158
すいません
詳しくお願いできますか?
0162デフォルトの名無しさん2010/02/07(日) 11:45:30
void*のポインタ先をデータの生ポインタではなく、

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

のポインタとかにはできないの?
0163デフォルトの名無しさん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);で変換。型が違えば例外が投げられる。
0164デフォルトの名無しさん2010/02/07(日) 11:56:54
>>159
ずれない
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ---> NULL
                 |------|
0x11111108 | bar2   |
                +------+
↑こんな感じのが ↓こんな感じになるだけ
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ----+
                 |------|        |
0x11111108 | bar2   |        |
                +------+        |
                 +------+       |
0x22222200 | 文字列 |  <--+
                 +------+
0165デフォルトの名無しさん2010/02/07(日) 12:13:53
>>163
shared_ptrのその使い方はshared_ptrの本来の使い方の一部にしかすぎない。
shared_ptrの本来の使い方を知った上で使うべき。
0166デフォルトの名無しさん2010/02/07(日) 12:13:58
>>162
残念ながら、ptr_holder*をvoid*にして渡すという形になりますので
結局のところvoid*がptr_holder*に戻せるかという、ほぼ同じ問題に戻ってしまいます

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


でも同一プロジェクト内でならshared_ptrに統一することは可能なので試してみたいと思います
みなさんレスありがとうございました
0167デフォルトの名無しさん2010/02/07(日) 12:39:16
>void*がptr_holder*に戻せるか

そこは当然ptr_holderしか使わないという縛りが必要になる
0168デフォルトの名無しさん2010/02/07(日) 12:50:54
void*やshared_ptr<void>ではなく、boost::any(あるいはany*やshared_ptr<any>)にしたらいい。
0169デフォルトの名無しさん2010/02/07(日) 15:23:09
LinuxでC++勉強したいんだけど
ライブラリって何が標準なの?
0170デフォルトの名無しさん2010/02/07(日) 15:25:02
gccとかのこと?
0171デフォルトの名無しさん2010/02/07(日) 15:25:38
>>169
まずは C 標準ライブラリと C++ 標準ライブラリだな。
0172デフォルトの名無しさん2010/02/07(日) 15:29:38
>>171
boostというのが標準ですか?それともSTLというのですか?
0173デフォルトの名無しさん2010/02/07(日) 15:35:08
>>172
boost は標準ではないが、将来の標準に含まれるものを含んでいる。
STL は昔の名前で、今は C++ 標準ライブラリに含まれている。
0174デフォルトの名無しさん2010/02/07(日) 15:38:54
>>172
boostは標準ライブラリではない。
だが信頼性・移植性のある外部ライブラリだと思う。
あとboostのすごいところは最先端をめっちゃ追求しているところかな。

0175デフォルトの名無しさん2010/02/07(日) 15:45:36
boostは盛りだくさんだから、ひとくくりで全部OKとかダメだとは言いにくいな。
0176progress_display2010/02/07(日) 15:49:25
>>175
私のことお呼び?
0177デフォルトの名無しさん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に依存するといいうことでしょうか?
0178デフォルトの名無しさん2010/02/07(日) 16:47:07
fがFooのポインタなら1だし、Fooのインスタンスなら2
ツールキットとかそういう問題じゃない
そもそもpublic void setXXXは通常なら構文エラー
01791772010/02/07(日) 16:51:15
>>178
1はFoo* f = new Foo();
2はFoo f;
で宣言しています

>そもそもpublic void setXXXは通常なら構文エラー
何故?
0180デフォルトの名無しさん2010/02/07(日) 16:58:25
そのGUIオブジェクトがローカルスコープ限りで削除されるような場合は別に2でも問題ないと思うけれど
デバイスコンテキストとかはそういう使い方をしそうだがウィンドウとかはあまりそういう使い方をしないだろう
0181デフォルトの名無しさん2010/02/07(日) 17:06:54
>>179
エラーってのは、publicの後ろにコロンが付いてないだけのことだと思う。
0182デフォルトの名無しさん2010/02/07(日) 17:06:54
>>177
> GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが

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

可能性が高いとかグダグダ言ってないで、関数の仕様を確認すればいいのに。
0183デフォルトの名無しさん2010/02/07(日) 17:15:50
スタックやヒープといったメモリ領域はご存じ?
01841772010/02/07(日) 17:56:51
>>180
それもそうですね

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

>>183
yes
0185デフォルトの名無しさん2010/02/07(日) 18:14:18
177がなんでそんな疑問を持ったかのほうが気になる
そもそも実引数fの型がFOOへのポインタだとしたら
上の1と2は全く同じ意味だというのは分かってる?
0186デフォルトの名無しさん2010/02/07(日) 18:17:44
185は忘れてくれ
0187デフォルトの名無しさん2010/02/07(日) 18:21:54
>>185
ドンマイ。たまにうっかりしちゃうよな。
0188デフォルトの名無しさん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のアドレスを渡している

これでどっちも同じになるんだが。
0189デフォルトの名無しさん2010/02/07(日) 18:47:44
>>188いや、たぶんそれ自体は理解してるんじゃないかな
GUIアプリで、長期間あるオブジェクトを使うような場合に、
ヒープにとるべきか(1)スタックにとるべきか(2)という質問なんじゃないの
0190デフォルトの名無しさん2010/02/07(日) 18:54:41
じゃあ、インスタンスの寿命を気にしてるってことか。
そんなのJavaもC++も一緒じゃないの?
スコープを抜けたらデストラクタが実行されるでしょうよ。
01911902010/02/07(日) 18:56:52
ごめん違った。Javaはfinalizeがいつ実行されるのか分からんのね。
01921772010/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)なので「他の変数も削除されなくなる可能性」があるんじゃないかな〜と

わかりずらくて、スマソ
0193デフォルトの名無しさん2010/02/07(日) 19:18:21
1のやり方で自動的に削除されるよ
f自体は削除されるが
fのメンバにポインタがあった場合
そのポインタがさしてる先が削除されるかは
ちゃんとそういう処理を書いたかってことによる
0194デフォルトの名無しさん2010/02/07(日) 19:20:45
いや、スタックってLIFO: Last In First OutまたはFILO: First In Last Outだから。
スタックに確保したインスタンスは、スコープを外れれば自動的に削除されます。
つまりスコープを外れない限りは自動的に削除されることは無い。
削除されないならそのシステムが腐ってる。
LIFOをイメージ出来れば今回の疑問は解決するはず。
01951772010/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("テスト");とした方がいいんですね?
最後にこの質問だけ教えてください
0196デフォルトの名無しさん2010/02/07(日) 19:38:41
「1の方法で自動的に削除されなかった場合」ってどういう状況でそうなると思った?
システム的には、>>194の通り、スコープを外れたら自動的にデストラクタが呼ばれる。
>>193の言うようにそのデストラクタ内の処理で必要なものを解放していなければメモリリークになる。

Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。
無効なアドレスに対してアクセスが発生して、運が良ければ落ちるし、最悪の場合は黙って動き続けることに…
0197デフォルトの名無しさん2010/02/07(日) 19:39:48
>>195
string*はやめてconst string&で受け取った方がいい
MainWindowにWindowTitleのメンバを用意して、
コピーコンストラクタでコピーするべき
0198デフォルトの名無しさん2010/02/07(日) 19:41:20
コピーコンストラクタは間違いだった。
01991772010/02/07(日) 19:56:45
>>196
>Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
>もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。

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

>>197
>string*はやめてconst string&で受け取った方がいい
うーん、それは危なくないですか?
>init()の方が最初に終わるかもしれないという条件の場合
という条件があるので
02001962010/02/07(日) 19:56:46
更新してなかった
>>195の条件ならどっちもダメ
newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある

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

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

>mainWindowが終了した段階で、MainWindowがstring sをdeleteする
こういう条件があるので↓は気にしなくていいのでは?
>newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある
02021962010/02/07(日) 20:15:39
>>201すまん、見落としてましたw
じゃあnew以外ないね(逆に、スタックに確保したインスタンスをdeleteするのは駄目)。
ただ、関数レベルでそんな実装するのはC++的じゃないので、普通ないとは思うけど。
0203デフォルトの名無しさん2010/02/07(日) 20:26:02
C++を習得する場合、
Java→C++よりC→C++の流れの方がやっぱりまともだな
0204デフォルトの名無しさん2010/02/07(日) 20:28:11
なぜわざわざ荒れそうな方向へ持っていく
0205デフォルトの名無しさん2010/02/07(日) 20:30:31
>>204
そういう荒れそうな発言は、メッ!ですよ
02061772010/02/07(日) 20:32:25
>>202
いろいろと、ありがとうございました
0207デフォルトの名無しさん2010/02/07(日) 20:33:14
>>203
Cはクラスがないじゃん
だから面倒くさい
0208デフォルトの名無しさん2010/02/07(日) 20:34:52
これがゆとりか…
0209デフォルトの名無しさん2010/02/07(日) 21:09:47
2ちゃんねるブラウザで一番難しい所は、スレを表示する機能だと思うんだよね
しかし、既存の専ブラはそれをどうやって解決しているのか?って所が問題
02102092010/02/07(日) 21:13:17
ごめん、誤爆した
0211デフォルトの名無しさん2010/02/07(日) 21:36:08
C++を学ぶのにCを学ぶ必要はないよ
Cの古くて危険なやり方はやらない方がいい
0212デフォルトの名無しさん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/
0213デフォルトの名無しさん2010/02/07(日) 21:51:40
>>211
その古くて危険なもので、今現在もどれほど多くのものが作られているか。

バカには使いこなせない、って点では確かにC++以上だとは思うけどな。
0214デフォルトの名無しさん2010/02/07(日) 21:56:39
C++はポインタ操作をクラス内に隠蔽できるメリットを理解して使ってる人はどれくらいの割合いるんだろうか。
Cを知らずにSTLをいきなり使ったほうが幸せになれるのではないかと思う今日この頃。
0215デフォルトの名無しさん2010/02/07(日) 22:00:19
>>213
CはCで今でもあちこちで使われているのは俺も同意だけど、それとこれとは別。
0216デフォルトの名無しさん2010/02/07(日) 22:03:24
そこでAccelerated C++ですよ
0217デフォルトの名無しさん2010/02/07(日) 23:50:57
>>214
deleteをほとんど出さない入門書があってもいいのではないかと思うと気がある
0218デフォルトの名無しさん2010/02/08(月) 02:48:34
「〜の数」ってときにつける変数名、皆さんはどうしてますか。
たとえばりんごの数とか…。
0219デフォルトの名無しさん2010/02/08(月) 03:13:16
num_apples
0220デフォルトの名無しさん2010/02/08(月) 03:16:40
人に薦めるならcountかなぁ。

自分のプロジェクトでは、数はnum、番目はnoを使ってる。
それ一緒や!元ネタ一緒やで!というツッコミは甘んじて受けよう。
大事なことはプロジェクト内での一貫性。(あと検索一意性)
それさえ見失わなければhogeでも構わん。
0221デフォルトの名無しさん2010/02/08(月) 03:35:36
>>219>>220
レスありがとうございます!
私はthe number of 〜とか考えてました。でもこれじゃあなんかな〜…と。
これからはnum、noを一貫してつけていくことにします。
0222デフォルトの名無しさん2010/02/08(月) 07:03:31
プログラムからPukiWikiのページを書き換えるにはどうやればいいですか?
0223デフォルトの名無しさん2010/02/08(月) 07:59:00
HTTPでしかるべきPOSTメソッドを送信すればいいと思うけど
0224デフォルトの名無しさん2010/02/08(月) 08:19:06
>>223
どうもです。
HTTPというと、C++で使うのはwininetですかね。
HTTPの事も調べないといけないなぁ。
0225デフォルトの名無しさん2010/02/08(月) 08:52:24
個数ならcount
量ならamountだな
0226デフォルトの名無しさん2010/02/08(月) 09:26:00
変数名スレでやれ
0227デフォルトの名無しさん2010/02/08(月) 09:36:02
Boost.Asioを使ったHTTP通信のサンプルコードはよく転がってるよ
0228デフォルトの名無しさん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と通常の>>は混ぜて使わないほうがいいんでしょうか?
0229デフォルトの名無しさん2010/02/08(月) 15:06:36
cin>>n は数値を読むだけで改行は読まないから
改行が来るまで吐き出させるとか
char c;
do {
cin >> c;
} while (c != '\n');
0230デフォルトの名無しさん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?

0231デフォルトの名無しさん2010/02/08(月) 20:58:47
stringはデフォでboolに変換できない。
s.c_str()とかやりなされ
02322302010/02/08(月) 21:14:31
>>231
s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが
0233デフォルトの名無しさん2010/02/08(月) 21:33:46
>>232
それは騙されたんだよ。
char* ならそうなるけど、string はそうはならない。
0234デフォルトの名無しさん2010/02/08(月) 21:45:34
>>232
妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ??

stringはクラスで>>230の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。
適当な型変換をクラスの実装による変換で要求するが、
stringは変換機構を実装してないからコンパイラさんが評価できないよ〜。ってエラーを返している。
02352302010/02/08(月) 21:45:55
>>233
stringだからダメなんですかね?
その時は、if(オブジェクト)はなぜシンタックスエラーにならないの?って質問したんですが
0236デフォルトの名無しさん2010/02/08(月) 21:51:23
>>235
ifは論理式の評価の後に最終的にはboolを要求する。
boolの基本は、0がfalse、それ以外がtrueなので、
ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。
凄い細かい話なんだが。。。
02372302010/02/08(月) 21:53:01
>>236
わかりました
ありがとうございます
0238デフォルトの名無しさん2010/02/08(月) 22:21:43
C++テンプレートテクニックスという本に載っていた
vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが
これって普通に仮想関数を使った場合とどっちが早いんですか?
0239デフォルトの名無しさん2010/02/08(月) 22:38:26
if(boolean-expression) {}

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

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

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

VC2008EEで確認したら、こんな動作だった。
これは言語仕様で定義されてるのかな?
0240デフォルトの名無しさん2010/02/08(月) 22:51:23
>>238
実装によるとしか。
大抵ほぼ同じになると思うが。
0241デフォルトの名無しさん2010/02/08(月) 23:09:16
>>238
最適化うんぬんやらスレッド安全性などを考えても、
vtableを自分で実装なんてしなくていいともうけどね。

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

80-20の法則ってやつを思い出すしか。
0242デフォルトの名無しさん2010/02/08(月) 23:10:36
>229
おまいは今 ignore さんの存在意義を否定した。
0243デフォルトの名無しさん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;

これの意味が解りません

0244デフォルトの名無しさん2010/02/08(月) 23:30:57
どこが分からないの?
0245デフォルトの名無しさん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.
>(略)
0246デフォルトの名無しさん2010/02/08(月) 23:52:36
>>244
この辺がよくわかりません。
static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));

配列を確保してるのですよね?
0247デフォルトの名無しさん2010/02/09(火) 00:40:32
>>241
vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。
速度目的は聞いたことないなあ。
0248デフォルトの名無しさん2010/02/09(火) 00:55:02
自前vtableっていまいち使い道が不明だと思ってたんだけど、そういうところで使うのね
0249デフォルトの名無しさん2010/02/09(火) 01:01:23
ああ、自前vtableで速度向上になるって話も思い出した。
どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り
非仮想関数だから最適化されやすいという理屈。

今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを
検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。
0250デフォルトの名無しさん2010/02/09(火) 01:41:35
>>246
::operator new()というのは、
要求されたメモリを確保して
void*として返す関数。
(bad_allocを投げるmalloc()、と考えてよい)

したがって、sizeof(Integer)のメモリを確保して
それを(void*から)Integer*にキャストしてる。
02512222010/02/09(火) 08:05:12
うーん、通信のプログラム難しい・・・。
HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。
ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。
何か良いサンプルはないでしょうか?
0252デフォルトの名無しさん2010/02/09(火) 10:25:13
そもそもHTTPはわかってるの?
0253デフォルトの名無しさん2010/02/09(火) 11:43:02
>>252
軽く調べた程度の知識しかないです。
0254デフォルトの名無しさん2010/02/09(火) 11:52:52
じゃあまずは簡単なCGIを自作して、そいつにPOSTするようなの書いてみては
0255デフォルトの名無しさん2010/02/09(火) 12:58:56
サブクラスを普通に使いつつ、スーパークラスをインスタンス化を禁止する方法ってありますか?
0256デフォルトの名無しさん2010/02/09(火) 13:06:01
virtual function-name() = 0
0257デフォルトの名無しさん2010/02/09(火) 13:06:21
スーパークラスのコンストラクタをprivate/protectedにして実装を書かない
って技があったと思う
iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった
0258デフォルトの名無しさん2010/02/09(火) 13:10:25
抽象クラスっていうんでしょうか?
ただスーパークラスの関数はすべてvirtualながらも定義していて、
必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです

スーパークラスのデフォルトコンストラクタをprotectedにしてみました
これはアリでしょうか?
0259デフォルトの名無しさん2010/02/09(火) 13:12:07
>>257
リロードしてなかった・・・
いまその記事発見しました
ありがとうございます
0260デフォルトの名無しさん2010/02/09(火) 13:30:30
>>254
どうもです。
CGI作成の方を調べたら、だいぶ分かってきました。
0261デフォルトの名無しさん2010/02/09(火) 13:33:30
http://codepad.org/TMxmPZN4

こういうやり方もあるようだが
これは正しい方法なのかな?
vc++とcodepadでは期待通りになる
02622572010/02/09(火) 14:08:02
むしろそれが普通のやり方だね
257は訂正、protectedにして(コピーコンストラクタや代入演算子を)実装しないってのは
インスタンス化は許すけどコピーは出来ないようにする
といった要求がある時に使う技だった
0263デフォルトの名無しさん2010/02/09(火) 15:08:46
std::tr1::unordered_set<Foo>

Fooはoperator std::size_tを定義していないとだめだと聞いたんですが
これはいったいどんな値を返すべきなんでしょうか?
0264デフォルトの名無しさん2010/02/09(火) 17:17:16
>>249
vc++ee2008で試したら仮想関数のほうが3倍速かったわ
0265デフォルトの名無しさん2010/02/09(火) 17:39:16
>>263
たぶんハッシュ値
0266デフォルトの名無しさん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で除算メッセージ*/)
こんな形でマクロ定義で楽ができればな、と考えています

こういう事は可能なのでしょうか?
0267デフォルトの名無しさん2010/02/09(火) 18:26:01
CRTPで調べてみるといいかもよ
0268デフォルトの名無しさん2010/02/09(火) 18:49:29
>>266
できるよ。
0269デフォルトの名無しさん2010/02/09(火) 19:08:32
指定したAというフォルダのなかに何が入ってるか
知る方法ってありますか
0270デフォルトの名無しさん2010/02/09(火) 19:13:49
コンセプトさん早くこないかな
0271デフォルトの名無しさん2010/02/09(火) 19:21:03
>>265
ありがとうございます
0272デフォルトの名無しさん2010/02/09(火) 20:00:13
質問です
普段はVC++ 2008 Express Editionで開発しているのですが
ふと別のコンパイラでコンパイルしたところ、エラーが出ました
エラーの内容は「ここでは宣言は出来ない」という文章で4箇所
47,82,93.96行の場所です
どうも構造体のポインタを宣言する事が引っかかっているようです

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

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

ソースコードです↓
http://codepad.org/bPyH9hRl
0273デフォルトの名無しさん2010/02/09(火) 20:03:29
C言語としてコンパイルするなら途中で変数の宣言は出来ない。関数の頭へ移動されればOK
0274デフォルトの名無しさん2010/02/09(火) 20:09:10
>>273
つまりそれぞれの宣言を、関数の一番先頭に持ってくればよいと言う事でしょうか?
それはint型などの変数でも同じなのですか?
0275デフォルトの名無しさん2010/02/09(火) 20:17:20
そうだよ
0276デフォルトの名無しさん2010/02/09(火) 20:26:43
>>273,>>275
順序を変えてみたところ、素直にコンパイルしてくれました
こんな些細なことでもエラーが出るとは思いませんでした

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

0278デフォルトの名無しさん2010/02/09(火) 20:54:45
>>269
あるよ
0279デフォルトの名無しさん2010/02/09(火) 20:55:38
オブジェクトの比較は演算子をオーバーロードするのが一般的なのですか?
0280デフォルトの名無しさん2010/02/09(火) 20:59:23
>>279
うん
でも比較用の関数やファンクタを使うこともしばしばある
0281デフォルトの名無しさん2010/02/09(火) 21:04:04
templeteってジェネリックってことで、おk?
02822962010/02/09(火) 21:06:55
>>278
どうすればできますか?

また、その方法が紹介されているサイトとかあったら教えてください
0283デフォルトの名無しさん2010/02/09(火) 21:09:04
>>282
環境別な方法(一般的)と、大抵の環境で出来る方法があるが、どっちがいい?
0284デフォルトの名無しさん2010/02/09(火) 21:13:43
>>281
まあ表面的にはそう。
02852812010/02/09(火) 21:21:48
>>284
thx
0286デフォルトの名無しさんNGNG?2BP(0)
>>282

1. boost::filesystem
2. dirent.h
3. Win32 APIなどの環境別API
4. system("dir > temp");
5. __asm { 中略 int 1bh }
0287デフォルトの名無しさん2010/02/09(火) 23:00:41
#include <Hoge>としただけなのに、Hoge* h = new Hoge();とできるクラスには
namespaceが設定されていないんですか?
0288デフォルトの名無しさん2010/02/09(火) 23:20:01
#includeとクラスとnamespaceに何の関係が?
0289デフォルトの名無しさん2010/02/09(火) 23:29:29
>>288
いまいわからないから、質問しているわけで
0290デフォルトの名無しさんNGNG?2BP(0)
#define Hoge foo::HogeImpl

namespace foo
{
class HogeImpl { };
}

かもしれん
0291デフォルトの名無しさん2010/02/09(火) 23:34:50
基本的に指定しなければグロバールのネームスペースに所属させられる。
明示的にくくってやればおk。
0292デフォルトの名無しさん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 が書いてあればそれは書いてあるように適用されるし、書いてなければ何もなしです
0293デフォルトの名無しさん2010/02/09(火) 23:41:15
C++では、enum型を==で比較するのはダメなのでしょうか。
0294デフォルトの名無しさん2010/02/09(火) 23:41:35
別にダメくない
0295デフォルトの名無しさん2010/02/09(火) 23:44:11
というか比較しまくる
0296デフォルトの名無しさんNGNG?2BP(0)
他にどうやって比較するのじゃ
0297デフォルトの名無しさん2010/02/09(火) 23:49:04
引き算
0298デフォルトの名無しさん2010/02/09(火) 23:51:21
多重定義
0299デフォルトの名無しさんNGNG?2BP(0)
2重switch
0300デフォルトの名無しさん2010/02/09(火) 23:55:33
>>291-292
thx
0301デフォルトの名無しさん2010/02/10(水) 00:07:33
あのーplacement new[]の使い方がいまいち解りません。

Hoge* h = new Hoge[100];っていうのを
placement new[]でやるには、Hogeにどんなnewを定義すればいいでしょうか?
0302デフォルトの名無しさん2010/02/10(水) 00:30:29
void *p = operator new(sizeof(Hoge)*100);
Hoge *h = (Hoge *)(new (p) Hoge[100]);

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

ていうか、こうすると、
全部の要素に対して個々にデストラクタを呼び出してからメモリを解放するわけだし
だったらコンストラクタだって、(placement newを使って)個々に呼び出すだけで良いじゃない、という話になる。
それだったら、引数の制限も無いしね。
0303デフォルトの名無しさん2010/02/10(水) 00:32:59
placement newって実装に依存するって話を聞いたんだが正確な話ではどうなってんの?
0304デフォルトの名無しさん2010/02/10(水) 00:34:48
えー?
new[]が要素数をどこかに保存しているから実装依存、という話ではなくて?
0305デフォルトの名無しさん2010/02/10(水) 00:38:33
http://homepage2.nifty.com/well/Operator.html

ここの配置newのところに
コンパイラによって動作が異なるという問題があり
って書いてあるのが気になって
0306デフォルトの名無しさん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演算子のやっていることを
エミュレートしているだけだから。
0307デフォルトの名無しさん2010/02/10(水) 01:11:53
>>302
それ危ない。領域が足りない可能性が高い。
安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476
0308デフォルトの名無しさん2010/02/10(水) 01:59:04
int main() {
  printf("xx");
}
returnを書かなくてもエラーにも警告にもならないのですが、
これはC++の仕様なんでしょうか、それとも環境依存なのでしょうか。
VC++2008を使っています。
0309デフォルトの名無しさん2010/02/10(水) 02:13:03
仕様
0310デフォルトの名無しさん2010/02/10(水) 09:22:17
using namespace とテンプレートの特殊化についてですが

template<> class hoge<std::string>
という特殊化を定義してて
使用者側がusing namespace std;を宣言していて
hoge<string>とした場合呼ばれるクラスは汎用のものなのか特殊化された物なのかどちらになるのでしょうか
0311デフォルトの名無しさん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;

とある
0312デフォルトの名無しさん2010/02/10(水) 11:52:32
クラスのメンバ関数はいつから使用可能なのでしょうか?
コンストラクタの初期化子にメンバ関数の返り値をあてることは出来るのでしょうか?
0313デフォルトの名無しさん2010/02/10(水) 12:15:13
>>312
コンストラクタでメソッドが利用するメンバを初期化してたりしなければ問題ない;
0314デフォルトの名無しさん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配列の内容を表示する方法を勉強できるサイトを教えてください。
よろしくお願いします。
0315デフォルトの名無しさん2010/02/10(水) 14:15:35
>>314
フォームだとC++の範疇じゃない、C++/CLIになる。
this->textBox1->Text = gcnew String(str);
とかかな。
とにかく、C++のサイト探しても見つかりにくいよ、C++/CLIで
0316デフォルトの名無しさん2010/02/10(水) 14:17:43
>>315
本当にありがとうございます!!
C++/CLIで検索しつつ精進します。
0317デフォルトの名無しさん2010/02/10(水) 14:17:56
>>312
初期化子でthisを使うのは直接・間接を問わずバグの原因になりうる
だから初期化子でthisやメンバ関数を使うのは避けるべき
スコープに入ってからならthisやメンバも使っておk
0318デフォルトの名無しさん2010/02/10(水) 14:35:09
>>313
>>317
大丈夫かも知れないけど変なバグの温床になりやすいと言うことでしょうか
ならばstaticなメンバにすれば大丈夫なのでしょうか
0319デフォルトの名無しさん2010/02/10(水) 14:48:45
初期化子リストを使う段階ではオブジェクトが構築されてないのでthisが危険
初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険
メンバ関数は基本的に構築が正確に済んでいるオブジェクトから呼び出されることを前提にしているから初期化子への代入目的には基本的には使えない
staticメンバは問題無いので使っていい
0320デフォルトの名無しさん2010/02/10(水) 16:09:31
vc2003+MFCのコンソールアプリについてですが、
入力待ち、処理中に閉じるボタンを押された際の処理方法を
教えてもらえないでしょうか。
0321デフォルトの名無しさん2010/02/10(水) 18:28:27
>初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険
メンバの初期化順はメンバ変数が定義された順と決まってるだろう。
0322デフォルトの名無しさん2010/02/10(水) 18:30:04
あれちゃんと順番に書いてる奴いんの?めんどくさいんだけど
0323デフォルトの名無しさん2010/02/10(水) 18:42:19
危険 (キリッ

を放置するのが楽しいんじゃないか余計な突っ込み入れるなよぅ
0324デフォルトの名無しさん2010/02/10(水) 18:49:19
プログラマって性格悪いやつすごく多くね?
0325デフォルトの名無しさん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;
}
0326デフォルトの名無しさん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;
}
0327デフォルトの名無しさん2010/02/10(水) 21:01:50
>>326
解決しました ありがとうございます
0328デフォルトの名無しさん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++のサンプルコードではこういう感じでファイル名を渡す形ではなくそのままストリームを渡していました
なぜこの形式を使うんでしょうか?ファイル名を渡すのと比べてどんな利点があるんでしょう?
0329デフォルトの名無しさんNGNG?2BP(0)
ファイル以外にも使えるようにじゃないか
0330デフォルトの名無しさん2010/02/10(水) 21:29:41
>>328
ストリームをfstreamからiostreamやstringstreamに置き換えても
そのまま動くからじゃね?汎用化というか
0331デフォルトの名無しさん2010/02/10(水) 21:37:35
Oh! ナルホド!
0332デフォルトの名無しさん2010/02/10(水) 22:07:19
>>322
コンパイラによっては順番に書けやって怒られるぞ。
0333デフォルトの名無しさん2010/02/10(水) 22:26:25
>310
string が std::string を指していて、かつ hoge<std::string> が可視なら特殊化されたものを使うだろ。
template だからって変なこと考える必要はないと思うよ。
0334デフォルトの名無しさん2010/02/10(水) 22:30:57
別のファイルでstd::stringを自分で定義してhoge<std::string>ってしたらどうなるの?
0335デフォルトの名無しさんNGNG?2BP(0)
std内に何かを追加した時点で
動作が保障されないんだっけ?
0336デフォルトの名無しさん2010/02/10(水) 22:33:25
stdに追加していいのはテンプレートの特殊化だけだったような
0337デフォルトの名無しさん2010/02/10(水) 22:36:57
>>332
> コンパイラによっては順番に書けやって怒られるぞ。
そんなクソコンパイラもあるのか。
0338デフォルトの名無しさん2010/02/10(水) 22:39:51
> std内に何かを追加した時点で
> 動作が保障されないんだっけ?
そう。未定義の動作になる。
ただし特殊化を除く。

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

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

class Hoge
{
....
}

Hoge h[100];

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

0340デフォルトの名無しさん2010/02/10(水) 23:02:32
デフォルトコンストラクタ
0341デフォルトの名無しさん2010/02/10(水) 23:02:36
Hoge* h = new Hoge[100];

配列形式はPODしか使えない
おそらくコンストラクタを持っているのだろう
0342デフォルトの名無しさん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さんの言う通りデフォルトコンストラクタが抜けているんだろうな
デフォルト引数などを使って解決する事もできる
0343デフォルトの名無しさん2010/02/11(木) 14:56:12
DLLの中の人が使うための共有メモリがあるとします
このメモリの確保・開放はDllMainでやるか、グローバルスマポでやるか
どっちが安全でしょうか?
0344デフォルトの名無しさん2010/02/11(木) 15:10:31
DLLの中の人次第
0345デフォルトの名無しさん2010/02/11(木) 15:40:54
>>343
グローバル変数やDllMainは使わない方法を考えるべきだね。
0346デフォルトの名無しさん2010/02/11(木) 17:20:02
エディタのCPad for bccを
VisualC++のコンパイラに適応させるにはどうしたらいいですか?
コンパイラの場所以外になにか設定が必要でしょうか?
0347デフォルトの名無しさん2010/02/11(木) 17:31:28
>>346
普通はそんな使い方しない。
IDE使えばいいんじゃないかな??
0348デフォルトの名無しさん2010/02/11(木) 17:42:06
>>347
IDEがちょっと重いのでエディタでと変えようとしてたんですが、無理ですかね?
0349デフォルトの名無しさん2010/02/11(木) 17:49:19
>>348
一応、CL自体はコマンドラインから使えるようにはなってるはずだが、もうズーットつかってないなぁ。
>cl /help でヘルプが見れたので適時変換して使えるようにすればできるかも。
ただ、労力には見合わないと思う。
0350デフォルトの名無しさんNGNG?2BP(0)
プロジェクトを用意してdevenvがいいんじゃないか
03512962010/02/11(木) 17:56:53
たしかにVC++は重い(スタートメニューが)
0352デフォルトの名無しさん2010/02/11(木) 17:58:15
名前間違えた
0353デフォルトの名無しさん2010/02/11(木) 18:22:28
-lm でlibm.aをリンクするらしいですが、
じゃあ僕もlib?.aファイル作ってみたいです
mingw32 gcc 4.4.1 Windows2000 SP4ですが
どうやって生成するんですか?
0354デフォルトの名無しさん2010/02/11(木) 19:31:27
ld使え
0355デフォルトの名無しさん2010/02/11(木) 19:55:04
コンストラクにstd::bad_allocをつける
場合、宣言の部分にだけかけばいいのでしょうか。

誰かサンプル書いて
0356デフォルトの名無しさん2010/02/11(木) 20:16:48
つーかコンストラクタがstd::bad_allocを投げる場合は大抵のOSでは
後処理も出来ない状態の事が多いな
0357デフォルトの名無しさん2010/02/11(木) 21:05:47
「bad_allocをつける」って意味がわからない。
例外指定のことだろうか。
0358デフォルトの名無しさん2010/02/11(木) 21:42:47
>>356
じゃあ書かない方がいいのですね。

コンストラクタでメモリ確保とか何か重要な
C++は言語の不備なのでしょうけど、失敗が
ある場合放置するしかないのですよね?
0359デフォルトの名無しさん2010/02/11(木) 21:47:28
bad_allocに限って言えばなにも考えずにmainでキャッチしてエラー通知して終了でいいと思う
0360デフォルトの名無しさん2010/02/11(木) 21:48:06
>>358
メモリが足らないって、どの言語を使っていてもあるでしょ。
0361デフォルトの名無しさん2010/02/11(木) 23:50:56
includeする時に、*.hが有るのと無いのがあるじゃん
あれって何が違うの?
0362デフォルトの名無しさん2010/02/11(木) 23:57:16
>>361
C の標準ヘッダは .h。
C++ の標準ヘッダは拡張子なし。
非標準ヘッダは適当。
0363デフォルトの名無しさん2010/02/11(木) 23:58:00
ファイル名が違う
#include は *.h でも *.txt でも *.hoge でもC言語の文法に合った内容のテキストファイルならなんでも #include できる
03643612010/02/12(金) 00:00:33
>>362-363
ありがとう。知らなかったよ
0365デフォルトの名無しさん2010/02/12(金) 07:48:20
便乗で

""と<>両方あるけどあれもあんまり意味はない?
0366デフォルトの名無しさん2010/02/12(金) 09:02:22
""だとカレントディレクトリを最初に検索
<>だとシステムのヘッダのみを検索
0367デフォルトの名無しさん2010/02/12(金) 12:53:22
>>366
http://www.kijineko.co.jp/tech/superstitions/quoted-headername-is-searched-for-from-cwd.html
0368デフォルトの名無しさん2010/02/12(金) 16:37:15
inlineにするときに、これはまず展開されねーなっていう場合ってどんなのがある?
確実にダメなのって関数ポインタを使ってる時ぐらいかな?
0369デフォルトの名無しさん2010/02/12(金) 16:45:49
関数ポインタって、それ仮想関数のことも当てはまるじゃん。
0370デフォルトの名無しさん2010/02/12(金) 17:48:18
おまいら配置new/deleteって普段つこうとるの?
0371デフォルトの名無しさん2010/02/12(金) 18:11:38
特殊な状況でしか塚湾だろう。
0372デフォルトの名無しさん2010/02/12(金) 18:37:22
C言語で、windows.hのSleep()ではないウエイトをかける方法ありませんか?
0373デフォルトの名無しさん2010/02/12(金) 18:41:14
timeGetTimeを使う
0374デフォルトの名無しさん2010/02/12(金) 18:49:39
FindFirstFileを使いたいんですけれど
どうすれば使えるかがわかりません

何をどうすればいいのですか?
0375デフォルトの名無しさん2010/02/12(金) 18:51:26
まずwinapiスレに行きます
0376デフォルトの名無しさん2010/02/12(金) 18:53:04
次に手を洗います
0377デフォルトの名無しさん2010/02/12(金) 18:53:52
ググって出たソースをパクる
0378デフォルトの名無しさん2010/02/12(金) 18:54:10
http://schiphol.2ch.net/gameurawaza/
0379デフォルトの名無しさん2010/02/12(金) 18:54:53
誤爆
0380デフォルトの名無しさん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 できないのでしょうか?
0381デフォルトの名無しさん2010/02/12(金) 22:03:01
#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int a, b, c;
0382デフォルトの名無しさん2010/02/12(金) 22:07:25
>>381
うお、すげー!
Thanks!
0383デフォルトの名無しさん2010/02/12(金) 22:13:24
>>380-382
そんなウンコマクロが欲しくなるほどグローバル変数をばらまくんじゃねぇよ。

あと、インクルードガードに予約識別子使うな。
0384デフォルトの名無しさん2010/02/12(金) 22:16:51
>>383
断る。
0385デフォルトの名無しさん2010/02/12(金) 22:17:28
>>383
> 予約識別子
今知った。
指摘Thanks!
0386デフォルトの名無しさん2010/02/12(金) 22:18:20
>>383
これみてるとC/C++って糞だよな
0387デフォルトの名無しさん2010/02/12(金) 22:19:32
何を今更。
0388デフォルトの名無しさん2010/02/12(金) 22:34:27
int &a(void) { static int a; return a; }

プロはどうしてもグローバル変数が欲しい時はこう書く
真似していいぞ
0389デフォルトの名無しさん2010/02/12(金) 22:37:19
プロ・・・
クラスのメンバみたいにアクセスさせる形にすればいいだけなので
クラスを扱う言語経験者なら思いつくと思うけど
0390デフォルトの名無しさん2010/02/12(金) 23:01:57
オススメの命名規則(C++)を教えてください
ハンガリアン記法は過去のものみたいなので
0391デフォルトの名無しさん2010/02/12(金) 23:02:31
ドトネト式
0392デフォルトの名無しさん2010/02/12(金) 23:08:16
perlのuse constantはそれと全く同等のことやってるな
0393デフォルトの名無しさん2010/02/12(金) 23:19:49
FindFirstFile(path, &fd);
でD:\下のファイルの情報取得で

if(fd.dwFileAttributes!=0x00000002)
{
printf("%s\n", fd.〜)
}

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

どうすれば隠しフォルダを避けることができますか?
0394デフォルトの名無しさん2010/02/12(金) 23:22:21
>>393
ビットフラグじゃね?
0395デフォルトの名無しさん2010/02/12(金) 23:23:21
>>390
http://www.possibility.com/Cpp/CppCodingStandard.html#descriptive
0396デフォルトの名無しさん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);
}


カロックのところでエラーになるんだけどなんでかな?
0397デフォルトの名無しさん2010/02/13(土) 00:50:09
>>396
ヒープが足りんのだろう。
戻り値の仕様ぐらい読め。
0398デフォルトの名無しさん2010/02/13(土) 00:51:45
>>396
ライブラリを使うためのヘッダのインクルードが無い。
中括弧がいっこ足りない。
0399デフォルトの名無しさん2010/02/13(土) 00:51:57
>>396
出ませんが
ただ '}' が一つ抜けています
0400デフォルトの名無しさん2010/02/13(土) 00:52:43
ああ #include <stdlib.h> が抜けてるとかいうオチ?
0401デフォルトの名無しさん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行目に人数
0402デフォルトの名無しさん2010/02/13(土) 01:21:38
動かすの面倒なんでエラーメッセージ張ってくれ
callocってヒープから取るんだろ
doublex2 charx100(正確には101)とアライメント入れてもそれほど大きくないしなあ
0403デフォルトの名無しさん2010/02/13(土) 01:26:35
>>401
fscanf() のエラーもチェックしろ。
calloc() のエラーとは関係ないだろうが、 "%lf" に渡す引数は double じゃなくて double* な。
やっぱりヘッダのインクルード足りないし。
0404デフォルトの名無しさん2010/02/13(土) 01:38:26
>>403
しゅくだいなんだけど,ヘッダのとこは変更できないのよ・・・
ここに解答を書くってところだけ

ヘッダのインクルードなしでどうすればできるかなぁ
0405デフォルトの名無しさん2010/02/13(土) 01:40:59
>>404
動かすためにとりあえずヘッダ入れて
確認ができたらはずせばいい
0406デフォルトの名無しさん2010/02/13(土) 01:48:47
コピー多いな
文字列へのポインタ持ってポインタソートした方がすっきりする
0407デフォルトの名無しさん2010/02/13(土) 02:05:31
>>405
ヘッダ入れたらコンパイルできたけど,実行するとフリーズする・・・
0408デフォルトの名無しさん2010/02/13(土) 02:44:46
>>403
fscanfのとこの&でしたorz

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

どこをどうすればよいのでしょうか?
お助けください。
0410デフォルトの名無しさん2010/02/13(土) 13:12:43
>>409
http://codepad.org/m4SeoRfu

正しいかどうか知らんよ
しかし基本的なC++文法エラーを犯しているなこの作者は
0411デフォルトの名無しさん2010/02/13(土) 13:16:11
g++の拡張文法を使っているのかもしれない
ポータビリティを考えるなら標準C++に従って書いた方がいいね
0412デフォルトの名無しさん2010/02/13(土) 13:50:32
>>410
コンパイルしてちゃんとppmファイルを得ることが出来ました
ありがとうございました!
0413デフォルトの名無しさん2010/02/13(土) 17:05:09
超初歩的な質問で恐縮なんですが
CとC++ではCを先に学んだ方がいいんですか?
それとおすすめのサイトとか書籍があったら教えてもらえませんか?
0414デフォルトの名無しさん2010/02/13(土) 17:08:20
>>413
歴史をなぞるなら C から。
何か早く作りたいものがあるなら C++ からのほうが早いかもしれない。
ただし C に由来する落とし穴も多く残っているので、危ないかもしれない。

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

お勧めサイト。
http://www.google.co.jp/
0415デフォルトの名無しさん2010/02/13(土) 17:11:04
>>413
プログラミングしたことあるの?
0416デフォルトの名無しさん2010/02/13(土) 17:11:48
C++入門といってもクラスやSTLは後半!とか続刊!とかの入門書なら
内容はCとかわらないよ。
0417デフォルトの名無しさん2010/02/13(土) 17:15:19
あと面倒なのが最近はunicodeベースでコンパイルしちゃう物があるのに
古い標準関数はマルチバイトベースだったりととにかく古いだけあってめんどくさい>C/C++
0418デフォルトの名無しさん2010/02/13(土) 17:15:25
>>414
特に急ぎ足では無く、ゆっくり学ぼうと思ってるんでCからいこうと思います。
ググるのは大切ですね、しかし紹介されてるサイトや書籍があまりにも多いので戸惑います。

>>415
すごい勢いでド素人です。
0419デフォルトの名無しさん2010/02/13(土) 17:17:25
>>417
CとC++はわりと古いから、やり難い事があるという事だけわかりました!・
0420デフォルトの名無しさん2010/02/13(土) 17:20:05
>>413
お勧め書籍。
http://www.stroustrup.com/Programming/
0421デフォルトの名無しさん2010/02/13(土) 17:20:11
C++を学びたいならC++から
Cも学びたいからCから
C++をやるとCなんて馬鹿らしくてやってられないから
0422デフォルトの名無しさん2010/02/13(土) 17:25:03
>>420
おぅふ・・・なんかすげぇのきた。これは理解できそうにない

>>421
++というだけあって発展形なんですね。
0423デフォルトの名無しさん2010/02/13(土) 17:37:34
>>422
> ++というだけあって発展形なんですね。
今もC++はC言語のコードを(割と互換性があるので)使える。
でも厳密な互換性じゃないので使えないこともある。
0424デフォルトの名無しさん2010/02/13(土) 17:38:41
>>418
windowsしか使わないなら、C#あたりからやった方がいいよ
C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
0425デフォルトの名無しさん2010/02/13(土) 17:43:20
>>424
> windowsしか使わないなら、C#あたりからやった方がいいよ
いや、俺の意見としては
C#だけは止めた方が良い。
> C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
そんならP言語(Python, Pascal, PHP)をやれば良いと思う。
Rubyはよーしらんが。
0426デフォルトの名無しさん2010/02/13(土) 17:43:29
>>423
なるほど!参考になります。

>>424
#ですか、比較的敷居が低いんでしょうか。
まずそれから弄るのもいいかもしれませんね、ありがとうございます。
0427デフォルトの名無しさん2010/02/13(土) 17:45:23
qmakeとcmakeって何が違うわけ
makeファイルを作っているだけなのか
0428デフォルトの名無しさん2010/02/13(土) 17:46:22
まぁC#使っても、あれは出来ないだの、これはC経由しろだの、あるけどな。
0429デフォルトの名無しさん2010/02/13(土) 17:47:41
C#使うくらいならJavaでいいじゃん
0430デフォルトの名無しさん2010/02/13(土) 17:50:08
C, C++をやってから、GCのありがたみを感じるべき
0431デフォルトの名無しさん2010/02/13(土) 17:51:47
>>428
API使えるしまあいろいろ方法はあるよ
C#->C++に戻ってみるとC#で当たり前に使ってる部品がなくて自作することになったり
文字コード関連ではまるよりよっぽどいい
0432デフォルトの名無しさん2010/02/13(土) 17:54:50
昔の言語関連って無意味に省略しまくってるから直感で意味が通じないんだよな

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

c_strとかなんだよそれ
0433デフォルトの名無しさん2010/02/13(土) 17:57:21
好きなのを選ぶが良い
ttp://vintage-digital.com/hefner/misc/lisp-programmers.jpg
0434デフォルトの名無しさん2010/02/13(土) 17:58:17
俺ロキュータスいくわ
0435デフォルトの名無しさん2010/02/13(土) 17:58:37
>>433
怪しすぎるww
特にC++は何だこりゃw
0436デフォルトの名無しさん2010/02/13(土) 18:00:01
>>432
仕方ねーんだよ
昔のリンカは識別子を最大6文字しか認識しない時代があって
Cはその時に作られた物だから

C++はとっくにその制限は撤廃されているがなぜかCの癖を無意味に
引きずって省略しまくっている
タイプ量を減らすためか?
0437デフォルトの名無しさん2010/02/13(土) 18:01:01
>>433
ASP.NETにいかざるをえない

というか皆さん千差万別ですね、そりゃネットのおすすめの書籍も色々あるわけだ・・・
ここにテンプレがないのもそのせいか!
0438デフォルトの名無しさん2010/02/13(土) 18:03:32
>>436
まあギークが「ぼくのかんがえたさいきょうのげんごかくちょう」がC++だからタイプ量減らすためじゃね?
std::stringのstringからcharに変換するやつね
stringだからC++からの物だよね
0439デフォルトの名無しさん2010/02/13(土) 18:04:57
Haskellやべえ
0440デフォルトの名無しさん2010/02/13(土) 18:05:06
C++やるならQt Creator + VCのコンパイラがいいよ
0441デフォルトの名無しさん2010/02/13(土) 18:17:54
>>426
いや、俺の意見としては
C#だけは止めた方が良い。
0442デフォルトの名無しさん2010/02/13(土) 18:18:13
>>440
メモっときます、ありがとう。

皆ありがとう。感謝します。
とりあえず色々触ってみた上で何か一つに絞って、学んでいこうと思う!
0443デフォルトの名無しさん2010/02/13(土) 20:03:26
>>441
いやいや、C#は便利だぞ。
C++よりも綺麗だし。
0444デフォルトの名無しさん2010/02/13(土) 20:46:45
>>443
そんなこと言ってまた不幸になる人を増やすのか!

> C++よりも綺麗だし。
そんな言語いっぱいあるじゃないかw
0445デフォルトの名無しさん2010/02/13(土) 21:45:41
>>444
C#で不幸になるやつは、もともと不幸なやつだけだ。
0446デフォルトの名無しさん2010/02/13(土) 23:14:59
C#は.NETで出来ないことしようとすると、途端に不幸になる気がする。
MFCだと、のっけから不幸にだが・・・
0447デフォルトの名無しさん2010/02/13(土) 23:27:06
ぶっちゃけCから始めるのがいいよ
C99ならC++の便利なところは大体使えるし
0448デフォルトの名無しさん2010/02/14(日) 00:06:35
Cを覚えてenumや構造体や関数で取り敢えずなんとか実用になるライブラリとか書く。
しかしC++でnamespaceやクラスを知ると、それまで書いたのを全部書き直したくなるんだよ。
で、書き直した頃にtemplateに手を出して、また書き直したくなるわけ。
その後もSTLやらEffectiveC++やらBoostやらにかぶれるたびに、今まで書いたものがゴミに見える。
さらにC++0.xなんてので、今また過去の糞化現象が起こるんです。
0449デフォルトの名無しさん2010/02/14(日) 00:11:09
それを楽しめるマゾ向け
0450デフォルトの名無しさん2010/02/14(日) 00:14:47
最近はもう逆に余計なものみんな取り払って++も付かない99でもないCだけでいいんじゃないかと思えてきた
0451デフォルトの名無しさん2010/02/14(日) 00:15:35
99より前にもいくつかあるんだが
0452デフォルトの名無しさん2010/02/14(日) 00:18:56
shop99 と shop100 だと500円の買い物で
5円とか半端な数字出る出ないの違いが有るよね
0453デフォルトの名無しさん2010/02/14(日) 05:48:56
入門書とかで「解説のためにわざと非効率なコード書いてます」とか出ると混乱するよな。
0454デフォルトの名無しさん2010/02/14(日) 10:02:18
>>447
C99に完全準拠しているコンパイラはIntel C++などごく一部だけだぞ
g++も部分準拠だし移植性がないしだいたいg++はC++0xへの改訂作業で
手一杯で今は時代遅れのC99に携わっている暇はないだろう
0455デフォルトの名無しさん2010/02/14(日) 10:07:15
C++0xへの改訂作業なんて、
考えるだけで頭痛くなってくるなww
0456デフォルトの名無しさん2010/02/14(日) 10:11:50
C99への準拠を強化するよかまだ0xに力入れた方がマシということ
0457デフォルトの名無しさん2010/02/14(日) 10:11:59
でもnullptrとdecltype、auto、右辺値参照、コンテナの初期化子
など痒い所に手が届くようになるのはありがたいよな
0458デフォルトの名無しさん2010/02/14(日) 11:36:08
今までが届かなさすぎだったんだよ!
0459デフォルトの名無しさん2010/02/14(日) 12:53:10
/usr/include/を見ていたら、*.hと*.cppがありました
*.cppには#include "*.h"としか書いてありません
一体何がしたいんですか?
0460デフォルトの名無しさん2010/02/14(日) 12:57:27
>>459 知るか。書いた奴に聞けよ。
0461デフォルトの名無しさん2010/02/14(日) 15:00:38
イテレータから元の変数にアクセスできますか。

vector<int>::iterator p;だと、配列要素の値と位置がわかるだけ気がしますが
pの前方に要素追加したり削除したりとか。
0462デフォルトの名無しさん2010/02/14(日) 15:04:23
>>461
「元の変数」って何?
vector インスタンスのことなら、無理。
0463デフォルトの名無しさん2010/02/14(日) 15:06:31
サンクス
0464デフォルトの名無しさん2010/02/14(日) 15:24:40
スタティックリンクライブラリ作成についての質問なんですが

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

2.スタティックリンクライブラリをコンパイルする際にスタティックリンクライブラリが
利用する外部の機能を取り込まないようにするにはどうすればいいですか?
(VC++2008
0465デフォルトの名無しさん2010/02/14(日) 15:33:30
親クラスを継承して子クラスを作るときには、
子クラスのヘッダファイルにもオーバーライドするメソッドを、定義しないとダメなんですか?

一応自分でも試してみたんですが、コンパイラ様に怒られたので
0466デフォルトの名無しさん2010/02/14(日) 15:35:30
>>465
そんなことはない。

エラーメッセージは?できればソースも出して。
0467デフォルトの名無しさん2010/02/14(日) 15:36:57
純粋仮想関数を持つ親クラスを継承した子クラスをインスタンスとして使おうとしたとか?
0468デフォルトの名無しさん2010/02/14(日) 15:38:57
>>465
あとメソッドっていう用語は存在しないので、
今後はメンバ関数member functionと
呼ぶようにしなさいね。

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

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

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

Aのプロジェクトの中にBのlibファイルを追加すれば
「取り込む」状態になるけど。
04704652010/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’
0471デフォルトの名無しさん2010/02/14(日) 15:57:10
Visal C++ 2008 ExpレッsEditionでWindowsXP向けの開発です。
ウィンドウごとに音量を調整、若しくは開いているフラッシュオブジェクトの音量を調整する関数
または手法は無いでしょうか?
0472デフォルトの名無しさん2010/02/14(日) 16:16:59
イテレータは挿入しても保たれるけど、end()とbegin()はそうでないのね。
不便。何でこんな事にしたの。
0473デフォルトの名無しさん2010/02/14(日) 16:24:09
>>472
??保たれない場合もあるだろ。何を言いたいのかよく分からんぞ。
0474デフォルトの名無しさん2010/02/14(日) 16:28:15
そうなのか。気をつける。
0475デフォルトの名無しさん2010/02/14(日) 16:41:04
何が保たれるんだ?
0476デフォルトの名無しさん2010/02/14(日) 16:42:04
*.cppに直接宣言している変数って何なんですか?
0477デフォルトの名無しさん2010/02/14(日) 16:44:46
どんなコード?
04784762010/02/14(日) 16:48:30
>>477
こんなコードです
DownloadManager *BrowserApplication::s_downloadManager = 0;
HistoryManager *BrowserApplication::s_historyManager = 0;
NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;
0479デフォルトの名無しさん2010/02/14(日) 16:53:36
googleのコード検索で見たけど
グローバル変数だね
0480デフォルトの名無しさん2010/02/14(日) 16:57:51
prefix の s_ はstatic変数のsを表しているのかもしれない
0481デフォルトの名無しさん2010/02/14(日) 16:58:43
>>478
staticのメンバ変数は、どっかに実体を宣言しないといけない。
04824792010/02/14(日) 17:01:50
そうだったw
479は間違い
0483デフォルトの名無しさん2010/02/14(日) 17:04:26
boost::tuples or tuple
の使い方が分かる日本語のサイトを教えてください。

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

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

よろしくお願い申し上げます。
0484デフォルトの名無しさん2010/02/14(日) 17:05:53
アキラさんのboost本買うといいよ
0485デフォルトの名無しさん2010/02/14(日) 17:18:10
テンプレート本?
0486デフォルトの名無しさん2010/02/14(日) 17:41:35
>>483
http://boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html
04874832010/02/14(日) 17:49:05
>>486
お返事ありがとうございます。
拝読致します。
0488デフォルトの名無しさん2010/02/14(日) 18:41:11
>>481
ありがとう
0489デフォルトの名無しさん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;
---------------------------
0490デフォルトの名無しさん2010/02/14(日) 19:10:50
CやC++を今から勉強したいんですけど、
全くの初心者ですがオススメの本ってありますか?
将来仕事にすることも考えてます。
0491デフォルトの名無しさん2010/02/14(日) 19:14:57
>>490
独習シリーズ

本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。
0492デフォルトの名無しさん2010/02/14(日) 19:19:28
>>489
ありとあらゆる意味でダメ。
期待したとおりに動かないし、(直したとして)保守性も最悪。
窓からソースを投げ捨てるレベル。
0493デフォルトの名無しさん2010/02/14(日) 19:20:11
ワロタw
0494デフォルトの名無しさん2010/02/14(日) 19:20:53
>>491
ありがとうございます
明日にでも買ってこようと思います
0495デフォルトの名無しさん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;
0496デフォルトの名無しさん2010/02/14(日) 20:15:00
>>495
ちなみにvectorだったらどんな感じになるんですか?
0497デフォルトの名無しさん2010/02/14(日) 20:30:02
>>495
元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?
0498デフォルトの名無しさん2010/02/14(日) 21:17:12
>>496
std::vector<int> a[N];
for (int i = 0; i < N; ++i)
{
 a[i].resize(N - i);
}
0499デフォルトの名無しさん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));}};
0500デフォルトの名無しさん2010/02/14(日) 21:37:35
>>497
そこが問題になるんですよね・・・

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

むしろIntelの仕様がおかしいって言われそうで不憫だ。
0502デフォルトの名無しさん2010/02/14(日) 22:45:10
gcc?
0503デフォルトの名無しさん2010/02/14(日) 22:47:11
>>502
GNU C Compiler ですけど?
0504デフォルトの名無しさん2010/02/14(日) 22:48:49
gnu compiler collection
0505デフォルトの名無しさん2010/02/14(日) 22:53:13
gccじゃなくてg++じゃ、と>>502は言いたかったに1ペリカね。
0506デフォルトの名無しさん2010/02/14(日) 22:54:05
こまけぇことはいいんだよ
0507デフォルトの名無しさん2010/02/14(日) 22:54:26
>>504
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。

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

さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
0508デフォルトの名無しさん2010/02/14(日) 22:56:51
gccで全然問題ない
0509デフォルトの名無しさん2010/02/14(日) 23:05:20
>>502
がフルボッコw
0510デフォルトの名無しさん2010/02/14(日) 23:06:32
俺は502じゃないが、-std=c99つけてもあかんの
あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね
0511デフォルトの名無しさん2010/02/14(日) 23:10:18
>>510
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。

0512デフォルトの名無しさん2010/02/14(日) 23:11:56
>>510
> 俺は502じゃないが、-std=c99つけてもあかんの
いやだれ一人としてダメなんて言ってないぞ?
0513デフォルトの名無しさん2010/02/14(日) 23:12:37
>>499
大きな領域を一度に確保してからplacement newを発動するとか

デストラクタが面倒臭い事になるけど
05145072010/02/14(日) 23:13:42
>>512
いや言ってるんじゃね?
0515デフォルトの名無しさん2010/02/14(日) 23:13:48
GCCがC99ガン無視って事は無いな
0516デフォルトの名無しさん2010/02/14(日) 23:14:45
どうみても>>499は愚行だと思うんだが
05175022010/02/14(日) 23:19:43
俺の疑問は>>510の1行目が理由で>>515なのではないかということ。
ok?
0518デフォルトの名無しさん2010/02/14(日) 23:21:18
お前ら全員いい加減にしようぜ
05194992010/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));}};
05204832010/02/14(日) 23:29:10
boost::tuple
勉強してきました。

感動しました。
0521デフォルトの名無しさん2010/02/14(日) 23:30:29
> 広く使われている処理系でも、タプルのこの種の用途について
> 最適化をしくじるものが存在する(例えば bcc 5.5.1)
> ことに注意されたい。
Boostに名指しされとるww
0522デフォルトの名無しさん2010/02/14(日) 23:32:42
まあ普通にstd::pairの拡張版だと捉えているがな
0523デフォルトの名無しさん2010/02/14(日) 23:34:19
bcc 5.5.1は今から見るとひでぇからな。
0524デフォルトの名無しさん2010/02/14(日) 23:35:47
仕方ねえよ
標準C++にできるだけ準拠しようとして精一杯で
最適化まで手が回らなかったんだろ
0525デフォルトの名無しさん2010/02/14(日) 23:49:33
>>519
何がしたいのかわからん。
new した領域はいつ delete されるの?
なんで std::vector 使わないの?
0526デフォルトの名無しさん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
となります。

どこが悪いのでしょうか。
教えて下さい。
宜しくお願いします。
0527デフォルトの名無しさん2010/02/14(日) 23:57:10
>>526 typename
0528デフォルトの名無しさん2010/02/14(日) 23:58:27
>>527
ありがとうございます。
何か追記する必要がありますでしょうか?
0529デフォルトの名無しさん2010/02/14(日) 23:58:31
>>526
typename TestClass<T>::SS* TestClass<T>::TestCode(void)
0530デフォルトの名無しさん2010/02/14(日) 23:59:46
>>529
ありがとうございます。
コンパイル通りました。

なぜ、先頭に typename と入れる必要があるのでしょうか?
教えて下さい。
宜しくお願いします。
0531デフォルトの名無しさん2010/02/15(月) 00:01:57
>>530 http://ja.lmgtfy.com/?q=template+typename
0532デフォルトの名無しさん2010/02/15(月) 00:05:55
>>531
ありがとうございました。
0533デフォルトの名無しさん2010/02/15(月) 00:07:47
>>531
こんなサイトがあるんだw

>これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!
0534デフォルトの名無しさん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++はそういうのが無かったはずですし
0535デフォルトの名無しさん2010/02/15(月) 02:22:07
Cでも構造体を返すことが出来るのは当然知ってるよな?
で、当然、その構造体のメンバとして、
(mallocで確保した領域への)ポインタを持てることも知ってるよね?
0536デフォルトの名無しさん2010/02/15(月) 02:24:17
>>534
mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。
つまり、あんまり気にしなくていい。
0537デフォルトの名無しさん2010/02/15(月) 02:24:26
>>535
はい

std::stringで確保したデータが不要になった場合は
clear()しておけば従来のfreeに相当する動作ということでいいんですかね?
0538デフォルトの名無しさん2010/02/15(月) 02:34:49
ああ・・・いろいろ勘違いを・・・

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

std::string* Data = new std::string();
stringの確保をこういう感じにしてこれを返せばいいんですね
0539デフォルトの名無しさん2010/02/15(月) 08:06:25
>>538
ちがーう。
std::string をそのまま int か何かと思って同じように扱えばいい。
0540デフォルトの名無しさん2010/02/15(月) 11:46:06
>>537
オブジェクト指向を根本的に勘違いしているな

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

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

但しこれは当たり前だが、関数の中で定義したローカルstringを
参照返しするような事をすれば、これはstringに限らずどんなデータ型
だとしても未定義の動作となる
0541デフォルトの名無しさん2010/02/15(月) 21:52:32
回答側がバラバラすぎて、それぞれ何を主張してるのかよくわからん
0542デフォルトの名無しさん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/
少なくともこれぐらいは読んで
初めて質問が出来るレベルになるだろう
と思います。

0543デフォルトの名無しさん2010/02/15(月) 22:12:47
素直にCから学べばよかったのに
0544デフォルトの名無しさん2010/02/15(月) 22:14:20
Cから学ぶとC++の習得に余計な時間がかかるぜ
0545デフォルトの名無しさん2010/02/15(月) 22:26:47
Javaだのを習得して、おかしな脳内回路ができるよりマシ
0546デフォルトの名無しさん2010/02/15(月) 22:43:03
プログラミング経験皆無から始めるとして
Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週
これぐらいかかるかな
0547デフォルトの名無しさん2010/02/15(月) 22:43:22
>>545
それはあるわ。Javaって結構綺麗な言語だから、
C++みたいな清濁併せ持ったカオスな言語だと
勉強がいやになってしまうんだよな。
0548デフォルトの名無しさん2010/02/15(月) 22:46:21
>>546
あとたくさん本を買わなければならないよ
C++について学べば学ぶほど、たくさんの本が必要になる
中には絶版になってしまったものもあって残念だが

俺は絶版扱いのC++標準ライブラリを一番多用している
手垢が付いてもう真っ黒だぞ
0549デフォルトの名無しさん2010/02/15(月) 22:59:56
>>547
> Javaって結構綺麗な言語だから、
そうか?
Javaも結局 謎の仕様を覚えなきゃならんことがあるし、
落ち目の感が否めない
0550デフォルトの名無しさん2010/02/15(月) 23:02:30
>>549
謎仕様も多いけど、C++くんに言われとうないわ!

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

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

D言語かPython 3系(2系でなく)かな?
0552デフォルトの名無しさん2010/02/15(月) 23:12:54
>>551
brainfuck とか whitespace とか
0553デフォルトの名無しさん2010/02/15(月) 23:13:00
後でできた言語の方が綺麗な構文になるのは仕方ないこと
Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない

しかしC#からC++に戻るとゲシュタルト崩壊?するわ
C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと
割り切ることができるけどC++のような中途半端だとスゲー悩む
0554デフォルトの名無しさん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
0555デフォルトの名無しさん2010/02/16(火) 00:32:17
教えて下さい。

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

なんどやってもエラーになってしまいます。
よろしくおねがいします。
0556デフォルトの名無しさん2010/02/16(火) 00:35:27
codepadあたりにエラーになるコードを貼ってくれ
0557デフォルトの名無しさん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;
}
よろしくお願いします。
0558デフォルトの名無しさん2010/02/16(火) 00:54:05
>>557 >>527-

あと、ポインタ返す関数で return 1 は無いだろう。
0559デフォルトの名無しさん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

よろしくお願いします。
0560デフォルトの名無しさん2010/02/16(火) 01:14:06
>>559 >>527-

サルかお前は?
0561デフォルトの名無しさん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;
}
0562デフォルトの名無しさん2010/02/17(水) 01:01:13
>>561
ありがとうございました。
0563デフォルトの名無しさん2010/02/17(水) 07:48:40
typename A<T>::S * TestFunc( typename A<T>::S *p );
0564デフォルトの名無しさん2010/02/17(水) 10:43:57
テンプレートクラスを特殊化する場合
メンバ全てを宣言・実装し直さないといけないのでしょうか?
それとも変更点のみで良いのでしょうか?

あと、
template <typename T ,typename S = T>
というデフォルト引数の設定は可能なのでしょうか?
0565デフォルトの名無しさん2010/02/17(水) 11:03:13
>>564
クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。
クラステンプレートのメンバ関数ごとに特殊化できなかったっけ?

> template <typename T ,typename S = T>
やってみればいいじゃない。
0566デフォルトの名無しさん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;
}
0567デフォルトの名無しさん2010/02/17(水) 13:31:38
ごめん、間違えた

template<class A>
struct DefTypeA {
typedef Base<A, nanika> type;
};
0568デフォルトの名無しさん2010/02/17(水) 14:04:17
テンプレート引数が異なるクラステンプレートの実体は関連が無いので、
同じクラステンプレートの異なる実体を継承することも出来る。
使いどころは限られるが。

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

template<>
class A<int>: public A<...> // int以外を与えた場合のAを継承
{ ... }; // 追加の実装
0569デフォルトの名無しさん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;
}
};
};

05705692010/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 を作って逆順ソートしたい
0571デフォルトの名無しさん2010/02/17(水) 20:31:44
>>569
標準ではなかった気がする
自分で作るかboost::operatorsだな
0572デフォルトの名無しさん2010/02/17(水) 22:07:41
std::vector<class A>  のpush_back() ってどんな動作してるんだ?
たとえば
vector<string> vec;
vec.push_back("test");
ってやったら
stringの何を呼び出してstringクラスに"test"を入れているんだ?
自作の文字列クラスをvecにつっこんで機能を使わせたいのです
0573デフォルトの名無しさん2010/02/17(水) 22:13:46
コンストラクタ
0574デフォルトの名無しさん2010/02/17(水) 22:44:09
STLを使うならEffectiveSTLには絶対に目を通しておけ
05755722010/02/18(木) 01:18:05
>>573
コンストラクタに(const char* )を追加して実行してみました.
ttp://codepad.org/8ai16KPo
どうやら大分ひどいことをしているようなんですが,
コンパイルは通ってしまいます.
ご指導をよろしくおねがいします.
もしくは>>574さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?
0576デフォルトの名無しさん2010/02/18(木) 01:21:03
クロージャで出来て関数ポインタで出来ない例が思いつかない。
0577デフォルトの名無しさん2010/02/18(木) 01:32:58
>>575
暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。
デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。
0578デフォルトの名無しさん2010/02/18(木) 01:47:45
>>576
関ポじゃ状態を持てないじゃん
0579デフォルトの名無しさん2010/02/18(木) 02:01:11
>>575
http://codepad.org/kAeUsq2i
これでいいと思われます
要するにクラス内部でnew/deleteを行うような場合は
必ずコピーコンストラクタと代入演算子関数は自前で用意
しなければならないという事です

そうしないとクラッシュしたり、メモリリークしたりします
05805722010/02/18(木) 02:59:22
>>579 >>577 ありがとうございます!
コピーコンストラクタと代入演算子を作らないといけなかったんですね
わかりやすくコードもひいてくださりありがとうございました
0581デフォルトの名無しさん2010/02/18(木) 08:36:28
>>579
operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど)
strlen() してから strcpy() するのってもったいないね。
date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。)

こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス
なんて作るもんじゃないね。みんなわかってると思うけど。
0582デフォルトの名無しさん2010/02/18(木) 09:51:30
>>578
やっと理解した。Cというか関数ポインタだと代替にならないな。

でもこれC++ならクラスでやれって話になるな。
0583デフォルトの名無しさん2010/02/18(木) 10:18:58
乱暴に言うと、クラスはデータとそれに付随する振る舞いをまとめたもの。
クロージャは振る舞いとそれに付随するデータをまとめたもの。
・・・っていうのはどの本の説明だったかな。
0584デフォルトの名無しさん2010/02/18(木) 10:38:06
データ構造を決めれば操作は大体決まるから
俺にとっては前者のほうが自然に感じるが
一方、振る舞いだけでデータも記述できるんだよな
抽象データ型とかは操作ありき、だし
object is a poor man's closure
closure is a poor man's object
0585デフォルトの名無しさん2010/02/18(木) 12:11:05
クロージャって要は関数オブジェクトみたいなもんでしょ?
0586デフォルトの名無しさん2010/02/18(木) 12:45:33
>>581
>delete の前のヌルチェックは要らないよ。

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

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

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

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

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

もう一度言う 文句あるなら自分で貼れ
0587デフォルトの名無しさん2010/02/18(木) 13:20:25
>プログラム上値が入っていたら消すんだよという意味を強調している
んなの強調して何の意味が。deleteなんだから消すに決まってる。
「値が入っていたら」はdeleteがやってくれる。
0588デフォルトの名無しさん2010/02/18(木) 13:24:06
delete null 規格上は許されてるよ。
でもまあ、nullチェックしたほうが自然だろな。
0589デフォルトの名無しさん2010/02/18(木) 13:29:38
そのnullチェックがそのコードで意味があってのことならやるが
機械的にチェックするだけ、という意味しかないのなら消すわ
0590デフォルトの名無しさん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);
}

・・・
0591デフォルトの名無しさん2010/02/18(木) 13:45:25
上の実装だと内部データ返せるから
dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。
そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが
ノーチェックで問題ないんかえ?
0592デフォルトの名無しさん2010/02/18(木) 13:47:07
は?NULLチェックするに決まってるだろ
んでdelete後にはNULL入れとけボケ
0593デフォルトの名無しさん2010/02/18(木) 13:53:36
俺は暗にあんたを擁護したんだが・・日本語勉強しる
0594デフォルトの名無しさん2010/02/18(木) 14:05:06
ID出ないと誰が誰だか分からない
まあとりあえずみんな落ちつけ
0595デフォルトの名無しさん2010/02/18(木) 14:06:13
なんでID無しなんだろうな
おかげで自演し放題だわ
0596デフォルトの名無しさん2010/02/18(木) 14:44:11
●持ちには隠しID丸見えだよ
自演はほどほどに
0597デフォルトの名無しさん2010/02/18(木) 14:54:03
あちゃー、このスレ全部俺だったのバレてたか
0598デフォルトの名無しさん2010/02/18(木) 14:58:48
いやいや、俺俺。
0599デフォルトの名無しさん2010/02/18(木) 15:11:47
>>591
「deleteしたらNULL入れる」だけで二重deleteは防げる。
NULLチェックしたって二重deleteは全く防げない。
0600デフォルトの名無しさん2010/02/18(木) 16:11:57
>>599
C++は規格票でもNULLより0が推奨されています
0601デフォルトの名無しさん2010/02/18(木) 16:35:47
もう>>498はいないだろうが
n行m列のvectorの二次元配列の確保で
vector<vector<int> > v(n,vector<int>(m));
こういう書き方って異端?
0602デフォルトの名無しさん2010/02/18(木) 16:55:40
>>601
別に
三次元の場合もその書き方でよく書いてるけど
0603デフォルトの名無しさん2010/02/18(木) 17:49:15
異端じゃないけど効率悪いよ
n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい

つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念
せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが
0604デフォルトの名無しさん2010/02/18(木) 19:27:19
>>602
なるほど、了解

>>603
>n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
直感的にはループの中で剰余と割り算でインデックス計算したりするほうが
遅くなるように思うけど
領域が連続でないことでそんなに遅くなるもん?
0605デフォルトの名無しさん2010/02/18(木) 19:30:37
>>604
連続でないってことは内部的に管理する仕組みが動いてるだろうから
インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ
0606デフォルトの名無しさん2010/02/18(木) 19:58:58
(n, m)のインデックス算出に剰余と割り算使うのか?
普通はかけ算と足し算だと思うが
0607デフォルトの名無しさん2010/02/18(木) 19:59:25
>>604
剰余も割り算も使わないよ
v[siz1 * idx2 + idx1]
乗算と和だけ
あとベクタのベクタはメモリに関するコストが増える
0608デフォルトの名無しさん2010/02/18(木) 20:01:36
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10537.c

クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz
0609デフォルトの名無しさん2010/02/18(木) 20:17:17
>>605-607
確かにorz
自分の勘違いも含めたベンチコード
http://codepad.org/FTA8SWtA
vectorにしたら結果が大きく変わるってことはないと思うんで
思ったほど差はない模様
0610デフォルトの名無しさん2010/02/18(木) 20:52:26
>>608
まずpartitionがうまく動いてるか調べてみたら?
06115692010/02/18(木) 22:35:34
>>571 レスありがとう.

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

ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して,
逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して
ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…
0612デフォルトの名無しさん2010/02/18(木) 23:01:17
#if defined(Q_WS_MAC)
何これ?
0613デフォルトの名無しさん2010/02/19(金) 00:34:01
#define TEST 5でマクロを定義し、char型の配列等に文字列TESTを代入すると、
"5"が判断されなくなってしまいます。
マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?
0614デフォルトの名無しさん2010/02/19(金) 00:53:02
こんな感じの??

http://codepad.org/M0mcikaJ ;
0615デフォルトの名無しさん2010/02/19(金) 00:54:44
何かエラー出るな。

ttp://codepad.org/M0mcikaJ
0616デフォルトの名無しさん2010/02/19(金) 01:02:39
#define TEST "5" じゃダメなん?
0617デフォルトの名無しさん2010/02/19(金) 01:07:15
>>616
まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv
0618デフォルトの名無しさん2010/02/19(金) 01:22:07
>>591
dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。
どうにもならない。
0619デフォルトの名無しさん2010/02/19(金) 01:24:05
>>599
二重deleteを防ぎたいなら「deleteしたらNULL入れる」なんてせずに、
auto_ptr/vectorをはじめとするRAIIスタイルのライブラリを使ったほうがいい。
無駄なNULL代入が減る分、効率も向上する可能性が高い。
0620デフォルトの名無しさん2010/02/19(金) 01:29:02
ご返答ありがとうございます。
試してみたけど駄目でした…

やりたいことは、
#define TEST 5
…
char * a = { "TEST" };
この変数aがどうやってもTESTという文字列でしか認識されず、5が出せないのです。
char型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?
06216202010/02/19(金) 01:37:42
型がLPCTSTRの所で変数aを入れてるのが原因かなぁ
0622デフォルトの名無しさん2010/02/19(金) 01:37:50
なんか>>616でいいような気がするが。。。
文字列を結合したいならそういう関数を使う。sprintfとか
0623デフォルトの名無しさん2010/02/19(金) 01:39:05
情報の後出しは基本的にご法度だぜ。。。
ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。
0624デフォルトの名無しさん2010/02/19(金) 01:39:47
む、LPCTSTR・・・・・とかhoge_sとか・・・

この辺の話はどうにかならんのかね・・・?
0625デフォルトの名無しさん2010/02/19(金) 02:00:42
>>620
文字列リテラルの中はマクロ展 されない。
06266202010/02/19(金) 02:01:49
char型の配列使わずにint型の配列にTESTを入れて処理を進められました('A`)
大変ありがとうございました
0627デフォルトの名無しさん2010/02/19(金) 02:05:03
#define TEST "5"
…
char * a = { TEST };

これでいいんでないの?
0628デフォルトの名無しさん2010/02/19(金) 02:05:12
お前それで良いのか
0629デフォルトの名無しさん2010/02/19(金) 02:06:09
おっと>>628は>>626向け
0630デフォルトの名無しさん2010/02/19(金) 02:06:37
>>586 http://codepad.org/eoOEH0RH
0631デフォルトの名無しさん2010/02/19(金) 02:11:36
>>620
#include "boost/preprocessor/stringize.hpp"

#define TEST 5
char const* a = BOOST_PP_STRINGIZE(TEST);
0632デフォルトの名無しさん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;
}
0633デフォルトの名無しさん2010/02/19(金) 02:23:19
>>610
なんかうちの環境が悪いだけでしたあざす
0634デフォルトの名無しさん2010/02/19(金) 02:29:21
>>630
これってstaticにする意味って何?
あおりじゃなくてただの素人です
0635デフォルトの名無しさん2010/02/19(金) 02:30:09
俺は文字列リテラル外すマクロが欲しい
0636デフォルトの名無しさん2010/02/19(金) 02:35:19
>>635
文字コードすべて暗記してint型の配列を確保してエンディアン考慮して
文字を16進数にでもして並べていけばリテラルいらないよ
0637デフォルトの名無しさん2010/02/19(金) 02:40:11
>>634
static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。
0638デフォルトの名無しさん2010/02/19(金) 02:44:40
リテラル嫌なら

int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);
0639デフォルトの名無しさん2010/02/19(金) 02:52:21
>>638
で、そう書く利点は?
0640デフォルトの名無しさん2010/02/19(金) 02:53:55
無いよ
リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ
0641デフォルトの名無しさん2010/02/19(金) 02:56:11
表示サンプルがhogeだったからまずかったのかね?
0642デフォルトの名無しさん2010/02/19(金) 03:05:36
>>637
private な static メンバ関数ってそういう目的があるんすね
ありがとうございます
0643デフォルトの名無しさん2010/02/19(金) 03:07:01
文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな
0644デフォルトの名無しさん2010/02/19(金) 03:10:34
>>643
いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・
0645デフォルトの名無しさん2010/02/19(金) 03:12:21
>>640
誰も嫌とはいってなくね?
0646デフォルトの名無しさん2010/02/19(金) 03:13:55
おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。
0647デフォルトの名無しさん2010/02/19(金) 03:15:07
vsくらいになるとsettingとかあるんだけどな
勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが
0648デフォルトの名無しさん2010/02/19(金) 03:24:32
文字列リテラル外部化って今でもできるんじゃね?
文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?
0649デフォルトの名無しさん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);
}
0650デフォルトの名無しさん2010/02/19(金) 07:29:54
メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか
std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが
0651デフォルトの名無しさん2010/02/19(金) 07:35:09
>環境化
環境下
0652デフォルトの名無しさん2010/02/19(金) 08:21:59
>>650
相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。
06536202010/02/19(金) 12:18:39
>>625
>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。

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

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

char * a = { STR(TEST) };
0655デフォルトの名無しさん2010/02/19(金) 14:33:32
↑すまん、外出
0656デフォルトの名無しさん2010/02/19(金) 18:37:56
中学生の割れ厨みつけちゃったよぉ
http://yutori7.2ch.net/test/read.cgi/news4vip/1266562555/
0657デフォルトの名無しさん2010/02/19(金) 22:42:43
演算子をオーバーロードする時は、
自分(インスタンス) 演算子 相手(インスタンス)
と書くことが文法で決まっているのですか?
0658デフォルトの名無しさん2010/02/19(金) 22:48:21
>>657
うん。
2項演算子だよね?

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

の間違い。
06606582010/02/19(金) 22:50:52
さらにいえば
operator = ( z, operator + ( x ,y ) );
と等価ってのも知ってる?
06616582010/02/19(金) 22:52:08
あ、ごめん、メンバ関数として定義している場合は別だ。
その場合は
z.operator=( x.operator+(y) );
となる。

0662デフォルトの名無しさん2010/02/19(金) 23:04:54
>>658
全くoperatorがわかりません
オーバーロードされた演算子を使う時は、std::cout << "hoge"みたいにな奴ばっかりなので
オーバーロードされた演算子を使う時は書かないとダメなのかな〜と思いました
>自分(インスタンス) 演算子 相手(インスタンス)
0663デフォルトの名無しさん2010/02/19(金) 23:12:29
explicit つけたら明示的に書かないとダメ
引数が明確に違ったら別に省略してもいけるはず
06646572010/02/19(金) 23:14:35
つまり、左側のインスタンスは絶対必要ってことで、おk?
06656582010/02/19(金) 23:17:55
>>662
君の聞いている意味が分かった気がする。

もしかして、
メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
関数によるoperatorの定義の区別が付いていないのでは?
0666デフォルトの名無しさん2010/02/19(金) 23:19:19
いや単項演算子のこと言ってるのかもよ
06676572010/02/19(金) 23:19:28
>>665
>メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
operatorが2種類あるなんて、まったく知りませんでした
06686582010/02/19(金) 23:19:58
まあメンバ関数によるoperatorの定義でも、
コンパイラが自動的に*thisを第1引数として渡しているので、
あながち
>左側のインスタンスは絶対必要
と言えなくもない。
06696582010/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)
{
//あーしろ、こーしろ
}



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

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

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

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

とりあえずこれを2回は読むこと!
0673デフォルトの名無しさん2010/02/19(金) 23:33:32
同一クラスとの二項演算は文法的に可換だからメンバだけ定義すればいい
他のクラスとの演算は非メンバじゃないと対称性が崩れてしまう
0674デフォルトの名無しさん2010/02/19(金) 23:36:01
>>658
まだわからない所があるので、少し調べてからまた質問します
ありがとうございました
0675デフォルトの名無しさん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 の付け方はやめたほうがいいんだろうか?
0676デフォルトの名無しさん2010/02/20(土) 16:12:38
そんな糞コードは今すぐ捨てろ
0677デフォルトの名無しさん2010/02/20(土) 16:16:07
ここまで来ると、あえて荒行か何かをしてるように見える。
0678デフォルトの名無しさん2010/02/20(土) 16:39:50
> 変更されないことを保証したい

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

変更されるのを禁止したいならクラス等でラップすればいいじゃん
0679デフォルトの名無しさん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;
}
0680デフォルトの名無しさん2010/02/20(土) 17:00:03
他の回避手段があるなら const_cast は使わない派なので、>679 のように初期化でやれよと思うけど、あるいは、

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

ってしといて、基本 cstrHoge, cstrFoo しか使わないとか。
0681デフォルトの名無しさん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;
}


こーゆーことって、していいの?
0682デフォルトの名無しさん2010/02/20(土) 17:00:37
>>675
ポインターなんか使わずに参照を使えばぬるぽのチェックは要らないのに
0683デフォルトの名無しさん2010/02/20(土) 17:04:11
>>681
OK
06846752010/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 がいらない場合もあるんですよ.パスを分解して全部ほしいとか,フォルダだけほしいとか…
0685デフォルトの名無しさん2010/02/20(土) 17:22:53
>>684
こんなクラス作って必要なのだけゲットすればポインタは無くせられる。
class PathDivider
{
public:
PathDivider(const string& OrginFileName);
string getFile()const;
string getPath()const;
string getFullPath()const;
};
0686デフォルトの名無しさん2010/02/20(土) 17:30:30
const 付けるために func_sub() 作るとか struct, class 増やすとか間違っている気がしないでもない…
あれ? const 外せば全部解決じゃね?
goto >>675
0687デフォルトの名無しさん2010/02/20(土) 17:33:11
constつけるためにって言うか、引数増えたら>>685みたいな
クラスつくるとかってパターンあるよね。
0688デフォルトの名無しさん2010/02/20(土) 17:35:41
const化のためにパス分解クラスを作ったとしても、パス分解は便利だから再利用できて問題ない。
てか、むしろ作ることを勧める。
0689デフォルトの名無しさん2010/02/20(土) 17:55:00
>>686
boost::tupleもあるよ
0690デフォルトの名無しさん2010/02/20(土) 18:32:30
structHOGE: public huga
{

};


こういう構造体があります。
これはhugaというクラスを継承した構造体ですか?
構造体が継承ってできるんでしたっけ?
0691デフォルトの名無しさん2010/02/20(土) 18:34:52
できる
0692デフォルトの名無しさん2010/02/20(土) 18:36:58
いつの頃からか構造体にもメンバー関数やら継承とかできるようになったようですね。
0693デフォルトの名無しさん2010/02/20(土) 18:38:32
>>692
最初からできてる。
0694デフォルトの名無しさん2010/02/20(土) 18:51:04
classとstructの違いってデフォルトがprivateかpublicくらいじゃないの?
0695デフォルトの名無しさん2010/02/20(土) 18:53:09
PODのクラスってあるんかな??
普通は構造体にすると思うけど。
0696デフォルトの名無しさん2010/02/20(土) 18:55:17
>>694
メンバ関数関連はどうだろう
一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ
0697デフォルトの名無しさん2010/02/20(土) 18:59:33
>>694
その通り
0698デフォルトの名無しさん2010/02/20(土) 19:01:02
template <class T>
とは書けるが
template <struct T>
とは書けないんだっけ?
0699デフォルトの名無しさん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
}
0700デフォルトの名無しさん2010/02/22(月) 01:12:31
Visual Studio 2008 Express を使っています
自作した関数のインテリセンスに関数の説明というかコメントも追加したいのですが
どうすればいでしょうか?
ヘッダファイルに書けばいいのでしょうか?
0701デフォルトの名無しさん2010/02/22(月) 07:07:06
関数の宣言のすぐ上にコメント書けば表示される
0702デフォルトの名無しさん2010/02/22(月) 07:09:51
インテリセンスが表示される関数でソースが公開されてるものを参考にする
0703デフォルトの名無しさん2010/02/22(月) 11:17:59
PODになりうるのはstructだけだよな
0704デフォルトの名無しさん2010/02/22(月) 13:46:38
これもPOD

class foo{
static std::string a;
void bar();
public:
std::string baz();
operator std::vector<char>();
};
0705デフォルトの名無しさん2010/02/22(月) 13:54:47
foo*を持たせるつもりだったけど抜けてしまった
これだから携帯は…
07067032010/02/22(月) 14:38:18
うそつきましたごめんなさい
0707デフォルトの名無しさん2010/02/22(月) 21:01:41
>>696
> メンバ関数関連はどうだろう
> 一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ
何を言っているんだ?
いったいどこの言語のお話?
0708デフォルトの名無しさん2010/02/22(月) 21:09:48
クラスと構造体の違いはデフォルトの可視性が非公開か公開かでしかない

さらにCとの互換性のある構造体をPODと言う
0709デフォルトの名無しさん2010/02/22(月) 21:14:00
>>708
>さらにCとの互換性のある構造体をPODと言う
違わないか
0710デフォルトの名無しさん2010/02/22(月) 21:45:24
structのほうは名前空間的な意味での違いもなかったっけ
普通の変数と名前がバッティングするかしないかとかそんなやつ

Cのstructとの違い、っだったかもしれんが
0711デフォルトの名無しさん2010/02/22(月) 21:51:20
>>710
C++では違いはprivate/publicをのぞき皆無だったと思いますんね。
0712デフォルトの名無しさん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.
0713デフォルトの名無しさん2010/02/22(月) 22:31:48
>>712
決定打ありがとうございます。
0714デフォルトの名無しさん2010/02/22(月) 22:36:40
質問です。

コンパイル環境に特定のヘッダファイルがあるかどうかをプリプロセッサで判定するにはどうしたらよいですか?

#if defined ( __windows_h__ )
 ・
 ・
 ・
#elif defined ( __unistd_h__ )
 ・
 ・
 ・
#endif

みたいに書けたらいいけど、必ず __xxx_h__ が設定されているって保証はありませんよね?
0715デフォルトの名無しさん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.
0716デフォルトの名無しさん2010/02/22(月) 22:58:34
>>714
ヘッダファイルがなかったらどうなるの
0717デフォルトの名無しさん2010/02/22(月) 23:03:52
>714
単独では無理。
強いて言えば configure とかを使う。
0718デフォルトの名無しさん2010/02/23(火) 07:08:25
ありがとうございました
0719デフォルトの名無しさん2010/02/23(火) 11:23:44
関数にstatic付けずにローカル変数にstatciつけると
関数はそれぞれ独立するけどローカル変数は共有されるって認識でおk?
つまりバグる?
0720デフォルトの名無しさん2010/02/23(火) 11:27:28
>>719
バグなのかどうかは自分の書くプログラム次第だろ
staticをつけることで自分の予期していない動作になるならバグだろうし
そうじゃなければ立派な仕様だよ
0721デフォルトの名無しさん2010/02/23(火) 11:29:35
>>719 NOT OK
関数のstaticはスコープの制限なので、
関数にstaticをつけようがつけまいが関数の実体は一つ。

(C++のメンバ関数の話なら、static は this が渡されるか否かの違い。)

07227192010/02/23(火) 11:57:52
実体一つなら同時アクセスしたら詰まないのか?
0723デフォルトの名無しさん2010/02/23(火) 11:59:37
>>722
関数内でstaticな領域持たなければ問題ないよ
07247192010/02/23(火) 12:03:58
マルチスレッド利用して
staticの変数持っている関数にアクセスすると問題ありって認識でおk?
0725デフォルトの名無しさん2010/02/23(火) 12:07:42
>>724
あるかもしれないし、ないかもしれない。

ひとつのスレッドの都合で読み書きしてるんならマズイだろうし、
スレッド間で情報を共有するつもりで static にしてるんなら、適切な同期さえ
入れてあれれば問題ないだろう。
0726デフォルトの名無しさん2010/02/23(火) 12:08:55
>>724
だから自分で想定した動作するならどう使おうが問題ないって
期待した動作しないなら駄目なんだって
0727デフォルトの名無しさん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) )
0728デフォルトの名無しさん2010/02/23(火) 12:11:29
>>727
何のサイズが欲しいの?
0729デフォルトの名無しさん2010/02/23(火) 12:13:10
>>727 template<std::size_t N> void sub( const char* const (&p)[N] )
0730デフォルトの名無しさん2010/02/23(火) 12:18:44
>>728
>>729

ありがとう
テンプレートってsugoiですね
0731デフォルトの名無しさん2010/02/23(火) 12:24:05
const char* p[]
const char* p
この違いをわかってないだろうなあ・・・
0732デフォルトの名無しさん2010/02/23(火) 12:46:40
>>724
MSのeraい人のお言葉だ
http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

あと"-fthreadsafe-statics"もぐぐっとけ
0733デフォルトの名無しさん2010/02/23(火) 12:53:22
まあなんというか情報処理の基本のような話だな
http://page.freett.com/cardno4/SelfStudy/1syu/IStady1Syu04_004.html
0734デフォルトの名無しさん2010/02/23(火) 13:37:48
テンプレート関係ねぇ〜
0735デフォルトの名無しさん2010/02/23(火) 14:02:38
関係ないことはないだろうが、テンプレートがすごいっていうよりか、
関数に渡すとサイズ情報が消える(ポインタに成り下がる)という C の
ルールがわかりにくいって話だろうね。
0736デフォルトの名無しさん2010/02/23(火) 14:06:21
>>735
成り下がるというかCなんてアセンブラで書いてらんねえという
のでできたような言語なのでそもそもそんな親切機能はないよ
最近のVM上で動くような言語だとVM側が管理してるので容易に
アクセスできるけどさ

あとC++のstd::stringあたりも一応持ってるのか
あれも実体はテンプレートじゃなかったっけ?
0737デフォルトの名無しさん2010/02/23(火) 14:09:55
>>736
何言ってんのかわけわからねぇ。

親切機能って何のこと?それはVMが管理することと関係あるの?
std::string が何を持ってるって?それはテンプレートであることと関係あるの?

まぁ初心者スレで適当なことフイてんじゃねーよ。
0738デフォルトの名無しさん2010/02/23(火) 14:15:05
サイズ情報の話だろ

頭大丈夫か?
0739デフォルトの名無しさん2010/02/23(火) 14:17:11
煽るほどの話かとは思うが、サイズ情報の話だとすればVMだとかテンプレートだとか関係ないな。
0740デフォルトの名無しさん2010/02/23(火) 14:30:40
まあまずは>>731の指摘した箇所を理解してからの話だな
0741デフォルトの名無しさん2010/02/23(火) 14:42:55
>>736
あちこちだめ。
0742デフォルトの名無しさん2010/02/23(火) 14:54:18
http://uproda.2ch-library.com/216146DUl/lib216146.png
これであってたっけ?
もう普段無意識で書いてるから間違ってたらごめん
0743デフォルトの名無しさん2010/02/23(火) 14:57:19
下の一段目は何だ
0744デフォルトの名無しさん2010/02/23(火) 15:03:16
const char* p[]だろ
その次がconst char* p
0745デフォルトの名無しさん2010/02/23(火) 15:04:42
配列を学び直せ
0746デフォルトの名無しさん2010/02/23(火) 15:08:57
>>745
どれにいってるのかわからん

でも左の箱が関数が貰う部分だろ?
0747デフォルトの名無しさん2010/02/23(火) 15:17:10
仮引数ではconst char** p
0748デフォルトの名無しさん2010/02/23(火) 15:25:26
>>742
配列は指し示すものじゃない
http://codepad.org/lua0iFiJ
0749デフォルトの名無しさん2010/02/23(火) 15:38:00
便乗質問いいですか?
char const **pp = &(char const *){"abc", "def", "ghi"};
これってメモリ配置としてみるとどうなってるんです?

>>742のような図で書くと・・・
0750デフォルトの名無しさん2010/02/23(火) 15:45:20
>>742の下の図が**だよ
0751デフォルトの名無しさん2010/02/23(火) 15:56:44
>>748
> char const **pp = &(char const *){"abc", "def", "ghi"};
これ規格上有りか? gccは警告出力する。
0752デフォルトの名無しさん2010/02/23(火) 16:00:30
>>751
警告を書けって
C99は有効にしたか?
0753デフォルトの名無しさん2010/02/23(火) 16:31:42
個人の趣味でツールやゲーム作りたくて、
HTMLとCSSくらいしか出来ないから土台作りからやろうと思ってJavaやってます

最終的にはC++で作りたいんだけど、
多少苦労してもちゃんと理解できるならそのままC++にいっていいんだろうか
0754デフォルトの名無しさん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)」ここの部分で素数と判別される構造がどうしても分かりません。
0755デフォルトの名無しさん2010/02/23(火) 16:48:52
>>753
学習そのものを面白がれる人なら、「まずは○○言語から」とかそういう順序は
まったく考えなくていいんだけどね。この辺はその人その人の性質次第。
頭の良し悪しもあまり関係ない、と思う。
0756デフォルトの名無しさん2010/02/23(火) 16:50:00
iは1ずつ増えていくわけだから
numに来たってことは
それまでのすべての数で割りきれなかったってこと
これって素数の定義でしょ
0757デフォルトの名無しさん2010/02/23(火) 16:54:35
else if((num%i)==0){
printf("%dは素数ではない\n",num);
break; /* これ重要 */
}

こういうことか?
0758デフォルトの名無しさん2010/02/23(火) 16:56:46
>>753
順番が違う気がする。普通、C言語から始めるもんじゃないのか。
0759デフォルトの名無しさん2010/02/23(火) 17:14:26
すみません、break;を入れ忘れていました。
例えばscanf("%d",&num);に8を入れたとして
for内にi<=numがあるからnum==8は真に。
この時点でどんな数を入れても真になるような気がして。
0760デフォルトの名無しさん2010/02/23(火) 17:15:09
breakしたら、真になるまえにforループは終わるよ
0761デフォルトの名無しさん2010/02/23(火) 17:25:24
トレース表作ってやった
どこでループが終わるか考慮しながら
num=7 と 8 で表を埋めてみろ

i | i<=num  | i==num | num%i==0
-+--------+-------+--------
2 |        |        |
3 |        |        |
4 |        |        |
5 |        |        |
6 |        |        |
7 |        |        |
8 |        |        |
0762デフォルトの名無しさん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の存在(ループそのものの存在)を忘れていました。
0763デフォルトの名無しさん2010/02/23(火) 17:59:15
>>761
返信おくれました、ありがとうございました。
こうやって表にしてみると考えやすいです。
またループで分からなくなったらこういった表を作って理論付けていきたいと思います。
ホント慣れないとダメですね…8を入れたんだからnum==8じゃないかと端から決め付けている自分がいたり。
みなさん本当に感謝です。
0764デフォルトの名無しさん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)')
0765デフォルトの名無しさん2010/02/23(火) 20:54:49
>>754
if(i>sqr(num)){
にするとループ回数が減らせられるね。
0766デフォルトの名無しさん2010/02/23(火) 20:57:31
>>765
それもそうだけど、毎回そうやって判定したいのならループの終了判定処理はいらなくね
0767デフォルトの名無しさん2010/02/23(火) 21:31:39
質問です。
環境はWindowsのVC++6.0です。
コンソールアプリを作っています。
子プロセスの処理終了後、親プロセスに子プロセスの終了と結果を返したいのですが、どうすればよいのでしょうか。
子プロセス生成後、親プロセスは別処理を行いたいため(子プロセスの終了をwaitしない)シグナルでプロセスの終了を検知しようとしたのですが、
SIGCHLDがVC++6では使えないとお聞きしました。
何か別の方法がありましたら、ご教授お願いいたします。
0768デフォルトの名無しさん2010/02/23(火) 21:42:57
「ご教授」っていう日本語の使い方があまりにも多くて、だんだん自然に見え始めた
0769デフォルトの名無しさん2010/02/23(火) 21:46:13
別スレッドで待つかGetExitCodeThread()がSTILL_ACTIVEを返す間何かやってれば
非同期シグナルなんぞやれてもやるもんじゃねえよ
0770デフォルトの名無しさん2010/02/23(火) 21:48:40
子の処理が完了して親を呼び出して結果渡すけど
親としてみると子の処理結果はそんなにどうでもいいものなの?
アプリ終了時にファイルに書き出すだけでいいとかその程度なのかな?
0771デフォルトの名無しさん2010/02/23(火) 22:07:09
>>769
別にスレッドを作成して、そこでwaitをするということでしょうか。

>>770
最良はこの処理が完了して、その結果を親に受け渡してそれを受けてまた処理を・・・ということなんですが、それが無理そうであればこの処理が完了した。
ということだけでも受け取りたいと思っています。
07727702010/02/23(火) 22:08:39
>>この処理

子プロセスの処理です。
すみません。
0773デフォルトの名無しさん2010/02/23(火) 22:24:13
>>772
・子プロセスを逐次処理するスレッドを作る
・メインで子プロセスを逐次処理し、他にやりたいことを別スレッドでやる
0774デフォルトの名無しさん2010/02/24(水) 00:27:20
C++学ぶのにいい本ありませんか?
0775デフォルトの名無しさん2010/02/24(水) 00:55:47
>>774 http://pc12.2ch.net/test/read.cgi/tech/1266070683/4-5
0776デフォルトの名無しさん2010/02/24(水) 03:40:27
>>772
WaitForSingleObject(handle, 0)
で待たないですぐ帰ってくるよ
0777デフォルトの名無しさん2010/02/24(水) 06:50:02
>>774
こいつはマルチポストだから相手にしないように!
07787702010/02/24(水) 08:00:24
>>773 >>776
ありがとうございます
試してみます
0779デフォルトの名無しさん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を有効にする、しないのようなオプションもあるにはあるのですが…。

分からないことだらけな上、長文ですが、ご意見よろしくお願いいたします。
0780デフォルトの名無しさん2010/02/24(水) 17:42:05
>>749
型おかしくない?
0781デフォルトの名無しさん2010/02/24(水) 17:53:38
>>779
32ビットx86向けならVC++だと/arch、gccだと-mfpmath/-marchのようなオプションを使わないとSSEとか勝手に使わない
だってSSEの無いCPUで動かないじゃん
同じ命令が実行されるなら別PCでも同じ結果だよ
0782デフォルトの名無しさん2010/02/24(水) 17:58:45
アルファベットの認識は
a <= z
とかでできるけど、日本語のひらがなカタカナ漢字はどうすりゃええの?
0783デフォルトの名無しさん2010/02/24(水) 17:59:16
>>781
レスありがとうございます。
「SSEとか勝手に使わない」という場合、それは「x87FPUを使う」という意味なのでしょうか?
それとも「x87FPUすら使わない」という意味なのでしょうか?

もし、素っ頓狂な質問してたらすいません。
0784デフォルトの名無しさん2010/02/24(水) 18:02:11
>>782
文字コードに合わせて範囲チェック
0785デフォルトの名無しさん2010/02/24(水) 18:15:10
正規表現でウ冠の漢字抽出とか出来たら素敵やん
と一瞬思いかけたけど、別に素敵でもなかった。
0786デフォルトの名無しさん2010/02/24(水) 18:19:39
使用する場面が思いつかないな
0787デフォルトの名無しさん2010/02/24(水) 18:26:40
>>786
誤字抽出に使えるかもしれん。
熟語でも片方の漢字でツクリを間違ってるとかが取り出せるかも。
ほんとどうでもいいけどな。
0788デフォルトの名無しさん2010/02/24(水) 18:35:17
>>783
x86向けでsoft-floatがデフォルトの処理系が有ったら知りたい
0789デフォルトの名無しさん2010/02/24(水) 19:16:01
漢字コードみつけてやってみたけど
亜の一バイトめがffffff88になるんだが
なんでじゃ
0790デフォルトの名無しさん2010/02/24(水) 19:17:47
>>788
普通にfloat変数を使っていれば、x87FPUが使われ、環境依存は受けない
ということですね。

ありがとうございました。
安心して自前演算ライブラリ作れます。
0791デフォルトの名無しさん2010/02/24(水) 19:17:49
>>787
そういうとこに浪漫を見つけるのがプログラマっぽいな
0792デフォルトの名無しさん2010/02/24(水) 19:18:20
>>789
符号付整数のまま char → int の拡張を行ってるから
unsigned char → int なら 0x088 になるよ
0793デフォルトの名無しさん2010/02/24(水) 19:20:45
>>792
ふはは
できおったわ

ありがとうございました。
0794デフォルトの名無しさん2010/02/25(木) 02:26:00
>>790
ところでそういう用途ならfloatよりdoubleのほうがよくない?
floatの精度ってコンパイラに依存したりするし。
0795デフォルトの名無しさん2010/02/25(木) 02:32:09
>>794
double でも環境依存なのは同じなんだけど、誤差が問題になりにくくなるってことだよね?
0796デフォルトの名無しさん2010/02/25(木) 09:26:42
D3Dのデフォ精度がfloatになってるんだから仕方がない
0797デフォルトの名無しさん2010/02/25(木) 10:58:09
>>794-796
求めているのは「同EXEを実行したときに環境依存にならないこと」です。
>>794さんのおっしゃるような「コンパイラ依存」であれば問題はありません。
0798デフォルトの名無しさん2010/02/25(木) 11:34:38
今時はieee 754だから環境依存は無い。x86のFPUは80ビットの拡張フォーマットを
使うけれど、SSE2の方が早いのでこっちを使う。64ビットなので環境依存は無い。
0799デフォルトの名無しさん2010/02/25(木) 11:44:18
32bit版のVC++ではFPUは53bit仮数モード(64bit整数)が標準。
つまり内部でも64bit仮数モード(temporary real)は使っていない。
0800デフォルトの名無しさん2010/02/25(木) 11:50:03
floatの場合もFPU内部では53bit仮数モードで動くのでその部分の過精度による誤差は発生する。
それが気になるなら/fp:strictを使うしかない。パフォーマンスが大きく落ちるけど。

> fast - "fast" 浮動小数点モデルです。結果の予測が困難になります
> precise - "precise" 浮動小数点モデルです。結果は予測可能です
> strict - "strict" 浮動小数点モデルです (/fp:except を暗示)
0801デフォルトの名無しさん2010/02/25(木) 11:58:06
>>799 (64bit整数) は 実数 の間違い。

64bitWindows用のVC++では関数の呼び出しや戻値の規約で
実数はXMMレジスタを使うことになってる。
で関数の中の計算はFPU使っててワロス(オプションで変わるけど)
0802デフォルトの名無しさん2010/02/25(木) 12:11:01
>>779
アセンブリ出力見て、各命令の仕様を調べればいいんじゃないの?

CPU 命令の動作として環境ごとに動作を振り分けるようなことは無いと思うんだけどね。
0803デフォルトの名無しさん2010/02/25(木) 12:38:56
>>799
FPU制御ワードで、単精度(24)、倍精度(53)、拡張精度(64)選べるな。
それじゃ、誤差が処理系に依存というのも正しく使えば避けられると
いう結論。
0804デフォルトの名無しさん2010/02/25(木) 13:10:08
>>798
すいません。Pen4時代くらいまではサポートしたいので、今どきで統一するわけには(需要の関係で)

>>799-801
計算誤差自体はあまり問題ありません。
環境によって計算誤差の誤差量が異なるのならダメですが、そういうわけではないですよね?

>>802
D3DXが、環境ごとに動作を振り分けていました。
ただこれは、D3DX自体が「そういう機能を持っている」のだと思います。
思いますが、あくまで自分の推測でしかなかったので

float計算ってそもそも環境によって勝手にSSEやらSSE2やら3DNow!やらが使われちゃったりするのかな?

という疑問が晴れなかったのです

>>803
_controlfp_s とかでしょうか?
これで例えば単精度を設定すれば、どこの環境でもfloat計算は同じ結果になるのでしょうか?
というか、逆にやらないと結果が異なるのでしょうか?

余談ですが、Direct3Dを一般的な方法で初期化すると、floatは単精度(24bit)になるようです。
そもそも描画が目的なので、精度は荒くても良いとう考え方なんでしょうね。
0805デフォルトの名無しさん2010/02/25(木) 13:12:14
環境に関係なく動くコードにしちゃったほうがいいんじゃないの?
何をやるところでそういう環境依存の影響がでてるのやら
0806デフォルトの名無しさん2010/02/25(木) 13:19:42
>>805
すいません。話を整理しますと

「3Dの行列演算など」をD3DXというMicrosoftのライブラリで行うと、環境によって結果に差がでてしまうのです。
これは、D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
(SSE使ったり、3DNow!使ったり)

描画だけであればそれでいいのですが、ゲームの当たり判定などのロジック部分でも使っていると、
通信対戦やリプレイファイルの再生などで差がでてしまいます。

では、自前でライブラリ作ろう。という話になったのですが、3Dゲームが作れようがCPUの仕組みなどについてはド素人。
「float の単純な掛け算とか足し算は、まさか環境によって差が出たりしないよな?まさかな?」
という不安がぬぐえず、相談しに来ました。

現状のところ問題はなさそうなのかな。といった感じですが…。

今まで分かったと思っていることは
・SSEやSSE2を使う場合、コンパイルオプションをいじったり、インラインアセンブラなどを使う必要がある
・つまり、そうしなければSSE2などは使われない
・そうするとデフォのx87FPUが使われる
・x87FPUは古くからあり、Windows環境で使えない環境はもはや無い。また、環境によって計算結果が変わることもない

ツッコミどころあれば、よろしくお願いします。
0807デフォルトの名無しさん2010/02/25(木) 13:43:20
>>806
そこまで気になるならソフト書いてログを取ればいいんじゃないの?
試したい判定処理とかを数フレーム分行うようなロジック書いて
各フレームごとの計算結果を出力して送ってもらうとか

でexeばら撒いて結果集めればいいだけのような気もするし
0808デフォルトの名無しさん2010/02/25(木) 14:03:49
キー操作だけでなく差が出たら困る主要な情報も一緒に通信・リプレイデータに押し込んで補正しながら再生すればいいんじゃない
0809デフォルトの名無しさん2010/02/25(木) 14:13:25
>>807
お前、見ず知らずの人間がテストと称してばらまいたexeを実行してやるのか?
0810デフォルトの名無しさん2010/02/25(木) 14:21:24
喧嘩はすんな
しかし質問者の意図と離れて、場当たり的な解決方法を提示するのはいかがなもんだ?
どうやら3Dゲーム自体を作る能力はあるようだし、場当たり的解決法は言われなくてもできる人間だろ
0811デフォルトの名無しさん2010/02/25(木) 14:39:31
つか、そんなに統一した精度が必要なら
必要になった時に1/1000なりして整数型から落とし込めば良くね?
使いたくないのはdirectxのベクトル計算くらいだろうし
0812デフォルトの名無しさん2010/02/25(木) 14:41:53
代替案を勝手に出してる連中は、統一動作が不可能だと確信してるってことだよな?
ソースを出してくれんか
0813デフォルトの名無しさん2010/02/25(木) 14:44:42
>>812
不可能かどうかもわからんからデータ集めろといったんだが

同じテストプログラムをいろんな環境で動かしてその際の数字を比べれば一目両全だろう

上でやった話は規格をあわせてるから「たぶん」同じのはず・・・ということだろ?
0814デフォルトの名無しさん2010/02/25(木) 14:48:37
不可能かどうかわからないからここに聞きにきているのであって、
答えられない人間が「データ集めろ」というのは筋違いすぎると思うんだが

データ集めて確認する気とできる環境ががありゃ、聞くまでもなくチェックするだろJK
0815デフォルトの名無しさん2010/02/25(木) 14:52:27
じゃああきらめろ
0816デフォルトの名無しさん2010/02/25(木) 14:53:39
小数点以下の計算アルゴリズムを統一させたいんだろ
ゲームならそこまで精密にしなくていいし
0817デフォルトの名無しさん2010/02/25(木) 14:58:54
んなこといったらFPSすら厳密に統一できないことになるわ
0818デフォルトの名無しさん2010/02/25(木) 15:00:53
なんで質問者不在でそんなに話脱線させまくるん?
0819デフォルトの名無しさん2010/02/25(木) 15:05:01
データ集めて誤差がないよならそれでOK
あるならどれくらいの誤差がでるかでどうごまかすかを考えればいいだけだろ
データが無いのにあれこれ考えたって始まるわけがない
0820デフォルトの名無しさん2010/02/25(木) 15:11:46
FPUの仕様、もしくはコンパイラの互換性についての仕様を知っている人が答えればいいだけの話。
何も知らずに騒ぐだけの人は、親切しているつもりかもしれんけど脱線させてるだけだよ
0821デフォルトの名無しさん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);
0822デフォルトの名無しさん2010/02/25(木) 15:36:36
> SSE使ったり、3DNow!使ったり
SSE使う時と3DNow!使う時の動作の違いに関して説明出来なきゃダメ。
「わからないけど、ライブラリ作り直してみよう」なんてのは徒労に
終わる可能性大。
0823デフォルトの名無しさん2010/02/25(木) 16:20:38
>>822
お前なんの話してんの?(苦笑)
0824デフォルトの名無しさん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();
}
0825デフォルトの名無しさん2010/02/25(木) 16:25:28
>>824
え、デフォルトって_set_SSE2_enableが1の状態だっけ?
0826デフォルトの名無しさん2010/02/25(木) 16:29:11
http://msdn.microsoft.com/library/bthd138d
SSE2 の実装を有効にする場合は 1。SSE2 の実装を無効にする場合は 0。既定では、SSE2 の実装をサポートするプロセッサでは有効になっています。
0827デフォルトの名無しさん2010/02/25(木) 16:36:36
横からちょっとすまん
>>826
その言い回しって、つまりどういうこと?
SSE2がある実行環境なら、勝手にSSE2が使われるってこと?算術関数の中で。

プロセッサって実行環境側の話だよね?
0828デフォルトの名無しさん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");
}
0829デフォルトの名無しさん2010/02/25(木) 16:42:46
SSE2のスカラ演算はFPUと比べて速くはなかったと思うけどどうなんだろ。
今のところ自動ベクトル化をサポートしてるのはインテルのコンパイラくらいかな。
0830デフォルトの名無しさん2010/02/25(木) 16:43:04
>>824
doubleの有効桁は15,6しか無いんだから不思議じゃ無い。
0831デフォルトの名無しさん2010/02/25(木) 16:52:43
>>830
流れ嫁
0832デフォルトの名無しさん2010/02/25(木) 17:13:01
FYL2Xを使ってるな。このあたりで過精度になるんかな。
0833デフォルトの名無しさん2010/02/25(木) 18:01:59
>>824
これについては「SSE2が使える環境同士」なら互換性はありそうだな。
まあ怖ければ無効にしておくのも手か。

結局のところ(俺も気にしたことなかったので知らんのだが)
普通にfloatの計算を書く限りは、全部x87で動作するみたいね?
0834デフォルトの名無しさん2010/02/25(木) 18:16:53
SSE2が無いx86CPUなんて無くなってしまえばいいのに
0835デフォルトの名無しさん2010/02/25(木) 18:18:57
Pentium寄り古い486SXとかだとFPUが無いので、FPU使う/使わないなコンパイルオプションもあるんじゃ?
0836デフォルトの名無しさん2010/02/25(木) 18:21:06
>>835
そこまでくるとそもそもバス帯域から整数演算能力までバランス取れてないよ
0837デフォルトの名無しさん2010/02/25(木) 18:36:56
Win32以降はx87のエミュレーションはOS側で面倒を見てたはずだから、
コンパイラはx87のコードを生成して問題ない。
0838デフォルトの名無しさん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番目の
要素をイテレータで指定する方法が分かりません…
0839デフォルトの名無しさん2010/02/25(木) 18:57:02
>>837のソース
http://support.microsoft.com/kb/102555/en
0840デフォルトの名無しさん2010/02/25(木) 19:20:30
>>838
v.begin() + 2
0841デフォルトの名無しさん2010/02/25(木) 19:28:27
>>840
begin()に整数足せたんですか… てっきりエラーになると思っていました。
お蔭様でうまくいきました。ありがとうございます。
0842デフォルトの名無しさん2010/02/25(木) 19:31:01
>>838
find_ifで探す
0843デフォルトの名無しさん2010/02/25(木) 19:40:28
>>841
蛇足だけど、+ 使えるのは random access iterator の時だけなんで、list の時なんかは無理。
一応、std::advance ってのがある。
0844デフォルトの名無しさん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() );
0845デフォルトの名無しさん2010/02/25(木) 19:52:32
なんでダメなんだろうな
整数足したら内部でadvanceしてくれてもいいじゃんって思う
0846デフォルトの名無しさん2010/02/25(木) 19:59:43
>>845
パフォーマンスがガタ落ちしてることに気づかない人が出るから
0847デフォルトの名無しさん2010/02/25(木) 20:10:26
それは気づかないひとが勉強不足だから悪いって話じゃね?
0848デフォルトの名無しさん2010/02/25(木) 21:27:10
直接 std::list<>を使ってれば解るけど、間接的に使われてた場合やオリジナルのコンテナだとわからないし。
0849デフォルトの名無しさん2010/02/25(木) 21:30:50
キャストみたいに推奨されない使い方をする際は使いにくいデザインにってやつじゃないかね
0850デフォルトの名無しさん2010/02/25(木) 22:43:54
>>806
> D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
これは、D3DXの実装として、そのような動作を組み込んでいるからだということが分かれば後は分かりそうなもんだけど
0851デフォルトの名無しさん2010/02/25(木) 22:45:22
>850
3DXの内部がやるように、SSE2を使う!とか明示的にしない限り、x87だってこと?
でも算術演算系が実は勝手にSSE2使ったりとか、結構色々あるね
FLOAT使って環境誤差無しってのは超難しいのかしら
0852デフォルトの名無しさん2010/02/25(木) 22:48:52
>>851
それってmsvcrtをスタティックリンクにしても環境依存しちゃうの?
そうなら俺無知でごめん
0853デフォルトの名無しさん2010/02/25(木) 22:50:05
ライブラリの中で使われてたら対応できないね。
全てソースで入手可能でコンパイルできるなら、/fp:strictで大丈夫なんだけど。
0854デフォルトの名無しさん2010/02/25(木) 22:52:42
そなんだ。。結構根が深いのね。
ちなみにだけど、>>804のいう、Pen4時代ってSSE2標準搭載だよね
AMDがどうなのかとか、むしろいまどきのatomとかでどうなるのか分からないから結局アレだけども。。
0855デフォルトの名無しさん2010/02/25(木) 22:58:34
>>824
SSE2が使えない環境でそれは動くのか?という。
0856デフォルトの名無しさん2010/02/25(木) 23:04:15
ランタイムの中は
if(__sse2_available)
{
}
else
{
}
的になってる
用意してくれたものなら動くかどうかの心配はいらない
0857デフォルトの名無しさん2010/02/25(木) 23:20:08
>>856
それなら_set_SSE2_enableって何のために使うの?
0858デフォルトの名無しさん2010/02/25(木) 23:21:29
自己レス
if(__sse2_enable && __sse2_available)
{
}
else
{
}
ってな感じになってるってことかな?
0859デフォルトの名無しさん2010/02/25(木) 23:23:59
浮動小数点の問題って根が深いんですね
同じプログラムが、環境によって結果が変わるなんて考えたこともなかったです
0860デフォルトの名無しさん2010/02/25(木) 23:37:10
そういえばjavaにはstrictfpなるキーワードがあった。
0861デフォルトの名無しさん2010/02/25(木) 23:39:48
>>857
VC10RCだとこんな感じ
int _set_SSE2_enable(int flag)
{
return __sse2_available = !!flag & IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)
}

実際にはIsProcessorFeaturePresentの結果はまた別の変数に保存して有るけどな
0862デフォルトの名無しさん2010/02/25(木) 23:39:58
>>857
_set_SSE2_enable(0)はSSE2が使えるCPUでFPUを使いたい場合に指定する。
SSE2のない場合に1にしようとしてもエラーになるはず。
0863デフォルトの名無しさん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?
0864デフォルトの名無しさん2010/02/25(木) 23:58:40
> ってことはさ、SSE2が使えるCPUではデフォで_set_SSE2_enableが1となっているわけだから、
ここ余計でした。
0865デフォルトの名無しさん2010/02/26(金) 00:41:11
SSE2が使えるかの返り値を返す関数との積を取るのになぜそういう疑問が出る
0866デフォルトの名無しさん2010/02/26(金) 01:44:43
#include <iostream>
#include <cstddef>

main()
{
char* s = NULL;
char* p = s;

std::cout << p;
}

を実行すると出力のところでエラーが出て強制終了するのですがなぜでしょう
0867デフォルトの名無しさん2010/02/26(金) 01:46:49
だってNULLだし
0868デフォルトの名無しさん2010/02/26(金) 01:48:33
コンパイラのバグです
0869デフォルトの名無しさん2010/02/26(金) 01:48:39
>>867
char*をint*にすると0000000が出力されるのですが・・・
0870デフォルトの名無しさん2010/02/26(金) 01:50:04
>>869
NULLを0とする環境?だかコンパイラってことでしょ
0871デフォルトの名無しさん2010/02/26(金) 01:50:11
>>866
cout は char* を受け取ったら
もしかして文字列なんじゃね?
と判断してメモリの内容を読もうとするから
0872デフォルトの名無しさん2010/02/26(金) 01:51:51
char* s = "hoge";
とかかけるからなあ

まあcの構文が分かりにくいってのもあるんだろうな
08738662010/02/26(金) 02:04:57
すみませんいまいち理解できないのですが、
int*の場合はアドレスとして解釈されており、
char*の場合はたとえ文字列として解釈されても
NULL文字を出力すること自体に問題はない気がするのですが
0874デフォルトの名無しさん2010/02/26(金) 02:07:34
>>873
NULL と NUL文字 は全く関係ないよ
0875デフォルトの名無しさん2010/02/26(金) 02:08:09
ポインターの中を出力なら
std::cout << &p;
std::cout << *p;
あれどっちだっけ?w
0876デフォルトの名無しさん2010/02/26(金) 02:15:08
>>873
まあどっちもアドレスなんだけど数値と文字じゃあ扱いが違うからねえ
intの場合だと今もっとも多いので4バイトか
charの場合\0がでるまでひたすら読み込もうとするからねえ

それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ
0877デフォルトの名無しさん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ではエラーが出る」これがダウトなんかね
0878デフォルトの名無しさん2010/02/26(金) 02:32:43
>>874
そうでしたか。ありがとうございます。

>>876
「charの場合\0がでるまでひたすら読み込もうとする」ことが上記のエラーとどう関連しているのかわからないのですが・・・
それと、「触れない」というのは触ることができない、という意味でしょうか。それとも目にすることがない、という意味でしょうか。
0879デフォルトの名無しさん2010/02/26(金) 02:58:14
>>842-844
〜if等の条件指定もできるんですね。
イテレータのことはあまり知らないので勉強します
ありがとうございました。
0880デフォルトの名無しさん2010/02/26(金) 03:02:56
char *s = "hogehoge"; // "hogehoge"という文字列を格納したアドレスを指すポインタ
char *s = NULL; // 0番アドレスを指すポインタ(NUL文字を格納したアドレスでは無い)
0881デフォルトの名無しさん2010/02/26(金) 03:25:58
>>880
その0番アドレスがcoutで出力されないのはどうしてなのでしょう
0882デフォルトの名無しさん2010/02/26(金) 03:36:17
operator<<がそういうふうにオーバーロードされてるから
0883デフォルトの名無しさん2010/02/26(金) 03:52:20
>>881
アクセス出来ないように保護されてるから。
それが>>876の言う
>それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ
08848662010/02/26(金) 04:02:08
なるほど。疑問が氷解しました。
理解力に乏しく何度も質問してしまいましたが、見捨てずに答えてくださった皆さんありがとうございます。
0885デフォルトの名無しさん2010/02/26(金) 04:07:20
>>883
それはアクセス違反で落ちるはずだが
0886デフォルトの名無しさん2010/02/26(金) 04:27:04
だから>>866はそう言ってるじゃない。強制終了するって。
0887デフォルトの名無しさん2010/02/26(金) 06:00:08
アドレス0x00000000ってwindowsマシンだとBIOSのハードウェア割り込みの0番が
予約してたりするんじゃないかな?
ユーザーが使えるのはメモリ空間のうち真ん中くらいで0x0000000とか0xFFFFFFFF付近なんて
システム予約で一般的なプログラムはほぼ触れない領域になってるはず

だからこそ何もセットされてないという意味のNULLに0x00000000だったりするんだけどね
0888デフォルトの名無しさん2010/02/26(金) 07:19:16
> windowsマシン
ここいらへんに素人臭を感じる。
0889デフォルトの名無しさん2010/02/26(金) 07:24:51
>>888
PC9801やPC/AT互換機とか言ってもわからねーだろ
DOS時代にすでに予約されててそのまま来ちゃってるのは知ってるよ
インタラプトいじってたんだし
0890デフォルトの名無しさん2010/02/26(金) 07:27:40
わかって無い事はわかったから、もう引っ込んでていいよ。
0891デフォルトの名無しさん2010/02/26(金) 07:32:17
分かった風な俺すげーな人が朝から常駐するスレはここですか?
0892デフォルトの名無しさん2010/02/26(金) 08:00:11
ヒント:論理アドレス
0893デフォルトの名無しさん2010/02/26(金) 08:33:11
いいえ、わかっていない素人がわかったつもりで蘊蓄を語るスレです。
0894デフォルトの名無しさん2010/02/26(金) 09:07:28
std::vector<int> A;
A.resize(2);
ってやるとA[0],A[1]が確保されるの?
A[2]までは確保されないよね?
0895デフォルトの名無しさん2010/02/26(金) 10:22:19
>>894 それであってる。
0896デフォルトの名無しさん2010/02/26(金) 12:25:50
>>887
NULL = (void *)0 が実アドレスでも 0 であるとはかぎらない。
0897デフォルトの名無しさん2010/02/26(金) 12:32:11
http://www.kouno.jp/home/c_faq/c5.html
以降ヌルポインタの実装に関わる話は無しでおねがいします。
0898デフォルトの名無しさん2010/02/26(金) 12:32:50
>>894
end()の関係で値返さないとならないので、物理的には[2]も確保されている。
但し使用してはいけない。
0899デフォルトの名無しさん2010/02/26(金) 12:40:08
>>898 ねーよ。
0900デフォルトの名無しさん2010/02/26(金) 12:45:49
>>898
それはない。
0901デフォルトの名無しさん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で行われるようになる。

のでしょうか?
0902デフォルトの名無しさん2010/02/26(金) 13:29:54
すいません。質問がおかしかったです。
>>901は忘れてください。
SSE2のほうが高速だったらって書いてありました
0903デフォルトの名無しさん2010/02/26(金) 15:09:58
>>898
resize(2) なら size() は 2 を返すだろうが
capacity() が 2 かどうかは判らない。大抵は 2 だろうけども。
0904デフォルトの名無しさん2010/02/26(金) 17:08:07
最近話題になっている浮動小数点の話について。
SSEやらSSE2を使うためには
・アセンブラ、インラインアセンブラで書く
・コンパイルオプションでSSEやSSE2を指定する(ただし、SSEを指定した場合、SSEが無い環境では動作しなくなる。SSE2も同様)

という明示的な方法が必要なもよう。
つまり、単なるfloat計算をして、デフォのコンパイル設定でコンパイルしている限りはSSEなどが使われることはない。

D3DXが内部できちんと使い分けてくれるのは、D3DXがそのようにきっちり実装されているからということですね。

よって
「D3DXを使わないで、自前のfloat計算ライブラリを使えば、環境依存によるバグは発生しない」
と言えるのではなかろうか。

それとは別に、 _set_SSE2_enableを適切に使っておかないと、SSE2がある環境と無い環境で、atanなどの結果が異なってしまうと思われ?
0905デフォルトの名無しさん2010/02/26(金) 17:53:06
x64環境ではSSE/SSE2が基本になることを考えると
今新規で書き下ろすなら誤差が出ても問題ないつくりにするべきだとは思う
0906デフォルトの名無しさん2010/02/26(金) 18:12:43
誤差がでても問題ない作りで作ることが、どれだけハイコストだかわかっててそう言ってるの?

通信対戦で自分の情報を送るとか、チートしてくださいと叫んでるようなもんだし
サーバーで一元処理するのは高負担

互換性が確保できればそれにこしたことない。
0907デフォルトの名無しさん2010/02/26(金) 18:13:31
x87用コンパイルで、全てSSE/SSE2を使うようにさせることってできないのかね?
0908デフォルトの名無しさん2010/02/26(金) 18:21:53
ハイコストだわな
全てのキャラの位置、向いている方向、色々なパラメータ、全ての弾の位置
通信で送りあったらたまったもんじゃないし、書き換えもあるだろうしきついね
0909デフォルトの名無しさん2010/02/26(金) 18:36:52
いやいや、そこの話じゃないでしょう
0910デフォルトの名無しさん2010/02/26(金) 18:43:59
だからこそ「今新規で書き下ろすなら」って付けたつもりだったし
浮動小数精度で誤差が出ても同じ結果が得られるような実装なら通信時も問題ないと思う

まあ限定された環境内で互換性が確保できればなんでもいいんだけど
0911デフォルトの名無しさん2010/02/26(金) 18:50:54
>>910
ちょっとスレの趣旨とは離れちゃうけど「浮動小数点で誤差が出ても同じ結果が得られる実装」なんてのが
手軽に実装できるなら、そもそも浮動小数点を(描画以外で)使わないだろって話かと。
0912デフォルトの名無しさん2010/02/26(金) 18:58:24
楽するために浮動小数点を使っている(固定小数点使うよりは楽だろ?)のに、互換保証機能とかに労力かけたら本末転倒かと
0913デフォルトの名無しさん2010/02/26(金) 19:09:11
それが問題になるなら過去にどこかで議論されてるだろうし、すでに解決されてる可能性が高い
議論された形跡がどこにも見つからないならそれは取るに足らない問題で
議論されていたにも関わらず解決されていない問題ならこんなところでグダグダしてる連中には手に余る問題ということだ
0914デフォルトの名無しさん2010/02/26(金) 19:22:28
いや、浮動小数点問題は昔から何度か話題にはあがってるよ
あと「こんなところでグダグダしてる連中」とか言うな
何度ここの「連中」に良くしてもらったことか・・・
0915デフォルトの名無しさん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);
}
0916デフォルトの名無しさん2010/02/26(金) 20:05:56
>>915
横レスだが、最初のpowはコンパイラがSSEを使うようになっていない限りx87だから80bitの拡張倍精度で64bitの精度がある。

MicrosoftのコンパイラはSSEを明示的に指示しなければ使わないし、
IntelのコンパイラはSSE/SSE2より前の世代を切り捨てたので
明示的に指示しない限りSSE/SSE2を使う。
0917デフォルトの名無しさん2010/02/26(金) 20:14:31
>>915
最適化してないからメモリへの書き出し時の丸めが起きてる

>>916
それは自分でコンパイルするコードの場合だろう
_set_SSE2_enableのページに挙げられてる関数は両実装なんだってば
09189162010/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などを利用する。
0919デフォルトの名無しさん2010/02/26(金) 22:58:34
デフォルト引数って、void func (int n = GetDefaultNumber());
みたいに関数でもいいですか
0920デフォルトの名無しさん2010/02/26(金) 23:04:21
>>919 いいですよ。
0921デフォルトの名無しさん2010/02/26(金) 23:09:08
ありがとうございます。ずっと定数のみだと思い込んでました。
0922デフォルトの名無しさん2010/02/26(金) 23:56:23
>>919
関係ないが、その柔軟な発想がうらやましい。
http://codepad.org/CZPjKZS9
0923デフォルトの名無しさん2010/02/27(土) 00:29:12
おもしれーな
ttp://codepad.org/NYifDLmF
0924デフォルトの名無しさん2010/02/27(土) 01:07:46

ttp://codepad.org/Y9ftRqxS

関数ポインタにいれてデフォルト引数を適用したい場合はどうやるの?
無理なの?
0925デフォルトの名無しさん2010/02/27(土) 01:10:04
どこが柔軟なんだろうか
0926デフォルトの名無しさん2010/02/27(土) 01:38:48
>>924
デフォルト引数を暗黙に受け渡す方法がないので、明示的に渡さないといけないが、
それでよければこんな方法はどうか。
ttp://codepad.org/zMjARsjk
0927デフォルトの名無しさん2010/02/27(土) 01:43:30
bind使えよ
0928デフォルトの名無しさん2010/02/27(土) 01:50:24
迷走してきたな
0929デフォルトの名無しさん2010/02/27(土) 02:28:58
届かないメッセージ 不可視なラビリンス
0930デフォルトの名無しさん2010/02/27(土) 05:39:17
迷走bind
0931デフォルトの名無しさん2010/02/27(土) 17:26:42
C++の開発環境はみなさんどれを使ってるんでしょうか
0932デフォルトの名無しさん2010/02/27(土) 17:28:10
Bcc使ってた
今VC++
0933デフォルトの名無しさん2010/02/27(土) 17:31:02
おれもVC++というかVC++以外使ったことない。
0934デフォルトの名無しさん2010/02/27(土) 17:31:58
VC++だけで通ればいいやと思ってる
0935デフォルトの名無しさん2010/02/27(土) 17:46:04
VC++とg++
0936デフォルトの名無しさん2010/02/27(土) 17:48:47
bcc32 の日本語エラーを重宝していますが。
0937デフォルトの名無しさん2010/02/27(土) 17:53:48
cxx
0938デフォルトの名無しさん2010/02/27(土) 19:21:09
VC++, g++かな。
Comeau C++はいつか買いたい。
それ以外はなぁ。。。
0939デフォルトの名無しさん2010/02/27(土) 19:54:36
VC++2008EEでC++0xで遊びたいときはGCCかな
0940デフォルトの名無しさん2010/02/28(日) 08:32:27
低スペッコマシンで動くvc++6.0とg++は最高っすね。
0941デフォルトの名無しさん2010/02/28(日) 10:03:54
int n= (1>=0);
こうやった時にnが1になるのは実装依存ですか?
0942デフォルトの名無しさん2010/02/28(日) 10:33:05
>>941 いいえ、規格で定められた動作です。
0943デフォルトの名無しさん2010/02/28(日) 10:54:33
>>942 ありがとうございます
0944デフォルトの名無しさん2010/02/28(日) 12:11:45
「0以外になる」じゃなくて「1になる」って規格で決まってたのか
0945デフォルトの名無しさん2010/02/28(日) 12:16:27
今までC#をやっていてC++をはじめたんですが
C++のヘッダファイルとソースファイルに分けるのが面倒(というか慣れてない)ので
ヘッダファイルのクラス定義の中で(C#みたいに)実装もしちゃおうと思ってるんですが(慣れるまで)
注意すべき落とし穴とか教えてください
0946デフォルトの名無しさん2010/02/28(日) 12:17:39
>>945
書き忘れました
環境はMinGW+EclipseCDTです
0947デフォルトの名無しさん2010/02/28(日) 12:28:38
修正する度にコンパイル時間がかかる。
0948デフォルトの名無しさん2010/02/28(日) 12:33:12
クラスに直接実装すると、暗黙的にinlineが付く
そのため量が多いコードを書いて
それが多数の箇所で引用されるようなら
無駄にインライン展開された分のオーバーヘッドがかかる
0949デフォルトの名無しさん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.
0950デフォルトの名無しさん2010/02/28(日) 12:46:39
>>945
実装を分けて書くのになれると、C#は実装を別けられなくて不便だって思うようになるよ。
0951デフォルトの名無しさん2010/02/28(日) 12:51:20
>>950
それはないだろ…分けたけりゃinterface使えばいいだけ
0952デフォルトの名無しさん2010/02/28(日) 12:57:01
ttp://chadaustin.me/cppinterface.html
これ読むと脱力するなあ
クラスをインタフェース、ファクトリ、実装に分割する
インタフェースではPOD以外の型や例外を使えない
多分不便すぎるから、さらにstaticリンクやヘッダオンリーのラッパーも書くんだろう
手間かかりすぎだ
0953デフォルトの名無しさん2010/02/28(日) 12:59:57
>>947,948,950
レスありがとう
とりあえず(学習レベルでは)致命的な問題が生じることを意識せずに
書いても大丈夫そうですね
0954デフォルトの名無しさん2010/02/28(日) 14:01:22
>>952
virtualってバイナリ互換性ないんじゃなかったっけ?
0955デフォルトの名無しさん2010/02/28(日) 14:06:10
>>954
その文書では、Windows環境でかつ、COMが使える(つまりvtblのレイアウトに
関してはCOMとABI互換性がある)コンパイラに関することが書いてあるから、
完全な一般論ではないはず
0956デフォルトの名無しさん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:\にもどすにはどうすればいいんでしょうか。
0957デフォルトの名無しさん2010/02/28(日) 15:18:36
その前にリテラルにstrcatするな。
0958デフォルトの名無しさん2010/02/28(日) 15:18:40
>>956
「普通」とか言ってないで、どうしてそうなるのかよく考えてみろ。

まず "D:\" では最後のクォートがエスケープされてコンパイルエラーになるはずだ。
そこを直したとしても、そのコードでは strcat() の時点でバッファオーバーランを
起こしてしまっているはず。何が起こっても文句は言えない。
0959デフォルトの名無しさん2010/02/28(日) 15:19:22
>>957 リテラルじゃぁない。領域サイズに問題がある。
09609562010/02/28(日) 15:37:16
ちょっとわかりにくかったんで
http://www.dotup.org/uploda/www.dotup.org692367.png

試しに
char path[40] とかでもだめでした
0961デフォルトの名無しさん2010/02/28(日) 15:40:41
test()のなかでstr1を変更してるからじゃないの?
str1とstr2を連結した新しい変数を使用してはいかがでしょうか?
0962デフォルトの名無しさん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>
0963デフォルトの名無しさん2010/02/28(日) 15:47:18
>>956
根本的に分かってないだろ。

>△のとこは普通D:\と表示されるんではないんですか?
されません。
文字列連結(strcat)してるんだから、path[]のケツにfilename[]がくっ付くに決まってる。
>しかしD:\testと表示されてしまいます。
それで正常です。バッファオーバーランしてるけどな。

ディレクトリ名とファイル名以外に、フルパス用の配列でも作ってろ。
よう分からんならstd::string使ってろ。
0964デフォルトの名無しさん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 ;
}
こんな風にしたら?
0965デフォルトの名無しさん2010/02/28(日) 15:49:27
ああ、微妙に変だけど細かいことは気にしない
0966デフォルトの名無しさん2010/02/28(日) 15:50:26
>>956
testの前後でprintf("%p", path);としてみればpath自体の値は変わってないことが確認できると思う
あとは文字列について勉強して、ポインタについて勉強すればおk
0967デフォルトの名無しさん2010/02/28(日) 15:56:51
>>957-959,961-966
できました!ありがとうございます
0968デフォルトの名無しさん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コール
になっているんだが、ここからなんとか、関数の実行アドレス
を割り出したいのです。
 知っていたら教えてください。
0969デフォルトの名無しさん2010/02/28(日) 16:36:33
>>968
なんでダンプしちゃうのw
pFunc で取れてるだろ。 printf("%p", pFunc) とか。
0970デフォルトの名無しさん2010/02/28(日) 16:42:25
968です
 pFuncで取れているのは、関数の実行アドレスではないです。
 このときのアドレスの中身は、関数の実体へのジャンプ命令なんです。
 で、ほしいのはセグメント上に展開されているはずの、この
ジャンプ命令の示しているジャンプする先のアドレスがほしいのです。
0971デフォルトの名無しさん2010/02/28(日) 16:46:15
>>970
よくわからんが、ジャンプ命令のジャンプ先が欲しいんならジャンプ命令の
仕様どおりに(CPUの動作をなぞって)アドレス計算するんじゃダメなの?
0972デフォルトの名無しさん2010/02/28(日) 16:57:08
 えと、JMP命令の後ろに記述されているやつが、
nearポインタのアドレスだと思うのだけど、
nearポインタだからセグメントの先頭アドレス
が必要なのですよ、で、C言語(Win32APIなどを使っても
良いので)が必要。

 知りたいのは、
 1.JMP命令の次の4バイトがnearポインタでよいのか?
  →この4バイトのアドレスが示している場所に、オフセット値が記述されている
   という解釈でよいのか?
 2.そのばあい、オフセットなのでセグメントの先頭アドレスをどうやって取ればよいのか?
という2点なのです
0973デフォルトの名無しさん2010/02/28(日) 16:58:39
セグメントなんて使ってねえから
フラットメモリモデルだから
そのまんま解釈すればいいから
0974デフォルトの名無しさん2010/02/28(日) 17:01:42
 そうですか、それではもう少し調べてみます。
 解釈が間違っていたようです。
 ありがとうございました。
0975デフォルトの名無しさん2010/02/28(日) 21:28:14
コンソールアプリケーションでMessageBoxって使えないんですか?
うまくいかないんですがもし使えるならどうやれば使えるでしょうか?
0976デフォルトの名無しさん2010/02/28(日) 21:36:30
使えてるぞ
// cl hello.cpp user32.lib
#include <windows.h>
int main() {
MessageBox(NULL,"aaaaaaa", "bbbbbb", 0);
}
0977デフォルトの名無しさん2010/02/28(日) 21:40:09
あ、できました
ありがとうございます
0978デフォルトの名無しさん2010/03/01(月) 11:06:21
とりあえず色々と試してみることさね
0979デフォルトの名無しさん2010/03/01(月) 11:25:25
>>972
Windowsのdllはstubを介してジャンプする事になっている。
セグメントの先頭アドレスは必要ない。jumpのオペランドは
そのジャンプ命令からの相対アドレス。
0980デフォルトの名無しさん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をコンパイルするコンパイラは不定です
0981デフォルトの名無しさん2010/03/01(月) 15:55:05
今C++でフォームアプリケーションを作ってるのですが、ファイルからテキストを読み取ってラベルに表示したいのですが
while(fgets(data, 1000, fp) != 0){
strcat(temp,data);
}
String^ filetext = gcnew String(temp);
label1->Text = filetext;

とすると文字化けしてしまいます、どうすれば良いのでしょうか?
0982デフォルトの名無しさん2010/03/01(月) 16:28:02
ファイルの文字コードはなんなのとか
System::IO::File::ReadAllText使えとかいろいろあるけど
C++/CLIはこっちできこうね
http://pc12.2ch.net/test/read.cgi/tech/1206447234/
0983デフォルトの名無しさん2010/03/01(月) 16:32:48
文字コードを指定してStreamReaderを使う
0984デフォルトの名無しさん2010/03/01(月) 16:36:21
できたぽ
サンクスだぽ(`・ω・´)
0985デフォルトの名無しさん2010/03/01(月) 16:39:08
ちなみにフォームアプリケーションって
C#で作るのと
C++でフォームアプリケーションから作るのと
C++で空のプロジェクトから作るのと
軽さはどれくらい違いますか?
レス数が950を超えています。1000を超えると書き込みができなくなります。