15/11/28 13:42:54.23 S1e+2GUN.net
誰か書いてー
即死する
3:デフォルトの名無しさん
15/11/28 13:58:59.04 u5grs2xF.net
1乙
4:デフォルトの名無しさん
15/11/28 20:31:40.61 JroX99O/.net
ものすごい下らないことですが質問です。
こんな感じのクラスがあって
class A {
public:
std::unique_ptr<int[]> xxx = nullptr;
private:
void reset_xxx(size_t n) /* noexcept */ // <- このコメントを外したい
{
xxx.reset(new(std::nothrow) int[n]);
/* new が失敗したときはここでどうにかする */
}
};
(1)
reset_xxx に noexcept 指定子をつけたいのですが、
int のような基本型、あるいはその配列に対する delete は
例外を投げないことが保証されているんでしょうか。
あるいは POD ではどうでしょうか。
POD でなくても、デフォルト定義のデストラクタを持っているなら?
(2)
上記のクラスで xxx を読み取り専用として扱うとき、
std::unique_ptr<int[]> xxx = nullptr;
の代わりに
std::unique_ptr<const int[]> xxx = nullptr;
とした方がいいでしょうか。
宗教上の問題になるのでしょうか。
5:デフォルトの名無しさん
15/11/28 20:36:01.12 JroX99O/.net
わあ、nbsp のつもりがひどいことになってしまいました。
クラスを再掲します。インデントは全角スペースにしました。
class A {
public:
std::unique_ptr<int[]> xxx = nullptr;
private:
void reset_xxx(size_t n) /* noexcept */ // <- このコメントを外したい
{
xxx.reset(new(std::nothrow) int[n]);
/* new が失敗したときはここでどうにかする */
}
};
6:デフォルトの名無しさん
15/11/29 20:15:17.63 +8PPW4GA.net
>>4
(1)については、
URLリンク(www.open-std.org)
の、3.7.4.2.3に
If a deallocation function terminates by throwing an exception, the behavior is undefined.
って書いてある。だから例外投げるデストラクタの存在は無視して良いと思う。
あとnewは例外を投げるとすればstd::bad_alloc以外は投げない事になってるのと、
その場合にはそのサイズのメモリの確保は出来ない事になってるので
素直にstd::terminate投げるなりexit呼ぶなりしても良いと思う。
(2)については、(const_cast出来るって意味で)本当に書き換え不能な領域を実行中に作るのは無理なので
書き換えしないでねって他のプログラマに表明する以上の意味は無いと思う。
7:片山博文MZ ◆T6xkBnTXz7B0
15/11/29 20:30:03.53 RQ97x6ZU.net
「FM音源をあやつって正しく音を出したい」
OpenAL+ALUTと、ciscさんのFM音源エミュレータ
「FM Sound Generator」を使って、正しく音を出したい。
URLリンク(github.com)
URLリンク(github.com)
おかしな音が出ます。たぶんFM音源の使い方が間違っています。
修正方法を教えて下さい。ドレミの音が出るようにして下さい。よろしくお願いします。
8:デフォルトの名無しさん
15/11/30 13:51:44.68 VtHFUkMk.net
unsigned short同士の掛け算がunsigned int ではなくてintに昇格するのはどうしてですか?
9:デフォルトの名無しさん
15/11/30 20:19:20.81 luHPgjr1.net
unsigned shortが int に拡張されるからでは
10:デフォルトの名無しさん
15/11/30 21:26:57.04 VtHFUkMk.net
その仕組みはわかるんですけど、そこでどうしてunsigned intではなくてintでなければならないのかがわかってません。
short 2バイト int 4バイトだとして 65535 * 65535 の結果はINT_MAXより大きいですが、unsigned intの範囲で安全に表現できますよね。
どうして不確からしさが増すような方向への変換がデフォになってるのかという疑問もあります。
11:デフォルトの名無しさん
15/11/30 21:42:20.20 jWn5VC7w.net
unsigned short × unsigned short がどうこうではなく
計算時に unsigned short が int に拡張されるってだけでしょ
拡張された状態で乗算するから結果もintになるって
12:デフォルトの名無しさん
15/11/30 22:19:42.99 VtHFUkMk.net
unsigned shortがintに拡張されてから計算されるというのは最初からわかってるんですが、
unsigned shortの拡張される先がunsigned intではなくてintでなければいけない理由がわかっていないんです。
下の2行はunsigned intにしておけば掛け算にたいしても安全ではないか、ということです。
現実的ではないのかもしれませんがintが2byteの場合だと
unsigned short * unsigned shortの結果はunsigned int*unsigned intと一緒の結果ですよね。
それがint 4byteの場合だと結果はint*intになってINT_MAXをオーバーフローして困ったことになると思うんです。
なんでそうなってしまうかといえば、unsigned intではなくてintに変換されてから計算されるからです。
どうしてそのようになっているのですか?
13:4
15/11/30 22:38:13.05 Dn8P3OaQ.net
>> 6
ありがとうございます。
(2) については仰るとおりで、まさにそれがやりたいことだったので、
const はつけておくことにします。
(1) については…… なんていうか、ちょっと聞きたいことと違っていました。
> 例外投げるデストラクタの存在は無視して良いと思う
というのは
「どうせ例外が発生したときの挙動が undefined なんだから、
コンパイラが速いコードを生成するよう noexcept はつけててもいい」
ということだと理解したのですが、ぼくが noexcept で表現したいのは
「この関数はいつ呼ばれても(特に関数失敗時にも)意味のある値を返す」
ということなんです(これって変な考えなんでしょうか)。
なので xxx.reset が例外を投げうるなら noexcept は外したいです。
むしろ未定義動作をする可能性がある関数である、ということを強調して
コメントにでも書いておきたいくらいです。
とはいえ常識的に考えて、ヒープが壊れていない限り int[] の delete[] が失敗することは
ないですよね……。うーん。
14:片山博文MZ ◆T6xkBnTXz7B0
15/11/30 23:17:12.67 UQmO47jh.net
>>7
他力を借りて解決しました。
URLリンク(katahiromz.bbs.fc2.com)
15:デフォルトの名無しさん
15/11/30 23:56:14.64 qSWjFIuy.net
>>12
じゃあさ、unsigned long * unsigned long はどうすればいいと思う?
16:デフォルトの名無しさん
15/12/01 09:09:35.39 vya/mPuO.net
>>12
unsignedにキャストする処理まで入れてないだけだろ
一般的には整数演算器の入出力はsigned int
intが何ビットかはCPUコアに依存する
17:デフォルトの名無しさん
15/12/01 11:46:59.87 E/WRWJc0.net
前スレの>14で
「プログラムが終了する際にmallocした領域をイチイチfreeする奴は馬鹿だ、という情報工学の先生がいたなー
こんなセンセーに教育された学生はうちの会社にはいらないw 」
とあるんですが、これはその先生が間違っているということですか?
そうであるなら理由を教えてくれますか?
18:デフォルトの名無しさん
15/12/01 13:21:42.49 YGJMPkGb.net
>>12
そういう仕様としか言いようがないが‥
K&Rでは符号が保存され、あなたが期待するunsigned intで計算される仕様になっている
ANSI Cはintで表現できるならintになる仕様になっている
エキスパートCプログラミングによると、ANSIの方は値を保存するという考えらしい
19:デフォルトの名無しさん
15/12/01 14:34:40.17 wfTLHpyu.net
>>17
ある意味では間違っていて、ある意味では正しい。
・mallocされたメモリがプログラム終了時にきちんと開放されるかどうかはOS依存(Cの仕様上は開放されない事になってる)
・非常に長く動くプログラムの場合、mallocしたものは必要に応じて開放しなければいつかメモリが足りなくなる
・mallocされたメモリをプログラム終了時までにfreeしない方がいいとはCの仕様書には書かれていない
・人を馬鹿にしてる
という意味では常に先生が間違っている。
・mallocされたメモリはプログラム終了時までに絶対にfreeしなければならないとはCの仕様書には書かれていない
・malloc/freeの実装によっては、malloc/freeする順序によっては非常に重くなり、プログラム終了時にOSが回収したほうが速くなることがあり得る
という意味では先生は正しい。
20:デフォルトの名無しさん
15/12/01 18:30:22.99 4XFiGbBF.net
>>17
その話しの流れが読めないので想像ですが。
mallocした領域をfreeせずにプログラムを終了させた場合、その領域がどうなるかはC言語の仕様では規定されていないと思います。
言い換えれば環境(処理系やOS)に依存した挙動になるでしょう。
「freeする奴=バカ」と教え込まれた学生が会社に入り、環境ごとの挙動を調べることなく盲目的に「終了時のfreeは不要」を信じてコーディングしたら‥
アカデミックな世界ではいざしらず、実務の世界では、裏付けもない思い込みでプログラムを組まれては、たまったものではありません。
おそらくそういう事が言いたかったのではないでしょうか?
#というか情工の先生で軽々しくそんな事を言う人はいないと思いますので、おそらく「ネタ」じゃないですかね。
21:デフォルトの名無しさん
15/12/01 21:54:03.31 lP+cizb6.net
>>20
規定されてる。規格書よんでから出直しなさい。
22:デフォルトの名無しさん
15/12/02 17:40:34.22 Cj5Jy42r.net
INT_PTRが良く分かりません。単なるint型と考えていいのでしょうか?
わざわざPTRという名前が付いているのは、ポインタのサイズと同様にそのサイズが環境に一致することを示すため??
23:デフォルトの名無しさん
15/12/02 17:51:28.60 SG5bn8pD.net
>>22
単なるint型は整数型で、整数が入る
INT_PTR型はポインタ型に等しい幅を持つ整数型で、ポインタ型をどうしても整数型にキャストしたい時に使うらしい。
以下引用
ポインタは int、LONG、ULONG、DWORD のいずれの型にもキャストしないでください。
ビットのテスト、ビットの設定とクリア、またはポインタの内容の操作のためにポインタを
キャストする必要がある場合は、UINT_PTR 型または INT_PTR 型を使用します。
これらの型は、32 ビット版の Windows と 64 ビット版の Windows の両方のポインタに合わせて
サイズが変更される整数型です (たとえば、32 ビット版の Windows の場合は ULONG 型、
64 ビット版の Windows の場合は _int64 型に変更されます)。
URLリンク(msdn.microsoft.com)
24:デフォルトの名無しさん
15/12/02 18:07:06.08 tKolsFeX.net
>>22
> ポインタのサイズと同様にそのサイズが環境に一致することを示すため
大体あってる。ポインタを安全に整数として扱うための型が INT_PTR。
64-bit 環境の Windows だと int 型が 4 バイト、ポインタが 8 バイトで
ポインタを int 型の変数に格納できない。
32-bit 環境で int 型にポインタを格納できたのはたまたま int 型とポインタ型の
サイズが一致していたから。
ついでに言うと c99 で intptr_t と uintptr_t 型が仕様として定義されている。
もしも今後 Windows 以外の環境への移植を考えるならそちらを使うようにすべき。
# どうでもいいけど、Windows SDK って何か変な型を定義してるよね
# DWORDLONG (UINT64, ULONG64, ULONGLONG 含めすべて uint64_t と同じ) とか
# HALF_PTR (intptr_t の半分のサイズ) とか LONG_PTR (INT_PTR との違いが分からん) とか
25:デフォルトの名無しさん
15/12/02 18:33:27.47 Cj5Jy42r.net
丁寧なご回答ありがとうございます。
DialogBox()APIの戻り値が、32bit時代?はint型だったと記憶しているのですが、
最近調べたら同戻り値がINT_PTR型になっていたため疑問を持ったという経緯なので、キャストしたいわけではありません。
最初INT_PTRという記述を見たとき、int型の変数へのポインタなのかな、と感じたので。でもそれだったらLPINTかなと思ったり。
>>24を見て何となく理解出来ました。
全てのアドレスを格納できる必要があるポインタは64bit環境では当然64bit、
ところがint型は64bit環境でも32bitのままだったんですね。
でも何でDialogBox()の戻り値はINT_PTRである必要があるんだろう。
32bit環境で32bit長、64bit環境で64bit長になってくれる変数が他に無かったのだろうか…
26:24
15/12/02 18:47:49.06 tKolsFeX.net
>>25
ポインタを含む任意の値を返すためだと思う。
DialogBox の戻り値は EndDialog の戻り値なわけだけど、
たとえば生成したダイアログ側から構造体を返したいとき、
戻り値が INT_PTR なら malloc とかで取ってきたアドレスをそのまま返せる。
> 32bit環境で32bit長、64bit環境で64bit長
大事なのは >>23 で言われてる通り「ポインタ型に等しい幅を持つ整数型」ということ。
いま自分が使っているシステムが主に 32/64-bit だからといって、
過去もずっとそうだったわけじゃないし将来ずっとこのままなわけでもない。
じゃあそのとき DialogBox の戻り値は何になって欲しいか、と言われれば、
「せめてポインタが格納できるサイズの型」ということになる。
それならどんな値でも返せるから。
27:デフォルトの名無しさん
15/12/02 19:15:43.22 Cj5Jy42r.net
>>26
な~るほど、アドレスを返すこともあると考えれば、INT_PTRを使う事は無理矢理なことではなく、妥当なことに感じますね。
32bit時代にintで受けてたのが多少無理矢理だったとも言えるのかな。4バイトを受けられれば何でも良かったんでしょうけど。
# いっそ「PTR型」とか「SYS型」とかにして使う側でキャストするようにした方が誤解が無いんじゃないかと思ったり
# WinAPIでは昔から色々な型を使ってて覚えるのが面倒臭かったですね
28:デフォルトの名無しさん
15/12/05 12:09:57.14 XDnkwO5X.net
関数を作るとき、引数にポインタを渡すことで実質的な返り値にできるテクニックって普通に返り値を返すのとどう使い分けれるべきなんですか?
コードの可読性が下がる代わりに複数出力に対応できるっていう認識なんですが、わかりやすさとか保守性(人間の都合)以外に推奨される理由とかやめた方がいい理由はありますか?
int power(int a){return a*a;}
と
void power(int ain, int* aout){*aout=ain*ain;}
みたいなやつです
29: ◆tAo.kQ2STk
15/12/05 16:27:33.05 3X0n/q/1.net
>>28
他にも、構造体を返す代わりに構造体へのポインタを受け取っておいて一部だけ変更して返すとか
void move_up(Position* p, double distance) {p->y -= distance;}
デフォルトの値を受け取ってある条件で書き換えるが、書き換えた場合に引数として渡された元の値は不正になる場合とか
void my_realloc(void** p, size_t size) { *p = realloc(*p, size); } // 色々省いた!
幾つか使い道はあるけど。
やめたほうがいい理由として他には、純粋関数スタイルで書けなくなるってのがあるな。
add(a, b, &t);
mul(t, c, &d);
って書くのと
d = mul(add(a, b), c);
って書くのとは違うスタイルになるけど、後者を前者に直すのは簡単でもその逆は簡単じゃない。
30:デフォルトの名無しさん
15/12/05 16:41:03.46 WsL2Ug/J.net
>>28
計算結果を引数で受け取り、処理結果を戻り値で返す。
良くあるパターン。
31:デフォルトの名無しさん
15/12/05 17:29:21.92 KdBqlpoa.net
>>28
なんらかの制約があり仕方なく使わざるをえない場合のみ泣く泣く使うものであり推奨している個人や団体は存在しない
32:デフォルトの名無しさん
15/12/05 17:44:53.67 4CEShJeO.net
禁止する規約も見たことないけどな。
どちらがいい悪いじゃなくて、単一の戻り値を返す関数として書けない場合に
普通に使えばいいだろう。
33:デフォルトの名無しさん
15/12/05 17:58:29.63 KdBqlpoa.net
ひとつの戻り値に出来ない時点でおかしな事が起こってるか起こりつつある
複数の同じ型の返り値ならば本来そこで必要なものはコレクションだ
異なる型の複数の戻り値ならば本来そこで必要なのはそれを包含する別の型だ
必要な型が定義されていないという設計ミスの兆候から目を背けてはいけない
手抜きのタプルや参照渡しに逃げてはいけない
34:デフォルトの名無しさん
15/12/05 18:44:26.87 4CEShJeO.net
なんか変なこと言い出したぞ。
>>33個人の主張以外に一般に認められた規約/ガイドラインってあるかねぇ?
35:デフォルトの名無しさん
15/12/05 18:47:22.55 22zPQN1u.net
>>33
> 異なる型の複数の戻り値ならば本来そこで必要なのはそれを包含する別の型だ
> 手抜きのタプル
「それを包含する別の型」がタプルなんじゃないの
ていうか、個人的に問題になるのはエラー処理に関することが多い
long long int を返す関数で「失敗」を表すにはどうしたらいいのか、とか
で結局、戻り値(にしたかったもの)は引数で、エラーが起きたかどうかは戻り値で
返すことが多い
別に俺だけじゃなく、ぱっと思いつくとこだと zlib の compress なんかもそうだよね
deflate の結果は引数で返して、成功/失敗を戻り値で返す
snappy だと例外を投げるんだっけ
36:デフォルトの名無しさん
15/12/05 20:59:15.88 wHZuCpe8.net
返り値は全部ブールにして、値取得は引数で行うのをよく見るけど
これって普通なん?
37:デフォルトの名無しさん
15/12/05 22:41:31.43 3X0n/q/1.net
>>36
if文を使って成功したかどうか判定するんだから、そういう風に作ることも出来る。
構造体へのポインタを返すのでも同じ事が出来るけど。
if (auto p = foo()) {
printf("%d\n", p->value);
}
とか
auto p = foo();
if(!succeed(p)) {
return;
}
とか。
38:デフォルトの名無しさん
15/12/06 03:26:24.33 +ZBuFdaM.net
その構造体のメモリはいったいどこから…
スマートポインタとか使ってメモリがつがつ消費するのがイマドキの書き方なのかな
>>36
わりと普通。下手に「-1は失敗」とかやるよりシンプルで分かりやすい
39:デフォルトの名無しさん
15/12/06 08:50:47.90 cIZcNmeU.net
イマドキかどうかはともかく、
「スマートポインタを使う = メモリがつがつ消費する」
っていう >>38 の理解(そう読める)はどうなの
40:デフォルトの名無しさん
15/12/06 13:45:34.39 +ZBuFdaM.net
「>>37みたいな使い方=メモリがつがつ消費する」ね
がつがつってのは容量的に沢山使うって話じゃなくて
無秩序にとか気軽にとか… うまい言葉が見つからないけど
41:デフォルトの名無しさん
15/12/06 16:31:37.89 iigA/d+A.net
boolにキャスト出来る構造体をifで受け取るのならどう?
42:デフォルトの名無しさん
15/12/06 16:35:41.53 4bjdt2kC.net
普通に構造体を返せばよいだけなのに,なぜそんなに凝ったことを推奨するのか?
43:デフォルトの名無しさん
15/12/06 16:42:02.54 w0JG1OnY.net
>>36
たまに見るね。Windowsの関数にそういうのが多い気がする。
fopenとfopen_sとか。
返り値の値域がint全体で、かつ、成功失敗を返す場合は
そういうのもありだと思う
44:デフォルトの名無しさん
15/12/06 18:39:35.29 Z7509Thm.net
>>28
戻り値がint型だからint型で受け取るのが良いけど
他の型で受け取れない(暗黙的な型変換)ってのがあるかな
あとその関数で言えば、数式の一部として利用できない
前者なら power(a)+b*2 のような式も書けるけど後者だと一回結果を受け取らないといけないよね
sqrtなんかもそう
45:28
15/12/07 18:34:12.80 PDqN2Ufp.net
ありがとうございます
色々使い方があるんですねm(_ _)m
46:デフォルトの名無しさん
15/12/08 20:22:24.50 BztczKM1.net
ヘッダ周りで混乱しています。ご教授おねがいします。
下のプログラムをそれぞれA.h, B.hのヘッダに書いて動作させるにはどうしたらいいでしょうか。
/*Aクラスの関数からBクラスのprivateメンバにアクセスする*/
class B;
class A {
int ia;
public:
void aFunc(B *b_ptr);
};
class B {
int ib;
public:
friend void A::aFunc(B *b_ptr);
};
void A::aFunc(B *b_ptr) {
b_ptr->ib;
}
47:デフォルトの名無しさん
15/12/08 20:23:21.01 BztczKM1.net
私が今書いているのが下のものです。
// A.h -----------------------------
#pragma once
#include "B.h"
class B;
class A {
int ia;
public:
void aFunc(B *b_ptr);
};
void A::aFunc(B *b_ptr) {
b_ptr->ib;
}
// -----------------------------------
// B.h -------------------------------
#pragma once
#include "A.h"
class A;
class B {
int ib;
public:
friend void A::aFunc(B *b_ptr);
};
// -------------------------------------
visual studio 2015で以下のエラーが出ています。
エラー C2248 'B::ib': private メンバー (クラス 'B' で宣言されている) にアクセスできません。 A.h 13行
エラー C2027 認識できない型 'A' が使われています。 B.h 9行
48:デフォルトの名無しさん
15/12/08 21:33:55.11 y1mdlUK+.net
以下のコードについて、Win+Mingw 上での結果と Ubuntu 上での結果が異なります
#include <iostream>
#include <fstream>
#include <system_error>
int main () {
using namespace std;
ifstream is;
is.exceptions(ifstream::failbit | ifstream::badbit);
try { is.open("xxx"); /* 存在しないファイル */ }
catch (ifstream::failure e) { cerr << "ifstream::failure" << endl; }
catch (system_error e) { cerr << "system_error" << endl; }
catch (exception e) { cerr << "exception" << endl; }
catch (...) { cerr << "other_error" << endl; }
return 0;
}
Win+Mingw
$ g++ --version
g++.exe (tdm64-1) 5.1.0
$ g++ -std=c++14 a.cc && ./a
exception
Ubuntu
$ g++ --version
g++ (Ubuntu 4.9.2-10ubuntu13) 4.9.2
$ g++ -std=c++14 a.cc && ./a.out
ifstream::failure
Windows 側で ifstream::failure や system_error を捕捉できていないのはなぜでしょうか?
49:デフォルトの名無しさん
15/12/08 22:29:07.89 2NgjJ1M0.net
>>47
// A.h -----------------------------
#pragma once
class B;
class A {
int ia;
public:
void aFunc(B *b_ptr);
};
// -----------------------------------
// B.h -------------------------------
#pragma once
#include "A.h"
class B {
int ib;
public:
friend void A::aFunc(B *b_ptr);
};
// -------------------------------------
// A.cpp
#include B.h
void A::aFunc(B *b_ptr) {
b_ptr->ib;
}
50:47
15/12/08 23:52:34.51 BztczKM1.net
>>49
ありがとうございます。
B.hではAクラスのメンバ情報が必要なのでA.hをインクルードして、
A.hではBクラスがあることが確認さえできればよいのでBクラスを前方宣言すればよいということですね。
A.hに定義を描いたのはファイルが少ない方が問題が簡単になるかと思ったからですが、
B.hをインクルードする必要がでてくるので返ってめんどうなんですね。
重ねて質問させていただきたいのですがこれが循環参照というものですか?
またA.hに定義を書いた場合エラーを回避する書き方はあるのでしょうか?
51:デフォルトの名無しさん
15/12/09 00:26:24.16 DdKTu+9h.net
>>50
ファイルが少ない方いいとか面倒とか気にするなら>>46のまま
依存関係にあるクラスなら無理して分けないほうが良いのでは?
ただ回避するだけのダメコードなら
// A.h -----------------------------
#pragma once
class B;
class A {
int ia;
public:
void aFunc(B *b_ptr);
};
#include "B.h"
void A::aFunc(B *b_ptr) {
b_ptr->ib;
}
// -----------------------------------
// B.h -------------------------------
#pragma once
class B {
int ib;
public:
friend void A::aFunc(B *b_ptr);
};
// -------------------------------------
52:デフォルトの名無しさん
15/12/09 00:33:31.76 DdKTu+9h.net
余計なお世話かもしれないが、
「これがやりたいから無理やりな回避するコードを書く」ってのは本末転倒なんじゃないかと思う
まあどうしようもないときってのもあるけど、自分ならクラス設計から見直すようにするけどね
53:47
15/12/09 01:14:48.16 MWRH+1zr.net
言い方が良くなかったようですみません。
私自身はファイル数も面倒も気にせずオーソドックスなコードをかきたいとおもっています。
ただ問題を考える際まず簡単なものから理解して複雑にしていくのがいいと思っています。
なのでここには私が考える最もシンプルなコードを書きました。
しかしその結果、私が考えた単純化(ファイル数を減らす)が逆に問題を複雑にしてしまっていた。ということに気づきましたという意味の発言でした。
最後の質問は単純な好奇心です。私はそのコードをいじってどうにかコンパイル通そうとしていたので、正解があるなら一応聞いておきたいなと。実用性のないコードをかかせてしまっせすみません。
> 依存関係にあるクラスなら無理して分けないほうが良いのでは?
今はじめてオブジェクト志向を取り入れて簡単なゲームを作っているのですが、どのようにクラスを割り振るのかまとめるのかということで四苦八苦しています。
今は基本に忠実に1つのクラスに1つのソースとヘッダで書いていますが、少し慣れたらまとめてみようと思います。
54:デフォルトの名無しさん
15/12/10 23:47:39.86 c+cFQUeV.net
ポインタについて教えてください
*hoge++ = 1;
こういう文があった場合、hogeに当初から入っているアドレスの次のアドレスに1を代入することになると思います
その場合、hogeに代入されているアドレス自体もプラス1されるのがふつうだと思いますが、環境によりプラス1されないこともあるのでしょうか?
よろしくお願いします
55:デフォルトの名無しさん
15/12/11 00:15:27.78 PPg536oa.net
当初入ってるアドレス先に1を代入して(=1)
それからアドレスをひとつ先に進める(++)んじゃないかな
環境に左右されないはずだけど、できれば
*hoge=1;
++hoge;
と二行に分けるのをオススメする
56:デフォルトの名無しさん
15/12/11 06:47:49.34 I09VPDH/.net
とりあえず括弧で優先順位つけろ
57:デフォルトの名無しさん
15/12/11 06:57:19.50 kB8+oJGq.net
括弧で解決するのかねえ。環境依存の要素はないし、極めて初歩の範疇だから
まずは入門書でも読んで入門した方がいい
58:デフォルトの名無しさん
15/12/11 07:39:35.01 EXbBnOrE.net
悩むような記述はしない
駆け出しに限ってトリッキーな記述を好む
59:デフォルトの名無しさん
15/12/11 07:41:53.19 0YKyOHUo.net
括弧といえば、三項演算子の優先順位がどうしても覚えられない
a - b ? c + d : e | f
みたいなの
60:デフォルトの名無しさん
15/12/11 08:17:58.93 MBFQhILY.net
ゲーム作ってるんですがダメージ計算式とかで稀に0除算が発生します
((a-b)*c)/((d*2)-e+f) のようにいくつかの変数が式に入っているので
計算の結果、割る値が0になっている場合がある といった具合です
0で割った場合は0になるようにしたいのですが、どうすればよいのでしょうか?
割る前にifで分岐するように書きなおすのは、面倒なので避けたいのですが…
61:デフォルトの名無しさん
15/12/11 08:43:00.31 gzGUt3Ym.net
チェックしろよ
62:デフォルトの名無しさん
15/12/11 09:11:56.83 cNzjvsZV.net
同じくチェックしろよとしか。
あとはまあ、適当な関数でも作るとか……?
63:デフォルトの名無しさん
15/12/11 09:17:17.43 h2+cx4oS.net
そういう演算規則の数値型のラッパーを作る
そして変数定義だけ書き直す
64:デフォルトの名無しさん
15/12/11 09:17:45.85 OYS2Ht5V.net
例外捕まえればチェックしないでも済む
65:デフォルトの名無しさん
15/12/11 10:32:19.08 MQP/fuYv.net
今回の要件では、除数が0なら結果も0と言うことだから例外ではフォロー仕切れんよ。
c++ならクラス作って割り算をオーバーロードかな。
66:デフォルトの名無しさん
15/12/11 11:56:25.95 OYS2Ht5V.net
例外処理ってC++の使えないアレだけじゃないんだよ
67:デフォルトの名無しさん
15/12/11 13:14:14.85 I09VPDH/.net
( ( ((d*2)-e+f) != 0 ) ? ( ((a-b)*c)/((d*2)-e+f) ) : (0) )
ってことか
68:デフォルトの名無しさん
15/12/11 21:32:26.31 OYS2Ht5V.net
C++の使えないアレでもできたわ
#include <functional>
int F(std::function< int(void) > func)
{
int v;
try {
v = func();
} catch (...) {
v = 0;
}
return v;
}
#define FF(e) F([&](){return (e); })
FF( ((a-b)*c)/((d*2)-e+f) );
69:デフォルトの名無しさん
15/12/12 01:59:06.36 Gz2IfgKr.net
素直に関数作ったらいいと思う
70:デフォルトの名無しさん
15/12/12 05:59:21.93 iSM6mGzV.net
書き直せなくなるまでゼロ除算を放置するなんて
71:デフォルトの名無しさん
15/12/12 06:49:37.09 zzgKuIEv.net
ゲームなので現実的にはありえない計算式なんだろ
0割で0にするというのも謎だけど、ゲームだからありなのかと思った
72:デフォルトの名無しさん
15/12/12 08:22:05.54 JwLrAiSP.net
分母に着目するんじゃなくて
そこに到達するまでのd, e, fのどれかにバグがあるって考えた方がいい
73:デフォルトの名無しさん
15/12/12 11:18:45.83 ZIa921ni.net
符号つきint同士の除算で、結果を常に負の∞に向かって丸めるにはどのようにすればいいでしょうか?
ただし、除数は常に0より大きい数です。
74:デフォルトの名無しさん
15/12/12 11:53:16.77 jiiw3kKP.net
「負の∞に向かって丸める」の意味がわからない
75:73
15/12/12 12:05:54.12 ZIa921ni.net
英語だと round toward minus infinity というところですか。
int同士の演算で丸めるというのが意味をなしていないのかもしれませんが、
結局は(実数としての)除算の結果を整数として得るのに-∞に近づくように、ということです。
76:デフォルトの名無しさん
15/12/12 12:34:22.99 l51bqpmT.net
計算結果が-3.1415となったら-4を得たいということ?floor関数だね
77:デフォルトの名無しさん
15/12/12 14:27:51.11 zzgKuIEv.net
被除数が負の場合、除数-1を引いてから割る
78:デフォルトの名無しさん
15/12/12 16:35:31.33 vifUVQ0p.net
浮動小数なら >>76
整数なら >>77
ちなみに >>77 の方法は「除数-1を*足して*から割る」とすると ceil 相当の動作になる
79:デフォルトの名無しさん
15/12/12 16:41:35.71 V2dsH5Kn.net
>>77
正整数同士の除算で端数は切り上げ、の応用技だね。
Nビットの情報を格納するのに必要なバイト数を求めるとき
ビット数に7を足してから8で割る感じ。
bytes = (bits + 7) / 8;
ところで、整数の除算で片方が負数の場合の結果は
「処理系定義」だって望洋さんのサイトに載ってる。
>>73 で除数は常に0より大きいと限定されてるから
被除数についての場合分け処理が必要になるかと。
80:デフォルトの名無しさん
15/12/12 17:57:48.30 vifUVQ0p.net
C って剰余の絶対値が最小になるように除算が決められてなかったっけ
それとも % 演算がそうなってるだけ?
81:73
15/12/12 18:45:47.78 ZIa921ni.net
ある程度試したところ>>77のやり方でうまくいきました。
動く仕組みも>>79でだいたい掴めました。
ふたりともありがとうございます。
82:デフォルトの名無しさん
15/12/12 20:40:06.73 zzgKuIEv.net
>>79
ウソを言わないように
少なくともc99以降は整数除算は「小数部は捨て」(すなわち0方向に丸め)と定義されている
83:デフォルトの名無しさん
15/12/12 23:43:11.86 DGmFor2Z.net
0除算に躓いていた若き日の僕に
手を差し伸べてくれたのは atan2(y,x) でした
84:デフォルトの名無しさん
15/12/13 06:18:20.87 dcJkyxKW.net
floor使えよ分かりやすいから
85:デフォルトの名無しさん
15/12/13 06:18:49.92 rQ+2OB8E.net
>>82
CでしかもC99以降なら、と処理系を限定すればその通り。
86:デフォルトの名無しさん
15/12/13 07:36:52.20 OeYxj6fv.net
>>85
限定しないならば、全ての処理系に対してって事だが。
87:デフォルトの名無しさん
15/12/13 15:59:00.30 NwtL3kT4.net
被除数が正ゼロ負に場合わけして処理するか、キャストして除算結果をfloorへ任せるか‥ まぁわかりやすさは人それぞれか
88:デフォルトの名無しさん
15/12/13 17:57:12.22 OeYxj6fv.net
負/非負だけで良い
(a - (b -1) * (a < 0)) / b
ゆとりはわかりにくいとか言い出すんだろうな。
89:デフォルトの名無しさん
15/12/13 18:02:00.99 4rlmjVEI.net
わかりにくいとまでは言わんが、if(a<0)で先に分岐したほうがすっきりしそう
90:デフォルトの名無しさん
15/12/13 21:30:18.22 H46hk94U.net
まあ、組み込みでもない限りは趣味の世界だな
91:名無しさん@そうだ選挙に行こう
15/12/14 08:55:06.71 7JmIVcUI.net
#include<stdio.h>
void rev_string(char s[]);
void rev_stringn(char s[][12], int n)
{
int i,j,k;
char swap[12];
for(i=0;i<n;i++){
while(s[i][k])
k++;
for(j=0;j<k;j++){
swap[j] = s[i][j];
}
rev_string(swap);
for(j=0;j<k;j++)
s[i][j] = swap[j];
}
}
92:名無しさん@そうだ選挙に行こう
15/12/14 08:55:32.42 7JmIVcUI.net
void rev_string(char s[])
{
int i;
int n = 0;
while(s[n])
n++;
for(i=0;i<n/2;i++){
char temp = s[i];
s[i] = s[n-i-1];
s[n-i-1] = temp;
}
s[n] = '\0';
printf("%s \n",s);
}
93:名無しさん@そうだ選挙に行こう
15/12/14 08:56:17.31 7JmIVcUI.net
int main(void)
{
int n;
printf("配列の個数を入力せよ");
scanf("%d",&n);
char str[n][12];
int i,j;
printf("文字列を%d個入力せよ\n",n);
for(i = 0;i<n;i++){
printf("s[%d]:",i);
scanf("%s",str[i]);
}
printf("反転した文字列は\n");
rev_stringn(str,n);
printf("である。\n");
return 0;
}
このプログラムを実行するとセグメントエラーが出るのですが、なぜでしょうか
よろしくお願いします
94:名無しさん@そうだ選挙に行こう
15/12/14 15:16:58.67 lAggCEHS.net
>>91-93
見た感じ何かの課題っぽいね。
丸々教えちゃうのはタメにならないのでヒント。
一時文字列swap[]の生成部分を見直せ。
95:名無しさん@そうだ選挙に行こう
15/12/14 15:42:18.02 DSJzQQ/E.net
>>93
k 初期化
scanfで文字列を格納しようとしないで
96:名無しさん@そうだ選挙に行こう
15/12/14 18:11:28.67 1oZypuq3.net
>>94
>>95
出来ました
有難うございました
出来ると嬉しいですね
97:名無しさん@そうだ選挙に行こう
15/12/14 18:30:13.04 1oZypuq3.net
それと後学の為に聞いておきたいのですが
scanfで文字列取得してはダメなんですか?
getsで取得したほうが良いのでしょうか?
98:名無しさん@そうだ選挙に行こう
15/12/14 18:38:14.34 XU/HPkeH.net
どっちも使わないが正解かな
実用的なプログラムではxmlなど特定の形式のファイルを読み込むことが殆ど
そしてこういう形式のファイルは専用のライブラリがあるから標準の関数は使わない
99:名無しさん@そうだ選挙に行こう
15/12/14 19:20:19.55 lAggCEHS.net
>>97
例題の場合だと、文字列の入力時に11文字(12文字ではない)以上を
入力すると誤動作する。
gets()では事前に用意したバッファ容量以上の入力を拒絶できない。
scanf()なら対処可能だが割と面倒くさい。
詳しくは scanf のWikipediaに載ってる。
100:99
15/12/14 19:46:15.05 lAggCEHS.net
おおっと、「11文字以上」は間違い。
「11文字を超える」と書くべきだった。
例題の場合だと、文字列の入力時に11文字(12文字ではない)を超える
文字列を入力すると誤動作する。
101:デフォルトの名無しさん
15/12/14 22:17:16.18 1oZypuq3.net
>>98
>>99
有難うございます
頭の片隅に置いておくことにします
102:デフォルトの名無しさん
15/12/15 09:10:21.26 DA+Z5plh.net
片隅じゃなくてど真ん中に置いとけよ。
103:デフォルトの名無しさん
15/12/15 11:55:24.33 UvxPNinR.net
通る時に邪魔になるだろ!
104:デフォルトの名無しさん
15/12/15 14:36:30.17 DA+Z5plh.net
どうせすかすかなんだから避けろよ。
105:デフォルトの名無しさん
15/12/15 16:29:51.89 lFa4wSQM.net
>>97
scanf だけとか gets でとかじゃなく fgets でバッファサイズ指定して読み込む
fgetsで読み込んだ文字列をsscanfで変数に入れる
106:デフォルトの名無しさん
15/12/15 17:51:53.83 UvxPNinR.net
>>104
スカスカなのはおまえの頭髪だろ!
107:デフォルトの名無しさん
15/12/15 18:46:08.88 Bz6rHJHH.net
俺の胸毛はフサフサなのだがな…
108:デフォルトの名無しさん
15/12/16 18:34:29.10 G/o4ughm.net
頭髪と胸毛は影響するホルモンが違うからな。頭スカスカ、胸毛フサフサは矛盾しない。
109:デフォルトの名無しさん
15/12/16 21:53:42.14 6hxUKU2I.net
ままならないものだね
110:デフォルトの名無しさん
15/12/16 22:14:06.50 x+xpyG6u.net
ハゲで胸毛ワサワサならママにはなれないよ
111:デフォルトの名無しさん
15/12/17 09:22:36.25 X1S+T1Jv.net
寧ろ、ママなら無いものかと。
112:デフォルトの名無しさん
15/12/17 21:01:38.15 mBjgQHIg.net
C++で
<vector>をインクルードしてpush_backで配列作っていくのと、
int* array = new int[];
と(動的確保?)して作るのとでは
どういった違いがありますか?
また、どちらを使うのが一般的なんでしょうか?
初心者なので的を射ていなかったらごめんなさい。
113:デフォルトの名無しさん
15/12/18 00:29:50.73 jlCbbYEY.net
Vectorの方が安全に扱える(扱いが楽)からvector使った方がいいだろうね
毎回newで動的確保するコードは管理が面倒すぎて何処かで失敗してバグの温床になるからやめた方がいいかと
114:片山博文MZ ◆T6xkBnTXz7B0
15/12/18 00:41:50.83 +gf7B4uf.net
ちゃんとマニュアルを読めよ。push_backだけじゃねーよ。
115:デフォルトの名無しさん
15/12/18 01:01:28.67 qAlk3MOP.net
Cはまだしも、C++は入門書のように手動でdeleteするようなコードは書くべきじゃない
入門書は何が出来るかを一通り書いてくれていると思うが、C++で重要なのは何をしてはいけないのかを知ること
そのためには沢山のコードを書き、沢山の専門書を読んで覚えるしかない
116:デフォルトの名無しさん
15/12/18 01:33:14.12 +PE9kEMX.net
ありがとうございます。vector使っていく事にします
117:uy ◆Qawu9.2l1E
15/12/18 02:42:48.54 ebb2J7fc.net
C++やってる奴いるw?
118:デフォルトの名無しさん
15/12/18 03:49:05.07 bQYD5Sab.net
ただ、vectorは、末尾の要素の追加・削除は、計算量O(1)だけど、
要素の中ほどに追加すると、
それ以降の要素が1つずつずれるから、O(n)になる
Doubly Linked Listなら、そういうときにO(1)。
ただ、これは基本、1つずつ要素をたぐっていく、
シーケンシャルアクセスだから、要素の取得はO(n)
vectorの要素の取得は、数値インデックスで、
O(1)のランダムアクセスができる
119:デフォルトの名無しさん
15/12/18 08:41:19.30 zXgpR+Un.net
class A{
public:
vector<char *> vStr;
A operator <<(char *Str){
vStr.push_back(Str);
return *this;
}
};
A a;
a << "a" << "b";
こうしたときにvStrに"a"と"b"へのポインタが格納されるようにしたいのですが
やってみると"a"しか格納されません
<< "b"のときに格納してるのは<< "a"が返したコピー(?)のほうだから、ということは想像つくのですが
解決策がわかりません
a << "a";
a << "b";
とするしかないのでしょうか
120:片山博文MZ ◆T6xkBnTXz7B0
15/12/18 09:14:56.52 +gf7B4uf.net
>>119
戻り値を参照に
121: ◆tAo.kQ2STk
15/12/18 11:40:52.38 znmCm21O.net
>>119
- A operator<<(char* Str) {
+ A& operator<<(char* Str) {
>>120
それで分かるのは分かってる人だけなような。
# とか言いつつ俺も俺で分かる人には分かるようなフォーマットで回答するという
122:デフォルトの名無しさん
15/12/18 13:01:02.33 zXgpR+Un.net
できました!
ありがとうございます
123:デフォルトの名無しさん
15/12/18 18:51:52.24 OysfGD3G.net
C++の最速の行列計算ライブラリってなんだろ
密エルミート行列の対角化がしたいんだけど
124:デフォルトの名無しさん
15/12/18 23:29:26.92 CNI5JGVG.net
プログラマはMacを使ってるってマジ?
スレリンク(news板)
125:デフォルトの名無しさん
15/12/19 09:39:20.71 n5v6Wxrv.net
別のスレに間違えて投稿してしまったものを、こちらで再度質問させていただきます。
以下のコードをコンパイルしようとすると、コンパイルエラーC1060が出て失敗するのですが、何が悪いのでしょうか。
配列のサイズを変えて4'000'000などにした場合には問題なくコンパイルを完了できます。
struct large
{
char x[5'000'000];
};
int main()
{
auto p = new large{};
return 0;
}
エラーメッセージ
main.cpp(8): fatal error C1060: ヒープの領域を使い果たしました。
126:デフォルトの名無しさん
15/12/19 11:37:45.72 HOXV9eUU.net
サイズが悪い
127:デフォルトの名無しさん
15/12/19 12:12:28.14 n5v6Wxrv.net
サイズが悪いというのはこの場合、具体的には4MBはよくて5MBは悪いということですよね。
つまり4MBと5MBの間のどこかにサイズの限界があるということなんでしょうか。
128:デフォルトの名無しさん
15/12/19 12:23:26.61 HOXV9eUU.net
環境によって異なる
129:デフォルトの名無しさん
15/12/19 14:52:24.69 a2/93t/h.net
>>125
コンパイラは?
130:デフォルトの名無しさん
15/12/19 16:52:03.86 mZAnd63z.net
そのヒープは「コンパイラのヒープ」だからね。
念のため。
131:デフォルトの名無しさん
15/12/19 20:54:06.17 n5v6Wxrv.net
コンパイラはVS2015のCommunityエディションUpdate1で、コンパイル時に
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
と出るものです。
最初のスレでレスをいただいたのですが、どうもnewのところに波括弧でなく丸括弧を使うといいようです。
お騒がせしました。
132:デフォルトの名無しさん
15/12/19 21:59:13.97 +2RpuZ8k.net
そこに複文を入れようとしたわけですね
133:デフォルトの名無しさん
15/12/19 22:17:03.51 EjHtX5K0.net
>>132
C++の文法理解してない初心者は黙ってようね。
134: ◆QZaw55cn4c
15/12/19 22:33:13.76 dQNHzwTT.net
()はコンストラクタのそれだが,{}はC++11から導入された初期化子だろう‥バグじゃないかね
135:デフォルトの名無しさん
15/12/21 17:54:14.64 bZVc/vPs.net
gcc で x86-64 向けのバイナリを生成するとき、関数の呼び出し規約を指定するオプションってある?
cl と gcc でレジスタの使い方が違うよね?
136:デフォルトの名無しさん
15/12/21 20:04:41.01 l5zhfPYH.net
-mabi=msとか?
今使ってるのが32ビットマシンだからかsysvでもmsでも変わらなかった
これで変わるかこれでいいか試してみて
137:デフォルトの名無しさん
15/12/21 21:05:55.08 bZVc/vPs.net
>>136
thx
Ubuntu で確認した
一応 gcc.godbolt.org の結果も貼っておく
URLリンク(goo.gl)
-mabi=ms を外すと rcx が rdi にかわる
138:デフォルトの名無しさん
15/12/22 23:53:07.70 NGrgb8N2.net
#include <stdio.h>
int printer(int p[])
{
int i;
for(i = 0; i < 5; i++)
{
printf(
139:デフォルトの名無しさん
15/12/22 23:57:48.51 NGrgb8N2.net
int bubble_sort(int b[])
{
int i, j, n, temp;
n = sizeof b / sizeof b[0];
for(i = 0;i > n;i = i + 1)
{
for(j = n; j < i + 1; j = j -1)
{
if(b[j-1] > b[j])
{
temp = b[j-1];
b[j-1] = b[j];
b[j] = temp;
temp = 0;
}
}
}
}
バブルソートで詰んだ…。
どこがおかしいのか教えてください。
140:デフォルトの名無しさん
15/12/23 00:23:22.44 v0nEZQ5O.net
>>139
int bubble_sort(int b[])
{
int i, j, n, temp;
n = sizeof b / sizeof b[0];
分子の「sizeof b」はちゃんとサイズ取れるのか?
今のコンパイラは知らんけど自分の知っているコンパイラなら忌避数で受け取った配列にsizeofしてもダメだったはず
やるなら、
int bubble_sort(int b[] , int n)
という風に配列サイズも引数で受け取るようにしたほうが良いと思う
141:デフォルトの名無しさん
15/12/23 00:24:07.56 v0nEZQ5O.net
×今のコンパイラは知らんけど自分の知っているコンパイラなら忌避数で受け取った配列にsizeofしてもダメだったはず
○今のコンパイラは知らんけど自分の知っているコンパイラなら引数で受け取った配列にsizeofしてもダメだったはず
142:デフォルトの名無しさん
15/12/23 00:24:51.84 94XzmV4H.net
>>139
for のコンディションがどちらも駄目
143:デフォルトの名無しさん
15/12/23 00:32:41.28 v0nEZQ5O.net
外側のループ
for(i = 0;i > n;i = i + 1)
i > n はおかしい
内側のループ
for(j = n; j < i + 1; j = j -1)
nには配列の数が入っているはず
int a[10]; という宣言の時、a[10]ではエラーになる。a[9]が最後のインデックス。
つまり j = n のときのb[j] は配列のインデックスを超えている
全体的におかしいのでここでも見て
URLリンク(www1.cts.ne.jp)
144:デフォルトの名無しさん
15/12/23 00:47:36.44 XRDkq33u.net
ありがとう
なにがなんだかチンプンカンプンだったが、少しわかってきた気がする
上にはフローチャートとアルゴリズムを考えながら書けと言われているが本当にそれ以外の問題だ
145:デフォルトの名無しさん
15/12/23 01:11:41.20 xKy7nhKt.net
フローチャートなんて働いてから一度も見たことないなー
UMLのシーケンス図なら時々見る程度
146:デフォルトの名無しさん
15/12/23 02:13:28.80 votnFkGe.net
フローチャートは万物の基本だから仕事にするとなった以上は出来なきゃまずいっしょ
147:デフォルトの名無しさん
15/12/23 09:04:00.88 BrzFNCu8.net
アルゴリズムフローチャートは使わないな
ビジネスフローチャートは顧客も読めるし誤解なく意思疎通できしで非常に便利だからよく使う
148:デフォルトの名無しさん
15/12/23 21:23:21.87 yHKdz1et.net
アクティビティ図?
149:デフォルトの名無しさん
15/12/24 22:58:28.26 65Ta51SK.net
Hi gays
ちょっと聞きたいんだがPythonで
ans = a * (d-b if d>b else 0)
ってどういう意味なんだい?
cライクな言語で書いたら
if( d>b ){
ans = a * d-b;
}else{
ans = 0;
}
と等価なのかい?
150:デフォルトの名無しさん
15/12/24 22:59:49.41 65Ta51SK.net
おっとすまん c/c++スレやった。気にしないでくれ!
151:デフォルトの名無しさん
15/12/24 23:27:07.31 Q6U3kr4L.net
どっちかというと三項演算子やね
152:デフォルトの名無しさん
15/12/24 23:44:33.46 65Ta51SK.net
>>151
Thank you !
なるほど謎が解けました。定義ながめても
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]
みたいな感じだったからなんでじゃ!と思ってたが
確かに三項演算子(Conditional expressions)のとこに
しっかり書いてありました!
153:デフォルトの名無しさん
15/12/25 00:59:07.49 47X2XmRH.net
>>1
RPGツクール2000 , RPGツクールMV URLリンク(tkool.jp) ( JavaScript 採用 )
WOLF RPGエディター URLリンク(www.silversecond.com)
デュエル・マスターズ Android版 ,i-OS版、公式 URLリンク(dm.takaratomy.co.jp)
デュエル・マスターズ対戦CGI ex
URLリンク(web.archive.org)URLリンク(www53.atwiki.jp)
デュエル・マスターズ(デュエマ)DM ONLINE 1.8a / VanGuard ONLINE 1.5a
URLリンク(web.archive.org)URLリンク(uhyohyohyo.sak)<)URLリンク(kiimaa.jugem.jp)
「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート
URLリンク(web.archive.org)URLリンク(supersolenoid.blog63.fc2.com)
遊戯王 Automatic Dueling System
URLリンク(web.archive.org)URLリンク(www3.atwiki.jp)
遊戯王 デュエル・オンライン
URLリンク(web.archive.org)URLリンク(www31.atwiki.jp)
URLリンク(web.archive.org)URLリンク(do.yugioh-portal.net)
ウィクロス( WIXOSS ) WEBXOSS URLリンク(webxoss.com) URLリンク(webxoss.com)
BG(ボードゲーム)Engine URLリンク(web.archive.org)
URLリンク(web.archive.org)URLリンク(14owl.hateblo.jp)
アプレンティス マジック:ザ・ギャザリング(MtG)オンライン化 URLリンク(homepage1.nifty.com)
URLリンク(web.archive.org)URLリンク(homepage1.nifty.com)
154:デフォルトの名無しさん
15/12/25 01:00:12.11 47X2XmRH.net
【 オンラインTCGエディター 】 >>1,>>153
デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書け。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストしろ。
個vs個、多数乱戦、チームvsチーム、個vsチームを実現し、P2P通信対戦プラグイン有り。
設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみろ。
個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。
↓
エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。
↓
遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。
↓
各社TCGを再現するテストプレイ ⇒ 更に改良や修正 + コード記述の仕様書(設計書)を作成。
↓
機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ-グ用でサーバー稼動。
↑
下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。
さ~て、インド人ベンダーと日本人の翻訳担当PGを見つけよっと!ww
スレリンク(entrance2板:-20番)
155:デフォルトの名無しさん
15/12/25 08:59:08.40 vl+/L70O.net
VC++でウォッチ機能を使いたいです
非アクティブ時にも処理を実行するようにすると
ウォッチ機能を使えましたが、
一度使うとウィンドウを表示できなくなります
ウォッチ機能を使った後に、また継続して処理してほしいのですが
どうすればいいでしょうか
156:デフォルトの名無しさん
15/12/25 09:18:35.50 vl+/L70O.net
色々勘違いをしていました…
ブレークポイントでウォッチ式の追加ができるんですね。
あるキーを押したらブレークポイントを呼び出す分岐を作って
うんぬんしました
157:デフォルトの名無しさん
15/12/25 17:57:56.01 VvmRSBaN.net
>>149
ans = a * d-b; じゃなくて ans = a * (d-b); じゃないかな…と
158:デフォルトの名無しさん
15/12/31 17:47:20.07 W7H0CYCX.net
[0, 1]の範囲で一様に分布するランダムなfloatを得るのに、
return (float)uint64_random / (float)uint64_max;
というのは合ってますか?
つまり64ビットからfloatへのキャストで打ち切られる部分があっても、計算上では一様な結果が得られるのか、ということです。
std::uniform_real_distributionを使えって話ですが今回は置いといて、あくまで上の計算が正しいのかどうかってことが聞きたいです。
159:デフォルトの名無しさん
15/12/31 18:36:18.09 31q/PxfR.net
間違ってる
160:デフォルトの名無しさん
15/12/31 22:48:01.51 W7H0CYCX.net
ならやっぱりシンプルに (1<<24)-1 とかの値でマスクしたのちfloatとして割り算すればいいんですかね。
なぜこんな質問をしたかというと、MSVCのuniform_real_distributionの実装が
実質>>158と同じで (float)1.48304654e+17 / (float)1.84467441e+19; のような計算が発生していて、
結果が不安になったからでした。
それではよいお年を。
161:デフォルトの名無しさん
16/01/01 00:18:41.67 T3uz4ezr.net
>>158
uint64_randomがuint64の範囲で一様なんであれば結果も[0, 1]の範囲で一様なんじゃね?
ただし精度が落ちた結果離散的な分布になるんで厳密には一様分布とは言えないかも知れんが。
162:デフォルトの名無しさん
16/01/04 08:47:58.51 z6cA6x0M.net
質問です。
タブレットPCで、専用ペン(N-Trig)を使って線を描くとき、(VAIO DUO 11など)
線の書き出しで、一瞬だけポイントの位置を取りこぼしてしまいます。
市販のソフトではタブレット専用ドライバに対応?してるようで、取りこぼすことはないのですが、
自作でペンで線を描くプログラムを描くと、取りこぼしてしまいます。
プログラム側でタブレット専用ドライバに対応させる必要があると思うのですが(そうしないと筆圧も検出できない)
対応方法や、技術資料など公開してるサイトなどありますでしょうか?
よろしくお願いします。
フリーソフトで同じ現象が出るのは、例えばMOZAなどです。
URLリンク(www.vector.co.jp)
ペンをすばやく動かしたとき、書き始めのいくつかのポイントをとりこぼすので、
フリーハンドですばやく円を描いても書き始めの部分だけ直線で描画されます。
よろしくお願いします。
163:デフォルトの名無しさん
16/01/05 12:57:02.41 KbFq7Je6.net
TabletPC API じゃだめかの?
164:デフォルトの名無しさん
16/01/07 08:27:52.15 Sx2pYlJo.net
>>163
ありがとうございます。筆圧の検出はできました。
しかし、線の書き出してポイントを取りこぼす原因がわかりません。
挙動を見ると、ペンで画面にタッチした瞬間は、システムのタッチイベントにデータが渡されて、
描画ソフトのほうにペンの位置データが送られて無いような感じです。
どう制御したらいいのか、よくわかりません。
ご存知の方いらっしゃいませんか?
165:デフォルトの名無しさん
16/01/07 09:04:46.22 x9JXveKM.net
タッチイベントから始めればいい
166:デフォルトの名無しさん
16/01/07 15:28:40.10 Sx2pYlJo.net
システムのタッチイベントを一時停止させるということでしょうか?
方法がよくわかりません。
167:デフォルトの名無しさん
16/01/07 16:40:19.27 7vfkJ+8f.net
>>166
最初の座標はタッチイベントで通知された座標を使えってことじゃね?
168:デフォルトの名無しさん
16/01/07 17:40:32.76 LbIHZlg8.net
挙動を観察してると、こんな感じです。()内は想像なので違うかも。
ペンでタッチした瞬間→OSが「タッチされたという円のカーソル」を表示する→最初の座標はソフトで取得できる
ペンでタッチしたままmoveする→0.1秒くらい、ソフト側でmove中のペン座標を検出できない(?)
→(OSが長押しなどのタッチイベントを検出しようとしてる?)
→0.1秒くらい後で、move後のペンの座標をソフトで取得できる。
→結果、線の書き始めがカクカクになる。
なので、OS側のタッチイベントをキャンセルできればいいのかな?と思ったわけです。
別の原因かもしれませんが。
普通にマウスを使えばカクつかないので、ペンイベントに関係した何かが原因と思います。
169:デフォルトの名無しさん
16/01/13 15:37:26.50 Kf0FfNiC.net
static関数やstatic変数はあるけど
staticクラスはなかったりする?
あるならサンプルがほしいです
170:デフォルトの名無しさん
16/01/13 15:43:37.66 Tiz9r6x1.net
>>169
unnamed namespaceを使えばいいよ。
別名anonymous namespace
namespace {
class Foo {};
}
171:デフォルトの名無しさん
16/01/13 17:11:17.89 FgL34cC5.net
シングルトンのことを言ってるのではなかろうか?
まあstaticには意味が複数あるから何とも言えないが
172:デフォルトの名無しさん
16/01/13 18:00:04.70 hhTEC9ap.net
C#にはあるんだよ、そのものズバリのstaticクラスが。
ソレのことじゃね?
URLリンク(msdn.microsoft.com)
> 次のクラスは static として宣言され、static メソッドのみが含まれます。
> static class CompanyEmployee {
> public static void DoSomething() { /*...*/ }
> public static void DoSomethingElse() { /*...*/ }
> }
> 定数宣言や型宣言は、暗黙に静的メンバーです。
173:デフォルトの名無しさん
16/01/13 18:30:50.35 Kf0FfNiC.net
public static class クラス名 {
}
みたいな感じでstaticクラスを作るのは
C#にはあるけど、C++には無いってことでOK?
174:デフォルトの名無しさん
16/01/13 20:00:49.73 Kf0FfNiC.net
C++ には static class は無いってことで
OKなんだよな!?
175:デフォルトの名無しさん
16/01/13 20:12:22.35 A49t3q/a.net
先生、staticクラスとstaticメンバしか持たないクラスの違いってなんなんですか?
176:デフォルトの名無しさん
16/01/13 21:09:53.87 HsSfXxOq.net
c++ならnamespaceで良いんじゃないか?
177:デフォルトの名無しさん
16/01/14 13:38:21.56 KoBeZziz.net
C++ には static class は無いってことで
OKなんだよな!?
178:デフォルトの名無しさん
16/01/14 15:13:26.93 KoBeZziz.net
>>175
同じだ!
C++ には static class は無いってことで
OKなんだよな!?
179:デフォルトの名無しさん
16/01/14 20:42:14.11 Zc1b49I1.net
C++ に static クラスは普通にあると思うが
180:デフォルトの名無しさん
16/01/14 23:36:23.52 9GGakY72.net
>>179
サンプルソース頼む
181:デフォルトの名無しさん
16/01/15 00:10:02.43 5etCVVqM.net
インスタンスを作って使うような普通のクラスじゃなくて
関数をパッケージ化しただけの、namespace的な使い方をするクラスってことでしょ
ビルド時の挙動とかに差はあるかもしらんけど
182:デフォルトの名無しさん
16/01/15 04:21:23.98 nz6sd5//.net
>>180
URLリンク(codepad.org)
183:デフォルトの名無しさん
16/01/15 08:46:56.72 wa8kRhUB.net
>>182
それがstaticクラス w 初心者以前だわー
お前、便所でオナニーしてろ、出てくんな。
184:デフォルトの名無しさん
16/01/15 10:27:10.73 AdEtazjQ.net
>>178
その意味なら、static classという用語を使わないだけで、
named namespaceがその役割を果たすよ。
namespace C1 {
int x;
void foo() {
printf("%d\n", x);
return;
}
}
int main() {
C1::foo();
return 0;
}
185:デフォルトの名無しさん
16/01/15 12:27:11.60 RRBj9slx.net
>>182
Objって名前の変数を内部リンケージにしただけですやん…
C#のstatic classから程遠いですやん
186:デフォルトの名無しさん
16/01/15 20:06:38.71 nz6sd5//.net
>>183
>>185
はは,ごめんごめん‥
187:デフォルトの名無しさん
16/01/15 22:37:03.46 RSgCFGzJ.net
(HBITMAP)hBmpのデータを、(Gdiplus::Bitmap *)gBmpに、変換したいのですが、
どのようにしたらいいのでしょうか?
188:デフォルトの名無しさん
16/01/16 00:10:28.87 4AnwHYnZ.net
コンストラクタにHBITMAP渡せばいいだけじゃね?
189:デフォルトの名無しさん
16/01/16 12:56:40.25 QU9s9ZKo.net
>>187
調べたらHBITMAPと共にHPALETTEを要求するコンストラクタがあったぞ
URLリンク(msdn.microsoft.com)(v=vs.85).aspx
190:デフォルトの名無しさん
16/01/16 16:57:27.38 UmbayiDQ.net
ありがとうございます。出来ました。
HPALETTEと聞いて身構えましたが、NULLでOKでした。
191:デフォルトの名無しさん
16/01/17 10:41:17.97 FnUzwqcH.net
struct A {
int x, y;
A(int a, int b) :x(a), y(b) {}
};
int i = 0, j = 0, k = 0, m = 0;
A a{i++, i++};
A b(j++, j++);
auto c = A{k++, k++};
auto d = A(m++, m++);
波括弧リストの各要素は、左から評価されると思っていたのですが、
上のabcdいずれもx=1,y=0となりました。
コンストラクタが呼ばれる場合は波括弧にしようと、引数の評価順序は通常の関数と同じくコンパイラ次第ということになるんでしょうか。
192:デフォルトの名無しさん
16/01/17 12:44:25.90 8qUaiUxA.net
for(int i=0;i<100;++i)と、for(int i=0;i<100;i++)も
iに入る値は0~99になるってこと?
193:デフォルトの名無しさん
16/01/17 13:07:17.71 J8S7Inib.net
変わってくるのは
j = i++;
j = ++i;
194:デフォルトの名無しさん
16/01/17 13:55:06.87 1NfmC2ez.net
i++と++iで結果が変わってくるのは常識レベルだけれど
i++と++iで結果が変わるようなコードはあんまり書きたくないなあ
195:デフォルトの名無しさん
16/01/17 13:58:01.48 i3k5KRJv.net
i = i++; ←undefined
196:デフォルトの名無しさん
16/01/17 20:57:56.42 ZUkPM10Q.net
>>191
コンパイラの不具合
規格では初期化子リストの各要素は左から順に評価されるであってる
197:デフォルトの名無しさん
16/01/18 07:43:20.39 O3Vj0Ahg.net
>>191
これってどのパターンもinitializer_listとして処理されずにただのアグリゲートで直接「A(int a, int b)」が呼ばれるんじゃないの?
initializer_list<int>を引数に取るコンストラクタにしないとただただA(int a, int b)になって副作用複数で動作未定義になると思うんだけど
198:デフォルトの名無しさん
16/01/19 08:25:02.67 pbmLvf11.net
副作用完了点までの間の演算の順序は未定義だと思うよ
199:デフォルトの名無しさん
16/01/19 14:07:47.73 IcGeaXVP.net
クラスについての質問です。(C++)
printf(
200:デフォルトの名無しさん
16/01/19 14:13:54.81 IcGeaXVP.net
文章が途中で切れてしまったので再掲です。
改善しない場合は不具合と思われるのでクローズします。
本文
クラスについての質問です。(C++)
printf("%d,%d,%d",Instance名,Instance名,Instance名);
のように記述すると、クラスのメンバ変数が上から順番に呼び出されることがわかりました。
この機能は、本来の仕様なのでしょうか?また、仕様であるとすれば、名称はありますでしょうか。
ご解説のほどよろしくお願い致します。
201:デフォルトの名無しさん
16/01/19 14:30:34.90 yzf0Ubeh.net
>>200
上から順番にってのがよく分からんが、標準的な実装だと右から順に評価される。
評価順序は仕様上は未定義だった筈。
202:デフォルトの名無しさん
16/01/19 15:00:24.15 XmaCTdxl.net
>>200
可変引数の関数printf()に渡された引数が
たまたま3個のint数と解釈可能になる順序に
スタックに積まれてるだけなんじゃないかしら。
#include <stdio.h>
struct some {
int a, b, c, d;
};
void main() {
some ins1 {0, 1, 2, 3};
some ins2 {10, 11, 12, 13};
printf("%d, %d, %d\n", ins1, ins2);
}
これで 0, 1, 2 と表示される感じ。
手元の環境では 0, 1, 2 だけど、移植性は全然ないよね。
203:202
16/01/19 15:21:26.58 XmaCTdxl.net
言い訳っぽいけど、普段は >>202 のようなコードは書かないよ。
コンパイラのオプションで書式指定と引数並びを照合してもらう。
今回は、コンパイルと実行ができることと >>200 に書かれたような
出力が得られることを実験しただけね。
204:200
16/01/19 15:40:27.23 IcGeaXVP.net
>>202
ご解説ありがとうございます。
仰る通り、クラスの仕様ではなくprintf関数による現象でした。
ありがとうございました。
205:デフォルトの名無しさん
16/01/19 16:16:36.66 uAThxx94.net
可変個引数の呼び出しだとスタックに積む順序とともに評価順が変わるという話が
206:デフォルトの名無しさん
16/01/19 21:42:47.84 OWcc7WP1.net
未規定
なので鼻から悪魔は出ない模様
207:デフォルトの名無しさん
16/01/19 22:58:57.80 8V+g6swC.net
私の環境だと標準入力の入力文字数制限が4095文字なんだけどこれを取っ払う方法ありますか?
osはwindows7 visual studio 2015使ってます
std::cin >> str みたいなときの話です
ググったんだが他の環境だとこんな制限ないっぽい……
208:デフォルトの名無しさん
16/01/20 03:31:40.09 7T123+WA.net
標準入出力のバッファが4KBだからだろ
Linuxのfind コマンドでも、ファイル数が多いと、
引数リストが長すぎて、コマンドが失敗する
そういう時、パイプで、xargs につなげると、
(4KB毎に?)引数を分割して、実行してくれる
find ~ | xargs ~
バッファが一杯になったら、それを出力して、
バッファを空にする。その後、バッファに読み込む
209:デフォルトの名無しさん
16/01/20 08:16:31.13 UTQHsO+H.net
>>207
setvbuf() って関数でどうにかならんかの。
俺も試したわけじゃないんだけど。
210:デフォルトの名無しさん
16/01/20 09:06:46.12 tlDETzf4.net
>>207
それ実行してもstrに4095バイトしか入らないってことはないと思うけど?
211:デフォルトの名無しさん
16/01/20 10:21:56.43 PU8f41kT.net
>>210
そういう質問じゃないだろ
212:デフォルトの名無しさん
16/01/20 12:33:16.22 tlDETzf4.net
>>211
どういう問題なの?
213:デフォルトの名無しさん
16/01/20 12:35:33.21 zFAeGKrq.net
>>207
手元に実行環境がないから俺の思ってる現象と実際に起きてるそれとが同じかどうか分からんけど
多分ライブラリがクズなのが原因。
文字列読み込みくらいなら自分で書いてみよう
レシピは?
getchして必要ならutf-8をUCS4にする類のデコーディングをして、stringにappendするだけ。簡単だよね?
214:デフォルトの名無しさん
16/01/20 12:39:52.50 zFAeGKrq.net
>>212
「改行が来るまでバッファに貯めこんで、改行が来たら返す関数」と
「その関数を使ってstringを作る関数」みたいな実装になってて、
しかも改行の判定だのeof判定だのループだのをやってないんじゃないかなぁと思ってる
215:デフォルトの名無しさん
16/01/20 14:33:44.70 7Lwquj6u.net
すみません実際にはgetlineで読み込んでいます
std::cin >> strでも同じ問題が起きたのでこのような例にしました。
実際には下のコードを書いています
std::string cmd, token;
while (std::getline(std::cin, cmd))
{
// 入力されたコマンドを入力ストリームとする
std::istringstream ss_cmd(cmd);
// 空白は読み飛ばしながら、tokenに代入
ss_cmd >> std::skipws >> token;
if (token == "")
{
//いろいろな処理
}
else if (token == ...
}
216:207
16/01/20 14:40:09.85 7Lwquj6u.net
このプログラムでgetlineが実行され標準入力からの受付待ちになったとき
コピペしてあった4096文字以上の文字列を標準入力にペーストすると、4096文字目以降が途切れて表示されなくなってしまいます
それ以降キーボードから入力しても何も表示されず、受け付けてくれないようです
標準入力以外(ファイルストリーム)からの入力に変更することは仕様上できないので、なんとか標準入力の制限を取っ払う方法を調べていましたが、見つからずここで質問させていただきました
217:デフォルトの名無しさん
16/01/20 14:57:00.34 +L7kwNqj.net
それってプログラムじゃなくてコマンドプロンプトの制限なんじゃ?
218:207
16/01/20 15:02:48.12 7Lwquj6u.net
>>208 >>209 >>213
教えてくれてありがとう。詳しい状況説明します
GUIと標準入力でやりとりするプログラムを書いています
GUIは将棋所というプログラムでオープンソースではないです
私が作ってるのは将棋の思考エンジンです
これで将棋を指すと807手目くらいで思考エンジンに送る文字列が4096文字を超えてしまい、思考エンジンの動作が止まってしまうようです
219:207
16/01/20 15:08:19.19 7Lwquj6u.net
>>217
コマンドプロンプトを立ち上げて4096文字以上の文字列をペーストしたところちゃんと表示してくれたので、大丈夫なんじゃないかと思ってるのですが……
しかも、以前2000000文字を標準入力から受け取るプログラムを書いたことがあって、そのときは問題なく動いたはずなんです
この問題です→URLリンク(yukicoder.me)
220:デフォルトの名無しさん
16/01/20 15:08:44.03 zFAeGKrq.net
>>216
調べたら、どうもコンソールの制限みたい。
URLリンク(stackoverflow.com)
Linuxにおいでよ。
221:207
16/01/20 15:12:22.18 7Lwquj6u.net
>>220
そうなんですね……ありがとう
連投すみませんでした
222:デフォルトの名無しさん
16/01/20 16:03:06.86 6opntLoI.net
std::string型の "abc"+str のように、
クラスの左側のoperatorを変更したい場合は、どのように記述すれば良いでしょうか。
よろしくお願い致します。
223:デフォルトの名無しさん
16/01/20 16:24:10.25 UTQHsO+H.net
>>222
#include <iostream>
#include <string>
std::string operator+(const char *s1, const std::string& s2)
{
std::string ret {s1};
ret += s2;
return ret;
}
int main() {
const char *s1 = "C_string";
std::string s2 {"std::string"};
std::cout << s1 + s2 << std::endl;
std::cout << s2 + s1 << std::endl;
return 0;
}
こんな感じに、クラスのメンバ関数でない形で書くんだと思うが。
関数の引数とか返り値の生存期間とか、あまり自信がないので詳しい方の添削を求む。
224:222
16/01/20 17:58:33.69 6opntLoI.net
>>223
できました!
クラスの外に記述する発想はありませんでした。
ご回答、本当にありがとうございました。
225:uy ◆Qawu9.2l1E
16/01/20 20:56:27.36 xIovtIq7.net
ヌバーン!生き生きとしたこんにゃくをAlien & Friend @ トリなし運用中wに叩きつけたときの音w
【ヌバーン!】ヌバーンから学ぶGoogleのサジェスト汚染の仕組みw
スレリンク(tech板)l50
226:デフォルトの名無しさん
16/01/20 22:13:13.72 arPtyuMt.net
自然数aと列数mを入力として、各行の要素の合計がaとなるnxm行列を作りたいんですがどうしたらいいか教えて下さい
例えばa=2、m=3とすると
2 0 0
1 1 0
1 0 1
0 2 0
0 1 1
0 0 2
という6x3の行列です
227:デフォルトの名無しさん
16/01/20 23:39:56.17 bvuszQOX.net
ええと、別に行列である必要なくない?
228:デフォルトの名無しさん
16/01/20 23:52:10.42 Gr6aoqFK.net
仮に作るとして
行の並びはどうやって決めてるんかね
229:デフォルトの名無しさん
16/01/20 23:56:05.00 arPtyuMt.net
行の並びは、各行に重複がなければ何でもいいです
230:デフォルトの名無しさん
16/01/21 00:02:08.78 yQ7XttE4.net
全パターンって事?
a = 合計 = 2
m = 列数 = 3
2 0 0
0 2 0
0 0 2
1 1 0
1 0 1
0 1 1
231:デフォルトの名無しさん
16/01/21 00:20:37.50 6QaN3bnU.net
>>230
そうです
それでaとmが引数で、それに応じて作られる行列が変わるというモノにしたいです
232:デフォルトの名無しさん
16/01/21 00:45:35.57 yQ7XttE4.net
今はどこまで出来上がってるのかideoneあたりにでも上げてみて
233:デフォルトの名無しさん
16/01/21 01:44:18.71 7s6F6whZ.net
そんなのただの組み合わせ問題でしかないような気はするが
234:デフォルトの名無しさん
16/01/21 05:20:25.85 PqFPWDYj.net
まずC言語で行列をどう定義すれば良いんだろ?
とりあえず6*3の2次元配列に値を格納するとかなら再現出来るけど
やっぱりそれって組合せを羅列してるだけだしなあ
235:デフォルトの名無しさん
16/01/21 07:15:24.30 6QaN3bnU.net
>>234
まさしく組み合わせの列挙と同じです
そういうアルゴリズムはもうありますか?
組み合わせの列挙ができれば行列の表現は自分で適当に定義するので大丈夫です
236:デフォルトの名無しさん
16/01/21 08:12:31.11 7s6F6whZ.net
>>235
そういうアルゴリズムがあるのかは知らないが、例えば再起関数とかでできる
#include <iostream>
#include <vector>
using Vector = std::vector<int>;
void Func(size_t a, size_t m, size_t movingTarget, size_t start, Vector* pbuff, std::vector<Vector>* pdest)
{
if(movingTarget != a){
for(size_t i = start; i < m; ++i){
(*pbuff)[i] += 1;
Func(a, m, movingTarget+1, i, pbuff, pdest);
(*pbuff)[i] -= 1;
}
} else {
pdest->push_back(*pbuff);
return;
}
}
int main() {
size_t a, m;
std::cin >> a >> m;
Vector buff(m, 0);
std::vector<Vector> dest;
Func(a, m, 0, 0, &buff, &dest);
return 0;
}
237:デフォルトの名無しさん
16/01/21 17:50:19.63 AYpDF3p9.net
すみません、質問です。
HBITMAPでハンドルされたビットマップのデータを、
LPBITMAPFILEHEADERのポインタに渡すにはどうしたらいいでしょうか?
HBITMAPのほうは、ARGBで、LPBITMAPFILEHEADERにはRGBで渡したいのですが。
1ピクセルずつ転送するしか方法はないでしょうか?
238:デフォルトの名無しさん
16/01/22 01:15:05.06 G5rv7JJ3.net
>>237
LPBITMAPFILEHEADERはBITMAPFILEHEADER構造体へのポインタなんだけど、
BITMAPFILEHEADER構造体はビットマップファイルのサイズとかデータのオフセットなんかを保持するものであって、
ビットマップの内容を保持するものじゃない。
だからビットマップのデータを渡すことはそもそも不可能。
ビットマップファイルを作ることが目的なら、GetDIBits関数を使えば行けるっぽい。
URLリンク(www.geocities.co.jp)
239:デフォルトの名無しさん
16/01/22 07:20:07.20 KhXVHsnG.net
>>236
vector とかをポインタで渡す奴初めて見た
240:デフォルトの名無しさん
16/01/22 08:04:21.41 mLydxleH.net
>>239
別に普通じゃね?
241:デフォルトの名無しさん
16/01/22 08:42:22.39 0StJWjHm.net
渡した引数が関数内で変更されることを明確にするために
参照でなくポインタを引数に使うって流儀があるな。
呼び出す際に意識できるように。
ただ、この関数の場合vectorの中身を書き換えるのは
関数の目的からして明らかだから、参照でも構わない気もする。
242:デフォルトの名無しさん
16/01/22 09:08:19.22 bim8zuhw.net
>>241
C++ core guidelines だと、
入力専用
const 参照渡し F(const T&) ただし、int とかは値渡し
出力専用
return で返す。move を使う。
入出力用
参照渡し F(T&)
っていうのを推奨してたと思う。
ご指摘の通り、呼び出し側で、const T& とT& の区別が付かないから、const T& とT* で区別するっていう流儀もあって、google の coding guideline もそうなっていたと思う。
一方 fortran は、
intent(in)
intent(out)
intent(inout)
を使うことが出来て、意図がそのものズバリ表せて分かりやすい。
243:デフォルトの名無しさん
16/01/22 23:40:00.14 EmPy3KXO.net
>>238
参考になります。ありがとうございます。
244:デフォルトの名無しさん
16/01/23 07:48:50.85 QkGTEhqA.net
>>236
おーまさしく求めていたモノです
ありがとうございました
245:デフォルトの名無しさん
16/01/23 13:05:07.65 eTMuwGLO.net
すみません質問です。
HBITMAP hBitmap =(作成したビットマップ画像のハンドル)
BITMAP bmp;
GetObject(hBitmap,sizeof(BITMAP),&bmp);
で、bmpにHBITMAPのビットマップ情報を取り出せるようですが、
DIBとして作成したビットマップの、
LPBYTE lpPixel のポインタはどのように取得できるのでしょうか?
bmp.bmBitsPixelとか、bmp.bmBitsとか、bmp.bmPlanesがそうかな?と思ったのですが、RGB値を取得するのに
unsigned char* pix = (unsigned char*)bmp.bmBitsPixel;
Color color( pix[0], pix[1], pix[2] );
では、アクセス違反エラーになるので、よくわかりません。
246:デフォルトの名無しさん
16/01/23 13:46:54.30 BpJ08GBs.net
>>245
質問する前にちょっとはググろうぜ
URLリンク(msdn.microsoft.com)
URLリンク(katahiromz.web.fc2.com)
247:デフォルトの名無しさん
16/01/23 17:35:21.00 8FfjCDv5.net
>>246
ありがとうございます。
bm.bmBitsが、データの先頭ポインタということでいいんですよね?
これを、RGBごとの配列として取得しようとするとアクセス違反が出るのですが、
参考になるサンプルがググっても出てこないので困っています・・・・・・・・・。
248:デフォルトの名無しさん
16/01/23 19:21:25.50 AYxzv3Ol.net
LIBRARY_PATHで指定しても聞いてくれん
-Lとかめんどい
249:デフォルトの名無しさん
16/01/23 19:29:56.09 BpJ08GBs.net
>>247
手元に環境がないのでどんなコード書いて動かんのか分からんのだけど、
>>264の2つ目のリンクに載ってる動くコードは試してみた?
ビットマップの情報(info)とビットマップを構成するピクセルの情報(data)は違うよ。
後者を得るにはGetDIBits関数を使う。
250:デフォルトの名無しさん
16/01/23 19:47:23.84 BpJ08GBs.net
>>248
gcc --print-libgcc-flie-name
で表示されるファイルと同じ場所にあるspecsってファイルを編集する。
デフォルトのファイルが無ければ
gcc -dumpspecs > `dirname $(gcc --print-libgcc-file-name)`/specs
して作る。
251:デフォルトの名無しさん
16/01/23 20:27:45.17 sjR26rme.net
>>249
2つ目のリンクだと、
pBitsに、データ全体を格納できるバッファを確保して、
GetDIBitsで、pBitsに、データ全体を丸ごとコピーしてるという流れでしょうか?
ということは、それだけ時間がかかるわけですよね?
作法はよくわからないのですが、
元データのポインタに直接アクセスするような方法は普通しないということでしょうか?
安全のため?とか?
252:デフォルトの名無しさん
16/01/24 06:35:19.53 LlGxXnUD.net
>>250
gccを上げたのにldが古いままだからか知りませんがうまくいかなかったので諦めて-Lしました
253:デフォルトの名無しさん
16/01/24 11:46:59.00 LHp2Xjej.net
>>251
元データがどんな形式で保持されてるかは分からない。
もしかしたら配列の配列を使った拡張性の高い形式になってるかもしれないし、
もしかしたら1ピクセルに一色あたり10ビット使ってるかもしれないし、
あるいは赤5ビット緑6ビット青5ビットかもしれない。
その内部形式をbitmap形式に変換する必要があるんだから
どっちみちGetDIBitsでデータ全体をbitmap形式で再生成する必要がある。
254:デフォルトの名無しさん
16/01/24 17:01:15.10 LvcqEuFR.net
>>253
わかりました。ありがとうございます。
255:デフォルトの名無しさん
16/01/25 10:22:34.82 1hi7ZmAY.net
ランタイムライブラリ→マルチスレッド(/MT)に設定してるんだけど、
外部のライブラリを、追加の依存ファイルで設定して、
リンクするときに静的にEXEに埋め込めると思ったのですが出来ないんだっけ?
他に設定とかあります?
256:デフォルトの名無しさん
16/01/25 20:36:08.52 Gry0WUO1.net
VCスレ行け
257:デフォルトの名無しさん
16/01/31 00:14:56.28 yeB8Lsmn.net
すみません、C++初心者ですが、質問です。
変数の内容を複数個組み合わせて、別の変数の識別子(名前)にしたいのですが、
良い方法がわかりません・・・どうやったらいいのでしょうか?
具体的には以下のソースのような感じです。
#include <iostream>
#include <string>
using namespace std;
int main() {
string var1 = "a";
string var2 = "01";
string a01 = "表示したい項目1";
string a02 = "表示したい項目2";
string a03 = "表示したい項目...";
if ( var1+var2 == "a01" ) cout << a01 << endl;
// 上記のような条件分岐ではなく、文字列を組み合わせて変数名を変えたい。
// イメージ的には下のような感じで、変数a01の内容を参照したい。
cout << var1+var2 << endl;
}
258:デフォルトの名無しさん
16/01/31 00:24:13.44 rR0u1lvP.net
>>257
<map>じゃあかんか?
259:デフォルトの名無しさん
16/01/31 01:10:39.19 yeB8Lsmn.net
>>258
ありがとうございます。
こんな感じかな?
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
string var1 = "a";
string var2 = "02";
string a01 = "表示したい項目1";
string a02 = "表示したい項目2";
string a03 = "表示したい項目...";
map<string, string> mp;
mp["a01"] = a01;
mp["a02"] = a02;
cout << mp[var1+var2] << endl;
}
かなりやりたいことに近づいたのですが、
新しい項目が出来て、var1とvar2の内容が変わった時に、map部分にも追記しないといけないのがネックだったりします。
この辺は、我慢するしかないのかなorz
260:デフォルトの名無しさん
16/01/31 01:32:33.46 rR0u1lvP.net
>>259
>新しい項目が出来て、var1とvar2の内容が変わった時に
どんな状況か具体的に書いてくれると分かるかも
そもそもvar1とvar2の組合せに特別な意味があるなら(aの01,bの03みたいな)
安易に結合させない方が扱い易い気がする
261:デフォルトの名無しさん
16/01/31 02:13:55.81 yeB8Lsmn.net
>>260
伝わるかわりませんが、
自作のテキストファイル上のスクリプトテキストから、
指定の画像ファイルをDXライブラリを使用して表示するというプログラムを作っています。
スクリプトは拡張性を考えて、「aaa」という種類の画像の「01番目」を表示というように、
「画像表示 , aaa , 01」のようにコンマで分けて記載しており、それをここで言うvar1とvar2に読み取って格納しています。
で、画像のファイルはDXライブラリのLoadGraph関数を使用して、
こことは別の場所でメモリへロード、グラフィックハンドル化しております。
それが「表示したい項目」にあたるもので、aaa01という名前のint型の変数になっています。
cout~endl; の部分は、実際にはDXライブラリの描画関数のDrawGraphを使用するため、引数にグラフィックハンドルを設定します。
スプリプト側である程度画像ファイルをコントロールしたいというコンセプトで作っており、
新しい画像ファイル追加時も極力プログラム側は弄らずに済むようにしたいのです。
あと、明日早いのでもう寝ます、すみませんorz
262:デフォルトの名無しさん
16/01/31 04:23:29.02 +opoo++4.net
>>261
>もう寝ます、すみませんorz
気にすんな、おやすみ
とりあえず書くだけ書いとくと
・変数名はあくまでも人間が変数の役割を見る為の物
・実行時には変数名なんて一部を除き消えてる
・まずLoadGraphする時に片っ端から変数宣言するのを止めるべき
・その為には変数xxx00と画像ファイルにどんな対応関係があるのかを見直す必要がある
(xxx00→img\xxx\00.png等)
263:デフォルトの名無しさん
16/01/31 10:56:19.63 KmNLeza2.net
1.ARGBの24ビットでBITMAPを作り、Aに透明度の値を入れます。
2.GDIで、PNGにセーブします。
3.セーブしたファイルのバイナリを見ると、Aに値が入っています。
4.GDIで、PNGをロードします。
5.GDIのGetPixel、GetAlphaで、Aの透明度の値を取得できます。
PNGでは問題ありませんが、BMPでセーブロードしたとき、
セーブしたBMPファイルのバイナリを見るとAに値が入っているのに、
ロードした後、GetAlphaで、Aの透明度の値を正しく取得できません。Aの値は255になっています。
透明度付きBMPをロードする時に、何か設定が必要だったでしょうか?
透明度付きBMPはロードできないような仕様なのでしょうか?
264:デフォルトの名無しさん
16/01/31 11:10:13.83 wbBrgvcH.net
>>263
何でロードしてるん
ロードでAARRGGBBの所がFFRRGGBBになってるんじゃないの?
FFは0xFFの事な
265:デフォルトの名無しさん
16/01/31 11:22:28.41 KmNLeza2.net
>>263
訂正:24ビットではなく32ビットです。
>>264
GDIの関数です。
bmp = new Gdiplus::Bitmap(LoadFile,PixelFormat32bppRGB);
bmp->GetPixel( x, y, &pixelColor );
alpha = pixelColor.GetAlpha();
これで、PNGの場合はalphaが取得できますがBMPでは取得できません。
バイナリで見ると、BMPファイルにはalpha値が入っています。
たとえば0x88でも、GetAlphaで255になります。
266:デフォルトの名無しさん
16/01/31 11:26:50.86 wbBrgvcH.net
>>265
変更前 PixelFormat32bppRGB
変更後 PixelFormat32bppARGB
でやってみたらどうなる?
267:デフォルトの名無しさん
16/01/31 11:41:21.24 ym0w2q0h.net
mapとか、最近だとエディタの補完ってどこまで効くんだろ
268:デフォルトの名無しさん
16/01/31 11:56:29.04 KmNLeza2.net
>>266
あ~!と思いましたが、変わりませんでしたです。
269:デフォルトの名無しさん
16/01/31 12:03:49.64 wbBrgvcH.net
HBITMAP取ってGetObjectした時のbmBitsPixelは何になってる?
270:デフォルトの名無しさん
16/01/31 12:19:29.18 KmNLeza2.net
>>269
32になってます。
271:デフォルトの名無しさん
16/01/31 12:30:09.27 wbBrgvcH.net
>>270
GetPixel前にpixelColorを0x00000000にしても
0xFFRRGGBBになるの?
272:デフォルトの名無しさん
16/01/31 12:40:44.08 KmNLeza2.net
>>271
pixelColor=0x00000000;
bmp->GetPixel( x, y, &pixelColor );
alpha = pixelColor.GetAlpha();
で、alpha は255になります。
PNGロードは問題なくalphaを取得できるんですが。
いま、LockBitsでロードしたデータの中身を見ようとしてるんですが、
素人なので、取得の仕方から調べてるところです。
273:デフォルトの名無しさん
16/01/31 14:12:49.87 Q+LCs9MU.net
バイナリだとbmpは下の行から格納されるからとかだったりして
274:デフォルトの名無しさん
16/01/31 14:18:47.67 wbBrgvcH.net
>>272
RGBはxyに期待する値取得できる?
275:デフォルトの名無しさん
16/01/31 14:31:16.81 KmNLeza2.net
>>237
>>274
RGBは問題ありません。
LockBitsで見たところ、ロードしたデータのalpha値はすでに255でした。
これって、こちらだけの問題でしょうか?
他の方はalpha値をロードできているのでしょうか?
276:デフォルトの名無しさん
16/01/31 14:32:33.18 KmNLeza2.net
あれ?sageてるのに、なぜか上がってるし?
277:デフォルトの名無しさん
16/02/03 18:07:52.25 tpmWM1rq.net
通りすがりだけど、bmpにalphaなんてないよね?
278:デフォルトの名無しさん
16/02/03 20:54:07.47 uEOUJl1K.net
32bit中8bitをアルファに割り当てるのはよくあると思うけど
APIにそのまま渡せるかは知らない
279:デフォルトの名無しさん
16/02/03 21:27:06.77 cIfP8+z6.net
>>277 あるよ
>>278 渡せるよ(BITMAPV5HEADER)
280:デフォルトの名無しさん
16/02/03 21:37:47.64 +QXRA0Fd.net
非標準なので対応してるアプリ毎に違う
281:デフォルトの名無しさん
16/02/05 16:46:07.97 kz0UWJTh.net
それ言ったらbitmap形式自体がMSのとOS/2のとあるような
標準はいずこへ
282:デフォルトの名無しさん
16/02/06 14:37:10.84 XRyA0EjL.net
BITMAPV5HEADERは Win95 がダメだったから
それを未だに引きずってアプリの対応もイマイチなのよね
283:デフォルトの名無しさん
16/02/06 15:03:17.23 4STRQeN+.net
で,ビットマップの扱いはどうすればいいの,データの32ビット縛りも気が付かないと大変だし,ヘッダの各プロパティにもいろいろこだわりがあるようじゃないか,
284:デフォルトの名無しさん
16/02/06 15:17:27.16 SD/iIwrI.net
GDI+なんか使わないでWICでやる。
285:デフォルトの名無しさん
16/02/06 15:44:14.42 utAdfs60.net
内部形式で処理して、どうしてもbmpで出力したい時に変換すればいいんじゃない?
286:デフォルトの名無しさん
16/02/11 04:53:26.42 pNz7UH/B.net
スレリンク(tech板:564番)
わかる方いませんか?
マルチでごめんなさい。
287:デフォルトの名無しさん
16/02/11 11:44:52.07 vxNioHuU.net
向こうで即レスついてるじゃん。例えば、こういう事だよ。
class Types {
public:
typedef std::uint64_t ValueType;
typedef std::vector<ValueType> Container;
typedef std::string IDType;
static State ClientInitialize(
ICodeBreakerClient*, std::ostream& Logger,
Types::ValueType MaxValue,
Types::ValueType Digit_);
};
class CodeBrakerHost : public Types{
State PlayGame() {
...
Types::ClientInitialize(Client, *pos, Max, Digit);
}
}
288:デフォルトの名無しさん
16/02/11 12:19:09.02 pNz7UH/B.net
>>287
回答ありがとうございます。
一応作業してたら解消したのですが理解はしていません。
いまいちC++のコード規約理解してないのでこういうわなにはまってしまいます。
向こうにアルファ版がおいてあるので暇があったら遊んでみてください。
ありがとうございました。
289:デフォルトの名無しさん
16/02/11 12:32:08.05 vxNioHuU.net
ざっくり言うと、それまでに出現(定義)してない名前は使えない
クラス内メンバーは例外で、後から定義してても使える
290:デフォルトの名無しさん
16/02/11 12:43:42.53 pNz7UH/B.net
>>289
なるほど。参考にします。
291:デフォルトの名無しさん
16/02/11 22:42:24.22 vMQ0aSNq.net
>>187の質問で>>190で以下のような記述で解決したのですが、
#pragma once
#pragma comment(lib, "Gdiplus.lib")
#include <gdiplus.h>
using namespace Gdiplus;
--------------------
Gdiplus::Bitmap * bmp1;
bmp1 = new Gdiplus::Bitmap(hBitmap,NULL);
そのまま別のプロジェクトに移植したところ、
Debugで、「'Gdiplus::GdiplusBase::operator new' : 関数に 3 個の引数を指定できません。」
というエラーが出るようになりました。
が、Releasだと、エラーになりません。
Debugでコンパイルしたときだけエラーが出るような場合の原因として何が考えられるでしょうか?
292:デフォルトの名無しさん
16/02/12 00:33:59.18 Fqxy+b4c.net
ファイルの頭の方にあるこいつがGdiplusと相性悪い。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
293:デフォルトの名無しさん
16/02/12 10:17:01.79 bFgUXSY6.net
>>292
ありがとうございます。削除して上手くいきました。
294:デフォルトの名無しさん
16/02/14 12:46:34.08 VLtYVTYt.net
class Transaction {
public:
Transaction() { logTransaction(); };
virtual void logTransaction() { cout << "Transaction" << endl; };
virtual void logTransaction() const { cout << "const Transaction" << endl; };
};
class BuyTransaction : public Transaction {
public:
BuyTransaction() { logTransaction(); };
void logTransaction() { cout << "Buy" << endl; };
void logTransaction() const { cout << "const Buy" << endl; };
};
int main()
{
const BuyTransaction b;
return 0;
}
と書いた場合、基底&派生クラスともに非constな logTransaction()が呼ばれてしまいます。
const、非constオブジェクトの生成に関して処理を分けることは出来ないのでしょうか?
VS2015 VC++ と Mingw64 g++ 5.3.0 とも同じ動作になりました。
295:デフォルトの名無しさん
16/02/14 19:53:21.40 gzwnh80D.net
>>294
普通の筋で考えるとconstのコンストラクタも作らないと駄目でしよ。
でも、コンストラクタの意味からしてconstのコンストラクタってありえない。
ってあたりから、無理じゃね?
296:デフォルトの名無しさん
16/02/14 20:51:48.95 QinwwQiS.net
そのconstは変数bの属性だと思うんだよ。
クラス側としては
class BuyTransactonConst : public BuyTansaction
とか作れば?
297:294
16/02/14 21:17:33.93 VLtYVTYt.net
直接的に処理を分けることは無理みたいですね。
お察しが付くかもしれませんが、上記ソースコードは
スコット・メイヤーズさんのEffectiveC++第3版の9項からのものです。
説明では基底クラスのTransaction中では void logTranslation() const = 0;
と純粋仮想関数になっているのですが、サンプルソースを適当に変えて挙動を
みていたら、このことに気が付きました。
両名の方、レスありがとうございました。
298:デフォルトの名無しさん
16/02/14 23:45:36.83 aC/U9cwJ.net
質問です。
メンバポインタの必要性ってなんですか?
今メンバポインタについて勉強していますがわかりません。
あると便利なときってどんな時ですか????
299:デフォルトの名無しさん
16/02/15 01:17:40.04 CoPBLH5e.net
普通の関数ポインタじゃ扱えないから、その代用
……とかそういう話なかったっけ?
300:デフォルトの名無しさん
16/02/15 01:25:22.95 FDnCcdJi.net
メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
ちゃんぽんしたかったら一考しないといけない。
301:デフォルトの名無しさん
16/02/15 12:13:19.05 8Os0TVn8.net
>>298
今まで一度も使ったことないし使われてるところを見たこともない
302:デフォルトの名無しさん
16/02/15 21:40:19.82 geRYYYJt.net
>>298
その章は飛ばして先に進みましょう
303:デフォルトの名無しさん
16/02/16 08:52:37.81 ZqCrYcMA.net
必要になった時に学べばいいと思う
304:デフォルトの名無しさん
16/02/16 15:52:46.94 TrNqH2Y5.net
>>301
なんだそれw オワコン・・・・・・?
検索したけど情報量少ないのが困るなぁ
>>302
わかった!ありがと!
>>303
必要になるのがどういう状況下がわからん(´;ω;`)ブワッ
305:デフォルトの名無しさん
16/02/16 18:14:53.19 14idcRCK.net
>>304
テンプレートと組み合わせてイベントハンドラの格納に使える。
もっともC++11以降は std::function があるからそれを使うべき。
306:デフォルトの名無しさん
16/02/16 19:40:50.31 fomhurQ7.net
こんなの必要性以前の問題だろwww
メンバポインタって何だっけ?
307:デフォルトの名無しさん
16/02/16 19:54:01.02 SmCEknBn.net
クラス内で宣言した配列に外で宣言した配列の中身を突っ込むことってできますか
308:デフォルトの名無しさん
16/02/16 23:50:18.80 bGf55uSQ.net
>300にはっきりと答えが書かれてるのに、何故そっちはスルーしたんだ…
309:デフォルトの名無しさん
16/02/17 07:44:04.68 bjhQnNdd.net
>>308
すまぬ、別の人に対して発言したとおもた
>>300
>メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
何でそうなるのかわかりません(´;ω;`)ブワッ
まずはそこからです((((((((( (´・ω・`)へ
310:デフォルトの名無しさん
16/02/17 08:50:55.26 4zW8fTVw.net
>>309
自クラスの他関数を呼び出す時にthis->func()って呼べるやろ?
自クラス内でthisを暗黙に取ってないとthisは使えない
自クラス内でもstatic関数はthisを取らない
311:デフォルトの名無しさん
16/02/17 12:36:46.43 ofvCQlRl.net
>>309
f(a, b, c);
って書いたとする。普通の関数はCの機能なので、超大雑把に言うと
コンパイル時にアドレスが分かっている関数のアドレスへgotoする機能と、スタックにaとbとcを積む機能、
そして関数から戻った後に実行される命令のアドレスをスタックに積む機能
の組み合わせとして表現されてる。
関数ポインタもCの機能で、固定のアドレスにgotoするか変数に格納されてるアドレスにgotoするかが違う。
で、クラスのメンバ関数呼び出しはCから見たらC++による拡張が入ってて、
o->f(a, b, c);
って書いたとすると、超大雑把に言えば
aとbとcの他にoもスタックに積んでfを呼び出すようになってる。
これが「暗黙にthisを引数に取る」って事の意味。C風に書くと、f(o, a, b, c);みたいに、暗黙のthisであるoを引数に取ってる。
だからCの機能である「普通の関数ポインタ」では扱えない。