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

0からの、超初心者C++相談室


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

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

1デフォルトの名無しさん2018/11/12(月) 14:55:13.35ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室

2デフォルトの名無しさん2018/11/12(月) 15:33:07.21ID:uNoTWhhe
まずC#を覚えます

3デフォルトの名無しさん2018/11/12(月) 15:41:29.72ID:D6ILV7Jx
>>1

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

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

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

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

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

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

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

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

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

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

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

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

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

17さまよえる蟻人間 ◆T6xkBnTXz7B0 2018/11/14(水) 00:36:22.61ID:XVbpx9nj
まず、ポインタ変数の宣言が初心者殺し。
int* a, b;の場合、bはポインタではない。

関数ポインタはさらに文法が複雑すぎる。
関数ポインタ型の複雑さから逃れるには、typedefを使うとよい。

18さまよえる蟻人間 ◆T6xkBnTXz7B0 2018/11/14(水) 01:24:53.28ID:XVbpx9nj
ポインタ型をtypedefしまくった環境がWindowsのWin32 APIだ。
intを大文字でINTと書く。intのポインタをLPINTと書く。unsigned intをUINTと書き、そのポインタをLPUINTと書く。
基本的な関数型は全てtypedefで定義済み。

これなら、ややこしいアスタリスク記号(*)に戸惑う必要はない。

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

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

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

22デフォルトの名無しさん2018/11/14(水) 11:35:25.78ID:zVp4oIsl
>>18
無駄に覚えることを増やす馬鹿言語

wsとかswとか_sとかいっぱいつけやがってシッチャカメッチャカ

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

24デフォルトの名無しさん2018/11/14(水) 12:34:52.66ID:OvTvaibz
整数を定義するときって以下の3つだとどれがメモリ消費量とか実行速度の面で一番効率いいですか?

#define XXX (1234)
enum{ XXX = 1234};
constexpr int XXX = 1234;

25デフォルトの名無しさん2018/11/15(木) 08:07:09.42ID:HNIzCpqS
効率は実測が基本

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

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

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

29デフォルトの名無しさん2018/11/16(金) 09:32:03.61ID:37LYr8ZY
a = xxx;
a = yyy;

これは、二重定義になりますか?

30292018/11/16(金) 09:41:00.05ID:37LYr8ZY
解決方法として

a = ("xxx" && "yyy");

を考えているのですが、これで良いでしょうか?

31デフォルトの名無しさん2018/11/16(金) 11:34:07.59ID:9iOixtPe
a[] = {xxx, yyy};

32292018/11/16(金) 11:52:01.81ID:37LYr8ZY
>>31
ありがとうございます!

33デフォルトの名無しさん2018/11/20(火) 23:59:39.03ID:GRv3bnvn
up

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

35さまよえる蟻人間 ◆T6xkBnTXz7B0 2018/11/22(木) 03:29:53.66ID:by2crdt6
C/C++ではありえません。不可能です。

36デフォルトの名無しさん2018/11/22(木) 06:04:18.72ID:94o8kAxO
>>34
C++のboolのサイズはcharと同じだから
b=i: で警告になるのは整数型と論理型の変換というより単にサイズの小さい方に
代入しようとしたから警告になるてことだろうね

boolを使わずに Booleanクラスとかを自分で作れば型変換の許可/不許可も自在だけど
ま、やらんわな。そんな非効率なことは

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

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

39デフォルトの名無しさん2018/12/03(月) 21:46:10.27ID:ZMLOrV5M
.net以前はMFCで商売してたからね。
その遺産を保守するのにC++が必要。

今でもそう言う会社相手に商売してる。
今はまだマシだけど、開発環境独占だと標準規格無視してた。
対応しなくても売れるのに、対応する必要は無いわな。

40デフォルトの名無しさん2018/12/03(月) 21:49:11.54ID:jYfXM2LM
御開帳です



http://connect.uh-oh.jp/

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

42デフォルトの名無しさん2018/12/05(水) 14:48:45.83ID:2sSegHBZ
namespace

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

44デフォルトの名無しさん2019/01/09(水) 10:11:37.02ID:Gyfngzmc
新年記念up

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

46デフォルトの名無しさん2019/01/22(火) 13:59:06.16ID:owIFG1wt
ゼロが流行っているのか?

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

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

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

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

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

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

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

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

55デフォルトの名無しさん2019/09/21(土) 17:40:00.07ID:icgczTg/
>その影響で何処か間違うとその間違った部分とは違う部分が違ってて
>それを理解するのが大変

「何処か間違うとその間違った部分とは違う部分が違っててそれを理解するのが大変」
はその通りだが

「その影響で」
は関係無い
大変なのは今に始まったことじゃない
高機能ωになる前からずっとそう

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

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

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

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

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

61デフォルトの名無しさん2019/09/23(月) 11:55:25.99ID:3qdqqJ07
codecvtですね判ります

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

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

64デフォルトの名無しさん2019/09/23(月) 14:28:50.02ID:9Vk3Qf6P
>>63
もしかしたら >>60 の説明は「ずれて」いたかもしれないけど、例えば、言語仕様の
サンプルコードに高頻度に vector が出てくるので、それ自体がどうやって実装されているかを
調べることも重要になってくる。すると、initailizer-list なるものが重要であることがわかり、
vector の実装でそれがどう関係しているかも知りたくなる。それを知る前にまずは、vector template
の細かい仕様を調べたくなり、以下を見るとする:
https://en.cppreference.com/w/cpp/container/vector

↑は冒頭部分からしてこうなってる:
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デフォルトの名無しさん2019/09/23(月) 14:39:03.51ID:9Vk3Qf6P
>>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デフォルトの名無しさん2019/09/23(月) 15:02:06.71ID:9Vk3Qf6P
>>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デフォルトの名無しさん2019/09/23(月) 15:16:09.23ID:3qdqqJ07
なるほど
それならトートロジーとか循環論法と言うよりも
もっと適切な言葉があるはず

68デフォルトの名無しさん2019/09/23(月) 15:21:18.30ID:9Vk3Qf6P
>>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デフォルトの名無しさん2019/09/23(月) 15:26:14.73ID:3qdqqJ07
ソースから自動生成してるなら仕方ない面もある

70デフォルトの名無しさん2019/09/23(月) 23:08:32.79ID:MNSCG3IB
実装で仕様が隠蔽されている

71デフォルトの名無しさん2019/09/23(月) 23:52:06.90ID:U2/CMzYE
大きい・小さいとか、言葉は、about で抽象的だから、
こんな厳密な事を決めるのには、向いていない

図解・サンプルの方が、圧倒的に理解しやすい。
だから、下の3冊などは、神の書と呼ばれる

サンプルを示すことで、OK/NG というのがハッキリわかるから!

C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
Linux プログラミング・インタフェース、Michael Kerrisk、2012

理解できないような事を書いている、香具師が悪い。
そういうのを追っかけても、時間の無駄

プログラミング・フレームワーク・構造がわかるためには、Ruby でもやった方が余程よい。
C/C++ などポインタのある言語は、プログラミングを学ぶのに適していないし、
バグで時間を浪費するから、結局学べないw

72デフォルトの名無しさん2019/09/30(月) 10:42:32.26ID:6yDcPDBq
なるほどね
初心者にとっては
一度に多くのことを覚えないといけないのは負担が多い
生配列を使うのは良くないから最初からvectorを教えるのは
有る意味正しいけど
理解するには難易度が上がってしまっている

オブジェクト指向プログラミングでも同じ様な感じで
例の
動物クラスから継承して犬猫クラスを作ってワンニャン
とかの説明とかが良く有るけど
機能の説明としてはそれでいいんだけど
実際にそういう風には作らない(別にそういう風にやりたきゃやってもいいけど)
実際上は別な構造として作ったりするんだけど
その別なやり方をどうするのか?という説明が殆ど無いので
オブジェクト指向は糞
みたいな話になってくる
唯一の例題として有るのが
デザインパターン
だと自分は思っているが
あれを意味が無い
とか言っている人が結構居て
そのせいで軽視されているのが残念というか問題だと思ってる
初心者が手がかりにするのは難しい面も有るけど他に良さそうな例題が余り無い

適切な教科書を作る
というのは結構高度で大変で
作れる人が少ない
その割には作った人には余り金にならなかったりして
作ってくれる人が余り居ない印象

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

74デフォルトの名無しさん2019/10/06(日) 17:06:30.65ID:42LxT2AQ
quick c

75デフォルトの名無しさん2020/03/26(木) 16:08:19.66ID:71CdUQnj
>まず説明に言葉が足りてない気がする。英語は曖昧さを含み易い言語らしく、

英語は抽象意味言語だから指している範囲がザックリしてて
短い文章とかだと何を言っているのか解らない
その分覚えておかないといけない分量が少なくて良い
英語から日本語に自動翻訳を掛けても上手く翻訳されていない時はその文章が何の分野で有るか解らないから間違っている様に見えると感じる

日本語は一つの意味を指している事が多いけど覚えておかないといけない分量が多いから大変だけど
その分広い範囲の意味を指していないのでちゃんと使うと意味が一点を指して誤解し難い

けどプログラムを書く時は
javaだととりあえず.を書いておけば良いから迷わないけど
c++だと.だったり->だったり::だったりするから迷う事がある
そんなに致命的な問題では無いけど

76デフォルトの名無しさん2020/03/27(金) 14:39:56.26ID:9RtDMjhb
::あんまり使わないな

77デフォルトの名無しさん2020/05/06(水) 18:31:54.91ID:K0jT0mUL
入門ロベールC++の188ページに

const char* MONTH_NAME[]={"睦月,"如月,"弥生"......  
というのがあるのですが、なぜchar*型の前にconstをつけると文字列リテラルをたくさん代入出来るのでしょうか?
const定数を外すと同じことが出来ないのがよく分からないです。ポインタが理解できてないのでしょうか。

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

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

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

81デフォルトの名無しさん2020/05/06(水) 19:07:03.19ID:K0jT0mUL
何故文字配列なのに文字列を沢山入れられるのか…

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

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

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

85デフォルトの名無しさん2020/05/06(水) 20:47:05.11ID:Fjn1hDTG
const char* MONTH_NAME[]=

型 変数名[]

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

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

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

a = "a"
a = "abc"

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

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

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

90デフォルトの名無しさん2020/05/06(水) 21:54:43.49ID:5oVnKxXT
じゃあ 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デフォルトの名無しさん2020/05/06(水) 22:11:15.73ID:8YawtAIF
>>89
「できない」理由はエラーメッセージに書いてあるだろ。読めよ。

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

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

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

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

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

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

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

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

98デフォルトの名無しさん2020/05/08(金) 09:31:38.60ID:oIDbptWL
C++
https://ideone.com/lWQYBs
C++14
https://ideone.com/2CLzMB

どっちもスルーされる

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

100デフォルトの名無しさん2020/05/08(金) 22:21:29.33ID:/+tKw0XQ
student[0] と *student は同じ

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

102デフォルトの名無しさん2020/05/08(金) 23:48:12.63ID:xx+9oYGy
MSの陰謀。

103デフォルトの名無しさん2020/05/09(土) 06:15:34.68ID:LKKpAq9a
とりあえず stundent は誤りで正しくは student だとして

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

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


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

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

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

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

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

----

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

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

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

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

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

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

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

111デフォルトの名無しさん2020/05/21(木) 23:33:00.50ID:fIo5j0A9
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デフォルトの名無しさん2020/05/21(木) 23:57:47.49ID:ut4Weg2U
operatorも、ただの関数
if (ds1.operator==(ds2)) {}

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

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

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


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

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

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

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

118デフォルトの名無しさん2020/05/30(土) 07:25:50.69ID:/FCD7s4m
順番に並んでいるから。

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

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

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

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

123デフォルトの名無しさん2020/05/30(土) 10:03:05.95ID:/LdiluDZ
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デフォルトの名無しさん2020/05/30(土) 16:37:51.27ID:A5Abb6S3
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」)
という部分に引っ掛かってるんじゃなかろうか。

1251242020/05/30(土) 16:49:13.96ID:A5Abb6S3
すまん 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デフォルトの名無しさん2020/05/30(土) 18:38:26.55ID:1Zwy+dfa
>>125
そういうことでしたか。
詳しく噛み砕いていただきありがとうございます。

1271242020/05/30(土) 19:18:59.52ID:A5Abb6S3
型の検証はC++11なら直接的にできるね。

#include <typeinfo>
...
std::cout << "'8' is " << typeid('8').name() << '\n';
std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n';

実装定義の型の名前を得られる。

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

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

129デフォルトの名無しさん2020/06/05(金) 18:21:06.88ID:Uv2w5eYU
std::pair<>じゃないのか?
https://ja.cppreference.com/w/cpp/utility/pair

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

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

132デフォルトの名無しさん2020/06/05(金) 19:08:18.91ID:8OoEw/S/
連投すまん。
std::tuple ですか。

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

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

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

135デフォルトの名無しさん2020/06/21(日) 16:38:41.93ID:rRP2z2l8
std::tie の方が好き

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

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

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

139はちみつ餃子 ◆8X2XSCHEME 2020/06/22(月) 22:04:26.97ID:H8+bL0cM
>>138
新しいの……?

C99 で出来るようになったけど C11 以降ではオプショナル扱いなんだわ。
そして今年は 2020 年なんだわ。

140デフォルトの名無しさん2020/06/22(月) 23:23:01.67ID:rtw5aKlF
Cは89/90が基本

141デフォルトの名無しさん2020/06/23(火) 01:32:00.34ID:UY2AjBBL
以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?

typedef SubType* LPSUBTYPE;

template<> inline bool greater<LPSUBTYPE>::operator()
(const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const {

}

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

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

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

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

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

147はちみつ餃子 ◆8X2XSCHEME 2020/09/08(火) 05:15:54.57ID:QZgDAT7o
>>146
それは代入ではなくて初期化

148デフォルトの名無しさん2020/09/08(火) 05:56:11.78ID:ZBc9FXfY
typedef struct {
char str[32];
}A;

int main(}{
A a;
a.str="aaa";
}

これができないってことです
言葉足らずですいません

149デフォルトの名無しさん2020/09/08(火) 08:44:00.12ID:h4K4tlm9
int main(void) {
int arr[5];
arr = 3;
}

ができないのと同じ理由です

150デフォルトの名無しさん2020/09/08(火) 09:53:15.41ID:zoI9JNor
かわいいw

151デフォルトの名無しさん2020/09/08(火) 10:55:42.52ID:0vfIbeP0
ちょっと忘れたから、推測だけど、

a.str="aaa";

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

char str[32];

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

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

153デフォルトの名無しさん2020/09/08(火) 15:36:44.61ID:JkCXGknl
>>148
型が違うし

154デフォルトの名無しさん2020/09/08(火) 15:57:15.69ID:SNM207t1
出来ない訳じゃないんだよな
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デフォルトの名無しさん2020/09/08(火) 16:02:13.68ID:JkCXGknl
>何で構造体のchar配列は直接値が代入できず

構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}

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

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

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

159デフォルトの名無しさん2020/09/10(木) 00:07:00.73ID:Qspm/kAl
見た目「と」作用が

160デフォルトの名無しさん2020/09/10(木) 15:36:27.72ID:rLZBXCmM
a も b も代入禁止だ

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

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

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

164デフォルトの名無しさん2020/09/21(月) 11:38:59.68ID:xNmUS8x8
寿限無名予防以外の目的?

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

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

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

さっきの例だと同名のメソッド(Console.WriteLine)を定義してても
System名前空間とMyNS名前空間で分けたからコンパイルが通る
System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの
MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの

namespace Hoge {
// {}内はHoge名前空間に属する
}

168デフォルトの名無しさん2020/09/22(火) 06:36:29.84ID:ZtayyY2i
完全にC++の感覚でしか説明できんけど、
あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、
ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い
さらに>>164の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る

ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない)
こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと

あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利

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

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

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

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

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

174デフォルトの名無しさん2020/10/20(火) 13:38:19.99ID:Mso39Itu
使用改め仕様

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

176デフォルトの名無しさん2020/10/20(火) 20:36:08.28ID:3YoHPXFg
IDEはVisual Studio
VC++はMSのC++商品名

C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ

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

178デフォルトの名無しさん2020/10/21(水) 11:12:14.17ID:xBgAWF1Y
描かずに済むけどな

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

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

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

182デフォルトの名無しさん2020/11/24(火) 23:02:59.67ID:uO0ONWsd
Visual Studio 2019をインストールしました
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました

進め方が間違っているように思えますが、samp01.txtに#define...から
描き始めてよいでしょうか?

統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで
ソースを書いて保存
コマンドラインでコンパイル、エラーがなければリンク...をしてきました

何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください

183デフォルトの名無しさん2020/11/25(水) 07:42:29.85ID:+VuDDc3z

184デフォルトの名無しさん2020/11/25(水) 08:12:43.79ID:1cagBqIs
>>182

俺は、テキストエディタでソースを書いて、c規格で拡張子cppで保存して、

Visual Studioで、

コード無しで続行→
ファイル→開く→フォルダ
で、コンパイルしてますがね。

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

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

187デフォルトの名無しさん2020/12/06(日) 23:34:56.54ID:TL07p8cG
手順書のページの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蟻人間 ◆T6xkBnTXz7B0 2020/12/06(日) 23:49:56.18ID:x83Xfz/W
>>187
ソリューションを作成した?
ソリューションにソースを追加した?

189デフォルトの名無しさん2020/12/07(月) 00:14:40.22ID:MnyC2DM9
アドバイスありがとうございます。
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。

ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。
[追加]->新しいファイル
    新しい項目の追加(W)
    新しいフォルダー
この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか
hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました
aaaと入力するとツールボックスに新しくテキスト入力タブが表示
#includeからreturnまで貼り付けました

デバッグ無しで開始の文字は薄いままです
ビルドメニューはありません

編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです

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

何か手順が不足しているようです

191蟻人間 ◆T6xkBnTXz7B0 2020/12/07(月) 00:18:08.82ID:LcHpzYm6
ファイルとフォルダの違い
ソリューションの種類が違う

だろうな

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

193蟻人間 ◆T6xkBnTXz7B0 2020/12/07(月) 01:04:11.74ID:LcHpzYm6
初心者は素直にチュートリアルの手順に従ってればいいんだよ。

194デフォルトの名無しさん2020/12/09(水) 03:22:01.70ID:WuZTb4kZ
濡れちゃうう!

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

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

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

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

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

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

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

202デフォルトの名無しさん2021/02/08(月) 19:09:45.85ID:UEWD7mIf
m1 macbookでc言語始めるのには何が必要ですか?
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?

学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。

203デフォルトの名無しさん2021/02/08(月) 19:14:35.93ID:XD2vlsgg
0からのって感じ
良いねえ

204蟻人間 ◆T6xkBnTXz7B0 2021/02/08(月) 19:31:11.55ID:ifT1d8uh
>>202
clang、gccなどのCコンパイラのインストールが必要。

205デフォルトの名無しさん2021/02/08(月) 20:13:50.11ID:UEWD7mIf
>>204
レスどうもです
gccほかググってみました

@エディタで入力
Aコンパイラで2進数へ変換(ここでgcc使用)
Bコマンドプロンプトで実行

これで合ってますか?
合ってるとすれば、エディタは何がいいんでしょうか?

206蟻人間 ◆T6xkBnTXz7B0 2021/02/08(月) 20:21:45.01ID:ifT1d8uh
>>205
Macは異端児だし、自由陣営じゃないから、テキストエディタは自分で選んでね。検索するときは、必ずキーワード「Mac」を付けてね。

コマンドプロンプトはWindowsの場合なんだよな。

207デフォルトの名無しさん2021/02/08(月) 20:44:41.11ID:0fSH6U0R
Linux なら、build-essential で、Ruby のRake でコンパイルする。
VSCode も使える

mruby の本も出た

Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11

宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応

人工衛星イザナギ・イザナミで、使っている

208デフォルトの名無しさん2021/02/08(月) 21:24:52.07ID:mOpGK7eJ
MacでもVSCode、gcc、terminalでええやんけ

209デフォルトの名無しさん2021/02/08(月) 22:16:35.01ID:UEWD7mIf
>>208
ありがとー

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

211デフォルトの名無しさん2021/02/08(月) 22:48:15.05ID:0fSH6U0R
Mac で、Cをやる人なんているのか?
たいてい、Linux だろ

Macの機械語をもらっても、誰も動かせないw

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

213デフォルトの名無しさん2021/02/08(月) 22:52:50.26ID:ObgPii2R
m1ではxcodeはだめなのかなあ

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

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

216デフォルトの名無しさん2021/02/08(月) 23:18:46.61ID:nKLqWVxG
>>207
F-15はAda、F-35はC++で書かれてる。

217デフォルトの名無しさん2021/02/08(月) 23:37:09.64ID:0fSH6U0R
Linux には、strace という神ツールもある

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

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

220デフォルトの名無しさん2021/02/09(火) 12:16:11.15ID:To5JxTyF
macを選ぶこと自体が正しく無い

221デフォルトの名無しさん2021/02/18(木) 19:54:34.90ID:clnw43k0
M1 macbook買ってruby でうっほっほーしてますわ

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

223デフォルトの名無しさん2021/02/18(木) 21:59:26.94ID:UlBwu06v
プロになりたい香具師は、YouTube で有名な雑食系エンジニア・KENTA のサロンに入って、
16〜32GB メモリのMac で、Ruby on Rails でポートフォリオを作る

もっと、すごい人は、Windows 10, WSL2, Docker, Ubuntu, mruby で、
C99/Ruby 併用で、人工衛星など宇宙開発してるw

mrubyの本も出たし

224デフォルトの名無しさん2021/02/19(金) 15:37:54.68ID:LoU7pdW5
猛烈にNG率高いレス

225デフォルトの名無しさん2021/02/20(土) 03:42:06.46ID:1WE5qKPk
みんなRubyとかCでなにしてるの

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

227デフォルトの名無しさん2021/05/17(月) 12:50:25.63ID:ZeUb3kXE
>>226
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 );

228デフォルトの名無しさん2021/05/17(月) 13:21:28.15ID:giSQx4b2

229デフォルトの名無しさん2021/05/17(月) 19:09:43.71ID:lfAH/Fki

230デフォルトの名無しさん2021/05/18(火) 02:31:27.98ID:+SAIeHDc
>>226
疑似乱数は一定の規則に従って生成されるんだから規則的なのは当たり前。
それがどのくらいわかり難いのかという程度問題に過ぎないし、
どういった系を選ぶのが適切なのかは用途次第。

そしてよくある失敗だがランダムシードに時刻を使うなら時刻から予測できる可能性がある。

rand がどういうアルゴリズムで乱数生成するのかは言語仕様では規定していないけれど、
(乱数がとりうる範囲や、同じシードからは同じ乱数列が得られるという性質は規定している。)
伝統的に線形合同法で実装されることが多くて、
パラメータの選定や用途によっては露骨に規則的に見えることもある。

C++ では >>229 の言う通りメルセンヌツイスタが標準ライブラリとして提供されているのだから
それを使うのは妥当な解決方法である可能性は高い。
とはいえメルセンヌツイスタは簡単な物理シミュレーションなどにはおおよそ十分であるにしても
暗号用途には使い物にならないし速度はやや遅いので乱数が大量に必要な場合には
適切とは言えない。

かといって本物の乱数 (環境ノイズなどから生成される乱数) は再現性がないし、
これもまた遅すぎるので大量の乱数が必要な場合には向かない。

繰り返すけが乱数は用途に適しているかどうかであってあらゆる場面で万能な方法はない。
用途次第、状況次第。

231デフォルトの名無しさん2021/05/18(火) 08:10:11.28ID:ysWtxNVs

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

2332302021/05/19(水) 00:18:20.95ID:ONEwpJm5
>>232
「完全なランダム」とは何か定義して。

234デフォルトの名無しさん2021/05/19(水) 00:55:55.90ID:g9DnnU6R
せっかくなのでC++を勉強してみては?

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

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

237デフォルトの名無しさん2021/05/19(水) 01:36:10.61ID:OYngDuIu
スレ建てといただす。

0からの、超初心者C言語相談室
http://2chb.net/r/tech/1621355654/

238デフォルトの名無しさん2021/05/19(水) 01:52:35.92ID:yT7tFlzp
>>232
RAND_MAXは、古くから有るマクロ定数で、stdlib.h で例えば次のように定義されている:
#define RAND_MAX 32767

説明によれば:
「rand関数が返す最大値。処理系によって異なるが、最低でも 32767以上である。」

rand()は偏りが強いには強いが、それでも 227 のように書けば 226 のように
下一桁がいつも8になるようなほどではない。

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

240デフォルトの名無しさん2021/05/19(水) 10:58:56.45ID:G7N6xM6g
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になる確率は均等ではない。

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

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

243デフォルトの名無しさん2021/05/19(水) 15:03:30.63ID:SQApMI36
C言語でのサーバー構築のやり方わかる方いますか?

244デフォルトの名無しさん2021/05/19(水) 15:05:53.17ID:G7N6xM6g
>>243
HTTP サーバーのことかな?

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

246はちみつ餃子 ◆8X2XSCHEME 2021/05/19(水) 23:06:46.13ID:ONEwpJm5
>>241
それはよくある勘違い。 >>227 の方式では均等にならない。 櫛状にばらける。

0〜32767 の乱数から 0〜99 の乱数を得るには
32700 以上の値が出たときにそれを捨てて
そうでない値のときに 100 の余りをとればいい。

少なくとも私の手元の環境にある std::uniform_int_distribution はそのように実装されている。

247デフォルトの名無しさん2021/05/19(水) 23:56:26.10ID:l+JWTKLH
>>241はアホと思ったけど、
こんな勘違いをするアホがよくいるって?
そんなアホな

248デフォルトの名無しさん2021/05/20(木) 00:27:22.67ID:qlUu+R49
>>246
uniform_real_distributionの時は?

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

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

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

252◆QZaw55cn4c 2021/05/20(木) 22:00:26.21ID:+zMkmbAL
>>246
剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>246 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法
MT が発明されるまでは、最悪の方法「線形合同法」でもなんとか我慢できる部分範囲の乱酔生成法しか推奨されなかった

C FAQ をみてもそれがわかりますね
http://www.kouno.jp/home/c_faq/c13.html#16

13.16:
A:ある範囲の整数からなる乱数はどうやったら生成することができるか。

Q:すぐに思い付く、
rand() % N
(これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜな ら乱数発生器の多くで下位のビットは悲惨なほどランダムでない。よりよい方法は以下のようなものである。
(int)((double)rand() / ((double)RAND_MAX + 1) * N)

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

254デフォルトの名無しさん2021/05/21(金) 00:17:02.51ID:Q+lecBxK
QZからはキムチの匂いがする

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

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

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

>>256 の指摘は妥当かもしれない。

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

259デフォルトの名無しさん2021/05/21(金) 17:24:43.18ID:qriMwFf7
なるほど。
質問者は、だから>>227でも快い返事をしてくれなかったのか。
彼は例えば、以下の様に書いていたようだね:
(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での簡単な書き方では
標準。しかし、わずかに均等確率からはズれる。

260デフォルトの名無しさん2021/05/21(金) 18:35:20.74ID:ojw3YA/u
>>255
>>226を見れば乱数になってないことは一目でわかると思うのだけど

>>255の時点で毎回srandを呼んでるのかとも思ったけど、
それにしても値が綺麗すぎる。

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

262デフォルトの名無しさん2021/05/21(金) 20:07:22.28ID:ojw3YA/u
RAND_MAX + 1 でオーバーフローするとか

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

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

265デフォルトの名無しさん2021/05/21(金) 20:30:15.34ID:ojw3YA/u
>>264
なるけど

書かなくても動作が同じであれば書かない主義?
カッコとかコメントとか
1.0 も 1. で良いんだよ

まあそれ以前に (3) はカッコの対応がおかしいな

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

267◆QZaw55cn4c 2021/05/21(金) 20:47:24.81ID:XRGlJQOp
>>256-257
なるほど、従って >>226 に対する適切なアドバイスは次のとおりだと私は提案します

>>226
MT = メルセンヌ・ツイスタを使いなさい
srand() とか rand() は忘れなさい、これらは化石時代の乱数生成法だから、今となっては srand() とか rand() をあえて使う合理的理由は存在しません
MT の導入方法や使い方は、次の私のソースを参考にしてください

https://ideone.com/M2SRcE
http://2chb.net/r/tech/1434079972/60

268デフォルトの名無しさん2021/05/21(金) 21:29:08.32ID:ojw3YA/u
どう見ても乱数生成法の質の問題じゃない
使い方が間違ってる

乱数の質を求めるならハードウェアの乱数生成命令を使うのが一番だが
>>226はそういうレベルじゃない

269デフォルトの名無しさん2021/05/21(金) 21:33:53.10ID:ojw3YA/u
Visual Studioで以下をやったら>>226みたいな値になった
3秒ごとにsrand/rand をコールしてるんでしょう

for (int i = 0; i < 100; i++) {
srand(i*3);
printf("%d\n", rand() % 100);
}

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

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

272デフォルトの名無しさん2021/05/22(土) 02:04:35.75ID:MF6mf+kw
>>269
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔で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デフォルトの名無しさん2021/06/02(水) 11:54:46.08ID:QfG+Xq1u
書籍の意味が分からないので教えてほしいのですが
それ以外のって部分から何を言ってるのか全く分かりません

”signed char a;である時は、aには−128〜127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。
最大値より大きい値になった時をオーバーフロー…略”

274デフォルトの名無しさん2021/06/02(水) 12:23:21.09ID:A2GTbdiP
何を教えてほしいのかわからない。

275デフォルトの名無しさん2021/06/02(水) 12:37:39.80ID:QfG+Xq1u
>>274
ロベールの107ページの

”signed char a;である時は、aには−128〜127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。”

↑この文が意味不明なので簡単に教えてほしいです
”signed char a;である時は、aには−128〜127の数値しか入れられません” ここまではなんとなく理解できたのですが…

276蟻人間 ◆T6xkBnTXz7B0 2021/06/02(水) 12:45:51.56ID:1WJ2HfQ7
>>275
そもそもビットとかバイトとかわかるの?
わからないなら、基本情報から勉強しないといけない。

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

278蟻人間 ◆T6xkBnTXz7B0 2021/06/02(水) 13:18:03.17ID:1WJ2HfQ7
>>277
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の補数表現になる。

279蟻人間 ◆T6xkBnTXz7B0 2021/06/02(水) 13:32:39.22ID:1WJ2HfQ7
2の補数表現というのがくせ者だが、まあ、Wikipediaの説明を見てもらいたい。

https://ja.m.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0

符号付き8ビットの場合はx+y==2**8となるyがxの2の補数となる。補数を使えば足し算で引き算を表せる。

まあ、例えば10進数4桁1234の10の補数表現は8766となる。1234+8766==10000となるが有効4桁からオーバーフロー(桁あふれ)してゼロになる。8767の場合は1234+8767==10001、
オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。

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

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

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

283蟻人間 ◆T6xkBnTXz7B0 2021/06/02(水) 16:54:31.73ID:1WJ2HfQ7
符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。

規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。

284はちみつ餃子 ◆8X2XSCHEME 2021/06/02(水) 17:04:16.45ID:Bcy6nIKX
一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、
(C++20 からは二の補数であることが保証されるようになった)
1バイトが8ビットであることも保証してない。
signed char に型変換したときに上位ビットを切り捨てることも保証されない。
(変換後の型が unsigned のときには実質的に保証される。)

言語仕様として保証しないからといって間違っているというわけではなくて、
一般的なコンピュータのアーキテクチャではおおよそそうなってるのが普通というのも事実。

C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢
をとれるように言語仕様の側では意図的に決めてない部分がある。
「C++ の説明」として見たら >>275 で引用されている説明はちょっと微妙かもしれん。
あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。

285デフォルトの名無しさん2021/06/02(水) 23:13:21.37ID:ZuDsQZsq
float/doubleは

286デフォルトの名無しさん2021/06/03(木) 02:59:14.77ID:Ers5yK+g
char は環境依存なので使わないようにする。
unsigned・signed のどちらなのか、分からないため

unsigned char は、0〜256
signed char は、-128〜127

0〜127、7ビットの範囲では、この2つは共通している

signed charは、先頭ビットが1なら、負数となる。
2の補数を調べて

1111_1111・0xFF なら、256か、-1

2872862021/06/03(木) 03:03:09.44ID:Ers5yK+g
>>286
修正

256 ではなく、255 です

unsigned char は、0〜255

1111_1111・0xFF なら、255か、-1

だから、環境依存のchar 型を使っていると、
エラーに、-1を使っていたが、他の環境では255と表示されたりする

288デフォルトの名無しさん2021/06/03(木) 10:13:20.76ID:oKNqyVQK
むしろ int を期待してる引数に char 渡す時が危険

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

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

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

292◆QZaw55cn4c 2021/06/06(日) 01:44:38.27ID:xlnMgrm3
>>290
set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。
だから set<>::iterator p; …@、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。
例えば@の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。

もともと const 属性はポインタにつけて、const 属性のついたポインタに -> 演算子を使って出来たメンバ変数の値を変更しないようにコンパイル時に厳密にチェックする縛りです
c++ における参照は「機械的にポインタを使った書き方に書き直すこと」が可能(…A※)ですから、const なイテレータ(≒ポインタ)から生成した参照は const な参照にならざるを得ないのです
※Aは私の持論で、今回のお題でも参照をポインタに全部書き換えてやろうと試行錯誤していましたが、さすがに iostream や set で先に参照として宣言されているものを後からポインタにするのは不可能でした
頑張ってみたけれども、かえって意味不明な https://ideone.com/Yc0YvT ぐらいにしかならなかった、持論は修正しなくてはいけないなあ…

set は重複要素を許さない二分木構造です。二分木構造 set に要素を挿入するときに、要素の大小関係にしたがって二分木の形をくみ上げていきます。
だからすでに二分木に組み込まれてしまった要素が、後からほいほいと要素の内容を変えられてしまっては二分木構造に矛盾をきたし、役に立たなくなってしまう…
だから set にすでに組み込まれている要素をイテレータで走査するときは、そのイテレータ≒ポインタは、メンバの書き換えが不可能なイテレータとするしかないか、と私は考えます

提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。
https://ideone.com/Zr1qIH
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 のコピー・オブジェクトのコピー」にするのがいいでしょう
上記のお題をこの方針で書くとこうなります。
https://ideone.com/G42gUs

いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください

293◆QZaw55cn4c 2021/06/06(日) 01:58:54.60ID:xlnMgrm3
>>290
>>292

http://2chb.net/r/tech/1594615908/593
593 名前:◆QZaw55cn4c [] 投稿日:2021/03/14(日) 20:13:24.03 ID:uaeFGveg [3/6]
>>590
>C++は未だ*や&、&&、で頭の中がグルグル回ってしまう
これらの「記号」は習得に順序があります。
まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。
次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう
参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います

&& は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします

294◆QZaw55cn4c 2021/06/06(日) 02:07:24.75ID:xlnMgrm3
>>291
operator<<() のストリームじゃないほうの引数は、const 参照ではなくてもいいと思います
今回のは const 参照が要求されたのは、 set のイテレータだから
https://ideone.com/j6CV0s

295◆QZaw55cn4c 2021/06/06(日) 02:32:48.87ID:xlnMgrm3
>>292
ソースを貼り付けた一行目がミスっていましたね、修正します。

>しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。
>ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。
>そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう
>上記のお題をこの方針で書くとこうなります。

https://ideone.com/Ivx0JY

296デフォルトの名無しさん2021/06/06(日) 02:41:34.70ID:Lz5dZs8J
ああ、operator <<のconstも最初付いてなかったのか
それならsetの仕様変更のせいだね

というか昔のままの非constの方が良かったんだけどなぁ
比較演算子自分で書いてるような構造体だと順序変わらない場合もあるんだし・・正直押し付けがましい

297◆QZaw55cn4c 2021/06/06(日) 03:22:16.34ID:xlnMgrm3
>>296
自分で一から書く分には const に一貫性を持たせて、結果、const が有用に働くように書いていけるかもしれない、とか思うのですが、
他の人の分を取り込むときは、最悪 const_cast を >>290 の言うように「適当にconst_cast をつけていたらコンパイルできるようになりました」とか私も言っているわけでして、私は >>290 を笑うことができません……

298デフォルトの名無しさん2021/06/06(日) 08:29:50.46ID:KyPgEn9X
一から書いている私ですが、
全てのフォルダ・ファイル・プログラムに一貫して
*と何か名前を付けてプログラミングをしています。

299デフォルトの名無しさん2021/06/06(日) 08:34:21.45ID:8VTCuGWY
QZ・・・・
C++をちゃんと理解できてないのに無理すんなw

300◆QZaw55cn4c 2021/06/06(日) 09:27:07.17ID:xlnMgrm3
>>299
>C++をちゃんと理解できてないのに無理すんなw

うん。すっごく認めます!

でもちゃんと理解できていないからこそ、アウトプットもきちんと書くようにして定着させたい、というのもあるんですよ
「教えることは教わること」

>>290 に対する回答としての >>292, >>294 に間違いはないですよね?

301デフォルトの名無しさん2021/06/06(日) 09:44:11.48ID:WkbXnMOk
意味分からん理屈だな
ずっと前からC++分からないって言ってるよね?
もしかして理解できる頭を持ってないのかな?

302◆QZaw55cn4c 2021/06/06(日) 13:37:50.42ID:xlnMgrm3
>>301
自己申告なんて当てにしてはいけないのでは?

303デフォルトの名無しさん2021/06/06(日) 15:27:30.95ID:fMmzH2Jl
文面から必死な感じがヒシヒシと伝わってくるのに
皮肉も理解できないとはさすが厚顔無恥の代表格
誰も認めてくれないから自画自賛するしかないんですね

304◆QZaw55cn4c 2021/06/06(日) 16:22:05.09ID:xlnMgrm3
>>303
え?必死?思いがけない反応ですね
まあ >>290 の方が提示したソースはハーバードシルトにしては冗長だと思って無駄丁寧っぽく説明したほうがいいかと >>292 をワサワサ書きましたが、それが必死だとは…
よく分かっている方 >>291 に対しては簡潔に私の意見 >>294 を送ってもう十分、仕様変更があったという情報 >>296 をいただいて感謝、というところでしょうか

3052902021/06/06(日) 22:29:30.82ID:DvMt5hdj
>>291
>>292
どうもありがとうございます

constメンバ関数の理解が不十分だったようです
constメンバ関数はメンバ変数を変更しないという理解だけで、
constオブジェクトはconstメンバ関数しか呼べないことへの
理解が足りなかっため私自身混乱していました

ご説明いただいた内容を足掛かりに理解を深めたいと思います

30612021/06/07(月) 07:01:58.64ID:pWKPTo4/
まぁ、いいじゃねぇか、プログラミングなんて何にも知らないってのスレだし。

307デフォルトの名無しさん2021/06/07(月) 07:48:28.30ID:c29T7zKX
const char* const str[] は文字列アドレスを格納するポインタの配列って意味であってますか?
const char* strは文字列を格納するポインタ?
char str[] は文字配列?

一気に出てきてよくわからなくなって来たので間違えてたら教えて欲しいです。

308デフォルトの名無しさん2021/06/07(月) 08:39:52.02ID:xFpLHEPr
>>307
だいたいあってる

309デフォルトの名無しさん2021/06/07(月) 11:12:06.49ID:BLDePS2Q
ちゃんとメモリ確保してから使えよ

310デフォルトの名無しさん2021/06/07(月) 22:09:28.76ID:JY7FyEcf
>>308
ありがとうございます。

311デフォルトの名無しさん2021/06/08(火) 23:28:22.97ID:kZSYpF+Y
https://ideone.com/2fyV5M

103 と115で確保された動的配列のアドレスは別物なんでしょうか?
コピーコンストラクタの動きがよくわからないです

312デフォルトの名無しさん2021/06/09(水) 02:24:41.44ID:ZtayyY2i
103のarrayはコピーされたものだから別物だよ
てか初っ端から手直しが必要なソースを貼るのはやめろ

313デフォルトの名無しさん2021/06/09(水) 02:39:16.49ID:Ih94CWHU
スレの主旨的に初心者が初歩的な質問をするのは別に構わんとは思うんだが、
入門書にでも書いてあるようなことはよく読んで勉強したほうがいいと思うぞ。
素人が1レスで答えるよりはちゃんと体系だった解説のほうがわかりやすいよ、常識的に考えて。

314デフォルトの名無しさん2021/06/09(水) 04:24:03.76ID:BGdtXEJj
>>312
すいません、ヘッダーとかcpp分けてるのどうアップロードすればいいのか分からなかったです

後65行目にcopy(other.m_array, other.m_array + m_size, m_array);とあるのですが何をしてるのか分かりません
本には”第1引数以上第2引数未満のアドレスにあるデータを第3引数の指すアドレス以降にコピーする関数で…とあるのですが
具体的に何をしてる関数なのでしょうか?第2引数の足し算も何なのかよく分かりません。

315デフォルトの名無しさん2021/06/09(水) 04:43:32.09ID:ZtayyY2i
https://ideone.com/EScxwq
こうしたらそのままコンパイル通るやろ
自分のヘッダincludeしてるとこにヘッダの内容貼り付けるだけ

https://cpprefjp.github.io/reference/algorithm/copy.html
memcpyと似たようなもん(コピーの仕方は違うけど
other.m_arrayの指すアドレスから+m_size分のアドレスまで(未満)をm_arrayの指すアドレスから同じく+m_size未満までコピーしとるだけ
これで分からんならポインタの理解が出来てない
上記のとこだとイテレータとか出てるけどこの場合ポインタなので全部ポインタに読み替えていい

316デフォルトの名無しさん2021/06/09(水) 04:53:28.23ID:ZtayyY2i
ちょっと誤解招きそうなので補足
m_sizeは個数なのでアドレス値ではないがintのm_size個分アドレスが加算される
このへんは>>313の言う通り入門書嫁

317デフォルトの名無しさん2021/06/09(水) 14:16:25.82ID:3Qpbsqp/
cpp で socket を読み書きする stream 系の class ってありますか?
boost にはあったと思いますが
標準のはあるんですか?無いですか?

318はちみつ餃子 ◆8X2XSCHEME 2021/06/09(水) 16:06:33.34ID:Ih94CWHU
>>317
標準には無い。
が、ソケットに stream のインターフェイスをかぶせることはそれほど難しくはない。

319デフォルトの名無しさん2021/06/09(水) 22:30:15.61ID:BwbEIJxn
>>315
1引数から2引数で足したアドレスまでを第三引数にコピーしてるのですね
やっと分かりました。ありがとうございます。
頭硬い人はロベール向いてないのかな…

320デフォルトの名無しさん2021/06/09(水) 23:57:13.88ID:ZtayyY2i
それは良かった
まぁ最初は理解に時間かかるもんだ

321デフォルトの名無しさん2021/06/10(木) 10:45:51.80ID:ZbfFyHii
>>318
thx

cpp の std にある関数で glibc の様な getpass ってありますか?
標準のは無いですか?

322はちみつ餃子 ◆8X2XSCHEME 2021/06/10(木) 14:24:18.43ID:MOYAWABe
>>321
無いよ。

323デフォルトの名無しさん2021/06/11(金) 14:28:13.59ID:tB3/M6ll
FILE *fp = fopen() で取得した fp を使って
stringstream としてアクセスすることは出来ますか?

324はちみつ餃子 ◆8X2XSCHEME 2021/06/11(金) 17:27:01.32ID:DsaVPusD
>>323
直接的に一発で FILE* に stream をかぶせる手軽な方法はないと思うけど、
std::basic_streambuf を継承して setbuf, overflow, sync などをオーバーライドしたクラスを作ればストリームバッファになる。
(普通は std::basic_filebuf も内部的にはそう実装されているはず。)
それをストリームに結び付ければストリームに出来ることは何でもできるよ。

仕様を調べるのがすごくしんどいだろうけど、
実装は (細かいエラーチェックとかを抜きにすれば) 百行も要らないくらいの簡単なものでいけるんじゃないかな。

325デフォルトの名無しさん2021/06/16(水) 00:59:39.17ID:QFUk0bjY
>>323
fstreamを使えば?
#include <fstream>
#include <sstream>

std::ifstream fs("hoge.txt");
std::stringstream ss;
ss << fs.rdbuf();
fs.close();

それともfstream使えない特殊な環境?

326デフォルトの名無しさん2021/06/16(水) 16:36:23.72ID:uJQ6HHCX
FILE *fp = fopen(...);
std::ifstream fs(fp);
出来たらいいな

327デフォルトの名無しさん2021/06/17(木) 21:31:03.90ID:OB6uOiq6
関数へ渡す引数の型を限定したいときどう書くのが一般的ですか?
具体的に言うと符号なしのintだけ受けつけたいんですけど

328はちみつ餃子 ◆8X2XSCHEME 2021/06/17(木) 23:54:09.39ID:Gi/wqrqm
>>327
暗黙の型変換を許さないということかな?
それならテンプレートにした上で型に制約を付ければいい。
ここでは C++11 でも通るように書いてみたけど C++20 以降なら
コンセプトが使えるのでもう少し簡単に書ける。

#include <type_traits>

template<class T>
typename std::enable_if<std::is_same<T, unsigned int>::value>::type foo(T) {
}

int main(void) {
int a = 1;
unsigned int b = 2;
foo(a); // これはエラーになる
foo(b); // これは通る
}

329デフォルトの名無しさん2021/06/18(金) 08:42:03.67ID:kejK9s3z
なんで戻り値voidに限定してんだよボケ餃子

330デフォルトの名無しさん2021/06/18(金) 11:49:14.92ID:AVf6Ht59
確かにそれで可能だけど、回答が超初心者スレのレベルを逸脱していると思うのですが

331はちみつ餃子 ◆8X2XSCHEME 2021/06/18(金) 18:30:00.74ID:JA4mPV9U
>>329
単なるサンプルだからだよ。

>>330
超初心者が相談するという主旨のスレではあるけど、
超初心者には理解できないという結果になることもあるだろうし、
可能であれば相談した結果として初心者から脱したらそれに越したことは無いでしょ。

これで相談がクローズってわけでもないから
もっと深く知りたいってのならわからないところを続けて質問してもらってもいいわけで。

もっと簡単な方法があるならそれを提示するんだけども、なくなくなくない?

332デフォルトの名無しさん2021/06/18(金) 19:23:19.39ID:kejK9s3z
>>331
アホか
普通のenable_ifの使い方と全く違うお前だけのオナニーコード押し付けて何がサンプルだ
何不必要な制限勝手につけてドヤってんだボケ

333はちみつ餃子 ◆8X2XSCHEME 2021/06/18(金) 19:32:07.35ID:JA4mPV9U
>>332
返却値 (または enabler) で制限するのは普通だろ。
むしろ他にどう使えるんだ?

334デフォルトの名無しさん2021/06/18(金) 19:35:45.29ID:kejK9s3z
>>333
マジで言ってんのか?

#include <type_traits>
template <class T, typename std::enable_if<std::is_same<T, unsigned int>::value>::type* = nullptr>
void foo(T)
{
}

int main()
{
// foo((int)1);
  foo((unsigned int)1);
}

enablerってこれのことか知らんが、お前のコードだと戻り値voidにしか出来んだろってこと

335デフォルトの名無しさん2021/06/18(金) 19:42:19.79ID:kejK9s3z
>>327
ちなコンセプト版(C++20対応コンパイラが必要)

#include <type_traits>

template <class T>
concept UnsignedInt = std::is_same_v<T, unsigned int>;

template <UnsignedInt T>
void foo(T value)
{
}

int main()
{
// foo((int)1);
  foo((unsigned int)1);
}
(インデントは全角なので注意)
まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか

336デフォルトの名無しさん2021/06/18(金) 19:43:08.40ID:AVf6Ht59
>>331
いや、お前の言いたいことは分かるよ
ただテンプレートメタプロコードを超初心者にいきなり例示して、「わからないところを続けて質問」して回答を繰り返して、結果的に理解に至るのは何ヵ月後になるんですかと
テンプレートに関する高度な質問が飛び交う中、ここは超初心者スレとして機能するんですかと

この場合>>327が求めているのはドリルじゃなくて穴だと思うよ俺は
どういう背景があってunsigned int以外を受け付けたくないか、を聞くべきなのでは?

337デフォルトの名無しさん2021/06/18(金) 19:57:29.32ID:kejK9s3z
確かにそうだね
というか自分もテンプレート以外思いつかんかった・・

>>333
なんか変な癖あるから標準的な使い方がすっぽ抜けてたのかね
ボロカス言って悪かった

338デフォルトの名無しさん2021/06/18(金) 20:01:53.90ID:zIhiG+wy
あんまり詳しくない俺にはこういうのしか思いつかん。
__my_func() は直接呼ばないお約束にしておいて、static_assert で。
template のところは、書き換えは雰囲気でできると思うけど・・・

#include <type_traits>
#include <iostream>

unsigned int __my_func(unsigned int a) { return a * 2; }

template <class T> unsigned int my_func (T a) {
static_assert(std::is_same<T, unsigned int>::value == true, "is not uint.");
return __my_func(a);
}

int main() {
int a = 2;
unsigned int b = 2;

//std::cout << my_func(1) << std::endl; // assert
//std::cout << my_func(a) << std::endl; // assert
std::cout << my_func(1U) << std::endl;
std::cout << my_func(b) << std::endl;
}

339はちみつ餃子 ◆8X2XSCHEME 2021/06/18(金) 20:30:53.23ID:JA4mPV9U
>>334
> お前のコードだと戻り値voidにしか出来んだろ

なんか変なこといってると思ったらそこがすれ違いか。
std::enable_if のテンプレート引数の二個目を省略しなければ何にでも出来るよ。
(std::enable_if の type は void に固定されているわけではない。)
クラスやコンストラクタは返却値がないから enabler を使うんであって、
普通の関数のときは返却値のほうで制御するのが普通だと思うぞ。

340はちみつ餃子 ◆8X2XSCHEME 2021/06/18(金) 20:33:26.89ID:JA4mPV9U
>>336
まあそうなったら他に誘導してもいいし、資料を提示するだけで十分だと思った。
ただ背景をもうちょっと引き出すべきというのも確かに必要なことではあったな。

341デフォルトの名無しさん2021/06/18(金) 20:39:10.69ID:kejK9s3z
そうなんか、そういえばいつも自作alias使ってたから気付かんかったわ

>普通の関数のときは返却値のほうで制御するのが普通
別に戻り値でも引数でもいいが、クッソ読みづらいと思うけどな
あとそれならこういうスレで第2引数省略すんなよ、初心者惑わしたいのか?

34212021/06/19(土) 15:34:05.42ID:kvHrZ2tI
ここは中級者が、お互いを煽り合うスレでは無い、ということを理解して欲しい。

343デフォルトの名無しさん2021/06/19(土) 16:53:11.57ID:zDrgWeBe
引数同じで戻り値だけ違う関数を造って使い訳たい

344デフォルトの名無しさん2021/06/19(土) 17:01:53.54ID:xVp2TfT/
>>342
俺ははちみつが書くより先に同じこと(enable_if)思ってたけど、このスレには不適切だと思って書くのやめてたんだけどな
あんな不適切で不親切な回答(テンプレートとSFINAEとか、はちみつも使いこなせてないようなものを使う上に戻り値の変更方法も、自身が言ってるコンセプト版も書かない)に怒っちゃいかんのか

345はちみつ餃子 ◆8X2XSCHEME 2021/06/19(土) 17:30:35.18ID:/f53/cxR
>>344
そこらへんが少しばかり詳細なら初心者に理解できる内容になるという主張?
少々の書き方の工夫で初心者がわかるように解説できるわけないだろ。
関連知識も含めればちょっとした本一冊分くらいにはなる内容なんだから。

「まずはテンプレートの知識が必要ですね」ということが初心者に対する解で、
そこに至る前にごちゃごちゃしたことを詰め込むのは不親切だと思うわ。

346デフォルトの名無しさん2021/06/19(土) 17:34:51.32ID:xVp2TfT/
>>343
戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも
template <typename T>
T hoge();

template <>
int hoge<int>() {}

template <>
float hoge<float>() {}

hoge<int>();
hoge<float>();

もしくは
int hoge(int) {}
float hoge(float) {}

?hoge(int());
hoge(float());

347デフォルトの名無しさん2021/06/19(土) 18:00:39.76ID:kvHrZ2tI
1 + 1 = 1

348デフォルトの名無しさん2021/08/24(火) 01:28:35.73ID:WM1jAzNs
https://pastebin.pl/view/e395f5ca

operator関数の動きがよくわからないんですが
tmp.x = x + p.x;
これの p.xと xとtempはどのオブジェクトのことを指してるんでしょうか?

349はちみつ餃子 ◆8X2XSCHEME 2021/08/24(火) 01:50:15.06ID:MkJE9y3A
>>348
operator+ は演算子 + の実体として機能する。
故に p1+p2 は p1.operator+(p2) と書いた場合と完全に同じ。

tmp はもちろんこの関数内で宣言した tmp 変数だし、
p は渡された引数 (この場合は p2) のコピーなので p.x には 6 が入ってるね。

350デフォルトの名無しさん2021/08/24(火) 02:43:37.56ID:WM1jAzNs
>>349
ありがとうございます。引数がどれに対応してるかわかりました。
p1.operator+(p2) これは何でしょう?

351デフォルトの名無しさん2021/08/24(火) 03:37:20.26ID:gGQMgsWd
掛け算の*と、
色々を示す*が
同じ*なんで困っていますが、どうしたらいいんでしょうか?

352デフォルトの名無しさん2021/08/24(火) 03:55:09.38ID:jikR3Y9f
色々ってワイルドカードのこと?
C++においては*は乗算かポインタ関係だけだよ

>>350
p1のメンバ関数として普通にoperator +を呼んでるだけ

353デフォルトの名無しさん2021/08/24(火) 04:29:07.93ID:gGQMgsWd
ありがとうございます。
c++ のワイルドカード記号ってなんでしょうか?

354デフォルトの名無しさん2021/08/24(火) 04:33:24.90ID:jikR3Y9f
言語そのものには無いよー
エディタやIDEで検索するのには使えることもあるが

355デフォルトの名無しさん2021/08/24(火) 04:45:36.01ID:gGQMgsWd
教えてもらって、勉強になりました。
ありがとうございました。

356デフォルトの名無しさん2021/08/24(火) 07:22:03.54ID:WM1jAzNs
https://pastebin.pl/view/31e451ad

クラスの型変換と型変換用のコンストラクタの意味が全く分からないのですが
これをすると何が得なのでしょうか?10行目は普通のコンストラクタに見えますがなぜ変換用?
入門書に載ってるコードなのですがエラーで動作もせず何がなんだか分かりません…

357デフォルトの名無しさん2021/08/24(火) 15:23:13.01ID:jcrsR8Np
2つ目のprivateはpublicの間違いじゃね?
あと変換は、単に引数一つだけを受け取るコンストラクタは
自動的に?暗黙のキャストにも使われる、というだけ(それを禁止する方法もあるが

358デフォルトの名無しさん2021/08/25(水) 07:15:15.42ID:dwOa++JV
>>357
おかげさまで動きました。ありがとうございます。
でもいまいち型変換の意味が分からないのですが
operator 型名()return 変数を定義するとどの変数にも代入出来るようになるってことですか?

359デフォルトの名無しさん2021/08/25(水) 15:58:08.24ID:3/bOIe3o
C++ キャスト でぐぐるといいよ
(キャストはCにもあるけど)

360はちみつ餃子 ◆8X2XSCHEME 2021/08/25(水) 22:29:05.16ID:/Q8zinJC
>>358
型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし
て書いてもかまわないんだが、変換関数 (conversion function) または変換
コンストラクタ (converting constructor) が定義されていると暗黙の型変換
が適用される文脈では勝手に適用して変換してくれるので便利。

例えば以下のように foo 型のオブジェクトを受けとる文脈で bar 型のオブジェ
クトを渡しても通るのは変換が適用されるから。

struct foo {};

struct bar {
operator foo() {
return foo();
}
};

void func(foo) {}

int main(void) {
foo x = bar();
func(bar());
}

361デフォルトの名無しさん2021/08/26(木) 01:12:00.54ID:BlNdGFU0
>>360
ようやくイメージできてきました。ありがとうございます!

362デフォルトの名無しさん2021/08/26(木) 06:25:31.31ID:C2TXXzWD
>>360

そんな難しくせずに、

{ change A to B }

でいいんじゃないの?

363デフォルトの名無しさん2021/08/26(木) 09:12:40.22ID:QSgOZ0Rh
なんのこっちゃ

364デフォルトの名無しさん2021/08/27(金) 08:15:52.67ID:ue9a70Za
コマンドライン引数の意味が全く分からないのですが
Visualstudioを使っているからでしょうか?
それとも、コマンドプロンプトの使い方を理解できないでしょうか?

https://programming.pc-note.net/c/commandline.html
ここも参照にしたのですが何が得で何ができてるのかよく分かりません。
コマンドラインってVSでデバッグ無しで実行をした時に出る黒い画面ではないですよね?

質問ばかりですいませんが本当に何も分からないのでお願いします。

365デフォルトの名無しさん2021/08/27(金) 11:14:47.31ID:xylLBHc1
>>364
メモ帳でファイルをドラッグアンドドロップで開く例が紹介されているが
これはWindowsのShellであるExplorerがexefileに対して登録されているドラッグアンドドロップハンドラーを処理してドロップしたファイルのフルパスを文字列として起動するプロセス環境のコマンドラインパラメータとして渡している
黒い画面(コマンドプロンプト)にもExplorerとは違うがプロセスの起動とパラメータを渡す機能が実装されている
起動するexefileに続けてスペースを開けたあと記入した文字列がそのままパラメータとして渡される
ファイル名以外にも自由に渡せるためプログラムの動作を指定したり変更する目的で使用される
あなたが作成するプログラムでシェルから渡されたコマンドラインパラメータを確認する方法はそのページにもある通りだ
コマンドラインパラメータを活用してバラ色の人生を満喫してくれ

366デフォルトの名無しさん2021/08/27(金) 14:23:11.73ID:8dQk5Ix1
getopt

367デフォルトの名無しさん2021/08/27(金) 23:33:15.78ID:cMIVTei2
例えば、デスクトップにショートカットを作る。
コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する

リンク先
C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb"

注意。書き込めないので、間に@を入れました

作業フォルダ
C:\Users\Owner\Desktop

a.rb 内には、puts ARGV
(ARGV は配列で、そこにコマンドライン引数が渡ってくる)

と書いておいて、ショートカットに、フォルダx・ファイルb.txt をdrag&drop すると、
コマンドプロンプトが起動して、以下のように表示される

C:\Users\Owner\Desktop\x
C:\Users\Owner\Desktop\b.txt

368デフォルトの名無しさん2021/10/06(水) 22:36:41.57ID:OG+j1FAK
const char* const str[]={"aaa","bbb","ccc"}

constの効果を教えてほしいです
後ろのstrの前のconstは付けると
const str[0]="dddd"って出来なくなるのは分かったのですが
先頭のconstが分かりません

369デフォルトの名無しさん2021/10/06(水) 22:51:34.11ID:ItOX1MR6
str[0][0]='d';

370デフォルトの名無しさん2021/10/06(水) 22:53:20.88ID:OG+j1FAK
>>369
なるほど。
ありがとうございます。

371デフォルトの名無しさん2021/10/09(土) 07:12:25.69ID:JFpyaThm
ロベールC++入門の代入演算子についてなのですが
コピーコンストラクタのときは動的配列をdelete[]しなかったのに
なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい
本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク
と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます

100行目です
https://ideone.com/xL8UOn

372デフォルトの名無しさん2021/10/09(土) 10:44:46.48ID:tDH5FAwQ
newしたメモリが不要になったらdeleteする
これだけ

コピーコンストラクタでのdelete、
いつnewしたデータに対して?

373デフォルトの名無しさん2021/10/09(土) 17:51:02.84ID:QAOoCtV/
>>372
すいません、わからないです。
コピーコンストラクタはnewでアドレスを確保しないものなのですか?

374はちみつ餃子 ◆8X2XSCHEME 2021/10/09(土) 18:03:01.95ID:Z56nk6n1
>>373
ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、
それがわからんのならたぶんそれ以前の章を理解でてきないと思う。

375デフォルトの名無しさん2021/10/09(土) 18:04:17.21ID:jELfb/xT
>>371
代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作
コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作

代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域
コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い

376デフォルトの名無しさん2021/10/09(土) 20:35:07.35ID:QAOoCtV/
>>375
初期化と代入の知識が曖昧でした
分かった気がします。ありがとうございます。

377デフォルトの名無しさん2021/10/10(日) 20:55:50.73ID:6QW0WSDe
AtCoderの初心者向けのC++の説明のページを読んでいます。

vector<int> a(10);

aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。
これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?

378ハノン ◆QZaw55cn4c 2021/10/10(日) 21:05:41.56ID:KKHdhYPj
>>377
>a[i]よりもa.at(i)と書くほうが良い
そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥

379デフォルトの名無しさん2021/10/10(日) 21:07:18.12ID:6QW0WSDe
>>378

vector<int> a(10);
b = a.at(10);

などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。

380デフォルトの名無しさん2021/10/10(日) 21:08:35.36ID:6QW0WSDe
初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?

381デフォルトの名無しさん2021/10/10(日) 21:31:47.25ID:zWyM5YPA
範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?

382デフォルトの名無しさん2021/10/10(日) 22:58:42.68ID:gnqjARRQ
気分によるけどatが好きです

383デフォルトの名無しさん2021/10/10(日) 23:07:44.84ID:gmqGyDAJ
vector配列を指すポインタを使ってる時に[i]で指定する書き方がよく分からないのでat(i)使ってる

384デフォルトの名無しさん2021/10/10(日) 23:14:51.45ID:U88jNIFg
(*ポインタ)[i]

385はちみつ餃子 ◆8X2XSCHEME 2021/10/10(日) 23:15:56.24ID:cCUvKLuJ
>>377
これのことだね。
https://atcoder.jp/contests/apg4b/tasks/APG4b_n

例外処理やアサートの説明を省略しているせいでどう使い分けるべきものなのかがよくわからん説明になってる。
C++ はかなり複雑で、 AtCoder のサイトにある雑な説明だけでは細かいところまで理解はできないよ。

C++ の言語仕様の詳細を理解するのに手間取って競技を始められないくらいならそういう風に割り切れという意味で
AtCoder としては at を推してるんであって、言語仕様やプログラマの習慣としてどちらかを推奨してたりはしない。
それぞれに用途がある。

386はちみつ餃子 ◆8X2XSCHEME 2021/10/11(月) 00:50:58.08ID:kxIK5/L+
余談だが C++ の言語仕様としては推奨というのはないが非推奨というのはあって
(結果的に同等のよりよい機能を推奨するのと同じことになっている場合はある)
将来の言語仕様の更新で廃止するつもりがあるということを意味する。

387デフォルトの名無しさん2021/10/11(月) 02:00:14.70ID:xizp5ONl
ポインタ->operator[](i)

388デフォルトの名無しさん2021/10/13(水) 01:04:04.91ID:gvBCET4D
Notepad++でcppファイルを選んで実行をすると
Visualstudioが立ち上がるのですが
どうすればNotepadで実行出来るのでしょうか?

389ハノン ◆QZaw55cn4c 2021/10/13(水) 02:24:33.63ID:YMzdF2UZ
>>388
コンパネ→既定のプログラム→ファイルの関連付け

設定→アプリ→既定のアプリ→ファイルの種類ごとに
あたりでなんとかならないでしょうか?

390デフォルトの名無しさん2021/10/13(水) 03:03:01.45ID:gvBCET4D
>>389
回答ありがとうございます。
ファイルの関連付けをメモ帳とVisualstudioしか選べなかったです。(後Microsoftストア)
Notepad++は初期設定結構大変な感じなんでしょうか?

https://imgur.com/a/V3jOiV0

391ハノン ◆QZaw55cn4c 2021/10/13(水) 19:41:40.64ID:YMzdF2UZ
>>390
たしかに「設定→アプリ→既定のアプリ→ファイルの種類ごとに」
はうまくいかないですね
では、
開きたい拡張子を持ったファイルを右クリック→プログラムから開く→別のプログラムを開く→その他のアプリ→このPCで別のアプリを探す
ではどうですか?

私は win7 メインで、うまいアドバイスができなくてすみません‥‥

392デフォルトの名無しさん2021/10/19(火) 08:20:19.87ID:7/3R28mC
C++でアプリを作る場合って、QTってやつかMFCって奴を勉強すればいいのでしょうか?
C++でWIN32APIを学ぶっていうのはないですか?

393デフォルトの名無しさん2021/10/19(火) 10:04:52.66ID:emsejTNf
ないです

394デフォルトの名無しさん2021/10/19(火) 10:18:17.44ID:vPA5f3eX
あります

395デフォルトの名無しさん2021/10/19(火) 11:51:03.31ID:90qj1F6l
メッセージループによるイベントドリブン型アプリケーション
「ウインドウ」と「メッセージ」というウインドウズの基本概念ぐらいは理解してもいい

396デフォルトの名無しさん2021/10/19(火) 19:00:27.41ID:C9DkQou5
tcl/tk
wxWidgets
DXLib
Unity

397ハノン ◆QZaw55cn4c 2021/10/19(火) 20:20:27.92ID:KyySFZDA
>>392
「C++でwin32api」ですか…
そういうのは c で win32api を理解した後、各自が独力で工夫して c++ と win32api とを辻褄あわせするものだと思っていましたが、それはそうと、そういう書籍は過去にありました
たしか leaf というライブラリと WOOL という lisp 処理系が掲載されていた記憶があります

398デフォルトの名無しさん2021/10/19(火) 22:23:42.02ID:P+gkhAFH
MFC は何十年も前だけど、今もあるの?

QT は、Linux で聞くけど、Windows で使うの?

399デフォルトの名無しさん2021/10/20(水) 02:20:42.50ID:+2OzLQ7p
>>398
Qt5Core.dllで検索する色々出てくるから、win/macとマルチのアプリなんかで割と使われてみたいね。
手元だとfusion360とかresolveとかで使われてるっぽい。商用ライセンスあるからかな?

400デフォルトの名無しさん2021/10/20(水) 11:06:18.19ID:OEiI06HQ
5以前は良かったんだがな

401はちみつ餃子 ◆8X2XSCHEME 2021/10/20(水) 13:35:36.40ID:dLyN/sz8
>>392
MFC は API の利用をちょっと楽にする薄いラッパーという感じだな。
API のことを忘れて MFC の使い方だけ学べばよいというようなものではない。

>>397
今は C++/WinRT の時代だぞ。

402デフォルトの名無しさん2021/10/20(水) 18:01:15.01ID:oZqSjSwG
>>397-401
WIN32やったことないんですが
C++でアプリを作るときはWin32APIは避けては通れないのですか
ありがとうございます…

403デフォルトの名無しさん2021/10/20(水) 19:03:46.64ID:CkfuGqw9
知っておいた方が良いけど
避ける方法もある

404デフォルトの名無しさん2021/10/20(水) 19:36:43.86ID:+2OzLQ7p
>>402
いや自分で書いてるQtって奴や>396なら違う世界観を満喫できると思う。
2Dゲーム系ならSDL2あたりも。他にもメンテされてるライブラリあるけどSDL2で引けば出て来ると思う。

405ハノン ◆QZaw55cn4c 2021/10/20(水) 20:15:37.71ID:I2cv7mAQ
>>401
ええ?

WinRT って .NET の世界のものかとおもっていました

406デフォルトの名無しさん2021/10/20(水) 23:17:39.77ID:vkb7a42p
>>405
C++でも出来るよう

407はちみつ餃子 ◆8X2XSCHEME 2021/10/21(木) 00:38:03.74ID:JAunV20A
>>405
WinRT は Windows のモダンな API セットで、特定の言語に結びついたものではない。

408デフォルトの名無しさん2021/11/05(金) 12:47:56.16ID:dj6lZ6W1
無名クラスのメンバ関数の実装を宣言と別にすることって可能ですか

struct {
int func_hoge(int n);
} myClass;

(実装)?

409デフォルトの名無しさん2021/11/07(日) 08:51:29.08ID:+fO8/EKc
std::vecotrのインスタンスを作ったとき、指定した要素数以上のメモリを確保しないようにはできますか??

410デフォルトの名無しさん2021/11/07(日) 11:43:59.55ID:cdTTDz5e
実装依存
普通は出来ない

411デフォルトの名無しさん2021/11/09(火) 14:46:05.51ID:t/ZCl1K7
普通でなく指定したバイト数以上のメモリを確保しようとしたら例外が上がる実装例
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T, class Alloc=allocator<T>>
class SizeLimitedAllocator {
public:
typedef T value_type;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
return allocator_traits<Alloc>::allocate(allocator_, n);
}
void deallocate(T *p, size_t n) {
allocator_traits<Alloc>::deallocate(allocator_, p, n);
}
private:
Alloc allocator_;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}

412デフォルトの名無しさん2021/11/25(木) 04:15:10.15ID:0166A/na
void *q = (void*)p;
void *r = reinterpert_cast<void *>(p);
void *s = static_cast<void *>(p);
どっちが良い?

413はちみつ餃子 ◆8X2XSCHEME 2021/11/25(木) 04:51:08.49ID:Mn8CZmYm
>>412
static_cast で可能なものなら static_cast を使うのが行儀が良い。
Cスタイルのキャスト記法は適用範囲が広すぎて意図通りではない (危険な) 変換でもコンパイルが通るかもしれんということで
複数のキャストを用意しているので意図にあてまる限りなるべく狭い効果を持つキャストを用いるべき。

414デフォルトの名無しさん2022/02/10(木) 15:34:30.67ID:Ido/99Jv
githubからcshogiというパッケージをインストールしようとしたところ
ビルド中に
src/mate.cpp:110:26: error: template parameter redefines default argument
というエラーが発生しました。
実行コマンドは
CPPFLAGS=-std=c++17 pip install git+https://github.com/TadaoYamaoka/cshogi
としているのですが、あれこれ調べてもう打つ手がなくなりそうです。なにが悪いでしょうか。
macOS12.2付属のclangでビルドしています。(他の人は使っているので、文法などは問題ないはずだと思っています。)

415デフォルトの名無しさん2022/02/10(木) 15:42:07.23ID:J5PrGMnU
そのエラーメッセージで検索すれば?

416デフォルトの名無しさん2022/02/10(木) 15:46:35.62ID:Ido/99Jv
>>415
とっくにやってますわ!と言うところでしたが、stackoverflowでぴったりなのがありました。
https://stackoverflow.com/questions/14197436/c11-template-parameter-redefines-default-argument
gccならよさそうですね。

417デフォルトの名無しさん2022/03/15(火) 20:43:42.96ID:+mlS0n0o
test

418デフォルトの名無しさん2022/03/15(火) 21:05:11.63ID:q9dCXwxq
Borland C++Builder 1が無料ダウンロードできるようですが
Borland C++ Compiler 5.5 freeとは全く別物でしょうか?

419デフォルトの名無しさん2022/03/17(木) 11:44:12.82ID:Y2OAtTnf
1は大昔のを記念に無料DL可にしたやつじゃないかな
最新のやつもCommunity Editionていう無料版があるから、開発に使うならそっち
あとBuilderはVisual Studioのような統合開発環境でコンパイラも含まれる

420デフォルトの名無しさん2022/03/18(金) 12:32:15.10ID:Fw15ZxLZ
ロベール読んでるけど、途中からコードとファイルを端折りすぎてどこに書いてるのか理解出来ない

421デフォルトの名無しさん2022/03/19(土) 14:31:38.38ID:T81w77OE
>>420
その本(サイト?)はあまり読んでないからわからないけど、こういう知識・技術系は複数の本やサイトを利用したほうがいいかも
基本はそのロベールで、曖昧な部分は他のテキストでみたいに
まあ逆でもいいけど

422デフォルトの名無しさん2022/03/21(月) 11:12:55.05ID:Prmlj1K5
分割コンパイルの仕組みちゃんと理解しないまま雰囲気でヘッダインクルードしてるんですけど
cppファイルに#pragma once書かないのってどうしてですか??

423デフォルトの名無しさん2022/03/21(月) 11:22:20.21ID:S8aTENmp
>>422 書いても意味ないから。

424デフォルトの名無しさん2022/03/21(月) 11:45:05.99ID:TlR/Mg8q
>>422
まあ普通一回使ったら足りるからだけど、
cppをincludeしてたら意味があるのかもな

425デフォルトの名無しさん2022/04/07(木) 19:54:53.05ID:ozPVuLqH
cppってインクルード出来たんだ
ヘッダーだけかと思った

426デフォルトの名無しさん2022/04/11(月) 15:54:11.00ID:LBY7PFnU
単にコピペしてくるだけだけだからなんでもいいぞ
ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある

427デフォルトの名無しさん2022/04/11(月) 19:50:08.66ID:uaVZR/I2
IDEだと、プロジェクトに.cppを含めるとコンパイル対象になるので.inlとかにしておくのが無難

428デフォルトの名無しさん2022/04/30(土) 07:28:15.03ID:2aZ7UOTr
前は中身がcppっぽいのはcppにしてたけど
インクルード前提のファイルはhにするようにした

#define ほにゃらら
#include ファイル名.h
##undef ほにゃらら

インクルードしても単体ソースとしても使えるヤツはcpp

ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま

429デフォルトの名無しさん2022/06/11(土) 20:56:47.72ID:zBk/MBZO
hpp

430デフォルトの名無しさん2022/06/11(土) 21:01:36.29ID:N4H8T0pQ
h と hpp どっちにするかの話じゃなくて

(h or hpp) にするか
(c or cpp) にするか

の話

431デフォルトの名無しさん2022/06/11(土) 21:02:37.04ID:N4H8T0pQ
初心者はトリッキーな使い方はしない方が良いから聞かなかった事にして

432デフォルトの名無しさん2022/06/11(土) 21:20:49.53ID:kM12Kkyp
トリッカーズ。

433デフォルトの名無しさん2022/06/12(日) 10:33:13.76ID:cPTHwR7Q
三角形の秘密はね

434デフォルトの名無しさん2022/06/12(日) 11:16:51.08ID:v0rlTKHd
おなかがすいたら

435デフォルトの名無しさん2022/06/12(日) 19:40:55.19ID:r44ApDPu
ピーナッツ

436デフォルトの名無しさん2022/06/23(木) 10:13:29.99ID:06mLNX8U
なんか、すごい達者さんが並んでますけど、
ここって、
「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」
というスレです。

437デフォルトの名無しさん2022/06/23(木) 10:52:47.91ID:M4XLJX6g
最初からでも0からでも構わんが
自分で努力しないやつはだめ

438デフォルトの名無しさん2022/06/23(木) 11:07:51.97ID:XRNmRbRA
俺は努力しなくてもできちゃうからなあ

439デフォルトの名無しさん2022/06/23(木) 14:33:26.79ID:06mLNX8U
掛け算の*と、「何ですか?」の*と一緒なんですが、
区別する方法を教えてください。

440デフォルトの名無しさん2022/06/23(木) 19:37:03.84ID:WbbET00J
ポインターの事?

441デフォルトの名無しさん2022/06/23(木) 19:47:14.20ID:hToQs/iZ
は?何ですか?

442デフォルトの名無しさん2022/06/24(金) 10:44:51.77ID:K2we1Lar
オレオレ

443デフォルトの名無しさん2022/06/24(金) 12:54:50.02ID:fYiV2rYB
そうだよオレだよ

444デフォルトの名無しさん2022/07/16(土) 16:13:36.70ID:2GuJXeRO
>>439
掛け算の*は二項演算子
「何ですか?」の*は単項演算子
*の前に項があるかどうかで判断する

445デフォルトの名無しさん2022/07/16(土) 17:44:38.20ID:WOPsEo4E
数字の、xxxと、
数字の、AAAの掛け算は、

xxx*AAAで、いつも迷うんです・・・

446デフォルトの名無しさん2022/07/16(土) 18:00:17.69ID:QRg/sabr
*a+++ ++*b
で迷え

447デフォルトの名無しさん2022/07/16(土) 18:01:53.10ID:QRg/sabr
+*a++*++*b
これも

448デフォルトの名無しさん2022/08/01(月) 07:12:02.16ID:yd/7YIgU
map よりも unordered_map の方が高速ですか?
あと追加順が保障されないのが unordered_map ですか?
map は何順ですか?

449デフォルトの名無しさん2022/08/01(月) 13:52:12.46ID:jhXgj6wH
おまいは何を言っておるのだ?

450はちみつ餃子 ◆8X2XSCHEME 2022/08/01(月) 15:12:11.10ID:YhL9Bhjt
>>448
> map よりも unordered_map の方が高速ですか?

操作によるので一概には言えない。
一般的には unordered_map のほうが有利なことが多いとは言えるけれど。

> 追加順が保障されないのが unordered_map ですか?

map でも unordered_map でも追加した順序は保持されない。
C++ に限らず辞書的なデータ構造では格納順序を保持しないのが普通で、
保証があるのは Ruby の Hash くらいだと思う。
Go や Rust だと辿る順序を乱数でかき乱す実装になっているくらいだし。

> map は何順ですか?

キーの順序。
特に指示しなければデフォルトではキーを std::less で比較した順序。

451デフォルトの名無しさん2022/08/05(金) 04:26:17.70ID:ECXKpFJi
そもそもmapの順序ってなんぞや
そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど
腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ

452デフォルトの名無しさん2022/08/16(火) 01:02:16.19ID:pMrCsY/x
vector<int*> xの特定の要素を削除したい場合
delete x[1];
してから
x.erase(x.begin()+1);
という手順であってますか?
deleteしないとメモリリークしますよね?

453はちみつ餃子 ◆8X2XSCHEME 2022/08/16(火) 01:10:03.51ID:+o+ePBjP
>>452
それでいいよ。
でもスマートポインタを活用するとかの工夫はしたほうがいいね。

454デフォルトの名無しさん2022/08/18(木) 11:36:39.99ID:p/limWqp
そもそも移動が大量に発生するのでそんな設計しない

455デフォルトの名無しさん2022/10/14(金) 01:43:37.78ID:ps9ayw5X
bitset<4>("1101")をsigned longに変換したいのですが
簡単な方法は無いでしょうか?
to_ulong()はあるのですが、to_long()が無いっぽいです

456デフォルトの名無しさん2022/10/14(金) 01:50:46.72ID:cI3rl/qY
unsigned longからlongにキャストすればいいだけでは?

457はちみつ餃子 ◆8X2XSCHEME 2022/10/14(金) 02:13:27.03ID:rgl2oNFZ
念のため補足すると、変換後の整数型が符号付きである場合にその型で表現できる範囲をからはずれたときの結果は定義されていない。
しかし bitset<4> を元にするという前提の元では signed long int の範囲からはずれるということはありえない
ので signed long int にキャストするという対処で正しい。

458デフォルトの名無しさん2022/10/14(金) 02:13:45.28ID:ps9ayw5X
すみません肝心なことを書き忘れていました
2の補数表現された2進数の文字列を
signed longに変換したかったのでした

文字列は諦めて、
-(signed long)bitset<4>(~0b1101+1).to_ulong()
だと一応期待した動作なのですがなんか野暮ったい…

459デフォルトの名無しさん2022/10/14(金) 20:52:11.42ID:IQ8pOIWW
4ビットだから符号無しなら0~15だろ
コレを-8~7の符号付きにしたいということか?

460デフォルトの名無しさん2022/10/15(土) 16:23:31.27ID:B8kXjL18
普通に下駄履かせれば(引き算)


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

TOPへ TOPへ  

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


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

 ↓「0からの、超初心者C++相談室 」を見た人も見ています:
0からの、超初心者C言語相談室
【テンプレ読め】編物初心者相談室【15号室】
ヨット初心者 相談室 Part1
初心者の為のボート相談室 Part1
初心者優先デジタル一眼質問・購入相談室 129
初心者優先デジタル一眼質問・購入相談室 96
初心者優先デジタル一眼質問・購入相談室 133
初心者優先デジタル一眼質問・購入相談室 136
初心者優先デジタル一眼質問・購入相談室 132
初心者優先デジタル一眼質問・購入相談室 104
初心者優先デジタル一眼質問・購入相談室 123
初心者優先デジタル一眼質問・購入相談室 127
初心者優先デジタル一眼質問・購入相談室 128
初心者優先デジタル一眼質問・購入相談室 134
初心者優先デジタル一眼質問・購入相談室 130
初心者優先デジタル一眼質問・購入相談室 120
初心者優先デジタル一眼質問・購入相談室 139
初心者優先デジタル一眼質問・購入相談室 104
初心者優先デジタル一眼質問・購入相談室 137
初心者優先デジタル一眼質問・購入相談室 135
初心者優先デジタル一眼質問・購入相談室 127
初心者優先デジタル一眼質問・購入相談室 128
初心者優先デジタル一眼質問・購入相談室 124
初心者優先デジタル一眼質問・購入相談室 126
除草剤の選び方、使い方 初心者なんでも相談室 4
初心者優先 フジフイルム カメラ・一眼購入相談室
初心者優先デジタル一眼質問・購入相談室 110
初心者優先デジタル一眼質問・購入相談室 51
初心者優先デジタル一眼質問・購入相談室 93
初心者優先デジタル一眼質問・購入相談室 97
初心者優先デジタル一眼質問・購入相談室 107
初心者優先デジタル一眼質問・購入相談室 94
初心者優先デジタル一眼質問・購入相談室 144
初心者優先デジタル一眼質問・購入相談室 145
初心者優先デジタル一眼質問・購入相談室 156
初心者優先デジタル一眼質問・購入相談室 143
初心者優先デジタル一眼質問・購入相談室 141
初心者優先デジタル一眼質問・購入相談室 155
初心者優先デジタル一眼質問・購入相談室 98
初心者優先デジタル一眼質問・購入相談室 142
初心者優先デジタル一眼質問・購入相談室 157(ワッチョイ)
初心者優先デジタル一眼質問・購入相談室 101
初心者優先デジタル一眼質問・購入相談室 131
初心者優先デジタル一眼質問・購入相談室 140
初心者優先デジタル一眼質問・購入相談室 146
初心者優先デジタル一眼質問・購入相談室 147
初心者優先デジタル一眼質問・購入相談室 154
初心者優先デジタル一眼質問・購入相談室 130
除草剤の選び方、使い方 初心者なんでも相談室 8
除草剤の選び方、使い方 初心者なんでも相談室 7
【初心者優先】デジタル一眼質問・購入相談室 159
【初心者優先】デジタル一眼質問・購入相談室 160
初心者優先デジタル一眼質問・購入相談室 100 [無断転載禁止]
初心者 M43 1インチ 小型デジタル一眼質問・購入相談室
苔 コケ 初心者なんでも相談室-3回目
【初心者】サーフボード相談室【初級・中級】
苔 コケ 初心者なんでも相談室-4回目
(初心者相談)皆さん、HGガンプラってどこで買ってますか?
【初心者】スキーなんでも相談室30【初心者】
メダル初心者相談スレッド(本気でメダゲをする2)
【初心者】キリスト教@猥談室 19【歓迎】
【初心者】キリスト教@猥談室 21【歓迎】
【初心者】キリスト教@猥談室 6 【歓迎】
17:11:52 up 29 days, 3:35, 0 users, load average: 8.48, 8.52, 9.41

in 2.5921621322632 sec @2.5921621322632@0b7 on 011007