【初心者歓迎】C/C++室 Ver.102【環境依存OK】 at TECH
【初心者歓迎】C/C++室 Ver.102【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
17/11/04 16:33:35.07 NYxCuvMY.net
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
URLリンク(codepad.org)
URLリンク(ideone.com)
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
スレリンク(tech板)

2:デフォルトの名無しさん
17/11/05 17:44:45.44 rSDVGL6P.net
>>1


3:デフォルトの名無しさん
17/11/05 20:58:13.61 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:デフォルトの名無しさん
17/11/05 21:07:57.69 i5zx7IeJ.net
これは酷いクソコード

5:デフォルトの名無しさん
17/11/05 22:25:14.64 NxjjuMpf.net
実行速度
見やすさ
汎用性
コードサイズ
どれかひとつ位は満たさないと

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

7:デフォルトの名無しさん
17/11/06 08:01:53.31 uTTN+kxR.net
>>3 の関�


8:狽ヘ前のスレッドの終わりに出た "12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、 てお題の答案かな。 …と思ったけど、NUL終端文字列が仮定されてるね。 どういう流れで投稿されたんだろう?



9:デフォルトの名無しさん
17/11/06 08:45:24.00 H37qYFYx.net
size_t n で文字数を受けとるからNUL終端である必要は無いのでは

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

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

12:デフォルトの名無しさん
17/11/06 23:59:53.41 /gW4r5bt.net
>>10
確かにクソコードだが不定値は返らんぞ

13:デフォルトの名無しさん
17/11/07 04:37:45.33 T7zw8VZw.net
>>9 は質問者に対する皮肉のつもりだったんだけど

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

15:デフォルトの名無しさん
17/11/07 06:16:53.55 pkgJL5Ib.net
初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。
>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。

16:デフォルトの名無しさん
17/11/07 06:53:54.21 +N0q+RZO.net
誰も騙してないのにクソみたいなプライドが高いな

17:デフォルトの名無しさん
17/11/07 07:08:01.90 aXJpgdu1.net
出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう

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

19:デフォルトの名無しさん
17/11/07 08:32:51.44 T7zw8VZw.net
>>3
●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる
isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い
●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで
●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番

20:片山博文MZ
17/11/07 10:46:29.90 BS6pey7a.net
>>10
人違い。

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

22:デフォルトの名無しさん
17/11/07 13:22:08.68 oMcRDniv.net
仕様として「両方で停止は問題ない」よな?
判別の順番は問題だ
順番が逆
そもそも相談者の仕様がおかしい

23:デフォルトの名無しさん
17/11/07 16:16:20.01 3ER4WXnW.net
先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし
ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん

24:デフォルトの名無しさん
17/11/07 17:07:50.15 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:デフォルトの名無しさん
17/11/07 17:17:37.91 jEe4bM6y.net
片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな

26:デフォルトの名無しさん
17/11/07 17:31:27.26 Zpoup5pM.net
ソフト歴35年ですが

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

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

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

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

31:デフォルトの名無しさん
17/11/08 06:19:22.66 u4hO2YM0.net
配列www
ないない
仮に>>23より速くても

32:デフォルトの名無しさん
17/11/08 06:36:16.44 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:デフォルトの名無しさん
17/11/08 06:36:55.45 u4hO2YM0.net
これのがまだマシ

34:デフォルトの名無しさん
17/11/08 06:40:10.32 u4hO2YM0.net
普通に>>23でいい

35:デフォルトの名無しさん
17/11/08 09:37:48.99 kEoXgNLC.net
gotoとかwwww
って思った人いるんだろうか

36:デフォルトの名無しさん
17/11/08 10:35:10.40 FLS9cqpb.net
switch である必要ないな

37:デフォルトの名無しさん
17/11/08 11:33:23.57 2d9va5Xh.net
>>34
ああ、素人はgoto嫌うよな
>>35
もちろん必要は無い
テーブルよりは色々な面でマシってだけ
普通に if ( '0' <= c && c <= '9' ) で良い
一目で意味がわかるし高速

38:デフォルトの名無しさん
17/11/08 12:27:45.50 2VVChtYT.net
&&って条件分岐が入るけど、本当に高速?

39:デフォルトの名無しさん
17/11/08 12:44:08.80 FLS9cqpb.net
そこはctypeで判定だね

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


41:判定してるので、 余分な条件分岐してなかった。



42:はちみつ餃子
17/11/08 13:02:27.97 xvDlz0If.net
>>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。
addl $-48, %eax
cmpl $10, %eax
setb %al
賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。

43:片山博文MZ
17/11/08 13:37:52.71 TZ5JAUzS.net
俺の知識も時代遅れになったな。シンプル伊豆ベスト。

44:はちみつ餃子
17/11/08 18:14:28.55 xvDlz0If.net
もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。
ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね~

45:デフォルトの名無しさん
17/11/08 18:22:33.84 8jdacwiA.net
>>42
まるで昔は速かったかのようだ

46:はちみつ餃子
17/11/08 18:37:11.31 xvDlz0If.net
>>42-43
Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ

47:デフォルトの名無しさん
17/11/08 18:43:03.66 u4hO2YM0.net
ん?
8086はビット演算の方が速いぞ

48:デフォルトの名無しさん
17/11/08 18:57:26.39 GPQLPiKH.net
>>21
> 仕様として「両方で停止は問題ない」よな?
相談者でないとわからん
途中に'\0'があるケースについては書いてないから
> そもそも相談者の仕様がおかしい
それはお前が決める話じゃない

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

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

51:デフォルトの名無しさん
17/11/08 19:14:43.13 u4hO2YM0.net
>>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる
両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り

52:デフォルトの名無しさん
17/11/08 19:18:16.64 u4hO2YM0.net
全角数字の方がまだ可能性がある

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

54:デフォルトの名無しさん
17/11/08 19:51:21.87 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
17/11/08 19:54:52.03 CyIcapPx.net
あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。

56:デフォルトの名無しさん
17/11/08 20:30:53.41 u4hO2YM0.net
最速なら前スレの>>995>>997
>>997は演算の依存性が高いので
>>995の方が少し速いかな?
まあコンパイラや環境依存でしょう
x64前提なら、
64bit一気に持ってきて偶数奇数桁に分けて、
LEAで5倍してシフトして足すとか
AVXで乗算してから水平演算とか
色々と考えられるけど
まあ一応このスレのC言語の範囲で

57:デフォルトの名無しさん
17/11/08 20:49:19.11 QAR8Spec.net
このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;
これより速くする方法あるのか

58:デフォルトの名無しさん
17/11/08 21:08:26.39 CwKlKlOQ.net
何時の間に判定せずにすむようになったんだ

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

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

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

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

63:デフォルトの名無しさん
17/11/08 21:40:02.30 u4hO2YM0.net
AVXが使えるならこれ

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

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

66:デフォルトの名無しさん
17/11/08 21:49:19.34 u4hO2YM0.net
普通はキャッシュに入ったままだが、
処理次第で可能性が無いことはない
他のキャッシュを汚染する可能性もある
HTTなどでは特に
他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない

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

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

69:デフォルトの名無しさん
17/11/10 20:15:55.61 MIqJX5DT.net
>>66
まあどうみても内部でnewしてるんだろうけど

70:デフォルトの名無しさん
17/11/10 21:01:13.10 UsP+TtJI.net
クラスの概念がわかりません

71:デフォルトの名無しさん
17/11/10 21:19:13.94 lLb0QJod.net
構造体みたいなもの

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

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

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

75:片山博文MZ
17/11/10 22:17:22.95 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
17/11/10 22:19:15.61 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:はちみつ餃子
17/11/10 23:02:09.42 4kUQXTj6.net
そんなの説明してやらなくてもネット上に無数の解説があるだろ。
ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。

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

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

80:デフォルトの名無しさん
17/11/10 23:32:23.63 2wx3Dyqu.net
>クラスは構造体に関数を追加したようなもの
こういうアホってどこにでもいるんですね

81:
17/11/10 23:40:07.53 qCTAOUdD.net
>>78
その理解で8割がたOKだと思うのだが、何が問題なの?

82:はちみつ餃子
17/11/10 23:46:33.90 4kUQXTj6.net
>>76
チュートリアルだってたくさんあるじゃん。

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

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

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

86:デフォルトの名無しさん
17/11/12 13:22:39.97 134uacB+.net
記憶クラスについての質問の可能性

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

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

89:デフォルトの名無しさん
17/11/22 07:58:58.54 gxZQPw73.net
アニマルクラスがわんにゃー鳴くのがオブジェクト指向です

90:デフォルトの名無しさん
17/11/22 17:16:56.90 ehTxx6H6.net
メンバ関数を呼び出す際の
「オブジェクトにメッセージを送る」って言い回しも
C++だと分かりにくいね。
この表現がしっくりくるプログラミング言語というか
環境もあるのだろうけど。

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

92:デフォルトの名無しさん
17/11/22 18:04:22.80 evJ3QlJY.net
smalltalkは?

93:デフォルトの名無しさん
17/11/22 20:55:50.24 6XHR1ElK.net
>>90
あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ
同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど
それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと
まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ
そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を
Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので
URLリンク(www.stroustrup.com)

94:はちみつ餃子
17/11/22 21:08:20.60 Rn9KsJdK.net
言語の意味論とそれを実現するメカニズムは別物だから、
仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。
まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、
意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも
メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。

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

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

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

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

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

100:デフォルトの名無しさん
17/11/23 08:26:45.55 Qr4pYIOt.net
>>96
C++に「動的なものは何もない」という主張ではなく
「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味
少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している
URLリンク(d.hatena.ne.jp)
「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、
そして全ての物に対する強力な遅延束縛、これだけだ。
これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」
つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、
(あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ)
無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない

101:デフォルトの名無しさん
17/11/23 08:27:38.45 Qr4pYIOt.net
>>97
まったくもってその通り

102:デフォルトの名無しさん
17/11/23 14:15:04.16 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:デフォルトの名無しさん
17/11/23 14:19:02.83 5K7m7Mmt.net
>a*100、b*100のどちらもlong型になる
intでは表せなくてlongが必要
って意味なら3以外

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

105:デフォルトの名無しさん
17/11/24 16:57:14.87 L5ESShiZ.net
よろしかったら教えてください
  if(a==0){ }
と記述するのにfor文では
  
  for(i=0;1<100;i++){}
と書き、for(i==0;i<100;i++){}
と書かないのはなぜでしょうか?(==の使い方)

106:片山博文MZ
17/11/24 17:05:28.65 ELoh0Abo.net
>>103
代入と比較は違う。

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

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

109:はちみつ餃子
17/11/24 17:38:47.92 lG8HVUMw.net
わかってる人にとってはクソみたいな質問だけど、
数学だと代入 (定義) するっていうのと等しいっていうのは区別がはっきりしないので、
そういうメンタルモデルで考えてると混乱しちゃうってのはわからんでもない。
とはいうものの、よっぽど出来の悪い入門書でもそこらへんわからんようなのは無いと思うんだが、
どういう学び方をしてるんだかちょっと疑問。

110:デフォルトの名無しさん
17/11/24 17:51:57.71 L5ESShiZ.net
なんかすみません
ネットで優しそうなサイトで進めてます

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

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

113:デフォルトの名無しさん
17/11/28 13:22:50.66 8wOk3LC1.net
Fortranだって代入は=だから、Cで採用されたのも仕方ない
とはいえ、文字数ごときにこだわらずに、:=を採用してくれていたらタラレバ

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

115:はちみつ餃子
17/11/28 13:50:31.60 1OfFiaid.net
>>112
別のプロセスから取得するって意味?

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

117:デフォルトの名無しさん
17/11/29 00:32:03.31 /GAULuFW.net
>>114
試したことないけどこれは?
URLリンク(www.oracle.com)

118:デフォルトの名無しさん
17/11/29 13:08:28.50 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:デフォルトの名無しさん
17/11/29 13:26:13.79 NrhyqkWd.net
>>116
"%*c"のせいじゃね

120:デフォルトの名無しさん
17/11/29 13:36:20.41 GlJ85cMo.net
>>117
そうでした。ありがとうございました。

121:デフォルトの名無しさん
17/11/30 14:49:53.66 t+LxFq0J.net
テフ?

122:デフォルトの名無しさん
17/12/01 03:20:07.32 VClmrWfc.net
boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね

123:デフォルトの名無しさん
17/12/01 12:48:46.21 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:デフォルトの名無しさん
17/12/01 13:06:08.20 p7Y4uOcI.net
>>120
char_に替わるパーサー書けばいいんじゃないかね
マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして
mbchar = (mb1 >> char_) || char_;
とか?

125:デフォルトの名無しさん
17/12/01 13:14:35.24 LYbXDWPH.net
>>121
宿題は自分で考えるのが原則。どこまで考えた?

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

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

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

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

130:デフォルトの名無しさん
17/12/02 00:18:15.85 4X8AnX6A.net
あんまり良い本じゃないから買わなくていい

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

132:デフォルトの名無しさん
17/12/02 09:08:29.93 XeWd0teH.net
>>125
昨日はありがとうございました
90行程度と長いプログラムになりましたが
人数をカウントし表示させることができました
カウントは、教科毎にfor文で呼び出し
20以下、20~39、・・・80~99、100とif文で条件指定し
各範囲で人数をカウントし、最後に表示させました
また分からないことがありましたらご指導お願いいたします。

133:デフォルトの名無しさん
17/12/02 14:58:42.41 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:デフォルトの名無しさん
17/12/02 15:12:26.31 jpnrbmV1.net
fscanfで書式の指定ミス

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

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

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

139:デフォルトの名無しさん
17/12/02 18:53:18.55 K6qIkKEG.net
超初心者です
c言語でGetPixelが動きません
どうすれば直るのか教えてください
COLORREF GetPixel (float 変数x, float 変数y); //指定座標の色取得。
if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行
//以下、実行するコード

140:デフォルトの名無しさん
17/12/02 19:09:54.54 4pmjT1Fk.net
>>136
>if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行
if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) {
条件が真のとき実行するコード
}
ではどうですか?

141:デフォルトの名無しさん
17/12/04 17:32:02.17 K3o+GgF3.net
boost::qiって読み方ブースト・チーでいいの?

142:デフォルトの名無しさん
17/12/04 18:32:18.36 m/Ygi57i.net
boostのパーサの使い方わかんね

143:デフォルトの名無しさん
17/12/04 21:33:58.20 K2rBoL+r.net
>>138


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

145:デフォルトの名無しさん
17/12/05 10:59:54.97 BooJAJ3p.net
よろしくお願いします。
fp=fopen("out.txt","r");
while(fscanf(fp,"%d",&da2[i])!=EOF){
fscanf(fp,"%d",&da2[i]);
i++;
}
fclose(fp);
これを実行するとテキストファイルに記録されている整数を
一行飛ばしで読みだしてしまいます
どうして飛ばされる行ができてしまうのでしょうか?

146:デフォルトの名無しさん
17/12/05 11:22:39.33 tMsGMSrl.net
>>141
friend

147:
17/12/05 11:42:25.43 x6DQdw1l.net
>>142
fscanf() を二箇所に書いているけれども、それでいいのですか?

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

149:デフォルトの名無しさん
17/12/05 12:02:08.68 BooJAJ3p.net
>>144>>145
そういう事だったのですね
ありがとうございました!

150:デフォルトの名無しさん
17/12/05 15:40:18.03 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
17/12/05 15:46:59.33 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:デフォルトの名無しさん
17/12/05 16:20:49.08 BooJAJ3p.net
>>148
ありがとうございます
標準入力によって処理し、scanfを使わないということなのですね
文法を覚えて活用できるようにします
何度もありがとうございます

153:デフォルトの名無しさん
17/12/05 16:50:17.51 VZfNuCLu.net
>>147
改行文字を次のscanfで読込むから
回避方法は例えば
URLリンク(blog.unfindabl)


154:e.net/archives/604



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

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

157:デフォルトの名無しさん
17/12/07 12:53:50.82 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:デフォルトの名無しさん
17/12/07 13:10:52.74 dicAL8ON.net
>>153
c は大きさの十分ある char への配列と想定した前提で
fscanf の引数がおかしい
1文字毎に配列へ順繰りに読み込ますのなら
 fscanf(fp,"%c", &c[i]);
こうなってないと

159:デフォルトの名無しさん
17/12/07 13:39:27.89 4zvLzkC0.net
>>154
&が抜けていたのは恥ずかしいです
申し訳ありませんでした
しっかり覚えさせていただきます
プログラムもちゃんと動きました
いつも簡単なことばかりなのに理解が浅くてすみません
とても勉強になりました。ありがとうございました

160:デフォルトの名無しさん
17/12/07 16:08:02.33 dicAL8ON.net
書いてあることが違うけど(&が抜けていたのではなく [i] がない)
本当に分かっているのか不安になる返答だが、そのうち慣れてくるだろう。
(文字と文字列の違いと (f)scanf に渡すフォーマットの指示と 変数をどう渡すか
 の一連が整理されてないと、また繰り返すだろう)

161:デフォルトの名無しさん
17/12/07 16:29:02.63 4zvLzkC0.net
>>156
はい、ありがとうございます。
配列にして直してあります。
fscanf(fp,"%s",c)として読み込んだ後に
c[i]で一文字一文字表示させられると思い込んでいました
先ほどの156のおかげでfscanf(**** &c[i])を覚えられました
ありがとうございます!感謝してます

162:デフォルトの名無しさん
17/12/08 15:46:12.24 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
17/12/08 15:56:23.80 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:デフォルトの名無しさん
17/12/08 16:02:05.10 C0Y4l8FE.net
そろそろうっとしいな

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

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

167:デフォルトの名無しさん
17/12/16 09:10:24.00 67ZudMHx.net
ない

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

169:片山博文MZ
17/12/16 16:18:44.15 2NfYNG63.net
#include <pshpack1.h>
...
#include <poppack.h>

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

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

172:デフォルトの名無しさん
17/12/21 16:50:57.91 FN6C0PcS.net
ここが適切かわかりませんが、
make の Makefile を Visual Studio や NetBeans 等の IDE の
プロジェクトファイルに変換するツールはありませんか。

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

174:168
17/12/21 17:10:02.95 FN6C0PcS.net
>>169 そこまでは分ったのですが、
Makefile を CMakeLists.txt に変換するのはありますか?
見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、
Python のスクリプトだけでした。。

175:片山博文MZ
17/12/21 17:15:07.21 fHSTQ7CK.net
>>170
ない。

176:168
17/12/21 17:25:55.41 FN6C0PcS.net
>>171 ありがとうございました。
CMake 勉強します。

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

178:デフォルトの名無しさん
18/01/09 22:23:30.03 9ubHCBZ8.net
環境によるんじゃ?

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

180:デフォルトの名無しさん
18/01/10 02:59:55.08 QjjLPcN0.net
読んでみるわ

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

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

183:デフォルトの名無しさん
18/01/13 09:13:05.82 M+vRxjCB.net
その辺有名ライブラリのルール付けとか調べてみるのもいいかもね

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

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

186:デフォルトの名無しさん
18/01/16 11:06:50.90 E1MTmeKy.net
CAD

187:デフォルトの名無しさん
18/01/16 11:07:58.52 .net
そんな上級者にしか用途がない言語か

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

189:デフォルトの名無しさん
18/01/16 11:25:50.16 .net
で、何つくんの?
高級アセンブリの用途は?

190:デフォルトの名無しさん
18/01/16 12:09:46.86 J2S5K16W.net
画像処理
大規模ゲーム開発

191:デフォルトの名無しさん
18/01/16 12:32:40.41 6i0TmEx8.net
GoogleChrome

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

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

194:デフォルトの名無しさん
18/01/16 19:09:30.75 Vb1E5r0O.net
Pythonのライブラリも結局はCで作ってたりするしな。

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

196:デフォルトの名無しさん
18/01/17 01:07:00.24 X2mlxDcY.net
OpenGLもC#か大変そうだな

197:愛知人
18/01/17 09:14:59.53 .net
Unityでいいよね

198:デフォルトの名無しさん
18/01/17 11:15:20.21 X2mlxDcY.net
ライセンス料が只ならいいよ

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

200:愛知人
18/01/17 11:48:22.30 .net
なんでC++ってendlいるの?

201:デフォルトの名無しさん
18/01/17 12:24:58.46 /z6RTYd5.net
ちょっと何言ってるかわかんないです

202:愛知人
18/01/17 13:34:56.30 .net
なんでprintf使わないの?

203:デフォルトの名無しさん
18/01/17 13:41:03.90 lhJfQamL.net
浪人と引き換えに無知を手に入れた男

204:愛知人
18/01/17 13:43:22.44 .net
で、返答は?

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

206:愛知人
18/01/17 14:16:18.48 .net
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w

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

208:デフォルトの名無しさん
18/01/17 15:03:17.62 MeUm47mp.net
何言ってんだこのバカ

209:愛知人
18/01/17 16:08:09.91 .net
あらら、怒っちゃった(笑)

210:デフォルトの名無しさん
18/01/17 17:39:52.90 sykUBtM3.net
C++でしかできないもの作りたいだけど何かいいアイデアない?

211:片山博文MZ
18/01/17 17:52:07.55 89SqY/Kf.net
>>206
エクセルのような操作性の、画像レイアウト印刷アプリなんてどう?

212:デフォルトの名無しさん
18/01/17 18:18:50.66 sykUBtM3.net
>>207
印刷はしたくないです..

213:デフォルトの名無しさん
18/01/17 20:00:30.20 W2btjMLE.net
おs

214:デフォルトの名無しさん
18/01/27 06:58:59.63 1R9xhZBX.net
windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった
そこでC+11の一部が使えるようになったから使いたいと思ってる
ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。
ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ない�


215:カゃないのとか気をつけた方がいいよとかあれば意見よろしくです



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

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

218:デフォルトの名無しさん
18/01/28 06:43:38.82 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:デフォルトの名無しさん
18/01/28 07:45:35.06 kxFN6buW.net
>>213
戻り値がintになってる
戻り値の型を後置で書いてやればいいかな
function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; };

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

221:デフォルトの名無しさん
18/02/06 23:57:09.32 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:デフォルトの名無しさん
18/02/07 00:04:25.80 k5RJAFTX.net
structを使う?
struct my_TypeA{ int v;};

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

224:デフォルトの名無しさん
18/02/07 03:43:04.13 LQaGrglb.net
オブジェクト指向では、型による分岐処理は無くなる。
汎化
f(親型)
ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向

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

226:デフォルトの名無しさん
18/02/11 04:59:49.56 9irhhPDg.net
C++には強いエイリアスが無いからなあ

227:デフォルトの名無しさん
18/02/23 16:21:25.57 UAqVoMsi.net
C++じvtable参照することになるから遅いだろ

228:デフォルトの名無しさん
18/02/25 04:05:35.43 Zrtx8k52.net
>>216
セットする値の名称にする
例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる
プロパティとして使うのだから、setXXX()みたいに書かなくてもいい
setter単独で存在することはありえないからgetterも設けること
setterって余り必要ない
コンストラクタからの初期化で十分の場合が多い

229:デフォルトの名無しさん
18/02/25 14:23:16.60 8l5JrV0a.net
>>219
だぶるでぃすぱっち

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


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



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

233:デフォルトの名無しさん
18/03/03 14:14:16.62 Vl4EAVf3.net
>>226
ありがとう
ちょっと調べてくる

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

235:デフォルトの名無しさん
18/03/06 00:47:05.22 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:デフォルトの名無しさん
18/03/06 00:55:45.44 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
18/03/06 00:58:37.27 yCnPPW+5.net
誤:読み出し元スレッド
正:呼び出し元スレッド

238:230
18/03/07 00:28:47.80 +JS1hm36.net
すみません、他スレで聞きます。

239:デフォルトの名無しさん
18/03/07 19:00:17.77 BpTZedcA.net
事情があって下記の型の関数を、
void Func1(char a);
下記の型の関数ポインタに代入して呼びたいと思っています。
int*(*p)(int*);
p = (int*(*)(int*))Func1;
p((int*)123);
動作としてはFunc1(123)と呼んだときと同じものを期待しており、
試したところそれっぽく動作しているのですが、
致命的な問題等あります?
"暴走の危険あり"など。

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

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

242:片山博文MZ
18/03/07 19:29:59.98 Ssa+vNsg.net
sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな?

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

244:デフォルトの名無しさん
18/03/07 20:01:22.38 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:はちみつ餃子
18/03/07 20:34:34.64 TWOfgg7C.net
>>233
関数ポインタ同士は互換で、お互いにキャストすることは許される。
が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。

246:デフォルトの名無しさん
18/03/10 22:50:07.25 tBgkA+tH.net
C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか
windows.hで一つ一つボタンの位置を設定してハンドルやらコールバックと格闘するもんなんでしょうか
それとも何か気の利いた便利なライブラリとかがあるんでしょうか
というかこの手のライブラリやフレームワーク的なものを探したりしたい場合はどういう場所から情報を集めるものなんでしょうか
それっぽいキーワードでgoogleで検索して探そうとしても上手く情報を見つけられないのですが、根気よくページを確認していくしかないのでしょうか

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

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

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

250:デフォルトの名無しさん
18/03/11 00:23:13.22 5+tjHPTy.net
ありがとうございます。それぞれ見てみます

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

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

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

254:はちみつ餃子
18/03/11 04:12:58.32 f5R2yX0u.net
WinRT が綺麗にまとまってると思う。
URLリンク(github.com)
Windows API を現代的な C++ に合わせて整理したものなので、
C++ 的にある程度まともな感じがする。
昔は仕方がなかったんだろうけど、
今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな~。

255:デフォルトの名無しさん
18/03/11 10:27:16.51 zWe+i43K.net
>>240
tcl/tkが一番手軽

256:デフォルトの名無しさん
18/03/11 10:40:38.07 1J69PCFW.net
Win32プログラミングスレあったっけ

257:デフォルトの名無しさん
18/03/11 10:51:25.22 QedwXA9H.net
Win32API質問箱 Build124
スレリンク(tech板)

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


259:デフォルトの名無しさん
18/03/11 11:28:30.29 1J69PCFW.net
>>251
どうも

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

261:
18/03/12 02:19:53.88 9vbtopii.net
>>254
誤差だ、
プログラミングスタイルを曲げてまですることではない

262:デフォルトの名無しさん
18/03/12 02:23:59.34 Cvix3isA.net
>>255
さいですか ありがとうございました

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

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

265:デフォルトの名無しさん
18/03/12 03:20:38.17 IdW8RVi3.net
>>257
メモリアクセスのコストだあ

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

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

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

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

270:デフォルトの名無しさん
18/03/12 16:25:47.91 JoWTM6VO.net
>>262
>>263
ほんこれ

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

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

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

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

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

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

277:デフォルトの名無しさん
18/03/15 23:12:48.58 jcfpYhJu.net
char * c;
とか
char
*
c
;
も含めて一緒

278:
18/03/15 23:13:16.42 xYxZI4zx.net
>>270
一緒ですが個人的に後者を推奨します

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

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

281:はちみつ餃子
18/03/15 23:48:02.28 VBbQqJBt.net
ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。
char* a;
char* b;
まあ人によって色々やね。

282:デフォルトの名無しさん
18/03/15 23:48:51.41 ipLBerzI.net
そんな迷うならtypedefしてしまえ

283:はちみつ餃子
18/03/15 23:52:42.60 VBbQqJBt.net
C++ なら std::add_pointer を使うのも手やぞ。
普段から使うには綴りが長い気もするな。

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

285:デフォルトの名無しさん
18/03/16 00:12:21.27 eqCACABM.net
この話始まるとスレが荒れるわけだが。
俺は
char *a;
int & ref;
だ。

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

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

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

289:デフォルトの名無しさん
18/03/16 06:18:52.71 hczQTGC7.net
両方に空白入れたり
両方詰めたらどうなるん

290:デフォルトの名無しさん
18/03/16 10:14:04.60 x1iYgKqh.net
>>275
これ

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

292:デフォルトの名無しさん
18/03/16 18:15:24.73 tA4eZSmU.net
``int* p;''と``int *p;''はどちらが正しいですか
URLリンク(www.libjingu.jp)
まあハゲの影響はあると思う

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

294:デフォルトの名無しさん
18/03/16 19:01:00.72 EjV6B4+T.net
>>285
マイクロソフトじゃないか?

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

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

297:デフォルトの名無しさん
18/03/16 23:05:45.65 /SwLgzhl.net
正直、選択の余地が無い方が嬉しい

298:デフォルトの名無しさん
18/03/16 23:17:53.08 7Nt6p3N1.net
ある意味欠陥の1つ

299:デフォルトの名無しさん
18/03/16 23:24:49.74 YbTBBkUF.net
>>289
リテラルの後ろにも置ける

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

301:デフォルトの名無しさん
18/03/16 23:32:56.43 W1kNbC1+.net
参照型&ってあまり使われないのか

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

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

304:片山博文MZ
18/03/17 17:07:21.02 6umCop+M.net
>>297
見た目とコンパイル速度のどちらを優先するかによる。

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

306:デフォルトの名無しさん
18/03/17 17:39:18.45 B2oEmArJ.net
うーん、やっぱりタブは使うべきではないんですね

307:デフォルトの名無しさん
18/03/17 17:41:47.51 Ak7laUjo.net
昔は1バイト当たり単価が高かったからね

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

309:デフォルトの名無しさん
18/03/17 22:45:16.37 NcDC59dQ.net
>>294
初めて知ったw

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

311:デフォルトの名無しさん
18/03/18 06:08:40.04 QnqZv5w6.net
int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、
a[5] と *(a + 5) が同等で + 演算子の交換可能性から *(5 + a) も可、
それなら 5[a] も同じじゃなきゃ片手落ちだよね、って発想というか、
過去のコンパイラの実装とも関係がありそうな気がする。
もちろん、古いCコンパイラとのソース互換性が問題になるほど
みんなが使ってた書き方とは思わないけど。

312:
18/03/18 11:53:22.56 ojW1vPJY.net
>>304
IOCCC …

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

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

315:デフォルトの名無しさん
18/03/20 20:17:17.59 UFFOOrdu.net
++C言語

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

317:デフォルトの名無しさん
18/03/20 22:04:48.60 +J5xJfYE.net
Cでインクリメントやデクリメントに後置が使われがちな理由は
a = *p++; みたいなポインタの使い方で手が慣れたせいもあるかと思う。
C++では性能的な理由で前置が好まれたのは指摘のとおり。
個人的には、どっちでも構わない場面ではCでは後置、C++では前置で書くかな。
特に単純なforで++iと打つと、途端にC++で書いてる気がしてくる。

318:デフォルトの名無しさん
18/03/20 22:08:04.94 I2zEd3jr.net
本当に性能に差が出たの?測ったの?

319:デフォルトの名無しさん
18/03/20 23:46:13.85 ZVuOcNlA.net
GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな

320:デフォルトの名無しさん
18/03/21 00:00:26.00 2Gb2uvWn.net
単純なforなら同じコード吐くんじゃね?

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

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

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

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

325:デフォルトの名無しさん
18/03/21 19:50:40.96 eUhtaSa6.net
時代は変わったか
昔はそんな事は当たり前だった

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

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

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

329:デフォルトの名無しさん
18/03/21 20:37:50.64 L8aCdycT.net
本スレでやれ

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

331:デフォルトの名無しさん
18/03/21 20:59:28.52 CmybL5Dk.net
>>321
それで見やすくなるなら別にいんじゃね

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

333:デフォルトの名無しさん
18/03/21 22:37:05.71 D2465Z9C.net
どんなメリットがあるので?

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

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

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

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

338:
18/03/22 00:37:09.57 2FEQ/Wa3.net
>>330
inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが

339:デフォルトの名無しさん
18/03/22 00:58:21.46 dLiR/Xt3.net
なぜポストインクリメントがよく使われるかは、
PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。
間接参照したあとにレジスタが増える。
オートデクリメントは逆にプレデクリメント。
あとinc,decでフラグが変化するのもPDP当時は当然の動作。

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

341:デフォルトの名無しさん
18/03/22 07:05:57.55 C5Ula1AM.net
またイミフなレスしてるのか

342:デフォルトの名無しさん
18/03/22 07:15:53.52 tiDItZ1f.net
C--があってもいいかもしれないな。

343:デフォルトの名無しさん
18/03/22 09:44:57.12 Q2/ylW7b.net
C♭思い出した

344:はちみつ餃子
18/03/22 10:24:04.20 HExEyyqO.net
>>336
ググればすぐにわかることだけど、有るよ。

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

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

347:デフォルトの名無しさん
18/03/26 20:46:12.70 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:デフォルトの名無しさん
18/03/26 20:52:31.38 Sl5sXtlN.net
0x80以上の時符号拡張されてマイナスになるから

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

350:デフォルトの名無しさん
18/03/26 20:58:30.32 Sl5sXtlN.net
>>343
その本は窓から投げ捨てろ。
ー128~127が正解だ

351:デフォルトの名無しさん
18/03/26 21:01:09.95 qgnj+CJa.net
>>344
本にはそうは書かれていませんでした。申し訳ありません。間違っていました。
アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。

352:デフォルトの名無しさん
18/03/26 21:02:33.45 qgnj+CJa.net
>>344
何か不具合が起こる例を教えていただけると助かります。

353:片山博文MZ
18/03/26 21:06:19.73 42MV7MT1.net
>>346
char ch = 255;
printf("%d\n", ch);
C/C++では、オーバーフローは警告なく普通に起こる。

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

355:片山博文MZ
18/03/26 21:11:26.75 42MV7MT1.net
printf("%d\n", (char)255);
%dね。

356:デフォルトの名無しさん
18/03/26 21:42:10.96 3IjTFjn0.net
>>344
>>348
そんな事は決まってない

357:片山博文MZ
18/03/26 21:52:30.42 42MV7MT1.net
charのビット数、CHAR_BITが8ではない環境はほとんど�


358:ネい。



359:片山博文MZ
18/03/26 22:00:14.93 42MV7MT1.net
4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。

360:デフォルトの名無しさん
18/03/26 22:58:41.82 3IjTFjn0.net
ほとんど無いから何?
「決まってない」の反論になってないよ
現行品でcharが16bitの環境があるんだけどね

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

362:片山博文MZ
18/03/26 23:02:53.12 8aZ5PUAj.net
インテル入ってない

363:デフォルトの名無しさん
18/03/26 23:03:06.95 .net
俺のcharは100bitあるぜ!!

364:デフォルトの名無しさん
18/03/26 23:04:42.66 3IjTFjn0.net
とりあえず>>1を読んどけ

365:デフォルトの名無しさん
18/03/26 23:55:34.36 2w8Ha0HC.net
char と signed char を混同するクソコテ

366:デフォルトの名無しさん
18/03/27 01:28:23.66 bCiMyjcv.net
今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。
初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。

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

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

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

370:デフォルトの名無しさん
18/03/27 07:42:58.98 7BdcIkqa.net
>>361
初心者だろうと質問に付随する前提知識は必要
変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある
まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう

371:デフォルトの名無しさん
18/03/27 07:52:49.58 ofLFYE4b.net
回答者もわかってないからな
>>352とか

372:デフォルトの名無しさん
18/03/27 08:13:51.03 ofLFYE4b.net
4ビットCPUだとcharは4ビットと思ってんのか?

373:デフォルトの名無しさん
18/03/27 08:39:25.07 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:デフォルトの名無しさん
18/03/27 08:41:45.88 7BdcIkqa.net
4bitのcharか、アルファベットが表現できないな
まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね
なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど

375:デフォルトの名無しさん
18/03/27 09:55:59.95 dDmfqIPV.net
int *p = new int[100];
delete[] p;
delete[] p で int 100個分の領域を解放するのだと思いますが、
どうやって、 p が int 100個分の領域を指していると分かるのでしょうか?
p は単なる int 型へのポインタです。

376:デフォルトの名無しさん
18/03/27 10:02:58.95 GW1/xmrB.net
>>366
つ -fsigned-char/-funsigned-char

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

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

379:デフォルトの名無しさん
18/03/27 10:59:24.01 r9AxIBc/.net
>>370
(すぐに)わからないから

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

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

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

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

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

385:デフォルトの名無しさん
18/03/27 15:06:05.02 dDmfqIPV.net
>>377
吐き出したコードってどうやって確認するんですか?

386:デフォルトの名無しさん
18/03/27 15:06:56.79 dDmfqIPV.net
>>371-372
ありがとうございました。
そのあたりのことを詳しく書いてある本はありますか?

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

388:デフォルトの名無しさん
18/03/27 15:08:28.42 Di3KX/fh.net
ポインタから値を読み込む場合は?

389:デフォルトの名無しさん
18/03/27 15:16:11.82 jMKP3TFv.net
>>378
使っている環境による
機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する
もっと前のアルゴリズムの検討は済んでて、
もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね?

390:はちみつ餃子
18/03/27 17:26:05.07 6NyejsSC.net
>>343-344
char 型が符号付きであってもなくても格納可能な範囲という意味では 0 ~ 127 であると思って使ってれば間違いないのは確か。
あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので
char が符号付きだとしても -127 ~ 127 しか表現できないかもしれない。
>>345
言語仕様では文字がアスキーコードとは保証してないんだ。
ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、
EBCDIC とかでも言語仕様には違反しない。

391:デフォルトの名無しさん
18/03/27 18:20:11.37 ofLFYE4b.net
>>373
並のOS環境って何だよwww
一般的なMCUのほとんどは
アドレス変換テーブルの仕組みがなく
スタックオーバーフローを検出するハード的仕組みも無い

392:デフォルトの名無しさん
18/03/27 18:21:21.80 ofLFYE4b.net
>>383
無知は出てくるな

393:デフォルトの名無しさん
18/03/27 20:25:43.43 GW1/xmrB.net
BASIC Stamp でもやってればいいのに

394:デフォルトの名無しさん
18/03/27 22:12:36.71 gjFRbLOq.net



395:つスレッドがある 片方はstd::queueにつんで、もう片方はそれを取る これで詰まれた瞬間に取るにはどうするのがいいのかな? 簡単に作るなら、無限ループでスリープ挟みながら取り続けることだけど、無駄も多いから積んだのをトリガーに取りたい 環境はg++とVC++です



396:デフォルトの名無しさん
18/03/27 23:17:24.98 7OwU1Hvz.net
>>379
stackoverflow で、たまたまアクセスしたメモリに、
どんな値が入っているかは、誰にも分からない。
単に前に入っていた値が、入っているだけだから
その値が、たまたまCPU 命令にあれば、CPU を実行するから、
エラーになるのは次の命令以降になる
一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる

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

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

399:デフォルトの名無しさん
18/03/27 23:38:12.48 zFrY2ZyB.net
>>389
してる環境もあれはしてない環境もある

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

401:デフォルトの名無しさん
18/03/28 06:54:26.81 fYzIlbdt.net
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第
ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある

402:デフォルトの名無しさん
18/03/28 06:56:20.68 fYzIlbdt.net
今のWindowsとかLinuxとかならもちろん瞬時にわかる

403:デフォルトの名無しさん
18/03/28 10:17:21.31 qnpV2Jxp.net
>>387
セマフォの類を使え

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

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

406:デフォルトの名無しさん
18/03/30 12:31:15.37 HVaF4kSp.net
new/delete
例外
ラムダ式
は使わない
もちろん規模によるけど

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

408:デフォルトの名無しさん
18/03/30 12:43:29.07 HVaF4kSp.net
>>398はMCU/DSPくらいの話

409:デフォルトの名無しさん
18/03/30 12:47:07.67 TqB3XhjJ.net
どれぐらいのDSP?
ADSP-21573ぐらい

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

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

412:デフォルトの名無しさん
18/03/30 14:08:56.04 2gx9kNrJ.net
STLコンテナとSTLアルゴリズム
どっちの話をしているんだ

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

414:デフォルトの名無しさん
18/03/30 16:24:55.88 HVaF4kSp.net
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前
そもそもヒープエリア自体無かったりするし
あってもアロケートのみで解放機能が無かったりする
小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない

415:デフォルトの名無しさん
18/03/31 14:52:31.93 2aV4tUPq.net
組み込みって未だにそんなメモリかつかつなの?

416:デフォルトの名無しさん
18/03/31 17:31:27.59 aygih7Tk.net
>>407
そりゃ規模による

417:デフォルトの名無しさん
18/03/31 17:45:54.96 OaeapR1O.net
>>407
>>399

418:デフォルトの名無しさん
18/04/02 16:24:48.19 MJzKsai7.net
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。
注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?

419:はちみつ餃子
18/04/02 16:30:09.86 /drqX+oD.net
>>410
人間の注意力なんてクソザコだからだよ。

420:デフォルトの名無しさん
18/04/02 16:40:04.72 3MXga4hP.net
注意していれば防げるミスは、いつか必ず発生する

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

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

423:デフォルトの名無しさん
18/04/02 20:57:46.72 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:デフォルトの名無しさん
18/04/02 21:43:19.92 JDmrHTz8.net
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします
あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?

425:デフォルトの名無しさん
18/04/02 22:36:25.27 7E1ezZvV.net
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」
どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける

426:片山博文MZ
18/04/02 22:37:53.93 APYGmZJZ.net
スタジオじゃなくてスタンダード・アイオーや

427:デフォルトの名無しさん
18/04/02 22:38:24.97 7E1ezZvV.net
ごめんごめん

428:デフォルトの名無しさん
18/04/02 22:51:41.33 Y3fpn4XN.net
なんで前半はフルで後半は省略したの?

429:片山博文MZ
18/04/02 22:58:42.67 APYGmZJZ.net
アイオー、アイオー、声を上げて

430:片山博文MZ
18/04/02 23:06:11.93 APYGmZJZ.net
Input/Output、日本語では入出力

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

432:片山博文MZ
18/04/02 23:22:51.53 APYGmZJZ.net
fprintfは、7文字。

433:デフォルトの名無しさん
18/04/02 23:23:14.96 yv4S6fVx.net
あー

434:片山博文MZ
18/04/02 23:26:45.74 APYGmZJZ.net
vfprintfは八文字。文字数削るメリットがあった時代だったからな。

435:デフォルトの名無しさん
18/04/02 23:48:48.36 OHYuqcPP.net
>>423
つ FORTRAN77

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

437:デフォルトの名無しさん
18/04/02 23:57:30.68 yv4S6fVx.net
ありがとう FORTRAN からの流れですか

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

439:デフォルトの名無しさん
18/04/03 01:02:56.47 FKLo0jPW.net
以下のboost::factoryを使う練習用コードにおいて
URLリンク(wandbox.org)
map<string, boost::function<base* (int)>> factories;
とするとコンパイルエラーになり、ググって見つけた方法で
map<string, boost::function<base* (int const&)>> factories;
とすると何故かコンパイルが通り、問題なく動作します。
コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch