2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

30 :29:2018/11/16(金) 09:41:00.05 ID:37LYr8ZY.net
解決方法として

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

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

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

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

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

34 :デフォルトの名無しさん:2018/11/21(水) 04:04:25.43 ID: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 :さまよえる蟻人間 :2018/11/22(木) 03:29:53.66 ID:by2crdt6.net
C/C++ではありえません。不可能です。

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

型 変数名[]

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

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

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

a = "a"
a = "abc"

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

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

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

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

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

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

94 :デフォルトの名無しさん:2020/05/07(木) 17:22:45 ID:8jv+kISL.net
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 ID:wkYaXeHy.net
char *t = "hoge";
これがエラーにならないのは言語上の欠陥

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

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

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

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

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

どっちもスルーされる

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

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

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

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

103 :デフォルトの名無しさん:2020/05/09(土) 06:15:34 ID:LKKpAq9a.net
とりあえず 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 ID:3rxWY8lS.net
コロチャンもゲイツの陰謀とか言ってる人が居てわろす
温暖化も陰謀ω

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

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

----

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

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

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

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

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

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

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

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

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

114 :デフォルトの名無しさん:2020/05/22(金) 06:44:02 ID:8neFOyTD.net
この流れだと、仮パラメータ 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 ID:JweU/zGV.net
余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。
(標準ライブラリでもだいたいそうなってる。)

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

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

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

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

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

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

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

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

127 :124:2020/05/30(土) 19:18:59.52 ID: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 :デフォルトの名無しさん:2020/06/05(金) 17:55:42 ID:8OoEw/S/.net
なかなか、適当なスレを見付けるのが難しいわい
C++ 且つ初心者だから、ここでいいのかな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

141 :デフォルトの名無しさん:2020/06/23(火) 01:32:00.34 ID:UY2AjBBL.net
以下のコードは比較関数を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 ID:RMSfHJVB.net
>>141
エラーメッセージを読んで問題点を解決するように書き直すといいよ。
list に比較関数は渡せないと思うので前提が間違ってそうな気もする。

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

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

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

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

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

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

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

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

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

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

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

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

a.str="aaa";

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

char str[32];

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

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

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

154 :デフォルトの名無しさん:2020/09/08(火) 15:57:15.69 ID: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 :デフォルトの名無しさん:2020/09/08(火) 16:02:13.68 ID:JkCXGknl.net
>何で構造体の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.30 ID:s+S5qxFe.net
>char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

182 :デフォルトの名無しさん:2020/11/24(火) 23:02:59.67 ID:uO0ONWsd.net
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.85 ID:+VuDDc3z.net
>>182
とりあえずこれに従えばおk
https://docs.microsoft.com/ja-jp/cpp/build/vscpp-step-1-create?view=msvc-160

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

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

Visual Studioで、

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

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

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

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

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

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

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

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

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

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

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

だろうな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mruby の本も出た

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mrubyの本も出たし

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

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

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

228 :デフォルトの名無しさん:2021/05/17(月) 12:50:25.63 ID: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 :デフォルトの名無しさん:2021/05/17(月) 13:21:28.15 ID:giSQx4b2.net
http://www.math.sci.hiroshima-u.ac.jp/m-mat/TEACH/ichimura-sho-koen.pdf
http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/mt.html
https://qiita.com/seekworser/items/54e2b4596e72e8b9f9ea

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

これ使うのはダメ?

https://cpprefjp.github.io/reference/random/mt19937.html

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

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

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

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

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

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

232 :デフォルトの名無しさん:2021/05/18(火) 08:10:11.28 ID:ysWtxNVs.net
229にこれも組み合わせ

https://cpprefjp.github.io/reference/random/uniform_int_distribution.html

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

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

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

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

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

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

0からの、超初心者C言語相談室
https://mevius.5ch.net/test/read.cgi/tech/1621355654/

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

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

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

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

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

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

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

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

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

247 :はちみつ餃子 :2021/05/19(水) 23:06:46.13 ID:ONEwpJm5.net
>>242
それはよくある勘違い。 >>228 の方式では均等にならない。 櫛状にばらける。

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

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

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

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

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

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

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

253 ::2021/05/20(木) 22:00:26.21 ID:+zMkmbAL.net
>>247
剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>247 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法
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)

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

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

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

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

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

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

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

260 :デフォルトの名無しさん:2021/05/21(金) 17:24:43.18 ID: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 :デフォルトの名無しさん:2021/05/21(金) 18:35:20.74 ID:ojw3YA/u.net
>>256
>>227を見れば乱数になってないことは一目でわかると思うのだけど

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

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

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

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

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

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

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

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

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

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

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

https://ideone.com/M2SRcE
https://mevius.5ch.net/test/read.cgi/tech/1434079972/60

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

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

270 :デフォルトの名無しさん:2021/05/21(金) 21:33:53.10 ID: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 ::2021/05/21(金) 23:18:48.19 ID:XRGlJQOp.net
え? >>227 って srand() を複数回呼んでいるんですか?確かにそれは間違っていますね…
srand() は普通、アプリ起動直後に一回だけ呼べば十分ですよ…

272 :デフォルトの名無しさん:2021/05/22(土) 02:03:33.66 ID: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 :デフォルトの名無しさん:2021/05/22(土) 02:04:35.75 ID: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 :デフォルトの名無しさん:2021/06/02(水) 11:54:46.08 ID:QfG+Xq1u.net
書籍の意味が分からないので教えてほしいのですが
それ以外のって部分から何を言ってるのか全く分かりません

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

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

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

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

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

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

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

279 :蟻人間 :2021/06/02(水) 13:18:03.17 ID: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 :蟻人間 :2021/06/02(水) 13:32:39.22 ID:1WJ2HfQ7.net
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、
オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。

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

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

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

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

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

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

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

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

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

287 :デフォルトの名無しさん:2021/06/03(木) 02:59:14.77 ID: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:2021/06/03(木) 03:03:09.44 ID:Ers5yK+g.net
>>287
修正

256 ではなく、255 です

unsigned char は、0〜255

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

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

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

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

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

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

293 ::2021/06/06(日) 01:44:38.27 ID:xlnMgrm3.net
>>291
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

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

294 ::2021/06/06(日) 01:58:54.60 ID:xlnMgrm3.net
>>291
>>293

https://mevius.5ch.net/test/read.cgi/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は結構重要だと思います

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

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

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

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

https://ideone.com/Ivx0JY

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

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

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

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

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

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

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

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

>>291 に対する回答としての >>293, >>295 に間違いはないですよね?

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

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

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

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

306 :290:2021/06/06(日) 22:29:30.82 ID:DvMt5hdj.net
>>292
>>293
どうもありがとうございます

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

323 :はちみつ餃子 :2021/06/10(木) 14:24:18.43 ID:MOYAWABe.net
>>322
無いよ。

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

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

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

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

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

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

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

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

329 :はちみつ餃子 :2021/06/17(木) 23:54:09.39 ID:Gi/wqrqm.net
>>328
暗黙の型変換を許さないということかな?
それならテンプレートにした上で型に制約を付ければいい。
ここでは 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); // これは通る
}

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

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

332 :はちみつ餃子 :2021/06/18(金) 18:30:00.74 ID:JA4mPV9U.net
>>330
単なるサンプルだからだよ。

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

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

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

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

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

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

#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にしか出来んだろってこと

336 :デフォルトの名無しさん:2021/06/18(金) 19:42:19.79 ID:kejK9s3z.net
>>328
ちなコンセプト版(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);
}
(インデントは全角なので注意)
まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか

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

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

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

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

339 :デフォルトの名無しさん:2021/06/18(金) 20:01:53.90 ID:zIhiG+wy.net
あんまり詳しくない俺にはこういうのしか思いつかん。
__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;
}

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

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

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

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

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

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

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

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

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

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

347 :デフォルトの名無しさん:2021/06/19(土) 17:34:51.32 ID:xVp2TfT/.net
>>344
戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも
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());

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

361 :はちみつ餃子 :2021/08/25(水) 22:29:05.16 ID:/Q8zinJC.net
>>359
型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし
て書いてもかまわないんだが、変換関数 (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());
}

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

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

そんな難しくせずに、

{ change A to B }

でいいんじゃないの?

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

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

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

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

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

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

368 :デフォルトの名無しさん:2021/08/27(金) 23:33:15.78 ID:cMIVTei2.net
例えば、デスクトップにショートカットを作る。
コマンドプロンプトを起動して、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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

vector<int> a(10);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

https://imgur.com/a/V3jOiV0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

406 :ハノン :2021/10/20(水) 20:15:37.71 ID:I2cv7mAQ.net
>>402
ええ?

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

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

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

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

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

(実装)?

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

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

412 :デフォルトの名無しさん:2021/11/09(火) 14:46:05.51 ID:t/ZCl1K7.net
普通でなく指定したバイト数以上のメモリを確保しようとしたら例外が上がる実装例
#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;
}

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

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

415 :デフォルトの名無しさん:2022/02/10(木) 15:34:30.67 ID:Ido/99Jv.net
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でビルドしています。(他の人は使っているので、文法などは問題ないはずだと思っています。)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

の話

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

451 :はちみつ餃子 :2022/08/01(月) 15:12:11.10 ID:YhL9Bhjt.net
>>449
> map よりも unordered_map の方が高速ですか?

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

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

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

> map は何順ですか?

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

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

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

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

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

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

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

458 :デフォルトの名無しさん:2023/05/24(水) 23:52:31.95 ID:lCJuR93r.net
いやー今日はめっちゃ勉強したわ
詳しくなった

459 :デフォルトの名無しさん:2023/06/04(日) 09:18:18.28 ID:5jvZ+YKl.net
誘導されて来ますた、
質問なのですがstd::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす
れば良いの?
ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……

460 :はちみつ餃子 :2023/06/04(日) 09:22:50.76 ID:MHoxWKtY.net
>>459
strtod で何が不満なの。
空白かどうかで区別が必要なら空白かどうか確認するしかしょうがないし、
ダサいもくそもないだろ。

461 :デフォルトの名無しさん:2023/06/04(日) 09:28:48.33 ID:5jvZ+YKl.net
>>460
だって&(str[0])とかナマポやし……
文字列型がchar以外になったら(std::basic_string<TCHAR>とか)になることも見越したら
手でテンプレート書かないといけないから牛刀感があるし、
文字列が厳格に数値文字列なのか検査するとかアプリのコードであるあるなので
アプリレベル(高級アセンブラ的でない書き方)の手段が用意されていて然るべきな気がして仕方が無いし、

462 :デフォルトの名無しさん:2023/06/04(日) 09:30:18.23 ID:5jvZ+YKl.net
無いというなら仕方が無いが、漏れはちょう初心者ですら……

463 :はちみつ餃子 :2023/06/04(日) 09:37:21.42 ID:MHoxWKtY.net
>>461
std::stod は std::string と std::wstring に対応してるよ。

464 :デフォルトの名無しさん:2023/06/04(日) 09:39:47.38 ID:5jvZ+YKl.net
>>463
std::stod()は数値への変換が行われなかったとき例外をスローするが
後ろに余計なものが付いていたらスルーするんじゃ……
なお試したことはありま栓、

465 :はちみつ餃子 :2023/06/04(日) 09:52:59.20 ID:MHoxWKtY.net
>>464
???
それで何か困ることがあるという話なの?
要件が不明瞭でよくわからん。

466 :デフォルトの名無しさん:2023/06/04(日) 09:55:13.77 ID:5jvZ+YKl.net
実は正規表現でも使えば何とかなる……
のか……
std::regex re("^\s*([\d.]+)\s*$");
std::smatch m;
if (std::regex_match(str, m, re)) {
 return m[1].str().strtod();
} else {
 エラー
}


 

467 :デフォルトの名無しさん:2023/06/04(日) 09:56:15.54 ID:5jvZ+YKl.net
>>465
仕様は最初に提示stkr、
123.456E+8 : OK
123.456E+8a : NG

468 :はちみつ餃子 :2023/06/04(日) 10:00:50.19 ID:MHoxWKtY.net
>>467
続くものが何であるかは自分で確認してエラーにするという話をしてると思ったんやが。

469 :デフォルトの名無しさん:2023/06/04(日) 10:05:01.33 ID:5jvZ+YKl.net
>>468
>続くものが何であるかは自分で確認してエラーにする
・できればライブラリでやってホスイ
・自分で書くとしてもナマポ(&(str[0]))は避けたい(>>461
・std::string部分が他の文字列型に変わっても大丈夫なサポートがあるならそれに乗っかりたい手でテンプレートを書きたくない(>>461

できるかできないかで言えば、std::stringについてはダチャくあっても実現できてはいるので
C++でちょう簡潔に書ける手段が実はあるのではないか、ありませんか、というのが質問の意図

470 :はちみつ餃子 :2023/06/04(日) 10:13:13.65 ID:MHoxWKtY.net
>>469
続くものの種類で判断するというピンポイントな要求にマッチするものはさすがに標準にあるわけない。
それを除けば std::stod が十分に要求を満たしているように見える。

471 :デフォルトの名無しさん:2023/06/04(日) 11:40:09.61 ID:bxWaSYac.net
単位でも確認したいの?
だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない

472 :デフォルトの名無しさん:2023/06/04(日) 11:51:26.73 ID:xmEQJDCs.net
正規表現でチェックするのが1番自然な気がする

473 :デフォルトの名無しさん:2023/06/04(日) 22:03:06.86 ID:5jvZ+YKl.net
>>471
> 単位でも確認したいの?
> だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
std::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい(>>459

> チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
チェックのためには(例えばstd::stodが)どこまで読んだのかの情報が要る
std::stodの裏側では文字列を数値解釈する枯れたコードが動いているわけで、
そいつにどこまで読んだのか、ただ1個の整数データを聞けさえすれば良い。
これはそれほど無茶な話ではないはずで実際strtod()ではできるから
どっちかというtライブラリにちょっち不備があるのでは案件であってお母さん案件ではない。

474 :デフォルトの名無しさん:2023/06/04(日) 22:20:35.13 ID:5jvZ+YKl.net
>>472
上に書いた通り(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたら解決するのじゃ
正規表現は意味的には合目的的な手段やが、普通の正規表現エンジンの実装なら正規表現オブジェクトを作った際に
FSMを(表形式か何かで)生成する処理が中で動くので、そんなに軽い処理ではないからやっぱ牛刀感みある…

いったん作ったらマッチングは表駆動でやれるので速いことが気体できるのではないか、という香具師が居るかもしれないが、
実はstd::stod()に最大限仕事させたい(正規表現の側で数値文字列の書式についてわざわざ指定したっくない
場合は>>496の正規表現は正しくは "^\\s*(.*?)\s*$"にせねばならないからマッチング時にバックトラックが発生して遅い可能性がある
これもちょっちイヤソな理由

繰り返しになるが(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたらこんな考慮は不要で完全に円満に解決するのじゃ……

475 :デフォルトの名無しさん:2023/06/04(日) 22:30:29.50 ID:bxWaSYac.net
>>473
そんな長文ギャンギャン書きなぐってる暇があればstodの仕様くらい調べろよ
ちゃんとお前の欲しがってる物を返してくれるよ

476 :デフォルトの名無しさん:2023/06/05(月) 00:32:44.63 ID:8dockxGx.net
便乗質問していいですか
某所で似たような問題があったのだけど、付加条件として、数値がINT_MAXを超える場合は
INT_MAX、INT_MINを下回る場合はINT_MINを返す、がありました
stodを使う場合(stoll等でもいいですが)、これってどうやって処理すればいいですかね

477 :デフォルトの名無しさん:2023/06/05(月) 00:38:04.95 ID:8dockxGx.net
念の為「数値が」というのは元の文字列での、です。たとえば "1000000000000"みたいな
可能性としてはLONG_LONG_MAXを超えている場合もありますね

478 :デフォルトの名無しさん:2023/06/05(月) 00:46:19.80 ID:oX+QCkCh.net
stoi系は範囲越えたらstd::out_of_rangeを投げるはずだが

479 :デフォルトの名無しさん:2023/06/05(月) 01:19:48.15 ID:8dockxGx.net
_MAXで超えたか_MINで超えたかってわかりますかね

480 :デフォルトの名無しさん:2023/06/05(月) 01:31:31.21 ID:oX+QCkCh.net
先頭文字が'-'かどうか見れば?

481 :デフォルトの名無しさん:2023/06/05(月) 01:54:42.53 ID:yTJt/rkc.net
>>475
どういうこっちゃkwsk、

482 :デフォルトの名無しさん:2023/06/05(月) 02:04:38.53 ID:LZnxgWkc.net
>>481
https://ja.cppreference.com/w/cpp/string/basic_string/stof

> pos がヌルポインタでなければ、ポインタ ptr (変換関数の内部的な変数) が str.c_str() 内の最初の変換されなかった文字のアドレスを受け取り、その文字のインデックスが計算されて *pos に格納されます。 これは変換によって処理された文字数になります。

> 引数
> str - 変換する文字列
> pos - 処理された文字数を格納する整数のアドレス

483 :デフォルトの名無しさん:2023/06/05(月) 02:37:23.50 ID:yTJt/rkc.net
>>482
㌧クスわかりたorz

484 :デフォルトの名無しさん:2023/06/05(月) 06:49:34.05 ID:8dockxGx.net
>>480
そうですね、でも文字列の先頭とは限らないですよね。やはりこの場合はある程度は
自力で文字列をパースする必要がある感じですかね

ちなみに数字以外が含まれるときの挙動は "hoge 123"みたいに数字より前に非数字
がくるのは駄目だけど逆に"123 hoge"みたいのはおkなんですね

485 :デフォルトの名無しさん:2023/06/20(火) 19:02:06.99 ID:mbwsU8Mq.net
話題がないから質問してみる

struct Summer {};
Summer summer;
Summer *const summerConstPtr{};
const_cast<Summer*>(summerConstPtr) = &summer; // だめ
const_cast<Summer*&>(summerConstPtr) = &summer; // いける

質問1) 最後のいけるやつのconst_cast<Summer*&>の「&」はどういう意味なんでしょう? 参照のことかいな?
質問2) なんでconst_cast<Summer*>ではだめなのかな?

486 :デフォルトの名無しさん:2023/06/20(火) 19:05:08.72 ID:mbwsU8Mq.net
なんか変換されたw
∑merでなくて&summerです

487 :はちみつ餃子 ◆8X2XSCHEME :2023/06/20(火) 20:45:04.07 ID:IIzrqfbq.net
>>485
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。

たとえば
int x = 1;
x = 2;
は有りだけど
1 = 2;
は駄目なのはわかるでしょ。

この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。

488 :はちみつ餃子 ◆8X2XSCHEME :2023/06/20(火) 20:54:10.99 ID:IIzrqfbq.net
どういうときにどういう値カテゴリに属すことになるのか正確なところはここ見て。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval

C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。

489 :デフォルトの名無しさん:2023/06/20(火) 23:48:13.65 ID:mbwsU8Mq.net
>>487
返答ありがとう。

なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。
summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって
Summer *summerPtr;
summerPtr = &summer;
とするときの左辺summerPtrと同じようになったわけではないのでしょうか?

どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??

490 :はちみつ餃子 ◆8X2XSCHEME :2023/06/21(水) 00:33:00.36 ID:3HBFHOpK.net
>>489
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)

& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。

491 :デフォルトの名無しさん:2023/06/21(水) 01:03:31.08 ID:tILY3YM/.net
>>489
その理解だと↓も通ることになると思うんだけど、これが通らない理由もわからない?
int i = 0;
static_cast<int>(i) = 1;

492 :デフォルトの名無しさん:2023/06/21(水) 11:05:32.10 ID:cZp0PZIW.net
>>490,491
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。

493 :デフォルトの名無しさん:2023/06/29(木) 00:53:29.69 ID:l197jz/x.net
なんで可変長配列の名前がvectorなの?

494 :はちみつ餃子 ◆8X2XSCHEME :2023/06/29(木) 08:14:12.68 ID:l+ZsGqGg.net
伝統。

495 :デフォルトの名無しさん:2023/06/29(木) 13:14:41.30 ID:DfwcYShQ.net
https://www.google.co.jp/search?q=%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB+%E6%84%8F%E5%91%B3
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという

496 :デフォルトの名無しさん:2023/07/04(火) 17:43:58.34 ID:Ld2RSFGK.net
c++に限定される疑問ではないかも知れませんが標準出力がどうやってコンソールに出力しているか?というところで躓いてます
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?

497 :はちみつ餃子 ◆8X2XSCHEME :2023/07/04(火) 17:52:47.39 ID:wwaI/oJF.net
>>496
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。

498 :デフォルトの名無しさん:2023/07/04(火) 18:05:29.71 ID:Ld2RSFGK.net
>>497
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます

499 :デフォルトの名無しさん:2023/07/04(火) 19:16:32.21 ID:Ld2RSFGK.net
同様のテーマのITmediaの記事を見つけたので腰を据えて取り組んでみようと思います
回答いただきありがとうございましたお騒がせしました

500 :はちみつ餃子 ◆8X2XSCHEME :2023/07/05(水) 00:40:03.93 ID:h//lr2GB.net
>>498
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。

と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。

501 :デフォルトの名無しさん:2023/07/13(木) 01:46:39.34 ID:a7xsv8mg.net
shared_ptrの解放時にweak_ptrを登録していたSTLコンテナから登録抹消したいけど、
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?

502 :はちみつ餃子 ◆8X2XSCHEME :2023/07/13(木) 18:07:22.25 ID:46c6OBqO.net
>>501

設計意図次第だけど
コンテナにはオブジェクト本体をいれて shared_ptr は
コンテナ内の要素を指すイテレータを指す
という構造はどうだろう。

#include <iostream>
#include <memory>
#include <set>

int main(void) {
std::set<int> container;
auto [iter, result] = container.emplace(42);
{
// コンテナ内の要素を指す shared_ptr をいくつも作る
auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;});
auto y = x;
auto z = x;
// コンテナの中には要素が入ってる
for (auto& x : container) std::cout << x << " ";
std::cout << std::endl;
// shared_ptr はここで消滅
}
// デリータが消したのでもう残ってない
for (auto& x : container) std::cout << x << std::endl;
}

503 :デフォルトの名無しさん:2023/07/13(木) 21:30:08.90 ID:BEK5Ztwm.net
>>502 ありがとうございます。実体とイテレータ、参考になります。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。

処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。

504 :デフォルトの名無しさん:2023/07/16(日) 13:37:45.84 ID:aonKa36p.net
設計意図次第

505 :504:2023/07/16(日) 21:29:25.31 ID:AcIm+utR.net
何でかshared_ptrって派生出来ないと思い込んでたけど出来た。
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。

template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};

506 :蟻人間 ◆T6xkBnTXz7B0 :2023/07/16(日) 22:10:43.92 ID:/+p/BpGt.net
クラス内部で
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。

507 :蟻人間 ◆T6xkBnTXz7B0 :2023/07/16(日) 22:12:03.59 ID:/+p/BpGt.net
>>506
クラス内部で
using std::shared_ptr<T>::shared_ptr;
を付けるとコンストラクタの実装が完璧になるよ。

508 :504:2023/07/16(日) 22:37:21.87 ID:AcIm+utR.net
>>507 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。
ありがとうございます。自前実装不要なのは助かります。

509 :はちみつ餃子 ◆8X2XSCHEME :2023/07/17(月) 00:18:57.61 ID:YifLUjyU.net
>>505
それって本当に意図通り?
X のデストラクタが起動するのは X 型のオブジェクトが解体されるときであって
参照カウントがゼロになったときじゃないんだよ。

510 :504:2023/07/17(月) 01:33:58.67 ID:9b8iHtwy.net
>>509 …あー。それは意図通りではないですね。実際の解放はデストラクタで
use_count()==1であることを確認する必要があるのかな。ありがとうございます。

511 :はちみつ餃子 ◆8X2XSCHEME :2023/07/18(火) 09:19:59.88 ID://OyAtPF.net
パブリック継承した型では基底への型変換を禁じることができない。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。

間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。

512 :504:2023/07/19(水) 03:16:45.39 ID:0uGQJSD8.net
>>511
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。

> パブリック継承した型では基底への型変換を禁じることができない。
そんな問題があるとは。
派生クラスのキャスト演算子は引っかからず、基底クラスの
コピーコンストラクタをいじらないと禁止出来ないっぽかった。
protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。

> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。

513 :504:2023/07/19(水) 18:45:15.41 ID:4lyHW67x.net
そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、
public継承でほったらかします。

514 :デフォルトの名無しさん:2023/07/20(木) 15:28:07.42 ID:6BSTmMYa.net
templateの世界へようこそ

515 :はちみつ餃子 ◆8X2XSCHEME :2023/07/21(金) 13:23:19.14 ID:NiBubQrd.net
std::unique_ptr なら型引数でもデリータを与えることが出来て、
型引数が異なれば異なる型ということになる。

#include <memory>
template<class T> struct custom_delete : public default_delete<T> {};

int main(void) {
std::unique_ptr<int, custom_delete<int>> foo{new int(42)};
// ↓ 別の型なので移動できない。 エラーになる。
std::unique_ptr<int> bar = std::move(foo);
}

ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。
解体は動的な型に従うという保証をしているので。

#include <memory>
struct foo {};
struct bar : public foo {};

int main(void) {
// 解体のときに foo ではなく bar の
// デストラクタが呼ばれることが保証される
std::shared_ptr<foo> x{new bar};
}

std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが
設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す
というのが最も自然な形と言える。

std::shared_ptr を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)

516 :504:2023/07/21(金) 20:08:15.21 ID:jaEOXewl.net
一応発端の動かなかったコードを短くしたのでおいときます。
0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい
1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。
2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の
デストラクタじゃないと処理できないけど、既製品だから外からいじられない。
3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば?
というのが趣旨でした。

#include<vector>
#include<memory>
int main(){
std::vector<std::weak_ptr<int>> v;
std::shared_ptr<int> x(new int(3), [&x, &v](int* i){
for(int j = 0; j < v.size(); j++){
std::shared_ptr<int> t = v[j].lock();
if(t && t == x){v.erase(v.begin() + j); break;}
}
delete i;
});
v.push_back(x);
}

517 :デフォルトの名無しさん:2023/07/25(火) 09:24:45.92 ID:k8WJtY+U.net
>shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない

これが無理っしょ

518 :デフォルトの名無しさん:2023/07/28(金) 10:56:39.59 ID:Zgvcm9f5.net
なんで出来ると思ったの

519 :デフォルトの名無しさん:2023/07/29(土) 20:15:59.76 ID:ETnyq2kJ.net
shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする

520 :デフォルトの名無しさん:2023/07/29(土) 20:25:36.66 ID:xEb8mTKO.net
シャー専用ptr

521 :1:2023/09/03(日) 20:55:45.58 ID:/ExZEMtW.net
「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。
からのスレの目的で建てました。

522 :デフォルトの名無しさん:2023/09/03(日) 20:59:12.95 ID:W287fTtw.net
まず、何が作りたいかイメージしてみましょう

523 :デフォルトの名無しさん:2023/09/04(月) 10:11:49.98 ID:/ASAZOX6.net
>>521 がC++をやるのは早過ぎる
先にpythonでもやってみろ

524 :デフォルトの名無しさん:2023/10/02(月) 22:07:14.88 ID:l4Vvzubd.net
次のプログラムを実行するとコメントのように出力がされ、mainの最後で例外が発生してしまいます。
なぜ例外が発生するかわかる方教えてください。
mainを通してnewは2回実行され、deleteも2回実行されるので空ポインタをdeleteしていることもないと思うのです。
#include <iostream>
using namespace std;
class Csmp1 {
private:
int x;
int* p;
public:
Csmp1(int n);
~Csmp1();
void disp() { cout << "x=" << x << endl;}
};
Csmp1::Csmp1(int n) {
x = n;
p = new int;
cout << "constructor " << x << endl;
}
Csmp1::~Csmp1() {
delete p;
cout << "destructor " << x << endl;
}
int main()
{
Csmp1 d3(300); // "constructor 300"と出力
d3.disp(); // "x=300"と出力
d3 = Csmp1(400); // "constructor 400"と出力し、その後"destructor 400"と出力
d3.disp(); // x=400と出力
return 0;
} // デストラクタが呼ばれ、delete の部分で"Unknowin signal"例外発生

525 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:06.36 ID:/sjCb2h4.net
>>524
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。

526 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:09.92 ID:/sjCb2h4.net
>>524
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。

527 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:23.61 ID:/sjCb2h4.net
>>524
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。

528 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:42.13 ID:/sjCb2h4.net
>>524
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。

529 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:18:32.15 ID:/sjCb2h4.net
連投すみません。コピーコンストラクタと、代入もです。

530 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 00:13:21.44 ID:OUiDjLFt.net
>>524
暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。

ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので
一方のポインタを通じて delete したならもう一方のポインタからオブジェクトに触れようとしてはならない。
(もう存在しないので。)

この場合は
d3 = Csmp1(400);
としたときに生成される一時オブジェクトはこの式が終わった時点で解体されるので
d3 内にあるポインタはデストラクタで delete 済み、すなわち無効なポインタとなる。
d3 のデストラクタが起動したときはデータメンバ p が指している先は無効なので
無効なポインタをいじったことになって問題が生じる。

それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。

531 :527:2023/10/03(火) 00:55:04.57 ID:RKQFDOr6.net
>>529-530
お二人さま ありがとうございます。

>d3 = Csmp1(400);としたときに生成される一時オブジェクトはこの式が終わった時点で解体される

右辺により生成されるオブジェクトが単にd3に格納されるのではないのですか。
それと入れ替わりに、d3コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。
(どこからも参照されなくなるので)

自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。

532 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:14.63 ID:OUiDjLFt.net
>>531
> 右辺により生成されるオブジェクトが単にd3に格納

JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?

C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。

533 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:25.78 ID:OUiDjLFt.net
>>531
> 右辺により生成されるオブジェクトが単にd3に格納

JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?

C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。

534 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:17:47.16 ID:OUiDjLFt.net
サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。
なんか不安定な状況っぽい

535 :デフォルトの名無しさん:2023/10/05(木) 17:15:14.18 ID:WXXGTjkD.net
みんなでリトライするからF5攻撃並みに自爆DOS攻撃

536 :デフォルトの名無しさん:2023/10/05(木) 18:29:28.73 ID:S7K0dlIY.net
>>524
int *をunique_ptr <int>にすると
コンパイルで弾かれるから
気づきやすいかもね
newとdeleteは直で呼ばない方が良い

537 :デフォルトの名無しさん:2023/10/06(金) 10:09:01.67 ID:Zl0hPCVy.net
newとdeleteを直で呼んでるかどうかと
今回の問題(コピーが発生してるかどうか)は
関係無いんじゃね?

538 :デフォルトの名無しさん:2023/10/06(金) 10:16:23.02 ID:QFTcWZUD.net
いきなりC++から入るとは…
考え直した方がいい

539 :デフォルトの名無しさん:2023/10/06(金) 12:08:09.60 ID:xj8n2YWF.net
>>537
「コピーが発生してるかどうか」とは関係ないのはその通り
>>524が恐ろしいのは
コンパイル時点では気づかず実行して初めて明らかになるところ
どうしたら実行前に避けるかの方策として
unique_ptrの常用を提案しました

540 :デフォルトの名無しさん:2023/10/06(金) 13:16:53.99 ID:Zl0hPCVy.net
>>524 に有効な解決策は
コピーコンストラクタじゃなくて
ムーブコンストラクタじゃないのかな

541 :はちみつ餃子 ◆8X2XSCHEME :2023/10/06(金) 16:48:00.89 ID:R7EjAYTn.net
両方やっとけばええじゃろ。

542 :デフォルトの名無しさん:2023/10/06(金) 21:05:50.93 ID:BgvqARb2.net
vector dp(N+1,vector(i+1,vector<mint>(i,0)));
これはdp[N+1][i+1][i]個のデータを確保していると思っておk?

543 :デフォルトの名無しさん:2023/10/06(金) 21:10:07.75 ID:G9Jlm58L.net
OK牧場!

544 :デフォルトの名無しさん:2023/10/06(金) 21:44:11.09 ID:BgvqARb2.net
TXH!

545 :527:2023/10/16(月) 23:49:47.91 ID:6sfjI2pS.net
>>532 を始めとして皆さんまたまたありがとうございます。
アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。

コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。

546 :デフォルトの名無しさん:2023/10/17(火) 23:09:31.94 ID:cH9YbrYr.net
既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。
マニュアルや継承のツリーををたどって地道に調べるしかないのですか。

547 :はちみつ餃子 ◆8X2XSCHEME :2023/10/18(水) 09:51:20.64 ID:UZlHr99J.net
>>546
ソースコードの構造を調べるのを補助するツールはあるが
どういう意図でどういう使い方を想定してそう書かれているのかは
プログラマが読み解かないとどうしようもない。

548 :デフォルトの名無しさん:2023/10/18(水) 17:06:40.02 ID:d+gN3jrr.net
既製品ならドキュメントあるだろ
ドキュメントで謳ってないことはやるべきでない

549 :デフォルトの名無しさん:2023/10/18(水) 21:01:33.56 ID:XEk7oAP2.net
visual studio community 2022で、
他のソリューションで作成されたmoduleをimportする方法がわかりません。
#includeみたいにパスを指定する方法とかがあるんでしょうか?

550 :デフォルトの名無しさん:2023/10/18(水) 21:18:35.91 ID:GW9b62tt.net
あるよ

551 :デフォルトの名無しさん:2023/10/18(水) 22:46:30.83 ID:XEk7oAP2.net
>>550
ぜひ教えてください!

552 :デフォルトの名無しさん:2023/10/19(木) 10:07:14.52 ID:W1XtHktx.net
外部モジュール取り込みは言語仕様じゃ無くてIDEの機能だから

553 :デフォルトの名無しさん:2023/10/20(金) 09:56:30.99 ID:/M3RKJCH.net
IDEに頼ってるとアホになるよ

554 :デフォルトの名無しさん:2023/10/21(土) 16:32:35.29 ID:dhBJRkMq.net
0のうちにやめとけ
時間がもったいない

555 :デフォルトの名無しさん:2023/10/26(木) 23:16:10.15 ID:4gABazLN.net
typedef uint8_t byte;
:
byte a = 3;
uint8_t b = a;

bの初期化は型不一致エラーにならないと思います。

コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。

556 :デフォルトの名無しさん:2023/10/26(木) 23:23:19.82 ID:oN20rU1J.net
>>555
typedef は型の別名を作る機能であって新しい型を作らない。

557 :デフォルトの名無しさん:2023/11/05(日) 12:44:18.01 ID:iVzKXsmj.net
Visual StudioでソリューションAでビルドしたブツ(.exe、.dll、lib)、シンボルファイル(.pdb)、必要なヘッダファイル(.h)
をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは
"$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、
Visual Studio 2019以降だと今は実はもっと簡単?

558 :デフォルトの名無しさん:2023/11/10(金) 23:40:20.59 ID:mtEH7OmF.net
class MyClass {
public:
MyClass();
:
};

int main()
{
MyClass* c = new MyClass(); ①
MyClass d;
MyClass* dp = &d; ②
:
}

オブジェクトのポインタは①や②のように取得できると思います。
私からすると①はdeleteしなければならないのでできれば使いたくない。

①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。

559 :デフォルトの名無しさん:2023/11/10(金) 23:49:08.54 ID:VDRR6isO.net
>>558
その「相互代入」って何ですか?

560 :はちみつ餃子 :2023/11/10(金) 23:56:43.46 ID:Irnop6+y.net
>>558
自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
寿命の種類のことを Storage duration といい、
new で生成したオブジェクトは Dynamic storage duration に該当する。

継承関係がどうこうというのは何が言いたいのかよくわからないが、
ポインタの性質はオブジェクトの寿命とは関係ない。

561 :デフォルトの名無しさん:2023/11/12(日) 00:13:49.90 ID:M40i1rJ9.net
相互代入は言葉がおかしいですね。
基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
オブジェクトのボインタを使う場面があまりないので用途を聞きました。

>>560
>自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。

自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。

562 :はちみつ餃子 :2023/11/12(日) 02:00:51.06 ID:O0gb6uIB.net
>>561
グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。
この static というやつは main が始まる前に構築されて main が終わった後に解体されるので
必要以上に長い寿命になってしまうことが多いし、
実行時の情報を元にして構築するオブジェクトを static にはしようがない。
dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。
ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。

グローバル変数は寿命も長すぎるがスコープも広すぎる。
人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。
触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。

本当に人間は忘れるし間違える。
部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。
まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。

563 :デフォルトの名無しさん:2023/11/12(日) 11:04:18.35 ID:l8rhUXJt.net
>>558
>@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
そのためだけにあるという訳ではない

>私からすると@はdeleteしなければならないのでできれば使いたくない。
生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば
deleteはスマートポインタがやってくれる
構築は uniqu_ptr <MyClass> = new MyClass(); や
uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる

564 :デフォルトの名無しさん:2023/11/12(日) 13:14:04.39 ID:xpiKETrj.net
> 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
> オブジェクトのボインタを使う場面があまりないので用途を聞きました。

アップキャストのことだろうかね。
必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか

565 :デフォルトの名無しさん:2023/11/13(月) 06:27:48.00 ID:qbVz2ceg.net
>>558 は、最初から必要数が決まっているオブジェクトしか作ったことがないのかな。
リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。

566 :デフォルトの名無しさん:2023/11/13(月) 10:31:45.02 ID:IRswNIWu.net
>>564
型チェックしなきゃ危険だけどな

567 :デフォルトの名無しさん:2023/11/13(月) 13:26:36.10 ID:qAieNn1D.net
uniqu_ptr

568 :デフォルトの名無しさん:2023/11/13(月) 18:54:22.80 ID:CCXWxw1E.net
>>567
おおスマン
typoだね

569 :デフォルトの名無しさん:2023/11/13(月) 23:59:54.01 ID:RLYu3oMv.net
>>562 ほか皆さんありがとう。

自分の関わってきた分野が小規模組み込みだからか、そもそもCでmallocの使用経験がないのです。
処理系がmallocをサポートしないMCUもありました(使いたいなら自分で作ってという思想、標準入出力も)。
なので>>565 さんの指摘は当たりです。

c++に挑戦している今の環境も小規模なので、newの利用はほどほどに検討してみます。

570 :デフォルトの名無しさん:2023/11/14(火) 00:03:40.68 ID:F1cdKor4.net
>>564
だいたい参照で済んでしまいます

571 :デフォルトの名無しさん:2023/11/14(火) 12:46:18.30 ID:SRCspH78.net
mallocもnewも使ったこと無いってやばいぞ

572 :はちみつ餃子 ◆8X2XSCHEME :2023/11/14(火) 15:58:08.40 ID:oTbgWDDI.net
new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。
メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?)
低レイヤでも便利な場面はたぶんある。

分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど
あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。
知っておくに越したことはないよ。

573 :デフォルトの名無しさん:2023/11/14(火) 21:59:36.46 ID:WxE96Zj2.net
空配列を用意してそれを順繰り使い回す
チープなCPUでは必須の方法

574 :デフォルトの名無しさん:2023/11/14(火) 22:15:51.21 ID:VpxEmvp/.net
RAM2KBでmallocが必要かどうか

575 :デフォルトの名無しさん:2023/11/15(水) 09:06:17.34 ID:vh+zgKB1.net
よく
 A a = new A();
 a->b();
 delete a;
みたいに生成してすぐ解放ってのがありますけど、
 A a;
 a.b();
じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。

576 :デフォルトの名無しさん:2023/11/15(水) 09:39:21.05 ID:88mXe6hW.net
後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな

577 :デフォルトの名無しさん:2023/11/15(水) 09:40:08.83 ID:7t1hSBTd.net
>>575
A *a = new A(); よね、一応
bを呼び出したいだけなら特にメリットはないよ

578 :デフォルトの名無しさん:2023/11/15(水) 10:25:46.06 ID:2QF9cM/v.net
スタック?
そんな所にゃ領域取らないだろ

579 :デフォルトの名無しさん:2023/11/15(水) 16:06:06.00 ID:rnHf5KLb.net
何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?

580 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 16:35:01.46 ID:k729Xl/N.net
>>575
> ありますけど、

ないよ……。
少なくともそう頻繁にはない。

あるとしたら >>576 が指摘するように A が特に巨大な場合というのはひとつの可能性。
ただ、巨大になるのがわかってるならリソースを分割して A の中で
上手いことやりくりする (A 自体の大きさは抑える) べきで、
クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。

第二の可能性として、 new 演算子をオーバーロードして
そのオブジェクトがメモリの特定の場所に対応づけられる場合。
メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから
それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。
でもそれは低いレイヤだけの話で、
適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。

581 :デフォルトの名無しさん:2023/11/15(水) 18:55:56.04 ID:aqUxtLPE.net
超初心者スレで揚げ足とったり、マウントしたり

582 :デフォルトの名無しさん:2023/11/15(水) 19:46:52.63 ID:O3I3kWYX.net
>>579
何か作ってるうちに嫌でも詳しくなるよ

583 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 21:31:49.26 ID:k729Xl/N.net
PC9801 時代を知ってる人は色々と詳しいと思うがその知識が役立っているというわけでもなくて、 PC9801 時代からの三十年くらいあれば詳しくなって当たり前ってだけだぞ。
たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。

584 :デフォルトの名無しさん:2023/11/16(木) 11:26:46.68 ID:QXdh7keC.net
当時は役に立ったけど今はオワコンの技術と
今でも役に立ってる技術と
どっちが割合多い?

585 :デフォルトの名無しさん:2023/11/16(木) 11:55:31.84 ID:nxuWB9A/.net
「技術は陳腐化するが考え方は永遠である」

586 :はちみつ餃子 :2023/11/16(木) 14:01:30.65 ID:brAf4s3Y.net
新しい技術的流行が昔からあったやつの焼き直しってことは珍しいことじゃない。
「なんや、結局は××やないか」というときに××自体が廃れていてもう使わなくても
理解のためには役立っているのでオワコンとも役に立ってるとも言えたりする。

587 :デフォルトの名無しさん:2023/11/16(木) 15:18:16.01 ID:QXdh7keC.net
ActiveXってCOMだよね
COMってOLEだよね

588 :デフォルトの名無しさん:2023/11/20(月) 15:56:09.22 ID:QJSPRwrd.net
こんにちは坂本と申します。
C++を0から勉強したく書き込み致しました。
私ごとですが先月定年退職し、やっと自由な時間がもてる様になりました。
在職中ずっとプログラミングの勉強をしたかったのですが子育てや職場がプラントの電気機械保全業務の3交代だった為に定年後を楽しみに我慢してまいりました。
プログラミングの知識は全くなく制御盤のPLCでニーモニック語でリストプログラミングをするぐらいしか経験はありません。
有料でもかまいませんので何回でも質問ができ、すぐに返答と解説をして頂けるサービスや学習機関がございましたら教えて頂きたく書き込ませてもらいました。
漠然とした質問で申し訳ありませんが今月よりプログラミングの勉強を独学で始めましたが質問できる知り合いもいなく困り果てております。
長文失礼致しました。

589 :デフォルトの名無しさん:2023/11/20(月) 19:07:01.26 ID:UNSN9Hhc.net
>>587
DDEは?

590 :デフォルトの名無しさん:2023/11/21(火) 00:24:28.42 ID:cXhp/VaI.net
C/C++ はポインターがあるから、ややこしい。
10年やっても無理

Ruby をやれ。
半年で、Ruby on Rails も出来る

591 :デフォルトの名無しさん:2023/11/21(火) 11:11:38.44 ID:HSO31doi.net
神社code

592 :デフォルトの名無しさん:2023/11/21(火) 14:22:46.70 ID:tYm3I+7J.net
ポインターが分からない奴は
プログラムを組む資格がない

593 :はちみつ餃子 :2023/11/21(火) 17:27:32.66 ID:4ADiN9xr.net
ちゃんとした本があれば独学でそんなに困らないと思うけどな。
入門書の各章をじっくり読んで理解してから次の章に進むみたいな学習法をしているなら
詰まったときにどうしていいかわからなくなりがちなのでやめたほうがいいと思う。
色んな要素が相互に絡むので順番通りに学べるようなものじゃないから。

理解できなくてもたくさん詰め込んでいけばその内に繋がりがわかってくる。
「最初は」熟考しなくてもいい。 入ってない知識が関連するなら考えてもどうせわからん。

594 :デフォルトの名無しさん:2023/11/21(火) 17:38:45.53 ID:oh7zlSJI.net
>>590
ポインタ使わないこともできるのに何言ってんだ
そもそもポインタはノイマンアーキテクチャの基本なのでポインタがわからないというならコンピュータの利点を十分に利用できないということ

595 :デフォルトの名無しさん:2023/11/21(火) 18:05:44.93 ID:tYm3I+7J.net
ポインター: 変数が入っているアドレスの数字
なんも難しいことはない

596 :デフォルトの名無しさん:2023/11/21(火) 18:24:30.60 ID:fyFN08Ef.net
インデックスって言えば分かる?
コンピュータにあるメモリー全体のインデックス番号

597 :デフォルトの名無しさん:2023/11/21(火) 18:35:32.85 ID:Ai4yJ31G.net
俺も最初全然わからなかったけどC言語ポインタ完全制覇のおかげで覚えた

598 :デフォルトの名無しさん:2023/11/21(火) 19:20:18.31 ID:JkIDzJ0A.net
Java や C# にもポインタはあるしポインタを理解できなかったら他の言語も使えないよ
ポインタ自体は難しくないんだけど C/C++ ではポインタ演算できちゃうのが鬼門なんだよね

599 :デフォルトの名無しさん:2023/11/21(火) 20:49:14.51 ID:TIZNoRj+.net
N88-BASICにポインタあったっけ?

600 :デフォルトの名無しさん:2023/11/21(火) 20:53:06.63 ID:TIZNoRj+.net
ポインタの文法なんて入門書には必ず説明があるので直ぐ分かるとして
俺が初期に読んだ数冊の入門書には
それがプログラミングでどう役に立つのかが示されてなくて
悶々としながら読んでいたなぁ

601 :デフォルトの名無しさん:2023/11/21(火) 21:38:13.97 ID:fyFN08Ef.net
ポインターなんて処理が糞遅いCPUをいかに速く動かすかって事以外に意味が無いからなぁ

602 :デフォルトの名無しさん:2023/11/21(火) 23:15:10.49 ID:mJ6deMbY.net
std::string str = "abc";
①str = str + "dd";
②str = "dd" + str;
これらの記述は有効のようです。
①の右辺はstr.operator+("dd");
と解釈でき理解できます。

②の右辺は "dd".operator+(str);
と書きかえるとこれは無効に見えます。

std::stringのoperator+のプロトタイプを調べたところテンプレートが駆使されており私では読めませんでした。

②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。

603 :はちみつ餃子 :2023/11/22(水) 06:21:16.63 ID:xG0rhWaa.net
>>602
非メンバ関数として定義されている。
つまり
str=std::operator+("dd", str);
に相当することをやってる。
メンバ関数として定義すると不都合が起こるから std::complex とかも非破壊的な二項演算子は非メンバ関数として定義するのが通例だよ。

604 :デフォルトの名無しさん:2023/11/23(木) 18:16:14.60 ID:yQq1Seno.net
>>603
本を見直したらfriendにするといい等ありました。

第1引数+第2引数、という記述があり、2個の引数を持つ+演算子関数が定義されている場合はそれが呼び出される決まりになっているのですね?

605 :デフォルトの名無しさん:2023/11/23(木) 18:17:35.84 ID:yQq1Seno.net
stringから離れて一般的な質問です。↑

606 :はちみつ餃子 :2023/11/23(木) 20:11:53.97 ID:V52ACnUy.net
>>604
そう。非メンバ関数として二つの演算子を受けとる operator+ があれば a+b みたいに書いたときに operator+(a,b) に読み替えられると考えてよい。
(全ての演算子を非メンバ関数として定義できるわけではない。)

余談だけど ADL という変な規則があるのは演算子が名前空間修飾できないことに対処する必要があるというのが理由のひとつで、自分が定義するクラスではこれが上手いこと作用するように設計すると便利なこともあるかもね。

607 :はちみつ餃子 :2023/11/23(木) 20:13:30.07 ID:V52ACnUy.net
>>606
間違い。
「二つの演算子」じゃなくて「二つの引数」

608 :デフォルトの名無しさん:2023/11/23(木) 20:15:11.03 ID:0De2U7us.net
最小のサンプルコードを書いて自分で試すと分かるし身につくよ

609 :はちみつ餃子 :2023/11/23(木) 20:49:41.10 ID:V52ACnUy.net
書いてみるというのは賛成。
でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
C++ には未定義とか処理系定義とかがいっぱいあるからテキトーに書いたプログラムの結果が保証された動作とは限らないから。

610 :デフォルトの名無しさん:2023/11/25(土) 11:27:01.67 ID:rcrc48ZO.net
>>609
>でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
横から悪いがこれには反対させてもらう
もちろん動作からの仕様の決めつけは良くないが、人間は学習する動物なので書いて動作を見てこそ上達するんだよ
丸暗記だけで理解したと勘違いしてるやつが昨今多い(そしてそういう奴に限って何も作ってない)ので、そういうのを後押しはしないで欲しい

611 :デフォルトの名無しさん:2023/11/25(土) 11:52:38.86 ID:rcrc48ZO.net
というか、自分の認識の間違いに気づくのもまた書いて試した時だからね(まれにコンパイラのバグだったりもするけど)
人間が頭の中で考えたことなんか穴だらけなんだから書いて試せるなら真っ先に試した方がいい

612 :デフォルトの名無しさん:2023/11/25(土) 12:13:14.81 ID:vlVh3gWj.net
>>610
同意。
処理系依存とか未定義動作なんて中級者以上になってから気にすればいいこと
はじめは手元にある処理系の結果を「正」として学習を進めても問題ないと思う

613 :デフォルトの名無しさん:2023/11/25(土) 12:45:47.67 ID:rKTwm3uz.net
>>593 これ
>>590 しね

614 :デフォルトの名無しさん:2023/11/25(土) 12:47:19.78 ID:rKTwm3uz.net
>>595-596
ポインタ判らんって人はその辺は判ってんだよ
本当に判ってないのはアドレッシングモード

615 :デフォルトの名無しさん:2023/11/25(土) 12:50:17.30 ID:rKTwm3uz.net
>>599
peek poke はあるし変数もあるから
用途という意味でのポインタはある

616 :デフォルトの名無しさん:2023/11/25(土) 12:54:57.59 ID:rKTwm3uz.net
>>610
そうだな
Rust スレにも変なのが粘着してゴリ推ししてて迷惑

617 :はちみつ餃子 ◆8X2XSCHEME :2023/11/25(土) 13:45:51.01 ID:BXmPXb0v.net
>>610
> 書いて動作を見てこそ上達するんだよ

だから書いてみるのは賛成と書いたのだが、何に反対してるんだ?

618 :デフォルトの名無しさん:2023/11/25(土) 13:56:27.70 ID:vlVh3gWj.net
「学んでから確かめるために書く」

↑反対されてるのはここでしょ

これどうなるんだろう?動かしてみよう!なるほどこうなるのか!という学び方でもいいと思う

あなたが言ってるのは「これどうなるんだろう?」ではダメで「こうなるはずだ!」と学んでから動かせってことだよね?
それは初心者には結構むずかしい

619 :はちみつ餃子 :2023/11/25(土) 15:39:30.62 ID:BXmPXb0v.net
>>618
> これどうなるんだろう?動かしてみよう!なるほどこうなるのか!という学び方でもいいと思う

私が言いたいのは推測できるものではないというところが主旨で、
自分が色々やってみたことが不確かな推測であることを認識した上で
きちんとした資料にあたって確かめるという順序でもかまわないとは思うよ。
出来るのならば。
やってない人が多いように私には見えているから否定的に言ってるわけだけど。

> 初心者には結構むずかしい

訓練せずに他のことをしてても出来るようにはならないでしょ。
やらなきゃずっと難しいよ。

C++ は複雑怪奇かつ規格改訂もあるのでベテランでも頻繁に仕様を参照するのが普通なわけで、
資料を参照するのを後回しにするような人間が後にそのような人間に変われるとは思わない。

620 :デフォルトの名無しさん:2023/11/25(土) 16:15:59.30 ID:vlVh3gWj.net
「やってない人が多いように私には見えている」

多くの人が出来てないことを初心者に求めてもねェ

621 :はちみつ餃子 :2023/11/25(土) 16:27:29.63 ID:BXmPXb0v.net
>>620
「推測した後には多くの人が資料を見ること」をやってないという話だぞ。
最初に資料で学ぶ人は体系的な知識が身に付くからそっちがオススメという話だぞ。

622 :デフォルトの名無しさん:2023/11/25(土) 16:42:06.01 ID:vlVh3gWj.net
初心者に対して「言語仕様を推測したりしないように」「学んでから確かめるために書く」って言ってたよね

言語仕様を理解してからコードを書けってことでしょ?

623 :デフォルトの名無しさん:2023/11/25(土) 16:49:08.14 ID:vlVh3gWj.net
>>621
先にも後にも資料(言語仕様)を確認しない人が多いんでしょ
そんな難しいことを初心者にまで要求してどうすんの

624 :はちみつ餃子 :2023/11/25(土) 16:51:46.77 ID:BXmPXb0v.net
>>622
そうだよ。 言語仕様を理解してから書くのが好ましい。

理解する前に色々試すというやり方も許容しなくはないが、
それでも後では資料を見て仕様を理解するという前提があってのもの。
理解する前に色々試すタイプは資料を見なくなりがちという現実があると述べてる。

625 :はちみつ餃子 :2023/11/25(土) 16:55:25.38 ID:BXmPXb0v.net
>>623
「資料」と「仕様」を使い分けて書いてるつもり。
直接に言語仕様を読めとは述べてないよ。

プログラムを書くときは色んな資料を参考にするので
入門書程度すらちゃんと読まない人がやってけると思ってんの?
ってことを言ってる。

626 :デフォルトの名無しさん:2023/11/25(土) 17:00:19.64 ID:vlVh3gWj.net
え? 資料=言語仕様じゃないの?

「言語仕様を推測したりはしないように」って言ってたから言語仕様に関する資料を読んでからコードを書けという意味だと解釈したのだけど

資料=入門書程度なの?
・・・なんか言ってることが変わってきたね?

627 :デフォルトの名無しさん:2023/11/25(土) 17:03:42.33 ID:vlVh3gWj.net
ちなみに「入門書を何冊か買って読みながら進めるといいよ」みたいな書き方だったらこんなに絡んだりしてないからね?

628 :はちみつ餃子 :2023/11/25(土) 17:04:18.21 ID:BXmPXb0v.net
>>626
いや、そりゃそうでしょ。 最初から言語仕様を読めとか言わないよ。
入門書だって仕様書に基づいて書いてるし、基づいてない入門書だったらクソってだけ。

629 :611:2023/11/25(土) 17:06:46.45 ID:5Y+f+Y1g.net
>>620
これをやってきたのがはちみつ餃子なんだよ
俺ははちみつ餃子の書き込みにいつも感心してるよ

630 :デフォルトの名無しさん:2023/11/25(土) 17:09:19.28 ID:rcrc48ZO.net
>言ってることが変わってきた
うん、まぁ、はちみつはそういうとこあるから・・・w
ただまぁ、言語仕様に詳しい人の存在は(はちみつに限らず)非常に有難いんだが、
実際にソフト書く上で気にしなきゃいけないのは言語仕様だけじゃない
特定のソフトの個別の問題を解決するためのアルゴリズムについて、資料があるのか?と。(すでに出来上がってて公開されてるアルゴリズムが存在する問題などほとんど無い)
一番大事なのは論理的思考力であって、なんでもはなから資料をアテにしてたら逆にそれが身につかないよ

631 :デフォルトの名無しさん:2023/11/25(土) 17:12:35.76 ID:vlVh3gWj.net
>>628
だとしたら、言語仕様を推測するな、未定義動作や処理系がどーのこーのとずいぶんと遠回しな言い方をしたねえ
入門書を読みといいよの一言で済むのに

>>629
それは別の話。餃子がエキスパートであることは否定してない
初心者の前に高いハードルを立ててC++を聖域みたいにするのはやめて欲しいのだ

632 :デフォルトの名無しさん:2023/11/25(土) 17:13:52.19 ID:rcrc48ZO.net
どうも仕様オタク(言い方は悪いが、アマチュアという意味も込めて)な人達は、自分の知ってる世界が全てだと思い込んでるようで前々から問題だと思ってた
世の中、マイナーなAPIとかになると嘘を書いてることもあるし何も資料が無いことすらある

もちろん実際の動作から「今わかること以上」をわかった気になる(仕様を知った気になる)のは問題だが、
逆に言えば「仕様がこうだから間違ってないんだ」などと動作を確かめもせずに決めつけるのも問題だ
そういうのは結局本人の心的態度の問題に過ぎない

633 :はちみつ餃子 :2023/11/25(土) 17:15:51.23 ID:BXmPXb0v.net
アルゴリズムは考えればわかることもあるかもしれんが、言語仕様は考えたってわからんし。
(想像はつくことも多いけど。)

634 :デフォルトの名無しさん:2023/11/25(土) 17:17:15.50 ID:mGx3DnG8.net
> 書いてみるというのは賛成。
初心者はこれでもいい

> でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
中級者以上になって言語仕様等に踏み込んだ学習をしようとするなら書いたもので仕様を測るのではなく「学んで」知るべし

と言う意味だと俺は>>609を解釈してた

635 :はちみつ餃子 :2023/11/25(土) 17:21:04.72 ID:BXmPXb0v.net
>>631
複雑難解な C++ を試させるのがハードルの低い方法だと主張したいわけ?
きちんと整備された学習ルートがあるという話なのにそれでハードルを上げてるとか言われるのは心外だわ。

636 :デフォルトの名無しさん:2023/11/25(土) 17:24:19.67 ID:vlVh3gWj.net
「きちんと整備された学習ルートがあるという話なのに」

お前そんな話してたか?

637 :デフォルトの名無しさん:2023/11/25(土) 17:24:48.18 ID:mGx3DnG8.net
あれよな
・初心者スレだからアドバイスはすべて「初心者向けの内容」
・初心者スレだけどアドバイスは「初心者向けの内容」と「その先を見据えた内容」

はちみつ大先生は後者だけど、ツッコミを入れたほうは前者で読み取っているから噛み合わないってだけよな、たぶん

638 :はちみつ餃子 :2023/11/25(土) 17:26:03.64 ID:BXmPXb0v.net
>>636
まずは資料を読め (資料があるから) という主張を最初からしてるつもりだが。

639 :デフォルトの名無しさん:2023/11/25(土) 17:34:11.58 ID:xBFezCRv.net
「C++言語リファレンスを頭に叩き込め!!話はそれからだ」
でいいんじゃね?と俺は思っている
で、理解できない部分は入門書やサンプルコードを読んで理解する

まずは書いて試せという人もいるが俺はこの意見には賛同できない
プログラミング言語というのは日本語や英語などの自然言語と違って
少しでも間違えたら動かないし、C++の場合なら最悪システムが破壊される
理解できなくても動けばいいなどという考えの奴がいるからバグが量産されるのだ

ミスが許されないのはたとえば医者だな
医者は医者になる前に知識を詰め込むのが普通だ
知識もないのに外科手術をしたらどうなるか?
切りながら覚えろというのか?
プログラミングは手術と同様、まずは知識、次に技術が必要となる、と俺は思っている

【完】

640 :はちみつ餃子 :2023/11/25(土) 17:40:31.27 ID:BXmPXb0v.net
>>637
初心者教育は二種類に大別されると思っていて、たとえば公立学校の授業でするような
興味がない層も含めて最低限の知識は与える教育と
学ぶ意欲があって専門知識と言えるようなものを身に付けようとする者に対する教育。

前者は「興味をひく」というところから考えないといけない。
理屈よりも楽しいと思えるようなやり方が必要になることもあるだろう。

後者は理屈を避けては通れない。
理屈の身に付け方には色んな方法論があるかもしれないけど
まずは書いてあるものを読め
(先人がそれを良いやり方だと思ってまとめてくれたんだから!
手を動かす必要があると思うところでは演習問題があったりもする)
という風に考えてる。

今は初心者であるかどうかは重要ではなく
ここで相談するような層は後者のルートのつもりでいると私は思って書いてる。

641 :デフォルトの名無しさん:2023/11/25(土) 17:45:56.52 ID:Xpg7OWMd.net
>>639
>理解できなくても動けばいいなどという考えの奴
誰の話?

642 :デフォルトの名無しさん:2023/11/25(土) 18:21:13.32 ID:xBFezCRv.net
>>641
わからないか…かわいそうに…
教えてあげなぁぁい

643 :デフォルトの名無しさん:2023/11/25(土) 18:24:14.13 ID:0MoP1N3f.net
おちんちん舐めてごらん

644 :デフォルトの名無しさん:2023/11/26(日) 10:58:08.83 ID:d/KzVdDP.net
>>625
最近ChatGPTに全部聴いて済ます変なのが住み着いて迷惑だな

645 :デフォルトの名無しさん:2023/11/26(日) 11:15:51.84 ID:d/KzVdDP.net
>>639
>医者は医者になる前に知識を詰め込むのが普通だ
>知識もないのに外科手術をしたらどうなるか?
>切りながら覚えろというのか?

言いたいことは判るが「最初の医者」はどうしてたんだろうな
君の言ってるやり方は「従順な職人」を育てるやり方としては正しいが
クリエイターを育てることは出来ない

646 :デフォルトの名無しさん:2023/11/26(日) 12:24:07.96 ID:t0WQFMSf.net
>>639からの>>642だからな
一見それっぽいこと言ってるようで全く中身の無い事を言うアホが長いこと住み着いてる(C++系だけなのか他もなのか)
突っ込まれると頭悪い煽り方しかしてこないからすぐわかる、玄人ぶりたいだけのアホだから相手しない方がいい

647 :デフォルトの名無しさん:2023/11/26(日) 12:37:18.37 ID:DTfcWvWZ.net
医者の下りはおかしい
医師は残念ながら完全な医学的知識を身に着けて
外科手術に臨む訳じゃないぞ
語弊を恐れなければ「切りながら覚える」側面もある

648 :はちみつ餃子 :2023/11/26(日) 12:54:38.94 ID:k38CbPq9.net
ちゃんとした資料で学んでないと用語が無茶苦茶だから
何を言ってるんだかわからないということが起こる。
言語仕様の理解が結果的に正しくてもそうでなくても。
「伝わればいいだろ!」みたいに言う人が結構いるんだけど伝わらないから困るんだ。

メンバ関数をメソッドと言ったりするのは誤解の余地はそんなにないと思ってたら
非メンバ関数もメソッドと言っている例を観測したことがあるし、
子クラスって派生クラスの意味で言ってるんだよな?
と思ってよく確認したら入れ子になったクラス (nested class) だったりするし、
クラス変数は静的データメンバの意味だろう (Ruby とかにはそういう用語があるし) と思ったら
静的でないデータメンバのことを言ってたというオチもある。
結果的に正しく使ってる場面ですら本当にその意味で言ってるのか疑わしくなる。

経験や感覚で書けるようになったとしても
まともな資料を読んでないというのはそういった形でコミュニティ内で有害なわけで
たまには思い違いがあるのはしょうがないが
学んでないし学ぶ気もないのを良しとは言えないよ。

649 :デフォルトの名無しさん:2023/11/26(日) 13:47:17.98 ID:t0WQFMSf.net
>>648
いい加減にしろよ
お前何でそんな上からなの?

650 :はちみつ餃子 :2023/11/26(日) 14:18:15.64 ID:k38CbPq9.net
>>649
伝えようとしない態度を批判してるところに対して伝わらないことを書くのやめろよ。
何が言いたいんだ?

651 :デフォルトの名無しさん:2023/11/26(日) 14:34:29.20 ID:mssmbX4x.net
自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ

ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって
C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね
C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。

荒らす気は無いのでこれで終わりにする

652 :はちみつ餃子 :2023/11/26(日) 14:42:52.42 ID:k38CbPq9.net
完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。
書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?

653 :はちみつ餃子 :2023/11/26(日) 14:55:17.55 ID:k38CbPq9.net
資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ?
学校だって座学でやったことを演習で実践してるだろう。

654 :デフォルトの名無しさん:2023/11/26(日) 15:50:55.41 ID:DTfcWvWZ.net
気にするなってほぼ嫉妬なんだから

655 :デフォルトの名無しさん:2023/11/26(日) 16:03:14.03 ID:t0WQFMSf.net
>ほぼ嫉妬
俺に言ってんの?
いずれにせよ荒らそうとしてる自覚はあるか?

656 :デフォルトの名無しさん:2023/11/26(日) 16:08:02.37 ID:Dy8SO9u0.net
>>655
どう考えてもお前が荒らしじゃん
人のことをアホ呼ばわりしてるし

657 :デフォルトの名無しさん:2023/11/26(日) 16:22:42.40 ID:t0WQFMSf.net
>>639=645=659 バレバレだからwww

658 :デフォルトの名無しさん:2023/11/26(日) 18:08:35.12 ID:fCQnoW9K.net
>>652
言語仕様・未定義動作・処理系とか言ってたから完璧に把握しろに近いニュアンスだと感じた
メソッドではなくメンバ関数、用語を正しくつかわないと伝わらないとか言ってることがどんどん変わってる

659 :デフォルトの名無しさん:2023/11/26(日) 18:08:55.12 ID:4RSi5A29.net
お取り込み中すみませんが質問です
ダウンキャストという用語が是か非かです

ボクは不適切な用語だと思っていて
理由は
1) 言語の仕様に出てきていない
2) アップかダウンかについてももちろん仕様に無い
3) アップキャスト相当の操作は通常行わない
です

少なくともC++界隈でちゃんとした定義なんて出てこないですよね?

660 :はちみつ餃子 :2023/11/26(日) 20:14:28.93 ID:k38CbPq9.net
>>659
仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
原則としては C++ 用語ではないと考えて良いと思う。
クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
方向をアップ/ダウンで言うのもおかしな話だし。

derived-to-base convertion というような用語は仕様書の文面にもあるので
アップキャストに相当するのはこの用語のはずだけど
base-to-derived convertion という用語は出てこないので
ダウンキャストに相当する直接の用語はなさそう。
冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。

ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。
to が脱落したらだいぶん雰囲気が変わってしまうでないの。
これは真似しないほうがいいかもね。

ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも
アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので
なんだかんだで一語で表せるってのは便利なんだと思う。
私は使わないようにしているけど。

661 :はちみつ餃子 :2023/11/26(日) 20:20:37.65 ID:k38CbPq9.net
すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。

662 :デフォルトの名無しさん:2023/11/26(日) 20:28:40.49 ID:4RSi5A29.net
レスサンクス
お手数おかけして痛み入ります

> 3) アップキャスト相当の操作は通常行わない

B *b = (B *)d; // もしもこれが必要な世界だったら
使い分ける?ための用語が欲しくなるのはまだわかるけど
D *d = (D *)b; // こっち方向にしかキャストしないんだから
区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない

…とはいえボクがいくらこう考えても
みんながそうじゃないから蔓延ってるわけで

> 私は使わないようにしているけど。

その一言で何か救われた気分になりました

663 :デフォルトの名無しさん:2023/11/26(日) 20:32:07.21 ID:4RSi5A29.net
一応補足

> B *b = (B *)d; // もしもこれが必要な世界だったら

B *b = d; // こう書くだけじゃ許されなくて

664 :デフォルトの名無しさん:2023/11/26(日) 20:37:16.38 ID:Dy8SO9u0.net
ダウンキャストって言葉は普通に使われてると思うが…
日本語版のウィキペディアなら

C++ - Wikipedia
https://ja.wikipedia.org/wiki/C%2B%2B
に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある

英語版ウィキペディアなら
Downcasting - Wikipedia
https://en.wikipedia.org/wiki/Downcasting

マイクロソフトのリファレンスなら
dynamic_cast 演算子 | Microsoft Learn
https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator
にアップキャストとダウンキャストのことが書かれてる

665 :デフォルトの名無しさん:2023/11/26(日) 20:47:28.85 ID:4RSi5A29.net
rustに至っては嘆かわしいことに
https://doc.rust-lang.org/std/any/trait.Any.html
> pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any,

上記トレイトのメソッド名に採用されている
あー虚しい
あーヤダヤダ

666 :デフォルトの名無しさん:2023/11/26(日) 20:59:53.00 ID:mssmbX4x.net
>>664
使われてるけど規格に定義があるような正式な用語ではないってことだろ

667 :はちみつ餃子 :2023/11/26(日) 21:20:56.75 ID:k38CbPq9.net
>>662
むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。
ポインタを経由せずに値を直接キャストすることもありうるし
参照の場合かもしれない。

class foo {};
struct bar : public foo {};

int main() {
auto a = bar();
// bar から foo へのアップキャストってどれのこと?
auto b = static_cast<foo>(a);
auto c = static_cast<foo *>(&a);
auto &d = static_cast<foo &>(a);
}

668 :デフォルトの名無しさん:2023/11/26(日) 21:48:36.05 ID:Dy8SO9u0.net
>>666
一応マイクロソフトのリファレンスは正式だと思うが
まあマイクロソフト独自の規格ってなるのだろうけどな
あんなもんは認めないというのなら仕方あるまい

669 :デフォルトの名無しさん:2023/11/26(日) 21:52:47.74 ID:DTfcWvWZ.net
>>660
>仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
>原則としては C++ 用語ではないと考えて良いと思う。
>クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
>方向をアップ/ダウンで言うのもおかしな話だし。
upcastとdowncastって一般名詞なのではないかな?

670 :デフォルトの名無しさん:2023/11/26(日) 21:57:36.24 ID:mssmbX4x.net
>>668
デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない

671 :デフォルトの名無しさん:2023/11/26(日) 22:15:54.01 ID:Dy8SO9u0.net
>>670
デファクトスタンダード
それだ

大正解

672 :はちみつ餃子 ◆8X2XSCHEME :2023/11/26(日) 23:34:44.38 ID:k38CbPq9.net
言語仕様の説明をするときには >>667 のようなバリエーションの内のどれのことを言っているかで
事情が変わってくるので結局は具体的な場合を示さなければならず、
「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。
(より詳細な場合分けをするので用語を使う機会がない。)

逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは
充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。

どうせ説明を付け足すなら用語の甲斐がないので
使う意味もそんなにないように思う。

念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので
そうではない状況で文脈を共有できていて
「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。

673 :デフォルトの名無しさん:2023/11/27(月) 04:54:45.36 ID:tiJqQBXv.net
オナニー解答

674 :デフォルトの名無しさん:2023/11/27(月) 08:10:08.19 ID:8c8BDf1i.net
相変わらずはちみちはめんどくせーな

675 :デフォルトの名無しさん:2023/11/27(月) 09:35:39.43 ID:7/k6/GSg.net
>>648
違う言語で比較するときはそういう用語の使い方になるケースが多いと感じる
「學んでいない」のとはまた別の問題だと思う

676 :デフォルトの名無しさん:2023/11/27(月) 09:39:16.20 ID:7/k6/GSg.net
>>653
あいつは學校行ってないかも知れないな
なんでも試行錯誤で
挙句ChatGPTが完璧に教えてくれると勘違いしている
救えない

677 :デフォルトの名無しさん:2023/11/27(月) 09:41:27.50 ID:7/k6/GSg.net
>>659
「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される

678 :デフォルトの名無しさん:2023/11/27(月) 09:52:51.04 ID:7/k6/GSg.net
>>672-674
アスペ臭を感じる

679 :デフォルトの名無しさん:2023/11/27(月) 14:40:19.25 ID:UqO8a829.net
アスペルガー症候群だって良いじゃないか?
何で差別的なことを書くのかね?

680 :デフォルトの名無しさん:2023/11/28(火) 00:01:54.69 ID:5UazaCro.net
クラス内からのみ参照する定数配列のベストな書き方を模索しています。

まず
1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。

2、staticメンバにする方法。
.h
static const int TABLE[3];
.cpp
const int TABLE[3]={1,2,3};

エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。

3、cppにのみに書きhには書かない。
.cpp
const int TABLE[3]={1,2,3};
エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる?

名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。

constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。

681 :デフォルトの名無しさん:2023/11/28(火) 00:04:59.65 ID:5UazaCro.net
2のcppは

const int クラス名::TABLE[3]={1,2,3};

も試したはずですがエラー解消しませんでした。

682 :デフォルトの名無しさん:2023/11/28(火) 00:37:23.98 ID:dISnZSIc.net
2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか
あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)

683 :デフォルトの名無しさん:2023/11/28(火) 01:08:09.85 ID:dISnZSIc.net
あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合

684 :デフォルトの名無しさん:2023/11/28(火) 06:02:30.27 ID:fb4KLmhh.net
2、staticメンバにする方法。
.h
static const int TABLE[3]={1,2,3};
.cpp
extern const int TABLE[3];

もれはやらんけど

685 :デフォルトの名無しさん:2023/11/28(火) 06:13:38.37 ID:fb4KLmhh.net
あ、ごめん逆だった
.cpp
static const int TABLE[3]={1,2,3};
.h
extern const int TABLE[3];

686 :デフォルトの名無しさん:2023/11/28(火) 10:21:56.36 ID:tbacT9e+.net
>>681
これは通るだろ? コンパイラは何よ?

687 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 10:25:57.66 ID:mRTkdYl9.net
>>681
出来なかったというコードをそのまま提示して欲しい。
状況がよくわからないのに想像で対処法を考えてもしょうがない。
コードがちょっと長くなるなら
codetter とか wandbox とか ideone とかを使って。

688 :デフォルトの名無しさん:2023/11/28(火) 10:27:57.27 ID:vcMwjchf.net
クラス内の定数を外部に生出しとかしないから
enunとかで宣言はするけど
何番目が欲しいとかはサービス関数作るしなぁ

689 :デフォルトの名無しさん:2023/11/28(火) 10:30:15.59 ID:vcMwjchf.net
つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?

690 :デフォルトの名無しさん:2023/11/28(火) 10:32:49.40 ID:vcMwjchf.net
ヘッダーファイルはクラスコードの名刺みたいなもんで
外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ

691 :デフォルトの名無しさん:2023/11/28(火) 10:35:09.02 ID:vcMwjchf.net
マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな

692 :デフォルトの名無しさん:2023/11/28(火) 11:07:40.67 ID:t7+ip2Xg.net
>>689
staticには複数の意味がある

>>680 の発想は h に static 描いてみたら「たまたま」エラーが消えたら ok みたいなやり方なんだろ

693 :デフォルトの名無しさん:2023/11/28(火) 11:35:51.07 ID:vcMwjchf.net
>>692
staticより「内部でしか使わない」って話の方を拾ってね

694 :デフォルトの名無しさん:2023/11/28(火) 12:43:41.53 ID:dISnZSIc.net
>>693
質問者は「クラス内からのみ参照する」って言ってただろ

695 :デフォルトの名無しさん:2023/11/28(火) 18:17:05.00 ID:vcMwjchf.net
>>694
それならヘッダーファイルに書く必要無いやんけw

696 :デフォルトの名無しさん:2023/11/28(火) 18:50:50.78 ID:dISnZSIc.net
そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね

697 :デフォルトの名無しさん:2023/11/28(火) 20:09:09.84 ID:vcMwjchf.net
そんな巨大なクラスは設計が間違ってないか?

698 :デフォルトの名無しさん:2023/11/28(火) 20:12:44.23 ID:bqHRuT95.net
>>677
> 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される

それなw
初心者ほどこの用語を使ってるように見える
初心者が集まるところでこれを流布してるやつがおるんやろな
ポインタへのポインタっていうスケーラブルな定義が理解できてなくて
アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな

699 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 20:20:10.37 ID:mRTkdYl9.net
>>697
この >>696 の言は逆のことを言ってると思う。
ひとつの翻訳単位にたくさんのクラス (の実装部分) を書くこともあるから
ファイルスコープにしたらスコープの範囲が広すぎる (制限にならん) やんけと言ってるように読める。

700 :デフォルトの名無しさん:2023/11/28(火) 20:27:35.33 ID:dISnZSIc.net
>>697
巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど)
例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる
そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ

701 :デフォルトの名無しさん:2023/11/28(火) 20:29:47.21 ID:dISnZSIc.net
>>699
もちろんそれもある

702 :デフォルトの名無しさん:2023/11/28(火) 20:57:18.00 ID:dISnZSIc.net
まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス

703 :デフォルトの名無しさん:2023/11/28(火) 21:00:29.03 ID:HOP5xTTo.net
>例えばクラステンプレートになると、ソースに実装を書けないから

C++の設計ミスだな
特にテンプレ

704 :デフォルトの名無しさん:2023/11/28(火) 21:55:43.79 ID:vcMwjchf.net
テンプレートは単なる#defineだからなぁ
あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ

705 :はちみつ餃子 :2023/11/28(火) 22:43:12.61 ID:mRTkdYl9.net
一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。
従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。
コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。

706 :デフォルトの名無しさん:2023/11/28(火) 23:00:59.77 ID:5UazaCro.net
どうも>>680です。
2のクラス名あり版でビルド通りました。

-sample.h
class sample_1 {
int a;
static const int TBL[3];
public:
sample_1();
};

-sample.cpp
#include "sample.h"
#include <iostream>

const int sample_1::TBL[3] = {1,2,3};

sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}

-main.cpp
#include <iostream>
#include "sample.h"

int main() {

sample_1 sa;
return 0;
}

707 :デフォルトの名無しさん:2023/11/28(火) 23:06:12.31 ID:5UazaCro.net
sample.hにTBL宣言なしで、

sample.cpp
#include "sample.h"
#include <iostream>

static const int TBL[3] = {1,2,3};

sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}

でもOKでした。こちらのstaticはC式の使い方ですね。

私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。

708 :デフォルトの名無しさん:2023/11/28(火) 23:19:21.29 ID:dISnZSIc.net
解決おめ、自分の用途に合うと感じるならそれがベストと思うよ

709 :デフォルトの名無しさん:2023/11/29(水) 06:23:02.71 ID:n75oaT1g.net
h に static 描くと単に相互干渉しないってだけで
インスタンスは造られまくって無駄リソース出まくるんじゃね

710 :デフォルトの名無しさん:2023/11/29(水) 09:24:39.36 ID:5+1qDy8t.net
奴は人の書き込み見ちゃいないよw

711 :デフォルトの名無しさん:2023/11/30(木) 22:28:52.60 ID:p6G1t8dm.net
sizeof(クラス名)を活用できる場面はありますか。
メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、
クラス一般について考えると思いつきません。

たとえば
std::string name;
がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。

712 :デフォルトの名無しさん:2023/11/30(木) 22:39:03.15 ID:jq+Wc58z.net
>>711
>std::string name;
>がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
確認してみましょう!

713 :はちみつ餃子 ◆8X2XSCHEME :2023/11/30(木) 23:39:52.07 ID:3QI4e6Tt.net
>>711
sizeof 演算子の適用結果は定数であることが保証される。
定数式として使うことができる。
std::string なども型の大きさが変動したりはしない。

C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。
(実際には処理系の拡張として VLA を使える場合もある。)

メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。
それほど機会は多くないだろうけど。

本来 (?) の用途とは違うところで使われる場合もあって、
いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。

714 :デフォルトの名無しさん:2023/11/30(木) 23:55:15.59 ID:p6G1t8dm.net
>>713
高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。

715 :デフォルトの名無しさん:2023/12/01(金) 10:06:48.86 ID:NZuUNSBe.net
おまえら、stdとboostどう使い分けてる?

716 :デフォルトの名無しさん:2023/12/01(金) 13:58:15.55 ID:aU4DjGEJ.net
>>714
stringも実際には確保したメモリのポインタと文字列サイズを持ってるだけ(だけではないけど簡単に言えば)なので
Cの構造体と大して変わらんのよ

717 :デフォルトの名無しさん:2023/12/02(土) 07:29:47.55 ID:qIqFVuKn.net
まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。

暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。

どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。
暗号化等には既製ライブラリ使います。

718 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 09:03:43.92 ID:w8ZlbPjQ.net
>>717
設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。
というよりも継承を使うほうが悪い。
「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。

プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?

719 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 11:45:21.73 ID:w8ZlbPjQ.net
他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。
極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。
自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。

720 :デフォルトの名無しさん:2023/12/02(土) 12:16:48.61 ID:0tC7Yjqi.net
sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて
書き込むとき勝手に暗号化してくれると有難いな

721 :デフォルトの名無しさん:2023/12/02(土) 13:25:55.77 ID:JgaBxQHi.net
ここはプログラム技術板だぞ 自分で作れ

722 :デフォルトの名無しさん:2023/12/03(日) 06:49:36.39 ID:xZHPSaOR.net
このスレはC++の話ではない書き込みが多すぎる

723 :デフォルトの名無しさん:2023/12/03(日) 11:07:00.27 ID:QTewqrs7.net
C++の守備範囲が広いんよ

724 :デフォルトの名無しさん:2023/12/03(日) 21:36:41.23 ID:kkqQUehZ.net
>>718
ありがとう。
非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。
string 暗号化(鍵, 平文);
だけあれば十分だと。

725 :デフォルトの名無しさん:2023/12/04(月) 21:09:04.65 ID:wzr7hFvb.net
msys2で開発環境を作りたくて
Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして
g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが
std::ifstream ifs("hoge.txt");
のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。
fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。
どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?

726 :デフォルトの名無しさん:2023/12/04(月) 22:11:21.42 ID:+6ZMbPCa.net
エラーメッセージは?

727 :はちみつ餃子 ◆8X2XSCHEME :2023/12/05(火) 00:16:37.88 ID:z5PiblaY.net
msys2 環境は数種類のモードがあるはずだがどれで起動した?

728 :デフォルトの名無しさん:2023/12/05(火) 04:57:07.09 ID:DXGBHl1O.net
実行ファイルの場所がカレントになってないんだろ
getcwd()してみ

729 :728:2023/12/12(火) 14:02:16.36 ID:haJQSzRG.net
エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが
今回は>>728さんの言う通りになっていて解決できました
まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します
ありがとうございました!

730 :デフォルトの名無しさん:2023/12/12(火) 15:14:22.81 ID:bMo3JLCK.net
GUIから起動するとカレントディレクトリがホームになるんだったっけ?

731 :デフォルトの名無しさん:2023/12/13(水) 15:23:50.85 ID:Xh1qTD5r.net
OSの事情でカレントが簡単に移動してしまうのがめんどいな

732 :デフォルトの名無しさん:2023/12/13(水) 16:17:33.78 ID:b3+IUHNQ.net
プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね

733 :はちみつ餃子 ◆8X2XSCHEME :2023/12/13(水) 17:12:54.61 ID:vPv7AHCs.net
設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。
アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。
逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。
Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。

734 :デフォルトの名無しさん:2023/12/13(水) 17:14:51.41 ID:Xh1qTD5r.net
起動時の引数や 自分のフルパスを取得するAPI経由で
実行ファイルのある場所を基点にどうこうすることが多いわ (Windows

unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか
起動時のカレントのまま?

735 :デフォルトの名無しさん:2023/12/13(水) 17:20:10.83 ID:b3+IUHNQ.net
>>733
それはインストーラー使うアプリでしょ?
XCOPYインストールアプリの話だよ

736 :デフォルトの名無しさん:2023/12/13(水) 17:23:03.86 ID:HyXW4bJ5.net
カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ?
ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?

737 :はちみつ餃子 :2023/12/13(水) 18:03:20.75 ID:vPv7AHCs.net
>>736
基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。
scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。
Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。

738 :デフォルトの名無しさん:2023/12/13(水) 23:12:49.25 ID:zjCiNOvz.net
グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。
仕様ではmain前に実行ということのほかに何か規定はありますか。

ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。

739 :はちみつ餃子 ◆8X2XSCHEME :2023/12/14(木) 00:23:02.09 ID:GWgG2Hfk.net
>>738
ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。

・ 定数初期化が終わってから動的初期化がされる
・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい)
・ 翻訳単位内の初期化順序は定義が現れた順序
・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない

特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、
強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。

740 :デフォルトの名無しさん:2023/12/14(木) 01:04:36.74 ID:X6Ol8Z5z.net
普通は、WSL2 でLinux を使う

MSYS2/MinGW の利点は、
hypervisor で、2つのOS を起動しないから軽い

WSL2 では、Linux側から、Windows 側のアプリも起動できる。
ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける

例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む

/mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ

出力
d----- 2015/10/13 13:52 クイズ

VSCode の拡張機能・Code Runner は、
右クリックメニューから、選択したコード、またはファイル全体を実行する

この設定をチェックしておく
Code-runner: File Directory As Cwd
Whether to use the directory of the file to be executed as the working directory.

そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、
そのファイルをコンパイルして実行する

設定項目、executorMap には、多くの言語の実行コマンドが書いてある。
"code-runner.executorMap": {

"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",

741 :デフォルトの名無しさん:2023/12/31(日) 22:48:46.98 ID:tpduSr4A.net
相談室から誘導されたのでこちらで
http://mevius.5ch.net/test/read.cgi/tech/1698705458/104

buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?

742 :デフォルトの名無しさん:2024/01/01(月) 01:29:30.25 ID:/rCM9JK/.net
このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw

743 :デフォルトの名無しさん:2024/01/02(火) 11:00:49.80 ID:TDOOgc4U.net
ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる
有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか

744 :デフォルトの名無しさん:2024/01/02(火) 20:21:16.21 ID:G9bvfkvl.net
>>743
頭の出来で決まっているからね

義務教育レベルで脱落した人間、日本語能力に問題がある人間は、プログラマーとしても問題がある。

745 :はちみつ餃子 :2024/01/02(火) 21:40:20.68 ID:RkRzwbey.net
知識は入れないと増えないというすごく当たり前の話。
長く放置してたら勝手に増えるなんてことはないよ。

746 :デフォルトの名無しさん:2024/01/03(水) 08:18:02.54 ID:3n4RUKo6.net
ガキの頃からマイコンBASICマガジン見てたけど
PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな

747 :デフォルトの名無しさん:2024/01/03(水) 08:26:31.48 ID:uKn1SmuA.net
糞コテが

748 :デフォルトの名無しさん:2024/01/03(水) 13:07:46.32 ID:3mJitcl/.net
>>746
SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?

749 :デフォルトの名無しさん:2024/01/03(水) 13:17:11.92 ID:SgwYv7hO.net
ポケコン触ってたころが一番楽しかったです
手の中に物理キーボードと実行環境があるんだもん
一生遊べるよ

750 :デフォルトの名無しさん:2024/01/03(水) 14:56:53.56 ID:giTORTIB.net
>>741
memcpyでなくちゃんとplacement newでコピーorムーブコンストラクタ走らせればいんじゃね?

751 :デフォルトの名無しさん:2024/01/10(水) 03:00:04.91 ID:lNNg6PiH.net
Class Hogeの中でたくさんのFugaを管理するために
std::vector<std::unique_ptr<Fuga>>というメンバ変数を作りました
可変長引数テンプレートで複数のstd::unique_ptr<Fuga>を受け取るコンストラクタを書こうとしたのですが
std::unique_ptrがコピー禁止のためうまくいきませんでした。
Hoge(Args&&... args)
という形で右辺値参照を受け取ってうまいことムーブしてClass Hogeを初期化する方法ってありますか?

752 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 04:36:30.64 ID:BOjhYgCx.net
>>751
できると思うけど、何をやりたくて何が上手くいかなかったのかイマイチわからない。
出来なかったコードをみせて。

753 :デフォルトの名無しさん:2024/01/10(水) 11:27:22.10 ID:lNNg6PiH.net
>>752
class Fuga
{
int placeholder;
};
class Hoge
{
public:
std::vector<std::unique_ptr<Fuga> > vec;
template<class... Args>
Hoge(Args... args)
{
vec = {args...};
}
};
int main()
{
/*Fugaを何個か作成*/
auto p1 = std::make_unique<Fuga>();
auto p2 = std::make_unique<Fuga>();
auto p3 = std::make_unique<Fuga>();
/* 中略 色々処理
処理が終わったらHogeの中にFugaをまとめて放り込みたい*/
Hoge hoge(p1,p2,p3);
}

こういうものを書いたらunique_ptrがコピー禁止でエラーになったのでムーブにしたいけど書き方がわかりませんでした。

754 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 12:45:18.04 ID:BOjhYgCx.net
>>753
この場合は initializer_list が問題。
initializer_list を経由するとムーブ可能/コピー不可な型を扱えない。
initializer_list を経由しない形にすればよいので要素を emplace_back で
入れる形にするなどの対処法が考えられる。

#include <memory>
#include <vector>

class Fuga {
int placeholder;
};

class Hoge {
public:
std::vector<std::unique_ptr<Fuga> > vec;
template <class... Args>
Hoge(Args&&... args) {
(..., vec.emplace_back(std::forward<Args>(args)));
}
};

int main() {
/*Fugaを何個か作成*/
auto p1 = std::make_unique<Fuga>();
auto p2 = std::make_unique<Fuga>();
auto p3 = std::make_unique<Fuga>();
/* 中略 色々処理 */
// std::move で右辺値にキャスト
Hoge hoge(std::move(p1), std::move(p2), std::move(p3));
}

755 :デフォルトの名無しさん:2024/01/12(金) 09:52:36.06 ID:Umd8uX9b.net
c++で日本語の連想配列ってあります??

756 :デフォルトの名無しさん:2024/01/14(日) 15:30:33.22 ID:O4q5V5KL.net
>>755
std::mapじゃだめなん?

757 :デフォルトの名無しさん:2024/01/16(火) 21:37:05.24 ID:eUaXJLuy.net
>>754
無事に動作させることができました。ありがとうございます!

758 :デフォルトの名無しさん:2024/01/20(土) 18:17:15.80 ID:9qysS+ur.net
時間のかかる処理があり、それが現在のスレッドをブロックして欲しくないので
その処理の部分に関してstd::async()の利用を検討していますが、
これって戻り値(future 型)でモニターしないといけない感じですか?
上記の処理はいつ終わるかは気にしないので別スレッドに投げっぱなし?で構わない
のですが... pthread_detach()的な?

759 :はちみつ餃子 :2024/01/21(日) 12:43:25.73 ID:4rk7TZPC.net
>>758
std::thread のメンバ関数に detach はあるけど、期待するのはこういうこと?

ただ、メインスレッドが終了すれば他のスレッドが稼働中でもプロセス終了処理に入るし、
プロセス終了処理の中で標準ライブラリの後始末している最中に他のスレッドが
標準ライブラリを使うようなことがあると破綻するかもしれない。

強引に終わらせて良いなら std::quick_exit で即死させるという方法も取れるが、
基本的にはプログラムを終わらせるときには全てのスレッドを終了させて (終了を待って) おくのが
普通だと思う。

760 :デフォルトの名無しさん:2024/01/21(日) 21:48:26.38 ID:zlvjOB5M.net
>>758ですが、お返事ありがとうございます。

はい、とりあえず thread::detach() を使うようにしました。1つの疑問は、
https://ja.cppreference.com/w/cpp/thread/future/~future によると
> ただし、その共有状態が std::async によって作成され、まだ準備完了になっておらず、これがその共有状態への最後の参照である場合は、ブロックする可能性があります。

ええ何それ、というのが発端でした(後出し失礼)。

確かに、メインスレッドの終了時のこともありますし、スレッドの後始末をちゃんと
した方が本当はいいように思われます。処理が長時間たっても終了しない場合
タイムアウトさせたりとかも。
何かシステマティックな方法等あるでしょうか。参考になるものがあれば...

761 :はちみつ餃子 :2024/01/22(月) 12:54:36.50 ID:T1sqP3ZB.net
>>760
メインスレッドの終了直前でまずは適当にフラグを立てた上で他のスレッドの終了まで待機する。
重い処理をしているスレッドの側で完了ではないにしても区切り良く終われるポイントでフラグを読んで
フラグが立っていれば後始末ルートに入ってスレッドを終了させる。
その結果としてメインスレッドの待機状態が終わってプロセスの終了。
というのが普通の大まかな流れだと思う。

その上で待機時間があまり長すぎるようだと強引にでも終わらせるとかの処理を入れるかも。

std::async は既存の関数を非同期化するちょっとしたユーティリティという立場なんじゃないかな。
それで事足りるときは便利で簡単だけど、細かい制御を勝手にやってくれるわけでもないし、
やろうとするとちょっとイマイチって感じ。

762 :デフォルトの名無しさん:2024/01/28(日) 11:52:43.80 ID:W0uCnQb3.net
質問なのですがどんな環境(ロケール設定)のPCで動かしても
数値や時刻の入出力を修飾無し(12345 が 12,345 になったりしない)にする完璧な方法って次の3行で良い?
 setlocale(LC_ALL, "");     // printf()、scanf()に反映
 _wsetlocale(LC_ALL, L""); // wprintf()、wscanf()に反映 (※ 環境依存。左記はWindowsの場合
 std::locale::global(std::locale("", std::locale::all));  // cout、wcout、cin、wcin、ostringstream、wostringstream、...etc. C++の全部に反映

あとなんか実験する限り
 cout.imbue(std::locale(""));
 std::locale::global(std::locale("", std::locale::all));
とするとcoutが修飾有りとなり、cout.imbue()で与えた設定をstd::locale::global()が上書きしないように見えるのですがそういうもの?

763 :はちみつ餃子 :2024/01/28(日) 13:12:39.75 ID:hRRbWEE/.net
>>762
言語仕様通りならそれらの関数を呼び出さないようにすれば環境に固有の表現の変換はしない。

std::setlocale の設定が C の標準関数の挙動に影響するのはその通り。
ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。
空の文字列を渡した場合には環境に固有の設定であり、通常はシステムの設定が反映される。
プログラムは起動したときに setlocale(LC_ALL, "C"); 相当の状態なので、普通は書く必要もない。

std::locale::global での設定は C++ の標準ライブラリの挙動に影響するだけでなく std::setlocale での設定にも反映されるので両方を呼び出す必要はない。
これもプログラム起動時のロケール設定は "C" 相当になっているのでそれで良ければ呼び出す必要もない。
ただし、 std::locale::global に与える設定が名前を持たない場合 (つまり std::locale("") のような場合) は std::setlocale 相当の変更もするかどうかは規定されない。

imbue はストリームにロケールを結びつけるのでグローバル設定とは独立して機能する。

764 :デフォルトの名無しさん:2024/01/28(日) 14:11:55.68 ID:eBJAlicu.net
クラスオブジェクトの代入文に、=による単純コピーと、=演算子関数による独自コピーのどちらを使うか迷います。

たとえばメンバ変数が基本データ型の集まりなら単純コピーでいい。
今出くわしたのはメンバ変数がstd::array<int, 3>の場合で、まあたぶん単純コピーでよさそう?じゃあstd::vector<myclass>なら?などと疑問が深まります。

あとコピーコンストラクタによる初期化も合わせて考える必要がありそう。

765 :はちみつ餃子 :2024/01/28(日) 14:36:51.31 ID:hRRbWEE/.net
>>764
単純コピーってのは何のこと?
デフォルトで生成される代入演算子の意味で言ってるのかな?

766 :デフォルトの名無しさん:2024/01/28(日) 15:36:35.20 ID:W0uCnQb3.net
>>763
レス㌧クス、
>ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。
なるほど "C" ですたか、これか↓
https://www.ibm.com/docs/ja/zos/2.2.0?topic=utility-locale-naming-conventions

>普通は書く必要もない。
実はウィンドーズでUnicodeで出力する場合限定かもですだが、ロケール設定しないままだと
日本語OSでも漢字が表示されなかったり(L"Hello World! 漢字" → 表示: Hello World! )
英語OSに持っていったら L"Hello World! 漢字" が丸ごと出なかったり……orz
まあ漢字はこの際どうでも良いので、ロケール設定 "C" で行こうと思いまつ

767 :デフォルトの名無しさん:2024/01/28(日) 16:37:46.15 ID:eBJAlicu.net
>>765
そうです。

768 :はちみつ餃子 :2024/01/28(日) 16:38:46.52 ID:hRRbWEE/.net
>>766
Windows での話か……。
msvcrt だとどうにもならなくて ucrt でちょっとマシになってるみたいな話題をこないだ Teratail で見たぞ。

769 :はちみつ餃子 :2024/01/28(日) 16:52:54.16 ID:hRRbWEE/.net
>>767
デフォルトで生成される代入演算子は全てのサブオブジェクト (基底とデータメンバ) を
代入演算子でコピーするのと同じ挙動になることになってる。
基底やデータメンバが適切に代入演算子を定義されているのならデフォルト生成にまかせてよいことが多い。

注意を払う必要がある典型的なものは生ポインタで、
ポインタをコピーしても指してる先のオブジェクトはひとつだから
そのへんの扱いはデフォルト生成だとあかんことになる。

あとは外部のリソースと結びついているオブジェクトだと単純にコピーできないか、コピーさせないこともあるな。
分かりやすい例で言うなら std::thread なんかはスレッドを抽象化したものだけど
オブジェクトをコピーしたらスレッドもぽんぽん増えるなんてことになっても困るし
スレッドひとつに対応しているオブジェクトがいくつもあるようでも困るのでコピーできないようになってる。

それぞれに事情があるので明瞭な判断基準があるわけじゃないけど、
デフォルト生成の結果がほんまに自分の意図通りに動作するか考えてみて
あかんなら自分で書くしかない。

770 :デフォルトの名無しさん:2024/01/28(日) 17:03:17.17 ID:eBJAlicu.net
>>769
いつもありがとうございます。
たいていはデフォルトでよさそうですね。
std::vectorは可変長配列ってことなので、<int>であってもデフォルトでいいのかなと心配に…あこれはvectorのほうで独自=定義されてるなら問題ないわけですね。

771 :デフォルトの名無しさん:2024/01/30(火) 20:47:22.29 ID:RcbbllHt.net
bだけ通らないのが納得いかない…。

#include<iostream>
#include<functional>

using F = std::function<void()>;
void f0(){}
F f1;

class X {
F f;
public:
X(const F& f_) : f(f_){}
X& operator=(const F& f_){f = f_; return *this;}
};

int main(){
X x1(f0); // a:OK
X x2 = f0; // b:NG(conversion from ‘void()’ to non-scalar type ‘X’ requested)
X x3 = f1; // c:OK
x1 = f0; // d:OK
}

772 :はちみつ餃子 :2024/02/02(金) 00:09:46.55 ID:BQKaaqcl.net
>>771
std::function ではなくごく単純なクラスでもエラーを再現できる。
暗黙の変換は原則としては多段には起こらず、 X→Y, Y→Z な変換が可能なときでも X→Z な変換はしない。 (プリミティブな型変換とクラスの型変換が連鎖することはある。)
以下の例だと X x1(1); という宣言のときに必要な「暗黙の変換」は int から foo という一段のものだけど X x2 = 2; としたときに必要なのは int から X だから一段の変換ではできない。

struct foo {
foo(int x) {}
foo(const foo&) = default;
foo(void) = default;
};

foo f1;

class X {
foo f;

public:
X(const X&) = default;
X(const foo& f_) : f(f_) {}
X& operator=(const foo f_) {
f = f_;
return *this;
}
};

int main() {
X x1(1); // a:OK
X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested)
X x3 = f1; // c:OK
x1 = 3; // d:OK
}

773 :デフォルトの名無しさん:2024/02/02(金) 11:28:24.45 ID:xohFoxUO.net
>>772
横からだけども
> X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested)
って
X x2(2);
と同義じゃねーの?

774 :はちみつ餃子 :2024/02/02(金) 12:19:41.13 ID:BQKaaqcl.net
>>773
違うよ。
C++ では引数ひとつのコンストラクタは変換コンストラクタとして「も」使うことになっているから
違う文脈でも結果的に同じコンストラクタが呼び出されることになるけど
構文糖というわけではなくて違う解釈を経ている。

775 :デフォルトの名無しさん:2024/02/02(金) 12:28:48.56 ID:xohFoxUO.net
細かいなぁ

776 :はちみつ餃子 :2024/02/02(金) 18:32:30.30 ID:ZFQgO+dm.net
動くなら同義と考えても大した問題じゃないが、
ここでは実際に結果が違う (一方はエラーになる) ことの説明だから……

777 :デフォルトの名無しさん:2024/02/02(金) 22:30:30.14 ID:d8Flt8Cn.net
これはなぜエラーになるのですか。
std::string s = "abc";
char name[10] = s.c_str();

error: array must be initialized with a brace-enclosed initializer


次と同等とみなせないのはなぜ?
char name[10] = "abc";

778 :774:2024/02/03(土) 05:00:19.85 ID:vGyzbOvf.net
>>772 774だけどありがとう。暗黙だと変換が途中で途切れるかもなのか。
一番通って欲しいのがbなんだけど難しいっすね…

779 :デフォルトの名無しさん:2024/02/03(土) 05:21:33.46 ID:4Ieoi/Xm.net
>>777
c_str()が返すのはchar*
char name[10] = "abc"; は特別扱いで char name[10] = {'a', 'b', 'c', 0}; と同じ
cの時からある雀の涙猫の額ばかりの文字列サポート

780 :はちみつ餃子 ◆8X2XSCHEME :2024/02/03(土) 08:35:44.53 ID:Sz70frqK.net
>>778
少し表現を変えて良ければ >>771 の X x2 = f0; を
X x2 = {f0}; と書くことでも通すことは出来るよ。

更に真面目に対処するならこんな感じかな。
https://wandbox.org/permlink/giXZnCETo64IkEez

781 :デフォルトの名無しさん:2024/02/03(土) 22:40:06.88 ID:mzdZy5dk.net
>>779
あーそういうことですね。ありがとう。

782 :774:2024/02/04(日) 02:54:38.53 ID:1VXaeA8L.net
>>780 上は={}で通るのは確認してました。{}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか?
下の方、typenameの所は余りよく分からなかったですが強制的に引数の型で包んで(オブジェクト生成?)、コンストラクタの引数代入時に変換追加するということでいいですか?
typename以下はdecltype(f_)((f_))でも良いんかなと思って変更してみたら通りました

783 :はちみつ餃子 :2024/02/04(日) 09:54:01.38 ID:/H29LerN.net
>>782
> {}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか?

いいえ。 直接初期化に該当します。
コピー (コピーコンストラクタの起動) は発生しません。
つまり X x1(f0); と書いた場合と同じということです。
ですから暗黙の変換を一段階すれば充分なのでエラーなく通ります。

> コンストラクタの引数代入時に変換追加するということでいいですか?

いいえ。 何もしません。
コンパイルを通すためには不要ですので、 X のコンストラクタは

template <class T>
X(const T& f_) : f(f_) {}

という定義だけでも問題なく動作します。

ただ、こうすると T は「あらゆる型」になりえます。
std::function<void()> に変換不可能な型も受け入れてしまうということです。
変換不可能であればいずれにしても最終的にはエラーなのですが、
X がデタラメな型も受け入れてから F に変換失敗してエラーになるよりは
特定の条件を満たす型以外を X が拒否するほうが一般的には都合がよいので
そうなるようにしたのです。

コンパイルを通すために必要なのではなく通さないための処置です。

784 :774:2024/02/04(日) 22:33:14.16 ID:1VXaeA8L.net
>>783 上:初期化周りは似たような物が色々あって知識が曖昧でした。
下:あの記述は型制限の為ですか。読んでも意図がよく分からなかったので助かります。
説明ありがとうございました

785 :デフォルトの名無しさん:2024/02/10(土) 13:14:08.12 ID:KJGevrBa.net
質問なのですがstd::coutに対する
 (a) 固定小数点表示
 (b) 小数以下精度指定(例えば20桁
 (c) setw()される表示幅に対し足りない上位桁0埋め
という表示仕様への変更と復旧は、変更が
 auto sv_flags = cout.flags(); cout << std::fixed; // (1)
 auto sv_prec = cout.precision(std::streamsize(20)); // (2)
 auto sv_fill = cout.fill(); cout << std::setfill('0'); // (3)
復旧が
 cout.flags(sv_flags); // (1)の変更から復旧
 cout.precision(sv_prec); // (2)の変更から復旧
 cout << setfill(sv_fill); // (3)の変更から復旧
と書くのが普通?シグネチャが不統一な印象があるますがもっとズバっとやる方法は無いもの?
((1)は変更にcoutのメソッドとマニピュレータが両方要り、復旧はcoutのメソッド。
 (2)は変更も復旧もcoutのメソッドで済む。(3)は変更が(1)と同じパティーンで復旧がマニピュレータ……

786 :はちみつ餃子 :2024/02/10(土) 14:30:14.27 ID:XEL9SE6k.net
>>785
・ 直接的に入出力を司るのはバッファと呼ばれるオブジェクト
  (たとえば basic_streambuf など)
・ ストリームには対応するバッファがセットされている (あまりバッファを直接には操作しない)
・ 書式はストリームの状態として保持されている

つまり同じバッファ (出力先) に対して異なるストリームをかぶせることが出来る。
一時的にだけ書式を変更するのであれば一時的なストリームを作るという方法がとれる。
コードで例を出すならこんな感じ。

#include <iostream>

int main() {
std::cout << 0.1 << std::endl;
{
std::ostream temp(std::cout.rdbuf());
temp.precision(30);
temp << 0.2 << std::endl;
temp << 0.3 << std::endl;
}
std::cout << 0.4 << std::endl;
}

書式をストリームの状態として持つのがすこぶる不格好だというのは
C++er にとっての共通認識になっていてようやく C++23 から std::print が導入されたので
モダンな C++ を使えるならそっちを使ったほうが良い。
std::format なら C++20 から。

787 :デフォルトの名無しさん:2024/02/10(土) 15:00:10.91 ID:KJGevrBa.net
>>786
㌧クスなるほど……
変更した書式の戻し忘れが無く、問題らしい問題点はほぼ無しで良さげ……
(しいて言えばstreamの中の作りを理解していなければtempが何の目的でそうするのかわかりにくい(コメント必須)なだけ、

std::printは手元のVC++がまだC++20対応止まりなので当面見送らざるおえない

std::formatは…… 書式文字列が定数式限定という仕様のはいかがなものか……
今回の用途では困りませんし、コンパイル時に書式の妥当性をチェックしてくれるのは良いのですだが、
仮に、C言語における自作printf()様インターフェースの関数(書式文字列と可変長引数を変数で受け取り、内部でvprintf()を呼ぶ)
みたいなものを作りたくなった場合どうするんじゃとそこはかとなく疑問が……

788 :はちみつ餃子 :2024/02/10(土) 15:16:22.24 ID:XEL9SE6k.net
>>787
実行時バージョンとして std::vformat も用意されている。

789 :デフォルトの名無しさん:2024/02/10(土) 15:25:38.54 ID:KJGevrBa.net
>>788
なるほどなるほど、自作std::format()様関数は問題無く作成でき、
書式文字列が定数式限定が困るというのは杞憂ですたねサーセン;;;
(実行時にならないと書式文字列が決まらない場合、コンパイル時チェックが原理的に不可能になるのはC言語のprintf()/vprintf()の関係も同じなのでC言語からの後退ではない

790 :はちみつ餃子 :2024/02/10(土) 16:29:24.58 ID:XEL9SE6k.net
メンバとして copyfmt があって、これで書式を他のストリームにコピーすることも出来る。
書式を待避しておくだけのストリームを作ってそれにコピーしておいて
後で元に戻すという使い方をしてもいいんだけど、
どうせストリームをあらたに作るならそれを一時的なストリームとして使ったほうが自然かと思う。

791 :デフォルトの名無しさん:2024/02/11(日) 22:38:22.35 ID:smEWrSvv.net
std::setのinsertで

std::set<int> c1 = {1,2,3};
std::set<int> c2;

c2.insert(c1);

と書けると便利に思えますが解説のページを見るとできないようです。
なぜですか。

792 :デフォルトの名無しさん:2024/02/11(日) 22:45:16.04 ID:KNbj1ANO.net
>>791
c2.insert(c1.begin (), c1.end ());

793 :はちみつ餃子 ◆8X2XSCHEME :2024/02/12(月) 11:50:11.55 ID:4VueJhli.net
>>791
set に set を insert できる「だけ」ってのはあまり便利ではない。
集合というものをより汎用的に扱える枠組みとして C++20 から range という概念が導入された。
その枠組みを上手いこと成立させる言語機能 concept が長いこと検討されてて、
入る入ると言いながら C++20 までずれ込んでしまったという事情がある。

そんなわけで、 C++23 からなら insert_range が使えて、
これは range の条件を満たすものならなんでも受け入れられることになってる。

794 :デフォルトの名無しさん:2024/02/12(月) 21:37:56.53 ID:WngRm50l.net
>>791
c2.merge(c1) ※C++17以降

795 :デフォルトの名無しさん:2024/02/13(火) 22:11:49.56 ID:TA8E1xmn.net
みなさんありがとう。環境適合を優先して>>792を使うことにします。

796 :デフォルトの名無しさん:2024/02/18(日) 00:05:28.51 ID:AtsZxBPF.net
コンストラクタの初期化子リストの中で、どこまで柔軟に記述できるのかなーと思ってGPT先生に聞いたら、constまたはconstexprを返す関数のみ書けるとのことでした。
コンストラクタ内部のように好きなように書けないとわかり、初期化子リストの価値が低く感じられました。

そんな制限を設けてまで初期化子リストを導入した意図は何でしょう。

797 :デフォルトの名無しさん:2024/02/18(日) 01:13:17.69 ID:UTNyRtZE.net
ChatGPTなんかあてにするな、平気で間違ったこと言うんだから
constやconstexpr以外を返す関数だって普通に呼べる

試しにChatGPTに「メンバ初期化子リストではconstかconstexprを返す関数しか呼べませんが、これはなぜですか?」ってあえて間違った前提条件で質問してみたら、間違ってることに対する指摘は一切なかったし、さもこっちの質問が正しいかのようなそれっぽい返答が返ってきたし

---
俺:
C++において、コンストラクタのメンバ初期化子リスト内ではconstまたはconstexprを返す関数しか呼ぶことができません。これはなぜでしょうか?

ChatGPT:
C++において、コンストラクタのメンバ初期化子リスト内でconstまたはconstexprを返す関数しか呼ぶことができる理由は、初期化子リストがオブジェクトの初期化に使用され、実行時のコードが生成されないためです。メンバ初期化子リストはコンストラクタの一部であり、オブジェクトが生成される際に実行されます。このリスト内での関数呼び出しはコンパイル時に解決され、オブジェクトの初期化に関する情報は実行時に生成されません。

constまたはconstexprを返さない関数をメンバ初期化子リスト内で呼ぶと、実行時にコードが生成される可能性があります。しかし、これはオブジェクトが生成される前に行われる初期化の一環であり、実行時の処理としては不要なオーバーヘッドを引き起こす可能性があります。

コンストラクタのメンバ初期化子リストは、メンバ変数を適切に初期化するためのものであり、できるだけ効率的に行われるように設計されています。そのため、コンパイル時に解決されるconstまたはconstexprを返す関数の呼び出しに限定されています。
---

だからAIをあてにしちゃダメだよ

798 :デフォルトの名無しさん:2024/02/19(月) 00:17:49.94 ID:bJlSKdBs.net
>>797
私が聞いたときも似たような内容が含まれていて、そうなんだねと納得してしまいました。

ではコンストラクタに書けることはすべて書けるのですね。

なおこの問いは、入門書籍にはそこまで書かれてなくて、検索でもかんたんに見つからなかったので聞きました。

799 :はちみつ餃子 :2024/02/19(月) 02:33:45.03 ID:j7eyydGe.net
>>798
たぶん >>796 で言う「初期化子リスト」は「メンバ初期化子リスト」だよね?
これらは全くの別物。
明らかに混同しやすい用語だから仕方がない部分はあるんだが、
誤った用語を元に調べたら誤った解説に当たりやすいかもしれない。

メンバ初期化子リストは直接初期化 (direct-initialization) であると規定されていて
具体的な挙動の説明は初期化の章に丸投げされている。
https://timsong-cpp.github.io/cppwp/n3337/class.base.init#7
つまりメンバ初期化子リストに特有の事情というものはない。

普通に初期化なんで、そこに違いがあるかもしれないという想像をする人がいてそういう人のために
違いが無いと断りを入れる必要があるとは入門書の著者は思わなかったんだろう。
有るものを有ると説明することはあるが無いものを無いと殊更に強調して説明はあまりしない。

800 :デフォルトの名無しさん:2024/02/19(月) 22:58:00.95 ID:bJlSKdBs.net
>>799
そうですメンバ初期化子リストです。どうもありがとう。
なお書籍には、メンバ変数名(引数)やメンバ変数名(0)の例ばかりでした。

801 :デフォルトの名無しさん:2024/02/26(月) 09:17:00.78 ID:KZUiymUx.net
すみません、コンストラクタの宣言/定義で A() {}; とした場合と A() = default; と
書いた場合は何が違うのでしょうか。挙動とか意味だとか...
あるいはある種のタイプクラスの場合は違いが生じるので注意とか....??

802 :はちみつ餃子 :2024/02/26(月) 09:36:14.06 ID:pFLZLcAJ.net
>>801
default を指定した場合はデフォルトのルールでコンストラクタを生成する。
生成可能な条件が満たされなかった場合でもそれ自体はエラーにはならずに
デフォルトコンストラクタは削除済と見做されるというルール。

そのときはデフォルトコンストラクタを必要とする使い方をした時点でエラーになる。

803 :はちみつ餃子 :2024/02/26(月) 09:39:35.86 ID:pFLZLcAJ.net
つまりこんなことをしてもエラーは出ないが

struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};

struct bar : foo {
bar() = default; // デフォルトコンストラクタのデフォルト生成
};

int main(void) {
}

↓ こういうことをするとエラー

struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};

struct bar : foo {
bar(){}
};

int main(void) {
}

804 :デフォルトの名無しさん:2024/03/02(土) 19:28:56.45 ID:fBQwxymt.net
>>803
遅レスすみません。要は、コンストラクタの特定のパターンの用法をされたくない
ときに使う感じ? でそれに該当するとコンパイルエラーになるわけですよね?

自分が気になったのは、ランタイム時に何かありうるかということです
あるコードで、コンストラクタがdefault指定されているクラスが、別のクラス内
(親子関係にはない)でunique_ptrとして生成されたときに問題が生じたような
感じで....
ってもっと自分で調べてからレスしろって話ですが、現在そのコードに立ち戻る
ことができず、とりあえず疑問だけを

805 :はちみつ餃子 ◆8X2XSCHEME :2024/03/02(土) 21:07:53.65 ID:JOojncXx.net
C++ の仕様は場合分けで規則がごちゃごちゃしていることが多くて単純な一般原則として説明できない。
「要は」なんて一言でまとめられないよ。

806 :デフォルトの名無しさん:2024/03/03(日) 19:37:10.80 ID:HNPAS3Wj.net
>>804
そういう目的ではないと見ていいよ
>>803が言ってるのは、基本的にはデフォルト実装でコンストラクタを作ってくれるが必ずではない、と言ってるだけ
デフォルトの(引数無しの場合、何もしない。が、基底クラスの引数無しのコンストラクタはちゃんと呼んでくれる)コンストラクタでいい場合に使う。

A() {}と書くのと基本同じだよ

807 :デフォルトの名無しさん:2024/03/12(火) 20:26:30.54 ID:lzPsc8Dg.net
異なる型を含むような配列(的なもの)を作りたいのですが、可能でしょうか?
例えば template <T> struct NamedValue { string name; T value; } を定義して
NamedValue<string>{a, b} や NamedValue<int>{c, d} などの型の異なる複数の値を、
一つの配列的なものに収納したいのです
例えばvectorは全要素が同じ型じゃないと駄目ですよね

808 :デフォルトの名無しさん:2024/03/12(火) 21:14:27.11 ID:irRbCjS4.net
>>807
std::tuple

809 :デフォルトの名無しさん:2024/03/12(火) 21:19:48.50 ID:irRbCjS4.net
あるいは要素数がコンパイル時に決まらないなら
std::anyをコンテナに入れるとか?

810 :デフォルトの名無しさん:2024/03/12(火) 22:11:10.08 ID:lzPsc8Dg.net
はい、要素数はコンパイル時に決まらないのでstd::anyのコンテナですかね
で要素を取り出すときは、どの型なのかをチェックして挙動を...

811 :はちみつ餃子 :2024/03/12(火) 23:03:39.03 ID:WtXn1sYk.net
もし >>807 の T の種類が限られているのなら std::variant を使ったほうが楽かもしれない。
std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。

812 :デフォルトの名無しさん:2024/03/23(土) 11:43:27.62 ID:YZ3MX9tD.net
std::remove()ってファイルを消去する関数なんですね
std::move()と名前が似ているのに全然違う

813 :デフォルトの名無しさん:2024/03/23(土) 12:38:58.15 ID:6dCwgWlj.net
名前空間か関数名にfileくらい入れとけって思うよね

814 :デフォルトの名無しさん:2024/03/23(土) 12:50:26.95 ID:epZulncV.net
C言語以前にE言語の問題や
さすがにそのくらいの英語の勉強はしておけと思う

815 :はちみつ餃子 :2024/03/23(土) 12:51:15.85 ID:szITgpvT.net
C の規格から取り込んだものだから由来が違うんだよ。
今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。

816 :デフォルトの名無しさん:2024/03/23(土) 12:54:13.64 ID:aQWBK6SI.net
>>812
>std::remove()ってファイルを消去する関数なんですね
std::remove()ってSTLのstd::removeじゃなく?
ちゃんとコンテナの要素をre-moveしてると思うが?

817 :デフォルトの名無しさん:2024/03/23(土) 13:38:01.48 ID:qgcdIGgP.net
>>816
だよねえ??

>>812-815が何を言ってるのか分からなくて怖い

818 :デフォルトの名無しさん:2024/03/23(土) 13:40:27.68 ID:qgcdIGgP.net
ああ
<cstdio>に
int remove( const char* pathname );
ってのがあるのか
https://en.cppreference.com/w/cpp/io/c/remove

819 :デフォルトの名無しさん:2024/03/24(日) 05:14:16.83 ID:DBUI72Gl.net
>>815
なるほど。諸般の事情でC++14な環境で、ファイルを扱う関数を探していたら。
Boostに行く手もあるかもしれませんが、とりあえず。

820 :デフォルトの名無しさん:2024/03/24(日) 09:50:29.58 ID:FsPOi81N.net
cstdio のは std:: 名前空間じゃないよね.
::remove だと思うけど

821 :はちみつ餃子 :2024/03/24(日) 12:13:25.60 ID:iaJ2USO3.net
>>820
cstdio にある関数は std 名前空間にある。
ただしグローバル名前空間「にも」あって良い。 (無くても良い。)
stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)

822 :デフォルトの名無しさん:2024/04/14(日) 11:55:59.92 ID:Rac57Bvn.net
ヒエッ……、、、ぎ、玉虫色……

823 :デフォルトの名無しさん:2024/04/20(土) 14:55:18.13 ID:nh5GJjX6.net
言語そのものではないのですが、コマンドラインのデバッガやIDEでSTLのコンテナの内容を
易しく表示してくれるのってありますか?
例えばvectorなら、単純に中の要素だけを列挙してくれたりとか

ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは
確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等)
見えてる感じで、STLコンテナに関してはあまり親切ではないような
デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか?
自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです

824 :デフォルトの名無しさん:2024/04/26(金) 10:53:44.71 ID:kftlKAnq.net
今からC++を勉強するならC++20を基準にやっても構いませんか?

825 :デフォルトの名無しさん:2024/04/26(金) 10:59:40.04 ID:/+TxHGye.net
c++20といわずc++23からやればいいのでは

826 :デフォルトの名無しさん:2024/04/26(金) 11:15:59.06 ID:kftlKAnq.net
最新の規格で勉強して必要に応じて古い知識をつけていくような学び方でいいの?

827 :デフォルトの名無しさん:2024/04/26(金) 12:03:42.74 ID:q/vvVdAs.net
つべこべ言わずやれ
最短コースなんてない

828 :デフォルトの名無しさん:2024/04/26(金) 13:37:23.03 ID:+usxQk3U.net
C++ は基礎の上に段階的に応用が乗っかっているような綺麗な構成ではない。
全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。
どこから入っても同じ。

829 :デフォルトの名無しさん:2024/04/27(土) 18:08:12.52 ID:nxPk0zOn.net
質問なのですが
std::string には std::to_string(int)他の簡単文字列化関数がありますが
std::basic_string<T> に対する簡単文字列化関数はどう?

830 :デフォルトの名無しさん:2024/04/27(土) 21:15:22.77 ID:Zg+tfmdX.net
>>823
WindowsのVisual Studioではできる

831 :デフォルトの名無しさん:2024/04/28(日) 10:47:20.65 ID:xKAeYuwJ.net
最初に学ぶ言語がC++なら、Cより学ぶのが大変じゃん

832 :832:2024/05/11(土) 19:13:43.45 ID:RotYKdRC.net
やっぱ数値からstd::basic_string<T>の文字列への変換とかTが決まらないとやり方がわからないから
std::basic_string<T>でそれをやりたい人が対応せよ(std::basic_string<T>版to_string()やstd::ostrstreamをT毎に作成せよ)という天の啓示?
証拠にstd::wstringについてはstd::wstring to_wstring(int)とかstd::wostrstream とかある

284 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★