【初心者歓迎】C/C++室 Ver.71【環境依存OK】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2010/01/29(金) 23:15:45ただしその場合、質問者は必ず環境を書きましょう。
※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:59ttp://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規格ではどうなってるんだろ
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:07typedef void (*vfn_t)(void) で正解だな。
0007デフォルトの名無しさん
2010/01/30(土) 21:15:46>>今はあきらめて*( volatile unsigned int *)としてプログラム中で
>>キャストしているんだけど
それでいいんじゃない?別に気持ち悪くない
0008デフォルトの名無しさん
2010/01/30(土) 22:16:06ありがとう、提案された方法を試したあとに結果を報告する。
>>4
関数の返却値に使いたいんじゃなくて、レジスタの中身がvolatileであることを
宣言したい。だけどそのやり方がわからなくて、貼り付けたコードはめちゃめちゃに
なってる。
>>7
折角だしプログラムの中でいちいちキャストしたくないんだよ。キャストって、
この場合は正しく宣言していれば不要だし、間違った型の代入を防ぐことも
できる。
0009デフォルトの名無しさん
2010/01/30(土) 22:26:18ソースはこれ。コンパイル結果を読みやすいようにレジスタアドレスを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#define の値は括弧で囲っといたほうがいいよ。
それから引数無しの引数リストに void を入れるかどうかはそろえといたほうがいいよ。
C なら必須。
0012デフォルトの名無しさん
2010/01/31(日) 09:19:400013デフォルトの名無しさん
2010/01/31(日) 09:40:27代入がアトミックになってないぞ
mutexか何かでバリアしておいた方が良くないか?
0014デフォルトの名無しさん
2010/01/31(日) 09:56:49シリアライズで出来るんじゃない?
自分はやったことないけどね
0015デフォルトの名無しさん
2010/01/31(日) 10:32:39boost::serializationかな
0016デフォルトの名無しさん
2010/01/31(日) 11:24:01もうまさにboost::serializationだな。
0017デフォルトの名無しさん
2010/01/31(日) 17:21:13保存中の進捗表示はboost::progress_displayにお任せ!
0018デフォルトの名無しさん
2010/01/31(日) 18:06:17OSは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:320020デフォルトの名無しさん
2010/01/31(日) 18:42:370021デフォルトの名無しさん
2010/01/31(日) 23:02:34int address = 0x00000;
handle = (void (*) () )address;
このコードがよくわかりません。
関数ポインタを宣言していることはわかるんですが、3行目のキャストが何を意味しているかが不明です。教えてください
0022デフォルトの名無しさん
2010/01/31(日) 23:05:050023デフォルトの名無しさん
2010/01/31(日) 23:21:49関数へのポインタにキャストしているだけです。
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単に警告でないように強制型合わせしているだけ
違うものを強制挿入する時よくやる
0026デフォルトの名無しさん
2010/01/31(日) 23:56:43static な関数だと ObjectManeger::* じゃなくてただの * でいいよ。
っていうかコンパイルしてみればいいじゃない。
0027デフォルトの名無しさん
2010/02/01(月) 00:02:47外部シンボルは未解決だ、って怒られるんだ。
あと、ABCDの各関数を初期化時に入れるのはどうやってやるのか・・・。
色々試したんだけど、コンパイルでエラーの嵐で分からないんだぜ・・・。
0028デフォルトの名無しさん
2010/02/01(月) 00:07:11class 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これ、常識ね
0030デフォルトの名無しさん
2010/02/01(月) 00:10:17{ &ObjectManeger::A, &ObjectManeger::B },
{ &ObjectManeger::C, &ObjectManeger::D }
};
ミスった
0031デフォルトの名無しさん
2010/02/01(月) 00:18:05通った! ありがとう!
そう書けばよかったのか・・・。
>>29
可読性的な意味で、なのかな。
確かに見づらい・・・。
0032デフォルトの名無しさん
2010/02/01(月) 00:56:26virtual 使ってるクラスでもできる?
0033デフォルトの名無しさん
2010/02/01(月) 01:20:53typedef 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:37typedef 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:070036デフォルトの名無しさん
2010/02/01(月) 21:48:30C++のIDEはそんな機能がないのかな?
いちいち、#inluce <*>って書くのが面倒くさい
それとも、Qt Creatorは新しいから無いのかな?
0037デフォルトの名無しさん
2010/02/01(月) 22:10:21ずっとJavaで良いじゃん
0038デフォルトの名無しさん
2010/02/01(月) 22:10:24C++はないよ
C# ならある
0039デフォルトの名無しさん
2010/02/01(月) 22:17:59わかったよ、ありがとう
0040デフォルトの名無しさん
2010/02/02(火) 10:59:32普通の関数の代わりに、staticのメンバ関数を使うのが常識なのですか?
0041デフォルトの名無しさん
2010/02/02(火) 11:08:43べつにクラスを使わないんだったらバシバシ普通の関数も使うよ
ただクラスを定義しとくとデバッグがめっちゃ楽になんのよ
0042デフォルトの名無しさん
2010/02/02(火) 11:15:45algoritmヘッダなんかには普通の関数もたくさん入ってる(ほとんどテンプレート関数だけど)
もちろん普通の関数を使うところで
staticメンバ関数を使っても問題は起こらないから
すべてstaticメンバ関数で統一したければすればいい
むしろ可視性の操作とかネストクラスとかできることが増えるから
staticメンバのほうが俺はいいと思う
0043デフォルトの名無しさん
2010/02/02(火) 16:28:40と言うクラスがあるとき
実装をcppファイルに記述するには明示的実体化するしかないのでしょうか?
.hファイルに実装を記述するととても見苦しい状態になってしまうのですがどうにかならないでしょうか
0044デフォルトの名無しさん
2010/02/02(火) 16:30:300045デフォルトの名無しさん
2010/02/02(火) 16:32:450046デフォルトの名無しさん
2010/02/02(火) 18:38:51仕方がありません
Comeau C++を買いましょう
0048デフォルトの名無しさん
2010/02/02(火) 20:33:42細かい違いはあるけど
0049デフォルトの名無しさん
2010/02/02(火) 20:36:50いいんじゃね
boostの.hppってっ拡張子は
実装も含んでるヘッダだよ、っていうような意味なんじゃないかね
0050デフォルトの名無しさん
2010/02/02(火) 20:39:53thx
0051デフォルトの名無しさん
2010/02/02(火) 21:45:20Boost FAQには以下のようにあるけど。
>なぜ Boost のヘッダファイルはどれもこれも .hpp を使い、 .h や拡張子なしにしないのですか?
>ファイルの拡張子は、人間とコンピュータプログラムの両方にそのファイルの "型" を伝えるものである。
>'.h' という拡張子は C のヘッダファイルで用いられており、 C++ のヘッダファイルに関して間違ったことを伝えてしまう。
>拡張子無しのものを用いると何も伝わらず、型を断定するためにファイルの中身を調べることを強制する。
>'.hpp' を使うことで、そのファイルが C++ のヘッダファイルであることを明確に特定することができ、 また実際に使う際にもきちんと動作する。 (Rainer Deyke)
0052デフォルトの名無しさん
2010/02/02(火) 22:00:10つまりC++は静的型付け言語だから、
同じように型の発想をしよう、ということか。
・・・それって守らなきゃダメなん?
Boost以外でも守られるのが標準的なC++の文化なの?
0053デフォルトの名無しさん
2010/02/02(火) 22:24:15.fuckとか.javaとか.exeとか付けるのも自由だ
0054デフォルトの名無しさん
2010/02/02(火) 22:30:12まあ自由だけど、それをまねした
小学生がぶん殴られたら可哀想じゃないか!
0055デフォルトの名無しさん
2010/02/02(火) 22:32:54を見てみたら、ふつーに.hだったわ。
0056デフォルトの名無しさん
2010/02/02(火) 22:34:270057デフォルトの名無しさん
2010/02/02(火) 22:50:13c++から使えて暗号化もできるシンプルなデータベースってありますか?
0058デフォルトの名無しさん
2010/02/02(火) 22:53:42この差分は何に起因するものなのでしょうか?
0059デフォルトの名無しさん
2010/02/02(火) 22:57:07cputime と usertime の差?
0060デフォルトの名無しさん
2010/02/02(火) 23:12:30http://www.moongift.jp/2010/01/sqlcipher/
これとかどうだろう
0061デフォルトの名無しさん
2010/02/03(水) 05:05:32Bみたいに書いたんだけど、これって正しい、というか、
-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:250063デフォルトの名無しさん
2010/02/03(水) 06:39:24基本的にstrict aliasing ruleに対する違反は
キャストでは解決できないと思った方がいい
じゃあどうすればいいの?ってところでは
GCC3.3.0以上なら__attibute__((may_alias))っていうのがある
けど、そのコードはダーティすぎるからそこから直した方がいい
0064デフォルトの名無しさん
2010/02/03(水) 09:35:070065デフォルトの名無しさん
2010/02/03(水) 09:42:430066デフォルトの名無しさん
2010/02/03(水) 10:13:04std_hogeもstd::hogeも変わらねーよ
0067デフォルトの名無しさん
2010/02/03(水) 10:24:180068デフォルトの名無しさん
2010/02/03(水) 10:34:05たとえば関数 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:420070デフォルトの名無しさん
2010/02/03(水) 11:32:37いちいちラップしないといけない
0071デフォルトの名無しさん
2010/02/03(水) 11:42:06このまま文字列リテラルがコード各所に散らばるのは気持ち悪いので
1.あらかじめエラーメッセージをメンバ変数に持たせておく
2.例外を投げるメンバ関数を用意する
3.std::out_of_range("適当なエラーメッセージ")をマクロ定義しておく
どれがスマートな方法でしょうか?
0072デフォルトの名無しさん
2010/02/03(水) 11:54:58const文字列にしてもいいけどマクロのが楽じゃわい
0073デフォルトの名無しさん
2010/02/03(水) 12:09:13if (value < min || value > max) throw std::out_of_range("〜");
}
0074デフォルトの名無しさん
2010/02/03(水) 12:14:27それじゃどこからエラー出たか特定できないじゃん
0075デフォルトの名無しさん
2010/02/03(水) 12:18:230076デフォルトの名無しさん
2010/02/03(水) 12:28:210077デフォルトの名無しさん
2010/02/03(水) 14:24:53それで問題が出るわけじゃないし
0078デフォルトの名無しさん
2010/02/03(水) 15:43:49C# や 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...........
};
0082デフォルトの名無しさん
2010/02/03(水) 16:13:05どの関数から/どのデータが原因で投げられたのか、といった情報を入れたほうがいいんでないかい
out_of_rangeなら、どの配列からout_of_rangeが出たのかによって
それが分かるような例外クラスを作ってrethrowするとか
0083デフォルトの名無しさん
2010/02/03(水) 16:37:420084デフォルトの名無しさん
2010/02/03(水) 17:48:55やっぱり継承するなりなんなりするしかないか
0085デフォルトの名無しさん
2010/02/03(水) 18:37:02デストラクタを private にしてみるとか。
class Hoge {
private:
~Hoge() {}
};
0086デフォルトの名無しさん
2010/02/03(水) 18:50:110087デフォルトの名無しさん
2010/02/03(水) 19:06:090088デフォルトの名無しさん
2010/02/03(水) 19:08:30制限はあるけどこれで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どの方法にも何のメリットも感じられない。
そのままにしとくのが一番スマートな気がする。
>>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ありがとう。できるだけ根本的に修正するようにしてみる。
ついでに、このコードについても教えてくれないか。
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どうしてそんな碌でも無いコードばかり書くんだ…
GCCのchangelogに書いてあるのは大きなものだけだから
知らないうちに内部の動作が少々変わることはありうるよ
無印の-Wstrict-aliasingで警告がでないのが正しいかはわからん
そこらへんの加減はgccの中の人にしかわからんだろうから…
0093デフォルトの名無しさん
2010/02/04(木) 09:36:50#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{
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{
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:540097デフォルトの名無しさん
2010/02/04(木) 10:01:24レスありがとうございます
念のためpack(push, 4)にしてみます
0098デフォルトの名無しさん
2010/02/04(木) 10:07:15stdint.hを読み込んで
int
を
int32_t
とかに
0099デフォルトの名無しさん
2010/02/04(木) 12:44:50レスありがとうございます
バイト数も揃えてみます
vc++にstdintが無いのが困りものですがvs2010にはあるようなので・・・
0100デフォルトの名無しさん
2010/02/04(木) 13:21:04>どうしてそんな碌でも無いコードばかり書くんだ…
ごめんw
実は>>91は、社内製コードでLoadFileAsync(const char* filename, void** buffer)っていうのがあるんだけど、
これがgcc4.1.1にしたら警告が出たので、調査用に書いたんだわ。
動作は、filenameを非同期にディスクから読み出して、読み出したメモリ領域のアドレスをbufferに返す。
非同期ロード用クラスでも作って、void**を置き換えればいいんだろうが、
既にあちこちで呼ばれてる関数だから手を出しづらいんだよね。
0101デフォルトの名無しさん
2010/02/04(木) 16:21:27ttp://www.kijineko.co.jp/node/63
こういうのがあるよ
0102デフォルトの名無しさん
2010/02/04(木) 23:42:27それでもその強引なキャストは要らんのでは?
A a;
void* p;
f(&p);
a.str = static_cast<char*>(p);
もしかしてメモリ領域の確保も非同期なの?
0103デフォルトの名無しさん
2010/02/05(金) 01:25:07#includeをclassにすると、何かいい事があるのでしょうか?
また、QWidgetは#includeもclassも書かれていませんが
なぜ、使う事ができるのでしょうか?
http://calmlight.s2.zmx.jp/Qt4Examples/SimpleMenu.html
0104デフォルトの名無しさん
2010/02/05(金) 01:34:59前方宣言でググれ
というかC/C++の#includeはJavaのimport、C#のusingとは違うぞ
0105デフォルトの名無しさん
2010/02/05(金) 06:58:32もうC言語やC++のプリプロセッサっていう勉強をした方がいいんじゃないか?
0106デフォルトの名無しさん
2010/02/05(金) 09:24:40どういう理由でそうなっているのでしょうか?
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別のクラス class C : public A (略)などが、 B とは違う都合でそいつを使っている
かもしれないから。
めんどくさいから protected なんて最初から使わなけりゃいいんだよ。
private or public でいけないのか、よく考えたほうがいい。
0108デフォルトの名無しさん
2010/02/05(金) 09:45:32適当なこというな
>>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:230110デフォルトの名無しさん
2010/02/05(金) 10:05:47あんたのそれは何か根拠があるのかね?
> 自分が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>>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> -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" ってなってる。
0113112
2010/02/05(金) 10:28:46Level 1 だと false negative が少なくて(でもゼロじゃなくて)、かわりに false positive は多いってことか。
112 は忘れて。
0114デフォルトの名無しさん
2010/02/05(金) 15:57:26ReadFileはwindows依存していることは知ってます、ifstreamの内部ではReadFileを使っている(?)とかどってでみた気がする
速度を比較してみたらifstreamの方がはやかったです
0115デフォルトの名無しさん
2010/02/05(金) 16:02:59ifstream等は内部にバッファを持って一度の呼び出しで多くのデータを読み込むようにしてAPIの呼び出し回数を抑えているはず
0116114
2010/02/05(金) 16:10:020117デフォルトの名無しさん
2010/02/05(金) 16:45:560118デフォルトの名無しさん
2010/02/05(金) 17:24:520119デフォルトの名無しさん
2010/02/05(金) 17:28:370120デフォルトの名無しさん
2010/02/05(金) 18:04:54システムコール(カーネルとのモード遷移)のコストは隠蔽できません。
ReadFileを何度も何度も呼び出している限り。
0121デフォルトの名無しさん
2010/02/05(金) 19:48:250122デフォルトの名無しさん
2010/02/05(金) 20:15:360123デフォルトの名無しさん
2010/02/05(金) 20:16:50stdioと比較してifstreamは全然速くない。
0124デフォルトの名無しさん
2010/02/05(金) 20:23:02iostreamの良い所は別にあるんだから。
何かというとそれは次の人どうぞ
↓↓↓
0125デフォルトの名無しさん
2010/02/05(金) 20:39:29つまり入力元や出力先だけではなくstringstreamのように
根本的な構造が異なっても全く同じイメージで操作できる事です
とでも言って欲しいのか?
0126デフォルトの名無しさん
2010/02/05(金) 21:52:340127デフォルトの名無しさん
2010/02/05(金) 22:16:09ReadFileの使い方を間違ってるんじゃないか?
ifstreamを書いた人はReadFileの使い方をよく知ってるんだと思うよ。
0128デフォルトの名無しさん
2010/02/05(金) 23:44:41WM_NOTIFYとON_NOTIFY_REFLECTの関係がわからない
調べたところWM_NOTIFYのメッセージが贈られるとるとON__NOTIFY_REFLECTが呼び出されれウ
みたく書いてあったけど
じゃあON_NOTIFY_REFLECTがもってる通知メッセージは何よ?
わかりやすくおしえてね
0129デフォルトの名無しさん
2010/02/05(金) 23:49:40は?
頭おかしいの?
0130デフォルトの名無しさん
2010/02/05(金) 23:50:12Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0131デフォルトの名無しさん
2010/02/05(金) 23:52:040132デフォルトの名無しさん
2010/02/06(土) 02:27:220133デフォルトの名無しさん
2010/02/06(土) 10:22:50それともFillRectのことだろうか
0134デフォルトの名無しさん
2010/02/06(土) 13:22:55class 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:26template< 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:57const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0);
0138デフォルトの名無しさん
2010/02/06(土) 17:31:350139デフォルトの名無しさん
2010/02/06(土) 17:33:57あると思うんだけど
0140デフォルトの名無しさん
2010/02/06(土) 17:39:20コンパイルが速くなるっていうよりも、コンパイルしなおさなければいけなくなるファイルが
減るっていうのが正しいかと。
0141デフォルトの名無しさん
2010/02/06(土) 18:05:26class B;
class A {
B b;
};
class B {
A *a;
};
あとはpimplイディオムで少し似た使い方したり。
0143デフォルトの名無しさん
2010/02/06(土) 22:06:12バックグラウンドではnewがmallocを呼び出しているのですか?
0144デフォルトの名無しさん
2010/02/06(土) 22:09:27そういう実装も多いけども、そうとは限らない。
それが問題になるようなプログラムを書くべきではないし、書く必要も無い。
0145デフォルトの名無しさん
2010/02/06(土) 22:48:570146デフォルトの名無しさん
2010/02/06(土) 22:50:120147デフォルトの名無しさん
2010/02/06(土) 22:57:22それは不可能だろう。
ラッパライブラリがあれば可能だろうが、
そのラッパもやはりWinAPIは使っているだろうな。
0148デフォルトの名無しさん
2010/02/06(土) 23:43:39調べても中々出てこないみたいなので。助けてください。
プロジェクト設定はWin32コンソールアプリケーションです。
ひどいくらい初心者ですが、よろしくお願いします。
0149デフォルトの名無しさん
2010/02/06(土) 23:53:460150デフォルトの名無しさん
2010/02/07(日) 00:13:35Windows 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:49printf("%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:100153デフォルトの名無しさん
2010/02/07(日) 00:50:100154デフォルトの名無しさん
2010/02/07(日) 02:47:37今のところハッシュにアドレスとtype_infoのペア保存しておくという微妙な方法しか思いつきません
0155デフォルトの名無しさん
2010/02/07(日) 07:03:04dynamic_cast かな。
でもどっちかっていうと型判別しなきゃいけないこと自体がどっかおかしいような気がする。
0156デフォルトの名無しさん
2010/02/07(日) 07:19:040157デフォルトの名無しさん
2010/02/07(日) 08:14:090158デフォルトの名無しさん
2010/02/07(日) 10:01:05shared_ptr があるよ
0159デフォルトの名無しさん
2010/02/07(日) 11:15:33int bar1;
char *buf;
int bar2;
};
こんな構造体のbufに文字列入れるなりmallocするなりするとメモリ的にはどうなるの?
bar2がその分後ろにずれたりするの?
0160デフォルトの名無しさん
2010/02/07(日) 11:22:14int bar1;
char buf[T_size];
int bar2;
};
0161デフォルトの名無しさん
2010/02/07(日) 11:22:50void*なんか使わないほうがいいと言えばそのとおりなんですが
スクリプトと拡張型のポインタをやり取りするのに一回void*に変換されて型情報がなくなってしまうのです
スクリプト側で変なことしなければ問題はないんですが、間違えるとエラーも出せずに落ちてしまうのでどうにかできないかな、と
>>156,157
やっぱり無理・・・でしょうか
>>158
すいません
詳しくお願いできますか?
0162デフォルトの名無しさん
2010/02/07(日) 11:45:30struct ptr_holder {
void *ptr;
type_info ty;
};
のポインタとかにはできないの?
0163デフォルトの名無しさん
2010/02/07(日) 11:54:49void*を何かのクラスに変換するのはプログラマの責任になるんだね。
変換方法はプログラマから決めないといけないけど、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ずれない
+------+
0x11111100 | bar1 |
|------|
0x11111104 | buf | ---> NULL
|------|
0x11111108 | bar2 |
+------+
↑こんな感じのが ↓こんな感じになるだけ
+------+
0x11111100 | bar1 |
|------|
0x11111104 | buf | ----+
|------| |
0x11111108 | bar2 | |
+------+ |
+------+ |
0x22222200 | 文字列 | <--+
+------+
0165デフォルトの名無しさん
2010/02/07(日) 12:13:53shared_ptrのその使い方はshared_ptrの本来の使い方の一部にしかすぎない。
shared_ptrの本来の使い方を知った上で使うべき。
0166デフォルトの名無しさん
2010/02/07(日) 12:13:58残念ながら、ptr_holder*をvoid*にして渡すという形になりますので
結局のところvoid*がptr_holder*に戻せるかという、ほぼ同じ問題に戻ってしまいます
>>163
やはりvoid*がshared_ptr<void>に変換できる保証はないので、完全では無いですね
でも同一プロジェクト内でならshared_ptrに統一することは可能なので試してみたいと思います
みなさんレスありがとうございました
0167デフォルトの名無しさん
2010/02/07(日) 12:39:16そこは当然ptr_holderしか使わないという縛りが必要になる
0168デフォルトの名無しさん
2010/02/07(日) 12:50:540169デフォルトの名無しさん
2010/02/07(日) 15:23:09ライブラリって何が標準なの?
0170デフォルトの名無しさん
2010/02/07(日) 15:25:020171デフォルトの名無しさん
2010/02/07(日) 15:25:38まずは C 標準ライブラリと C++ 標準ライブラリだな。
0172デフォルトの名無しさん
2010/02/07(日) 15:29:38boostというのが標準ですか?それともSTLというのですか?
0173デフォルトの名無しさん
2010/02/07(日) 15:35:08boost は標準ではないが、将来の標準に含まれるものを含んでいる。
STL は昔の名前で、今は C++ 標準ライブラリに含まれている。
0174デフォルトの名無しさん
2010/02/07(日) 15:38:54boostは標準ライブラリではない。
だが信頼性・移植性のある外部ライブラリだと思う。
あとboostのすごいところは最先端をめっちゃ追求しているところかな。
0175デフォルトの名無しさん
2010/02/07(日) 15:45:360176progress_display
2010/02/07(日) 15:49:25私のことお呼び?
0177デフォルトの名無しさん
2010/02/07(日) 16:40:18public 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ツールキットとかそういう問題じゃない
そもそもpublic void setXXXは通常なら構文エラー
0179177
2010/02/07(日) 16:51:151はFoo* f = new Foo();
2はFoo f;
で宣言しています
>そもそもpublic void setXXXは通常なら構文エラー
何故?
0180デフォルトの名無しさん
2010/02/07(日) 16:58:25デバイスコンテキストとかはそういう使い方をしそうだがウィンドウとかはあまりそういう使い方をしないだろう
0181デフォルトの名無しさん
2010/02/07(日) 17:06:54エラーってのは、publicの後ろにコロンが付いてないだけのことだと思う。
0182デフォルトの名無しさん
2010/02/07(日) 17:06:54> GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが
なんで?
意味わかんない。
可能性が高いとかグダグダ言ってないで、関数の仕様を確認すればいいのに。
0183デフォルトの名無しさん
2010/02/07(日) 17:15:500185デフォルトの名無しさん
2010/02/07(日) 18:14:18そもそも実引数fの型がFOOへのポインタだとしたら
上の1と2は全く同じ意味だというのは分かってる?
0186デフォルトの名無しさん
2010/02/07(日) 18:17:440187デフォルトの名無しさん
2010/02/07(日) 18:21:54ドンマイ。たまにうっかりしちゃうよな。
0188デフォルトの名無しさん
2010/02/07(日) 18:39:49public : void setXXX(Foo* f);
Foo fOrg;
Foo* f = &fOrg;
1.setXXX(f);→fはポインタ
2.setXXX(&fOrg);→fOrgはポインタではなく、fOrgのアドレスを渡している
これでどっちも同じになるんだが。
0189デフォルトの名無しさん
2010/02/07(日) 18:47:44GUIアプリで、長期間あるオブジェクトを使うような場合に、
ヒープにとるべきか(1)スタックにとるべきか(2)という質問なんじゃないの
0190デフォルトの名無しさん
2010/02/07(日) 18:54:41そんなのJavaもC++も一緒じゃないの?
スコープを抜けたらデストラクタが実行されるでしょうよ。
0191190
2010/02/07(日) 18:56:520192177
2010/02/07(日) 19:11:12その通りです。そういう質問です
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:21f自体は削除されるが
fのメンバにポインタがあった場合
そのポインタがさしてる先が削除されるかは
ちゃんとそういう処理を書いたかってことによる
0194デフォルトの名無しさん
2010/02/07(日) 19:20:45スタックに確保したインスタンスは、スコープを外れれば自動的に削除されます。
つまりスコープを外れない限りは自動的に削除されることは無い。
削除されないならそのシステムが腐ってる。
LIFOをイメージ出来れば今回の疑問は解決するはず。
0195177
2010/02/07(日) 19:35:38なるほど、いろいろと勝手にやってくれて
やってくれなかった場合はシステムが腐っているってことですね
---------------------------------------------------------------------
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システム的には、>>194の通り、スコープを外れたら自動的にデストラクタが呼ばれる。
>>193の言うようにそのデストラクタ内の処理で必要なものを解放していなければメモリリークになる。
Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。
無効なアドレスに対してアクセスが発生して、運が良ければ落ちるし、最悪の場合は黙って動き続けることに…
0197デフォルトの名無しさん
2010/02/07(日) 19:39:48string*はやめてconst string&で受け取った方がいい
MainWindowにWindowTitleのメンバを用意して、
コピーコンストラクタでコピーするべき
0198デフォルトの名無しさん
2010/02/07(日) 19:41:200199177
2010/02/07(日) 19:56:45>Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
>もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。
なるほど、それが聞きたかった
わかりました、ありがとうございます
>>197
>string*はやめてconst string&で受け取った方がいい
うーん、それは危なくないですか?
>init()の方が最初に終わるかもしれないという条件の場合
という条件があるので
0200196
2010/02/07(日) 19:56:46>>195の条件ならどっちもダメ
newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある
>>192のQtの場合は、親ウィジェットから辿れる子ウィジェットについては、
親ウィジェットのデストラクタ内でdeleteを呼んでくれてるってことだと思う
そういうフレームワークを使うなら自分でdeleteする必要はない(というかしたらまずい)
あと直接関係ないけど、
スタックを使う場合は、Javaには真似できないRAIIって技法があるから調べてみると面白いかも
ヒープの場合はスマートポインタ(boost::shared_ptrとか)を使うと安全度が高まる
0201177
2010/02/07(日) 20:07:03>Javaには真似できないRAII
これ調べておきます
>mainWindowが終了した段階で、MainWindowがstring sをdeleteする
こういう条件があるので↓は気にしなくていいのでは?
>newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある
0202196
2010/02/07(日) 20:15:39じゃあnew以外ないね(逆に、スタックに確保したインスタンスをdeleteするのは駄目)。
ただ、関数レベルでそんな実装するのはC++的じゃないので、普通ないとは思うけど。
0203デフォルトの名無しさん
2010/02/07(日) 20:26:02Java→C++よりC→C++の流れの方がやっぱりまともだな
0204デフォルトの名無しさん
2010/02/07(日) 20:28:110205デフォルトの名無しさん
2010/02/07(日) 20:30:31そういう荒れそうな発言は、メッ!ですよ
0207デフォルトの名無しさん
2010/02/07(日) 20:33:14Cはクラスがないじゃん
だから面倒くさい
0208デフォルトの名無しさん
2010/02/07(日) 20:34:520209デフォルトの名無しさん
2010/02/07(日) 21:09:47しかし、既存の専ブラはそれをどうやって解決しているのか?って所が問題
0210209
2010/02/07(日) 21:13:170211デフォルトの名無しさん
2010/02/07(日) 21:36:08Cの古くて危険なやり方はやらない方がいい
0212デフォルトの名無しさん
2010/02/07(日) 21:48:26CodeSynthesis 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その古くて危険なもので、今現在もどれほど多くのものが作られているか。
バカには使いこなせない、って点では確かにC++以上だとは思うけどな。
0214デフォルトの名無しさん
2010/02/07(日) 21:56:39Cを知らずにSTLをいきなり使ったほうが幸せになれるのではないかと思う今日この頃。
0215デフォルトの名無しさん
2010/02/07(日) 22:00:19CはCで今でもあちこちで使われているのは俺も同意だけど、それとこれとは別。
0216デフォルトの名無しさん
2010/02/07(日) 22:03:240217デフォルトの名無しさん
2010/02/07(日) 23:50:57deleteをほとんど出さない入門書があってもいいのではないかと思うと気がある
0218デフォルトの名無しさん
2010/02/08(月) 02:48:34たとえばりんごの数とか…。
0219デフォルトの名無しさん
2010/02/08(月) 03:13:160220デフォルトの名無しさん
2010/02/08(月) 03:16:40自分のプロジェクトでは、数はnum、番目はnoを使ってる。
それ一緒や!元ネタ一緒やで!というツッコミは甘んじて受けよう。
大事なことはプロジェクト内での一貫性。(あと検索一意性)
それさえ見失わなければhogeでも構わん。
0221デフォルトの名無しさん
2010/02/08(月) 03:35:36レスありがとうございます!
私はthe number of 〜とか考えてました。でもこれじゃあなんかな〜…と。
これからはnum、noを一貫してつけていくことにします。
0222デフォルトの名無しさん
2010/02/08(月) 07:03:310223デフォルトの名無しさん
2010/02/08(月) 07:59:000224デフォルトの名無しさん
2010/02/08(月) 08:19:06どうもです。
HTTPというと、C++で使うのはwininetですかね。
HTTPの事も調べないといけないなぁ。
0225デフォルトの名無しさん
2010/02/08(月) 08:52:24量ならamountだな
0226デフォルトの名無しさん
2010/02/08(月) 09:26:000227デフォルトの名無しさん
2010/02/08(月) 09:36:020228デフォルトの名無しさん
2010/02/08(月) 14:39:57cin >> 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改行が来るまで吐き出させるとか
char c;
do {
cin >> c;
} while (c != '\n');
0230デフォルトの名無しさん
2010/02/08(月) 20:56:46if( s ) {
std::cout << "true" << std::endl;
}
このスレで条件式にインスタンスを渡してもいいと教えてもらったのですが
シンタックスエラー?が出ました
>/Test/main.cpp:9: error: could not convert ‘str’ to ‘bool’
why?
0231デフォルトの名無しさん
2010/02/08(月) 20:58:47s.c_str()とかやりなされ
0233デフォルトの名無しさん
2010/02/08(月) 21:33:46それは騙されたんだよ。
char* ならそうなるけど、string はそうはならない。
0234デフォルトの名無しさん
2010/02/08(月) 21:45:34妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ??
stringはクラスで>>230の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。
適当な型変換をクラスの実装による変換で要求するが、
stringは変換機構を実装してないからコンパイラさんが評価できないよ〜。ってエラーを返している。
0236デフォルトの名無しさん
2010/02/08(月) 21:51:23ifは論理式の評価の後に最終的にはboolを要求する。
boolの基本は、0がfalse、それ以外がtrueなので、
ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。
凄い細かい話なんだが。。。
0238デフォルトの名無しさん
2010/02/08(月) 22:21:43vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが
これって普通に仮想関数を使った場合とどっちが早いんですか?
0239デフォルトの名無しさん
2010/02/08(月) 22:38:26boolean-expression が object だった場合、
コンパイラは次の優先順序で変換を試みる。
1. operator bool() {}
2. operator 数値型() {}
3. operator ポインタ型() {}
operator bool() が実装されていない場合、
かつ operator 数値型() が複数実装されている場合は、
曖昧であるためコンパイルエラーとなる。
VC2008EEで確認したら、こんな動作だった。
これは言語仕様で定義されてるのかな?
0240デフォルトの名無しさん
2010/02/08(月) 22:51:23実装によるとしか。
大抵ほぼ同じになると思うが。
0241デフォルトの名無しさん
2010/02/08(月) 23:09:16最適化うんぬんやらスレッド安全性などを考えても、
vtableを自分で実装なんてしなくていいともうけどね。
だいたい、仮想関数のスピードがネックになる設計なんて
今まで俺はみたことないよ。
80-20の法則ってやつを思い出すしか。
0242デフォルトの名無しさん
2010/02/08(月) 23:10:36おまいは今 ignore さんの存在意義を否定した。
0243デフォルトの名無しさん
2010/02/08(月) 23:29:37__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:570245デフォルトの名無しさん
2010/02/08(月) 23:44:11もうちょい周辺の記述も有った方が分かりやすそうだけど、とりあえず以下の規定から導かれる動作だと思われ。
> 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この辺がよくわかりません。
static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));
配列を確保してるのですよね?
0247デフォルトの名無しさん
2010/02/09(火) 00:40:32vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。
速度目的は聞いたことないなあ。
0248デフォルトの名無しさん
2010/02/09(火) 00:55:020249デフォルトの名無しさん
2010/02/09(火) 01:01:23どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り
非仮想関数だから最適化されやすいという理屈。
今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを
検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。
0250デフォルトの名無しさん
2010/02/09(火) 01:41:35::operator new()というのは、
要求されたメモリを確保して
void*として返す関数。
(bad_allocを投げるmalloc()、と考えてよい)
したがって、sizeof(Integer)のメモリを確保して
それを(void*から)Integer*にキャストしてる。
0251222
2010/02/09(火) 08:05:12HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。
ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。
何か良いサンプルはないでしょうか?
0252デフォルトの名無しさん
2010/02/09(火) 10:25:130253デフォルトの名無しさん
2010/02/09(火) 11:43:02軽く調べた程度の知識しかないです。
0254デフォルトの名無しさん
2010/02/09(火) 11:52:520255デフォルトの名無しさん
2010/02/09(火) 12:58:560256デフォルトの名無しさん
2010/02/09(火) 13:06:010257デフォルトの名無しさん
2010/02/09(火) 13:06:21って技があったと思う
iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった
0258デフォルトの名無しさん
2010/02/09(火) 13:10:25ただスーパークラスの関数はすべてvirtualながらも定義していて、
必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです
スーパークラスのデフォルトコンストラクタをprotectedにしてみました
これはアリでしょうか?
0259デフォルトの名無しさん
2010/02/09(火) 13:12:07リロードしてなかった・・・
いまその記事発見しました
ありがとうございます
0260デフォルトの名無しさん
2010/02/09(火) 13:30:30どうもです。
CGI作成の方を調べたら、だいぶ分かってきました。
0261デフォルトの名無しさん
2010/02/09(火) 13:33:30こういうやり方もあるようだが
これは正しい方法なのかな?
vc++とcodepadでは期待通りになる
0262257
2010/02/09(火) 14:08:02257は訂正、protectedにして(コピーコンストラクタや代入演算子を)実装しないってのは
インスタンス化は許すけどコピーは出来ないようにする
といった要求がある時に使う技だった
0263デフォルトの名無しさん
2010/02/09(火) 15:08:46Fooはoperator std::size_tを定義していないとだめだと聞いたんですが
これはいったいどんな値を返すべきなんでしょうか?
0264デフォルトの名無しさん
2010/02/09(火) 17:17:16vc++ee2008で試したら仮想関数のほうが3倍速かったわ
0265デフォルトの名無しさん
2010/02/09(火) 17:39:16たぶんハッシュ値
0266デフォルトの名無しさん
2010/02/09(火) 18:19:00という使い方は可能なのでしょうか?
例えば
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:010268デフォルトの名無しさん
2010/02/09(火) 18:49:29できるよ。
0269デフォルトの名無しさん
2010/02/09(火) 19:08:32知る方法ってありますか
0270デフォルトの名無しさん
2010/02/09(火) 19:13:490271デフォルトの名無しさん
2010/02/09(火) 19:21:03ありがとうございます
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:290274デフォルトの名無しさん
2010/02/09(火) 20:09:10つまりそれぞれの宣言を、関数の一番先頭に持ってくればよいと言う事でしょうか?
それはint型などの変数でも同じなのですか?
0275デフォルトの名無しさん
2010/02/09(火) 20:17:200276デフォルトの名無しさん
2010/02/09(火) 20:26:43順序を変えてみたところ、素直にコンパイルしてくれました
こんな些細なことでもエラーが出るとは思いませんでした
ありがとうございました
0277デフォルトの名無しさん
2010/02/09(火) 20:40:17> こんな些細なことでもエラーが出るとは思いませんでした
C/C++ではそんなんしょっちゅうだよ。
・・・まあコンパイルエラーが出ているウチは楽だよ。
実行時エラーが出ると発狂しそうになる。
0278デフォルトの名無しさん
2010/02/09(火) 20:54:45あるよ
0279デフォルトの名無しさん
2010/02/09(火) 20:55:380280デフォルトの名無しさん
2010/02/09(火) 20:59:23うん
でも比較用の関数やファンクタを使うこともしばしばある
0281デフォルトの名無しさん
2010/02/09(火) 21:04:040283デフォルトの名無しさん
2010/02/09(火) 21:09:04環境別な方法(一般的)と、大抵の環境で出来る方法があるが、どっちがいい?
0284デフォルトの名無しさん
2010/02/09(火) 21:13:43まあ表面的にはそう。
1. boost::filesystem
2. dirent.h
3. Win32 APIなどの環境別API
4. system("dir > temp");
5. __asm { 中略 int 1bh }
0287デフォルトの名無しさん
2010/02/09(火) 23:00:41namespaceが設定されていないんですか?
0288デフォルトの名無しさん
2010/02/09(火) 23:20:010289デフォルトの名無しさん
2010/02/09(火) 23:29:29いまいわからないから、質問しているわけで
namespace foo
{
class HogeImpl { };
}
かもしれん
0291デフォルトの名無しさん
2010/02/09(火) 23:34:50明示的にくくってやればおk。
0292デフォルトの名無しさん
2010/02/09(火) 23:38:41#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:150294デフォルトの名無しさん
2010/02/09(火) 23:41:350295デフォルトの名無しさん
2010/02/09(火) 23:44:110297デフォルトの名無しさん
2010/02/09(火) 23:49:040298デフォルトの名無しさん
2010/02/09(火) 23:51:210300デフォルトの名無しさん
2010/02/09(火) 23:55:33thx
0301デフォルトの名無しさん
2010/02/10(水) 00:07:33Hoge* h = new Hoge[100];っていうのを
placement new[]でやるには、Hogeにどんなnewを定義すればいいでしょうか?
0302デフォルトの名無しさん
2010/02/10(水) 00:30:29Hoge *h = (Hoge *)(new (p) Hoge[100]);
で大丈夫かな?
コンパイルは通るはずだけど。
(当然、Hogeにはデフォルトコンストラクタが必要。
デフォルト引数がある引数を持つコンストラクタで可能かは知らない)
ていうか、こうすると、
全部の要素に対して個々にデストラクタを呼び出してからメモリを解放するわけだし
だったらコンストラクタだって、(placement newを使って)個々に呼び出すだけで良いじゃない、という話になる。
それだったら、引数の制限も無いしね。
0303デフォルトの名無しさん
2010/02/10(水) 00:32:590304デフォルトの名無しさん
2010/02/10(水) 00:34:48new[]が要素数をどこかに保存しているから実装依存、という話ではなくて?
0305デフォルトの名無しさん
2010/02/10(水) 00:38:33ここの配置newのところに
コンパイラによって動作が異なるという問題があり
って書いてあるのが気になって
0306デフォルトの名無しさん
2010/02/10(水) 00:47:35Hoge *h = new (p) Hoge;
// ここで普通にhを使う
h->~Hoge();
::operator delete(h);
というコードは、どのコンパイラでも通るし正常に動くと思う。
(例外対応してない点を除けば)
普通のnew演算子とdelete演算子のやっていることを
エミュレートしているだけだから。
0307デフォルトの名無しさん
2010/02/10(水) 01:11:53それ危ない。領域が足りない可能性が高い。
安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476
0308デフォルトの名無しさん
2010/02/10(水) 01:59:04printf("xx");
}
returnを書かなくてもエラーにも警告にもならないのですが、
これはC++の仕様なんでしょうか、それとも環境依存なのでしょうか。
VC++2008を使っています。
0309デフォルトの名無しさん
2010/02/10(水) 02:13:030310デフォルトの名無しさん
2010/02/10(水) 09:22:17template<> class hoge<std::string>
という特殊化を定義してて
使用者側がusing namespace std;を宣言していて
hoge<string>とした場合呼ばれるクラスは汎用のものなのか特殊化された物なのかどちらになるのでしょうか
0311デフォルトの名無しさん
2010/02/10(水) 09:23:03ttp://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コンストラクタでメソッドが利用するメンバを初期化してたりしなければ問題ない;
0314デフォルトの名無しさん
2010/02/10(水) 14:02:13char配列若しくはwchar_t配列をテキストボックス(this->textBox1->Text)に表示したいのですが
単純に下のように代入しようと
char str[256];
this->textBox1->Text = str;
すると下のように出てしまいます。
理由: 'char *' から 'System::String ^' へは変換できません。
テキストボックスにchar配列の内容を表示する方法を勉強できるサイトを教えてください。
よろしくお願いします。
0315デフォルトの名無しさん
2010/02/10(水) 14:15:35フォームだとC++の範疇じゃない、C++/CLIになる。
this->textBox1->Text = gcnew String(str);
とかかな。
とにかく、C++のサイト探しても見つかりにくいよ、C++/CLIで
0316デフォルトの名無しさん
2010/02/10(水) 14:17:43本当にありがとうございます!!
C++/CLIで検索しつつ精進します。
0317デフォルトの名無しさん
2010/02/10(水) 14:17:56初期化子でthisを使うのは直接・間接を問わずバグの原因になりうる
だから初期化子でthisやメンバ関数を使うのは避けるべき
スコープに入ってからならthisやメンバも使っておk
0318デフォルトの名無しさん
2010/02/10(水) 14:35:09>>317
大丈夫かも知れないけど変なバグの温床になりやすいと言うことでしょうか
ならばstaticなメンバにすれば大丈夫なのでしょうか
0319デフォルトの名無しさん
2010/02/10(水) 14:48:45初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険
メンバ関数は基本的に構築が正確に済んでいるオブジェクトから呼び出されることを前提にしているから初期化子への代入目的には基本的には使えない
staticメンバは問題無いので使っていい
0320デフォルトの名無しさん
2010/02/10(水) 16:09:31入力待ち、処理中に閉じるボタンを押された際の処理方法を
教えてもらえないでしょうか。
0321デフォルトの名無しさん
2010/02/10(水) 18:28:27メンバの初期化順はメンバ変数が定義された順と決まってるだろう。
0322デフォルトの名無しさん
2010/02/10(水) 18:30:040323デフォルトの名無しさん
2010/02/10(水) 18:42:19を放置するのが楽しいんじゃないか余計な突っ込み入れるなよぅ
0324デフォルトの名無しさん
2010/02/10(水) 18:49:190325デフォルトの名無しさん
2010/02/10(水) 18:57:01void 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{
a[1][1] = 10;
}
int main()
{
int data[2][4];
shori(data);
return 0;
}
0327デフォルトの名無しさん
2010/02/10(水) 21:01:50解決しました ありがとうございます
0328デフォルトの名無しさん
2010/02/10(水) 21:24:52#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++のサンプルコードではこういう感じでファイル名を渡す形ではなくそのままストリームを渡していました
なぜこの形式を使うんでしょうか?ファイル名を渡すのと比べてどんな利点があるんでしょう?
0330デフォルトの名無しさん
2010/02/10(水) 21:29:41ストリームをfstreamからiostreamやstringstreamに置き換えても
そのまま動くからじゃね?汎用化というか
0331デフォルトの名無しさん
2010/02/10(水) 21:37:350332デフォルトの名無しさん
2010/02/10(水) 22:07:19コンパイラによっては順番に書けやって怒られるぞ。
0333デフォルトの名無しさん
2010/02/10(水) 22:26:25string が std::string を指していて、かつ hoge<std::string> が可視なら特殊化されたものを使うだろ。
template だからって変なこと考える必要はないと思うよ。
0334デフォルトの名無しさん
2010/02/10(水) 22:30:57動作が保障されないんだっけ?
0336デフォルトの名無しさん
2010/02/10(水) 22:33:250337デフォルトの名無しさん
2010/02/10(水) 22:36:57> コンパイラによっては順番に書けやって怒られるぞ。
そんなクソコンパイラもあるのか。
0338デフォルトの名無しさん
2010/02/10(水) 22:39:51> 動作が保障されないんだっけ?
そう。未定義の動作になる。
ただし特殊化を除く。
> stdに追加していいのはテンプレートの特殊化だけだったような
その通り。
0339デフォルトの名無しさん
2010/02/10(水) 22:59:33class Hoge
{
....
}
Hoge h[100];
ってやるとエラーになっちゃうんですけど
h[100]って定義するためには何を自分のクラスに
記述すればいいのでしょうか。
0340デフォルトの名無しさん
2010/02/10(水) 23:02:320341デフォルトの名無しさん
2010/02/10(水) 23:02:36配列形式はPODしか使えない
おそらくコンストラクタを持っているのだろう
0342デフォルトの名無しさん
2010/02/10(水) 23:08:47int 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このメモリの確保・開放はDllMainでやるか、グローバルスマポでやるか
どっちが安全でしょうか?
0344デフォルトの名無しさん
2010/02/11(木) 15:10:310345デフォルトの名無しさん
2010/02/11(木) 15:40:54グローバル変数やDllMainは使わない方法を考えるべきだね。
0346デフォルトの名無しさん
2010/02/11(木) 17:20:02VisualC++のコンパイラに適応させるにはどうしたらいいですか?
コンパイラの場所以外になにか設定が必要でしょうか?
0347デフォルトの名無しさん
2010/02/11(木) 17:31:28普通はそんな使い方しない。
IDE使えばいいんじゃないかな??
0348デフォルトの名無しさん
2010/02/11(木) 17:42:06IDEがちょっと重いのでエディタでと変えようとしてたんですが、無理ですかね?
0349デフォルトの名無しさん
2010/02/11(木) 17:49:19一応、CL自体はコマンドラインから使えるようにはなってるはずだが、もうズーットつかってないなぁ。
>cl /help でヘルプが見れたので適時変換して使えるようにすればできるかも。
ただ、労力には見合わないと思う。
0351296
2010/02/11(木) 17:56:530352デフォルトの名無しさん
2010/02/11(木) 17:58:150353デフォルトの名無しさん
2010/02/11(木) 18:22:28じゃあ僕もlib?.aファイル作ってみたいです
mingw32 gcc 4.4.1 Windows2000 SP4ですが
どうやって生成するんですか?
0354デフォルトの名無しさん
2010/02/11(木) 19:31:270355デフォルトの名無しさん
2010/02/11(木) 19:55:04場合、宣言の部分にだけかけばいいのでしょうか。
誰かサンプル書いて
0356デフォルトの名無しさん
2010/02/11(木) 20:16:48後処理も出来ない状態の事が多いな
0357デフォルトの名無しさん
2010/02/11(木) 21:05:47例外指定のことだろうか。
0358デフォルトの名無しさん
2010/02/11(木) 21:42:47じゃあ書かない方がいいのですね。
コンストラクタでメモリ確保とか何か重要な
C++は言語の不備なのでしょうけど、失敗が
ある場合放置するしかないのですよね?
0359デフォルトの名無しさん
2010/02/11(木) 21:47:280360デフォルトの名無しさん
2010/02/11(木) 21:48:06メモリが足らないって、どの言語を使っていてもあるでしょ。
0361デフォルトの名無しさん
2010/02/11(木) 23:50:56あれって何が違うの?
0362デフォルトの名無しさん
2010/02/11(木) 23:57:16C の標準ヘッダは .h。
C++ の標準ヘッダは拡張子なし。
非標準ヘッダは適当。
0363デフォルトの名無しさん
2010/02/11(木) 23:58:00#include は *.h でも *.txt でも *.hoge でもC言語の文法に合った内容のテキストファイルならなんでも #include できる
0365デフォルトの名無しさん
2010/02/12(金) 07:48:20""と<>両方あるけどあれもあんまり意味はない?
0366デフォルトの名無しさん
2010/02/12(金) 09:02:22<>だとシステムのヘッダのみを検索
0367デフォルトの名無しさん
2010/02/12(金) 12:53:22http://www.kijineko.co.jp/tech/superstitions/quoted-headername-is-searched-for-from-cwd.html
0368デフォルトの名無しさん
2010/02/12(金) 16:37:15確実にダメなのって関数ポインタを使ってる時ぐらいかな?
0369デフォルトの名無しさん
2010/02/12(金) 16:45:490370デフォルトの名無しさん
2010/02/12(金) 17:48:180371デフォルトの名無しさん
2010/02/12(金) 18:11:380372デフォルトの名無しさん
2010/02/12(金) 18:37:220373デフォルトの名無しさん
2010/02/12(金) 18:41:140374デフォルトの名無しさん
2010/02/12(金) 18:49:39どうすれば使えるかがわかりません
何をどうすればいいのですか?
0375デフォルトの名無しさん
2010/02/12(金) 18:51:260376デフォルトの名無しさん
2010/02/12(金) 18:53:040377デフォルトの名無しさん
2010/02/12(金) 18:53:520378デフォルトの名無しさん
2010/02/12(金) 18:54:100379デフォルトの名無しさん
2010/02/12(金) 18:54:530380デフォルトの名無しさん
2010/02/12(金) 21:59:09#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#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int a, b, c;
0382デフォルトの名無しさん
2010/02/12(金) 22:07:25うお、すげー!
Thanks!
0383デフォルトの名無しさん
2010/02/12(金) 22:13:24そんなウンコマクロが欲しくなるほどグローバル変数をばらまくんじゃねぇよ。
あと、インクルードガードに予約識別子使うな。
0384デフォルトの名無しさん
2010/02/12(金) 22:16:51断る。
0385デフォルトの名無しさん
2010/02/12(金) 22:17:28> 予約識別子
今知った。
指摘Thanks!
0386デフォルトの名無しさん
2010/02/12(金) 22:18:20これみてるとC/C++って糞だよな
0387デフォルトの名無しさん
2010/02/12(金) 22:19:320388デフォルトの名無しさん
2010/02/12(金) 22:34:27プロはどうしてもグローバル変数が欲しい時はこう書く
真似していいぞ
0389デフォルトの名無しさん
2010/02/12(金) 22:37:19クラスのメンバみたいにアクセスさせる形にすればいいだけなので
クラスを扱う言語経験者なら思いつくと思うけど
0390デフォルトの名無しさん
2010/02/12(金) 23:01:57ハンガリアン記法は過去のものみたいなので
0391デフォルトの名無しさん
2010/02/12(金) 23:02:310392デフォルトの名無しさん
2010/02/12(金) 23:08:160393デフォルトの名無しさん
2010/02/12(金) 23:19:49でD:\下のファイルの情報取得で
if(fd.dwFileAttributes!=0x00000002)
{
printf("%s\n", fd.〜)
}
としたんですけど
D:\のSystem Volume Infomatonというフォルダが
条件から外れてくれません
どうすれば隠しフォルダを避けることができますか?
0394デフォルトの名無しさん
2010/02/12(金) 23:22:21ビットフラグじゃね?
0395デフォルトの名無しさん
2010/02/12(金) 23:23:21http://www.possibility.com/Cpp/CppCodingStandard.html#descriptive
0396デフォルトの名無しさん
2010/02/13(土) 00:43:24typedef 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ヒープが足りんのだろう。
戻り値の仕様ぐらい読め。
0398デフォルトの名無しさん
2010/02/13(土) 00:51:45ライブラリを使うためのヘッダのインクルードが無い。
中括弧がいっこ足りない。
0399デフォルトの名無しさん
2010/02/13(土) 00:51:57出ませんが
ただ '}' が一つ抜けています
0400デフォルトの名無しさん
2010/02/13(土) 00:52:430401デフォルトの名無しさん
2010/02/13(土) 01:13:45ttp://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:38callocってヒープから取るんだろ
doublex2 charx100(正確には101)とアライメント入れてもそれほど大きくないしなあ
0403デフォルトの名無しさん
2010/02/13(土) 01:26:35fscanf() のエラーもチェックしろ。
calloc() のエラーとは関係ないだろうが、 "%lf" に渡す引数は double じゃなくて double* な。
やっぱりヘッダのインクルード足りないし。
0404デフォルトの名無しさん
2010/02/13(土) 01:38:26しゅくだいなんだけど,ヘッダのとこは変更できないのよ・・・
ここに解答を書くってところだけ
ヘッダのインクルードなしでどうすればできるかなぁ
0405デフォルトの名無しさん
2010/02/13(土) 01:40:59動かすためにとりあえずヘッダ入れて
確認ができたらはずせばいい
0406デフォルトの名無しさん
2010/02/13(土) 01:48:47文字列へのポインタ持ってポインタソートした方がすっきりする
0407デフォルトの名無しさん
2010/02/13(土) 02:05:31ヘッダ入れたらコンパイルできたけど,実行するとフリーズする・・・
0408デフォルトの名無しさん
2010/02/13(土) 02:44:46fscanfのとこの&でしたorz
ありがと(^ω^)
0409デフォルトの名無しさん
2010/02/13(土) 06:42:23にあるレイトレーシングのソースコードをコンパイルしてみたのですがエラーが出てしまいます
http://codepad.org/fErUOLbG
どこをどうすればよいのでしょうか?
お助けください。
0410デフォルトの名無しさん
2010/02/13(土) 13:12:43http://codepad.org/m4SeoRfu
正しいかどうか知らんよ
しかし基本的なC++文法エラーを犯しているなこの作者は
0411デフォルトの名無しさん
2010/02/13(土) 13:16:11ポータビリティを考えるなら標準C++に従って書いた方がいいね
0412デフォルトの名無しさん
2010/02/13(土) 13:50:32コンパイルしてちゃんとppmファイルを得ることが出来ました
ありがとうございました!
0413デフォルトの名無しさん
2010/02/13(土) 17:05:09CとC++ではCを先に学んだ方がいいんですか?
それとおすすめのサイトとか書籍があったら教えてもらえませんか?
0414デフォルトの名無しさん
2010/02/13(土) 17:08:20歴史をなぞるなら C から。
何か早く作りたいものがあるなら C++ からのほうが早いかもしれない。
ただし C に由来する落とし穴も多く残っているので、危ないかもしれない。
どっちからと考えずに、必要なときに必要な情報を確認しながら学ぶのが
おすすめ。
お勧めサイト。
http://www.google.co.jp/
0415デフォルトの名無しさん
2010/02/13(土) 17:11:04プログラミングしたことあるの?
0416デフォルトの名無しさん
2010/02/13(土) 17:11:48内容はCとかわらないよ。
0417デフォルトの名無しさん
2010/02/13(土) 17:15:19古い標準関数はマルチバイトベースだったりととにかく古いだけあってめんどくさい>C/C++
0418デフォルトの名無しさん
2010/02/13(土) 17:15:25特に急ぎ足では無く、ゆっくり学ぼうと思ってるんでCからいこうと思います。
ググるのは大切ですね、しかし紹介されてるサイトや書籍があまりにも多いので戸惑います。
>>415
すごい勢いでド素人です。
0419デフォルトの名無しさん
2010/02/13(土) 17:17:25CとC++はわりと古いから、やり難い事があるという事だけわかりました!・
0420デフォルトの名無しさん
2010/02/13(土) 17:20:05お勧め書籍。
http://www.stroustrup.com/Programming/
0421デフォルトの名無しさん
2010/02/13(土) 17:20:11Cも学びたいからCから
C++をやるとCなんて馬鹿らしくてやってられないから
0422デフォルトの名無しさん
2010/02/13(土) 17:25:03おぅふ・・・なんかすげぇのきた。これは理解できそうにない
>>421
++というだけあって発展形なんですね。
0423デフォルトの名無しさん
2010/02/13(土) 17:37:34> ++というだけあって発展形なんですね。
今もC++はC言語のコードを(割と互換性があるので)使える。
でも厳密な互換性じゃないので使えないこともある。
0424デフォルトの名無しさん
2010/02/13(土) 17:38:41windowsしか使わないなら、C#あたりからやった方がいいよ
C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
0425デフォルトの名無しさん
2010/02/13(土) 17:43:20> windowsしか使わないなら、C#あたりからやった方がいいよ
いや、俺の意見としては
C#だけは止めた方が良い。
> C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
そんならP言語(Python, Pascal, PHP)をやれば良いと思う。
Rubyはよーしらんが。
0426デフォルトの名無しさん
2010/02/13(土) 17:43:29なるほど!参考になります。
>>424
#ですか、比較的敷居が低いんでしょうか。
まずそれから弄るのもいいかもしれませんね、ありがとうございます。
0427デフォルトの名無しさん
2010/02/13(土) 17:45:23makeファイルを作っているだけなのか
0428デフォルトの名無しさん
2010/02/13(土) 17:46:220429デフォルトの名無しさん
2010/02/13(土) 17:47:410430デフォルトの名無しさん
2010/02/13(土) 17:50:080431デフォルトの名無しさん
2010/02/13(土) 17:51:47API使えるしまあいろいろ方法はあるよ
C#->C++に戻ってみるとC#で当たり前に使ってる部品がなくて自作することになったり
文字コード関連ではまるよりよっぽどいい
0432デフォルトの名無しさん
2010/02/13(土) 17:54:50C->C#とC++すっとばして覚えたところでC++にいったけどさ
c_strとかなんだよそれ
0433デフォルトの名無しさん
2010/02/13(土) 17:57:21ttp://vintage-digital.com/hefner/misc/lisp-programmers.jpg
0434デフォルトの名無しさん
2010/02/13(土) 17:58:170435デフォルトの名無しさん
2010/02/13(土) 17:58:37怪しすぎるww
特にC++は何だこりゃw
0436デフォルトの名無しさん
2010/02/13(土) 18:00:01仕方ねーんだよ
昔のリンカは識別子を最大6文字しか認識しない時代があって
Cはその時に作られた物だから
C++はとっくにその制限は撤廃されているがなぜかCの癖を無意味に
引きずって省略しまくっている
タイプ量を減らすためか?
0437デフォルトの名無しさん
2010/02/13(土) 18:01:01ASP.NETにいかざるをえない
というか皆さん千差万別ですね、そりゃネットのおすすめの書籍も色々あるわけだ・・・
ここにテンプレがないのもそのせいか!
0438デフォルトの名無しさん
2010/02/13(土) 18:03:32まあギークが「ぼくのかんがえたさいきょうのげんごかくちょう」がC++だからタイプ量減らすためじゃね?
std::stringのstringからcharに変換するやつね
stringだからC++からの物だよね
0439デフォルトの名無しさん
2010/02/13(土) 18:04:570440デフォルトの名無しさん
2010/02/13(土) 18:05:060441デフォルトの名無しさん
2010/02/13(土) 18:17:54いや、俺の意見としては
C#だけは止めた方が良い。
0442デフォルトの名無しさん
2010/02/13(土) 18:18:13メモっときます、ありがとう。
皆ありがとう。感謝します。
とりあえず色々触ってみた上で何か一つに絞って、学んでいこうと思う!
0443デフォルトの名無しさん
2010/02/13(土) 20:03:26いやいや、C#は便利だぞ。
C++よりも綺麗だし。
0444デフォルトの名無しさん
2010/02/13(土) 20:46:45そんなこと言ってまた不幸になる人を増やすのか!
> C++よりも綺麗だし。
そんな言語いっぱいあるじゃないかw
0445デフォルトの名無しさん
2010/02/13(土) 21:45:41C#で不幸になるやつは、もともと不幸なやつだけだ。
0446デフォルトの名無しさん
2010/02/13(土) 23:14:59MFCだと、のっけから不幸にだが・・・
0447デフォルトの名無しさん
2010/02/13(土) 23:27:06C99ならC++の便利なところは大体使えるし
0448デフォルトの名無しさん
2010/02/14(日) 00:06:35しかしC++でnamespaceやクラスを知ると、それまで書いたのを全部書き直したくなるんだよ。
で、書き直した頃にtemplateに手を出して、また書き直したくなるわけ。
その後もSTLやらEffectiveC++やらBoostやらにかぶれるたびに、今まで書いたものがゴミに見える。
さらにC++0.xなんてので、今また過去の糞化現象が起こるんです。
0449デフォルトの名無しさん
2010/02/14(日) 00:11:090450デフォルトの名無しさん
2010/02/14(日) 00:14:470451デフォルトの名無しさん
2010/02/14(日) 00:15:350452デフォルトの名無しさん
2010/02/14(日) 00:18:565円とか半端な数字出る出ないの違いが有るよね
0453デフォルトの名無しさん
2010/02/14(日) 05:48:560454デフォルトの名無しさん
2010/02/14(日) 10:02:18C99に完全準拠しているコンパイラはIntel C++などごく一部だけだぞ
g++も部分準拠だし移植性がないしだいたいg++はC++0xへの改訂作業で
手一杯で今は時代遅れのC99に携わっている暇はないだろう
0455デフォルトの名無しさん
2010/02/14(日) 10:07:15考えるだけで頭痛くなってくるなww
0456デフォルトの名無しさん
2010/02/14(日) 10:11:500457デフォルトの名無しさん
2010/02/14(日) 10:11:59など痒い所に手が届くようになるのはありがたいよな
0458デフォルトの名無しさん
2010/02/14(日) 11:36:080459デフォルトの名無しさん
2010/02/14(日) 12:53:10*.cppには#include "*.h"としか書いてありません
一体何がしたいんですか?
0460デフォルトの名無しさん
2010/02/14(日) 12:57:270461デフォルトの名無しさん
2010/02/14(日) 15:00:38vector<int>::iterator p;だと、配列要素の値と位置がわかるだけ気がしますが
pの前方に要素追加したり削除したりとか。
0462デフォルトの名無しさん
2010/02/14(日) 15:04:23「元の変数」って何?
vector インスタンスのことなら、無理。
0463デフォルトの名無しさん
2010/02/14(日) 15:06:310464デフォルトの名無しさん
2010/02/14(日) 15:24:401.C言語でも扱えるようにAPIの引数や戻り値部分だけあわせておけば
内部でC++で書いていようが問題はない?
2.スタティックリンクライブラリをコンパイルする際にスタティックリンクライブラリが
利用する外部の機能を取り込まないようにするにはどうすればいいですか?
(VC++2008
0465デフォルトの名無しさん
2010/02/14(日) 15:33:30子クラスのヘッダファイルにもオーバーライドするメソッドを、定義しないとダメなんですか?
一応自分でも試してみたんですが、コンパイラ様に怒られたので
0466デフォルトの名無しさん
2010/02/14(日) 15:35:30そんなことはない。
エラーメッセージは?できればソースも出して。
0467デフォルトの名無しさん
2010/02/14(日) 15:36:570468デフォルトの名無しさん
2010/02/14(日) 15:38:57あとメソッドっていう用語は存在しないので、
今後はメンバ関数member functionと
呼ぶようにしなさいね。
0469デフォルトの名無しさん
2010/02/14(日) 15:42:061は、extern "C"もつければおk
2は、「取り込まない」の意味が微妙。
作ってるライブラリをAとして、
AはBというライブラリを使用しているとき、
AにBを含ませたくないという意味?
特殊なことしなければ「取り込まない」状態だと思う。
Aのプロジェクトの中にBのlibファイルを追加すれば
「取り込む」状態になるけど。
0470465
2010/02/14(日) 15:48:08class 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ウィンドウごとに音量を調整、若しくは開いているフラッシュオブジェクトの音量を調整する関数
または手法は無いでしょうか?
0472デフォルトの名無しさん
2010/02/14(日) 16:16:59不便。何でこんな事にしたの。
0473デフォルトの名無しさん
2010/02/14(日) 16:24:09??保たれない場合もあるだろ。何を言いたいのかよく分からんぞ。
0474デフォルトの名無しさん
2010/02/14(日) 16:28:150475デフォルトの名無しさん
2010/02/14(日) 16:41:040476デフォルトの名無しさん
2010/02/14(日) 16:42:040477デフォルトの名無しさん
2010/02/14(日) 16:44:460478476
2010/02/14(日) 16:48:30こんなコードです
DownloadManager *BrowserApplication::s_downloadManager = 0;
HistoryManager *BrowserApplication::s_historyManager = 0;
NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;
0479デフォルトの名無しさん
2010/02/14(日) 16:53:36グローバル変数だね
0480デフォルトの名無しさん
2010/02/14(日) 16:57:510481デフォルトの名無しさん
2010/02/14(日) 16:58:43staticのメンバ変数は、どっかに実体を宣言しないといけない。
0482479
2010/02/14(日) 17:01:50479は間違い
0483デフォルトの名無しさん
2010/02/14(日) 17:04:26の使い方が分かる日本語のサイトを教えてください。
名前空間が
boost::tuplesなのかboost::tupleなのか、
色々混ざっているようなので
ググっても謎です。
現行仕様のboost.タプルのの使い方が分かる日本語のサイトを教えてください。
よろしくお願い申し上げます。
0484デフォルトの名無しさん
2010/02/14(日) 17:05:530485デフォルトの名無しさん
2010/02/14(日) 17:18:100486デフォルトの名無しさん
2010/02/14(日) 17:41:35http://boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html
0488デフォルトの名無しさん
2010/02/14(日) 18:41:11ありがとう
0489デフォルトの名無しさん
2010/02/14(日) 19:06:371行目 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全くの初心者ですがオススメの本ってありますか?
将来仕事にすることも考えてます。
0491デフォルトの名無しさん
2010/02/14(日) 19:14:57独習シリーズ
本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。
0492デフォルトの名無しさん
2010/02/14(日) 19:19:28ありとあらゆる意味でダメ。
期待したとおりに動かないし、(直したとして)保守性も最悪。
窓からソースを投げ捨てるレベル。
0493デフォルトの名無しさん
2010/02/14(日) 19:20:110494デフォルトの名無しさん
2010/02/14(日) 19:20:53ありがとうございます
明日にでも買ってこようと思います
0495デフォルトの名無しさん
2010/02/14(日) 19:23:33動くのかもしれんけどなんかおかしいような
普通はこんな感じじゃない?
とかいって、普段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ちなみにvectorだったらどんな感じになるんですか?
0497デフォルトの名無しさん
2010/02/14(日) 20:30:02元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?
0498デフォルトの名無しさん
2010/02/14(日) 21:17:12std::vector<int> a[N];
for (int i = 0; i < N; ++i)
{
a[i].resize(N - i);
}
0499デフォルトの名無しさん
2010/02/14(日) 21:31:18struct 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));}};
0501デフォルトの名無しさん
2010/02/14(日) 22:41:14実際に試してみたら
VC, gcc, bcc, dmc, OpenWatcom
で全部ガン無視されててフイタwww
むしろIntelの仕様がおかしいって言われそうで不憫だ。
0502デフォルトの名無しさん
2010/02/14(日) 22:45:100503デフォルトの名無しさん
2010/02/14(日) 22:47:11GNU C Compiler ですけど?
0504デフォルトの名無しさん
2010/02/14(日) 22:48:490505デフォルトの名無しさん
2010/02/14(日) 22:53:130506デフォルトの名無しさん
2010/02/14(日) 22:54:050507デフォルトの名無しさん
2010/02/14(日) 22:54:26その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
>>502
お前人の揚げ足取ろうとする嫌な性格のやつなのね?
そのくらい分かることだろ?
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
0508デフォルトの名無しさん
2010/02/14(日) 22:56:510509デフォルトの名無しさん
2010/02/14(日) 23:05:20がフルボッコw
0510デフォルトの名無しさん
2010/02/14(日) 23:06:32あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね
0511デフォルトの名無しさん
2010/02/14(日) 23:10:18その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
0512デフォルトの名無しさん
2010/02/14(日) 23:11:56> 俺は502じゃないが、-std=c99つけてもあかんの
いやだれ一人としてダメなんて言ってないぞ?
0513デフォルトの名無しさん
2010/02/14(日) 23:12:37大きな領域を一度に確保してからplacement newを発動するとか
デストラクタが面倒臭い事になるけど
0515デフォルトの名無しさん
2010/02/14(日) 23:13:480516デフォルトの名無しさん
2010/02/14(日) 23:14:450518デフォルトの名無しさん
2010/02/14(日) 23:21:180519499
2010/02/14(日) 23:21:22template<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));}};
0520483
2010/02/14(日) 23:29:10勉強してきました。
感動しました。
0521デフォルトの名無しさん
2010/02/14(日) 23:30:29> 最適化をしくじるものが存在する(例えば bcc 5.5.1)
> ことに注意されたい。
Boostに名指しされとるww
0522デフォルトの名無しさん
2010/02/14(日) 23:32:420523デフォルトの名無しさん
2010/02/14(日) 23:34:190524デフォルトの名無しさん
2010/02/14(日) 23:35:47標準C++にできるだけ準拠しようとして精一杯で
最適化まで手が回らなかったんだろ
0525デフォルトの名無しさん
2010/02/14(日) 23:49:33何がしたいのかわからん。
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:100528デフォルトの名無しさん
2010/02/14(日) 23:58:27ありがとうございます。
何か追記する必要がありますでしょうか?
0529デフォルトの名無しさん
2010/02/14(日) 23:58:31typename TestClass<T>::SS* TestClass<T>::TestCode(void)
0530デフォルトの名無しさん
2010/02/14(日) 23:59:46ありがとうございます。
コンパイル通りました。
なぜ、先頭に typename と入れる必要があるのでしょうか?
教えて下さい。
宜しくお願いします。
0531デフォルトの名無しさん
2010/02/15(月) 00:01:570532デフォルトの名無しさん
2010/02/15(月) 00:05:55ありがとうございました。
0533デフォルトの名無しさん
2010/02/15(月) 00:07:47こんなサイトがあるんだw
>これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!
0534デフォルトの名無しさん
2010/02/15(月) 02:17:13std::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で、当然、その構造体のメンバとして、
(mallocで確保した領域への)ポインタを持てることも知ってるよね?
0536デフォルトの名無しさん
2010/02/15(月) 02:24:17mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。
つまり、あんまり気にしなくていい。
0537デフォルトの名無しさん
2010/02/15(月) 02:24:26はい
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ちがーう。
std::string をそのまま int か何かと思って同じように扱えばいい。
0540デフォルトの名無しさん
2010/02/15(月) 11:46:06オブジェクト指向を根本的に勘違いしているな
std::stringは一種のクラスであり、それ自体データとメンバ関数の
集まりとして完結しているものだ
だから普通のPOD型の変数や構造体と同じように値返しが出来る
但しこれは当たり前だが、関数の中で定義したローカルstringを
参照返しするような事をすれば、これはstringに限らずどんなデータ型
だとしても未定義の動作となる
0541デフォルトの名無しさん
2010/02/15(月) 21:52:320542デフォルトの名無しさん
2010/02/15(月) 21:53:01C++初心者にオススメ。
ロベールの部屋
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:470544デフォルトの名無しさん
2010/02/15(月) 22:14:200545デフォルトの名無しさん
2010/02/15(月) 22:26:470546デフォルトの名無しさん
2010/02/15(月) 22:43:03Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週
これぐらいかかるかな
0547デフォルトの名無しさん
2010/02/15(月) 22:43:22それはあるわ。Javaって結構綺麗な言語だから、
C++みたいな清濁併せ持ったカオスな言語だと
勉強がいやになってしまうんだよな。
0548デフォルトの名無しさん
2010/02/15(月) 22:46:21あとたくさん本を買わなければならないよ
C++について学べば学ぶほど、たくさんの本が必要になる
中には絶版になってしまったものもあって残念だが
俺は絶版扱いのC++標準ライブラリを一番多用している
手垢が付いてもう真っ黒だぞ
0549デフォルトの名無しさん
2010/02/15(月) 22:59:56> Javaって結構綺麗な言語だから、
そうか?
Javaも結局 謎の仕様を覚えなきゃならんことがあるし、
落ち目の感が否めない
0550デフォルトの名無しさん
2010/02/15(月) 23:02:30謎仕様も多いけど、C++くんに言われとうないわ!
まぁそうだな、綺麗だった、と言い直しとくわ。
0551デフォルトの名無しさん
2010/02/15(月) 23:11:28高級言語の内、
仕様が最も綺麗な言語って何だろう?
実際に役立つかとかはおいといて。
D言語かPython 3系(2系でなく)かな?
0552デフォルトの名無しさん
2010/02/15(月) 23:12:54brainfuck とか whitespace とか
0553デフォルトの名無しさん
2010/02/15(月) 23:13:00Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない
しかしC#からC++に戻るとゲシュタルト崩壊?するわ
C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと
割り切ることができるけどC++のような中途半端だとスゲー悩む
0554デフォルトの名無しさん
2010/02/15(月) 23:17:12http://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:270557デフォルトの名無しさん
2010/02/16(火) 00:43:15ありがとうございます。
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あと、ポインタ返す関数で return 1 は無いだろう。
0559デフォルトの名無しさん
2010/02/16(火) 01:10:51ありがとうございます。
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サルかお前は?
0561デフォルトの名無しさん
2010/02/16(火) 01:43:17class 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ありがとうございました。
0563デフォルトの名無しさん
2010/02/17(水) 07:48:400564デフォルトの名無しさん
2010/02/17(水) 10:43:57メンバ全てを宣言・実装し直さないといけないのでしょうか?
それとも変更点のみで良いのでしょうか?
あと、
template <typename T ,typename S = T>
というデフォルト引数の設定は可能なのでしょうか?
0565デフォルトの名無しさん
2010/02/17(水) 11:03:13クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。
クラステンプレートのメンバ関数ごとに特殊化できなかったっけ?
> template <typename T ,typename S = T>
やってみればいいじゃない。
0566デフォルトの名無しさん
2010/02/17(水) 13:25:55template<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:38template<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 を作製)をするテンプレートは標準であるのでしょうか?
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;
}
};
};
0570569
2010/02/17(水) 19:55:26//こんなの
template<typename T, typename FuncT>
struct GeaterFromLess
{
bool operator()(const T& lh, const T& rh) const
{
return FuncT()(rh,lh);
}
};
std::vector<CHoge> vtHoge;
vtHoge.push_back( CHoge( 4, "hoge" ) );
vtHoge.push_back( CHoge( 1, "foo" ) );
vtHoge.push_back( CHoge( 0, "bar" ) );
vtHoge.push_back( CHoge( 2, "alpha" ) );
vtHoge.push_back( CHoge( 3, "omega" ) );
vtHoge.push_back( CHoge( 1, "hotel" ) );
std::sort( vtHoge.begin(), vtHoge.end(), CHoge::Less() );
std::sort( vtHoge.begin(), vtHoge.end(), GeaterFromLess<CHoge,CHoge::Less>() ); // CHoge::Less() から Greator を作って逆順ソートしたい
0571デフォルトの名無しさん
2010/02/17(水) 20:31:44標準ではなかった気がする
自分で作るかboost::operatorsだな
0572デフォルトの名無しさん
2010/02/17(水) 22:07:41たとえば
vector<string> vec;
vec.push_back("test");
ってやったら
stringの何を呼び出してstringクラスに"test"を入れているんだ?
自作の文字列クラスをvecにつっこんで機能を使わせたいのです
0573デフォルトの名無しさん
2010/02/17(水) 22:13:460574デフォルトの名無しさん
2010/02/17(水) 22:44:090575572
2010/02/18(木) 01:18:05コンストラクタに(const char* )を追加して実行してみました.
ttp://codepad.org/8ai16KPo
どうやら大分ひどいことをしているようなんですが,
コンパイルは通ってしまいます.
ご指導をよろしくおねがいします.
もしくは>>574さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?
0576デフォルトの名無しさん
2010/02/18(木) 01:21:030577デフォルトの名無しさん
2010/02/18(木) 01:32:58暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。
デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。
0578デフォルトの名無しさん
2010/02/18(木) 01:47:45関ポじゃ状態を持てないじゃん
0579デフォルトの名無しさん
2010/02/18(木) 02:01:11http://codepad.org/kAeUsq2i
これでいいと思われます
要するにクラス内部でnew/deleteを行うような場合は
必ずコピーコンストラクタと代入演算子関数は自前で用意
しなければならないという事です
そうしないとクラッシュしたり、メモリリークしたりします
0580572
2010/02/18(木) 02:59:22コピーコンストラクタと代入演算子を作らないといけなかったんですね
わかりやすくコードもひいてくださりありがとうございました
0581デフォルトの名無しさん
2010/02/18(木) 08:36:28operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど)
strlen() してから strcpy() するのってもったいないね。
date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。)
こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス
なんて作るもんじゃないね。みんなわかってると思うけど。
0582デフォルトの名無しさん
2010/02/18(木) 09:51:30やっと理解した。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:050586デフォルトの名無しさん
2010/02/18(木) 12:45:33>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でもまあ、nullチェックしたほうが自然だろな。
0589デフォルトの名無しさん
2010/02/18(木) 13:29:38機械的にチェックするだけ、という意味しかないのなら消すわ
0590デフォルトの名無しさん
2010/02/18(木) 13:34:14void Delete(Obj *p)
{
if(p) _Delete(p);
}
void _Delete(Obj *p)
{
if(p) __Delete(p);
}
・・・
0591デフォルトの名無しさん
2010/02/18(木) 13:45:25dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。
そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが
ノーチェックで問題ないんかえ?
0592デフォルトの名無しさん
2010/02/18(木) 13:47:07んでdelete後にはNULL入れとけボケ
0593デフォルトの名無しさん
2010/02/18(木) 13:53:360594デフォルトの名無しさん
2010/02/18(木) 14:05:06まあとりあえずみんな落ちつけ
0595デフォルトの名無しさん
2010/02/18(木) 14:06:13おかげで自演し放題だわ
0596デフォルトの名無しさん
2010/02/18(木) 14:44:11自演はほどほどに
0597デフォルトの名無しさん
2010/02/18(木) 14:54:030598デフォルトの名無しさん
2010/02/18(木) 14:58:480599デフォルトの名無しさん
2010/02/18(木) 15:11:47「deleteしたらNULL入れる」だけで二重deleteは防げる。
NULLチェックしたって二重deleteは全く防げない。
0600デフォルトの名無しさん
2010/02/18(木) 16:11:57C++は規格票でもNULLより0が推奨されています
0601デフォルトの名無しさん
2010/02/18(木) 16:35:47n行m列のvectorの二次元配列の確保で
vector<vector<int> > v(n,vector<int>(m));
こういう書き方って異端?
0602デフォルトの名無しさん
2010/02/18(木) 16:55:40別に
三次元の場合もその書き方でよく書いてるけど
0603デフォルトの名無しさん
2010/02/18(木) 17:49:15n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念
せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが
0604デフォルトの名無しさん
2010/02/18(木) 19:27:19なるほど、了解
>>603
>n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
直感的にはループの中で剰余と割り算でインデックス計算したりするほうが
遅くなるように思うけど
領域が連続でないことでそんなに遅くなるもん?
0605デフォルトの名無しさん
2010/02/18(木) 19:30:37連続でないってことは内部的に管理する仕組みが動いてるだろうから
インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ
0606デフォルトの名無しさん
2010/02/18(木) 19:58:58普通はかけ算と足し算だと思うが
0607デフォルトの名無しさん
2010/02/18(木) 19:59:25剰余も割り算も使わないよ
v[siz1 * idx2 + idx1]
乗算と和だけ
あとベクタのベクタはメモリに関するコストが増える
0608デフォルトの名無しさん
2010/02/18(木) 20:01:36クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz
0609デフォルトの名無しさん
2010/02/18(木) 20:17:17確かにorz
自分の勘違いも含めたベンチコード
http://codepad.org/FTA8SWtA
vectorにしたら結果が大きく変わるってことはないと思うんで
思ったほど差はない模様
0610デフォルトの名無しさん
2010/02/18(木) 20:52:26まずpartitionがうまく動いてるか調べてみたら?
0611569
2010/02/18(木) 22:35:34boost::operators 調べてみたけど,クラスに operator を自動追加してくれるだけで
関数オブジェクトには利用できないのかな?
ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して,
逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して
ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…
0612デフォルトの名無しさん
2010/02/18(木) 23:01:17何これ?
0613デフォルトの名無しさん
2010/02/19(金) 00:34:01"5"が判断されなくなってしまいます。
マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?
0614デフォルトの名無しさん
2010/02/19(金) 00:53:02http://codepad.org/M0mcikaJ
0615デフォルトの名無しさん
2010/02/19(金) 00:54:44ttp://codepad.org/M0mcikaJ
0616デフォルトの名無しさん
2010/02/19(金) 01:02:390617デフォルトの名無しさん
2010/02/19(金) 01:07:15まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv
0618デフォルトの名無しさん
2010/02/19(金) 01:22:07dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。
どうにもならない。
0619デフォルトの名無しさん
2010/02/19(金) 01:24:05二重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型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?
0621620
2010/02/19(金) 01:37:420622デフォルトの名無しさん
2010/02/19(金) 01:37:50文字列を結合したいならそういう関数を使う。sprintfとか
0623デフォルトの名無しさん
2010/02/19(金) 01:39:05ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。
0624デフォルトの名無しさん
2010/02/19(金) 01:39:47この辺の話はどうにかならんのかね・・・?
0625デフォルトの名無しさん
2010/02/19(金) 02:00:42文字列リテラルの中はマクロ展 されない。
0626620
2010/02/19(金) 02:01:49大変ありがとうございました
0627デフォルトの名無しさん
2010/02/19(金) 02:05:03…
char * a = { TEST };
これでいいんでないの?
0628デフォルトの名無しさん
2010/02/19(金) 02:05:120629デフォルトの名無しさん
2010/02/19(金) 02:06:090630デフォルトの名無しさん
2010/02/19(金) 02:06:370631デフォルトの名無しさん
2010/02/19(金) 02:11:36#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なんかうちの環境が悪いだけでしたあざす
0634デフォルトの名無しさん
2010/02/19(金) 02:29:21これってstaticにする意味って何?
あおりじゃなくてただの素人です
0635デフォルトの名無しさん
2010/02/19(金) 02:30:090636デフォルトの名無しさん
2010/02/19(金) 02:35:19文字コードすべて暗記してint型の配列を確保してエンディアン考慮して
文字を16進数にでもして並べていけばリテラルいらないよ
0637デフォルトの名無しさん
2010/02/19(金) 02:40:11static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。
0638デフォルトの名無しさん
2010/02/19(金) 02:44:40int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);
0639デフォルトの名無しさん
2010/02/19(金) 02:52:21で、そう書く利点は?
0640デフォルトの名無しさん
2010/02/19(金) 02:53:55リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ
0641デフォルトの名無しさん
2010/02/19(金) 02:56:110642デフォルトの名無しさん
2010/02/19(金) 03:05:36private な static メンバ関数ってそういう目的があるんすね
ありがとうございます
0643デフォルトの名無しさん
2010/02/19(金) 03:07:010644デフォルトの名無しさん
2010/02/19(金) 03:10:34いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・
0645デフォルトの名無しさん
2010/02/19(金) 03:12:21誰も嫌とはいってなくね?
0646デフォルトの名無しさん
2010/02/19(金) 03:13:550647デフォルトの名無しさん
2010/02/19(金) 03:15:07勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが
0648デフォルトの名無しさん
2010/02/19(金) 03:24:32文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?
0649デフォルトの名無しさん
2010/02/19(金) 07:23:21解決しちゃったの?
こういう話だと思ったんだけど。
#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:54std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが
0651デフォルトの名無しさん
2010/02/19(金) 07:35:09環境下
0652デフォルトの名無しさん
2010/02/19(金) 08:21:59相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。
0653620
2010/02/19(金) 12:18:39>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。
0654デフォルトの名無しさん
2010/02/19(金) 14:32:42キミがやりたかった事は↓こうする。
#define XSTR(s) #s
#define STR(s) XSTR(s)
#define TEST 5
char * a = { STR(TEST) };
0655デフォルトの名無しさん
2010/02/19(金) 14:33:320656デフォルトの名無しさん
2010/02/19(金) 18:37:56http://yutori7.2ch.net/test/read.cgi/news4vip/1266562555/
0657デフォルトの名無しさん
2010/02/19(金) 22:42:43自分(インスタンス) 演算子 相手(インスタンス)
と書くことが文法で決まっているのですか?
0658デフォルトの名無しさん
2010/02/19(金) 22:48:21うん。
2項演算子だよね?
z = x + y;
ってのはC++の世界では
z = operator ( x ,y );
と等価ってのは知ってる?(x,y,zは組み込み型でないとして。)
0659デフォルトの名無しさん
2010/02/19(金) 22:49:44ってのはC++の世界では
z = operator + ( x ,y );
と等価ってのは知ってる?(x,y,zは組み込み型でないとして。)
の間違い。
0660658
2010/02/19(金) 22:50:52operator = ( z, operator + ( x ,y ) );
と等価ってのも知ってる?
0661658
2010/02/19(金) 22:52:08その場合は
z.operator=( x.operator+(y) );
となる。
0662デフォルトの名無しさん
2010/02/19(金) 23:04:54全くoperatorがわかりません
オーバーロードされた演算子を使う時は、std::cout << "hoge"みたいにな奴ばっかりなので
オーバーロードされた演算子を使う時は書かないとダメなのかな〜と思いました
>自分(インスタンス) 演算子 相手(インスタンス)
0663デフォルトの名無しさん
2010/02/19(金) 23:12:29引数が明確に違ったら別に省略してもいけるはず
0664657
2010/02/19(金) 23:14:350665658
2010/02/19(金) 23:17:55君の聞いている意味が分かった気がする。
もしかして、
メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
関数によるoperatorの定義の区別が付いていないのでは?
0666デフォルトの名無しさん
2010/02/19(金) 23:19:190667657
2010/02/19(金) 23:19:28>メンバ関数によるoperatorの定義とグローバルスコープ(もしくは適当なnamespace内)の
operatorが2種類あるなんて、まったく知りませんでした
0668658
2010/02/19(金) 23:19:58コンパイラが自動的に*thisを第1引数として渡しているので、
あながち
>左側のインスタンスは絶対必要
と言えなくもない。
0669658
2010/02/19(金) 23:23:08メンバ関数による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)
{
//あーしろ、こーしろ
}
0670658
2010/02/19(金) 23:24:44そのページの下部の
Compクラスの実装をみてくれ。
これがメンバ関数によるoperatorの定義だ。
0671デフォルトの名無しさん
2010/02/19(金) 23:25:261+xはエラーで
x+1はx.operator+(1)となるのでエラーにならないってケースがあるよ
グローバルに定義すれば上のどちらもOKになる
0672658
2010/02/19(金) 23:26:47ttp://homepage2.nifty.com/well/Operator.html
これで決着だった。
このサイトには
クラスのメンバ関数として定義する方法
グローバル関数として定義する方法
が紹介されていたわ。
とりあえずこれを2回は読むこと!
0673デフォルトの名無しさん
2010/02/19(金) 23:33:32他のクラスとの演算は非メンバじゃないと対称性が崩れてしまう
0674デフォルトの名無しさん
2010/02/19(金) 23:36:01まだわからない所があるので、少し調べてからまた質問します
ありがとうございました
0675デフォルトの名無しさん
2010/02/20(土) 15:38:17{
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:380677デフォルトの名無しさん
2010/02/20(土) 16:16:070678デフォルトの名無しさん
2010/02/20(土) 16:39:50自分で定義した変数を自分で変更してしまうのを防ぎたいってこと?
んなことあるわけないか
変更されるのを禁止したいならクラス等でラップすればいいじゃん
0679デフォルトの名無しさん
2010/02/20(土) 16:54:57const_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:03std::string strHoge, strFoo;
const std::string &cstrHoge = strHoge, &cstrFoo = strFoo;
ってしといて、基本 cstrHoge, cstrFoo しか使わないとか。
0681デフォルトの名無しさん
2010/02/20(土) 17:00:10{
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ポインターなんか使わずに参照を使えばぬるぽのチェックは要らないのに
0683デフォルトの名無しさん
2010/02/20(土) 17:04:11OK
0684675
2010/02/20(土) 17:18:07>自分で定義した変数を自分で変更してしまうのを防ぎたいってこと?
yes
関数の冒頭で宣言と初期化はするけど,それ以降は参照だけされて変更はされない
というよくあるシチュエーションを明示しておきたいんです
なので >>680 さんみたいに const を後付けしたいけど,non const を残しておきたくない…
void func_sub(const std::string& strHoge, const std::string& strFoo)
{
//処理
}
void func()
{
std::string strHoge;
std::string strFoo;
bool bOk = GetPathHogeFooBar( &strHoge, &strFoo );
func_sub( strHoge, strFoo );
}
というわけでこういうのも考えた.やりたいことはまさにこういったことなんだが
strHoge, strFoo 以外の変数が多数あると引数の数が大変なことになるか…
やはり >>679 さんみたいなやり方のが良いかな…
>>682 Bar がいらない場合もあるんですよ.パスを分解して全部ほしいとか,フォルダだけほしいとか…
0685デフォルトの名無しさん
2010/02/20(土) 17:22:53こんなクラス作って必要なのだけゲットすればポインタは無くせられる。
class PathDivider
{
public:
PathDivider(const string& OrginFileName);
string getFile()const;
string getPath()const;
string getFullPath()const;
};
0686デフォルトの名無しさん
2010/02/20(土) 17:30:30あれ? const 外せば全部解決じゃね?
goto >>675
0687デフォルトの名無しさん
2010/02/20(土) 17:33:11クラスつくるとかってパターンあるよね。
0688デフォルトの名無しさん
2010/02/20(土) 17:35:41てか、むしろ作ることを勧める。
0689デフォルトの名無しさん
2010/02/20(土) 17:55:00boost::tupleもあるよ
0690デフォルトの名無しさん
2010/02/20(土) 18:32:30{
};
こういう構造体があります。
これはhugaというクラスを継承した構造体ですか?
構造体が継承ってできるんでしたっけ?
0691デフォルトの名無しさん
2010/02/20(土) 18:34:520692デフォルトの名無しさん
2010/02/20(土) 18:36:580693デフォルトの名無しさん
2010/02/20(土) 18:38:32最初からできてる。
0694デフォルトの名無しさん
2010/02/20(土) 18:51:040695デフォルトの名無しさん
2010/02/20(土) 18:53:09普通は構造体にすると思うけど。
0696デフォルトの名無しさん
2010/02/20(土) 18:55:17メンバ関数関連はどうだろう
一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ
0697デフォルトの名無しさん
2010/02/20(土) 18:59:33その通り
0698デフォルトの名無しさん
2010/02/20(土) 19:01:02とは書けるが
template <struct T>
とは書けないんだっけ?
0699デフォルトの名無しさん
2010/02/20(土) 19:10:14こういうことだぞ。
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自作した関数のインテリセンスに関数の説明というかコメントも追加したいのですが
どうすればいでしょうか?
ヘッダファイルに書けばいいのでしょうか?
0701デフォルトの名無しさん
2010/02/22(月) 07:07:060702デフォルトの名無しさん
2010/02/22(月) 07:09:510703デフォルトの名無しさん
2010/02/22(月) 11:17:590704デフォルトの名無しさん
2010/02/22(月) 13:46:38class foo{
static std::string a;
void bar();
public:
std::string baz();
operator std::vector<char>();
};
0705デフォルトの名無しさん
2010/02/22(月) 13:54:47これだから携帯は…
0706703
2010/02/22(月) 14:38:180707デフォルトの名無しさん
2010/02/22(月) 21:01:41> メンバ関数関連はどうだろう
> 一応構造体の方にも関数ポインタで関数貼り付ければそれっぽいことはできるけどさ
何を言っているんだ?
いったいどこの言語のお話?
0708デフォルトの名無しさん
2010/02/22(月) 21:09:48さらにCとの互換性のある構造体をPODと言う
0709デフォルトの名無しさん
2010/02/22(月) 21:14:00>さらにCとの互換性のある構造体をPODと言う
違わないか
0710デフォルトの名無しさん
2010/02/22(月) 21:45:24普通の変数と名前がバッティングするかしないかとかそんなやつ
Cのstructとの違い、っだったかもしれんが
0711デフォルトの名無しさん
2010/02/22(月) 21:51:20C++では違いは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決定打ありがとうございます。
0714デフォルトの名無しさん
2010/02/22(月) 22:36:40コンパイル環境に特定のヘッダファイルがあるかどうかをプリプロセッサで判定するにはどうしたらよいですか?
#if defined ( __windows_h__ )
・
・
・
#elif defined ( __unistd_h__ )
・
・
・
#endif
みたいに書けたらいいけど、必ず __xxx_h__ が設定されているって保証はありませんよね?
0715デフォルトの名無しさん
2010/02/22(月) 22:40:21podってのは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ヘッダファイルがなかったらどうなるの
0717デフォルトの名無しさん
2010/02/22(月) 23:03:52単独では無理。
強いて言えば configure とかを使う。
0718デフォルトの名無しさん
2010/02/23(火) 07:08:250719デフォルトの名無しさん
2010/02/23(火) 11:23:44関数はそれぞれ独立するけどローカル変数は共有されるって認識でおk?
つまりバグる?
0720デフォルトの名無しさん
2010/02/23(火) 11:27:28バグなのかどうかは自分の書くプログラム次第だろ
staticをつけることで自分の予期していない動作になるならバグだろうし
そうじゃなければ立派な仕様だよ
0721デフォルトの名無しさん
2010/02/23(火) 11:29:35関数のstaticはスコープの制限なので、
関数にstaticをつけようがつけまいが関数の実体は一つ。
(C++のメンバ関数の話なら、static は this が渡されるか否かの違い。)
0722719
2010/02/23(火) 11:57:520723デフォルトの名無しさん
2010/02/23(火) 11:59:37関数内でstaticな領域持たなければ問題ないよ
0724719
2010/02/23(火) 12:03:58staticの変数持っている関数にアクセスすると問題ありって認識でおk?
0725デフォルトの名無しさん
2010/02/23(火) 12:07:42あるかもしれないし、ないかもしれない。
ひとつのスレッドの都合で読み書きしてるんならマズイだろうし、
スレッド間で情報を共有するつもりで static にしてるんなら、適切な同期さえ
入れてあれれば問題ないだろう。
0726デフォルトの名無しさん
2010/02/23(火) 12:08:55だから自分で想定した動作するならどう使おうが問題ないって
期待した動作しないなら駄目なんだって
0727デフォルトの名無しさん
2010/02/23(火) 12:09:29using 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何のサイズが欲しいの?
0729デフォルトの名無しさん
2010/02/23(火) 12:13:100730デフォルトの名無しさん
2010/02/23(火) 12:18:44>>729
ありがとう
テンプレートってsugoiですね
0731デフォルトの名無しさん
2010/02/23(火) 12:24:05const char* p
この違いをわかってないだろうなあ・・・
0732デフォルトの名無しさん
2010/02/23(火) 12:46:40MSのeraい人のお言葉だ
http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx
あと"-fthreadsafe-statics"もぐぐっとけ
0733デフォルトの名無しさん
2010/02/23(火) 12:53:22http://page.freett.com/cardno4/SelfStudy/1syu/IStady1Syu04_004.html
0734デフォルトの名無しさん
2010/02/23(火) 13:37:480735デフォルトの名無しさん
2010/02/23(火) 14:02:38関数に渡すとサイズ情報が消える(ポインタに成り下がる)という C の
ルールがわかりにくいって話だろうね。
0736デフォルトの名無しさん
2010/02/23(火) 14:06:21成り下がるというかCなんてアセンブラで書いてらんねえという
のでできたような言語なのでそもそもそんな親切機能はないよ
最近のVM上で動くような言語だとVM側が管理してるので容易に
アクセスできるけどさ
あとC++のstd::stringあたりも一応持ってるのか
あれも実体はテンプレートじゃなかったっけ?
0737デフォルトの名無しさん
2010/02/23(火) 14:09:55何言ってんのかわけわからねぇ。
親切機能って何のこと?それはVMが管理することと関係あるの?
std::string が何を持ってるって?それはテンプレートであることと関係あるの?
まぁ初心者スレで適当なことフイてんじゃねーよ。
0738デフォルトの名無しさん
2010/02/23(火) 14:15:05頭大丈夫か?
0739デフォルトの名無しさん
2010/02/23(火) 14:17:110740デフォルトの名無しさん
2010/02/23(火) 14:30:400741デフォルトの名無しさん
2010/02/23(火) 14:42:55あちこちだめ。
0742デフォルトの名無しさん
2010/02/23(火) 14:54:18これであってたっけ?
もう普段無意識で書いてるから間違ってたらごめん
0743デフォルトの名無しさん
2010/02/23(火) 14:57:190744デフォルトの名無しさん
2010/02/23(火) 15:03:16その次がconst char* p
0745デフォルトの名無しさん
2010/02/23(火) 15:04:420746デフォルトの名無しさん
2010/02/23(火) 15:08:57どれにいってるのかわからん
でも左の箱が関数が貰う部分だろ?
0747デフォルトの名無しさん
2010/02/23(火) 15:17:100748デフォルトの名無しさん
2010/02/23(火) 15:25:26配列は指し示すものじゃない
http://codepad.org/lua0iFiJ
0749デフォルトの名無しさん
2010/02/23(火) 15:38:00char const **pp = &(char const *){"abc", "def", "ghi"};
これってメモリ配置としてみるとどうなってるんです?
>>742のような図で書くと・・・
0750デフォルトの名無しさん
2010/02/23(火) 15:45:200751デフォルトの名無しさん
2010/02/23(火) 15:56:44> char const **pp = &(char const *){"abc", "def", "ghi"};
これ規格上有りか? gccは警告出力する。
0752デフォルトの名無しさん
2010/02/23(火) 16:00:30警告を書けって
C99は有効にしたか?
0753デフォルトの名無しさん
2010/02/23(火) 16:31:42HTMLとCSSくらいしか出来ないから土台作りからやろうと思ってJavaやってます
最終的にはC++で作りたいんだけど、
多少苦労してもちゃんと理解できるならそのままC++にいっていいんだろうか
0754デフォルトの名無しさん
2010/02/23(火) 16:44:51本書の答えとして下記の式があったのですが、どうして素数が導きだされるのか分かりません。
どなたか解説宜しくお願いします。
#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学習そのものを面白がれる人なら、「まずは○○言語から」とかそういう順序は
まったく考えなくていいんだけどね。この辺はその人その人の性質次第。
頭の良し悪しもあまり関係ない、と思う。
0756デフォルトの名無しさん
2010/02/23(火) 16:50:00numに来たってことは
それまでのすべての数で割りきれなかったってこと
これって素数の定義でしょ
0757デフォルトの名無しさん
2010/02/23(火) 16:54:35printf("%dは素数ではない\n",num);
break; /* これ重要 */
}
こういうことか?
0758デフォルトの名無しさん
2010/02/23(火) 16:56:46順番が違う気がする。普通、C言語から始めるもんじゃないのか。
0759デフォルトの名無しさん
2010/02/23(火) 17:14:26例えばscanf("%d",&num);に8を入れたとして
for内にi<=numがあるからnum==8は真に。
この時点でどんな数を入れても真になるような気がして。
0760デフォルトの名無しさん
2010/02/23(火) 17:15:090761デフォルトの名無しさん
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みなさんのおかげで分かりました。
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返信おくれました、ありがとうございました。
こうやって表にしてみると考えやすいです。
またループで分からなくなったらこういった表を作って理論付けていきたいと思います。
ホント慣れないとダメですね…8を入れたんだからnum==8じゃないかと端から決め付けている自分がいたり。
みなさん本当に感謝です。
0764デフォルトの名無しさん
2010/02/23(火) 18:24:52$ 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:49if(i>sqr(num)){
にするとループ回数が減らせられるね。
0766デフォルトの名無しさん
2010/02/23(火) 20:57:31それもそうだけど、毎回そうやって判定したいのならループの終了判定処理はいらなくね
0767デフォルトの名無しさん
2010/02/23(火) 21:31:39環境はWindowsのVC++6.0です。
コンソールアプリを作っています。
子プロセスの処理終了後、親プロセスに子プロセスの終了と結果を返したいのですが、どうすればよいのでしょうか。
子プロセス生成後、親プロセスは別処理を行いたいため(子プロセスの終了をwaitしない)シグナルでプロセスの終了を検知しようとしたのですが、
SIGCHLDがVC++6では使えないとお聞きしました。
何か別の方法がありましたら、ご教授お願いいたします。
0768デフォルトの名無しさん
2010/02/23(火) 21:42:570769デフォルトの名無しさん
2010/02/23(火) 21:46:13非同期シグナルなんぞやれてもやるもんじゃねえよ
0770デフォルトの名無しさん
2010/02/23(火) 21:48:40親としてみると子の処理結果はそんなにどうでもいいものなの?
アプリ終了時にファイルに書き出すだけでいいとかその程度なのかな?
0771デフォルトの名無しさん
2010/02/23(火) 22:07:09別にスレッドを作成して、そこでwaitをするということでしょうか。
>>770
最良はこの処理が完了して、その結果を親に受け渡してそれを受けてまた処理を・・・ということなんですが、それが無理そうであればこの処理が完了した。
ということだけでも受け取りたいと思っています。
0772770
2010/02/23(火) 22:08:39子プロセスの処理です。
すみません。
0773デフォルトの名無しさん
2010/02/23(火) 22:24:13・子プロセスを逐次処理するスレッドを作る
・メインで子プロセスを逐次処理し、他にやりたいことを別スレッドでやる
0774デフォルトの名無しさん
2010/02/24(水) 00:27:200775デフォルトの名無しさん
2010/02/24(水) 00:55:470776デフォルトの名無しさん
2010/02/24(水) 03:40:27WaitForSingleObject(handle, 0)
で待たないですぐ帰ってくるよ
0777デフォルトの名無しさん
2010/02/24(水) 06:50:02こいつはマルチポストだから相手にしないように!
0779デフォルトの名無しさん
2010/02/24(水) 17:35:19よろしくお願いします。
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型おかしくない?
0781デフォルトの名無しさん
2010/02/24(水) 17:53:3832ビットx86向けならVC++だと/arch、gccだと-mfpmath/-marchのようなオプションを使わないとSSEとか勝手に使わない
だってSSEの無いCPUで動かないじゃん
同じ命令が実行されるなら別PCでも同じ結果だよ
0782デフォルトの名無しさん
2010/02/24(水) 17:58:45a <= z
とかでできるけど、日本語のひらがなカタカナ漢字はどうすりゃええの?
0783デフォルトの名無しさん
2010/02/24(水) 17:59:16レスありがとうございます。
「SSEとか勝手に使わない」という場合、それは「x87FPUを使う」という意味なのでしょうか?
それとも「x87FPUすら使わない」という意味なのでしょうか?
もし、素っ頓狂な質問してたらすいません。
0784デフォルトの名無しさん
2010/02/24(水) 18:02:11文字コードに合わせて範囲チェック
0785デフォルトの名無しさん
2010/02/24(水) 18:15:10と一瞬思いかけたけど、別に素敵でもなかった。
0786デフォルトの名無しさん
2010/02/24(水) 18:19:390787デフォルトの名無しさん
2010/02/24(水) 18:26:40誤字抽出に使えるかもしれん。
熟語でも片方の漢字でツクリを間違ってるとかが取り出せるかも。
ほんとどうでもいいけどな。
0788デフォルトの名無しさん
2010/02/24(水) 18:35:17x86向けでsoft-floatがデフォルトの処理系が有ったら知りたい
0789デフォルトの名無しさん
2010/02/24(水) 19:16:01亜の一バイトめがffffff88になるんだが
なんでじゃ
0790デフォルトの名無しさん
2010/02/24(水) 19:17:47普通にfloat変数を使っていれば、x87FPUが使われ、環境依存は受けない
ということですね。
ありがとうございました。
安心して自前演算ライブラリ作れます。
0791デフォルトの名無しさん
2010/02/24(水) 19:17:49そういうとこに浪漫を見つけるのがプログラマっぽいな
0792デフォルトの名無しさん
2010/02/24(水) 19:18:20符号付整数のまま char → int の拡張を行ってるから
unsigned char → int なら 0x088 になるよ
0793デフォルトの名無しさん
2010/02/24(水) 19:20:45ふはは
できおったわ
ありがとうございました。
0794デフォルトの名無しさん
2010/02/25(木) 02:26:00ところでそういう用途ならfloatよりdoubleのほうがよくない?
floatの精度ってコンパイラに依存したりするし。
0795デフォルトの名無しさん
2010/02/25(木) 02:32:09double でも環境依存なのは同じなんだけど、誤差が問題になりにくくなるってことだよね?
0796デフォルトの名無しさん
2010/02/25(木) 09:26:420797デフォルトの名無しさん
2010/02/25(木) 10:58:09求めているのは「同EXEを実行したときに環境依存にならないこと」です。
>>794さんのおっしゃるような「コンパイラ依存」であれば問題はありません。
0798デフォルトの名無しさん
2010/02/25(木) 11:34:38使うけれど、SSE2の方が早いのでこっちを使う。64ビットなので環境依存は無い。
0799デフォルトの名無しさん
2010/02/25(木) 11:44:18つまり内部でも64bit仮数モード(temporary real)は使っていない。
0800デフォルトの名無しさん
2010/02/25(木) 11:50:03それが気になるなら/fp:strictを使うしかない。パフォーマンスが大きく落ちるけど。
> fast - "fast" 浮動小数点モデルです。結果の予測が困難になります
> precise - "precise" 浮動小数点モデルです。結果は予測可能です
> strict - "strict" 浮動小数点モデルです (/fp:except を暗示)
0801デフォルトの名無しさん
2010/02/25(木) 11:58:0664bitWindows用のVC++では関数の呼び出しや戻値の規約で
実数はXMMレジスタを使うことになってる。
で関数の中の計算はFPU使っててワロス(オプションで変わるけど)
0802デフォルトの名無しさん
2010/02/25(木) 12:11:01アセンブリ出力見て、各命令の仕様を調べればいいんじゃないの?
CPU 命令の動作として環境ごとに動作を振り分けるようなことは無いと思うんだけどね。
0803デフォルトの名無しさん
2010/02/25(木) 12:38:56FPU制御ワードで、単精度(24)、倍精度(53)、拡張精度(64)選べるな。
それじゃ、誤差が処理系に依存というのも正しく使えば避けられると
いう結論。
0804デフォルトの名無しさん
2010/02/25(木) 13:10:08すいません。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すいません。話を整理しますと
「3Dの行列演算など」をD3DXというMicrosoftのライブラリで行うと、環境によって結果に差がでてしまうのです。
これは、D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
(SSE使ったり、3DNow!使ったり)
描画だけであればそれでいいのですが、ゲームの当たり判定などのロジック部分でも使っていると、
通信対戦やリプレイファイルの再生などで差がでてしまいます。
では、自前でライブラリ作ろう。という話になったのですが、3Dゲームが作れようがCPUの仕組みなどについてはド素人。
「float の単純な掛け算とか足し算は、まさか環境によって差が出たりしないよな?まさかな?」
という不安がぬぐえず、相談しに来ました。
現状のところ問題はなさそうなのかな。といった感じですが…。
今まで分かったと思っていることは
・SSEやSSE2を使う場合、コンパイルオプションをいじったり、インラインアセンブラなどを使う必要がある
・つまり、そうしなければSSE2などは使われない
・そうするとデフォのx87FPUが使われる
・x87FPUは古くからあり、Windows環境で使えない環境はもはや無い。また、環境によって計算結果が変わることもない
ツッコミどころあれば、よろしくお願いします。
0807デフォルトの名無しさん
2010/02/25(木) 13:43:20そこまで気になるならソフト書いてログを取ればいいんじゃないの?
試したい判定処理とかを数フレーム分行うようなロジック書いて
各フレームごとの計算結果を出力して送ってもらうとか
でexeばら撒いて結果集めればいいだけのような気もするし
0808デフォルトの名無しさん
2010/02/25(木) 14:03:490809デフォルトの名無しさん
2010/02/25(木) 14:13:25お前、見ず知らずの人間がテストと称してばらまいた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不可能かどうかもわからんからデータ集めろといったんだが
同じテストプログラムをいろんな環境で動かしてその際の数字を比べれば一目両全だろう
上でやった話は規格をあわせてるから「たぶん」同じのはず・・・ということだろ?
0814デフォルトの名無しさん
2010/02/25(木) 14:48:37答えられない人間が「データ集めろ」というのは筋違いすぎると思うんだが
データ集めて確認する気とできる環境ががありゃ、聞くまでもなくチェックするだろJK
0815デフォルトの名無しさん
2010/02/25(木) 14:52:270816デフォルトの名無しさん
2010/02/25(木) 14:53:39ゲームならそこまで精密にしなくていいし
0817デフォルトの名無しさん
2010/02/25(木) 14:58:540818デフォルトの名無しさん
2010/02/25(木) 15:00:530819デフォルトの名無しさん
2010/02/25(木) 15:05:01あるならどれくらいの誤差がでるかでどうごまかすかを考えればいいだけだろ
データが無いのにあれこれ考えたって始まるわけがない
0820デフォルトの名無しさん
2010/02/25(木) 15:11:46何も知らずに騒ぐだけの人は、親切しているつもりかもしれんけど脱線させてるだけだよ
0821デフォルトの名無しさん
2010/02/25(木) 15:18:56printfの結果が全てのWindows環境で一致するのか?って質問だろ?
どうなん実際?
float f = 0.1657387f;
for(int i = 0; i < 100; ++i)
{
f *= 1.123458381f;
}
printf("%f", f);
0822デフォルトの名無しさん
2010/02/25(木) 15:36:36SSE使う時と3DNow!使う時の動作の違いに関して説明出来なきゃダメ。
「わからないけど、ライブラリ作り直してみよう」なんてのは徒労に
終わる可能性大。
0823デフォルトの名無しさん
2010/02/25(木) 16:20:38お前なんの話してんの?(苦笑)
0824デフォルトの名無しさん
2010/02/25(木) 16:24:21void 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え、デフォルトって_set_SSE2_enableが1の状態だっけ?
0826デフォルトの名無しさん
2010/02/25(木) 16:29:11SSE2 の実装を有効にする場合は 1。SSE2 の実装を無効にする場合は 0。既定では、SSE2 の実装をサポートするプロセッサでは有効になっています。
0827デフォルトの名無しさん
2010/02/25(木) 16:36:36>>826
その言い回しって、つまりどういうこと?
SSE2がある実行環境なら、勝手にSSE2が使われるってこと?算術関数の中で。
プロセッサって実行環境側の話だよね?
0828デフォルトの名無しさん
2010/02/25(木) 16:42:44>>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今のところ自動ベクトル化をサポートしてるのはインテルのコンパイラくらいかな。
0830デフォルトの名無しさん
2010/02/25(木) 16:43:04doubleの有効桁は15,6しか無いんだから不思議じゃ無い。
0831デフォルトの名無しさん
2010/02/25(木) 16:52:43流れ嫁
0832デフォルトの名無しさん
2010/02/25(木) 17:13:010833デフォルトの名無しさん
2010/02/25(木) 18:01:59これについては「SSE2が使える環境同士」なら互換性はありそうだな。
まあ怖ければ無効にしておくのも手か。
結局のところ(俺も気にしたことなかったので知らんのだが)
普通にfloatの計算を書く限りは、全部x87で動作するみたいね?
0834デフォルトの名無しさん
2010/02/25(木) 18:16:530835デフォルトの名無しさん
2010/02/25(木) 18:18:570836デフォルトの名無しさん
2010/02/25(木) 18:21:06そこまでくるとそもそもバス帯域から整数演算能力までバランス取れてないよ
0837デフォルトの名無しさん
2010/02/25(木) 18:36:56コンパイラはx87のコードを生成して問題ない。
0838デフォルトの名無しさん
2010/02/25(木) 18:50:22char a[2];
}
この構造体の実体を10個作成し(TES tes[10])、それぞれのメンバaには"A","B","C","D"…と順番に
文字が入っているとします。
10個の実体をvector配列に入れ、例えばメンバaが"C"のtesだけを削除したい場合どのような操作をすれば
よいのでしょうか?
eraseで削除したい場所を指しているイテレータを指定すればよいことは分かっているのですが、3番目の
要素をイテレータで指定する方法が分かりません…
0839デフォルトの名無しさん
2010/02/25(木) 18:57:02http://support.microsoft.com/kb/102555/en
0840デフォルトの名無しさん
2010/02/25(木) 19:20:30v.begin() + 2
0841デフォルトの名無しさん
2010/02/25(木) 19:28:27begin()に整数足せたんですか… てっきりエラーになると思っていました。
お蔭様でうまくいきました。ありがとうございます。
0842デフォルトの名無しさん
2010/02/25(木) 19:31:01find_ifで探す
0843デフォルトの名無しさん
2010/02/25(木) 19:40:28蛇足だけど、+ 使えるのは random access iterator の時だけなんで、list の時なんかは無理。
一応、std::advance ってのがある。
0844デフォルトの名無しさん
2010/02/25(木) 19:45:54const 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パフォーマンスがガタ落ちしてることに気づかない人が出るから
0847デフォルトの名無しさん
2010/02/25(木) 20:10:260848デフォルトの名無しさん
2010/02/25(木) 21:27:100849デフォルトの名無しさん
2010/02/25(木) 21:30:500850デフォルトの名無しさん
2010/02/25(木) 22:43:54> D3DXが「その環境その環境で、最も速度が速い方法を採用するため」というが原因です。
これは、D3DXの実装として、そのような動作を組み込んでいるからだということが分かれば後は分かりそうなもんだけど
0851デフォルトの名無しさん
2010/02/25(木) 22:45:223DXの内部がやるように、SSE2を使う!とか明示的にしない限り、x87だってこと?
でも算術演算系が実は勝手にSSE2使ったりとか、結構色々あるね
FLOAT使って環境誤差無しってのは超難しいのかしら
0852デフォルトの名無しさん
2010/02/25(木) 22:48:52それって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:34SSE2が使えない環境でそれは動くのか?という。
0856デフォルトの名無しさん
2010/02/25(木) 23:04:15if(__sse2_available)
{
}
else
{
}
的になってる
用意してくれたものなら動くかどうかの心配はいらない
0857デフォルトの名無しさん
2010/02/25(木) 23:20:08それなら_set_SSE2_enableって何のために使うの?
0858デフォルトの名無しさん
2010/02/25(木) 23:21:29if(__sse2_enable && __sse2_available)
{
}
else
{
}
ってな感じになってるってことかな?
0859デフォルトの名無しさん
2010/02/25(木) 23:23:59同じプログラムが、環境によって結果が変わるなんて考えたこともなかったです
0860デフォルトの名無しさん
2010/02/25(木) 23:37:100861デフォルトの名無しさん
2010/02/25(木) 23:39:48VC10RCだとこんな感じ
int _set_SSE2_enable(int flag)
{
return __sse2_available = !!flag & IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)
}
実際にはIsProcessorFeaturePresentの結果はまた別の変数に保存して有るけどな
0862デフォルトの名無しさん
2010/02/25(木) 23:39:58_set_SSE2_enable(0)はSSE2が使えるCPUでFPUを使いたい場合に指定する。
SSE2のない場合に1にしようとしてもエラーになるはず。
0863デフォルトの名無しさん
2010/02/25(木) 23:57:56_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ここ余計でした。
0865デフォルトの名無しさん
2010/02/26(金) 00:41:110866デフォルトの名無しさん
2010/02/26(金) 01:44:43#include <cstddef>
main()
{
char* s = NULL;
char* p = s;
std::cout << p;
}
を実行すると出力のところでエラーが出て強制終了するのですがなぜでしょう
0867デフォルトの名無しさん
2010/02/26(金) 01:46:490868デフォルトの名無しさん
2010/02/26(金) 01:48:330869デフォルトの名無しさん
2010/02/26(金) 01:48:39char*をint*にすると0000000が出力されるのですが・・・
0870デフォルトの名無しさん
2010/02/26(金) 01:50:04NULLを0とする環境?だかコンパイラってことでしょ
0871デフォルトの名無しさん
2010/02/26(金) 01:50:11cout は char* を受け取ったら
もしかして文字列なんじゃね?
と判断してメモリの内容を読もうとするから
0872デフォルトの名無しさん
2010/02/26(金) 01:51:51とかかけるからなあ
まあcの構文が分かりにくいってのもあるんだろうな
0873866
2010/02/26(金) 02:04:57int*の場合はアドレスとして解釈されており、
char*の場合はたとえ文字列として解釈されても
NULL文字を出力すること自体に問題はない気がするのですが
0874デフォルトの名無しさん
2010/02/26(金) 02:07:34NULL と NUL文字 は全く関係ないよ
0875デフォルトの名無しさん
2010/02/26(金) 02:08:09std::cout << &p;
std::cout << *p;
あれどっちだっけ?w
0876デフォルトの名無しさん
2010/02/26(金) 02:15:08まあどっちもアドレスなんだけど数値と文字じゃあ扱いが違うからねえ
intの場合だと今もっとも多いので4バイトか
charの場合\0がでるまでひたすら読み込もうとするからねえ
それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ
0877デフォルトの名無しさん
2010/02/26(金) 02:21:31_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そうでしたか。ありがとうございます。
>>876
「charの場合\0がでるまでひたすら読み込もうとする」ことが上記のエラーとどう関連しているのかわからないのですが・・・
それと、「触れない」というのは触ることができない、という意味でしょうか。それとも目にすることがない、という意味でしょうか。
0879デフォルトの名無しさん
2010/02/26(金) 02:58:14〜if等の条件指定もできるんですね。
イテレータのことはあまり知らないので勉強します
ありがとうございました。
0880デフォルトの名無しさん
2010/02/26(金) 03:02:56char *s = NULL; // 0番アドレスを指すポインタ(NUL文字を格納したアドレスでは無い)
0881デフォルトの名無しさん
2010/02/26(金) 03:25:58その0番アドレスがcoutで出力されないのはどうしてなのでしょう
0882デフォルトの名無しさん
2010/02/26(金) 03:36:170883デフォルトの名無しさん
2010/02/26(金) 03:52:20アクセス出来ないように保護されてるから。
それが>>876の言う
>それにアドレス0x00000000なんてほとんどの環境で触れないような場所だと思うよ
0884866
2010/02/26(金) 04:02:08理解力に乏しく何度も質問してしまいましたが、見捨てずに答えてくださった皆さんありがとうございます。
0885デフォルトの名無しさん
2010/02/26(金) 04:07:20それはアクセス違反で落ちるはずだが
0886デフォルトの名無しさん
2010/02/26(金) 04:27:040887デフォルトの名無しさん
2010/02/26(金) 06:00:08予約してたりするんじゃないかな?
ユーザーが使えるのはメモリ空間のうち真ん中くらいで0x0000000とか0xFFFFFFFF付近なんて
システム予約で一般的なプログラムはほぼ触れない領域になってるはず
だからこそ何もセットされてないという意味のNULLに0x00000000だったりするんだけどね
0888デフォルトの名無しさん
2010/02/26(金) 07:19:16ここいらへんに素人臭を感じる。
0889デフォルトの名無しさん
2010/02/26(金) 07:24:51PC9801やPC/AT互換機とか言ってもわからねーだろ
DOS時代にすでに予約されててそのまま来ちゃってるのは知ってるよ
インタラプトいじってたんだし
0890デフォルトの名無しさん
2010/02/26(金) 07:27:400891デフォルトの名無しさん
2010/02/26(金) 07:32:170892デフォルトの名無しさん
2010/02/26(金) 08:00:110893デフォルトの名無しさん
2010/02/26(金) 08:33:110894デフォルトの名無しさん
2010/02/26(金) 09:07:28A.resize(2);
ってやるとA[0],A[1]が確保されるの?
A[2]までは確保されないよね?
0895デフォルトの名無しさん
2010/02/26(金) 10:22:190896デフォルトの名無しさん
2010/02/26(金) 12:25:50NULL = (void *)0 が実アドレスでも 0 であるとはかぎらない。
0897デフォルトの名無しさん
2010/02/26(金) 12:32:11以降ヌルポインタの実装に関わる話は無しでおねがいします。
0898デフォルトの名無しさん
2010/02/26(金) 12:32:50end()の関係で値返さないとならないので、物理的には[2]も確保されている。
但し使用してはいけない。
0899デフォルトの名無しさん
2010/02/26(金) 12:40:080900デフォルトの名無しさん
2010/02/26(金) 12:45:49それはない。
0901デフォルトの名無しさん
2010/02/26(金) 13:29:02http://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:58resize(2) なら size() は 2 を返すだろうが
capacity() が 2 かどうかは判らない。大抵は 2 だろうけども。
0904デフォルトの名無しさん
2010/02/26(金) 17:08:07SSEやらSSE2を使うためには
・アセンブラ、インラインアセンブラで書く
・コンパイルオプションでSSEやSSE2を指定する(ただし、SSEを指定した場合、SSEが無い環境では動作しなくなる。SSE2も同様)
という明示的な方法が必要なもよう。
つまり、単なるfloat計算をして、デフォのコンパイル設定でコンパイルしている限りはSSEなどが使われることはない。
D3DXが内部できちんと使い分けてくれるのは、D3DXがそのようにきっちり実装されているからということですね。
よって
「D3DXを使わないで、自前のfloat計算ライブラリを使えば、環境依存によるバグは発生しない」
と言えるのではなかろうか。
それとは別に、 _set_SSE2_enableを適切に使っておかないと、SSE2がある環境と無い環境で、atanなどの結果が異なってしまうと思われ?
0905デフォルトの名無しさん
2010/02/26(金) 17:53:06今新規で書き下ろすなら誤差が出ても問題ないつくりにするべきだとは思う
0906デフォルトの名無しさん
2010/02/26(金) 18:12:43通信対戦で自分の情報を送るとか、チートしてくださいと叫んでるようなもんだし
サーバーで一元処理するのは高負担
互換性が確保できればそれにこしたことない。
0907デフォルトの名無しさん
2010/02/26(金) 18:13:310908デフォルトの名無しさん
2010/02/26(金) 18:21:53全てのキャラの位置、向いている方向、色々なパラメータ、全ての弾の位置
通信で送りあったらたまったもんじゃないし、書き換えもあるだろうしきついね
0909デフォルトの名無しさん
2010/02/26(金) 18:36:520910デフォルトの名無しさん
2010/02/26(金) 18:43:59浮動小数精度で誤差が出ても同じ結果が得られるような実装なら通信時も問題ないと思う
まあ限定された環境内で互換性が確保できればなんでもいいんだけど
0911デフォルトの名無しさん
2010/02/26(金) 18:50:54ちょっとスレの趣旨とは離れちゃうけど「浮動小数点で誤差が出ても同じ結果が得られる実装」なんてのが
手軽に実装できるなら、そもそも浮動小数点を(描画以外で)使わないだろって話かと。
0912デフォルトの名無しさん
2010/02/26(金) 18:58:240913デフォルトの名無しさん
2010/02/26(金) 19:09:11議論された形跡がどこにも見つからないならそれは取るに足らない問題で
議論されていたにも関わらず解決されていない問題ならこんなところでグダグダしてる連中には手に余る問題ということだ
0914デフォルトの名無しさん
2010/02/26(金) 19:22:28あと「こんなところでグダグダしてる連中」とか言うな
何度ここの「連中」に良くしてもらったことか・・・
0915デフォルトの名無しさん
2010/02/26(金) 19:40:00pow
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横レスだが、最初のpowはコンパイラがSSEを使うようになっていない限りx87だから80bitの拡張倍精度で64bitの精度がある。
MicrosoftのコンパイラはSSEを明示的に指示しなければ使わないし、
IntelのコンパイラはSSE/SSE2より前の世代を切り捨てたので
明示的に指示しない限りSSE/SSE2を使う。
0917デフォルトの名無しさん
2010/02/26(金) 20:14:31最適化してないからメモリへの書き出し時の丸めが起きてる
>>916
それは自分でコンパイルするコードの場合だろう
_set_SSE2_enableのページに挙げられてる関数は両実装なんだってば
0918916
2010/02/26(金) 21:37:52すまん、>>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みたいに関数でもいいですか
0920デフォルトの名無しさん
2010/02/26(金) 23:04:210921デフォルトの名無しさん
2010/02/26(金) 23:09:080922デフォルトの名無しさん
2010/02/26(金) 23:56:23関係ないが、その柔軟な発想がうらやましい。
http://codepad.org/CZPjKZS9
0923デフォルトの名無しさん
2010/02/27(土) 00:29:12ttp://codepad.org/NYifDLmF
0924デフォルトの名無しさん
2010/02/27(土) 01:07:46ttp://codepad.org/Y9ftRqxS
関数ポインタにいれてデフォルト引数を適用したい場合はどうやるの?
無理なの?
0925デフォルトの名無しさん
2010/02/27(土) 01:10:040926デフォルトの名無しさん
2010/02/27(土) 01:38:48デフォルト引数を暗黙に受け渡す方法がないので、明示的に渡さないといけないが、
それでよければこんな方法はどうか。
ttp://codepad.org/zMjARsjk
0927デフォルトの名無しさん
2010/02/27(土) 01:43:300928デフォルトの名無しさん
2010/02/27(土) 01:50:240929デフォルトの名無しさん
2010/02/27(土) 02:28:580930デフォルトの名無しさん
2010/02/27(土) 05:39:170931デフォルトの名無しさん
2010/02/27(土) 17:26:420932デフォルトの名無しさん
2010/02/27(土) 17:28:10今VC++
0933デフォルトの名無しさん
2010/02/27(土) 17:31:020934デフォルトの名無しさん
2010/02/27(土) 17:31:580935デフォルトの名無しさん
2010/02/27(土) 17:46:040936デフォルトの名無しさん
2010/02/27(土) 17:48:470937デフォルトの名無しさん
2010/02/27(土) 17:53:480938デフォルトの名無しさん
2010/02/27(土) 19:21:09Comeau C++はいつか買いたい。
それ以外はなぁ。。。
0939デフォルトの名無しさん
2010/02/27(土) 19:54:360940デフォルトの名無しさん
2010/02/28(日) 08:32:270941デフォルトの名無しさん
2010/02/28(日) 10:03:54こうやった時にnが1になるのは実装依存ですか?
0942デフォルトの名無しさん
2010/02/28(日) 10:33:050943デフォルトの名無しさん
2010/02/28(日) 10:54:330944デフォルトの名無しさん
2010/02/28(日) 12:11:450945デフォルトの名無しさん
2010/02/28(日) 12:16:27C++のヘッダファイルとソースファイルに分けるのが面倒(というか慣れてない)ので
ヘッダファイルのクラス定義の中で(C#みたいに)実装もしちゃおうと思ってるんですが(慣れるまで)
注意すべき落とし穴とか教えてください
0946デフォルトの名無しさん
2010/02/28(日) 12:17:39書き忘れました
環境はMinGW+EclipseCDTです
0947デフォルトの名無しさん
2010/02/28(日) 12:28:380948デフォルトの名無しさん
2010/02/28(日) 12:33:12そのため量が多いコードを書いて
それが多数の箇所で引用されるようなら
無駄にインライン展開された分のオーバーヘッドがかかる
0949デフォルトの名無しさん
2010/02/28(日) 12:44:02決まってるよ
>=演算子の結果は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実装を分けて書くのになれると、C#は実装を別けられなくて不便だって思うようになるよ。
0951デフォルトの名無しさん
2010/02/28(日) 12:51:20それはないだろ…分けたけりゃinterface使えばいいだけ
0952デフォルトの名無しさん
2010/02/28(日) 12:57:01これ読むと脱力するなあ
クラスをインタフェース、ファクトリ、実装に分割する
インタフェースではPOD以外の型や例外を使えない
多分不便すぎるから、さらにstaticリンクやヘッダオンリーのラッパーも書くんだろう
手間かかりすぎだ
0953デフォルトの名無しさん
2010/02/28(日) 12:59:57レスありがとう
とりあえず(学習レベルでは)致命的な問題が生じることを意識せずに
書いても大丈夫そうですね
0954デフォルトの名無しさん
2010/02/28(日) 14:01:22virtualってバイナリ互換性ないんじゃなかったっけ?
0955デフォルトの名無しさん
2010/02/28(日) 14:06:10その文書では、Windows環境でかつ、COMが使える(つまりvtblのレイアウトに
関してはCOMとABI互換性がある)コンパイラに関することが書いてあるから、
完全な一般論ではないはず
0956デフォルトの名無しさん
2010/02/28(日) 15:11:15void 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:360958デフォルトの名無しさん
2010/02/28(日) 15:18:40「普通」とか言ってないで、どうしてそうなるのかよく考えてみろ。
まず "D:\" では最後のクォートがエスケープされてコンパイルエラーになるはずだ。
そこを直したとしても、そのコードでは strcat() の時点でバッファオーバーランを
起こしてしまっているはず。何が起こっても文句は言えない。
0959デフォルトの名無しさん
2010/02/28(日) 15:19:220960956
2010/02/28(日) 15:37:16http://www.dotup.org/uploda/www.dotup.org692367.png
試しに
char path[40] とかでもだめでした
0961デフォルトの名無しさん
2010/02/28(日) 15:40:41str1とstr2を連結した新しい変数を使用してはいかがでしょうか?
0962デフォルトの名無しさん
2010/02/28(日) 15:47:10void 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根本的に分かってないだろ。
>△のとこは普通D:\と表示されるんではないんですか?
されません。
文字列連結(strcat)してるんだから、path[]のケツにfilename[]がくっ付くに決まってる。
>しかしD:\testと表示されてしまいます。
それで正常です。バッファオーバーランしてるけどな。
ディレクトリ名とファイル名以外に、フルパス用の配列でも作ってろ。
よう分からんならstd::string使ってろ。
0964デフォルトの名無しさん
2010/02/28(日) 15:48:07strcatは最初の引数に与えたものも変更してしまう
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:270966デフォルトの名無しさん
2010/02/28(日) 15:50:26testの前後でprintf("%p", path);としてみればpath自体の値は変わってないことが確認できると思う
あとは文字列について勉強して、ポインタについて勉強すればおk
0967デフォルトの名無しさん
2010/02/28(日) 15:56:51できました!ありがとうございます
0968デフォルトの名無しさん
2010/02/28(日) 16:08:49Windows環境で関数の実行アドレスを取得したいのですよ
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なんでダンプしちゃうのw
pFunc で取れてるだろ。 printf("%p", pFunc) とか。
0970デフォルトの名無しさん
2010/02/28(日) 16:42:25pFuncで取れているのは、関数の実行アドレスではないです。
このときのアドレスの中身は、関数の実体へのジャンプ命令なんです。
で、ほしいのはセグメント上に展開されているはずの、この
ジャンプ命令の示しているジャンプする先のアドレスがほしいのです。
0971デフォルトの名無しさん
2010/02/28(日) 16:46:15よくわからんが、ジャンプ命令のジャンプ先が欲しいんならジャンプ命令の
仕様どおりに(CPUの動作をなぞって)アドレス計算するんじゃダメなの?
0972デフォルトの名無しさん
2010/02/28(日) 16:57:08nearポインタのアドレスだと思うのだけど、
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うまくいかないんですがもし使えるならどうやれば使えるでしょうか?
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:210979デフォルトの名無しさん
2010/03/01(月) 11:25:25Windowsの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:05while(fgets(data, 1000, fp) != 0){
strcat(temp,data);
}
String^ filetext = gcnew String(temp);
label1->Text = filetext;
とすると文字化けしてしまいます、どうすれば良いのでしょうか?
0982デフォルトの名無しさん
2010/03/01(月) 16:28:02System::IO::File::ReadAllText使えとかいろいろあるけど
C++/CLIはこっちできこうね
http://pc12.2ch.net/test/read.cgi/tech/1206447234/
0983デフォルトの名無しさん
2010/03/01(月) 16:32:480984デフォルトの名無しさん
2010/03/01(月) 16:36:21サンクスだぽ(`・ω・´)
0985デフォルトの名無しさん
2010/03/01(月) 16:39:08C#で作るのと
C++でフォームアプリケーションから作るのと
C++で空のプロジェクトから作るのと
軽さはどれくらい違いますか?
レス数が950を超えています。1000を超えると書き込みができなくなります。