0からの、超初心者C++相談室at TECH
0からの、超初心者C++相談室 - 暇つぶし2ch1:デフォルトの名無しさん
18/11/12 14:55:13.35 Tf74ZWQr.net
何にも知らない0からの出発、超初心者のためのC++相談室

2:デフォルトの名無しさん
18/11/12 15:33:07.21 uNoTWhhe.net
まずC#を覚えます

3:デフォルトの名無しさん
18/11/12 15:41:29.72 D6ILV7Jx.net
>>1


4:デフォルトの名無しさん
18/11/12 16:05:28.85 JkRQG90v.net
C99に準拠したCプログラムってC++コンパイラで完全にビルドできますか?

5:さまよえる蟻人間
18/11/12 16:09:07.07 Uo1L8t18.net
>>4
型キャストが必要な場合と、C++キーワードに引っかかるケースがあるから、コンパイルできるとは限らない。

6:さまよえる蟻人間
18/11/12 16:21:58.14 Uo1L8t18.net
例えば、classという名前の変数がある場合は、C++ではコンパイルできない。
void *型の変数にint *の値をキャストなしに代入しようとすると、C++ではコンパイルエラー。

7:デフォルトの名無しさん
18/11/12 16:35:33.39 D6ILV7Jx.net
>>4
C99モードにすればおk
$ gcc -Wall -std=c99 -lm round.c

8:デフォルトの名無しさん
18/11/13 08:18:22.77 0Ele5WZ8.net
>>5-6
ありがとうございます。
C99では未定義だがC++で定義・予約されている言葉なんかが引っ掛かってしまうんですね。

9:デフォルトの名無しさん
18/11/13 18:41:26.33 90McxFB4.net
extern "C" {}って書いてる?

10:デフォルトの名無しさん
18/11/13 21:54:10.86 RYrE2D9k.net
まずCから
Cも分かってないのにC++とかムリ

11:デフォルトの名無しさん
18/11/13 22:08:24.41 bZ0HXQ7X.net
C99頃から互換性も無いし、別言語だからそうでも無いけど、どっちかと言うとCのprintfに影響受けてる言語の方が多いね。
どっち先に覚えても良いけど、Cのprintfは押さえておいた方がいい。
(ただ、経験的にC++のオブジェクト指向を覚えるにはJavaかC#から入った方がいいので、挫折したらそっちを一旦勉強する事を勧める)

12:デフォルトの名無しさん
18/11/13 22:32:00.82 qjyppvvr.net
今の最新の規格ならだいぶ使いやすくなってるはず
とりあえず変数にはconstを付けれ

13:デフォルトの名無しさん
18/11/13 23:50:04.90 kE0CzrCg.net
C++とJavaのオブジェクト指向って、なにが違うのでしょうか?

14:さまよえる蟻人間
18/11/13 23:59:43.80 700gS9mA.net
>>13
C++は、new を付けたらポインタ型になるが、Javaはnewを付けたら参照型になる。

15:デフォルトの名無しさん
18/11/14 00:06:33.69 bV3/fRvw.net
>>14
JavaよりC++のほうが難しいといわれるのは、ポインタがあるからっていう意味合いが大きいんでしょうか?

16:さまよえる蟻人間
18/11/14 00:19:07.08 XVbpx9nj.net
>>15
C++のポインタは癌だ。どこにでもアクセスできてしまうし、メモリーリークが起きる恐れがある。安全ではない。
チェック付きの配列とスマートポインタを使えば、少しは安全になるが、完璧ではない。

17:さまよえる蟻人間
18/11/14 00:36:22.61 XVbpx9nj.net
まず、ポインタ変数の宣言が初心者殺し。
int* a, b;の場合、bはポインタではない。
関数ポインタはさらに文法が複雑すぎる。
関数ポインタ型の複雑さから逃れるには、typedefを使うとよい。

18:さまよえる蟻人間
18/11/14 01:24:53.28 XVbpx9nj.net
ポインタ型をtypedefしまくった環境がWindowsのWin32 APIだ。
intを大文字でINTと書く。intのポインタをLPINTと書く。unsigned intをUINTと書き、そのポインタをLPUINTと書く。
基本的な関数型は全てtypedefで定義済み。
これなら、ややこしいアスタリスク記号(*)に戸惑う必要はない。

19:さまよえる蟻人間
18/11/14 01:35:38.43 XVbpx9nj.net
型を大文字で書くと分かりやすいという意味で、Win32ではよく使うポインタ型を全て大文字で定義している。
char *にはLPSTRを、const char *にはLPCSTRを用意している。

20:デフォルトの名無しさん
18/11/14 03:03:41.18 aCPH/+gx.net
なんてことを昔の人は考えたが、当然スマートポインタのほうがより安全である

21:デフォルトの名無しさん
18/11/14 07:23:04.49 XWwMTSMS.net
>>15
>>14じゃ無いけど、個人的にはfriendクラスとかJavaには無いクラス同士の関係があったりするが最初はそれがどう言う関係か理解出来なかった。
Javaでオブジェクト指向に慣れた後理解出来た。
C++はそう言う独特のオブジェクト指向があるので、まずそこまで複雑じゃ無いオブジェクト指向言語で慣れる方がC++独特のオブジェクト指向の理解に繋がる。

22:デフォルトの名無しさん
18/11/14 11:35:25.78 zVp4oIsl.net
>>18
無駄に覚えることを増やす馬鹿言語
wsとかswとか_sとかいっぱいつけやがってシッチャカメッチャカ

23:デフォルトの名無しさん
18/11/14 11:36:41.07 zVp4oIsl.net
あとtypedefしてる型を型チェックのときに同一とみなすのが意味ない
せっかく型を別けてるのに

24:デフォルトの名無しさん
18/11/14 12:34:52.66 OvTvaibz.net
整数を定義するときって以下の3つだとどれがメモリ消費量とか実行速度の面で一番効率いいですか?
#define XXX (1234)
enum{ XXX = 1234};
constexpr int XXX = 1234;

25:デフォルトの名無しさん
18/11/15 08:07:09.42 HNIzCpqS.net
効率は実測が基本

26:デフォルトの名無しさん
18/11/15 12:16:37.45 lNkjj0jr.net
>>24
今時のコンパイラならどれも同じになるだろうけど、#defineはただの置き換えだから、実質直接数字に置き換える。
お馬鹿なコンパイラなら、これが一番速い。
(メモリ上のXXXに格納された1234をレジスタに読むのじゃ無く、レジスタに直で1234と書き込むので、メモリアクセス分は速い)

27:デフォルトの名無しさん
18/11/15 17:16:40.52 XHYJGLe7.net
constexprが候補に上がる時点で最新のコンパイラだと思われる

28:デフォルトの名無しさん
18/11/15 22:39:39.09 jenSGLjX.net
AIの力でコンパイラの性能を上げるって可能ですか?

29:デフォルトの名無しさん
18/11/16 09:32:03.61 37LYr8ZY.net
a = xxx;
a = yyy;
これは、二重定義になりますか?

30:29
18/11/16 09:41:00.05 37LYr8ZY.net
解決方法として
a = ("xxx" && "yyy");
を考えているのですが、これで良いでしょうか?

31:デフォルトの名無しさん
18/11/16 11:34:07.59 9iOixtPe.net
a[] = {xxx, yyy};

32:29
18/11/16 11:52:01.81 37LYr8ZY.net
>>31
ありがとうございます!

33:デフォルトの名無しさん
18/11/20 23:59:39.03 GRv3bnvn.net
up

34:デフォルトの名無しさん
18/11/21 04:04:25.43 C09+uG2D.net
整数型とbool型を比較したり代入しようとしたときに警告かエラーを出す方法はありますか?
int i=5;
bool b=true;
i=b;
if(i==b)
if(i)
↑3行すべてでエラーなり警告なりを出してほしい
b=i;とif(b==i)は警告が出ます
環境はvs2017です

35:さまよえる蟻人間
18/11/22 03:29:53.66 by2crdt6.net
C/C++ではありえません。不可能です。

36:デフォルトの名無しさん
18/11/22 06:04:18.72 94o8kAxO.net
>>34
C++のboolのサイズはcharと同じだから
b=i: で警告になるのは整数型と論理型の変換というより単にサイズの小さい方に
代入しようとしたから警告になるてことだろうね
boolを使わずに Booleanクラスとかを自分で作れば型変換の許可/不許可も自在だけど
ま、やらんわな。そんな非効率なことは

37:デフォルトの名無しさん
18/11/24 11:20:27.36 pkYVxqhq.net
34です
遅くなりましたがありがとうございます
自作クラスを作ってまでエラー出したいものでもないので気にしないことにします

38:デフォルトの名無しさん
18/12/02 21:29:56.53 jrjT9DL9.net
MSがC++をCより勧める利点ってなんでしょう。
.NET関連で商売する為にC#などの利用を推奨するのは理解できるのですが
C++に拘りC99にすら対応しないのは何かよっぽどの理由があるのかなと思ってしまいます。

39:デフォルトの名無しさん
18/12/03 21:46:10.27 ZMLOrV5M.net
.net以前はMFCで商売してたからね。
その遺産を保守するのにC++が必要。
今でもそう言う会社相手に商売してる。
今はまだマシだけど、開発環境独占だと標準規格無視してた。
対応しなくても売れるのに、対応する必要は無いわな。

40:デフォルトの名無しさん
18/12/03 21:49:11.54 jYfXM2LM.net
御開帳です

URLリンク(connect.uh-oh.jp)

41:デフォルトの名無しさん
18/12/05 04:20:50.45 yf36y6mU.net
enum EN { yama,kawa}
をアクセスする規則がわかりません。 EN.yama の時もあれば 単にyamaの
時もあります。規則はどうなってるんでしょうか?

42:デフォルトの名無しさん
18/12/05 14:48:45.83 2sSegHBZ.net
namespace

43:デフォルトの名無しさん
18/12/05 23:17:47.17 P1XQw2I4.net
C++ならEN.yamaはあり得ないだろう

44:デフォルトの名無しさん
19/01/09 10:11:37.02 Gyfngzmc.net
新年記念up

45:デフォルトの名無しさん
19/01/11 18:31:10.60 TUR+WyZ1.net
win16からwin32への移行では役に立ったのかもしれない。

46:デフォルトの名無しさん
19/01/22 13:59:06.16 owIFG1wt.net
ゼロが流行っているのか?

47:デフォルトの名無しさん
19/08/28 20:07:30.06 Y6mSCMlM.net
Cは習わないとダメですか?

48:デフォルトの名無しさん
19/08/29 10:03:19.38 Pek3Dpqo.net
c++相談室だぞ
習わなくていいなんて答えるヤツはいないぞ

49:デフォルトの名無しさん
19/08/30 20:54:35.96 QpJdGFlG.net
いやCの勉強なんてしなくていいよ
最初からC++の勉強をすればいい

50:デフォルトの名無しさん
19/08/31 00:49:34.53 y5ewqimO.net
C++は糞
Cだけやっとけば充分

51:デフォルトの名無しさん
19/08/31 21:44:16.76 r57d4Puh.net
C++って便利になってもゴチャゴチャしてて汚い言語だとどっかで聞きました

52:デフォルトの名無しさん
19/09/01 01:17:32.77 6J4Ocwbf.net
ゴチャゴチャだと?
無理して拡張された機能を使わなければいいだけの話じゃないか
C言語でオブジェクト指向プログラミングをしようとするとどれだけ危険で汚くなるか分かってるんだろ?
C++は表面的にだけどそれをきれいにまとめた点だけでも評価されていいんじゃないか?

53:デフォルトの名無しさん
19/09/01 01:34:32.37 sYwYgS29.net
つまりテンプレートを使うなということですね判ります

54:デフォルトの名無しさん
19/09/21 17:36:37.24 BnEC5IrG.net
c++は元はクラス形オブジェクトシステムを高速に動作させる為に始めたけど
今は単に高速にする事を目的に作っている様に見える
その為に一度に出来る様な記述を追加していってて有る意味便利なんだけど
機能が増えすぎて正確に把握するのが大変
その影響で何処か間違うとその間違った部分とは違う部分が違ってて
それを理解するのが大変
あちこちが絡みすぎてて言語自体がスパゲッティになってる印象
大量の事項を正確に覚えてそれられを正しく組み合わせないといけないから大変
超初心者にはかなりきつい
プログラミング初心者がやる様な物ではない
ある程度他のプログラミング言語をやって出来るようになってからの方が多分良い

55:デフォルトの名無しさん
19/09/21 17:40:00.07 icgczTg/.net
>その影響で何処か間違うとその間違った部分とは違う部分が違ってて
>それを理解するのが大変
「何処か間違うとその間違った部分とは違う部分が違っててそれを理解するのが大変」
はその通りだが
「その影響で」
は関係無い
大変なのは今に始まったことじゃない
高機能ωになる前からずっとそう

56:デフォルトの名無しさん
19/09/22 09:05:21.83 Ktt7KEB9.net
この板にはC++委員会で多くの人が使いにくいと思っている仕様を提案してしまった
人が来ているので、最新のC++がダメになった、などと言うのは禁句。

57:デフォルトの名無しさん
19/09/22 18:46:16.43 tiYbs1p9.net
>>52
STLに関しては、コンテナ以外の部分を使わなければ、かなりスパゲッティー感が
なくなる。C++98以降、STLの実装にしか使わないような template の機能強化
に邁進してしまったようだ。しかし、C++ reference などで STL がふんだんに
使って説明されてしまってるので若い人の間で STL が C++ の標準だと
思われてしまい、そこが難しいので C++ が嫌われる結果となっている。
本来はライブラリはプログラミングが簡単になることを目的にしているはずなのに、
STLはその逆を言ってしまっている。
問題なのは、STLを使いまくったC++コードがネット上に増えてしまっていること。

58:デフォルトの名無しさん
19/09/22 19:24:43.32 vTpi5vA1.net
奥が深いからね
ショウガナイね

59:デフォルトの名無しさん
19/09/22 19:40:18.23 +tHa6qta.net
STLのコンテナ以外の部分とか自作template使わないとプロ感出ないからね
仕方ないね

60:デフォルトの名無しさん
19/09/23 09:41:06.71 9Vk3Qf6P.net
言語仕様を一通り学んだ後でライブラリの詳細な使い方を覚えていけるのが理想。
ところが、cppreference では、言語仕様を本文だけでは説明し切れておらず、
サンプルコードを見てやっと理解できるようになっているが、そこで
非常に難解なSTLの使い方をしてしまっている。それでは
STLの非常に詳細な仕様を知らないとSTLの基礎となっている言語仕様すら
理解できないことになり、ある種の「トートロジー」のような現象が起きてしまう。
前段階の理解を元に三段論法的に論理や理解を進めていくという説明の仕方になっていないのだ。
そのやり方が C++ が難解であるというイメージを植えつけてしまっている。
cppreference の執筆者やC++委員会の上の方の人の中に、STLをC++の言語
それ自体だと思っている人がいるように思えてならない。
確かにPythonやRubyでは、似たような機能を持つものが、言語そのものの一部
である位置づけになっている。しかし、その理解はとても容易である。
だから、言語仕様を説明するサンプルコードがその理解を前提にしていたとしても、
理解の妨げにはならない。ところが、C++ではその事情は一変するのだ。

61:デフォルトの名無しさん
19/09/23 11:55:25.99 3qdqqJ07.net
codecvtですね判ります

62:デフォルトの名無しさん
19/09/23 12:36:29.52 9Vk3Qf6P.net
>>60
正確には、トートロジー というより、循環論法に近い。

63:デフォルトの名無しさん
19/09/23 13:25:24.38 IaDL9t/N.net
>>60
たとえば cppreference のどの記事のことを言ってるんですか?
1つか2つでもいいんで、具体例がほしいです。

64:デフォルトの名無しさん
19/09/23 14:28:50.02 9Vk3Qf6P.net
>>63
もしかしたら >>60 の説明は「ずれて」いたかもしれないけど、例えば、言語仕様の
サンプルコードに高頻度に vector が出てくるので、それ自体がどうやって実装されているかを
調べることも重要になってくる。すると、initailizer-list なるものが重要であることがわかり、
vector の実装でそれがどう関係しているかも知りたくなる。それを知る前にまずは、vector template
の細かい仕様を調べたくなり、以下を見るとする:
URLリンク(en.cppreference.com)
↑は冒頭部分からしてこうなってる:
template<
 class T,
 class Allocator = std::allocator<T>
> class vector;
(1)
namespace pmr {
 template <class T>
 using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;
}
(2) (since C++17)
1) std::vector is a sequence container that encapsulates dynamic size arrays.
2) std::pmr::vector is an alias template that uses a polymorphic allocator
これは、初心者には難しすぎるし、実装を調べたいような上級者には情報が不足しており、
「帯に短し襷に長し」状態である(ちゃんとした説明になっていないのだ)。
上の部分を見た場合、最初に、allocator とはなんなのか、ということが疑問になる。
そして、allocator を調べなくてはならなくなる・・・・。
まず、vector とは何なのかが大まかに知りたかった人にすら、これでは難しい。
例えば、Ruby なら、[a,b,c] は、リストといって、集合です、と説明して
わずかなサンプルでもその全体像が分かった気がしてくる。
それとは全然違うことになってしまっている。

65:デフォルトの名無しさん
19/09/23 14:39:03.51 9Vk3Qf6P.net
>>64
誤:initailizer-list
正:initializer-list
vector の仕様を調べようとすると、(1),(2)の2つの定義が出ており、(2)では
なぜか、namespace pmr が出てきて、さらに、using vector = ・・・、で
vector という名前が alias で定義されているらしい。基礎の基礎を知りたくて
vectorを調べたのに、namespace と using alias が出てくる。そして、pmr
という namespace がいったい何なのかということを知る必要が出てくる。
まず説明に言葉が足りてない気がする。英語は曖昧さを含み易い言語らしく、
英語に強い人に聞いても「文脈でどっちとも取れるので正確な意味は分からない」
と言われる。日本語に比して言葉の意味が薄くて、サンプルコードが重要となる。
IntelのCPU命令のマニュアルだと、擬似コードで説明されている事があり、
その場合にはほぼ正確に言っていることが分かるが。cppreferenceはそれもない。
ほぼ、サンプルコードだけが頼りになっているが、そのサンプルも分かりにくい。
サンプルに対する英語の説明が少なすぎるから。

66:デフォルトの名無しさん
19/09/23 15:02:06.71 9Vk3Qf6P.net
>>64
時々、「コードこそがドキュメント」などという人がいて、それに従って
cppreferenceが書かれてしまっている可能性がある。しかし、vectorの
「仕様」とは、vectorが如何に実装されているかではなく、如何に使うか
の説明から入るべきなのに、>>64は、実装をモロに見せてしまってるから
難しくなっている。(1)のtemplate文だけでは、templateの仕様がまだ理解できてない
段階では、vectorの仕様を知ることが出来ないことになる。そう書くよりも、
いきなり、
std::vector<int> v = {7, 5, 16, 8};  // (100)
で、4つの整数型の要素を持つ配列を確保します。
メモリ上で要素は、隣り合わせに並びます。
配列の長さは動的に変更することが出来ます。
と書いたほうが良いし、完全な referece を書きたい場合でも、>>64 の(1)のように
書くべきではなくて、例えば、(100)を一般化して
[vector 型オブジェクトの作成方法]
std::vector<int> オブジェクト名 = 初期化子;  // (101)
 初期化子 := {初期値リスト}
などと書かないいけない。
>>64 の (1)は、vector自体の「実装方法」を書いているだけで
vectorの「仕様書」にはなっていない。

67:デフォルトの名無しさん
19/09/23 15:16:09.23 3qdqqJ07.net
なるほど
それならトートロジーとか循環論法と言うよりも
もっと適切な言葉があるはず

68:デフォルトの名無しさん
19/09/23 15:21:18.30 9Vk3Qf6P.net
>>66
集合や、データベース系のソフトウェアでは、言葉は忘れたが、
初期化、追加、削除、参照、検索、個数の取得
などが良く使われる(ほぼ必須の)基本機能だとされるから、
[vector 型オブジェクトの作成方法]
std::vector<要素の型> オブジェクト名 = 初期化子;  // (200)
std::vector<要素の型> オブジェクト名 初期化子;  // (201)
 初期化子 := {初期値リスト}
[vector 型オブジェクトへの末尾への要素の追加]
オブジェクト名.push_back(要素);         // (210) 要素をコピーして追加したい場合
オブジェクト名.push_back(std::move(要素));   // (211) 要素を移動して追加したい場合
[vector 型オブジェクトの idx 番目の要素の参照]
オブジェクト名[idx]    // (220) : idx は先頭が 0 から始まる。
・・・
などと書いていけばよい(自分は細かい仕様が分かってないのでこれ以上詳しくは
書けないが、reference manual を書く人なら書けるはず)。
初心者が期待する reference manual とは上記のようなもので、
>> 64 のようなものではない。何度も言うが、>>64
実装と仕様が混合されてしまったもので、どっちつかずの状態になっている。

69:デフォルトの名無しさん
19/09/23 15:26:14.73 3qdqqJ07.net
ソースから自動生成してるなら仕方ない面もある

70:デフォルトの名無しさん
19/09/23 23:08:32.79 MNSCG3IB.net
実装で仕様が隠蔽されている

71:デフォルトの名無しさん
19/09/23 23:52:06.90 U2/CMzYE.net
大きい・小さいとか、言葉は、about で抽象的だから、
こんな厳密な事を決めるのには、向いていない
図解・サンプルの方が、圧倒的に理解しやすい。
だから、下の3冊などは、神の書と呼ばれる
サンプルを示すことで、OK/NG というのがハッキリわかるから!
C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
Linux プログラミング・インタフェース、Michael Kerrisk、2012
理解できないような事を書いている、香具師が悪い。
そういうのを追っかけても、時間の無駄
プログラミング・フレームワーク・構造がわかるためには、Ruby でもやった方が余程よい。
C/C++ などポインタのある言語は、プログラミングを学ぶのに適していないし、
バグで時間を浪費するから、結局学べないw

72:デフォルトの名無しさん
19/09/30 10:42:32.26 6yDcPDBq.net
なるほどね
初心者にとっては
一度に多くのことを覚えないといけないのは負担が多い
生配列を使うのは良くないから最初からvectorを教えるのは
有る意味正しいけど
理解するには難易度が上がってしまっている
オブジェクト指向プログラミングでも同じ様な感じで
例の
動物クラスから継承して犬猫クラスを作ってワンニャン
とかの説明とかが良く有るけど
機能の説明としてはそれでいいんだけど
実際にそういう風には作らない(別にそういう風にやりたきゃやってもいいけど)
実際上は別な構造として作ったりするんだけど
その別なやり方をどうするのか?という説明が殆ど無いので
オブジェクト指向は糞
みたいな話になってくる
唯一の例題として有るのが
デザインパターン
だと自分は思っているが
あれを意味が無い
とか言っている人が結構居て
そのせいで軽視されているのが残念というか問題だと思ってる
初心者が手がかりにするのは難しい面も有るけど他に良さそうな例題が余り無い
適切な教科書を作る
というのは結構高度で大変で
作れる人が少ない
その割には作った人には余り金にならなかったりして
作ってくれる人が余り居ない印象

73:デフォルトの名無しさん
19/09/30 12:08:38.76 vkIGDak2.net
gcc も g++ も VC も肥大化し過ぎた
digital mars c とか Borland C 5.5 かそれよりもっと前
tiny c compiler でもいい
初心者用にはもっとシンプルな C で充分

74:デフォルトの名無しさん
19/10/06 17:06:30.65 42LxT2AQ.net
quick c

75:デフォルトの名無しさん
20/03/26 16:08:19.66 71CdUQnj.net
>まず説明に言葉が足りてない気がする。英語は曖昧さを含み易い言語らしく、
英語は抽象意味言語だから指している範囲がザックリしてて
短い文章とかだと何を言っているのか解らない
その分覚えておかないといけない分量が少なくて良い
英語から日本語に自動翻訳を掛けても上手く翻訳されていない時はその文章が何の分野で有るか解らないから間違っている様に見えると感じる
日本語は一つの意味を指している事が多いけど覚えておかないといけない分量が多いから大変だけど
その分広い範囲の意味を指していないのでちゃんと使うと意味が一点を指して誤解し難い
けどプログラムを書く時は
javaだととりあえず.を書いておけば良いから迷わないけど
c++だと.だったり->だったり::だったりするから迷う事がある
そんなに致命的な問題では無いけど

76:デフォルトの名無しさん
20/03/27 14:39:56 9RtDMjhb.net
::あんまり使わないな

77:デフォルトの名無しさん
20/05/06 18:31:54.91 K0jT0mUL.net
入門ロベールC++の188ページに
const char* MONTH_NAME[]={"睦月,"如月,"弥生"......  
というのがあるのですが、なぜchar*型の前にconstをつけると文字列リテラルをたくさん代入出来るのでしょうか?
const定数を外すと同じことが出来ないのがよく分からないです。ポインタが理解できてないのでしょうか。

78:デフォルトの名無しさん
20/05/06 18:38:37.65 wd9+jhuU.net
それの場合MONTH_NAMEの型は
「書き換えられないchar」「へのポインタ」「の配列」
であることがわかれば後はわかるっしょ

79:デフォルトの名無しさん
20/05/06 18:46:19 K0jT0mUL.net
>>78
すいません、分からないです・・・
何が分かってないからこうなってるのか。も分かってないからまた読み直して同じページに戻っても理解できないです・・

80:デフォルトの名無しさん
20/05/06 19:06:59 8YawtAIF.net
>>77
文字列リテラルの指す文字列は書きかえてはいけない。
char* の指す先の文字列は書きかえできる。
const char* の指す先の文字列は書きかえできない。

81:デフォルトの名無しさん
20/05/06 19:07:03 K0jT0mUL.net
何故文字配列なのに文字列を沢山入れられるのか…

82:デフォルトの名無しさん
20/05/06 19:09:49 8YawtAIF.net
>>77
あーわかった。あんたがエラーメッセージを読んで理解しようとしないから分からないんだよ。

83:デフォルトの名無しさん
20/05/06 20:16:45 K0jT0mUL.net
分かりません。
ポインタを直接文字列の値で初期化してるのもよくわからないです。

84:デフォルトの名無しさん
20/05/06 20:38:11 5oVnKxXT.net
char *s = "abc"; がダメな理由と
int a[] = { 1, 2, 3 }; がOKな理由を考えろ

85:デフォルトの名無しさん
20/05/06 20:47:05 Fjn1hDTG.net
const char* MONTH_NAME[]=

型 変数名[]

各要素の型は、const char*
[ ] は配列

最近、ロベールは本屋で売ってない

86:デフォルトの名無しさん
20/05/06 20:51:54 Fjn1hDTG.net
Ruby なら、変数名はラベルだから、変数に再代入できるけど

a = "a"
a = "abc"

87:デフォルトの名無しさん
20/05/06 20:53:56 K0jT0mUL.net
>>84
char* sはchar型の変数の参照が入ってないから駄目なのでは?
下はただの配列変数だからできてるのでは?

88:デフォルトの名無しさん
20/05/06 21:05:23 K0jT0mUL.net
>>85
const char*という新しい型があるのですか?
constとは定数を宣言するだけのものじゃないのでしょうか

89:デフォルトの名無しさん
20/05/06 21:49:00 K0jT0mUL.net
char* str[]={"aaa","bbb","ccc"}はできないのに
const char* str[]={"aaa","bbb","ccc"}はエラーにならないのも意味わからないです
const chr*のエンティティ云々も意味不明なのですがロベール188pまでにその説明は載ってるのでしょうか

90:デフォルトの名無しさん
20/05/06 21:54:43 5oVnKxXT.net
じゃあ const char *s = "abc"; がわからないのか
これはどこかにある "abc" という配列へのポインタでsを初期化しなさいっていう意味で、
char *s = "abc"; がダメなのは "abc" が変更不可だから

あとは const char *s = "abc"; と const char *MONTH_NAME[] = { "睦月", ... }; の関係が int i = 0; と int a[] = { 0, ... }; の関係と同じであることを考えればわかるはず

91:デフォルトの名無しさん
20/05/06 22:11:15.73 8YawtAIF.net
>>89
「できない」理由はエラーメッセージに書いてあるだろ。読めよ。

92:デフォルトの名無しさん
20/05/06 22:58:31 K0jT0mUL.net
>>90
文字列って定数なんですか?
何となく分かってきた気がします!細かく教えていただきありがとうございます

93:デフォルトの名無しさん
20/05/07 12:23:12 iKRewGMt.net
>>77
const 付けたくないなら
char MONTH_NAME[][5]={"睦月,"如月,"弥生"......

94:デフォルトの名無しさん
20/05/07 17:22:45 8jv+kISL.net
char r[] = "hoge";
char *s = "hoge";
const char *t = "hoge";
char *MONTH_NAME_A[]={"睦月","如月","弥生"};
char MONTH_NAME_B[][7]={"睦月","如月","弥生"};
どれもエラーも警告も出んかった

95:デフォルトの名無しさん
20/05/07 18:27:09 wkYaXeHy.net
char *t = "hoge";
これがエラーにならないのは言語上の欠陥

96:デフォルトの名無しさん
20/05/08 06:37:37 Br/73fC2.net
ロベールさんで紹介してる環境に限定されると語れる立場じゃないんだが…。

>>93
漢字1文字を2byteと仮定するのは危険じゃないかしら。
このごろUTF-8でベタに文字列書くことが多いんでちょい気になる。
と言ってu8プレフィックス付けるほどお行儀良くもない中途半端な人。

>>94
char *s = "hoge"; で警告出ないとは
ストラウストラップ先生がガッカリしそうなコンパイラね。

97:デフォルトの名無しさん
20/05/08 09:24:37 0HhOrENw.net
>>95
C++11 以降の言語仕様では許していない。
それより前の仕様では許していたという歴史的経緯があるので
(エラーではなく) 警告にとどめている処理系がまあまあ有るという事情。

98:デフォルトの名無しさん
20/05/08 09:31:38 oIDbptWL.net
C++
URLリンク(ideone.com)
C++14
URLリンク(ideone.com)

どっちもスルーされる

99:デフォルトの名無しさん
20/05/08 21:53:35 +i26a8kQ.net
ロベールの入門書に /*構造体変数student*/
int length = sizeof stundent /sizeof *student
というのがあるのですが何故これで配列の要素数が出るのでしょうか?
sizeof student / sizeof student[0]だと配列の要素数が出る理屈は何となく分かるのですが
配列とポインタは別のものですよね?

100:デフォルトの名無しさん
20/05/08 22:21:29 /+tKw0XQ.net
student[0] と *student は同じ

101:デフォルトの名無しさん
20/05/08 23:07:29 +i26a8kQ.net
何で同じなのでしょうか?これで動くからこういうもの。という理解で大丈夫なんでしょうか

102:デフォルトの名無しさん
20/05/08 23:48:12 xx+9oYGy.net
MSの陰謀。

103:デフォルトの名無しさん
20/05/09 06:15:34 LKKpAq9a.net
とりあえず stundent は誤りで正しくは student だとして

多くの場合、配列名は「配列の先頭要素を指すポインタ」と解釈される、から。
つまり配列studentについて student == &student[0] が成り立つ。
*演算子を作用させて *student == *&student[0] == student[0]
よって sizeof *student == sizeof student[0]

ここで注意すべき点は「配列名がsizeof演算子のオペランドになった場合は
配列の先頭要素を指すポインタとは解釈されない」ってこと。
sizeof 配列名 == 配列全体が占有するメモリ容量


なぜそうなっているか、という理由は「そう決めると便利だから」かな。
Cの頃からそういう感じでプログラム書いてたから、という歴史的経緯もある。

>>102 初心者をからかっちゃアカンよ。信じちゃうかも知れん。

104:デフォルトの名無しさん
20/05/09 09:28:26 3rxWY8lS.net
コロチャンもゲイツの陰謀とか言ってる人が居てわろす
温暖化も陰謀ω

105:はちみつ餃子 ◆8X2XSCHEME
20/05/09 10:52:17 MmeKQuXy.net
>>99
「暗黙の型変換」によって配列がポインタに型変換されるルールがある。
スムーズにポインタとして使えてしまうから混同してわけわからんようになる初心者が多いんだけど、
あくまでも別物であるという理解が出来ているなら入門者としてはかなり優秀だと思う。

ほとんどの場合に配列はポインタに暗黙に型変換されるんだけど、
例外としては
 ? sizeof を適用するとき
 ? 単項の & を適用するとき
 ? 参照で受け取るとき
があって、これらの状況では型変換されずに解釈される。

----

余談だけど暗黙の型変換とは別に仮引数の調整というのもあって、
関数の仮引数として配列を書いた場合も配列はポインタに調整される。
たとえば
void foo(int a[10]) {}
という定義を書いたら
void foo(int* a) {}
と全く同じように解釈される。

106:デフォルトの名無しさん
20/05/11 03:00:46 II69MMpE.net
すいませんロベール持ってる人にお聞きしたいのですが
305ページの
for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが
このsizeというローカル変数は何処に定義されてるんでしょうか?

107:デフォルトの名無しさん
20/05/11 05:46:42 k4wInV7m.net
>>106
“ロベール本”を持ってないので答えられない立場かも知れんけど…。
この size は「ここ」で定義されているんだと思うよ。

for の初期化式 int i = 0, size = a.Size(); で、
「int の i」と「int の size」という2つの変数を定義している。

108:デフォルトの名無しさん
20/05/11 07:45:03.87 II69MMpE.net
>>107
forの中で2つ宣言できるんですね!そんな事も知りませんでした。
ありがとうございます。

109:デフォルトの名無しさん
20/05/11 09:53:48 MhpqGE2N.net
型が違うときは?
for (long i = 0, int size = a.Size(); i < size; ++i)

110:デフォルトの名無しさん
20/05/11 19:53:43.37 8B6Lebzi.net
C++17なら
for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)

111:デフォルトの名無しさん
20/05/21 23:33:00 fIo5j0A9.net
class DataStore {
public:
DataStore(int v) : mValue(v) {}
bool operator==(const DataStore& rhs) const;

private:
int mValue;
};

bool DataStore::operator==(const DataStore& rhs) const
{
return mValue == rhs.mValue;
}

int main()
{
DataStore ds1(10), ds2(10);
if (ds1 == ds2) {}
}

というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか?
後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです

112:デフォルトの名無しさん
20/05/21 23:57:47 ut4Weg2U.net
operatorも、ただの関数
if (ds1.operator==(ds2)) {}

113:デフォルトの名無しさん
20/05/22 00:55:03.99 H9gcgSgg.net
const DataStore& rhsの実引数はds1ってことですか?

114:デフォルトの名無しさん
20/05/22 06:44:02 8neFOyTD.net
この流れだと、仮パラメータ rhs にバインドされる実引数は ds2 でしょ。

クラスのメンバ関数として宣言された2項演算子の operator OP(rhs) は、
lhs OP rhs と書くと lhs.operator OP(rhs) が呼び出される。
…と書いても分かりにくいね。


具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、
ってのが >>112 の人の言ってること。

115:デフォルトの名無しさん
20/05/22 09:23:45 JweU/zGV.net
余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。
(標準ライブラリでもだいたいそうなってる。)

116:デフォルトの名無しさん
20/05/22 12:29:55.77 6NFPH2hn.net
constかどうかで決めるのはアホ

117:デフォルトの名無しさん
20/05/30 06:36:15 1Zwy+dfa.net
なぜ文字から'0'を引くと数字を数値に変換できるのですか? char c='8' int a=c-'0'
理屈がよくわからないです。
よろしくお願いします

118:デフォルトの名無しさん
20/05/30 07:25:50 /FCD7s4m.net
順番に並んでいるから。

119:デフォルトの名無しさん
20/05/30 07:33:59 1Zwy+dfa.net
文字コードが順番に並んでるのは分かったのですが
なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません
よろしくお願いします

120:デフォルトの名無しさん
20/05/30 07:57:34.41 /LdiluDZ.net
'0'を引かなくてもキャストせずにint型の変数に代入できるよ
c/c++では文字は整数型に文字コードを入れて扱うんだよ

121:デフォルトの名無しさん
20/05/30 08:07:04.11 1Zwy+dfa.net
苦しんで覚えるC言語という本の255ページに
”数字を使うときには引き算で本来の数値を知ることも出来ます。
数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。
数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。”
とあるんですが
”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです

122:デフォルトの名無しさん
20/05/30 08:27:53 CZP1xQZw.net
文字が元々数値(文字コード)であることが理解できてないのでは
ASCIIコード表でググってみれ

123:デフォルトの名無しさん
20/05/30 10:03:05.95 /LdiluDZ.net
2に3を足す時、
int a = 2; int b = 3; int c = a + b;
とやるとc == 5になる
int a = '2'; int b = '3'; int c = a + b;
とやってもc == '5'にはならない
今やほぼASCIIだからc == 'e'になる
int a = '2' - '0'; int b = '3' - '0'; int c = a + b;
とやるとc == 5になる
'0'から'9'まで連続していることはcの規格が強制してるから
これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味

124:デフォルトの名無しさん
20/05/30 16:37:51 A5Abb6S3.net
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型
int a = c - '0'; // char型の数値8 で int変数a を初期化・代入

一般にint変数にchar型の値を格納することは認められている。


思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。

125:124
20/05/30 16:49:13.96 A5Abb6S3.net
すまん 124 は間違ってるみたい、忘れてくれ。
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型
int a = c - '0'; // 数値8 で int変数a を初期化・代入
思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。

'8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード)
std::cout << "sizeof('8') == " << sizeof('8') << '\n';
std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';

126:デフォルトの名無しさん
20/05/30 18:38:26.55 1Zwy+dfa.net
>>125
そういうことでしたか。
詳しく噛み砕いていただきありがとうございます。

127:124
20/05/30 19:18:59.52 A5Abb6S3.net
型の検証はC++11なら直接的にできるね。
#include <typeinfo>
...
std::cout << "'8' is " << typeid('8').name() << '\n';
std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n';
実装定義の型の名前を得られる。

128:デフォルトの名無しさん
20/06/05 17:55:42 8OoEw/S/.net
なかなか、適当なスレを見付けるのが難しいわい
C++ 且つ初心者だから、ここでいいのかな

subroutine で、例えば、boolean と string のふたつの変数の値を
return するには、やっぱり std::map を使うのが一番簡単でしょうかね?

129:デフォルトの名無しさん
20/06/05 18:21:06 Uv2w5eYU.net
std::pair<>じゃないのか?
URLリンク(ja.cppreference.com)

130:デフォルトの名無しさん
20/06/05 19:03:13.94 8OoEw/S/.net
うーん、なんとなくそうおもいます、ええ

131:デフォルトの名無しさん
20/06/05 19:06:38.66 8OoEw/S/.net
あ、では、boolean, string, int の三つをreturn するには普通どうやるのが王道でしょうか?

132:デフォルトの名無しさん
20/06/05 19:08:18.91 8OoEw/S/.net
連投すまん。
std::tuple ですか。

133:デフォルトの名無しさん
20/06/05 19:12:47.23 Uv2w5eYU.net
たぶんそうだとお芋ます、ええ。
あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。
今回は関係なさそうですが。

134:デフォルトの名無しさん
20/06/21 13:29:09 hTPD8Gtd.net
>>131
王道かどうかは知らんが、C++17以降なら
auto func() {
return std::make_tuple(a, b, c);
}

auto [f, s, n] = func();
っていう風にできるで

135:デフォルトの名無しさん
20/06/21 16:38:41.93 rRP2z2l8.net
std::tie の方が好き

136:デフォルトの名無しさん
20/06/22 16:40:35.96 sjaABjGh.net
C++でint[変数]というようなことが出来ないのはstack overflow防止のためなんでしょうか?

137:はちみつ餃子
20/06/22 16:50:40.23 H8+bL0cM.net
>>136
原則として型は大きさが決まっているもんなので、そうでないものがあるとややこしいんだわ。
(配列の大きさは型の一部。)

138:デフォルトの名無しさん
20/06/22 20:24:27.49 83jG8pXe.net
Cの新しいのだと出来る

139:はちみつ餃子
20/06/22 22:04:26.97 H8+bL0cM.net
>>138
新しいの……?
C99 で出来るようになったけど C11 以降ではオプショナル扱いなんだわ。
そして今年は 2020 年なんだわ。

140:デフォルトの名無しさん
20/06/22 23:23:01.67 rtw5aKlF.net
Cは89/90が基本

141:デフォルトの名無しさん
20/06/23 01:32:00.34 UY2AjBBL.net
以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?
typedef SubType* LPSUBTYPE;
template<> inline bool greater<LPSUBTYPE>::operator()
(const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const {

}

142:デフォルトの名無しさん
20/06/23 09:26:35 RMSfHJVB.net
>>141
エラーメッセージを読んで問題点を解決するように書き直すといいよ。
list に比較関数は渡せないと思うので前提が間違ってそうな気もする。

143:デフォルトの名無しさん
20/06/29 08:08:09.53 PYBXxpGI.net
VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?

144:デフォルトの名無しさん
20/06/29 18:23:34.98 gWW+3u18.net
C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど

145:デフォルトの名無しさん
20/09/08 02:57:29 ZBc9FXfY.net
何で構造体のchar配列は直接値が代入できず
strcpyを使う必要があるのでしょうか?

146:デフォルトの名無しさん
20/09/08 03:20:04.77 jacy6RM2.net
できるよ
struct A {
int x;
char b[4];
} a = {0, 1, 2, 3, 4};

147:はちみつ餃子
20/09/08 05:15:54.57 QZgDAT7o.net
>>146
それは代入ではなくて初期化

148:デフォルトの名無しさん
20/09/08 05:56:11.78 ZBc9FXfY.net
typedef struct {
char str[32];
}A;
int main(}{
A a;
a.str="aaa";
}
これができないってことです
言葉足らずですいません

149:デフォルトの名無しさん
20/09/08 08:44:00.12 h4K4tlm9.net
int main(void) {
int arr[5];
arr = 3;
}
ができないのと同じ理由です

150:デフォルトの名無しさん
20/09/08 09:53:15.41 zoI9JNor.net
かわいいw

151:デフォルトの名無しさん
20/09/08 10:55:42 0vfIbeP0.net
ちょっと忘れたから、推測だけど、

a.str="aaa";

"aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか?
例えば、4バイトのサイズで、10~13 アドレスに存在する場合に、10が代入されるとか

char str[32];

一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか

152:デフォルトの名無しさん
20/09/08 11:16:05 h4K4tlm9.net
意図してるだろうことを無理してやるなら
str[0] = 'a';
str[1] = 'a';
str[2] = 'a';
str[3] = '\0';
でできる.そしてこれをするためにstrcopyがある

153:デフォルトの名無しさん
20/09/08 15:36:44.61 JkCXGknl.net
>>148
型が違うし

154:デフォルトの名無しさん
20/09/08 15:57:15.69 SNM207t1.net
出来ない訳じゃないんだよな
typedef struct {
char b[4];
} A;
int main(void) {
A b = {1, 2, 3, 4};
A a;
a = b; // ok
a.b = b.b; // bad
return 0;
}
自分で for で配列要素代入すれば良い訳で
面倒だから memcpy や strcpy 使ってるだけ

155:デフォルトの名無しさん
20/09/08 16:02:13.68 JkCXGknl.net
>何で構造体のchar配列は直接値が代入できず
構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}

156:デフォルトの名無しさん
20/09/09 20:41:42.30 s+S5qxFe.net
>char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw

157:デフォルトの名無しさん
20/09/09 23:49:08.55 N/YnHGom.net
はじめたころは、こういうことにいちいちひっかかってたな…
わかっちゃえば、慣れちゃえばどーってことないんだけど

158:デフォルトの名無しさん
20/09/10 00:06:01.62 Qspm/kAl.net
同じようでいて、初期化と代入では見た目の作用がことなることがあるね

159:デフォルトの名無しさん
20/09/10 00:07:00.73 Qspm/kAl.net
見た目「と」作用が

160:デフォルトの名無しさん
20/09/10 15:36:27 rLZBXCmM.net
a も b も代入禁止だ

161:デフォルトの名無しさん
20/09/19 09:19:26.77 z/ngkL1p.net
>>157
常に初心に返ることで新たにわかることもある

162:デフォルトの名無しさん
20/09/21 06:30:22.99 GP+Uv9qA.net
C#ですいません
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて
イマイチ言ってる意味がわからないので
簡単なコードを用いてnamespaceを使う意味を教えて欲しいです

163:デフォルトの名無しさん
20/09/21 10:35:12.49 M8W5JifW.net
文字だけじゃないコード・・・

164:デフォルトの名無しさん
20/09/21 11:38:59.68 xNmUS8x8.net
寿限無名予防以外の目的?

165:デフォルトの名無しさん
20/09/21 11:59:08.18 IzAwgxqY.net
>>162
C#よくわかってないけど
こういうことが知りたいの?
URLリンク(ideone.com)

166:デフォルトの名無しさん
20/09/21 21:53:00.21 GP+Uv9qA.net
>>165
すいません、そういうことです。
usingについてはおかげさまで意味が分かりました。ありがとうございます。
namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、
どっからどの部分までが名前空間なのでしょうか

167:デフォルトの名無しさん
20/09/21 23:03:56.25 IzAwgxqY.net
>>166
namespaceがなかったら
たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで
さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、
自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する
(重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない)
みたいな事態が発生してしまう
さっきの例だと同名のメソッド(Console.WriteLine)を定義してても
System名前空間とMyNS名前空間で分けたからコンパイルが通る
System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの
MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの
namespace Hoge {
// {}内はHoge名前空間に属する
}

168:デフォルトの名無しさん
20/09/22 06:36:29.84 ZtayyY2i.net
完全にC++の感覚でしか説明できんけど、
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、
ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い
さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る
ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない)
こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと
あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利

169:デフォルトの名無しさん
20/09/22 13:09:23.63 iGBGeTHm.net
名前空間を使うと検索性が最悪になる
(別の名前空間の同一名称が引っ掛かりまくる)
みんなどう対処しているんだろう

170:デフォルトの名無しさん
20/09/22 17:08:47.15 QYfnOwKH.net
>>169
using namespaceするのが問題じゃない?

171:デフォルトの名無しさん
20/09/22 17:49:49.66 ZtayyY2i.net
いやusingに限らず、例えば>>168で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ
確かに検索で困ることはたまにある・・

172:デフォルトの名無しさん
20/09/22 19:24:25.17 Xh0fS725.net
namespace で絞り込んで、識別名をハイライトして、あとは気合

173:デフォルトの名無しさん
20/10/20 13:37:38.41 Mso39Itu.net
C++とVisual C++の違いについてです。
C++はプログラミング言語であり、
VC++は統合開発環境であるという説明があります。
でも私にはVC++がC++++のように見えます。
VC++はC++の文法に新たな流儀を付け加えるか置き換えていて
言語そのものの使用を若干変えているように見えます。
C++のキーワードが別のものに置き換わっていたりするからです。
そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。
この理解は正しいでしょうか。

174:デフォルトの名無しさん
20/10/20 13:38:19.99 Mso39Itu.net
使用改め仕様

175:デフォルトの名無しさん
20/10/20 14:39:40.58 C+6cO9mm.net
多少違うのは
#pragma くらいだろ
勝手に仕様なんて変えない
統合環境とか API とかはもちろん関係無い話

176:デフォルトの名無しさん
20/10/20 20:36:08.28 3YoHPXFg.net
IDEはVisual Studio
VC++はMSのC++商品名
C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ

177:デフォルトの名無しさん
20/10/20 22:21:46.71 qSDH25Or.net
__declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ

178:デフォルトの名無しさん
20/10/21 11:12:14.17 xBgAWF1Y.net
描かずに済むけどな

179:デフォルトの名無しさん
20/10/21 13:51:50.76 WStrtR1y.net
C++/CLIは拡張ですか?
いくつかの流儀を置き換えていますよね?
ポインタをハンドルと読んだり?

180:デフォルトの名無しさん
20/10/21 14:12:49.21 xLl2qqDk.net
MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは?
拡張でいいんじゃね

181:デフォルトの名無しさん
20/10/21 18:58:32.20 VaRlK94m.net
ポインタはポインタとしか言わんよ
ハンドルは

182:デフォルトの名無しさん
20/11/24 23:02:59.67 uO0ONWsd.net
Visual Studio 2019をインストールしました
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました
進め方が間違っているように思えますが、samp01.txtに#define...から
描き始めてよいでしょうか?
統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで
ソースを書いて保存
コマンドラインでコンパイル、エラーがなければリンク...をしてきました
何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください

183:デフォルトの名無しさん
20/11/25 07:42:29.85 +VuDDc3z.net
>>182
とりあえずこれに従えばおk
URLリンク(docs.microsoft.com)

184:デフォルトの名無しさん
20/11/25 08:12:43.79 1cagBqIs.net
>>182
俺は、テキストエディタでソースを書いて、c規格で拡張子cppで保存して、
Visual Studioで、
コード無しで続行→
ファイル→開く→フォルダ
で、コンパイルしてますがね。

185:デフォルトの名無しさん
20/11/27 09:48:07.00 sDMv6Edh.net
>>182
ソリューションを作るときに大雑把にどんなもの作るって指定すれば
最低限のファイルができて編集可能な状態になるんじゃないの?

186:デフォルトの名無しさん
20/11/27 15:09:19.88 8PW9KReU.net
ソリューションエクスプローラーのヘッダーファイル、ソースファイルのとこを右クリックで新規選べばまっさらなファイル作れるし
メニューのファイル→追加?(うろ覚え)でも作れる

187:デフォルトの名無しさん
20/12/06 23:34:56.54 TL07p8cG.net
手順書のページのURLありがとうございます。
Microsoft Visual Studio Community 2019
Version 16.8.2を使用中。
テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、
コロンやセミコロンの間違いはないと思われます。
#include<stdio.h>
int main( void )
{
printf( "ようこそC(++)言語の世界へ\n" );
return 0;
}
タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。
手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。
が、ビルドメニューがありません。
プルダウンのデバッグ(D)からデバッグ無しで開始したいですが
デバッグ無しで開始が薄い文字になっており、クリックできません。
統合開発環境って皆さんが使用して使いやすいはずですよね。
何から順番にクリックしていくのかさっぱりわかりません。
手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて
ソースを書いてコンパイルすらできない、ありません。ありません状態。
同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。
お助け下さい。

188:蟻人間
20/12/06 23:49:56.18 x83Xfz/W.net
>>187
ソリューションを作成した?
ソリューションにソースを追加した?

189:デフォルトの名無しさん
20/12/07 00:14:40.22 MnyC2DM9.net
アドバイスありがとうございます。
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。
ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。
[追加]->新しいファイル
    新しい項目の追加(W)
    新しいフォルダー
この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか
hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました
aaaと入力するとツールボックスに新しくテキスト入力タブが表示
#includeからreturnまで貼り付けました
デバッグ無しで開始の文字は薄いままです
ビルドメニューはありません
編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです

190:デフォルトの名無しさん
20/12/07 00:18:03.60 MnyC2DM9.net
あちこちクリックしていますと、画面の上に
プロジェクト、ビルド、デバッグの文字が出てきました
ビルド->ソリューションでコード分析を実行を選びます
デバッグ->デバッグ無しで開始は薄い文字でクリックできません
何か手順が不足しているようです

191:蟻人間
20/12/07 00:18:08.82 LcHpzYm6.net
ファイルとフォルダの違い
ソリューションの種類が違う
だろうな

192:デフォルトの名無しさん
20/12/07 00:59:54.04 MnyC2DM9.net
不慣れでごめんなさい
デバッグ無しで開始は薄い文字でクリックできず変わらず
本日はそろそろ寝ます
後は明日、使い方と用語を調べます

193:蟻人間
20/12/07 01:04:11.74 LcHpzYm6.net
初心者は素直にチュートリアルの手順に従ってればいいんだよ。

194:デフォルトの名無しさん
20/12/09 03:22:01.70 WuZTb4kZ.net
濡れちゃうう!

195:デフォルトの名無しさん
20/12/12 02:59:14.21 a7AUwK+L.net
なにからすればいいの
目標がない

196:デフォルトの名無しさん
20/12/12 13:02:07.54 A7m2fOl0.net
「何かしたい」というものが無いならば、しなくてどうぞ。
「何かしたい」というものが有る人は、自分で行動する。

197:はちみつ餃子
20/12/12 13:39:37.52 UUApGKPR.net
質問サイトにある質問に (根拠になる一次資料 (主に仕様書の具体的な項目) と共に) 回答するのを繰り返せば
特定のプログラミング言語に詳しくなることは出来るよ。
それでプログラミングを出来るようになるかどうかはわからんけど。

198:デフォルトの名無しさん
20/12/12 13:47:09.92 k8hTa554.net
「人工知能搭載の人型アンドロイドが作りたい」
という目標を持つ者が
「printfで文字列を表示したい」
という目標を持つのはとてもつらい

199:デフォルトの名無しさん
20/12/12 18:31:18.09 KTyXxWQ0.net
今日は国会図書館に行ってきたわ。

200:デフォルトの名無しさん
20/12/12 18:34:21.54 KTyXxWQ0.net
国会図書館は国会議事堂内に分室があって資料を取り寄せて閲覧できるんですよ。
でも、ほとんど利用実績が無いらしいんですね。

201:デフォルトの名無しさん
20/12/12 19:52:44.57 KTyXxWQ0.net
国会図書館は若い女性と、男性は老人が多かったです。
土曜日だからかもしれません。
資料のコピーは長蛇の列が出来ていました。
あの列で感染するんでしょうね。
女性のメガネ率は8割超えてました。
おそらくドクター持ちでしょうね。

202:デフォルトの名無しさん
21/01/05 14:54:55.04 zOsm6XDhK
自由な働き方を求め10代~20代の登録が拡大。フリーランス登録者約3.4倍に増加。
URLリンク(prtimes.jp)
フリーランス向け報酬即日払いサービス『先払い』申込件数5,000件突破
URLリンク(prtimes.jp)
ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始
URLリンク(prtimes.jp)
リース、フリーランスのためのお部屋探しアプリ「smeta」の正式版をリリース、提携賃貸管理戸数が6万戸を突破
URLリンク(prtimes.jp)
家族50万円・単身30万円を支給、新潟県が「テレワーク・フリーランス移住」で応援金
URLリンク(www.bcnretail.com)
ワーケーション会社員増加中、定額制宿泊サービス「HafH」を実体験
URLリンク(finance.yahoo.co.jp)
「フリーランススタート」の掲載案件数、累計16万件を突破
URLリンク(codezine.jp)
フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、
掲載案件数1ヶ月で10,000件増加し、累計掲載案件数16万件突破!さらにリモートワークの掲載案件数5,000件突破!
URLリンク(prtimes.jp)
フリーランス向けの求人は「テレワーク可能」が主流に 2021年は労働者の地方への移住が進む?
URLリンク(nlab.itmedia.co.jp)

203:デフォルトの名無しさん
21/02/08 19:09:45.85 UEWD7mIf.net
m1 macbookでc言語始めるのには何が必要ですか?
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?
学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。

204:デフォルトの名無しさん
21/02/08 19:14:35.93 XD2vlsgg.net
0からのって感じ
良いねえ

205:蟻人間
21/02/08 19:31:11.55 ifT1d8uh.net
>>203
clang、gccなどのCコンパイラのインストールが必要。

206:デフォルトの名無しさん
21/02/08 20:13:50.11 UEWD7mIf.net
>>205
レスどうもです
gccほかググってみました
①エディタで入力
②コンパイラで2進数へ変換(ここでgcc使用)
③コマンドプロンプトで実行
これで合ってますか?
合ってるとすれば、エディタは何がいいんでしょうか?

207:蟻人間
21/02/08 20:21:45.01 ifT1d8uh.net
>>206
Macは異端児だし、自由陣営じゃないから、テキストエディタは自分で選んでね。検索するときは、必ずキーワード「Mac」を付けてね。
コマンドプロンプトはWindowsの場合なんだよな。

208:デフォルトの名無しさん
21/02/08 20:44:41.11 0fSH6U0R.net
Linux なら、build-essential で、Ruby のRake でコンパイルする。
VSCode も使える
mruby の本も出た
Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11
宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応
人工衛星イザナギ・イザナミで、使っている

209:デフォルトの名無しさん
21/02/08 21:24:52.07 mOpGK7eJ.net
MacでもVSCode、gcc、terminalでええやんけ

210:デフォルトの名無しさん
21/02/08 22:16:35.01 UEWD7mIf.net
>>209
ありがとー

211:デフォルトの名無しさん
21/02/08 22:35:42.15 UEWD7mIf.net
色々教えてもらってありがとう
でもなんかrubyから始める方が良さそうなのでそうします

212:デフォルトの名無しさん
21/02/08 22:48:15.05 0fSH6U0R.net
Mac で、Cをやる人なんているのか?
たいてい、Linux だろ
Macの機械語をもらっても、誰も動かせないw

213:デフォルトの名無しさん
21/02/08 22:48:56.13 YmxwiogA.net
一応Visual Studio Community for Mac
何てものもあるけどね
MacユーザーじゃないのでWindowsと同じように使えるのかどうかは知らんけどw

214:デフォルトの名無しさん
21/02/08 22:52:50.26 ObgPii2R.net
m1ではxcodeはだめなのかなあ

215:デフォルトの名無しさん
21/02/08 23:04:19.24 WYlwG+td.net
大昔のmacbookの話だがxcodeなる10GBくらいの開発環境を入れないとほとんど何も弄れなかった記憶
今のストレージ容量ならmacbookでも行けそう

216:デフォルトの名無しさん
21/02/08 23:11:34.64 WYlwG+td.net
winは仮想環境も充実してるし色々コンパイラ試せるからいいよね
ネイティブサポートもintel mklやVCで結局一番手厚いし

217:デフォルトの名無しさん
21/02/08 23:18:46.61 nKLqWVxG.net
>>208
F-15はAda、F-35はC++で書かれてる。

218:デフォルトの名無しさん
21/02/08 23:37:09.64 0fSH6U0R.net
Linux には、strace という神ツールもある

219:デフォルトの名無しさん
21/02/09 00:44:38.89 OoGqnNNo.net
>>216
それでもApple環境だけはきついのよなぁ
噂通りiPadにxcode載せてくれれば、俺的に余計な出費なしに楽しめたのに
(もちろんiPad自体で開発する気はない)

220:デフォルトの名無しさん
21/02/09 09:28:59.64 aKFUc8iT.net
>>214
普通に使えるはず
VSとか勧めるくらいなら(IDE勧めるなら)macにはxcodeのが正しい

221:デフォルトの名無しさん
21/02/09 12:16:11.15 To5JxTyF.net
macを選ぶこと自体が正しく無い

222:デフォルトの名無しさん
21/02/18 19:54:34.90 clnw43k0.net
M1 macbook買ってruby でうっほっほーしてますわ

223:デフォルトの名無しさん
21/02/18 21:38:45.66 sRdwF113.net
最近コード読まなきゃならん機会増えてきて教養として読めるようにはなりたい
規格に沿ってなくても勉強にいい感じのインタプリタってないかな?

224:デフォルトの名無しさん
21/02/18 21:59:26.94 UlBwu06v.net
プロになりたい香具師は、YouTube で有名な雑食系エンジニア・KENTA のサロンに入って、
16~32GB メモリのMac で、Ruby on Rails でポートフォリオを作る
もっと、すごい人は、Windows 10, WSL2, Docker, Ubuntu, mruby で、
C99/Ruby 併用で、人工衛星など宇宙開発してるw
mrubyの本も出たし

225:デフォルトの名無しさん
21/02/19 15:37:54.68 LoU7pdW5.net
猛烈にNG率高いレス

226:デフォルトの名無しさん
21/02/20 03:42:06.46 1WE5qKPk.net
みんなRubyとかCでなにしてるの

227:デフォルトの名無しさん
21/05/17 11:52:26.06 094+MbId.net
srand((unsigned)time(0UL));
int r=rand()%100-1;
ってコードがあるのですが返ってくる値がランダムじゃなくて規則性があってモヤモヤしてます
参考書によるとsrandの文が起動時に別の値に毎回変えるための文らしいんだけど
返される値が8,18,28,28,38,48.......と10ずつ繰り上がっていってランダムになってません
何を追加すれば規則性が消えるでしょうか?

228:デフォルトの名無しさん
21/05/17 12:50:25.63 ZeUb3kXE.net
>>227
0 以上 99 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );
0 以上 98 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 99.0 );

229:デフォルトの名無しさん
21/05/17 13:21:28.15 giSQx4b2.net
URLリンク(www.math.sci.hiroshima-u.ac.jp)
URLリンク(www.math.sci.hiroshima-u.ac.jp)
URLリンク(qiita.com)

230:デフォルトの名無しさん
21/05/17 19:09:43.71 lfAH/Fki.net
>>227
これ使うのはダメ?
URLリンク(cpprefjp.github.io)

231:デフォルトの名無しさん
21/05/18 02:31:27.98 +SAIeHDc.net
>>227
疑似乱数は一定の規則に従って生成されるんだから規則的なのは当たり前。
それがどのくらいわかり難いのかという程度問題に過ぎないし、
どういった系を選ぶのが適切なのかは用途次第。
そしてよくある失敗だがランダムシードに時刻を使うなら時刻から予測できる可能性がある。
rand がどういうアルゴリズムで乱数生成するのかは言語仕様では規定していないけれど、
(乱数がとりうる範囲や、同じシードからは同じ乱数列が得られるという性質は規定している。)
伝統的に線形合同法で実装されることが多くて、
パラメータの選定や用途によっては露骨に規則的に見えることもある。
C++ では >>230 の言う通りメルセンヌツイスタが標準ライブラリとして提供されているのだから
それを使うのは妥当な解決方法である可能性は高い。
とはいえメルセンヌツイスタは簡単な物理シミュレーションなどにはおおよそ十分であるにしても
暗号用途には使い物にならないし速度はやや遅いので乱数が大量に必要な場合には
適切とは言えない。
かといって本物の乱数 (環境ノイズなどから生成される乱数) は再現性がないし、
これもまた遅すぎるので大量の乱数が必要な場合には向かない。
繰り返すけが乱数は用途に適しているかどうかであってあらゆる場面で万能な方法はない。
用途次第、状況次第。

232:デフォルトの名無しさん
21/05/18 08:10:11.28 ysWtxNVs.net
229にこれも組み合わせ
URLリンク(cpprefjp.github.io)

233:226
21/05/18 22:58:17.77 wt3ZqlEf.net
今C言語を学習してるのですがC++じゃないと完全ランダムは無理なのですね…。
RAND_MAXは関数なのでしょうか?Cだと使えなかったです。
教えてくださってありがとうございました。

234:230
21/05/19 00:18:20.95 ONEwpJm5.net
>>233
「完全なランダム」とは何か定義して。

235:デフォルトの名無しさん
21/05/19 00:55:55.90 g9DnnU6R.net
せっかくなのでC++を勉強してみては?

236:デフォルトの名無しさん
21/05/19 01:16:05.73 OYngDuIu.net
何をやりたい目的があるから、何々を勉強するだと、速いですよ。

237:はちみつ餃子
21/05/19 01:17:09.90 ONEwpJm5.net
このスレは C++ スレだからな。
C++ は C との互換性のために残している機能はあるが C++ 的にあまり好ましくない場合もあるし、
完全な互換性が維持されているわけでもない。

238:デフォルトの名無しさん
21/05/19 01:36:10.61 OYngDuIu.net
スレ建てといただす。
0からの、超初心者C言語相談室
スレリンク(tech板)

239:デフォルトの名無しさん
21/05/19 01:52:35.92 yT7tFlzp.net
>>233
RAND_MAXは、古くから有るマクロ定数で、stdlib.h で例えば次のように定義されている:
#define RAND_MAX 32767
説明によれば:
「rand関数が返す最大値。処理系によって異なるが、最低でも 32767以上である。」
rand()は偏りが強いには強いが、それでも 227 のように書けば 226 のように
下一桁がいつも8になるようなほどではない。

240:デフォルトの名無しさん
21/05/19 01:54:51.13 yT7tFlzp.net
少なくともrand() は、>>228 のように書けば、メルセデスツイストなどの
乱数を使わなくとも普通に使える。>>227 のように書くとダメなだけ。

241:デフォルトの名無しさん
21/05/19 10:58:56.45 G7N6xM6g.net
0から7の整数が均等確率で出る乱数をrとした場合、
x = r % 3;
とすると、xは0~2までの整数が出るが、均等確率ではない。
それはすべてのパターンを書いてみると分かる:(r,x)を書いてみると、
(0,0)
(1,1)
(2,2)
(3,0)
(4,1)
(5,2)
(6,0)
(7,1)
x= 0 となっているのは、3回。
x= 1 となっているのは、3回。
x= 2 となっているのは、2回。
なので、
P(x=0)=3/8
P(x=1)=3/8
P(x=2)=2/8=1/4
となり、x=2が出る確率だけが小さくなってしまう。
これと同様に、rが0~32767を均等確率で出す乱数の場合、x=r % 100の値は0~99までだが
xが0~99になる確率は均等ではない。

242:デフォルトの名無しさん
21/05/19 12:10:26.94 G7N6xM6g.net
なので、もし、とても偏りの少ない乱数を用いたとしても >>227 では均等に
出現しない。
それを解決するには>>228のようにすればよい。というか227が標準的なrand()の
使い方。
227 だともしrand()が均等確率で出ているならば、結果も均等に出現する。

243:デフォルトの名無しさん
21/05/19 13:29:25.47 G7N6xM6g.net
ちなみに、rand()は、出力範囲内の整数を全て出力し終わってから元の値に
戻る様になっているので周期も RAND_MAX + 1 に等しく、出力値は
均等確率で生じる。
>>227だと10で割った時の余りが必ず8になっておりそれは、出力が
10n + 8 になっているということ。これだと、今言った法則に当てはまって
ないので矛盾し、何かがおかしい。

244:デフォルトの名無しさん
21/05/19 15:03:30.63 SQApMI36.net
C言語でのサーバー構築のやり方わかる方いますか?

245:デフォルトの名無しさん
21/05/19 15:05:53.17 G7N6xM6g.net
>>244
HTTP サーバーのことかな?

246:
21/05/19 19:58:38.12 Y2/6iGxL.net
>>244
バークレーソケットをオープンしてリスンして、接続してきたのなら fork() だのスレッドで処理だの、というのを昔したことがありますが、すっかりわすれてしまいました…
どんなサーバーが欲しいのですか?簡単なサーバーならご要望に応えてテキトーに書く準備はありますよ

247:はちみつ餃子
21/05/19 23:06:46.13 ONEwpJm5.net
>>242
それはよくある勘違い。 >>228 の方式では均等にならない。 櫛状にばらける。
0~32767 の乱数から 0~99 の乱数を得るには
32700 以上の値が出たときにそれを捨てて
そうでない値のときに 100 の余りをとればいい。
少なくとも私の手元の環境にある std::uniform_int_distribution はそのように実装されている。

248:デフォルトの名無しさん
21/05/19 23:56:26.10 l+JWTKLH.net
>>242はアホと思ったけど、
こんな勘違いをするアホがよくいるって?
そんなアホな

249:デフォルトの名無しさん
21/05/20 00:27:22.67 qlUu+R49.net
>>247
uniform_real_distributionの時は?

250:デフォルトの名無しさん
21/05/20 02:25:38.74 Dz+v3/+O.net
>>227
の結果は予想と外れていると思う。
rand()は均等確率のはずなのに、100で割って下一桁に9ばかり出るはずはない。

251:デフォルトの名無しさん
21/05/20 02:28:22.34 UJvm/t/I.net
>>247
なるほど。言われてみればそうだわ。
32767はもともと100で割り切れないから、一部を捨ててやらないと
均等にはならないな。

252:デフォルトの名無しさん
21/05/20 02:52:09.51 onv6EMq1.net
しかし、昔実験してみた限り、rand()の周期は、通常、RAND_MAX + 1
であり、rand()自体は均等確率のはずだ。
それはべつに、>>247ではちみつが言っていることと矛盾するわけではない。
RAND_MAXが32767のように100で割り切れない値だから、>>228
のようにすると、端数の様な部分でわずかに均等確率からずれてしまう。
ただし、ずれる範囲は、32767/100 = 327.67 なので、確率にして
0.67/327 程度以下の小さなずれではあるが。

253:
21/05/20 22:00:26.21 +zMkmbAL.net
>>247
剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>247 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法
MT が発明されるまでは、最悪の方法「線形合同法」でもなんとか我慢できる部分範囲の乱酔生成法しか推奨されなかった
C FAQ をみてもそれがわかりますね
URLリンク(www.kouno.jp)
13.16:
A:ある範囲の整数からなる乱数はどうやったら生成することができるか。
Q:すぐに思い付く、
rand() % N
(これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜな ら乱数発生器の多くで下位のビットは悲惨なほどランダムでない。よりよい方法は以下のようなものである。
(int)((double)rand() / ((double)RAND_MAX + 1) * N)

254:はちみつ餃子
21/05/20 23:50:59.51 qkpZwp6c.net
>>253
乱数ソースの性質の悪い部分を分布関数で修正するのはレイヤの分離がきちんと出来ていない感じがして嫌だな。
下位ビットを捨てるなら捨てるでそれが明示的であるほうが好ましいと思う。

255:デフォルトの名無しさん
21/05/21 00:17:02.51 Q+lecBxK.net
QZからはキムチの匂いがする

256:デフォルトの名無しさん
21/05/21 10:19:44.69 pMLUvwAV.net
いずれにせよ >>227 は、まともな標準ライブラリで試すと 226 のような結果に
はならないはず。理由:
226では、rand()%100の下一桁が常に9だが、それだとrand()は常に奇数という
ことになるが、実際のrand()は全て奇数ということはないから。
現象的には、偶数と奇数が交互に来るという不具合が知られていたりするが、
全部奇数ということはない。

257:デフォルトの名無しさん
21/05/21 10:27:54.72 b4MjZLXj.net
超初心者スレであることを考えると >>227 の srand() がプログラム起動時一度だけとも限らないのでは。

258:はちみつ餃子
21/05/21 13:18:40.70 JT5uzYpW.net
Windows の (msvcrt の) rand は線形合同法だが下位バイトを豪快に捨ててる。
そのせいか (下位バイトを捨てない線形合同法よりは) 乱数としての質は多少良いが
初期値の違いに鈍感で、初期値が似ていれば最初の乱数も近いということが起こる。
>>257 の指摘は妥当かもしれない。

259:デフォルトの名無しさん
21/05/21 17:16:26.14 qriMwFf7.net
>>257
つまり、rand()だけを繰り返しているのではなく、srand()とrand()の組を
ひっくるめて繰り返しているようなことなのかな。
なるほど、それなら問題の焦点はsrand()と時刻の関係性になるので
>>227のような結果になったとしてもおかしくはないな。

260:デフォルトの名無しさん
21/05/21 17:24:43.18 qriMwFf7.net
なるほど。
質問者は、だから>>228でも快い返事をしてくれなかったのか。
彼は例えば、以下の様に書いていたようだね:
(1)
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100-1;
 printf( "r=%d, ", r );
}
本来は、こう書くか、
(2)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
 int r=rand()%100-1;
 printf( "r=%d, ", r );
}
こう書く:
(3)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
  int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );
  printf( "r=%d, ", r );
}
この中で(1)はダメ。(2)も余り良くない。(3)はplain Cでの簡単な書き方では
標準。しかし、わずかに均等確率からはズれる。

261:デフォルトの名無しさん
21/05/21 18:35:20.74 ojw3YA/u.net
>>256
>>227を見れば乱数になってないことは一目でわかると思うのだけど
>>256の時点で毎回srandを呼んでるのかとも思ったけど、
それにしても値が綺麗すぎる。

262:デフォルトの名無しさん
21/05/21 19:25:04.91 UZ6lwfzX.net
Cはよくわからんのだけど(3)のやつわざわざdoubleにキャストする必要あるの?

263:デフォルトの名無しさん
21/05/21 20:07:22.28 ojw3YA/u.net
RAND_MAX + 1 でオーバーフローするとか

264:デフォルトの名無しさん
21/05/21 20:19:47.95 UZ6lwfzX.net
最低でも32767以上だからINT_MAXのときもあるのか…
ありがとうございます。

265:デフォルトの名無しさん
21/05/21 20:22:18.98 UZ6lwfzX.net
と思ったけどRAND_MAX+1.0した時点でdoubleになるんじゃ?

266:デフォルトの名無しさん
21/05/21 20:30:15.34 ojw3YA/u.net
>>265
なるけど
書かなくても動作が同じであれば書かない主義?
カッコとかコメントとか
1.0 も 1. で良いんだよ
まあそれ以前に (3) はカッコの対応がおかしいな

267:
21/05/21 20:40:21.60 XRGlJQOp.net
>>254
確かに今となっては MT が開発されてしまったので、その感覚は理解できます
しかし、我々は MT がなかった頃の好き古き時代についても考慮するべきでしょう、過去の方法を評価するのに、その当時の技術的制約を考慮せずに「今の価値観」で裁断するのはフェアではない、と私はつくづく考えているのです

268:
21/05/21 20:47:24.81 XRGlJQOp.net
>>257-258
なるほど、従って >>227 に対する適切なアドバイスは次のとおりだと私は提案します
>>227
MT = メルセンヌ・ツイスタを使いなさい
srand() とか rand() は忘れなさい、これらは化石時代の乱数生成法だから、今となっては srand() とか rand() をあえて使う合理的理由は存在しません
MT の導入方法や使い方は、次の私のソースを参考にしてください
URLリンク(ideone.com)
スレリンク(tech板:60番)

269:デフォルトの名無しさん
21/05/21 21:29:08.32 ojw3YA/u.net
どう見ても乱数生成法の質の問題じゃない
使い方が間違ってる
乱数の質を求めるならハードウェアの乱数生成命令を使うのが一番だが
>>227はそういうレベルじゃない

270:デフォルトの名無しさん
21/05/21 21:33:53.10 ojw3YA/u.net
Visual Studioで以下をやったら>>227みたいな値になった
3秒ごとにsrand/rand をコールしてるんでしょう
for (int i = 0; i < 100; i++) {
srand(i*3);
printf("%d\n", rand() % 100);
}

271:
21/05/21 23:18:48.19 XRGlJQOp.net
え? >>227 って srand() を複数回呼んでいるんですか?確かにそれは間違っていますね…
srand() は普通、アプリ起動直後に一回だけ呼べば十分ですよ…

272:デフォルトの名無しさん
21/05/22 02:03:33.66 8I9NK3Yz.net
>>270
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100;
 printf( "r=%d\n", r );
 getche(); // 3 秒間隔で人間が Enter キーを押す。
}

273:デフォルトの名無しさん
21/05/22 02:04:35.75 MF6mf+kw.net
>>270
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100;
 printf( "r=%d\n", r );
 getche(); // 3 秒間隔で人間が Enter キーを押す。
}

274:デフォルトの名無しさん
21/06/02 11:54:46.08 QfG+Xq1u.net
書籍の意味が分からないので教えてほしいのですが
それ以外のって部分から何を言ってるのか全く分かりません
”signed char a;である時は、aには-128~127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。
最大値より大きい値になった時をオーバーフロー…略”

275:デフォルトの名無しさん
21/06/02 12:23:21.09 A2GTbdiP.net
何を教えてほしいのかわからない。

276:デフォルトの名無しさん
21/06/02 12:37:39.80 QfG+Xq1u.net
>>275
ロベールの107ページの
”signed char a;である時は、aには-128~127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。”
↑この文が意味不明なので簡単に教えてほしいです
”signed char a;である時は、aには-128~127の数値しか入れられません” ここまではなんとなく理解できたのですが…

277:蟻人間
21/06/02 12:45:51.56 1WJ2HfQ7.net
>>276
そもそもビットとかバイトとかわかるの?
わからないなら、基本情報から勉強しないといけない。

278:デフォルトの名無しさん
21/06/02 12:56:19.74 QfG+Xq1u.net
>>277
この前のページに2進数 1ビット 1バイトなどの単位と各型のバイト数について触れられてるので
そこは何となく理解できてるのですが

279:蟻人間
21/06/02 13:18:03.17 1WJ2HfQ7.net
>>278
1ビットは、2進数一桁で、ゼロかイチ。
2ビットは、2進数二桁で、00、01、10、11の2**2==4通り。これらは10進数で表すと0、1、2、3となる。
3ビットは、2進数3桁で、000、001、010、011、100、101、110、111の2**3==8通り。これらは10進数では、0、1、2、3、4、5、6、7となる。
……
8ビットは、2進数8桁で2**8==256通り。10進では0~255となる。現代では8ビットは1バイトに相当する。1バイトは16進二桁で表せる(2**8==16**2)。
以上は符号なしの場合。
符号付きの場合は最上位ビットがマイナス符号の有無を表し、正の場合は符号なしと同じで、負の場合は2の補数表現になる。

280:蟻人間
21/06/02 13:32:39.22 1WJ2HfQ7.net
2の補数表現というのがくせ者だが、まあ、Wikipediaの説明を見てもらいたい。
URLリンク(ja.m.wikipedia.org)
符号付き8ビットの場合はx+y==2**8となるyがxの2の補数となる。補数を使えば足し算で引き算を表せる。
まあ、例えば10進数4桁1234の10の補数表現は8766となる。1234+8766==10000となるが有効4桁からオーバーフロー(桁あふれ)してゼロになる。8767の場合は1234+8767==10001、
オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。

281:デフォルトの名無しさん
21/06/02 14:31:54.50 CzhBAh+2.net
お、優しい先生が現れたぞ。嘘ばかりの5ちゃんの中で珍しい。

282:デフォルトの名無しさん
21/06/02 14:44:42.56 QfG+Xq1u.net
>>280
すいません詳しくありがとうございます
補数って概念全く理解してなかったので、それが原因だと分かりました。
コンピュータは足し算しかできないのですね…
そこら辺知識固めてからもう一度読み直してみようと思います。

283:蟻人間
21/06/02 16:48:03.08 1WJ2HfQ7.net
10進4桁の場合、9999に1を足すと10000、オーバーフローしてゼロになる。よって、このオーバーフローするシステムの場合、9999はマイナスイチを表していると考えることができる。
同様に9998は-2であり、9997は-3である。

284:蟻人間
21/06/02 16:54:31.73 1WJ2HfQ7.net
符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。
規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。

285:はちみつ餃子
21/06/02 17:04:16.45 Bcy6nIKX.net
一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、
(C++20 からは二の補数であることが保証されるようになった)
1バイトが8ビットであることも保証してない。
signed char に型変換したときに上位ビットを切り捨てることも保証されない。
(変換後の型が unsigned のときには実質的に保証される。)
言語仕様として保証しないからといって間違っているというわけではなくて、
一般的なコンピュータのアーキテクチャではおおよそそうなってるのが普通というのも事実。
C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢
をとれるように言語仕様の側では意図的に決めてない部分がある。
「C++ の説明」として見たら >>276 で引用されている説明はちょっと微妙かもしれん。
あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。

286:デフォルトの名無しさん
21/06/02 23:13:21.37 ZuDsQZsq.net
float/doubleは

287:デフォルトの名無しさん
21/06/03 02:59:14.77 Ers5yK+g.net
char は環境依存なので使わないようにする。
unsigned・signed のどちらなのか、分からないため
unsigned char は、0~256
signed char は、-128~127
0~127、7ビットの範囲では、この2つは共通している
signed charは、先頭ビットが1なら、負数となる。
2の補数を調べて
1111_1111・0xFF なら、256か、-1

288:286
21/06/03 03:03:09.44 Ers5yK+g.net
>>287
修正
256 ではなく、255 です
unsigned char は、0~255
1111_1111・0xFF なら、255か、-1
だから、環境依存のchar 型を使っていると、
エラーに、-1を使っていたが、他の環境では255と表示されたりする

289:デフォルトの名無しさん
21/06/03 10:13:20.76 oKNqyVQK.net
むしろ int を期待してる引数に char 渡す時が危険

290:はちみつ餃子
21/06/03 13:38:18.86 ivgy5ZU8.net
char 同士なら符号の有無が違ってもビットパターンは維持された
ままで型を読み替えることが期待できる (言語仕様として保証しているわけではない)
けど、大きな型に変換するときは符号拡張が起こることがあるからだね。

291:デフォルトの名無しさん
21/06/05 22:29:47.19 UR0LV/yo.net
ハーバートシルト『STL標準講座』翔泳社, 1999, p.156-157
のサンプルプログラムで、そのままだとコンパイルが通らないものがあるのですが、
適当にconstをつけていたらコンパイルできるようになりました
しかし、理由がわかりません
どなたかご教示いただけませんか?
URLリンク(ideone.com)

292:デフォルトの名無しさん
21/06/06 01:24:02.19 Lz5dZs8J.net
operator <<のとこでoがconst参照だから、そのoからはconstなメンバ関数しか呼べない。のでそれで合ってる
元のソースが間違ってるか何かだと思う、この仕様は最初からのはずなので

293:
21/06/06 01:44:38.27 xlnMgrm3.net
>>291
set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。
だから set<>::iterator p; …①、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。
例えば①の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。
もともと const 属性はポインタにつけて、const 属性のついたポインタに -> 演算子を使って出来たメンバ変数の値を変更しないようにコンパイル時に厳密にチェックする縛りです
c++ における参照は「機械的にポインタを使った書き方に書き直すこと」が可能(…②※)ですから、const なイテレータ(≒ポインタ)から生成した参照は const な参照にならざるを得ないのです
※②は私の持論で、今回のお題でも参照をポインタに全部書き換えてやろうと試行錯誤していましたが、さすがに iostream や set で先に参照として宣言されているものを後からポインタにするのは不可能でした
頑張ってみたけれども、かえって意味不明な URLリンク(ideone.com) ぐらいにしかならなかった、持論は修正しなくてはいけないなあ…
set は重複要素を許さない二分木構造です。二分木構造 set に要素を挿入するときに、要素の大小関係にしたがって二分木の形をくみ上げていきます。
だからすでに二分木に組み込まれてしまった要素が、後からほいほいと要素の内容を変えられてしまっては二分木構造に矛盾をきたし、役に立たなくなってしまう…
だから set にすでに組み込まれている要素をイテレータで走査するときは、そのイテレータ≒ポインタは、メンバの書き換えが不可能なイテレータとするしかないか、と私は考えます
提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。
URLリンク(ideone.com)
friend 略 operator<<(略 C const &obj) { ... }
にならなくてはならないのは set<C>::iterator は set<C>::const_iterator と同じだからです
friend bool operator<(C const &a, C const &b) は set への要素の挿入のときに使う比較関数ですが、比較作業以外に要素のメンバを変えるとか余計なことをさせないために、最初から const 参照で宣言するべきでしょうし、そうなっているみたいですね
しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。
ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう
上記のお題をこの方針で書くとこうなります。
URLリンク(ideone.com)
いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください


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