[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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

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

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

2 名前:デフォルトの名無しさん [2017/11/05(日) 17:44:45.44 ID:rSDVGL6P.net]
>>1


3 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 20:58:13.61 ID:80sy7ZoV.net]
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 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 21:07:57.69 ID:i5zx7IeJ.net]
これは酷いクソコード

5 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 22:25:14.64 ID:NxjjuMpf.net]
実行速度
見やすさ
汎用性
コードサイズ

どれかひとつ位は満たさないと

6 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 22:42:14.76 ID:3uuR82Hq.net]
>>5
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね

7 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 08:01:53.31 ID:uTTN+kxR.net]
>>3 の関

8 名前:狽ヘ前のスレッドの終わりに出た
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。

…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
[]
[ここ壊れてます]

9 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 08:45:24.00 ID:H37qYFYx.net]
size_t n で文字数を受けとるからNUL終端である必要は無いのでは

10 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:40:14.23 ID:L15YU14L.net]
if (strncmp(psz, "12 34 56", 8) == 0) return 123456;



11 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:29:19.85 ID:OMQOLu1z.net]
相変わらず片山はクソコードしか書かないな
""だと不定値返る数値変換なんてゴミ

12 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:59:53.41 ID:/gW4r5bt.net]
>>10
確かにクソコードだが不定値は返らんぞ

13 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:37:45.33 ID:T7zw8VZw.net]
>>9 は質問者に対する皮肉のつもりだったんだけど

14 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:47:47.90 ID:T7zw8VZw.net]
意図的に糞コードを書いた事もわからないクソがいるとは
こんな簡単なコードの動作も理解できてないようだし

15 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 06:16:53.55 ID:pkgJL5Ib.net]
初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。

>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。

16 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 06:53:54.21 ID:+N0q+RZO.net]
誰も騙してないのにクソみたいなプライドが高いな

17 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 07:08:01.90 ID:aXJpgdu1.net]
出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう

18 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 08:24:36.39 ID:FXbSqjpU.net]
psz = "", n = 0 はいいけど
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型

19 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 08:32:51.44 ID:T7zw8VZw.net]
>>3

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

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

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

●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番

20 名前:片山博文MZ mailto:sage [2017/11/07(火) 10:46:29.90 ID:BS6pey7a.net]
>>10
人違い。



21 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 12:47:26.90 ID:FXbSqjpU.net]
>>18
> null文字とサイズ、両方で停止は仕様としては問題ない
だからダメだっつーの
知ったかは黙ってろよ
最低限サイズチェックを先にやらないとダメ

22 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 13:22:08.68 ID:oMcRDniv.net]
仕様として「両方で停止は問題ない」よな?

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

そもそも相談者の仕様がおかしい

23 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 16:16:20.01 ID:3ER4WXnW.net]
先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし

ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん

24 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:07:50.15 ID:Zpoup5pM.net]
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;
}

25 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:17:37.91 ID:jEe4bM6y.net]
片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな

26 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:31:27.26 ID:Zpoup5pM.net]
ソフト歴35年ですが

27 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:50:48.44 ID:6NdbJPOz.net]
PC(プロセスコントローラー)のプログラマーですが何か?
ってのは居たが

28 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 01:37:38.03 ID:MEe7IGP8.net]
isdigitが関数コールな処理系ってあるのか?
ここって車輪の再発明好きな人多いのかね

29 名前:片山博文MZ mailto:sage [2017/11/08(水) 02:06:05.60 ID:TZ5JAUzS.net]
isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。

30 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 03:38:56.63 ID:xvDlz0If.net]
ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)



31 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:19:22.66 ID:u4hO2YM0.net]
配列www
ないない
仮に>>23より速くても

32 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:36:16.44 ID:u4hO2YM0.net]
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;
}

33 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:36:55.45 ID:u4hO2YM0.net]
これのがまだマシ

34 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:40:10.32 ID:u4hO2YM0.net]
普通に>>23でいい

35 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 09:37:48.99 ID:kEoXgNLC.net]
gotoとかwwww
って思った人いるんだろうか

36 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:35:10.40 ID:FLS9cqpb.net]
switch である必要ないな

37 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 11:33:23.57 ID:2d9va5Xh.net]
>>34
ああ、素人はgoto嫌うよな

>>35
もちろん必要は無い
テーブルよりは色々な面でマシってだけ
普通に if ( '0' <= c && c <= '9' ) で良い
一目で意味がわかるし高速

38 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 12:27:45.50 ID:2VVChtYT.net]
&&って条件分岐が入るけど、本当に高速?

39 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 12:44:08.80 ID:FLS9cqpb.net]
そこはctypeで判定だね

40 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 13:01:31.63 ID:2VVChtYT.net]
>>37
とおもってアセンブリ吐かせてみたら、すごかった。
48引いた上で、符号なしで10未満か



41 名前:判定してるので、
余分な条件分岐してなかった。
[]
[ここ壊れてます]

42 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 13:02:27.97 ID:xvDlz0If.net]
>>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。

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

賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。

43 名前:片山博文MZ mailto:sage [2017/11/08(水) 13:37:52.71 ID:TZ5JAUzS.net]
俺の知識も時代遅れになったな。シンプル伊豆ベスト。

44 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 18:14:28.55 ID:xvDlz0If.net]
もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。

ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜

45 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:22:33.84 ID:8jdacwiA.net]
>>42
まるで昔は速かったかのようだ

46 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 18:37:11.31 ID:xvDlz0If.net]
>>42-43
Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ

47 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:43:03.66 ID:u4hO2YM0.net]
ん?
8086はビット演算の方が速いぞ

48 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:57:26.39 ID:GPQLPiKH.net]
>>21
> 仕様として「両方で停止は問題ない」よな?
相談者でないとわからん
途中に'\0'があるケースについては書いてないから

> そもそも相談者の仕様がおかしい
それはお前が決める話じゃない

49 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:59:47.82 ID:GPQLPiKH.net]
>>22
> ショートサーキット前提の記述をよしとするかどうかはわからん
if(p != 0 && *p != '\0')
みたいなのは普通に書かない?

50 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:03:40.31 ID:CwKlKlOQ.net]
>>47
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない



51 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:14:43.13 ID:u4hO2YM0.net]
>>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる

両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り

52 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:18:16.64 ID:u4hO2YM0.net]
全角数字の方がまだ可能性がある

53 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:42:17.13 ID:GPQLPiKH.net]
>>49
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...

54 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:51:21.87 ID:CyIcapPx.net]
isdigit関連で性能測ってみた。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。

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

ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。

55 名前:52 mailto:sage [2017/11/08(水) 19:54:52.03 ID:CyIcapPx.net]
あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。

56 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 20:30:53.41 ID:u4hO2YM0.net]
最速なら前スレの>>995>>997

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

x64前提なら、
64bit一気に持ってきて偶数奇数桁に分けて、
LEAで5倍してシフトして足すとか
AVXで乗算してから水平演算とか
色々と考えられるけど
まあ一応このスレのC言語の範囲で

57 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 20:49:19.11 ID:QAR8Spec.net]
このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;

これより速くする方法あるのか

58 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:08:26.39 ID:CwKlKlOQ.net]
何時の間に判定せずにすむようになったんだ

59 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:11:25.51 ID:u4hO2YM0.net]
前スレの>>997が質問者だから
フォーマットは固定と思われる

60 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:12:49.95 ID:u4hO2YM0.net]
さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので
このままで良い気はする
当然こちらの方が意味が分かりやすい



61 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:14:04.15 ID:u4hO2YM0.net]
( ) を色々とかえて時間を測ってみたけどほとんど同じ
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合

62 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:39:10.43 ID:u4hO2YM0.net]
VPMOVZXBD xmm0, a
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0

63 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:40:02.30 ID:u4hO2YM0.net]
AVXが使えるならこれ

64 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:42:47.06 ID:u4hO2YM0.net]
微妙に間違った
メモリが連続してれば複数同時に出来る
連続してなくても複数同時にやった方が速い

65 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:43:54.20 ID:YMDhJx7T.net]
>>29でメモリアクセスに言及されてる話の流れの中で
10億回ループがいちいちキャッシュクリアされてるのかが気になる

66 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:49:19.34 ID:u4hO2YM0.net]
普通はキャッシュに入ったままだが、
処理次第で可能性が無いことはない
他のキャッシュを汚染する可能性もある
HTTなどでは特に

他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない

67 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 07:46:10.46 ID:F5y7yLWH.net]
std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。
newするしかないですかね。

68 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 10:26:44.91 ID:TvDreq2K.net]
>>65
vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。

69 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 20:15:55.61 ID:MIqJX5DT.net]
>>66
まあどうみても内部でnewしてるんだろうけど

70 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 21:01:13.10 ID:UsP+TtJI.net]
クラスの概念がわかりません



71 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 21:19:13.94 ID:lLb0QJod.net]
構造体みたいなもの

72 名前:片山博文MZ mailto:sage [2017/11/10(金) 21:39:23.58 ID:x1hu0efq.net]
>>68
クラスは構造体に関数を追加したようなもの。
クラス内部の関数はメソッドと呼ばれる。
メソッドからは、クラスのデータとメソッドを参照できる。
データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。
クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。
メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。

73 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:11:59.59 ID:x1hu0efq.net]
class A
{
int a;
};
と書くとA::aは、privateになる。構造体と同じアクセスにするには
class A
{
public: int a;
};
と書かないといけない。このようにクラスのデフォルトのアクセスはprivateになり、構造体はpublicになるという違いもある。

74 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:14:05.73 ID:x1hu0efq.net]
クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。
また、インスタンスが破棄されるときに、デストラクタという特殊なメソッドが呼ばれる。

75 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:17:22.95 ID:x1hu0efq.net]
コンストラクタの例。
class A
{
public:
int m_a;
A(int a) {m_a = a + 1; }
};

int main() {
A a(2);
printf("%d\n", a.m_a);
}

76 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:19:15.61 ID:x1hu0efq.net]
別のコンストラクタの例。
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);
}

77 名前:はちみつ餃子 mailto:sage [2017/11/10(金) 23:02:09.42 ID:4kUQXTj6.net]
そんなの説明してやらなくてもネット上に無数の解説があるだろ。
ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。

78 名前:片山博文MZ mailto:sage [2017/11/10(金) 23:14:40.61 ID:x1hu0efq.net]
>>75
情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。

79 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 23:21:03.62 ID:YANYSepQ.net]
そう思うならなぜ現在地を聞く前に世界地図を渡すのか

80 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 23:32:23.63 ID:2wx3Dyqu.net]
>クラスは構造体に関数を追加したようなもの

こういうアホってどこにでもいるんですね



81 名前: mailto:sage [2017/11/10(金) 23:40:07.53 ID:qCTAOUdD.net]
>>78
その理解で8割がたOKだと思うのだが、何が問題なの?

82 名前:はちみつ餃子 mailto:sage [2017/11/10(金) 23:46:33.90 ID:4kUQXTj6.net]
>>76
チュートリアルだってたくさんあるじゃん。

83 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 00:24:04.64 ID:5MIg+SHx.net]
>>79
クラスがわからんやつにこんな説明しても通じないだろ

84 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 00:49:17.73 ID:1PUme0lw.net]
山田さんってどんな人?と聞かれて
原子の集まりだよ。って答えるようなもの
形式的にウソじゃあないんだが
そこじゃないだろっていう

85 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 02:47:19.31 ID:fW1Ux/Kl.net]
純粋にC++のクラスそれ自体の概念というなら
C言語(ベース)でのオブジェクト指向プログラミングをサポートするために言語機能で用意された部品
オブジェクト指向プログラミングにおけるオブジェクト、オブジェクトの状態、
メッセージの送受信、メッセージを受けたときの振る舞いといった概念を具体化した仕組みの一例

86 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 13:22:39.97 ID:134uacB+.net]
記憶クラスについての質問の可能性

87 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 23:51:21.74 ID:nDRVLcBe.net]
実のところはOOPを知らないからクラスをどう使えばいいのかわからない/
他人の真似でなんとなく使ってるけどなぜクラスを使うのかがわからないといったあたりの話だろ

88 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 02:18:46.71 ID:jSfISRI4.net]
下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう
クラスは実用あってこそ

89 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 07:58:58.54 ID:gxZQPw73.net]
アニマルクラスがわんにゃー鳴くのがオブジェクト指向です

90 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 17:16:56.90 ID:ehTxx6H6.net]
メンバ関数を呼び出す際の
「オブジェクトにメッセージを送る」って言い回しも
C++だと分かりにくいね。

この表現がしっくりくるプログラミング言語というか
環境もあるのだろうけど。



91 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 17:52:35.50 ID:NgxFNsMl.net]
>>88
そういうのをベタで実現しているOO言語はないかな…

92 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 18:04:22.80 ID:evJ3QlJY.net]
smalltalkは?

93 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 20:55:50.24 ID:6XHR1ElK.net]
>>90
あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ
同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど
それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ
そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を
Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので
www.stroustrup.com/whatis.pdf

94 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 21:08:20.60 ID:Rn9KsJdK.net]
言語の意味論とそれを実現するメカニズムは別物だから、
仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。

まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、
意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも
メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。

95 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:21:24.87 ID:3PrpHuiB.net]
メソッド呼び出しってメッセージパッシング感すげー出てない?

96 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:28:03.86 ID:+hB2MqUt.net]
>それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

違いがわからないw

97 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 22:33:35.60 ID:2YdhEIzW.net]
>>93
メッセージパッシング言うなら、何かが静的に決定してる時点で興醒めだよ
wiki.c2.com/?AlanKayOnMessaging

98 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:02:11.68 ID:XGz0BDt0.net]
>>95
C++のポリモーフィックなメソッドは動的ディスパッチだろう

99 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:09:00.03 ID:NgxFNsMl.net]
>>91
>抽象データ型
これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか?

100 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 08:26:45.55 ID:Qr4pYIOt.net]
>>96
C++に「動的なものは何もない」という主張ではなく
「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味

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

つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、
(あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ)
無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない



101 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 08:27:38.45 ID:Qr4pYIOt.net]
>>97
まったくもってその通り

102 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:15:04.16 ID:76J8bh8G.net]
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

とそれぞれ、どの記載が正しいのでしょうか?

103 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:19:02.83 ID:5K7m7Mmt.net]
>a*100、b*100のどちらもlong型になる

intでは表せなくてlongが必要
って意味なら3以外

104 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:20:46.83 ID:76J8bh8G.net]
ありがとうございます。
1と3は似ていますが1はa,bそれぞれキャストされるが
3ではb*100はキャストされずint型で計算されてしまう、ということなのですね

105 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:57:14.87 ID:L5ESShiZ.net]
よろしかったら教えてください

  if(a==0){ }

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

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

と書かないのはなぜでしょうか?(==の使い方)

106 名前:片山博文MZ mailto:sage [2017/11/24(金) 17:05:28.65 ID:ELoh0Abo.net]
>>103
代入と比較は違う。

107 名前:デフォルトの名無しさん [2017/11/24(金) 17:07:52.77 ID:QRhLqwOG.net]
スーパー初心者か?
forでも書いてもいい。だが意味がないか低い。
「=」は代入だが「==」は代入でない。

108 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:08:50.74 ID:L5ESShiZ.net]
片山先生、ありがとうございました!
そういうことなのですね。理解できました、いつもありがとうございます!

109 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:38:47.92 ID:lG8HVUMw.net]
わかってる人にとってはクソみたいな質問だけど、
数学だと代入 (定義) するっていうのと等しいっていうのは区別がはっきりしないので、
そういうメンタルモデルで考えてると混乱しちゃうってのはわからんでもない。

とはいうものの、よっぽど出来の悪い入門書でもそこらへんわからんようなのは無いと思うんだが、
どういう学び方をしてるんだかちょっと疑問。

110 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:51:57.71 ID:L5ESShiZ.net]
なんかすみません
ネットで優しそうなサイトで進めてます



111 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 12:50:21.53 ID:bi1wDt8X.net]
数学のイコールには比較(の結果等しい)の意味しかないだろう
Pascalみたいに代入が:=なら良かったのに

112 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 12:57:44.05 ID:cL+Re6N7.net]
プログラムを記述する際、等しいかを比較するより、代入のほうが頻度が高いから
Cでは多く入力するであろう代入側を 1文字にして そうでない側を 2文字にした
って聞いたことがある

113 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 13:22:50.66 ID:8wOk3LC1.net]
Fortranだって代入は=だから、Cで採用されたのも仕方ない

とはいえ、文字数ごときにこだわらずに、:=を採用してくれていたらタラレバ

114 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 13:44:24.58 ID:9QEYjjOS.net]
力添えを頂きたい。
SunAwt系のソフト内で表示されているテキストを取得したいんだが、尻尾も掴めず困り果て、どうすれば良いか全く分からない状態。
何かヒントを頂けないだろうか。

115 名前:はちみつ餃子 mailto:sage [2017/11/28(火) 13:50:31.60 ID:1OfFiaid.net]
>>112
別のプロセスから取得するって意味?

116 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 18:08:18.05 ID:9QEYjjOS.net]
>>113
YES。
別プロセスからテキストを取りたい。
他の例えばIEやハンドルが取れる様なソフト内の文字ならgettextやcom操作で取ったりできるがSun系のソフトは同じ様にはいかず、メモリを読むのかどうすればいいのか、知識が足りなくて検索も上手に出来ず...頭打ち状態。
何か足掛かりになる物を教えて頂きたい。

117 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 00:32:03.31 ID:/GAULuFW.net]
>>114
試したことないけどこれは?
www.oracle.com/technetwork/articles/javase/index-jsp-136191.html

118 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 13:08:28.50 ID:GlJ85cMo.net]
#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が代入されないのは何故なのでしょうか?

119 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 13:26:13.79 ID:NrhyqkWd.net]
>>116
"%*c"のせいじゃね

120 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 13:36:20.41 ID:GlJ85cMo.net]
>>117
そうでした。ありがとうございました。



121 名前:デフォルトの名無しさん mailto:sage [2017/11/30(木) 14:49:53.66 ID:t+LxFq0J.net]
テフ?

122 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 03:20:07.32 ID:VClmrWfc.net]
boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね

123 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 12:48:46.21 ID:UzEJxhfp.net]
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人

と集計する方法に悩んでいます。
どういう考え方が考えられますか?

124 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 13:06:08.20 ID:p7Y4uOcI.net]
>>120
char_に替わるパーサー書けばいいんじゃないかね
マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして
mbchar = (mb1 >> char_) || char_;
とか?

125 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 13:14:35.24 ID:LYbXDWPH.net]
>>121
宿題は自分で考えるのが原則。どこまで考えた?

126 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 13:21:20.74 ID:UzEJxhfp.net]
>>123
ありがとうございます。
入力された点数を3次元配列に格納するところまでです。
今は、繰り返し分を使い、配列に格納された数字が0でなかったら
その数字をカウントして人数を集計しようとしてるのですが、できていません

127 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 13:56:35.70 ID:LYbXDWPH.net]
>>124
なぜ3次元?生徒と教科がインデックスだから2次元では?
あと、表示さえすればいいだけなら、
効率度外視である教科のある得点範囲の人数をカウントするくらいできるでしょ。
効率考えるなら表示用に0で初期化した2次元配列を別に用意する。

128 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 14:01:47.55 ID:UzEJxhfp.net]
>>125
ありがとうございます。2次元です。
ten[5][3]で得点を格納したあとが進まないのです
得点範囲の人数のカウントについてもう少し考えてみます

129 名前:デフォルトの名無しさん [2017/12/02(土) 00:04:56.97 ID:F3lbt2G4.net]
中古本でプログラミング言語c++の3版が4000円で4版が6000円なんだが
やっぱり4版を買ったほうがいいのかな

130 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 00:18:15.85 ID:4X8AnX6A.net]
あんまり良い本じゃないから買わなくていい



131 名前:デフォルトの名無しさん [2017/12/02(土) 00:54:45.18 ID:F3lbt2G4.net]
>>128
そうなのか・・・聞いておいてよかった
ありがとう

132 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 09:08:29.93 ID:XeWd0teH.net]
>>125
昨日はありがとうございました
90行程度と長いプログラムになりましたが
人数をカウントし表示させることができました

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

また分からないことがありましたらご指導お願いいたします。

133 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:58:42.41 ID:XeWd0teH.net]
ファイルを開いた回数を記録するというプログラムを作っています
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回目以

134 名前:降のcountには7桁の乱数みたいのが代入され記載されてしまいます
どうして不具合が出るのか分からなくなっております。よろしくご教授くださいませ
[]
[ここ壊れてます]

135 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 15:12:26.31 ID:jpnrbmV1.net]
fscanfで書式の指定ミス

136 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 15:16:24.33 ID:XeWd0teH.net]
>>132
さっそくありがとうございます。fscanf(fp,"%d",&count)と訂正しました。
初歩的なミスで申し訳ありませんでした、そしてありがとうございました。

137 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 15:18:37.18 ID:Jd1ioDh8.net]
>>131
> fscanf(fp,"log.txt",&count);
二番目の引数を再確認してみ

138 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 15:35:47.69 ID:XeWd0teH.net]
>>134
ありがとうございました。
おかげさまで正常にカウントされるよになりました。
確認不足でご迷惑おかけしました。ありがとうございます。

139 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 18:53:18.55 ID:K6qIkKEG.net]
超初心者です
c言語でGetPixelが動きません
どうすれば直るのか教えてください

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

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

//以下、実行するコード

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

if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) {
条件が真のとき実行するコード
}
ではどうですか?



141 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 17:32:02.17 ID:K3o+GgF3.net]
boost::qiって読み方ブースト・チーでいいの?

142 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 18:32:18.36 ID:m/Ygi57i.net]
boostのパーサの使い方わかんね

143 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 21:33:58.20 ID:K2rBoL+r.net]
>>138


144 名前:デフォルトの名無しさん [2017/12/05(火) 04:28:16.53 ID:NJ16QKFF.net]
組み込みの場合例えばRs232Cのチャンネルが三つあるようなばあいにクラスに
するとIOの初期化がそれぞれ違う。しかもチャンネル1を初期化するとチャンネル3
にも影響する場合がある。こういう場合にはどんな風にクラスをつくったらいい?

145 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 10:59:54.97 ID:BooJAJ3p.net]
よろしくお願いします。

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

これを実行するとテキストファイルに記録されている整数を
一行飛ばしで読みだしてしまいます
どうして飛ばされる行ができてしまうのでしょうか?

146 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 11:22:39.33 ID:tMsGMSrl.net]
>>141
friend

147 名前: mailto:sage [2017/12/05(火) 11:42:25.43 ID:x6DQdw1l.net]
>>142
fscanf() を二箇所に書いているけれども、それでいいのですか?

148 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 11:54:34.95 ID:GUcDlKUg.net]
>>142
whileでのfscanfのあとでiを変更してないから次のfscanfで同じda2[i]に上書きしてる

149 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 12:02:08.68 ID:BooJAJ3p.net]
>>144>>145
そういう事だったのですね
ありがとうございました!

150 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 15:40:18.03 ID:BooJAJ3p.net]
再びよろしくお願いいたします。

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を飛び越えてしまいます。
その理由と回避方法をご指南いただけませんでしょうか?
よろしくお願いいたします。



151 名前:片山博文MZ mailto:sage [2017/12/05(火) 15:46:59.33 ID:KBxdaLdg.net]
再びよろしくお願いいたします。

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;
}

152 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 16:20:49.08 ID:BooJAJ3p.net]
>>148
ありがとうございます
標準入力によって処理し、scanfを使わないということなのですね
文法を覚えて活用できるようにします
何度もありがとうございます

153 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 16:50:17.51 ID:VZfNuCLu.net]
>>147
改行文字を次のscanfで読込むから
回避方法は例えば
ttp://blog.unfindabl

154 名前:e.net/archives/604 []
[ここ壊れてます]

155 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 16:59:28.01 ID:BooJAJ3p.net]
>>150
ありがとうございます
しっかり理解できるには時間がかかりますが
とりあえず、お礼申し上げます
改行文字を処理しないと次のscanfが改行文字を読んでしまうのですね
とても勉強になりますし、皆様のおかげで前進できます
ありがとうございます

156 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 00:17:29.58 ID:fcKh4od9.net]
皆すげーな
俺みたいなライブラリのインクルードが通せなくて
そもそもコンパイルって何だっけってところから調べるような奴には恐れ多いわ

157 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 12:53:50.82 ID:4zvLzkC0.net]
毎日すみません。ご教授お願いします。

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日考えても分かりません
いつも申し訳ありません><よろしくご指導願います

158 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 13:10:52.74 ID:dicAL8ON.net]
>>153
c は大きさの十分ある char への配列と想定した前提で
fscanf の引数がおかしい

1文字毎に配列へ順繰りに読み込ますのなら
 fscanf(fp,"%c", &c[i]);
こうなってないと

159 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 13:39:27.89 ID:4zvLzkC0.net]
>>154
&が抜けていたのは恥ずかしいです
申し訳ありませんでした
しっかり覚えさせていただきます

プログラムもちゃんと動きました
いつも簡単なことばかりなのに理解が浅くてすみません
とても勉強になりました。ありがとうございました

160 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 16:08:02.33 ID:dicAL8ON.net]
書いてあることが違うけど(&が抜けていたのではなく [i] がない)
本当に分かっているのか不安になる返答だが、そのうち慣れてくるだろう。

(文字と文字列の違いと (f)scanf に渡すフォーマットの指示と 変数をどう渡すか
 の一連が整理されてないと、また繰り返すだろう)



161 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 16:29:02.63 ID:4zvLzkC0.net]
>>156
はい、ありがとうございます。
配列にして直してあります。
fscanf(fp,"%s",c)として読み込んだ後に
c[i]で一文字一文字表示させられると思い込んでいました

先ほどの156のおかげでfscanf(**** &c[i])を覚えられました
ありがとうございます!感謝してます

162 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 15:46:12.24 ID:b0CgZ3o1.net]
こんにちは。どうか本日もよろしくお願いいたします。
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;
}

163 名前:片山博文MZ mailto:sage [2017/12/08(金) 15:56:23.80 ID:8LWGXCju.net]
>>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;
}

164 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 16:02:05.10 ID:C0Y4l8FE.net]
そろそろうっとしいな

165 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 16:06:39.52 ID:b0CgZ3o1.net]
すみません、ここは質問するところじゃなかったのですね
他のC言語のスレから誘導されたので、こちらで質問していいかと思ったのですが
今後質問は控えます。自力で学習を進めようと思います。
ご迷惑をおかけしてすみませんでした。
片山先生、本日もありがとうございました。感謝です。

166 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 05:14:03.17 ID:Nra/Nglb.net]
#pragma pack(1)
struct {
char a;
short b;
int c;
} x;
Cでバイナリデータとかパディング除けに上のような感じに書いて読み書きしたりしますが(例は適当)、
C++ではpragmaを使用せず記述量も少ないスマートな記述方法はあるでしょうか?

167 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 09:10:24.00 ID:67ZudMHx.net]
ない

168 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 09:52:53.87 ID:Nra/Nglb.net]
ありがとうございます。やっぱりないですか。
pragmaがコンパイラ依存とか書かれてて非常に嫌なんですが慣れます。

169 名前:片山博文MZ mailto:sage [2017/12/16(土) 16:18:44.15 ID:2NfYNG63.net]
#include <pshpack1.h>
...
#include <poppack.h>

170 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 02:47:22.67 ID:T7tjmkgj.net]
C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか?



171 名前:デフォルトの名無しさん [2017/12/18(月) 01:24:26.49 ID:vrG0ZJDQ.net]
>>164
そのような構造体で直接読み書きしないのがベスト

172 名前:デフォルトの名無しさん [2017/12/21(木) 16:50:57.91 ID:FN6C0PcS.net]
ここが適切かわかりませんが、

make の Makefile を Visual Studio や NetBeans 等の IDE の
プロジェクトファイルに変換するツールはありませんか。

173 名前:片山博文MZ mailto:sage [2017/12/21(木) 16:54:33.43 ID:fHSTQ7CK.net]
makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。

174 名前:168 mailto:sage [2017/12/21(木) 17:10:02.95 ID:FN6C0PcS.net]
>>169 そこまでは分ったのですが、
Makefile を CMakeLists.txt に変換するのはありますか?

見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、
Python のスクリプトだけでした。。

175 名前:片山博文MZ mailto:sage [2017/12/21(木) 17:15:07.21 ID:fHSTQ7CK.net]
>>170
ない。

176 名前:168 mailto:sage [2017/12/21(木) 17:25:55.41 ID:FN6C0PcS.net]
>>171 ありがとうございました。
CMake 勉強します。

177 名前:デフォルトの名無しさん mailto:sage [2018/01/09(火) 19:29:59.07 ID:cBwAL66C.net]
ライブラリ作成の指南書みたいな本ってありますか。

178 名前:デフォルトの名無しさん mailto:sage [2018/01/09(火) 22:23:30.03 ID:9ubHCBZ8.net]
環境によるんじゃ?

179 名前:デフォルトの名無しさん [2018/01/10(水) 01:19:44.15 ID:CtX3Z92R.net]
とりあえず
c++のためのapiデザイン
でも読んでみるといいと思う

180 名前:デフォルトの名無しさん mailto:sage [2018/01/10(水) 02:59:55.08 ID:QjjLPcN0.net]
読んでみるわ



181 名前:デフォルトの名無しさん mailto:age [2018/01/13(土) 06:17:45.46 ID:hj3TLdcf.net]
定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの?

182 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 09:08:14.97 ID:P3TI7O0+.net]
趣味とか宗教とかの話であって、別に使って問題ない
ただ名前の先頭だったり、2回連続で使ったりすると
予約語に引っかかることがあるので注意(定数の場合も)

183 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 09:13:05.82 ID:M+vRxjCB.net]
その辺有名ライブラリのルール付けとか調べてみるのもいいかもね

184 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 09:23:55.53 ID:M+vRxjCB.net]
GoogleがC++のスタイルガイド公開してる
これも参考になりそう

185 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 10:54:12.13 .net]
C++で何つくんの?
GUIプログラムならC#のほうが圧倒的に簡単だし

186 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 11:06:50.90 ID:E1MTmeKy.net]
CAD

187 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 11:07:58.52 .net]
そんな上級者にしか用途がない言語か

188 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 11:24:35.41 ID:/aUGqjlJ.net]
個人的にC/C++は高級なアセンブラだと思っている
C#とは存在するレイヤが違うから、比較条件として用途を挙げるのはちょっと違うかなって

189 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 11:25:50.16 .net]
で、何つくんの?
高級アセンブリの用途は?

190 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 12:09:46.86 ID:J2S5K16W.net]
画像処理
大規模ゲーム開発



191 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 12:32:40.41 ID:6i0TmEx8.net]
GoogleChrome

192 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 13:22:26.10 ID:6uwiuQcq.net]
ゲームとか速度が必要な場面でまだまだ使われてるでしょ

193 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 15:46:42.36 ID:e8xaSAkW.net]
CPUパワーを必要とするようなまとまった処理は
C/C++のような低級な高級言語が適している
組み込み用の小規模マイコンもCがほとんど

194 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 19:09:30.75 ID:Vb1E5r0O.net]
Pythonのライブラリも結局はCで作ってたりするしな。

195 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 00:06:48.74 ID:kWLOq5lU.net]
GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。

196 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 01:07:00.24 ID:X2mlxDcY.net]
OpenGLもC#か大変そうだな

197 名前:愛知人 mailto:sage [2018/01/17(水) 09:14:59.53 .net]
Unityでいいよね

198 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 11:15:20.21 ID:X2mlxDcY.net]
ライセンス料が只ならいいよ

199 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 11:23:31.36 ID:4ILD3/U5.net]
Unityでも速度が必要な場所はC++で書いて呼び出し

200 名前:愛知人 mailto:sage [2018/01/17(水) 11:48:22.30 .net]
なんでC++ってendlいるの?



201 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 12:24:58.46 ID:/z6RTYd5.net]
ちょっと何言ってるかわかんないです

202 名前:愛知人 mailto:sage [2018/01/17(水) 13:34:56.30 .net]
なんでprintf使わないの?

203 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 13:41:03.90 ID:lhJfQamL.net]
浪人と引き換えに無知を手に入れた男

204 名前:愛知人 mailto:sage [2018/01/17(水) 13:43:22.44 .net]
で、返答は?

205 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 14:07:42.46 ID:l2H41H1D.net]
>>198
<cstdio>は正しくC++だからprintf使っても構わん 味噌 よ
後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね
endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?

愛知語は詳しくないけど察し手羽先

206 名前:愛知人 mailto:sage [2018/01/17(水) 14:16:18.48 .net]
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w

207 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 14:19:41.37 ID:l2H41H1D.net]
言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て
「人生を無駄にした」と真顔で後悔してるところだから

208 名前:デフォルトの名無しさん [2018/01/17(水) 15:03:17.62 ID:MeUm47mp.net]
何言ってんだこのバカ

209 名前:愛知人 mailto:sage [2018/01/17(水) 16:08:09.91 .net]
あらら、怒っちゃった(笑)

210 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 17:39:52.90 ID:sykUBtM3.net]
C++でしかできないもの作りたいだけど何かいいアイデアない?



211 名前:片山博文MZ mailto:sage [2018/01/17(水) 17:52:07.55 ID:89SqY/Kf.net]
>>206
エクセルのような操作性の、画像レイアウト印刷アプリなんてどう?

212 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 18:18:50.66 ID:sykUBtM3.net]
>>207
印刷はしたくないです..

213 名前:デフォルトの名無しさん mailto:sage [2018/01/17(水) 20:00:30.20 ID:W2btjMLE.net]
おs

214 名前:デフォルトの名無しさん [2018/01/27(土) 06:58:59.63 ID:1R9xhZBX.net]
windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった
そこでC+11の一部が使えるようになったから使いたいと思ってる
ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。

ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ない

215 名前:じゃないのとか気をつけた方がいいよとかあれば意見よろしくです []
[ここ壊れてます]

216 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 08:45:12.76 ID:x9sgfrz+.net]
バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。

217 名前:デフォルトの名無しさん [2018/01/27(土) 10:25:52.07 ID:RqfNKOXi.net]
ユーザからクロスコンパイラ提供してもらってバイナリ配布っす
nmコマンド、試す価値はありそうだありがとう

218 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 06:43:38.82 ID:yhuRz+yt.net]
以下のコードを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&)>' への変換が要求されました」
というエラーになるのですが、どうしてでしょうか?
そもそもラムダ式は関数オブジェクトのシンタックシュガー、つまり等価なのではないんでしょうか?

219 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 07:45:35.06 ID:kxFN6buW.net]
>>213
戻り値がintになってる
戻り値の型を後置で書いてやればいいかな
function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; };

220 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 22:25:05.79 ID:yhuRz+yt.net]
>>214
ありがとうございます。
戻り値の型を明示してあげないと値渡しになってしまうということですね。
勉強になりました。



221 名前:デフォルトの名無しさん [2018/02/06(火) 23:57:09.32 ID:ZZWnbRb2.net]
typedef int myTypeA;
typedef int myTypeB;

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

のような事例で、引数に応じて専用のセッターを用意したいのですが、
int型の2種類の引数に対して、上記のように書くとコンパイルエラーになってしまいます。
どのようにするのが良いでしょうか?

222 名前:デフォルトの名無しさん mailto:sage [2018/02/07(水) 00:04:25.80 ID:k5RJAFTX.net]
structを使う?
struct my_TypeA{ int v;};

223 名前:デフォルトの名無しさん mailto:sage [2018/02/07(水) 00:18:25.18 ID:yuAfwWTK.net]
なるほど、、、確かにtypedefだと別名になるだけですね
structかclassで別の型にしないとダメですね
ありがとうございます!

224 名前:デフォルトの名無しさん mailto:sage [2018/02/07(水) 03:43:04.13 ID:LQaGrglb.net]
オブジェクト指向では、型による分岐処理は無くなる。
汎化

f(親型)

ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向

225 名前:デフォルトの名無しさん mailto:sage [2018/02/09(金) 15:21:46.70 ID:+q9wZMZv.net]
などと訳のわからないこと(でもないが)を供述しており

226 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 04:59:49.56 ID:9irhhPDg.net]
C++には強いエイリアスが無いからなあ

227 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 16:21:25.57 ID:UAqVoMsi.net]
C++じvtable参照することになるから遅いだろ

228 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 04:05:35.43 ID:Zrtx8k52.net]
>>216
セットする値の名称にする
例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる
プロパティとして使うのだから、setXXX()みたいに書かなくてもいい

setter単独で存在することはありえないからgetterも設けること
setterって余り必要ない
コンストラクタからの初期化で十分の場合が多い

229 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 14:23:16.60 ID:8l5JrV0a.net]
>>219
だぶるでぃすぱっち

230 名前:デフォルトの名無しさん [2018/03/03(土) 13:43:59.95 ID:Vl4EAVf3.net]
2の累乗でないときのmod演算の高速化の方法、何か



231 名前:ありませんか?
そこらへんはコンパイラで最適化されるんですかね
[]
[ここ壊れてます]

232 名前:デフォルトの名無しさん mailto:sage [2018/03/03(土) 14:09:48.07 ID:xC+xvi0u.net]
>>225
法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。
法が固定で何度も剰余を取るならモンゴメリリダクションがある。
どちらも乗算はそれなりに必要。

233 名前:デフォルトの名無しさん [2018/03/03(土) 14:14:16.62 ID:Vl4EAVf3.net]
>>226
ありがとう
ちょっと調べてくる

234 名前:デフォルトの名無しさん [2018/03/06(火) 00:16:25.34 ID:EXuXevGu.net]
ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。

235 名前:デフォルトの名無しさん mailto:sage [2018/03/06(火) 00:47:05.22 ID:yCnPPW+5.net]
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()
{

}

236 名前:デフォルトの名無しさん mailto:sage [2018/03/06(火) 00:55:45.44 ID:yCnPPW+5.net]
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>がスコープから外れアンロック

というシーケンスを期待しています。

237 名前:230 mailto:sage [2018/03/06(火) 00:58:37.27 ID:yCnPPW+5.net]
誤:読み出し元スレッド
正:呼び出し元スレッド

238 名前:230 mailto:sage [2018/03/07(水) 00:28:47.80 ID:+JS1hm36.net]
すみません、他スレで聞きます。

239 名前:デフォルトの名無しさん mailto:sage [2018/03/07(水) 19:00:17.77 ID:BpTZedcA.net]
事情があって下記の型の関数を、
void Func1(char a);

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

動作としてはFunc1(123)と呼んだときと同じものを期待しており、
試したところそれっぽく動作しているのですが、
致命的な問題等あります?
"暴走の危険あり"など。

240 名前:デフォルトの名無しさん mailto:sage [2018/03/07(水) 19:20:05.55 ID:/Jrz1mw6.net]
スタックに積むサイズは通常int
long longとかで無ければ実害は無い



241 名前:デフォルトの名無しさん mailto:sage [2018/03/07(水) 19:29:05.35 ID:iizJnzkK.net]
>>233
C11の6.3.2.3の8によると、the behavior is undefinedだ。
たとえばcharが4バイトに自動昇格して、ポインタが8バイトだったりすると、
どうなるかわかったもんじゃない。鼻からなんちゃらだ。
C++は知らん。

242 名前:片山博文MZ mailto:sage [2018/03/07(水) 19:29:59.98 ID:Ssa+vNsg.net]
sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな?

243 名前:デフォルトの名無しさん mailto:sage [2018/03/07(水) 19:34:38.56 ID:iizJnzkK.net]
そうそう、undefinedのあとはほんとに何が起きるかわからんよ。
コンパイラが何をしでかしても文句言えない。
たまたま今の環境で動いても、明日コンパイラを更新したら挙動が変わりうる。

244 名前:デフォルトの名無しさん mailto:sage [2018/03/07(水) 20:01:22.38 ID:MtWgjxh8.net]
「事情があって」の事情を解消する方が安全だと思うけど…。
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); // 明らかに不正アラインメントだが

245 名前:はちみつ餃子 mailto:sage [2018/03/07(水) 20:34:34.64 ID:TWOfgg7C.net]
>>233
関数ポインタ同士は互換で、お互いにキャストすることは許される。
が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。

246 名前:デフォルトの名無しさん mailto:sage [2018/03/10(土) 22:50:07.25 ID:tBgkA+tH.net]
C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか
windows.hで一つ一つボタンの位置を設定してハンドルやらコールバックと格闘するもんなんでしょうか
それとも何か気の利いた便利なライブラリとかがあるんでしょうか

というかこの手のライブラリやフレームワーク的なものを探したりしたい場合はどういう場所から情報を集めるものなんでしょうか
それっぽいキーワードでgoogleで検索して探そうとしても上手く情報を見つけられないのですが、根気よくページを確認していくしかないのでしょうか

247 名前: mailto:sage [2018/03/10(土) 23:05:33.56 ID:+Ww908Qw.net]
>>240
基本的には win32api を使うことになり、私は C++ からwin32api( ::DefWindowProc() とか)を個別呼び出している
気の利いたライブラリのことはよく知らない

248 名前:デフォルトの名無しさん mailto:sage [2018/03/10(土) 23:18:25.22 ID:tBgkA+tH.net]
やっぱりそういう感じになるんですね
頑張って勉強します

249 名前:デフォルトの名無しさん mailto:sage [2018/03/10(土) 23:42:00.51 ID:4x8PIJN4.net]
>>240
Windowsに特化するなら Win32APIのほかにMFCやWTLや.NET framework(C++/CLIで良ければ)などのライブラリを使う
サードパーティならC++ BuilderのVCLとかあとはクロスプラットホームのQtとかGtk+とかwxWidgetsとか他にもあると思うけど
最近はデスクトップアプリが落ち目なのでこれという定番はなくて目的に応じて分散しているのでは?
自力で情報が集められない程度ならC++でGUIなんて止めとけという気がしないでもない

250 名前:デフォルトの名無しさん mailto:sage [2018/03/11(日) 00:23:13.22 ID:5+tjHPTy.net]
ありがとうございます。それぞれ見てみます



251 名前:デフォルトの名無しさん mailto:sage [2018/03/11(日) 00:43:28.70 ID:QedwXA9H.net]
vs2010以降ならWIN32SDKベースでも雛型吐いてくれるだろうに

252 名前:片山博文MZ mailto:sage [2018/03/11(日) 03:53:08.43 ID:4ez4tjCr.net]
>>240
ボタンの配置などは、リソースエディタでダイアログテンプレートを作ってDialogBox関数を呼べば、細かい調整ができる。
イベント駆動やメッセージ送信などについては、<windowsx.h>で提供されるメッセージクラッカーやマクロを使えば便利になる。
私が複雑なことをする場合は、MZC4という自作のクラスライブラリを使ってる。

253 名前:片山博文MZ mailto:sage [2018/03/11(日) 03:59:42.40 ID:4ez4tjCr.net]
HANDLE_MSGマクロによるメッセージクラッカーという仕組みを使えば、ウィンドウプロシージャやダイアログプロシージャの記述が楽になる。
私はさらに、HANDLE_MSGの呼び出し先の関数の入力を楽にする自作のMsgCrackというツールを使っている。

254 名前:はちみつ餃子 mailto:sage [2018/03/11(日) 04:12:58.32 ID:f5R2yX0u.net]
WinRT が綺麗にまとまってると思う。
https://github.com/Microsoft/cppwinrt
Windows API を現代的な C++ に合わせて整理したものなので、
C++ 的にある程度まともな感じがする。

昔は仕方がなかったんだろうけど、
今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな〜。

255 名前:デフォルトの名無しさん [2018/03/11(日) 10:27:16.51 ID:zWe+i43K.net]
>>240
tcl/tkが一番手軽

256 名前:デフォルトの名無しさん mailto:sage [2018/03/11(日) 10:40:38.07 ID:1J69PCFW.net]
Win32プログラミングスレあったっけ

257 名前:デフォルトの名無しさん mailto:sage [2018/03/11(日) 10:51:25.22 ID:QedwXA9H.net]
Win32API質問箱 Build124
mevius.5ch.net/test/read.cgi/tech/1510395780/

258 名前:デフォルトの名無しさん [2018/03/11(日) 10:55:00.37 ID:zWe+i43K.net]
Win32APIスレは限定的だからGUI一般スレみたいなのの方を紹介しようと思ったが面倒なので
次の方どうぞ


259 名前:デフォルトの名無しさん mailto:sage [2018/03/11(日) 11:28:30.29 ID:1J69PCFW.net]
>>251
どうも

260 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 02:15:34.18 ID:Cvix3isA.net]
何度も呼ばれる関数内ではローカル変数をstaticにした方が速いのですか?



261 名前: mailto:sage [2018/03/12(月) 02:19:53.88 ID:9vbtopii.net]
>>254
誤差だ、
プログラミングスタイルを曲げてまですることではない

262 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 02:23:59.34 ID:Cvix3isA.net]
>>255
さいですか ありがとうございました

263 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 02:50:45.99 ID:SGROmA8V.net]
皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか?
速さを突き詰める為の工夫というより、誤って異常に処理時間のかかるようなプログラムを作らないようにする為にはどのような事を意識すると良いのでしょうか

264 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 03:02:50.40 ID:9wDOvV2B.net]
staticの方が速い理由なんて一つも無いような
あまり呼ばれない場合はstaticの方が遅いよね、キャッシュ的に
マルチスレッドで邪魔だし、必要がある時以外は使うもんじゃないよ

265 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 03:20:38.17 ID:IdW8RVi3.net]
>>257
メモリアクセスのコストだあ

266 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 03:57:56.72 ID:SGROmA8V.net]
>>258
多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか

267 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 04:48:35.89 ID:Ajs1ZroQ.net]
>>257
実行速度は推測ではなく測定することが鉄則だから
出来ることは気になったときに正しく測定出来るようにすることくらいだ

268 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 08:13:41.87 ID:0T8K0H1S.net]
>>257
ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。
あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。

269 名前:はちみつ餃子 mailto:sage [2018/03/12(月) 12:47:06.75 ID:wZFlYBXj.net]
計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。

270 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 16:25:47.91 ID:JoWTM6VO.net]
>>262
>>263
ほんこれ



271 名前:デフォルトの名無しさん mailto:sage [2018/03/12(月) 17:58:03.22 ID:WDt4qsqW.net]
待て待て、>>257は速度追求の話ではないだろう
無駄なループを通らせないとかそういう話でしょ?

272 名前:はちみつ餃子 mailto:sage [2018/03/13(火) 04:04:12.70 ID:jwCzlKtk.net]
エッジケースで極端なことになってしまうって話かな?
そういうのは単に気をつけるしかしゃーない。
発覚したときに直せるような体制にしておけ〜

273 名前:デフォルトの名無しさん mailto:sage [2018/03/13(火) 11:25:42.37 ID:nL3Sy1ZA.net]
>>257
とりあえず注意すべきは線形探索かな
何も考えずに使われると素敵なことになる

274 名前:デフォルトの名無しさん mailto:sage [2018/03/13(火) 11:43:48.99 ID:WyB9s+s4.net]
クラスAのメンバ関数へのアクセスをクラスBのみに許すにはどうすればいいですか?
(メンバ関数をfriend指定するのはBがAのプライベートメンバにもアクセスできてしまうのでNGです)

275 名前:デフォルトの名無しさん mailto:sage [2018/03/13(火) 13:15:04.74 ID:WyB9s+s4.net]
自己解決
passkeyイディオムを使えばいいんですね
言語仕様でサポートしてほしい気もしますが

276 名前:デフォルトの名無しさん [2018/03/15(木) 23:07:46.82 ID:rOhYRyTV.net]
できる人にとってはくだらないことなんだと思うのですが、
char* c;
char *c;
この2つは一緒なのですか?

277 名前:デフォルトの名無しさん mailto:sage [2018/03/15(木) 23:12:48.58 ID:jcfpYhJu.net]
char * c;
とか
char
*
c
;

も含めて一緒

278 名前: mailto:sage [2018/03/15(木) 23:13:16.42 ID:xYxZI4zx.net]
>>270
一緒ですが個人的に後者を推奨します

279 名前:デフォルトの名無しさん [2018/03/15(木) 23:21:50.62 ID:rOhYRyTV.net]
>>270
>>271
ありがとうございます
どちらが正しいのか、機能が違うのか、よくわかっていなかったのがスッキリしました

280 名前:デフォルトの名無しさん mailto:sage [2018/03/15(木) 23:24:52.27 ID:dUMa9unA.net]
>>270
前者だと
char* a, b;
って書いたとaとbの型が変わっちゃうから常に後者方式で
char *a, *b;
みたく書くことをオススメする



281 名前:はちみつ餃子 mailto:sage [2018/03/15(木) 23:48:02.28 ID:VBbQqJBt.net]
ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。

char* a;
char* b;

まあ人によって色々やね。

282 名前:デフォルトの名無しさん mailto:sage [2018/03/15(木) 23:48:51.41 ID:ipLBerzI.net]
そんな迷うならtypedefしてしまえ

283 名前:はちみつ餃子 mailto:sage [2018/03/15(木) 23:52:42.60 ID:VBbQqJBt.net]
C++ なら std::add_pointer を使うのも手やぞ。
普段から使うには綴りが長い気もするな。

284 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 00:04:03.30 ID:/SwLgzhl.net]
ワイも後ろに寄せるスタイルの方が好きやな
別に自由ではあるけど、前に寄ってるとなんか違和感あるわ

285 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 00:12:21.27 ID:eqCACABM.net]
この話始まるとスレが荒れるわけだが。

俺は
char *a;
int & ref;
だ。

286 名前:はちみつ餃子 mailto:sage [2018/03/16(金) 00:27:41.31 ID:5DWUPgeG.net]
C++ だとスッポスッポ先生が (というより D&E の文中にあるコードが) アスタリスクを型名にくっつけるスタイルで書いてあるから、
設計者的にはこれが推しなんやろなて思うたんや。

287 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 00:49:37.90 ID:7Nt6p3N1.net]
そもそもCならまだわかるがC++になってもこの謎仕様が改善されてないのがおかしいわな

288 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 01:19:43.79 ID:pAByTZwR.net]
char *a;派だがキャストは(char*)だな

289 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 06:18:52.71 ID:hczQTGC7.net]
両方に空白入れたり
両方詰めたらどうなるん

290 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 10:14:04.60 ID:x1iYgKqh.net]
>>275
これ



291 名前:デフォルトの名無しさん [2018/03/16(金) 16:35:23.76 ID:3ma6aQHv.net]
>>274
それな
前者は誰が流行らしたんだハゲか

292 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 18:15:24.73 ID:tA4eZSmU.net]
``int* p;''と``int *p;''はどちらが正しいですか
www.libjingu.jp/trans/bs_faq2-j.html#whitespace

まあハゲの影響はあると思う

293 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 18:16:24.05 ID:YfjbsaKN.net]
偉い人が前で統一させてたから倣ってる

294 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 19:01:00.72 ID:EjV6B4+T.net]
>>285
マイクロソフトじゃないか?

295 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 22:46:14.86 ID:KxYkqF9B.net]
[]演算子は変数の後ろしか置けないので迷いがない

296 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 22:50:13.34 ID:r/T+njCz.net]
変数との間に空白を入れるか入れないか選択の余地がある

297 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 23:05:45.65 ID:/SwLgzhl.net]
正直、選択の余地が無い方が嬉しい

298 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 23:17:53.08 ID:7Nt6p3N1.net]
ある意味欠陥の1つ

299 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 23:24:49.74 ID:YbTBBkUF.net]
>>289
リテラルの後ろにも置ける

300 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 23:28:34.45 ID:/SwLgzhl.net]
あと数字の後ろにも置けるよな確か
x[2]は2[x]でも普通に動作するらしい、使ったことはないが



301 名前:デフォルトの名無しさん mailto:sage [2018/03/16(金) 23:32:56.43 ID:W1kNbC1+.net]
参照型&ってあまり使われないのか

302 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 02:01:02.93 ID:UGDcJiJh.net]
>>293
宣言の中の型としての*の位置を問題にしてるのだから、式の中での*が使える位置については別の話でしょ。

303 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 17:02:13.24 ID:B2oEmArJ.net]
インデントってタブ文字使うよりもスペース使った方がいいんですか?

304 名前:片山博文MZ mailto:sage [2018/03/17(土) 17:07:21.02 ID:6umCop+M.net]
>>297
見た目とコンパイル速度のどちらを優先するかによる。

305 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 17:32:05.08 ID:Ak7laUjo.net]
タブコードはエディタの設定に見た目が左右されるので使わない方がいい

306 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 17:39:18.45 ID:B2oEmArJ.net]
うーん、やっぱりタブは使うべきではないんですね

307 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 17:41:47.51 ID:Ak7laUjo.net]
昔は1バイト当たり単価が高かったからね

308 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 20:01:33.65 ID:hl7Y0kGo.net]
エディタの機能向上による要素が大きいな。
インデントやその削除にキーを何度も叩かなきゃならない状態だったらTABがまだ主流だったろう。

309 名前:デフォルトの名無しさん mailto:sage [2018/03/17(土) 22:45:16.37 ID:NcDC59dQ.net]
>>294
初めて知ったw

310 名前:はちみつ餃子 mailto:sage [2018/03/18(日) 04:35:20.62 ID:7ElIFee1.net]
>>294
他にも変な仕組みは色々とあるけど、これはひとつとして使いどころが思いつかんよな。



311 名前:デフォルトの名無しさん mailto:sage [2018/03/18(日) 06:08:40.04 ID:QnqZv5w6.net]
int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、
a[5] と *(a + 5) が同等で + 演算子の交換可能性から *(5 + a) も可、
それなら 5[a] も同じじゃなきゃ片手落ちだよね、って発想というか、
過去のコンパイラの実装とも関係がありそうな気がする。

もちろん、古いCコンパイラとのソース互換性が問題になるほど
みんなが使ってた書き方とは思わないけど。

312 名前: mailto:sage [2018/03/18(日) 11:53:22.56 ID:ojW1vPJY.net]
>>304
IOCCC …

313 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 16:56:43.36 ID:PiAC+2Zr.net]
i++ と ++iって最適化すればほとんど変わらないか、あるいは++iの方がちょっと速いくらいですよね?
なんでi++の方がデファクトスタンダードみたいになってるんでしょう?
ほぼ無視できる程度のメリットしかないとしても、++iと書くデメリットがないと思うのですが

314 名前:はちみつ餃子 mailto:sage [2018/03/20(火) 18:20:40.65 ID:N1yoGURK.net]
>>307
インクリメントの対象が整数しかなかった C からの習慣がなんとなく引き継がれてるだけ。
後インクリメントは気持ち悪いと考える人は少なくはないし、
値を使わないなら前インクリメントにするのは C++ では良い習慣だよ。

315 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 20:17:17.59 ID:UFFOOrdu.net]
++C言語

316 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 20:18:05.88 ID:O958tZqO.net]
>>308
なるほど、最初はちゃんと意味があったんですね
納得できました
ありがとうございます

317 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 22:04:48.60 ID:+J5xJfYE.net]
Cでインクリメントやデクリメントに後置が使われがちな理由は
a = *p++; みたいなポインタの使い方で手が慣れたせいもあるかと思う。

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

個人的には、どっちでも構わない場面ではCでは後置、C++では前置で書くかな。
特に単純なforで++iと打つと、途端にC++で書いてる気がしてくる。

318 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 22:08:04.94 ID:I2zEd3jr.net]
本当に性能に差が出たの?測ったの?

319 名前:デフォルトの名無しさん mailto:sage [2018/03/20(火) 23:46:13.85 ID:ZVuOcNlA.net]
GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな

320 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 00:00:26.00 ID:2Gb2uvWn.net]
単純なforなら同じコード吐くんじゃね?



321 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 00:36:19.45 ID:OwhHF7Zm.net]
単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、
基本的には更新前のオブジェクトの状態の退避などの処理が必要な後置インクリメントよりコストの少ない前置インクリメントが好まれるのだと思うよ。

322 名前:はちみつ餃子 mailto:sage [2018/03/21(水) 01:30:43.51 ID:MouF+uE4.net]
結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても
ほとんどのコードは壊れないと思うんだけど、そういうルールを言語仕様に追加するのはもう出来ないかなぁ?

323 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 01:40:04.19 ID:CmybL5Dk.net]
まぁ、出来るなら既にやってるでしょ
ぶっちゃけ、よっぽどシビアに速度を求める訳でないなら前置後置の差なんて気にする必要無いんじゃないかなぁ

324 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 19:45:28.97 ID:2N3cG+sW.net]
そもそも速度を気にして
記述を変えるって
間違ってる気がする・・

325 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 19:50:40.96 ID:eUhtaSa6.net]
時代は変わったか
昔はそんな事は当たり前だった

326 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 19:51:54.96 ID:eUhtaSa6.net]
機能に対して糞重いソフトが多いのも
ソフトに対する価値観が変わったからか

327 名前:はちみつ餃子 mailto:sage [2018/03/21(水) 19:55:34.20 ID:MouF+uE4.net]
>>318
速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ?

328 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 20:23:31.47 ID:NRxI71LE.net]
>>321
お前のコードは無駄ばかり
コンパイラも無駄命令を吐く
そもそもCPUの動作自体が無駄ばかり
そのプログラムを作るのも無駄だったり

お前の存在は?

329 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 20:37:50.64 ID:L8aCdycT.net]
本スレでやれ

330 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 20:54:50.63 ID:b8e3mX8M.net]
手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない?
後置の方が保守性が高いとか可読性が高いならともかく、そうじゃないんだから天秤にかける必要さえない



331 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 20:59:28.52 ID:CmybL5Dk.net]
>>321
それで見やすくなるなら別にいんじゃね

332 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 22:35:08.33 ID:TV3lE0eZ.net]
効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる

333 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 22:37:05.71 ID:D2465Z9C.net]
どんなメリットがあるので?

334 名前:はちみつ餃子 mailto:sage [2018/03/21(水) 22:39:19.66 ID:MouF+uE4.net]
ホントは最適化でだいぶん上手いことやってくれるんやけどな。
というか最適化でやるべきことだと思う。
細かいことまでいちいち配慮しなきゃならないのは最適化技術の敗北。
仕様に [[likely]] なんて入ったのは不格好な話だ。

335 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 23:03:06.41 ID:TV3lE0eZ.net]
イテレータの++や―に戻り値があること自体設計ミス
ポインタのと類似性そこまで要らんし
イテレータで *it++ とか書きたくて仕方ない人もそんなに居ないだろ
void型でよかった

336 名前:デフォルトの名無しさん mailto:sage [2018/03/21(水) 23:08:57.12 ID:52xrh1Hk.net]
アセンブラの inc やdec 命令実行時のフラグ反映は不要?
高級アセンブラの名残じゃね?

337 名前:はちみつ餃子 mailto:sage [2018/03/21(水) 23:14:08.41 ID:MouF+uE4.net]
>>329
逆じゃないかなぁ。
ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。
どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。
ちなみに operator++ の返却値を void にすることは出来ます。

338 名前: mailto:sage [2018/03/22(木) 00:37:09.57 ID:2FEQ/Wa3.net]
>>330
inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが

339 名前:デフォルトの名無しさん mailto:sage [2018/03/22(木) 00:58:21.46 ID:dLiR/Xt3.net]
なぜポストインクリメントがよく使われるかは、
PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。
間接参照したあとにレジスタが増える。
オートデクリメントは逆にプレデクリメント。

あとinc,decでフラグが変化するのもPDP当時は当然の動作。

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

俺はプログラム言語でC++が一番すきです。 



341 名前:デフォルトの名無しさん mailto:sage [2018/03/22(木) 07:05:57.55 ID:C5Ula1AM.net]
またイミフなレスしてるのか

342 名前:デフォルトの名無しさん [2018/03/22(木) 07:15:53.52 ID:tiDItZ1f.net]
C--があってもいいかもしれないな。

343 名前:デフォルトの名無しさん [2018/03/22(木) 09:44:57.12 ID:Q2/ylW7b.net]
C♭思い出した

344 名前:はちみつ餃子 mailto:sage [2018/03/22(木) 10:24:04.20 ID:HExEyyqO.net]
>>336
ググればすぐにわかることだけど、有るよ。

345 名前:デフォルトの名無しさん mailto:sage [2018/03/22(木) 17:42:41.78 ID:Z5xjYgF/.net]
unordered_setやunordered_mapは
reserve(size_type)はあるのにshrink_to_fit()がないのはなぜですか?

346 名前:デフォルトの名無しさん [2018/03/22(木) 18:14:23.23 ID:tiDItZ1f.net]
ハッシュだからじゃないの。

347 名前:デフォルトの名無しさん [2018/03/26(月) 20:46:12.70 ID:qgnj+CJa.net]
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]);

とキャストしているのでしょうか?

348 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 20:52:31.38 ID:Sl5sXtlN.net]
0x80以上の時符号拡張されてマイナスになるから

349 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 20:55:55.86 ID:qgnj+CJa.net]
char型の値は 0 から 127 までであると本に書いてあるのですが。。。

350 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 20:58:30.32 ID:Sl5sXtlN.net]
>>343
その本は窓から投げ捨てろ。
ー128〜127が正解だ



351 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 21:01:09.95 ID:qgnj+CJa.net]
>>344

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

アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。

352 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 21:02:33.45 ID:qgnj+CJa.net]
>>344

何か不具合が起こる例を教えていただけると助かります。

353 名前:片山博文MZ mailto:sage [2018/03/26(月) 21:06:19.73 ID:42MV7MT1.net]
>>346
char ch = 255;
printf("%d\n", ch);

C/C++では、オーバーフローは警告なく普通に起こる。

354 名前:片山博文MZ mailto:sage [2018/03/26(月) 21:10:11.27 ID:42MV7MT1.net]
signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、
printf("%c\n", (char)255);

355 名前:片山博文MZ mailto:sage [2018/03/26(月) 21:11:26.75 ID:42MV7MT1.net]
printf("%d\n", (char)255);
%dね。

356 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 21:42:10.96 ID:3IjTFjn0.net]
>>344
>>348
そんな事は決まってない

357 名前:片山博文MZ mailto:sage [2018/03/26(月) 21:52:30.42 ID:42MV7MT1.net]
charのビット数、CHAR_BITが8ではない環境はほとんど

358 名前:ネい。 []
[ここ壊れてます]

359 名前:片山博文MZ mailto:sage [2018/03/26(月) 22:00:14.93 ID:42MV7MT1.net]
4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。

360 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 22:58:41.82 ID:3IjTFjn0.net]
ほとんど無いから何?
「決まってない」の反論になってないよ

現行品でcharが16bitの環境があるんだけどね



361 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 23:00:24.31 ID:3IjTFjn0.net]
charが符号付きとも決まってない
ちょうど今符号無しの環境を使ってるよ

362 名前:片山博文MZ mailto:sage [2018/03/26(月) 23:02:53.12 ID:8aZ5PUAj.net]
インテル入ってない

363 名前:デフォルトの名無しさん [2018/03/26(月) 23:03:06.95 .net]
俺のcharは100bitあるぜ!!

364 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 23:04:42.66 ID:3IjTFjn0.net]
とりあえず>>1を読んどけ

365 名前:デフォルトの名無しさん mailto:sage [2018/03/26(月) 23:55:34.36 ID:2w8Ha0HC.net]
char と signed char を混同するクソコテ

366 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 01:28:23.66 ID:bCiMyjcv.net]
今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。

初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。

367 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 01:33:34.51 ID:GW1/xmrB.net]
unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き
以外に遭遇した事無いけどな

368 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 02:55:06.24 ID:oddUVIdN.net]
>>359
>>341の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。
そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では?

369 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 07:09:18.07 ID:vavxlF2f.net]
???
環境を明示しろって言うのは>>1にも書いてあるんだが...

370 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 07:42:58.98 ID:7BdcIkqa.net]
>>361
初心者だろうと質問に付随する前提知識は必要
変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある

まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう



371 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 07:52:49.58 ID:ofLFYE4b.net]
回答者もわかってないからな
>>352とか

372 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 08:13:51.03 ID:ofLFYE4b.net]
4ビットCPUだとcharは4ビットと思ってんのか?

373 名前:デフォルトの名無しさん [2018/03/27(火) 08:39:25.07 ID:tnecWY6M.net]
>>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が拡張機能だったことと関係あるとかないとか。

374 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 08:41:45.88 ID:7BdcIkqa.net]
4bitのcharか、アルファベットが表現できないな

まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね
なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど

375 名前:デフォルトの名無しさん [2018/03/27(火) 09:55:59.95 ID:dDmfqIPV.net]
int *p = new int[100];
delete[] p;

delete[] p で int 100個分の領域を解放するのだと思いますが、
どうやって、 p が int 100個分の領域を指していると分かるのでしょうか?
p は単なる int 型へのポインタです。

376 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 10:02:58.95 ID:GW1/xmrB.net]
>>366
つ -fsigned-char/-funsigned-char

377 名前:デフォルトの名無しさん [2018/03/27(火) 10:03:09.61 ID:dDmfqIPV.net]
スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある
そうですが、なぜ、エラー終了にしないのでしょうか?

378 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 10:56:59.81 ID:r9AxIBc/.net]
>>368
良くある実装としては
newが返すアドレスの前にヘッダ情報がある

379 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 10:59:24.01 ID:r9AxIBc/.net]
>>370
(すぐに)わからないから

380 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 13:22:10.84 ID:KACb5w79.net]
素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう
バッファオーバーフローの場合は割り当てたメモリとバッファ境界がミスマッチなら直ぐにエラー検出できないとしても仕方がないけどこれは質問とは別の話



381 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 14:41:48.71 ID:1PffFgMm.net]
配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか?
例えばint型配列のfooとint型変数のbarがあったとして、
int n = foo[10000]; と
int n = bar;
の速度は同じですか?

382 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 14:55:45.68 ID:Z/OsE5Ku.net]
添字の値にかかわらず一定
foo[10000] と foo[1] が同じって話だぞ

383 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 14:59:13.83 ID:1PffFgMm.net]
>>375
ありがとうございます
だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね?

384 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 15:02:49.07 ID:jMKP3TFv.net]
レッツ実測&吐き出したコードを確認
最適化具合でも全然ちがう

385 名前:デフォルトの名無しさん [2018/03/27(火) 15:06:05.02 ID:dDmfqIPV.net]
>>377

吐き出したコードってどうやって確認するんですか?

386 名前:デフォルトの名無しさん [2018/03/27(火) 15:06:56.79 ID:dDmfqIPV.net]
>>371-372

ありがとうございました。
そのあたりのことを詳しく書いてある本はありますか?

387 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 15:07:03.67 ID:1PffFgMm.net]
>>377
確かにそうですね
ありがとうございます、やってみます

388 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 15:08:28.42 ID:Di3KX/fh.net]
ポインタから値を読み込む場合は?

389 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 15:16:11.82 ID:jMKP3TFv.net]
>>378
使っている環境による
機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する

もっと前のアルゴリズムの検討は済んでて、
もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね?

390 名前:はちみつ餃子 mailto:sage [2018/03/27(火) 17:26:05.07 ID:6NyejsSC.net]
>>343-344

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

>>345

言語仕様では文字がアスキーコードとは保証してないんだ。
ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、
EBCDIC とかでも言語仕様には違反しない。



391 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 18:20:11.37 ID:ofLFYE4b.net]
>>373
並のOS環境って何だよwww

一般的なMCUのほとんどは
アドレス変換テーブルの仕組みがなく
スタックオーバーフローを検出するハード的仕組みも無い

392 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 18:21:21.80 ID:ofLFYE4b.net]
>>383
無知は出てくるな

393 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 20:25:43.43 ID:GW1/xmrB.net]
BASIC Stamp でもやってればいいのに

394 名前:デフォルトの名無しさん [2018/03/27(火) 22:12:36.71 ID:gjFRbLOq.net]


395 名前:つスレッドがある
片方はstd::queueにつんで、もう片方はそれを取る

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


環境はg++とVC++です
[]
[ここ壊れてます]

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

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

一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる

397 名前:デフォルトの名無しさん [2018/03/27(火) 23:21:17.42 ID:dDmfqIPV.net]
スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか?

398 名前:デフォルトの名無しさん [2018/03/27(火) 23:30:03.49 ID:4E83+S2j.net]
>>387
昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。
注意としてspurious wakeupというのも書いてある。
もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。

399 名前:デフォルトの名無しさん mailto:sage [2018/03/27(火) 23:38:12.48 ID:zFrY2ZyB.net]
>>389
してる環境もあれはしてない環境もある

400 名前:はちみつ餃子 mailto:sage [2018/03/27(火) 23:46:19.51 ID:6NyejsSC.net]
>>389
ページ単位ではしていることがある。
OS がメモリの割付を管理していて、
足りなければ追加で割り当てたりもする。
割り付けてないメモリ空間に変に触ったら検出できる。



401 名前:デフォルトの名無しさん mailto:sage [2018/03/28(水) 06:54:26.81 ID:fYzIlbdt.net]
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第

ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある

402 名前:デフォルトの名無しさん mailto:sage [2018/03/28(水) 06:56:20.68 ID:fYzIlbdt.net]
今のWindowsとかLinuxとかならもちろん瞬時にわかる

403 名前:デフォルトの名無しさん mailto:sage [2018/03/28(水) 10:17:21.31 ID:qnpV2Jxp.net]
>>387
セマフォの類を使え

404 名前:デフォルトの名無しさん [2018/03/30(金) 10:25:28.98 ID:8epIcCej.net]
最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから
C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト
してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。
どこまでなら使えるんだろ? なにか目安はないか?

405 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 11:36:04.01 ID:Wx9gH+Ym.net]
組み込みなら自分で書いたものだけ使うというか
STLは一切使わないのが普通じゃないか?

406 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 12:31:15.37 ID:HVaF4kSp.net]
new/delete
例外
ラムダ式

は使わない
もちろん規模によるけど

407 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 12:36:38.56 ID:MnRWcQoL.net]
組み込みってピンキリだからなんとも言えんわ
業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし

408 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 12:43:29.07 ID:HVaF4kSp.net]
>>398はMCU/DSPくらいの話

409 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 12:47:07.67 ID:TqB3XhjJ.net]
どれぐらいのDSP?
ADSP-21573ぐらい

410 名前:デフォルトの名無しさん [2018/03/30(金) 13:46:55.20 ID:8epIcCej.net]
STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて
見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力
的に見えてきた。 



411 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 13:52:10.17 ID:Wx9gH+Ym.net]
内部で new / delete 使用している stl は使わないリストに入れず
new / delete は使わないリストに入れんのかよ…

412 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 14:08:56.04 ID:2gx9kNrJ.net]
STLコンテナとSTLアルゴリズム
どっちの話をしているんだ

413 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 14:25:29.65 ID:FxYI+k+J.net]
コンテナ使わない有用なアルゴリズムってあるか
あるなら使いたいからご教授ください

min とかあるか

414 名前:デフォルトの名無しさん mailto:sage [2018/03/30(金) 16:24:55.88 ID:HVaF4kSp.net]
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前

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

小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない

415 名前:デフォルトの名無しさん mailto:sage [2018/03/31(土) 14:52:31.93 ID:2aV4tUPq.net]
組み込みって未だにそんなメモリかつかつなの?

416 名前:デフォルトの名無しさん mailto:sage [2018/03/31(土) 17:31:27.59 ID:aygih7Tk.net]
>>407
そりゃ規模による

417 名前:デフォルトの名無しさん mailto:sage [2018/03/31(土) 17:45:54.96 ID:OaeapR1O.net]
>>407
>>399

418 名前:デフォルトの名無しさん [2018/04/02(月) 16:24:48.19 ID:MJzKsai7.net]
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。

注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?

419 名前:はちみつ餃子 mailto:sage [2018/04/02(月) 16:30:09.86 ID:/drqX+oD.net]
>>410
人間の注意力なんてクソザコだからだよ。

420 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 16:40:04.72 ID:3MXga4hP.net]
注意していれば防げるミスは、いつか必ず発生する



421 名前:デフォルトの名無しさん [2018/04/02(月) 16:42:16.37 ID:r6uHUG7/.net]
2重includeに気付いてからでも遅くない

422 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 20:45:42.01 ID:JDmrHTz8.net]
>>410
複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか

423 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 20:57:46.72 ID:MJzKsai7.net]
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)


424 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 21:43:19.92 ID:JDmrHTz8.net]
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします

あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?

425 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 22:36:25.27 ID:7E1ezZvV.net]
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」

どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける

426 名前:片山博文MZ mailto:sage [2018/04/02(月) 22:37:53.93 ID:APYGmZJZ.net]
スタジオじゃなくてスタンダード・アイオーや

427 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 22:38:24.97 ID:7E1ezZvV.net]
ごめんごめん

428 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 22:51:41.33 ID:Y3fpn4XN.net]
なんで前半はフルで後半は省略したの?

429 名前:片山博文MZ mailto:sage [2018/04/02(月) 22:58:42.67 ID:APYGmZJZ.net]
アイオー、アイオー、声を上げて

430 名前:片山博文MZ mailto:sage [2018/04/02(月) 23:06:11.93 ID:APYGmZJZ.net]
Input/Output、日本語では入出力



431 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 23:10:11.92 ID:yv4S6fVx.net]
関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか?

432 名前:片山博文MZ mailto:sage [2018/04/02(月) 23:22:51.53 ID:APYGmZJZ.net]
fprintfは、7文字。

433 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 23:23:14.96 ID:yv4S6fVx.net]
あー

434 名前:片山博文MZ mailto:sage [2018/04/02(月) 23:26:45.74 ID:APYGmZJZ.net]
vfprintfは八文字。文字数削るメリットがあった時代だったからな。

435 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 23:48:48.36 ID:OHYuqcPP.net]
>>423
つ FORTRAN77

436 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 23:55:39.95 ID:d0d9WT+s.net]
>>423
FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな

437 名前:デフォルトの名無しさん mailto:sage [2018/04/02(月) 23:57:30.68 ID:yv4S6fVx.net]
ありがとう FORTRAN からの流れですか

438 名前:デフォルトの名無しさん [2018/04/03(火) 00:51:55.59 ID:cU9BUIMs.net]
>>416-417
プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな

439 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 01:02:56.47 ID:FKLo0jPW.net]
以下のboost::factoryを使う練習用コードにおいて
https://wandbox.org/permlink/K1TIhC61VQztTbOd

map<string, boost::function<base* (int)>> factories;
とするとコンパイルエラーになり、ググって見つけた方法で
map<string, boost::function<base* (int const&)>> factories;
とすると何故かコンパイルが通り、問題なく動作します。
コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか?

440 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 01:48:18.62 ID:JvEghgri.net]
>>417
実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ



441 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 02:16:15.79 ID:1GcrBwMo.net]
stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。
実際 factory 以外の普通の関数なら問題ないし

442 名前:デフォルトの名無しさん [2018/04/03(火) 02:31:59.43 ID:uUh7wFma.net]
dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω

443 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 08:56:24.86 ID:1fV6RHaF.net]
>>423-424
先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、
じゃなかったかな。大文字小文字は同一視で。

444 名前:デフォルトの名無しさん [2018/04/03(火) 11:32:26.11 ID:R6gDm2yr.net]
_st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった

445 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 11:42:41.83 ID:MWvT17WL.net]
ほんとそれ

446 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 11:43:28.33 ID:Z1fbtkqU.net]
>>433
公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。
そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・

結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。

447 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 12:17:26.04 ID:1GcrBwMo.net]
そこ bind しなくてもいいんじゃないだろうか

448 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 13:48:08.68 ID:Z1fbtkqU.net]
>>439
引数のある関数の場合はboost::bindを使うのではないでしょうか?
いちおう公式にもその例が書いてあります。

ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、
速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。
https://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory

449 名前:デフォルトの名無しさん mailto:sage [2018/04/03(火) 15:04:56.72 ID:rDNMxPWT.net]
>>440
引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、
(add(a,b) の a だけ1にbindしてadd1を作るとか)
何もbindせず引数の順序も同じなら

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

で良い

450 名前:デフォルトの名無しさん mailto:sage [2018/04/04(水) 23:06:46.13 ID:t1HAuKeq.net]
>>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

正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。
ご助言どうもありがとうございました。



451 名前:はちみつ餃子 mailto:sage [2018/04/05(木) 03:23:00.79 ID:3RJ8YXR4.net]
>>442
公式にドキュメントがあるだろう。
なんでググりまくるんだ?

452 名前:デフォルトの名無しさん mailto:sage [2018/04/05(木) 07:41:24.21 ID:ev3xPrwL.net]
>>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の公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。

453 名前:デフォルトの名無しさん mailto:sage [2018/04/05(木) 14:37:25.23 ID:LhrJ/WaU.net]
質問です.

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

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

str, a[0],...a[n-1],b[0],...b[m-1]
という配列に入れたいです.
nとmは可変の場合,どうすればよいか教えてください.
スッキリとした書き方が知りたいです.
std::string str;
double a[n],b[m];
です.

454 名前:デフォルトの名無しさん mailto:sage [2018/04/05(木) 14:51:56.82 ID:8vk43UVU.net]
std::string知ってるなら
std::vectorを使えば早かろう
std::vector<double> a, b;
a.resize(n);
b.resize(m);
a[0] = ...

455 名前:デフォルトの名無しさん mailto:sage [2018/04/05(木) 14:54:56.53 ID:AQLHpii5.net]
可変の n, m が読み込む前に確定するのか
ファイルの記述内容から n, m が確定するのか

456 名前:445 mailto:sage [2018/04/05(木) 15:16:31.21 ID:LhrJ/WaU.net]
>>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(),...//どう書くの?

457 名前:デフォルトの名無しさん [2018/04/06(金) 18:11:46.66 ID:CDFchtjR.net]
void Show(const IntArray& array){
...
}

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

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

そういうチェックをするコンパイラを作るのは難しいからということでしょうか?

458 名前:デフォルトの名無しさん [2018/04/06(金) 18:16:26.47 ID:CDFchtjR.net]
const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。

ということはどのみちメンバ変数を変更しているかどうかはチェック可能ということですよね?

459 名前:デフォルトの名無しさん [2018/04/06(金) 18:17:58.47 ID:KjpzCJso.net]
void Show(IntArray& const array)

460 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 19:04:45.09 ID:zGB1Hjc3.net]
>>449
コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから
中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い



461 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 19:43:28.40 ID:EFVHWowI.net]
>>449
難しいというか不可能だからですよ
呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない

462 名前:デフォルトの名無しさん [2018/04/07(土) 02:18:30.08 .net]
>>449
メンバ変数を変更しないなら素直にメンバ関数にconst付けれや

463 名前:デフォルトの名無しさん [2018/04/07(土) 12:11:18.49 ID:BRhgC8GS.net]
コンタミュ連鎖地獄ω

464 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 06:44:19.17 ID:fQMOYFpe.net]
>>449-450 の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。
ソースファイルを分けてみればピンと来るかと。

片方をソースなしのオブジェクトやライブラリにしないとダメかな。

465 名前:デフォルトの名無しさん [2018/04/08(日) 07:56:39.59 ID:peS6i82l.net]
C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?

466 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:06:10.70 ID:hcdQKQ5m.net]
>>457
COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん

467 名前:デフォルトの名無しさん [2018/04/08(日) 08:13:28.62 ID:peS6i82l.net]
そんなことは当たり前ですね。その方法が説明できますか?

468 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:25:17.68 ID:28momF5z.net]
>>459
できるがスレチだからな

469 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:29:30.70 ID:fQMOYFpe.net]
C#のことはC#のスレッドで尋ねればいいでしょ、てお話。
C/C++のスレッドに質問を持ち込むより確実で早いと思うよ。

470 名前:デフォルトの名無しさん [2018/04/08(日) 08:37:40.87 ID:peS6i82l.net]
あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると
思うが。



471 名前:デフォルトの名無しさん [2018/04/08(日) 08:39:38.92 ID:peS6i82l.net]
ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?

472 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:44:37.90 ID:TD+h4nB6.net]
>>462
判断する訳ねーだろガイジか

473 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:50:08.72 ID:D3gITJpj.net]
>>463
CreateProcess() win32API スレへgo

474 名前:デフォルトの名無しさん [2018/04/08(日) 08:56:58.76 ID:peS6i82l.net]
>>465 thanks yey!

475 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 08:58:12.94 ID:hcdQKQ5m.net]
>>463
>>458

476 名前:デフォルトの名無しさん [2018/04/08(日) 09:14:13.86 ID:peS6i82l.net]
>>464
it is conditional on your ability, although its mean applying in the case of a usual Japanese.

477 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 09:23:25.66 ID:tUhRYmJS.net]
真性の障害者手帳持ちだったか

478 名前:デフォルトの名無しさん [2018/04/08(日) 09:44:32.26 ID:nHJNjK41.net]
main関数の中でstaticを使う意味は何でしょうか?

ロベールの本のpp.318-319にそのような例が出てきて意味不明です。

479 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 11:18:10.91 ID:4aXSD6ZQ.net]
キチガイに触るな

480 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 11:47:04.28 ID:fQMOYFpe.net]
ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。

main() 関数の中でstatic変数を使う意味といえば、
単純型の初期化の処理時間を回避したいか、
セクション(変数のメモリ配置)の説明のためか、
「staticなインスタンスのコンストラクタはmain()より前に実行される」
ていう話の前フリかなぁ。



481 名前:はちみつ餃子 mailto:sage [2018/04/08(日) 13:50:30.74 ID:RvzgDq0H.net]
>>472
ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。
(コンストラクタもそのときに走る。)
これは C のときから変わってないよ。

482 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 14:41:24.43 ID:b4O4Usd0.net]
普通に考えると、
単にスコープをローカルにしたいってのがまず考えられる

483 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 14:46:24.29 ID:drN9+cfC.net]
>>473
横からだけど訂正乙
初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある

484 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 15:12:26.18 ID:nkM5b3tX.net]
>>474
mainの中だから意味無い

っつーかstaticは二つの意味があって全然別物
スコープと性的と混ぜるな危険

485 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 15:18:18.11 ID:4aXSD6ZQ.net]
覗きでもやってんのか?

486 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 15:20:01.32 ID:drN9+cfC.net]
>>474
関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、
というごく当たり前の文意だろ普通に読むと。

どう読むと
関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ
自分以外は文法もセマンティックもろくに知らないという前提はやめるべき

487 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 20:18:51.07 ID:B7amW+qm.net]
>>470
スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな

488 名前:はちみつ餃子 mailto:sage [2018/04/09(月) 01:15:21.26 ID:fbTUuQs/.net]
>>470
ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、
これのことか?
www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02037.html

489 名前:472 mailto:sage [2018/04/09(月) 08:00:59.66 ID:4Qmw3/oH.net]
関数スコープのstaticなクラス・インスタンスのコンストラクタは
main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。

static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、
だと勘違いしていた。
訂正してくれてありがとう。そして間違ったことを書いてすまぬ。

490 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 08:28:16.55 ID:arNj8dw4.net]
初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通



491 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 14:14:56.77 ID:iBEYls0Z.net]
いつやっても同じものはいつやっても同じだからな

492 名前:デフォルトの名無しさん [2018/04/09(月) 15:10:57.47 ID:cuDt6une.net]
>>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};


}

というコードが該当箇所です。

493 名前:片山博文MZ mailto:sage [2018/04/09(月) 15:13:59.63 ID:4wbW7ji0.net]
staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。

494 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:16:14.76 ID:cuDt6une.net]
>>485

でも、速さがどうとかいうことについては何も書いていないんです。
staticを付けていることについては何の説明もありません。

495 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:31:05.83 ID:iBEYls0Z.net]
>>486
>>485はきちんとした回答だと思うよ。
配列が大きくなれば顕著になる。
「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど

496 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:38:58.45 ID:7w9BViIO.net]
定数だからstatic constにした
というだけのことでそれ以上の意味はないと思うが

497 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:39:52.73 ID:Cpp6LEO8.net]
その変数をコンパイル時点で確定しようとしている。
ローディング時間も早くなる

498 名前:はちみつ餃子 mailto:sage [2018/04/09(月) 15:40:56.15 ID:fbTUuQs/.net]
>>487
だぶんだけど、 >>486 が言おうとしているのは「>>485 だとしたら入門書としては不親切だよね!」って話じゃねーの。

499 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:57:19.85 ID:XexqtlKa.net]
>>484
ROMとRAMに別れてる環境、
つまりほとんどの小規模な組み込み環境だと
static const は通常ROMに配置される
要するにRAMの節約

速度は逆にRAMの方が速いのが普通

500 名前:デフォルトの名無しさん [2018/04/09(月) 16:42:59.75 ID:cuDt6une.net]
クラスの定義をヘッダファイルに書くときに、

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

必要ないように思います。



501 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:45:14.78 ID:cuDt6une.net]
>>484

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

>>488
定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか?

502 名前:デフォルトの名無しさん [2018/04/09(月) 16:46:43.49 ID:cuDt6une.net]
>>492

private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。

503 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:48:38.97 ID:EW8VU1tO.net]
sizeof で大きさ取れなくなるね

504 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:50:38.53 ID:cuDt6une.net]
>>495

なるほど、ありがとうございました。

505 名前:片山博文MZ mailto:sage [2018/04/09(月) 16:52:05.66 ID:4wbW7ji0.net]
>>494
pimplイディオムで、クラス詳細を隠蔽できるよ。

506 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:17:18.89 ID:R2K+YmFs.net]
>>493
あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな
速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね

507 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:28:43.00 ID:arNj8dw4.net]
>>493
今回はたまたまmainであり、
たまたま小さなデータだったというだけで、
より汎用性の高いコードにするのはプログラミングの基本

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

デメリットは
・関数を通らなくても初期化される
・関数外でもメモリを使う

508 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:32:13.19 ID:arNj8dw4.net]
一番重要なのは>>491
PCプログラムしかやらない人は知らないだろうけど

509 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:49:30.99 ID:m9zaOBXx.net]
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

510 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:56:07.59 ID:arNj8dw4.net]
引数を std::string &str, ... にすればなおる



511 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:06:25.54 ID:m9zaOBXx.net]
引数を参照とポインタでも試してみましたが結果は変わらなかったです

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

512 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:14:40.36 ID:arNj8dw4.net]
va_start(args, cstr);

なんでcstr?

513 名前:片山博文MZ mailto:sage [2018/04/09(月) 19:15:26.84 ID:4wbW7ji0.net]
va_startの指定が間違ってる。

514 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:22:49.12 ID:m9zaOBXx.net]
ああなんとなく意味が分かってきました
va_startはマクロであってcstrの部分は引数の変数名が指定されなければならないということですかね

515 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:41:37.65 ID:m9zaOBXx.net]
こういうコードにすると期待した動作をするようになりました
ありがとうございました

void test5(std::string str, ...) {
char buf[10

516 名前:24];
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
[]
[ここ壊れてます]

517 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:45:39.82 ID:yhCzF70B.net]
ついでに言うと va_start の第二引数については仕様上結構な制限、
各 argument に課される制約と同じ制約がある
配列はダメ、参照はダメ、基本型が格上げされる型との互換性が必要、など
最後のはクラスオブジェクトや float はダメということ
仕様として結果が不定なだけで違反してもエラーにはならないし
意図した通りに動くことも多い

詳しくは default argument promotions va_start
で検索

518 名前:片山博文MZ mailto:sage [2018/04/09(月) 20:00:39.54 ID:4wbW7ji0.net]
va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。

519 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 20:14:56.03 ID:arNj8dw4.net]
相性が合わない

520 名前:はちみつ餃子 mailto:sage [2018/04/10(火) 00:44:35.92 ID:141aKXKv.net]
特に強い理由がなければ 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);
}



521 名前:デフォルトの名無しさん mailto:sage [2018/04/10(火) 08:29:44.17 ID:aAychsYe.net]
strがなんで値渡し?
アホなの?

522 名前:はちみつ餃子 mailto:sage [2018/04/10(火) 11:04:36.10 ID:141aKXKv.net]
クソザコです

523 名前:デフォルトの名無しさん mailto:sage [2018/04/10(火) 21:38:17.71 ID:sbGIaKQd.net]
なにこのバッファ溢れさせてくださいって釣り針

524 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 07:10:13.25 ID:5X4H9iqq.net]
色々とクソコテクオリティ

525 名前:はちみつ餃子 mailto:sage [2018/04/11(水) 11:17:54.25 ID:ZSzBt9iE.net]
えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。

526 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 12:37:28.30 ID:FCilzVhB.net]
そう言うところにしか突っ込めない雑魚の相手するなよ...

527 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 12:58:23.58 ID:0UD5Vzkt.net]
わざわざ互換性を下げなくてもいいのに

528 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:16:27.05 ID:0UD5Vzkt.net]
>>511
なんでbufに一旦書いてるの?
直接printfじゃだめなん?

529 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:20:49.36 ID:yjo2onbY.net]
実行目的ならvprintf使うんじゃね?

530 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:29:16.68 ID:0UD5Vzkt.net]
普通はね
クソコテがコードサイズ、互換性、実行速度など
全て犠牲にしてもテンプレートを使いたかったみたい



531 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:46:51.95 ID:4xNEGOrU.net]
va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように
C++ らしく va_start 使わない例を出したんだろ…

と書いてはみたが、
そういう意図が通じるわけないか
通じる人は最初からわかってるもんな

532 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:49:14.05 ID:4xNEGOrU.net]
そもそも何でbufにって質問は
コメント元の>>507にすべきだろ

533 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:50:42.77 ID:IGuJq2PQ.net]
こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ

534 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:54:51.56 ID:5X4H9iqq.net]
>>522
誰も求めてないwww

535 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 22:01:42.55 ID:5X4H9iqq.net]
危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの?

オナニーは隠れてやれ

536 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 22:53:04.70 ID:4xNEGOrU.net]
c++ スレで variadic template 紹介されてこの反応

537 名前:はちみつ餃子 mailto:sage [2018/04/12(木) 00:24:16.88 ID:csgoYI7G.net]
>>526
危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。
本題に関係ないところなんてどうでもいいじゃないの。

538 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 02:27:29.73 ID:iYyApZ27.net]
>>501とvariadic templateは関係ないわけだが

539 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 02:36:35.20 ID:iYyApZ27.net]
わざわざ環境まで書いてあるのに
アホですね

540 名前:デフォルトの名無しさん [2018/04/12(木) 10:41:06.56 ID:KhnSMF/h.net]
const double const ARRAY[] = { 3, -1 };
const double ARRAY[] = { 3, -1 };

の違いを教えてください。



541 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 10:48:56.23 ID:ySRK5Kj5.net]
ポインタ変数なら
・変数も指し先も書き換えられない
・変数は書き換え可能。 指し先は書き換えられない
のパターンだけど

対象が配列の場合、元々変数の書き換えができないから同じ意味じゃないかと

542 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 12:23:14.02 ID:aCAyQDuf.net]
>>531
> const double const ARRAY[] = { 3, -1 };
コンパイルエラーにならないんだっけ?

543 名前:デフォルトの名無しさん [2018/04/12(木) 12:25:36.92 ID:KhnSMF/h.net]
>>532

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

>>533

Visual Studioではコンパイルエラーになりません。

544 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 14:29:59.20 ID:ZdndFYj4.net]
あいうえお

545 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 14:43:04.91 ID:Htzfym0f.net]
おこそとの

546 名前: mailto:sage [2018/04/12(木) 15:19:35.63 ID:4odEe1 ]
[ここ壊れてます]

547 名前:Tq.net mailto: とりなくこえすゆめさませ []
[ここ壊れてます]

548 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 21:59:02.17 ID:nMaemNOx.net]
const double const a[];

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

const typename と typename const と同じ
しかもconstはいくつ書いてもいい

549 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 10:38:13.53 ID:roGFrSR8.net]
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;

みたいな書き方をするしかないのでしょうか。

550 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 10:57:04.94 ID:UdLtdLwz.net]
result &= !!api(...);

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

文字数は増えるがif文を使って
if (!api()) result=false;
の方が可読性高いかもしれない



551 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 11:38:56.36 ID:OgXHMhZG.net]
>>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;
}

552 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:44:10.91 ID:mVcRE5FO.net]
結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。

553 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:50:27.67 ID:UkpF6ptq.net]
>>539
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
これでいいと思う

>>541
3個位ならいいけどたくさんになると数え間違いとかやらかしそう

554 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:35:54.06 ID:OgXHMhZG.net]
>>543
1年後の自分がやらかしそうだわw

555 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:37:30.50 ID:eQfDSJES.net]
普通に&で繋げてしまえば。
return Api()&Api()&Api()...;

556 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:44:49.05 ID:lxf6ix6+.net]
>>545
そもそもの質問のキモがわかってないよ

557 名前:539 mailto:sage [2018/04/13(金) 15:24:49.14 ID:roGFrSR8.net]
みなさんご意見ありがとうございます。
例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、
常に同じ関数が3回というわけではありませんでした。
失礼しました。

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

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

個人的には、

bResult &&= Api(...);

のような記述ができるとありがたかったです。

558 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 16:20:54.65 ID:RMqAMM1S.net]
>>547
こういう手段もあるぞ。

bResult *= Api(...);

一度 0 になったら何をかけても 0 だ。

559 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:04.14 ID:cn4ajNkQ.net]
&&= と書けないことをこの質問で知ったわ。

>>548
「返り値が0でなければ成功」の関数で変テコな返り値が来ると
組み合わせでダメになるかも。
256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。

560 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:39.54 ID:aZorcSvM.net]
明確なメリットが無いのに、
無駄にトリッキーなコードを書くのはおすすめしない



561 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:39:34.39 ID:aZorcSvM.net]
数が少なく重要な箇所であれば、
デバッグ用コードを追加しやすい以下で良い <

562 名前:br>
if (!Api(...)){
bResult = FALSE;
}
...

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

数が多ければ色々と工夫しようか
[]
[ここ壊れてます]

563 名前: mailto:sage [2018/04/13(金) 16:44:07.64 ID:fORiWt/O.net]
>>548
適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか?

…んー、ないな、何故ないのだろう?

564 名前:デフォルトの名無しさん [2018/04/13(金) 17:53:26.34 ID:ledbPVdv.net]
基底クラスのメンバ関数に virtual をつけないことってあるんですか?
つけてもつけなくてもどちらでもいいという場合はあると思いますが、
つけちゃいけないという場合が考えにくいのですが、そういう場合は
あるのでしょうか?

565 名前:デフォルトの名無しさん [2018/04/13(金) 17:55:06.07 ID:ledbPVdv.net]
逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の
デフォルトの機能にすればいいのにと思います。

どうでしょうか?

566 名前:片山博文MZ mailto:sage [2018/04/13(金) 17:56:07.81 ID:meZ//aXI.net]
>>553
仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。

567 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 17:58:31.25 ID:ledbPVdv.net]
>>555

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

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

568 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 19:32:26.21 ID:UkpF6ptq.net]
>>552
オーバーフローで0とか

569 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 21:02:41.55 ID:RMqAMM1S.net]
>>557
せやな。 普通はないと思うが、無いと言い切ることもできない。

ここまでいろんな案が出てるけど、なんだかんだで >>539 が自分で結論出してるのがベストだと思う。
書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。

570 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 21:13:39.42 ID:ko86uHhA.net]
浮動小数点ならダーティー0とかあるけど
普通は意識しないでしょうねぇ



571 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 00:48:59.29 ID:qJeIaUAA.net]
今回は「非ゼロ」が様々な数値である場合について考えているわけだから
0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然

572 名前:デフォルトの名無しさん [2018/04/14(土) 01:08:45.20 .net]
int64_t 使えばいいだろwww
ケチケチすんなってwwwww

573 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 03:21:52.45 ID:yJ5VtHzf.net]
4つ掛けたらアウトじゃん
ほんとうにバカだなあ

574 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 05:40:34.13 ID:DUdlBUp3.net]
>>547
汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。

俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、
そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。

575 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 07:52:50.53 ID:Fxbc5uis.net]
!か!!使えば1か0にしかならんからそれかけるとか

576 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 08:44:41.44 ID:whWbsAFN.net]
それをシフトと組み合わせると、エラー箇所までわかって便利だね

577 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 10:42:40.78 ID:pziCCgl7.net]
>>556
補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど
あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る
つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる

virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ

578 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:38:28.43 ID:aYmqXLA5.net]
>>565
ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら>>542とかでいいだろ

579 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:59:10.38 ID:gkV4B+Je.net]
メモリをけちるとかそんなけちな理由じゃない

580 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:05:20.64 ID:whWbsAFN.net]
selectって知っている?



581 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:31:15.66 ID:aYmqXLA5.net]
select?
その時代の知識で止まってるの?

582 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 17:00:09.46 ID:6q9VmxFv.net]
a=1に対して、
cout << a << a++なら21
cout << a++ << aなら12
cout << a++ << a++なら21
と表示されました。
coutはどんな順番で評価されているのでしょうか?

583 名前:デフォルトの名無しさん [2018/04/14(土) 18:21:04.74 .net]
>>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
と表示された

584 名前:デフォルトの名無しさん [2018/04/14(土) 18:31:12.32 .net]
>>572
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

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

こんな書き方をするなってことだね

585 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 00:38:00.30 ID:/OvgYAab.net]
>>571
いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、
評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。

586 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 08:36:03.86 ID:IUBKEb9a.net]
未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで
同じ順序で評価されない可能性もある、じゃないかな。

実際のところ、コンパイルごとに評価順が変化するとも思えないけど。
いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。

587 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 09:17:15.75 ID:CIuag2/D.net]
>>573
おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな

588 名前:デフォルトの名無しさん [2018/04/15(日) 10:08:58.88 ID:c4dXLki+.net]
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」が表示される。

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

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

ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。

590 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:29:12.58 ID:VXOW+WoG.net]
void Base::A() {
B();
}

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

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

A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。
こんなコーディングはしない



591 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:37:36.78 ID:sXJBpbWg.net]
バカを装った荒らしか本当のバカか

592 名前:デフォルトの名無しさん [2018/04/15(日) 10:41:29.91 ID:c4dXLki+.net]
>>578-579

よく分かりません。

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

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

のではないかと思ってしまいます。

593 名前:デフォルトの名無しさん [2018/04/15(日) 10:59:34.87 ID:c4dXLki+.net]
Base::B() の virtual を削除する:

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


すると、

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

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

594 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:27:00.75 ID:ZEcSoj1Y.net]
ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。

595 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:33:52.43 ID:q/GS/gh9.net]
スライシングとも別の問題のような

596 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:52:13.52 ID:igXjAIRS.net]
bの型がBaseだからだろ?

597 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 12:16:46.54 ID:VXOW+WoG.net]
まずこの本で、オブジェクト指向を学ぶ。
スッキリわかる Java入門 第2版、2014

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

C++ なんて、偏差値70以上しか無理やのに

598 名前:デフォルトの名無しさん [2018/04/15(日) 12:34:26.84 .net]
>>577
> b = d;
> b.A() ⇒ 「Base」が表示される。

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

こうやね

599 名前:デフォルトの名無しさん [2018/04/15(日) 12:35:11.72 .net]
>>582
間違えた

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

600 名前:デフォルトの名無しさん [2018/04/15(日) 12:36:47.16 ID:c4dXLki+.net]
>>583-585

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


C++が難しいというのは、設計が悪いからですか?
C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに
設計することは無理ですか?



601 名前:デフォルトの名無しさん [2018/04/15(日) 12:37:23.54 ID:c4dXLki+.net]
>>587-588

ありがとうございました。
試してみようと思います。

602 名前:デフォルトの名無しさん [2018/04/15(日) 12:43:40.81 ID:c4dXLki+.net]
理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。

603 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:30:31.42 ID:VXOW+WoG.net]
C++ は、何でも出来るようにしているから、ルール数が100以上ある

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

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

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

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

このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない

604 名前:592 mailto:sage [2018/04/15(日) 13:45:38.29 ID:VXOW+WoG.net]
ロベールでC++ を勉強するのも良いけど、
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある

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

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

それでも、ほとんどのC プログラマーは、C++ へ進めない

605 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:49:36.88 ID:ldkcKhuZ.net]
スッキリ厨はちゃんとコテ付けてくれ

606 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:24:18.71 ID:qZPDSYA2.net]
某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。

第3版が難読版というのは判る

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

cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな

608 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 16:39:48.86 ID:VXOW+WoG.net]
ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単

609 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 17:20:50.44 ID:s7NpyR5v.net]
原典も読まずに能書き垂れる奴っているんだなぁ

610 名前:デフォルトの名無しさん [2018/04/15(日) 18:07:17.49 ID:c4dXLki+.net]
>>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



611 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:44:29.81 ID:ZEcSoj1Y.net]
参照は書き換えられないからな。

>br = d;

参照先のbに代入してるのと同じこと。

612 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:50:44.48 ID:CIuag2/D.net]
>>599
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし

613 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 00:20:31.20 ID:TXxoP4/a.net]
参照のポインタっぽい振る舞いを確認したいならこう

Derived d;
Base & b1(d);
b1.A();

614 名前:デフォルトの名無しさん [2018/04/16(月) 07:57:32.89 ID:PsSdBUuj.net]
>>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();
}

615 名前:デフォルトの名無しさん [2018/04/16(月) 08:01:12.80 ID:PsSdBUuj.net]
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();

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

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

Base& br2 = d; // 初期化 br2 は d の参照

617 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:32:20.53 ID:PsSdBUuj.net]
>>605

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

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

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

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

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

619 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:43:19.10 ID:qlfABgAK.net]
Base Pointer : 100〜119
Derived Pointer : 120〜139

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

Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す

620 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 13:08:20.92 ID:5MYyAHFg.net]
>>607
単なる文法エラーだからエラーメッセージみてコードを直してください



621 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:01:04.61 ID:rDfY3L1y.net]
>>609
文法エラー??
https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。

https://ideone.com/QxErKY
こっちですね。

622 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:08:31.72 ID:rDfY3L1y.net]
ちなみに、C#だとこんな感じです。
https://ideone.com/8SZhJ7

623 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:29:48.23 ID:7XdbFr6Z.net]
CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな?
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる

これならok
https://ideone.com/FGHyda

624 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:32:34.81 ID:rDfY3L1y.net]
もちろん、エラーなくしてコンパイルを通す方法は
>>607
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いた

625 名前:ようにすればとりあえず、コンパイルは通ります。
聞きたいのは、
C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、
C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか??
それともC++では他の方法があるのでしょうか?
[]
[ここ壊れてます]

626 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:34:54.92 ID:rDfY3L1y.net]
>>612
あ、すみません。ちょっと被ってしましましたね。>>613は忘れて下さい。
>>612のコードを見てみます。

627 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:08:36.13 ID:rDfY3L1y.net]
>>612
そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。
まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。
ありがとうございます。

628 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:30:44.68 ID:7XdbFr6Z.net]
>>615
インターフェース側をいじるのは仕方ない
どっちかになる

https://ideone.com/qrd4fN
https://ideone.com/kVZzRi

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

https://ideone.com/B7JWER

630 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 17:30:50.30 ID:rDfY3L1y.net]
>>616
>>617
色々ありがとうございます。>>617がよさそうなのでこれで行こうかなと思います。



631 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:08:59.76 ID:SGgdop5e.net]
巨大なファァイルの読み込みに関してです。
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?

632 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:20:32.18 ID:/qMRupTB.net]
行という概念が
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?

ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど

633 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:29:32.71 ID:KTfx2aCu.net]
>>619
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか

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

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

同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか

634 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:30:11.39 ID:cVYjBdTw.net]
>>619
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。

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

いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。

635 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:36:06.95 ID:p5xwhAV/.net]
末尾にseekして、適当に戻って読んでみて、
改行がなければまた戻って、を繰り返すのが現実的。

636 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:40:13.25 ID:/qMRupTB.net]
巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?

637 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:50:32.61 ID:yyY2OAEq.net]
対象のテキストファイルとは独立に、
「そのテキストファイルの各行がファイルの何バイト目から始まるか」
という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。

>>622 の後半部分だな。

638 名前:619 mailto:sage [2018/04/17(火) 18:03:45.64 ID:SGgdop5e.net]
皆様いろいろご指導ありがとうございました。
私の能力では難しそうですが、いろいろ高速化を試してみます。

639 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:46:11.69 ID:NCQX7EWc.net]
末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して)
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする

640 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:55:56.84 ID:gaNnpc4H.net]
配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?



641 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 19:35:04.61 ID:wvS91pUR.net]
>>628
scanf("%d",&n);
int array[n]; //読み込んだ値を要素数にするってこういう事?

642 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:21:29.36 ID:AHw7lgSX.net]
基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?

643 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:24:11.47 ID:AHw7lgSX.net]
すみませんでした。普通に逆参照すればいいのか。
auto v = new vector<int>(); for (auto &i : *v)

644 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:46:42.62 ID:hZ2W0cz8.net]
>>629
ありがとうございました

645 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 11:35:26.22 ID:uQo81sbZ.net]
MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。

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

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

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

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

MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。

646 名前:片山博文MZ mailto:sage [2018/04/18(水) 11:57:34.76 ID:iSn0xXbj.net]
https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html
d.hatena.ne.jp/yohhoy/touch/20120309/p1

647 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:00:55.78 ID:EfAk4eu6.net]
>>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 オプション

648 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:06:23.94 ID:H8UzlwrM.net]
他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。

649 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:26:53.25 ID:MXcoXWvI.net]
独り言ならチラシの裏にかけ

650 名前:片山博文MZ mailto:sage [2018/04/18(水) 12:28:10.26 ID:iSn0xXbj.net]
>>636
ソースとエラー貼って



651 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:39:00.98 ID:8LhMtFC1.net]
>>638
NDAを結ばないと出せません

652 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:48:05.38 ID:Odk+F4n0.net]
>>636
コードすら貼らないオツムの足りなさじゃ諦めろ

653 名前:633 mailto:sage [2018/04/18(水) 12:59:22.55 ID:uQo81sbZ.net]
>>634-635
ありがとうございます。
VSは2015よりも前なので、このやり方はダメってことですね。
関数の外に置くようにします。

MFCの内部ではやっちゃってますが。

654 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:03:03.18 ID:H8UzlwrM.net]
なんだよ。このクソ言語。やっとわかったわ。

ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。

655 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:07:10.12 ID:iSn0xXbj.net]
エラーも貼れないなら、助けるのはムリ。

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

つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。

656 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:12:55.50 ID:H8UzlwrM.net]
そりゃ、ソースコード全部張れば分かるとは思うけど、
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。

だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。

657 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:22:59.72 ID:iSn0xXbj.net]
May the source be with you.

658 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:25:36.89 ID:whM0Cl8U.net]
プリプロセッサの結果を見れば判るだろうに

659 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:37:08.45 ID:H8UzlwrM.net]
そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が
ありませんでした。

まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。

660 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:45:55.17 ID:MXcoXWvI.net]
C++の文法のクソさには誰も異論はない。



661 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:59:47.30 ID:+aOsPa5t.net]
プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな

662 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 14:01:11.21 ID:v7hqXOET.net]
クソどころじゃない

663 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 15:30:25.37 ID:EU/tZBmZ.net]
>>642
今後のためにそのエラーになる最少構成でやってみ

664 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 20:25:53.95 ID:hZhORVVR.net]
ヘッダファイルがこんなふうに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; }

665 名前:片山博文MZ mailto:sage [2018/04/18(水) 20:49:19.46 ID:cGcFIcRA.net]
型名が長すぎるときは、typedef。

666 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 20:52:50.32 ID:5Rgz0HeV.net]
>>653
型の別名を定義することについての是非は置くとして、 typedef はオワコン。
using を使うのがモダンな C++ やで。

667 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 21:22:43.95 ID:hZhORVVR.net]
typedefやusingはなるべく使いたくないんですよね
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・

668 名前:片山博文MZ mailto:sage [2018/04/18(水) 21:26:54.29 ID:cGcFIcRA.net]
こうだな。動くかどうか知らんけど。
auto& get() { return b; }
const auto& get() const { return b; }

669 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 21:27:07.88 ID:5Rgz0HeV.net]
decltype(b) でもええんやで。

670 名前:デフォルトの名無しさん mailto:sage [2018/04/19(木) 01:18:42.72 ID:AYGORpen.net]
悩んでる時間があったら素直に全て書け
と思う



671 名前:デフォルトの名無しさん [2018/04/24(火) 10:32:40.90 ID:Z9G2Fq/H.net]
柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?

672 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 12:27:26.17 ID:1D4v+3Mx.net]
ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古

修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015

673 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 13:18:05.66 ID:+bGv0z3c.net]
「C++の設計と進化」は良いよ

674 名前:デフォルトの名無しさん [2018/04/24(火) 15:48:30.83 ID:Z9G2Fq/H.net]
>>660-661

ありがとうございます。

Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。
柴田さんの中級という本も細かい話がないように思います。

675 名前:デフォルトの名無しさん [2018/04/24(火) 18:56:34.08 ID:Z9G2Fq/H.net]
vector について質問です。

コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?

676 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:23:44.30 ID:4uyKjeBM.net]
実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか

677 名前:片山博文MZ mailto:sage [2018/04/24(火) 19:27:47.73 ID:Eukzbh8y.net]
Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、
読み進めるにはテンプレートの知識が必要かもね。

678 名前:デフォルトの名無しさん [2018/04/24(火) 19:32:21.39 ID:Z9G2Fq/H.net]
>>664

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

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

>>665

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

679 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:40:11.28 ID:4uyKjeBM.net]
>>666
それはディープコピーのコストがかさむのでおすすめしない

680 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:11:58.65 ID:Ukt80uX+.net]
>>666
>何も考えず引数で渡しても良いですね

何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう



681 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 01:34:48.58 ID:Z7x9U0tp.net]
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() で良い理由が良く分かりませんでした。

682 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:25:57.17 ID:E0/AuDcr.net]
>>669
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。

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

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


ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。

683 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:37:06.21 ID:E0/AuDcr.net]
>>669
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。


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

std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。

684 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 11:26:25.34 ID:Z7x9U0tp.net]
>>670-671
詳細をありがとうございました。
大変良く解りました。より深くは自分でググってみます。

685 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 14:19:03.06 ID:LZqqVlEY.net]
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://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/
ttp://photoshopvip.net/103903

ttps://goodpatch.com/blog/sketch-plugins/

686 名前:デフォルトの名無しさん [2018/04/27(金) 13:24:43.31 ID:wnXDwKhi.net]
for (int i = 0; i < n + 1; ++i) {;}

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

もし、そうなら、

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

としたほうがよいのでしょうか?

687 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 13:35:12.84 ID:GhhThAV7.net]
>>674
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。

688 名前:デフォルトの名無しさん [2018/04/27(金) 14:09:53.91 ID:ouRrzssA.net]
【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50

689 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:21:42.79 ID:qED012zx.net]
https://ideone.com/TVzVzF

上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。

690 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:38:42.04 ID:yKF4ET93.net]
>>674
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話

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

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

このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある



691 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:03:28.59 ID:uctWpHV6.net]
>>677
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?

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

https://ideone.com/27yhhu

692 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:06:52.81 ID:O6TOHWbP.net]
>>674
> for (int i = 0; i <= n; ++i) {;}

693 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:18:38.40 ID:uctWpHV6.net]
for ループといえばつい手癖で
for (int i =0; i < count-1; ++i ) {...}
と書いてて、
後日に count を int から size_t にしたとき
countが0のケースではまったことがあるなあ

for (int i =0; i + 1 < count; ++i ) {...}
と書けば良いだけなんだけど

694 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:27:34.55 ID:mctUhDKo.net]
n+1未満とn以下は違うと思うの

695 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:33:05.63 ID:AimUsleE.net]
>>681
それcountが1でも全くループしないというヘンテコ仕様だけど
そんなもの手癖で書くの?

696 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:37:07.17 ID:uctWpHV6.net]
>>683
隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか
後続のものがある項だけ処理するとか良くある

697 名前:デフォルトの名無しさん [2018/04/27(金) 19:37:30.10 ID:wnXDwKhi.net]
int **a を利用して2次元の動的配列を作ります。
a を関数に渡して、計算に利用します。
2次元配列 a の要素は変更しないので、

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

としました。

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

ret = func(a);

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

これはなぜでしょうか?

698 名前:デフォルトの名無しさん [2018/04/27(金) 19:39:48.54 ID:wnXDwKhi.net]
>>675
>>678
>>680

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

699 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:49:10.59 ID:O6TOHWbP.net]
>>682
ん?
レアケースを語り出すのか?

700 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:51:18.26 ID:mctUhDKo.net]
>>683
そんなにヘンテコでもないと思う

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

こんなのはありがちかと



701 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:52:51.39 ID:mctUhDKo.net]
>>687
レアケースっていうか
nが小数の場合だな

702 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:02:30.96 ID:AimUsleE.net]
ふむ、なくはないか。
やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。
最適化の下手なコンパイラ対策も含めて。

703 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:03:21.75 ID:O6TOHWbP.net]
>>689
だからそう言うのをレアケースって言ってるんだが...
よく書くと言うなら多分住む世界が違う

704 名前:片山博文MZ mailto:sage [2018/04/27(金) 20:10:35.47 ID:HF3+Vuoy.net]
レイアース

705 名前:デフォルトの名無しさん [2018/04/27(金) 20:28:24.05 ID:wnXDwKhi.net]
>>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;
}

706 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 20:32:49.73 ID:GhhThAV7.net]
>>692
さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!

707 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:36:06.84 ID:mctUhDKo.net]
>>687
そんな事言ったら
countが0でループだってレアケースだぞ

708 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:43:41.07 ID:mctUhDKo.net]
>>693
const付きに変換出来るのは
ポインタの先がconstに変わる場合

int finc(int * const * a) なら大丈夫

709 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:52:32.49 ID:wnXDwKhi.net]
ありがとうございます。

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

func の中で、

a[i][j] = 1;

みたいなことをできないようにしたいのですが、どうすればいいでしょうか?

710 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:55:03.35 ID:qED012zx.net]
>>679
ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか?
というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。
たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね?
あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。
標準のコンテナや自作



711 名前:クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。 []
[ここ壊れてます]

712 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:57:43.26 ID:mctUhDKo.net]
キャスト
が一番コストが少ないと思う

関数の中で
delete [] a[i];
a[i] = new int[10];
は出来ても良いの?

713 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:58:32.28 ID:mctUhDKo.net]
>>699>>697あて

714 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:24.66 ID:wnXDwKhi.net]
>>699

ありがとうございます。

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

以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか?

715 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:40.66 ID:wnXDwKhi.net]
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;
}

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

キャストが必要

const_cast<const int**>(a) など

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

const int * const * にした方がいいよということ

718 名前:704 mailto:sage [2018/04/27(金) 22:53:34.55 ID:bqnCmOTp.net]
いやごめん

func(int * const * )にすればコンパイル通るのか…
T * const * ==> const T * const * という変換は暗黙でokなのか
自分がバカでした

719 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 14:10:11.64 ID:uFYPLUkV.net]
>>703
欠点なの?
T ** を const T ** に勝手に変換されると困るんだが。

720 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:26:18.04 ID:AQKaesvC.net]
T * を const T * には勝手に変換するけどな



721 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:27:57.34 ID:AQKaesvC.net]
T * を volatile T * にも

722 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:08:44.48 ID:p2Z/45DS.net]
>>706
ちょっと興味があるので困るコードを教えて

723 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:11:13.28 ID:p2Z/45DS.net]
>>705
慌ててたのかこのレス書き間違ってた

func(const int * const * )にすればコンパイル通る、
T ** ==> const T * const * という変換は暗黙でok、
と書きたかった(全然違うな)

724 名前:デフォルトの名無しさん [2018/04/29(日) 18:37:23.21 ID:uFYPLUkV.net]
>>709
int** ipp;
const int ci=0;
const int ** cipp;
cipp = ipp;
*cipp= &ci;
**ipp = 3;

725 名前:711 mailto:sage [2018/04/29(日) 18:50:17.15 ID:uFYPLUkV.net]
おっと ipp の初期化忘れた
int** ipp;
const int ci=0;
const int ** cipp;
int *ip;
ipp = &ip;
cipp = ipp;
*cipp= &ci;
**ipp = 3;

726 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 18:55:31.07 ID:tn8JNm3m.net]
ロベールの本に、

ios::out | ios::trunc

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

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

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

どういう意味なのでしょうか?

727 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 23:14:14.46 ID:hAJLRgtx.net]
truncate は、ファイルサイズを切り詰め・縮小する。
これは、読み書き両用時に使える機能

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

ファイルの書き込みでは、使えない。
書き込みでは、ファイルサイズ0で開くから、前のファイルが消える

728 名前:デフォルトの名無しさん mailto:sage [2018/04/30(月) 03:21:44.30 ID:/NJkj9K4.net]
>>712
なるほどね。
T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、

T * => const T *
T ** => const T * const *
...(以下略)
にはその問題が無いから許可されているわけか

729 名前:デフォルトの名無しさん [2018/05/05(土) 10:57:39.35 ID:dx2uIifv.net]
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)


730 名前:デフォルトの名無しさん [2018/05/05(土) 11:15:19.94 .net]
>>716
https://cpprefjp.github.io/reference/istream/basic_istream/read.html



731 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 11:22:41.78 ID:dx2uIifv.net]
>>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());

としていないのでしょうか?

732 名前:デフォルトの名無しさん [2018/05/05(土) 11:28:13.02 ID:4WOSF73M.net]
【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』   『宇宙人グレイは溶けてゼリーに』
rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50

733 名前:片山博文MZ mailto:sage [2018/05/05(土) 11:56:29.00 ID:y1NIMmWz.net]
>>718
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。

734 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:03.35 ID:dx2uIifv.net]
すみません。もう一つ質問です。
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。

if(src.fail()) {

ではなく、

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

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

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

と書いてあります。

そこで質問です。

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

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

それともロベールさんのコードはOKなコードなんでしょうか?

735 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:46.39 ID:dx2uIifv.net]
fstream src;



char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}

736 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:03:26.22 ID:dx2uIifv.net]
>>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*) とキャストすることも
ないかなという感じですかね?

737 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:05:14.84 ID:dx2uIifv.net]
ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。

738 名前:デフォルトの名無しさん [2018/05/05(土) 12:18:38.57 .net]
>>721
>>717 再読のこと

739 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:19:01.91 ID:y1NIMmWz.net]
Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。

740 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:23:53.42 ID:LkKePK4y.net]
winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか?



741 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:24:24.44 ID:y1NIMmWz.net]
つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。

742 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:35:42.78 ID:y1NIMmWz.net]
>>726
訂正。
× reinterpret_cast<const char *>(&n)
○ reinterpret_cast<char *>(&n)

そのCスタイルのキャストは
const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。
下手なキャストはバグのもと。キャストは最小限に。

743 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:43:36.49 ID:y1NIMmWz.net]
コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。

744 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:53:07.14 ID:y1NIMmWz.net]
file.write((const char*)&n, sizeof n);
ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、
このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。

745 名前:はちみつ餃子 mailto:sage [2018/05/05(土) 23:49:27.10 ID:/wbyRxeL.net]
元の趣旨がキャストについての質問だけどそれは置くとして、
そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?

746 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:07:10.95 ID:RbjPx358.net]
そんなもんがいいと思ってる人に何言っても無駄だし
他人に強要しなけりゃそれ使ってもいいんじゃないの

747 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:56:59.17 ID:G6stHO5N.net]
>>732
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?

748 名前:はちみつ餃子 mailto:sage [2018/05/06(日) 02:31:33.69 ID:ATh7OHAm.net]
繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。
こっちの手段もアリだよね? っていう別の質問。

749 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 14:30:37.57 ID:YgEwOBRT.net]
競技プログラミングってやった方がいいんですか?

750 名前: mailto:sage [2018/05/09(水) 16:44:52.51 ID:dHqNIKDN.net]
>>736
競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、
競プロをやりたいとは思わないなあ…



751 名前:デフォルトの名無しさん [2018/05/09(水) 17:28:08.89 ID:bhGLBTeZ.net]
ロベールの本に以下のコードがあります。
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;
}

752 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:38:59.81 ID:J0gm0Ysv.net]
スタックポインタをずらす量が変わるだけ
これによる時間はゼロと思って良い

753 名前:デフォルトの名無しさん [2018/05/09(水) 17:44:16.81 ID:bhGLBTeZ.net]
>>739

そういうのを分かるようんなるにはどうすればいいのでしょうか?
C++の本だけ読んでいても分からないような気がします。

754 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:45:58.33 ID:J0gm0Ysv.net]
もしパフォーマンスが問題になるなら
printfをなんとかすべき

755 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:52:37.44 ID:J0gm0Ysv.net]
>>740
コードを書いたときに具体的にどんな処理が行われるか
を地道に学んで行くしかない

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

C言語の方が簡単なのでC言語にある機能から

756 名前:デフォルトの名無しさん [2018/05/09(水) 18:27:14.15 ID:bhGLBTeZ.net]
>>742
ありがとうございました。

757 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:10:47.36 ID:WcTkBSWX.net]
>>738
毎ループその buf が作られるかという質問について言えば
関数に入るときに確保された領域が毎ループ使い回されるだけ

758 名前:デフォルトの名無しさん [2018/05/09(水) 19:12:26.96 ID:bhGLBTeZ.net]
>>744
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。

759 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:21:16.91 ID:sQgpoJ7Q.net]
コンストラクターを起こすようなクラスならアレだけど
基本型はループの

760 名前:外においやらている可能性が高い

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

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

初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?
[]
[ここ壊れてます]



761 名前:デフォルトの名無しさん [2018/05/09(水) 20:03:17.36 ID:bhGLBTeZ.net]
>>746

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

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

スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。

763 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 00:46:37.51 ID:hNESkqkP.net]
>>748
個人的には、はじめて読むシリーズがコンパクトで良かった。
はじめて読む8086
はじめて読むPentium
はじめて読むMASM
はじめて読む486
486は結構ボリュームがある

764 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:36:43.93 ID:dXwOta4y.net]
クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y

765 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:55:29.56 ID:vDlJ/Ca2.net]
>>750
>Mystr Mystr::operator=(Mystr &obj){

一般的にはこうする
Mystr & Mystr::operator=(Mystr &obj){

766 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:00:33.59 ID:TqAsciuR.net]
Mystr & Mystr::operator=(const Mystr &obj);

767 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:59:44.86 ID:dXwOta4y.net]
ありがとうございました
戻り値にも参照が使えることを知りませんでした

768 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 14:05:03.21 ID:vDlJ/Ca2.net]
>>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意

ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}

769 名前: mailto:sage [2018/05/10(木) 17:59:19.87 ID:XVn0zvPu.net]
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…

770 名前:はちみつ餃子 mailto:sage [2018/05/10(木) 18:38:04.46 ID:RiSXhiCD.net]
アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。

>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486



771 名前: mailto:sage [2018/05/10(木) 19:41:56.87 ID:XVn0zvPu.net]
>>756
これなんかも、動くかもしれません
takeda-toshiya.my.coocan.jp

772 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 20:45:54.69 ID:CLWEept/.net]
アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー

と言うことがわかれば十分な気がする

773 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 00:09:23.84 ID:cA/jbwin.net]
>>758
>>749
これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。
ただ、486以外は古本でしか手に入らなそうだけど。

774 名前:デフォルトの名無しさん [2018/05/11(金) 07:04:43.76 .net]
薄い本ならコミケで売れや

775 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 13:11:04.97 ID:Mluu9Rs0.net]
アセンブラの前に

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

スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で

776 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 14:03:43.45 ID:lM6VzEPt.net]
>>760
zob.club/zob/2018/04/16/同人誌-advanced-assembler-386-上ノ巻/

777 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 15:32:04.47 ID:L7FGnh/N.net]
>>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う

セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる

778 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 16:43:05.52 ID:ArEHxDOw.net]
Z80からはじめよう。

779 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:23:03.14 ID:fUD4+ayW.net]
実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。

そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。

780 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 17:39:10.37 ID:e+Ei11A7.net]
C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。



781 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:48:59.53 ID:S57n19k4.net]
Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ

782 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 19:45:01.89 ID:CPfY1M+a.net]
龍芯3号か

783 名前: mailto:sage [2018/05/11(金) 20:48:44.74 ID:/s88DeTW.net]
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問

784 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 20:52:01.78 ID:Mluu9Rs0.net]
PCはPCで面白いし、
8bitは8bitで面白い

785 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 20:54:19.03 ID:e+Ei11A7.net]
AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。

786 名前:デフォルトの名無しさん [2018/05/11(金) 20:56:49.04 ID:2EGPeEG9.net]
Donald Knuth の MMIX っていう言語は勉強するとためになりますか?

787 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 01:53:53.98 ID:Cq1QtQw6.net]
>>761
理解すると言っても何を勉強して理解するのか?
という話だと思ったんだけど。
アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。

788 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 04:35:38.94 ID:F7LxnV/h.net]
wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。

789 名前:デフォルトの名無しさん [2018/05/12(土) 14:17:18.55 ID:CbmhA0Cx.net]
メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。

環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw

790 名前:デフォルトの名無しさん [2018/05/12(土) 14:20:15.63 ID:CbmhA0Cx.net]
>>772
ならないと思う。
クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。



791 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:41:16.04 ID:9vavBtpK.net]
RISC-Vの方がまだ有用な可能性が

792 名前:デフォルトの名無しさん [2018/05/23(水) 19:24:44.84 ID:Au5e7VGg.net]
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

AA6VB

793 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 10:45:43.84 ID:cPlRxlDn.net]
AA6VB

794 名前: mailto:sage [2018/05/24(木) 20:42:22.15 ID:dCOL2CYR.net]
>>775
たしかに、そこをつく本を書けば売れるかもしれない
そんな本に書くべきことは、他に何があるだろうか?
・qsort() の説明
・アセンブリ言語とのリンク
・PEフォーマット
…etc

795 名前:はちみつ餃子 mailto:sage [2018/05/24(木) 21:49:22.52 ID:jqqWnK8Z.net]
>>775,780
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。

796 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 22:04:43.75 ID:hqF4m+Xg.net]
シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)

797 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 23:04:39.55 ID:agu/wXZc.net]
浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ

798 名前:デフォルトの名無しさん mailto:sage [2018/05/25(金) 06:31:49.05 ID:ZdzP9wu5.net]
コンパイルとリンクとロードの話とか。

ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。

799 名前:デフォルトの名無しさん [2018/05/31(木) 19:40:53.15 ID:xDJZQ821.net]
ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか?

800 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 19:48:19.66 ID:DFMmAXw3.net]
しねばいいのに



801 名前: mailto:sage [2018/05/31(木) 20:29:52.32 ID:4k9lsrlf.net]
>>781
二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…

802 名前: mailto:sage [2018/05/31(木) 20:30:39.27 ID:4k9lsrlf.net]
>>785
Mac はお高いからな…

803 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 22:34:17.78 ID:Dy3hGHo2.net]
>>785
17"でお手頃価格なWindowsなNoteが他に無くてね
HPとかDELLだと2.5kgとか

804 名前:デフォルトの名無しさん [2018/05/31(木) 22:37:50.13 ID:xDJZQ821.net]
>>788-789

ありがとうございます。

>>789

使い勝手がいいとかそういうことはないですか?

805 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 22:42:46.81 ID:Dy3hGHo2.net]
当時は無かったな。
MSのセミナーとかもmac+windows多かったよ

806 名前:デフォルトの名無しさん [2018/06/02(土) 18:09:00.04 ID:YEAzW6Zk.net]
ヘッダーファイルについて質問なのです。
ヘッダーファイル内で、 ostream というのを使っているのですが、
#include <iostream>をヘッダーファイル内に記述していません。
エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。

これはどういうからくりでしょうか?

807 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:23:14.65 ID:tlq/OxaF.net]
ヘッダファイルの中じゃなくostreamを使っている

808 名前:|訳単位(cppファイル)の中で最低1回include iostreamされてればOK []
[ここ壊れてます]

809 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:25:58.96 ID:LSJtd55X.net]
>>792
他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。

810 名前:デフォルトの名無しさん [2018/06/02(土) 18:30:00.66 ID:YEAzW6Zk.net]
>>793

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

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

Vec.h
codepad.org/3ROYH1yq

Vec.cpp
codepad.org/f3eSheBS



811 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:30:45.89 ID:YEAzW6Zk.net]
>>794

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

もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか?

812 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:34:39.57 ID:YEAzW6Zk.net]
>>795

ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、
自分で分けたのですが、エラーになってしまいました。

813 名前:デフォルトの名無しさん [2018/06/02(土) 18:46:23.02 ID:RQ4rJlvL.net]
定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。

814 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:50:06.69 ID:YEAzW6Zk.net]
>>798

Vec.h
codepad.org/3ROYH1yq

上のVec.hの最初の方の

#include <iostream>
#include <cassert>

削除してもビルドエラーが出ません。
プロジェクトにはVec.hしかない状態でビルドしました。

815 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:55:56.26 ID:LSJtd55X.net]
>>799
テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。
だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。

816 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:50.14 ID:YEAzW6Zk.net]
>>800
ありがとうございました。

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

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

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

と書いてあります。

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

クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要がありますか?

817 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:59.43 ID:uqsytqRM.net]
>>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)

818 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 19:06:46.84 ID:LSJtd55X.net]
>>801
Yes。 テンプレートはヘッダファイルに書く必要がある。
同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、
最終的な実行ファイルに複数の実体があったりはしない。

819 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:21:25.63 ID:YEAzW6Zk.net]
>>802

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

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

codepad.org/ABfo8I3a

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

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

820 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:22:03.75 ID:YEAzW6Zk.net]
>>803

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



821 名前:デフォルトの名無しさん [2018/06/03(日) 17:10:25.43 ID:XweloLai.net]
ヘッダファイルについて質問です。

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 <> は書かないほうがいいのでしょうか?

822 名前: mailto:sage [2018/06/03(日) 17:20:14.25 ID:5RsKIUxf.net]
>>806
すでにインクルードされているかどうかは書いているときにはわからない、から書いとく

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

しかしテンプレート関数に assert() が

823 名前:入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない… []
[ここ壊れてます]

824 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:34:16.61 ID:XweloLai.net]
>>807

ありがとうございます。

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

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

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

そして、List.h, List2.h の両方で assert() を使っています。

825 名前: mailto:sage [2018/06/03(日) 17:36:57.15 ID:5RsKIUxf.net]
>>808
うんうん、なるほど
テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです

826 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:47:06.72 ID:XweloLai.net]
>>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> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる
メンバ関数については、オーバーライドしたいです。

上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか?
可能だとして、こういうやり方は非推奨でしょうか?

827 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 20:55:43.49 ID:E53R3BDh.net]
一方向・双方向リストの、ソースコードを見た方が速い

繰り返しを表す、C++ iterator みたいな、
抽象クラス・インターフェースでも使っているのだろう

828 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 08:19:48.74 ID:DAGyu3MW.net]
再利用など考えず
一から好きなように双方向リストを作れ

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

は幻想

この場合で言ったらまったく逆で
もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが
一方向リストを継承して双方向リストにするなどイカれてる

829 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 09:50:25.37 ID:3BCLNr2e.net]
>>810
一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?

830 名前:はちみつ餃子 mailto:sage [2018/06/04(月) 13:04:55.31 ID:zKvF3SpI.net]
どうだろう。
総合的な判断が必要という前提はあるけども、
継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。
XはYの一種であると言えるときはXはYを継承していい。
双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。

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

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

クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、
将来的にコンセプトが入ったらそっちが主流になるかもしれん。



831 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:18:55.79 ID:K9p9OoRg.net]
>>812
もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる
これはダメなん?継承は機能追加ダメなん?

832 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:19:07.80 ID:e7JLMPXe.net]
>>811

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

>>812

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

>>813

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

833 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:20:24.25 ID:e7JLMPXe.net]
>>814

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

834 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:43:52.15 ID:3BCLNr2e.net]
>>815
>>812はだいぶイカれてるから触らないで

835 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 14:30:56.26 ID:YRbUwbvV.net]
>>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などのアダプタだよね

836 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 16:46:27.38 ID:OAwYb5Pt.net]
自分の勉強用だったら、継承した双方向リストクラス作ってみて
「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う
よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど
プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから
将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい

837 名前: mailto:sage [2018/06/04(月) 19:05:36.84 ID:gbEnuF2j.net]
キーワード「継承」もずいぶんと評価が落ちたものですねえ…

838 名前:はちみつ餃子 mailto:sage [2018/06/05(火) 02:58:20.15 ID:l2agtc6/.net]
C++ からクラスが無くなることは無いだろうが、
構成の仕方の流行はだいぶん変わってて、
コンセプトが入ったら一気に再編されるかもしれない。

クラスの継承ってそんなに万能じゃないよ。

839 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:11:26.28 ID:ucySJasT.net]
ま、そういうことです
単方向リストを継承して双方向リストにするのは悪手
やってみるまでもなくわかるだろJK
結局ほぼすべてのメソッドを上書きしないといけないから意味ない
しかも一から双方向リストを書いた方が分かりやすいし速い

840 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:24:14.11 ID:ucySJasT.net]
この場合、どうしても手抜きしたかったら
大は小を兼ねるの考えで、双方向リストのみを作って
単方向リストを使う場面でも双方向リストを使えばよい
それがベストだろうというアンサーがちらついてるからこそ、余計に
単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ
余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
単方向リストなどその程度の扱い、必要ない



841 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 15:11:28.97 ID:5kytDI4t.net]
>>824
>余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
std::forward_list など無かった

842 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 18:07:41.59 ID:9YbuVUhL.net]
>>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系で十分な気もする

843 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 19:32:54.16 ID:ucySJasT.net]
言葉が足りなくて申し訳ない
俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから
汎用のテンプレートのリンクリストを使ったためしがない
一方向リストなら、なおのこと使わない

844 名前:デフォルトの名無しさん [2018/06/06(水) 20:16:30.41 ID:rNkLMN6z.net]
単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。
ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。

845 名前:デフォルトの名無しさん [2018/06/06(水) 20:30:07.38 ID:sZLPzbQ0.net]
STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな?

846 名前:デフォルトの名無しさん [2018/06/06(水) 20:32:29.81 ID:sZLPzbQ0.net]
>>826
O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?

847 名前:デフォルトの名無しさん [2018/06/06(水) 20:34:19.38 ID:sZLPzbQ0.net]
もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。

848 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:03:14.93 ID:9YbuVUhL.net]
>>827
std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ
イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど
std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない
単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね

まあ、再利用も良し悪しって事だね

849 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:09:23.87 ID:9YbuVUhL.net]
>>830
ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね
Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから
最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね

850 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 00:34:24.48 ID:l0w/1aK3.net]
std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください
arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、
empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。
つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない
気がするのですが、このメソッドは意味があるのでしょうか?



851 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 05:56:11.66 ID:nuHHgQUg.net]
>>834
テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。

852 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 12:31:35.52 ID:pc7gEgF8.net]
>>834
そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね
他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで
コンテナとして共通の要件(インターフェイス)が設けられている
例えば、size()、empty()、begin()、end()など

本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど
vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ
まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね
余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね

853 名前:はちみつ餃子 mailto:sage [2018/06/09(土) 12:50:19.63 ID:EdmRUNh7.net]
具体的にコンテナに求められる要求はここでまとめられているので参考になれば。
ja.cppreference.com/w/cpp/concept/Container

クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、
なかなか仕様に入らずに先送りされてるという状況。

854 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:42:05.03 ID:SE5SjeC/.net]
ファイルから読み込んだバイト列の先頭部分を参照して、
それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、
どの程度の判定をすればよいものなのでしょうか。
例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。

855 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:50:15.52 ID:9mmiVsnm.net]
十分かどうかは時と場合による

856 名前:放置された蟻人間 mailto:sage [2018/06/11(月) 16:51:12.74 ID:7op9QnGW.net]
画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、
処理スピードを優先するなら、memcmpで十分。

857 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:03:57.96 ID:SE5SjeC/.net]
すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、
他の形式の正常なファイルも拾ってしまわないかということです。
JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。

858 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:06:17.81 ID:3AghcpDH.net]
中身見ないなら、拡張子でもできそうだが

859 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:12:32.50 ID:oqoWhxjw.net]
3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する
ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが

860 名前:はちみつ餃子 mailto:sage [2018/06/11(月) 17:40:03.88 ID:CXPnR3I1.net]
>>841
POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。
参考になるとは思うから読んでみるのもいいんじゃない?
ライセンス的に OK ならそのまま流用してもいいかも。

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

ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、
許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。



861 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 12:54:07.45 ID:xDeIiE2o.net]
なぜ多数から探すかどうかで判定方法が変わるのか

862 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 13:09:55.18 ID:U9ShKAeR.net]
>>845
速度とかとのバランスだって書いてあるつもりだけど、わかり難かった?

863 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:15:57.78 ID:BvPEMwcC.net]
明らかに一致しない時は瞬時に判断出来る
ヘッダですぐにわかるので


jpgではあるんだけど
非対応フォーマットとか一部化けてて表示出来ないとか
そういう判断が難しい

864 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:34:24.68 ID:BvPEMwcC.net]
はちみつはJPGを扱ったことが無いってのがよく分かる

865 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 14:45:14.29 ID:U9ShKAeR.net]
>>847
えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。

866 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 16:23:32.57 ID:LTqXdgcV.net]
元の >>838 の質問に戻れば「どんなファイル群を扱うのかによる」としか
言いようがないんじゃないか?

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

悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば
JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。

867 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 16:44:07.95 ID:U9ShKAeR.net]
ある程度は信じて割り切るしかしょうがない。

868 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:43:08.97 ID:RH6dhGDk.net]
JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ
実運用上はJFIFとEXIF以外は対象外でも良いのかも

869 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:56:59.93 .net]
ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね?

870 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 18:20:08.25 ID:U9ShKAeR.net]
>>853
Yes

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

(はずだと思うが言語仕様での保証はないだろうし、
実態がどうなってるか確かめたことはないんで、
誰かやってみてくれんかな。)



871 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:35:01.32 ID:Q/HiJGFf.net]
>>849
ファイル判別の一般論じゃなくてjpgの判別ですよ
jpgの判別方法を語ればいいんです

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

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

あとは
対応フォーマットであるのか
正しいフォーマットであるのか
実際にデコード出来るのかどうか
などを判別する必要があるかどうかでその先が決まる

872 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:43:20.13 ID:RH6dhGDk.net]
>>855
baka?

873 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:57:45.80 .net]
>>854
ありがとうございます

874 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 20:19:36.50 ID:U9ShKAeR.net]
>>855
何言ってんの?
その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。

875 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 00:32:03.88 ID:21BMiWPP.net]
>>841を読んでの発言?
日本語が読めないの?

876 名前:はちみつ餃子 mailto:sage [2018/06/13(水) 01:55:04.01 ID:3eXA0K0W.net]
>>859
なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈?

判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、
質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。

877 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 01:56:34.26 ID:l7UBIPff.net]
>>855
JPEGの規格書を読んだ事が無いだろう

878 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 07:50:57.05 ID:vaxyQxvX.net]
昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。

879 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 08:14:06.81 ID:7lldK1Da.net]
>>838 >>841 を合わせた質問の意図からすると、
JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、
普通に出回ってるか? という問題じゃないのかな。

880 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 09:42:34.58 ID:V88S+L9t.net]
ゲロトラップとして普通に出回ってないかね?



881 名前:デフォルトの名無しさん [2018/06/13(水) 09:46:09.42 ID:Lf/dU7gs.net]
テンポラリオブジェクトについて質問です。

ロベールの本ですが、


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

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

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


と書かれていますが、なぜわざわざ n のコピーを作るのでしょうか?
n は Two() 関数を抜けたら消えてしまいますが、これを消さずに、
返した方が効率的な気がします。

882 名前:デフォルトの名無しさん [2018/06/13(水) 10:17:19.41 ID:Lf/dU7gs.net]
・テンポラリオブジェクト = n のコピー
・代入により、 hoge に テンポラリオブジェクトがコピーされる。

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

hoge に 捨てずにとっておいた n を参照させれば十分のように思います。

883 名前:838 mailto:sage [2018/06/13(水) 10:17:36.81 ID:818/kKId.net]
みなさんありがとうございます。
話が難しい方向に進んでしまってすいません。
勉強させていただきます。

元々の疑問は>>863の言われるとおりで、
他の形式の画像をJPEGだと誤判定してしまわないか、
さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、
JPEGファイルを見逃してしまうことがあるのか、ということでした。

884 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:58:14.75 ID:54SDWBzN.net]
>>865-866
そういう時こそ右辺値参照ですよ

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

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

Hoge(Hoge&&) = delete;

885 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:59:33.86 ID:54SDWBzN.net]
そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる

Hoge& operator=(const Hoge& hoge) {
  std::cout << "assign operator called." << std::endl;
return *this;
}

886 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 20:08:20.11 ID:VLQaO2hj.net]
(最適化をおいとくと)値渡し/値返しってそういうもんじゃん
Two()内の変数nは自動変数だからスタックに作られる
とっとけないじゃん

887 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:00:21.79 ID:qH/FTczC.net]
まあ2回コピーされるのを1回に抑えるための最適化でしょう

888 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:08:53.19 ID:buJbRccy.net]
確実なのは戻り値じゃなくて参照、もしくはポインタにすること

889 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:40:28.10 ID:GheUJm4W.net]
>>872
それヤバくね?関数を抜けた途端消える存在を参照するとか

890 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:09:20.49 ID:1EWuco5t.net]
呼び出し元から参照を渡してそこに返してもらえってことじゃなくて?



891 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:13:11.63 ID:21BMiWPP.net]
もちろんそう
昔ながらの方法

892 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 23:23:40.79 ID:MDGDBDRC.net]
-Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな

893 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 10:53:47.52 ID:BKSAN5oR.net]
普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。
SqlConnectionやDataSetのDispose()がインテリセンスでは候補に上がるのに、コンパイルで「メンバーではありません」とエラーになります。
スコープを抜けると破棄されるので何もしなくてよいという認識でよいのでしょうか?
また、この理屈で、c#の勝手に破棄してくれるusing相当の機能はない、と言うか、必要ないのでしょうか?

894 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 14:30:10.48 ID:Lgo9GPo1.net]
>>877
IDisposable使ってる?
スコープ抜けてもGCによって回収されるタイミングは保証できない
どうしてもすぐにGCしたいなら

GC.Collect();

をする。

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

GC.Collect(0);

でいいのでは

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

GCは効果の程を確認できないですが、やってみます。

896 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 15:25:54.47 ID:BKSAN5oR.net]
>>879
レスありがとうございます。です。

897 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 16:42:09.02 ID:79UoYXtL.net]
>>879
https://qiita.com/haniwo820/items/ba0ab725c25673c20338
こんなのとか

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

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

ufcpp.net/study/csharp/oo_dispose.html

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

それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい
SqlConnectionやDataSetはいちいちClose()する必要があるのかな?

898 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 22:51:20.07 ID:khTKmU6v.net]
>>877
ここの記述を信じるなら、全部Yesってことになるのかな。
mag.autumn.org/Content.modf?id=20050506023118

899 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 09:10:59.15 ID:8YDR1CpT.net]
>>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なしで心配ないのですが。

900 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 10:38:59.49 ID:uIGrLsPa.net]
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://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/
ttp://photoshopvip.net/103903
ttps://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/



901 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 19:01:40.09 ID:J8URhrRM.net]
>>882によると、自動でDisposeさせたい場合は以下のようにする、
と書いてあるように見える。(手元に環境がないので未確認)

SqlConnection connection(constr);
connection.Open();
connection.Close();

902 名前:デフォルトの名無しさん mailto:sage [2018/06/16(土) 06:42:53.11 ID:PCTFj+qN.net]
>>883
そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。
C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。
C#のusing相当のことをしたい場合は>>885
詳細は↓を参照。
https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55

903 名前:デフォルトの名無しさん mailto:sage [2018/06/18(月) 12:02:02.44 ID:P1toAgew.net]
Dispose の件で質問してた者です。
自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。
不慣れで詰まらない質問してしまってすみませんでした。

904 名前:865 [2018/06/20(水) 12:43:56.50 ID:XX+H87IB.net]
みなさん、いろいろありがとうございました。
参考にさせていただきます。

ところで、

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

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

かなり自分にとって理想的な本のようですので、買ってみようと思います。
こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。

905 名前:デフォルトの名無しさん mailto:sage [2018/06/22(金) 23:22:38.51 ID:pTq2TJuj.net]
あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている
つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで

906 名前: mailto:sage [2018/06/23(土) 00:11:02.67 ID:OlLfOCSW.net]
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力

907 名前:ネ理由になりうる。

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

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

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

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
[]
[ここ壊れてます]

908 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 10:31:52.34 ID:UiVIxiJp.net]
抽象化とコード(バイナリ)の質は相反するものだから

909 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 11:45:24.39 ID:NcXYPjUn.net]
alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか?

910 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 12:58:59.14 ID:g5s8p4AT.net]
リーナスのそれがいっちばん有名なC++批判よね



911 名前: mailto:sage [2018/06/23(土) 13:53:36.35 ID:OlLfOCSW.net]
>>893
linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね
これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました…

912 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:43:13.01 ID:DOoRmJ6H.net]
抽象的な思考ができる人とそうでない人が居るというだけだな
>>890もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが

913 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:54:08.05 ID:UiVIxiJp.net]
抽象化が目的になって
パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い

ってのが問題であって
言語自体には罪はない

914 名前: mailto:sage [2018/06/23(土) 15:32:24.63 ID:OlLfOCSW.net]
>>895
>良い抽象モデル
が役に立つとは限らないのでは?
抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは?
あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか?

915 名前:デフォルトの名無しさん [2018/06/23(土) 16:46:26.83 ID:8e5n022B.net]
デザインパターンって廃れたんですか?

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

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

一度は役に立つと認められたものがなぜ、否定されたのでしょうか?

916 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 16:51:17.93 ID:7hlQnbj9.net]
日本人は基本すっ飛ばして銀の弾丸欲しがるからな

917 名前:はちみつ餃子 mailto:sage [2018/06/23(土) 17:00:49.94 ID:/E9OfcV+.net]
>>898
デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。
基礎として押さえておくと便利だし、価値が失われたわけではないけど、
何もかもが既存のパターンに当てはまるわけではないという当たり前の話。

918 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:15:09.64 ID:DOoRmJ6H.net]
>>897
抽象化とYAGNIは関係ありません
こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね

919 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:29:02.45 ID:ul2D0Jgq.net]
>>898
別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。

920 名前: mailto:sage [2018/06/23(土) 17:30:40.89 ID:OlLfOCSW.net]
>>901
たとえば、iostream をどう思う?これは良い抽象化の例ですか?



921 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:31:54.13 ID:wjw7dXXk.net]
Visual C++6.0です。 Windows7でやってます。
ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので
押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか

また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが
もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています
最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです

922 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:40:24.88 ID:LiutUffZ.net]
>>904
OwnerDraw

923 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:59:38.49 ID:wjw7dXXk.net]
>>905
CToolbarには、DrawItemがないようなのですが
ステータスバーにはあります

924 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:04:15.08 ID:LiutUffZ.net]
ナンシークラッツ本を探した方が良いかな

925 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:14:04.63 ID:wjw7dXXk.net]
ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね
最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど

926 名前:デフォルトの名無しさん [2018/06/23(土) 19:24:24.28 ID:8e5n022B.net]
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) {

}

927 名前:デフォルトの名無しさん [2018/06/23(土) 19:25:19.09 ID:8e5n022B.net]
>>899
>>900
>>902

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

一時は、もてはやされすぎたということですね。

928 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:28:47.13 ID:8e5n022B.net]
insert 内に、

if (tree == NULL) {

929 名前:デフォルトの名無しさん [2018/06/23(土) 19:29:33.57 ID:8e5n022B.net]
insert 内に、

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

}

というコードがありましたが、これのことでしょうか?

930 名前:デフォルトの名無しさん [2018/06/23(土) 19:30:15.04 ID:8e5n022B.net]
>>912

あ、そのようですね。



931 名前:放置された蟻人間 mailto:sage [2018/06/23(土) 19:30:26.05 ID:QXtVRpnb.net]
>>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;
}

932 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:45:59.33 ID:8e5n022B.net]
>>914

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

3のままですね。

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

これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。

934 名前:デフォルトの名無しさん [2018/06/23(土) 21:09:04.41 ID:nmsTY6vF.net]
0,115200
1,38400
2,19200
3,9600

こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが
検索を使わずに38400からダイレクトに1を求める方法はないだろうか?

935 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:22:36.64 ID:b0QIE6qX.net]
115200個の配列

936 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:26:12.81 ID:EyvIrgyz.net]
A/9600 を添え字にして13個の配列で逆引き作る?

937 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:29:09.89 ID:b0QIE6qX.net]
9600の倍数であることがわかってるなら割ればテーブルは減る

でも4個なら素直に検索した方が速い

938 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:41:29.91 ID:EyvIrgyz.net]
検索については同意
元質問は検索使うなって条件なので、まぁ

数値からRS232Cのボーレート設定を想定しちゃうけど、
それなら検索を嫌うようなもんでもないし… な…

939 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:02:58.56 ID:ZZklpiyn.net]
a1 : b1
a2 : b2

a から、b への辞書と、
b から、a への辞書の、両方を作る

940 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:07:27.68 ID:V32XRqjB.net]
>>920>>919を見る前に書いた
たまたま同じ発想になっただけ

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

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

オーディオのサンプリング周波数にも同じような方法が使える



941 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:09:33.77 ID:5Wb6fwhK.net]
n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600);
入力を検証する手間を考えたらテーブル逆引きと大差ないけど

942 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:19:10.79 ID:V32XRqjB.net]
>>924
メモリアクセス速度を考えても>>918の方が速くて簡単

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

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

ビットスキャン命令とシフトとテーブル
変換しなきゃならないデータが多量にあって
パフォーマンスが非常に重要ならこれを使うかな

943 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:21:03.20 ID:V32XRqjB.net]
普通はこんなものはリニア検索でいい

944 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:23:08.99 ID:ZZklpiyn.net]
普通、最適化でも、8個までは線形(全)探索・if 文

それ以上で、ジャンプテーブル・switch-case

945 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:47:49.24 ID:UiVIxiJp.net]
>>927
ただのテーブル逆変換だぞ
なんでジャンプテーブル?
なんでswitch case?

リニア検索で問題なら2分検索
それでも遅ければハッシュその他のテーブル
簡単な演算を併用出来るものはする
じゃないか普通

946 名前:927 mailto:sage [2018/06/24(日) 00:50:44.41 ID:chBT6m1a.net]
コンパイラの最適化について書いた

if 文を8個以上書くと、ジャンプテーブルに変換されるってこと

947 名前:デフォルトの名無しさん [2018/06/24(日) 08:15:02.59 ID:cbD8du/l.net]
>>916

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

948 名前:デフォルトの名無しさん [2018/06/24(日) 10:44:32.50 ID:8StK2ZXu.net]
class clsAにconst member 変数を登録したいのだけどうまくいかない。
クラスコンストラクタでconst char *mes[] を{"abc","def"}のように
初期化するにはどうやるの?

949 名前:デフォルトの名無しさん [2018/06/24(日) 10:57:11.49 ID:8StK2ZXu.net]
//そもそもC++は文字列の配列を扱うことができるのか?

constexpr auto str1 = {"abc", "def"};
これがエラーするんだがなんでなの?

950 名前:デフォルトの名無しさん [2018/06/24(日) 11:00:18.70 ID:8StK2ZXu.net]
constexpr string[] str1 = {"abc", "def"}; コンパイルエラー
constexpr string str1[] = {"abc", "def"}; コンパイルエラー
クッ、、、どうしてもうごかない。



951 名前:デフォルトの名無しさん [2018/06/24(日) 11:15:54.16 ID:8StK2ZXu.net]
string str1 = "abc"; //OK
vector<int> dat(100,3); //ok

vector<string> str2("aaa",4); //error
こういうのもうごかない。

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

string配列の扱い方ってどうやるの?

953 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 11:52:20.14 ID:/GbiIoLW.net]
文字配列って良く分からないけど、Javaみたいに一文字だったりして?
{"a","b","c","d","e","f","g"}みたいな?

954 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 12:32:00.67 ID:StWe8jKY.net]
>>932
定数式じゃないから。

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

>>934
string に一文字づつ入れたいってこと?
std::vector<std::string> str2 = {"a", "a", "a"};
でいけるよ。

955 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:35:35.92 ID:QFRKHUIu.net]
["abc","def"];

956 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:36:44.62 ID:p8F2e5jx.net]
>>934
>vector<string> str2("aaa",4); //error
「vector<string> str2(4,"aaa");」の誤りじゃね?

957 名前:デフォルトの名無しさん [2018/06/24(日) 13:13:44.88 ID:8StK2ZXu.net]
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

ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。

958 名前:デフォルトの名無しさん [2018/06/24(日) 13:37:02.58 ID:8StK2ZXu.net]
//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"}){};//これもだめ

959 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:38:12.37 ID:zWtoG2OO.net]
サイズ不明だし無理だろ

960 名前:デフォルトの名無しさん [2018/06/24(日) 13:41:38.91 ID:8StK2ZXu.net]
>内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。

constexpr char *mes1 = "abc"; //error
これもだめですね。ヒープは必要ないとおもいますが、、、



961 名前:デフォルトの名無しさん [2018/06/24(日) 13:42:37.94 ID:8StK2ZXu.net]
>>サイズ不明だし無理だろ

コンストラクトする時点でサイズは確定していますが、、、

962 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:45:06.66 ID:p8F2e5jx.net]
お前はまずエラーメッセージをちゃんと読め。

963 名前:デフォルトの名無しさん [2018/06/24(日) 14:12:06.73 ID:8StK2ZXu.net]
//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
以下省略
*/

964 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:20:47.48 ID:p8F2e5jx.net]
すまん、そっちはエラーメッセージじゃ分からん。
string str1[] = {"abc", "def"}; //error
とか
constexpr char *mes1 = "abc"; //error
とかの話。

965 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:38:12.08 ID:iIKq/Q4Y.net]
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

966 名前:デフォルトの名無しさん [2018/06/24(日) 14:46:22.41 ID:iIKq/Q4Y.net]
すみません自己解決しました>>948

967 名前:デフォルトの名無しさん [2018/06/24(日) 14:58:47.68 ID:8StK2ZXu.net]
>>947
string str2[] = {"abc", "def"}; //okでした。

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

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

いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし
できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか?
多くのファーム開発者は諦めてCで初期化してるのだろうな。

968 名前:デフォルトの名無しさん [2018/06/24(日) 15:43:14.02 ID:zWtoG2OO.net]
配列の初期化の時には()いらないぞ{}だけ
>>941の最後の行の()はずせば通るけどたぶん環境依存じゃないかな
意図してる動作がname使ってm_nameの初期化ならめんどくさそう

969 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:08.57 ID:zWtoG2OO.net]
あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめか

970 名前:なこれ []
[ここ壊れてます]



971 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:30.09 ID:8StK2ZXu.net]
class clsA
{
private:
const char *m_name;
clsA();
};
clsA::clsA() : m_name("Bike"){};

これはOK、しかし配列はできない。

972 名前:sage [2018/06/24(日) 16:24:15.11 ID:zWtoG2OO.net]
class a
{
public:
const char* name[]; ここで非標準だなんだの警告でる

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

vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな
配列の数指定しといたほうが無難な気がするけど

973 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 16:39:11.76 ID:Q9QWMZ9P.net]
C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ
コンストラクト時にわかってるじゃないか、って話もあったけど
中身の配列数が変わったらそれは違う型になる
つまりテンプレートが必要になる

配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど

974 名前:デフォルトの名無しさん [2018/06/24(日) 17:24:18.36 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[2];
clsA():m_name{"aaa","bbbb"}{}
};
これでもエラーします。

975 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 17:42:22.01 ID:zWtoG2OO.net]
なんてエラーでてるの

976 名前:デフォルトの名無しさん [2018/06/24(日) 17:54:03.23 ID:8StK2ZXu.net]
//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
*/

977 名前:デフォルトの名無しさん [2018/06/24(日) 18:01:33.16 ID:8StK2ZXu.net]
それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。

978 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 18:04:27.08 ID:p8F2e5jx.net]
あなたの使っているコンパイラは、おそらくC++11未対応です。
constexprはC++11の機能なので、そのコンバイラでは使えないか、
使えたとしても標準とは異なる動作をする可能性があります。

979 名前:デフォルトの名無しさん [2018/06/24(日) 18:18:27.13 ID:8StK2ZXu.net]
>>960
あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール
した最近のコンパイラなので当然C++11以上だとおもっていた。
一寸調べてみる。

980 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 18:23:43.69 ID:StWe8jKY.net]
>>961
対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。



981 名前:デフォルトの名無しさん [2018/06/24(日) 18:36:49.63 ID:8StK2ZXu.net]
>>962
おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを
みてもC11++がない。
最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。

982 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 19:43:42.27 ID:G0tizpK6.net]
勘違いしてたらすまないけど↓みたいな事がしたいの?
https://ideone.com/Zm8LO5

983 名前:デフォルトの名無しさん [2018/06/24(日) 22:24:29.32 ID:8StK2ZXu.net]
>>964
凄い!!。まさにそれです。こちらでもコンパイル通りました。
難しいなー。
もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ
ど、それを丁重に拝借いたします。ありがとう。

984 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 22:30:41.96 ID:EmcxYm71.net]
借りるってことは返すんだよね

985 名前:デフォルトの名無しさん [2018/06/24(日) 23:08:30.10 ID:8StK2ZXu.net]
>>966
もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が
わかりますか?
clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};

(const char* const []){"mike","tetu",nullptr}
これは何を意味してるの?

986 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 23:09:16.86 ID:chBT6m1a.net]
「c++ constexpr 文字列」で検索すれば?

987 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 00:15:08.68 ID:RQXh1ivn.net]
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の場合が
表現出来ません。

988 名前:デフォルトの名無しさん [2018/06/25(月) 01:49:02.18 ID:Gwlgg6/B.net]
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にその可変引数を渡すしかない
まずなにがやりたいのか分からないからテキトーに書いてやったぞ

989 名前:デフォルトの名無しさん [2018/06/25(月) 03:37:15.06 ID:3f3crQyZ.net]
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つくらいあったらどうするんだろうね。
まるでクイズを解いてるみたいだよ。
いくらなんでも言語仕様としてやはり不味いよね。

990 名前:デフォルトの名無しさん [2018/06/25(月) 04:00:03.54 ID:3f3crQyZ.net]
わかった。コンストラクタに引数がないディフォールトでは
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"}){}
こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。



991 名前:デフォルトの名無しさん [2018/06/25(月) 04:04:26.64 ID:3f3crQyZ.net]
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() {};
};
実験したみたが、コンパイルは通った。

992 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 05:56:57.36 ID:MAmRCfEQ.net]
>>964のソースをclangでビルドしたら最初の結果が文字化けする。
環境依存で動作が変わるようなソースコードを参考にしてはいけない。

993 名前:デフォルトの名無しさん [2018/06/26(火) 09:01:37.25 ID:6tjGTw22.net]
>>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;
}

994 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 10:37:33.14 ID:dRU/pr3A.net]
c++です
LNK2005 DllMain は既に vstplugmain.obj で定義されています
1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。

左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが
両方vstplugmain.objで困ってます
どのようにすれば解決できるでしょうか?

995 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:09:44.92 ID:9ql/FcZD.net]
自動でリンクしてるライブラリと明示的にリンカに渡

996 名前:してるパス違いの同じライブラリで衝突してんんじゃないの?
知らんけど
[]
[ここ壊れてます]

997 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:44:03.03 ID:dRU/pr3A.net]
検索してみたのですが
vstplugmain.objは一つしか無いようです

998 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 12:06:53.39 ID:dRU/pr3A.net]
もしかしたら関係あるのかもしれないので参考までに記述します
以下のようなエラーも同時に発生しています

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


よろしくおねがいします

999 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 17:14:50.29 ID:hh115pnF.net]
エラーログの上から順番に解決するようにしたらいい

1000 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 09:50:56.72 ID:8ZX2E7EU.net]
無事解決しました
ありがとうございました



1001 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 10:22:32.55 ID:h8zo0ENm.net]
>>981
そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。

1002 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:16.69 ID:OiiVA+37.net]
ロベールの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

の場合にも通用するというのです。

1003 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:56.86 ID:OiiVA+37.net]
const IntPtr = const int*
IntPtr const = int* const

ではないのでしょうか?

1004 名前:デフォルトの名無しさん [2018/06/29(金) 10:55:12.72 ID:OiiVA+37.net]
const IntPtr p = &n;
IntPtr const q = &n;

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

と説明していますが、これが意味不明です。

1005 名前:デフォルトの名無しさん [2018/06/29(金) 10:56:58.22 ID:OiiVA+37.net]
>>985
の論法を↓に適用すれば、

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

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

const int* p;
int* const q;

1006 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 11:34:56.01 ID:rwm1MJ+D.net]
>>983
マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど
typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る
const int と int const もどちらも const の int であるのと同じように
int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ

1007 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:00:29.81 ID:nFp4wdEK.net]
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);
}

1008 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:06:09.83 ID:nFp4wdEK.net]
10行ではなく30行でした、すみません

1009 名前:デフォルトの名無しさん [2018/06/29(金) 12:10:17.92 ID:OiiVA+37.net]
>>987
ありがとうございました。

1010 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:40:26.79 ID:nFp4wdEK.net]
988ですが自力で解決出来たので大丈夫です



1011 名前:デフォルトの名無しさん [2018/06/29(金) 14:45:38.42 ID:+YHimQiw.net]
Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。
どのように設定すればいいでしょうか?
VisualStudio2017/C++

1012 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:50:24.25 ID:+YHimQiw.net]
何がしたいかというと、カレンダーを表示させたいです。

1013 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:52:35.06 ID:+YHimQiw.net]
小出しですみません。カレンダー機能はMFCで作成済みです。

1014 名前:デフォルトの名無しさん [2018/06/29(金) 22:49:34.96 ID:DjTQOr6S.net]
無理でしょうか?

1015 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 23:03:37.60 ID:DjTQOr6S.net]
C#ですが、方法が見つかったので自力でやってみます。
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus

1016 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:10.80 ID:UA/DrxK6.net]


1017 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:30.62 ID:UA/DrxK6.net]


1018 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:47.85 ID:UA/DrxK6.net]


1019 名前:小倉優子 mailto:sage [2018/07/01(日) 01:15:06.26 ID:UA/DrxK6.net]
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 

1020 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 238日 8時間 41分 31秒



1021 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef