◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

【初心者歓迎】C/C++室 Ver.102【環境依存OK】 ->画像>1枚


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

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

1デフォルトの名無しさん
2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
http://2chb.net/r/tech/1500329247/
2デフォルトの名無しさん
2017/11/05(日) 17:44:45.44ID:rSDVGL6P
>>1
3デフォルトの名無しさん
2017/11/05(日) 20:58:13.61ID:80sy7ZoV
unsigned long strtoulxn( char const* psz, size_t n )
{
    unsigned long v;

    for ( v = 0; *psz && n--; psz++ ) {
        if ( ! isdigit( *psz ) ) {
            continue;
        }
        v = 10 * v + ( *psz - '0' );
    }
    return v;
}
4デフォルトの名無しさん
2017/11/05(日) 21:07:57.69ID:i5zx7IeJ
これは酷いクソコード
5デフォルトの名無しさん
2017/11/05(日) 22:25:14.64ID:NxjjuMpf
実行速度
見やすさ
汎用性
コードサイズ

どれかひとつ位は満たさないと
6デフォルトの名無しさん
2017/11/05(日) 22:42:14.76ID:3uuR82Hq
>>5
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね
7デフォルトの名無しさん
2017/11/06(月) 08:01:53.31ID:uTTN+kxR
>>3 の関数は前のスレッドの終わりに出た
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。

…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
8デフォルトの名無しさん
2017/11/06(月) 08:45:24.00ID:H37qYFYx
size_t n で文字数を受けとるからNUL終端である必要は無いのでは
9デフォルトの名無しさん
2017/11/06(月) 09:40:14.23ID:L15YU14L
if (strncmp(psz, "12 34 56", 8) == 0) return 123456;
10デフォルトの名無しさん
2017/11/06(月) 23:29:19.85ID:OMQOLu1z
相変わらず片山はクソコードしか書かないな
""だと不定値返る数値変換なんてゴミ
11デフォルトの名無しさん
2017/11/06(月) 23:59:53.41ID:/gW4r5bt
>>10
確かにクソコードだが不定値は返らんぞ
12デフォルトの名無しさん
2017/11/07(火) 04:37:45.33ID:T7zw8VZw
>>9 は質問者に対する皮肉のつもりだったんだけど
13デフォルトの名無しさん
2017/11/07(火) 04:47:47.90ID:T7zw8VZw
意図的に糞コードを書いた事もわからないクソがいるとは
こんな簡単なコードの動作も理解できてないようだし
14デフォルトの名無しさん
2017/11/07(火) 06:16:53.55ID:pkgJL5Ib
初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。

>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。
15デフォルトの名無しさん
2017/11/07(火) 06:53:54.21ID:+N0q+RZO
誰も騙してないのにクソみたいなプライドが高いな
16デフォルトの名無しさん
2017/11/07(火) 07:08:01.90ID:aXJpgdu1
出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう
17デフォルトの名無しさん
2017/11/07(火) 08:24:36.39ID:FXbSqjpU
psz = "", n = 0 はいいけど
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型
18デフォルトの名無しさん
2017/11/07(火) 08:32:51.44ID:T7zw8VZw
>>3

●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる

isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い

●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで

●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番
19片山博文MZ ◆T6xkBnTXz7B0
2017/11/07(火) 10:46:29.90ID:BS6pey7a
>>10
人違い。
20デフォルトの名無しさん
2017/11/07(火) 12:47:26.90ID:FXbSqjpU
>>18
> null文字とサイズ、両方で停止は仕様としては問題ない
だからダメだっつーの
知ったかは黙ってろよ
最低限サイズチェックを先にやらないとダメ
21デフォルトの名無しさん
2017/11/07(火) 13:22:08.68ID:oMcRDniv
仕様として「両方で停止は問題ない」よな?

判別の順番は問題だ
順番が逆

そもそも相談者の仕様がおかしい
22デフォルトの名無しさん
2017/11/07(火) 16:16:20.01ID:3ER4WXnW
先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし

ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん
23デフォルトの名無しさん
2017/11/07(火) 17:07:50.15ID:Zpoup5pM
int str2i( const char *s, size_t n )
{
    int v = 0;   
    while ( n-- ) {
        char c = *s++;
        if ( c == '??0' ) break;
        if ( '0' <= c && c <= '9' ) v = v * 10 + ( c - '0' );
    }
    return v;
}
24デフォルトの名無しさん
2017/11/07(火) 17:17:37.91ID:jEe4bM6y
片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな
25デフォルトの名無しさん
2017/11/07(火) 17:31:27.26ID:Zpoup5pM
ソフト歴35年ですが
26デフォルトの名無しさん
2017/11/07(火) 17:50:48.44ID:6NdbJPOz
PC(プロセスコントローラー)のプログラマーですが何か?
ってのは居たが
27デフォルトの名無しさん
2017/11/08(水) 01:37:38.03ID:MEe7IGP8
isdigitが関数コールな処理系ってあるのか?
ここって車輪の再発明好きな人多いのかね
28片山博文MZ ◆T6xkBnTXz7B0
2017/11/08(水) 02:06:05.60ID:TZ5JAUzS
isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。
29はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 03:38:56.63ID:xvDlz0If
ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)
30デフォルトの名無しさん
2017/11/08(水) 06:19:22.66ID:u4hO2YM0
配列www
ないない
仮に>>23より速くても
31デフォルトの名無しさん
2017/11/08(水) 06:36:16.44ID:u4hO2YM0
int str2i( const char *s, size_t n )
{
    int v = 0;   
    while ( n-- ) {
        char c = *s++;
        switch (c){
        case '¥0':
            goto brk;
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
            v = v * 10 + ( c - '0' );
            break;
        }
    }
brk:
    return v;
}
32デフォルトの名無しさん
2017/11/08(水) 06:36:55.45ID:u4hO2YM0
これのがまだマシ
33デフォルトの名無しさん
2017/11/08(水) 06:40:10.32ID:u4hO2YM0
普通に>>23でいい
34デフォルトの名無しさん
2017/11/08(水) 09:37:48.99ID:kEoXgNLC
gotoとかwwww
って思った人いるんだろうか
35デフォルトの名無しさん
2017/11/08(水) 10:35:10.40ID:FLS9cqpb
switch である必要ないな
36デフォルトの名無しさん
2017/11/08(水) 11:33:23.57ID:2d9va5Xh
>>34
ああ、素人はgoto嫌うよな

>>35
もちろん必要は無い
テーブルよりは色々な面でマシってだけ
普通に if ( '0' <= c && c <= '9' ) で良い
一目で意味がわかるし高速
37デフォルトの名無しさん
2017/11/08(水) 12:27:45.50ID:2VVChtYT
&&って条件分岐が入るけど、本当に高速?
38デフォルトの名無しさん
2017/11/08(水) 12:44:08.80ID:FLS9cqpb
そこはctypeで判定だね
39デフォルトの名無しさん
2017/11/08(水) 13:01:31.63ID:2VVChtYT
>>37
とおもってアセンブリ吐かせてみたら、すごかった。
48引いた上で、符号なしで10未満か判定してるので、
余分な条件分岐してなかった。
40はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 13:02:27.97ID:xvDlz0If
>>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。

addl $-48, %eax
cmpl $10, %eax
setb %al

賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。
41片山博文MZ ◆T6xkBnTXz7B0
2017/11/08(水) 13:37:52.71ID:TZ5JAUzS
俺の知識も時代遅れになったな。シンプル伊豆ベスト。
42はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 18:14:28.55ID:xvDlz0If
もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。

ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜
43デフォルトの名無しさん
2017/11/08(水) 18:22:33.84ID:8jdacwiA
>>42
まるで昔は速かったかのようだ
44はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 18:37:11.31ID:xvDlz0If
>>42-43
Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ
45デフォルトの名無しさん
2017/11/08(水) 18:43:03.66ID:u4hO2YM0
ん?
8086はビット演算の方が速いぞ
46デフォルトの名無しさん
2017/11/08(水) 18:57:26.39ID:GPQLPiKH
>>21
> 仕様として「両方で停止は問題ない」よな?
相談者でないとわからん
途中に'\0'があるケースについては書いてないから

> そもそも相談者の仕様がおかしい
それはお前が決める話じゃない
47デフォルトの名無しさん
2017/11/08(水) 18:59:47.82ID:GPQLPiKH
>>22
> ショートサーキット前提の記述をよしとするかどうかはわからん
if(p != 0 && *p != '\0')
みたいなのは普通に書かない?
48デフォルトの名無しさん
2017/11/08(水) 19:03:40.31ID:CwKlKlOQ
>>47
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない
49デフォルトの名無しさん
2017/11/08(水) 19:14:43.13ID:u4hO2YM0
>>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる

両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り
50デフォルトの名無しさん
2017/11/08(水) 19:18:16.64ID:u4hO2YM0
全角数字の方がまだ可能性がある
51デフォルトの名無しさん
2017/11/08(水) 19:42:17.13ID:GPQLPiKH
>>49
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...
52デフォルトの名無しさん
2017/11/08(水) 19:51:21.87ID:CyIcapPx
isdigit関連で性能測ってみた。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。

数字: 条件式 < int配列ルックアップ < isdigit
英字: 条件式 <= int配列ルックアップ < isalpha
数字英字: int配列ルックアップ < 条件式 < isalnum

ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。
5352
2017/11/08(水) 19:54:52.03ID:CyIcapPx
あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。
54デフォルトの名無しさん
2017/11/08(水) 20:30:53.41ID:u4hO2YM0
最速なら前スレの>>995>>997

>>997は演算の依存性が高いので
>>995の方が少し速いかな?
まあコンパイラや環境依存でしょう

x64前提なら、
64bit一気に持ってきて偶数奇数桁に分けて、
LEAで5倍してシフトして足すとか
AVXで乗算してから水平演算とか
色々と考えられるけど
まあ一応このスレのC言語の範囲で
55デフォルトの名無しさん
2017/11/08(水) 20:49:19.11ID:QAR8Spec
このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;

これより速くする方法あるのか
56デフォルトの名無しさん
2017/11/08(水) 21:08:26.39ID:CwKlKlOQ
何時の間に判定せずにすむようになったんだ
57デフォルトの名無しさん
2017/11/08(水) 21:11:25.51ID:u4hO2YM0
前スレの>>997が質問者だから
フォーマットは固定と思われる
58デフォルトの名無しさん
2017/11/08(水) 21:12:49.95ID:u4hO2YM0
さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので
このままで良い気はする
当然こちらの方が意味が分かりやすい
59デフォルトの名無しさん
2017/11/08(水) 21:14:04.15ID:u4hO2YM0
( ) を色々とかえて時間を測ってみたけどほとんど同じ
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合
60デフォルトの名無しさん
2017/11/08(水) 21:39:10.43ID:u4hO2YM0
VPMOVZXBD xmm0, a
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0
61デフォルトの名無しさん
2017/11/08(水) 21:40:02.30ID:u4hO2YM0
AVXが使えるならこれ
62デフォルトの名無しさん
2017/11/08(水) 21:42:47.06ID:u4hO2YM0
微妙に間違った
メモリが連続してれば複数同時に出来る
連続してなくても複数同時にやった方が速い
63デフォルトの名無しさん
2017/11/08(水) 21:43:54.20ID:YMDhJx7T
>>29でメモリアクセスに言及されてる話の流れの中で
10億回ループがいちいちキャッシュクリアされてるのかが気になる
64デフォルトの名無しさん
2017/11/08(水) 21:49:19.34ID:u4hO2YM0
普通はキャッシュに入ったままだが、
処理次第で可能性が無いことはない
他のキャッシュを汚染する可能性もある
HTTなどでは特に

他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない
65デフォルトの名無しさん
2017/11/10(金) 07:46:10.46ID:F5y7yLWH
std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。
newするしかないですかね。
66デフォルトの名無しさん
2017/11/10(金) 10:26:44.91ID:TvDreq2K
>>65
vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。
67デフォルトの名無しさん
2017/11/10(金) 20:15:55.61ID:MIqJX5DT
>>66
まあどうみても内部でnewしてるんだろうけど
68デフォルトの名無しさん
2017/11/10(金) 21:01:13.10ID:UsP+TtJI
クラスの概念がわかりません
69デフォルトの名無しさん
2017/11/10(金) 21:19:13.94ID:lLb0QJod
構造体みたいなもの
70片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 21:39:23.58ID:x1hu0efq
>>68
クラスは構造体に関数を追加したようなもの。
クラス内部の関数はメソッドと呼ばれる。
メソッドからは、クラスのデータとメソッドを参照できる。
データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。
クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。
メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。
71片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 22:11:59.59ID:x1hu0efq
class A
{
int a;
};
と書くとA::aは、privateになる。構造体と同じアクセスにするには
class A
{
public: int a;
};
と書かないといけない。このようにクラスのデフォルトのアクセスはprivateになり、構造体はpublicになるという違いもある。
72片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 22:14:05.73ID:x1hu0efq
クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。
また、インスタンスが破棄されるときに、デストラクタという特殊なメソッドが呼ばれる。
73片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 22:17:22.95ID:x1hu0efq
コンストラクタの例。
class A
{
public:
int m_a;
A(int a) {m_a = a + 1; }
};

int main() {
A a(2);
printf("%d\n", a.m_a);
}
74片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 22:19:15.61ID:x1hu0efq
別のコンストラクタの例。
class A {
public: int m_a;
A(int a, int b) : m_a(a + b) { }
};
int main() {
A a(2, 3);
printf("%d\n", a.m_a);
}
75はちみつ餃子 ◆8X2XSCHEME
2017/11/10(金) 23:02:09.42ID:4kUQXTj6
そんなの説明してやらなくてもネット上に無数の解説があるだろ。
ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。
76片山博文MZ ◆T6xkBnTXz7B0
2017/11/10(金) 23:14:40.61ID:x1hu0efq
>>75
情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。
77デフォルトの名無しさん
2017/11/10(金) 23:21:03.62ID:YANYSepQ
そう思うならなぜ現在地を聞く前に世界地図を渡すのか
78デフォルトの名無しさん
2017/11/10(金) 23:32:23.63ID:2wx3Dyqu
>クラスは構造体に関数を追加したようなもの

こういうアホってどこにでもいるんですね
79 ◆QZaw55cn4c
2017/11/10(金) 23:40:07.53ID:qCTAOUdD
>>78
その理解で8割がたOKだと思うのだが、何が問題なの?
80はちみつ餃子 ◆8X2XSCHEME
2017/11/10(金) 23:46:33.90ID:4kUQXTj6
>>76
チュートリアルだってたくさんあるじゃん。
81デフォルトの名無しさん
2017/11/11(土) 00:24:04.64ID:5MIg+SHx
>>79
クラスがわからんやつにこんな説明しても通じないだろ
82デフォルトの名無しさん
2017/11/11(土) 00:49:17.73ID:1PUme0lw
山田さんってどんな人?と聞かれて
原子の集まりだよ。って答えるようなもの
形式的にウソじゃあないんだが
そこじゃないだろっていう
83デフォルトの名無しさん
2017/11/11(土) 02:47:19.31ID:fW1Ux/Kl
純粋にC++のクラスそれ自体の概念というなら
C言語(ベース)でのオブジェクト指向プログラミングをサポートするために言語機能で用意された部品
オブジェクト指向プログラミングにおけるオブジェクト、オブジェクトの状態、
メッセージの送受信、メッセージを受けたときの振る舞いといった概念を具体化した仕組みの一例
84デフォルトの名無しさん
2017/11/12(日) 13:22:39.97ID:134uacB+
記憶クラスについての質問の可能性
85デフォルトの名無しさん
2017/11/12(日) 23:51:21.74ID:nDRVLcBe
実のところはOOPを知らないからクラスをどう使えばいいのかわからない/
他人の真似でなんとなく使ってるけどなぜクラスを使うのかがわからないといったあたりの話だろ
86デフォルトの名無しさん
2017/11/22(水) 02:18:46.71ID:jSfISRI4
下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう
クラスは実用あってこそ
87デフォルトの名無しさん
2017/11/22(水) 07:58:58.54ID:gxZQPw73
アニマルクラスがわんにゃー鳴くのがオブジェクト指向です
88デフォルトの名無しさん
2017/11/22(水) 17:16:56.90ID:ehTxx6H6
メンバ関数を呼び出す際の
「オブジェクトにメッセージを送る」って言い回しも
C++だと分かりにくいね。

この表現がしっくりくるプログラミング言語というか
環境もあるのだろうけど。
89デフォルトの名無しさん
2017/11/22(水) 17:52:35.50ID:NgxFNsMl
>>88
そういうのをベタで実現しているOO言語はないかな…
90デフォルトの名無しさん
2017/11/22(水) 18:04:22.80ID:evJ3QlJY
smalltalkは?
91デフォルトの名無しさん
2017/11/22(水) 20:55:50.24ID:6XHR1ElK
>>90
あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ
同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど
それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ
そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を
Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので
http://www.stroustrup.com/whatis.pdf
92はちみつ餃子 ◆8X2XSCHEME
2017/11/22(水) 21:08:20.60ID:Rn9KsJdK
言語の意味論とそれを実現するメカニズムは別物だから、
仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。

まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、
意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも
メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。
93デフォルトの名無しさん
2017/11/22(水) 21:21:24.87ID:3PrpHuiB
メソッド呼び出しってメッセージパッシング感すげー出てない?
94デフォルトの名無しさん
2017/11/22(水) 21:28:03.86ID:+hB2MqUt
>それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

違いがわからないw
95デフォルトの名無しさん
2017/11/22(水) 22:33:35.60ID:2YdhEIzW
>>93
メッセージパッシング言うなら、何かが静的に決定してる時点で興醒めだよ
http://wiki.c2.com/?AlanKayOnMessaging
96デフォルトの名無しさん
2017/11/22(水) 23:02:11.68ID:XGz0BDt0
>>95
C++のポリモーフィックなメソッドは動的ディスパッチだろう
97デフォルトの名無しさん
2017/11/22(水) 23:09:00.03ID:NgxFNsMl
>>91
>抽象データ型
これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか?
98デフォルトの名無しさん
2017/11/23(木) 08:26:45.55ID:Qr4pYIOt
>>96
C++に「動的なものは何もない」という主張ではなく
「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味

少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している
http://d.hatena.ne.jp/katzchang/touch/20080807/p2
「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、
そして全ての物に対する強力な遅延束縛、これだけだ。
これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」

つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、
(あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ)
無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない
99デフォルトの名無しさん
2017/11/23(木) 08:27:38.45ID:Qr4pYIOt
>>97
まったくもってその通り
100デフォルトの名無しさん
2017/11/23(木) 14:15:04.16ID:76J8bh8G
Cのキャストについて教えてください

int a,b;
long c;

の条件下で、a+b 、a*100+b*100(a*100、b*100のどちらもlong型になる)
がそれぞれlong型の解になるような場合のキャストとしては

1 c=(long)a+b;
2 c=(long)a+(long)b;

3 c=(long)a*100+b*100
4 c=(long)a*100+(long)b*100

とそれぞれ、どの記載が正しいのでしょうか?
101デフォルトの名無しさん
2017/11/23(木) 14:19:02.83ID:5K7m7Mmt
>a*100、b*100のどちらもlong型になる

intでは表せなくてlongが必要
って意味なら3以外
102デフォルトの名無しさん
2017/11/23(木) 14:20:46.83ID:76J8bh8G
ありがとうございます。
1と3は似ていますが1はa,bそれぞれキャストされるが
3ではb*100はキャストされずint型で計算されてしまう、ということなのですね
103デフォルトの名無しさん
2017/11/24(金) 16:57:14.87ID:L5ESShiZ
よろしかったら教えてください

  if(a==0){ }

と記述するのにfor文では
  
  for(i=0;1<100;i++){}

と書き、for(i==0;i<100;i++){}

と書かないのはなぜでしょうか?(==の使い方)
104片山博文MZ ◆T6xkBnTXz7B0
2017/11/24(金) 17:05:28.65ID:ELoh0Abo
>>103
代入と比較は違う。
105デフォルトの名無しさん
2017/11/24(金) 17:07:52.77ID:QRhLqwOG
スーパー初心者か?
forでも書いてもいい。だが意味がないか低い。
「=」は代入だが「==」は代入でない。
106デフォルトの名無しさん
2017/11/24(金) 17:08:50.74ID:L5ESShiZ
片山先生、ありがとうございました!
そういうことなのですね。理解できました、いつもありがとうございます!
107はちみつ餃子 ◆8X2XSCHEME
2017/11/24(金) 17:38:47.92ID:lG8HVUMw
わかってる人にとってはクソみたいな質問だけど、
数学だと代入 (定義) するっていうのと等しいっていうのは区別がはっきりしないので、
そういうメンタルモデルで考えてると混乱しちゃうってのはわからんでもない。

とはいうものの、よっぽど出来の悪い入門書でもそこらへんわからんようなのは無いと思うんだが、
どういう学び方をしてるんだかちょっと疑問。
108デフォルトの名無しさん
2017/11/24(金) 17:51:57.71ID:L5ESShiZ
なんかすみません
ネットで優しそうなサイトで進めてます
109デフォルトの名無しさん
2017/11/28(火) 12:50:21.53ID:bi1wDt8X
数学のイコールには比較(の結果等しい)の意味しかないだろう
Pascalみたいに代入が:=なら良かったのに
110デフォルトの名無しさん
2017/11/28(火) 12:57:44.05ID:cL+Re6N7
プログラムを記述する際、等しいかを比較するより、代入のほうが頻度が高いから
Cでは多く入力するであろう代入側を 1文字にして そうでない側を 2文字にした
って聞いたことがある
111デフォルトの名無しさん
2017/11/28(火) 13:22:50.66ID:8wOk3LC1
Fortranだって代入は=だから、Cで採用されたのも仕方ない

とはいえ、文字数ごときにこだわらずに、:=を採用してくれていたらタラレバ
112デフォルトの名無しさん
2017/11/28(火) 13:44:24.58ID:9QEYjjOS
力添えを頂きたい。
SunAwt系のソフト内で表示されているテキストを取得したいんだが、尻尾も掴めず困り果て、どうすれば良いか全く分からない状態。
何かヒントを頂けないだろうか。
113はちみつ餃子 ◆8X2XSCHEME
2017/11/28(火) 13:50:31.60ID:1OfFiaid
>>112
別のプロセスから取得するって意味?
114デフォルトの名無しさん
2017/11/28(火) 18:08:18.05ID:9QEYjjOS
>>113
YES。
別プロセスからテキストを取りたい。
他の例えばIEやハンドルが取れる様なソフト内の文字ならgettextやcom操作で取ったりできるがSun系のソフトは同じ様にはいかず、メモリを読むのかどうすればいいのか、知識が足りなくて検索も上手に出来ず...頭打ち状態。
何か足掛かりになる物を教えて頂きたい。
115デフォルトの名無しさん
2017/11/29(水) 00:32:03.31ID:/GAULuFW
>>114
試したことないけどこれは?
http://www.oracle.com/technetwork/articles/javase/index-jsp-136191.html
116デフォルトの名無しさん
2017/11/29(水) 13:08:28.50ID:GlJ85cMo
#include<stio.h>
int main(){
int i,num[5];

for(i=0;i<5;i++){
printf("***\n");
scanf("%*c%d"&num[i]);
}
}

実行し、num[]に、10、20,30,40,50と入力すると
num[0]の値は0、num[1]は20、その後50まで代入されてます
num[0]に10が代入されないのは何故なのでしょうか?
117デフォルトの名無しさん
2017/11/29(水) 13:26:13.79ID:NrhyqkWd
>>116
"%*c"のせいじゃね
118デフォルトの名無しさん
2017/11/29(水) 13:36:20.41ID:GlJ85cMo
>>117
そうでした。ありがとうございました。
119デフォルトの名無しさん
2017/11/30(木) 14:49:53.66ID:t+LxFq0J
テフ?
120デフォルトの名無しさん
2017/12/01(金) 03:20:07.32ID:VClmrWfc
boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね
121デフォルトの名無しさん
2017/12/01(金) 12:48:46.21ID:UzEJxhfp
5人の生徒に3教科のテストをし、その点数を入力する
入力後、
          テストA  テストB  テストC
 0点〜19点    0人    0人    0人
20点〜39点    0人    0人    0人
40点〜59点    2人    0人    1人
・・・
80点〜100点   1人    3人    2人

と集計する方法に悩んでいます。
どういう考え方が考えられますか?
122デフォルトの名無しさん
2017/12/01(金) 13:06:08.20ID:p7Y4uOcI
>>120
char_に替わるパーサー書けばいいんじゃないかね
マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして
mbchar = (mb1 >> char_) || char_;
とか?
123デフォルトの名無しさん
2017/12/01(金) 13:14:35.24ID:LYbXDWPH
>>121
宿題は自分で考えるのが原則。どこまで考えた?
124デフォルトの名無しさん
2017/12/01(金) 13:21:20.74ID:UzEJxhfp
>>123
ありがとうございます。
入力された点数を3次元配列に格納するところまでです。
今は、繰り返し分を使い、配列に格納された数字が0でなかったら
その数字をカウントして人数を集計しようとしてるのですが、できていません
125デフォルトの名無しさん
2017/12/01(金) 13:56:35.70ID:LYbXDWPH
>>124
なぜ3次元?生徒と教科がインデックスだから2次元では?
あと、表示さえすればいいだけなら、
効率度外視である教科のある得点範囲の人数をカウントするくらいできるでしょ。
効率考えるなら表示用に0で初期化した2次元配列を別に用意する。
126デフォルトの名無しさん
2017/12/01(金) 14:01:47.55ID:UzEJxhfp
>>125
ありがとうございます。2次元です。
ten[5][3]で得点を格納したあとが進まないのです
得点範囲の人数のカウントについてもう少し考えてみます
127デフォルトの名無しさん
2017/12/02(土) 00:04:56.97ID:F3lbt2G4
中古本でプログラミング言語c++の3版が4000円で4版が6000円なんだが
やっぱり4版を買ったほうがいいのかな
128デフォルトの名無しさん
2017/12/02(土) 00:18:15.85ID:4X8AnX6A
あんまり良い本じゃないから買わなくていい
129デフォルトの名無しさん
2017/12/02(土) 00:54:45.18ID:F3lbt2G4
>>128
そうなのか・・・聞いておいてよかった
ありがとう
130デフォルトの名無しさん
2017/12/02(土) 09:08:29.93ID:XeWd0teH
>>125
昨日はありがとうございました
90行程度と長いプログラムになりましたが
人数をカウントし表示させることができました

カウントは、教科毎にfor文で呼び出し
20以下、20〜39、・・・80〜99、100とif文で条件指定し
各範囲で人数をカウントし、最後に表示させました

また分からないことがありましたらご指導お願いいたします。
131デフォルトの名無しさん
2017/12/02(土) 14:58:42.41ID:XeWd0teH
ファイルを開いた回数を記録するというプログラムを作っています
int main(){
int count;
FILE *fp;

if((fp=fopen("log.txt","r"))==NULL){
count=0;
}else{
fscanf(fp,"log.txt",&count);
fclose(fp);
}

if((fp=fopen("log.txt","w"))==NULL){
printf("Error\n");
return -1;
}

count++;
printf("%d回目のプログラムを実行です\n",count);
fprintf(fp,"%d\n",count);
fclose(fp);
}
これを実行するたびに
2752513回目の・・・
3444737回目の・・・
2953217回目の・・・
となってしまい、ファイルを開いた数が記録されません

最初にlog.txtがない状態で実行したときの、一番最初だけ、countに1が代入され
log.txtにも1が記載されるのですが、2回目以降のcountには7桁の乱数みたいのが代入され記載されてしまいます
どうして不具合が出るのか分からなくなっております。よろしくご教授くださいませ
132デフォルトの名無しさん
2017/12/02(土) 15:12:26.31ID:jpnrbmV1
fscanfで書式の指定ミス
133デフォルトの名無しさん
2017/12/02(土) 15:16:24.33ID:XeWd0teH
>>132
さっそくありがとうございます。fscanf(fp,"%d",&count)と訂正しました。
初歩的なミスで申し訳ありませんでした、そしてありがとうございました。
134デフォルトの名無しさん
2017/12/02(土) 15:18:37.18ID:Jd1ioDh8
>>131
> fscanf(fp,"log.txt",&count);
二番目の引数を再確認してみ
135デフォルトの名無しさん
2017/12/02(土) 15:35:47.69ID:XeWd0teH
>>134
ありがとうございました。
おかげさまで正常にカウントされるよになりました。
確認不足でご迷惑おかけしました。ありがとうございます。
136デフォルトの名無しさん
2017/12/02(土) 18:53:18.55ID:K6qIkKEG
超初心者です
c言語でGetPixelが動きません
どうすれば直るのか教えてください

COLORREF GetPixel (float 変数x, float 変数y); //指定座標の色取得。

if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行

//以下、実行するコード
137デフォルトの名無しさん
2017/12/02(土) 19:09:54.54ID:4pmjT1Fk
>>136
>if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行

if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) {
条件が真のとき実行するコード
}
ではどうですか?
138デフォルトの名無しさん
2017/12/04(月) 17:32:02.17ID:K3o+GgF3
boost::qiって読み方ブースト・チーでいいの?
139デフォルトの名無しさん
2017/12/04(月) 18:32:18.36ID:m/Ygi57i
boostのパーサの使い方わかんね
140デフォルトの名無しさん
2017/12/04(月) 21:33:58.20ID:K2rBoL+r
>>138
141デフォルトの名無しさん
2017/12/05(火) 04:28:16.53ID:NJ16QKFF
組み込みの場合例えばRs232Cのチャンネルが三つあるようなばあいにクラスに
するとIOの初期化がそれぞれ違う。しかもチャンネル1を初期化するとチャンネル3
にも影響する場合がある。こういう場合にはどんな風にクラスをつくったらいい?
142デフォルトの名無しさん
2017/12/05(火) 10:59:54.97ID:BooJAJ3p
よろしくお願いします。

fp=fopen("out.txt","r");
while(fscanf(fp,"%d",&da2[i])!=EOF){
fscanf(fp,"%d",&da2[i]);
i++;
}
fclose(fp);

これを実行するとテキストファイルに記録されている整数を
一行飛ばしで読みだしてしまいます
どうして飛ばされる行ができてしまうのでしょうか?
143デフォルトの名無しさん
2017/12/05(火) 11:22:39.33ID:tMsGMSrl
>>141
friend
144 ◆QZaw55cn4c
2017/12/05(火) 11:42:25.43ID:x6DQdw1l
>>142
fscanf() を二箇所に書いているけれども、それでいいのですか?
145デフォルトの名無しさん
2017/12/05(火) 11:54:34.95ID:GUcDlKUg
>>142
whileでのfscanfのあとでiを変更してないから次のfscanfで同じda2[i]に上書きしてる
146デフォルトの名無しさん
2017/12/05(火) 12:02:08.68ID:BooJAJ3p
>>144>>145
そういう事だったのですね
ありがとうございました!
147デフォルトの名無しさん
2017/12/05(火) 15:40:18.03ID:BooJAJ3p
再びよろしくお願いいたします。

int main(){
char ch1,ch2;
printf("二文字入力\n");
scanf("%c",&ch1);
 scanf("%c",&ch2);
printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2);
return 0;
}
これを実行すると、2回目のscanfを飛び越えてしまいます。
その理由と回避方法をご指南いただけませんでしょうか?
よろしくお願いいたします。
148片山博文MZ ◆T6xkBnTXz7B0
2017/12/05(火) 15:46:59.33ID:KBxdaLdg
再びよろしくお願いいたします。

int main(){
char buf[3], ch1,ch2;
printf("二文字入力\n");
fgets(buf, 3, stdin);
ch1 = buf[0];
ch2 = buf[1];
printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2);
return 0;
}
149デフォルトの名無しさん
2017/12/05(火) 16:20:49.08ID:BooJAJ3p
>>148
ありがとうございます
標準入力によって処理し、scanfを使わないということなのですね
文法を覚えて活用できるようにします
何度もありがとうございます
150デフォルトの名無しさん
2017/12/05(火) 16:50:17.51ID:VZfNuCLu
>>147
改行文字を次のscanfで読込むから
回避方法は例えば
http://blog.unfindable.net/archives/604
151デフォルトの名無しさん
2017/12/05(火) 16:59:28.01ID:BooJAJ3p
>>150
ありがとうございます
しっかり理解できるには時間がかかりますが
とりあえず、お礼申し上げます
改行文字を処理しないと次のscanfが改行文字を読んでしまうのですね
とても勉強になりますし、皆様のおかげで前進できます
ありがとうございます
152デフォルトの名無しさん
2017/12/07(木) 00:17:29.58ID:fcKh4od9
皆すげーな
俺みたいなライブラリのインクルードが通せなくて
そもそもコンパイルって何だっけってところから調べるような奴には恐れ多いわ
153デフォルトの名無しさん
2017/12/07(木) 12:53:50.82ID:4zvLzkC0
毎日すみません。ご教授お願いします。

out,txtに記録されている下記文字に対して
---------------
AAA BB
ababb
099
---------------
ファイルを開いて、文字列を読み出し
配列で一文字一文字を表示させようとしています

i=0;
fp=fopen("out.txt","r");
while(fscanf(fp,"%c",&c)!=EOF){
i++;
}
for(t=0;t<=i;t++){
printf("%c\n",c[t]);
}

これだと18行表示されますが
表示されたのは全く異なるものでした
どこが不適切なのか2日考えても分かりません
いつも申し訳ありません><よろしくご指導願います
154デフォルトの名無しさん
2017/12/07(木) 13:10:52.74ID:dicAL8ON
>>153
c は大きさの十分ある char への配列と想定した前提で
fscanf の引数がおかしい

1文字毎に配列へ順繰りに読み込ますのなら
 fscanf(fp,"%c", &c[i]);
こうなってないと
155デフォルトの名無しさん
2017/12/07(木) 13:39:27.89ID:4zvLzkC0
>>154
&が抜けていたのは恥ずかしいです
申し訳ありませんでした
しっかり覚えさせていただきます

プログラムもちゃんと動きました
いつも簡単なことばかりなのに理解が浅くてすみません
とても勉強になりました。ありがとうございました
156デフォルトの名無しさん
2017/12/07(木) 16:08:02.33ID:dicAL8ON
書いてあることが違うけど(&が抜けていたのではなく [i] がない)
本当に分かっているのか不安になる返答だが、そのうち慣れてくるだろう。

(文字と文字列の違いと (f)scanf に渡すフォーマットの指示と 変数をどう渡すか
 の一連が整理されてないと、また繰り返すだろう)
157デフォルトの名無しさん
2017/12/07(木) 16:29:02.63ID:4zvLzkC0
>>156
はい、ありがとうございます。
配列にして直してあります。
fscanf(fp,"%s",c)として読み込んだ後に
c[i]で一文字一文字表示させられると思い込んでいました

先ほどの156のおかげでfscanf(**** &c[i])を覚えられました
ありがとうございます!感謝してます
158デフォルトの名無しさん
2017/12/08(金) 15:46:12.24ID:b0CgZ3o1
こんにちは。どうか本日もよろしくお願いいたします。
10人分の点数を入れて表示するプログラムです。
下記のように作成したのですが、main()内から関数を呼び出すところで
parameter names(without typesというエラーがでてしまいます。
どうかよろしくお願いします。

#include<stdio.h>
void da(int ten[10]){
int i;
for(i=0;i<10;i++){
printf("%d input ",i);scanf("%d",&ten[i]);
}
return;
}

void out(int ten[10]){
int i;
for(i=0;i<10;i++){
printf("%d人目 : %d点\n",i,ten[i]);
}
return;
}

int main(){
int ten[10];
void da(ten);
void out(ten);
return 0;
}
159片山博文MZ ◆T6xkBnTXz7B0
2017/12/08(金) 15:56:23.80ID:8LWGXCju
>>158

#include <stdio.h>
void da(int ten[10]){
int i;
for(i = 0; i < 10; i++){
printf("%d input ", i); scanf("%d",&ten[i]);
}
}

void out(int ten[10]){
int i;
for(i = 0; i < 10; i++){
printf("%d人目 : %d点\n", i + 1, ten[i]);
}
}

int main(void) {
int ten[10];
da(ten);
out(ten);
return 0;
}
160デフォルトの名無しさん
2017/12/08(金) 16:02:05.10ID:C0Y4l8FE
そろそろうっとしいな
161デフォルトの名無しさん
2017/12/08(金) 16:06:39.52ID:b0CgZ3o1
すみません、ここは質問するところじゃなかったのですね
他のC言語のスレから誘導されたので、こちらで質問していいかと思ったのですが
今後質問は控えます。自力で学習を進めようと思います。
ご迷惑をおかけしてすみませんでした。
片山先生、本日もありがとうございました。感謝です。
162デフォルトの名無しさん
2017/12/16(土) 05:14:03.17ID:Nra/Nglb
#pragma pack(1)
struct {
char a;
short b;
int c;
} x;
Cでバイナリデータとかパディング除けに上のような感じに書いて読み書きしたりしますが(例は適当)、
C++ではpragmaを使用せず記述量も少ないスマートな記述方法はあるでしょうか?
163デフォルトの名無しさん
2017/12/16(土) 09:10:24.00ID:67ZudMHx
ない
164デフォルトの名無しさん
2017/12/16(土) 09:52:53.87ID:Nra/Nglb
ありがとうございます。やっぱりないですか。
pragmaがコンパイラ依存とか書かれてて非常に嫌なんですが慣れます。
165片山博文MZ ◆T6xkBnTXz7B0
2017/12/16(土) 16:18:44.15ID:2NfYNG63
#include <pshpack1.h>
...
#include <poppack.h>
166デフォルトの名無しさん
2017/12/17(日) 02:47:22.67ID:T7tjmkgj
C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか?
167デフォルトの名無しさん
2017/12/18(月) 01:24:26.49ID:vrG0ZJDQ
>>164
そのような構造体で直接読み書きしないのがベスト
168デフォルトの名無しさん
2017/12/21(木) 16:50:57.91ID:FN6C0PcS
ここが適切かわかりませんが、

make の Makefile を Visual Studio や NetBeans 等の IDE の
プロジェクトファイルに変換するツールはありませんか。
169片山博文MZ ◆T6xkBnTXz7B0
2017/12/21(木) 16:54:33.43ID:fHSTQ7CK
makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。
170168
2017/12/21(木) 17:10:02.95ID:FN6C0PcS
>>169 そこまでは分ったのですが、
Makefile を CMakeLists.txt に変換するのはありますか?

見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、
Python のスクリプトだけでした。。
171片山博文MZ ◆T6xkBnTXz7B0
2017/12/21(木) 17:15:07.21ID:fHSTQ7CK
>>170
ない。
172168
2017/12/21(木) 17:25:55.41ID:FN6C0PcS
>>171 ありがとうございました。
CMake 勉強します。
173デフォルトの名無しさん
2018/01/09(火) 19:29:59.07ID:cBwAL66C
ライブラリ作成の指南書みたいな本ってありますか。
174デフォルトの名無しさん
2018/01/09(火) 22:23:30.03ID:9ubHCBZ8
環境によるんじゃ?
175デフォルトの名無しさん
2018/01/10(水) 01:19:44.15ID:CtX3Z92R
とりあえず
c++のためのapiデザイン
でも読んでみるといいと思う
176デフォルトの名無しさん
2018/01/10(水) 02:59:55.08ID:QjjLPcN0
読んでみるわ
177デフォルトの名無しさん
2018/01/13(土) 06:17:45.46ID:hj3TLdcf
定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの?
178デフォルトの名無しさん
2018/01/13(土) 09:08:14.97ID:P3TI7O0+
趣味とか宗教とかの話であって、別に使って問題ない
ただ名前の先頭だったり、2回連続で使ったりすると
予約語に引っかかることがあるので注意(定数の場合も)
179デフォルトの名無しさん
2018/01/13(土) 09:13:05.82ID:M+vRxjCB
その辺有名ライブラリのルール付けとか調べてみるのもいいかもね
180デフォルトの名無しさん
2018/01/13(土) 09:23:55.53ID:M+vRxjCB
GoogleがC++のスタイルガイド公開してる
これも参考になりそう
181デフォルトの名無しさん
2018/01/16(火) 10:54:12.13
C++で何つくんの?
GUIプログラムならC#のほうが圧倒的に簡単だし
182デフォルトの名無しさん
2018/01/16(火) 11:06:50.90ID:E1MTmeKy
CAD
183デフォルトの名無しさん
2018/01/16(火) 11:07:58.52
そんな上級者にしか用途がない言語か
184デフォルトの名無しさん
2018/01/16(火) 11:24:35.41ID:/aUGqjlJ
個人的にC/C++は高級なアセンブラだと思っている
C#とは存在するレイヤが違うから、比較条件として用途を挙げるのはちょっと違うかなって
185デフォルトの名無しさん
2018/01/16(火) 11:25:50.16
で、何つくんの?
高級アセンブリの用途は?
186デフォルトの名無しさん
2018/01/16(火) 12:09:46.86ID:J2S5K16W
画像処理
大規模ゲーム開発
187デフォルトの名無しさん
2018/01/16(火) 12:32:40.41ID:6i0TmEx8
GoogleChrome
188デフォルトの名無しさん
2018/01/16(火) 13:22:26.10ID:6uwiuQcq
ゲームとか速度が必要な場面でまだまだ使われてるでしょ
189デフォルトの名無しさん
2018/01/16(火) 15:46:42.36ID:e8xaSAkW
CPUパワーを必要とするようなまとまった処理は
C/C++のような低級な高級言語が適している
組み込み用の小規模マイコンもCがほとんど
190デフォルトの名無しさん
2018/01/16(火) 19:09:30.75ID:Vb1E5r0O
Pythonのライブラリも結局はCで作ってたりするしな。
191デフォルトの名無しさん
2018/01/17(水) 00:06:48.74ID:kWLOq5lU
GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。
192デフォルトの名無しさん
2018/01/17(水) 01:07:00.24ID:X2mlxDcY
OpenGLもC#か大変そうだな
193愛知人
2018/01/17(水) 09:14:59.53
Unityでいいよね
194デフォルトの名無しさん
2018/01/17(水) 11:15:20.21ID:X2mlxDcY
ライセンス料が只ならいいよ
195デフォルトの名無しさん
2018/01/17(水) 11:23:31.36ID:4ILD3/U5
Unityでも速度が必要な場所はC++で書いて呼び出し
196愛知人
2018/01/17(水) 11:48:22.30
なんでC++ってendlいるの?
197デフォルトの名無しさん
2018/01/17(水) 12:24:58.46ID:/z6RTYd5
ちょっと何言ってるかわかんないです
198愛知人
2018/01/17(水) 13:34:56.30
なんでprintf使わないの?
199デフォルトの名無しさん
2018/01/17(水) 13:41:03.90ID:lhJfQamL
浪人と引き換えに無知を手に入れた男
200愛知人
2018/01/17(水) 13:43:22.44
で、返答は?
201デフォルトの名無しさん
2018/01/17(水) 14:07:42.46ID:l2H41H1D
>>198
<cstdio>は正しくC++だからprintf使っても構わん 味噌 よ
後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね
endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?

愛知語は詳しくないけど察し手羽先
202愛知人
2018/01/17(水) 14:16:18.48
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w
203デフォルトの名無しさん
2018/01/17(水) 14:19:41.37ID:l2H41H1D
言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て
「人生を無駄にした」と真顔で後悔してるところだから
204デフォルトの名無しさん
2018/01/17(水) 15:03:17.62ID:MeUm47mp
何言ってんだこのバカ
205愛知人
2018/01/17(水) 16:08:09.91
あらら、怒っちゃった(笑)
206デフォルトの名無しさん
2018/01/17(水) 17:39:52.90ID:sykUBtM3
C++でしかできないもの作りたいだけど何かいいアイデアない?
207片山博文MZ ◆T6xkBnTXz7B0
2018/01/17(水) 17:52:07.55ID:89SqY/Kf
>>206
エクセルのような操作性の、画像レイアウト印刷アプリなんてどう?
208デフォルトの名無しさん
2018/01/17(水) 18:18:50.66ID:sykUBtM3
>>207
印刷はしたくないです..
209デフォルトの名無しさん
2018/01/17(水) 20:00:30.20ID:W2btjMLE
おs
210デフォルトの名無しさん
2018/01/27(土) 06:58:59.63ID:1R9xhZBX
windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった
そこでC+11の一部が使えるようになったから使いたいと思ってる
ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。

ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ないんじゃないのとか気をつけた方がいいよとかあれば意見よろしくです
211デフォルトの名無しさん
2018/01/27(土) 08:45:12.76ID:x9sgfrz+
バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。
212デフォルトの名無しさん
2018/01/27(土) 10:25:52.07ID:RqfNKOXi
ユーザからクロスコンパイラ提供してもらってバイナリ配布っす
nmコマンド、試す価値はありそうだありがとう
213デフォルトの名無しさん
2018/01/28(日) 06:43:38.82ID:yhuRz+yt
以下のコードをgccでコンパイルすると

#include <iostream>
#include <functional>
using namespace std;

struct functor {
int& operator()(int& i) { return ++i; }
};

int main() {
int i = 0;
cout << functor{}(i) << endl; // 関数オブジェクトは問題なし
function<int& (int&)> lambda = [] (int& i) { return ++i; }; // コンパイルエラー
cout << lambda(i) << endl;
return 0;
}

「'main()::<ラムダ(int&)>' から非スカラ型 'std::function<int&(int&)>' への変換が要求されました」
というエラーになるのですが、どうしてでしょうか?
そもそもラムダ式は関数オブジェクトのシンタックシュガー、つまり等価なのではないんでしょうか?
214デフォルトの名無しさん
2018/01/28(日) 07:45:35.06ID:kxFN6buW
>>213
戻り値がintになってる
戻り値の型を後置で書いてやればいいかな
function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; };
215デフォルトの名無しさん
2018/01/28(日) 22:25:05.79ID:yhuRz+yt
>>214
ありがとうございます。
戻り値の型を明示してあげないと値渡しになってしまうということですね。
勉強になりました。
216デフォルトの名無しさん
2018/02/06(火) 23:57:09.32ID:ZZWnbRb2
typedef int myTypeA;
typedef int myTypeB;

class Test {
void set(myTypeA a);
void set(myTypeB b);
priate:
int A;
int B;
};

のような事例で、引数に応じて専用のセッターを用意したいのですが、
int型の2種類の引数に対して、上記のように書くとコンパイルエラーになってしまいます。
どのようにするのが良いでしょうか?
217デフォルトの名無しさん
2018/02/07(水) 00:04:25.80ID:k5RJAFTX
structを使う?
struct my_TypeA{ int v;};
218デフォルトの名無しさん
2018/02/07(水) 00:18:25.18ID:yuAfwWTK
なるほど、、、確かにtypedefだと別名になるだけですね
structかclassで別の型にしないとダメですね
ありがとうございます!
219デフォルトの名無しさん
2018/02/07(水) 03:43:04.13ID:LQaGrglb
オブジェクト指向では、型による分岐処理は無くなる。
汎化

f(親型)

ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向
220デフォルトの名無しさん
2018/02/09(金) 15:21:46.70ID:+q9wZMZv
などと訳のわからないこと(でもないが)を供述しており
221デフォルトの名無しさん
2018/02/11(日) 04:59:49.56ID:9irhhPDg
C++には強いエイリアスが無いからなあ
222デフォルトの名無しさん
2018/02/23(金) 16:21:25.57ID:UAqVoMsi
C++じvtable参照することになるから遅いだろ
223デフォルトの名無しさん
2018/02/25(日) 04:05:35.43ID:Zrtx8k52
>>216
セットする値の名称にする
例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる
プロパティとして使うのだから、setXXX()みたいに書かなくてもいい

setter単独で存在することはありえないからgetterも設けること
setterって余り必要ない
コンストラクタからの初期化で十分の場合が多い
224デフォルトの名無しさん
2018/02/25(日) 14:23:16.60ID:8l5JrV0a
>>219
だぶるでぃすぱっち
225デフォルトの名無しさん
2018/03/03(土) 13:43:59.95ID:Vl4EAVf3
2の累乗でないときのmod演算の高速化の方法、何かありませんか?
そこらへんはコンパイラで最適化されるんですかね
226デフォルトの名無しさん
2018/03/03(土) 14:09:48.07ID:xC+xvi0u
>>225
法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。
法が固定で何度も剰余を取るならモンゴメリリダクションがある。
どちらも乗算はそれなりに必要。
227デフォルトの名無しさん
2018/03/03(土) 14:14:16.62ID:Vl4EAVf3
>>226
ありがとう
ちょっと調べてくる
228デフォルトの名無しさん
2018/03/06(火) 00:16:25.34ID:EXuXevGu
ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。
229デフォルトの名無しさん
2018/03/06(火) 00:47:05.22ID:yCnPPW+5
mutex g_Mtx;

int g_Val = 0;

int Func( int A, int B )
{
  int Val = A * B;

  lock_guard<mutex> Lock( g_Mtx );

  return g_Val = Val;
}

void ThreadFunc0()
{

}
230デフォルトの名無しさん
2018/03/06(火) 00:55:45.44ID:yCnPPW+5
mutex g_Mtx;
すみません、途中で送信してしまいました。

int g_Val = 0;

int Func( int A, int B )
{
  int Val = A * B;

  lock_guard<mutex> Lock( g_Mtx );

  return g_Val = Val;
}

void ThreadFunc0()
{
  int Val = Func( 2, 3 );

  // Valを参照する処理
}

void ThreadFunc1()
{
  lock_guard<mutex> Lock( g_Mtx );

  // g_Valを参照する処理
}

上記のようなスレッド関数が非同期に実行されるとき、
Func()はスレッドセーフ(g_Val書き換え中に参照されない)でしょうか?

(1)lock_guard<mutex>によるミューテックスロック
(2)g_Valの書き換え
(3)戻り値を読み出し元スレッドにコピー(あるいはムーブ)
(4)lock_guard<mutex>がスコープから外れアンロック

というシーケンスを期待しています。
231230
2018/03/06(火) 00:58:37.27ID:yCnPPW+5
誤:読み出し元スレッド
正:呼び出し元スレッド
232230
2018/03/07(水) 00:28:47.80ID:+JS1hm36
すみません、他スレで聞きます。
233デフォルトの名無しさん
2018/03/07(水) 19:00:17.77ID:BpTZedcA
事情があって下記の型の関数を、
void Func1(char a);

下記の型の関数ポインタに代入して呼びたいと思っています。
int*(*p)(int*);
p = (int*(*)(int*))Func1;
p((int*)123);

動作としてはFunc1(123)と呼んだときと同じものを期待しており、
試したところそれっぽく動作しているのですが、
致命的な問題等あります?
"暴走の危険あり"など。
234デフォルトの名無しさん
2018/03/07(水) 19:20:05.55ID:/Jrz1mw6
スタックに積むサイズは通常int
long longとかで無ければ実害は無い
235デフォルトの名無しさん
2018/03/07(水) 19:29:05.35ID:iizJnzkK
>>233
C11の6.3.2.3の8によると、the behavior is undefinedだ。
たとえばcharが4バイトに自動昇格して、ポインタが8バイトだったりすると、
どうなるかわかったもんじゃない。鼻からなんちゃらだ。
C++は知らん。
236片山博文MZ ◆T6xkBnTXz7B0
2018/03/07(水) 19:29:59.98ID:Ssa+vNsg
sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな?
237デフォルトの名無しさん
2018/03/07(水) 19:34:38.56ID:iizJnzkK
そうそう、undefinedのあとはほんとに何が起きるかわからんよ。
コンパイラが何をしでかしても文句言えない。
たまたま今の環境で動いても、明日コンパイラを更新したら挙動が変わりうる。
238デフォルトの名無しさん
2018/03/07(水) 20:01:22.38ID:MtWgjxh8
「事情があって」の事情を解消する方が安全だと思うけど…。
void Func1(char a); を呼び出すラッパ関数を使うのはどうだろ?

int* Func1_wrapper(int *p)
{
 uintptr_t arg = (uintptr_t)p;
 Func1((char)arg); // 縮小変換が危険
 return NULL;
}

int* (*p)(int*);
p = Func1_wrapper;
p((int*)123); // 明らかに不正アラインメントだが
239はちみつ餃子 ◆8X2XSCHEME
2018/03/07(水) 20:34:34.64ID:TWOfgg7C
>>233
関数ポインタ同士は互換で、お互いにキャストすることは許される。
が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。
240デフォルトの名無しさん
2018/03/10(土) 22:50:07.25ID:tBgkA+tH
C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか
windows.hで一つ一つボタンの位置を設定してハンドルやらコールバックと格闘するもんなんでしょうか
それとも何か気の利いた便利なライブラリとかがあるんでしょうか

というかこの手のライブラリやフレームワーク的なものを探したりしたい場合はどういう場所から情報を集めるものなんでしょうか
それっぽいキーワードでgoogleで検索して探そうとしても上手く情報を見つけられないのですが、根気よくページを確認していくしかないのでしょうか
241 ◆QZaw55cn4c
2018/03/10(土) 23:05:33.56ID:+Ww908Qw
>>240
基本的には win32api を使うことになり、私は C++ からwin32api( ::DefWindowProc() とか)を個別呼び出している
気の利いたライブラリのことはよく知らない
242デフォルトの名無しさん
2018/03/10(土) 23:18:25.22ID:tBgkA+tH
やっぱりそういう感じになるんですね
頑張って勉強します
243デフォルトの名無しさん
2018/03/10(土) 23:42:00.51ID:4x8PIJN4
>>240
Windowsに特化するなら Win32APIのほかにMFCやWTLや.NET framework(C++/CLIで良ければ)などのライブラリを使う
サードパーティならC++ BuilderのVCLとかあとはクロスプラットホームのQtとかGtk+とかwxWidgetsとか他にもあると思うけど
最近はデスクトップアプリが落ち目なのでこれという定番はなくて目的に応じて分散しているのでは?
自力で情報が集められない程度ならC++でGUIなんて止めとけという気がしないでもない
244デフォルトの名無しさん
2018/03/11(日) 00:23:13.22ID:5+tjHPTy
ありがとうございます。それぞれ見てみます
245デフォルトの名無しさん
2018/03/11(日) 00:43:28.70ID:QedwXA9H
vs2010以降ならWIN32SDKベースでも雛型吐いてくれるだろうに
246片山博文MZ ◆T6xkBnTXz7B0
2018/03/11(日) 03:53:08.43ID:4ez4tjCr
>>240
ボタンの配置などは、リソースエディタでダイアログテンプレートを作ってDialogBox関数を呼べば、細かい調整ができる。
イベント駆動やメッセージ送信などについては、<windowsx.h>で提供されるメッセージクラッカーやマクロを使えば便利になる。
私が複雑なことをする場合は、MZC4という自作のクラスライブラリを使ってる。
247片山博文MZ ◆T6xkBnTXz7B0
2018/03/11(日) 03:59:42.40ID:4ez4tjCr
HANDLE_MSGマクロによるメッセージクラッカーという仕組みを使えば、ウィンドウプロシージャやダイアログプロシージャの記述が楽になる。
私はさらに、HANDLE_MSGの呼び出し先の関数の入力を楽にする自作のMsgCrackというツールを使っている。
248はちみつ餃子 ◆8X2XSCHEME
2018/03/11(日) 04:12:58.32ID:f5R2yX0u
WinRT が綺麗にまとまってると思う。
https://github.com/Microsoft/cppwinrt
Windows API を現代的な C++ に合わせて整理したものなので、
C++ 的にある程度まともな感じがする。

昔は仕方がなかったんだろうけど、
今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな〜。
249デフォルトの名無しさん
2018/03/11(日) 10:27:16.51ID:zWe+i43K
>>240
tcl/tkが一番手軽
250デフォルトの名無しさん
2018/03/11(日) 10:40:38.07ID:1J69PCFW
Win32プログラミングスレあったっけ
251デフォルトの名無しさん
2018/03/11(日) 10:51:25.22ID:QedwXA9H
Win32API質問箱 Build124
http://2chb.net/r/tech/1510395780/
252デフォルトの名無しさん
2018/03/11(日) 10:55:00.37ID:zWe+i43K
Win32APIスレは限定的だからGUI一般スレみたいなのの方を紹介しようと思ったが面倒なので
次の方どうぞ
253デフォルトの名無しさん
2018/03/11(日) 11:28:30.29ID:1J69PCFW
>>251
どうも
254デフォルトの名無しさん
2018/03/12(月) 02:15:34.18ID:Cvix3isA
何度も呼ばれる関数内ではローカル変数をstaticにした方が速いのですか?
255 ◆QZaw55cn4c
2018/03/12(月) 02:19:53.88ID:9vbtopii
>>254
誤差だ、
プログラミングスタイルを曲げてまですることではない
256デフォルトの名無しさん
2018/03/12(月) 02:23:59.34ID:Cvix3isA
>>255
さいですか ありがとうございました
257デフォルトの名無しさん
2018/03/12(月) 02:50:45.99ID:SGROmA8V
皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか?
速さを突き詰める為の工夫というより、誤って異常に処理時間のかかるようなプログラムを作らないようにする為にはどのような事を意識すると良いのでしょうか
258デフォルトの名無しさん
2018/03/12(月) 03:02:50.40ID:9wDOvV2B
staticの方が速い理由なんて一つも無いような
あまり呼ばれない場合はstaticの方が遅いよね、キャッシュ的に
マルチスレッドで邪魔だし、必要がある時以外は使うもんじゃないよ
259デフォルトの名無しさん
2018/03/12(月) 03:20:38.17ID:IdW8RVi3
>>257
メモリアクセスのコストだあ
260デフォルトの名無しさん
2018/03/12(月) 03:57:56.72ID:SGROmA8V
>>258
多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか
261デフォルトの名無しさん
2018/03/12(月) 04:48:35.89ID:Ajs1ZroQ
>>257
実行速度は推測ではなく測定することが鉄則だから
出来ることは気になったときに正しく測定出来るようにすることくらいだ
262デフォルトの名無しさん
2018/03/12(月) 08:13:41.87ID:0T8K0H1S
>>257
ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。
あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。
263はちみつ餃子 ◆8X2XSCHEME
2018/03/12(月) 12:47:06.75ID:wZFlYBXj
計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。
264デフォルトの名無しさん
2018/03/12(月) 16:25:47.91ID:JoWTM6VO
>>262
>>263
ほんこれ
265デフォルトの名無しさん
2018/03/12(月) 17:58:03.22ID:WDt4qsqW
待て待て、>>257は速度追求の話ではないだろう
無駄なループを通らせないとかそういう話でしょ?
266はちみつ餃子 ◆8X2XSCHEME
2018/03/13(火) 04:04:12.70ID:jwCzlKtk
エッジケースで極端なことになってしまうって話かな?
そういうのは単に気をつけるしかしゃーない。
発覚したときに直せるような体制にしておけ〜
267デフォルトの名無しさん
2018/03/13(火) 11:25:42.37ID:nL3Sy1ZA
>>257
とりあえず注意すべきは線形探索かな
何も考えずに使われると素敵なことになる
268デフォルトの名無しさん
2018/03/13(火) 11:43:48.99ID:WyB9s+s4
クラスAのメンバ関数へのアクセスをクラスBのみに許すにはどうすればいいですか?
(メンバ関数をfriend指定するのはBがAのプライベートメンバにもアクセスできてしまうのでNGです)
269デフォルトの名無しさん
2018/03/13(火) 13:15:04.74ID:WyB9s+s4
自己解決
passkeyイディオムを使えばいいんですね
言語仕様でサポートしてほしい気もしますが
270デフォルトの名無しさん
2018/03/15(木) 23:07:46.82ID:rOhYRyTV
できる人にとってはくだらないことなんだと思うのですが、
char* c;
char *c;
この2つは一緒なのですか?
271デフォルトの名無しさん
2018/03/15(木) 23:12:48.58ID:jcfpYhJu
char * c;
とか
char
*
c
;

も含めて一緒
272 ◆QZaw55cn4c
2018/03/15(木) 23:13:16.42ID:xYxZI4zx
>>270
一緒ですが個人的に後者を推奨します
273デフォルトの名無しさん
2018/03/15(木) 23:21:50.62ID:rOhYRyTV
>>270
>>271
ありがとうございます
どちらが正しいのか、機能が違うのか、よくわかっていなかったのがスッキリしました
274デフォルトの名無しさん
2018/03/15(木) 23:24:52.27ID:dUMa9unA
>>270
前者だと
char* a, b;
って書いたとaとbの型が変わっちゃうから常に後者方式で
char *a, *b;
みたく書くことをオススメする
275はちみつ餃子 ◆8X2XSCHEME
2018/03/15(木) 23:48:02.28ID:VBbQqJBt
ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。

char* a;
char* b;

まあ人によって色々やね。
276デフォルトの名無しさん
2018/03/15(木) 23:48:51.41ID:ipLBerzI
そんな迷うならtypedefしてしまえ
277はちみつ餃子 ◆8X2XSCHEME
2018/03/15(木) 23:52:42.60ID:VBbQqJBt
C++ なら std::add_pointer を使うのも手やぞ。
普段から使うには綴りが長い気もするな。
278デフォルトの名無しさん
2018/03/16(金) 00:04:03.30ID:/SwLgzhl
ワイも後ろに寄せるスタイルの方が好きやな
別に自由ではあるけど、前に寄ってるとなんか違和感あるわ
279デフォルトの名無しさん
2018/03/16(金) 00:12:21.27ID:eqCACABM
この話始まるとスレが荒れるわけだが。

俺は
char *a;
int & ref;
だ。
280はちみつ餃子 ◆8X2XSCHEME
2018/03/16(金) 00:27:41.31ID:5DWUPgeG
C++ だとスッポスッポ先生が (というより D&E の文中にあるコードが) アスタリスクを型名にくっつけるスタイルで書いてあるから、
設計者的にはこれが推しなんやろなて思うたんや。
281デフォルトの名無しさん
2018/03/16(金) 00:49:37.90ID:7Nt6p3N1
そもそもCならまだわかるがC++になってもこの謎仕様が改善されてないのがおかしいわな
282デフォルトの名無しさん
2018/03/16(金) 01:19:43.79ID:pAByTZwR
char *a;派だがキャストは(char*)だな
283デフォルトの名無しさん
2018/03/16(金) 06:18:52.71ID:hczQTGC7
両方に空白入れたり
両方詰めたらどうなるん
284デフォルトの名無しさん
2018/03/16(金) 10:14:04.60ID:x1iYgKqh
>>275
これ
285デフォルトの名無しさん
2018/03/16(金) 16:35:23.76ID:3ma6aQHv
>>274
それな
前者は誰が流行らしたんだハゲか
286デフォルトの名無しさん
2018/03/16(金) 18:15:24.73ID:tA4eZSmU
``int* p;''と``int *p;''はどちらが正しいですか
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace

まあハゲの影響はあると思う
287デフォルトの名無しさん
2018/03/16(金) 18:16:24.05ID:YfjbsaKN
偉い人が前で統一させてたから倣ってる
288デフォルトの名無しさん
2018/03/16(金) 19:01:00.72ID:EjV6B4+T
>>285
マイクロソフトじゃないか?
289デフォルトの名無しさん
2018/03/16(金) 22:46:14.86ID:KxYkqF9B
[]演算子は変数の後ろしか置けないので迷いがない
290デフォルトの名無しさん
2018/03/16(金) 22:50:13.34ID:r/T+njCz
変数との間に空白を入れるか入れないか選択の余地がある
291デフォルトの名無しさん
2018/03/16(金) 23:05:45.65ID:/SwLgzhl
正直、選択の余地が無い方が嬉しい
292デフォルトの名無しさん
2018/03/16(金) 23:17:53.08ID:7Nt6p3N1
ある意味欠陥の1つ
293デフォルトの名無しさん
2018/03/16(金) 23:24:49.74ID:YbTBBkUF
>>289
リテラルの後ろにも置ける
294デフォルトの名無しさん
2018/03/16(金) 23:28:34.45ID:/SwLgzhl
あと数字の後ろにも置けるよな確か
x[2]は2[x]でも普通に動作するらしい、使ったことはないが
295デフォルトの名無しさん
2018/03/16(金) 23:32:56.43ID:W1kNbC1+
参照型&ってあまり使われないのか
296デフォルトの名無しさん
2018/03/17(土) 02:01:02.93ID:UGDcJiJh
>>293
宣言の中の型としての*の位置を問題にしてるのだから、式の中での*が使える位置については別の話でしょ。
297デフォルトの名無しさん
2018/03/17(土) 17:02:13.24ID:B2oEmArJ
インデントってタブ文字使うよりもスペース使った方がいいんですか?
298片山博文MZ ◆T6xkBnTXz7B0
2018/03/17(土) 17:07:21.02ID:6umCop+M
>>297
見た目とコンパイル速度のどちらを優先するかによる。
299デフォルトの名無しさん
2018/03/17(土) 17:32:05.08ID:Ak7laUjo
タブコードはエディタの設定に見た目が左右されるので使わない方がいい
300デフォルトの名無しさん
2018/03/17(土) 17:39:18.45ID:B2oEmArJ
うーん、やっぱりタブは使うべきではないんですね
301デフォルトの名無しさん
2018/03/17(土) 17:41:47.51ID:Ak7laUjo
昔は1バイト当たり単価が高かったからね
302デフォルトの名無しさん
2018/03/17(土) 20:01:33.65ID:hl7Y0kGo
エディタの機能向上による要素が大きいな。
インデントやその削除にキーを何度も叩かなきゃならない状態だったらTABがまだ主流だったろう。
303デフォルトの名無しさん
2018/03/17(土) 22:45:16.37ID:NcDC59dQ
>>294
初めて知ったw
304はちみつ餃子 ◆8X2XSCHEME
2018/03/18(日) 04:35:20.62ID:7ElIFee1
>>294
他にも変な仕組みは色々とあるけど、これはひとつとして使いどころが思いつかんよな。
305デフォルトの名無しさん
2018/03/18(日) 06:08:40.04ID:QnqZv5w6
int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、
a[5] と *(a + 5) が同等で + 演算子の交換可能性から *(5 + a) も可、
それなら 5[a] も同じじゃなきゃ片手落ちだよね、って発想というか、
過去のコンパイラの実装とも関係がありそうな気がする。

もちろん、古いCコンパイラとのソース互換性が問題になるほど
みんなが使ってた書き方とは思わないけど。
306 ◆QZaw55cn4c
2018/03/18(日) 11:53:22.56ID:ojW1vPJY
>>304
IOCCC …
307デフォルトの名無しさん
2018/03/20(火) 16:56:43.36ID:PiAC+2Zr
i++ と ++iって最適化すればほとんど変わらないか、あるいは++iの方がちょっと速いくらいですよね?
なんでi++の方がデファクトスタンダードみたいになってるんでしょう?
ほぼ無視できる程度のメリットしかないとしても、++iと書くデメリットがないと思うのですが
308はちみつ餃子 ◆8X2XSCHEME
2018/03/20(火) 18:20:40.65ID:N1yoGURK
>>307
インクリメントの対象が整数しかなかった C からの習慣がなんとなく引き継がれてるだけ。
後インクリメントは気持ち悪いと考える人は少なくはないし、
値を使わないなら前インクリメントにするのは C++ では良い習慣だよ。
309デフォルトの名無しさん
2018/03/20(火) 20:17:17.59ID:UFFOOrdu
++C言語
310デフォルトの名無しさん
2018/03/20(火) 20:18:05.88ID:O958tZqO
>>308
なるほど、最初はちゃんと意味があったんですね
納得できました
ありがとうございます
311デフォルトの名無しさん
2018/03/20(火) 22:04:48.60ID:+J5xJfYE
Cでインクリメントやデクリメントに後置が使われがちな理由は
a = *p++; みたいなポインタの使い方で手が慣れたせいもあるかと思う。

C++では性能的な理由で前置が好まれたのは指摘のとおり。

個人的には、どっちでも構わない場面ではCでは後置、C++では前置で書くかな。
特に単純なforで++iと打つと、途端にC++で書いてる気がしてくる。
312デフォルトの名無しさん
2018/03/20(火) 22:08:04.94ID:I2zEd3jr
本当に性能に差が出たの?測ったの?
313デフォルトの名無しさん
2018/03/20(火) 23:46:13.85ID:ZVuOcNlA
GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな
314デフォルトの名無しさん
2018/03/21(水) 00:00:26.00ID:2Gb2uvWn
単純なforなら同じコード吐くんじゃね?
315デフォルトの名無しさん
2018/03/21(水) 00:36:19.45ID:OwhHF7Zm
単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、
基本的には更新前のオブジェクトの状態の退避などの処理が必要な後置インクリメントよりコストの少ない前置インクリメントが好まれるのだと思うよ。
316はちみつ餃子 ◆8X2XSCHEME
2018/03/21(水) 01:30:43.51ID:MouF+uE4
結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても
ほとんどのコードは壊れないと思うんだけど、そういうルールを言語仕様に追加するのはもう出来ないかなぁ?
317デフォルトの名無しさん
2018/03/21(水) 01:40:04.19ID:CmybL5Dk
まぁ、出来るなら既にやってるでしょ
ぶっちゃけ、よっぽどシビアに速度を求める訳でないなら前置後置の差なんて気にする必要無いんじゃないかなぁ
318デフォルトの名無しさん
2018/03/21(水) 19:45:28.97ID:2N3cG+sW
そもそも速度を気にして
記述を変えるって
間違ってる気がする・・
319デフォルトの名無しさん
2018/03/21(水) 19:50:40.96ID:eUhtaSa6
時代は変わったか
昔はそんな事は当たり前だった
320デフォルトの名無しさん
2018/03/21(水) 19:51:54.96ID:eUhtaSa6
機能に対して糞重いソフトが多いのも
ソフトに対する価値観が変わったからか
321はちみつ餃子 ◆8X2XSCHEME
2018/03/21(水) 19:55:34.20ID:MouF+uE4
>>318
速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ?
322デフォルトの名無しさん
2018/03/21(水) 20:23:31.47ID:NRxI71LE
>>321
お前のコードは無駄ばかり
コンパイラも無駄命令を吐く
そもそもCPUの動作自体が無駄ばかり
そのプログラムを作るのも無駄だったり

お前の存在は?
323デフォルトの名無しさん
2018/03/21(水) 20:37:50.64ID:L8aCdycT
本スレでやれ
324デフォルトの名無しさん
2018/03/21(水) 20:54:50.63ID:b8e3mX8M
手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない?
後置の方が保守性が高いとか可読性が高いならともかく、そうじゃないんだから天秤にかける必要さえない
325デフォルトの名無しさん
2018/03/21(水) 20:59:28.52ID:CmybL5Dk
>>321
それで見やすくなるなら別にいんじゃね
326デフォルトの名無しさん
2018/03/21(水) 22:35:08.33ID:TV3lE0eZ
効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる
327デフォルトの名無しさん
2018/03/21(水) 22:37:05.71ID:D2465Z9C
どんなメリットがあるので?
328はちみつ餃子 ◆8X2XSCHEME
2018/03/21(水) 22:39:19.66ID:MouF+uE4
ホントは最適化でだいぶん上手いことやってくれるんやけどな。
というか最適化でやるべきことだと思う。
細かいことまでいちいち配慮しなきゃならないのは最適化技術の敗北。
仕様に [[likely]] なんて入ったのは不格好な話だ。
329デフォルトの名無しさん
2018/03/21(水) 23:03:06.41ID:TV3lE0eZ
イテレータの++や―に戻り値があること自体設計ミス
ポインタのと類似性そこまで要らんし
イテレータで *it++ とか書きたくて仕方ない人もそんなに居ないだろ
void型でよかった
330デフォルトの名無しさん
2018/03/21(水) 23:08:57.12ID:52xrh1Hk
アセンブラの inc やdec 命令実行時のフラグ反映は不要?
高級アセンブラの名残じゃね?
331はちみつ餃子 ◆8X2XSCHEME
2018/03/21(水) 23:14:08.41ID:MouF+uE4
>>329
逆じゃないかなぁ。
ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。
どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。
ちなみに operator++ の返却値を void にすることは出来ます。
332 ◆QZaw55cn4c
2018/03/22(木) 00:37:09.57ID:2FEQ/Wa3
>>330
inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが
333デフォルトの名無しさん
2018/03/22(木) 00:58:21.46ID:dLiR/Xt3
なぜポストインクリメントがよく使われるかは、
PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。
間接参照したあとにレジスタが増える。
オートデクリメントは逆にプレデクリメント。

あとinc,decでフラグが変化するのもPDP当時は当然の動作。
334デフォルトの名無しさん
2018/03/22(木) 06:11:13.57ID:I/iO4/8S
Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり
PCつかわないから、Ubuntuなんてプログラム環境は大体パッケージで手に入るし
スゲエ良いと思ってたんだけど、エロ動画配信サイトが今時は必ず専用の○○プレーヤーじゃないと
見れないんだな。たとえば、DMMプレーヤーとかそのサイトの専用の奴。なんでもDRMとかいう不正禁止のが
付いてて、普通のプレーヤーじゃ見れないのよ。スゲエ不便だからそれ専用にWindows10準備しちゃおうかな・・w

俺はプログラム言語でC++が一番すきです。 
335デフォルトの名無しさん
2018/03/22(木) 07:05:57.55ID:C5Ula1AM
またイミフなレスしてるのか
336デフォルトの名無しさん
2018/03/22(木) 07:15:53.52ID:tiDItZ1f
C--があってもいいかもしれないな。
337デフォルトの名無しさん
2018/03/22(木) 09:44:57.12ID:Q2/ylW7b
C♭思い出した
338はちみつ餃子 ◆8X2XSCHEME
2018/03/22(木) 10:24:04.20ID:HExEyyqO
>>336
ググればすぐにわかることだけど、有るよ。
339デフォルトの名無しさん
2018/03/22(木) 17:42:41.78ID:Z5xjYgF/
unordered_setやunordered_mapは
reserve(size_type)はあるのにshrink_to_fit()がないのはなぜですか?
340デフォルトの名無しさん
2018/03/22(木) 18:14:23.23ID:tiDItZ1f
ハッシュだからじゃないの。
341デフォルトの名無しさん
2018/03/26(月) 20:46:12.70ID:qgnj+CJa
void DumpCode(const char* str) {
for (int i = 0; str[i] != '\0'; ++i) {
printf("%02X ", (unsigned char)str[i]);
}
cout << endl;
}

↑の文字コードを16進数で表示する関数ですが、なぜ

printf("%02X ", str[i]);

ではなく、

printf("%02X ", (unsigned char)str[i]);

とキャストしているのでしょうか?
342デフォルトの名無しさん
2018/03/26(月) 20:52:31.38ID:Sl5sXtlN
0x80以上の時符号拡張されてマイナスになるから
343デフォルトの名無しさん
2018/03/26(月) 20:55:55.86ID:qgnj+CJa
char型の値は 0 から 127 までであると本に書いてあるのですが。。。
344デフォルトの名無しさん
2018/03/26(月) 20:58:30.32ID:Sl5sXtlN
>>343
その本は窓から投げ捨てろ。
ー128〜127が正解だ
345デフォルトの名無しさん
2018/03/26(月) 21:01:09.95ID:qgnj+CJa
>>344

本にはそうは書かれていませんでした。申し訳ありません。間違っていました。

アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。
346デフォルトの名無しさん
2018/03/26(月) 21:02:33.45ID:qgnj+CJa
>>344

何か不具合が起こる例を教えていただけると助かります。
347片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 21:06:19.73ID:42MV7MT1
>>346
char ch = 255;
printf("%d\n", ch);

C/C++では、オーバーフローは警告なく普通に起こる。
348片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 21:10:11.27ID:42MV7MT1
signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、
printf("%c\n", (char)255);
349片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 21:11:26.75ID:42MV7MT1
printf("%d\n", (char)255);
%dね。
350デフォルトの名無しさん
2018/03/26(月) 21:42:10.96ID:3IjTFjn0
>>344
>>348
そんな事は決まってない
351片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 21:52:30.42ID:42MV7MT1
charのビット数、CHAR_BITが8ではない環境はほとんどない。
352片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 22:00:14.93ID:42MV7MT1
4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。
353デフォルトの名無しさん
2018/03/26(月) 22:58:41.82ID:3IjTFjn0
ほとんど無いから何?
「決まってない」の反論になってないよ

現行品でcharが16bitの環境があるんだけどね
354デフォルトの名無しさん
2018/03/26(月) 23:00:24.31ID:3IjTFjn0
charが符号付きとも決まってない
ちょうど今符号無しの環境を使ってるよ
355片山博文MZ ◆T6xkBnTXz7B0
2018/03/26(月) 23:02:53.12ID:8aZ5PUAj
インテル入ってない
356デフォルトの名無しさん
2018/03/26(月) 23:03:06.95
俺のcharは100bitあるぜ!!
357デフォルトの名無しさん
2018/03/26(月) 23:04:42.66ID:3IjTFjn0
とりあえず>>1を読んどけ
358デフォルトの名無しさん
2018/03/26(月) 23:55:34.36ID:2w8Ha0HC
char と signed char を混同するクソコテ
359デフォルトの名無しさん
2018/03/27(火) 01:28:23.66ID:bCiMyjcv
今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。

初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。
360デフォルトの名無しさん
2018/03/27(火) 01:33:34.51ID:GW1/xmrB
unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き
以外に遭遇した事無いけどな
361デフォルトの名無しさん
2018/03/27(火) 02:55:06.24ID:oddUVIdN
>>359
>>341の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。
そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では?
362デフォルトの名無しさん
2018/03/27(火) 07:09:18.07ID:vavxlF2f
???
環境を明示しろって言うのは>>1にも書いてあるんだが...
363デフォルトの名無しさん
2018/03/27(火) 07:42:58.98ID:7BdcIkqa
>>361
初心者だろうと質問に付随する前提知識は必要
変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある

まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう
364デフォルトの名無しさん
2018/03/27(火) 07:52:49.58ID:ofLFYE4b
回答者もわかってないからな
>>352とか
365デフォルトの名無しさん
2018/03/27(火) 08:13:51.03ID:ofLFYE4b
4ビットCPUだとcharは4ビットと思ってんのか?
366デフォルトの名無しさん
2018/03/27(火) 08:39:25.07ID:tnecWY6M
>>341 >>346
不都合と言う程の不都合か分からないけど、
単なる char が signed char のコンパイラで、例えば str[i] == -1 の時、
printf("%02X ", (unsigned char)str[i]); なら表示は "FF "
printf("%02X ", str[i]); だと表示は "FFFFFFFF " (intが32bitの環境)
てな具合に表示結果が指定桁数とずれて見苦しい、という現象が起きる。

ただし void DumpCode(const char* str) でASCII文字列しか扱わないなら、
意図せずASCII以外(漢字など)を含んだ文字列を引数に与えたときに
「見苦しい表示結果」のおかげで関数の使い方の間違いに気付きやすい。
よって (unsigined char) のキャストをしない方が好ましい、て考え方もある。


>>360
ARM で GCC だと、単なる char は unsigined が普通みたい。
元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。
367デフォルトの名無しさん
2018/03/27(火) 08:41:45.88ID:7BdcIkqa
4bitのcharか、アルファベットが表現できないな

まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね
なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど
368デフォルトの名無しさん
2018/03/27(火) 09:55:59.95ID:dDmfqIPV
int *p = new int[100];
delete[] p;

delete[] p で int 100個分の領域を解放するのだと思いますが、
どうやって、 p が int 100個分の領域を指していると分かるのでしょうか?
p は単なる int 型へのポインタです。
369デフォルトの名無しさん
2018/03/27(火) 10:02:58.95ID:GW1/xmrB
>>366
つ -fsigned-char/-funsigned-char
370デフォルトの名無しさん
2018/03/27(火) 10:03:09.61ID:dDmfqIPV
スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある
そうですが、なぜ、エラー終了にしないのでしょうか?
371デフォルトの名無しさん
2018/03/27(火) 10:56:59.81ID:r9AxIBc/
>>368
良くある実装としては
newが返すアドレスの前にヘッダ情報がある
372デフォルトの名無しさん
2018/03/27(火) 10:59:24.01ID:r9AxIBc/
>>370
(すぐに)わからないから
373デフォルトの名無しさん
2018/03/27(火) 13:22:10.84ID:KACb5w79
素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう
バッファオーバーフローの場合は割り当てたメモリとバッファ境界がミスマッチなら直ぐにエラー検出できないとしても仕方がないけどこれは質問とは別の話
374デフォルトの名無しさん
2018/03/27(火) 14:41:48.71ID:1PffFgMm
配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか?
例えばint型配列のfooとint型変数のbarがあったとして、
int n = foo[10000]; と
int n = bar;
の速度は同じですか?
375デフォルトの名無しさん
2018/03/27(火) 14:55:45.68ID:Z/OsE5Ku
添字の値にかかわらず一定
foo[10000] と foo[1] が同じって話だぞ
376デフォルトの名無しさん
2018/03/27(火) 14:59:13.83ID:1PffFgMm
>>375
ありがとうございます
だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね?
377デフォルトの名無しさん
2018/03/27(火) 15:02:49.07ID:jMKP3TFv
レッツ実測&吐き出したコードを確認
最適化具合でも全然ちがう
378デフォルトの名無しさん
2018/03/27(火) 15:06:05.02ID:dDmfqIPV
>>377

吐き出したコードってどうやって確認するんですか?
379デフォルトの名無しさん
2018/03/27(火) 15:06:56.79ID:dDmfqIPV
>>371-372

ありがとうございました。
そのあたりのことを詳しく書いてある本はありますか?
380デフォルトの名無しさん
2018/03/27(火) 15:07:03.67ID:1PffFgMm
>>377
確かにそうですね
ありがとうございます、やってみます
381デフォルトの名無しさん
2018/03/27(火) 15:08:28.42ID:Di3KX/fh
ポインタから値を読み込む場合は?
382デフォルトの名無しさん
2018/03/27(火) 15:16:11.82ID:jMKP3TFv
>>378
使っている環境による
機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する

もっと前のアルゴリズムの検討は済んでて、
もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね?
383はちみつ餃子 ◆8X2XSCHEME
2018/03/27(火) 17:26:05.07ID:6NyejsSC
>>343-344

char 型が符号付きであってもなくても格納可能な範囲という意味では 0 〜 127 であると思って使ってれば間違いないのは確か。
あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので
char が符号付きだとしても -127 〜 127 しか表現できないかもしれない。

>>345

言語仕様では文字がアスキーコードとは保証してないんだ。
ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、
EBCDIC とかでも言語仕様には違反しない。
384デフォルトの名無しさん
2018/03/27(火) 18:20:11.37ID:ofLFYE4b
>>373
並のOS環境って何だよwww

一般的なMCUのほとんどは
アドレス変換テーブルの仕組みがなく
スタックオーバーフローを検出するハード的仕組みも無い
385デフォルトの名無しさん
2018/03/27(火) 18:21:21.80ID:ofLFYE4b
>>383
無知は出てくるな
386デフォルトの名無しさん
2018/03/27(火) 20:25:43.43ID:GW1/xmrB
BASIC Stamp でもやってればいいのに
387デフォルトの名無しさん
2018/03/27(火) 22:12:36.71ID:gjFRbLOq
二つスレッドがある
片方はstd::queueにつんで、もう片方はそれを取る

これで詰まれた瞬間に取るにはどうするのがいいのかな?
簡単に作るなら、無限ループでスリープ挟みながら取り続けることだけど、無駄も多いから積んだのをトリガーに取りたい


環境はg++とVC++です
388デフォルトの名無しさん
2018/03/27(火) 23:17:24.98ID:7OwU1Hvz
>>379
stackoverflow で、たまたまアクセスしたメモリに、
どんな値が入っているかは、誰にも分からない。
単に前に入っていた値が、入っているだけだから

その値が、たまたまCPU 命令にあれば、CPU を実行するから、
エラーになるのは次の命令以降になる

一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる
389デフォルトの名無しさん
2018/03/27(火) 23:21:17.42ID:dDmfqIPV
スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか?
390デフォルトの名無しさん
2018/03/27(火) 23:30:03.49ID:4E83+S2j
>>387
昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。
注意としてspurious wakeupというのも書いてある。
もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。
391デフォルトの名無しさん
2018/03/27(火) 23:38:12.48ID:zFrY2ZyB
>>389
してる環境もあれはしてない環境もある
392はちみつ餃子 ◆8X2XSCHEME
2018/03/27(火) 23:46:19.51ID:6NyejsSC
>>389
ページ単位ではしていることがある。
OS がメモリの割付を管理していて、
足りなければ追加で割り当てたりもする。
割り付けてないメモリ空間に変に触ったら検出できる。
393デフォルトの名無しさん
2018/03/28(水) 06:54:26.81ID:fYzIlbdt
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第

ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある
394デフォルトの名無しさん
2018/03/28(水) 06:56:20.68ID:fYzIlbdt
今のWindowsとかLinuxとかならもちろん瞬時にわかる
395デフォルトの名無しさん
2018/03/28(水) 10:17:21.31ID:qnpV2Jxp
>>387
セマフォの類を使え
396デフォルトの名無しさん
2018/03/30(金) 10:25:28.98ID:8epIcCej
最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから
C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト
してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。
どこまでなら使えるんだろ? なにか目安はないか?
397デフォルトの名無しさん
2018/03/30(金) 11:36:04.01ID:Wx9gH+Ym
組み込みなら自分で書いたものだけ使うというか
STLは一切使わないのが普通じゃないか?
398デフォルトの名無しさん
2018/03/30(金) 12:31:15.37ID:HVaF4kSp
new/delete
例外
ラムダ式

は使わない
もちろん規模によるけど
399デフォルトの名無しさん
2018/03/30(金) 12:36:38.56ID:MnRWcQoL
組み込みってピンキリだからなんとも言えんわ
業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし
400デフォルトの名無しさん
2018/03/30(金) 12:43:29.07ID:HVaF4kSp
>>398はMCU/DSPくらいの話
401デフォルトの名無しさん
2018/03/30(金) 12:47:07.67ID:TqB3XhjJ
どれぐらいのDSP?
ADSP-21573ぐらい
402デフォルトの名無しさん
2018/03/30(金) 13:46:55.20ID:8epIcCej
STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて
見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力
的に見えてきた。 
403デフォルトの名無しさん
2018/03/30(金) 13:52:10.17ID:Wx9gH+Ym
内部で new / delete 使用している stl は使わないリストに入れず
new / delete は使わないリストに入れんのかよ…
404デフォルトの名無しさん
2018/03/30(金) 14:08:56.04ID:2gx9kNrJ
STLコンテナとSTLアルゴリズム
どっちの話をしているんだ
405デフォルトの名無しさん
2018/03/30(金) 14:25:29.65ID:FxYI+k+J
コンテナ使わない有用なアルゴリズムってあるか
あるなら使いたいからご教授ください

min とかあるか
406デフォルトの名無しさん
2018/03/30(金) 16:24:55.88ID:HVaF4kSp
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前

そもそもヒープエリア自体無かったりするし
あってもアロケートのみで解放機能が無かったりする

小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない
407デフォルトの名無しさん
2018/03/31(土) 14:52:31.93ID:2aV4tUPq
組み込みって未だにそんなメモリかつかつなの?
408デフォルトの名無しさん
2018/03/31(土) 17:31:27.59ID:aygih7Tk
>>407
そりゃ規模による
409デフォルトの名無しさん
2018/03/31(土) 17:45:54.96ID:OaeapR1O
>>407
>>399
410デフォルトの名無しさん
2018/04/02(月) 16:24:48.19ID:MJzKsai7
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。

注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?
411はちみつ餃子 ◆8X2XSCHEME
2018/04/02(月) 16:30:09.86ID:/drqX+oD
>>410
人間の注意力なんてクソザコだからだよ。
412デフォルトの名無しさん
2018/04/02(月) 16:40:04.72ID:3MXga4hP
注意していれば防げるミスは、いつか必ず発生する
413デフォルトの名無しさん
2018/04/02(月) 16:42:16.37ID:r6uHUG7/
2重includeに気付いてからでも遅くない
414デフォルトの名無しさん
2018/04/02(月) 20:45:42.01ID:JDmrHTz8
>>410
複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか
415デフォルトの名無しさん
2018/04/02(月) 20:57:46.72ID:MJzKsai7
header_1
header_2

header_n

で共通に必要なヘッダ header_a がある。

header_1
header_2

header_n

のそれぞれの中で header_a をインクルードしている。

header_i と header_j (i ≠ j) が必要なファイル file1 がある。

というような状況でしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
416デフォルトの名無しさん
2018/04/02(月) 21:43:19.92ID:JDmrHTz8
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします

あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?
417デフォルトの名無しさん
2018/04/02(月) 22:36:25.27ID:7E1ezZvV
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」

どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける
418片山博文MZ ◆T6xkBnTXz7B0
2018/04/02(月) 22:37:53.93ID:APYGmZJZ
スタジオじゃなくてスタンダード・アイオーや
419デフォルトの名無しさん
2018/04/02(月) 22:38:24.97ID:7E1ezZvV
ごめんごめん
420デフォルトの名無しさん
2018/04/02(月) 22:51:41.33ID:Y3fpn4XN
なんで前半はフルで後半は省略したの?
421片山博文MZ ◆T6xkBnTXz7B0
2018/04/02(月) 22:58:42.67ID:APYGmZJZ
アイオー、アイオー、声を上げて
422片山博文MZ ◆T6xkBnTXz7B0
2018/04/02(月) 23:06:11.93ID:APYGmZJZ
Input/Output、日本語では入出力
423デフォルトの名無しさん
2018/04/02(月) 23:10:11.92ID:yv4S6fVx
関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか?
424片山博文MZ ◆T6xkBnTXz7B0
2018/04/02(月) 23:22:51.53ID:APYGmZJZ
fprintfは、7文字。
425デフォルトの名無しさん
2018/04/02(月) 23:23:14.96ID:yv4S6fVx
あー
426片山博文MZ ◆T6xkBnTXz7B0
2018/04/02(月) 23:26:45.74ID:APYGmZJZ
vfprintfは八文字。文字数削るメリットがあった時代だったからな。
427デフォルトの名無しさん
2018/04/02(月) 23:48:48.36ID:OHYuqcPP
>>423
つ FORTRAN77
428デフォルトの名無しさん
2018/04/02(月) 23:55:39.95ID:d0d9WT+s
>>423
FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな
429デフォルトの名無しさん
2018/04/02(月) 23:57:30.68ID:yv4S6fVx
ありがとう FORTRAN からの流れですか
430デフォルトの名無しさん
2018/04/03(火) 00:51:55.59ID:cU9BUIMs
>>416-417
プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな
431デフォルトの名無しさん
2018/04/03(火) 01:02:56.47ID:FKLo0jPW
以下のboost::factoryを使う練習用コードにおいて
https://wandbox.org/permlink/K1TIhC61VQztTbOd

map<string, boost::function<base* (int)>> factories;
とするとコンパイルエラーになり、ググって見つけた方法で
map<string, boost::function<base* (int const&)>> factories;
とすると何故かコンパイルが通り、問題なく動作します。
コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか?
432デフォルトの名無しさん
2018/04/03(火) 01:48:18.62ID:JvEghgri
>>417
実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ
433デフォルトの名無しさん
2018/04/03(火) 02:16:15.79ID:1GcrBwMo
stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。
実際 factory 以外の普通の関数なら問題ないし
434デフォルトの名無しさん
2018/04/03(火) 02:31:59.43ID:uUh7wFma
dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω
435デフォルトの名無しさん
2018/04/03(火) 08:56:24.86ID:1fV6RHaF
>>423-424
先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、
じゃなかったかな。大文字小文字は同一視で。
436デフォルトの名無しさん
2018/04/03(火) 11:32:26.11ID:R6gDm2yr
_st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった
437デフォルトの名無しさん
2018/04/03(火) 11:42:41.83ID:MWvT17WL
ほんとそれ
438デフォルトの名無しさん
2018/04/03(火) 11:43:28.33ID:Z1fbtkqU
>>433
公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。
そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・

結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。
439デフォルトの名無しさん
2018/04/03(火) 12:17:26.04ID:1GcrBwMo
そこ bind しなくてもいいんじゃないだろうか
440デフォルトの名無しさん
2018/04/03(火) 13:48:08.68ID:Z1fbtkqU
>>439
引数のある関数の場合はboost::bindを使うのではないでしょうか?
いちおう公式にもその例が書いてあります。

ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、
速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。
https://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory
441デフォルトの名無しさん
2018/04/03(火) 15:04:56.72ID:rDNMxPWT
>>440
引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、
(add(a,b) の a だけ1にbindしてadd1を作るとか)
何もbindせず引数の順序も同じなら

factories["derived"] = boost::factory<derived*>();

で良い
442デフォルトの名無しさん
2018/04/04(水) 23:06:46.13ID:t1HAuKeq
>>441
確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか)
仰る通りの書き方でコンパイルも実行も通りました。
ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。
「bindが必要」と明言してる人すらいて、結局よくわからないです・・・

その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを
boost::function<〜> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ
boost::forward_adapter を使う方法を見つけました。
https://wandbox.org/permlink/D3Q75cgRNR43Nulc

ヒントとなったのは以下のサイトでした。
https://lists.boost.org/Archives/boost/2017/02/232695.php

正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。
ご助言どうもありがとうございました。
443はちみつ餃子 ◆8X2XSCHEME
2018/04/05(木) 03:23:00.79ID:3RJ8YXR4
>>442
公式にドキュメントがあるだろう。
なんでググりまくるんだ?
444デフォルトの名無しさん
2018/04/05(木) 07:41:24.21ID:ev3xPrwL
>>443
公式ドキュメントはこれです。
https://www.boost.org/doc/libs/1_66_0/libs/functional/factory/doc/html/index.html

ここに以下のような「stringキーzとコンストラクタのmapにコンストラクタを登録」するという方法が書いてあればよかったのですが・・・
map<string, boost::function<〜>> factories;
factories["derived"] = 〜

でもboostの公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。
445デフォルトの名無しさん
2018/04/05(木) 14:37:25.23ID:LhrJ/WaU
質問です.

以下のようなことが書いてあるファイルを読み込んで,

文字列,数値,...,数値,数値...数値
...

str, a[0],...a[n-1],b[0],...b[m-1]
という配列に入れたいです.
nとmは可変の場合,どうすればよいか教えてください.
スッキリとした書き方が知りたいです.
std::string str;
double a[n],b[m];
です.
446デフォルトの名無しさん
2018/04/05(木) 14:51:56.82ID:8vk43UVU
std::string知ってるなら
std::vectorを使えば早かろう
std::vector<double> a, b;
a.resize(n);
b.resize(m);
a[0] = ...
447デフォルトの名無しさん
2018/04/05(木) 14:54:56.53ID:AQLHpii5
可変の n, m が読み込む前に確定するのか
ファイルの記述内容から n, m が確定するのか
448445
2018/04/05(木) 15:16:31.21ID:LhrJ/WaU
>>447
今回はstringを見て,nとmを決めます.
str="a"ならn=2,m=3のような感じです.
>>448
読み込み方が分かりません.すいません.
Google先生に聞いてこんな感じのプログラムを書いてます.
std::string line;
std::ifstream infile("hoge.dat");
std::getline(infile,line);
sscanf(line.data(),...//どう書くの?
449デフォルトの名無しさん
2018/04/06(金) 18:11:46.66ID:CDFchtjR
void Show(const IntArray& array){
...
}

というような関数内で、 array の const メンバ関数ではないメンバ変数を変更しないメンバ関数を
使っているとコンパイルエラーになりますが、それはなぜでしょうか?

コンパイラーはarrayのメンバ関数がメンバ変数を変更していないことはソースコードから
分かるのではないでしょうか?

そういうチェックをするコンパイラを作るのは難しいからということでしょうか?
450デフォルトの名無しさん
2018/04/06(金) 18:16:26.47ID:CDFchtjR
const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。

ということはどのみちメンバ変数を変更しているかどうかはチェック可能ということですよね?
451デフォルトの名無しさん
2018/04/06(金) 18:17:58.47ID:KjpzCJso
void Show(IntArray& const array)
452デフォルトの名無しさん
2018/04/06(金) 19:04:45.09ID:zGB1Hjc3
>>449
コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから
中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い
453デフォルトの名無しさん
2018/04/06(金) 19:43:28.40ID:EFVHWowI
>>449
難しいというか不可能だからですよ
呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない
454デフォルトの名無しさん
2018/04/07(土) 02:18:30.08
>>449
メンバ変数を変更しないなら素直にメンバ関数にconst付けれや
455デフォルトの名無しさん
2018/04/07(土) 12:11:18.49ID:BRhgC8GS
コンタミュ連鎖地獄ω
456デフォルトの名無しさん
2018/04/08(日) 06:44:19.17ID:fQMOYFpe
>>449-450 の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。
ソースファイルを分けてみればピンと来るかと。

片方をソースなしのオブジェクトやライブラリにしないとダメかな。
457デフォルトの名無しさん
2018/04/08(日) 07:56:39.59ID:peS6i82l
C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?
458デフォルトの名無しさん
2018/04/08(日) 08:06:10.70ID:hcdQKQ5m
>>457
COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん
459デフォルトの名無しさん
2018/04/08(日) 08:13:28.62ID:peS6i82l
そんなことは当たり前ですね。その方法が説明できますか?
460デフォルトの名無しさん
2018/04/08(日) 08:25:17.68ID:28momF5z
>>459
できるがスレチだからな
461デフォルトの名無しさん
2018/04/08(日) 08:29:30.70ID:fQMOYFpe
C#のことはC#のスレッドで尋ねればいいでしょ、てお話。
C/C++のスレッドに質問を持ち込むより確実で早いと思うよ。
462デフォルトの名無しさん
2018/04/08(日) 08:37:40.87ID:peS6i82l
あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると
思うが。
463デフォルトの名無しさん
2018/04/08(日) 08:39:38.92ID:peS6i82l
ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?
464デフォルトの名無しさん
2018/04/08(日) 08:44:37.90ID:TD+h4nB6
>>462
判断する訳ねーだろガイジか
465デフォルトの名無しさん
2018/04/08(日) 08:50:08.72ID:D3gITJpj
>>463
CreateProcess() win32API スレへgo
466デフォルトの名無しさん
2018/04/08(日) 08:56:58.76ID:peS6i82l
>>465 thanks yey!
467デフォルトの名無しさん
2018/04/08(日) 08:58:12.94ID:hcdQKQ5m
>>463
>>458
468デフォルトの名無しさん
2018/04/08(日) 09:14:13.86ID:peS6i82l
>>464
it is conditional on your ability, although its mean applying in the case of a usual Japanese.
469デフォルトの名無しさん
2018/04/08(日) 09:23:25.66ID:tUhRYmJS
真性の障害者手帳持ちだったか
470デフォルトの名無しさん
2018/04/08(日) 09:44:32.26ID:nHJNjK41
main関数の中でstaticを使う意味は何でしょうか?

ロベールの本のpp.318-319にそのような例が出てきて意味不明です。
471デフォルトの名無しさん
2018/04/08(日) 11:18:10.91ID:4aXSD6ZQ
キチガイに触るな
472デフォルトの名無しさん
2018/04/08(日) 11:47:04.28ID:fQMOYFpe
ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。

main() 関数の中でstatic変数を使う意味といえば、
単純型の初期化の処理時間を回避したいか、
セクション(変数のメモリ配置)の説明のためか、
「staticなインスタンスのコンストラクタはmain()より前に実行される」
ていう話の前フリかなぁ。
473はちみつ餃子 ◆8X2XSCHEME
2018/04/08(日) 13:50:30.74ID:RvzgDq0H
>>472
ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。
(コンストラクタもそのときに走る。)
これは C のときから変わってないよ。
474デフォルトの名無しさん
2018/04/08(日) 14:41:24.43ID:b4O4Usd0
普通に考えると、
単にスコープをローカルにしたいってのがまず考えられる
475デフォルトの名無しさん
2018/04/08(日) 14:46:24.29ID:drN9+cfC
>>473
横からだけど訂正乙
初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある
476デフォルトの名無しさん
2018/04/08(日) 15:12:26.18ID:nkM5b3tX
>>474
mainの中だから意味無い

っつーかstaticは二つの意味があって全然別物
スコープと性的と混ぜるな危険
477デフォルトの名無しさん
2018/04/08(日) 15:18:18.11ID:4aXSD6ZQ
覗きでもやってんのか?
478デフォルトの名無しさん
2018/04/08(日) 15:20:01.32ID:drN9+cfC
>>474
関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、
というごく当たり前の文意だろ普通に読むと。

どう読むと
関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ
自分以外は文法もセマンティックもろくに知らないという前提はやめるべき
479デフォルトの名無しさん
2018/04/08(日) 20:18:51.07ID:B7amW+qm
>>470
スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな
480はちみつ餃子 ◆8X2XSCHEME
2018/04/09(月) 01:15:21.26ID:fbTUuQs/
>>470
ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、
これのことか?
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02037.html
481472
2018/04/09(月) 08:00:59.66ID:4Qmw3/oH
関数スコープのstaticなクラス・インスタンスのコンストラクタは
main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。

static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、
だと勘違いしていた。
訂正してくれてありがとう。そして間違ったことを書いてすまぬ。
482デフォルトの名無しさん
2018/04/09(月) 08:28:16.55ID:arNj8dw4
初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通
483デフォルトの名無しさん
2018/04/09(月) 14:14:56.77ID:iBEYls0Z
いつやっても同じものはいつやっても同じだからな
484デフォルトの名無しさん
2018/04/09(月) 15:10:57.47ID:cuDt6une
>>480

ありがとうございます。本とは内容が違うようです。

int main() {
static const double ARRAY1[] = {1, 2, 3, -1};
static const double ARRAY2[] = {0.5, 1.5, ,-1};
static const double ARRAY3[] = {-1};
static const double* const ARRAY[] = {ARRAY1, ARRAY2, ARRAY3};


}

というコードが該当箇所です。
485片山博文MZ ◆T6xkBnTXz7B0
2018/04/09(月) 15:13:59.63ID:4wbW7ji0
staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。
486デフォルトの名無しさん
2018/04/09(月) 15:16:14.76ID:cuDt6une
>>485

でも、速さがどうとかいうことについては何も書いていないんです。
staticを付けていることについては何の説明もありません。
487デフォルトの名無しさん
2018/04/09(月) 15:31:05.83ID:iBEYls0Z
>>486
>>485はきちんとした回答だと思うよ。
配列が大きくなれば顕著になる。
「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど
488デフォルトの名無しさん
2018/04/09(月) 15:38:58.45ID:7w9BViIO
定数だからstatic constにした
というだけのことでそれ以上の意味はないと思うが
489デフォルトの名無しさん
2018/04/09(月) 15:39:52.73ID:Cpp6LEO8
その変数をコンパイル時点で確定しようとしている。
ローディング時間も早くなる
490はちみつ餃子 ◆8X2XSCHEME
2018/04/09(月) 15:40:56.15ID:fbTUuQs/
>>487
だぶんだけど、 >>486 が言おうとしているのは「>>485 だとしたら入門書としては不親切だよね!」って話じゃねーの。
491デフォルトの名無しさん
2018/04/09(月) 15:57:19.85ID:XexqtlKa
>>484
ROMとRAMに別れてる環境、
つまりほとんどの小規模な組み込み環境だと
static const は通常ROMに配置される
要するにRAMの節約

速度は逆にRAMの方が速いのが普通
492デフォルトの名無しさん
2018/04/09(月) 16:42:59.75ID:cuDt6une
クラスの定義をヘッダファイルに書くときに、

privateなメンバまで書くのはなぜですか?

必要ないように思います。
493デフォルトの名無しさん
2018/04/09(月) 16:45:14.78ID:cuDt6une
>>484

みなさん、ありがとうございました。
速度について気にしているのなら、ロベールにはそう書いてほしかったです。
例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい
ように思います。

>>488
定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか?
494デフォルトの名無しさん
2018/04/09(月) 16:46:43.49ID:cuDt6une
>>492

private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。
495デフォルトの名無しさん
2018/04/09(月) 16:48:38.97ID:EW8VU1tO
sizeof で大きさ取れなくなるね
496デフォルトの名無しさん
2018/04/09(月) 16:50:38.53ID:cuDt6une
>>495

なるほど、ありがとうございました。
497片山博文MZ ◆T6xkBnTXz7B0
2018/04/09(月) 16:52:05.66ID:4wbW7ji0
>>494
pimplイディオムで、クラス詳細を隠蔽できるよ。
498デフォルトの名無しさん
2018/04/09(月) 18:17:18.89ID:R2K+YmFs
>>493
あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな
速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね
499デフォルトの名無しさん
2018/04/09(月) 18:28:43.00ID:arNj8dw4
>>493
今回はたまたまmainであり、
たまたま小さなデータだったというだけで、
より汎用性の高いコードにするのはプログラミングの基本

staticを付けるメリットは
・データ構造の初期化が1回(ROMだと0回)で済む
・スタックを浪費しない
・関数を抜けてもデータが保持される
・番地が固定

デメリットは
・関数を通らなくても初期化される
・関数外でもメモリを使う
500デフォルトの名無しさん
2018/04/09(月) 18:32:13.19ID:arNj8dw4
一番重要なのは>>491
PCプログラムしかやらない人は知らないだろうけど
501デフォルトの名無しさん
2018/04/09(月) 18:49:30.99ID:m9zaOBXx
test2の形だと上手く動作しないのですが何故でしょうか
環境はvc6とstlport521です

void test1(const char* cstr, ...) {
char buf[1024];
va_list args;
va_start(args, cstr);
vsprintf(buf, cstr, args);
va_end(args);
printf(buf);
}
void test2(std::string str, ...) {
const char* cstr = str.c_str();
char buf[1024];
va_list args;
va_start(args, cstr);
vsprintf(buf, cstr, args);
va_end(args);
printf(buf);
}
void main() {
test1("hello1 %d\n", 123);
test2("hello2 %d\n", 123);
}
//結果
//hello1 123
//hello2 1819043176
502デフォルトの名無しさん
2018/04/09(月) 18:56:07.59ID:arNj8dw4
引数を std::string &str, ... にすればなおる
503デフォルトの名無しさん
2018/04/09(月) 19:06:25.54ID:m9zaOBXx
引数を参照とポインタでも試してみましたが結果は変わらなかったです

void test3(std::string& str, ...) {
const char* cstr = str.c_str();
・・・
void test4(std::string* str, ...) {
const char* cstr = str->c_str();
・・・
void main() {
・・・
std::string str3("hello3 %d\n");
test3(str3, 123);
std::string str4("hello4 %d\n");
test4(&str4, 123);
}
//結果
//hello1 123
//hello2 1819043176
//hello3 1819043176
//hello4 1819043176
504デフォルトの名無しさん
2018/04/09(月) 19:14:40.36ID:arNj8dw4
va_start(args, cstr);

なんでcstr?
505片山博文MZ ◆T6xkBnTXz7B0
2018/04/09(月) 19:15:26.84ID:4wbW7ji0
va_startの指定が間違ってる。
506デフォルトの名無しさん
2018/04/09(月) 19:22:49.12ID:m9zaOBXx
ああなんとなく意味が分かってきました
va_startはマクロであってcstrの部分は引数の変数名が指定されなければならないということですかね
507デフォルトの名無しさん
2018/04/09(月) 19:41:37.65ID:m9zaOBXx
こういうコードにすると期待した動作をするようになりました
ありがとうございました

void test5(std::string str, ...) {
char buf[1024];
va_list args;
va_start(args, str);
vsprintf(buf, str.c_str(), args);
va_end(args);
printf(buf);
}
void main() {
・・・
test5("hello5 %d\n", 123);
}
//結果
//hello1 123
//hello2 1819043176
//hello3 1819043176
//hello4 1819043176
//hello5 123
508デフォルトの名無しさん
2018/04/09(月) 19:45:39.82ID:yhCzF70B
ついでに言うと va_start の第二引数については仕様上結構な制限、
各 argument に課される制約と同じ制約がある
配列はダメ、参照はダメ、基本型が格上げされる型との互換性が必要、など
最後のはクラスオブジェクトや float はダメということ
仕様として結果が不定なだけで違反してもエラーにはならないし
意図した通りに動くことも多い

詳しくは default argument promotions va_start
で検索
509片山博文MZ ◆T6xkBnTXz7B0
2018/04/09(月) 20:00:39.54ID:4wbW7ji0
va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。
510デフォルトの名無しさん
2018/04/09(月) 20:14:56.03ID:arNj8dw4
相性が合わない
511はちみつ餃子 ◆8X2XSCHEME
2018/04/10(火) 00:44:35.92ID:141aKXKv
特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。

template<class... T>
void test6(std::string str, T... args) {
char buf[1024];
std::sprintf(buf, str.c_str(), args...);
std::printf(buf);
}
512デフォルトの名無しさん
2018/04/10(火) 08:29:44.17ID:aAychsYe
strがなんで値渡し?
アホなの?
513はちみつ餃子 ◆8X2XSCHEME
2018/04/10(火) 11:04:36.10ID:141aKXKv
クソザコです
514デフォルトの名無しさん
2018/04/10(火) 21:38:17.71ID:sbGIaKQd
なにこのバッファ溢れさせてくださいって釣り針
515デフォルトの名無しさん
2018/04/11(水) 07:10:13.25ID:5X4H9iqq
色々とクソコテクオリティ
516はちみつ餃子 ◆8X2XSCHEME
2018/04/11(水) 11:17:54.25ID:ZSzBt9iE
えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。
517デフォルトの名無しさん
2018/04/11(水) 12:37:28.30ID:FCilzVhB
そう言うところにしか突っ込めない雑魚の相手するなよ...
518デフォルトの名無しさん
2018/04/11(水) 12:58:23.58ID:0UD5Vzkt
わざわざ互換性を下げなくてもいいのに
519デフォルトの名無しさん
2018/04/11(水) 21:16:27.05ID:0UD5Vzkt
>>511
なんでbufに一旦書いてるの?
直接printfじゃだめなん?
520デフォルトの名無しさん
2018/04/11(水) 21:20:49.36ID:yjo2onbY
実行目的ならvprintf使うんじゃね?
521デフォルトの名無しさん
2018/04/11(水) 21:29:16.68ID:0UD5Vzkt
普通はね
クソコテがコードサイズ、互換性、実行速度など
全て犠牲にしてもテンプレートを使いたかったみたい
522デフォルトの名無しさん
2018/04/11(水) 21:46:51.95ID:4xNEGOrU
va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように
C++ らしく va_start 使わない例を出したんだろ…

と書いてはみたが、
そういう意図が通じるわけないか
通じる人は最初からわかってるもんな
523デフォルトの名無しさん
2018/04/11(水) 21:49:14.05ID:4xNEGOrU
そもそも何でbufにって質問は
コメント元の>>507にすべきだろ
524デフォルトの名無しさん
2018/04/11(水) 21:50:42.77ID:IGuJq2PQ
こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ
525デフォルトの名無しさん
2018/04/11(水) 21:54:51.56ID:5X4H9iqq
>>522
誰も求めてないwww
526デフォルトの名無しさん
2018/04/11(水) 22:01:42.55ID:5X4H9iqq
危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの?

オナニーは隠れてやれ
527デフォルトの名無しさん
2018/04/11(水) 22:53:04.70ID:4xNEGOrU
c++ スレで variadic template 紹介されてこの反応
528はちみつ餃子 ◆8X2XSCHEME
2018/04/12(木) 00:24:16.88ID:csgoYI7G
>>526
危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。
本題に関係ないところなんてどうでもいいじゃないの。
529デフォルトの名無しさん
2018/04/12(木) 02:27:29.73ID:iYyApZ27
>>501とvariadic templateは関係ないわけだが
530デフォルトの名無しさん
2018/04/12(木) 02:36:35.20ID:iYyApZ27
わざわざ環境まで書いてあるのに
アホですね
531デフォルトの名無しさん
2018/04/12(木) 10:41:06.56ID:KhnSMF/h
const double const ARRAY[] = { 3, -1 };
const double ARRAY[] = { 3, -1 };

の違いを教えてください。
532デフォルトの名無しさん
2018/04/12(木) 10:48:56.23ID:ySRK5Kj5
ポインタ変数なら
・変数も指し先も書き換えられない
・変数は書き換え可能。 指し先は書き換えられない
のパターンだけど

対象が配列の場合、元々変数の書き換えができないから同じ意味じゃないかと
533デフォルトの名無しさん
2018/04/12(木) 12:23:14.02ID:aCAyQDuf
>>531
> const double const ARRAY[] = { 3, -1 };
コンパイルエラーにならないんだっけ?
534デフォルトの名無しさん
2018/04/12(木) 12:25:36.92ID:KhnSMF/h
>>532

ありがとうございました。

>>533

Visual Studioではコンパイルエラーになりません。
535デフォルトの名無しさん
2018/04/12(木) 14:29:59.20ID:ZdndFYj4
あいうえお
536デフォルトの名無しさん
2018/04/12(木) 14:43:04.91ID:Htzfym0f
おこそとの
537 ◆QZaw55cn4c
2018/04/12(木) 15:19:35.63ID:4odEe1Tq
とりなくこえすゆめさませ
538デフォルトの名無しさん
2018/04/12(木) 21:59:02.17ID:nMaemNOx
const double const a[];

const double a[];
と同じ意味
const const double const const a[];
なんて書いてもいいし
double const a[];
と書いてもいい

const typename と typename const と同じ
しかもconstはいくつ書いてもいい
539デフォルトの名無しさん
2018/04/13(金) 10:38:13.53ID:roGFrSR8
Win32のBOOL型を返す関数を複数回呼んで、
すべて成功したときのみTRUEを返したいのですが
(途中で失敗しても関数自体はすべて呼んでおく)、

BOOL Test()
{
  BOOL bResult = TRUE;
  bResult &= Api(...);
  bResult &= Api(...);
  bResult &= Api(...);
  return bResult;
}

と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、
Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、
例えば関数が成功時に2を返すパターンがあったら、
すべて成功しても戻り値はFALSEになるのではと思っています。

この場合、

bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;

みたいな書き方をするしかないのでしょうか。
540デフォルトの名無しさん
2018/04/13(金) 10:57:04.94ID:UdLtdLwz
result &= !!api(...);

という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、
何にしても見た目は汚いと思う

文字数は増えるがif文を使って
if (!api()) result=false;
の方が可読性高いかもしれない
541デフォルトの名無しさん
2018/04/13(金) 11:38:56.36ID:OgXHMhZG
>>539
成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな
BOOL Test()
{
int count = 0;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(count == 3) return TRUE;
}
542デフォルトの名無しさん
2018/04/13(金) 12:44:10.91ID:mVcRE5FO
結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。
543デフォルトの名無しさん
2018/04/13(金) 12:50:27.67ID:UkpF6ptq
>>539
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
これでいいと思う

>>541
3個位ならいいけどたくさんになると数え間違いとかやらかしそう
544デフォルトの名無しさん
2018/04/13(金) 14:35:54.06ID:OgXHMhZG
>>543
1年後の自分がやらかしそうだわw
545デフォルトの名無しさん
2018/04/13(金) 14:37:30.50ID:eQfDSJES
普通に&で繋げてしまえば。
return Api()&Api()&Api()...;
546デフォルトの名無しさん
2018/04/13(金) 14:44:49.05ID:lxf6ix6+
>>545
そもそもの質問のキモがわかってないよ
547539
2018/04/13(金) 15:24:49.14ID:roGFrSR8
みなさんご意見ありがとうございます。
例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、
常に同じ関数が3回というわけではありませんでした。
失礼しました。

bResult = Api(...) && bResult;

の書き方自体は、そこまで汚いわけではないのですね。
同じような書き方をしているソースも、検索してみたら出てきました。

個人的には、

bResult &&= Api(...);

のような記述ができるとありがたかったです。
548はちみつ餃子 ◆8X2XSCHEME
2018/04/13(金) 16:20:54.65ID:RMqAMM1S
>>547
こういう手段もあるぞ。

bResult *= Api(...);

一度 0 になったら何をかけても 0 だ。
549デフォルトの名無しさん
2018/04/13(金) 16:33:04.14ID:cn4ajNkQ
&&= と書けないことをこの質問で知ったわ。

>>548
「返り値が0でなければ成功」の関数で変テコな返り値が来ると
組み合わせでダメになるかも。
256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。
550デフォルトの名無しさん
2018/04/13(金) 16:33:39.54ID:aZorcSvM
明確なメリットが無いのに、
無駄にトリッキーなコードを書くのはおすすめしない
551デフォルトの名無しさん
2018/04/13(金) 16:39:34.39ID:aZorcSvM
数が少なく重要な箇所であれば、
デバッグ用コードを追加しやすい以下で良い

if (!Api(...)){
bResult = FALSE;
}
...

数が少なく重要じゃなければ >>547 で良い

数が多ければ色々と工夫しようか
552 ◆QZaw55cn4c
2018/04/13(金) 16:44:07.64ID:fORiWt/O
>>548
適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか?

…んー、ないな、何故ないのだろう?
553デフォルトの名無しさん
2018/04/13(金) 17:53:26.34ID:ledbPVdv
基底クラスのメンバ関数に virtual をつけないことってあるんですか?
つけてもつけなくてもどちらでもいいという場合はあると思いますが、
つけちゃいけないという場合が考えにくいのですが、そういう場合は
あるのでしょうか?
554デフォルトの名無しさん
2018/04/13(金) 17:55:06.07ID:ledbPVdv
逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の
デフォルトの機能にすればいいのにと思います。

どうでしょうか?
555片山博文MZ ◆T6xkBnTXz7B0
2018/04/13(金) 17:56:07.81ID:meZ//aXI
>>553
仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。
556デフォルトの名無しさん
2018/04/13(金) 17:58:31.25ID:ledbPVdv
>>555

virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。

ありがとうございました。
557デフォルトの名無しさん
2018/04/13(金) 19:32:26.21ID:UkpF6ptq
>>552
オーバーフローで0とか
558はちみつ餃子 ◆8X2XSCHEME
2018/04/13(金) 21:02:41.55ID:RMqAMM1S
>>557
せやな。 普通はないと思うが、無いと言い切ることもできない。

ここまでいろんな案が出てるけど、なんだかんだで >>539 が自分で結論出してるのがベストだと思う。
書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。
559デフォルトの名無しさん
2018/04/13(金) 21:13:39.42ID:ko86uHhA
浮動小数点ならダーティー0とかあるけど
普通は意識しないでしょうねぇ
560デフォルトの名無しさん
2018/04/14(土) 00:48:59.29ID:qJeIaUAA
今回は「非ゼロ」が様々な数値である場合について考えているわけだから
0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然
561デフォルトの名無しさん
2018/04/14(土) 01:08:45.20
int64_t 使えばいいだろwww
ケチケチすんなってwwwww
562デフォルトの名無しさん
2018/04/14(土) 03:21:52.45ID:yJ5VtHzf
4つ掛けたらアウトじゃん
ほんとうにバカだなあ
563デフォルトの名無しさん
2018/04/14(土) 05:40:34.13ID:DUdlBUp3
>>547
汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。

俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、
そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。
564デフォルトの名無しさん
2018/04/14(土) 07:52:50.53ID:Fxbc5uis
!か!!使えば1か0にしかならんからそれかけるとか
565デフォルトの名無しさん
2018/04/14(土) 08:44:41.44ID:whWbsAFN
それをシフトと組み合わせると、エラー箇所までわかって便利だね
566デフォルトの名無しさん
2018/04/14(土) 10:42:40.78ID:pziCCgl7
>>556
補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど
あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る
つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる

virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ
567デフォルトの名無しさん
2018/04/14(土) 11:38:28.43ID:aYmqXLA5
>>565
ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら>>542とかでいいだろ
568デフォルトの名無しさん
2018/04/14(土) 11:59:10.38ID:gkV4B+Je
メモリをけちるとかそんなけちな理由じゃない
569デフォルトの名無しさん
2018/04/14(土) 12:05:20.64ID:whWbsAFN
selectって知っている?
570デフォルトの名無しさん
2018/04/14(土) 12:31:15.66ID:aYmqXLA5
select?
その時代の知識で止まってるの?
571デフォルトの名無しさん
2018/04/14(土) 17:00:09.46ID:6q9VmxFv
a=1に対して、
cout << a << a++なら21
cout << a++ << aなら12
cout << a++ << a++なら21
と表示されました。
coutはどんな順番で評価されているのでしょうか?
572デフォルトの名無しさん
2018/04/14(土) 18:21:04.74
>>571
確かに以下は
https://ideone.com/sBACG3
21
12
21
と表示される

でも、手元のVC 2017 / Windows 10 では
11
12
11
と表示された

g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では
11
12
12
と表示された
573デフォルトの名無しさん
2018/04/14(土) 18:31:12.32
>>572
http://codepad.org/KVv4KD8O
ではコンパイルエラーになった。
cc1plus: warnings being treated as errors
In function 'void test1()':
Line 6: warning: operation on 'a' may be undefined
In function 'void test2()':
Line 12: warning: operation on 'a' may be undefined
In function 'void test3()':
Line 18: warning: operation on 'a' may be undefined

http://techtipshoge.blogspot.jp/2012/01/c.html
http://www.kouno.jp/home/c_faq/c3.html
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

こんな書き方をするなってことだね
574デフォルトの名無しさん
2018/04/15(日) 00:38:00.30ID:/OvgYAab
>>571
いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、
評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。
575デフォルトの名無しさん
2018/04/15(日) 08:36:03.86ID:IUBKEb9a
未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで
同じ順序で評価されない可能性もある、じゃないかな。

実際のところ、コンパイルごとに評価順が変化するとも思えないけど。
いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。
576デフォルトの名無しさん
2018/04/15(日) 09:17:15.75ID:CIuag2/D
>>573
おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな
577デフォルトの名無しさん
2018/04/15(日) 10:08:58.88ID:c4dXLki+
class Base {
public:
void A();
protected
virtual void B();
}

void Base::A() {
B();
}

void Base::B() {
cout << "Base" << endl;
}

class Derived : public Base {
protected
virtual void B();
}

void Derived::B() {
cout << "Derived" << endl;
}

Base b;
b.A(); ⇒ 「Base」が表示される。

Derived d;
d.A(); ⇒ 「Derived」が表示される。

b = d;
b.A() ⇒ 「Base」が表示される。
578デフォルトの名無しさん
2018/04/15(日) 10:11:08.98ID:c4dXLki+
b = d;
b.A() ⇒ 「Base」が表示される。

↑で、なぜ、「Derived」が表示されないのでしょうか?

ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。
579デフォルトの名無しさん
2018/04/15(日) 10:29:12.58ID:VXOW+WoG
void Base::A() {
B();
}

void Base::B() {
cout << "Base" << endl;
}

A() の中で、B() を呼んでいるから

A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。
こんなコーディングはしない
580デフォルトの名無しさん
2018/04/15(日) 10:37:36.78ID:sXJBpbWg
バカを装った荒らしか本当のバカか
581デフォルトの名無しさん
2018/04/15(日) 10:41:29.91ID:c4dXLki+
>>578-579

よく分かりません。

ポリモーフィズムというのがありますが、その考え方だと

b = d;
b.A() ⇒ 「Derived」が表示される。

のではないかと思ってしまいます。
582デフォルトの名無しさん
2018/04/15(日) 10:59:34.87ID:c4dXLki+
Base::B() の virtual を削除する:

class Base {
public:
void A();
protected
void B();
};


すると、

Base b;
b.A(); ⇒ 「Base」が表示される。

Derived d;
d.A(); ⇒ 「Base」が表示される。
583デフォルトの名無しさん
2018/04/15(日) 11:27:00.75ID:ZEcSoj1Y
ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。
584デフォルトの名無しさん
2018/04/15(日) 11:33:52.43ID:q/GS/gh9
スライシングとも別の問題のような
585デフォルトの名無しさん
2018/04/15(日) 11:52:13.52ID:igXjAIRS
bの型がBaseだからだろ?
586デフォルトの名無しさん
2018/04/15(日) 12:16:46.54ID:VXOW+WoG
まずこの本で、オブジェクト指向を学ぶ。
スッキリわかる Java入門 第2版、2014

最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w
軽く、数年を無駄にするだけ

C++ なんて、偏差値70以上しか無理やのに
587デフォルトの名無しさん
2018/04/15(日) 12:34:26.84
>>577
> b = d;
> b.A() ⇒ 「Base」が表示される。

Base bp;
bp = &d;
b->A();

こうやね
588デフォルトの名無しさん
2018/04/15(日) 12:35:11.72
>>582
間違えた

Base *bp;
bp = &d;
b->A();
589デフォルトの名無しさん
2018/04/15(日) 12:36:47.16ID:c4dXLki+
>>583-585

ありがとうございました。


C++が難しいというのは、設計が悪いからですか?
C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに
設計することは無理ですか?
590デフォルトの名無しさん
2018/04/15(日) 12:37:23.54ID:c4dXLki+
>>587-588

ありがとうございました。
試してみようと思います。
591デフォルトの名無しさん
2018/04/15(日) 12:43:40.81ID:c4dXLki+
理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。
592デフォルトの名無しさん
2018/04/15(日) 13:30:31.42ID:VXOW+WoG
C++ は、何でも出来るようにしているから、ルール数が100以上ある

さらに、ルールAでは、B, C は除くとか、
1つのルールが、他のルールとからむから、
非常に難しいし、組み合わせ爆発が起こる

膨大な時間を無駄にしても、さほど理解できず、身につかない。
組み込み機器も想定しているから、
どうしてこういうルールが必要なのか、初心者には理解できない。
Rust ですら、初心者には無理だろ

だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。
ルールの多さで、廃人になってしまう

初心者には、絶対に無理。
最初から、エベレストを登るようなもの。
まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし

このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない
593592
2018/04/15(日) 13:45:38.29ID:VXOW+WoG
ロベールでC++ を勉強するのも良いけど、
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある

特に、Java, C, Rust は、絶対に知っていないといけない。
組み込みの知識も必要

C++ の初心者だけど、他の言語はプロ級で、
PC・組み込み・Linux コマンドも知っていて、C++ を始められる

それでも、ほとんどのC プログラマーは、C++ へ進めない
594デフォルトの名無しさん
2018/04/15(日) 13:49:36.88ID:ldkcKhuZ
スッキリ厨はちゃんとコテ付けてくれ
595デフォルトの名無しさん
2018/04/15(日) 15:24:18.71ID:qZPDSYA2
某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。

第3版が難読版というのは判る
596デフォルトの名無しさん
2018/04/15(日) 15:55:19.09ID:/OvgYAab
= が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、
という理解が必要なんだろうけれどこれ難しいだろうか?

cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな
597デフォルトの名無しさん
2018/04/15(日) 16:39:48.86ID:VXOW+WoG
ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単
598デフォルトの名無しさん
2018/04/15(日) 17:20:50.44ID:s7NpyR5v
原典も読まずに能書き垂れる奴っているんだなぁ
599デフォルトの名無しさん
2018/04/15(日) 18:07:17.49ID:c4dXLki+
>>588

試してみました。
確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。
これはなぜでしょうか?

#include "Derived.h"

int main() {
Base b;
Base& br = b;
br.A();

Derived d;
br = d;
br.A();

Base *bp;
bp = &b;
bp->A();

bp = &d;
bp->A();
}

実行結果は以下です。

Base
Base
Base
Derived
600デフォルトの名無しさん
2018/04/15(日) 18:44:29.81ID:ZEcSoj1Y
参照は書き換えられないからな。

>br = d;

参照先のbに代入してるのと同じこと。
601デフォルトの名無しさん
2018/04/15(日) 18:50:44.48ID:CIuag2/D
>>599
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし
602デフォルトの名無しさん
2018/04/16(月) 00:20:31.20ID:TXxoP4/a
参照のポインタっぽい振る舞いを確認したいならこう

Derived d;
Base & b1(d);
b1.A();
603デフォルトの名無しさん
2018/04/16(月) 07:57:32.89ID:PsSdBUuj
>>602
ありがとうございました。
下の結果は、

Base
Derived
Derived

になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が
解消することになると思うので、理解したいです。

#include "Derived.h"

int main() {
Derived d;
Base b;

Base& br1 = b;
br1 = d;
br1.A();

Base& br2(d);
br2.A();

Base *bp;
bp = &d;
bp->A();
}
604デフォルトの名無しさん
2018/04/16(月) 08:01:12.80ID:PsSdBUuj
Base
Derived
Derived

となりました。

2番目と3番目は同じことの別表現のようですね。
見た感じ、1番目と2番目に違いがあるようには思えません。

Derived d;
Base b;

Base& br1 = b;
br1 = d;
br1.A();

Base& br2 = d;
br2.A();

Base& br3(d);
br3.A();
605デフォルトの名無しさん
2018/04/16(月) 08:14:10.02ID:TXxoP4/a
>>604
参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。
初期化と代入を区別すること。

Base& br1 = b; // 初期化 br1 は b の参照
br1 = d; // 代入 b = d と同じ動作

Base& br2 = d; // 初期化 br2 は d の参照
606デフォルトの名無しさん
2018/04/16(月) 08:32:20.53ID:PsSdBUuj
>>605

ありがとうございました。

>Base& br1 = b; // 初期化 br1 は b の参照
>br1 = d; // 代入 b = d と同じ動作

br1 = d としても参照先は変わらないんですね。

ありがとうございました。
607デフォルトの名無しさん
2018/04/16(月) 12:10:28.34ID:rDfY3L1y
Java,C#などのプログラマです。
C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、
https://ideone.com/k7g2nn
ITestAとITestBはインターフェース的なものです。
で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを
作ったのですが、
CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは
抽象クラスになってて実体化できません。
ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
というかこういう場合C++ではどうすればいいのでしょうか?
608デフォルトの名無しさん
2018/04/16(月) 12:43:19.10ID:qlfABgAK
Base Pointer : 100〜119
Derived Pointer : 120〜139

こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。
100〜119 内で、Base クラスの変数・メソッドのアドレスを探す

Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す
609デフォルトの名無しさん
2018/04/16(月) 13:08:20.92ID:5MYyAHFg
>>607
単なる文法エラーだからエラーメッセージみてコードを直してください
610デフォルトの名無しさん
2018/04/16(月) 14:01:04.61ID:rDfY3L1y
>>609
文法エラー??
https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。

https://ideone.com/QxErKY
こっちですね。
611デフォルトの名無しさん
2018/04/16(月) 14:08:31.72ID:rDfY3L1y
ちなみに、C#だとこんな感じです。
https://ideone.com/8SZhJ7
612デフォルトの名無しさん
2018/04/16(月) 14:29:48.23ID:7XdbFr6Z
CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな?
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる

これならok
https://ideone.com/FGHyda
613デフォルトの名無しさん
2018/04/16(月) 14:32:34.81ID:rDfY3L1y
もちろん、エラーなくしてコンパイルを通す方法は
>>607
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いたようにすればとりあえず、コンパイルは通ります。
聞きたいのは、
C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、
C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか??
それともC++では他の方法があるのでしょうか?
614デフォルトの名無しさん
2018/04/16(月) 14:34:54.92ID:rDfY3L1y
>>612
あ、すみません。ちょっと被ってしましましたね。>>613は忘れて下さい。
>>612のコードを見てみます。
615デフォルトの名無しさん
2018/04/16(月) 15:08:36.13ID:rDfY3L1y
>>612
そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。
まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。
ありがとうございます。
616デフォルトの名無しさん
2018/04/16(月) 15:30:44.68ID:7XdbFr6Z
>>615
インターフェース側をいじるのは仕方ない
どっちかになる

https://ideone.com/qrd4fN
https://ideone.com/kVZzRi
617デフォルトの名無しさん
2018/04/16(月) 16:21:16.33ID:Gm7LZDiq
実装とインタフェースの両方を継承するならこういう書き方もある
ATL なんかがこれ式かな

https://ideone.com/B7JWER
618デフォルトの名無しさん
2018/04/16(月) 17:30:50.30ID:rDfY3L1y
>>616
>>617
色々ありがとうございます。>>617がよさそうなのでこれで行こうかなと思います。
619デフォルトの名無しさん
2018/04/17(火) 17:08:59.76ID:SGgdop5e
巨大なファァイルの読み込みに関してです。
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?
620デフォルトの名無しさん
2018/04/17(火) 17:20:32.18ID:/qMRupTB
行という概念が
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?

ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど
621デフォルトの名無しさん
2018/04/17(火) 17:29:32.71ID:KTfx2aCu
>>619
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか

全く自由なフォーマットだと頭から解析するしかない

読み込みスレッドと解析スレッドを分けると速くなることもあるかも

同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか
622デフォルトの名無しさん
2018/04/17(火) 17:30:11.39ID:cVYjBdTw
>>619
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。

FILE * を用いてシーケンシャルにたくさん読む場合は
setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう

いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。
623デフォルトの名無しさん
2018/04/17(火) 17:36:06.95ID:p5xwhAV/
末尾にseekして、適当に戻って読んでみて、
改行がなければまた戻って、を繰り返すのが現実的。
624デフォルトの名無しさん
2018/04/17(火) 17:40:13.25ID:/qMRupTB
巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?
625デフォルトの名無しさん
2018/04/17(火) 17:50:32.61ID:yyY2OAEq
対象のテキストファイルとは独立に、
「そのテキストファイルの各行がファイルの何バイト目から始まるか」
という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。

>>622 の後半部分だな。
626619
2018/04/17(火) 18:03:45.64ID:SGgdop5e
皆様いろいろご指導ありがとうございました。
私の能力では難しそうですが、いろいろ高速化を試してみます。
627デフォルトの名無しさん
2018/04/17(火) 18:46:11.69ID:NCQX7EWc
末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して)
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする
628デフォルトの名無しさん
2018/04/17(火) 18:55:56.84ID:gaNnpc4H
配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?
629デフォルトの名無しさん
2018/04/17(火) 19:35:04.61ID:wvS91pUR
>>628
scanf("%d",&n);
int array[n]; //読み込んだ値を要素数にするってこういう事?
630デフォルトの名無しさん
2018/04/17(火) 20:21:29.36ID:AHw7lgSX
基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?
631デフォルトの名無しさん
2018/04/17(火) 20:24:11.47ID:AHw7lgSX
すみませんでした。普通に逆参照すればいいのか。
auto v = new vector<int>(); for (auto &i : *v)
632デフォルトの名無しさん
2018/04/17(火) 20:46:42.62ID:hZ2W0cz8
>>629
ありがとうございました
633デフォルトの名無しさん
2018/04/18(水) 11:35:26.22ID:uQo81sbZ
MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。

複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。

void Test()
{
  static CCriticalSection cs;
  cs.Lock();
  :
  cs.Unlock();
}

関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?

それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?

MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。
634片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 11:57:34.76ID:iSn0xXbj
https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html
http://d.hatena.ne.jp/yohhoy/touch/20120309/p1
635デフォルトの名無しさん
2018/04/18(水) 12:00:55.78ID:EfAk4eu6
>>633
C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。
(C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった)
msvc では 2015 から。

c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる
以下を参照

https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization

gcc / clang では -fno-threadsafe-statics オプション
636デフォルトの名無しさん
2018/04/18(水) 12:06:23.94ID:H8UzlwrM
他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。
637デフォルトの名無しさん
2018/04/18(水) 12:26:53.25ID:MXcoXWvI
独り言ならチラシの裏にかけ
638片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 12:28:10.26ID:iSn0xXbj
>>636
ソースとエラー貼って
639デフォルトの名無しさん
2018/04/18(水) 12:39:00.98ID:8LhMtFC1
>>638
NDAを結ばないと出せません
640デフォルトの名無しさん
2018/04/18(水) 12:48:05.38ID:Odk+F4n0
>>636
コードすら貼らないオツムの足りなさじゃ諦めろ
641633
2018/04/18(水) 12:59:22.55ID:uQo81sbZ
>>634-635
ありがとうございます。
VSは2015よりも前なので、このやり方はダメってことですね。
関数の外に置くようにします。

MFCの内部ではやっちゃってますが。
642デフォルトの名無しさん
2018/04/18(水) 13:03:03.18ID:H8UzlwrM
なんだよ。このクソ言語。やっとわかったわ。

ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。
643片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 13:07:10.12ID:iSn0xXbj
エラーも貼れないなら、助けるのはムリ。

テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。

つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。
644デフォルトの名無しさん
2018/04/18(水) 13:12:55.50ID:H8UzlwrM
そりゃ、ソースコード全部張れば分かるとは思うけど、
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。

だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。
645片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 13:22:59.72ID:iSn0xXbj
May the source be with you.
646デフォルトの名無しさん
2018/04/18(水) 13:25:36.89ID:whM0Cl8U
プリプロセッサの結果を見れば判るだろうに
647デフォルトの名無しさん
2018/04/18(水) 13:37:08.45ID:H8UzlwrM
そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が
ありませんでした。

まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。
648デフォルトの名無しさん
2018/04/18(水) 13:45:55.17ID:MXcoXWvI
C++の文法のクソさには誰も異論はない。
649デフォルトの名無しさん
2018/04/18(水) 13:59:47.30ID:+aOsPa5t
プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな
650デフォルトの名無しさん
2018/04/18(水) 14:01:11.21ID:v7hqXOET
クソどころじゃない
651デフォルトの名無しさん
2018/04/18(水) 15:30:25.37ID:EU/tZBmZ
>>642
今後のためにそのエラーになる最少構成でやってみ
652デフォルトの名無しさん
2018/04/18(水) 20:25:53.95ID:hZhORVVR
ヘッダファイルがこんなふうにconst用と非const用の関数があるとして

class A {
B b;
B& get() { return b; }
const B& get() const { return b; }
}

このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか?

auto& get() { return b; }
auto& get() const { return b; }
653片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 20:49:19.46ID:cGcFIcRA
型名が長すぎるときは、typedef。
654はちみつ餃子 ◆8X2XSCHEME
2018/04/18(水) 20:52:50.32ID:5Rgz0HeV
>>653
型の別名を定義することについての是非は置くとして、 typedef はオワコン。
using を使うのがモダンな C++ やで。
655デフォルトの名無しさん
2018/04/18(水) 21:22:43.95ID:hZhORVVR
typedefやusingはなるべく使いたくないんですよね
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・
656片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 21:26:54.29ID:cGcFIcRA
こうだな。動くかどうか知らんけど。
auto& get() { return b; }
const auto& get() const { return b; }
657はちみつ餃子 ◆8X2XSCHEME
2018/04/18(水) 21:27:07.88ID:5Rgz0HeV
decltype(b) でもええんやで。
658デフォルトの名無しさん
2018/04/19(木) 01:18:42.72ID:AYGORpen
悩んでる時間があったら素直に全て書け
と思う
659デフォルトの名無しさん
2018/04/24(火) 10:32:40.90ID:Z9G2Fq/H
柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?
660デフォルトの名無しさん
2018/04/24(火) 12:27:26.17ID:1D4v+3Mx
ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古

修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015
661デフォルトの名無しさん
2018/04/24(火) 13:18:05.66ID:+bGv0z3c
「C++の設計と進化」は良いよ
662デフォルトの名無しさん
2018/04/24(火) 15:48:30.83ID:Z9G2Fq/H
>>660-661

ありがとうございます。

Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。
柴田さんの中級という本も細かい話がないように思います。
663デフォルトの名無しさん
2018/04/24(火) 18:56:34.08ID:Z9G2Fq/H
vector について質問です。

コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?
664デフォルトの名無しさん
2018/04/24(火) 19:23:44.30ID:4uyKjeBM
実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか
665片山博文MZ ◆T6xkBnTXz7B0
2018/04/24(火) 19:27:47.73ID:Eukzbh8y
Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、
読み進めるにはテンプレートの知識が必要かもね。
666デフォルトの名無しさん
2018/04/24(火) 19:32:21.39ID:Z9G2Fq/H
>>664

ありがとうございました。

ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、
関数から返したりしてもかまわないですね。

>>665

ありがとうございました。
667デフォルトの名無しさん
2018/04/24(火) 19:40:11.28ID:4uyKjeBM
>>666
それはディープコピーのコストがかさむのでおすすめしない
668デフォルトの名無しさん
2018/04/24(火) 20:11:58.65ID:Ukt80uX+
>>666
>何も考えず引数で渡しても良いですね

何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう
669デフォルトの名無しさん
2018/04/26(木) 01:34:48.58ID:Z7x9U0tp
class TestA
{
TestA() {}
~TestA() {}
};
class TestB
{
TestB() {}
~TestB() {}
TestA getA() { return TestA(); }
};
int main() { TestB b; TestA a = b.getA(); }

TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの
インスタンスは一体どこで作られてるんでしょうか?
TestA getA() { TestA a; return a; }
としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
670デフォルトの名無しさん
2018/04/26(木) 07:25:57.17ID:E0/AuDcr
>>669
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。

式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。

>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける


ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。
671デフォルトの名無しさん
2018/04/26(木) 07:37:06.21ID:E0/AuDcr
>>669
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。


size_t l = std::string("abc").length();

std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
672デフォルトの名無しさん
2018/04/26(木) 11:26:25.34ID:Z7x9U0tp
>>670-671
詳細をありがとうございました。
大変良く解りました。より深くは自分でググってみます。
673デフォルトの名無しさん
2018/04/26(木) 14:19:03.06ID:LZqqVlEY
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
http://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
http://photoshopvip.net/103903

https://goodpatch.com/blog/sketch-plugins/
674デフォルトの名無しさん
2018/04/27(金) 13:24:43.31ID:wnXDwKhi
for (int i = 0; i < n + 1; ++i) {;}

とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?

もし、そうなら、

m = n + 1
for (int i = 0; i < m; ++i) {;}

としたほうがよいのでしょうか?
675はちみつ餃子 ◆8X2XSCHEME
2018/04/27(金) 13:35:12.84ID:GhhThAV7
>>674
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
676デフォルトの名無しさん
2018/04/27(金) 14:09:53.91ID:ouRrzssA
【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
http://2chb.net/r/liveplus/1524621704/l50
677デフォルトの名無しさん
2018/04/27(金) 18:21:42.79ID:qED012zx
https://ideone.com/TVzVzF

上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。
678デフォルトの名無しさん
2018/04/27(金) 18:38:42.04ID:yKF4ET93
>>674
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話

あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう

普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので

このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある
679デフォルトの名無しさん
2018/04/27(金) 19:03:28.59ID:uctWpHV6
>>677
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?

ifstream も IReadable じゃないからエンベロープする。

https://ideone.com/27yhhu
680デフォルトの名無しさん
2018/04/27(金) 19:06:52.81ID:O6TOHWbP
>>674
> for (int i = 0; i <= n; ++i) {;}
681デフォルトの名無しさん
2018/04/27(金) 19:18:38.40ID:uctWpHV6
for ループといえばつい手癖で
for (int i =0; i < count-1; ++i ) {...}
と書いてて、
後日に count を int から size_t にしたとき
countが0のケースではまったことがあるなあ

for (int i =0; i + 1 < count; ++i ) {...}
と書けば良いだけなんだけど
682デフォルトの名無しさん
2018/04/27(金) 19:27:34.55ID:mctUhDKo
n+1未満とn以下は違うと思うの
683デフォルトの名無しさん
2018/04/27(金) 19:33:05.63ID:AimUsleE
>>681
それcountが1でも全くループしないというヘンテコ仕様だけど
そんなもの手癖で書くの?
684デフォルトの名無しさん
2018/04/27(金) 19:37:07.17ID:uctWpHV6
>>683
隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか
後続のものがある項だけ処理するとか良くある
685デフォルトの名無しさん
2018/04/27(金) 19:37:30.10ID:wnXDwKhi
int **a を利用して2次元の動的配列を作ります。
a を関数に渡して、計算に利用します。
2次元配列 a の要素は変更しないので、

int func(const int **a){ ... }

としました。

main 内には以下のように書きました。

ret = func(a);

すると、 a を int** から const int** に変換できませんというエラーが出てしまいます。

これはなぜでしょうか?
686デフォルトの名無しさん
2018/04/27(金) 19:39:48.54ID:wnXDwKhi
>>675
>>678
>>680

ありがとうございました。
687デフォルトの名無しさん
2018/04/27(金) 19:49:10.59ID:O6TOHWbP
>>682
ん?
レアケースを語り出すのか?
688デフォルトの名無しさん
2018/04/27(金) 19:51:18.26ID:mctUhDKo
>>683
そんなにヘンテコでもないと思う

for (size_t count = 0 ; count < 10 ; count++){
for (size_t i = 0 ; i < count - 1 ; i++){
....
}
}

こんなのはありがちかと
689デフォルトの名無しさん
2018/04/27(金) 19:52:51.39ID:mctUhDKo
>>687
レアケースっていうか
nが小数の場合だな
690デフォルトの名無しさん
2018/04/27(金) 20:02:30.96ID:AimUsleE
ふむ、なくはないか。
やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。
最適化の下手なコンパイラ対策も含めて。
691デフォルトの名無しさん
2018/04/27(金) 20:03:21.75ID:O6TOHWbP
>>689
だからそう言うのをレアケースって言ってるんだが...
よく書くと言うなら多分住む世界が違う
692片山博文MZ ◆T6xkBnTXz7B0
2018/04/27(金) 20:10:35.47ID:HF3+Vuoy
レイアース
693デフォルトの名無しさん
2018/04/27(金) 20:28:24.05ID:wnXDwKhi
>>685

具体的なコードは以下です:

int func(const int **a) {
return 0;
}

int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}

func(a);

for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
}
694はちみつ餃子 ◆8X2XSCHEME
2018/04/27(金) 20:32:49.73ID:GhhThAV7
>>692
さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!
695デフォルトの名無しさん
2018/04/27(金) 20:36:06.84ID:mctUhDKo
>>687
そんな事言ったら
countが0でループだってレアケースだぞ
696デフォルトの名無しさん
2018/04/27(金) 20:43:41.07ID:mctUhDKo
>>693
const付きに変換出来るのは
ポインタの先がconstに変わる場合

int finc(int * const * a) なら大丈夫
697デフォルトの名無しさん
2018/04/27(金) 20:52:32.49ID:wnXDwKhi
ありがとうございます。

const についてよくわからないのですが、

func の中で、

a[i][j] = 1;

みたいなことをできないようにしたいのですが、どうすればいいでしょうか?
698デフォルトの名無しさん
2018/04/27(金) 20:55:03.35ID:qED012zx
>>679
ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか?
というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。
たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね?
あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。
標準のコンテナや自作クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。
699デフォルトの名無しさん
2018/04/27(金) 20:57:43.26ID:mctUhDKo
キャスト
が一番コストが少ないと思う

関数の中で
delete [] a[i];
a[i] = new int[10];
は出来ても良いの?
700デフォルトの名無しさん
2018/04/27(金) 20:58:32.28ID:mctUhDKo
>>699>>697あて
701デフォルトの名無しさん
2018/04/27(金) 21:19:24.66ID:wnXDwKhi
>>699

ありがとうございます。

ちょっと回答が理解できないため、質問を代えさせてください

以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか?
702デフォルトの名無しさん
2018/04/27(金) 21:19:40.66ID:wnXDwKhi
int func(const int **a) {
return 0;
}

int func2(const int *b) {
return 0;
}

int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}

func(a);

int *b = new int[n];

func2(b);

for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;

delete[] b;
}
703デフォルトの名無しさん
2018/04/27(金) 21:47:52.98ID:uctWpHV6
>>701
それは c / c++ の欠点の1つで、
T * は const T * に文句も言わず変換してくれるが
T ** は const T ** に変換してくれないという問題
T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。

キャストが必要

const_cast<const int**>(a) など
704デフォルトの名無しさん
2018/04/27(金) 22:48:56.90ID:bqnCmOTp
>>702
皆が言っているのは質問の内容とはちょっと違うけど、
func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして

const int * const * にした方がいいよということ
705704
2018/04/27(金) 22:53:34.55ID:bqnCmOTp
いやごめん

func(int * const * )にすればコンパイル通るのか…
T * const * ==> const T * const * という変換は暗黙でokなのか
自分がバカでした
706デフォルトの名無しさん
2018/04/29(日) 14:10:11.64ID:uFYPLUkV
>>703
欠点なの?
T ** を const T ** に勝手に変換されると困るんだが。
707デフォルトの名無しさん
2018/04/29(日) 15:26:18.04ID:AQKaesvC
T * を const T * には勝手に変換するけどな
708デフォルトの名無しさん
2018/04/29(日) 15:27:57.34ID:AQKaesvC
T * を volatile T * にも
709デフォルトの名無しさん
2018/04/29(日) 16:08:44.48ID:p2Z/45DS
>>706
ちょっと興味があるので困るコードを教えて
710デフォルトの名無しさん
2018/04/29(日) 16:11:13.28ID:p2Z/45DS
>>705
慌ててたのかこのレス書き間違ってた

func(const int * const * )にすればコンパイル通る、
T ** ==> const T * const * という変換は暗黙でok、
と書きたかった(全然違うな)
711デフォルトの名無しさん
2018/04/29(日) 18:37:23.21ID:uFYPLUkV
>>709
int** ipp;
const int ci=0;
const int ** cipp;
cipp = ipp;
*cipp= &ci;
**ipp = 3;
712711
2018/04/29(日) 18:50:17.15ID:uFYPLUkV
おっと ipp の初期化忘れた
int** ipp;
const int ci=0;
const int ** cipp;
int *ip;
ipp = &ip;
cipp = ipp;
*cipp= &ci;
**ipp = 3;
713デフォルトの名無しさん
2018/04/29(日) 18:55:31.07ID:tn8JNm3m
ロベールの本に、

ios::out | ios::trunc

が意味がないと書いてあります。

既存のファイルを破棄してから書き込むということだとすると意味があるように思います。

ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。

どういう意味なのでしょうか?
714デフォルトの名無しさん
2018/04/29(日) 23:14:14.46ID:hAJLRgtx
truncate は、ファイルサイズを切り詰め・縮小する。
これは、読み書き両用時に使える機能

ファイルを読み込んで、ファイルサイズを縮小して書き込む

ファイルの書き込みでは、使えない。
書き込みでは、ファイルサイズ0で開くから、前のファイルが消える
715デフォルトの名無しさん
2018/04/30(月) 03:21:44.30ID:/NJkj9K4
>>712
なるほどね。
T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、

T * => const T *
T ** => const T * const *
...(以下略)
にはその問題が無いから許可されているわけか
716デフォルトの名無しさん
2018/05/05(土) 10:57:39.35ID:dx2uIifv
file.read((char*)buf, sizeof buf);

は buf のサイズ分だけ読み込めということだと思います。
ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか?

fstream file;
file.open("hello.txt", ios::in | ios::binary);
do {
unsigned char buf[WIDTH];
file.read((char*)buf, sizeof buf);
for (int i = 0, size = file.gcount(); i < size; ++i) {
printf("%02X ", buf[i]);
}
cout << endl;
} while (!file.eof());

file.close(); 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
717デフォルトの名無しさん
2018/05/05(土) 11:15:19.94
>>716
https://cpprefjp.github.io/reference/istream/basic_istream/read.html
718デフォルトの名無しさん
2018/05/05(土) 11:22:41.78ID:dx2uIifv
>>717

ありがとうございました。

あともう一つ質問させてください:

ロベールの本なのですが、

int n = 0x41424344;
file.write((const char*)&n, sizeof n);

というコードがあるページにあります。

その少し後ろのページには、以下のコードがあります。

char buf[BUF_SIZE];
dst.write(buf, src.gcount());

ここで、なぜ

dst.write((const char*)buf, src.gcount());

としていないのでしょうか?
719デフォルトの名無しさん
2018/05/05(土) 11:28:13.02ID:4WOSF73M
【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』   『宇宙人グレイは溶けてゼリーに』
http://2chb.net/r/liveplus/1525483483/l50
720片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 11:56:29.00ID:y1NIMmWz
>>718
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。
721デフォルトの名無しさん
2018/05/05(土) 11:58:03.35ID:dx2uIifv
すみません。もう一つ質問です。
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。

if(src.fail()) {

ではなく、

if(src.fail() && ! src.eof()) {

と書いてあります。その理由として、

「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が
真となるため、 eof メンバ関数が真になる場合は除外しておきます。」

と書いてあります。

そこで質問です。

ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、
src.fail() == true かつ src.eof() == true となります。
そのため、
src.fail() && ! src.eof() == false となってしまいます。

この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか?

それともロベールさんのコードはOKなコードなんでしょうか?
722デフォルトの名無しさん
2018/05/05(土) 11:58:46.39ID:dx2uIifv
fstream src;



char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}
723デフォルトの名無しさん
2018/05/05(土) 12:03:26.22ID:dx2uIifv
>>720

ありがとうございます。

つまりどちらもエラーにはならないということですね。

ですが、記述が統一していない理由というのは何か考えられるでしょうか?

int n = 0x41424344;
file.write((const char*)&n, sizeof n);

に const がついているのは、 n は int 型だから write に渡すときには絶対に
キャストしなければならない。(char *) でもいいが、どうせなら const もつけて
しまおうということですかね?


一方、

char buf[BUF_SIZE];
dst.write(buf, src.gcount());

の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも
ないかなという感じですかね?
724デフォルトの名無しさん
2018/05/05(土) 12:05:14.84ID:dx2uIifv
ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。
725デフォルトの名無しさん
2018/05/05(土) 12:18:38.57
>>721
>>717 再読のこと
726片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:19:01.91ID:y1NIMmWz
Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。
727デフォルトの名無しさん
2018/05/05(土) 12:23:53.42ID:LkKePK4y
winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか?
728片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:24:24.44ID:y1NIMmWz
つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。
729片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:35:42.78ID:y1NIMmWz
>>726
訂正。
× reinterpret_cast<const char *>(&n)
○ reinterpret_cast<char *>(&n)

そのCスタイルのキャストは
const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。
下手なキャストはバグのもと。キャストは最小限に。
730片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:43:36.49ID:y1NIMmWz
コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。
731片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:53:07.14ID:y1NIMmWz
file.write((const char*)&n, sizeof n);
ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、
このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。
732はちみつ餃子 ◆8X2XSCHEME
2018/05/05(土) 23:49:27.10ID:/wbyRxeL
元の趣旨がキャストについての質問だけどそれは置くとして、
そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?
733デフォルトの名無しさん
2018/05/06(日) 00:07:10.95ID:RbjPx358
そんなもんがいいと思ってる人に何言っても無駄だし
他人に強要しなけりゃそれ使ってもいいんじゃないの
734デフォルトの名無しさん
2018/05/06(日) 00:56:59.17ID:G6stHO5N
>>732
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?
735はちみつ餃子 ◆8X2XSCHEME
2018/05/06(日) 02:31:33.69ID:ATh7OHAm
繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。
こっちの手段もアリだよね? っていう別の質問。
736デフォルトの名無しさん
2018/05/09(水) 14:30:37.57ID:YgEwOBRT
競技プログラミングってやった方がいいんですか?
737 ◆QZaw55cn4c
2018/05/09(水) 16:44:52.51ID:dHqNIKDN
>>736
競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、
競プロをやりたいとは思わないなあ…
738デフォルトの名無しさん
2018/05/09(水) 17:28:08.89ID:bhGLBTeZ
ロベールの本に以下のコードがあります。
buf という配列ですが、 for 文の中で宣言されています。
PAGE_HEIGHT 回、配列 buf が作られるのでしょうか?
何か非効率的な気がします。

for (int h = 0; h < PAGE_HEIGHT; ++h) {
unsigned char buf[PAGE_WIDTH];
m_file.read((char*)buf, sizeof buf);
for (int w = 0, size = m_file.gcount(); w < size; ++w) {
printf("%02X ", buf[w]);
}
cout << endl;
}
739デフォルトの名無しさん
2018/05/09(水) 17:38:59.81ID:J0gm0Ysv
スタックポインタをずらす量が変わるだけ
これによる時間はゼロと思って良い
740デフォルトの名無しさん
2018/05/09(水) 17:44:16.81ID:bhGLBTeZ
>>739

そういうのを分かるようんなるにはどうすればいいのでしょうか?
C++の本だけ読んでいても分からないような気がします。
741デフォルトの名無しさん
2018/05/09(水) 17:45:58.33ID:J0gm0Ysv
もしパフォーマンスが問題になるなら
printfをなんとかすべき
742デフォルトの名無しさん
2018/05/09(水) 17:52:37.44ID:J0gm0Ysv
>>740
コードを書いたときに具体的にどんな処理が行われるか
を地道に学んで行くしかない

アセンブラを見てもいいし本で学んでも良いし
時間を測っても良い

C言語の方が簡単なのでC言語にある機能から
743デフォルトの名無しさん
2018/05/09(水) 18:27:14.15ID:bhGLBTeZ
>>742
ありがとうございました。
744デフォルトの名無しさん
2018/05/09(水) 19:10:47.36ID:WcTkBSWX
>>738
毎ループその buf が作られるかという質問について言えば
関数に入るときに確保された領域が毎ループ使い回されるだけ
745デフォルトの名無しさん
2018/05/09(水) 19:12:26.96ID:bhGLBTeZ
>>744
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。
746デフォルトの名無しさん
2018/05/09(水) 19:21:16.91ID:sQgpoJ7Q
コンストラクターを起こすようなクラスならアレだけど
基本型はループの外においやらている可能性が高い

まぁ使ってるコンパイラの最適化次第というのはある

文法/規格だけで解決しない自由な部分は
実際に使ってるコンパイラの吐き出すコードをみるなり
実測して違いが出るか確認いてみたり……

初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?
747デフォルトの名無しさん
2018/05/09(水) 20:03:17.36ID:bhGLBTeZ
>>746

ありがとうございました。
748デフォルトの名無しさん
2018/05/09(水) 20:03:43.32ID:tbbSaefy
>>745
C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。
CPUとメモリの動作とか簡単に学んでおくといい気がする。

スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。
749デフォルトの名無しさん
2018/05/10(木) 00:46:37.51ID:hNESkqkP
>>748
個人的には、はじめて読むシリーズがコンパクトで良かった。
はじめて読む8086
はじめて読むPentium
はじめて読むMASM
はじめて読む486
486は結構ボリュームがある
750デフォルトの名無しさん
2018/05/10(木) 12:36:43.93ID:dXwOta4y
クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y
751デフォルトの名無しさん
2018/05/10(木) 12:55:29.56ID:vDlJ/Ca2
>>750
>Mystr Mystr::operator=(Mystr &obj){

一般的にはこうする
Mystr & Mystr::operator=(Mystr &obj){
752デフォルトの名無しさん
2018/05/10(木) 13:00:33.59ID:TqAsciuR
Mystr & Mystr::operator=(const Mystr &obj);
753デフォルトの名無しさん
2018/05/10(木) 13:59:44.86ID:dXwOta4y
ありがとうございました
戻り値にも参照が使えることを知りませんでした
754デフォルトの名無しさん
2018/05/10(木) 14:05:03.21ID:vDlJ/Ca2
>>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意

ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}
755 ◆QZaw55cn4c
2018/05/10(木) 17:59:19.87ID:XVn0zvPu
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
756はちみつ餃子 ◆8X2XSCHEME
2018/05/10(木) 18:38:04.46ID:RiSXhiCD
アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。

>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486
757 ◆QZaw55cn4c
2018/05/10(木) 19:41:56.87ID:XVn0zvPu
>>756
これなんかも、動くかもしれません
http://takeda-toshiya.my.coocan.jp
758デフォルトの名無しさん
2018/05/10(木) 20:45:54.69ID:CLWEept/
アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー

と言うことがわかれば十分な気がする
759デフォルトの名無しさん
2018/05/11(金) 00:09:23.84ID:cA/jbwin
>>758
>>749
これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。
ただ、486以外は古本でしか手に入らなそうだけど。
760デフォルトの名無しさん
2018/05/11(金) 07:04:43.76
薄い本ならコミケで売れや
761デフォルトの名無しさん
2018/05/11(金) 13:11:04.97ID:Mluu9Rs0
アセンブラの前に

まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ

スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
762デフォルトの名無しさん
2018/05/11(金) 14:03:43.45ID:lM6VzEPt
>>760
http://zob.club/zob/2018/04/16/同人誌-advanced-assembler-386-上ノ巻/
763デフォルトの名無しさん
2018/05/11(金) 15:32:04.47ID:L7FGnh/N
>>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う

セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
764デフォルトの名無しさん
2018/05/11(金) 16:43:05.52ID:ArEHxDOw
Z80からはじめよう。
765デフォルトの名無しさん
2018/05/11(金) 17:23:03.14ID:fUD4+ayW
実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。

そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
766はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 17:39:10.37ID:e+Ei11A7
C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
767デフォルトの名無しさん
2018/05/11(金) 17:48:59.53ID:S57n19k4
Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ
768デフォルトの名無しさん
2018/05/11(金) 19:45:01.89ID:CPfY1M+a
龍芯3号か
769 ◆QZaw55cn4c
2018/05/11(金) 20:48:44.74ID:/s88DeTW
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問
770デフォルトの名無しさん
2018/05/11(金) 20:52:01.78ID:Mluu9Rs0
PCはPCで面白いし、
8bitは8bitで面白い
771はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 20:54:19.03ID:e+Ei11A7
AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。
772デフォルトの名無しさん
2018/05/11(金) 20:56:49.04ID:2EGPeEG9
Donald Knuth の MMIX っていう言語は勉強するとためになりますか?
773デフォルトの名無しさん
2018/05/12(土) 01:53:53.98ID:Cq1QtQw6
>>761
理解すると言っても何を勉強して理解するのか?
という話だと思ったんだけど。
アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。
774デフォルトの名無しさん
2018/05/12(土) 04:35:38.94ID:F7LxnV/h
wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。
775デフォルトの名無しさん
2018/05/12(土) 14:17:18.55ID:CbmhA0Cx
メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。

環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw
776デフォルトの名無しさん
2018/05/12(土) 14:20:15.63ID:CbmhA0Cx
>>772
ならないと思う。
クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。
777デフォルトの名無しさん
2018/05/12(土) 15:41:16.04ID:9vavBtpK
RISC-Vの方がまだ有用な可能性が
778デフォルトの名無しさん
2018/05/23(水) 19:24:44.84ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

AA6VB
779デフォルトの名無しさん
2018/05/24(木) 10:45:43.84ID:cPlRxlDn
AA6VB
780 ◆QZaw55cn4c
2018/05/24(木) 20:42:22.15ID:dCOL2CYR
>>775
たしかに、そこをつく本を書けば売れるかもしれない
そんな本に書くべきことは、他に何があるだろうか?
・qsort() の説明
・アセンブリ言語とのリンク
・PEフォーマット
…etc
781はちみつ餃子 ◆8X2XSCHEME
2018/05/24(木) 21:49:22.52ID:jqqWnK8Z
>>775,780
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。
782デフォルトの名無しさん
2018/05/24(木) 22:04:43.75ID:hqF4m+Xg
シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)
783デフォルトの名無しさん
2018/05/24(木) 23:04:39.55ID:agu/wXZc
浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ
784デフォルトの名無しさん
2018/05/25(金) 06:31:49.05ID:ZdzP9wu5
コンパイルとリンクとロードの話とか。

ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。
785デフォルトの名無しさん
2018/05/31(木) 19:40:53.15ID:xDJZQ821
ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか?
786デフォルトの名無しさん
2018/05/31(木) 19:48:19.66ID:DFMmAXw3
しねばいいのに
787 ◆QZaw55cn4c
2018/05/31(木) 20:29:52.32ID:4k9lsrlf
>>781
二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…
788 ◆QZaw55cn4c
2018/05/31(木) 20:30:39.27ID:4k9lsrlf
>>785
Mac はお高いからな…
789デフォルトの名無しさん
2018/05/31(木) 22:34:17.78ID:Dy3hGHo2
>>785
17"でお手頃価格なWindowsなNoteが他に無くてね
HPとかDELLだと2.5kgとか
790デフォルトの名無しさん
2018/05/31(木) 22:37:50.13ID:xDJZQ821
>>788-789

ありがとうございます。

>>789

使い勝手がいいとかそういうことはないですか?
791デフォルトの名無しさん
2018/05/31(木) 22:42:46.81ID:Dy3hGHo2
当時は無かったな。
MSのセミナーとかもmac+windows多かったよ
792デフォルトの名無しさん
2018/06/02(土) 18:09:00.04ID:YEAzW6Zk
ヘッダーファイルについて質問なのです。
ヘッダーファイル内で、 ostream というのを使っているのですが、
#include <iostream>をヘッダーファイル内に記述していません。
エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。

これはどういうからくりでしょうか?
793デフォルトの名無しさん
2018/06/02(土) 18:23:14.65ID:tlq/OxaF
ヘッダファイルの中じゃなくostreamを使っている翻訳単位(cppファイル)の中で最低1回include iostreamされてればOK
794はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 18:25:58.96ID:LSJtd55X
>>792
他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。
795デフォルトの名無しさん
2018/06/02(土) 18:30:00.66ID:YEAzW6Zk
>>793

ありがとうございました。

↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。
フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して
作っただけです。

Vec.h
http://codepad.org/3ROYH1yq

Vec.cpp
http://codepad.org/f3eSheBS
796デフォルトの名無しさん
2018/06/02(土) 18:30:45.89ID:YEAzW6Zk
>>794

ありがとうございました。

もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか?
797デフォルトの名無しさん
2018/06/02(土) 18:34:39.57ID:YEAzW6Zk
>>795

ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、
自分で分けたのですが、エラーになってしまいました。
798デフォルトの名無しさん
2018/06/02(土) 18:46:23.02ID:RQ4rJlvL
定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。
799デフォルトの名無しさん
2018/06/02(土) 18:50:06.69ID:YEAzW6Zk
>>798

Vec.h
http://codepad.org/3ROYH1yq

上のVec.hの最初の方の

#include <iostream>
#include <cassert>

削除してもビルドエラーが出ません。
プロジェクトにはVec.hしかない状態でビルドしました。
800はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 18:55:56.26ID:LSJtd55X
>>799
テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。
だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。
801デフォルトの名無しさん
2018/06/02(土) 19:00:50.14ID:YEAzW6Zk
>>800
ありがとうございました。

あともう一つ質問なのですが、ロベールの本に、

「関数を実体化するには呼び出したところからその実装が見える必要があります。」

「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要があるのです。」

と書いてあります。

クラステンプレートについては同様の記述がないのですが、

クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要がありますか?
802デフォルトの名無しさん
2018/06/02(土) 19:00:59.43ID:uqsytqRM
>>795
このへんの問題かな?
https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
803はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 19:06:46.84ID:LSJtd55X
>>801
Yes。 テンプレートはヘッダファイルに書く必要がある。
同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、
最終的な実行ファイルに複数の実体があったりはしない。
804デフォルトの名無しさん
2018/06/02(土) 19:21:25.63ID:YEAzW6Zk
>>802

ありがとうございました。

ちょっと理解できないと思うので、あきらめて

http://codepad.org/ABfo8I3a

としたところビルドできました。

ありがとうございました。
805デフォルトの名無しさん
2018/06/02(土) 19:22:03.75ID:YEAzW6Zk
>>803

ありがとうございました。
806デフォルトの名無しさん
2018/06/03(日) 17:10:25.43ID:XweloLai
ヘッダファイルについて質問です。

assert() が使いたいため、「List2.h」内に、以下のように書いたとします。

#pragma once
#include "List.h"
#include <cassert>

実は、「List.h」内にも#include <cassert>が書いてあります。

ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて
問題はないと思います。

そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、
必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす
いのではないかと思いました。

既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか?

それとも、既にインクルードされていることに気付いている場合には、できるだけ
#include <> は書かないほうがいいのでしょうか?
807 ◆QZaw55cn4c
2018/06/03(日) 17:20:14.25ID:5RsKIUxf
>>806
すでにインクルードされているかどうかは書いているときにはわからない、から書いとく

ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った

しかしテンプレート関数に assert() が入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない…
808デフォルトの名無しさん
2018/06/03(日) 17:34:16.61ID:XweloLai
>>807

ありがとうございます。

>ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
>ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った

ここのところがよく理解できないのですが、

List.h にテンプレートクラス List<T> が書いてあって、
List2.h には List<T> を継承したクラス List2<T> が書いてあります。

そして、List.h, List2.h の両方で assert() を使っています。
809 ◆QZaw55cn4c
2018/06/03(日) 17:36:57.15ID:5RsKIUxf
>>808
うんうん、なるほど
テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです
810デフォルトの名無しさん
2018/06/03(日) 17:47:06.72ID:XweloLai
>>809

ありがとうございました。

また質問で申し訳ないのですが、今度は、全く違う質問になります。

一方向リスト用のセルである Cell<T> というクラスを作りました。
Cell<T> のメンバ変数は、

T data
Cell<T> *next

です。

List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、
リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。

List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。

オブジェクト指向プログラミングでは再利用が重要ということなので、
新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。
Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。

List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、
List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に
したいです。

そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる
メンバ関数については、オーバーライドしたいです。

上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか?
可能だとして、こういうやり方は非推奨でしょうか?
811デフォルトの名無しさん
2018/06/03(日) 20:55:43.49ID:E53R3BDh
一方向・双方向リストの、ソースコードを見た方が速い

繰り返しを表す、C++ iterator みたいな、
抽象クラス・インターフェースでも使っているのだろう
812デフォルトの名無しさん
2018/06/04(月) 08:19:48.74ID:DAGyu3MW
再利用など考えず
一から好きなように双方向リストを作れ

>オブジェクト指向プログラミングでは再利用が重要

は幻想

この場合で言ったらまったく逆で
もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが
一方向リストを継承して双方向リストにするなどイカれてる
813デフォルトの名無しさん
2018/06/04(月) 09:50:25.37ID:3BCLNr2e
>>810
一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?
814はちみつ餃子 ◆8X2XSCHEME
2018/06/04(月) 13:04:55.31ID:zKvF3SpI
どうだろう。
総合的な判断が必要という前提はあるけども、
継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。
XはYの一種であると言えるときはXはYを継承していい。
双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。

ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。

練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、
共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。

クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、
将来的にコンセプトが入ったらそっちが主流になるかもしれん。
815デフォルトの名無しさん
2018/06/04(月) 13:18:55.79ID:K9p9OoRg
>>812
もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる
これはダメなん?継承は機能追加ダメなん?
816デフォルトの名無しさん
2018/06/04(月) 13:19:07.80ID:e7JLMPXe
>>811

ありがとうございました。

>>812

本を見ると再利用が重要と強調されているので、拘ってしまいました。
ありがとうございました。

>>813

ありがとうございました。
817デフォルトの名無しさん
2018/06/04(月) 13:20:24.25ID:e7JLMPXe
>>814

ありがとうございました。
818デフォルトの名無しさん
2018/06/04(月) 13:43:52.15ID:3BCLNr2e
>>815
>>812はだいぶイカれてるから触らないで
819デフォルトの名無しさん
2018/06/04(月) 14:30:56.26ID:YRbUwbvV
>>810
単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる
派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても
単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない
結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない
もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ
あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ
厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな

単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ
is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ
例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね
820デフォルトの名無しさん
2018/06/04(月) 16:46:27.38ID:OAwYb5Pt
自分の勉強用だったら、継承した双方向リストクラス作ってみて
「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う
よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど
プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから
将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい
821 ◆QZaw55cn4c
2018/06/04(月) 19:05:36.84ID:gbEnuF2j
キーワード「継承」もずいぶんと評価が落ちたものですねえ…
822はちみつ餃子 ◆8X2XSCHEME
2018/06/05(火) 02:58:20.15ID:l2agtc6/
C++ からクラスが無くなることは無いだろうが、
構成の仕方の流行はだいぶん変わってて、
コンセプトが入ったら一気に再編されるかもしれない。

クラスの継承ってそんなに万能じゃないよ。
823デフォルトの名無しさん
2018/06/06(水) 12:11:26.28ID:ucySJasT
ま、そういうことです
単方向リストを継承して双方向リストにするのは悪手
やってみるまでもなくわかるだろJK
結局ほぼすべてのメソッドを上書きしないといけないから意味ない
しかも一から双方向リストを書いた方が分かりやすいし速い
824デフォルトの名無しさん
2018/06/06(水) 12:24:14.11ID:ucySJasT
この場合、どうしても手抜きしたかったら
大は小を兼ねるの考えで、双方向リストのみを作って
単方向リストを使う場面でも双方向リストを使えばよい
それがベストだろうというアンサーがちらついてるからこそ、余計に
単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ
余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
単方向リストなどその程度の扱い、必要ない
825デフォルトの名無しさん
2018/06/06(水) 15:11:28.97ID:5kytDI4t
>>824
>余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
std::forward_list など無かった
826デフォルトの名無しさん
2018/06/06(水) 18:07:41.59ID:9YbuVUhL
>>824
いやあ、単方向リストはそれはそれで使い道はあると思うよ
大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど
挿入操作を多用するならstd::listやstd::forward_listの方が良いよね
std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし
イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね

必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな
まあ、std::mapやstd::setは使うのを躊躇するけどな
O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる
他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする
827デフォルトの名無しさん
2018/06/06(水) 19:32:54.16ID:ucySJasT
言葉が足りなくて申し訳ない
俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから
汎用のテンプレートのリンクリストを使ったためしがない
一方向リストなら、なおのこと使わない
828デフォルトの名無しさん
2018/06/06(水) 20:16:30.41ID:rNkLMN6z
単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。
ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。
829デフォルトの名無しさん
2018/06/06(水) 20:30:07.38ID:sZLPzbQ0
STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな?
830デフォルトの名無しさん
2018/06/06(水) 20:32:29.81ID:sZLPzbQ0
>>826
O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?
831デフォルトの名無しさん
2018/06/06(水) 20:34:19.38ID:sZLPzbQ0
もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。
832デフォルトの名無しさん
2018/06/06(水) 21:03:14.93ID:9YbuVUhL
>>827
std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ
イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど
std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない
単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね

まあ、再利用も良し悪しって事だね
833デフォルトの名無しさん
2018/06/06(水) 21:09:23.87ID:9YbuVUhL
>>830
ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね
Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから
最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね
834デフォルトの名無しさん
2018/06/09(土) 00:34:24.48ID:l0w/1aK3
std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください
arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、
empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。
つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない
気がするのですが、このメソッドは意味があるのでしょうか?
835デフォルトの名無しさん
2018/06/09(土) 05:56:11.66ID:nuHHgQUg
>>834
テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。
836デフォルトの名無しさん
2018/06/09(土) 12:31:35.52ID:pc7gEgF8
>>834
そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね
他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで
コンテナとして共通の要件(インターフェイス)が設けられている
例えば、size()、empty()、begin()、end()など

本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど
vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ
まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね
余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね
837はちみつ餃子 ◆8X2XSCHEME
2018/06/09(土) 12:50:19.63ID:EdmRUNh7
具体的にコンテナに求められる要求はここでまとめられているので参考になれば。
http://ja.cppreference.com/w/cpp/concept/Container

クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、
なかなか仕様に入らずに先送りされてるという状況。
838デフォルトの名無しさん
2018/06/11(月) 16:42:05.03ID:SE5SjeC/
ファイルから読み込んだバイト列の先頭部分を参照して、
それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、
どの程度の判定をすればよいものなのでしょうか。
例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。
839デフォルトの名無しさん
2018/06/11(月) 16:50:15.52ID:9mmiVsnm
十分かどうかは時と場合による
840放置された蟻人間 ◆T6xkBnTXz7B0
2018/06/11(月) 16:51:12.74ID:7op9QnGW
画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、
処理スピードを優先するなら、memcmpで十分。
841デフォルトの名無しさん
2018/06/11(月) 17:03:57.96ID:SE5SjeC/
すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、
他の形式の正常なファイルも拾ってしまわないかということです。
JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。
842デフォルトの名無しさん
2018/06/11(月) 17:06:17.81ID:3AghcpDH
中身見ないなら、拡張子でもできそうだが
843デフォルトの名無しさん
2018/06/11(月) 17:12:32.50ID:oqoWhxjw
3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する
ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが
844はちみつ餃子 ◆8X2XSCHEME
2018/06/11(月) 17:40:03.88ID:CXPnR3I1
>>841
POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。
参考になるとは思うから読んでみるのもいいんじゃない?
ライセンス的に OK ならそのまま流用してもいいかも。

どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。
例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、
先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。

ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、
許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。
845デフォルトの名無しさん
2018/06/12(火) 12:54:07.45ID:xDeIiE2o
なぜ多数から探すかどうかで判定方法が変わるのか
846はちみつ餃子 ◆8X2XSCHEME
2018/06/12(火) 13:09:55.18ID:U9ShKAeR
>>845
速度とかとのバランスだって書いてあるつもりだけど、わかり難かった?
847デフォルトの名無しさん
2018/06/12(火) 13:15:57.78ID:BvPEMwcC
明らかに一致しない時は瞬時に判断出来る
ヘッダですぐにわかるので


jpgではあるんだけど
非対応フォーマットとか一部化けてて表示出来ないとか
そういう判断が難しい
848デフォルトの名無しさん
2018/06/12(火) 13:34:24.68ID:BvPEMwcC
はちみつはJPGを扱ったことが無いってのがよく分かる
849はちみつ餃子 ◆8X2XSCHEME
2018/06/12(火) 14:45:14.29ID:U9ShKAeR
>>847
えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。
850デフォルトの名無しさん
2018/06/12(火) 16:23:32.57ID:LTqXdgcV
元の >>838 の質問に戻れば「どんなファイル群を扱うのかによる」としか
言いようがないんじゃないか?

極端な話、行儀の良いファイルだけなら拡張子で判定しても大丈夫。
(拡張子が間違ってるけど)一般的なファイルばかりなら先頭の何バイトかで判定。

悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば
JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。
851はちみつ餃子 ◆8X2XSCHEME
2018/06/12(火) 16:44:07.95ID:U9ShKAeR
ある程度は信じて割り切るしかしょうがない。
852デフォルトの名無しさん
2018/06/12(火) 17:43:08.97ID:RH6dhGDk
JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ
実運用上はJFIFとEXIF以外は対象外でも良いのかも
853デフォルトの名無しさん
2018/06/12(火) 17:56:59.93
ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね?
854はちみつ餃子 ◆8X2XSCHEME
2018/06/12(火) 18:20:08.25ID:U9ShKAeR
>>853
Yes

それが仮想関数であろうとも、
オブジェクトへのアクセスがポインタ経由でないならば
どの関数を呼び出すのかコンパイル時に確定可能なので、
仮想関数テーブルにアクセスする必要はない。

(はずだと思うが言語仕様での保証はないだろうし、
実態がどうなってるか確かめたことはないんで、
誰かやってみてくれんかな。)
855デフォルトの名無しさん
2018/06/12(火) 18:35:01.32ID:Q/HiJGFf
>>849
ファイル判別の一般論じゃなくてjpgの判別ですよ
jpgの判別方法を語ればいいんです

文字コードと違ってあやしいとかはなくて
APPnの中数バイト見れば簡単にわかるんですよ
文字でJFIFとかExifとか書いてあるわけなんで

偽装が無いならこれで十分

あとは
対応フォーマットであるのか
正しいフォーマットであるのか
実際にデコード出来るのかどうか
などを判別する必要があるかどうかでその先が決まる
856デフォルトの名無しさん
2018/06/12(火) 18:43:20.13ID:RH6dhGDk
>>855
baka?
857デフォルトの名無しさん
2018/06/12(火) 18:57:45.80
>>854
ありがとうございます
858はちみつ餃子 ◆8X2XSCHEME
2018/06/12(火) 20:19:36.50ID:U9ShKAeR
>>855
何言ってんの?
その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。
859デフォルトの名無しさん
2018/06/13(水) 00:32:03.88ID:21BMiWPP
>>841を読んでの発言?
日本語が読めないの?
860はちみつ餃子 ◆8X2XSCHEME
2018/06/13(水) 01:55:04.01ID:3eXA0K0W
>>859
なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈?

判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、
質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。
861デフォルトの名無しさん
2018/06/13(水) 01:56:34.26ID:l7UBIPff
>>855
JPEGの規格書を読んだ事が無いだろう
862デフォルトの名無しさん
2018/06/13(水) 07:50:57.05ID:vaxyQxvX
昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。
863デフォルトの名無しさん
2018/06/13(水) 08:14:06.81ID:7lldK1Da
>>838 >>841 を合わせた質問の意図からすると、
JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、
普通に出回ってるか? という問題じゃないのかな。
864デフォルトの名無しさん
2018/06/13(水) 09:42:34.58ID:V88S+L9t
ゲロトラップとして普通に出回ってないかね?
865デフォルトの名無しさん
2018/06/13(水) 09:46:09.42ID:Lf/dU7gs
テンポラリオブジェクトについて質問です。

ロベールの本ですが、


Hoge Two() {
Hoge n(2);
return n;
}

int main() {
Hoge hoge(1);
hoge = Two();

とした場合、基本的には n のコピーがいったん作られて、それが hoge に
代入される形になります。このコピーこそが、テンポラリオブジェクトになる
わけです。


と書かれていますが、なぜわざわざ n のコピーを作るのでしょうか?
n は Two() 関数を抜けたら消えてしまいますが、これを消さずに、
返した方が効率的な気がします。
866デフォルトの名無しさん
2018/06/13(水) 10:17:19.41ID:Lf/dU7gs
・テンポラリオブジェクト = n のコピー
・代入により、 hoge に テンポラリオブジェクトがコピーされる。

これはなんか非常に無駄なことをやっているように思ってしまいます。

hoge に 捨てずにとっておいた n を参照させれば十分のように思います。
867838
2018/06/13(水) 10:17:36.81ID:818/kKId
みなさんありがとうございます。
話が難しい方向に進んでしまってすいません。
勉強させていただきます。

元々の疑問は>>863の言われるとおりで、
他の形式の画像をJPEGだと誤判定してしまわないか、
さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、
JPEGファイルを見逃してしまうことがあるのか、ということでした。
868デフォルトの名無しさん
2018/06/13(水) 14:58:14.75ID:54SDWBzN
>>865-866
そういう時こそ右辺値参照ですよ

hoge = std::move(Two());

でもこんな事をしなくても大抵戻り値最適化(RVOやNRVO)でコピーコンストラクタは呼び出されない
明示的にムーブコンストラクタを無効にするとコンパイルエラーが発生するはず

Hoge(Hoge&&) = delete;
869デフォルトの名無しさん
2018/06/13(水) 14:59:33.86ID:54SDWBzN
そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる

Hoge& operator=(const Hoge& hoge) {
  std::cout << "assign operator called." << std::endl;
return *this;
}
870デフォルトの名無しさん
2018/06/13(水) 20:08:20.11ID:VLQaO2hj
(最適化をおいとくと)値渡し/値返しってそういうもんじゃん
Two()内の変数nは自動変数だからスタックに作られる
とっとけないじゃん
871デフォルトの名無しさん
2018/06/13(水) 21:00:21.79ID:qH/FTczC
まあ2回コピーされるのを1回に抑えるための最適化でしょう
872デフォルトの名無しさん
2018/06/13(水) 21:08:53.19ID:buJbRccy
確実なのは戻り値じゃなくて参照、もしくはポインタにすること
873デフォルトの名無しさん
2018/06/13(水) 21:40:28.10ID:GheUJm4W
>>872
それヤバくね?関数を抜けた途端消える存在を参照するとか
874デフォルトの名無しさん
2018/06/13(水) 22:09:20.49ID:1EWuco5t
呼び出し元から参照を渡してそこに返してもらえってことじゃなくて?
875デフォルトの名無しさん
2018/06/13(水) 22:13:11.63ID:21BMiWPP
もちろんそう
昔ながらの方法
876デフォルトの名無しさん
2018/06/13(水) 23:23:40.79ID:MDGDBDRC
-Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな
877デフォルトの名無しさん
2018/06/14(木) 10:53:47.52ID:BKSAN5oR
普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。
SqlConnectionやDataSetのDispose()がインテリセンスでは候補に上がるのに、コンパイルで「メンバーではありません」とエラーになります。
スコープを抜けると破棄されるので何もしなくてよいという認識でよいのでしょうか?
また、この理屈で、c#の勝手に破棄してくれるusing相当の機能はない、と言うか、必要ないのでしょうか?
878デフォルトの名無しさん
2018/06/14(木) 14:30:10.48ID:Lgo9GPo1
>>877
IDisposable使ってる?
スコープ抜けてもGCによって回収されるタイミングは保証できない
どうしてもすぐにGCしたいなら

GC.Collect();

をする。

多分ジェネレーション0だろうから

GC.Collect(0);

でいいのでは
879デフォルトの名無しさん
2018/06/14(木) 15:24:59.55ID:BKSAN5oR
>>878
レスをござます。
作ってるクラスがIDisposableを継承しないとダメってことですか?
作ってるのはインスタンス作らなくてもいいstaticクラスなんですけど。

GCは効果の程を確認できないですが、やってみます。
880デフォルトの名無しさん
2018/06/14(木) 15:25:54.47ID:BKSAN5oR
>>879
レスありがとうございます。です。
881デフォルトの名無しさん
2018/06/14(木) 16:42:09.02ID:79UoYXtL
>>879
https://qiita.com/haniwo820/items/ba0ab725c25673c20338
こんなのとか

staticクラスだとファイナライザーを書けないから内部で他のクラスをnewした場合が問題
それとメンバ変数もstaticでなければならない
となると普通はアプリケーションが破棄されるまで残る

IDisposableをstaticクラスが継承するとエラーになる
というかstaticクラスはインターフェイスを継承できない
むしろusingを使えない理由が分からない

http://ufcpp.net/study/csharp/oo_dispose.html

こういうのだとstaticクラス風にファイナライザーを走らせられる

それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい
SqlConnectionやDataSetはいちいちClose()する必要があるのかな?
882デフォルトの名無しさん
2018/06/14(木) 22:51:20.07ID:khTKmU6v
>>877
ここの記述を信じるなら、全部Yesってことになるのかな。
http://mag.autumn.org/Content.modf?id=20050506023118
883デフォルトの名無しさん
2018/06/15(金) 09:10:59.15ID:8YDR1CpT
>>879 です。
VS2013 c++のCLRコンソールアプリを新規作成したやつです。

include "stdafx.h"

using namespace System;
using namespace System::Data;
using namespace System::Data::SqlClient;

int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");

String ^constr = "xxxxx";
SqlConnection ^connection = gcnew SqlConnection(constr);

connection->Open();

connection->Close();
connection->Dispose();

return 0;
}
この Disposeでエラーになります。
ここには書いてませんがDataSetも
Disposeでエラーになります。

上記コードの場合 Dispose抜きで問題ないのでしょうか?

>>882
まさにこれを読みました。c#のusingがc++にはない認識です。
この理由がこの通りならDisposeなしで心配ないのですが。
884デフォルトの名無しさん
2018/06/15(金) 10:38:59.49ID:uIGrLsPa
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
http://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://www.sketchapp.com/
http://photoshopvip.net/103903
https://goodpatch.com/blog/sketch-plugins/

Trello Chrome拡張機能プラグイン集
https://chrome.google.com/webstore/search/trello?_category=extensions

Slackプラグイン集
https://slack.com/apps

Sketchプラグイン集
https://sketchapp.com/extensions/plugins/
https://supernova.studio/
885デフォルトの名無しさん
2018/06/15(金) 19:01:40.09ID:J8URhrRM
>>882によると、自動でDisposeさせたい場合は以下のようにする、
と書いてあるように見える。(手元に環境がないので未確認)

SqlConnection connection(constr);
connection.Open();
connection.Close();
886デフォルトの名無しさん
2018/06/16(土) 06:42:53.11ID:PCTFj+qN
>>883
そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。
C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。
C#のusing相当のことをしたい場合は>>885
詳細は↓を参照。
https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55
887デフォルトの名無しさん
2018/06/18(月) 12:02:02.44ID:P1toAgew
Dispose の件で質問してた者です。
自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。
不慣れで詰まらない質問してしまってすみませんでした。
888865
2018/06/20(水) 12:43:56.50ID:XX+H87IB
みなさん、いろいろありがとうございました。
参考にさせていただきます。

ところで、

Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか
角川 裕次
https://www.amazon.co.jp/dp/4627848315/

この本を読んだ人はいますか?

かなり自分にとって理想的な本のようですので、買ってみようと思います。
こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。
889デフォルトの名無しさん
2018/06/22(金) 23:22:38.51ID:pTq2TJuj
あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている
つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで
890 ◆QZaw55cn4c
2018/06/23(土) 00:11:02.67ID:OlLfOCSW
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。

C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:

- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)

- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
891デフォルトの名無しさん
2018/06/23(土) 10:31:52.34ID:UiVIxiJp
抽象化とコード(バイナリ)の質は相反するものだから
892デフォルトの名無しさん
2018/06/23(土) 11:45:24.39ID:NcXYPjUn
alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか?
893デフォルトの名無しさん
2018/06/23(土) 12:58:59.14ID:g5s8p4AT
リーナスのそれがいっちばん有名なC++批判よね
894 ◆QZaw55cn4c
2018/06/23(土) 13:53:36.35ID:OlLfOCSW
>>893
linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね
これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました…
895デフォルトの名無しさん
2018/06/23(土) 14:43:13.01ID:DOoRmJ6H
抽象的な思考ができる人とそうでない人が居るというだけだな
>>890もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが
896デフォルトの名無しさん
2018/06/23(土) 14:54:08.05ID:UiVIxiJp
抽象化が目的になって
パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い

ってのが問題であって
言語自体には罪はない
897 ◆QZaw55cn4c
2018/06/23(土) 15:32:24.63ID:OlLfOCSW
>>895
>良い抽象モデル
が役に立つとは限らないのでは?
抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは?
あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか?
898デフォルトの名無しさん
2018/06/23(土) 16:46:26.83ID:8e5n022B
デザインパターンって廃れたんですか?

だとすると、なぜ、デザインパターンは流行り、そして廃れたのでしょうか?

一度は流行ったということは確かに役に立つものだったのではないでしょうか?

一度は役に立つと認められたものがなぜ、否定されたのでしょうか?
899デフォルトの名無しさん
2018/06/23(土) 16:51:17.93ID:7hlQnbj9
日本人は基本すっ飛ばして銀の弾丸欲しがるからな
900はちみつ餃子 ◆8X2XSCHEME
2018/06/23(土) 17:00:49.94ID:/E9OfcV+
>>898
デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。
基礎として押さえておくと便利だし、価値が失われたわけではないけど、
何もかもが既存のパターンに当てはまるわけではないという当たり前の話。
901デフォルトの名無しさん
2018/06/23(土) 17:15:09.64ID:DOoRmJ6H
>>897
抽象化とYAGNIは関係ありません
こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね
902デフォルトの名無しさん
2018/06/23(土) 17:29:02.45ID:ul2D0Jgq
>>898
別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。
903 ◆QZaw55cn4c
2018/06/23(土) 17:30:40.89ID:OlLfOCSW
>>901
たとえば、iostream をどう思う?これは良い抽象化の例ですか?
904デフォルトの名無しさん
2018/06/23(土) 17:31:54.13ID:wjw7dXXk
Visual C++6.0です。 Windows7でやってます。
ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので
押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか

また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが
もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています
最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです
905デフォルトの名無しさん
2018/06/23(土) 17:40:24.88ID:LiutUffZ
>>904
OwnerDraw
906デフォルトの名無しさん
2018/06/23(土) 17:59:38.49ID:wjw7dXXk
>>905
CToolbarには、DrawItemがないようなのですが
ステータスバーにはあります
907デフォルトの名無しさん
2018/06/23(土) 18:04:15.08ID:LiutUffZ
ナンシークラッツ本を探した方が良いかな
908デフォルトの名無しさん
2018/06/23(土) 18:14:04.63ID:wjw7dXXk
ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね
最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど
909デフォルトの名無しさん
2018/06/23(土) 19:24:24.28ID:8e5n022B
2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。

ノードは以下のクラスです:

template <typename T> class BinNode {
private:
T data;
BinNode<T> *left, *right;
BinNode(T d, BinNode<T> *l = NULL, BinNode<T> *r = NULL);
friend class BinarySearchTree;
};


2分探索木のクラス BinarySearchTree 内のメンバ関数 insert の引数としてノードを渡すのですが、
なぜ、

BinNode<int>* tree

ではなく

BinNode<int>*& tree

となっているのかが分かりません。本の説明によると、木構造の変形を可能にするためにそうしているとのことです。

bool BinarySearchTree::insert(int data, BinNode<int>*& tree) {

}
910デフォルトの名無しさん
2018/06/23(土) 19:25:19.09ID:8e5n022B
>>899
>>900
>>902

ありがとうございました。

一時は、もてはやされすぎたということですね。
911デフォルトの名無しさん
2018/06/23(土) 19:28:47.13ID:8e5n022B
insert 内に、

if (tree == NULL) {
912デフォルトの名無しさん
2018/06/23(土) 19:29:33.57ID:8e5n022B
insert 内に、

if (tree == NULL) {
tree = new BinNode<int>(data);

}

というコードがありましたが、これのことでしょうか?
913デフォルトの名無しさん
2018/06/23(土) 19:30:15.04ID:8e5n022B
>>912

あ、そのようですね。
914放置された蟻人間 ◆T6xkBnTXz7B0
2018/06/23(土) 19:30:26.05ID:QXtVRpnb
>>909
void f(int *a) {
static int s_i = 0;
a = &s_i;
}
int main(void) {
int i = 3;
int *p = &i;
f(p);
printf("%d\n", *p);
return 0;
}
915デフォルトの名無しさん
2018/06/23(土) 19:45:59.33ID:8e5n022B
>>914

ありがとうございました。

3のままですね。
916 ◆QZaw55cn4c
2018/06/23(土) 19:54:24.54ID:OlLfOCSW
>>909
これは C の課題ですね。
適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、
C ならば add_node(node **root, ...) と書きます。@
これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A
@とAとではプログラムの表現もかわります。

これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。
917デフォルトの名無しさん
2018/06/23(土) 21:09:04.41ID:nmsTY6vF
0,115200
1,38400
2,19200
3,9600

こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが
検索を使わずに38400からダイレクトに1を求める方法はないだろうか?
918デフォルトの名無しさん
2018/06/23(土) 21:22:36.64ID:b0QIE6qX
115200個の配列
919デフォルトの名無しさん
2018/06/23(土) 21:26:12.81ID:EyvIrgyz
A/9600 を添え字にして13個の配列で逆引き作る?
920デフォルトの名無しさん
2018/06/23(土) 21:29:09.89ID:b0QIE6qX
9600の倍数であることがわかってるなら割ればテーブルは減る

でも4個なら素直に検索した方が速い
921デフォルトの名無しさん
2018/06/23(土) 21:41:29.91ID:EyvIrgyz
検索については同意
元質問は検索使うなって条件なので、まぁ

数値からRS232Cのボーレート設定を想定しちゃうけど、
それなら検索を嫌うようなもんでもないし… な…
922デフォルトの名無しさん
2018/06/23(土) 22:02:58.56ID:ZZklpiyn
a1 : b1
a2 : b2

a から、b への辞書と、
b から、a への辞書の、両方を作る
923デフォルトの名無しさん
2018/06/23(土) 22:07:27.68ID:V32XRqjB
>>920>>919を見る前に書いた
たまたま同じ発想になっただけ

浮動小数数に直すってのもある
LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う
115200は(900, 7)
38400は(300, 7)
19200は(300, 6)
9600は(300, 5)

RS-232Cだと300x2^nと900x2^nしか普通は使わないから

オーディオのサンプリング周波数にも同じような方法が使える
924デフォルトの名無しさん
2018/06/23(土) 22:09:33.77ID:5Wb6fwhK
n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600);
入力を検証する手間を考えたらテーブル逆引きと大差ないけど
925デフォルトの名無しさん
2018/06/23(土) 22:19:10.79ID:V32XRqjB
>>924
メモリアクセス速度を考えても>>918の方が速くて簡単

>>923
なんかおかしかった

115200は(225, 9)
38400は(75, 9)
19200は(75, 8)
9600は(75, 7)

ビットスキャン命令とシフトとテーブル
変換しなきゃならないデータが多量にあって
パフォーマンスが非常に重要ならこれを使うかな
926デフォルトの名無しさん
2018/06/23(土) 22:21:03.20ID:V32XRqjB
普通はこんなものはリニア検索でいい
927デフォルトの名無しさん
2018/06/23(土) 23:23:08.99ID:ZZklpiyn
普通、最適化でも、8個までは線形(全)探索・if 文

それ以上で、ジャンプテーブル・switch-case
928デフォルトの名無しさん
2018/06/23(土) 23:47:49.24ID:UiVIxiJp
>>927
ただのテーブル逆変換だぞ
なんでジャンプテーブル?
なんでswitch case?

リニア検索で問題なら2分検索
それでも遅ければハッシュその他のテーブル
簡単な演算を併用出来るものはする
じゃないか普通
929927
2018/06/24(日) 00:50:44.41ID:chBT6m1a
コンパイラの最適化について書いた

if 文を8個以上書くと、ジャンプテーブルに変換されるってこと
930デフォルトの名無しさん
2018/06/24(日) 08:15:02.59ID:cbD8du/l
>>916

ありがとうございました。
931デフォルトの名無しさん
2018/06/24(日) 10:44:32.50ID:8StK2ZXu
class clsAにconst member 変数を登録したいのだけどうまくいかない。
クラスコンストラクタでconst char *mes[] を{"abc","def"}のように
初期化するにはどうやるの?
932デフォルトの名無しさん
2018/06/24(日) 10:57:11.49ID:8StK2ZXu
//そもそもC++は文字列の配列を扱うことができるのか?

constexpr auto str1 = {"abc", "def"};
これがエラーするんだがなんでなの?
933デフォルトの名無しさん
2018/06/24(日) 11:00:18.70ID:8StK2ZXu
constexpr string[] str1 = {"abc", "def"}; コンパイルエラー
constexpr string str1[] = {"abc", "def"}; コンパイルエラー
クッ、、、どうしてもうごかない。
934デフォルトの名無しさん
2018/06/24(日) 11:15:54.16ID:8StK2ZXu
string str1 = "abc"; //OK
vector<int> dat(100,3); //ok

vector<string> str2("aaa",4); //error
こういうのもうごかない。
935デフォルトの名無しさん
2018/06/24(日) 11:23:27.77ID:8StK2ZXu
自分としてはストリングを多用するのでストリング配列が使えないと厳しい。
検索をしても例がなかなか出てこないので、Effectiv Modern C++という本
をamazonで買ってみたんだが、届いたので今見ているところだが、ここでも
string配列の記述を巧みに避けている。皆目出てこない。

string配列の扱い方ってどうやるの?
936デフォルトの名無しさん
2018/06/24(日) 11:52:20.14ID:/GbiIoLW
文字配列って良く分からないけど、Javaみたいに一文字だったりして?
{"a","b","c","d","e","f","g"}みたいな?
937はちみつ餃子 ◆8X2XSCHEME
2018/06/24(日) 12:32:00.67ID:StWe8jKY
>>932
定数式じゃないから。

>>933
string は constexpr に非対応のはず。 現時点では。
new が constexpr 的に扱いが難しいので、
内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。
ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。

>>934
string に一文字づつ入れたいってこと?
std::vector<std::string> str2 = {"a", "a", "a"};
でいけるよ。
938デフォルトの名無しさん
2018/06/24(日) 12:35:35.92ID:QFRKHUIu
["abc","def"];
939デフォルトの名無しさん
2018/06/24(日) 12:36:44.62ID:p8F2e5jx
>>934
>vector<string> str2("aaa",4); //error
「vector<string> str2(4,"aaa");」の誤りじゃね?
940デフォルトの名無しさん
2018/06/24(日) 13:13:44.88ID:8StK2ZXu
string str1 = "abc"; //OK
vector<int> dat(100,3); //ok
//vector<string> str2("aaa",4); //error

// string str1[] = {"abc", "def"}; //error
// const std::vector<std::string> str3 = {"abc", "def"}; //error
// constexpr char *mes1 = "abc"; //error
const char *mes1 = "abc"; //ok
// vector<char *> ch(10,mes1);//error
vector<string> ch(10,str1);//ok

ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。
941デフォルトの名無しさん
2018/06/24(日) 13:37:02.58ID:8StK2ZXu
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[];
}
//clsA::clsA(char *name[]) : m_name(["mike","tetu"]){};//だめ
//clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ
//clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
942デフォルトの名無しさん
2018/06/24(日) 13:38:12.37ID:zWtoG2OO
サイズ不明だし無理だろ
943デフォルトの名無しさん
2018/06/24(日) 13:41:38.91ID:8StK2ZXu
>内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。

constexpr char *mes1 = "abc"; //error
これもだめですね。ヒープは必要ないとおもいますが、、、
944デフォルトの名無しさん
2018/06/24(日) 13:42:37.94ID:8StK2ZXu
>>サイズ不明だし無理だろ

コンストラクトする時点でサイズは確定していますが、、、
945デフォルトの名無しさん
2018/06/24(日) 13:45:06.66ID:p8F2e5jx
お前はまずエラーメッセージをちゃんと読め。
946デフォルトの名無しさん
2018/06/24(日) 14:12:06.73ID:8StK2ZXu
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[];
clsA(char *name[]);
};

//clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){};

/*だめだが可能性がありそう。 Invalidはでていない。
--error message--
#29 expected an expression
*/

//clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid
/*
Multiple markers at this line
- #2125 invalid initializer for array member
"clsA::m_name"
- #18 expected a ")"
*/

//clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
/*
* Multiple markers at this line
以下省略
*/
947デフォルトの名無しさん
2018/06/24(日) 14:20:47.48ID:p8F2e5jx
すまん、そっちはエラーメッセージじゃ分からん。
string str1[] = {"abc", "def"}; //error
とか
constexpr char *mes1 = "abc"; //error
とかの話。
948デフォルトの名無しさん
2018/06/24(日) 14:38:12.08ID:iIKq/Q4Y
string関数の第二引数には何の意味がありますか?
試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが
↓です

string readFile(const char *filename)
{
ifstream ifs(filename);
return string(istreambuf_iterator<char>(ifs),
istreambuf_iterator<char>());
}

https://www.miraclelinux.com/tech-blog/1n4hgx
949デフォルトの名無しさん
2018/06/24(日) 14:46:22.41ID:iIKq/Q4Y
すみません自己解決しました>>948
950デフォルトの名無しさん
2018/06/24(日) 14:58:47.68ID:8StK2ZXu
>>947
string str2[] = {"abc", "def"}; //okでした。

constexpr 文字列は諦めました。多分相当難しい。
でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。
というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも
Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発
ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。
しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ
には無関心なのだろう。

もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して
マスターしたので簡単には教えたくない。
それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。

いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし
できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか?
多くのファーム開発者は諦めてCで初期化してるのだろうな。
951デフォルトの名無しさん
2018/06/24(日) 15:43:14.02ID:zWtoG2OO
配列の初期化の時には()いらないぞ{}だけ
>>941の最後の行の()はずせば通るけどたぶん環境依存じゃないかな
意図してる動作がname使ってm_nameの初期化ならめんどくさそう
952デフォルトの名無しさん
2018/06/24(日) 16:11:08.57ID:zWtoG2OO
あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめかなこれ
953デフォルトの名無しさん
2018/06/24(日) 16:11:30.09ID:8StK2ZXu
class clsA
{
private:
const char *m_name;
clsA();
};
clsA::clsA() : m_name("Bike"){};

これはOK、しかし配列はできない。
954sage
2018/06/24(日) 16:24:15.11ID:zWtoG2OO
class a
{
public:
const char* name[]; ここで非標準だなんだの警告でる

a():name{ "aaa","bbb" }
{
}
};

vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな
配列の数指定しといたほうが無難な気がするけど
955デフォルトの名無しさん
2018/06/24(日) 16:39:11.76ID:Q9QWMZ9P
C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ
コンストラクト時にわかってるじゃないか、って話もあったけど
中身の配列数が変わったらそれは違う型になる
つまりテンプレートが必要になる

配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど
956デフォルトの名無しさん
2018/06/24(日) 17:24:18.36ID:8StK2ZXu
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[2];
clsA():m_name{"aaa","bbbb"}{}
};
これでもエラーします。
957デフォルトの名無しさん
2018/06/24(日) 17:42:22.01ID:zWtoG2OO
なんてエラーでてるの
958デフォルトの名無しさん
2018/06/24(日) 17:54:03.23ID:8StK2ZXu
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
char *m_name[10];
clsA();
void init();
};
clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。
/*
Multiple markers at this line
- #66 expected a ";"
- #171 expected a
declaration
- #126 expected a "("
- #176-D expression has
no effect
*/
959デフォルトの名無しさん
2018/06/24(日) 18:01:33.16ID:8StK2ZXu
それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。
960デフォルトの名無しさん
2018/06/24(日) 18:04:27.08ID:p8F2e5jx
あなたの使っているコンパイラは、おそらくC++11未対応です。
constexprはC++11の機能なので、そのコンバイラでは使えないか、
使えたとしても標準とは異なる動作をする可能性があります。
961デフォルトの名無しさん
2018/06/24(日) 18:18:27.13ID:8StK2ZXu
>>960
あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール
した最近のコンパイラなので当然C++11以上だとおもっていた。
一寸調べてみる。
962はちみつ餃子 ◆8X2XSCHEME
2018/06/24(日) 18:23:43.69ID:StWe8jKY
>>961
対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。
963デフォルトの名無しさん
2018/06/24(日) 18:36:49.63ID:8StK2ZXu
>>962
おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを
みてもC11++がない。
最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。
964デフォルトの名無しさん
2018/06/24(日) 19:43:42.27ID:G0tizpK6
勘違いしてたらすまないけど↓みたいな事がしたいの?
https://ideone.com/Zm8LO5
965デフォルトの名無しさん
2018/06/24(日) 22:24:29.32ID:8StK2ZXu
>>964
凄い!!。まさにそれです。こちらでもコンパイル通りました。
難しいなー。
もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ
ど、それを丁重に拝借いたします。ありがとう。
966デフォルトの名無しさん
2018/06/24(日) 22:30:41.96ID:EmcxYm71
借りるってことは返すんだよね
967デフォルトの名無しさん
2018/06/24(日) 23:08:30.10ID:8StK2ZXu
>>966
もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が
わかりますか?
clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};

(const char* const []){"mike","tetu",nullptr}
これは何を意味してるの?
968デフォルトの名無しさん
2018/06/24(日) 23:09:16.86ID:chBT6m1a
「c++ constexpr 文字列」で検索すれば?
969デフォルトの名無しさん
2018/06/25(月) 00:15:08.68ID:RQXh1ivn
void func1(int a) { printf("%d\n", a); }
void func2(int a, int b) { printf("%d,%d\n", a, b);}

template<?????>
class Test
{
public:
void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) }
private:
int a;
in b;
};
のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして
記述したいのですが、うまくいきません。どうすれば良いでしょうか?
例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が
表現出来ません。
970デフォルトの名無しさん
2018/06/25(月) 01:49:02.18ID:Gwlgg6/B
class class1 {
private: int m_a;
public:
class1(int a) : m_a(a) {}
class1(class1 const& rhs) { m_a = rhs.m_a; }
void method(void) { printf("%d\n", m_a); }
};
class class2 {
private: int m_a;
int m_b;
public:
class2(int a, int b) : m_a(a), m_b(b) {}
class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; }
void method(void) { printf("%d,%d\n", m_a, m_b); }
};

template<class _Myclass> class Test {
private: _Myclass m_myClass;
public:
Test(_Myclass myClass) : m_myClass(myClass) {}
void method(void) { m_myClass.method(); }
};

int main() {
Test<class1> x(class1(1));
Test<class2> y(class2(2, 3));
x.method();
y.method();
}
意味があるのか分からないがとりあえずコレで
もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない
まずなにがやりたいのか分からないからテキトーに書いてやったぞ
971デフォルトの名無しさん
2018/06/25(月) 03:37:15.06ID:3f3crQyZ
const char *[]の初期化だけれども

clsA(const char* const name[]) : m_name(name) {};
これはまあ何となく意味が解る。m_name <−−nameってことだよね。

clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};
しかしこれはどういう意味だろうか?
clsA <−− (const char* const []){"mike","tetu",nullptr}
ラムダ関数?かとおもったが、前半はcastだろうか?
m_name <−−name
clsA <−− {"mike","tetu",nullptr}
この二つがセットで意味を持つんだろうな。
const char *[] の初期化が3つくらいあったらどうするんだろうね。
まるでクイズを解いてるみたいだよ。
いくらなんでも言語仕様としてやはり不味いよね。
972デフォルトの名無しさん
2018/06/25(月) 04:00:03.54ID:3f3crQyZ
わかった。コンストラクタに引数がないディフォールトでは
clsA <−− {"mike","tetu",nullptr}
そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。
引数を持つ場合は
clsA(const char* const name[]) : m_name(name) {};
m_name <-- name;
になる。

じゃあconstのメンバ変数が二つある場合はどうするんだろうか?
clsA:clsA( {"xxx"}),clsA({"yyy"})
{}
とは書けない。変数を明示しないといけないから、、、
clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){}
必然的にとなる。
じゃあ最初から
clsA:m_name1( {"xxx","abc"}){}
こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。
973デフォルトの名無しさん
2018/06/25(月) 04:04:26.64ID:3f3crQyZ
class clsA{
private:
const char* const* m_name1;
const char* const* m_name2;
public:
clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {};
clsA(const char* const name[]) : m_name1(name) {};
void put(){
for(const char* const * p=m_name1; *p!=nullptr ;++p ) {
printf(*p);
}
};
virtual ~clsA() {};
};
実験したみたが、コンパイルは通った。
974デフォルトの名無しさん
2018/06/25(月) 05:56:57.36ID:MAmRCfEQ
>>964のソースをclangでビルドしたら最初の結果が文字化けする。
環境依存で動作が変わるようなソースコードを参考にしてはいけない。
975デフォルトの名無しさん
2018/06/26(火) 09:01:37.25ID:6tjGTw22
>>969
template<class ... args>
class clsTest {
public:
void func1(int dt) {}
void func1(int dt1, int dt2) {}
void func2(args...) {

}
};
int main()
{
clsTest<int, int, int> a;
clsTest<int, int, char *> b;

a.func2(2, 3, 4);
b.func2(5, 6, (char *)"test");

a.func1(2);
a.func1(2, 3);

return 0;
}
976デフォルトの名無しさん
2018/06/28(木) 10:37:33.14ID:dRU/pr3A
c++です
LNK2005 DllMain は既に vstplugmain.obj で定義されています
1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。

左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが
両方vstplugmain.objで困ってます
どのようにすれば解決できるでしょうか?
977デフォルトの名無しさん
2018/06/28(木) 11:09:44.92ID:9ql/FcZD
自動でリンクしてるライブラリと明示的にリンカに渡してるパス違いの同じライブラリで衝突してんんじゃないの?
知らんけど
978デフォルトの名無しさん
2018/06/28(木) 11:44:03.03ID:dRU/pr3A
検索してみたのですが
vstplugmain.objは一つしか無いようです
979デフォルトの名無しさん
2018/06/28(木) 12:06:53.39ID:dRU/pr3A
もしかしたら関係あるのかもしれないので参考までに記述します
以下のようなエラーも同時に発生しています

vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。
LNK2001 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 Dll6 source\repos\Dll6\Dll6\vstplugmain.obj 1


よろしくおねがいします
980デフォルトの名無しさん
2018/06/28(木) 17:14:50.29ID:hh115pnF
エラーログの上から順番に解決するようにしたらいい
981デフォルトの名無しさん
2018/06/29(金) 09:50:56.72ID:8ZX2E7EU
無事解決しました
ありがとうございました
982デフォルトの名無しさん
2018/06/29(金) 10:22:32.55ID:h8zo0ENm
>>981
そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。
983デフォルトの名無しさん
2018/06/29(金) 10:53:16.69ID:OiiVA+37
ロベールのC++の本の typedef の説明ですが、よく分かりません。

typedef int* IntPtr;

int n = 0;
const IntPtr p = &n;
IntPtr const q = &n;

はどちらも、

int* const p;
int* const q;

の意味になるそうです。

分からないのは、ロベールさんの解釈の部分です。

const int* p; → 「const の右側にあるものが const になる」
int* const q; → 「const の右側にあるものが const になる」

と解釈すればよいと説明してます。

この解釈が

const IntPtr
IntPtr const

の場合にも通用するというのです。
984デフォルトの名無しさん
2018/06/29(金) 10:53:56.86ID:OiiVA+37
const IntPtr = const int*
IntPtr const = int* const

ではないのでしょうか?
985デフォルトの名無しさん
2018/06/29(金) 10:55:12.72ID:OiiVA+37
const IntPtr p = &n;
IntPtr const q = &n;

↑「const の右にあるのは p や q なので、 p や q が const になるのです。」

と説明していますが、これが意味不明です。
986デフォルトの名無しさん
2018/06/29(金) 10:56:58.22ID:OiiVA+37
>>985
の論法を↓に適用すれば、

const の右にあるのは p や q なので、 p や q が const になるのです。

となってしまいますが、 p は const ではないですよね。
q は const ですが。

const int* p;
int* const q;
987デフォルトの名無しさん
2018/06/29(金) 11:34:56.01ID:rwm1MJ+D
>>983
マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど
typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る
const int と int const もどちらも const の int であるのと同じように
int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ
988デフォルトの名無しさん
2018/06/29(金) 12:00:29.81ID:nFp4wdEK
i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char ifname[] ="i.csv";
int a,b,c;
char name[30][100];
int sum[30];
int i;

FILE *ifp;

ifp=fopen(ifname,"r"); /*読み込み込みモードでopen*/
if(ifp==NULL){
printf("ファイルが開けない");
exit(1);
}

for(i=0;i<=29;i++){
if(fscanf(ifp,"%s%d%d%d",name[i],&a,&b,&c)==EOF)
break;
else
sum[i]=a+b+c;
printf("%s %d %d %d %d\n",name[i],a,b,c,sum[i]);
}
fclose(ifp);
}
989デフォルトの名無しさん
2018/06/29(金) 12:06:09.83ID:nFp4wdEK
10行ではなく30行でした、すみません
990デフォルトの名無しさん
2018/06/29(金) 12:10:17.92ID:OiiVA+37
>>987
ありがとうございました。
991デフォルトの名無しさん
2018/06/29(金) 12:40:26.79ID:nFp4wdEK
988ですが自力で解決出来たので大丈夫です
992デフォルトの名無しさん
2018/06/29(金) 14:45:38.42ID:+YHimQiw
Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。
どのように設定すればいいでしょうか?
VisualStudio2017/C++
993デフォルトの名無しさん
2018/06/29(金) 14:50:24.25ID:+YHimQiw
何がしたいかというと、カレンダーを表示させたいです。
994デフォルトの名無しさん
2018/06/29(金) 14:52:35.06ID:+YHimQiw
小出しですみません。カレンダー機能はMFCで作成済みです。
995デフォルトの名無しさん
2018/06/29(金) 22:49:34.96ID:DjTQOr6S
無理でしょうか?
996デフォルトの名無しさん
2018/06/29(金) 23:03:37.60ID:DjTQOr6S
C#ですが、方法が見つかったので自力でやってみます。
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus
997デフォルトの名無しさん
2018/07/01(日) 01:14:10.80ID:UA/DrxK6
998デフォルトの名無しさん
2018/07/01(日) 01:14:30.62ID:UA/DrxK6
999デフォルトの名無しさん
2018/07/01(日) 01:14:47.85ID:UA/DrxK6
1000小倉優子 ◆YUKOH0W58Q
2018/07/01(日) 01:15:06.26ID:UA/DrxK6
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 
ニューススポーツなんでも実況



lud20251017165015ca

ID:4ILD3/U5のレス一覧:


195デフォルトの名無しさん
2018/01/17(水) 11:23:31.36ID:4ILD3/U5
Unityでも速度が必要な場所はC++で書いて呼び出し
196愛知人
2018/01/17(水) 11:48:22.30
なんでC++ってendlいるの?
197デフォルトの名無しさん
2018/01/17(水) 12:24:58.46ID:/z6RTYd5
ちょっと何言ってるかわかんないです
198愛知人
2018/01/17(水) 13:34:56.30
なんでprintf使わないの?
199デフォルトの名無しさん
2018/01/17(水) 13:41:03.90ID:lhJfQamL
浪人と引き換えに無知を手に入れた男
200愛知人
2018/01/17(水) 13:43:22.44
で、返答は?
201デフォルトの名無しさん
2018/01/17(水) 14:07:42.46ID:l2H41H1D
>>198
<cstdio>は正しくC++だからprintf使っても構わん 味噌 よ
後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね
endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?

愛知語は詳しくないけど察し手羽先
202愛知人
2018/01/17(水) 14:16:18.48
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w
203デフォルトの名無しさん
2018/01/17(水) 14:19:41.37ID:l2H41H1D
言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て
「人生を無駄にした」と真顔で後悔してるところだから
204デフォルトの名無しさん
2018/01/17(水) 15:03:17.62ID:MeUm47mp
何言ってんだこのバカ
205愛知人
2018/01/17(水) 16:08:09.91
あらら、怒っちゃった(笑)
206デフォルトの名無しさん
2018/01/17(水) 17:39:52.90ID:sykUBtM3
C++でしかできないもの作りたいだけど何かいいアイデアない?
207片山博文MZ ◆T6xkBnTXz7B0
2018/01/17(水) 17:52:07.55ID:89SqY/Kf
>>206
エクセルのような操作性の、画像レイアウト印刷アプリなんてどう?
208デフォルトの名無しさん
2018/01/17(水) 18:18:50.66ID:sykUBtM3
>>207
印刷はしたくないです..
209デフォルトの名無しさん
2018/01/17(水) 20:00:30.20ID:W2btjMLE
おs
210デフォルトの名無しさん
2018/01/27(土) 06:58:59.63ID:1R9xhZBX
windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった
そこでC+11の一部が使えるようになったから使いたいと思ってる
ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。

ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ないんじゃないのとか気をつけた方がいいよとかあれば意見よろしくです
211デフォルトの名無しさん
2018/01/27(土) 08:45:12.76ID:x9sgfrz+
バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。
212デフォルトの名無しさん
2018/01/27(土) 10:25:52.07ID:RqfNKOXi
ユーザからクロスコンパイラ提供してもらってバイナリ配布っす
nmコマンド、試す価値はありそうだありがとう
213デフォルトの名無しさん
2018/01/28(日) 06:43:38.82ID:yhuRz+yt
以下のコードをgccでコンパイルすると

#include <iostream>
#include <functional>
using namespace std;

struct functor {
int& operator()(int& i) { return ++i; }
};

int main() {
int i = 0;
cout << functor{}(i) << endl; // 関数オブジェクトは問題なし
function<int& (int&)> lambda = [] (int& i) { return ++i; }; // コンパイルエラー
cout << lambda(i) << endl;
return 0;
}

「'main()::<ラムダ(int&)>' から非スカラ型 'std::function<int&(int&)>' への変換が要求されました」
というエラーになるのですが、どうしてでしょうか?
そもそもラムダ式は関数オブジェクトのシンタックシュガー、つまり等価なのではないんでしょうか?
214デフォルトの名無しさん
2018/01/28(日) 07:45:35.06ID:kxFN6buW
>>213
戻り値がintになってる
戻り値の型を後置で書いてやればいいかな
function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; };
215デフォルトの名無しさん
2018/01/28(日) 22:25:05.79ID:yhuRz+yt
>>214
ありがとうございます。
戻り値の型を明示してあげないと値渡しになってしまうということですね。
勉強になりました。
216デフォルトの名無しさん
2018/02/06(火) 23:57:09.32ID:ZZWnbRb2
typedef int myTypeA;
typedef int myTypeB;

class Test {
void set(myTypeA a);
void set(myTypeB b);
priate:
int A;
int B;
};

のような事例で、引数に応じて専用のセッターを用意したいのですが、
int型の2種類の引数に対して、上記のように書くとコンパイルエラーになってしまいます。
どのようにするのが良いでしょうか?
217デフォルトの名無しさん
2018/02/07(水) 00:04:25.80ID:k5RJAFTX
structを使う?
struct my_TypeA{ int v;};
218デフォルトの名無しさん
2018/02/07(水) 00:18:25.18ID:yuAfwWTK
なるほど、、、確かにtypedefだと別名になるだけですね
structかclassで別の型にしないとダメですね
ありがとうございます!
219デフォルトの名無しさん
2018/02/07(水) 03:43:04.13ID:LQaGrglb
オブジェクト指向では、型による分岐処理は無くなる。
汎化

f(親型)

ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向
220デフォルトの名無しさん
2018/02/09(金) 15:21:46.70ID:+q9wZMZv
などと訳のわからないこと(でもないが)を供述しており
221デフォルトの名無しさん
2018/02/11(日) 04:59:49.56ID:9irhhPDg
C++には強いエイリアスが無いからなあ
222デフォルトの名無しさん
2018/02/23(金) 16:21:25.57ID:UAqVoMsi
C++じvtable参照することになるから遅いだろ
223デフォルトの名無しさん
2018/02/25(日) 04:05:35.43ID:Zrtx8k52
>>216
セットする値の名称にする
例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる
プロパティとして使うのだから、setXXX()みたいに書かなくてもいい

setter単独で存在することはありえないからgetterも設けること
setterって余り必要ない
コンストラクタからの初期化で十分の場合が多い
224デフォルトの名無しさん
2018/02/25(日) 14:23:16.60ID:8l5JrV0a
>>219
だぶるでぃすぱっち
225デフォルトの名無しさん
2018/03/03(土) 13:43:59.95ID:Vl4EAVf3
2の累乗でないときのmod演算の高速化の方法、何かありませんか?
そこらへんはコンパイラで最適化されるんですかね
226デフォルトの名無しさん
2018/03/03(土) 14:09:48.07ID:xC+xvi0u
>>225
法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。
法が固定で何度も剰余を取るならモンゴメリリダクションがある。
どちらも乗算はそれなりに必要。
227デフォルトの名無しさん
2018/03/03(土) 14:14:16.62ID:Vl4EAVf3
>>226
ありがとう
ちょっと調べてくる
228デフォルトの名無しさん
2018/03/06(火) 00:16:25.34ID:EXuXevGu
ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。
229デフォルトの名無しさん
2018/03/06(火) 00:47:05.22ID:yCnPPW+5
mutex g_Mtx;

int g_Val = 0;

int Func( int A, int B )
{
  int Val = A * B;

  lock_guard<mutex> Lock( g_Mtx );

  return g_Val = Val;
}

void ThreadFunc0()
{

}

レス:1-200 201-400 401-600 601-800 801-1000 ALL

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

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「【初心者歓迎】C/C++室 Ver.102【環境依存OK】 ->画像>1枚 」を見た人も見ています:
大相撲一月場所
特価品5526
穴タコ総合
【悲報】PS4版ドラクエ11、3DS版と比べてアイテムを拾うのが非常に遅い
【悲報】PS4版DQ11カメラワークが糞過ぎてメチャクチャ酔う【ゲロクエ】
書き込みテスト
速報 韓国で山火事
PS4版ドラクエ11の戦闘はオートカメラアングルを初期設定してほしい
【悲報】PS4版ドラクエ11、とうとうアマゾンランキング3位に落ちる
【大失速】PS4版ドラクエ11、わずか2.2万本でイカ以下wwwwwwwwww
【ネットワークカメラ その9】
DAIGO Part295
東海大相模part54
野糞したらageるスレ
【朗報】PS4版ドラクエ11は8の正統進化!一方3DS版は・・・
テスト24585657
赤ら顔の人のメイク3
愛媛の高校野球277
【ネットワークカメラ IPCAM その10】
【悲報】PS4版ドラクエ11、フレームレートガックガクwwwwwwwww
【悲報】ドラクエ11、PS4版と3DS版の新たな比較画像が公開される!
書き込まれた相手に不幸と呪いがつきまとうスレ92
【悲報】PS4版ドラクエ、ハムに負ける
【悲報】PS4版ドラクエ11は劣化版だった
【MMRK】 桃色れく ★1
興行収入を見守るスレ2323
【朗報】PS4版ドラクエ10は糞グラで確定
ハレンチ女さんってNGTをメチャクチャにした責任取ってくれるの?
真救世主は日本から現れる42
日本の競馬中継のカメラワークって世界的に見ても酷い部類だよな
【Ripple】リップル総合859【XRP】
【悲報】PS4版ドラクエ11の中古流出がやばい
【沖縄】ルアー釣り【気軽に】
【芸能】浜崎あゆみ『口パク』疑惑に総ツッコミ! 不自然なカメラワークも…
なんでお前らは「アメリカ」を憎まないの? 日本を安倍使ってメチャクチャにしてるはこいつらだぞ
官邸関係者「こんなくだらない疑惑の追及ばかりやってたら、日本の政治はメチャクチャになる」と嘆く
なんかアマゾンでPS4版ドラクエ11だけ安くなり続けてる
PS4版ドラクエ11の爆死ラインが67.1万本に決まる
【セキュリティ】IoTマルウェア「ペルシライ」出現、脆弱なネットワークカメラが約12万台も
【悲報】PS4版ドラクエ11の中古の数が凄い【ヤバい】
【朗報】PS4版ドラクエ11の街にいる女たちがみんなかわいすぎ
任豚「PS4版ドラクエ10とPS4版モンハンは月額だから糞」
【Toro Rosso】トロロッソ応援スレ 58【Red Bull】
ついにスプラトゥーン2の累計がPS4版ドラクエ11の累計を越える!
アイドルマスターシンデレラガールズ愚痴スレ(IDなし) 1886
スプラトゥーン2がPS4版ドラクエ11を抜けるか怪しくなってきた
★Yuka☆moumoon 第51夜☆Masaki★
最近のジャニーズ、カオスwwww
ドラクエ11尼ラン PS4版1位 3DS版2位
ps4版ドラクエ11"なぜか"リモートプレイを押す動画を出す
【高校野球】U18高校日本代表に大船渡・佐々木朗希投手、星稜・奥川恭伸投手らを選出
【PS4】ドラクエ11がひどい【3DS】
【PSO2】サモナー総合スレ【95】
【SKE48】大場美奈応援スレ7【KU】
今回のドラクエ11は完全に3dsの勝利だよな
新しいOVERTUREのコールを考えましょう。
【藤巻忠俊】 黒子のバスケ 205点目
ゲイが今さら語るショムニ (1998)★3
ドラクエ3DS版の方が売れる日本は終わってる
業界人「3DS版ドラクエ11は安すぎる 」
ドラクエ1〜3 PS4/3DSで配信決定!!
【名古屋】創価学会葵講88【おやじ】
ニッコールレンズ in デジ板 136本目
【NMB48】古賀成美応援スレ●38【なるなる】
【吉報】尼ラン、3DS版ドラクエ11が1位に!!
14:12:54 up 3 days, 4:35, 4 users, load average: 7.20, 8.05, 7.86

in 0.1145658493042 sec @[email protected] on 102603