dupchecked22222../cacpdo0/2chb/034/85/tech144868503421762290710 スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net ◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1448685034/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1 :デフォルトの名無しさん:2015/11/28(土) 13:30:34.09 ID:S1e+2GUN
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/
22 http://peace.2ch.net/test/read.cgi/tech/1399911167/
23 http://peace.2ch.net/test/read.cgi/tech/1420379468/

2 :デフォルトの名無しさん:2015/11/28(土) 13:42:54.23 ID:S1e+2GUN
誰か書いてー
即死する

3 :デフォルトの名無しさん:2015/11/28(土) 13:58:59.04 ID:u5grs2xF
1乙

4 :デフォルトの名無しさん:2015/11/28(土) 20:31:40.61 ID:JroX99O/
ものすごい下らないことですが質問です。
こんな感じのクラスがあって
class A {
public:
&nbsp;&nbsp;std::unique_ptr<int[]> xxx = nullptr;
private:
&nbsp;&nbsp;void reset_xxx(size_t n) /* noexcept */ // <- このコメントを外したい
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;xxx.reset(new(std::nothrow) int[n]);
&nbsp;&nbsp;/* new が失敗したときはここでどうにかする */
&nbsp;&nbsp;}
};
(1)
reset_xxx に noexcept 指定子をつけたいのですが、
int のような基本型、あるいはその配列に対する delete は
例外を投げないことが保証されているんでしょうか。
あるいは POD ではどうでしょうか。
POD でなくても、デフォルト定義のデストラクタを持っているなら?
(2)
上記のクラスで xxx を読み取り専用として扱うとき、
std::unique_ptr<int[]> xxx = nullptr;
の代わりに
std::unique_ptr<const int[]> xxx = nullptr;
とした方がいいでしょうか。
宗教上の問題になるのでしょうか。

5 :デフォルトの名無しさん:2015/11/28(土) 20:36:01.12 ID:JroX99O/
わあ、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 :デフォルトの名無しさん:2015/11/29(日) 20:15:17.63 ID:+8PPW4GA
>>4
(1)については、
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf
の、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 :2015/11/29(日) 20:30:03.53 ID:RQ97x6ZU
「FM音源をあやつって正しく音を出したい」
OpenAL+ALUTと、ciscさんのFM音源エミュレータ
「FM Sound Generator」を使って、正しく音を出したい。

https://github.com/katahiromz/fmgengen2/blob/master/sample.cpp
https://github.com/katahiromz/fmgengen2

おかしな音が出ます。たぶんFM音源の使い方が間違っています。
修正方法を教えて下さい。ドレミの音が出るようにして下さい。よろしくお願いします。

8 :デフォルトの名無しさん:2015/11/30(月) 13:51:44.68 ID:VtHFUkMk
unsigned short同士の掛け算がunsigned int ではなくてintに昇格するのはどうしてですか?

9 :デフォルトの名無しさん:2015/11/30(月) 20:19:20.81 ID:luHPgjr1
unsigned shortが int に拡張されるからでは

10 :デフォルトの名無しさん:2015/11/30(月) 21:26:57.04 ID:VtHFUkMk
その仕組みはわかるんですけど、そこでどうしてunsigned intではなくてintでなければならないのかがわかってません。
short 2バイト int 4バイトだとして 65535 * 65535 の結果はINT_MAXより大きいですが、unsigned intの範囲で安全に表現できますよね。
どうして不確からしさが増すような方向への変換がデフォになってるのかという疑問もあります。

11 :デフォルトの名無しさん:2015/11/30(月) 21:42:20.20 ID:jWn5VC7w
unsigned short × unsigned short がどうこうではなく
計算時に unsigned short が int に拡張されるってだけでしょ
拡張された状態で乗算するから結果もintになるって

12 :デフォルトの名無しさん:2015/11/30(月) 22:19:42.99 ID:VtHFUkMk
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:2015/11/30(月) 22:38:13.05 ID:Dn8P3OaQ
>> 6
ありがとうございます。
(2) については仰るとおりで、まさにそれがやりたいことだったので、
const はつけておくことにします。

(1) については…… なんていうか、ちょっと聞きたいことと違っていました。
> 例外投げるデストラクタの存在は無視して良いと思う
というのは
「どうせ例外が発生したときの挙動が undefined なんだから、
 コンパイラが速いコードを生成するよう noexcept はつけててもいい」
ということだと理解したのですが、ぼくが noexcept で表現したいのは
「この関数はいつ呼ばれても(特に関数失敗時にも)意味のある値を返す」
ということなんです(これって変な考えなんでしょうか)。
なので xxx.reset が例外を投げうるなら noexcept は外したいです。
むしろ未定義動作をする可能性がある関数である、ということを強調して
コメントにでも書いておきたいくらいです。

とはいえ常識的に考えて、ヒープが壊れていない限り int[] の delete[] が失敗することは
ないですよね……。うーん。

14 :片山博文MZ ◆T6xkBnTXz7B0 :2015/11/30(月) 23:17:12.67 ID:UQmO47jh
>>7
他力を借りて解決しました。
http://katahiromz.bbs.fc2.com/reply/10466094/34/

15 :デフォルトの名無しさん:2015/11/30(月) 23:56:14.64 ID:qSWjFIuy
>>12
じゃあさ、unsigned long * unsigned long はどうすればいいと思う?

16 :デフォルトの名無しさん:2015/12/01(火) 09:09:35.39 ID:vya/mPuO
>>12
unsignedにキャストする処理まで入れてないだけだろ
一般的には整数演算器の入出力はsigned int
intが何ビットかはCPUコアに依存する

17 :デフォルトの名無しさん:2015/12/01(火) 11:46:59.87 ID:E/WRWJc0
前スレの>14で
「プログラムが終了する際にmallocした領域をイチイチfreeする奴は馬鹿だ、という情報工学の先生がいたなー
こんなセンセーに教育された学生はうちの会社にはいらないw 」
とあるんですが、これはその先生が間違っているということですか?
そうであるなら理由を教えてくれますか?

18 :デフォルトの名無しさん:2015/12/01(火) 13:21:42.49 ID:YGJMPkGb
>>12
そういう仕様としか言いようがないが‥
K&Rでは符号が保存され、あなたが期待するunsigned intで計算される仕様になっている
ANSI Cはintで表現できるならintになる仕様になっている
エキスパートCプログラミングによると、ANSIの方は値を保存するという考えらしい

19 :デフォルトの名無しさん:2015/12/01(火) 14:34:40.17 ID:wfTLHpyu
>>17
ある意味では間違っていて、ある意味では正しい。

・mallocされたメモリがプログラム終了時にきちんと開放されるかどうかはOS依存(Cの仕様上は開放されない事になってる)
・非常に長く動くプログラムの場合、mallocしたものは必要に応じて開放しなければいつかメモリが足りなくなる
・mallocされたメモリをプログラム終了時までにfreeしない方がいいとはCの仕様書には書かれていない
・人を馬鹿にしてる
という意味では常に先生が間違っている。

・mallocされたメモリはプログラム終了時までに絶対にfreeしなければならないとはCの仕様書には書かれていない
・malloc/freeの実装によっては、malloc/freeする順序によっては非常に重くなり、プログラム終了時にOSが回収したほうが速くなることがあり得る
という意味では先生は正しい。

20 :デフォルトの名無しさん:2015/12/01(火) 18:30:22.99 ID:4XFiGbBF
>>17
その話しの流れが読めないので想像ですが。

mallocした領域をfreeせずにプログラムを終了させた場合、その領域がどうなるかはC言語の仕様では規定されていないと思います。
言い換えれば環境(処理系やOS)に依存した挙動になるでしょう。
「freeする奴=バカ」と教え込まれた学生が会社に入り、環境ごとの挙動を調べることなく盲目的に「終了時のfreeは不要」を信じてコーディングしたら‥
アカデミックな世界ではいざしらず、実務の世界では、裏付けもない思い込みでプログラムを組まれては、たまったものではありません。

おそらくそういう事が言いたかったのではないでしょうか?
#というか情工の先生で軽々しくそんな事を言う人はいないと思いますので、おそらく「ネタ」じゃないですかね。

21 :デフォルトの名無しさん:2015/12/01(火) 21:54:03.31 ID:lP+cizb6
>>20
規定されてる。規格書よんでから出直しなさい。

22 :デフォルトの名無しさん:2015/12/02(水) 17:40:34.22 ID:Cj5Jy42r
INT_PTRが良く分かりません。単なるint型と考えていいのでしょうか?
わざわざPTRという名前が付いているのは、ポインタのサイズと同様にそのサイズが環境に一致することを示すため??

23 :デフォルトの名無しさん:2015/12/02(水) 17:51:28.60 ID:SG5bn8pD
>>22
単なるint型は整数型で、整数が入る
INT_PTR型はポインタ型に等しい幅を持つ整数型で、ポインタ型をどうしても整数型にキャストしたい時に使うらしい。

以下引用

ポインタは int、LONG、ULONG、DWORD のいずれの型にもキャストしないでください。
ビットのテスト、ビットの設定とクリア、またはポインタの内容の操作のためにポインタを
キャストする必要がある場合は、UINT_PTR 型または INT_PTR 型を使用します。
これらの型は、32 ビット版の Windows と 64 ビット版の Windows の両方のポインタに合わせて
サイズが変更される整数型です (たとえば、32 ビット版の Windows の場合は ULONG 型、
64 ビット版の Windows の場合は _int64 型に変更されます)。
https://msdn.microsoft.com/ja-jp/library/aa384242.aspx

24 :デフォルトの名無しさん:2015/12/02(水) 18:07:06.08 ID:tKolsFeX
>>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 :デフォルトの名無しさん:2015/12/02(水) 18:33:27.47 ID:Cj5Jy42r
丁寧なご回答ありがとうございます。

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:2015/12/02(水) 18:47:49.06 ID:tKolsFeX
>>25
ポインタを含む任意の値を返すためだと思う。
DialogBox の戻り値は EndDialog の戻り値なわけだけど、
たとえば生成したダイアログ側から構造体を返したいとき、
戻り値が INT_PTR なら malloc とかで取ってきたアドレスをそのまま返せる。

> 32bit環境で32bit長、64bit環境で64bit長
大事なのは >>23 で言われてる通り「ポインタ型に等しい幅を持つ整数型」ということ。
いま自分が使っているシステムが主に 32/64-bit だからといって、
過去もずっとそうだったわけじゃないし将来ずっとこのままなわけでもない。
じゃあそのとき DialogBox の戻り値は何になって欲しいか、と言われれば、
「せめてポインタが格納できるサイズの型」ということになる。
それならどんな値でも返せるから。

27 :デフォルトの名無しさん:2015/12/02(水) 19:15:43.22 ID:Cj5Jy42r
>>26
な〜るほど、アドレスを返すこともあると考えれば、INT_PTRを使う事は無理矢理なことではなく、妥当なことに感じますね。
32bit時代にintで受けてたのが多少無理矢理だったとも言えるのかな。4バイトを受けられれば何でも良かったんでしょうけど。

# いっそ「PTR型」とか「SYS型」とかにして使う側でキャストするようにした方が誤解が無いんじゃないかと思ったり
# WinAPIでは昔から色々な型を使ってて覚えるのが面倒臭かったですね

28 :デフォルトの名無しさん:2015/12/05(土) 12:09:57.14 ID:XDnkwO5X
関数を作るとき、引数にポインタを渡すことで実質的な返り値にできるテクニックって普通に返り値を返すのとどう使い分けれるべきなんですか?
コードの可読性が下がる代わりに複数出力に対応できるっていう認識なんですが、わかりやすさとか保守性(人間の都合)以外に推奨される理由とかやめた方がいい理由はありますか?

int power(int a){return a*a;}

void power(int ain, int* aout){*aout=ain*ain;}
みたいなやつです

29 : ◆tAo.kQ2STk :2015/12/05(土) 16:27:33.05 ID:3X0n/q/1
>>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 :デフォルトの名無しさん:2015/12/05(土) 16:41:03.46 ID:WsL2Ug/J
>>28
計算結果を引数で受け取り、処理結果を戻り値で返す。

良くあるパターン。

31 :デフォルトの名無しさん:2015/12/05(土) 17:29:21.92 ID:KdBqlpoa
>>28
なんらかの制約があり仕方なく使わざるをえない場合のみ泣く泣く使うものであり推奨している個人や団体は存在しない

32 :デフォルトの名無しさん:2015/12/05(土) 17:44:53.67 ID:4CEShJeO
禁止する規約も見たことないけどな。
どちらがいい悪いじゃなくて、単一の戻り値を返す関数として書けない場合に
普通に使えばいいだろう。

33 :デフォルトの名無しさん:2015/12/05(土) 17:58:29.63 ID:KdBqlpoa
ひとつの戻り値に出来ない時点でおかしな事が起こってるか起こりつつある
複数の同じ型の返り値ならば本来そこで必要なものはコレクションだ
異なる型の複数の戻り値ならば本来そこで必要なのはそれを包含する別の型だ
必要な型が定義されていないという設計ミスの兆候から目を背けてはいけない
手抜きのタプルや参照渡しに逃げてはいけない

34 :デフォルトの名無しさん:2015/12/05(土) 18:44:26.87 ID:4CEShJeO
なんか変なこと言い出したぞ。
>>33個人の主張以外に一般に認められた規約/ガイドラインってあるかねぇ?

35 :デフォルトの名無しさん:2015/12/05(土) 18:47:22.55 ID:22zPQN1u
>>33
> 異なる型の複数の戻り値ならば本来そこで必要なのはそれを包含する別の型だ
> 手抜きのタプル
「それを包含する別の型」がタプルなんじゃないの

ていうか、個人的に問題になるのはエラー処理に関することが多い
long long int を返す関数で「失敗」を表すにはどうしたらいいのか、とか
で結局、戻り値(にしたかったもの)は引数で、エラーが起きたかどうかは戻り値で
返すことが多い
別に俺だけじゃなく、ぱっと思いつくとこだと zlib の compress なんかもそうだよね
deflate の結果は引数で返して、成功/失敗を戻り値で返す
snappy だと例外を投げるんだっけ

36 :デフォルトの名無しさん:2015/12/05(土) 20:59:15.88 ID:wHZuCpe8
返り値は全部ブールにして、値取得は引数で行うのをよく見るけど
これって普通なん?

37 :デフォルトの名無しさん:2015/12/05(土) 22:41:31.43 ID:3X0n/q/1
>>36
if文を使って成功したかどうか判定するんだから、そういう風に作ることも出来る。

構造体へのポインタを返すのでも同じ事が出来るけど。
if (auto p = foo()) {
printf("%d\n", p->value);
}
とか
auto p = foo();
if(!succeed(p)) {
return;
}
とか。

38 :デフォルトの名無しさん:2015/12/06(日) 03:26:24.33 ID:+ZBuFdaM
その構造体のメモリはいったいどこから…
スマートポインタとか使ってメモリがつがつ消費するのがイマドキの書き方なのかな

>>36
わりと普通。下手に「-1は失敗」とかやるよりシンプルで分かりやすい

39 :デフォルトの名無しさん:2015/12/06(日) 08:50:47.90 ID:cIZcNmeU
イマドキかどうかはともかく、
「スマートポインタを使う = メモリがつがつ消費する」
っていう >>38 の理解(そう読める)はどうなの

40 :デフォルトの名無しさん:2015/12/06(日) 13:45:34.39 ID:+ZBuFdaM
>>37みたいな使い方=メモリがつがつ消費する」ね
がつがつってのは容量的に沢山使うって話じゃなくて
無秩序にとか気軽にとか… うまい言葉が見つからないけど

41 :デフォルトの名無しさん:2015/12/06(日) 16:31:37.89 ID:iigA/d+A
boolにキャスト出来る構造体をifで受け取るのならどう?

42 :デフォルトの名無しさん:2015/12/06(日) 16:35:41.53 ID:4bjdt2kC
普通に構造体を返せばよいだけなのに,なぜそんなに凝ったことを推奨するのか?

43 :デフォルトの名無しさん:2015/12/06(日) 16:42:02.54 ID:w0JG1OnY
>>36
たまに見るね。Windowsの関数にそういうのが多い気がする。
fopenとfopen_sとか。
返り値の値域がint全体で、かつ、成功失敗を返す場合は
そういうのもありだと思う

44 :デフォルトの名無しさん:2015/12/06(日) 18:39:35.29 ID:Z7509Thm
>>28
戻り値がint型だからint型で受け取るのが良いけど
他の型で受け取れない(暗黙的な型変換)ってのがあるかな

あとその関数で言えば、数式の一部として利用できない
前者なら power(a)+b*2 のような式も書けるけど後者だと一回結果を受け取らないといけないよね
sqrtなんかもそう

45 :28:2015/12/07(月) 18:34:12.80 ID:PDqN2Ufp
ありがとうございます
色々使い方があるんですねm(_ _)m

46 :デフォルトの名無しさん:2015/12/08(火) 20:22:24.50 ID:BztczKM1
ヘッダ周りで混乱しています。ご教授おねがいします。
下のプログラムをそれぞれ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 :デフォルトの名無しさん:2015/12/08(火) 20:23:21.01 ID:BztczKM1
私が今書いているのが下のものです。
// 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 :デフォルトの名無しさん:2015/12/08(火) 21:33:55.11 ID:y1mdlUK+
以下のコードについて、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 :デフォルトの名無しさん:2015/12/08(火) 22:29:07.89 ID:2NgjJ1M0
>>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:2015/12/08(火) 23:52:34.51 ID:BztczKM1
>>49
ありがとうございます。

B.hではAクラスのメンバ情報が必要なのでA.hをインクルードして、
A.hではBクラスがあることが確認さえできればよいのでBクラスを前方宣言すればよいということですね。

A.hに定義を描いたのはファイルが少ない方が問題が簡単になるかと思ったからですが、
B.hをインクルードする必要がでてくるので返ってめんどうなんですね。

重ねて質問させていただきたいのですがこれが循環参照というものですか?
またA.hに定義を書いた場合エラーを回避する書き方はあるのでしょうか?

51 :デフォルトの名無しさん:2015/12/09(水) 00:26:24.16 ID:DdKTu+9h
>>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 :デフォルトの名無しさん:2015/12/09(水) 00:33:31.76 ID:DdKTu+9h
余計なお世話かもしれないが、
「これがやりたいから無理やりな回避するコードを書く」ってのは本末転倒なんじゃないかと思う
まあどうしようもないときってのもあるけど、自分ならクラス設計から見直すようにするけどね

53 :47:2015/12/09(水) 01:14:48.16 ID:MWRH+1zr
言い方が良くなかったようですみません。
私自身はファイル数も面倒も気にせずオーソドックスなコードをかきたいとおもっています。
ただ問題を考える際まず簡単なものから理解して複雑にしていくのがいいと思っています。
なのでここには私が考える最もシンプルなコードを書きました。
しかしその結果、私が考えた単純化(ファイル数を減らす)が逆に問題を複雑にしてしまっていた。ということに気づきましたという意味の発言でした。

最後の質問は単純な好奇心です。私はそのコードをいじってどうにかコンパイル通そうとしていたので、正解があるなら一応聞いておきたいなと。実用性のないコードをかかせてしまっせすみません。

> 依存関係にあるクラスなら無理して分けないほうが良いのでは?
今はじめてオブジェクト志向を取り入れて簡単なゲームを作っているのですが、どのようにクラスを割り振るのかまとめるのかということで四苦八苦しています。
今は基本に忠実に1つのクラスに1つのソースとヘッダで書いていますが、少し慣れたらまとめてみようと思います。

54 :デフォルトの名無しさん:2015/12/10(木) 23:47:39.86 ID:c+cFQUeV
ポインタについて教えてください

*hoge++ = 1;

こういう文があった場合、hogeに当初から入っているアドレスの次のアドレスに1を代入することになると思います
その場合、hogeに代入されているアドレス自体もプラス1されるのがふつうだと思いますが、環境によりプラス1されないこともあるのでしょうか?
よろしくお願いします

55 :デフォルトの名無しさん:2015/12/11(金) 00:15:27.78 ID:PPg536oa
当初入ってるアドレス先に1を代入して(=1)
それからアドレスをひとつ先に進める(++)んじゃないかな

環境に左右されないはずだけど、できれば
*hoge=1;
++hoge;
と二行に分けるのをオススメする

56 :デフォルトの名無しさん:2015/12/11(金) 06:47:49.34 ID:I09VPDH/
とりあえず括弧で優先順位つけろ

57 :デフォルトの名無しさん:2015/12/11(金) 06:57:19.50 ID:kB8+oJGq
括弧で解決するのかねえ。環境依存の要素はないし、極めて初歩の範疇だから
まずは入門書でも読んで入門した方がいい

58 :デフォルトの名無しさん:2015/12/11(金) 07:39:35.01 ID:EXbBnOrE
悩むような記述はしない
駆け出しに限ってトリッキーな記述を好む

59 :デフォルトの名無しさん:2015/12/11(金) 07:41:53.19 ID:0YKyOHUo
括弧といえば、三項演算子の優先順位がどうしても覚えられない
a - b ? c + d : e | f
みたいなの

60 :デフォルトの名無しさん:2015/12/11(金) 08:17:58.93 ID:MBFQhILY
ゲーム作ってるんですがダメージ計算式とかで稀に0除算が発生します
((a-b)*c)/((d*2)-e+f) のようにいくつかの変数が式に入っているので
計算の結果、割る値が0になっている場合がある といった具合です

0で割った場合は0になるようにしたいのですが、どうすればよいのでしょうか?
割る前にifで分岐するように書きなおすのは、面倒なので避けたいのですが…

61 :デフォルトの名無しさん:2015/12/11(金) 08:43:00.31 ID:gzGUt3Ym
チェックしろよ

62 :デフォルトの名無しさん:2015/12/11(金) 09:11:56.83 ID:cNzjvsZV
同じくチェックしろよとしか。
あとはまあ、適当な関数でも作るとか……?

63 :デフォルトの名無しさん:2015/12/11(金) 09:17:17.43 ID:h2+cx4oS
そういう演算規則の数値型のラッパーを作る
そして変数定義だけ書き直す

64 :デフォルトの名無しさん:2015/12/11(金) 09:17:45.85 ID:OYS2Ht5V
例外捕まえればチェックしないでも済む

65 :デフォルトの名無しさん:2015/12/11(金) 10:32:19.08 ID:MQP/fuYv
今回の要件では、除数が0なら結果も0と言うことだから例外ではフォロー仕切れんよ。
c++ならクラス作って割り算をオーバーロードかな。

66 :デフォルトの名無しさん:2015/12/11(金) 11:56:25.95 ID:OYS2Ht5V
例外処理ってC++の使えないアレだけじゃないんだよ

67 :デフォルトの名無しさん:2015/12/11(金) 13:14:14.85 ID:I09VPDH/
( ( ((d*2)-e+f) != 0 ) ? ( ((a-b)*c)/((d*2)-e+f) ) : (0) )
ってことか

68 :デフォルトの名無しさん:2015/12/11(金) 21:32:26.31 ID:OYS2Ht5V
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 :デフォルトの名無しさん:2015/12/12(土) 01:59:06.36 ID:Gz2IfgKr
素直に関数作ったらいいと思う

70 :デフォルトの名無しさん:2015/12/12(土) 05:59:21.93 ID:iSM6mGzV
書き直せなくなるまでゼロ除算を放置するなんて

71 :デフォルトの名無しさん:2015/12/12(土) 06:49:37.09 ID:zzgKuIEv
ゲームなので現実的にはありえない計算式なんだろ
0割で0にするというのも謎だけど、ゲームだからありなのかと思った

72 :デフォルトの名無しさん:2015/12/12(土) 08:22:05.54 ID:JwLrAiSP
分母に着目するんじゃなくて
そこに到達するまでのd, e, fのどれかにバグがあるって考えた方がいい

73 :デフォルトの名無しさん:2015/12/12(土) 11:18:45.83 ID:ZIa921ni
符号つきint同士の除算で、結果を常に負の∞に向かって丸めるにはどのようにすればいいでしょうか?
ただし、除数は常に0より大きい数です。

74 :デフォルトの名無しさん:2015/12/12(土) 11:53:16.77 ID:jiiw3kKP
「負の∞に向かって丸める」の意味がわからない

75 :73:2015/12/12(土) 12:05:54.12 ID:ZIa921ni
英語だと round toward minus infinity というところですか。
int同士の演算で丸めるというのが意味をなしていないのかもしれませんが、
結局は(実数としての)除算の結果を整数として得るのに−∞に近づくように、ということです。

76 :デフォルトの名無しさん:2015/12/12(土) 12:34:22.99 ID:l51bqpmT
計算結果が-3.1415となったら-4を得たいということ?floor関数だね

77 :デフォルトの名無しさん:2015/12/12(土) 14:27:51.11 ID:zzgKuIEv
被除数が負の場合、除数-1を引いてから割る

78 :デフォルトの名無しさん:2015/12/12(土) 16:35:31.33 ID:vifUVQ0p
浮動小数なら >>76
整数なら >>77
ちなみに >>77 の方法は「除数-1を*足して*から割る」とすると ceil 相当の動作になる

79 :デフォルトの名無しさん:2015/12/12(土) 16:41:35.71 ID:V2dsH5Kn
>>77
正整数同士の除算で端数は切り上げ、の応用技だね。
Nビットの情報を格納するのに必要なバイト数を求めるとき
ビット数に7を足してから8で割る感じ。
bytes = (bits + 7) / 8;


ところで、整数の除算で片方が負数の場合の結果は
「処理系定義」だって望洋さんのサイトに載ってる。

>>73 で除数は常に0より大きいと限定されてるから
被除数についての場合分け処理が必要になるかと。

80 :デフォルトの名無しさん:2015/12/12(土) 17:57:48.30 ID:vifUVQ0p
C って剰余の絶対値が最小になるように除算が決められてなかったっけ
それとも % 演算がそうなってるだけ?

81 :73:2015/12/12(土) 18:45:47.78 ID:ZIa921ni
ある程度試したところ>>77のやり方でうまくいきました。
動く仕組みも>>79でだいたい掴めました。
ふたりともありがとうございます。

82 :デフォルトの名無しさん:2015/12/12(土) 20:40:06.73 ID:zzgKuIEv
>>79
ウソを言わないように
少なくともc99以降は整数除算は「小数部は捨て」(すなわち0方向に丸め)と定義されている

83 :デフォルトの名無しさん:2015/12/12(土) 23:43:11.86 ID:DGmFor2Z
0除算に躓いていた若き日の僕に
手を差し伸べてくれたのは atan2(y,x) でした

84 :デフォルトの名無しさん:2015/12/13(日) 06:18:20.87 ID:dcJkyxKW
floor使えよ分かりやすいから

85 :デフォルトの名無しさん:2015/12/13(日) 06:18:49.92 ID:rQ+2OB8E
>>82
CでしかもC99以降なら、と処理系を限定すればその通り。

86 :デフォルトの名無しさん:2015/12/13(日) 07:36:52.20 ID:OeYxj6fv
>>85
限定しないならば、全ての処理系に対してって事だが。

87 :デフォルトの名無しさん:2015/12/13(日) 15:59:00.30 ID:NwtL3kT4
被除数が正ゼロ負に場合わけして処理するか、キャストして除算結果をfloorへ任せるか‥ まぁわかりやすさは人それぞれか

88 :デフォルトの名無しさん:2015/12/13(日) 17:57:12.22 ID:OeYxj6fv
負/非負だけで良い
(a - (b -1) * (a < 0)) / b
ゆとりはわかりにくいとか言い出すんだろうな。

89 :デフォルトの名無しさん:2015/12/13(日) 18:02:00.99 ID:4rlmjVEI
わかりにくいとまでは言わんが、if(a<0)で先に分岐したほうがすっきりしそう

90 :デフォルトの名無しさん:2015/12/13(日) 21:30:18.22 ID:H46hk94U
まあ、組み込みでもない限りは趣味の世界だな

91 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 08:55:06.71 ID:7JmIVcUI
#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 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 08:55:32.42 ID:7JmIVcUI
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 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 08:56:17.31 ID:7JmIVcUI
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 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 15:16:58.67 ID:lAggCEHS
>>91-93
見た感じ何かの課題っぽいね。
丸々教えちゃうのはタメにならないのでヒント。

一時文字列swap[]の生成部分を見直せ。

95 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 15:42:18.02 ID:DSJzQQ/E
>>93
k 初期化
scanfで文字列を格納しようとしないで

96 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 18:11:28.67 ID:1oZypuq3
>>94
>>95
出来ました
有難うございました
出来ると嬉しいですね

97 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 18:30:13.04 ID:1oZypuq3
それと後学の為に聞いておきたいのですが
scanfで文字列取得してはダメなんですか?
getsで取得したほうが良いのでしょうか?

98 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 18:38:14.34 ID:XU/HPkeH
どっちも使わないが正解かな
実用的なプログラムではxmlなど特定の形式のファイルを読み込むことが殆ど
そしてこういう形式のファイルは専用のライブラリがあるから標準の関数は使わない

99 :名無しさん@そうだ選挙に行こう:2015/12/14(月) 19:20:19.55 ID:lAggCEHS
>>97
例題の場合だと、文字列の入力時に11文字(12文字ではない)以上を
入力すると誤動作する。

gets()では事前に用意したバッファ容量以上の入力を拒絶できない。

scanf()なら対処可能だが割と面倒くさい。
詳しくは scanf のWikipediaに載ってる。

100 :99:2015/12/14(月) 19:46:15.05 ID:lAggCEHS
おおっと、「11文字以上」は間違い。
「11文字を超える」と書くべきだった。

例題の場合だと、文字列の入力時に11文字(12文字ではない)を超える
文字列を入力すると誤動作する。

101 :デフォルトの名無しさん:2015/12/14(月) 22:17:16.18 ID:1oZypuq3
>>98
>>99
有難うございます
頭の片隅に置いておくことにします

102 :デフォルトの名無しさん:2015/12/15(火) 09:10:21.26 ID:DA+Z5plh
片隅じゃなくてど真ん中に置いとけよ。

103 :デフォルトの名無しさん:2015/12/15(火) 11:55:24.33 ID:UvxPNinR
通る時に邪魔になるだろ!

104 :デフォルトの名無しさん:2015/12/15(火) 14:36:30.17 ID:DA+Z5plh
どうせすかすかなんだから避けろよ。

105 :デフォルトの名無しさん:2015/12/15(火) 16:29:51.89 ID:lFa4wSQM
>>97
scanf だけとか gets でとかじゃなく fgets でバッファサイズ指定して読み込む
fgetsで読み込んだ文字列をsscanfで変数に入れる

106 :デフォルトの名無しさん:2015/12/15(火) 17:51:53.83 ID:UvxPNinR
>>104
スカスカなのはおまえの頭髪だろ!

107 :デフォルトの名無しさん:2015/12/15(火) 18:46:08.88 ID:Bz6rHJHH
俺の胸毛はフサフサなのだがな…

108 :デフォルトの名無しさん:2015/12/16(水) 18:34:29.10 ID:G/o4ughm
頭髪と胸毛は影響するホルモンが違うからな。頭スカスカ、胸毛フサフサは矛盾しない。

109 :デフォルトの名無しさん:2015/12/16(水) 21:53:42.14 ID:6hxUKU2I
ままならないものだね

110 :デフォルトの名無しさん:2015/12/16(水) 22:14:06.50 ID:x+xpyG6u
ハゲで胸毛ワサワサならママにはなれないよ

111 :デフォルトの名無しさん:2015/12/17(木) 09:22:36.25 ID:X1S+T1Jv
寧ろ、ママなら無いものかと。

112 :デフォルトの名無しさん:2015/12/17(木) 21:01:38.15 ID:mBjgQHIg
C++で
<vector>をインクルードしてpush_backで配列作っていくのと、
int* array = new int[];
と(動的確保?)して作るのとでは

どういった違いがありますか?
また、どちらを使うのが一般的なんでしょうか?

初心者なので的を射ていなかったらごめんなさい。

113 :デフォルトの名無しさん:2015/12/18(金) 00:29:50.73 ID:jlCbbYEY
Vectorの方が安全に扱える(扱いが楽)からvector使った方がいいだろうね
毎回newで動的確保するコードは管理が面倒すぎて何処かで失敗してバグの温床になるからやめた方がいいかと

114 :片山博文MZ ◆T6xkBnTXz7B0 :2015/12/18(金) 00:41:50.83 ID:+gf7B4uf
ちゃんとマニュアルを読めよ。push_backだけじゃねーよ。

115 :デフォルトの名無しさん:2015/12/18(金) 01:01:28.67 ID:qAlk3MOP
Cはまだしも、C++は入門書のように手動でdeleteするようなコードは書くべきじゃない
入門書は何が出来るかを一通り書いてくれていると思うが、C++で重要なのは何をしてはいけないのかを知ること
そのためには沢山のコードを書き、沢山の専門書を読んで覚えるしかない

116 :デフォルトの名無しさん:2015/12/18(金) 01:33:14.12 ID:+PE9kEMX
ありがとうございます。vector使っていく事にします

117 :uy ◆Qawu9.2l1E :2015/12/18(金) 02:42:48.54 ID:ebb2J7fc
C++やってる奴いるw?

118 :デフォルトの名無しさん:2015/12/18(金) 03:49:05.07 ID:bQYD5Sab
ただ、vectorは、末尾の要素の追加・削除は、計算量O(1)だけど、
要素の中ほどに追加すると、
それ以降の要素が1つずつずれるから、O(n)になる

Doubly Linked Listなら、そういうときにO(1)。
ただ、これは基本、1つずつ要素をたぐっていく、
シーケンシャルアクセスだから、要素の取得はO(n)

vectorの要素の取得は、数値インデックスで、
O(1)のランダムアクセスができる

119 :デフォルトの名無しさん:2015/12/18(金) 08:41:19.30 ID:zXgpR+Un
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 :2015/12/18(金) 09:14:56.52 ID:+gf7B4uf
>>119
戻り値を参照に

121 : ◆tAo.kQ2STk :2015/12/18(金) 11:40:52.38 ID:znmCm21O
>>119
- A operator<<(char* Str) {
+ A& operator<<(char* Str) {

>>120
それで分かるのは分かってる人だけなような。
# とか言いつつ俺も俺で分かる人には分かるようなフォーマットで回答するという

122 :デフォルトの名無しさん:2015/12/18(金) 13:01:02.33 ID:zXgpR+Un
できました!
ありがとうございます

123 :デフォルトの名無しさん:2015/12/18(金) 18:51:52.24 ID:OysfGD3G
C++の最速の行列計算ライブラリってなんだろ
密エルミート行列の対角化がしたいんだけど

124 :デフォルトの名無しさん:2015/12/18(金) 23:29:26.92 ID:CNI5JGVG
プログラマはMacを使ってるってマジ?
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043/

125 :デフォルトの名無しさん:2015/12/19(土) 09:39:20.71 ID:n5v6Wxrv
別のスレに間違えて投稿してしまったものを、こちらで再度質問させていただきます。
以下のコードをコンパイルしようとすると、コンパイルエラー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 :デフォルトの名無しさん:2015/12/19(土) 11:37:45.72 ID:HOXV9eUU
サイズが悪い

127 :デフォルトの名無しさん:2015/12/19(土) 12:12:28.14 ID:n5v6Wxrv
サイズが悪いというのはこの場合、具体的には4MBはよくて5MBは悪いということですよね。
つまり4MBと5MBの間のどこかにサイズの限界があるということなんでしょうか。

128 :デフォルトの名無しさん:2015/12/19(土) 12:23:26.61 ID:HOXV9eUU
環境によって異なる

129 :デフォルトの名無しさん:2015/12/19(土) 14:52:24.69 ID:a2/93t/h
>>125
コンパイラは?

130 :デフォルトの名無しさん:2015/12/19(土) 16:52:03.86 ID:mZAnd63z
そのヒープは「コンパイラのヒープ」だからね。
念のため。

131 :デフォルトの名無しさん:2015/12/19(土) 20:54:06.17 ID:n5v6Wxrv
コンパイラはVS2015のCommunityエディションUpdate1で、コンパイル時に
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
と出るものです。

最初のスレでレスをいただいたのですが、どうもnewのところに波括弧でなく丸括弧を使うといいようです。
お騒がせしました。

132 :デフォルトの名無しさん:2015/12/19(土) 21:59:13.97 ID:+2RpuZ8k
そこに複文を入れようとしたわけですね

133 :デフォルトの名無しさん:2015/12/19(土) 22:17:03.51 ID:EjHtX5K0
>>132
C++の文法理解してない初心者は黙ってようね。

134 : ◆QZaw55cn4c :2015/12/19(土) 22:33:13.76 ID:dQNHzwTT
()はコンストラクタのそれだが,{}はC++11から導入された初期化子だろう‥バグじゃないかね

135 :デフォルトの名無しさん:2015/12/21(月) 17:54:14.64 ID:bZVc/vPs
gcc で x86-64 向けのバイナリを生成するとき、関数の呼び出し規約を指定するオプションってある?
cl と gcc でレジスタの使い方が違うよね?

136 :デフォルトの名無しさん:2015/12/21(月) 20:04:41.01 ID:l5zhfPYH
-mabi=msとか?
今使ってるのが32ビットマシンだからかsysvでもmsでも変わらなかった
これで変わるかこれでいいか試してみて

137 :デフォルトの名無しさん:2015/12/21(月) 21:05:55.08 ID:bZVc/vPs
>>136
thx
Ubuntu で確認した
一応 gcc.godbolt.org の結果も貼っておく
http://goo.gl/R9yZ8o
-mabi=ms を外すと rcx が rdi にかわる

138 :デフォルトの名無しさん:2015/12/22(火) 23:53:07.70 ID:NGrgb8N2
#include <stdio.h>

int printer(int p[])
{
int i;

for(i = 0; i < 5; i++)
{
printf(

139 :デフォルトの名無しさん:2015/12/22(火) 23:57:48.51 ID:NGrgb8N2
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 :デフォルトの名無しさん:2015/12/23(水) 00:23:22.44 ID:v0nEZQ5O
>>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 :デフォルトの名無しさん:2015/12/23(水) 00:24:07.56 ID:v0nEZQ5O
×今のコンパイラは知らんけど自分の知っているコンパイラなら忌避数で受け取った配列にsizeofしてもダメだったはず

○今のコンパイラは知らんけど自分の知っているコンパイラなら引数で受け取った配列にsizeofしてもダメだったはず

142 :デフォルトの名無しさん:2015/12/23(水) 00:24:51.84 ID:94XzmV4H
>>139
for のコンディションがどちらも駄目

143 :デフォルトの名無しさん:2015/12/23(水) 00:32:41.28 ID:v0nEZQ5O
外側のループ
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] は配列のインデックスを超えている

全体的におかしいのでここでも見て
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort1.html

144 :デフォルトの名無しさん:2015/12/23(水) 00:47:36.44 ID:XRDkq33u
ありがとう
なにがなんだかチンプンカンプンだったが、少しわかってきた気がする
上にはフローチャートとアルゴリズムを考えながら書けと言われているが本当にそれ以外の問題だ

145 :デフォルトの名無しさん:2015/12/23(水) 01:11:41.20 ID:xKy7nhKt
フローチャートなんて働いてから一度も見たことないなー
UMLのシーケンス図なら時々見る程度

146 :デフォルトの名無しさん:2015/12/23(水) 02:13:28.80 ID:votnFkGe
フローチャートは万物の基本だから仕事にするとなった以上は出来なきゃまずいっしょ

147 :デフォルトの名無しさん:2015/12/23(水) 09:04:00.88 ID:BrzFNCu8
アルゴリズムフローチャートは使わないな
ビジネスフローチャートは顧客も読めるし誤解なく意思疎通できしで非常に便利だからよく使う

148 :デフォルトの名無しさん:2015/12/23(水) 21:23:21.87 ID:yHKdz1et
アクティビティ図?

149 :デフォルトの名無しさん:2015/12/24(木) 22:58:28.26 ID:65Ta51SK
Hi gays
ちょっと聞きたいんだがPythonで
ans = a * (d-b if d>b else 0)
ってどういう意味なんだい?
cライクな言語で書いたら
if( d>b ){
ans = a * d-b;
}else{
ans = 0;
}
と等価なのかい?

150 :デフォルトの名無しさん:2015/12/24(木) 22:59:49.41 ID:65Ta51SK
おっとすまん c/c++スレやった。気にしないでくれ!

151 :デフォルトの名無しさん:2015/12/24(木) 23:27:07.31 ID:Q6U3kr4L
どっちかというと三項演算子やね

152 :デフォルトの名無しさん:2015/12/24(木) 23:44:33.46 ID:65Ta51SK
>>151
Thank you !
なるほど謎が解けました。定義ながめても
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]
みたいな感じだったからなんでじゃ!と思ってたが
確かに三項演算子(Conditional expressions)のとこに
しっかり書いてありました!

153 :デフォルトの名無しさん:2015/12/25(金) 00:59:07.49 ID:47X2XmRH
>>1
RPGツクール2000 , RPGツクールMV https://tkool.jp/mv/ ( JavaScript 採用 )

WOLF RPGエディター http://www.silversecond.com/WolfRPGEditor/

デュエル・マスターズ Android版 ,i-OS版、公式 http://dm.takaratomy.co.jp/extra/dmapp/entrygate_ds/
デュエル・マスターズ対戦CGI ex
https://web.archive.org/web/20150809154946/http://www53.atwiki.jp/dmsuishinparty/pages/314.html

デュエル・マスターズ(デュエマ)DM ONLINE 1.8a  /  VanGuard ONLINE 1.5a
https://web.archive.org/web/20150809160254/http://uhyohyohyo.sak ura.ne.jp/hsp.html

ヴァンガード専用ネット対戦ツール【 VanGuard Online 】
https://web.archive.org/web/20150809155032/http://kiimaa.jugem.jp/?eid=61

「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート
https://web.archive.org/web/20150809153724/http://supersolenoid.blog63.fc2.com/blog-entry-6886.html

遊戯王 Automatic Dueling System
https://web.archive.org/web/20150809164855/http://www3.atwiki.jp/ads-wiki/pages/20.html

遊戯王 デュエル・オンライン
https://web.archive.org/web/20150809171527/http://www31.atwiki.jp/vipdo/pages/15.html
https://web.archive.org/web/20140628005202/http://do.yugioh-portal.net/

ウィクロス( WIXOSS ) WEBXOSS http://webxoss.com/about_en.html http://webxoss.com/DeckEditor/

BG(ボードゲーム)Engine https://web.archive.org/web/20151209080842/https://bgengine.net/
https://web.archive.org/web/20151209172205/http://14owl.hateblo.jp/entry/2015/12/09/011234

アプレンティス  マジック:ザ・ギャザリング(MtG)オンライン化 http://homepage1.nifty.com/Q_Q/ap.html
https://web.archive.org/web/20151202202725/http://homepage1.nifty.com/Q_Q/ap.html

154 :デフォルトの名無しさん:2015/12/25(金) 01:00:12.11 ID:47X2XmRH
【 オンラインTCGエディター 】   >>1,>>153

デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。

例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書け。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストしろ。
個vs個、多数乱戦、チームvsチーム、個vsチームを実現し、P2P通信対戦プラグイン有り。

設計思想は 《 RPGツクール 》 が良いかな?  他に、優れたエディター有ったら挙げてみろ。

個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。

エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。

遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。

各社TCGを再現するテストプレイ ⇒ 更に改良や修正 + コード記述の仕様書(設計書)を作成。

機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ−グ用でサーバー稼動。

下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。

さ〜て、インド人ベンダーと日本人の翻訳担当PGを見つけよっと!ww
http://wc2014.2ch.net/test/read.cgi/entrance2/1450555747/-20

155 :デフォルトの名無しさん:2015/12/25(金) 08:59:08.40 ID:vl+/L70O
VC++でウォッチ機能を使いたいです
非アクティブ時にも処理を実行するようにすると
ウォッチ機能を使えましたが、
一度使うとウィンドウを表示できなくなります
ウォッチ機能を使った後に、また継続して処理してほしいのですが
どうすればいいでしょうか

156 :デフォルトの名無しさん:2015/12/25(金) 09:18:35.50 ID:vl+/L70O
色々勘違いをしていました…
ブレークポイントでウォッチ式の追加ができるんですね。
あるキーを押したらブレークポイントを呼び出す分岐を作って
うんぬんしました

157 :デフォルトの名無しさん:2015/12/25(金) 17:57:56.01 ID:VvmRSBaN
>>149
ans = a * d-b; じゃなくて ans = a * (d-b); じゃないかな…と

158 :デフォルトの名無しさん:2015/12/31(木) 17:47:20.07 ID:W7H0CYCX
[0, 1]の範囲で一様に分布するランダムなfloatを得るのに、
return (float)uint64_random / (float)uint64_max;
というのは合ってますか?
つまり64ビットからfloatへのキャストで打ち切られる部分があっても、計算上では一様な結果が得られるのか、ということです。

std::uniform_real_distributionを使えって話ですが今回は置いといて、あくまで上の計算が正しいのかどうかってことが聞きたいです。

159 :デフォルトの名無しさん:2015/12/31(木) 18:36:18.09 ID:31q/PxfR
間違ってる

160 :デフォルトの名無しさん:2015/12/31(木) 22:48:01.51 ID:W7H0CYCX
ならやっぱりシンプルに (1<<24)-1 とかの値でマスクしたのちfloatとして割り算すればいいんですかね。

なぜこんな質問をしたかというと、MSVCのuniform_real_distributionの実装が
実質>>158と同じで (float)1.48304654e+17 / (float)1.84467441e+19; のような計算が発生していて、
結果が不安になったからでした。

それではよいお年を。

161 :デフォルトの名無しさん:2016/01/01(金) 00:18:41.67 ID:T3uz4ezr
>>158
uint64_randomがuint64の範囲で一様なんであれば結果も[0, 1]の範囲で一様なんじゃね?
ただし精度が落ちた結果離散的な分布になるんで厳密には一様分布とは言えないかも知れんが。

162 :デフォルトの名無しさん:2016/01/04(月) 08:47:58.51 ID:z6cA6x0M
質問です。
タブレットPCで、専用ペン(N-Trig)を使って線を描くとき、(VAIO DUO 11など)
線の書き出しで、一瞬だけポイントの位置を取りこぼしてしまいます。
市販のソフトではタブレット専用ドライバに対応?してるようで、取りこぼすことはないのですが、
自作でペンで線を描くプログラムを描くと、取りこぼしてしまいます。
プログラム側でタブレット専用ドライバに対応させる必要があると思うのですが(そうしないと筆圧も検出できない)
対応方法や、技術資料など公開してるサイトなどありますでしょうか?
よろしくお願いします。

フリーソフトで同じ現象が出るのは、例えばMOZAなどです。
http://www.vector.co.jp/soft/winnt/art/se481229.html
ペンをすばやく動かしたとき、書き始めのいくつかのポイントをとりこぼすので、
フリーハンドですばやく円を描いても書き始めの部分だけ直線で描画されます。

よろしくお願いします。

163 :デフォルトの名無しさん:2016/01/05(火) 12:57:02.41 ID:KbFq7Je6
TabletPC API じゃだめかの?

164 :デフォルトの名無しさん:2016/01/07(木) 08:27:52.15 ID:Sx2pYlJo
>>163
ありがとうございます。筆圧の検出はできました。
しかし、線の書き出してポイントを取りこぼす原因がわかりません。

挙動を見ると、ペンで画面にタッチした瞬間は、システムのタッチイベントにデータが渡されて、
描画ソフトのほうにペンの位置データが送られて無いような感じです。
どう制御したらいいのか、よくわかりません。
ご存知の方いらっしゃいませんか?

165 :デフォルトの名無しさん:2016/01/07(木) 09:04:46.22 ID:x9JXveKM
タッチイベントから始めればいい

166 :デフォルトの名無しさん:2016/01/07(木) 15:28:40.10 ID:Sx2pYlJo
システムのタッチイベントを一時停止させるということでしょうか?
方法がよくわかりません。

167 :デフォルトの名無しさん:2016/01/07(木) 16:40:19.27 ID:7vfkJ+8f
>>166
最初の座標はタッチイベントで通知された座標を使えってことじゃね?

168 :デフォルトの名無しさん:2016/01/07(木) 17:40:32.76 ID:LbIHZlg8
挙動を観察してると、こんな感じです。()内は想像なので違うかも。

ペンでタッチした瞬間→OSが「タッチされたという円のカーソル」を表示する→最初の座標はソフトで取得できる
ペンでタッチしたままmoveする→0.1秒くらい、ソフト側でmove中のペン座標を検出できない(?)
→(OSが長押しなどのタッチイベントを検出しようとしてる?)
→0.1秒くらい後で、move後のペンの座標をソフトで取得できる。
→結果、線の書き始めがカクカクになる。

なので、OS側のタッチイベントをキャンセルできればいいのかな?と思ったわけです。
別の原因かもしれませんが。
普通にマウスを使えばカクつかないので、ペンイベントに関係した何かが原因と思います。

169 :デフォルトの名無しさん:2016/01/13(水) 15:37:26.50 ID:Kf0FfNiC
static関数やstatic変数はあるけど
staticクラスはなかったりする?
あるならサンプルがほしいです

170 :デフォルトの名無しさん:2016/01/13(水) 15:43:37.66 ID:Tiz9r6x1
>>169
unnamed namespaceを使えばいいよ。
別名anonymous namespace

namespace {
class Foo {};
}

171 :デフォルトの名無しさん:2016/01/13(水) 17:11:17.89 ID:FgL34cC5
シングルトンのことを言ってるのではなかろうか?
まあstaticには意味が複数あるから何とも言えないが

172 :デフォルトの名無しさん:2016/01/13(水) 18:00:04.70 ID:hhTEC9ap
C#にはあるんだよ、そのものズバリのstaticクラスが。
ソレのことじゃね?

https://msdn.microsoft.com/ja-jp/library/98f28cdx.aspx
> 次のクラスは static として宣言され、static メソッドのみが含まれます。
> static class CompanyEmployee {
> public static void DoSomething() { /*...*/ }
> public static void DoSomethingElse() { /*...*/ }
> }
> 定数宣言や型宣言は、暗黙に静的メンバーです。

173 :デフォルトの名無しさん:2016/01/13(水) 18:30:50.35 ID:Kf0FfNiC
public static class クラス名 {

}

みたいな感じでstaticクラスを作るのは
C#にはあるけど、C++には無いってことでOK?

174 :デフォルトの名無しさん:2016/01/13(水) 20:00:49.73 ID:Kf0FfNiC
C++ には static class は無いってことで
OKなんだよな!?

175 :デフォルトの名無しさん:2016/01/13(水) 20:12:22.35 ID:A49t3q/a
先生、staticクラスとstaticメンバしか持たないクラスの違いってなんなんですか?

176 :デフォルトの名無しさん:2016/01/13(水) 21:09:53.87 ID:HsSfXxOq
c++ならnamespaceで良いんじゃないか?

177 :デフォルトの名無しさん:2016/01/14(木) 13:38:21.56 ID:KoBeZziz
C++ には static class は無いってことで
OKなんだよな!?

178 :デフォルトの名無しさん:2016/01/14(木) 15:13:26.93 ID:KoBeZziz
>>175
同じだ!


C++ には static class は無いってことで
OKなんだよな!?

179 :デフォルトの名無しさん:2016/01/14(木) 20:42:14.11 ID:Zc1b49I1
C++ に static クラスは普通にあると思うが

180 :デフォルトの名無しさん:2016/01/14(木) 23:36:23.52 ID:9GGakY72
>>179
サンプルソース頼む

181 :デフォルトの名無しさん:2016/01/15(金) 00:10:02.43 ID:5etCVVqM
インスタンスを作って使うような普通のクラスじゃなくて
関数をパッケージ化しただけの、namespace的な使い方をするクラスってことでしょ

ビルド時の挙動とかに差はあるかもしらんけど

182 :デフォルトの名無しさん:2016/01/15(金) 04:21:23.98 ID:nz6sd5//
>>180
http://codepad.org/dnb38pGv

183 :デフォルトの名無しさん:2016/01/15(金) 08:46:56.72 ID:wa8kRhUB
>>182
それがstaticクラス w 初心者以前だわー
お前、便所でオナニーしてろ、出てくんな。

184 :デフォルトの名無しさん:2016/01/15(金) 10:27:10.73 ID:AdEtazjQ
>>178
その意味なら、static classという用語を使わないだけで、
named namespaceがその役割を果たすよ。

namespace C1 {
int x;
void foo() {
printf("%d\n", x);
return;
}
}

int main() {
C1::foo();
return 0;
}

185 :デフォルトの名無しさん:2016/01/15(金) 12:27:11.60 ID:RRBj9slx
>>182
Objって名前の変数を内部リンケージにしただけですやん…
C#のstatic classから程遠いですやん

186 :デフォルトの名無しさん:2016/01/15(金) 20:06:38.71 ID:nz6sd5//
>>183
>>185
はは,ごめんごめん‥

187 :デフォルトの名無しさん:2016/01/15(金) 22:37:03.46 ID:RSgCFGzJ
(HBITMAP)hBmpのデータを、(Gdiplus::Bitmap *)gBmpに、変換したいのですが、
どのようにしたらいいのでしょうか?

188 :デフォルトの名無しさん:2016/01/16(土) 00:10:28.87 ID:4AnwHYnZ
コンストラクタにHBITMAP渡せばいいだけじゃね?

189 :デフォルトの名無しさん:2016/01/16(土) 12:56:40.25 ID:QU9s9ZKo
>>187
調べたらHBITMAPと共にHPALETTEを要求するコンストラクタがあったぞ
https://msdn.microsoft.com/en-us/library/windows/desktop/ms536314(v=vs.85).aspx

190 :デフォルトの名無しさん:2016/01/16(土) 16:57:27.38 ID:UmbayiDQ
ありがとうございます。出来ました。
HPALETTEと聞いて身構えましたが、NULLでOKでした。

191 :デフォルトの名無しさん:2016/01/17(日) 10:41:17.97 ID:FnUzwqcH
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 :デフォルトの名無しさん:2016/01/17(日) 12:44:25.90 ID:8qUaiUxA
for(int i=0;i<100;++i)と、for(int i=0;i<100;i++)も
iに入る値は0〜99になるってこと?

193 :デフォルトの名無しさん:2016/01/17(日) 13:07:17.71 ID:J8S7Inib
変わってくるのは
j = i++;
j = ++i;

194 :デフォルトの名無しさん:2016/01/17(日) 13:55:06.87 ID:1NfmC2ez
i++と++iで結果が変わってくるのは常識レベルだけれど
i++と++iで結果が変わるようなコードはあんまり書きたくないなあ

195 :デフォルトの名無しさん:2016/01/17(日) 13:58:01.48 ID:i3k5KRJv
i = i++; ←undefined

196 :デフォルトの名無しさん:2016/01/17(日) 20:57:56.42 ID:ZUkPM10Q
>>191
コンパイラの不具合
規格では初期化子リストの各要素は左から順に評価されるであってる

197 :デフォルトの名無しさん:2016/01/18(月) 07:43:20.39 ID:O3Vj0Ahg
>>191
これってどのパターンもinitializer_listとして処理されずにただのアグリゲートで直接「A(int a, int b)」が呼ばれるんじゃないの?
initializer_list<int>を引数に取るコンストラクタにしないとただただA(int a, int b)になって副作用複数で動作未定義になると思うんだけど

198 :デフォルトの名無しさん:2016/01/19(火) 08:25:02.67 ID:pbmLvf11
副作用完了点までの間の演算の順序は未定義だと思うよ

199 :デフォルトの名無しさん:2016/01/19(火) 14:07:47.73 ID:IcGeaXVP
クラスについての質問です。(C++)

printf(

200 :デフォルトの名無しさん:2016/01/19(火) 14:13:54.81 ID:IcGeaXVP
文章が途中で切れてしまったので再掲です。
改善しない場合は不具合と思われるのでクローズします。

本文
クラスについての質問です。(C++)
printf("%d,%d,%d",Instance名,Instance名,Instance名);
のように記述すると、クラスのメンバ変数が上から順番に呼び出されることがわかりました。
この機能は、本来の仕様なのでしょうか?また、仕様であるとすれば、名称はありますでしょうか。
ご解説のほどよろしくお願い致します。

201 :デフォルトの名無しさん:2016/01/19(火) 14:30:34.90 ID:yzf0Ubeh
>>200
上から順番にってのがよく分からんが、標準的な実装だと右から順に評価される。
評価順序は仕様上は未定義だった筈。

202 :デフォルトの名無しさん:2016/01/19(火) 15:00:24.15 ID:XmaCTdxl
>>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:2016/01/19(火) 15:21:26.58 ID:XmaCTdxl
言い訳っぽいけど、普段は >>202 のようなコードは書かないよ。
コンパイラのオプションで書式指定と引数並びを照合してもらう。

今回は、コンパイルと実行ができることと >>200 に書かれたような
出力が得られることを実験しただけね。

204 :200:2016/01/19(火) 15:40:27.23 ID:IcGeaXVP
>>202
ご解説ありがとうございます。
仰る通り、クラスの仕様ではなくprintf関数による現象でした。
ありがとうございました。

205 :デフォルトの名無しさん:2016/01/19(火) 16:16:36.66 ID:uAThxx94
可変個引数の呼び出しだとスタックに積む順序とともに評価順が変わるという話が

206 :デフォルトの名無しさん:2016/01/19(火) 21:42:47.84 ID:OWcc7WP1
未規定
なので鼻から悪魔は出ない模様

207 :デフォルトの名無しさん:2016/01/19(火) 22:58:57.80 ID:8V+g6swC
私の環境だと標準入力の入力文字数制限が4095文字なんだけどこれを取っ払う方法ありますか?
osはwindows7 visual studio 2015使ってます

std::cin >> str みたいなときの話です

ググったんだが他の環境だとこんな制限ないっぽい……

208 :デフォルトの名無しさん:2016/01/20(水) 03:31:40.09 ID:7T123+WA
標準入出力のバッファが4KBだからだろ

Linuxのfind コマンドでも、ファイル数が多いと、
引数リストが長すぎて、コマンドが失敗する

そういう時、パイプで、xargs につなげると、
(4KB毎に?)引数を分割して、実行してくれる
find 〜 | xargs 〜

バッファが一杯になったら、それを出力して、
バッファを空にする。その後、バッファに読み込む

209 :デフォルトの名無しさん:2016/01/20(水) 08:16:31.13 ID:UTQHsO+H
>>207
setvbuf() って関数でどうにかならんかの。
俺も試したわけじゃないんだけど。

210 :デフォルトの名無しさん:2016/01/20(水) 09:06:46.12 ID:tlDETzf4
>>207
それ実行してもstrに4095バイトしか入らないってことはないと思うけど?

211 :デフォルトの名無しさん:2016/01/20(水) 10:21:56.43 ID:PU8f41kT
>>210
そういう質問じゃないだろ

212 :デフォルトの名無しさん:2016/01/20(水) 12:33:16.22 ID:tlDETzf4
>>211
どういう問題なの?

213 :デフォルトの名無しさん:2016/01/20(水) 12:35:33.21 ID:zFAeGKrq
>>207
手元に実行環境がないから俺の思ってる現象と実際に起きてるそれとが同じかどうか分からんけど
多分ライブラリがクズなのが原因。

文字列読み込みくらいなら自分で書いてみよう
レシピは?
getchして必要ならutf-8をUCS4にする類のデコーディングをして、stringにappendするだけ。簡単だよね?

214 :デフォルトの名無しさん:2016/01/20(水) 12:39:52.50 ID:zFAeGKrq
>>212
「改行が来るまでバッファに貯めこんで、改行が来たら返す関数」と
「その関数を使ってstringを作る関数」みたいな実装になってて、
しかも改行の判定だのeof判定だのループだのをやってないんじゃないかなぁと思ってる

215 :デフォルトの名無しさん:2016/01/20(水) 14:33:44.70 ID:7Lwquj6u
すみません実際には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:2016/01/20(水) 14:40:09.85 ID:7Lwquj6u
このプログラムでgetlineが実行され標準入力からの受付待ちになったとき
コピペしてあった4096文字以上の文字列を標準入力にペーストすると、4096文字目以降が途切れて表示されなくなってしまいます
それ以降キーボードから入力しても何も表示されず、受け付けてくれないようです
標準入力以外(ファイルストリーム)からの入力に変更することは仕様上できないので、なんとか標準入力の制限を取っ払う方法を調べていましたが、見つからずここで質問させていただきました

217 :デフォルトの名無しさん:2016/01/20(水) 14:57:00.34 ID:+L7kwNqj
それってプログラムじゃなくてコマンドプロンプトの制限なんじゃ?

218 :207:2016/01/20(水) 15:02:48.12 ID:7Lwquj6u
>>208 >>209 >>213
教えてくれてありがとう。詳しい状況説明します
GUIと標準入力でやりとりするプログラムを書いています
GUIは将棋所というプログラムでオープンソースではないです
私が作ってるのは将棋の思考エンジンです
これで将棋を指すと807手目くらいで思考エンジンに送る文字列が4096文字を超えてしまい、思考エンジンの動作が止まってしまうようです

219 :207:2016/01/20(水) 15:08:19.19 ID:7Lwquj6u
>>217
コマンドプロンプトを立ち上げて4096文字以上の文字列をペーストしたところちゃんと表示してくれたので、大丈夫なんじゃないかと思ってるのですが……
しかも、以前2000000文字を標準入力から受け取るプログラムを書いたことがあって、そのときは問題なく動いたはずなんです
この問題です→http://yukicoder.me/problems/686

220 :デフォルトの名無しさん:2016/01/20(水) 15:08:44.03 ID:zFAeGKrq
>>216
調べたら、どうもコンソールの制限みたい。
http://stackoverflow.com/questions/24106960/visual-studio-c-cin-big-string-from-command-line

Linuxにおいでよ。

221 :207:2016/01/20(水) 15:12:22.18 ID:7Lwquj6u
>>220
そうなんですね……ありがとう
連投すみませんでした

222 :デフォルトの名無しさん:2016/01/20(水) 16:03:06.86 ID:6opntLoI
std::string型の "abc"+str のように、
クラスの左側のoperatorを変更したい場合は、どのように記述すれば良いでしょうか。
よろしくお願い致します。

223 :デフォルトの名無しさん:2016/01/20(水) 16:24:10.25 ID:UTQHsO+H
>>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:2016/01/20(水) 17:58:33.69 ID:6opntLoI
>>223
できました!
クラスの外に記述する発想はありませんでした。
ご回答、本当にありがとうございました。

225 :uy ◆Qawu9.2l1E :2016/01/20(水) 20:56:27.36 ID:xIovtIq7
ヌバーン!生き生きとしたこんにゃくをAlien & Friend @ トリなし運用中wに叩きつけたときの音w

【ヌバーン!】ヌバーンから学ぶGoogleのサジェスト汚染の仕組みw
http://peace.2ch.net/test/read.cgi/tech/1441693570/l50

226 :デフォルトの名無しさん:2016/01/20(水) 22:13:13.72 ID:arPtyuMt
自然数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 :デフォルトの名無しさん:2016/01/20(水) 23:39:56.17 ID:bvuszQOX
ええと、別に行列である必要なくない?

228 :デフォルトの名無しさん:2016/01/20(水) 23:52:10.42 ID:Gr6aoqFK
仮に作るとして
行の並びはどうやって決めてるんかね

229 :デフォルトの名無しさん:2016/01/20(水) 23:56:05.00 ID:arPtyuMt
行の並びは、各行に重複がなければ何でもいいです

230 :デフォルトの名無しさん:2016/01/21(木) 00:02:08.78 ID:yQ7XttE4
全パターンって事?
a = 合計 = 2
m = 列数 = 3
2 0 0
0 2 0
0 0 2
1 1 0
1 0 1
0 1 1

231 :デフォルトの名無しさん:2016/01/21(木) 00:20:37.50 ID:6QaN3bnU
>>230
そうです
それでaとmが引数で、それに応じて作られる行列が変わるというモノにしたいです

232 :デフォルトの名無しさん:2016/01/21(木) 00:45:35.57 ID:yQ7XttE4
今はどこまで出来上がってるのかideoneあたりにでも上げてみて

233 :デフォルトの名無しさん:2016/01/21(木) 01:44:18.71 ID:7s6F6whZ
そんなのただの組み合わせ問題でしかないような気はするが

234 :デフォルトの名無しさん:2016/01/21(木) 05:20:25.85 ID:PqFPWDYj
まずC言語で行列をどう定義すれば良いんだろ?
とりあえず6*3の2次元配列に値を格納するとかなら再現出来るけど

やっぱりそれって組合せを羅列してるだけだしなあ

235 :デフォルトの名無しさん:2016/01/21(木) 07:15:24.30 ID:6QaN3bnU
>>234
まさしく組み合わせの列挙と同じです
そういうアルゴリズムはもうありますか?
組み合わせの列挙ができれば行列の表現は自分で適当に定義するので大丈夫です

236 :デフォルトの名無しさん:2016/01/21(木) 08:12:31.11 ID:7s6F6whZ
>>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 :デフォルトの名無しさん:2016/01/21(木) 17:50:19.63 ID:AYpDF3p9
すみません、質問です。
HBITMAPでハンドルされたビットマップのデータを、
LPBITMAPFILEHEADERのポインタに渡すにはどうしたらいいでしょうか?

HBITMAPのほうは、ARGBで、LPBITMAPFILEHEADERにはRGBで渡したいのですが。
1ピクセルずつ転送するしか方法はないでしょうか?

238 :デフォルトの名無しさん:2016/01/22(金) 01:15:05.06 ID:G5rv7JJ3
>>237
LPBITMAPFILEHEADERはBITMAPFILEHEADER構造体へのポインタなんだけど、
BITMAPFILEHEADER構造体はビットマップファイルのサイズとかデータのオフセットなんかを保持するものであって、
ビットマップの内容を保持するものじゃない。
だからビットマップのデータを渡すことはそもそも不可能。

ビットマップファイルを作ることが目的なら、GetDIBits関数を使えば行けるっぽい。
http://www.geocities.co.jp/SiliconValley-SanJose/9921/bitmap.htm

239 :デフォルトの名無しさん:2016/01/22(金) 07:20:07.20 ID:KhXVHsnG
>>236
vector とかをポインタで渡す奴初めて見た

240 :デフォルトの名無しさん:2016/01/22(金) 08:04:21.41 ID:mLydxleH
>>239
別に普通じゃね?

241 :デフォルトの名無しさん:2016/01/22(金) 08:42:22.39 ID:0StJWjHm
渡した引数が関数内で変更されることを明確にするために
参照でなくポインタを引数に使うって流儀があるな。
呼び出す際に意識できるように。

ただ、この関数の場合vectorの中身を書き換えるのは
関数の目的からして明らかだから、参照でも構わない気もする。

242 :デフォルトの名無しさん:2016/01/22(金) 09:08:19.22 ID:bim8zuhw
>>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 :デフォルトの名無しさん:2016/01/22(金) 23:40:00.14 ID:EmPy3KXO
>>238
参考になります。ありがとうございます。

244 :デフォルトの名無しさん:2016/01/23(土) 07:48:50.85 ID:QkGTEhqA
>>236
おーまさしく求めていたモノです
ありがとうございました

245 :デフォルトの名無しさん:2016/01/23(土) 13:05:07.65 ID:eTMuwGLO
すみません質問です。

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 :デフォルトの名無しさん:2016/01/23(土) 13:46:54.30 ID:BpJ08GBs
>>245
質問する前にちょっとはググろうぜ
https://msdn.microsoft.com/ja-jp/library/k1sf4cx2.aspx
http://katahiromz.web.fc2.com/win32/savebmp.html

247 :デフォルトの名無しさん:2016/01/23(土) 17:35:21.00 ID:8FfjCDv5
>>246
ありがとうございます。
bm.bmBitsが、データの先頭ポインタということでいいんですよね?

これを、RGBごとの配列として取得しようとするとアクセス違反が出るのですが、
参考になるサンプルがググっても出てこないので困っています・・・・・・・・・。

248 :デフォルトの名無しさん:2016/01/23(土) 19:21:25.50 ID:AYxzv3Ol
LIBRARY_PATHで指定しても聞いてくれん
-Lとかめんどい

249 :デフォルトの名無しさん:2016/01/23(土) 19:29:56.09 ID:BpJ08GBs
>>247
手元に環境がないのでどんなコード書いて動かんのか分からんのだけど、
>>264の2つ目のリンクに載ってる動くコードは試してみた?
ビットマップの情報(info)とビットマップを構成するピクセルの情報(data)は違うよ。
後者を得るにはGetDIBits関数を使う。

250 :デフォルトの名無しさん:2016/01/23(土) 19:47:23.84 ID:BpJ08GBs
>>248
gcc --print-libgcc-flie-name
で表示されるファイルと同じ場所にあるspecsってファイルを編集する。

デフォルトのファイルが無ければ
gcc -dumpspecs > `dirname $(gcc --print-libgcc-file-name)`/specs
して作る。

251 :デフォルトの名無しさん:2016/01/23(土) 20:27:45.17 ID:sjR26rme
>>249

2つ目のリンクだと、
pBitsに、データ全体を格納できるバッファを確保して、
GetDIBitsで、pBitsに、データ全体を丸ごとコピーしてるという流れでしょうか?
ということは、それだけ時間がかかるわけですよね?

作法はよくわからないのですが、
元データのポインタに直接アクセスするような方法は普通しないということでしょうか?
安全のため?とか?

252 :デフォルトの名無しさん:2016/01/24(日) 06:35:19.53 ID:LlGxXnUD
>>250
gccを上げたのにldが古いままだからか知りませんがうまくいかなかったので諦めて-Lしました

253 :デフォルトの名無しさん:2016/01/24(日) 11:46:59.00 ID:LHp2Xjej
>>251
元データがどんな形式で保持されてるかは分からない。
もしかしたら配列の配列を使った拡張性の高い形式になってるかもしれないし、
もしかしたら1ピクセルに一色あたり10ビット使ってるかもしれないし、
あるいは赤5ビット緑6ビット青5ビットかもしれない。

その内部形式をbitmap形式に変換する必要があるんだから
どっちみちGetDIBitsでデータ全体をbitmap形式で再生成する必要がある。

254 :デフォルトの名無しさん:2016/01/24(日) 17:01:15.10 ID:LvcqEuFR
>>253
わかりました。ありがとうございます。

255 :デフォルトの名無しさん:2016/01/25(月) 10:22:34.82 ID:1hi7ZmAY
ランタイムライブラリ→マルチスレッド(/MT)に設定してるんだけど、
外部のライブラリを、追加の依存ファイルで設定して、
リンクするときに静的にEXEに埋め込めると思ったのですが出来ないんだっけ?
他に設定とかあります?

256 :デフォルトの名無しさん:2016/01/25(月) 20:36:08.52 ID:Gry0WUO1
VCスレ行け

257 :デフォルトの名無しさん:2016/01/31(日) 00:14:56.28 ID:yeB8Lsmn
すみません、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 :デフォルトの名無しさん:2016/01/31(日) 00:24:13.44 ID:rR0u1lvP
>>257
<map>じゃあかんか?

259 :デフォルトの名無しさん:2016/01/31(日) 01:10:39.19 ID:yeB8Lsmn
>>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 :デフォルトの名無しさん:2016/01/31(日) 01:32:33.46 ID:rR0u1lvP
>>259
>新しい項目が出来て、var1とvar2の内容が変わった時に

どんな状況か具体的に書いてくれると分かるかも

そもそもvar1とvar2の組合せに特別な意味があるなら(aの01,bの03みたいな)
安易に結合させない方が扱い易い気がする

261 :デフォルトの名無しさん:2016/01/31(日) 02:13:55.81 ID:yeB8Lsmn
>>260
伝わるかわりませんが、
自作のテキストファイル上のスクリプトテキストから、
指定の画像ファイルをDXライブラリを使用して表示するというプログラムを作っています。

スクリプトは拡張性を考えて、「aaa」という種類の画像の「01番目」を表示というように、
「画像表示 , aaa , 01」のようにコンマで分けて記載しており、それをここで言うvar1とvar2に読み取って格納しています。

で、画像のファイルはDXライブラリのLoadGraph関数を使用して、
こことは別の場所でメモリへロード、グラフィックハンドル化しております。
それが「表示したい項目」にあたるもので、aaa01という名前のint型の変数になっています。

cout〜endl; の部分は、実際にはDXライブラリの描画関数のDrawGraphを使用するため、引数にグラフィックハンドルを設定します。

スプリプト側である程度画像ファイルをコントロールしたいというコンセプトで作っており、
新しい画像ファイル追加時も極力プログラム側は弄らずに済むようにしたいのです。

あと、明日早いのでもう寝ます、すみませんorz

262 :デフォルトの名無しさん:2016/01/31(日) 04:23:29.02 ID:+opoo++4
>>261
>もう寝ます、すみませんorz
気にすんな、おやすみ

とりあえず書くだけ書いとくと
・変数名はあくまでも人間が変数の役割を見る為の物
・実行時には変数名なんて一部を除き消えてる
・まずLoadGraphする時に片っ端から変数宣言するのを止めるべき
・その為には変数xxx00と画像ファイルにどんな対応関係があるのかを見直す必要がある
(xxx00→img\xxx\00.png等)

263 :デフォルトの名無しさん:2016/01/31(日) 10:56:19.63 ID:KmNLeza2
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 :デフォルトの名無しさん:2016/01/31(日) 11:10:13.83 ID:wbBrgvcH
>>263
何でロードしてるん
ロードでAARRGGBBの所がFFRRGGBBになってるんじゃないの?
FFは0xFFの事な

265 :デフォルトの名無しさん:2016/01/31(日) 11:22:28.41 ID:KmNLeza2
>>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 :デフォルトの名無しさん:2016/01/31(日) 11:26:50.86 ID:wbBrgvcH
>>265
変更前 PixelFormat32bppRGB
変更後 PixelFormat32bppARGB
でやってみたらどうなる?

267 :デフォルトの名無しさん:2016/01/31(日) 11:41:21.24 ID:ym0w2q0h
mapとか、最近だとエディタの補完ってどこまで効くんだろ

268 :デフォルトの名無しさん:2016/01/31(日) 11:56:29.04 ID:KmNLeza2
>>266
あ〜!と思いましたが、変わりませんでしたです。

269 :デフォルトの名無しさん:2016/01/31(日) 12:03:49.64 ID:wbBrgvcH
HBITMAP取ってGetObjectした時のbmBitsPixelは何になってる?

270 :デフォルトの名無しさん:2016/01/31(日) 12:19:29.18 ID:KmNLeza2
>>269
32になってます。

271 :デフォルトの名無しさん:2016/01/31(日) 12:30:09.27 ID:wbBrgvcH
>>270
GetPixel前にpixelColorを0x00000000にしても
0xFFRRGGBBになるの?

272 :デフォルトの名無しさん:2016/01/31(日) 12:40:44.08 ID:KmNLeza2
>>271
pixelColor=0x00000000;
bmp->GetPixel( x, y, &pixelColor );
alpha = pixelColor.GetAlpha();
で、alpha は255になります。

PNGロードは問題なくalphaを取得できるんですが。
いま、LockBitsでロードしたデータの中身を見ようとしてるんですが、
素人なので、取得の仕方から調べてるところです。

273 :デフォルトの名無しさん:2016/01/31(日) 14:12:49.87 ID:Q+LCs9MU
バイナリだとbmpは下の行から格納されるからとかだったりして

274 :デフォルトの名無しさん:2016/01/31(日) 14:18:47.67 ID:wbBrgvcH
>>272
RGBはxyに期待する値取得できる?

275 :デフォルトの名無しさん:2016/01/31(日) 14:31:16.81 ID:KmNLeza2
>>237
>>274
RGBは問題ありません。
LockBitsで見たところ、ロードしたデータのalpha値はすでに255でした。
これって、こちらだけの問題でしょうか?
他の方はalpha値をロードできているのでしょうか?

276 :デフォルトの名無しさん:2016/01/31(日) 14:32:33.18 ID:KmNLeza2
あれ?sageてるのに、なぜか上がってるし?

277 :デフォルトの名無しさん:2016/02/03(水) 18:07:52.25 ID:tpmWM1rq
通りすがりだけど、bmpにalphaなんてないよね?

278 :デフォルトの名無しさん:2016/02/03(水) 20:54:07.47 ID:uEOUJl1K
32bit中8bitをアルファに割り当てるのはよくあると思うけど
APIにそのまま渡せるかは知らない

279 :デフォルトの名無しさん:2016/02/03(水) 21:27:06.77 ID:cIfP8+z6
>>277 あるよ
>>278 渡せるよ(BITMAPV5HEADER)

280 :デフォルトの名無しさん:2016/02/03(水) 21:37:47.64 ID:+QXRA0Fd
非標準なので対応してるアプリ毎に違う

281 :デフォルトの名無しさん:2016/02/05(金) 16:46:07.97 ID:kz0UWJTh
それ言ったらbitmap形式自体がMSのとOS/2のとあるような
標準はいずこへ

282 :デフォルトの名無しさん:2016/02/06(土) 14:37:10.84 ID:XRyA0EjL
BITMAPV5HEADERは Win95 がダメだったから
それを未だに引きずってアプリの対応もイマイチなのよね

283 :デフォルトの名無しさん:2016/02/06(土) 15:03:17.23 ID:4STRQeN+
で,ビットマップの扱いはどうすればいいの,データの32ビット縛りも気が付かないと大変だし,ヘッダの各プロパティにもいろいろこだわりがあるようじゃないか,

284 :デフォルトの名無しさん:2016/02/06(土) 15:17:27.16 ID:SD/iIwrI
GDI+なんか使わないでWICでやる。

285 :デフォルトの名無しさん:2016/02/06(土) 15:44:14.42 ID:utAdfs60
内部形式で処理して、どうしてもbmpで出力したい時に変換すればいいんじゃない?

286 :デフォルトの名無しさん:2016/02/11(木) 04:53:26.42 ID:pNz7UH/B
http://peace.2ch.net/test/read.cgi/tech/1453557975/564
わかる方いませんか?
マルチでごめんなさい。

287 :デフォルトの名無しさん:2016/02/11(木) 11:44:52.07 ID:vxNioHuU
向こうで即レスついてるじゃん。例えば、こういう事だよ。
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 :デフォルトの名無しさん:2016/02/11(木) 12:19:09.02 ID:pNz7UH/B
>>287
回答ありがとうございます。
一応作業してたら解消したのですが理解はしていません。
いまいちC++のコード規約理解してないのでこういうわなにはまってしまいます。
向こうにアルファ版がおいてあるので暇があったら遊んでみてください。
ありがとうございました。

289 :デフォルトの名無しさん:2016/02/11(木) 12:32:08.05 ID:vxNioHuU
ざっくり言うと、それまでに出現(定義)してない名前は使えない
クラス内メンバーは例外で、後から定義してても使える

290 :デフォルトの名無しさん:2016/02/11(木) 12:43:42.53 ID:pNz7UH/B
>>289
なるほど。参考にします。

291 :デフォルトの名無しさん:2016/02/11(木) 22:42:24.22 ID:vMQ0aSNq
>>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 :デフォルトの名無しさん:2016/02/12(金) 00:33:59.18 ID:Fqxy+b4c
ファイルの頭の方にあるこいつがGdiplusと相性悪い。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

293 :デフォルトの名無しさん:2016/02/12(金) 10:17:01.79 ID:bFgUXSY6
>>292

ありがとうございます。削除して上手くいきました。

294 :デフォルトの名無しさん:2016/02/14(日) 12:46:34.08 ID:VLtYVTYt
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 :デフォルトの名無しさん:2016/02/14(日) 19:53:21.40 ID:gzwnh80D
>>294
普通の筋で考えるとconstのコンストラクタも作らないと駄目でしよ。
でも、コンストラクタの意味からしてconstのコンストラクタってありえない。
ってあたりから、無理じゃね?

296 :デフォルトの名無しさん:2016/02/14(日) 20:51:48.95 ID:QinwwQiS
そのconstは変数bの属性だと思うんだよ。
クラス側としては
class BuyTransactonConst : public BuyTansaction
とか作れば?

297 :294:2016/02/14(日) 21:17:33.93 ID:VLtYVTYt
直接的に処理を分けることは無理みたいですね。
お察しが付くかもしれませんが、上記ソースコードは
スコット・メイヤーズさんのEffectiveC++第3版の9項からのものです。
説明では基底クラスのTransaction中では void logTranslation() const = 0;
と純粋仮想関数になっているのですが、サンプルソースを適当に変えて挙動を
みていたら、このことに気が付きました。
両名の方、レスありがとうございました。

298 :デフォルトの名無しさん:2016/02/14(日) 23:45:36.83 ID:aC/U9cwJ
質問です。

メンバポインタの必要性ってなんですか?
今メンバポインタについて勉強していますがわかりません。
あると便利なときってどんな時ですか????

299 :デフォルトの名無しさん:2016/02/15(月) 01:17:40.04 ID:CoPBLH5e
普通の関数ポインタじゃ扱えないから、その代用
……とかそういう話なかったっけ?

300 :デフォルトの名無しさん:2016/02/15(月) 01:25:22.95 ID:FDnCcdJi
メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
ちゃんぽんしたかったら一考しないといけない。

301 :デフォルトの名無しさん:2016/02/15(月) 12:13:19.05 ID:8Os0TVn8
>>298
今まで一度も使ったことないし使われてるところを見たこともない

302 :デフォルトの名無しさん:2016/02/15(月) 21:40:19.82 ID:geRYYYJt
>>298
その章は飛ばして先に進みましょう

303 :デフォルトの名無しさん:2016/02/16(火) 08:52:37.81 ID:ZqCrYcMA
必要になった時に学べばいいと思う

304 :デフォルトの名無しさん:2016/02/16(火) 15:52:46.94 ID:TrNqH2Y5
>>301
なんだそれw オワコン・・・・・・?
検索したけど情報量少ないのが困るなぁ

>>302
わかった!ありがと!

>>303
必要になるのがどういう状況下がわからん(´;ω;`)ブワッ

305 :デフォルトの名無しさん:2016/02/16(火) 18:14:53.19 ID:14idcRCK
>>304
テンプレートと組み合わせてイベントハンドラの格納に使える。
もっともC++11以降は std::function があるからそれを使うべき。

306 :デフォルトの名無しさん:2016/02/16(火) 19:40:50.31 ID:fomhurQ7
こんなの必要性以前の問題だろwww




メンバポインタって何だっけ?

307 :デフォルトの名無しさん:2016/02/16(火) 19:54:01.02 ID:SmCEknBn
クラス内で宣言した配列に外で宣言した配列の中身を突っ込むことってできますか

308 :デフォルトの名無しさん:2016/02/16(火) 23:50:18.80 ID:bGf55uSQ
>300にはっきりと答えが書かれてるのに、何故そっちはスルーしたんだ…

309 :デフォルトの名無しさん:2016/02/17(水) 07:44:04.68 ID:bjhQnNdd
>>308
すまぬ、別の人に対して発言したとおもた

>>300
>メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
何でそうなるのかわかりません(´;ω;`)ブワッ
まずはそこからです((((((((( (´・ω・`)へ

310 :デフォルトの名無しさん:2016/02/17(水) 08:50:55.26 ID:4zW8fTVw
>>309
自クラスの他関数を呼び出す時にthis->func()って呼べるやろ?
自クラス内でthisを暗黙に取ってないとthisは使えない
自クラス内でもstatic関数はthisを取らない

311 :デフォルトの名無しさん:2016/02/17(水) 12:36:46.43 ID:ofvCQlRl
>>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の機能である「普通の関数ポインタ」では扱えない。

312 :デフォルトの名無しさん:2016/02/17(水) 15:08:50.48 ID:nUvaCFse
クラスAから、クラスBの関数を呼ぶとかに使うの?

クラスA{
 クラスB m_メンバ;
}
クラスB{
hoge();
}
ホゲ()::クラスA{

m_メンバ.hoge();

}

313 :デフォルトの名無しさん:2016/02/18(木) 02:12:50.53 ID:zoJ8Qqc9
自分は使ったことないけど、
基本的には関数ポインタを使う場面で使うんじゃない?

まあ、今のC++で関数ポインタを使う場面があるか?と聞かれても微妙だが。

314 :デフォルトの名無しさん:2016/02/18(木) 07:46:15.09 ID:nHOTcIDn
>>311
.* か ->* を使って書いてくれ

315 :デフォルトの名無しさん:2016/02/19(金) 08:21:46.75 ID:NhUxYl/M
>>313
もともとC#からプログラミングを始めたけど、デリゲートとかにいいんじゃない?
だから、C++だとイベント処理とか

316 :デフォルトの名無しさん:2016/02/19(金) 17:08:23.26 ID:E/z1CaIk
>>315
自分も昔は関数ポインタをよく使ってたけど、
クラス継承、関数オブジェクト、そして今はラムダ式とある中で
そもそもの関数ポインタを使う場面って限られてるんじゃないかって話ね。

そして、そこから更にメンバ関数ポインタを使う機会って考えると
割りと怪しいんじゃないかなって。

317 :デフォルトの名無しさん:2016/02/20(土) 12:04:55.58 ID:xl4z8Qhr
オーバーライドに対応した関数ポインタと考えればいいんだけど
(継承や関数オブジェクト、ラムダ式じゃ当然実現できない)
そういえば使ったことないな

318 :デフォルトの名無しさん:2016/02/25(木) 22:56:25.67 ID:yuZaonNv
質問です。
class personというのをつくります。
std::vectorにそのまま入れて、メンバ変数のidでsortしたいのですが、それなりにpersonのサイズがおおきいのでpersonではなくperson*の配列として扱いたいです。

person->idでsortしたい場合、どのように記述すればよいですか。追加ですが簡単な切り替えでperson->numberでもsort出来るようになっていると有り難いです。

319 :デフォルトの名無しさん:2016/02/26(金) 00:43:27.52 ID:5tlNRLX1
ふたつのperson*を引数にとって
idで大小比較してboolを返す関数/関数オブジェクト/ラムダ式を書いて
sortに渡すだけ

320 :デフォルトの名無しさん:2016/02/26(金) 00:54:31.33 ID:pNNKrV8l
>>319
ありがとうございます。
なんとかできました。
ラムダはまだわからないです。

321 :デフォルトの名無しさん:2016/03/05(土) 12:06:37.89 ID:XYtyIfXI
ポインタの確保する領域って32bitは4byteで64bitは8byteの固定長なんですか??

322 :デフォルトの名無しさん:2016/03/05(土) 20:17:06.06 ID:t560EV2m
固定ではなく環境とコンパイラで変わる

323 :デフォルトの名無しさん:2016/03/06(日) 11:30:10.04 ID:E+dKwvyv
>>322
そうなんだ
コンパイラがポインタのサイズを決めて終わりかと思った。
それ以外に決まる要因って何?

324 :デフォルトの名無しさん:2016/03/06(日) 11:56:01.08 ID:9dFH7fs4
すでに自分で答えを書いてるんでは

325 :デフォルトの名無しさん:2016/03/06(日) 13:25:23.83 ID:7dbWmFO0
>>323
コンパイラが環境によってポインタのサイズを決めて終わり

326 :デフォルトの名無しさん:2016/03/09(水) 03:26:57.98 ID:UYrrbR23
クラスのデストラクタが呼ばれない場合って
継承関係にあるクラスのデストラクタにvirtualを付けなかったとき
abort, exitしたとき以外にどんな場合がありえますか?

327 :デフォルトの名無しさん:2016/03/09(水) 06:19:35.04 ID:EHNG1aVZ
解放しなかった時

328 :片山博文MZ ◆T6xkBnTXz7B0 :2016/03/09(水) 16:43:22.32 ID:j/ofmAyB
>>326
newで確保してdeleteで解放しなかったとき

329 :デフォルトの名無しさん:2016/03/09(水) 17:14:57.11 ID:mZtDFmSo
例外中のデストラクタで例外が投げられたとき

330 :デフォルトの名無しさん:2016/03/10(木) 13:45:15.99 ID:/KMYK0BP
本来の目的が何かを明らかにしないと求める答えは得られない

331 :326:2016/03/10(木) 21:03:11.56 ID:WVxO2Qsv
やろうとしてたことがスマポではできなさそうだったので
自分でスマポに変わるクラスを作ろうと思って質問したのですが
よくよく調べてみたらスマポでできたのでそっちを使いました
後学のために他にもデストラクタが呼ばれない場合があったら教えてください

332 :デフォルトの名無しさん:2016/03/11(金) 00:34:20.06 ID:ZLj/v9UA
コンストラクタから例外を外にthrowしたとき

333 :デフォルトの名無しさん:2016/03/11(金) 00:40:37.01 ID:ZLj/v9UA
exitしたときは、静的変数のデストラクタは呼ばれます。

334 :デフォルトの名無しさん:2016/03/12(土) 01:44:49.90 ID:WNn7QVXF
質問です
OpenFrameworksiOSv0.9.3で行き詰ってます。
unsigned char * pixels = grabber.getPixels();にどうしても
『operator unsigned char * is deprecated』とwalningがついてしまいます。
どうしてもピクセルデータを取り出すことが必要なのですが、
どなたかどのように記述すればいいのか教えていただきたいです。

335 :デフォルトの名無しさん:2016/03/12(土) 09:03:27.72 ID:NuHx+xBn
>>334
使った事ないので詳しくないけど
その警告部分に改善策が示されてないかな?
grabberの型が不明なのでエスパー出来ないが
ofPixelsRef pixels = grabber.getPixels();
ofPixels& pixels = grabber.getPixels();
ofPixels_<unsigned char>& pixels = grabber.getPixels();
unsigned char * pixels = grabber.getPixels().getData();
このあたりかな
読み込みだけならconstで。

336 :デフォルトの名無しさん:2016/03/13(日) 00:06:45.03 ID:Q68izjaV
templateを使って、引数をそのまま構造体の要素にするプログラムを書いています。

template<class STR,class ... ARGS>
void event(ARGS ... args){
STR str = {args};
...
}

STRの部分に何かしらの構造体を入れると、関数内のstrに代入されるという代物です。
このSTRの部分にクラスを入れると'エラー C2440 '初期化中': 'initializer list' から 'Stage::TC' に変換できません。'
というエラーを吐きます。何とかクラスで似たような動作をさせられないでしょうか?

337 :デフォルトの名無しさん:2016/03/13(日) 02:12:46.39 ID:kPqg6a4C
{args}ではなく{args ...}にすればクラスだろうと普通に動作するだろ
http://ideone.com/dhfjzP

338 :デフォルトの名無しさん:2016/03/13(日) 11:40:24.96 ID:Q68izjaV
そういえば、templateをまとめて記述する方法ってないの?
いちいち同じtypenameに対して
template<〜>
void func1(){}
template<〜>
void func2(){}
template<〜>
void func3(){}

ってするの面倒なんだけど

339 :デフォルトの名無しさん:2016/03/13(日) 12:07:02.45 ID:agB5sXDj
長くなるようなら#defineでも使っとけ

340 :デフォルトの名無しさん:2016/03/15(火) 17:59:57.73 ID:IZ6+yR9m
キーボード入力後の改行をなかったことにできますか?
入力されたすぐ右に文字を出力したいのです。
fgets(buf, sizeof(buf), stdin);
printf("\b");
では入力行の右端まで行ってしまいます。
また入力開始位置は可変です。つまり入力された文字列の文字数から行末は算出できないのです。
どこか抜け道はありますか?

341 :片山博文MZ ◆T6xkBnTXz7B0 :2016/03/15(火) 18:04:43.83 ID:zLB+iwEH
>>340
コンソール端末の色情報やキャレットの操作は、
ncursesというライブラリを使うとできる。

342 :デフォルトの名無しさん:2016/03/15(火) 22:06:47.48 ID:hLONNm58
ドラッグアンドドロップなんだけど
explorer.exeからD&Dすると [ データ形式(49868) 形式名(Shell IDList Array) ] [ データ形式(CF_HDROP) 形式名(InShellDragLoop) ] だけど
IShellFolder の GetUIObjectOf で IID_IDataObject 指定だと [ データ形式(CF_HDROP) 形式名(Shell IDList Array) ] になる
しかし受け手のほうはいずれも CF_HDROP 形式に対して DROPFILES 構造体の方法で取得できる

CF_HDROPは定数値(15)のはずだし
クリップボードフォーマットとして登録されているはずの形式がなぜ変わってしまっているのですか?
またShell IDList ArrayやInShellDragLoopの内部形式はどうなっているのかわかりますか?

343 :デフォルトの名無しさん:2016/03/15(火) 23:10:37.50 ID:hLONNm58
「またShell IDList ArrayやInShellDragLoopの内部形式はどうなっているのかわかりますか?」
については自己解決した感じです

GlobalLock により取得したメモリをdumpしてみたところすべて中身は同じでした

344 :デフォルトの名無しさん:2016/03/15(火) 23:16:20.40 ID:hLONNm58
ごめんなさい>>343は取り消しですorz

345 :デフォルトの名無しさん:2016/03/15(火) 23:34:36.66 ID:hLONNm58
すみません>>342-344
一旦取り消します
根本的な部分でミスしてました
形式名を表示する部分が間違っていてデータ形式と形式名のペアが一致していないだけでしたorz

346 :デフォルトの名無しさん:2016/03/15(火) 23:39:00.56 ID:XI218Dpy
質問があります

vector<T>同士でそれぞれの要素ごとにtransform関数で演算する2項演算子のテンプレートを作り
T = vector<double>でインスタンス化してtransformからT = doubleでインスタンス化
したものを再帰的に呼ぼうと思ってるのですが
multipliesとdividesではうまく行きますがminusとplusではうまく行きません
もしかしてすでにこの型のオーバーロードがあるのでしょうか?

347 :デフォルトの名無しさん:2016/03/16(水) 02:23:21.71 ID:/xZFuugQ
>>346
plus,minusのオーバーロードが原因ではなく
stdにstd::operator+(operator-)があると(reverse_iteratorやstring用など)
std::plus(minus)からは
自分で書いたグローバルのoperator+(operator-)が隠蔽されて見えなくなるのが原因

348 :デフォルトの名無しさん:2016/03/16(水) 14:05:43.23 ID:JUYIKEKS
>>335
遅れてすみません
ありがとうございました

349 :デフォルトの名無しさん:2016/03/20(日) 00:48:49.68 ID:Hvn8A5ZD
ちょっと質問ですが

class A
{
private:
ULONG RefCount;
public:
A() : RefCount(1){}
~A(){}

ULONG Release()
{
ULONG ret = (ULONG)InterlockedDecrement(&_RefCount);
if(ret == 0){
delete this;
}
return (ULONG)_RefCount;
}
};

この場合、delete this; した後でも メンバ変数の RefCount にアクセスするのは問題ないのでしょうか?

350 :デフォルトの名無しさん:2016/03/20(日) 00:53:03.96 ID:9URbr6kI
>>349
問題あ〜る

351 :デフォルトの名無しさん:2016/03/20(日) 21:17:45.36 ID:Hvn8A5ZD
ありがとうございます
やっぱりそうですね
(※下の_RefCountはRefCountの間違いですが)

ULONG Release()
{
ULONG ret = (ULONG)InterlockedDecrement(&_RefCount);
if(ret == 0){
delete this;
}
return ret;
}

というような、delete this;以降にthisを参照するコードを書かなければ問題ないということでOKですよね

352 :デフォルトの名無しさん:2016/03/21(月) 10:46:27.54 ID:5Pe+8Vgq
enumに対して operator== と operator!= を定義する方法ってありますか?
visual studio 2015使ってますが 'operator==があいまいです'というエラーが出てしまいます。
コードはこんな感じにしています
Moveがenum型です

inline Move moveRaw(const Move m) { return Move(m & 0x03ffffff); }
inline bool operator == (const Move m1, const Move m2) { return int(moveRaw(m1)) == int(moveRaw(m2)); }
inline bool operator != (const Move m1, const Move m2) { return !(moveRaw(m1) == moveRaw(m2)); }

353 :デフォルトの名無しさん:2016/03/21(月) 11:09:44.03 ID:/QOiUUU0
伝統的enumはintのエイリアスみたいなものだ。
enum classならできるだろ。

354 :デフォルトの名無しさん:2016/03/21(月) 12:35:55.65 ID:wdcchfji
>>352
そのままできるだろ
http://codepad.org/HIxuVy1v
ほかのところがエラーの原因

355 :デフォルトの名無しさん:2016/03/21(月) 14:26:36.82 ID:PBSyTjzr
オーバーロードの中でエラー出してるやろ

356 :デフォルトの名無しさん:2016/03/21(月) 16:52:02.88 ID:5Pe+8Vgq
>>354
ほんとですね。ありがとうございます!
ほかの原因を探してみます。

357 :デフォルトの名無しさん:2016/03/21(月) 17:05:14.43 ID:5Pe+8Vgq
>>354のコードをコピペしてコンパイルしてみましたがやはり同じエラーが出ます
どうやらvisual studio 2015だと出てしまうようです

358 :デフォルトの名無しさん:2016/03/21(月) 17:30:46.19 ID:tX8tczo7
Visual Studio 2015 の専用スレッドがあるみたいだから
そちらで質問すればエラーの理由と対処法が分かるかも。

Part4 が今年になって建てられているようだ。

359 :デフォルトの名無しさん:2016/03/21(月) 20:11:48.11 ID:5Pe+8Vgq
>>358
ありがとうございます。気が向いたらそちらに質問させていただきます
とりあえずoperatorではなく関数で対応するようにしました。

360 :デフォルトの名無しさん:2016/03/21(月) 20:52:32.91 ID:tZIQ77lC
/clrオプションを指定してコンパイルしているとそんな状況でエラーが出ることもあるようだな

361 :デフォルトの名無しさん:2016/03/21(月) 21:36:35.66 ID:fU37GtsM
>>347
遅くなりましたが、ありがとうございます
解決しました

362 :デフォルトの名無しさん:2016/03/22(火) 15:16:38.18 ID:bNAVuy+v
C言語の初心者として、ポインターの仕組みについて勉強をしています。
下記のプログラムはコンパイルできますが、実行すると
segmentation faultになってしまいます。どこを修正
すればよいのでしょうか?よろしくお願いします。

http://ideone.com/RYIQPJ

363 :デフォルトの名無しさん:2016/03/22(火) 15:21:37.96 ID:idYykKmC
ひとまず行番号が紛れ込んでるので
消してから来てくれるといいかも

364 :デフォルトの名無しさん:2016/03/22(火) 15:27:15.48 ID:IkdBLUXL
a = (char**)malloc(sizeof(char*) * 2);

365 :デフォルトの名無しさん:2016/03/22(火) 16:51:41.03 ID:0b4iocXG
*a = (char*)malloc(128 * 2);

366 :デフォルトの名無しさん:2016/03/22(火) 16:56:04.92 ID:cRV6j0bX
もしかして64bitと64バイト間違えてる?

367 :デフォルトの名無しさん:2016/03/22(火) 22:18:25.75 ID:icYWCtsj
>>362
a+1 の領域が確保されてないから 364 のように確保する。

368 :362:2016/03/22(火) 23:29:49.69 ID:bNAVuy+v
みなさんありがとうございました。
分からない警告が出ますが、想定内の実行はできました。

test7.c:7:16: warning: incompatible implicit declaration of
built-in function ‘malloc’

>>367
レスありがとうございます。実行不可の意味が分かりませんでした。
だからsegmetation faultなのですね。

369 :デフォルトの名無しさん:2016/03/23(水) 00:00:31.86 ID:KYuvKtO/
#include <stdlib.h>

370 :デフォルトの名無しさん:2016/03/30(水) 13:44:09.99 ID:G7ZCwJy+
c言語の中級目指しています。
以下のプログラムで3つわからないところがあります。
よろしくお願いします。

1
static void
free_cmd(struct cmd *cmd)
{
free(cmd->argv);
free(cmd);
のところですが、free(cmd)のみでは構造体の領域
開放がおこなわれないのでしょうか?

2
static void*
xrealloc(void *ptr, size_t size)

関数を呼び出す側からみれば、void **ptrにした方が
いいのではないのでしょうか?

3これは根本的に理解できいません。

cmd->argv[cmd->argc] = p;

この構造体のメンバーの配列には、どのような内容が
入力されていくのでしょうか?特に入力順番がわかりません。

アルゴリズムの問題だと思います。自分の実験した小プログラム
でにおいて、配列には’長い文字列のアドレス’から’短い文字列アドレス’の
順に入力されました。
自分はソースコードを読んでるとき逆に読んでました。

371 :370:2016/03/30(水) 13:45:26.83 ID:G7ZCwJy+
すみません。ソースコード貼忘れてました。

http://lifeloveregret.googlecode.com/svn/trunk/c/answer/LinuxProgramming-samples/sh1.c

372 :片山博文MZ ◆T6xkBnTXz7B0 :2016/03/30(水) 14:10:56.06 ID:GvtcJfJR
>>370
1 cmd->argvとcmdは違うメモリーブロック。解放されない。

2 xreallocは標準関数reallocをまねて作られている。
第一引数がvoid**で戻り値なしなら、エラーが起きたときの扱いがややこしくなる。

373 :デフォルトの名無しさん:2016/03/30(水) 19:33:40.70 ID:k/+VMgXF
>>370
realloc() は使わないほうがいい,エラー処理をまともに実装しようとすると realloc() の存在が悪になる

374 :デフォルトの名無しさん:2016/03/30(水) 23:34:32.54 ID:jnPwp4pc
>>370-371
3
cmdlineを空白文字で単語に区切って左側の単語からその単語へのポインタが入力されていく
例えばcmdlineが

375 :374:2016/03/30(水) 23:38:15.05 ID:jnPwp4pc
あれ途中で消えた?
3
cmdlineを空白文字で単語に区切って左側の単語からその単語へのポインタが入力されていく
例えばcmdlineが”one two three”という文字列へのポインタだった場合
cmd->argv[0]にはoneの先頭のoへのポインタ
cmd->argv[1]にはtwoの先頭のtへのポインタ
cmd->argv[2]にはthreeの先頭のtへのポインタ
が代入される

376 :デフォルトの名無しさん:2016/03/31(木) 06:33:12.34 ID:sYy1gdjM
>>373 の件、もう少し詳しく教えてもらえまいか。

エラー処理において realloc() の存在が害になる状況を
例示してくれれば、その先は自力で考えたいのだけど…。

377 :デフォルトの名無しさん:2016/03/31(木) 07:47:07.21 ID:X8/ytHGi
>>376
realloc() を二回繰り返す動作をサブ関数としてまとめるとする.
realloc()の返り値(正常/異常)もサブ関数から返すとする.
これで考えてみて.
C++ には new/delete しかない.

378 :デフォルトの名無しさん:2016/03/31(木) 09:44:45.48 ID:90m4Y48w
vector内で引数と最初に合致する要素のインデックスを返す関数を作りたくて

template <typename TYPE> int std::vector<TYPE>::find_first(const TYPE element){
 for(int i = 0 ; i < size() ; ++i){
  if(element == at(i)) return i ;
 }

 return -1 ;
}

と書いたのですが、以下のエラーが出ます。
error C2039: 'find_first' : 'std::vector<TYPE>' のメンバーではありません。
テンプレートの文法もちょっと自信なくて、テンプレートが間違っているのか
そもそも外部で新たに定義することはできないのかわかりません。
どうしたら関数を作れますか?

379 :デフォルトの名無しさん:2016/03/31(木) 10:14:25.72 ID:n/eFTOI8
>>378
外部で新たにvectorのメンバ関数を定義することはできない
vectorを引数にとる普通の関数として定義する

template <typename TYPE> int find_first(const std::vector<TYPE> & vec, const TYPE element){
 for(int i = 0 ; i < vec.size() ; ++i){
  if(element == vec.at(i)) return i ;
 }

 return -1 ;
}

vector<int> v;
find_first(v, 100);

380 :デフォルトの名無しさん:2016/03/31(木) 13:32:36.50 ID:90m4Y48w
>>379
vectorも引数にすればよかったんですね
ありがとうございます

381 :370:2016/03/31(木) 16:30:35.74 ID:82dYqFlv
みなさんレスありがとうございました。
>>375
丁寧な説明ありがとうございます。
そのように動くとは思っていましたが理解は
できていませんでした。

次のアルゴリズム実験プログラムで確認できました。
ただprintfの置く行は気をつけないと、とんでもない
結果がおきました。このアルゴリズムの場合printfは
”式の前”に置かないといけないようですね。
http://ideone.com/pWrZu5

何かコメントがありましたら、お聞かせ下さい。
まだアルゴリズムの理解は足りていないので。

382 :デフォルトの名無しさん:2016/03/31(木) 17:45:56.41 ID:sYy1gdjM
>>381
本当にリンク先のプログラムで動いてるかな。
最初の "*p1=..." に無意味な文字列が表示されないか?

少なくとも20行目と21行目は順番が逆だと思う。元のソースだと、
20行目 printf("*p1=%s\n",p1); に最初に到達したとき
p1が未設定、つまりどのアドレスを指しているか分からない状態で、
かなりマズい、というかCでは絶対に避けるべき状況になってる。


もうひとつ細かいネタ。同じく20行目(修正後21行目)の
printf("*p1=%s\n",p1); を
printf("*p1=[%s]\n",p1); に変えると、
「文字列の先頭/末尾の空白文字」がうっすら見えるようになるよ。

383 :デフォルトの名無しさん:2016/03/31(木) 18:13:37.14 ID:LEcDKdjY
>>377
何が問題だと言ってるの?
reallocを2回以上繰り返しても最後の結果だけ返せばいいでしょ。普通に作れば

384 :デフォルトの名無しさん:2016/03/31(木) 20:17:50.26 ID:X8/ytHGi
>>383
1回成功して1回失敗した場合に適切に作れない

385 :デフォルトの名無しさん:2016/03/31(木) 21:06:05.74 ID:ScXuRFRf
>>384
> 1回成功して1回失敗した場合に適切に作れない
お前個人の話?
なら納得するけど w

どこが難しいのかさっぱりわからん
まさかと思うが、戻り値は一つで両方失敗したことと片方だけ失敗したことを知りたいとかじゃないよな

386 :デフォルトの名無しさん:2016/03/31(木) 21:13:55.35 ID:X8/ytHGi
>>385
いやいや,1回 realloc() に成功すると,realloc() に渡したポインタは無効になる事実が問題なんだよ
realloc() 複数回を一つのサブ関数にまとめたとき,中途半端に成功した事実が呼び出し側で把握できなくなってしまう
呼び出し側で持っていたもともとのポインタがサブ関数で無効になってしまう
(サブ関数で有効な最後のポインタを返してくることにするのも,それはそれで扱いに困る)

387 :デフォルトの名無しさん:2016/03/31(木) 21:21:26.04 ID:ScXuRFRf
>>386
要件ちゃんと書いてくれ
なんか失敗したら元の領域保持しろとか realloc に無理難題押し付けて使えねー
って言ってるとしか思えん

388 :デフォルトの名無しさん:2016/03/31(木) 21:30:08.92 ID:X8/ytHGi
>>387
以下の仕様を満たす関数sub() を記述せよ
char *sub(char *p, int m)
p は malloc() で確保されたナル文字列の先頭へのポインタ
文字列 p の後ろに「2 から数えて m 番目の素数の十進法表現」を接続し,さらにもう一度後ろに p を接続した文字列の先頭を指すポインタを sub() は返す.
sub() の返り値は最終的に free() されることを前提にする.

結局 realloc() を使わないで実装することになる

389 :370:2016/03/31(木) 21:51:26.90 ID:82dYqFlv
>>382
レスありがとうございます。
20行と21行を変えると”表示”は上手くいきませんでした。

おしゃる通り”一回目ののp1”は問題あるので、
結局13行目に

*p1=NULL;

を付け加えました。

390 :370:2016/03/31(木) 21:55:12.26 ID:82dYqFlv
>>389 自己訂正です

*p1=NULL;→ p1=NULL;

391 :デフォルトの名無しさん:2016/03/31(木) 22:12:46.70 ID:CIggS/vG
>>388
なんか持論に合うように無理やりな仕様を持ち出しているような気がする

392 :デフォルトの名無しさん:2016/03/31(木) 22:20:40.97 ID:X8/ytHGi
>>391
そう感じさせるのは悪かった,そうだな,sub() は与えられた asciiz 文字列から新たな asciiz 文字列を作る下請け関数として考えてくれ
失敗したら一律に null を返す,でもいいかもしれないね

393 :デフォルトの名無しさん:2016/03/31(木) 22:25:59.79 ID:qF1fcJk9
すいません、教えてください。

以下Rubyスクリプトと等価なCコードを書こうとおもったらどう書けばいいですか。
特にfとgの型はどう宣言したらいいですか?

g=nil

f=lambda{
print "f";
return g
}

g=lambda{
print "g"
return f
}

a=f
10.times{a=a.call}

394 :デフォルトの名無しさん:2016/03/31(木) 22:28:43.81 ID:X8/ytHGi
>>393
http://echo.2ch.net/test/read.cgi/tech/1448704298/690

395 :デフォルトの名無しさん:2016/03/31(木) 22:36:47.05 ID:Tq9AKUqv
>>388
p が指す文字列の長さはわかるから素数の 10 進表現の領域確保する時に一緒に確保すれば realloc 一回でいいだろ...
プログラミング能力無さすぎるだけじゃん w

396 :デフォルトの名無しさん:2016/03/31(木) 22:53:29.30 ID:X8/ytHGi
>>395
まあ realloc() を複数回実施するときの困難をお題にしたかったんだけどね
次々と 文字列へのポインタが姿をかえて関数をわたっていくような場合とかね

簡単な記述でrealloc() の問題を指摘できなかったのは残念

397 :デフォルトの名無しさん:2016/03/31(木) 23:32:54.79 ID:Tq9AKUqv
>>396
結局自分では何も困ってなくて、どこかの受け売りで realloc ガー
って騒いでたってオチかよ...

398 :376:2016/04/01(金) 08:28:39.68 ID:mYua7P08
昨日の ID:X8/ytHGi (レス数が多いのでリンクは略) の
「内部で複数回のrealloc()が必要な下請け関数」の議論は
詳しい説明でよく分かったよ。
下請けの途中で(どの段階でも)失敗したら、呼び出し前の状態が
そのまま残っていて欲しいってのは自然な要求だしね。

ただ、内部でのrealloc()が1回で済むように下請け関数を作る、
という対処もありうるよな。それが常に可能かはまた別の問題だけど。

399 :デフォルトの名無しさん:2016/04/01(金) 10:41:33.52 ID:cPCkQ397
論点ずらして突っ込むバカは無視していいよ

400 :デフォルトの名無しさん:2016/04/01(金) 19:29:06.39 ID:cIUJiKQr
>>398
> 下請けの途中で(どの段階でも)失敗したら、呼び出し前の状態が
> そのまま残っていて欲しいってのは自然な要求だしね。
呼び出し前の状態ってなんのことを言ってるのかによるけど、領域の内容の話なら残ってるだろ
>>386 は元々のポインタが無効になるのが問題とか言ってるけど、領域拡張するなら元の領域と違う場所に確保するしかないんだから、無理難題にしか見えない
new/delete ならうまく行って、realloc でダメな例を示してほしいよ

401 :デフォルトの名無しさん:2016/04/01(金) 19:48:04.22 ID:U/2PmOzZ
>>398
どちらにせよrealloc()の仕様を理解していればいいだけの話
これから自分が作ろうとする関数の実装に向かないと思うなら使わなければいいってだけじゃん
悪だとかrealloc() の問題って言っているのは仕様を理解せずに無理にrealloc()を使おうとするからだろ?

realloc() 自体は「メモリアドレスが変わってもいいから、要求されたサイズのメモリ領域を確保して欲しい」という要求には答えている
”元のメモリ領域拡張だけを試みる関数だったら”と言うのもあるが「拡張に失敗するなら元のサイズで良いや」ってのはあまりいないだろう
結局プログラマは、拡張に失敗したなら必要なサイズのメモリ領域を確保し、そこに元のデータをコピーして、古いメモリ領域は開放するだろ?
realloc()の仕様そのまんまじゃん
ならばrealloc()の仕様もまた 自然な要求 に答えただけだよ

402 :デフォルトの名無しさん:2016/04/02(土) 21:11:02.16 ID:R7MxdGwK
C言語の標準入力って結局のところ何がいいのさ

403 :デフォルトの名無しさん:2016/04/02(土) 21:30:41.88 ID:Tx7DR71P
標準入力の良さを語れと言っているの?
標準入力が複数あってどれを選べばいいか聞いてるの?
そもそも何を言っているの?

404 :デフォルトの名無しさん:2016/04/02(土) 22:55:27.99 ID:EwvTfYNw
getchar()とかscanf()とかの話でしょ

405 :片山博文MZ ◆T6xkBnTXz7B0 :2016/04/02(土) 23:07:16.64 ID:k91t9LjX
scanfは試験に出るから覚えてるだけで、現実にはfgetsとsscanfをよく使うよ。
しかしfgetsには字数制限があるので、std::getlineに軍配が上がる。
getsはセキュリティ上使っちゃダメ。

406 :デフォルトの名無しさん:2016/04/03(日) 06:38:51.26 ID:g2YA8l0n
標準入力の便利なところはズバリ、
パイプで前段の出力を受け取れることなんだが、
GUIツールを作る人にはピンとこない話かもな。

昔なら「コマンドライン引数として対象ファイルが与えられていたら
そのファイルを処理し、与えられなかったら標準入力を処理する」
という動作をさせたものだが、今ではちょっと気の利いたツールでも
「コマンドライン引数で対象ファイルを指定されなかった場合は
GUIのウインドウを表示する」だよね。

407 :デフォルトの名無しさん:2016/04/03(日) 08:54:06.50 ID:iMLPYfGS
>>405
fgets の字数制限はループにして,はずせばいいよ

408 :デフォルトの名無しさん:2016/04/03(日) 14:33:51.70 ID:azZmmaKg
>>402
コンソールでキーボード入力しても
テキストファイルから読み込んでも
テキストを吐くツールからの出力でも
ネットワークごしに受信したデータでも

みんな同じ処理で取れるからだよ

今時はコマンドコンソールじゃなくてCGIの方がウケると思うけどな

409 :デフォルトの名無しさん:2016/04/03(日) 15:05:13.67 ID:1hzZ1h9p
やっぱり曖昧さを含む文章で質問すると駄目だね

410 :デフォルトの名無しさん:2016/04/05(火) 02:38:42.14 ID:yVKcFgqN
大抵のデバッガはある時点での関数呼び出しの履歴やその関数にどういった値が渡されたかを見ることができますが、このようなプログラムを作るのは難しいですか?

411 :デフォルトの名無しさん:2016/04/05(火) 02:48:43.79 ID:KWKZQVNf
c++で直接定義する関数とクラスメソッドの違いというか扱いの差ってなんですか?
オブジェクト言語から入ってるので直接定義する関数はオブジェクト志向でいうなんとかみたいな感じで説明してもらえるとありがたいです

クラスメソッドと直接定義する関数は普通に呼んだり呼ばれたりできるんでしょうか?

412 :デフォルトの名無しさん:2016/04/05(火) 06:09:26.93 ID:lqoS60o2
苦しんで覚えるC言語て本にscanfは禁止令が出てる会社学校があるとありますが
scanf関連は覚える必要が無いのでしょうか?
初学者の質問ですがお願いします^^;

413 :デフォルトの名無しさん:2016/04/05(火) 06:29:12.49 ID:zRkYu6zn
>>412
自分が完全に支配できるのなら、別に使っても良い
ユーザーの入力なんかの制御できないものには使わぬ方が良い

414 :デフォルトの名無しさん:2016/04/05(火) 08:38:57.64 ID:+yE88Sty
実際には出来る限り使わないようにするけど
scanfわかりません = C言語わかりません と同じ意味だよ

初心者が必ずハマる罠が待ってるし最後でいいから必ずおさえること

415 :デフォルトの名無しさん:2016/04/05(火) 08:59:32.25 ID:09gKpNs2
scanf使ったことないな
そもそもstdio自体ここ何年も使ってない

416 :デフォルトの名無しさん:2016/04/05(火) 13:16:57.69 ID:vmxwEzAv
初学者はscanfを避けるんじゃなく、理解した上で使わないことが重要

417 :デフォルトの名無しさん:2016/04/05(火) 13:27:37.54 ID:D/kBJTR9
>>410
そうしたプログラムを作るには
・より専門的な領域での知識とその領域に限定的な技術を習得する必要がある
・資料の絶対数が少ないうえに専門家向けの物が多い
といったあたりで普通のプログラムを作るときと比べれば難易度は高めといえるな

418 :デフォルトの名無しさん:2016/04/05(火) 21:01:44.32 ID:LI4Y2V/y
>>410
コンパイラーやコンパイルオプションによって渡し方が違ったりするので、きちんと作るのは大変
>>417 の言うようにドキュメントが入手できるとは限らんし
色々決め打ちでいいならなんとかなると思う
ただしアセンブラ使える程度の知識は必須

419 :デフォルトの名無しさん:2016/04/05(火) 21:04:56.19 ID:LI4Y2V/y
>>411
> オブジェクト言語から入ってる
世の中にオブジェクト指向言語がいくつあると思ってるんだよ

420 :デフォルトの名無しさん:2016/04/05(火) 21:30:56.01 ID:Kw+zELRm
>>419
レスありがとうございます。
言語特定した方が説明しやすいのでしょうか?
正確にはas3から学習始めたのですが少しマイナーかなと……
androidJava、objective-cならある程度わかるのでその辺りで説明していただけるとありがたいです。

421 :デフォルトの名無しさん:2016/04/05(火) 22:59:54.69 ID:+yE88Sty
>>410
>クラスメソッドと直接定義する関数は普通に呼んだり呼ばれたり
出来る

C++では非メンバ関数と呼ぶ
といっても大した違いはない

元々Cにクラスを後付して作られた言語だから
古いライブラリはクラスを使ってない
クラス主体がいいならそうすればいい

あえて違いを挙げるならクラスメンバ関数はわずかに遅くなるから
その辺がどうしても許せなければクラスを避けるということもあるけど

422 :デフォルトの名無しさん:2016/04/06(水) 00:43:46.87 ID:Py7RTr3F
Linux上での名前解決のAPI、getaddrinfo()について
質問があります。

関数の形は以下です。

int getaddrinfo( const char *node,const char *service,
const struct addrinfo *hints,struct addrinfo **res)

最後の引数,"struct addrinfo **res"がどうして、
ダブルポンタにしなくてはならないのか、分かりません。
どなたか、簡単に教えてくださらないでしょうか?

423 :デフォルトの名無しさん:2016/04/06(水) 00:56:07.64 ID:7pIXqQc2
質問です。
class Data{int a;int b;int c;
};
std::vector<Data>v;
Data d ={1,2,3};
v.push_back(d);

って感じでvectorにクラスとか構造体をpush_backした時って
要素を全部コピーして新しくメモリにデータを作っているんですか?
だとすると、
Data d;
for(int n=0;n<10;n++)v.push_back(d);
みたいに書いた場合、vのどの要素も同じポインタを示してるんじゃなくて、
push_backする度に別のメモリにデータを作ってるんですか? お願いします。

424 :デフォルトの名無しさん:2016/04/06(水) 01:08:17.22 ID:74XNtOnL
>>422
関数内でメモリを動的に確保してそのポインタを(*res)に代入して返すから

425 :デフォルトの名無しさん:2016/04/06(水) 01:11:44.36 ID:74XNtOnL
>>423
> push_backする度に別のメモリにデータを作ってるんですか?
その通り

426 :デフォルトの名無しさん:2016/04/06(水) 01:13:31.72 ID:7pIXqQc2
>>425
ありがとうございました。これで生きていけます。

427 :デフォルトの名無しさん:2016/04/06(水) 17:30:37.94 ID:9PDK4V7Z
素人ながら将棋ソフト(Apery https://github.com/HiraokaTakuya/apery)のソースコードを読めるようになりたいと思っています
しかし、C++の入門書を読んでから眺めてみても、実物のソースコードは一行に複雑な処理が押し込まれており、何をしているのかなかなか読めません
恐らく一般的な開発手法が身についていないと読むことは到底出来ないのだろうと推測していますが、なにか良い演習教材などがあれば教えて下さい

また、次の理由が理解を遅らせているような気がします
これらの点を個別に身につける方法があれば教えて下さい
・自分が一般的な開発手法が身についていないこと
・ヘッダファイルの中身が入門書レベルでは意味不明なことと
・動かしながら挙動を調べたくてもステップ実行の方法がわからないたこと

よろしくお願いします

428 :デフォルトの名無しさん:2016/04/06(水) 17:51:42.30 ID:JMybFTpe
>>427
すべてわかる必要なし
標準関数、STLですらわかってないのが大半だろ。
たぶん

429 :デフォルトの名無しさん:2016/04/06(水) 17:54:46.80 ID:/IBevvIO
>>427
まず大まかな流れだけ追う
後は1つ1つ気になった所だけ見ていくでいいよ

430 :デフォルトの名無しさん:2016/04/06(水) 18:09:07.31 ID:goAIGnqr
見たいのは手の評価の部分だろうから score で検索して
周辺を見ていくのがいいんじゃないかな

コメントや関数名などを見て必要なさそうな所はバンバン切り捨ててよし

431 :デフォルトの名無しさん:2016/04/06(水) 19:45:01.60 ID:qohl0JPc
>>427
う〜ん、将棋ソフトのアルゴリズムに詳しいの?
ならいいけど、そうでないならもっと簡単な奴から始めた方がいいんじゃね?
例えばリバーシ
http://www.geocities.co.jp/SiliconValley-Bay/4543/Osero/

432 :デフォルトの名無しさん:2016/04/06(水) 20:43:52.53 ID:l0k4MgTU
ざっとしか見てないけどそこまで突飛なコードはないように見える
あとこういうボードゲームはある程度同じようなコードになりやすいからそれに慣れてないだけじゃないか
moveとかposとかもろでしょ

433 :デフォルトの名無しさん:2016/04/06(水) 20:53:28.86 ID:+DLeHnYt
>>427
対戦型のボードゲームのAIアルゴリズムに関する基礎知識があると良いのでは。
オライリーのアルゴリズム クイックリファレンスという本に、ゲーム木のアルゴリズムがいくつか説明されているよ。
ミニマックス法、negmax法、アルファベータ法とか。
ゲーム木以外にも、ソートや最短経路探索とか、いろいろ扱っていて、参考になると思うよ。

434 :デフォルトの名無しさん:2016/04/06(水) 21:15:57.98 ID:H8hE7WlY
コリコリにチューニングされたコードを部外者が読むのは相当しんどいと思うんだが。
長い年月をかけてぐちゃぐちゃになってそう。見てないけど。

435 :422:2016/04/07(木) 23:15:19.36 ID:Xs8CGXEi
>>424
レスありがとうございます。ただ、まだ理解できていません;;
本体のソースは以下の通りです。
http://lifeloveregret.googlecode.com/svn/trunk/c/answer/LinuxProgramming-samples/daytime.c

解説図によるとリストを作成し
**resのダブルポインタによって
*res→構造体1→構造体2……

となるようですが、
*resのシングルポインタで
res→構造体1→構造体2……

とはできないのでしょうか?

どなたでもよろしいのでおしえてくださらないでしょうか?

436 :デフォルトの名無しさん:2016/04/08(金) 00:21:41.46 ID:92gpEbvG
>>435
深く考えるな

「作成した文字配列」を返す関数を作ってみろ
ただし return によってそのアドレスを返してはダメだ
これができればおのずと理解できる

ヒントは

「おばあちゃんの家に箱を持っていくとりんごを入れてくれます」 ・・・シングルポインタ
「おばあちゃんの家に行くと箱に入ったりんごをくれます」 ・・・ダブルポインタ

変数というのは何かを入れる箱だと教わった記憶はあるかな?
普通に引数に変数を指定しても「箱」が変わってしまうために、関数で中身を変えても元の箱の中身が変わることは無い
じゃあ箱を用意してその箱を引数に渡そうってのがシングルポインタ

では箱も相手が用意する場合、その箱ごと貰うためにはどうしたらいいか?
箱を入れる箱を用意して、そこに箱ごと入れてもらおうってのがダブルポインタ

typedef を知っているなら「りんごを入れる箱」を定義して、それを入れる箱という意味でシングルポインタとして扱っても良い

437 :デフォルトの名無しさん:2016/04/08(金) 00:48:39.10 ID:DBhuX0XJ
#if LOGOUT
logout("hoge");
#endif
とするといちいち#ifをかかなければいけなくてきたなくなるんですが
なにかかっこいいほうほうありますか?
void logout(const char* str)
{
#if LOGOUT
//なにがし
#endif
}
だと
logout("hoge");の度に無駄に
引数をスタックにpushして
リターンアドレスもpushして
callして・・・
と無駄ですよね

438 :デフォルトの名無しさん:2016/04/08(金) 01:05:23.41 ID:92gpEbvG
>>435
ダブルポインタは「配列を受け取る箱のアドレスを示している」ってのを理解できれば

439 :デフォルトの名無しさん:2016/04/08(金) 01:57:31.43 ID:DnxxMOIr
>>437
最適化で消えるから気にしないってのが一番スマートかと

440 :デフォルトの名無しさん:2016/04/08(金) 02:14:39.63 ID:LFrj8SRS
>>437
元のLOGOUTとlogoutの使い方がよくわからんがな

void logout_impl(const char* str) {...}
#if LOGOUT
#define logout(s) logout_impl(s)
#else
#define logout(s) /*empty*/
#endif

441 :デフォルトの名無しさん:2016/04/08(金) 02:36:19.83 ID:LFrj8SRS
>>435
> *resのシングルポインタで
> res→構造体1→構造体2……
>
> とはできないのでしょうか?
機能的にはそれでもいいんだけどな

でもそれだとリストの最初の要素を使うときには
res.ai_addr
二つめ以降の要素を使うときには
p->ai_addr
と.と->を使い分けるほうが面倒くさくても自然なやり方になってしまう
だったらresもポインタにして
res->ai_addr, p->ai_addr
として自然に一貫したやり方で扱える方がいいだろ

他にもポインタでなく値で返すと
後で解放用の関数に渡してメンバの解放をする必要があることを忘れてしまう
とかの理由もあってそういう設計になっている

442 :デフォルトの名無しさん:2016/04/08(金) 02:49:08.36 ID:DBhuX0XJ
>>440
引数が可変なんですが

443 :デフォルトの名無しさん:2016/04/08(金) 03:43:08.71 ID:DnxxMOIr
>>442
可変長でもマクロにできるよ、古いと対応してないかもしれんが
#define logout(...) logout_imple(__VA_ARGS__)

444 :422:2016/04/08(金) 18:24:00.80 ID:E6f7kqrG
>>436 >>441
レスありがとうございました。
ようやくわかりました!
とくに441さんの説明でわかりました。
恥ずかしい話ですが、理解するまで2日ぐらいかかりました;;
英語のサイトも検索してみました。

C言語とUNIXのAPIは、それなりに難しいのだと痛感して
おります。当たり前でしょうが、
通信プログラムはJavaの方がもっと単純だった記憶があります。

445 :デフォルトの名無しさん:2016/04/09(土) 14:43:14.34 ID:zLInGFTB
構造体のアラインメントについて、結果がすべて256になるよう以下のコードを書いたのですが意図した通りにはいきません。
またideoneとVisual Studio 2015とで異なる結果が得られます。
alignasやaligned_storageを意図通りに(256になるように)働かせるにはどこを直せばよいですか。

http://ideone.com/3fVf9P
size=4, align=4.
size=4, align=4.
size=4, align=4.
size=256, align=256.

Visual Studio の出力(Win32/x64どちらも同じ)
size=256, align=256.
size=256, align=8.
size=256, align=8.
size=256, align=8.

446 :デフォルトの名無しさん:2016/04/09(土) 17:33:12.67 ID:zLInGFTB
ためしにアラインメントを違う値(64)にしたところideoneの出力はすべて64になりました。
たんに256の値が扱う範囲を超えていたということでしょうか。
ただvisual studioのalign=8は変わらずなので、そっちの理由はわからないままです。

447 :デフォルトの名無しさん:2016/04/09(土) 17:48:32.72 ID:4XKJWWPC
手持ちのgcc 4.8.4じゃalignas(256)は
warning: requested alignment 256 is larger than 128 [-Wattributes]
になるけどな
gcc 5.1じゃwarningも出さないでalignasを無視するのか?変だね

448 :デフォルトの名無しさん:2016/04/09(土) 18:02:12.81 ID:2iWpFKOA
どう見てもパディング関連だろ

449 :デフォルトの名無しさん:2016/04/09(土) 18:37:23.72 ID:zLInGFTB
gccについては使ったことがないのでバージョンごとの違いについてもどうこう言えませんが、
パディング関連とはどういうことでしょうか。もう少し詳しく聞きたいです。

450 :デフォルトの名無しさん:2016/04/09(土) 19:03:37.37 ID:4XKJWWPC
>>449
>>445のideoneのはgcc 5.1だよ

451 :デフォルトの名無しさん:2016/04/09(土) 19:56:34.24 ID:6R5fzUhl
まーだダブルポイタとか言ってる子がいるのか
だれがどこで広めてんだダブルポインタって

452 :デフォルトの名無しさん:2016/04/09(土) 21:37:21.06 ID:8imgO17J
だめなん?

453 :片山博文MZ ◆T6xkBnTXz7B0 :2016/04/09(土) 21:41:12.26 ID:1rUso06b
double*と紛らわしいのでダメ。二重ポインタならOK。

454 :デフォルトの名無しさん:2016/04/09(土) 21:41:12.75 ID:7CkGchmN
>>445
構造体のアラインメントは処理系依存なので
同じにしたければパディング部分をダミーのメンバで満たす必要がある

455 :デフォルトの名無しさん:2016/04/09(土) 21:52:03.38 ID:l8xjVqJC
構造体にはalignasが利かないと言っているのか?

456 :デフォルトの名無しさん:2016/04/09(土) 21:53:15.24 ID:8imgO17J
>>453
ああ、言われてみれば確かに

457 :デフォルトの名無しさん:2016/04/09(土) 21:58:00.60 ID:608RlWes
ダブルポイタwww

458 :デフォルトの名無しさん:2016/04/09(土) 23:23:17.65 ID:6PFUIp35
前にもポインタへのポインタのことをダブルポインタって言ってるのがいたな
書いてる人は一般的に通じると思ってるようだけど、何かで使われてる用語なんだろうか

459 :デフォルトの名無しさん:2016/04/09(土) 23:29:30.54 ID:8imgO17J
良いか悪いかは別として、それなりに普及してる語ではあるんじゃないかな
自分も何年も前に聞いたし


どうでもいいけどビット演算に寄るフラグ管理で
foo |= flag; とかfoo &= ~flag; とかやると思うんだけど
なんか使うたびに数秒くらい悩んでしまう。
なんか良い方法ないかな

460 :デフォルトの名無しさん:2016/04/09(土) 23:35:54.23 ID:5KKi1NYz
一旦使われだすと意地でも使う層があるからな
アップキャスト・ダウンキャストとかいう
出典も不明でどこにも定義されてない用語も日本じゃ出回ってる
ウィキペにも乗ってる「型変換」のページに乗ってる(誰が書いてんだあれ)

一方英語のType conversionページには
「In object-oriented programming languages, objects can also
be downcast : a reference of a base class is cast to one of its derived classes.」
とだけ載ってる

461 :デフォルトの名無しさん:2016/04/10(日) 00:07:34.13 ID:zgMwjdkU
>>459
std::bitsetで間に合わないのならtemplateで自前のset/reset/test 関数作っておく。

462 :デフォルトの名無しさん:2016/04/10(日) 00:31:52.56 ID:F8NTR01v
>>451

double pointer でなくて、dual pointerならば
二重のポインタという意味でいいのではないでしょうか。

463 :デフォルトの名無しさん:2016/04/10(日) 00:37:32.74 ID:R2GJbW+a
>>461
std::bitsetか、完全に忘れてたわ。
あとで調べてみよう

464 :デフォルトの名無しさん:2016/04/10(日) 00:45:38.44 ID:lctucWPJ
>>462
dualでもニュアンスに違和感を感じる。
同じオブジェクトを指すポインタが2つある感じ。

465 :デフォルトの名無しさん:2016/04/10(日) 00:47:53.63 ID:lctucWPJ
>>460
流れに乗れない層もどうかと思うぞ。

466 :デフォルトの名無しさん:2016/04/10(日) 01:05:35.34 ID:cxqu8O/1
たんなるポインタへのポインタを特別視して
名前をつけようってのが意味不明で不可解
ひょっとして*と**を別物として認識してんじゃないかって不安になる

467 :デフォルトの名無しさん:2016/04/10(日) 01:29:31.17 ID:R2GJbW+a
int型のポインタのポインタのポインタ、とかまで行くと
流石に言い難いと思うの

468 :デフォルトの名無しさん:2016/04/10(日) 03:00:57.81 ID:ZAuVeIVa
…実は心の中ではptrをぷとらと読んでます

469 :デフォルトの名無しさん:2016/04/10(日) 08:55:55.24 ID:d/pLUTb8
>>460
意地でもウィキペって使うんだな

470 :デフォルトの名無しさん:2016/04/10(日) 20:20:27.62 ID:a4MI7w0Y
「アップキャスト」「ダウンキャスト」って初めて聞いたけど、いかにも和製英語っぽい響きだな

471 :デフォルトの名無しさん:2016/04/10(日) 20:22:07.80 ID:R2GJbW+a
一応、英語っぽいけどね

472 :デフォルトの名無しさん:2016/04/10(日) 20:35:43.88 ID:8kVuH12a
アップキャスト/ダウンキャストは英語圏でもC++の文脈で普通に使われてるから
「用語としておかしい!」とか言い出す困ったちゃんは見たことないなあ
http://stackoverflow.com/questions/8223365/upcast-and-downcast-in-c

473 :デフォルトの名無しさん:2016/04/10(日) 21:44:18.80 ID:engRimKH
>>468
そんな奴いない

474 :デフォルトの名無しさん:2016/04/10(日) 21:59:03.78 ID:Msqh6OQ2
falseの読みをいつも忘れてゴモゴモ言って誤魔化してる
…フォルスだよね?

>>472
少なくとも日本語圏では間違いじゃないよね?
和製英語だろうとなんだろうと説明するのに無いと困るわー
特に今は新人教育(入門編)の時期だし

475 :デフォルトの名無しさん:2016/04/10(日) 22:13:09.08 ID:FNu9TvqZ
キャストって明示的な型変換のことでしょ?
アップキャストって
base b = (base)d;
こんな狂ったことすんの?
それとも
base b = d;
この単なる暗黙の型変換のことを「キャスト」とか言い出しちゃうの?

476 :デフォルトの名無しさん:2016/04/10(日) 22:24:31.71 ID:4zsRISHG
そこじゃないだろ

477 :デフォルトの名無しさん:2016/04/10(日) 22:26:59.47 ID:7Ok+rt99
よくわかってないのに一家言もつ人w

478 :デフォルトの名無しさん:2016/04/10(日) 23:17:10.70 ID:M23QAKIs
教科書みたいなコピーコンストラクタの例だな

479 :475:2016/04/10(日) 23:33:46.85 ID:FNu9TvqZ
base *b = (base *)d;

(´・ω・`)最初からこう書いとくべきだったね
書かなきゃ分からん人もいるからね

480 :デフォルトの名無しさん:2016/04/10(日) 23:50:56.21 ID:Msqh6OQ2
>>475
広義の"キャスト"は型変換のことで、
狭義の"キャスト"はキャスト演算子を使った明示的なキャストのこと…あたりかな

英語だとtype castingだからキャストは変換が正しいのかな…
型キャストみたいな言い方もするよね

481 :デフォルトの名無しさん:2016/04/11(月) 00:40:37.29 ID:i7Hb58ma
>>480
広義のとか英語と言われてしまうと不勉強でついていけないけど
狭義のものについていくつか例をあげとく

https://en.wikipedia.org/wiki/Type_conversion
Type conversion
 1 C-like languages
  1.1 Implicit type conversion
  1.2 Explicit type conversion
↑暗黙的・明示的で型変換を分類
In the C family of languages and ALGOL 68, the word cast typically
refers to an explicit type conversion (as opposed to an implicit conversion)
↑さらにこのようにも書かれている

https://en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/C%2B%2B/Code/Statements/Variables/Type_Casting
C++ Programming
 1 Type Conversion
  1.1 Automatic type conversion
  1.2 Explicit type conversion (casting)
↑自動的・明示的で型変換を分類し、後者をキャストとしている

まぁ参考程度に

482 :デフォルトの名無しさん:2016/04/11(月) 07:02:43.57 ID:OGyFwqGU
>>479
> 書かなきゃ分からん人もいるからね
恥ずかしい奴 w

483 :デフォルトの名無しさん:2016/04/11(月) 08:01:18.44 ID:rDPJ5tk/
>>482
型がbaseなんだから基底クラス派生クラスのポインタってわかったけど・・・

484 :デフォルトの名無しさん:2016/04/11(月) 08:38:23.10 ID:OGyFwqGU
>>483
何を勘違いしてるのか知らんけど
恥ずかしい奴と指摘してる対象は
* をつけ忘れた自分のミスを
> 書かなきゃ分からん人もいるからね
と他人に転嫁しようとしてるアホだぞ w

485 :デフォルトの名無しさん:2016/04/11(月) 13:25:27.20 ID:8x/NJSRd
いやもともと*をつけ忘れたわけじゃないだろ
明示と暗黙の話のようだし

486 :デフォルトの名無しさん:2016/04/11(月) 19:22:52.69 ID:bDNN4W3Y
脱線してるしどうでもいい
どうしてそこまで他人を煽りたがるのか

487 :デフォルトの名無しさん:2016/04/11(月) 20:39:34.48 ID:lMeZFfb2
>>485
だったらそのまま押し通せばいい
>>478 で指摘されて、よくある例にした
って言えばいいだけなのに
> 書かなきゃ分からん人もいるからね
なんて書くからアホって言われる

488 :デフォルトの名無しさん:2016/04/12(火) 00:08:32.94 ID:8Bg9MMbi
base だから派生クラスに対して基底クラスを示しているってのはわかるけど
クラス名を base って書くとそれはポインタの話だってのは暗黙的なことなの?

489 :デフォルトの名無しさん:2016/04/12(火) 03:01:00.43 ID:0BB0Fz9I
まぁぶっちゃけ>>475は最初と最後の2行で話が通じるんで
途中が間違っててもそんなに気にならない

490 :デフォルトの名無しさん:2016/04/12(火) 06:15:23.10 ID:8wQ28NJb
基底クラスへのキャストが狂ったことだと?

491 :デフォルトの名無しさん:2016/04/12(火) 06:50:47.79 ID:PgTedsFg
>>489
最初の行から間違ってるだがw

492 :デフォルトの名無しさん:2016/04/12(火) 08:54:20.94 ID:xYAotuK9
>>488
ポインタのケースが圧倒的に大多数なので、C++ やってる奴なら暗黙的にポインタの話だと理解する
俺なんてポインタの話だと思い込んでスルーしてたぐらいだし

493 :デフォルトの名無しさん:2016/04/12(火) 09:11:17.93 ID:a9FJA+OX
C++だとこの場合はポインタでも参照でもいいんだから
その片方だけを書いてしまうよりは
単に擬似コードとして(base)と書いてんので十分

それ見てコピーコンストラクタだと言い出しちゃう奴が
マジなのかネタなのか分からないが

494 :デフォルトの名無しさん:2016/04/12(火) 09:56:14.68 ID:Lr8RZIpa
メモリポインタの話ならまかせとけ

495 :デフォルトの名無しさん:2016/04/12(火) 11:20:00.23 ID:szNkUUWQ
C++を学びたくてお勧めの書籍を聞いたんですが、オブジェクト指向について理解してなかったら
何の入門書を買っても理解出来ないよって言われてスッキリ分かるjava入門って本をお勧めされたんですが
javaの入門を読んだらC++の理解が簡単になるのでしょうか?javaは特に学ぶ予定は無かったので意味ないなら
C++の入門書を探し続けようと思ってるんですが・・・
因みにプログラミング学習経験は苦しんで覚えるC言語を読んだくらいしかないです

496 :デフォルトの名無しさん:2016/04/12(火) 11:48:56.75 ID:r3xSDNTE
>>493
疑似コード w

497 :デフォルトの名無しさん:2016/04/12(火) 12:11:41.05 ID:JEO3UzSv
>>495
自分もまだまだ勉強中だけど、それくらいの段階ならまだCをやった方がいいと思う
Cで作りたいものを5,6個つくるか、作るものが思いつかなければテトリスなどの簡単なゲームを作ったり、
paizaみたいなプログラミングのお題を出してるサイトのをこなすかすればいい。
C++はCをそれなりにやってからいかないとC由来のものとC++がごちゃごちゃになって自分はかなり後悔した
ある程度やってないと、オブジェクト指向の有用性も実感できないだろうし、有用性がわからないものを学ぼうとして理解できない

498 :デフォルトの名無しさん:2016/04/12(火) 12:55:35.65 ID:szNkUUWQ
>>497
ありがとうございます
C++をやりたいならまずはC言語でプログラムの書き方に慣れるといいみたいなこと言われて
C言語の入門書を読み終えたんですけど、ただその時にC言語の癖がついてC++分かりにくくなるみたいなこと言われたんで
早めにC言語は切り上げようと思ってたんですが続けてたほうがいいんですか?
テトリスとか何か簡単なツール作ってみたいのですがオブジェクト指向がなんなのかもまだ分かってないです…

499 :デフォルトの名無しさん:2016/04/12(火) 13:01:18.82 ID:qMEcfkxr
>>495
C++はマルチパラダイム言語って呼び方が適切だと思う
人によって重きを置くとこが違うから、見方も様々なので意見は適当に判断するしかない
オブジェクト指向も昔は仮想関数でポインタがどう使われてるかみたいなことが必須知識だったけど
今は上流な話に終始するのが多いんじゃないかな。知らんけど

500 :デフォルトの名無しさん:2016/04/12(火) 13:18:24.37 ID:OovY3q37
>>498
テトリスとか簡単なツールとかはCでも作れるから、とりあえずCを続けたらいいんじゃないかな
数年単位で勉強しない限り癖がつくとか気にしなくていいよ

501 :デフォルトの名無しさん:2016/04/12(火) 14:10:55.99 ID:8gkQd1h0
>>498
オブジェクト指向と考えずにまずはやってみたらいいのでは

502 :デフォルトの名無しさん:2016/04/12(火) 14:36:45.80 ID:Tzgq3WhP
>>498
自分がCで作ったプログラムをC++に移植するのも勉強になるよ
けど最初からC++でやってればよかったと後悔する可能性もある

503 :デフォルトの名無しさん:2016/04/12(火) 15:20:46.30 ID:szNkUUWQ
ありがとうございます。
柴田望洋の本でも読んでもう少しC言語の知識付けてから考え直したいと思います
苦しんで覚えるC言語もどこまで役にやってるのか分からなくなってきたので…

504 :デフォルトの名無しさん:2016/04/12(火) 19:10:29.64 ID:wt6IaLl7
>>502
移植する必要がない、わざわざ遅くなるように改悪しなくても

505 :デフォルトの名無しさん:2016/04/12(火) 20:55:59.68 ID:U1PsFxiF
C++に移植すると遅くなるって都市伝説じゃないの?

506 :デフォルトの名無しさん:2016/04/12(火) 22:05:54.73 ID:PiwdcttH
クラス使わなければそんなに変わらない

507 :デフォルトの名無しさん:2016/04/12(火) 22:42:56.39 ID:U1PsFxiF
クラス使うと遅くなるって都市伝説じゃないの?
仮想関数使ったなら遅くなるかもだが。

508 :デフォルトの名無しさん:2016/04/12(火) 22:58:54.88 ID:/GVd1Dbl
都市伝説

509 :デフォルトの名無しさん:2016/04/13(水) 01:30:09.24 ID:L8ByxKIA
TMPって必要ありますか?

510 :デフォルトの名無しさん:2016/04/13(水) 01:37:55.11 ID:jupLzAcR
>>504
そんなに差がでるとは思えんが、もし遅くなったら
勉強がてら高速化すればいい

511 :デフォルトの名無しさん:2016/04/13(水) 01:45:40.72 ID:n3tzn5Jx
>>509
自分で必要だと確信できないなら自分で使う必要はないよ

512 :デフォルトの名無しさん:2016/04/13(水) 08:32:49.65 ID:HJBXPL0B
>>504
必要云々ではなく勉強の話してるの
わかる?

513 :デフォルトの名無しさん:2016/04/13(水) 09:04:37.87 ID:tPE+Hf8q
>>507
コンストラクタとデストラクタ走らせなければそんなに変わらないかな

514 :デフォルトの名無しさん:2016/04/13(水) 22:06:38.04 ID:FRGxTn1f
Cでも結局、コンストラクタに準ずる初期化とデストラクタに準ずる後処理は必要だろ。
Cなら速くなるというのは都市伝説。

515 :デフォルトの名無しさん:2016/04/13(水) 22:49:50.96 ID:OjSMixzY
C++を使うと遅くなるか、に関しては、古いがプログラミング作法に書いてある。

例えば、C++のSTLを使ったプログラミングをすると、STLで実装されている
処理を、ユーザーが最適化できない。汎用的に書かれているから。

一方、Cではそれができるから、速くなるみたいなことが書かれていた気がする。

516 :デフォルトの名無しさん:2016/04/13(水) 22:50:20.80 ID:OjSMixzY
まあ古い本だから、今がどうなのかは知らないけど。

517 :デフォルトの名無しさん:2016/04/13(水) 22:51:25.47 ID:OjSMixzY
変だな。

「汎用的に書かれているから。」 は消していいよ。

518 :デフォルトの名無しさん:2016/04/13(水) 22:58:38.36 ID:ctQ6cU5c
クラスを使うと遅くなるってのはRTTIとか型チェックの処理が入ったり
不必要にコピーが発生したりってことで無駄な処理が増えることを言っているでしょ
考えもなしに書いたコードが原因で本来不要な処理が増える
要はプログラマーの実装の問題ってこと

519 :デフォルトの名無しさん:2016/04/13(水) 23:04:07.34 ID:emBYrQ1B
結局のところ、「理論上は遅くなるよね」くらいに思っておけばいいの?

520 :デフォルトの名無しさん:2016/04/13(水) 23:08:08.58 ID:FRGxTn1f
Cで書くよりアセンブラで書いたほうが速い。
というのと同じくらいナンセンス。

521 :デフォルトの名無しさん:2016/04/13(水) 23:21:13.51 ID:rl8lucUp
better Cならメリットの方が圧倒的だと思うけどなー

522 :デフォルトの名無しさん:2016/04/13(水) 23:31:46.34 ID:COroZlU5
>>515
なんか変な話。
STLと同じ処理をCで書いて速くできるなら、C++でも同じことができないわけないと思うが。

523 :デフォルトの名無しさん:2016/04/14(木) 00:03:57.72 ID:W0ESW1og
>>522
確か本は、STLを使う前提でかかれてたよ。
STL使わずにデータ構造を自作すれば、同じだね。

524 :デフォルトの名無しさん:2016/04/14(木) 00:05:34.96 ID:W0ESW1og
速度と引き換えに、STLの利便性が得られる って確か書いてあった気がする。

525 :デフォルトの名無しさん:2016/04/14(木) 00:40:27.41 ID:GRJi8ey4
>>522
他人の書いた汎用的なコードだから無駄が増えるってだけだよ
もちろん自作したものが必ずしもそれより早いとは限らないがw

メモリの確保、データのコピーにエラーチェックと処理
実行するに当たっては必要になる処理だが、本来の処理ではなく付随的な処理でしかない
これらが頻繁に起きればその分速度は遅くなる

526 :デフォルトの名無しさん:2016/04/14(木) 02:31:50.13 ID:Wu1ZUttN
x86ってえっくすはちろくって読んだら笑われたけど、なんて読むのが正解なんですか?

527 :デフォルトの名無しさん:2016/04/14(木) 07:25:37.14 ID:kbXOIx/G
日本語ならぺけはちろく

528 :デフォルトの名無しさん:2016/04/14(木) 08:14:20.00 ID:Y6Qtie59
その笑った当人に聞くべきだったね。

「えっくすはちろく」で意味は通るだろうし
俺は可笑しいと感じないけど、俺は権威筋じゃないから。

529 :デフォルトの名無しさん:2016/04/14(木) 08:24:42.63 ID:OKKc+//x
>>525
それをCとC++の比較に持ち出すのが変なんだろう。同じ条件で比較してないし。

530 :デフォルトの名無しさん:2016/04/14(木) 08:39:54.10 ID:G2rZAyMq
違う言語なんだからそれぞれ得手不得手があるのに、局所的な比較だけするからおかしくなる。
例えば仮想関数呼び出しにしても、それ自体は余分な時間がかかるけど、呼び出し側の分岐が不要になって時間が稼げて、総合的に相殺以上のメリットになる。
ただし実際にはこんなこと以上に記述性が上がって人間の時間が稼げて、最適化したり規模とかを上げれる方がよっぽど良い。

531 :デフォルトの名無しさん:2016/04/14(木) 18:10:44.36 ID:GRJi8ey4
>>529
同じ条件で比較すればいいってものでもないと思うけどな
どちらかに分がある条件で比較してしまえば、分が悪いほうが遅いとなるだろうし
他人の書いたコードを使うならCだろうがC++だろうが付随的な処理が増えればその分遅くなる
>>525で言いたかったのは「Cに比べてC++のほうが遅くなる要素は多分にある」ということ
ただそれはプログラマのコーディングスタイルに左右されることなわけで「C++だから遅い」とは思わない

532 :デフォルトの名無しさん:2016/04/14(木) 19:37:49.77 ID:f1hhftJp
>>524
テンプレートにすることで,実行時に余分のコストが発生するのか?
あれはマクロの親玉だろう?

533 :デフォルトの名無しさん:2016/04/14(木) 19:38:32.90 ID:f1hhftJp
>>530
仮想関数は間接アクセスが一つ入る分一方的にコストがかかると思うが

534 :デフォルトの名無しさん:2016/04/14(木) 19:56:09.16 ID:Lg/h7ZOX
>>533
Cで同じことしようとしたら条件分岐とかが必要になって、結局あまり変わらないってことだろ。

535 :デフォルトの名無しさん:2016/04/14(木) 20:01:34.62 ID:W0ESW1og
>>532
ある処理専用に、ごりごりに最適化できないから、という理由だった気がする。

たぶん、速度が落ちる理由が、テンプレートを使うから、ということはないと思う。
サイズは確かに増えるが。

536 :デフォルトの名無しさん:2016/04/14(木) 21:26:13.78 ID:VAbDTAsP
ちなみに仮想関数呼び出しの余分なコストは、通常の関数を1とした場合、0.25%以下らしいな

537 :デフォルトの名無しさん:2016/04/14(木) 21:26:41.91 ID:VAbDTAsP
ごめん、%間違えてつけた

538 :デフォルトの名無しさん:2016/04/14(木) 21:28:41.13 ID:kbXOIx/G
最近のコンパイラは頭がいいから
結構最適化してくれるよな
パイプラインも同時実行も分岐予測も考慮するし
コンパイルオプションでファイバー最適化もできる

539 :デフォルトの名無しさん:2016/04/14(木) 23:48:28.82 ID:MRKzyTMr
>>533
「それ自体は余分な時間がかかる」のは書いてある通り。
ポリモフィズムの恩恵として呼び出し側のコストがかからないのも書いてある通り。
このコストは対等ではなく、呼び出したい種別が増えても常にO(1)で、呼び分ける場合のO(n)にはならない。
ただ、どちらにせよ殆どの場合この差異は表面化せず計測できない

540 :デフォルトの名無しさん:2016/04/15(金) 15:46:44.02 ID:bZ84v03Q
vimみたいなコマンドラインでテキストエディターをつくりたいのですが
どうやって作るんですか?
標準入力と標準出力だけでは無理ですか?
作り方教えてください。

541 :デフォルトの名無しさん:2016/04/15(金) 17:21:56.60 ID:FPPH54gW
コマンドラインってのは、たぶんコンソールのことだろうな。
プログラムを起動したときに自前のウィンドウを開かないで、
コマンドを入れたウィンドウ上で動くって意味。

コンソールでのフルスクリーン(って表現も変だけど)アプリケーション、
つまり画面内のカーソル位置を自在に動かすようなものは環境への依存が強い。

とりあえず標準入出力だけでは無理だし、
実現方法はOSやら何やらによって大きく異なる。


…俺が知ってるのはこの辺までなので、
「環境は○○です」と言われても答えられないよ。

542 :デフォルトの名無しさん:2016/04/15(金) 17:35:56.90 ID:bZ84v03Q
ありがとうございます
調べたらcursesを使えばいいみたいです

543 :デフォルトの名無しさん:2016/04/18(月) 17:24:17.55 ID:MeNHDutf
変数cなんて定義してないのに、
Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.とエラー出るんだが
コレなんだ?

544 :デフォルトの名無しさん:2016/04/18(月) 17:27:15.82 ID:MeNHDutf
あっすみません自己解決しました。
#defineで変数cは定義されているものでした

545 :デフォルトの名無しさん:2016/04/18(月) 20:38:45.50 ID:C/ouOI5M
VisualStudio2015Community(VC++)からHTMLをパース可能なライブラリを探しています。
webページをダウンロードし、そこに含まれるテーブルから一部データを抽出、
加工してローカルに保存したいと考えています。

今のところ、びんずめ堂さん、MSHTMLを候補に考えています。
しかし個人製作?だったり情報が古かったりで迷っています。
決定版みたいな存在が見当たらず、この手の情報は少ないように思えるんですがどうなんでしょう?
みんな他の言語でやるのかな?

以前ExcelVBAで強引にやっていたんですが、重いっていうか裏作業出来ないっていうかVCが好きっていうかde

546 :デフォルトの名無しさん:2016/04/18(月) 20:43:17.99 ID:ErdsNVpN
>>545
そんなもん無数にあるだろ。
名前は忘れた。

547 :デフォルトの名無しさん:2016/04/18(月) 21:48:11.07 ID:LCJC2X3e
>>545
俺はCLR使う

548 :デフォルトの名無しさん:2016/04/18(月) 21:55:32.62 ID:EoOYoamp
俺はHTMLAgilityPack使ってるわ

549 :デフォルトの名無しさん:2016/04/18(月) 22:49:49.83 ID:ErdsNVpN
>>548
ああ、それそれ。

550 :デフォルトの名無しさん:2016/04/19(火) 08:50:24.21 ID:SvHoNoSF
全く情報を提供していない ID:ErdsNVpN にほっこりした。

551 :デフォルトの名無しさん:2016/04/19(火) 10:26:34.71 ID:1acnq1eP
  >>545
  そんなもん無数にあるだろ。
  名前は忘れた。

  >>548
  ああ、それそれ。

これならうちの息子(小三)でもレスできそうだw

552 :デフォルトの名無しさん:2016/04/19(火) 10:35:50.42 ID:6Wh9TF6d
そんなやつ無数にいるだろ。

553 :デフォルトの名無しさん:2016/04/19(火) 16:14:23.78 ID:LbxVeIJH
>>552
「ハンドルは忘れた」とでも続けて欲しかった。

>>551
そういう投稿をしない人物に育ててくれ。

554 :デフォルトの名無しさん:2016/04/19(火) 21:56:24.18 ID:spYNmTFF
DataSet/DataAdapterの仕様についてご教授下さい。


■DataSet/DataAdapterの仕様
DataAdapter には、SELECT、UPDATE、INSERT、DELETEのSQL文が設定できます。
Fillメソッドを実行するとSELECTのSQL文の基づいてDataSetにデータを読み込みます。このときDataSetの各行には「編集なし」のマークがついています。
値を更新するとそのマークが「更新済」、削除すると「削除済」、データを追加すると「追加済」のマークに変わります。
Updateメソッドを実行すると、DataSetの各行のマークに応じて、設定してあるUPDATE、INSERT、DELETEのSQL文を実行します。

555 :デフォルトの名無しさん:2016/04/19(火) 21:57:05.20 ID:spYNmTFF
■実施したい事【概要】
DataAdapterのFillメソッドで取得したDataSet内のDataTableに対して、
挿入/更新操作をかけていき、全ての処理が終わったら、UPDATEを行う。

その際、DataTableに挿入した順番でDBへの挿入SQLが流れてほしい。

556 :デフォルトの名無しさん:2016/04/19(火) 21:57:25.73 ID:spYNmTFF
■実施したい事【詳細】

DataTable^ tbl;//←DataAdapterのFillメソッドで取得したDataSet内のDataTableだとします

while(10000行程度ループ){

DataRow^ tg_row = tbl->Rows->Find(ループ毎に変わる値);

if( static_cast<DataRow^>(tg_row)==nullptr){
DataRow^ row = tbl->NewRow();
row["hogehoge"] = ループ毎に変わる値;
tbl->Rows->Add(row);//←★★★★★★初期挿入★★★★★★★
}
else{
row["hogehoge"] = ループ毎に変わる値;
}

}

上記のソースで5000行のレコードが出来たと仮定します。
※つまり"ループ毎に変わる値"の重複が半分あったということ

この状態でUPDATEを行うと、
なぜか、初期挿入した順番通りにinser

557 :デフォルトの名無しさん:2016/04/19(火) 22:03:12.61 ID:spYNmTFF
■実施したい事【詳細】

DataTable^ tbl;//←DataAdapterのFillメソッドで取得したDataSet内のDataTableだとします

while(10000行程度ループ){

DataRow^ tg_row = tbl->Rows->Find(ループ毎に変わる値);

if( static_cast<DataRow^>(tg_row)==nullptr){
DataRow^ row = tbl->NewRow();
row["hogehoge"] = ループ毎に変わる値;
tbl->Rows->Add(row);//←★★★★★★初期挿入★★★★★★★
}
else{
row["hogehoge"] = ループ毎に変わる値;
}

}

上記のソースで5000行のレコードが出来たと仮定します。
※つまり"ループ毎に変わる値"の重複が半分あったということ

この状態でUPDATEを行うと、
なぜか、初期挿入した順番通りにinsert文が発行されません。
※DB上で見ると順番がごちゃまぜです

558 :デフォルトの名無しさん:2016/04/19(火) 22:03:38.98 ID:spYNmTFF
■質問?
なぜ、初期挿入した順番通りにinsert文が発行されないのでしょうか?
tbl->Rows->Findで取得したレコードの値を変更すると順番が変更になってしまうのでしょうか?

■質問?
初期挿入した順番にinsert文が発行されようにするには、
どの様にしたら良いでしょうか?
解決策をご教授下さい。

559 :デフォルトの名無しさん:2016/04/19(火) 22:18:29.63 ID:V/GcSRQF
マルチうざい

560 :デフォルトの名無しさん:2016/04/22(金) 01:49:56.99 ID:1KOgfd9A
下のクラスにデータを渡すってどういう意味?

561 :デフォルトの名無しさん:2016/04/22(金) 07:10:33.62 ID:mTUrU59j
床に穴あけて紙を落とす

562 :デフォルトの名無しさん:2016/04/22(金) 17:17:56.47 ID:YFuTfo2Y
窓から落とせば下でキャッチしてくれるんじゃね?

563 :デフォルトの名無しさん:2016/04/28(木) 23:02:13.92 ID:zdOheClY
UNITYでC言語を使うにはどうしたらいいのでしょうか
もしくは、それよりも使い勝手のいい(無料の)ソフトが有るのでしょうか

564 :デフォルトの名無しさん:2016/04/28(木) 23:21:07.44 ID:z9NV8D3z
きほんてきにはつかえないです

565 :デフォルトの名無しさん:2016/04/29(金) 17:15:16.85 ID:dhl0UAMF
すみません、弟が独学でC言語を勉強しているのですが
問題が解けなくて困っています。
教えてもらえたら嬉しいです。
問題は1週間で身につくC言語の基本というサイトの
実行例にならい、キーボードから2つの整数を入力させ、関数を用いてそれぞれの数をたて、よこの■の数として、四角形を表示させるプログラムを作りなさい。

実行結果の例

たて:3 ← 正の整数を入力
よこ:5 ← 正の整数を入力
■■■■■
■■■■■
■■■■■ ← 縦3個、横5個の■マークを表示
ただし、関数の概要は以下のようにすること。

関数名 square
処理内容 縦、横に指定された数の■マークを表示する。ただし、どちらかの値が0以下の場合は、何も表示しない。
引数 整数の値×2(縦、横の値)
戻り値 なし

566 :デフォルトの名無しさん:2016/04/29(金) 17:16:55.62 ID:dhl0UAMF
続きです。
弟が書いたコード
--------------------------------------------------------------
#include <stdio.h>
int main(void) {
int tate,yoko;
printf("縦:");
scanf("%d", &tate);
printf("横:");
scanf("%d",&yoko);
int y,x;
for(y=0; tate == y; y++) {
for(x=0; yoko == x; x++) {
printf("■");
}
}
return 0;
}
--------------------------------------------------------------
実行結果
--------------
縦:5
横:5
-------------

このあとうまく■が並んでくれません。

567 :デフォルトの名無しさん:2016/04/29(金) 17:18:26.20 ID:dhl0UAMF
デバッグしてみたらここまで行っていたそうです。
--------------------------------------------------------------
◯ #include <stdio.h>
◯ int main(void) {
◯ int tate,yoko;
◯ printf("縦:");
◯ scanf("%d", &tate);
◯ printf("横:");
◯ scanf("%d",&yoko);
◯ int y,x;
△ for(y=0; tate == y; y++) {
for(x=0; yoko == x; x++) {
printf("■");
}
}
return 0;
}

よろしくお願いします!

568 :デフォルトの名無しさん:2016/04/29(金) 17:22:05.37 ID:kN9lVhLi
よーわからんし確認してないけど
こーしてみんしゃい!

for(y=0; y < tate; y++) {
for(x=0; x < yoko; x++) {

569 :デフォルトの名無しさん:2016/04/29(金) 17:23:12.87 ID:kN9lVhLi
for(y=0; y < tate; y++) {
for(x=0; x < yoko; x++) {
printf("■");
}
puts("");
}

570 :デフォルトの名無しさん:2016/04/29(金) 17:23:36.16 ID:BBUpf9bB
>>565
なぜ弟の質問を兄(姉)が?w
--------------------------------------------------------------
#include <stdio.h>
int main(void) {
int tate,yoko;
printf("縦:");
scanf("%d", &tate);
printf("横:");
scanf("%d",&yoko);
int y,x;
for(y=0; y<tate; y++) {
for(x=0; x<yoko; x++) {
printf("■");
}
printf("\n");
}
return 0;
}
--------------------------------------------------------------

571 :デフォルトの名無しさん:2016/04/29(金) 17:34:03.40 ID:dhl0UAMF
できたそうです!
弟はまだ小さいので、2chの存在は秘密です。
本当にありがとうございました!

572 :デフォルトの名無しさん:2016/04/29(金) 17:34:30.90 ID:6AfMLjyX
>>567
forの条件が
 tate == yはtateとyの値が同じ間
 yoko == xはyokoとxの値が同じ間
になってしまってる

573 :デフォルトの名無しさん:2016/04/29(金) 17:46:00.76 ID:dhl0UAMF
>>572
納得しています。
ありがとうございました。

574 :デフォルトの名無しさん:2016/04/29(金) 20:35:21.20 ID:IiqjVC0E
再度すいません>>563です。
図々しいですが、使いやすいソフトを教えてくださいませんでしょうか

575 :デフォルトの名無しさん:2016/04/29(金) 20:51:35.86 ID:AWs6LkoN
質問の意図が分からんので答えにくい

576 :デフォルトの名無しさん:2016/04/29(金) 21:11:35.08 ID:AWs6LkoN
ゲームエンジンは世の中に沢山あるが、
開発言語、動作環境、開発環境、向いてるゲームジャンル、料金形態、初心者向きかどうか、
……同じものは何1つ無いと言っていい。

C/C++を日常で使ってる人で、それらで開発可能なエンジンが知りたいのか、
まず第一にゲームが作りたいという気持ちがあって、そこでメジャーなC言語を選んでみただけなのか、
とにもかくにもUnityが使いたい、あるいはUniyくらいにしか無い機能が使いたいのか、
それぞれ想定される回答が違う。

ちなみにUnity自体は、日本語の資料も充実してるのもあって
かなり使い勝手は良いゲームエンジンの1つだろうね。
まあ>564で言ったように、Cで書かれたDLLを読み込む…とかでもなければCに出番はないけど。

577 :デフォルトの名無しさん:2016/04/29(金) 21:41:45.70 ID:IiqjVC0E
Unityが特段いいというわけだはなく、ゲームの王道という情報があったので選びました
Cなら根本から組み上げられるということも聞いたので、C言語を専攻(?)しています

578 :デフォルトの名無しさん:2016/04/29(金) 22:53:42.71 ID:AWs6LkoN
とにかくゲームが作りたいなら、RPGツクールとかそういう類を選ぶべき

579 :デフォルトの名無しさん:2016/04/30(土) 00:10:29.31 ID:4VZu2v0+
ローカル変数はブロック途中で宣言できなかったような・・・と思ったら仕様拡張で改善されてたのね

ゲームの製作って意味ならUnityでいいと思うよ
参考文献とかの多さもあるけどアセットが充実してるのが強い

580 :デフォルトの名無しさん:2016/04/30(土) 00:39:44.38 ID:kBEc2ffr
>>579
お前さんいつの時代から来た人?

581 :デフォルトの名無しさん:2016/04/30(土) 08:39:58.20 ID:RhLYi0Bf
多分アセットを買いまくるという発想もないだろうから
Unityすらいらなくて
ウディタかツクールでサンプルいじるくらいで満足するんじゃないの

582 :デフォルトの名無しさん:2016/04/30(土) 10:57:54.89 ID:ujtZmu08
初心者の質問です。教えて下さい。
関数内での変数宣言なのですが、
一般的には関数の処理を記述する波括弧内ですよね。
関数の引数を記述する丸括弧の直後、かつ波括弧の直前での変数宣言にはどういう意味がありますか?

ここで遭遇しました。
github.com/NetHack/NetHack/blob/NetHack-3.6.0/src/dungeon.c#L133

リンク確認したらモバイルサイトでは特定ライン番号にジャンプ出来ないですね。save_dungeon関数です。

583 :デフォルトの名無しさん:2016/04/30(土) 12:14:10.82 ID:kBEc2ffr
超大昔にあったらしいC言語言語の関数の記述方法だと思う
ぶっちゃけ忘れていいし、
そういうコードを現代で見かけたら、記念にスクショだけ撮って埋葬するべき

584 :デフォルトの名無しさん:2016/04/30(土) 12:15:36.27 ID:kBEc2ffr
なんか日本語おかしいけど気にすんな

585 :デフォルトの名無しさん:2016/04/30(土) 12:45:34.50 ID:/NIiSTrt
何度もすみません。
弟が昨日からずっとこれができなくて
できれば教えてくださいと言っています。
アドバイスをもらえたら嬉しいです。

キーボードから2つの整数値を入力し、その2つの数の最大公約数と最小公倍数を求め、その結果を表示するプログラムを作りなさい。このうち、最大公約数と最小公倍数は、関数を用いて求めること。

実行結果の例
1つ目の値を入力してください:30 ← 整数を入力
2つ目の値を入力してください:12 ← 整数を入力

2つの数の最小公倍数は、60です。
2つの数の最大公約数は、6です。
ただし、関数の概要は以下のようにすること。

関数名 gcd
処理内容 2つの整数の値の最大公約数を求める。
引数 整数の値×2(縦、横の値)
戻り値 なし

関数名 lcm
処理内容 2つの整数の値の最小公倍数を求める。
引数 整数の値×2
戻り値 引数の2つの整数の最小公倍数

586 :デフォルトの名無しさん:2016/04/30(土) 12:50:44.92 ID:/NIiSTrt
コードです↓

#include <stdio.h>
int gcd(int a,b){

int c,tmp;
if(a<b){
tmp = a;
a = b;
b = tmp;
}
for (int i=0;c=!0;i++) {
c=a%b;
a=b%c;
}
return b;
}
int lcm(int a,b){
int c,tmp;
if(a<b){
tmp = a;
a = b;
b = tmp;
}
for (int i=0;c=!0;i++) {
a = b;
b = c;
c = a % b;
}
}

587 :デフォルトの名無しさん:2016/04/30(土) 12:51:20.83 ID:/NIiSTrt
続きです。

int main(void) {
int kone,ktwo;
int aone,atwo;
printf("1つ目の値を入力してください:");
scanf("%d", &kone);
printf("2つ目の値を入力してください:");
scanf("%d",&ktwo); #ーーデバッグしたらここまで進んでいます
aone=gcd(kone,ktwo);
atwo=lcm(kone,ktwo);
printf("2つの数の最小公倍数は、%dです。\n2つの数の最大公約数は、%dです。", aone,atwo);
return 0;
}

すみませんが、よろしくお願いします。

588 :デフォルトの名無しさん:2016/04/30(土) 12:51:40.04 ID:kBEc2ffr
それはアドバイスを求めてるんじゃなくて、宿題をやってくれって話よね
本当にアドバイスを求めてるなら、どこでハマったとか言えるでしょ

589 :デフォルトの名無しさん:2016/04/30(土) 12:56:14.85 ID:kBEc2ffr
ごめんリロってなかった

ソースを流し読みしただけだけど、
たぶん1回目の入力の時に、後ろにゴミ(改行コード)が残ってて
それが2回目の入力として処理されてしまうんじゃない?
なので、1回目のあとに、何らかの方法で入力をフラッシュする必要がある

590 :デフォルトの名無しさん:2016/04/30(土) 13:00:06.29 ID:/NIiSTrt
>>588
そうですね。すみません!
今、弟が習い事に行ってしまったので、帰ったらどこでハマったか聞いてみます。
でも宿題をやってほしいとかではなく、独学でサイト(1週間で覚えるC言語の基本)を見て
一生懸命やってるのでご容赦くださると嬉しいです。
このサイト、答えが載ってないんです。

591 :デフォルトの名無しさん:2016/04/30(土) 13:01:42.25 ID:/NIiSTrt
すみません!私こそリロードしていませんでした。
教えていただいたこと、弟に伝えます。
ありがとうございます。

592 :デフォルトの名無しさん:2016/04/30(土) 13:05:00.42 ID:PNZBHOdI
>>590
ついでに弟に質問文も考えさせるのはどう?

593 :582:2016/04/30(土) 13:11:19.93 ID:ujtZmu08
>>583
レスありがとうございます。大昔の名残りなんですね。

ここで質問する前にググりはしたんですが上手い検索ワードを思いつかず、
出てくるのはスコープの話ばかりで困ってました。

594 :デフォルトの名無しさん:2016/04/30(土) 13:14:10.32 ID:/NIiSTrt
質問文とは、よろしくお願いしますとか、そいういう文のことですよね。違ったらすみません。
一応、弟がメールしてそれを貼り付けています。
もっとちゃんと技術的な説明があるといいdwすよね。
そう伝えます。

595 :デフォルトの名無しさん:2016/04/30(土) 13:17:23.55 ID:/NIiSTrt
ミスタイプしました。すみません…

596 :デフォルトの名無しさん:2016/04/30(土) 13:17:59.57 ID:PNZBHOdI
>>594
そういう意味ではなくて
理想の実行結果だけじゃなくて
・現状の実行結果はこれ
・エラーメッセージが出るならそのメッセージ
こういうのね

597 :デフォルトの名無しさん:2016/04/30(土) 13:22:27.31 ID:/NIiSTrt
>>596
エラーメッセージ、そういえば送ってきてました。忘れていました。

エラーは↓
loating point exception: 8

とのことでした。実行結果は後で聞いて貼ります。

598 :デフォルトの名無しさん:2016/04/30(土) 13:33:03.99 ID:kBEc2ffr
ただでさえ掲示板を通して間接的にやり取りしてるのに
そこに更に人間を1人挟んだら、伝わるものも伝わらんだろう

599 :デフォルトの名無しさん:2016/04/30(土) 13:37:18.89 ID:PNZBHOdI
>>597
じゃあそのエラーメッセージで調べてみよう

600 :デフォルトの名無しさん:2016/04/30(土) 13:42:47.55 ID:/NIiSTrt
>>598
それについては本当お詫びします。
弟は小さいのですみません…

601 :デフォルトの名無しさん:2016/04/30(土) 13:46:37.63 ID:/NIiSTrt
弟帰ってきたので聞きました。
エラーメッセージをGoogleで調べたら、浮動小数点の桁が足りないと出てきたので
int をダブルに変更したけど、どうも上手くいかないそうです。

実行結果は↓

1つ目の値を入力してください:15
2つ目の値を入力してください:5
Floating point exception: 8

本当にたびたびすみません。弟も感謝してると言っています!

602 :デフォルトの名無しさん:2016/04/30(土) 13:48:42.00 ID:/NIiSTrt
>>589
新しいファイルを作って貼り付けてみました。
同じエラーが出てしまうのですが
このやり方で入力をフラッシュしたことになってないでしょうか?

603 :デフォルトの名無しさん:2016/04/30(土) 13:52:50.68 ID:kBEc2ffr
新しいファイルってなんだ

604 :デフォルトの名無しさん:2016/04/30(土) 13:54:54.04 ID:P43sHncH
>>601
ここにコードを貼ってください
http://codepad.org/

605 :デフォルトの名無しさん:2016/04/30(土) 13:57:15.62 ID:/NIiSTrt
>>603
新しい.cのファイルを作ってコピペしたそうです。
今入力をフラッシュする方法を調べています。

606 :デフォルトの名無しさん:2016/04/30(土) 13:59:33.61 ID:/NIiSTrt
>>604
http://codepad.org/NwryuiaT
これで大丈夫でしょうか。
よろしくお願いします。

607 :デフォルトの名無しさん:2016/04/30(土) 14:02:48.99 ID:JLdVbit+
for( int i = 0; c = !0; i++)
っていけるのか?
for( int i = 0; c != 0; i++)
のtypoじゃないのか?

608 :デフォルトの名無しさん:2016/04/30(土) 14:02:57.38 ID:P43sHncH
>>606
行番号が赤くなっているところを正しく直してください,話はそれからです

609 :デフォルトの名無しさん:2016/04/30(土) 14:08:41.73 ID:/NIiSTrt
>>608
このサイトすごいですね。ありがとうございます。
今一生懸命直しています。
ちょっと時間がかかるかもしれません。

610 :デフォルトの名無しさん:2016/04/30(土) 14:14:09.22 ID:/NIiSTrt
http://codepad.org/v8wsGvzl

おかげさまで赤いところはなくなりましたが
やっぱり動かないみたいです。

611 :デフォルトの名無しさん:2016/04/30(土) 14:19:00.10 ID:oKKjAnDv
>>610
lcmが値を返してない
gcdが値を0で割ってる可能性が高い(12行目)

612 :デフォルトの名無しさん:2016/04/30(土) 14:30:00.07 ID:PDMESqd1
ユークリッドの互助法で調べて、アルゴリズムを実装するのがよいと思います。

613 :デフォルトの名無しさん:2016/04/30(土) 14:36:16.27 ID:ETp7HfeC
>>610
>>607が書いてるように
while(c=!0)をwhile(c!=0)に直せ
c=!0だとcにnot(0)を代入してる(と思う)

614 :デフォルトの名無しさん:2016/04/30(土) 14:39:40.95 ID:oKKjAnDv
慣れるまでは関数を全て書いてからコンパイルなんて事をせずに
関数一つ式一つ書いてはコンパイルして実行結果を確かめろって事は言いたい

615 :デフォルトの名無しさん:2016/04/30(土) 15:02:58.60 ID:/NIiSTrt
動いたそうです!すごい喜んでます。
http://codepad.org/LFItlotf
本当にありがとうございました!

616 :デフォルトの名無しさん:2016/04/30(土) 22:20:15.81 ID:uVz81x78
GitHubで匿名通信(Tor、i2p等)ができるBitComet(トラッカーサイト不要でDHTだけで日本語検索可能)
みたいな、BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenant(純粋P2Pのファイル共有ソフト)の完成が待ち遠しいプログラミングできないアスペルガーw


617 :デフォルトの名無しさん:2016/05/02(月) 08:34:11.33 ID:3YV7E0Ft
>>600
> 弟は小さいのですみません…
C言語使えるならにちゃんぐらい使えるだろ...

618 :片山博文MZ ◆T6xkBnTXz7B0 :2016/05/02(月) 08:55:47.35 ID:GdZkeqis
小さい子どもには2chのやらしい広告を見せたらあかんやろ

619 :デフォルトの名無しさん:2016/05/02(月) 11:36:53.37 ID:HsUuk1k7
>>613
何を言ってるの?

620 :デフォルトの名無しさん:2016/05/02(月) 12:59:40.46 ID:ag9jY7/D
>>619
わからなくても問題無い

621 :デフォルトの名無しさん:2016/05/02(月) 17:29:34.94 ID:MM242y+D
>>615
弟は何歳だ?

622 :デフォルトの名無しさん:2016/05/02(月) 18:40:58.30 ID:fPSF/RLG
>>619
比較式じゃなくて代入式になってる
>>615
最大公約数と最小公倍数は求まらんままだけどいいの?

623 :デフォルトの名無しさん:2016/05/02(月) 22:12:07.25 ID:q1QEjo8z
2ちゃんで聞かないといけない兄のクオリティ

624 :デフォルトの名無しさん:2016/05/02(月) 23:10:06.44 ID:FDPPvimu
>>623
姉だろ

625 :デフォルトの名無しさん:2016/05/03(火) 00:26:44.79 ID:nDaGYahb
>>622
コンソールでは一見ちゃんと動いてる感じしたのですが
まだ間違ってますか?弟に言っときます。

私はプログラミングできません。弟と広告の間の壁みたいな役目です。
弟は9歳です。

626 :デフォルトの名無しさん:2016/05/03(火) 08:50:16.01 ID:vE4KzUYN
まだ見ていたのか
てっきりいなくなったと思ってた

627 :デフォルトの名無しさん:2016/05/03(火) 11:45:06.51 ID:4dZ6/mF/
他の質問者が順番待ちしてるわけでもないし、いいじゃない。
9歳でC言語ってのも頼もしい。俺の9歳ころはROMのBASICだったよ。

ついでに、この流れの中で
「if (num != 0) を if (num =! 0) とタイポしてもCとして正当」
というようなオモシロ情報も得られた。

628 :デフォルトの名無しさん:2016/05/03(火) 12:19:59.06 ID:aV7QMFwi
「Cとして正当」の意味がわからない

629 :デフォルトの名無しさん:2016/05/03(火) 12:37:41.63 ID:F8GbsJnn
Cの文法としては、何ら間違いではないって事でしょ。
num=!0

num=1 と同等。

630 :デフォルトの名無しさん:2016/05/03(火) 12:43:51.51 ID:wzb+Bdee
流れしらないが上と下は別だろ
num=0のときは1と1
num=1のときは0と1
それ以外は0と1で下はnumの値が変化

631 :デフォルトの名無しさん:2016/05/03(火) 12:45:11.28 ID:wzb+Bdee
num=0のときは0と1
num=1のときは1と1
それ以外は0と1で、下はnum=1に変化

632 :デフォルトの名無しさん:2016/05/03(火) 13:21:32.16 ID:ma13Xhdv
>>631 固定値の代入文なのにどこに分岐する要素があると勘違いしてしまったのかは興味がある

633 :デフォルトの名無しさん:2016/05/03(火) 13:33:05.08 ID:m0WSkRh/
それ以前に何を言ってるのかさっぱりわからん

634 :デフォルトの名無しさん:2016/05/03(火) 14:48:59.10 ID:aV7QMFwi
>>627後半は if(ret=func(...)) { ... } こういう比較を知らなかったと言っているだけじゃん?
Cでは基礎じゃないのかと思うことだが
ただ「不正な代入」として警告が出ると思うので(出ない環境もあるだろう)明示的に if((ret=func(...))!=0) { ... } などとするほうが良いけど

635 :デフォルトの名無しさん:2016/05/03(火) 14:51:39.47 ID:ma13Xhdv
なんか場合分けして書こうとしてるなあくらいにしか読もうとしてなかったけど
単純に!=の条件式と代入文の差を必死に書こうとしてるだけっぽいかな

>>631
流れは追わなくてもいいが式をよくみろ!=ではなく=!だ

636 :デフォルトの名無しさん:2016/05/03(火) 15:41:47.50 ID:F8GbsJnn
>>634
そこまでの知識があって>>628のコメントはいただけないな…と思うの。

637 :デフォルトの名無しさん:2016/05/03(火) 16:41:07.47 ID:aV7QMFwi
タイポしている時点で正当と評価するのはどうかな?と思ったから
「構文上間違いではない」というのはその通りなんだが
その表現だと「どちらでも結果は同じ」(構文に曖昧さがある)というニュアンスも含まれるんじゃないかと感じた
それはタイポした結果「異なる式」になっただけ
式である以上評価できる(if文にあってもエラーにならない)というだけのことであって
構文に曖昧さがあるかのような表現は違うかなと思った

そう感じたから意味がわからないと真意を確認する意味も含めて感想を述べたまで
それは間違いだと言っているわけじゃない
「構文上間違いではない」という意味以外何も無いならその通りだし

638 :デフォルトの名無しさん:2016/05/03(火) 17:07:47.86 ID:VQ0HMl3p
あれえ、自分の理解と違うのかなあ
確認させて欲しいんだけど
( num=!0 ) だとnumに!0が入って括弧の外には常に!0が渡るんだよね?
さらにこの場合どうでもいいけど!0はint型の-1をnumの型にキャストした値で合ってる?

639 :デフォルトの名無しさん:2016/05/03(火) 17:26:27.68 ID:aV7QMFwi
>( num=!0 ) だとnumに!0が入って括弧の外には常に!0が渡るんだよね?
はい

>さらにこの場合どうでもいいけど!0はint型の-1をnumの型にキャストした値で合ってる?
!0 は0の論理反転(ビットごとの反転ではない)
うちの環境では1になる

640 :デフォルトの名無しさん:2016/05/03(火) 18:04:02.50 ID:4dZ6/mF/
>>627 の後半で書いた「Cとして正当」ってのは
「コンパイル時にシンタックスエラーにならない」くらいの意図だった。
ちょいと気取った書き方をしたせいで混乱を招いたみたいで申し訳ない。

もちろん if (num != 0) と if (num =! 0) の違いは知ってるけど、
「 =! を『右辺を論理否定した値を左辺に代入』と解釈するか、そう来たか」
みたいな感じで「オモシロ」と表現した次第。

ちなみに俺が普段使ってるGCCでも警告は出るよ(-Wallの効果だと思う)。
「警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」
これには割と助けられる。== と書くべき所を = とタイポするせい。

641 :640 == 627:2016/05/03(火) 18:06:06.82 ID:4dZ6/mF/
IDを見てもらえば分かるが >>627>>640 は同一人物だ。
名前欄に番号を入れ忘れた。重ね重ね…。

642 :デフォルトの名無しさん:2016/05/03(火) 20:22:40.80 ID:yNxA1r0S
いや大多数の人かまたは全員が知ってて話してると思う
気になるから怖いぜ!くらいの動機

643 :デフォルトの名無しさん:2016/05/03(火) 20:24:34.11 ID:Ga2JkeKt
>>627
何が面白いのか分からないのですが

644 :デフォルトの名無しさん:2016/05/03(火) 20:29:58.14 ID:VQ0HMl3p
>>639
ああそうか論理反転ね
ビット反転は~か
ありがとうスッキリした
Cだと処理系によって値が変わるかも知れないね

645 :デフォルトの名無しさん:2016/05/03(火) 20:35:35.92 ID:CPxVolRD
>>644
確認したけど、The C Programming Languageには
真なら1になるって一応書いてあった

646 :デフォルトの名無しさん:2016/05/03(火) 22:53:41.40 ID:scpTPEwR
ところで == と = のtypoなんて20年以上プログラム書いてきて一度も無いんだが、キーを1回打ったか2回打ったか判らないのだろうか?

647 :デフォルトの名無しさん:2016/05/03(火) 23:32:54.81 ID:CPxVolRD
Basic系だとif文中の=は等価演算子になる方言もあるし
Lisp系やPascal系だと=は等価演算子になる
そういった言語を触ってると時々取り違えるかな。
俺は10年近くやってて多分2回くらい間違えてる。

648 :デフォルトの名無しさん:2016/05/04(水) 00:29:33.43 ID:qX1/u2G+
初心者の頃を除いて、自分のtypoは特に記憶に無いけど、
他人のソース見ててtypoに気付かなかったことなら最近もあった

649 :デフォルトの名無しさん:2016/05/04(水) 10:35:15.73 ID:PLBcNQ3k
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrent(Covenant)が活発な情報交換・交流コミュニティでオープンソース開発されています(プログラマー募集中)

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise氏)がそういう人と話したいそうなので、よろしければツイートお願いします<(_ _)>
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできない情報発信好きアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません


650 :デフォルトの名無しさん:2016/05/05(木) 10:33:09.46 ID:pSt39wpo
C#での質問なのですが、画像ファイルが存在しなかった場合、代替画像を使用する方法はどうしたらいいのでしょうか

Bitmap pic1 = new Bitmap("C:\hoge\\hogehoge.png");
Bitmap resultPic1 = new Bitmap(pic1);
pictureBox.Image = resultPic1;

651 :デフォルトの名無しさん:2016/05/05(木) 10:42:42.33 ID:lAw+TM4Q
とりあえず、スレタイを読む

652 :デフォルトの名無しさん:2016/05/05(木) 13:42:50.81 ID:nB+Q9ZXa
>>625
もう見てないかもしれんけど求まらんのはいいのかと聞いた手前
お粗末ながら一応コード貼っとく(検算用に素因数分解追加しといた)
http://codepad.org/68Zt5NaH
早く貼りたかったけど偏頭痛が酷くてやっとモニタ見られる様になった

653 :デフォルトの名無しさん:2016/05/05(木) 13:47:35.78 ID:nB+Q9ZXa
あ、なんか変なコメント残ったままだ
適当に消しといて

654 :デフォルトの名無しさん:2016/05/06(金) 12:12:01.41 ID:ToIsVvUm
>>647
> Lisp系やPascal系だと=は等価演算子になる
逆にPascal(と祖先のALGOL)って、変数への代入に2ストローク「:=」必要なんだよねぇ。
比較と代入、どちらが頻繁に使われるか考えれば、打鍵数の少ない識別子を代入操作へ割り当てるのが合理的だろうに。
数学の数式を書いてるんじゃない。
プログラムのコードを書いてるんだよ。
…と何度嘆いたことかw

655 :デフォルトの名無しさん:2016/05/06(金) 13:57:26.55 ID:7zTTCAP1
{ の代わりに begin と書く言語に今更何を言ってるんだか

656 :デフォルトの名無しさん:2016/05/08(日) 11:02:56.26 ID:yMzQXpIN
>>652
親切な方ありがとうございます!
ユークリッドの互除法使わずにってことですよね。
素因数分解は超時間かかるって困ってた気がするからきっと喜びます。
今習い事の合宿に行ってるので帰ったら見せます。

657 :デフォルトの名無しさん:2016/05/08(日) 12:11:30.15 ID:WYy3H5XU
質問です。
環境は VC++2016 です。

http://codepad.org/ym9XHixD

よろしくお願いします。

658 :デフォルトの名無しさん:2016/05/08(日) 13:11:00.79 ID:gvmmmsOx
>>657
const char*のrangeなんて物は存在し得ない。
char*型文字列は、ナル文字の位置がend()に相当するんだけど
その位置を簡単に求める方法は無い。
ASCIZ文字列について調べて理解してこい

659 :デフォルトの名無しさん:2016/05/08(日) 13:12:35.80 ID:7MEmH+ja
#include <boost/range/as_literal.hpp>
test(boost::as_literal(str));

char[]のほうでも使ったほうがいい

660 :657:2016/05/08(日) 13:44:43.44 ID:WYy3H5XU
>>658
>>659
返信ありがとうございます。

boost::as_literal

まさにこの関数を探していました。
ありがとうございました。

661 :デフォルトの名無しさん:2016/05/08(日) 14:57:22.64 ID:6aMlvRNd
こちらのスレでは不適切な内容でしたらご指摘ください。

業務で、VC++6.0で作成されたActiveXOCXをVC++2010に移植しました。
(アップグレードウィザード経由と思われますが、これについては自分が関与していないので
詳細は不明です)
そしてそのActiveXですが、これまでExcelのVBAから呼び出して使用していましたが
こちらもアップグレードということでVB.NET2010でExcelアドインとして再作成する予定になっています。

動作確認ということで、Excelアドインの簡単な枠組みを作成し、ボタンクリックでActiveXの
メソッドを呼び出す処理を作成したところ、実行時に以下のエラーが発生しました。

「System Runtime.InteropServices.COMExceptionで例外が発生しました。
致命的なエラーです。HRESULT=0x8000FFFF(E_UNEXPENTED)」

ネットでもいろいろ調べてみたのですが、VC++でActiveX OCXを作成すること自体がすでに時代遅れなのか
参考になるような事例が見つかりませんでした。
また、VC++6.0からアップデートしたソースに問題があるのかと思い、新規でActiveX OCXを作成してみましたが
結果は同じでした。

何か根本的に間違いを犯しているのでしょうか?
ご教示頂ければ幸いです。

662 :デフォルトの名無しさん:2016/05/08(日) 15:24:08.21 ID:nV7AqIlz
全角(S-JIS)と半角(ASCII)が混じった文字列データを全角・半角に分別するソフトを組みたいのですが、
全角文字と半角文字の区別の方法がわかりません。
どなたか教えていただけないでしょうか

663 :デフォルトの名無しさん:2016/05/08(日) 15:34:15.08 ID:CHUcVZyU
ascii範囲で全角の後続バイトじゃなければascii

664 :デフォルトの名無しさん:2016/05/08(日) 15:42:34.64 ID:Z7Rc4kW8
>>661
axitveXではなくてcomアドインで作るという選択肢はないの?
確かそのエラーは何か参照を追加していると出るんじゃないの?似たような経験がある。

665 :デフォルトの名無しさん:2016/05/08(日) 15:44:04.70 ID:Z7Rc4kW8
>>662
isalpha()みたいな関数無かったっけ?

666 :デフォルトの名無しさん:2016/05/08(日) 15:48:46.62 ID:2KDLdDvi
>>662
1バイト目で判断できるhttp://charset.7jp.net/sjis.html

667 :662:2016/05/08(日) 16:18:29.85 ID:nV7AqIlz
レスサンクス
1バイト目で判断する方法をやってみます

668 :デフォルトの名無しさん:2016/05/08(日) 16:25:23.47 ID:6aMlvRNd
>>664さん
ありがとうございます。
ActiveX部分もCOMアドインにする方針も俎上に上がりましたが、それだと既存のソースを
書き換える工数が大幅に増えてしまうということで却下されています。

なお、ATLプロジェクトですと、問題なくVB.NET(Excelのアドイン)から呼び出せることまで判明しています。
ですので、やはりActiveXOCXにしがみつくこと自体間違ってないか?という意見もありますが、
そこは固い企業ですので「ActiveXで駄目なのは、お前のやり方が悪いんじゃないのか?」と言われると
C++にさほど詳しくない自分としては何も言えないのが実情です。情けないですが。

引き続き、ご意見ご感想ご叱咤お待ちしております。お願いします。

669 :デフォルトの名無しさん:2016/05/08(日) 20:44:12.17 ID:l6dItGox
C++を勉強中です。構造体とかポインタとか難しいことはわかりませんが、DOS画面でのプログラムばっかであきてきました。
起動中のCドライブの丸ごとを別のハードディスクにコピーしたり、パーティションを自在に操作できるようなソフトを作りたいですが、お勧めの書籍などありますか

670 :デフォルトの名無しさん:2016/05/08(日) 20:46:08.16 ID:U52WpjlG
C++の機能じゃなくてWindowsの機能だから
そっちを覚えることになるんじゃないかなあ

671 :デフォルトの名無しさん:2016/05/09(月) 00:56:12.63 ID:EI9j01DT
char *やwchar *で最後がNULL文字以外で終わっていた場合
どういったときにどういう不具合がでるのですか?わざとNULL文字を入れないようにして試しているんですが普通に動きます

672 :デフォルトの名無しさん:2016/05/09(月) 02:12:03.48 ID:Vrwg3Tws
>>671
文字列の長さをNULL終端までとして処理する場合に
処理したい文字列の後のデータを余分に文字列として処理してしまう
また確保された領域を越えてアクセスしようとしてしまい例外が発生したりする

673 : ◆QZaw55cn4c :2016/05/09(月) 07:57:57.50 ID:ODEtKQkI
>>671
文字列の長さを別に記録するようにしているのならば,末尾NULL にする必要はない

674 :デフォルトの名無しさん:2016/05/09(月) 08:19:41.32 ID:DB03mCJB
>>673
#oblomov

675 : ◆QZaw55cn4c :2016/05/09(月) 10:17:47.80 ID:nfC7aUi/
僕は馬鹿です

676 :デフォルトの名無しさん:2016/05/09(月) 20:53:56.71 ID:sidu2Gua
各スレッドが同じグローバルデータを参照するようなマルチスレッドプログラムが、そのデータを同時に参照することになった場合には並列動作出来るのでしょうか?
特に各コアのキャッシュに読み込まれていない初回のデータアクセスに関してはメモリbusを各スレッドが順番待ちで使用して並列動作できないと考えるべきですか?

677 :デフォルトの名無しさん:2016/05/09(月) 20:59:21.12 ID:QYIZFGji
普通マルチスレッドなら排他制御するんじゃね?

678 :デフォルトの名無しさん:2016/05/09(月) 21:01:43.19 ID:QYIZFGji
と思ったら参照だけか。
スマソ。メモリバスレベルのことは俺は知らん。

679 :デフォルトの名無しさん:2016/05/09(月) 21:03:20.77 ID:WSElaHek
676はC/C++じゃなくてアーキテクチャの話じゃないの?

680 :デフォルトの名無しさん:2016/05/09(月) 21:11:52.14 ID:sidu2Gua
STLのfuture, threadやマイクロソフトのPPL(c++amp restrict cpu?)などで、マルチスレッド化下場合を想定してください。
アーキテクチャは、intel の市販CPU+チップセット(つまり、普通のPC)とします。

681 :デフォルトの名無しさん:2016/05/09(月) 21:22:13.60 ID:sidu2Gua
自分で書いてて気がついたのですが、同じグローバルデータに限らず、各コアが異なるアドレスに対してメモリアクセスする場合でも、メモリbusの使用に関して順番待ちになってしまい結局、並列動作できない?

682 :デフォルトの名無しさん:2016/05/09(月) 21:23:26.00 ID:WSElaHek
C/C++の質問じゃねーじゃんって話なんだけどね

683 :デフォルトの名無しさん:2016/05/09(月) 21:31:54.11 ID:sidu2Gua
>682
了解しました。
質問取り下げます。

684 :デフォルトの名無しさん:2016/05/09(月) 21:33:49.33 ID:QYIZFGji
いやC/C++もハードも含めた総合的な話だろ。

685 :デフォルトの名無しさん:2016/05/10(火) 00:56:14.18 ID:vVT3Tded
>>672
なるほど
ちなみにVC++2010なんですが、最後にNULL文字が入ってるかどうかってどうやったらわかりますか?

686 :デフォルトの名無しさん:2016/05/10(火) 05:20:11.49 ID:V/U8xU2d
つisThereNull()

687 :デフォルトの名無しさん:2016/05/10(火) 07:02:18.17 ID:xA250nOW
>>685
自分(のプログラム)で保証
ライブラリやAPIによる保証

どちらもない場合はNULL終端ではないとみなす
そうして僕たちは生きてきた

688 :デフォルトの名無しさん:2016/05/10(火) 08:42:42.91 ID:4pZizfk8
>>685
考え方が逆
『「いわゆるCの文字列」がNULL文字で終わる』のは定義なの
だからCの文字列がNULL文字以外で終わることなんてない
NULL文字以外で終わってたら、それはCの文字列ではない
Cの文字列のつもりなのにNULL文字を付け忘れると、意図通りに動かないし隣の変数を壊したりする

689 :デフォルトの名無しさん:2016/05/10(火) 09:56:50.75 ID:eXhtnP5I
>>681
コアのキャッシュメモリを見に行くから大丈夫
その代わりミスヒットかキャッシュ無効読み出しするまでバス経由で実体を見に行かない
コンパイラの組み込み関数を使ってコントロールする必要がある

690 :デフォルトの名無しさん:2016/05/10(火) 17:02:18.13 ID:3v8mTcBj
キャッシュコヒーレンシーは自動的に保たれるようになってるから
わざわざソフトで特別なコントロールをして実メモリ読込なんてしなくていいよ
並列度を上げるキモはL1(L2も)キャッシュサイズを考慮してキャッシュミスがなるべく少なくなるように設計すること

691 :デフォルトの名無しさん:2016/05/10(火) 20:37:58.06 ID:xG5kTGKm
配列ではないポインタをdeleteするときにもとりあえず[]をつけて大丈夫ですか?
やってみたらエラーは出なかったけどこれは要素1つの配列と解釈されたということでしょうか
それならなんでdeleteとdelete[]を使い分けなくてはいけない仕様なんでしょうか
int *p = new int;
delete[] p;

692 :デフォルトの名無しさん:2016/05/10(火) 20:55:18.34 ID:vVT3Tded
>>687
>>688
ではVC++の画面で文字列として扱われている以上NULL文字が入っているということでいいんですか?

693 : ◆QZaw55cn4c :2016/05/10(火) 21:18:30.45 ID:HakJiq7i
>>691
そりゃだめだろう

694 :デフォルトの名無しさん:2016/05/10(火) 21:23:44.94 ID:JjolmsHU
>689
>690
質問取り下げたにも関わらず回答ありがとう。

695 :デフォルトの名無しさん:2016/05/10(火) 21:57:25.83 ID:/c+E/E1d
>>691
>配列ではないポインタをdeleteするときにもとりあえず[]をつけて大丈夫ですか?
確か大丈夫だったと思う

696 :デフォルトの名無しさん:2016/05/10(火) 22:48:56.78 ID:HO4tbZvB
途中からdeleteの仕様変わったんだっけ?確か。

697 :デフォルトの名無しさん:2016/05/10(火) 23:02:54.70 ID:4pZizfk8
>>692
デバッガはchar*は文字列かもしれないから、もし文字列だったらどうなのかをだしてるだけ
メモリを走査していけばいつかは0にあたるし

NULL文字は自分で入れるんだよ
char * str = "abc";
はNULL文字まで入ってる

698 :デフォルトの名無しさん:2016/05/10(火) 23:13:42.19 ID:oNXhVzVr
えっ
いまc++11のworking draft見た感じだとdeleteの区別してるっぽいけど?
違った場合動作は未定義ってかいてあるぞ
こっから変わったの?

699 :691:2016/05/10(火) 23:48:38.76 ID:xG5kTGKm
関係あるかわかりませんが使っているのはVisualStudioExpress2012です

700 :デフォルトの名無しさん:2016/05/11(水) 00:17:08.98 ID:IWr/hrAP
c++の規格としてはやっぱり区別しなきゃいけないんだから
ある環境で正常に動いたとしてもそれはたまたまだと思ってちゃんと規格通り区別すべき
vcは規格と違う仕様が多いから注意したほうがいい、finallyとか

701 :デフォルトの名無しさん:2016/05/11(水) 02:59:19.90 ID:mXAct+cM
最初の人とは違いますが
そもそもなぜdeleteとdelete[]の二つが必要だったんですか?
初心者ですが理由がパッと思いつきません…

702 :デフォルトの名無しさん:2016/05/11(水) 09:02:54.17 ID:HF1jtJdR
配列の場合、配列サイズが分かる情報が必要だから

703 :デフォルトの名無しさん:2016/05/11(水) 11:31:10.81 ID:Xef87XAV
そうじゃないだろ?
サイズならコンパイル時に決定してるじゃん

704 :デフォルトの名無しさん:2016/05/11(水) 12:02:29.81 ID:bRTYzXSU
CFoo *の値だけじゃ1個だけなのか配列なのか区別できない
1個だけの時でも配列の時のように数をどこかに隠し持っていればできるが
1個だけの時にオーバーヘッドが出るのが嫌だったんだろう

区別したくない奴は必ず配列で書けばいいんだよ
1個だけしかいらない時でも CFoo * ptr = new CFoo[1]; ...; delete[] ptr; ってね


>>703
配列newは普通に実行時に決定ですが

705 :デフォルトの名無しさん:2016/05/11(水) 14:43:09.30 ID:SK3LEuNa
>>704
newで配列を確保してるんですか?
すごいな、最近のc++ではそんなことできるんだw

706 :デフォルトの名無しさん:2016/05/11(水) 15:05:39.93 ID:GzlL/1jH
CFoo * ptr = new CFoo[1];
を配列とでも思ってるでしょうねwww

707 :デフォルトの名無しさん:2016/05/11(水) 15:12:58.22 ID:HF1jtJdR
なんだこいつら(?)頭おかしいのか

708 :デフォルトの名無しさん:2016/05/11(水) 15:13:33.41 ID:GzlL/1jH
おまえがなw

709 :デフォルトの名無しさん:2016/05/11(水) 21:23:08.35 ID:LnJQmy5e
newで取った連続メモリを配列と呼ばないなら何て呼ぶんだ?

710 :デフォルトの名無しさん:2016/05/11(水) 21:47:47.14 ID:GzlL/1jH
>>709
おまいさんはもう一度C++を勉強しなおせ
sizeof(ptr)
はいくつでしょうか?

711 :デフォルトの名無しさん:2016/05/11(水) 21:50:29.47 ID:D1YLtaNk
>>710
sizeof(ptr) と delete [] の関係は規格のどの辺に書かれてますか?

712 :デフォルトの名無しさん:2016/05/11(水) 21:59:07.70 ID:9I7Ewr6L
http://cs.nyu.edu/courses/summer11/G22.2110-001/documents/c++2003std.pdf

5.3.5 Delete
1
[expr.delete]
The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
delete-expression:
:: opt delete cast-expression
:: opt delete [ ] cast-expression
The first alternative is for non-array objects, and the second is for arrays.


non-array, arrays
ばっちり書かれとるがな。

713 :デフォルトの名無しさん:2016/05/11(水) 22:43:46.72 ID:HF1jtJdR
>>710
やっぱりな。こりゃ本物だわ

714 :デフォルトの名無しさん:2016/05/12(木) 01:43:52.21 ID:/RNlf0h0
ばかばっかだなw

715 :デフォルトの名無しさん:2016/05/12(木) 02:53:45.01 ID:wGzvcNCy
配列とポインタは同じだと思ってるんだろうなw

716 :デフォルトの名無しさん:2016/05/12(木) 08:22:31.73 ID:72xNs51t
>>710
お前はsizeof(ptr)とsizeof(*ptr)の違いを知れ

717 :デフォルトの名無しさん:2016/05/12(木) 08:45:30.93 ID:G/keDtzh
おまえら本当馬鹿ばっかだな
何回言ったらわかるんだ

配列とポインタは違うって・・・

718 :デフォルトの名無しさん:2016/05/12(木) 09:35:17.51 ID:e6oRkxgP
まーだIDコロコロしながら基地外晒し続けてるのか
ptrが配列だなんて誰も言ってないんだよ
ptrが指してる先が配列なんだよ
この糞バカ・ドジ・マヌケ

719 :デフォルトの名無しさん:2016/05/12(木) 09:52:47.03 ID:cPh0xdH3
newして得たポインタが配列だってよwwwww

720 :デフォルトの名無しさん:2016/05/12(木) 11:37:00.64 ID:ehHa3Ia2
delete: 削除対象のインスタンスは1つのみなので、ポインタが指しているオブジェクトのデストラクタを実行すればよい。
delete[]: 削除対象のインスタンスは配列になっているので、オブジェクトの配列そのものだけではなく、
何回デストラクタを実行すればよいのかを保存しておく必要がある。
delete[] はそれを参照して、繰り返しデストラクタを走らす。

なので、 new int[10] したものを delete で削除してもそもそもデストラクタが存在しないので、
問題が発生することはまずないが、デストラクタで何らかの処理(暗黙、明示的な)をおこなう場合、
本来実行されるべきデストラクタが走らず問題となることがある。
(よく言う delete[] を使うべきところで delete を使うと、リークすることがあるというやつだ)

>>719
new A[20] で確保されるのは A型20この配列で、結果はその配列へのポインタだろ。
これのどこに問題他あるんだ? (ポインタが配列なんじゃなく、ポインタが指す先が配列)

また delete ptr; というのは ptr 自体を delete するわけではなく、 ptr が持っているポインタが
指している先のオブジェクトを delete するんだよな。 delete[] ptr 自体を delete するわけではなく、
ptrが指しているオブジェクトの配列を削除する。

つりだとしても面白くなさ過ぎるからいい加減にしろ。

721 :デフォルトの名無しさん:2016/05/12(木) 16:19:56.75 ID:3OjnTRaH
結論はdeleteでもdelete[]でもどっちでも良いという事だな。

722 :デフォルトの名無しさん:2016/05/12(木) 20:49:15.25 ID:Vdq3bAon
なぜそうなるw

723 :デフォルトの名無しさん:2016/05/12(木) 21:42:24.41 ID:R6+MliT1
QZの逆をいくのが

724 :デフォルトの名無しさん:2016/05/13(金) 16:02:01.50 ID:LU5Y7ENM
>区別したくない奴は必ず配列で書けばいいんだよ
>1個だけしかいらない時でも CFoo * ptr = new CFoo[1]; ...; delete[] ptr; ってね

これはどうなの

725 :デフォルトの名無しさん:2016/05/13(金) 16:34:06.74 ID:0l3VxkcG
new CFoo[n]; は n>=0 で有効(たぶん)

726 :デフォルトの名無しさん:2016/05/13(金) 22:51:08.25 ID:Q2K6b21m
むむ…質問したものですが難しいですね
発端というのがfreeならメモリ確保したやつってなんでも?(malloc,calloc)、どんな長さでも解放してくれると思ったので
てっきりメモリアドレスと確保した長さをどっかに保持しているのかなと
C++だとやってはくれないから[]付きがあるのかなと漠然と思っていたのですが
もっと難しい問題があるんですね…

727 :デフォルトの名無しさん:2016/05/13(金) 23:04:34.98 ID:2JmOmUY3
言われてみれば。
mallocは確かに確保した長さを保持してたと思うが、
newも確保した長さ保持してるよね?
そうなるとdeleteで[]を指定しなきゃならない理由がわからんなぁ。

728 :デフォルトの名無しさん:2016/05/13(金) 23:13:30.72 ID:ZUyuraMo
>>726
> てっきりメモリアドレスと確保した長さをどっかに保持しているのかなと
K&Rのmallocやglibcのmallocはまさにそういう情報を某所に保持してる。
某所と言うかブロックの先頭アドレスの直前あたりに必要なだけの大きさの領域をこっそり確保したりしてる。

でもそれとこれとは別問題。
delete[]は配列上の全てのオブジェクトのデストラクタを呼び出すけど、
deleteは単一のオブジェクトのデストラクタしか呼び出さない。
難しくないよ。
あと内部構造もちょっと違うみたいでideone.comの環境だとdelete[]するべきところでdeleteするとSegmentation Faultで落ちる。
まぁ異常修了を正常終了と偽るくらいは出来るけど。
https://ideone.com/NjRmLT

729 :デフォルトの名無しさん:2016/05/14(土) 00:18:52.64 ID:mszX5zzu
おおー!ありがとうございます
生き死にの関係でシンプルにはできないんですね
やっぱりbetter Cにするにしても中々大変です…

730 :デフォルトの名無しさん:2016/05/14(土) 07:48:22.03 ID:C+tPjEbi
>>728
visual studioなら正常終了するよね。

731 :デフォルトの名無しさん:2016/05/14(土) 10:18:35.09 ID:Hwp5XNP7
VS2015で試してみたけど正常終了しないが

732 :デフォルトの名無しさん:2016/05/14(土) 10:47:05.81 ID:C+tPjEbi
>>731
俺はvs2013

733 :デフォルトの名無しさん:2016/05/14(土) 11:13:20.15 ID:Hwp5XNP7
>>732
VS2013でも同じだけど?
例外コード:c0000374

734 :デフォルトの名無しさん:2016/05/14(土) 12:20:54.88 ID:BsF9lC3v
>>732
もしかしてsignalで11番殺してない?

735 :デフォルトの名無しさん:2016/05/14(土) 12:39:01.33 ID:Hwp5XNP7
signal(11, handler);の行が有ろうが無かろうが同じだよSIGSEGVじゃないから

736 :デフォルトの名無しさん:2016/05/14(土) 12:52:45.95 ID:BsF9lC3v
>>735
同じじゃないよ?
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html

737 :デフォルトの名無しさん:2016/05/14(土) 12:56:00.45 ID:Hwp5XNP7
>>735
あのねVSでWindows環境での話をしてるんだが

738 :デフォルトの名無しさん:2016/05/14(土) 12:56:42.12 ID:BsF9lC3v
・・・・・・ごめん、もしかして、そのVisual StudioとかWindowsとかいう環境だと違う値なの?

739 :デフォルトの名無しさん:2016/05/14(土) 12:56:59.96 ID:C+tPjEbi
>>733
本当か?
おれは今まで一度もdeleteとdelete[]を区別した事がない。
どっちでも同じだと思っていたよ。何十年も。
仕事で書いたコードの中もそうなっている。まあいいか。

740 :デフォルトの名無しさん:2016/05/14(土) 13:02:55.75 ID:BsF9lC3v
度々ごめんよ
> signal(11, handler);の行が有ろうが無かろうが同じだよSIGSEGVじゃないから
この文の解釈なんだけど、
SIGSEGVが11と違う値になってるから
って意味と
発生するエラーがSIGSEGVでは無いから
って意味の2通りに解釈できて

俺は前者だと思ったんだけど、後者の意味で使ってた?

741 :デフォルトの名無しさん:2016/05/14(土) 13:03:27.92 ID:Hwp5XNP7
>>738
「ハンドルされない例外が 0x77C2E843 (ntdll.dll) で発生しました(DeleteTest2013.exe 内): 0xC0000374: ヒープは壊れています。 」
デバッグビルドだとC++ライブラリのスカラーdeleteコード内で「Debug Assertion Faild!」になる
ヒープの正当性チェックはMS環境のほうがしっかりしてる印象

742 :デフォルトの名無しさん:2016/05/14(土) 13:06:11.66 ID:Hwp5XNP7
>>740
不正なヒープ操作はSegmentation Faultになる以前にランタイム/APIのチェックに引っかかるということ
MS環境では

743 :デフォルトの名無しさん:2016/05/14(土) 13:10:26.77 ID:BsF9lC3v
>>741-742
なるほどなー

ちなみにWindowsのバージョン幾つ?
NTだかMEだかの頃にヒープ周りの内部動作が変わったことが原因で
メモリの解放後に触りに行く類の致命的なバグを含む某ゲームが動かなくなったって記事を
昔どこかで読んだんだけど

744 :デフォルトの名無しさん:2016/05/14(土) 13:19:20.71 ID:Hwp5XNP7
ちなみにLinux上のclang++(3.8.0)だと
DeleteTest.cpp:35:2: warning: 'delete' applied to a pointer that was allocated with 'new[]'; did you mean 'delete[]'?
[-Wmismatched-new-delete]
delete bar;

になる。
new[]で確保したものをスカラーdeleteするのは完全に違法行為だから「どっちでもいい」なんて
決して考えてはいけない

745 :デフォルトの名無しさん:2016/05/14(土) 13:21:39.11 ID:Hwp5XNP7
>>743
Windows7 pro SP1 64ビット

746 :デフォルトの名無しさん:2016/05/14(土) 13:27:29.06 ID:BsF9lC3v
>>745
ありがとう。

>>739さんの環境とは違うんだろうか・・・・・・

747 :デフォルトの名無しさん:2016/05/14(土) 13:28:49.00 ID:C+tPjEbi
>>744
じゃあ
newで要素一個
int *p = new int[1];
の場合なら、
delete p;
delelte[] p;
どっちでもいいか?

748 :デフォルトの名無しさん:2016/05/14(土) 13:36:48.18 ID:Hwp5XNP7
>>747
よくない
一個かどうかの問題じゃなくてnew[]とスカラーnewとじゃメモリレイアウトが違う

749 :デフォルトの名無しさん:2016/05/14(土) 13:40:07.44 ID:C+tPjEbi
>>748
君、なんでそんなに詳しい?

750 :デフォルトの名無しさん:2016/05/14(土) 13:44:47.82 ID:BsF9lC3v
>>749
内部でどう実装してるか考えたら自然とそういう結論になると思うの

751 :デフォルトの名無しさん:2016/05/14(土) 14:24:17.93 ID:hY9hPc0m
ID:BsF9lC3v
コントみたいで吹いたw

752 :デフォルトの名無しさん:2016/05/16(月) 08:19:11.08 ID:vUiBQ3d1
質問です。

int 型に -2147483647 を直接入れるとエラー(警告)が出ます。
VC++2016のバグかと思うんですが、どうなんでしょうか。

http://codepad.org/o2GnUBtr

よろしくお願いします。

753 :752:2016/05/16(月) 08:20:21.33 ID:vUiBQ3d1
-2147483647 ではなく
-2147483648 の間違いです。

リンク先のコードはあってます。

http://codepad.org/o2GnUBtr

754 :デフォルトの名無しさん:2016/05/16(月) 08:51:44.86 ID:wkAz3sqc
i = -2147483647
i = i - 1
やってみてよ

755 :デフォルトの名無しさん:2016/05/16(月) 09:08:11.17 ID:IBGTyv6p
C言語の整数リテラルの謎【解説編】
http://qiita.com/raccy/items/e793f67f7e0ab98ef0d9

リテラルにくっつく暗黙変換とか細かい挙動は意外に把握できてなかったりする

756 :デフォルトの名無しさん:2016/05/16(月) 09:09:56.48 ID:5ug0//ZW
>>752
こんなバグがあるとはw VS2015でもそうなる
i = -2147483647-1;なら通る

757 :デフォルトの名無しさん:2016/05/16(月) 09:18:33.32 ID:5ug0//ZW
>>755
バグじゃなくて仕様なのか?
確かにVCのINT_MINの定義は(-2147483647-1)になってるわ
それにしても納得出来ないなあ

758 :752:2016/05/16(月) 09:19:59.95 ID:vUiBQ3d1
やっぱバグみたいなもんですね。

>>754
普通に通ります。

>>756
こちらでも通ります。

>>755
ありがとうございます。
たぶん 2147483648 が一度 unsigned long long (uint64_t) として扱われてるんじゃないかと思います。


ありがとうございました。

759 :デフォルトの名無しさん:2016/05/16(月) 09:26:33.03 ID:5ug0//ZW
>>758
>たぶん 2147483648 が一度 unsigned long long (uint64_t) として扱われてるんじゃないかと思います。
たぶんそうだね。でもここに書いてることと矛盾している
https://msdn.microsoft.com/ja-jp/library/c70dax92.aspx
>プレフィックスもサフィックスも付かない場合、コンパイラは整数リテラル値に型 int (32 ビット) を与えます。
>値が収まりきらない場合は型 long long (64 ビット) を与えます。

i = -2147483648LL;なら通るし

760 :デフォルトの名無しさん:2016/05/16(月) 14:52:34.58 ID:Lk4dVwp2
最低限C4146で検索しようぜ
https://msdn.microsoft.com/ja-jp/library/4kh09110.aspx

まぁ規格では int -> long int -> long long int ってなってるからバグって言っていいと思う

761 :デフォルトの名無しさん:2016/05/16(月) 20:51:52.35 ID:RI3Zko2J
マイナスは後から計算するんだろ。
intならオーバーフローじゃないか。

762 :デフォルトの名無しさん:2016/05/16(月) 21:20:10.84 ID:1HaCrD/E
char*とstd::stringの違いってなんですか?

763 :デフォルトの名無しさん:2016/05/16(月) 22:23:01.56 ID:ygw1DlKj
>>762
むしろ同じ所が無い

764 :762:2016/05/16(月) 22:37:01.06 ID:1HaCrD/E
>>763
具体的に何が違うのでしょうか?

765 :デフォルトの名無しさん:2016/05/16(月) 22:38:32.41 ID:JIPl13T1
>>764
型が違う

766 :デフォルトの名無しさん:2016/05/16(月) 22:48:58.13 ID:RI3Zko2J
和ロス

767 :デフォルトの名無しさん:2016/05/16(月) 23:13:00.72 ID:ygw1DlKj
>>764
逆に何が同じなのか聞きたいよ…
相互に型を変換出来るようになっているだけで、全く違うものなんだけど…

768 :デフォルトの名無しさん:2016/05/16(月) 23:25:41.53 ID:RVOStkbz
でもまあ、char*は文字列を扱うのに使いますと教わっていれば
たしかに違いは分からんかもしらん

769 :デフォルトの名無しさん:2016/05/16(月) 23:33:15.73 ID:RI3Zko2J
char*が不便すぎてstringが出来たってことかな。

770 :デフォルトの名無しさん:2016/05/17(火) 00:52:55.36 ID:uQhb1g5z
C++ではcharは規則が特別扱いだからなあ。

771 :デフォルトの名無しさん:2016/05/17(火) 01:42:44.94 ID:/hMFQ+1O
C++14での質問です。
structのメンバ変数を取得する方法は、Boost.Fusionにある
struct_member_name<person, 0>::call()
とかで取得できますが、classにはこの方法は使えません。

classでメンバ変数一覧を取得する方法はないのでしょうか?
一応、
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4113.pdf
こちらに、将来的には、type_traitsにstd::class_memberなるものを実装するようなことが書かれていますが、
現段階で取得する方法はないのでしょうか?

772 :デフォルトの名無しさん:2016/05/17(火) 06:17:48.53 ID:eRIY89eq
>>762
樽に入れた酒とカップ酒(熱燗機能付き)くらい違う

素人は器に移す時にこぼしたり
計量を間違えたり
栓を忘れたりする

773 :デフォルトの名無しさん:2016/05/17(火) 07:07:40.68 ID:iUzOcy+l
例えがわかりにく過ぎ

774 :デフォルトの名無しさん:2016/05/17(火) 07:32:08.55 ID:74/nDTTZ
>>762
同じだ

775 :デフォルトの名無しさん:2016/05/17(火) 10:56:13.63 ID:dkgGpRzf
>>762

char* はより低級な型。プリミティブ型。
std::string はより高級な型。STLで定義されてる。

char* で効率よく書けば、普通は最も高速。だけどいろいろ面倒。
std::string は、十分に速いけどchar* よりは低速。だけどいろいろ便利。


>>771

struct と class は本質的には同じものだから、class でも取得出来るかと。
試しに class に対して BOOST_FUSION_ADAPT_STRUCT で定義してみたけど、普通に取得出来た。

VisualC++ 2016
boost_1_60_0

776 :デフォルトの名無しさん:2016/05/17(火) 11:19:16.51 ID:35EWU0NF
ユニコードについて質問です

CreateWindow("LISTBOX" , ...); で作成したリストボックスはユニコード対応できないのでしょうか
何かフラグ指定すればユニコード対応になるとかはないのですか?

777 :デフォルトの名無しさん:2016/05/17(火) 11:33:24.98 ID:0ndBRKVS
>>776
手元に環境が無くて試せないんだけど、Unicode版を使ってみたらどうなる?

CreateWindowW(L"LISTBOX", ...);

778 :デフォルトの名無しさん:2016/05/17(火) 12:38:43.28 ID:35EWU0NF
>>777
ありがとうございます
リストボックスに文字列を追加する際のSendMessageをユニコード対応のSendMessageWにしたところうまく行きました
お手数をおかけしました

779 :デフォルトの名無しさん:2016/05/17(火) 13:19:44.22 ID:kiryrbN3
>>775
ありがとうございます。
使い方を間違っていたようです。BOOST_FUSION_ADAPT_STRUCTで予めfusionで扱えるコンテナにする必要があるんですね。
その際、結局メンバ名などが必要になるのですね。。

ちょっとしたORMを実装しようと思っていたので、
これだとちょっと使えなさそうです。

780 :デフォルトの名無しさん:2016/05/20(金) 11:16:33.86 ID:czYvqd6J
vector<int> v1(10);

v1.push_back(999);
v1.push_back(111);
v1.push_back(666);
v1[3] = 777;

printf("%d\n", v1[0]);
printf("%d\n", v1[1]);
printf("%d\n", v1[2]);
printf("%d\n", v1[3]);

[出力結果]
0
0
0
777

vectorの要素数を10コ確保し
push_back()を呼ぶと配列に代入されず0となるんだが。
どうすれば?

781 :デフォルトの名無しさん:2016/05/20(金) 11:40:18.01 ID:jCV1qcCq
>>780
そのコードだと、
10個の0に続けて999, 111, 666を追加してる。
コンストラクタとpush_back()の仕様をよく読んでみ

782 :デフォルトの名無しさん:2016/05/20(金) 12:42:41.56 ID:EWS23G7J
>>780
v1.size()で要素数を確認!

783 :デフォルトの名無しさん:2016/05/20(金) 19:14:43.03 ID:COmJEZ9N
>>780
capacity()を使え

vector<int> v1;
v1.capacity(10);

v1.push_back(999);
v1.push_back(111);
v1.push_back(666);

784 :デフォルトの名無しさん:2016/05/20(金) 23:14:26.91 ID:aa5yUFRV
reserve

785 :デフォルトの名無しさん:2016/05/20(金) 23:27:57.07 ID:OCEBmLiZ
昔reserveつかって結構なパフォーマンス改善したことあってビビったわ。

786 :デフォルトの名無しさん:2016/05/21(土) 14:44:21.49 ID:af3CQIfx
>>783
その方法で、質問者の問題が何か解決するの?

787 :デフォルトの名無しさん:2016/05/22(日) 19:05:21.71 ID:6HgZ7OjL
asioのサンプルコードを見ていたら[this]というものが出てきました。
acceptor_.async_accept(socket_,
[this](std::error_code ec)
[this]とはどういう意味なのでしょうか?

788 :デフォルトの名無しさん:2016/05/22(日) 19:26:28.52 ID:8P2D0URL
async_accept の accept_handler として lambda を渡して
その variable capture してるんじゃないの?

789 :787:2016/05/22(日) 19:30:59.48 ID:6HgZ7OjL
>>788
あ、これがラムダなんですね。
ありがとうございます!

790 :デフォルトの名無しさん:2016/05/24(火) 04:10:06.37 ID:YXVEPgBa
http://pastebin.com/ZsCtQBXF
do_accept()が呼ばれるたびにstd::make_shared<Session>(std::move(socket_))->start();が実行されているのですがstd::moveしているのにsocket_を参照できるのはなぜですか?

791 :デフォルトの名無しさん:2016/05/24(火) 16:47:12.75 ID:nQh0KP4n
変数の命名について質問です。

792 :デフォルトの名無しさん:2016/05/24(火) 16:48:42.66 ID:nQh0KP4n
↑なぜか2行目から表示されなかったので連投失礼します。
変数の命名について質問です。
"_"+大文字から始まる名前や、"__"を含む名前は予約語と被るのでつけない方が良いとのことですが、
では"_"+小文字から始まる名前なら問題ないのでしょうか?
クラスのメンバ変数に"_a"もしくは"a_"と命名したいと思っています。

793 :デフォルトの名無しさん:2016/05/24(火) 18:14:10.60 ID:TtTF6uFS
>>792
環境依存。
実際に使ってみて、駄目だったら使うな。

794 :デフォルトの名無しさん:2016/05/24(火) 19:24:21.51 ID:/CRqdm6R
そんなひどいw

795 :デフォルトの名無しさん:2016/05/24(火) 20:11:53.37 ID:/CRqdm6R
移植するとき発狂するぞw

796 :デフォルトの名無しさん:2016/05/24(火) 21:06:09.03 ID:TtTF6uFS
_allocaなんかはどこかのクソ環境だと被るよね。

797 :デフォルトの名無しさん:2016/05/24(火) 21:10:26.22 ID:uzPl1U54
#include <iostream>
using namespace std;
class pokemon{
private:
int height;
double weight;
public:
void show();
void setNumGas(int h, double w);
};
void pokemon::show(){
cout <<

798 :デフォルトの名無しさん:2016/05/24(火) 21:12:13.14 ID:uzPl1U54
上記のプログラムの実行結果が
500は正しい体重ではありません
変更できませんでした
ポケモンの身長は4196992です
ポケモンの体重は2.07321e-317です
となります
なぜでしょうか?

799 :デフォルトの名無しさん:2016/05/24(火) 21:13:01.05 ID:uzPl1U54
void pokemon::show(){
cout << "ポケモンの身長は" << height << "です\n";
cout << "ポケモンの体重は" << weight << "です\n" ;
}
void pokemon::setNumGas(int h,double w){
if(h > 0 && h <500){
height = h;
weight = w;
cout <<"身長を"<< height <<"に体重を" <<weight <<"にしました\n";
}
else{
cout << w <<"は正しい体重ではありません\n";
cout <<"変更できませんでした\n";
}}
int main()
{ pokemon pikachu;
// pikachu.height = 10000;
// pikachu.weight = 10000;
pikachu.setNumGas(1000,500);
pikachu.show();
}

800 :デフォルトの名無しさん:2016/05/24(火) 21:15:34.18 ID:TtTF6uFS
1000 < 500はfalseだよね

801 :デフォルトの名無しさん:2016/05/24(火) 21:34:23.83 ID:+9luGJWT
1〜499じゃないとelseにいく

本題とは別な突っ込みになるけど
0 < h && h < 500 か 500 > h && h > 0 にした方が見やすいよ
右に行くほど大きくか左に行くほど大きくか統一って意味ね

802 :デフォルトの名無しさん:2016/05/24(火) 22:25:42.58 ID:uzPl1U54
>>801
わかりました

803 :デフォルトの名無しさん:2016/05/24(火) 23:13:18.08 ID:RnD2X6bw
>>790
ムーブ後のtcp::socketオブジェクトは閉じた状態の正常なソケットになるだけだから
それと承知なら(読み書きしようとすればエラーを返す)問題なく参照できる

804 :デフォルトの名無しさん:2016/05/25(水) 00:04:49.25 ID:0v8CMiQb
>>792-796
a_ はOK

_a は、ややこしいからダメ。
とにかく、_ を先頭に使ったらダメ

805 :デフォルトの名無しさん:2016/05/25(水) 02:23:32.64 ID:aTqwr9d2
仕様と、環境ごとの話と、デファクトスタンダードと、自分の好み
わざと混ぜて話す人が多そう

806 :デフォルトの名無しさん:2016/05/25(水) 02:34:25.13 ID:ww7whTPS
メンバ変数は_小文字がベスト
これで問題起きるって言ってる奴は単に頭腐ってる奴だから無視でOK
_allocaの例にしてもww

807 :デフォルトの名無しさん:2016/05/25(水) 02:45:36.72 ID:MxlKt/PB
好み(宗教)の問題だろうに、ベストとか言っちゃうのは残念な感じだな

808 :デフォルトの名無しさん:2016/05/25(水) 02:47:57.72 ID:ww7whTPS
>>807
好み(宗教)で済むと断言してるのもあなたの好み(宗教)でしかないですね

809 :デフォルトの名無しさん:2016/05/25(水) 02:55:24.44 ID:MxlKt/PB
返しも残念だったと

810 :デフォルトの名無しさん:2016/05/25(水) 03:01:10.26 ID:ww7whTPS
メンバ変数は_小文字がベストというのはもちろん俺の意見だけど
何の意見も言わずにケチ付けるだけしか能のないお前よりマシだよ
このクソ低能

811 :デフォルトの名無しさん:2016/05/25(水) 03:10:48.78 ID:ww7whTPS
メンバ変数のプリフィックス(あるいはポストフィックス)をどうするるべきか?
或いはthis->を使うべきか?、そもそもそんなもものは必要ないのか?、
という話題はC++の歴史の中で嫌になるほど繰り返し繰り返し出てるのに
「好み(宗教)」で済むと言ってるお前は何も考えてない思考停止野郎なんだということ自覚しろよ
少なくとも俺は自分の意見を言った

812 :デフォルトの名無しさん:2016/05/25(水) 07:10:18.79 ID:SLfE9uQ3
宗教戦争だという結論

813 :デフォルトの名無しさん:2016/05/25(水) 07:44:59.40 ID:RPqKSRgi
_で始まるシンボル名はQACで警告が出るから使わない

814 :デフォルトの名無しさん:2016/05/25(水) 08:11:41.55 ID:6ZfKurqy
> 0 < h && h < 500
これ一択

815 :デフォルトの名無しさん:2016/05/25(水) 08:16:55.52 ID:6ZfKurqy
>>811
> 少なくとも俺は自分の意見を言った

だからそう言う行為が
> 歴史の中で嫌になるほど繰り返し繰り返し出てるのに
いい加減学習しろよ

816 :デフォルトの名無しさん:2016/05/25(水) 09:41:15.27 ID:8+OpaV01
>>806
GoogleのC++スタイルガイドによると、「アンダースコアで終わる小文字とアンダースコアの列にする」のがベスト
http://www.textdrop.net/google-styleguide-ja/cppguide.xml
> データメンバ(インスタンス変数やメンバ変数とも呼ばれる)は通常の変数名と同様、
> アンダースコアを含む小文字にします。ただし、必ずアンダースコアで終わってください。

アンダースコアで開始するのがベストってソース何処よ

817 :デフォルトの名無しさん:2016/05/25(水) 09:42:48.46 ID:ww7whTPS
QAC?古代人は大変だねえ(げらげら)

818 :デフォルトの名無しさん:2016/05/25(水) 09:45:39.65 ID:ww7whTPS
>>816
Googleスタイルガイドはお前にとってはユダヤ教徒にとってのタルムードみたいなものなんか?
あーこわこわ

819 :デフォルトの名無しさん:2016/05/25(水) 09:51:42.37 ID:8+OpaV01
>>818
宗教の問題を宗教的喩えで表現するのか。斬新だな。
小文字_がベストってのは俺だけじゃなく、Googleで働いてる殆ど全てのC++プログラマの意見なんだけど(前確認した)
_小文字がベストっていうのは君個人の意見だって事しか俺は知らないんだ。

素晴らしい能力を持つGoogleの多くのプログラマの意見と、
能力不明な君の意見と、
一般的に言ってどっちが正しいと俺が考えると思う?

820 :デフォルトの名無しさん:2016/05/25(水) 09:57:43.10 ID:ww7whTPS
ついに思考停止のお前の脳みそがどう判断するかが基準になったかw
勝手にすれば良いけど_小文字が問題あるかのようなデマを流して俺に迷惑かけるなよ

821 :デフォルトの名無しさん:2016/05/25(水) 10:13:37.59 ID:8+OpaV01
>>820
デマじゃないよ。

n3690の17.6.4.3.2によると
Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
と書かれていて、_小文字が安全かどうかは実装依存だよ。

いい加減、問題じゃないどころか_小文字はベストだって言うならソースをくれよ。

822 :デフォルトの名無しさん:2016/05/25(水) 10:15:43.32 ID:8+OpaV01
あぁ、メンバ変数の名前として使うケースだと、ここからは危険だとは読み取れないね。

823 :デフォルトの名無しさん:2016/05/25(水) 11:30:55.27 ID:ww7whTPS
「ああ」「読み取れない」www
"in the global namespace. "
知ってるよそんなことくらいw

824 :デフォルトの名無しさん:2016/05/25(水) 11:53:53.00 ID:MxlKt/PB
宗教なんて言われるのは、他の宗教を認めないからか(自分の宗教がベスト)
好みの問題じゃなかったな、スマソ

825 :デフォルトの名無しさん:2016/05/25(水) 12:48:00.29 ID:F7idSeRd
そのソースを使い回したりせず、
アセンブリでデバッグしないと断言できるならプリフィクスに_付けるのも良いんじゃないの

俺は謙虚だからそんなことしないけどな

826 :デフォルトの名無しさん:2016/05/25(水) 12:54:37.88 ID:/FbN3Qal
命名ルールで熱くなれるなんてスケールが小さくてうらやましいな。
俺もしょっぽいことにいちいち熱くなれるようになりたい。

827 :デフォルトの名無しさん:2016/05/25(水) 13:01:12.64 ID:F7idSeRd
おうどうした、スケールの大きい悩みがあるなら聞いてやるぞ

828 :790:2016/05/25(水) 15:51:07.16 ID:Y0+hoqGR
>>803
ありがとうございます!

829 : ◆QZaw55cn4c :2016/05/25(水) 20:53:58.41 ID:xoXxd0b5
>>827
きいてくれ
書くたびにクソ呼ばわりされるんだが,どこをなおせばいい?

830 :デフォルトの名無しさん:2016/05/25(水) 20:55:13.73 ID:8+OpaV01
うまれをなおせばいい

831 :デフォルトの名無しさん:2016/05/26(木) 10:44:14.56 ID:ZOuyJMgW
>>829
まずそのクソコテを隠せ。


…すまん。普段はこんな悪い言葉の投稿をしないのだけど、
書いておかないと >>829 の相談内容自体がウソになってしまうでな。

832 :デフォルトの名無しさん:2016/05/26(木) 12:53:12.48 ID:6KAnMnB/
クソコテ隠してもうんこ臭プンプンだから無理

833 :デフォルトの名無しさん:2016/05/26(木) 21:17:08.33 ID:v90G5jKa
>>832
何がにおうのですか?

834 :デフォルトの名無しさん:2016/05/26(木) 21:55:39.62 ID:tNvxuks+
糞コテ遣いは言動が一々臭う

835 :デフォルトの名無しさん:2016/05/27(金) 20:21:08.86 ID:NL0NZsmD
前からこのスレみてるけど妙に攻撃的だったり見下したがる人おおいよね

うんこが臭いのはあたりまえなんだから我慢しろよ

836 :デフォルトの名無しさん:2016/05/27(金) 20:34:01.50 ID:lJ+WMBHh
>>835
いや流せよ

837 :デフォルトの名無しさん:2016/05/27(金) 21:16:01.20 ID:3Xstiw/6
うんこは便所でしろ
http://echo.2ch.net/test/read.cgi/tech/1434079972/

838 :デフォルトの名無しさん:2016/05/28(土) 11:18:10.95 ID:LQ2fY6xq
C++14/C++1z スレってどこ行ったの?

839 :デフォルトの名無しさん:2016/05/28(土) 18:20:20.48 ID:24etQgqN
そんなスレとっくに落ちただろ

840 :デフォルトの名無しさん:2016/05/28(土) 20:46:00.81 ID:LQ2fY6xq
やっぱそうか……

841 :gsag5y4:2016/06/04(土) 14:34:02.94 ID:2hWy5mYV
HttpWebRequestについての質問です。

JavaScript実行後のHTMLを取得する方法を教えて下さい。

現在HttpWebRequestのGetResponseメソッドで特定URLのHTMLを取得するコードを実装しているのですが、
取得したHTMLから、さらに呼ばれているJavaScriptの処理で、そのHTMLの内容が変わります。
※innerHTML 等で

JavaScriptが処理された後のHTMLを自動的に生成する方法を教えて下さい!!

842 :デフォルトの名無しさん:2016/06/04(土) 20:36:35.52 ID:d22dIUhO
マルチ

843 :デフォルトの名無しさん:2016/06/04(土) 21:27:43.05 ID:2hWy5mYV
WebBrowserクラスを継承したクラスを作成していて、
OnDocumentCompletedメソッドをオーバラーライドしたいのですが、
コンパイルエラーとなります!!

コンパイル警告/エラー無しで正しく継承する具体的なコーディング内容を教えて下さい。

■環境
Visual Studio 2012
C++ CLI

■ソース
public ref class ClassHTTPAuto : WebBrowser{

virtual void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e) override = WebBrowser::OnDocumentCompleted{//★
}

};

■コンパイルエラー内容 ★の箇所
'System::Windows::Forms::WebBrowser::OnDocumentCompleted' : 明示的なオーバーライドの署名に一致するメンバーはありません。
'ClassHTTPAuto::OnDocumentCompleted' : 関数は 'System::Windows::Forms::WebBrowser::OnDocumentCompleted' をオーバーライドしません
'override' : オーバーライド指定子の使用法が不適切です。'ClassHTTPAuto::OnDocumentCompleted' は基本 ref クラス メソッドと一致しません

844 :デフォルトの名無しさん:2016/06/04(土) 21:53:03.66 ID:8+lzdY1A
>>843
これが本体で何かに感染でもしているのか?
http://echo.2ch.net/test/read.cgi/tech/1455160063/898
http://echo.2ch.net/test/read.cgi/tech/1460040653/737
>>841もおかしいし
http://echo.2ch.net/test/read.cgi/tech/1455160063/895
http://echo.2ch.net/test/read.cgi/tech/1460040653/729

845 :デフォルトの名無しさん:2016/06/05(日) 06:47:51.63 ID:3QH2XO7h
いや単にマルチでしょ。知恵袋にも同じのあった。ひどすぎる。

846 :デフォルトの名無しさん:2016/06/05(日) 07:02:18.97 ID:VJ6TUrY4
錯乱とか認知力低下を引き起こす感染症は色々あるから否定はしない

847 :デフォルトの名無しさん:2016/06/05(日) 08:50:47.60 ID:n7k60ruZ
C++ CLI

848 :デフォルトの名無しさん:2016/06/06(月) 05:35:43.44 ID:Xo9HHLdt
オーバーフローしない程度のintのインクリメントや足し算はnorxcept?
最近何でもnoexcept付けようとしてる

849 :デフォルトの名無しさん:2016/06/06(月) 06:51:13.67 ID:k9RTHU5H
オーバーフローもアンダーフローもそのまま走り続けて、
例外はそもそも投げられないだろ?
オーバーフローすることを前提にしたコードは、
未定義動作でコンパイラが勝手に何かするだけだよ

850 :デフォルトの名無しさん:2016/06/12(日) 20:56:57.55 ID:XZVC5asv
自作ライブラリのインターフェース設計について質問させてください。
以下find_person_XXX関数のように、データベース等から何らかのデータを検索する関数を定義する際、どちらの定義の方が一般的でしょうか。

struct person {
int id;
char *name;
};

int find_person_A(int person_id, struct person **result);
int find_person_B(int person_id, struct person *result);

int main(void)
{
/* パターンA: 関数内でstruct personとnameを共にアロケートする
呼び出し側はアロケート不要 */
struct person *person_A;
int err_A = find_person_A(&person_A);

/* パターンB: 関数内でnameのみをアロケートする
struct personのアロケートは呼び出し側に任せる(この例ではスタックに確保) */
struct person person_B;
int err_B = find_person_B(&person_B);

return 0;
}

戻り値はエラーコードに使用したいので、検索結果を引数のポインタ越しに設定する仕組みにしたいと思います。
ただ、検索結果を表す構造体のアロケーションをライブラリ側でするのか、ユーザーに任せるのかで迷っています。
いくつか既存のライブラリのインターフェースを調べてみたのですが、上記のパターンAのように完全にライブラリ側でアロケートするものと、
パターンBのように、結果を表す構造体自体はユーザーにアロケートさせて、その結果に紐づくデータのみをライブラリ側でアロケートするものがあり、
どちらが一般的なのか分かりませんでした。

851 :デフォルトの名無しさん:2016/06/12(日) 21:07:01.25 ID:sWm805v9
結果がひとつもしくは最大数をユーザが指定するならパターンBでもいいだろうけど
検索結果がいくつになるのかは検索してみないと分からないとかならパターンAじゃね?
開放もユーザにdeleteさせるんじゃなくてReleaseXXXとかFreeXXXとか作ってそれに渡すようにする

852 :デフォルトの名無しさん:2016/06/12(日) 22:37:34.53 ID:CwU67sCL
そもそもこういう場面でポインタなんて使うな

853 :デフォルトの名無しさん:2016/06/12(日) 22:57:05.39 ID:CwU67sCL
ああCの話かw古代人は大変だねw

854 :デフォルトの名無しさん:2016/06/13(月) 08:15:27.75 ID:mDNzzuCL
>>850
C言語なら、俺は win32api 方式を好んで使ってる。
破棄関数も提供して、中でアロケートする方法。
構築と破棄は同じレベルでやらないとバグりやすいのと、構造体の詳細な作りは隠したい、ってのを両立できるところが良かった。

855 :デフォルトの名無しさん:2016/06/14(火) 03:39:40.23 ID:f6jk1oMA
>>854
>構築と破棄は同じレベルでやらないとバグりやすい
いや,これをいろんなレベルにもってこれるところが,Cの使いやすいところではないか
malloc/free でオブジェクトへのポインタを扱う際に,敢えてラベルも供給して,あわせてチェックをかけるようにしてはいるが

856 :デフォルトの名無しさん:2016/06/14(火) 09:08:16.20 ID:hbCOme/i
win32に限らず獲得解放を抽象化するものは多いね。fopen,fcloseとか
ただwin32は一回目は故意に失敗させて領域サイズを返して、領域確保してから再度呼ばせるような
気持ち悪いのも多い

857 :デフォルトの名無しさん:2016/06/14(火) 22:17:06.94 ID:VJ/4c5wE
俺は統一的なインターフェースで確保と解放したい
リソースの種類ごとに個性豊かな確保と解放のペアが仲間に入るなんて面倒だ

858 :デフォルトの名無しさん:2016/06/14(火) 22:36:52.35 ID:F7mhDIzv
obj->lpVtbl->Release( (void *)obj );

859 :デフォルトの名無しさん:2016/06/14(火) 23:24:06.89 ID:L7twjF32
>>856
一回失敗っつーか最初に必要サイズ求めてそこにデータを返すやり方は、プロセス境界や
モジュール境界を越えたメモリブロックの受け渡しが可能であるという前提を置けない状況じゃ、
ごく普通に使われるAPIデザインだろ。OpenCLなんかもそうだな。

860 :デフォルトの名無しさん:2016/06/14(火) 23:59:37.41 ID:F7mhDIzv
Get〜〜〜Size() っていう必要なバッファ長を求める専用のAPIを作っても
本処理のAPIと引数がほとんど同じになるから、ええい、一緒くたにしてしまえ!ってことだろうね

861 :デフォルトの名無しさん:2016/06/15(水) 09:52:22.28 ID:mXhxmNv3
wcsprintf「」

862 :デフォルトの名無しさん:2016/06/21(火) 17:57:16.28 ID:cl+vsLo5
while文を何千回まわすごとに1回処理を行う,っていうプログラムを書いてるんですが
while文1回あたりにかかる時間って0.00001秒とか何らかの時間で固定されてるんでしょうか?
それともその時々のPCの気分次第で変わったりするんでしょうか?

863 :デフォルトの名無しさん:2016/06/21(火) 18:03:42.15 ID:VIf3jitY
>>862
while文の中身はなんなんだよ

>while文1回あたりにかかる時間って0.00001秒とか何らかの時間で固定されてるんでしょうか?
固定はされていない
PCの処理能力に影響されるしコンパイラの最適化にも影響される

単純に数ミリ秒〜ごとに一回処理を行うんなら Sleep()入れれば良いだけでは?

864 :デフォルトの名無しさん:2016/06/21(火) 18:24:26.10 ID:cl+vsLo5
>>863
ありがとうございます.
学校の授業で,while文を何回か回す毎に1回他のPCに対してデータを送信して
ネットワークの転送速度を調べる,みたいなプログラムを配布されたんですけど
while文を回す回数は引数で変化させていく感じになってたんです.
もしwhileの1回の処理にかかる時間が一定なら,送信されるデータと引数の間の関係は比例関係になるんでは,と思ったんですが
実験データはそうならなかったんですよね.なので,配布されたプログラムを弄るわけにはいかないのでSleepとかは使えないんです.
PCの処理能力やコンパイラに影響されるってことは
同じPCで同じコンパイラを使ったらwhile文1回あたりの時間は同じだったりするんですかね?
同じPCでもやっぱりその時々の気分次第で変わるってことでしょうか.

865 :デフォルトの名無しさん:2016/06/21(火) 18:40:29.54 ID:kCDz8ExS
PCの処理能力やコンパイラの最適化やOSの種類及び設定や他のプロセスの影響を受ける

866 :デフォルトの名無しさん:2016/06/21(火) 18:49:55.16 ID:0KtWTAet
そのwhile文をうpした方が

867 :デフォルトの名無しさん:2016/06/21(火) 19:08:38.83 ID:VIf3jitY
>>864
>PCの処理能力やコンパイラに影響されるってことは
>同じPCで同じコンパイラを使ったらwhile文1回あたりの時間は同じだったりするんですかね?
同じPCでも他に動いているプログラムにも影響されるのでなんとも言えない
自分は他にソフトウェア使ってないと思っていてもOS自体が様々なプログラムを動かしている
ただ影響すると言っても頻繁に大きく差が出るというものではないので授業では考慮しない感じなのだろう

というかプログラムの授業で「配布されたプログラムを弄るわけにはいかない」ならもう何も出来ないんじゃね?
宿題かどうかは分からんけどその授業でそのプログラムを使って何を求められているわけ?

868 :デフォルトの名無しさん:2016/06/21(火) 19:34:06.49 ID:VIf3jitY
>>864
>ネットワークの転送速度を
速度というのは単位時間当たりに何バイト(何ビット)データを送れたかというもの

>while文を回す回数は引数で変化させていく感じになってたんです.
これは「全体でX回while文を回し、Y回に一回データを送信する」と言うもののうち
XをさすのかYをさすのかどっち?

仮にXをさすなら「whileの一定回ループ(=Yは固定)につき一定のデータサイズを転送」だから転送速度は比例しない=ほぼ一定。
※ただしループ全体が“単位時間”以内に完結するものだった場合、観測する上で「比例する」が正しい(観測の方法として正しいとは思えないが)。
そしてもしYをさすなら「Yが増えるほど1秒間に送る回数が減る」ので転送速度は反比例する。

と思う。

869 :デフォルトの名無しさん:2016/06/22(水) 03:41:09.67 ID:tA6VaAaS
int i, loop = atoi(argv[1]);
for(i = 0; i < 1000; ++i)
{
int j = 0;
while(j < loop) ++j; //←(1)
send_proc();
}

みたいなプログラムじゃないだろうな?
これだと(1)のループは最適化で完全に消える可能性あるぞ

870 :デフォルトの名無しさん:2016/06/22(水) 04:24:33.50 ID:jdKVcriH
例えば、OSが動かしている、他のプロセスが100あって、
その中に、君のプロセスよりも優先度が高いプロセスがあって、
それがインターネット回線などの資源をロックすれば、

優先度の低いプロセスは、資源が開放されるまで、待たされるため、
様々な外部環境に影響を受ける

871 :デフォルトの名無しさん:2016/06/22(水) 08:47:41.36 ID:0rcNr1i5
static int a = 0;
のaはどのような環境でも、いつでも同じアドレスなのですか?

872 :デフォルトの名無しさん:2016/06/22(水) 10:28:48.24 ID:MRu4Wqea
>>871
環境によってアドレスは同じではない

873 :デフォルトの名無しさん:2016/06/22(水) 13:04:52.82 ID:206G0i1n
同じ環境でも起動するたびに違うことだってある

874 :デフォルトの名無しさん:2016/06/22(水) 14:45:36.24 ID:tA6VaAaS
>>873
i386系のプロテクトモードで同じ実行環境なら、実アドレスは違っても
論理アドレスは完全同一じゃまいか?

875 :デフォルトの名無しさん:2016/06/22(水) 14:49:26.89 ID:206G0i1n
>>874
実アドレスがプロセス毎に違うじゃんって話じゃなくて?

876 :デフォルトの名無しさん:2016/06/22(水) 14:55:36.73 ID:tA6VaAaS
>>875
いや、どっちの話かははっきり知らんけど、C/C++普通に書く時って
実アドレス意識しない(あるいは扱えない)のが普通かと

877 :デフォルトの名無しさん:2016/06/22(水) 15:10:27.97 ID:206G0i1n
>>876
うむ、全く同意
組み込みで直接触らざるを得ないとか変な事情が
ない限り
アドレスとか全然意識したことないし
変に触ると保護違反になるから触ろうとも思わないしね

878 :デフォルトの名無しさん:2016/06/22(水) 15:24:52.70 ID:1owlsp3d
通じているのか通じてないのか

879 :デフォルトの名無しさん:2016/06/22(水) 15:38:46.46 ID:xXWwCG6b
立ち位置は同じでも、
違う方向を見て、自分のおかれた状況を説明してるようだ

880 :デフォルトの名無しさん:2016/06/22(水) 16:30:19.58 ID:zcuo6YLx
>>874
ASLRというセキュリティ分野の技術がある

881 :デフォルトの名無しさん:2016/06/25(土) 15:59:35.87 ID:PMddZNv3
関数コールバックでコールバッククラスを宣言して関数を登録するにはどうすればいいでしょうか?

882 :デフォルトの名無しさん:2016/06/25(土) 16:55:07.75 ID:5bDhhxrt
>>881
せめて、どういう仕様の関数に渡したいのかをぷりーず。

883 :デフォルトの名無しさん:2016/06/26(日) 23:32:28.85 ID:vm1KBNYW
VS2013でデバッグの停止ボタン押した時って
WM_CLOSEもWM_DESTROYも実行されないみたいなんですが、
停止ボタン押した時はウィンドウメッセージは流れてこないのでしょうか?

884 :デフォルトの名無しさん:2016/06/26(日) 23:51:43.30 ID:Pdgj+EY0
飛んでくるわけないだろう

885 :デフォルトの名無しさん:2016/06/27(月) 21:49:46.99 ID:VebqeWPm
>>884
それはなぜ?
飛んできてないのになぜWindowが閉じるの?

886 :デフォルトの名無しさん:2016/06/27(月) 23:15:00.76 ID:ojCp4Laa
メッセージが送信される前にインスタンスが無くなってるから

887 :デフォルトの名無しさん:2016/06/28(火) 05:49:24.35 ID:OvBtnOuN
WM_CLOSEなどのメッセージは正常終了する際の手順を順に行うために送られる
停止ボタンではTerminateProcessでプログラムが強制終了される
正常終了の手順は必要では無い

888 :デフォルトの名無しさん:2016/06/28(火) 12:19:07.63 ID:S/r3XE9J
>>887
強制終了されるとなぜWindowが閉じるんですか?

889 :デフォルトの名無しさん:2016/06/28(火) 12:36:42.92 ID:Zn9flS9b
Windowsがそういう仕様だから

890 :デフォルトの名無しさん:2016/06/28(火) 12:42:55.76 ID:NUWWCRCh
>>888
windowsのos内部でTerminateProcessがどう実装されているかについて知りたいのか?だったら

Win32API質問箱 Build122
http://echo.2ch.net/test/read.cgi/tech/1451988219/

のスレにでも聞いてくれ
普通はそんなos内部の話なんて意識する必要なく、そうゆうもんだと割りきるものだが興味があるなら自分で調べてくれ

891 :デフォルトの名無しさん:2016/07/02(土) 13:50:34.28 ID:xr6iRJSv
急遽C++使うことになったんだけど独学のいい教材ないですかね?
C言語なら「学校ではJavaとしか教わってません」レベルの新人に初歩的なことを教えられる程度にはできるつもり。
OOPというのは一応C#でクラスと、クラスの継承とメソッドのオーバーライドとオーバーロードぐらいは理解できてる(はず)

つまずいてるのがテンプレート関数と、メソッドのコールバック関数化。
独自フレームワークのソースメンテしろとか言われたんだけど、それを構築した会社が既に解散しててドキュメント類も不備っててソースから追いかけてくしかないんだけど、
export template<templatename T1,templatename T2>int func(T1* obj,void(T2::*metod)(int));
見たいな感じで定義されてるテンプレートの機能拡張が必要なんだけど、テンプレートなのに実体がない(exportされてるあたりでお察しください状態www)とか酷い状態なのよ。
で、C言語しかできません!のおっさんが仕事の片手間にC++覚えられそうな(急ぎ必要なのはテンプレートと面罵変数のコールバック周り)判りやすい教材、あったら教えてもらえませんか?

書籍類でもWebコンテンツでもどちらでもかまわないので。

892 :891:2016/07/02(土) 13:54:18.44 ID:xr6iRJSv
>>891
「面罵変数」ってなんだよぉ・・・
「メンバー関数」です。

補足すると、同じテンプレートを呼んで「class1::CallBak」と「class2::CallBak」どちらもコールバックしたいという実装です。
class1もclass2も同じクラスを継承してる前提で、CallBak()自体はclass1とclass2それぞれで実装されてるpublicの関数です。

893 :デフォルトの名無しさん:2016/07/02(土) 14:18:44.30 ID:9rtmvwfu
>>885
定年退職と即時解雇の違いだよ

894 :デフォルトの名無しさん:2016/07/02(土) 14:25:07.82 ID:9rtmvwfu
>>891
やりたいことがわからんけど案外、
C# ならイベントのデリゲート書いて一丁上がり♪ のケースじゃないの?

895 :デフォルトの名無しさん:2016/07/02(土) 14:59:39.68 ID:CZjSynQU
>>891
exportもtemplatenameもC++のキーワードじゃない
「僕が考えたかっこいい実装」なんだろうね
御愁傷さま… としか

896 :デフォルトの名無しさん:2016/07/02(土) 15:29:14.49 ID:rm6TBDFW
>>894
C#で書くんじゃなくて、C++で書かれてるのを改造しなきゃならんのですよ。
大きく躓いたのが「テンプレートってなんじゃぁ!」ってところで、ネットで調べても良く判らんし。
作業できる場所は外部ネットつなげられないからプリントアウトするなり書籍なりでもちこまんとダメなんで・・・

>>895
あ〜・・・すまん。typenameだった。
ソースいじれる環境から外部のネットにつなげられないんで「記憶コピー」だったから。

テンプレート関数はexportで定義と実体を分けられるでしょ?
ロジック書いたあとに実体化しないとダメっぽいけど(とりあえずそこまではぐぐれた・・・

897 :デフォルトの名無しさん:2016/07/02(土) 15:35:37.59 ID:CZjSynQU
ああ、すまん exportはc++11の新しい機能か

898 :デフォルトの名無しさん:2016/07/02(土) 16:46:37.28 ID:LWusTCIC
c++が現場を困らせる典型だ…

899 :デフォルトの名無しさん:2016/07/02(土) 19:04:01.50 ID:CPkPc7f9
exportは実装されたコンパイラーほとんどないしc++11からは逆に規格から取り除かれてるよ

900 :ID:xr6iRJSv:2016/07/02(土) 20:10:00.29 ID:rm6TBDFW
exportって廃止になったの?
難易度さらにアップなのかな。
既存のソースとライブラリでリンクまで行けたから少し弄るだけですむかと思ってた。

急がば回れ、で基礎からやった方が良さそうね。
密林でオライリとかの文法書当たってみますわ。

901 :デフォルトの名無しさん:2016/07/02(土) 20:41:25.82 ID:no/g4eo0
林 晴比古・柴田望洋あたりで、「速習〜」みたいな本は無いか?

902 :デフォルトの名無しさん:2016/07/02(土) 22:27:23.97 ID:22sSoOcK
プログラミング初心者の頃にstlとboost眺めて勉強したなぁ懐かしい
天ぷらライブラリ書けるようになるまで半年かかったよ

903 :uy ◆e6.oHu1j.o :2016/07/03(日) 17:22:48.95 ID:VJyaYSRj
>>902
IQ低そう

904 :デフォルトの名無しさん:2016/07/04(月) 21:04:46.75 ID:/A9poSsO
>>901
http://www.bohyoh.com/

905 :デフォルトの名無しさん:2016/07/04(月) 23:36:10.84 ID:usjNXWI/
>>903
確かに140しかないけどさ

906 :デフォルトの名無しさん:2016/07/05(火) 00:46:56.32 ID:/sOVcq36
140ってww
そんなやつが2chやるわけないだろww

907 :デフォルトの名無しさん:2016/07/05(火) 15:37:47.81 ID:THFzv4qe
身長の話じゃねーの?

908 :デフォルトの名無しさん:2016/07/05(火) 22:13:05.66 ID:iT1PYIae
チン長かと

909 :デフォルトの名無しさん:2016/07/06(水) 08:34:12.69 ID:7Bpki8tS
単位はmmか

910 :デフォルトの名無しさん:2016/07/11(月) 22:20:47.56 ID:2eMs4C3s
お前ら的にはアポロ11号のソースコードどうなの?

911 :デフォルトの名無しさん:2016/07/12(火) 00:30:52.60 ID:8XYiu/ca
アセンブラをソースと言っていいのかなって感じ

912 :デフォルトの名無しさん:2016/07/12(火) 03:46:16.61 ID:N99QS+PT
機械語はコード、それ以外はソース
2005年あたりから増えてきた、高級言語のソースをコードと呼ぶ風潮はうんこだと思うぜ

913 :デフォルトの名無しさん:2016/07/12(火) 04:41:11.08 ID:Vf+ZIi05
機械語は実行コード
それ以外はソースコード

914 :デフォルトの名無しさん:2016/07/12(火) 07:42:05.35 ID:8XYiu/ca
機械語はバイナリじゃね

915 :デフォルトの名無しさん:2016/07/12(火) 09:54:08.38 ID:j6bBSSGB
>>912
> 高級言語のソースをコードと呼ぶ風潮はうんこ
ソースはソースコードの略だからうんこになるほどの問題は孕んでいないと思う。
http://e-words.jp/w/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89.html
> 機械語はコード、それ以外はソース
バイナリ(やオブジェクト)とソースという対比で呼ぶべきでは?

916 :デフォルトの名無しさん:2016/07/12(火) 11:51:57.70 ID:sw++mtzw
>>915
そりゃ正式名はソースコードだけど、それを略してコードと呼ぶと意味をなさなくなるんだよ
とくに、仮想マシンで動くようなJAVAコード、.Netコードってへっぽこプログラマーが言うじゃん? よく聞いてみると以下略

>バイナリ
バイナリ⊃機械語 だね

スレ違いなので雑談スレででも

917 :デフォルトの名無しさん:2016/07/12(火) 12:01:19.42 ID:j6bBSSGB
>>916
すまない。915は撤回するわ。

918 :デフォルトの名無しさん:2016/07/12(火) 13:12:03.60 ID:bfn2nev7
>>916
普通に英語なんだが

coderとは言うけどsourcerとは言わんぞ

919 :デフォルトの名無しさん:2016/07/12(火) 13:24:32.15 ID:M7aV+wc6
機械語の源(source)となる符号(code)が元の意味だろうから
機械語はコードでしかないが他はソースでもコードでもあるでしょ

920 :デフォルトの名無しさん:2016/07/12(火) 15:51:05.87 ID:x9hMoHCp
コーディング規約とも言うしな

921 :デフォルトの名無しさん:2016/07/12(火) 17:21:10.48 ID:aYUQCZhN
>>912
機械語(machine code)だってプログラム言語のひとつ(machine language)
要するに高水準言語→低水準言語、つまり source code から machine code へ移り変わる中ですべての状態がcodeだと思うよ

922 :デフォルトの名無しさん:2016/07/12(火) 17:23:58.41 ID:aYUQCZhN
「要するに」って要らなかったな

高水準言語→低水準言語、つまり source code から machine code へ移り変わる中ですべての状態がcodeだと思うよ

に訂正

923 :デフォルトの名無しさん:2016/07/12(火) 19:10:50.36 ID:OhKVznsb
>>916
逆だよ。ソースじゃ通じないがコードなら通じる

924 :デフォルトの名無しさん:2016/07/13(水) 01:36:17.79 ID:/AeOD/09
>>919
機械語の源じゃなくて、ソフトウェアの源じゃないかな
中間コードはソースとは言わないでしょ

925 :デフォルトの名無しさん:2016/07/28(木) 11:08:15.39 ID:UbVdigRT
Cを一通り終えてC++を勉強してます。
仮想関数という機能の意義というか、利点が分かりません。

そもそも親と違う処理をしたいから、派生クラスで関数を定義しなおすワケですよね?
関数の名前を変えれば済む話、というか、変えるべきなのでは?

http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/virtual.html
例で言えば、最初から

class Clock
{
  void Action_beep()
  {
    // 時計がピーピー
  }
};

class LaughClock : public Clock
{
public:
  void Action_laugh()
  {
    // 時計がケタケタ
  }
};

と定義しておいて、笑いたければ baby.Action_laugh(); で事足りると思うのです。

素人の目からは、異なる処理を行う関数に同じ名前を付けることは、百害あって一利無し、バグを誘発することくらいしか意味がないように思えます。
このサイトでも 「ここで注意していただきたいのは…」 と書かれてますが、注意が必要になったのは、異なる処理に同じ関数名をつけたことが原因ですよね?
この欠点を補えるほどの利点て、何かありますか?

926 :デフォルトの名無しさん:2016/07/28(木) 12:07:53.88 ID:sTpn4H8D
>>925
たとえば fwrite() にしたって、呼び出した先では違う処理が動くというのはわかるよな?
fwrite_usbmemoryfile() とか、fwrite_ssdfile() なんてものがあったらいやすぎるだろう。

927 :デフォルトの名無しさん:2016/07/28(木) 12:18:39.00 ID:6luxzfPz
>>925
例えば、アラーム機能を考えると
「設定された時間にビープ」と「設定された時間に笑わせる」と2つの機能を実装するか
「設定された時間に時計の種類を見てビープまたは笑わせる」って機能を実装することになるよね

仮想関数なら「設定された時間に鳴らす」って処理を書いておけば
「鳴らす」部分をビープやら笑わせる機能に差し替えることができる
ちゃんと書いとけば「やっぱ振動で」とかそういうのもアラーム機能は修正しなくて済む

928 :デフォルトの名無しさん:2016/07/28(木) 13:17:17.72 ID:49cPLP5e
という机上の空論で作られたのが仮想関数です
あまり深く考えず
何かコールバックさせたいときに関数ポインタを隠蔽するために使う
と理解しておけば十分であり、問題は起きないです
少なくとも関数ポインタを使うよりは構文になっているという意味で安全
必要でない場合は使わなくてよいです
というかなるべく使わないように書くのがテクニックともいえます
制御フローはトップダウンかつ静的になるように心がけましょう

929 :デフォルトの名無しさん:2016/07/28(木) 13:24:19.32 ID:UbVdigRT
皆様、レスありがとうございます。
せっかく解説してくださったのに、まだ理解できないようです。出来るの悪い子ですみませんorz

>>926
私の技量ではうまく言い表せないのですが‥
fwriteはバッファの内容をファイルに書き出すという動作において、プログラムからみれば
書き出し先がUSDでもSSDでも区別が必要ないと思います。
なので単一のfwriteでもOKかな‥と。
※強いて意識するのはfopen時だけですよね。
Action()はプログラムから処理内容を区別するので、本質が違うような気がします。

>>927
この「差し替え」は機能として理解できるのですが、
関数名から処理内容が一意に決まらなくなる‥という欠点が発生しますよね。
それが利点としてしっくりこないような…
それともオブジェクト名まで含めて判断する訓練を積めば克服できるものですかね?
先の例だとclock.Action()ならビープ、 baby.Action()なら笑う、みたいに。
Action()の処理内容が直感的に分かるオブジェクト名をつけないと、いちいち
クラス定義まで見返す手間がかえって増えそうな…

>>928
> という机上の空論で作られたのが仮想関数です
そう言われれば納得できるようなw

> 何かコールバックさせたいときに関数ポインタを隠蔽するために使う
> と理解しておけば十分であり、問題は起きないです
すみません。
初心者にはハードルが高いご解説なため、これからじっくり調べて考えて理解します…

930 :929:2016/07/28(木) 13:38:39.41 ID:UbVdigRT
色々書きミスしてました。申し訳ありません。

誤: 出来るの悪い子ですみませんorz
正: 出来の悪い子ですみませんorz

誤: 書き出し先がUSDでもSSDでも区別が必要ないと思います。
正: 書き出し先がUSBメモリでもSSDでも区別が必要ないと思います。

931 :デフォルトの名無しさん:2016/07/28(木) 13:56:36.04 ID:ini9YyYv
>>930
> クラス定義まで見返す手間がかえって増えそうな…
ちゃうねん
自分で派生クラス作るんやから見返す必要ないねん

蛇口クラスがあって「水圧管理」と「排水機能」を持ってるとするで
基底クラスが上の2つを持ってるわけやな
基本は水で出すとする場合基底クラスのActionが水や
けどお湯が欲しくなった場合蛇口は1個しかないから
派生クラスのActionでお湯を出すんや

この場合排水する目的は同じで
共通する機能を基底クラスが持ってるわけや
何が出てくるかが違うわけやから何が出てくるのかを自分で定義する
酒好きならシャンパン出してもええねん

932 :デフォルトの名無しさん:2016/07/28(木) 14:01:51.36 ID:s42UkHaU
>先の例だとclock.Action()ならビープ、 baby.Action()なら笑う、みたいに。
>Action()の処理内容が直感的に分かるオブジェクト名をつけないと、いちいち
>クラス定義まで見返す手間がかえって増えそうな…
baby は LaughClockクラスのオブジェクトだよね?
LaughClockクラスのAction()が「笑う」なのは、そんなに変?
変数名の付け方が妥当かどうかは仮想関数とオーバーライドの話とは関係ないけど
(関数名の話がオブジェクト名の話にすり替わってる)

933 :デフォルトの名無しさん:2016/07/28(木) 14:01:53.61 ID:ini9YyYv
>>930
関数の名前を変えたのを派生クラスで作ってしまったら
水専用の蛇口からお湯が出たりして苦情くるで

934 :デフォルトの名無しさん:2016/07/28(木) 14:21:54.16 ID:VDwuXaep
机上の空論ってw
C#にもJavaにもあるinterfaceまで空論扱いする勢いだな

935 :デフォルトの名無しさん:2016/07/28(木) 14:27:37.11 ID:VDwuXaep
>>929
>関数名から処理内容が一意に決まらなくなる‥という欠点が発生しますよね。
一意に決めたくないから仮想関数という仕組みがあるんだよ
それが何の役に立つのかは実務でソフト組んでれば分かるよ

936 :デフォルトの名無しさん:2016/07/28(木) 14:29:27.00 ID:DlRIQQvn
>>928
>制御フローはトップダウンかつ静的になるように心がけましょう

動的な制御フローってあるん?

937 :デフォルトの名無しさん:2016/07/28(木) 14:39:37.97 ID:sTpn4H8D
>>936
AIは全体で見れば動的と呼んでもいいんじゃ無いか?
同じ入力でも1回目と2回目じゃ結果が異なる可能性もある

938 :デフォルトの名無しさん:2016/07/28(木) 15:27:25.46 ID:49cPLP5e
彼は自分で言っているように初心者なんだろうけど
初心者ゆえにプログラミングの基本的なスタイルを守っていて
それゆえに仮想関数の必要性がわからないのだろう
つまり、関数は常に必要に応じて自分で呼び出し
プログラミングは自分で流れを作っていくものだと
考えているのだろう
その限りにおいては、仮想関数の必要性は無いかもしれない
処理が分岐するならswitchすればよいだろう、位に考えているだろう
その初心は忘れないほうが良いと思うが

一度何かのフレームワークを触ってみるとよい
特にラムダがなかった時代の昔のフレームワークは全部仮想関数で解決しようとしていた
猫も杓子も仮想関数で多態が流行った時代があった
君の抜群のセンスなら非常に不毛であると感じるかもしれないが
同時に仮想関数が必要であった理由もわかるはず

そのうえで、自分で書く部分(今時プログラムを一から全部書く人はいない)に
俺俺フレームワークを構築するか、しないかは、よく考える必要がある
場面場面で

939 :デフォルトの名無しさん:2016/07/28(木) 16:51:03.07 ID:UbVdigRT
>>938
> 一度何かのフレームワークを触ってみるとよい
この一言!
心の琴線に触れる? とはまさにこのことで、分かりました!
(というか、分かりかけてきました!)

たしかにフルスクラッチでプログラムを作成する状況なら仮想関数を
使わなくても済みそうで、「なぜ重複しない関数名で最初からクラスを設計しないんだろう?」と
疑問だったのですが、それがままならない開発環境もある、ってことですね。
正直、調べても、フレームワークの理解はアバウトなんですが、
それでも関数オーバーライドが必須となりそうな状況は納得できました。

今日を2chで最良の日と心に刻みつけておきます。ありがとうございました。

940 :デフォルトの名無しさん:2016/07/28(木) 17:49:20.43 ID:xeepOtn0
>>939
フルスクラッチか既存のライブラリやフレームワークを利用するかというのは重要じゃない
インターフェースをどのように設計するかという問題

fwriteの例でいうとFILEという抽象化されたオブジェクトに対してfwriteを実行するだけで
オブジェクトの実態がexFAT上のファイルを扱うクラスのオブジェクトなのかNTFSなのか
あるいはもっと別のext4とかZFSとか呼び側が気にする必要が無い

941 :デフォルトの名無しさん:2016/07/28(木) 18:54:53.34 ID:49cPLP5e
それは彼の今の認識ではswitchすりゃ良いじゃんってなるんだよ

実際に何かのフレームワークを触って、どういう風に仮想関数が使われているか
見て学んだほうが早いだろう
フレームワークのコールバックが関数ポインタかデリゲートかラムダか仮想関数か
何の方式を採用している分からないが、C++のフレームワークなら大概仮想関数だろう
特にフレームワークの場合はフレームワークのメインルーチンを勝手に変更できないという
制限があるので、(ソースコードすらない場合もある)
呼び出し元のコードを変えずに、とか、呼び出し元のコードを一本化して、とか
重要なキーワードを肌で感じることができるだろう
switchじゃどうにもならないということも、すぐに理解できるはず
あとは自分のプログラムに応用するかしないか、本人次第
一つ言えることは、概念上の問題より、運用上の問題のほうが大事

猫と犬は哺乳類クラスで猫はニャーと鳴き犬はワンと鳴く、とか言ったって
これは理解できている人にしかわからない説明なんだよ

942 :デフォルトの名無しさん:2016/07/28(木) 21:55:49.56 ID:YFw1hd80
エントリポイントとなる関数を用意して
その中でifなり何なりで分岐させても、抽象化の目的としては達成されるしなー

943 :デフォルトの名無しさん:2016/07/29(金) 06:52:14.12 ID:S0Kp402r
フレームワーク触るのもいいけど、フルスクラッチの場合も役に立つ
例えばウィンドウシステムの実装
大抵のウィンドウシステムでは、ボタンもダイアログもテキストエリアも同じウィンドウクラスから導出されている
なぜなら、マウスで触れる矩形領域の機能としてほとんど同じだからだ
ただ、それぞれクリックに対する反応とか表示内容なんかでちょっと違う部分が各部品ごとに山のようにあるので
違う部分だけメソッド(関数)単位で実装してオーバーライドする
もし仮想関数を使わずウィンドウシステムを書くことになったら、各部品のちょっと違う部分だけのために部品クラスをコピペで量産しないといけない
コピペで量産したクラスの弊害は、また別の話になるけど

ところでC++関係なくない?
単純にオブジェクト指向の質問じゃないのか

944 :デフォルトの名無しさん:2016/07/29(金) 07:43:09.79 ID:S0Kp402r
見直してたら気付いた
>もし仮想関数を使わずウィンドウシステムを書くことになったら、各部品のちょっと違う部分だけのために部品クラスをコピペで量産しないといけない
訂正:
各部品のちょっと違う部分だけのためにフル機能の部品クラスをコピペで量産しないといけない

要は差分だけ書けば機能を実現するという目的にも仮想関数は使えるってこった
差分コーディングでググれば色々見られる

945 :デフォルトの名無しさん:2016/07/29(金) 11:20:59.68 ID:/QPn21bb
オブジェクト指向の話どころか、抽象化する意味を聞かれてるのでは?

946 :デフォルトの名無しさん:2016/07/29(金) 16:20:12.98 ID:QKf643uU
純粋仮想関数により抽象化したクラスはデザインパターンで使う

947 :デフォルトの名無しさん:2016/08/06(土) 21:21:09.44 ID:CIMwAPv1
class A {
public:
 funcA();
}
class B {
private
 A a;
}
class C {
private
 B b;
public:
 funcC();
};
この状態でfuncCからfuncAを呼ぶには
class BにpublicなfuncBを追加してfuncBからfuncAを呼ぶようにする(funcC内でb.funcB)
これ以外にスマートなやり方って何かな?
変数はprivate、関数は必要があればpublicやprotectedの方がいいよね?

948 :デフォルトの名無しさん:2016/08/06(土) 21:25:55.87 ID:NvZG+ERe
friend

949 :デフォルトの名無しさん:2016/08/06(土) 21:34:07.09 ID:ywdq7rGj
ものによってはstaticとかでも行けるかも?

まあ、スマートっていう意味では、
CからAを触らせないのが一番スマートかもしれんけどね

950 :デフォルトの名無しさん:2016/08/06(土) 22:03:23.24 ID:wD7Fq13i
> まあ、スマートっていう意味では、
> CからAを触らせないのが一番スマートかもしれんけどね
確かにこれが一番スマートやな

他のやり方としてはBのaをprotectedにしてCはBをprivate継承するとかな

951 :デフォルトの名無しさん:2016/08/07(日) 08:40:15.71 ID:zBYc/KkC
>>948-9500
ありがとう!

952 :デフォルトの名無しさん:2016/08/10(水) 19:58:07.55 ID:oJSizC1Q
func()の中でswitch()で分岐してる状態で
case 1: 何かやる break;
case 2: 何かやる break;
func()を書き換えずに何かやる部分をプロジェクトによって変えるような事はできる?

953 :デフォルトの名無しさん:2016/08/10(水) 20:29:50.53 ID:FPLZcb1n
関数ポインタ仮想関数ラムダ

954 :デフォルトの名無しさん:2016/08/10(水) 20:31:27.03 ID:DNEsHj4R
プロジェクトごとに条件を定義して #define, #ifdef, #ifndef, #else, #endif などで切り替える

955 :デフォルトの名無しさん:2016/08/10(水) 21:24:43.34 ID:oJSizC1Q
>>953
色々あるんだね

>>954
プロジェクトが増えるとfuncも書き換えないといけない

956 :デフォルトの名無しさん:2016/08/11(木) 00:06:31.55 ID:FqLT9pgZ
case 1: func_case1(); break;
case 2: func_case2(); break;
...
とやってプロジェクトごとに異なるfunc_caseXの定義を書けばいいんでは

957 :デフォルトの名無しさん:2016/08/11(木) 05:28:06.54 ID:Zd798CT0
>>956
> func()を書き換えずに

958 :デフォルトの名無しさん:2016/08/11(木) 05:29:47.92 ID:Zd798CT0
>>957
って事だから競合起こさないようにした方がよくね?

959 :デフォルトの名無しさん:2016/08/11(木) 10:12:33.21 ID:xfJcHpdP
funcを書き換えずにってのは一度書いたfunc自体のソースだけはどのプロジェクトでも書き換えずに使うって意味じゃないのか

960 :デフォルトの名無しさん:2016/08/11(木) 11:20:31.32 ID:Zd798CT0
プロジェクト1
 func()
プロジェクト2
 func()
ここまでok

プロジェクト3
 プロジェクト1
  func()->func_case1()
 プロジェクト2
  func()->func_case1()
どっち呼ぶんや?

961 :デフォルトの名無しさん:2016/08/11(木) 11:22:12.26 ID:ZnWKVyt1
そういう意味だともうよ
だから、関数ポインタ仮想関数ラムダ関数オブジェクト
まぁこれはC++での呼び名だが
何らかの方法でコードブロックをコールバックしてもらうしかないと思うよ
一般的によく行われることだし問題ないっしょ

962 :デフォルトの名無しさん:2016/08/11(木) 13:19:34.88 ID:xfJcHpdP
>>960
そのプロジェクト3でfunc()を呼んだらプロジェクト1と2のどっちのfunc()を呼ぶんだ?

963 :デフォルトの名無しさん:2016/08/11(木) 14:27:00.61 ID:Zd798CT0
>>962
func自体は変更無しなんだから問題じゃなくね?

964 :デフォルトの名無しさん:2016/08/11(木) 21:21:58.58 ID:TQheNK/m
>>960
そのプロジェクトってなんだ?

965 :デフォルトの名無しさん:2016/08/11(木) 21:39:36.85 ID:GJmRLzEl
>>963
プロジェクト1とプロジェクト2でfuncの(最終的な)動作は変わるんだろ
その両方の動作を使いたいからプロジェクト3ではプロジェクト1,2両方を取り込んでいるんであって
そうしたからには使いたい動作にあわせて意図的に呼び分けができないとだめだろ

966 :デフォルトの名無しさん:2016/08/12(金) 01:02:36.03 ID:tIcwp4Gc
なんで両方の動作を使いたいって話になってるんだ?

プロジェクト1でfunc()を呼び出したらプロジェクト1のfunc_caseXXX()が呼ばれる
プロジェクト2でfunc()を呼び出したらプロジェクト2のfunc_caseXXX()が呼ばれる
プロジェクト3でfunc()を呼び出したらプロジェクト3のfunc_caseXXX()が呼ばれる
プロジェクトがいくら増えてもfunc()の中身自体は修正を必要としない

ということがやりたいんだろ?>>952

967 :デフォルトの名無しさん:2016/08/12(金) 08:55:39.80 ID:V4dr4yFb
>>965
プロジェクト3ではプロジェクト1と2の両方のfunc_case呼ぶってなんで?
プロジェクト3専用のfunc_caseだろw

968 :デフォルトの名無しさん:2016/08/12(金) 10:09:26.57 ID:A6nfo0WT
>>956,966,967のやり方じゃだめだって>>957=958=960=963が>>960で例を出して言ってるんだろ
>>960の例にはfuncの中身以前に問題があるんじゃないのという疑問だろ

969 :デフォルトの名無しさん:2016/08/12(金) 12:00:33.75 ID:tIcwp4Gc
>>968
つまりどういうこと?

970 :デフォルトの名無しさん:2016/08/12(金) 12:28:25.41 ID:V4dr4yFb
>>968
>>967ではむしろ>>965を否定したつもりなんだが

971 :デフォルトの名無しさん:2016/08/13(土) 09:29:25.77 ID:ShTSXbfa
pを使った処理はAとBどっちに書くのがセオリ?

try {
 p = new int;
 // A
}
catch() {
 // 失敗時の処理
 return;
}
// B

972 :デフォルトの名無しさん:2016/08/13(土) 11:58:33.65 ID:xf3MhneS
書き手がなにを重視しているかの視点・哲学の話だからどっちでもいい

973 :デフォルトの名無しさん:2016/08/13(土) 12:22:48.55 ID:zvhXM4IK
その「pを使った処理」で発生した例外をそのcatchで捕まえたいかどうか次第じゃないかと。

974 :デフォルトの名無しさん:2016/08/13(土) 12:37:38.79 ID:ShTSXbfa
つまり
例外が発生する処理を1つのtryブロックでまとめるか
処理毎にtryブロックを用意するかの違いって事かな

try { p = new int; /* pを使った処理 */ q = new int; } catch() { return; }

try { p = new int; } catch() { return; }
// pを使った処理
try { q = new int; } catch() { return; }

こんな感じ?

975 :デフォルトの名無しさん:2016/08/13(土) 12:49:18.79 ID:sDKArTxu
全部間違いcatch()なんてコンパイル通らないし
そもそもそんなところでnewなんて使うな

976 :デフォルトの名無しさん:2016/08/13(土) 13:11:33.14 ID:woc51egB
try-catchもなんだかんだで行数食うし、
どうしても分離できないところ以外は、なるべくまとめた方が良さげ

977 :デフォルトの名無しさん:2016/08/13(土) 13:27:50.95 ID:ShTSXbfa
>>975
突っ込むなら本題でつっこんでくれ
例に対して的外れな突っ込みになってるぞ

>>976
そういうもんなんだな

978 :デフォルトの名無しさん:2016/08/13(土) 13:35:00.47 ID:sDKArTxu
>>977
本題?そんなものにセオリなんてないというのが答え
そもそも「pを使った処理」の内容が分からないのに

979 :976:2016/08/13(土) 13:41:10.91 ID:woc51egB
ごめん>976の日本語おかしかった

 誤:
 どうしても分離できないところ以外は

 正:
 本当は分けてcatchしたいのに、まとめてtryブロックに突っ込むと
 そのままでは例外クラスの関係でまとまってしまう(分離に一手間かかる)ところ以外は

どうやら脳内補完してくれたみたいで、感謝


>>977
あくまで個人的な見解なので、メリット・デメリットはあると思う
tryブロックが長すぎても大変だろうしね

980 :デフォルトの名無しさん:2016/08/13(土) 13:56:22.46 ID:sDKArTxu
何を大変がってるのか理解不能
最初からnew intなんて馬鹿なことしなけりゃいいのに

981 :デフォルトの名無しさん:2016/08/13(土) 14:04:27.20 ID:woc51egB
>>980
例文としてnew intを使ったのは質問者で(さらにその例文には特に意味もない)
「大変」という言葉を使ったのは質問者じゃなく俺(>979)なわけだが
一体誰に何をレスしてるんだ?

982 :デフォルトの名無しさん:2016/08/13(土) 14:07:57.10 ID:ShTSXbfa
>>979,981
そうだなありがとう
煽りたがりなんだよたぶん

>>980
最初から的外れな指摘しなけりゃいいのに

983 :デフォルトの名無しさん:2016/08/13(土) 14:08:54.05 ID:ShTSXbfa
>>972-973もアンカ付けてなかったけどありがとね

984 :デフォルトの名無しさん:2016/08/13(土) 14:09:23.19 ID:jehnS6hp
まあ、あれだ。
いつもの「空気の読めない君」が登場しただけだから気にするな。
質問者の意図が理解できずに、会話にならないアの字の人が一人か二人いる。

985 :デフォルトの名無しさん:2016/08/13(土) 14:19:57.80 ID:sDKArTxu
>>981
両方にレスしてる
>>971の「pを使った処理」をBに書いてもいいなら、「pを使った処理」では例外が発生しないものとしていいんだよな?
だったらどっちでもいいし

newでbad_alloc発生するかもしれないし「pを使った処理」で別の例外が発生するかもしれないよ。どうしたらいいの(泣)
ってことなら

まとめたとしても
catch(bad_alloc e) {
return;
}
catch(...) {
delete p;
return;
}
とでもすればいいだけだし議論するようなことじゃない
catch()とか書いてる時点でC++の例外処理について何もわかっていないんじゃないかと

そもそもnew失敗時にreturnって何をしたいのか意味不明なんですけどね(笑)

986 :デフォルトの名無しさん:2016/08/13(土) 14:29:14.04 ID:sDKArTxu
>>984
出た「空気読め」
無能はいつだってこうだね
しまいには「ア」呼ばわりして勝利宣言w

987 :デフォルトの名無しさん:2016/08/13(土) 14:39:41.75 ID:ShTSXbfa
>>985
catchした場合はBの処理はされないという意味のreturnなんだが読み取れなかったか?
それともわざわざ「catchブロックはこの際重要ではない」と書けばよかったか?

引っ込みがつかなくなって狂っただけか?

988 :デフォルトの名無しさん:2016/08/13(土) 14:46:10.18 ID:ShTSXbfa
>>985
途中送信失礼

お前がやってる的外れな指摘はこういう事なんだがわかるかな?
catch(const bad_alloc &e)だろ

そこは今重要じゃないだろ?

989 :デフォルトの名無しさん:2016/08/13(土) 15:49:08.98 ID:SZzp1Vb3
はぁ、、、勝利とか何の話なのかな?
議論に勝ち負けがあると思ってる時点でちょっと斜め上。

990 :デフォルトの名無しさん:2016/08/13(土) 18:35:59.65 ID:OPjVywq7
回答者同士で煽りあってるのかと思えば質問者と回答者だったのか
どっちがセオリーというかpを使った処理次第だし失敗時の処理次第ってところでどっちもあり

>そもそもnew失敗時にreturnって何をしたいのか意味不明なんですけどね(笑)
Bの場合に例外を飛ばさずに処理を終了させたい(Bを実行しない)ってことだろ

991 :デフォルトの名無しさん:2016/08/13(土) 23:39:33.39 ID:CLd1bccm
ループ展開やブロッキングのような最適化手法って他にありますか?
あと並列化特有の最適化の方法とかがあるなら教えて下さい

992 :デフォルトの名無しさん:2016/08/14(日) 00:04:41.36 ID:z6U1tRVC
次スレ
http://echo.2ch.net/test/read.cgi/tech/1471100645/

993 :デフォルトの名無しさん:2016/08/14(日) 18:24:32.93 ID:DuaY2f9q
>>991
OpenMPの話?

994 :デフォルトの名無しさん:2016/08/15(月) 10:29:06.41 ID:SYEcbM5V
コンパイラがC/C++ならOpenMPの話しはここでもいいんじゃないかな
レスが付くかどうかはわからんが
>>991
wikipediaで"コンパイラ最適化"で項目があるから、ざっくりとわかるとおもう

995 :デフォルトの名無しさん:2016/08/15(月) 10:39:36.48 ID:4wJ3nkHn
>>993
>>994
openMPに限らず他に最適化手法が無いかなと思って聞きました
見たところwikiにもいろいろ載ってました
ありがとうございます

996 :デフォルトの名無しさん:2016/08/15(月) 15:16:30.69 ID:ZZZ997rF
隔離病棟って何だよ

997 :デフォルトの名無しさん:2016/08/15(月) 15:32:27.02 ID:ywF/52Nh
俺の家だよ

998 :デフォルトの名無しさん:2016/08/15(月) 19:11:52.07 ID:bftlQCDN
独り占めすんなよ。
「俺たちの家」と言うべきだろ。

999 :デフォルトの名無しさん:2016/08/15(月) 19:14:58.12 ID:E6/w/wVK
ナース服来たメイドさんうらやま

1000 :デフォルトの名無しさん:2016/08/15(月) 19:20:16.07 ID:ZZZ997rF
梅酒

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 261日 5時間 49分 42秒

1002 :1002:Over 1000 Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/


gc
lud20190720110328ca
このスレへの固定リンク: http://5chb.net/r/tech/1448685034/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  
このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ



全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net 」を見た人も見ています:
スレ立てるまでもない質問はここで 144匹目 [無断転載禁止]©2ch.net
スレ立てるまでもない質問はここで 148匹目 [無断転載禁止]©2ch.net
スレ立てるまでもない質問はここで 148匹目 [無断転載禁止]©2ch.net
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]
スレを立てるまでもない質問はこちらのスレで ★54 [無断転載禁止]©bbspink.com
スレを立てるまでもない質問はこちらのスレで ★53 [無断転載禁止]©bbspink.com
スレ立てるまでもない質問スレPart.114 [無断転載禁止]
お絵かき板を救う唯一の《質問スレ》質問はここでどうぞ [無断転載禁止]
スレ立てるまでもない質問 34 [無断転載禁止]©bbspink.com
●スレを立てるまでもない質問・疑問・雑談309● [無断転載禁止]
[DIY]スレッドをたてるまでもない質問@DIY板★9麗 [無断転載禁止]
[DIY]スレッドをたてるまでもない質問@DIY板★94 [無断転載禁止]
囲碁・初心者専用の質問スレッド 第24局 [無断転載禁止]
【分からん事は】総合質問スレッド【ここで聞け】 [無断転載禁止]©bbspink.com
高校数学の質問スレPart404 [無断転載禁止]©2ch.net [無断転載禁止]
大会専門の質問スレ! [無断転載禁止]
高校数学の質問スレPart408 [無断転載禁止]
高校数学の質問スレPart402 [無断転載禁止]
総合!靴についての質問スレッド 37足目 [無断転載禁止]
【エスパー】超初心者の質問スレ997【世界樹出禁】 [無断転載禁止]
スレ立てるまでもない質問はここで 150匹目
スレ立てるまでもない質問はここで 151匹目
スレ立てるほどもない質問に嘘八百で答えろ40 [無断転載禁止]
スレッド立てる程でもない質問・愚痴・雑談など@既婚男性96 [無断転載禁止]
スレッド立てる程でもない質問・愚痴・雑談など@既婚男性95 [無断転載禁止]
スレ立てるまでもない質問はここで 163匹目
スレ立てるまでもない質問はここで 157匹目
スレ立てるまでもない質問はここで 153匹目
スレ立てるまでもない質問はここで 164匹目
スレ立てるまでもない質問はここで 159匹目
スレ立てるまでもない質問はここで 160匹目
スレ立てるまでもない質問はここで 161匹目
スレ立てるまでもない質問はここで 154匹目
スレ立てるまでもない質問はここで 155匹目
スレ立てるまでもない質問はここで 147匹目
スレ立てるまでもない質問はここで 156匹目
HTML/CSS の質問に優しく答えるスレ 24 [無断転載禁止]
バジリスク絆初心者質問スレpart26[無断転載禁止]©2ch
スレ立てるまでもない質問はここに書け
SKYRIM エロMOD質問スレ 24 [無断転載禁止]©bbspink.com
スレ立てるまでもない猫の質問はこちらへ16
SKYRIM エロMOD質問スレ 24 [無断転載禁止] [無断転載禁止]©bbspink.com
スレ立てるまでもない猫の質問はこちらへ 11
バジリスク絆初心者質問スレpart29[無断転載禁止]
★スレ立てるまでもない犬の質問はこちらへPart113
★スレ立てるまでもない犬の質問はこちらへPart109
新規スレッド立てるまでも無い質問@車板489 [無断転載禁止]
新規スレッド立てるまでも無い質問@車板495 [無断転載禁止]
新規スレッド立てるまでも無い質問@車板493 [無断転載禁止]
【チェンクロ】チェインクロニクル質問スレ Part57 [無断転載禁止]
【ウチ姫】ウチの姫さまがいちばんカワイイ質問スレ part21 [無断転載禁止]
くだらない質問はここで聞け!@プロ野球板 第124回 [無断転載禁止]
Webサイト制作初心者用質問スレ part248 [無断転載禁止]
Fate/Grand Order 質問スレ Lv.24 [無断転載禁止]
大人モバ総合質問スレッド [無断転載禁止]©bbspink.com
大人のモバイル板 総合質問スレ [無断転載禁止]©bbspink.com
SKYRIM エロMOD質問スレ 17 [無断転載禁止]©bbspink.com
Splatoon(スプラトゥーン)質問スレ24 [無断転載禁止]
SKYRIM エロMOD質問スレ 25 [無断転載禁止]©bbspink.com
Java入門・初心者質問スレ Part.3 [無断転載禁止]©2ch.net
オナホール初心者質問スレ 57本目 [無断転載禁止]©bbspink.com
iTunes 質問スレ Part13&#169;2ch.net・ [無断転載禁止]
【mobage】グランブルーファンタジー質問スレ124 [無断転載禁止]
[無断転載禁止] Windows 10 質問スレッド Part24 [無断転載禁止]
16:11:50 up 13 days, 7:33, 0 users, load average: 16.99, 17.39, 17.85

in 0.039797067642212 sec @0.039797067642212@0.1 on 110506