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

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


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

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

1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室
2デフォルトの名無しさん
2018/11/12(月) 15:33:07.21ID:uNoTWhhe
まずC#を覚えます
3デフォルトの名無しさん
2018/11/12(月) 15:41:29.72ID:D6ILV7Jx
>>1
4デフォルトの名無しさん
2018/11/12(月) 16:05:28.85ID:JkRQG90v
C99に準拠したCプログラムってC++コンパイラで完全にビルドできますか?
5さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/12(月) 16:09:07.07ID:Uo1L8t18
>>4
型キャストが必要な場合と、C++キーワードに引っかかるケースがあるから、コンパイルできるとは限らない。
6さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/12(月) 16:21:58.14ID:Uo1L8t18
例えば、classという名前の変数がある場合は、C++ではコンパイルできない。
void *型の変数にint *の値をキャストなしに代入しようとすると、C++ではコンパイルエラー。
7デフォルトの名無しさん
2018/11/12(月) 16:35:33.39ID:D6ILV7Jx
>>4
C99モードにすればおk
$ gcc -Wall -std=c99 -lm round.c
8デフォルトの名無しさん
2018/11/13(火) 08:18:22.77ID:0Ele5WZ8
>>5-6
ありがとうございます。
C99では未定義だがC++で定義・予約されている言葉なんかが引っ掛かってしまうんですね。
9デフォルトの名無しさん
2018/11/13(火) 18:41:26.33ID:90McxFB4
extern "C" {}って書いてる?
10デフォルトの名無しさん
2018/11/13(火) 21:54:10.86ID:RYrE2D9k
まずCから
Cも分かってないのにC++とかムリ
11デフォルトの名無しさん
2018/11/13(火) 22:08:24.41ID:bZ0HXQ7X
C99頃から互換性も無いし、別言語だからそうでも無いけど、どっちかと言うとCのprintfに影響受けてる言語の方が多いね。
どっち先に覚えても良いけど、Cのprintfは押さえておいた方がいい。
(ただ、経験的にC++のオブジェクト指向を覚えるにはJavaかC#から入った方がいいので、挫折したらそっちを一旦勉強する事を勧める)
12デフォルトの名無しさん
2018/11/13(火) 22:32:00.82ID:qjyppvvr
今の最新の規格ならだいぶ使いやすくなってるはず
とりあえず変数にはconstを付けれ
13デフォルトの名無しさん
2018/11/13(火) 23:50:04.90ID:kE0CzrCg
C++とJavaのオブジェクト指向って、なにが違うのでしょうか?
14さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/13(火) 23:59:43.80ID:700gS9mA
>>13
C++は、new を付けたらポインタ型になるが、Javaはnewを付けたら参照型になる。
15デフォルトの名無しさん
2018/11/14(水) 00:06:33.69ID:bV3/fRvw
>>14
JavaよりC++のほうが難しいといわれるのは、ポインタがあるからっていう意味合いが大きいんでしょうか?
16さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/14(水) 00:19:07.08ID:XVbpx9nj
>>15
C++のポインタは癌だ。どこにでもアクセスできてしまうし、メモリーリークが起きる恐れがある。安全ではない。
チェック付きの配列とスマートポインタを使えば、少しは安全になるが、完璧ではない。
17さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/14(水) 00:36:22.61ID:XVbpx9nj
まず、ポインタ変数の宣言が初心者殺し。
int* a, b;の場合、bはポインタではない。

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

これなら、ややこしいアスタリスク記号(*)に戸惑う必要はない。
19さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/14(水) 01:35:38.43ID:XVbpx9nj
型を大文字で書くと分かりやすいという意味で、Win32ではよく使うポインタ型を全て大文字で定義している。
char *にはLPSTRを、const char *にはLPCSTRを用意している。
20デフォルトの名無しさん
2018/11/14(水) 03:03:41.18ID:aCPH/+gx
なんてことを昔の人は考えたが、当然スマートポインタのほうがより安全である
21デフォルトの名無しさん
2018/11/14(水) 07:23:04.49ID:XWwMTSMS
>>15
>>14じゃ無いけど、個人的にはfriendクラスとかJavaには無いクラス同士の関係があったりするが最初はそれがどう言う関係か理解出来なかった。
Javaでオブジェクト指向に慣れた後理解出来た。
C++はそう言う独特のオブジェクト指向があるので、まずそこまで複雑じゃ無いオブジェクト指向言語で慣れる方がC++独特のオブジェクト指向の理解に繋がる。
22デフォルトの名無しさん
2018/11/14(水) 11:35:25.78ID:zVp4oIsl
>>18
無駄に覚えることを増やす馬鹿言語

wsとかswとか_sとかいっぱいつけやがってシッチャカメッチャカ
23デフォルトの名無しさん
2018/11/14(水) 11:36:41.07ID:zVp4oIsl
あとtypedefしてる型を型チェックのときに同一とみなすのが意味ない
せっかく型を別けてるのに
24デフォルトの名無しさん
2018/11/14(水) 12:34:52.66ID:OvTvaibz
整数を定義するときって以下の3つだとどれがメモリ消費量とか実行速度の面で一番効率いいですか?

#define XXX (1234)
enum{ XXX = 1234};
constexpr int XXX = 1234;
25デフォルトの名無しさん
2018/11/15(木) 08:07:09.42ID:HNIzCpqS
効率は実測が基本
26デフォルトの名無しさん
2018/11/15(木) 12:16:37.45ID:lNkjj0jr
>>24
今時のコンパイラならどれも同じになるだろうけど、#defineはただの置き換えだから、実質直接数字に置き換える。
お馬鹿なコンパイラなら、これが一番速い。
(メモリ上のXXXに格納された1234をレジスタに読むのじゃ無く、レジスタに直で1234と書き込むので、メモリアクセス分は速い)
27デフォルトの名無しさん
2018/11/15(木) 17:16:40.52ID:XHYJGLe7
constexprが候補に上がる時点で最新のコンパイラだと思われる
28デフォルトの名無しさん
2018/11/15(木) 22:39:39.09ID:jenSGLjX
AIの力でコンパイラの性能を上げるって可能ですか?
29デフォルトの名無しさん
2018/11/16(金) 09:32:03.61ID:37LYr8ZY
a = xxx;
a = yyy;

これは、二重定義になりますか?
3029
2018/11/16(金) 09:41:00.05ID:37LYr8ZY
解決方法として

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

を考えているのですが、これで良いでしょうか?
31デフォルトの名無しさん
2018/11/16(金) 11:34:07.59ID:9iOixtPe
a[] = {xxx, yyy};
3229
2018/11/16(金) 11:52:01.81ID:37LYr8ZY
>>31
ありがとうございます!
33デフォルトの名無しさん
2018/11/20(火) 23:59:39.03ID:GRv3bnvn
up
34デフォルトの名無しさん
2018/11/21(水) 04:04:25.43ID:C09+uG2D
整数型とbool型を比較したり代入しようとしたときに警告かエラーを出す方法はありますか?
int i=5;
bool b=true;
i=b;
if(i==b)
if(i)
↑3行すべてでエラーなり警告なりを出してほしい
b=i;とif(b==i)は警告が出ます
環境はvs2017です
35さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/11/22(木) 03:29:53.66ID:by2crdt6
C/C++ではありえません。不可能です。
36デフォルトの名無しさん
2018/11/22(木) 06:04:18.72ID:94o8kAxO
>>34
C++のboolのサイズはcharと同じだから
b=i: で警告になるのは整数型と論理型の変換というより単にサイズの小さい方に
代入しようとしたから警告になるてことだろうね

boolを使わずに Booleanクラスとかを自分で作れば型変換の許可/不許可も自在だけど
ま、やらんわな。そんな非効率なことは
37デフォルトの名無しさん
2018/11/24(土) 11:20:27.36ID:pkYVxqhq
34です
遅くなりましたがありがとうございます
自作クラスを作ってまでエラー出したいものでもないので気にしないことにします
38デフォルトの名無しさん
2018/12/02(日) 21:29:56.53ID:jrjT9DL9
MSがC++をCより勧める利点ってなんでしょう。
.NET関連で商売する為にC#などの利用を推奨するのは理解できるのですが
C++に拘りC99にすら対応しないのは何かよっぽどの理由があるのかなと思ってしまいます。
39デフォルトの名無しさん
2018/12/03(月) 21:46:10.27ID:ZMLOrV5M
.net以前はMFCで商売してたからね。
その遺産を保守するのにC++が必要。

今でもそう言う会社相手に商売してる。
今はまだマシだけど、開発環境独占だと標準規格無視してた。
対応しなくても売れるのに、対応する必要は無いわな。
40デフォルトの名無しさん
2018/12/03(月) 21:49:11.54ID:jYfXM2LM
御開帳です



http://connect.uh-oh.jp/
41デフォルトの名無しさん
2018/12/05(水) 04:20:50.45ID:yf36y6mU
enum EN { yama,kawa}
をアクセスする規則がわかりません。 EN.yama の時もあれば 単にyamaの
時もあります。規則はどうなってるんでしょうか?
42デフォルトの名無しさん
2018/12/05(水) 14:48:45.83ID:2sSegHBZ
namespace
43デフォルトの名無しさん
2018/12/05(水) 23:17:47.17ID:P1XQw2I4
C++ならEN.yamaはあり得ないだろう
44デフォルトの名無しさん
2019/01/09(水) 10:11:37.02ID:Gyfngzmc
新年記念up
45デフォルトの名無しさん
2019/01/11(金) 18:31:10.60ID:TUR+WyZ1
win16からwin32への移行では役に立ったのかもしれない。
46デフォルトの名無しさん
2019/01/22(火) 13:59:06.16ID:owIFG1wt
ゼロが流行っているのか?
47デフォルトの名無しさん
2019/08/28(水) 20:07:30.06ID:Y6mSCMlM
Cは習わないとダメですか?
48デフォルトの名無しさん
2019/08/29(木) 10:03:19.38ID:Pek3Dpqo
c++相談室だぞ
習わなくていいなんて答えるヤツはいないぞ
49デフォルトの名無しさん
2019/08/30(金) 20:54:35.96ID:QpJdGFlG
いやCの勉強なんてしなくていいよ
最初からC++の勉強をすればいい
50デフォルトの名無しさん
2019/08/31(土) 00:49:34.53ID:y5ewqimO
C++は糞
Cだけやっとけば充分
51デフォルトの名無しさん
2019/08/31(土) 21:44:16.76ID:r57d4Puh
C++って便利になってもゴチャゴチャしてて汚い言語だとどっかで聞きました
52デフォルトの名無しさん
2019/09/01(日) 01:17:32.77ID:6J4Ocwbf
ゴチャゴチャだと?
無理して拡張された機能を使わなければいいだけの話じゃないか
C言語でオブジェクト指向プログラミングをしようとするとどれだけ危険で汚くなるか分かってるんだろ?
C++は表面的にだけどそれをきれいにまとめた点だけでも評価されていいんじゃないか?
53デフォルトの名無しさん
2019/09/01(日) 01:34:32.37ID:sYwYgS29
つまりテンプレートを使うなということですね判ります
54デフォルトの名無しさん
2019/09/21(土) 17:36:37.24ID:BnEC5IrG
c++は元はクラス形オブジェクトシステムを高速に動作させる為に始めたけど
今は単に高速にする事を目的に作っている様に見える
その為に一度に出来る様な記述を追加していってて有る意味便利なんだけど
機能が増えすぎて正確に把握するのが大変
その影響で何処か間違うとその間違った部分とは違う部分が違ってて
それを理解するのが大変
あちこちが絡みすぎてて言語自体がスパゲッティになってる印象
大量の事項を正確に覚えてそれられを正しく組み合わせないといけないから大変
超初心者にはかなりきつい
プログラミング初心者がやる様な物ではない
ある程度他のプログラミング言語をやって出来るようになってからの方が多分良い
55デフォルトの名無しさん
2019/09/21(土) 17:40:00.07ID:icgczTg/
>その影響で何処か間違うとその間違った部分とは違う部分が違ってて
>それを理解するのが大変

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

「その影響で」
は関係無い
大変なのは今に始まったことじゃない
高機能ωになる前からずっとそう
56デフォルトの名無しさん
2019/09/22(日) 09:05:21.83ID:Ktt7KEB9
この板にはC++委員会で多くの人が使いにくいと思っている仕様を提案してしまった
人が来ているので、最新のC++がダメになった、などと言うのは禁句。
57デフォルトの名無しさん
2019/09/22(日) 18:46:16.43ID:tiYbs1p9
>>52
STLに関しては、コンテナ以外の部分を使わなければ、かなりスパゲッティー感が
なくなる。C++98以降、STLの実装にしか使わないような template の機能強化
に邁進してしまったようだ。しかし、C++ reference などで STL がふんだんに
使って説明されてしまってるので若い人の間で STL が C++ の標準だと
思われてしまい、そこが難しいので C++ が嫌われる結果となっている。
本来はライブラリはプログラミングが簡単になることを目的にしているはずなのに、
STLはその逆を言ってしまっている。
問題なのは、STLを使いまくったC++コードがネット上に増えてしまっていること。
58デフォルトの名無しさん
2019/09/22(日) 19:24:43.32ID:vTpi5vA1
奥が深いからね
ショウガナイね
59デフォルトの名無しさん
2019/09/22(日) 19:40:18.23ID:+tHa6qta
STLのコンテナ以外の部分とか自作template使わないとプロ感出ないからね
仕方ないね
60デフォルトの名無しさん
2019/09/23(月) 09:41:06.71ID:9Vk3Qf6P
言語仕様を一通り学んだ後でライブラリの詳細な使い方を覚えていけるのが理想。
ところが、cppreference では、言語仕様を本文だけでは説明し切れておらず、
サンプルコードを見てやっと理解できるようになっているが、そこで
非常に難解なSTLの使い方をしてしまっている。それでは
STLの非常に詳細な仕様を知らないとSTLの基礎となっている言語仕様すら
理解できないことになり、ある種の「トートロジー」のような現象が起きてしまう。
前段階の理解を元に三段論法的に論理や理解を進めていくという説明の仕方になっていないのだ。
そのやり方が C++ が難解であるというイメージを植えつけてしまっている。
cppreference の執筆者やC++委員会の上の方の人の中に、STLをC++の言語
それ自体だと思っている人がいるように思えてならない。
確かにPythonやRubyでは、似たような機能を持つものが、言語そのものの一部
である位置づけになっている。しかし、その理解はとても容易である。
だから、言語仕様を説明するサンプルコードがその理解を前提にしていたとしても、
理解の妨げにはならない。ところが、C++ではその事情は一変するのだ。
61デフォルトの名無しさん
2019/09/23(月) 11:55:25.99ID:3qdqqJ07
codecvtですね判ります
62デフォルトの名無しさん
2019/09/23(月) 12:36:29.52ID:9Vk3Qf6P
>>60
正確には、トートロジー というより、循環論法に近い。
63デフォルトの名無しさん
2019/09/23(月) 13:25:24.38ID:IaDL9t/N
>>60
たとえば cppreference のどの記事のことを言ってるんですか?
1つか2つでもいいんで、具体例がほしいです。
64デフォルトの名無しさん
2019/09/23(月) 14:28:50.02ID:9Vk3Qf6P
>>63
もしかしたら >>60 の説明は「ずれて」いたかもしれないけど、例えば、言語仕様の
サンプルコードに高頻度に vector が出てくるので、それ自体がどうやって実装されているかを
調べることも重要になってくる。すると、initailizer-list なるものが重要であることがわかり、
vector の実装でそれがどう関係しているかも知りたくなる。それを知る前にまずは、vector template
の細かい仕様を調べたくなり、以下を見るとする:
https://en.cppreference.com/w/cpp/container/vector

↑は冒頭部分からしてこうなってる:
template<
 class T,
 class Allocator = std::allocator<T>
> class vector;
(1)
namespace pmr {
 template <class T>
 using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;
}
(2) (since C++17)
1) std::vector is a sequence container that encapsulates dynamic size arrays.
2) std::pmr::vector is an alias template that uses a polymorphic allocator

これは、初心者には難しすぎるし、実装を調べたいような上級者には情報が不足しており、
「帯に短し襷に長し」状態である(ちゃんとした説明になっていないのだ)。
上の部分を見た場合、最初に、allocator とはなんなのか、ということが疑問になる。
そして、allocator を調べなくてはならなくなる・・・・。

まず、vector とは何なのかが大まかに知りたかった人にすら、これでは難しい。
例えば、Ruby なら、[a,b,c] は、リストといって、集合です、と説明して
わずかなサンプルでもその全体像が分かった気がしてくる。
それとは全然違うことになってしまっている。
65デフォルトの名無しさん
2019/09/23(月) 14:39:03.51ID:9Vk3Qf6P
>>64
誤:initailizer-list
正:initializer-list

vector の仕様を調べようとすると、(1),(2)の2つの定義が出ており、(2)では
なぜか、namespace pmr が出てきて、さらに、using vector = ・・・、で
vector という名前が alias で定義されているらしい。基礎の基礎を知りたくて
vectorを調べたのに、namespace と using alias が出てくる。そして、pmr
という namespace がいったい何なのかということを知る必要が出てくる。

まず説明に言葉が足りてない気がする。英語は曖昧さを含み易い言語らしく、
英語に強い人に聞いても「文脈でどっちとも取れるので正確な意味は分からない」
と言われる。日本語に比して言葉の意味が薄くて、サンプルコードが重要となる。
IntelのCPU命令のマニュアルだと、擬似コードで説明されている事があり、
その場合にはほぼ正確に言っていることが分かるが。cppreferenceはそれもない。
ほぼ、サンプルコードだけが頼りになっているが、そのサンプルも分かりにくい。
サンプルに対する英語の説明が少なすぎるから。
66デフォルトの名無しさん
2019/09/23(月) 15:02:06.71ID:9Vk3Qf6P
>>64
時々、「コードこそがドキュメント」などという人がいて、それに従って
cppreferenceが書かれてしまっている可能性がある。しかし、vectorの
「仕様」とは、vectorが如何に実装されているかではなく、如何に使うか
の説明から入るべきなのに、>>64は、実装をモロに見せてしまってるから
難しくなっている。(1)のtemplate文だけでは、templateの仕様がまだ理解できてない
段階では、vectorの仕様を知ることが出来ないことになる。そう書くよりも、
いきなり、

std::vector<int> v = {7, 5, 16, 8};  // (100)

で、4つの整数型の要素を持つ配列を確保します。
メモリ上で要素は、隣り合わせに並びます。
配列の長さは動的に変更することが出来ます。

と書いたほうが良いし、完全な referece を書きたい場合でも、>>64 の(1)のように
書くべきではなくて、例えば、(100)を一般化して

[vector 型オブジェクトの作成方法]
std::vector<int> オブジェクト名 = 初期化子;  // (101)
 初期化子 := {初期値リスト}

などと書かないいけない。

>>64 の (1)は、vector自体の「実装方法」を書いているだけで
vectorの「仕様書」にはなっていない。
67デフォルトの名無しさん
2019/09/23(月) 15:16:09.23ID:3qdqqJ07
なるほど
それならトートロジーとか循環論法と言うよりも
もっと適切な言葉があるはず
68デフォルトの名無しさん
2019/09/23(月) 15:21:18.30ID:9Vk3Qf6P
>>66
集合や、データベース系のソフトウェアでは、言葉は忘れたが、
初期化、追加、削除、参照、検索、個数の取得
などが良く使われる(ほぼ必須の)基本機能だとされるから、

[vector 型オブジェクトの作成方法]
std::vector<要素の型> オブジェクト名 = 初期化子;  // (200)
std::vector<要素の型> オブジェクト名 初期化子;  // (201)
 初期化子 := {初期値リスト}

[vector 型オブジェクトへの末尾への要素の追加]
オブジェクト名.push_back(要素);         // (210) 要素をコピーして追加したい場合
オブジェクト名.push_back(std::move(要素));   // (211) 要素を移動して追加したい場合

[vector 型オブジェクトの idx 番目の要素の参照]
オブジェクト名[idx]    // (220) : idx は先頭が 0 から始まる。
・・・

などと書いていけばよい(自分は細かい仕様が分かってないのでこれ以上詳しくは
書けないが、reference manual を書く人なら書けるはず)。
初心者が期待する reference manual とは上記のようなもので、
>> 64 のようなものではない。何度も言うが、>>64
実装と仕様が混合されてしまったもので、どっちつかずの状態になっている。
69デフォルトの名無しさん
2019/09/23(月) 15:26:14.73ID:3qdqqJ07
ソースから自動生成してるなら仕方ない面もある
70デフォルトの名無しさん
2019/09/23(月) 23:08:32.79ID:MNSCG3IB
実装で仕様が隠蔽されている
71デフォルトの名無しさん
2019/09/23(月) 23:52:06.90ID:U2/CMzYE
大きい・小さいとか、言葉は、about で抽象的だから、
こんな厳密な事を決めるのには、向いていない

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

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

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

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

プログラミング・フレームワーク・構造がわかるためには、Ruby でもやった方が余程よい。
C/C++ などポインタのある言語は、プログラミングを学ぶのに適していないし、
バグで時間を浪費するから、結局学べないw
72デフォルトの名無しさん
2019/09/30(月) 10:42:32.26ID:6yDcPDBq
なるほどね
初心者にとっては
一度に多くのことを覚えないといけないのは負担が多い
生配列を使うのは良くないから最初からvectorを教えるのは
有る意味正しいけど
理解するには難易度が上がってしまっている

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

適切な教科書を作る
というのは結構高度で大変で
作れる人が少ない
その割には作った人には余り金にならなかったりして
作ってくれる人が余り居ない印象
73デフォルトの名無しさん
2019/09/30(月) 12:08:38.76ID:vkIGDak2
gcc も g++ も VC も肥大化し過ぎた
digital mars c とか Borland C 5.5 かそれよりもっと前
tiny c compiler でもいい
初心者用にはもっとシンプルな C で充分
74デフォルトの名無しさん
2019/10/06(日) 17:06:30.65ID:42LxT2AQ
quick c
75デフォルトの名無しさん
2020/03/26(木) 16:08:19.66ID:71CdUQnj
>まず説明に言葉が足りてない気がする。英語は曖昧さを含み易い言語らしく、

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

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

けどプログラムを書く時は
javaだととりあえず.を書いておけば良いから迷わないけど
c++だと.だったり->だったり::だったりするから迷う事がある
そんなに致命的な問題では無いけど
76デフォルトの名無しさん
2020/03/27(金) 14:39:56.26ID:9RtDMjhb
::あんまり使わないな
77デフォルトの名無しさん
2020/05/06(水) 18:31:54.91ID:K0jT0mUL
入門ロベールC++の188ページに

const char* MONTH_NAME[]={"睦月,"如月,"弥生"......  
というのがあるのですが、なぜchar*型の前にconstをつけると文字列リテラルをたくさん代入出来るのでしょうか?
const定数を外すと同じことが出来ないのがよく分からないです。ポインタが理解できてないのでしょうか。
78デフォルトの名無しさん
2020/05/06(水) 18:38:37.65ID:wd9+jhuU
それの場合MONTH_NAMEの型は
「書き換えられないchar」「へのポインタ」「の配列」
であることがわかれば後はわかるっしょ
79デフォルトの名無しさん
2020/05/06(水) 18:46:19.97ID:K0jT0mUL
>>78
すいません、分からないです・・・
何が分かってないからこうなってるのか。も分かってないからまた読み直して同じページに戻っても理解できないです・・
80デフォルトの名無しさん
2020/05/06(水) 19:06:59.66ID:8YawtAIF
>>77
文字列リテラルの指す文字列は書きかえてはいけない。
char* の指す先の文字列は書きかえできる。
const char* の指す先の文字列は書きかえできない。
81デフォルトの名無しさん
2020/05/06(水) 19:07:03.19ID:K0jT0mUL
何故文字配列なのに文字列を沢山入れられるのか…
82デフォルトの名無しさん
2020/05/06(水) 19:09:49.04ID:8YawtAIF
>>77
あーわかった。あんたがエラーメッセージを読んで理解しようとしないから分からないんだよ。
83デフォルトの名無しさん
2020/05/06(水) 20:16:45.31ID:K0jT0mUL
分かりません。
ポインタを直接文字列の値で初期化してるのもよくわからないです。
84デフォルトの名無しさん
2020/05/06(水) 20:38:11.69ID:5oVnKxXT
char *s = "abc"; がダメな理由と
int a[] = { 1, 2, 3 }; がOKな理由を考えろ
85デフォルトの名無しさん
2020/05/06(水) 20:47:05.11ID:Fjn1hDTG
const char* MONTH_NAME[]=

型 変数名[]

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

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

a = "a"
a = "abc"
87デフォルトの名無しさん
2020/05/06(水) 20:53:56.70ID:K0jT0mUL
>>84
char* sはchar型の変数の参照が入ってないから駄目なのでは?
下はただの配列変数だからできてるのでは?
88デフォルトの名無しさん
2020/05/06(水) 21:05:23.65ID:K0jT0mUL
>>85
const char*という新しい型があるのですか?
constとは定数を宣言するだけのものじゃないのでしょうか
89デフォルトの名無しさん
2020/05/06(水) 21:49:00.63ID:K0jT0mUL
char* str[]={"aaa","bbb","ccc"}はできないのに
const char* str[]={"aaa","bbb","ccc"}はエラーにならないのも意味わからないです
const chr*のエンティティ云々も意味不明なのですがロベール188pまでにその説明は載ってるのでしょうか
90デフォルトの名無しさん
2020/05/06(水) 21:54:43.49ID:5oVnKxXT
じゃあ const char *s = "abc"; がわからないのか
これはどこかにある "abc" という配列へのポインタでsを初期化しなさいっていう意味で、
char *s = "abc"; がダメなのは "abc" が変更不可だから

あとは const char *s = "abc"; と const char *MONTH_NAME[] = { "睦月", ... }; の関係が int i = 0; と int a[] = { 0, ... }; の関係と同じであることを考えればわかるはず
91デフォルトの名無しさん
2020/05/06(水) 22:11:15.73ID:8YawtAIF
>>89
「できない」理由はエラーメッセージに書いてあるだろ。読めよ。
92デフォルトの名無しさん
2020/05/06(水) 22:58:31.48ID:K0jT0mUL
>>90
文字列って定数なんですか?
何となく分かってきた気がします!細かく教えていただきありがとうございます
93デフォルトの名無しさん
2020/05/07(木) 12:23:12.56ID:iKRewGMt
>>77
const 付けたくないなら
char MONTH_NAME[][5]={"睦月,"如月,"弥生"......
94デフォルトの名無しさん
2020/05/07(木) 17:22:45.52ID:8jv+kISL
char r[] = "hoge";
char *s = "hoge";
const char *t = "hoge";
char *MONTH_NAME_A[]={"睦月","如月","弥生"};
char MONTH_NAME_B[][7]={"睦月","如月","弥生"};
どれもエラーも警告も出んかった
95デフォルトの名無しさん
2020/05/07(木) 18:27:09.29ID:wkYaXeHy
char *t = "hoge";
これがエラーにならないのは言語上の欠陥
96デフォルトの名無しさん
2020/05/08(金) 06:37:37.35ID:Br/73fC2
ロベールさんで紹介してる環境に限定されると語れる立場じゃないんだが…。

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

>>94
char *s = "hoge"; で警告出ないとは
ストラウストラップ先生がガッカリしそうなコンパイラね。
97デフォルトの名無しさん
2020/05/08(金) 09:24:37.89ID:0HhOrENw
>>95
C++11 以降の言語仕様では許していない。
それより前の仕様では許していたという歴史的経緯があるので
(エラーではなく) 警告にとどめている処理系がまあまあ有るという事情。
98デフォルトの名無しさん
2020/05/08(金) 09:31:38.60ID:oIDbptWL
C++
https://ideone.com/lWQYBs
C++14
https://ideone.com/2CLzMB

どっちもスルーされる
99デフォルトの名無しさん
2020/05/08(金) 21:53:35.81ID:+i26a8kQ
ロベールの入門書に /*構造体変数student*/
int length = sizeof stundent /sizeof *student
というのがあるのですが何故これで配列の要素数が出るのでしょうか?
sizeof student / sizeof student[0]だと配列の要素数が出る理屈は何となく分かるのですが
配列とポインタは別のものですよね?
100デフォルトの名無しさん
2020/05/08(金) 22:21:29.33ID:/+tKw0XQ
student[0] と *student は同じ
101デフォルトの名無しさん
2020/05/08(金) 23:07:29.79ID:+i26a8kQ
何で同じなのでしょうか?これで動くからこういうもの。という理解で大丈夫なんでしょうか
102デフォルトの名無しさん
2020/05/08(金) 23:48:12.63ID:xx+9oYGy
MSの陰謀。
103デフォルトの名無しさん
2020/05/09(土) 06:15:34.68ID:LKKpAq9a
とりあえず stundent は誤りで正しくは student だとして

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

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


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

>>102 初心者をからかっちゃアカンよ。信じちゃうかも知れん。
104デフォルトの名無しさん
2020/05/09(土) 09:28:26.57ID:3rxWY8lS
コロチャンもゲイツの陰謀とか言ってる人が居てわろす
温暖化も陰謀ω
105はちみつ餃子 ◆8X2XSCHEME
2020/05/09(土) 10:52:17.88ID:MmeKQuXy
>>99
「暗黙の型変換」によって配列がポインタに型変換されるルールがある。
スムーズにポインタとして使えてしまうから混同してわけわからんようになる初心者が多いんだけど、
あくまでも別物であるという理解が出来ているなら入門者としてはかなり優秀だと思う。

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

----

余談だけど暗黙の型変換とは別に仮引数の調整というのもあって、
関数の仮引数として配列を書いた場合も配列はポインタに調整される。
たとえば
void foo(int a[10]) {}
という定義を書いたら
void foo(int* a) {}
と全く同じように解釈される。
106デフォルトの名無しさん
2020/05/11(月) 03:00:46.06ID:II69MMpE
すいませんロベール持ってる人にお聞きしたいのですが
305ページの
for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが
このsizeというローカル変数は何処に定義されてるんでしょうか?
107デフォルトの名無しさん
2020/05/11(月) 05:46:42.66ID:k4wInV7m
>>106
“ロベール本”を持ってないので答えられない立場かも知れんけど…。
この size は「ここ」で定義されているんだと思うよ。

for の初期化式 int i = 0, size = a.Size(); で、
「int の i」と「int の size」という2つの変数を定義している。
108デフォルトの名無しさん
2020/05/11(月) 07:45:03.87ID:II69MMpE
>>107
forの中で2つ宣言できるんですね!そんな事も知りませんでした。
ありがとうございます。
109デフォルトの名無しさん
2020/05/11(月) 09:53:48.32ID:MhpqGE2N
型が違うときは?
for (long i = 0, int size = a.Size(); i < size; ++i)
110デフォルトの名無しさん
2020/05/11(月) 19:53:43.37ID:8B6Lebzi
C++17なら
for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)
111デフォルトの名無しさん
2020/05/21(木) 23:33:00.50ID:fIo5j0A9
class DataStore {
public:
DataStore(int v) : mValue(v) {}
bool operator==(const DataStore& rhs) const;

private:
int mValue;
};

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

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

というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか?
後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです
112デフォルトの名無しさん
2020/05/21(木) 23:57:47.49ID:ut4Weg2U
operatorも、ただの関数
if (ds1.operator==(ds2)) {}
113デフォルトの名無しさん
2020/05/22(金) 00:55:03.99ID:H9gcgSgg
const DataStore& rhsの実引数はds1ってことですか?
114デフォルトの名無しさん
2020/05/22(金) 06:44:02.17ID:8neFOyTD
この流れだと、仮パラメータ rhs にバインドされる実引数は ds2 でしょ。

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


具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、
ってのが >>112 の人の言ってること。
115デフォルトの名無しさん
2020/05/22(金) 09:23:45.22ID:JweU/zGV
余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。
(標準ライブラリでもだいたいそうなってる。)
116デフォルトの名無しさん
2020/05/22(金) 12:29:55.77ID:6NFPH2hn
constかどうかで決めるのはアホ
117デフォルトの名無しさん
2020/05/30(土) 06:36:15.09ID:1Zwy+dfa
なぜ文字から'0'を引くと数字を数値に変換できるのですか? char c='8' int a=c-'0'
理屈がよくわからないです。
よろしくお願いします
118デフォルトの名無しさん
2020/05/30(土) 07:25:50.69ID:/FCD7s4m
順番に並んでいるから。
119デフォルトの名無しさん
2020/05/30(土) 07:33:59.81ID:1Zwy+dfa
文字コードが順番に並んでるのは分かったのですが
なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません
よろしくお願いします
120デフォルトの名無しさん
2020/05/30(土) 07:57:34.41ID:/LdiluDZ
'0'を引かなくてもキャストせずにint型の変数に代入できるよ
c/c++では文字は整数型に文字コードを入れて扱うんだよ
121デフォルトの名無しさん
2020/05/30(土) 08:07:04.11ID:1Zwy+dfa
苦しんで覚えるC言語という本の255ページに
”数字を使うときには引き算で本来の数値を知ることも出来ます。
数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。
数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。”
とあるんですが
”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです
122デフォルトの名無しさん
2020/05/30(土) 08:27:53.58ID:CZP1xQZw
文字が元々数値(文字コード)であることが理解できてないのでは
ASCIIコード表でググってみれ
123デフォルトの名無しさん
2020/05/30(土) 10:03:05.95ID:/LdiluDZ
2に3を足す時、
int a = 2; int b = 3; int c = a + b;
とやるとc == 5になる

int a = '2'; int b = '3'; int c = a + b;
とやってもc == '5'にはならない
今やほぼASCIIだからc == 'e'になる

int a = '2' - '0'; int b = '3' - '0'; int c = a + b;
とやるとc == 5になる
'0'から'9'まで連続していることはcの規格が強制してるから

これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味
124デフォルトの名無しさん
2020/05/30(土) 16:37:51.27ID:A5Abb6S3
char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型
int a = c - '0'; // char型の数値8 で int変数a を初期化・代入

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


思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」)
という部分に引っ掛かってるんじゃなかろうか。
125124
2020/05/30(土) 16:49:13.96ID:A5Abb6S3
すまん 124 は間違ってるみたい、忘れてくれ。

char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型
// '0' ... '0'を表す文字コードの値(ASCIIでは48) char型
// c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型
int a = c - '0'; // 数値8 で int変数a を初期化・代入

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


'8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード)
std::cout << "sizeof('8') == " << sizeof('8') << '\n';
std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';
126デフォルトの名無しさん
2020/05/30(土) 18:38:26.55ID:1Zwy+dfa
>>125
そういうことでしたか。
詳しく噛み砕いていただきありがとうございます。
127124
2020/05/30(土) 19:18:59.52ID:A5Abb6S3
型の検証はC++11なら直接的にできるね。

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

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

subroutine で、例えば、boolean と string のふたつの変数の値を
return するには、やっぱり std::map を使うのが一番簡単でしょうかね?
129デフォルトの名無しさん
2020/06/05(金) 18:21:06.88ID:Uv2w5eYU
std::pair<>じゃないのか?
https://ja.cppreference.com/w/cpp/utility/pair
130デフォルトの名無しさん
2020/06/05(金) 19:03:13.94ID:8OoEw/S/
うーん、なんとなくそうおもいます、ええ
131デフォルトの名無しさん
2020/06/05(金) 19:06:38.66ID:8OoEw/S/
あ、では、boolean, string, int の三つをreturn するには普通どうやるのが王道でしょうか?
132デフォルトの名無しさん
2020/06/05(金) 19:08:18.91ID:8OoEw/S/
連投すまん。
std::tuple ですか。
133デフォルトの名無しさん
2020/06/05(金) 19:12:47.23ID:Uv2w5eYU
たぶんそうだとお芋ます、ええ。
あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。
今回は関係なさそうですが。
134デフォルトの名無しさん
2020/06/21(日) 13:29:09.07ID:hTPD8Gtd
>>131
王道かどうかは知らんが、C++17以降なら
auto func() {
return std::make_tuple(a, b, c);
}

auto [f, s, n] = func();
っていう風にできるで
135デフォルトの名無しさん
2020/06/21(日) 16:38:41.93ID:rRP2z2l8
std::tie の方が好き
136デフォルトの名無しさん
2020/06/22(月) 16:40:35.96ID:sjaABjGh
C++でint[変数]というようなことが出来ないのはstack overflow防止のためなんでしょうか?
137はちみつ餃子 ◆8X2XSCHEME
2020/06/22(月) 16:50:40.23ID:H8+bL0cM
>>136
原則として型は大きさが決まっているもんなので、そうでないものがあるとややこしいんだわ。
(配列の大きさは型の一部。)
138デフォルトの名無しさん
2020/06/22(月) 20:24:27.49ID:83jG8pXe
Cの新しいのだと出来る
139はちみつ餃子 ◆8X2XSCHEME
2020/06/22(月) 22:04:26.97ID:H8+bL0cM
>>138
新しいの……?

C99 で出来るようになったけど C11 以降ではオプショナル扱いなんだわ。
そして今年は 2020 年なんだわ。
140デフォルトの名無しさん
2020/06/22(月) 23:23:01.67ID:rtw5aKlF
Cは89/90が基本
141デフォルトの名無しさん
2020/06/23(火) 01:32:00.34ID:UY2AjBBL
以下のコードは比較関数をSTLのlistに渡す為のものなのですが
これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか?

typedef SubType* LPSUBTYPE;

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

}
142デフォルトの名無しさん
2020/06/23(火) 09:26:35.36ID:RMSfHJVB
>>141
エラーメッセージを読んで問題点を解決するように書き直すといいよ。
list に比較関数は渡せないと思うので前提が間違ってそうな気もする。
143デフォルトの名無しさん
2020/06/29(月) 08:08:09.53ID:PYBXxpGI
VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?
144デフォルトの名無しさん
2020/06/29(月) 18:23:34.98ID:gWW+3u18
C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ
作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
145デフォルトの名無しさん
2020/09/08(火) 02:57:29.22ID:ZBc9FXfY
何で構造体のchar配列は直接値が代入できず
strcpyを使う必要があるのでしょうか?
146デフォルトの名無しさん
2020/09/08(火) 03:20:04.77ID:jacy6RM2
できるよ
struct A {
int x;
char b[4];
} a = {0, 1, 2, 3, 4};
147はちみつ餃子 ◆8X2XSCHEME
2020/09/08(火) 05:15:54.57ID:QZgDAT7o
>>146
それは代入ではなくて初期化
148デフォルトの名無しさん
2020/09/08(火) 05:56:11.78ID:ZBc9FXfY
typedef struct {
char str[32];
}A;

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

これができないってことです
言葉足らずですいません
149デフォルトの名無しさん
2020/09/08(火) 08:44:00.12ID:h4K4tlm9
int main(void) {
int arr[5];
arr = 3;
}

ができないのと同じ理由です
150デフォルトの名無しさん
2020/09/08(火) 09:53:15.41ID:zoI9JNor
かわいいw
151デフォルトの名無しさん
2020/09/08(火) 10:55:42.52ID:0vfIbeP0
ちょっと忘れたから、推測だけど、

a.str="aaa";

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

char str[32];

一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
152デフォルトの名無しさん
2020/09/08(火) 11:16:05.69ID:h4K4tlm9
意図してるだろうことを無理してやるなら
str[0] = 'a';
str[1] = 'a';
str[2] = 'a';
str[3] = '\0';
でできる.そしてこれをするためにstrcopyがある
153デフォルトの名無しさん
2020/09/08(火) 15:36:44.61ID:JkCXGknl
>>148
型が違うし
154デフォルトの名無しさん
2020/09/08(火) 15:57:15.69ID:SNM207t1
出来ない訳じゃないんだよな
typedef struct {
char b[4];
} A;

int main(void) {
A b = {1, 2, 3, 4};
A a;
a = b; // ok
a.b = b.b; // bad
return 0;
}
自分で for で配列要素代入すれば良い訳で
面倒だから memcpy や strcpy 使ってるだけ
155デフォルトの名無しさん
2020/09/08(火) 16:02:13.68ID:JkCXGknl
>何で構造体のchar配列は直接値が代入できず

構造体のchar配列だけじゃなくて
ただのchar配列でもダメだろ
宣言と同時に代入してるときはたまたま出来るだけ
int main() {
char a[4] = "abc"; // OK
char b[4];
b = "abc"; // BAD
return 0;
}
156デフォルトの名無しさん
2020/09/09(水) 20:41:42.30ID:s+S5qxFe
>char a[4] = "abc"; // OK
これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート
たまたま、ってw
157デフォルトの名無しさん
2020/09/09(水) 23:49:08.55ID:N/YnHGom
はじめたころは、こういうことにいちいちひっかかってたな…
わかっちゃえば、慣れちゃえばどーってことないんだけど
158デフォルトの名無しさん
2020/09/10(木) 00:06:01.62ID:Qspm/kAl
同じようでいて、初期化と代入では見た目の作用がことなることがあるね
159デフォルトの名無しさん
2020/09/10(木) 00:07:00.73ID:Qspm/kAl
見た目「と」作用が
160デフォルトの名無しさん
2020/09/10(木) 15:36:27.72ID:rLZBXCmM
a も b も代入禁止だ
161デフォルトの名無しさん
2020/09/19(土) 09:19:26.77ID:z/ngkL1p
>>157
常に初心に返ることで新たにわかることもある
162デフォルトの名無しさん
2020/09/21(月) 06:30:22.99ID:GP+Uv9qA
C#ですいません
usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて
イマイチ言ってる意味がわからないので
簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
163デフォルトの名無しさん
2020/09/21(月) 10:35:12.49ID:M8W5JifW
文字だけじゃないコード・・・
164デフォルトの名無しさん
2020/09/21(月) 11:38:59.68ID:xNmUS8x8
寿限無名予防以外の目的?
165デフォルトの名無しさん
2020/09/21(月) 11:59:08.18ID:IzAwgxqY
>>162
C#よくわかってないけど
こういうことが知りたいの?
https://ideone.com/SP3uBF
166デフォルトの名無しさん
2020/09/21(月) 21:53:00.21ID:GP+Uv9qA
>>165
すいません、そういうことです。
usingについてはおかげさまで意味が分かりました。ありがとうございます。
namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、
どっからどの部分までが名前空間なのでしょうか
167デフォルトの名無しさん
2020/09/21(月) 23:03:56.25ID:IzAwgxqY
>>166
namespaceがなかったら
たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで
さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、
自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する
(重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない)
みたいな事態が発生してしまう

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

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

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

あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
169デフォルトの名無しさん
2020/09/22(火) 13:09:23.63ID:iGBGeTHm
名前空間を使うと検索性が最悪になる
(別の名前空間の同一名称が引っ掛かりまくる)
みんなどう対処しているんだろう
170デフォルトの名無しさん
2020/09/22(火) 17:08:47.15ID:QYfnOwKH
>>169
using namespaceするのが問題じゃない?
171デフォルトの名無しさん
2020/09/22(火) 17:49:49.66ID:ZtayyY2i
いやusingに限らず、例えば>>168で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ
確かに検索で困ることはたまにある・・
172デフォルトの名無しさん
2020/09/22(火) 19:24:25.17ID:Xh0fS725
namespace で絞り込んで、識別名をハイライトして、あとは気合
173デフォルトの名無しさん
2020/10/20(火) 13:37:38.41ID:Mso39Itu
C++とVisual C++の違いについてです。
C++はプログラミング言語であり、
VC++は統合開発環境であるという説明があります。
でも私にはVC++がC++++のように見えます。
VC++はC++の文法に新たな流儀を付け加えるか置き換えていて
言語そのものの使用を若干変えているように見えます。
C++のキーワードが別のものに置き換わっていたりするからです。
そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。
この理解は正しいでしょうか。
174デフォルトの名無しさん
2020/10/20(火) 13:38:19.99ID:Mso39Itu
使用改め仕様
175デフォルトの名無しさん
2020/10/20(火) 14:39:40.58ID:C+6cO9mm
多少違うのは
#pragma くらいだろ
勝手に仕様なんて変えない
統合環境とか API とかはもちろん関係無い話
176デフォルトの名無しさん
2020/10/20(火) 20:36:08.28ID:3YoHPXFg
IDEはVisual Studio
VC++はMSのC++商品名

C++/CLIとかを混同してね?
これはC++を独自拡張したものだよ
177デフォルトの名無しさん
2020/10/20(火) 22:21:46.71ID:qSDH25Or
__declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ
178デフォルトの名無しさん
2020/10/21(水) 11:12:14.17ID:xBgAWF1Y
描かずに済むけどな
179デフォルトの名無しさん
2020/10/21(水) 13:51:50.76ID:WStrtR1y
C++/CLIは拡張ですか?
いくつかの流儀を置き換えていますよね?
ポインタをハンドルと読んだり?
180デフォルトの名無しさん
2020/10/21(水) 14:12:49.21ID:xLl2qqDk
MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは?
拡張でいいんじゃね
181デフォルトの名無しさん
2020/10/21(水) 18:58:32.20ID:VaRlK94m
ポインタはポインタとしか言わんよ
ハンドルは
182デフォルトの名無しさん
2020/11/24(火) 23:02:59.67ID:uO0ONWsd
Visual Studio 2019をインストールしました
Windowsスタートボタン→Visual Studio 2019を起動しました
プロジェクト名を入れて下さい→test001
保存フォルダの場所を決めて下さい→Y:\_source\repos
何かのウインドウが開きました(おそらく開発の統合画面?)
さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません
左の縦に、ツールボックスと表示しています
このままでは進まないので、エクスプローラーでreposフォルダの下に
samp01.txtを新しく作りました
何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました

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

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

何かの画面には難しそうなソリューションエクスプローラー、その下には
プロパティウインドウが表示されています。
このウインドウにも慣れないといけないので進め方を教えてください
183デフォルトの名無しさん
2020/11/25(水) 07:42:29.85ID:+VuDDc3z
>>182
とりあえずこれに従えばおk
https://docs.microsoft.com/ja-jp/cpp/build/vscpp-step-1-create?view=msvc-160
184デフォルトの名無しさん
2020/11/25(水) 08:12:43.79ID:1cagBqIs
>>182

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

Visual Studioで、

コード無しで続行→
ファイル→開く→フォルダ
で、コンパイルしてますがね。
185デフォルトの名無しさん
2020/11/27(金) 09:48:07.00ID:sDMv6Edh
>>182
ソリューションを作るときに大雑把にどんなもの作るって指定すれば
最低限のファイルができて編集可能な状態になるんじゃないの?
186デフォルトの名無しさん
2020/11/27(金) 15:09:19.88ID:8PW9KReU
ソリューションエクスプローラーのヘッダーファイル、ソースファイルのとこを右クリックで新規選べばまっさらなファイル作れるし
メニューのファイル→追加?(うろ覚え)でも作れる
187デフォルトの名無しさん
2020/12/06(日) 23:34:56.54ID:TL07p8cG
手順書のページのURLありがとうございます。
Microsoft Visual Studio Community 2019
Version 16.8.2を使用中。
テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、
コロンやセミコロンの間違いはないと思われます。
#include<stdio.h>

int main( void )
{
printf( "ようこそC(++)言語の世界へ\n" );

return 0;
}

タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。

手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。
が、ビルドメニューがありません。
プルダウンのデバッグ(D)からデバッグ無しで開始したいですが
デバッグ無しで開始が薄い文字になっており、クリックできません。
統合開発環境って皆さんが使用して使いやすいはずですよね。
何から順番にクリックしていくのかさっぱりわかりません。
手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて
ソースを書いてコンパイルすらできない、ありません。ありません状態。
同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。
お助け下さい。
188蟻人間 ◆T6xkBnTXz7B0
2020/12/06(日) 23:49:56.18ID:x83Xfz/W
>>187
ソリューションを作成した?
ソリューションにソースを追加した?
189デフォルトの名無しさん
2020/12/07(月) 00:14:40.22ID:MnyC2DM9
アドバイスありがとうございます。
ソリューションエクスプローラー フォルダービューを右側に開いています
そこにhello_.cppが表示されています。いま、開いているファイルです。
#includeからreturnまでペーストしています。

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

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

編集や表示、Git、プロジェクトのメニューを色々クリックしています
変わりません…
何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし
全世界のプログラマの人たちも使っているものですし、なんとか
ビルドメニューを出したいです
190デフォルトの名無しさん
2020/12/07(月) 00:18:03.60ID:MnyC2DM9
あちこちクリックしていますと、画面の上に
プロジェクト、ビルド、デバッグの文字が出てきました
ビルド->ソリューションでコード分析を実行を選びます
デバッグ->デバッグ無しで開始は薄い文字でクリックできません

何か手順が不足しているようです
191蟻人間 ◆T6xkBnTXz7B0
2020/12/07(月) 00:18:08.82ID:LcHpzYm6
ファイルとフォルダの違い
ソリューションの種類が違う

だろうな
192デフォルトの名無しさん
2020/12/07(月) 00:59:54.04ID:MnyC2DM9
不慣れでごめんなさい
デバッグ無しで開始は薄い文字でクリックできず変わらず
本日はそろそろ寝ます
後は明日、使い方と用語を調べます
193蟻人間 ◆T6xkBnTXz7B0
2020/12/07(月) 01:04:11.74ID:LcHpzYm6
初心者は素直にチュートリアルの手順に従ってればいいんだよ。
194デフォルトの名無しさん
2020/12/09(水) 03:22:01.70ID:WuZTb4kZ
濡れちゃうう!
195デフォルトの名無しさん
2020/12/12(土) 02:59:14.21ID:a7AUwK+L
なにからすればいいの
目標がない
196デフォルトの名無しさん
2020/12/12(土) 13:02:07.54ID:A7m2fOl0
「何かしたい」というものが無いならば、しなくてどうぞ。
「何かしたい」というものが有る人は、自分で行動する。
197はちみつ餃子 ◆8X2XSCHEME
2020/12/12(土) 13:39:37.52ID:UUApGKPR
質問サイトにある質問に (根拠になる一次資料 (主に仕様書の具体的な項目) と共に) 回答するのを繰り返せば
特定のプログラミング言語に詳しくなることは出来るよ。
それでプログラミングを出来るようになるかどうかはわからんけど。
198デフォルトの名無しさん
2020/12/12(土) 13:47:09.92ID:k8hTa554
「人工知能搭載の人型アンドロイドが作りたい」
という目標を持つ者が
「printfで文字列を表示したい」
という目標を持つのはとてもつらい
199デフォルトの名無しさん
2020/12/12(土) 18:31:18.09ID:KTyXxWQ0
今日は国会図書館に行ってきたわ。
200デフォルトの名無しさん
2020/12/12(土) 18:34:21.54ID:KTyXxWQ0
国会図書館は国会議事堂内に分室があって資料を取り寄せて閲覧できるんですよ。
でも、ほとんど利用実績が無いらしいんですね。
201デフォルトの名無しさん
2020/12/12(土) 19:52:44.57ID:KTyXxWQ0
国会図書館は若い女性と、男性は老人が多かったです。
土曜日だからかもしれません。
資料のコピーは長蛇の列が出来ていました。
あの列で感染するんでしょうね。
女性のメガネ率は8割超えてました。
おそらくドクター持ちでしょうね。
202デフォルトの名無しさん
2021/02/08(月) 19:09:45.85ID:UEWD7mIf
m1 macbookでc言語始めるのには何が必要ですか?
c言語を始めるパッケージとかって売ってるんですか?
それともフリーソフトでダウンロード出来るんですか?

学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。
203デフォルトの名無しさん
2021/02/08(月) 19:14:35.93ID:XD2vlsgg
0からのって感じ
良いねえ
204蟻人間 ◆T6xkBnTXz7B0
2021/02/08(月) 19:31:11.55ID:ifT1d8uh
>>202
clang、gccなどのCコンパイラのインストールが必要。
205デフォルトの名無しさん
2021/02/08(月) 20:13:50.11ID:UEWD7mIf
>>204
レスどうもです
gccほかググってみました

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

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

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

mruby の本も出た

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

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

人工衛星イザナギ・イザナミで、使っている
208デフォルトの名無しさん
2021/02/08(月) 21:24:52.07ID:mOpGK7eJ
MacでもVSCode、gcc、terminalでええやんけ
209デフォルトの名無しさん
2021/02/08(月) 22:16:35.01ID:UEWD7mIf
>>208
ありがとー
210デフォルトの名無しさん
2021/02/08(月) 22:35:42.15ID:UEWD7mIf
色々教えてもらってありがとう
でもなんかrubyから始める方が良さそうなのでそうします
211デフォルトの名無しさん
2021/02/08(月) 22:48:15.05ID:0fSH6U0R
Mac で、Cをやる人なんているのか?
たいてい、Linux だろ

Macの機械語をもらっても、誰も動かせないw
212デフォルトの名無しさん
2021/02/08(月) 22:48:56.13ID:YmxwiogA
一応Visual Studio Community for Mac
何てものもあるけどね
MacユーザーじゃないのでWindowsと同じように使えるのかどうかは知らんけどw
213デフォルトの名無しさん
2021/02/08(月) 22:52:50.26ID:ObgPii2R
m1ではxcodeはだめなのかなあ
214デフォルトの名無しさん
2021/02/08(月) 23:04:19.24ID:WYlwG+td
大昔のmacbookの話だがxcodeなる10GBくらいの開発環境を入れないとほとんど何も弄れなかった記憶
今のストレージ容量ならmacbookでも行けそう
215デフォルトの名無しさん
2021/02/08(月) 23:11:34.64ID:WYlwG+td
winは仮想環境も充実してるし色々コンパイラ試せるからいいよね
ネイティブサポートもintel mklやVCで結局一番手厚いし
216デフォルトの名無しさん
2021/02/08(月) 23:18:46.61ID:nKLqWVxG
>>207
F-15はAda、F-35はC++で書かれてる。
217デフォルトの名無しさん
2021/02/08(月) 23:37:09.64ID:0fSH6U0R
Linux には、strace という神ツールもある
218デフォルトの名無しさん
2021/02/09(火) 00:44:38.89ID:OoGqnNNo
>>215
それでもApple環境だけはきついのよなぁ
噂通りiPadにxcode載せてくれれば、俺的に余計な出費なしに楽しめたのに
(もちろんiPad自体で開発する気はない)
219デフォルトの名無しさん
2021/02/09(火) 09:28:59.64ID:aKFUc8iT
>>213
普通に使えるはず
VSとか勧めるくらいなら(IDE勧めるなら)macにはxcodeのが正しい
220デフォルトの名無しさん
2021/02/09(火) 12:16:11.15ID:To5JxTyF
macを選ぶこと自体が正しく無い
221デフォルトの名無しさん
2021/02/18(木) 19:54:34.90ID:clnw43k0
M1 macbook買ってruby でうっほっほーしてますわ
222デフォルトの名無しさん
2021/02/18(木) 21:38:45.66ID:sRdwF113
最近コード読まなきゃならん機会増えてきて教養として読めるようにはなりたい
規格に沿ってなくても勉強にいい感じのインタプリタってないかな?
223デフォルトの名無しさん
2021/02/18(木) 21:59:26.94ID:UlBwu06v
プロになりたい香具師は、YouTube で有名な雑食系エンジニア・KENTA のサロンに入って、
16〜32GB メモリのMac で、Ruby on Rails でポートフォリオを作る

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

mrubyの本も出たし
224デフォルトの名無しさん
2021/02/19(金) 15:37:54.68ID:LoU7pdW5
猛烈にNG率高いレス
225デフォルトの名無しさん
2021/02/20(土) 03:42:06.46ID:1WE5qKPk
みんなRubyとかCでなにしてるの
226デフォルトの名無しさん
2021/05/17(月) 11:52:26.06ID:094+MbId
srand((unsigned)time(0UL));
int r=rand()%100-1;
ってコードがあるのですが返ってくる値がランダムじゃなくて規則性があってモヤモヤしてます
参考書によるとsrandの文が起動時に別の値に毎回変えるための文らしいんだけど
返される値が8,18,28,28,38,48.......と10ずつ繰り上がっていってランダムになってません
何を追加すれば規則性が消えるでしょうか?
227デフォルトの名無しさん
2021/05/17(月) 12:50:25.63ID:ZeUb3kXE
>>226
0 以上 99 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );

0 以上 98 以下 の乱数を取得したいなら、
int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 99.0 );
228デフォルトの名無しさん
2021/05/17(月) 13:21:28.15ID:giSQx4b2
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
229デフォルトの名無しさん
2021/05/17(月) 19:09:43.71ID:lfAH/Fki
>>226

これ使うのはダメ?

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

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

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

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

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

繰り返すけが乱数は用途に適しているかどうかであってあらゆる場面で万能な方法はない。
用途次第、状況次第。
231デフォルトの名無しさん
2021/05/18(火) 08:10:11.28ID:ysWtxNVs
229にこれも組み合わせ

https://cpprefjp.github.io/reference/random/uniform_int_distribution.html
232226
2021/05/18(火) 22:58:17.77ID:wt3ZqlEf
今C言語を学習してるのですがC++じゃないと完全ランダムは無理なのですね…。
RAND_MAXは関数なのでしょうか?Cだと使えなかったです。
教えてくださってありがとうございました。
233230
2021/05/19(水) 00:18:20.95ID:ONEwpJm5
>>232
「完全なランダム」とは何か定義して。
234デフォルトの名無しさん
2021/05/19(水) 00:55:55.90ID:g9DnnU6R
せっかくなのでC++を勉強してみては?
235デフォルトの名無しさん
2021/05/19(水) 01:16:05.73ID:OYngDuIu
何をやりたい目的があるから、何々を勉強するだと、速いですよ。
236はちみつ餃子 ◆8X2XSCHEME
2021/05/19(水) 01:17:09.90ID:ONEwpJm5
このスレは C++ スレだからな。
C++ は C との互換性のために残している機能はあるが C++ 的にあまり好ましくない場合もあるし、
完全な互換性が維持されているわけでもない。
237デフォルトの名無しさん
2021/05/19(水) 01:36:10.61ID:OYngDuIu
スレ建てといただす。

0からの、超初心者C言語相談室
http://2chb.net/r/tech/1621355654/
238デフォルトの名無しさん
2021/05/19(水) 01:52:35.92ID:yT7tFlzp
>>232
RAND_MAXは、古くから有るマクロ定数で、stdlib.h で例えば次のように定義されている:
#define RAND_MAX 32767

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

rand()は偏りが強いには強いが、それでも 227 のように書けば 226 のように
下一桁がいつも8になるようなほどではない。
239デフォルトの名無しさん
2021/05/19(水) 01:54:51.13ID:yT7tFlzp
少なくともrand() は、>>227 のように書けば、メルセデスツイストなどの
乱数を使わなくとも普通に使える。>>226 のように書くとダメなだけ。
240デフォルトの名無しさん
2021/05/19(水) 10:58:56.45ID:G7N6xM6g
0から7の整数が均等確率で出る乱数をrとした場合、
x = r % 3;
とすると、xは0〜2までの整数が出るが、均等確率ではない。
それはすべてのパターンを書いてみると分かる:(r,x)を書いてみると、
(0,0)
(1,1)
(2,2)
(3,0)
(4,1)
(5,2)
(6,0)
(7,1)
x= 0 となっているのは、3回。
x= 1 となっているのは、3回。
x= 2 となっているのは、2回。

なので、
P(x=0)=3/8
P(x=1)=3/8
P(x=2)=2/8=1/4

となり、x=2が出る確率だけが小さくなってしまう。

これと同様に、rが0〜32767を均等確率で出す乱数の場合、x=r % 100の値は0〜99までだが
xが0〜99になる確率は均等ではない。
241デフォルトの名無しさん
2021/05/19(水) 12:10:26.94ID:G7N6xM6g
なので、もし、とても偏りの少ない乱数を用いたとしても >>226 では均等に
出現しない。
それを解決するには>>227のようにすればよい。というか227が標準的なrand()の
使い方。
227 だともしrand()が均等確率で出ているならば、結果も均等に出現する。
242デフォルトの名無しさん
2021/05/19(水) 13:29:25.47ID:G7N6xM6g
ちなみに、rand()は、出力範囲内の整数を全て出力し終わってから元の値に
戻る様になっているので周期も RAND_MAX + 1 に等しく、出力値は
均等確率で生じる。
>>226だと10で割った時の余りが必ず8になっておりそれは、出力が
10n + 8 になっているということ。これだと、今言った法則に当てはまって
ないので矛盾し、何かがおかしい。
243デフォルトの名無しさん
2021/05/19(水) 15:03:30.63ID:SQApMI36
C言語でのサーバー構築のやり方わかる方いますか?
244デフォルトの名無しさん
2021/05/19(水) 15:05:53.17ID:G7N6xM6g
>>243
HTTP サーバーのことかな?
245◆QZaw55cn4c
2021/05/19(水) 19:58:38.12ID:Y2/6iGxL
>>243
バークレーソケットをオープンしてリスンして、接続してきたのなら fork() だのスレッドで処理だの、というのを昔したことがありますが、すっかりわすれてしまいました…
どんなサーバーが欲しいのですか?簡単なサーバーならご要望に応えてテキトーに書く準備はありますよ
246はちみつ餃子 ◆8X2XSCHEME
2021/05/19(水) 23:06:46.13ID:ONEwpJm5
>>241
それはよくある勘違い。 >>227 の方式では均等にならない。 櫛状にばらける。

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

少なくとも私の手元の環境にある std::uniform_int_distribution はそのように実装されている。
247デフォルトの名無しさん
2021/05/19(水) 23:56:26.10ID:l+JWTKLH
>>241はアホと思ったけど、
こんな勘違いをするアホがよくいるって?
そんなアホな
248デフォルトの名無しさん
2021/05/20(木) 00:27:22.67ID:qlUu+R49
>>246
uniform_real_distributionの時は?
249デフォルトの名無しさん
2021/05/20(木) 02:25:38.74ID:Dz+v3/+O
>>226
の結果は予想と外れていると思う。
rand()は均等確率のはずなのに、100で割って下一桁に9ばかり出るはずはない。
250デフォルトの名無しさん
2021/05/20(木) 02:28:22.34ID:UJvm/t/I
>>246
なるほど。言われてみればそうだわ。
32767はもともと100で割り切れないから、一部を捨ててやらないと
均等にはならないな。
251デフォルトの名無しさん
2021/05/20(木) 02:52:09.51ID:onv6EMq1
しかし、昔実験してみた限り、rand()の周期は、通常、RAND_MAX + 1
であり、rand()自体は均等確率のはずだ。
それはべつに、>>246ではちみつが言っていることと矛盾するわけではない。
RAND_MAXが32767のように100で割り切れない値だから、>>227
のようにすると、端数の様な部分でわずかに均等確率からずれてしまう。
ただし、ずれる範囲は、32767/100 = 327.67 なので、確率にして
0.67/327 程度以下の小さなずれではあるが。
252◆QZaw55cn4c
2021/05/20(木) 22:00:26.21ID:+zMkmbAL
>>246
剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>246 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法
MT が発明されるまでは、最悪の方法「線形合同法」でもなんとか我慢できる部分範囲の乱酔生成法しか推奨されなかった

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

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

Q:すぐに思い付く、
rand() % N
(これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜな ら乱数発生器の多くで下位のビットは悲惨なほどランダムでない。よりよい方法は以下のようなものである。
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
253はちみつ餃子 ◆8X2XSCHEME
2021/05/20(木) 23:50:59.51ID:qkpZwp6c
>>252
乱数ソースの性質の悪い部分を分布関数で修正するのはレイヤの分離がきちんと出来ていない感じがして嫌だな。
下位ビットを捨てるなら捨てるでそれが明示的であるほうが好ましいと思う。
254デフォルトの名無しさん
2021/05/21(金) 00:17:02.51ID:Q+lecBxK
QZからはキムチの匂いがする
255デフォルトの名無しさん
2021/05/21(金) 10:19:44.69ID:pMLUvwAV
いずれにせよ >>226 は、まともな標準ライブラリで試すと 226 のような結果に
はならないはず。理由:
226では、rand()%100の下一桁が常に9だが、それだとrand()は常に奇数という
ことになるが、実際のrand()は全て奇数ということはないから。
現象的には、偶数と奇数が交互に来るという不具合が知られていたりするが、
全部奇数ということはない。
256デフォルトの名無しさん
2021/05/21(金) 10:27:54.72ID:b4MjZLXj
超初心者スレであることを考えると >>226 の srand() がプログラム起動時一度だけとも限らないのでは。
257はちみつ餃子 ◆8X2XSCHEME
2021/05/21(金) 13:18:40.70ID:JT5uzYpW
Windows の (msvcrt の) rand は線形合同法だが下位バイトを豪快に捨ててる。
そのせいか (下位バイトを捨てない線形合同法よりは) 乱数としての質は多少良いが
初期値の違いに鈍感で、初期値が似ていれば最初の乱数も近いということが起こる。

>>256 の指摘は妥当かもしれない。
258デフォルトの名無しさん
2021/05/21(金) 17:16:26.14ID:qriMwFf7
>>256
つまり、rand()だけを繰り返しているのではなく、srand()とrand()の組を
ひっくるめて繰り返しているようなことなのかな。
なるほど、それなら問題の焦点はsrand()と時刻の関係性になるので
>>226のような結果になったとしてもおかしくはないな。
259デフォルトの名無しさん
2021/05/21(金) 17:24:43.18ID:qriMwFf7
なるほど。
質問者は、だから>>227でも快い返事をしてくれなかったのか。
彼は例えば、以下の様に書いていたようだね:
(1)
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100-1;
 printf( "r=%d, ", r );
}
本来は、こう書くか、
(2)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
 int r=rand()%100-1;
 printf( "r=%d, ", r );
}
こう書く:
(3)
srand((unsigned)time(0UL));
for ( int i = 0; i < 20; i++ ) {
  int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 );
  printf( "r=%d, ", r );
}
この中で(1)はダメ。(2)も余り良くない。(3)はplain Cでの簡単な書き方では
標準。しかし、わずかに均等確率からはズれる。
260デフォルトの名無しさん
2021/05/21(金) 18:35:20.74ID:ojw3YA/u
>>255
>>226を見れば乱数になってないことは一目でわかると思うのだけど

>>255の時点で毎回srandを呼んでるのかとも思ったけど、
それにしても値が綺麗すぎる。
261デフォルトの名無しさん
2021/05/21(金) 19:25:04.91ID:UZ6lwfzX
Cはよくわからんのだけど(3)のやつわざわざdoubleにキャストする必要あるの?
262デフォルトの名無しさん
2021/05/21(金) 20:07:22.28ID:ojw3YA/u
RAND_MAX + 1 でオーバーフローするとか
263デフォルトの名無しさん
2021/05/21(金) 20:19:47.95ID:UZ6lwfzX
最低でも32767以上だからINT_MAXのときもあるのか…
ありがとうございます。
264デフォルトの名無しさん
2021/05/21(金) 20:22:18.98ID:UZ6lwfzX
と思ったけどRAND_MAX+1.0した時点でdoubleになるんじゃ?
265デフォルトの名無しさん
2021/05/21(金) 20:30:15.34ID:ojw3YA/u
>>264
なるけど

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

まあそれ以前に (3) はカッコの対応がおかしいな
266◆QZaw55cn4c
2021/05/21(金) 20:40:21.60ID:XRGlJQOp
>>253
確かに今となっては MT が開発されてしまったので、その感覚は理解できます
しかし、我々は MT がなかった頃の好き古き時代についても考慮するべきでしょう、過去の方法を評価するのに、その当時の技術的制約を考慮せずに「今の価値観」で裁断するのはフェアではない、と私はつくづく考えているのです
267◆QZaw55cn4c
2021/05/21(金) 20:47:24.81ID:XRGlJQOp
>>256-257
なるほど、従って >>226 に対する適切なアドバイスは次のとおりだと私は提案します

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

https://ideone.com/M2SRcE
http://2chb.net/r/tech/1434079972/60
268デフォルトの名無しさん
2021/05/21(金) 21:29:08.32ID:ojw3YA/u
どう見ても乱数生成法の質の問題じゃない
使い方が間違ってる

乱数の質を求めるならハードウェアの乱数生成命令を使うのが一番だが
>>226はそういうレベルじゃない
269デフォルトの名無しさん
2021/05/21(金) 21:33:53.10ID:ojw3YA/u
Visual Studioで以下をやったら>>226みたいな値になった
3秒ごとにsrand/rand をコールしてるんでしょう

for (int i = 0; i < 100; i++) {
srand(i*3);
printf("%d\n", rand() % 100);
}
270◆QZaw55cn4c
2021/05/21(金) 23:18:48.19ID:XRGlJQOp
え? >>226 って srand() を複数回呼んでいるんですか?確かにそれは間違っていますね…
srand() は普通、アプリ起動直後に一回だけ呼べば十分ですよ…
271デフォルトの名無しさん
2021/05/22(土) 02:03:33.66ID:8I9NK3Yz
>>269
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100;
 printf( "r=%d\n", r );
 getche(); // 3 秒間隔で人間が Enter キーを押す。
}
272デフォルトの名無しさん
2021/05/22(土) 02:04:35.75ID:MF6mf+kw
>>269
洞察すれば、こんな風だろうか?
(端末で確認しながら三秒間隔でEnterキーを押している) :
for ( int i = 0; i < 20; i++ ) {
 srand((unsigned)time(0UL));
 int r=rand()%100;
 printf( "r=%d\n", r );
 getche(); // 3 秒間隔で人間が Enter キーを押す。
}
273デフォルトの名無しさん
2021/06/02(水) 11:54:46.08ID:QfG+Xq1u
書籍の意味が分からないので教えてほしいのですが
それ以外のって部分から何を言ってるのか全く分かりません

”signed char a;である時は、aには−128〜127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。
最大値より大きい値になった時をオーバーフロー…略”
274デフォルトの名無しさん
2021/06/02(水) 12:23:21.09ID:A2GTbdiP
何を教えてほしいのかわからない。
275デフォルトの名無しさん
2021/06/02(水) 12:37:39.80ID:QfG+Xq1u
>>274
ロベールの107ページの

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

↑この文が意味不明なので簡単に教えてほしいです
”signed char a;である時は、aには−128〜127の数値しか入れられません” ここまではなんとなく理解できたのですが…
276蟻人間 ◆T6xkBnTXz7B0
2021/06/02(水) 12:45:51.56ID:1WJ2HfQ7
>>275
そもそもビットとかバイトとかわかるの?
わからないなら、基本情報から勉強しないといけない。
277デフォルトの名無しさん
2021/06/02(水) 12:56:19.74ID:QfG+Xq1u
>>276
この前のページに2進数 1ビット 1バイトなどの単位と各型のバイト数について触れられてるので
そこは何となく理解できてるのですが
278蟻人間 ◆T6xkBnTXz7B0
2021/06/02(水) 13:18:03.17ID:1WJ2HfQ7
>>277
1ビットは、2進数一桁で、ゼロかイチ。
2ビットは、2進数二桁で、00、01、10、11の2**2==4通り。これらは10進数で表すと0、1、2、3となる。
3ビットは、2進数3桁で、000、001、010、011、100、101、110、111の2**3==8通り。これらは10進数では、0、1、2、3、4、5、6、7となる。
……
8ビットは、2進数8桁で2**8==256通り。10進では0〜255となる。現代では8ビットは1バイトに相当する。1バイトは16進二桁で表せる(2**8==16**2)。

以上は符号なしの場合。

符号付きの場合は最上位ビットがマイナス符号の有無を表し、正の場合は符号なしと同じで、負の場合は2の補数表現になる。
279蟻人間 ◆T6xkBnTXz7B0
2021/06/02(水) 13:32:39.22ID:1WJ2HfQ7
2の補数表現というのがくせ者だが、まあ、Wikipediaの説明を見てもらいたい。

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

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

まあ、例えば10進数4桁1234の10の補数表現は8766となる。1234+8766==10000となるが有効4桁からオーバーフロー(桁あふれ)してゼロになる。8767の場合は1234+8767==10001、
オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。
280デフォルトの名無しさん
2021/06/02(水) 14:31:54.50ID:CzhBAh+2
お、優しい先生が現れたぞ。嘘ばかりの5ちゃんの中で珍しい。
281デフォルトの名無しさん
2021/06/02(水) 14:44:42.56ID:QfG+Xq1u
>>279
すいません詳しくありがとうございます
補数って概念全く理解してなかったので、それが原因だと分かりました。
コンピュータは足し算しかできないのですね…
そこら辺知識固めてからもう一度読み直してみようと思います。
282蟻人間 ◆T6xkBnTXz7B0
2021/06/02(水) 16:48:03.08ID:1WJ2HfQ7
10進4桁の場合、9999に1を足すと10000、オーバーフローしてゼロになる。よって、このオーバーフローするシステムの場合、9999はマイナスイチを表していると考えることができる。
同様に9998は-2であり、9997は-3である。
283蟻人間 ◆T6xkBnTXz7B0
2021/06/02(水) 16:54:31.73ID:1WJ2HfQ7
符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。

規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。
284はちみつ餃子 ◆8X2XSCHEME
2021/06/02(水) 17:04:16.45ID:Bcy6nIKX
一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、
(C++20 からは二の補数であることが保証されるようになった)
1バイトが8ビットであることも保証してない。
signed char に型変換したときに上位ビットを切り捨てることも保証されない。
(変換後の型が unsigned のときには実質的に保証される。)

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

C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢
をとれるように言語仕様の側では意図的に決めてない部分がある。
「C++ の説明」として見たら >>275 で引用されている説明はちょっと微妙かもしれん。
あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。
285デフォルトの名無しさん
2021/06/02(水) 23:13:21.37ID:ZuDsQZsq
float/doubleは
286デフォルトの名無しさん
2021/06/03(木) 02:59:14.77ID:Ers5yK+g
char は環境依存なので使わないようにする。
unsigned・signed のどちらなのか、分からないため

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

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

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

1111_1111・0xFF なら、256か、-1
287286
2021/06/03(木) 03:03:09.44ID:Ers5yK+g
>>286
修正

256 ではなく、255 です

unsigned char は、0〜255

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

だから、環境依存のchar 型を使っていると、
エラーに、-1を使っていたが、他の環境では255と表示されたりする
288デフォルトの名無しさん
2021/06/03(木) 10:13:20.76ID:oKNqyVQK
むしろ int を期待してる引数に char 渡す時が危険
289はちみつ餃子 ◆8X2XSCHEME
2021/06/03(木) 13:38:18.86ID:ivgy5ZU8
char 同士なら符号の有無が違ってもビットパターンは維持された
ままで型を読み替えることが期待できる (言語仕様として保証しているわけではない)
けど、大きな型に変換するときは符号拡張が起こることがあるからだね。
290デフォルトの名無しさん
2021/06/05(土) 22:29:47.19ID:UR0LV/yo
ハーバートシルト『STL標準講座』翔泳社, 1999, p.156-157
のサンプルプログラムで、そのままだとコンパイルが通らないものがあるのですが、
適当にconstをつけていたらコンパイルできるようになりました
しかし、理由がわかりません
どなたかご教示いただけませんか?
https://ideone.com/LGnjXo
291デフォルトの名無しさん
2021/06/06(日) 01:24:02.19ID:Lz5dZs8J
operator <<のとこでoがconst参照だから、そのoからはconstなメンバ関数しか呼べない。のでそれで合ってる
元のソースが間違ってるか何かだと思う、この仕様は最初からのはずなので
292◆QZaw55cn4c
2021/06/06(日) 01:44:38.27ID:xlnMgrm3
>>290
set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。
だから set<>::iterator p; …@、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。
例えば@の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。

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

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

提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。
https://ideone.com/Zr1qIH
friend 略 operator<<(略 C const &obj) { ... }
にならなくてはならないのは set<C>::iterator は set<C>::const_iterator と同じだからです
friend bool operator<(C const &a, C const &b) は set への要素の挿入のときに使う比較関数ですが、比較作業以外に要素のメンバを変えるとか余計なことをさせないために、最初から const 参照で宣言するべきでしょうし、そうなっているみたいですね

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

いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください
293◆QZaw55cn4c
2021/06/06(日) 01:58:54.60ID:xlnMgrm3
>>290
>>292

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

&& は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
294◆QZaw55cn4c
2021/06/06(日) 02:07:24.75ID:xlnMgrm3
>>291
operator<<() のストリームじゃないほうの引数は、const 参照ではなくてもいいと思います
今回のは const 参照が要求されたのは、 set のイテレータだから
https://ideone.com/j6CV0s
295◆QZaw55cn4c
2021/06/06(日) 02:32:48.87ID:xlnMgrm3
>>292
ソースを貼り付けた一行目がミスっていましたね、修正します。

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

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

というか昔のままの非constの方が良かったんだけどなぁ
比較演算子自分で書いてるような構造体だと順序変わらない場合もあるんだし・・正直押し付けがましい
297◆QZaw55cn4c
2021/06/06(日) 03:22:16.34ID:xlnMgrm3
>>296
自分で一から書く分には const に一貫性を持たせて、結果、const が有用に働くように書いていけるかもしれない、とか思うのですが、
他の人の分を取り込むときは、最悪 const_cast を >>290 の言うように「適当にconst_cast をつけていたらコンパイルできるようになりました」とか私も言っているわけでして、私は >>290 を笑うことができません……
298デフォルトの名無しさん
2021/06/06(日) 08:29:50.46ID:KyPgEn9X
一から書いている私ですが、
全てのフォルダ・ファイル・プログラムに一貫して
*と何か名前を付けてプログラミングをしています。
299デフォルトの名無しさん
2021/06/06(日) 08:34:21.45ID:8VTCuGWY
QZ・・・・
C++をちゃんと理解できてないのに無理すんなw
300◆QZaw55cn4c
2021/06/06(日) 09:27:07.17ID:xlnMgrm3
>>299
>C++をちゃんと理解できてないのに無理すんなw

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

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

>>290 に対する回答としての >>292, >>294 に間違いはないですよね?
301デフォルトの名無しさん
2021/06/06(日) 09:44:11.48ID:WkbXnMOk
意味分からん理屈だな
ずっと前からC++分からないって言ってるよね?
もしかして理解できる頭を持ってないのかな?
302◆QZaw55cn4c
2021/06/06(日) 13:37:50.42ID:xlnMgrm3
>>301
自己申告なんて当てにしてはいけないのでは?
303デフォルトの名無しさん
2021/06/06(日) 15:27:30.95ID:fMmzH2Jl
文面から必死な感じがヒシヒシと伝わってくるのに
皮肉も理解できないとはさすが厚顔無恥の代表格
誰も認めてくれないから自画自賛するしかないんですね
304◆QZaw55cn4c
2021/06/06(日) 16:22:05.09ID:xlnMgrm3
>>303
え?必死?思いがけない反応ですね
まあ >>290 の方が提示したソースはハーバードシルトにしては冗長だと思って無駄丁寧っぽく説明したほうがいいかと >>292 をワサワサ書きましたが、それが必死だとは…
よく分かっている方 >>291 に対しては簡潔に私の意見 >>294 を送ってもう十分、仕様変更があったという情報 >>296 をいただいて感謝、というところでしょうか
305290
2021/06/06(日) 22:29:30.82ID:DvMt5hdj
>>291
>>292
どうもありがとうございます

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

ご説明いただいた内容を足掛かりに理解を深めたいと思います
3061
2021/06/07(月) 07:01:58.64ID:pWKPTo4/
まぁ、いいじゃねぇか、プログラミングなんて何にも知らないってのスレだし。
307デフォルトの名無しさん
2021/06/07(月) 07:48:28.30ID:c29T7zKX
const char* const str[] は文字列アドレスを格納するポインタの配列って意味であってますか?
const char* strは文字列を格納するポインタ?
char str[] は文字配列?

一気に出てきてよくわからなくなって来たので間違えてたら教えて欲しいです。
308デフォルトの名無しさん
2021/06/07(月) 08:39:52.02ID:xFpLHEPr
>>307
だいたいあってる
309デフォルトの名無しさん
2021/06/07(月) 11:12:06.49ID:BLDePS2Q
ちゃんとメモリ確保してから使えよ
310デフォルトの名無しさん
2021/06/07(月) 22:09:28.76ID:JY7FyEcf
>>308
ありがとうございます。
311デフォルトの名無しさん
2021/06/08(火) 23:28:22.97ID:kZSYpF+Y
https://ideone.com/2fyV5M

103 と115で確保された動的配列のアドレスは別物なんでしょうか?
コピーコンストラクタの動きがよくわからないです
312デフォルトの名無しさん
2021/06/09(水) 02:24:41.44ID:ZtayyY2i
103のarrayはコピーされたものだから別物だよ
てか初っ端から手直しが必要なソースを貼るのはやめろ
313デフォルトの名無しさん
2021/06/09(水) 02:39:16.49ID:Ih94CWHU
スレの主旨的に初心者が初歩的な質問をするのは別に構わんとは思うんだが、
入門書にでも書いてあるようなことはよく読んで勉強したほうがいいと思うぞ。
素人が1レスで答えるよりはちゃんと体系だった解説のほうがわかりやすいよ、常識的に考えて。
314デフォルトの名無しさん
2021/06/09(水) 04:24:03.76ID:BGdtXEJj
>>312
すいません、ヘッダーとかcpp分けてるのどうアップロードすればいいのか分からなかったです

後65行目にcopy(other.m_array, other.m_array + m_size, m_array);とあるのですが何をしてるのか分かりません
本には”第1引数以上第2引数未満のアドレスにあるデータを第3引数の指すアドレス以降にコピーする関数で…とあるのですが
具体的に何をしてる関数なのでしょうか?第2引数の足し算も何なのかよく分かりません。
315デフォルトの名無しさん
2021/06/09(水) 04:43:32.09ID:ZtayyY2i
https://ideone.com/EScxwq
こうしたらそのままコンパイル通るやろ
自分のヘッダincludeしてるとこにヘッダの内容貼り付けるだけ

https://cpprefjp.github.io/reference/algorithm/copy.html
memcpyと似たようなもん(コピーの仕方は違うけど
other.m_arrayの指すアドレスから+m_size分のアドレスまで(未満)をm_arrayの指すアドレスから同じく+m_size未満までコピーしとるだけ
これで分からんならポインタの理解が出来てない
上記のとこだとイテレータとか出てるけどこの場合ポインタなので全部ポインタに読み替えていい
316デフォルトの名無しさん
2021/06/09(水) 04:53:28.23ID:ZtayyY2i
ちょっと誤解招きそうなので補足
m_sizeは個数なのでアドレス値ではないがintのm_size個分アドレスが加算される
このへんは>>313の言う通り入門書嫁
317デフォルトの名無しさん
2021/06/09(水) 14:16:25.82ID:3Qpbsqp/
cpp で socket を読み書きする stream 系の class ってありますか?
boost にはあったと思いますが
標準のはあるんですか?無いですか?
318はちみつ餃子 ◆8X2XSCHEME
2021/06/09(水) 16:06:33.34ID:Ih94CWHU
>>317
標準には無い。
が、ソケットに stream のインターフェイスをかぶせることはそれほど難しくはない。
319デフォルトの名無しさん
2021/06/09(水) 22:30:15.61ID:BwbEIJxn
>>315
1引数から2引数で足したアドレスまでを第三引数にコピーしてるのですね
やっと分かりました。ありがとうございます。
頭硬い人はロベール向いてないのかな…
320デフォルトの名無しさん
2021/06/09(水) 23:57:13.88ID:ZtayyY2i
それは良かった
まぁ最初は理解に時間かかるもんだ
321デフォルトの名無しさん
2021/06/10(木) 10:45:51.80ID:ZbfFyHii
>>318
thx

cpp の std にある関数で glibc の様な getpass ってありますか?
標準のは無いですか?
322はちみつ餃子 ◆8X2XSCHEME
2021/06/10(木) 14:24:18.43ID:MOYAWABe
>>321
無いよ。
323デフォルトの名無しさん
2021/06/11(金) 14:28:13.59ID:tB3/M6ll
FILE *fp = fopen() で取得した fp を使って
stringstream としてアクセスすることは出来ますか?
324はちみつ餃子 ◆8X2XSCHEME
2021/06/11(金) 17:27:01.32ID:DsaVPusD
>>323
直接的に一発で FILE* に stream をかぶせる手軽な方法はないと思うけど、
std::basic_streambuf を継承して setbuf, overflow, sync などをオーバーライドしたクラスを作ればストリームバッファになる。
(普通は std::basic_filebuf も内部的にはそう実装されているはず。)
それをストリームに結び付ければストリームに出来ることは何でもできるよ。

仕様を調べるのがすごくしんどいだろうけど、
実装は (細かいエラーチェックとかを抜きにすれば) 百行も要らないくらいの簡単なものでいけるんじゃないかな。
325デフォルトの名無しさん
2021/06/16(水) 00:59:39.17ID:QFUk0bjY
>>323
fstreamを使えば?
#include <fstream>
#include <sstream>

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

それともfstream使えない特殊な環境?
326デフォルトの名無しさん
2021/06/16(水) 16:36:23.72ID:uJQ6HHCX
FILE *fp = fopen(...);
std::ifstream fs(fp);
出来たらいいな
327デフォルトの名無しさん
2021/06/17(木) 21:31:03.90ID:OB6uOiq6
関数へ渡す引数の型を限定したいときどう書くのが一般的ですか?
具体的に言うと符号なしのintだけ受けつけたいんですけど
328はちみつ餃子 ◆8X2XSCHEME
2021/06/17(木) 23:54:09.39ID:Gi/wqrqm
>>327
暗黙の型変換を許さないということかな?
それならテンプレートにした上で型に制約を付ければいい。
ここでは C++11 でも通るように書いてみたけど C++20 以降なら
コンセプトが使えるのでもう少し簡単に書ける。

#include <type_traits>

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

int main(void) {
int a = 1;
unsigned int b = 2;
foo(a); // これはエラーになる
foo(b); // これは通る
}
329デフォルトの名無しさん
2021/06/18(金) 08:42:03.67ID:kejK9s3z
なんで戻り値voidに限定してんだよボケ餃子
330デフォルトの名無しさん
2021/06/18(金) 11:49:14.92ID:AVf6Ht59
確かにそれで可能だけど、回答が超初心者スレのレベルを逸脱していると思うのですが
331はちみつ餃子 ◆8X2XSCHEME
2021/06/18(金) 18:30:00.74ID:JA4mPV9U
>>329
単なるサンプルだからだよ。

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

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

もっと簡単な方法があるならそれを提示するんだけども、なくなくなくない?
332デフォルトの名無しさん
2021/06/18(金) 19:23:19.39ID:kejK9s3z
>>331
アホか
普通のenable_ifの使い方と全く違うお前だけのオナニーコード押し付けて何がサンプルだ
何不必要な制限勝手につけてドヤってんだボケ
333はちみつ餃子 ◆8X2XSCHEME
2021/06/18(金) 19:32:07.35ID:JA4mPV9U
>>332
返却値 (または enabler) で制限するのは普通だろ。
むしろ他にどう使えるんだ?
334デフォルトの名無しさん
2021/06/18(金) 19:35:45.29ID:kejK9s3z
>>333
マジで言ってんのか?

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

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

enablerってこれのことか知らんが、お前のコードだと戻り値voidにしか出来んだろってこと
335デフォルトの名無しさん
2021/06/18(金) 19:42:19.79ID:kejK9s3z
>>327
ちなコンセプト版(C++20対応コンパイラが必要)

#include <type_traits>

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

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

int main()
{
// foo((int)1);
  foo((unsigned int)1);
}
(インデントは全角なので注意)
まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか
336デフォルトの名無しさん
2021/06/18(金) 19:43:08.40ID:AVf6Ht59
>>331
いや、お前の言いたいことは分かるよ
ただテンプレートメタプロコードを超初心者にいきなり例示して、「わからないところを続けて質問」して回答を繰り返して、結果的に理解に至るのは何ヵ月後になるんですかと
テンプレートに関する高度な質問が飛び交う中、ここは超初心者スレとして機能するんですかと

この場合>>327が求めているのはドリルじゃなくて穴だと思うよ俺は
どういう背景があってunsigned int以外を受け付けたくないか、を聞くべきなのでは?
337デフォルトの名無しさん
2021/06/18(金) 19:57:29.32ID:kejK9s3z
確かにそうだね
というか自分もテンプレート以外思いつかんかった・・

>>333
なんか変な癖あるから標準的な使い方がすっぽ抜けてたのかね
ボロカス言って悪かった
338デフォルトの名無しさん
2021/06/18(金) 20:01:53.90ID:zIhiG+wy
あんまり詳しくない俺にはこういうのしか思いつかん。
__my_func() は直接呼ばないお約束にしておいて、static_assert で。
template のところは、書き換えは雰囲気でできると思うけど・・・

#include <type_traits>
#include <iostream>

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

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

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

//std::cout << my_func(1) << std::endl; // assert
//std::cout << my_func(a) << std::endl; // assert
std::cout << my_func(1U) << std::endl;
std::cout << my_func(b) << std::endl;
}
339はちみつ餃子 ◆8X2XSCHEME
2021/06/18(金) 20:30:53.23ID:JA4mPV9U
>>334
> お前のコードだと戻り値voidにしか出来んだろ

なんか変なこといってると思ったらそこがすれ違いか。
std::enable_if のテンプレート引数の二個目を省略しなければ何にでも出来るよ。
(std::enable_if の type は void に固定されているわけではない。)
クラスやコンストラクタは返却値がないから enabler を使うんであって、
普通の関数のときは返却値のほうで制御するのが普通だと思うぞ。
340はちみつ餃子 ◆8X2XSCHEME
2021/06/18(金) 20:33:26.89ID:JA4mPV9U
>>336
まあそうなったら他に誘導してもいいし、資料を提示するだけで十分だと思った。
ただ背景をもうちょっと引き出すべきというのも確かに必要なことではあったな。
341デフォルトの名無しさん
2021/06/18(金) 20:39:10.69ID:kejK9s3z
そうなんか、そういえばいつも自作alias使ってたから気付かんかったわ

>普通の関数のときは返却値のほうで制御するのが普通
別に戻り値でも引数でもいいが、クッソ読みづらいと思うけどな
あとそれならこういうスレで第2引数省略すんなよ、初心者惑わしたいのか?
3421
2021/06/19(土) 15:34:05.42ID:kvHrZ2tI
ここは中級者が、お互いを煽り合うスレでは無い、ということを理解して欲しい。
343デフォルトの名無しさん
2021/06/19(土) 16:53:11.57ID:zDrgWeBe
引数同じで戻り値だけ違う関数を造って使い訳たい
344デフォルトの名無しさん
2021/06/19(土) 17:01:53.54ID:xVp2TfT/
>>342
俺ははちみつが書くより先に同じこと(enable_if)思ってたけど、このスレには不適切だと思って書くのやめてたんだけどな
あんな不適切で不親切な回答(テンプレートとSFINAEとか、はちみつも使いこなせてないようなものを使う上に戻り値の変更方法も、自身が言ってるコンセプト版も書かない)に怒っちゃいかんのか
345はちみつ餃子 ◆8X2XSCHEME
2021/06/19(土) 17:30:35.18ID:/f53/cxR
>>344
そこらへんが少しばかり詳細なら初心者に理解できる内容になるという主張?
少々の書き方の工夫で初心者がわかるように解説できるわけないだろ。
関連知識も含めればちょっとした本一冊分くらいにはなる内容なんだから。

「まずはテンプレートの知識が必要ですね」ということが初心者に対する解で、
そこに至る前にごちゃごちゃしたことを詰め込むのは不親切だと思うわ。
346デフォルトの名無しさん
2021/06/19(土) 17:34:51.32ID:xVp2TfT/
>>343
戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも
template <typename T>
T hoge();

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

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

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

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

?hoge(int());
hoge(float());
347デフォルトの名無しさん
2021/06/19(土) 18:00:39.76ID:kvHrZ2tI
1 + 1 = 1
348デフォルトの名無しさん
2021/08/24(火) 01:28:35.73ID:WM1jAzNs
https://pastebin.pl/view/e395f5ca

operator関数の動きがよくわからないんですが
tmp.x = x + p.x;
これの p.xと xとtempはどのオブジェクトのことを指してるんでしょうか?
349はちみつ餃子 ◆8X2XSCHEME
2021/08/24(火) 01:50:15.06ID:MkJE9y3A
>>348
operator+ は演算子 + の実体として機能する。
故に p1+p2 は p1.operator+(p2) と書いた場合と完全に同じ。

tmp はもちろんこの関数内で宣言した tmp 変数だし、
p は渡された引数 (この場合は p2) のコピーなので p.x には 6 が入ってるね。
350デフォルトの名無しさん
2021/08/24(火) 02:43:37.56ID:WM1jAzNs
>>349
ありがとうございます。引数がどれに対応してるかわかりました。
p1.operator+(p2) これは何でしょう?
351デフォルトの名無しさん
2021/08/24(火) 03:37:20.26ID:gGQMgsWd
掛け算の*と、
色々を示す*が
同じ*なんで困っていますが、どうしたらいいんでしょうか?
352デフォルトの名無しさん
2021/08/24(火) 03:55:09.38ID:jikR3Y9f
色々ってワイルドカードのこと?
C++においては*は乗算かポインタ関係だけだよ

>>350
p1のメンバ関数として普通にoperator +を呼んでるだけ
353デフォルトの名無しさん
2021/08/24(火) 04:29:07.93ID:gGQMgsWd
ありがとうございます。
c++ のワイルドカード記号ってなんでしょうか?
354デフォルトの名無しさん
2021/08/24(火) 04:33:24.90ID:jikR3Y9f
言語そのものには無いよー
エディタやIDEで検索するのには使えることもあるが
355デフォルトの名無しさん
2021/08/24(火) 04:45:36.01ID:gGQMgsWd
教えてもらって、勉強になりました。
ありがとうございました。
356デフォルトの名無しさん
2021/08/24(火) 07:22:03.54ID:WM1jAzNs
https://pastebin.pl/view/31e451ad

クラスの型変換と型変換用のコンストラクタの意味が全く分からないのですが
これをすると何が得なのでしょうか?10行目は普通のコンストラクタに見えますがなぜ変換用?
入門書に載ってるコードなのですがエラーで動作もせず何がなんだか分かりません…
357デフォルトの名無しさん
2021/08/24(火) 15:23:13.01ID:jcrsR8Np
2つ目のprivateはpublicの間違いじゃね?
あと変換は、単に引数一つだけを受け取るコンストラクタは
自動的に?暗黙のキャストにも使われる、というだけ(それを禁止する方法もあるが
358デフォルトの名無しさん
2021/08/25(水) 07:15:15.42ID:dwOa++JV
>>357
おかげさまで動きました。ありがとうございます。
でもいまいち型変換の意味が分からないのですが
operator 型名()return 変数を定義するとどの変数にも代入出来るようになるってことですか?
359デフォルトの名無しさん
2021/08/25(水) 15:58:08.24ID:3/bOIe3o
C++ キャスト でぐぐるといいよ
(キャストはCにもあるけど)
360はちみつ餃子 ◆8X2XSCHEME
2021/08/25(水) 22:29:05.16ID:/Q8zinJC
>>358
型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし
て書いてもかまわないんだが、変換関数 (conversion function) または変換
コンストラクタ (converting constructor) が定義されていると暗黙の型変換
が適用される文脈では勝手に適用して変換してくれるので便利。

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

struct foo {};

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

void func(foo) {}

int main(void) {
foo x = bar();
func(bar());
}
361デフォルトの名無しさん
2021/08/26(木) 01:12:00.54ID:BlNdGFU0
>>360
ようやくイメージできてきました。ありがとうございます!
362デフォルトの名無しさん
2021/08/26(木) 06:25:31.31ID:C2TXXzWD
>>360

そんな難しくせずに、

{ change A to B }

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

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

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

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

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

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

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

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

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

constの効果を教えてほしいです
後ろのstrの前のconstは付けると
const str[0]="dddd"って出来なくなるのは分かったのですが
先頭のconstが分かりません
369デフォルトの名無しさん
2021/10/06(水) 22:51:34.11ID:ItOX1MR6
str[0][0]='d';
370デフォルトの名無しさん
2021/10/06(水) 22:53:20.88ID:OG+j1FAK
>>369
なるほど。
ありがとうございます。
371デフォルトの名無しさん
2021/10/09(土) 07:12:25.69ID:JFpyaThm
ロベールC++入門の代入演算子についてなのですが
コピーコンストラクタのときは動的配列をdelete[]しなかったのに
なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい
本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク
と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます

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

コピーコンストラクタでのdelete、
いつnewしたデータに対して?
373デフォルトの名無しさん
2021/10/09(土) 17:51:02.84ID:QAOoCtV/
>>372
すいません、わからないです。
コピーコンストラクタはnewでアドレスを確保しないものなのですか?
374はちみつ餃子 ◆8X2XSCHEME
2021/10/09(土) 18:03:01.95ID:Z56nk6n1
>>373
ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、
それがわからんのならたぶんそれ以前の章を理解でてきないと思う。
375デフォルトの名無しさん
2021/10/09(土) 18:04:17.21ID:jELfb/xT
>>371
代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作
コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作

代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域
コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い
376デフォルトの名無しさん
2021/10/09(土) 20:35:07.35ID:QAOoCtV/
>>375
初期化と代入の知識が曖昧でした
分かった気がします。ありがとうございます。
377デフォルトの名無しさん
2021/10/10(日) 20:55:50.73ID:6QW0WSDe
AtCoderの初心者向けのC++の説明のページを読んでいます。

vector<int> a(10);

aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。
これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?
378ハノン ◆QZaw55cn4c
2021/10/10(日) 21:05:41.56ID:KKHdhYPj
>>377
>a[i]よりもa.at(i)と書くほうが良い
そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥
379デフォルトの名無しさん
2021/10/10(日) 21:07:18.12ID:6QW0WSDe
>>378

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

などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。
380デフォルトの名無しさん
2021/10/10(日) 21:08:35.36ID:6QW0WSDe
初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?
381デフォルトの名無しさん
2021/10/10(日) 21:31:47.25ID:zWyM5YPA
範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?
382デフォルトの名無しさん
2021/10/10(日) 22:58:42.68ID:gnqjARRQ
気分によるけどatが好きです
383デフォルトの名無しさん
2021/10/10(日) 23:07:44.84ID:gmqGyDAJ
vector配列を指すポインタを使ってる時に[i]で指定する書き方がよく分からないのでat(i)使ってる
384デフォルトの名無しさん
2021/10/10(日) 23:14:51.45ID:U88jNIFg
(*ポインタ)[i]
385はちみつ餃子 ◆8X2XSCHEME
2021/10/10(日) 23:15:56.24ID:cCUvKLuJ
>>377
これのことだね。
https://atcoder.jp/contests/apg4b/tasks/APG4b_n

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

C++ の言語仕様の詳細を理解するのに手間取って競技を始められないくらいならそういう風に割り切れという意味で
AtCoder としては at を推してるんであって、言語仕様やプログラマの習慣としてどちらかを推奨してたりはしない。
それぞれに用途がある。
386はちみつ餃子 ◆8X2XSCHEME
2021/10/11(月) 00:50:58.08ID:kxIK5/L+
余談だが C++ の言語仕様としては推奨というのはないが非推奨というのはあって
(結果的に同等のよりよい機能を推奨するのと同じことになっている場合はある)
将来の言語仕様の更新で廃止するつもりがあるということを意味する。
387デフォルトの名無しさん
2021/10/11(月) 02:00:14.70ID:xizp5ONl
ポインタ->operator[](i)
388デフォルトの名無しさん
2021/10/13(水) 01:04:04.91ID:gvBCET4D
Notepad++でcppファイルを選んで実行をすると
Visualstudioが立ち上がるのですが
どうすればNotepadで実行出来るのでしょうか?
389ハノン ◆QZaw55cn4c
2021/10/13(水) 02:24:33.63ID:YMzdF2UZ
>>388
コンパネ→既定のプログラム→ファイルの関連付け

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

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

私は win7 メインで、うまいアドバイスができなくてすみません‥‥
392デフォルトの名無しさん
2021/10/19(火) 08:20:19.87ID:7/3R28mC
C++でアプリを作る場合って、QTってやつかMFCって奴を勉強すればいいのでしょうか?
C++でWIN32APIを学ぶっていうのはないですか?
393デフォルトの名無しさん
2021/10/19(火) 10:04:52.66ID:emsejTNf
ないです
394デフォルトの名無しさん
2021/10/19(火) 10:18:17.44ID:vPA5f3eX
あります
395デフォルトの名無しさん
2021/10/19(火) 11:51:03.31ID:90qj1F6l
メッセージループによるイベントドリブン型アプリケーション
「ウインドウ」と「メッセージ」というウインドウズの基本概念ぐらいは理解してもいい
396デフォルトの名無しさん
2021/10/19(火) 19:00:27.41ID:C9DkQou5
tcl/tk
wxWidgets
DXLib
Unity
397ハノン ◆QZaw55cn4c
2021/10/19(火) 20:20:27.92ID:KyySFZDA
>>392
「C++でwin32api」ですか…
そういうのは c で win32api を理解した後、各自が独力で工夫して c++ と win32api とを辻褄あわせするものだと思っていましたが、それはそうと、そういう書籍は過去にありました
たしか leaf というライブラリと WOOL という lisp 処理系が掲載されていた記憶があります
398デフォルトの名無しさん
2021/10/19(火) 22:23:42.02ID:P+gkhAFH
MFC は何十年も前だけど、今もあるの?

QT は、Linux で聞くけど、Windows で使うの?
399デフォルトの名無しさん
2021/10/20(水) 02:20:42.50ID:+2OzLQ7p
>>398
Qt5Core.dllで検索する色々出てくるから、win/macとマルチのアプリなんかで割と使われてみたいね。
手元だとfusion360とかresolveとかで使われてるっぽい。商用ライセンスあるからかな?
400デフォルトの名無しさん
2021/10/20(水) 11:06:18.19ID:OEiI06HQ
5以前は良かったんだがな
401はちみつ餃子 ◆8X2XSCHEME
2021/10/20(水) 13:35:36.40ID:dLyN/sz8
>>392
MFC は API の利用をちょっと楽にする薄いラッパーという感じだな。
API のことを忘れて MFC の使い方だけ学べばよいというようなものではない。

>>397
今は C++/WinRT の時代だぞ。
402デフォルトの名無しさん
2021/10/20(水) 18:01:15.01ID:oZqSjSwG
>>397-401
WIN32やったことないんですが
C++でアプリを作るときはWin32APIは避けては通れないのですか
ありがとうございます…
403デフォルトの名無しさん
2021/10/20(水) 19:03:46.64ID:CkfuGqw9
知っておいた方が良いけど
避ける方法もある
404デフォルトの名無しさん
2021/10/20(水) 19:36:43.86ID:+2OzLQ7p
>>402
いや自分で書いてるQtって奴や>396なら違う世界観を満喫できると思う。
2Dゲーム系ならSDL2あたりも。他にもメンテされてるライブラリあるけどSDL2で引けば出て来ると思う。
405ハノン ◆QZaw55cn4c
2021/10/20(水) 20:15:37.71ID:I2cv7mAQ
>>401
ええ?

WinRT って .NET の世界のものかとおもっていました
406デフォルトの名無しさん
2021/10/20(水) 23:17:39.77ID:vkb7a42p
>>405
C++でも出来るよう
407はちみつ餃子 ◆8X2XSCHEME
2021/10/21(木) 00:38:03.74ID:JAunV20A
>>405
WinRT は Windows のモダンな API セットで、特定の言語に結びついたものではない。
408デフォルトの名無しさん
2021/11/05(金) 12:47:56.16ID:dj6lZ6W1
無名クラスのメンバ関数の実装を宣言と別にすることって可能ですか

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

(実装)?
409デフォルトの名無しさん
2021/11/07(日) 08:51:29.08ID:+fO8/EKc
std::vecotrのインスタンスを作ったとき、指定した要素数以上のメモリを確保しないようにはできますか??
410デフォルトの名無しさん
2021/11/07(日) 11:43:59.55ID:cdTTDz5e
実装依存
普通は出来ない
411デフォルトの名無しさん
2021/11/09(火) 14:46:05.51ID:t/ZCl1K7
普通でなく指定したバイト数以上のメモリを確保しようとしたら例外が上がる実装例
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T, class Alloc=allocator<T>>
class SizeLimitedAllocator {
public:
typedef T value_type;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
return allocator_traits<Alloc>::allocate(allocator_, n);
}
void deallocate(T *p, size_t n) {
allocator_traits<Alloc>::deallocate(allocator_, p, n);
}
private:
Alloc allocator_;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}
412デフォルトの名無しさん
2021/11/25(木) 04:15:10.15ID:0166A/na
void *q = (void*)p;
void *r = reinterpert_cast<void *>(p);
void *s = static_cast<void *>(p);
どっちが良い?
413はちみつ餃子 ◆8X2XSCHEME
2021/11/25(木) 04:51:08.49ID:Mn8CZmYm
>>412
static_cast で可能なものなら static_cast を使うのが行儀が良い。
Cスタイルのキャスト記法は適用範囲が広すぎて意図通りではない (危険な) 変換でもコンパイルが通るかもしれんということで
複数のキャストを用意しているので意図にあてまる限りなるべく狭い効果を持つキャストを用いるべき。
414デフォルトの名無しさん
2022/02/10(木) 15:34:30.67ID:Ido/99Jv
githubからcshogiというパッケージをインストールしようとしたところ
ビルド中に
src/mate.cpp:110:26: error: template parameter redefines default argument
というエラーが発生しました。
実行コマンドは
CPPFLAGS=-std=c++17 pip install git+https://github.com/TadaoYamaoka/cshogi
としているのですが、あれこれ調べてもう打つ手がなくなりそうです。なにが悪いでしょうか。
macOS12.2付属のclangでビルドしています。(他の人は使っているので、文法などは問題ないはずだと思っています。)
415デフォルトの名無しさん
2022/02/10(木) 15:42:07.23ID:J5PrGMnU
そのエラーメッセージで検索すれば?
416デフォルトの名無しさん
2022/02/10(木) 15:46:35.62ID:Ido/99Jv
>>415
とっくにやってますわ!と言うところでしたが、stackoverflowでぴったりなのがありました。
https://stackoverflow.com/questions/14197436/c11-template-parameter-redefines-default-argument
gccならよさそうですね。
417デフォルトの名無しさん
2022/03/15(火) 20:43:42.96ID:+mlS0n0o
test
418デフォルトの名無しさん
2022/03/15(火) 21:05:11.63ID:q9dCXwxq
Borland C++Builder 1が無料ダウンロードできるようですが
Borland C++ Compiler 5.5 freeとは全く別物でしょうか?
419デフォルトの名無しさん
2022/03/17(木) 11:44:12.82ID:Y2OAtTnf
1は大昔のを記念に無料DL可にしたやつじゃないかな
最新のやつもCommunity Editionていう無料版があるから、開発に使うならそっち
あとBuilderはVisual Studioのような統合開発環境でコンパイラも含まれる
420デフォルトの名無しさん
2022/03/18(金) 12:32:15.10ID:Fw15ZxLZ
ロベール読んでるけど、途中からコードとファイルを端折りすぎてどこに書いてるのか理解出来ない
421デフォルトの名無しさん
2022/03/19(土) 14:31:38.38ID:T81w77OE
>>420
その本(サイト?)はあまり読んでないからわからないけど、こういう知識・技術系は複数の本やサイトを利用したほうがいいかも
基本はそのロベールで、曖昧な部分は他のテキストでみたいに
まあ逆でもいいけど
422デフォルトの名無しさん
2022/03/21(月) 11:12:55.05ID:Prmlj1K5
分割コンパイルの仕組みちゃんと理解しないまま雰囲気でヘッダインクルードしてるんですけど
cppファイルに#pragma once書かないのってどうしてですか??
423デフォルトの名無しさん
2022/03/21(月) 11:22:20.21ID:S8aTENmp
>>422 書いても意味ないから。
424デフォルトの名無しさん
2022/03/21(月) 11:45:05.99ID:TlR/Mg8q
>>422
まあ普通一回使ったら足りるからだけど、
cppをincludeしてたら意味があるのかもな
425デフォルトの名無しさん
2022/04/07(木) 19:54:53.05ID:ozPVuLqH
cppってインクルード出来たんだ
ヘッダーだけかと思った
426デフォルトの名無しさん
2022/04/11(月) 15:54:11.00ID:LBY7PFnU
単にコピペしてくるだけだけだからなんでもいいぞ
ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある
427デフォルトの名無しさん
2022/04/11(月) 19:50:08.66ID:uaVZR/I2
IDEだと、プロジェクトに.cppを含めるとコンパイル対象になるので.inlとかにしておくのが無難
428デフォルトの名無しさん
2022/04/30(土) 07:28:15.03ID:2aZ7UOTr
前は中身がcppっぽいのはcppにしてたけど
インクルード前提のファイルはhにするようにした

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

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

ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま
429デフォルトの名無しさん
2022/06/11(土) 20:56:47.72ID:zBk/MBZO
hpp
430デフォルトの名無しさん
2022/06/11(土) 21:01:36.29ID:N4H8T0pQ
h と hpp どっちにするかの話じゃなくて

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

の話
431デフォルトの名無しさん
2022/06/11(土) 21:02:37.04ID:N4H8T0pQ
初心者はトリッキーな使い方はしない方が良いから聞かなかった事にして
432デフォルトの名無しさん
2022/06/11(土) 21:20:49.53ID:kM12Kkyp
トリッカーズ。
433デフォルトの名無しさん
2022/06/12(日) 10:33:13.76ID:cPTHwR7Q
三角形の秘密はね
434デフォルトの名無しさん
2022/06/12(日) 11:16:51.08ID:v0rlTKHd
おなかがすいたら
435デフォルトの名無しさん
2022/06/12(日) 19:40:55.19ID:r44ApDPu
ピーナッツ
436デフォルトの名無しさん
2022/06/23(木) 10:13:29.99ID:06mLNX8U
なんか、すごい達者さんが並んでますけど、
ここって、
「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」
というスレです。
437デフォルトの名無しさん
2022/06/23(木) 10:52:47.91ID:M4XLJX6g
最初からでも0からでも構わんが
自分で努力しないやつはだめ
438デフォルトの名無しさん
2022/06/23(木) 11:07:51.97ID:XRNmRbRA
俺は努力しなくてもできちゃうからなあ
439デフォルトの名無しさん
2022/06/23(木) 14:33:26.79ID:06mLNX8U
掛け算の*と、「何ですか?」の*と一緒なんですが、
区別する方法を教えてください。
440デフォルトの名無しさん
2022/06/23(木) 19:37:03.84ID:WbbET00J
ポインターの事?
441デフォルトの名無しさん
2022/06/23(木) 19:47:14.20ID:hToQs/iZ
は?何ですか?
442デフォルトの名無しさん
2022/06/24(金) 10:44:51.77ID:K2we1Lar
オレオレ
443デフォルトの名無しさん
2022/06/24(金) 12:54:50.02ID:fYiV2rYB
そうだよオレだよ
444デフォルトの名無しさん
2022/07/16(土) 16:13:36.70ID:2GuJXeRO
>>439
掛け算の*は二項演算子
「何ですか?」の*は単項演算子
*の前に項があるかどうかで判断する
445デフォルトの名無しさん
2022/07/16(土) 17:44:38.20ID:WOPsEo4E
数字の、xxxと、
数字の、AAAの掛け算は、

xxx*AAAで、いつも迷うんです・・・
446デフォルトの名無しさん
2022/07/16(土) 18:00:17.69ID:QRg/sabr
*a+++ ++*b
で迷え
447デフォルトの名無しさん
2022/07/16(土) 18:01:53.10ID:QRg/sabr
+*a++*++*b
これも
448デフォルトの名無しさん
2022/08/01(月) 07:12:02.16ID:yd/7YIgU
map よりも unordered_map の方が高速ですか?
あと追加順が保障されないのが unordered_map ですか?
map は何順ですか?
449デフォルトの名無しさん
2022/08/01(月) 13:52:12.46ID:jhXgj6wH
おまいは何を言っておるのだ?
450はちみつ餃子 ◆8X2XSCHEME
2022/08/01(月) 15:12:11.10ID:YhL9Bhjt
>>448
> map よりも unordered_map の方が高速ですか?

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

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

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

> map は何順ですか?

キーの順序。
特に指示しなければデフォルトではキーを std::less で比較した順序。
451デフォルトの名無しさん
2022/08/05(金) 04:26:17.70ID:ECXKpFJi
そもそもmapの順序ってなんぞや
そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど
腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ
452デフォルトの名無しさん
2022/08/16(火) 01:02:16.19ID:pMrCsY/x
vector<int*> xの特定の要素を削除したい場合
delete x[1];
してから
x.erase(x.begin()+1);
という手順であってますか?
deleteしないとメモリリークしますよね?
453はちみつ餃子 ◆8X2XSCHEME
2022/08/16(火) 01:10:03.51ID:+o+ePBjP
>>452
それでいいよ。
でもスマートポインタを活用するとかの工夫はしたほうがいいね。
454デフォルトの名無しさん
2022/08/18(木) 11:36:39.99ID:p/limWqp
そもそも移動が大量に発生するのでそんな設計しない
455デフォルトの名無しさん
2022/10/14(金) 01:43:37.78ID:ps9ayw5X
bitset<4>("1101")をsigned longに変換したいのですが
簡単な方法は無いでしょうか?
to_ulong()はあるのですが、to_long()が無いっぽいです
456デフォルトの名無しさん
2022/10/14(金) 01:50:46.72ID:cI3rl/qY
unsigned longからlongにキャストすればいいだけでは?
457はちみつ餃子 ◆8X2XSCHEME
2022/10/14(金) 02:13:27.03ID:rgl2oNFZ
念のため補足すると、変換後の整数型が符号付きである場合にその型で表現できる範囲をからはずれたときの結果は定義されていない。
しかし bitset<4> を元にするという前提の元では signed long int の範囲からはずれるということはありえない
ので signed long int にキャストするという対処で正しい。
458デフォルトの名無しさん
2022/10/14(金) 02:13:45.28ID:ps9ayw5X
すみません肝心なことを書き忘れていました
2の補数表現された2進数の文字列を
signed longに変換したかったのでした

文字列は諦めて、
-(signed long)bitset<4>(~0b1101+1).to_ulong()
だと一応期待した動作なのですがなんか野暮ったい…
459デフォルトの名無しさん
2022/10/14(金) 20:52:11.42ID:IQ8pOIWW
4ビットだから符号無しなら0~15だろ
コレを-8~7の符号付きにしたいということか?
460デフォルトの名無しさん
2022/10/15(土) 16:23:31.27ID:B8kXjL18
普通に下駄履かせれば(引き算)
461デフォルトの名無しさん
2023/05/24(水) 23:52:31.95ID:lCJuR93r
いやー今日はめっちゃ勉強したわ
詳しくなった
462デフォルトの名無しさん
2023/06/04(日) 09:18:18.28ID:5jvZ+YKl
誘導されて来ますた、
質問なのですがstd::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす
れば良いの?
ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……
463はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:22:50.76ID:MHoxWKtY
>>462
strtod で何が不満なの。
空白かどうかで区別が必要なら空白かどうか確認するしかしょうがないし、
ダサいもくそもないだろ。
464デフォルトの名無しさん
2023/06/04(日) 09:28:48.33ID:5jvZ+YKl
>>463
だって&(str[0])とかナマポやし……
文字列型がchar以外になったら(std::basic_string<TCHAR>とか)になることも見越したら
手でテンプレート書かないといけないから牛刀感があるし、
文字列が厳格に数値文字列なのか検査するとかアプリのコードであるあるなので
アプリレベル(高級アセンブラ的でない書き方)の手段が用意されていて然るべきな気がして仕方が無いし、
465デフォルトの名無しさん
2023/06/04(日) 09:30:18.23ID:5jvZ+YKl
無いというなら仕方が無いが、漏れはちょう初心者ですら……
466はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:37:21.42ID:MHoxWKtY
>>464
std::stod は std::string と std::wstring に対応してるよ。
467デフォルトの名無しさん
2023/06/04(日) 09:39:47.38ID:5jvZ+YKl
>>466
std::stod()は数値への変換が行われなかったとき例外をスローするが
後ろに余計なものが付いていたらスルーするんじゃ……
なお試したことはありま栓、
468はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:52:59.20ID:MHoxWKtY
>>467
???
それで何か困ることがあるという話なの?
要件が不明瞭でよくわからん。
469デフォルトの名無しさん
2023/06/04(日) 09:55:13.77ID:5jvZ+YKl
実は正規表現でも使えば何とかなる……
のか……
std::regex re("^\s*([\d.]+)\s*$");
std::smatch m;
if (std::regex_match(str, m, re)) {
 return m[1].str().strtod();
} else {
 エラー
}


 
470デフォルトの名無しさん
2023/06/04(日) 09:56:15.54ID:5jvZ+YKl
>>468
仕様は最初に提示stkr、
123.456E+8 : OK
123.456E+8a : NG
471はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 10:00:50.19ID:MHoxWKtY
>>470
続くものが何であるかは自分で確認してエラーにするという話をしてると思ったんやが。
472デフォルトの名無しさん
2023/06/04(日) 10:05:01.33ID:5jvZ+YKl
>>471
>続くものが何であるかは自分で確認してエラーにする
・できればライブラリでやってホスイ
・自分で書くとしてもナマポ(&(str[0]))は避けたい(>>464
・std::string部分が他の文字列型に変わっても大丈夫なサポートがあるならそれに乗っかりたい手でテンプレートを書きたくない(>>464

できるかできないかで言えば、std::stringについてはダチャくあっても実現できてはいるので
C++でちょう簡潔に書ける手段が実はあるのではないか、ありませんか、というのが質問の意図
473はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 10:13:13.65ID:MHoxWKtY
>>472
続くものの種類で判断するというピンポイントな要求にマッチするものはさすがに標準にあるわけない。
それを除けば std::stod が十分に要求を満たしているように見える。
474デフォルトの名無しさん
2023/06/04(日) 11:40:09.61ID:bxWaSYac
単位でも確認したいの?
だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
475デフォルトの名無しさん
2023/06/04(日) 11:51:26.73ID:xmEQJDCs
正規表現でチェックするのが1番自然な気がする
476デフォルトの名無しさん
2023/06/04(日) 22:03:06.86ID:5jvZ+YKl
>>474
> 単位でも確認したいの?
> だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
std::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい(>>462

> チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
チェックのためには(例えばstd::stodが)どこまで読んだのかの情報が要る
std::stodの裏側では文字列を数値解釈する枯れたコードが動いているわけで、
そいつにどこまで読んだのか、ただ1個の整数データを聞けさえすれば良い。
これはそれほど無茶な話ではないはずで実際strtod()ではできるから
どっちかというtライブラリにちょっち不備があるのでは案件であってお母さん案件ではない。
477デフォルトの名無しさん
2023/06/04(日) 22:20:35.13ID:5jvZ+YKl
>>475
上に書いた通り(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたら解決するのじゃ
正規表現は意味的には合目的的な手段やが、普通の正規表現エンジンの実装なら正規表現オブジェクトを作った際に
FSMを(表形式か何かで)生成する処理が中で動くので、そんなに軽い処理ではないからやっぱ牛刀感みある…

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

繰り返しになるが(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたらこんな考慮は不要で完全に円満に解決するのじゃ……
478デフォルトの名無しさん
2023/06/04(日) 22:30:29.50ID:bxWaSYac
>>476
そんな長文ギャンギャン書きなぐってる暇があればstodの仕様くらい調べろよ
ちゃんとお前の欲しがってる物を返してくれるよ
479デフォルトの名無しさん
2023/06/05(月) 00:32:44.63ID:8dockxGx
便乗質問していいですか
某所で似たような問題があったのだけど、付加条件として、数値がINT_MAXを超える場合は
INT_MAX、INT_MINを下回る場合はINT_MINを返す、がありました
stodを使う場合(stoll等でもいいですが)、これってどうやって処理すればいいですかね
480デフォルトの名無しさん
2023/06/05(月) 00:38:04.95ID:8dockxGx
念の為「数値が」というのは元の文字列での、です。たとえば "1000000000000"みたいな
可能性としてはLONG_LONG_MAXを超えている場合もありますね
481デフォルトの名無しさん
2023/06/05(月) 00:46:19.80ID:oX+QCkCh
stoi系は範囲越えたらstd::out_of_rangeを投げるはずだが
482デフォルトの名無しさん
2023/06/05(月) 01:19:48.15ID:8dockxGx
_MAXで超えたか_MINで超えたかってわかりますかね
483デフォルトの名無しさん
2023/06/05(月) 01:31:31.21ID:oX+QCkCh
先頭文字が'-'かどうか見れば?
484デフォルトの名無しさん
2023/06/05(月) 01:54:42.53ID:yTJt/rkc
>>478
どういうこっちゃkwsk、
485デフォルトの名無しさん
2023/06/05(月) 02:04:38.53ID:LZnxgWkc
>>484
https://ja.cppreference.com/w/cpp/string/basic_string/stof

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

> 引数
> str - 変換する文字列
> pos - 処理された文字数を格納する整数のアドレス
486デフォルトの名無しさん
2023/06/05(月) 02:37:23.50ID:yTJt/rkc
>>485
㌧クスわかりたorz
487デフォルトの名無しさん
2023/06/05(月) 06:49:34.05ID:8dockxGx
>>483
そうですね、でも文字列の先頭とは限らないですよね。やはりこの場合はある程度は
自力で文字列をパースする必要がある感じですかね

ちなみに数字以外が含まれるときの挙動は "hoge 123"みたいに数字より前に非数字
がくるのは駄目だけど逆に"123 hoge"みたいのはおkなんですね
488デフォルトの名無しさん
2023/06/20(火) 19:02:06.99ID:mbwsU8Mq
話題がないから質問してみる

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*>ではだめなのかな?
489デフォルトの名無しさん
2023/06/20(火) 19:05:08.72ID:mbwsU8Mq
なんか変換されたw
∑merでなくて&summerです
490はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:45:04.07ID:IIzrqfbq
>>488
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。

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

この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。
491はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:54:10.99ID:IIzrqfbq
どういうときにどういう値カテゴリに属すことになるのか正確なところはここ見て。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval

C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
492デフォルトの名無しさん
2023/06/20(火) 23:48:13.65ID:mbwsU8Mq
>>490
返答ありがとう。

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

どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
493はちみつ餃子 ◆8X2XSCHEME
2023/06/21(水) 00:33:00.36ID:3HBFHOpK
>>492
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)

& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。
494デフォルトの名無しさん
2023/06/21(水) 01:03:31.08ID:tILY3YM/
>>492
その理解だと↓も通ることになると思うんだけど、これが通らない理由もわからない?
int i = 0;
static_cast<int>(i) = 1;
495デフォルトの名無しさん
2023/06/21(水) 11:05:32.10ID:cZp0PZIW
>>493,494
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。
496デフォルトの名無しさん
2023/06/29(木) 00:53:29.69ID:l197jz/x
なんで可変長配列の名前がvectorなの?
497はちみつ餃子 ◆8X2XSCHEME
2023/06/29(木) 08:14:12.68ID:l+ZsGqGg
伝統。
498デフォルトの名無しさん
2023/06/29(木) 13:14:41.30ID:DfwcYShQ
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
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという
499デフォルトの名無しさん
2023/07/04(火) 17:43:58.34ID:Ld2RSFGK
c++に限定される疑問ではないかも知れませんが標準出力がどうやってコンソールに出力しているか?というところで躓いてます
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?
500はちみつ餃子 ◆8X2XSCHEME
2023/07/04(火) 17:52:47.39ID:wwaI/oJF
>>499
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。
501デフォルトの名無しさん
2023/07/04(火) 18:05:29.71ID:Ld2RSFGK
>>500
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます
502デフォルトの名無しさん
2023/07/04(火) 19:16:32.21ID:Ld2RSFGK
同様のテーマのITmediaの記事を見つけたので腰を据えて取り組んでみようと思います
回答いただきありがとうございましたお騒がせしました
503はちみつ餃子 ◆8X2XSCHEME
2023/07/05(水) 00:40:03.93ID:h//lr2GB
>>501
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。

と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。
504デフォルトの名無しさん
2023/07/13(木) 01:46:39.34ID:a7xsv8mg
shared_ptrの解放時にweak_ptrを登録していたSTLコンテナから登録抹消したいけど、
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
505はちみつ餃子 ◆8X2XSCHEME
2023/07/13(木) 18:07:22.25ID:46c6OBqO
>>504

設計意図次第だけど
コンテナにはオブジェクト本体をいれて 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;
}
506デフォルトの名無しさん
2023/07/13(木) 21:30:08.90ID:BEK5Ztwm
>>505 ありがとうございます。実体とイテレータ、参考になります。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。

処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
507デフォルトの名無しさん
2023/07/16(日) 13:37:45.84ID:aonKa36p
設計意図次第
508504
2023/07/16(日) 21:29:25.31ID:AcIm+utR
何でかshared_ptrって派生出来ないと思い込んでたけど出来た。
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。

template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};
509蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:10:43.92ID:/+p/BpGt
クラス内部で
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
510蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:12:03.59ID:/+p/BpGt
>>509
クラス内部で
using std::shared_ptr<T>::shared_ptr;
を付けるとコンストラクタの実装が完璧になるよ。
511504
2023/07/16(日) 22:37:21.87ID:AcIm+utR
>>510 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。
ありがとうございます。自前実装不要なのは助かります。
512はちみつ餃子 ◆8X2XSCHEME
2023/07/17(月) 00:18:57.61ID:YifLUjyU
>>508
それって本当に意図通り?
X のデストラクタが起動するのは X 型のオブジェクトが解体されるときであって
参照カウントがゼロになったときじゃないんだよ。
513504
2023/07/17(月) 01:33:58.67ID:9b8iHtwy
>>512 …あー。それは意図通りではないですね。実際の解放はデストラクタで
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
514はちみつ餃子 ◆8X2XSCHEME
2023/07/18(火) 09:19:59.88ID://OyAtPF
パブリック継承した型では基底への型変換を禁じることができない。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。

間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
515504
2023/07/19(水) 03:16:45.39ID:0uGQJSD8
>>514
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。

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

> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
516504
2023/07/19(水) 18:45:15.41ID:4lyHW67x
そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、
public継承でほったらかします。
517デフォルトの名無しさん
2023/07/20(木) 15:28:07.42ID:6BSTmMYa
templateの世界へようこそ
518はちみつ餃子 ◆8X2XSCHEME
2023/07/21(金) 13:23:19.14ID:NiBubQrd
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 を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
519504
2023/07/21(金) 20:08:15.21ID:jaEOXewl
一応発端の動かなかったコードを短くしたのでおいときます。
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);
}
520デフォルトの名無しさん
2023/07/25(火) 09:24:45.92ID:k8WJtY+U
>shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない

これが無理っしょ
521デフォルトの名無しさん
2023/07/28(金) 10:56:39.59ID:Zgvcm9f5
なんで出来ると思ったの
522デフォルトの名無しさん
2023/07/29(土) 20:15:59.76ID:ETnyq2kJ
shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
523デフォルトの名無しさん
2023/07/29(土) 20:25:36.66ID:xEb8mTKO
シャー専用ptr
5241
2023/09/03(日) 20:55:45.58ID:/ExZEMtW
「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。
からのスレの目的で建てました。
525デフォルトの名無しさん
2023/09/03(日) 20:59:12.95ID:W287fTtw
まず、何が作りたいかイメージしてみましょう
526デフォルトの名無しさん
2023/09/04(月) 10:11:49.98ID:/ASAZOX6
>>524 がC++をやるのは早過ぎる
先にpythonでもやってみろ
527デフォルトの名無しさん
2023/10/02(月) 22:07:14.88ID:l4Vvzubd
次のプログラムを実行するとコメントのように出力がされ、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"例外発生
528蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:06.36ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
529蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:09.92ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
530蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:23.61ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
531蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:42.13ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
532蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:18:32.15ID:/sjCb2h4
連投すみません。コピーコンストラクタと、代入もです。
533はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 00:13:21.44ID:OUiDjLFt
>>527
暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。

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

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

それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。
534527
2023/10/03(火) 00:55:04.57ID:RKQFDOr6
>>532-533
お二人さま ありがとうございます。

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

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

自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
535はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:13:14.63ID:OUiDjLFt
>>534
> 右辺により生成されるオブジェクトが単にd3に格納

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

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

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
536はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:13:25.78ID:OUiDjLFt
>>534
> 右辺により生成されるオブジェクトが単にd3に格納

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

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

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
537はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:17:47.16ID:OUiDjLFt
サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。
なんか不安定な状況っぽい
538デフォルトの名無しさん
2023/10/05(木) 17:15:14.18ID:WXXGTjkD
みんなでリトライするからF5攻撃並みに自爆DOS攻撃
539デフォルトの名無しさん
2023/10/05(木) 18:29:28.73ID:S7K0dlIY
>>527
int *をunique_ptr <int>にすると
コンパイルで弾かれるから
気づきやすいかもね
newとdeleteは直で呼ばない方が良い
540デフォルトの名無しさん
2023/10/06(金) 10:09:01.67ID:Zl0hPCVy
newとdeleteを直で呼んでるかどうかと
今回の問題(コピーが発生してるかどうか)は
関係無いんじゃね?
541デフォルトの名無しさん
2023/10/06(金) 10:16:23.02ID:QFTcWZUD
いきなりC++から入るとは…
考え直した方がいい
542デフォルトの名無しさん
2023/10/06(金) 12:08:09.60ID:xj8n2YWF
>>540
「コピーが発生してるかどうか」とは関係ないのはその通り
>>527が恐ろしいのは
コンパイル時点では気づかず実行して初めて明らかになるところ
どうしたら実行前に避けるかの方策として
unique_ptrの常用を提案しました
543デフォルトの名無しさん
2023/10/06(金) 13:16:53.99ID:Zl0hPCVy
>>527 に有効な解決策は
コピーコンストラクタじゃなくて
ムーブコンストラクタじゃないのかな
544はちみつ餃子 ◆8X2XSCHEME
2023/10/06(金) 16:48:00.89ID:R7EjAYTn
両方やっとけばええじゃろ。
545デフォルトの名無しさん
2023/10/06(金) 21:05:50.93ID:BgvqARb2
vector dp(N+1,vector(i+1,vector<mint>(i,0)));
これはdp[N+1][i+1][i]個のデータを確保していると思っておk?
546デフォルトの名無しさん
2023/10/06(金) 21:10:07.75ID:G9Jlm58L
OK牧場!
547デフォルトの名無しさん
2023/10/06(金) 21:44:11.09ID:BgvqARb2
TXH!
548527
2023/10/16(月) 23:49:47.91ID:6sfjI2pS
>>535 を始めとして皆さんまたまたありがとうございます。
アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。

コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
549デフォルトの名無しさん
2023/10/17(火) 23:09:31.94ID:cH9YbrYr
既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。
マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
550はちみつ餃子 ◆8X2XSCHEME
2023/10/18(水) 09:51:20.64ID:UZlHr99J
>>549
ソースコードの構造を調べるのを補助するツールはあるが
どういう意図でどういう使い方を想定してそう書かれているのかは
プログラマが読み解かないとどうしようもない。
551デフォルトの名無しさん
2023/10/18(水) 17:06:40.02ID:d+gN3jrr
既製品ならドキュメントあるだろ
ドキュメントで謳ってないことはやるべきでない
552デフォルトの名無しさん
2023/10/18(水) 21:01:33.56ID:XEk7oAP2
visual studio community 2022で、
他のソリューションで作成されたmoduleをimportする方法がわかりません。
#includeみたいにパスを指定する方法とかがあるんでしょうか?
553デフォルトの名無しさん
2023/10/18(水) 21:18:35.91ID:GW9b62tt
あるよ
554デフォルトの名無しさん
2023/10/18(水) 22:46:30.83ID:XEk7oAP2
>>553
ぜひ教えてください!
555デフォルトの名無しさん
2023/10/19(木) 10:07:14.52ID:W1XtHktx
外部モジュール取り込みは言語仕様じゃ無くてIDEの機能だから
556デフォルトの名無しさん
2023/10/20(金) 09:56:30.99ID:/M3RKJCH
IDEに頼ってるとアホになるよ
557デフォルトの名無しさん
2023/10/21(土) 16:32:35.29ID:dhBJRkMq
0のうちにやめとけ
時間がもったいない
558デフォルトの名無しさん
2023/10/26(木) 23:16:10.15ID:4gABazLN
typedef uint8_t byte;
:
byte a = 3;
uint8_t b = a;

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

コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
559デフォルトの名無しさん
2023/10/26(木) 23:23:19.82ID:oN20rU1J
>>558
typedef は型の別名を作る機能であって新しい型を作らない。
560デフォルトの名無しさん
2023/11/05(日) 12:44:18.01ID:iVzKXsmj
Visual StudioでソリューションAでビルドしたブツ(.exe、.dll、lib)、シンボルファイル(.pdb)、必要なヘッダファイル(.h)
をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは
"$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、
Visual Studio 2019以降だと今は実はもっと簡単?
561デフォルトの名無しさん
2023/11/10(金) 23:40:20.59ID:mtEH7OmF
class MyClass {
public:
MyClass();
:
};

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

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

①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
562デフォルトの名無しさん
2023/11/10(金) 23:49:08.54ID:VDRR6isO
>>561
その「相互代入」って何ですか?
563はちみつ餃子 ◆8X2XSCHEME
2023/11/10(金) 23:56:43.46ID:Irnop6+y
>>561
自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
寿命の種類のことを Storage duration といい、
new で生成したオブジェクトは Dynamic storage duration に該当する。

継承関係がどうこうというのは何が言いたいのかよくわからないが、
ポインタの性質はオブジェクトの寿命とは関係ない。
564デフォルトの名無しさん
2023/11/12(日) 00:13:49.90ID:M40i1rJ9
相互代入は言葉がおかしいですね。
基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
オブジェクトのボインタを使う場面があまりないので用途を聞きました。

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

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

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

本当に人間は忘れるし間違える。
部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。
まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
566デフォルトの名無しさん
2023/11/12(日) 11:04:18.35ID:l8rhUXJt
>>561
>@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
そのためだけにあるという訳ではない

>私からすると@はdeleteしなければならないのでできれば使いたくない。
生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば
deleteはスマートポインタがやってくれる
構築は uniqu_ptr <MyClass> = new MyClass(); や
uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる
567デフォルトの名無しさん
2023/11/12(日) 13:14:04.39ID:xpiKETrj
> 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
> オブジェクトのボインタを使う場面があまりないので用途を聞きました。

アップキャストのことだろうかね。
必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
568デフォルトの名無しさん
2023/11/13(月) 06:27:48.00ID:qbVz2ceg
>>561 は、最初から必要数が決まっているオブジェクトしか作ったことがないのかな。
リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。
569デフォルトの名無しさん
2023/11/13(月) 10:31:45.02ID:IRswNIWu
>>567
型チェックしなきゃ危険だけどな
570デフォルトの名無しさん
2023/11/13(月) 13:26:36.10ID:qAieNn1D
uniqu_ptr
571デフォルトの名無しさん
2023/11/13(月) 18:54:22.80ID:CCXWxw1E
>>570
おおスマン
typoだね
572デフォルトの名無しさん
2023/11/13(月) 23:59:54.01ID:RLYu3oMv
>>565 ほか皆さんありがとう。

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

c++に挑戦している今の環境も小規模なので、newの利用はほどほどに検討してみます。
573デフォルトの名無しさん
2023/11/14(火) 00:03:40.68ID:F1cdKor4
>>567
だいたい参照で済んでしまいます
574デフォルトの名無しさん
2023/11/14(火) 12:46:18.30ID:SRCspH78
mallocもnewも使ったこと無いってやばいぞ
575はちみつ餃子 ◆8X2XSCHEME
2023/11/14(火) 15:58:08.40ID:oTbgWDDI
new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。
メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?)
低レイヤでも便利な場面はたぶんある。

分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど
あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。
知っておくに越したことはないよ。
576デフォルトの名無しさん
2023/11/14(火) 21:59:36.46ID:WxE96Zj2
空配列を用意してそれを順繰り使い回す
チープなCPUでは必須の方法
577デフォルトの名無しさん
2023/11/14(火) 22:15:51.21ID:VpxEmvp/
RAM2KBでmallocが必要かどうか
578デフォルトの名無しさん
2023/11/15(水) 09:06:17.34ID:vh+zgKB1
よく
 A a = new A();
 a->b();
 delete a;
みたいに生成してすぐ解放ってのがありますけど、
 A a;
 a.b();
じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
579デフォルトの名無しさん
2023/11/15(水) 09:39:21.05ID:88mXe6hW
後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな
580デフォルトの名無しさん
2023/11/15(水) 09:40:08.83ID:7t1hSBTd
>>578
A *a = new A(); よね、一応
bを呼び出したいだけなら特にメリットはないよ
581デフォルトの名無しさん
2023/11/15(水) 10:25:46.06ID:2QF9cM/v
スタック?
そんな所にゃ領域取らないだろ
582デフォルトの名無しさん
2023/11/15(水) 16:06:06.00ID:rnHf5KLb
何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?
583はちみつ餃子 ◆8X2XSCHEME
2023/11/15(水) 16:35:01.46ID:k729Xl/N
>>578
> ありますけど、

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

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

第二の可能性として、 new 演算子をオーバーロードして
そのオブジェクトがメモリの特定の場所に対応づけられる場合。
メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから
それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。
でもそれは低いレイヤだけの話で、
適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
584デフォルトの名無しさん
2023/11/15(水) 18:55:56.04ID:aqUxtLPE
超初心者スレで揚げ足とったり、マウントしたり
585デフォルトの名無しさん
2023/11/15(水) 19:46:52.63ID:O3I3kWYX
>>582
何か作ってるうちに嫌でも詳しくなるよ
586はちみつ餃子 ◆8X2XSCHEME
2023/11/15(水) 21:31:49.26ID:k729Xl/N
PC9801 時代を知ってる人は色々と詳しいと思うがその知識が役立っているというわけでもなくて、 PC9801 時代からの三十年くらいあれば詳しくなって当たり前ってだけだぞ。
たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。
587デフォルトの名無しさん
2023/11/16(木) 11:26:46.68ID:QXdh7keC
当時は役に立ったけど今はオワコンの技術と
今でも役に立ってる技術と
どっちが割合多い?
588デフォルトの名無しさん
2023/11/16(木) 11:55:31.84ID:nxuWB9A/
「技術は陳腐化するが考え方は永遠である」
589はちみつ餃子 ◆8X2XSCHEME
2023/11/16(木) 14:01:30.65ID:brAf4s3Y
新しい技術的流行が昔からあったやつの焼き直しってことは珍しいことじゃない。
「なんや、結局は××やないか」というときに××自体が廃れていてもう使わなくても
理解のためには役立っているのでオワコンとも役に立ってるとも言えたりする。
590デフォルトの名無しさん
2023/11/16(木) 15:18:16.01ID:QXdh7keC
ActiveXってCOMだよね
COMってOLEだよね
591デフォルトの名無しさん
2023/11/20(月) 15:56:09.22ID:QJSPRwrd
こんにちは坂本と申します。
C++を0から勉強したく書き込み致しました。
私ごとですが先月定年退職し、やっと自由な時間がもてる様になりました。
在職中ずっとプログラミングの勉強をしたかったのですが子育てや職場がプラントの電気機械保全業務の3交代だった為に定年後を楽しみに我慢してまいりました。
プログラミングの知識は全くなく制御盤のPLCでニーモニック語でリストプログラミングをするぐらいしか経験はありません。
有料でもかまいませんので何回でも質問ができ、すぐに返答と解説をして頂けるサービスや学習機関がございましたら教えて頂きたく書き込ませてもらいました。
漠然とした質問で申し訳ありませんが今月よりプログラミングの勉強を独学で始めましたが質問できる知り合いもいなく困り果てております。
長文失礼致しました。
592デフォルトの名無しさん
2023/11/20(月) 19:07:01.26ID:UNSN9Hhc
>>590
DDEは?
593デフォルトの名無しさん
2023/11/21(火) 00:24:28.42ID:cXhp/VaI
C/C++ はポインターがあるから、ややこしい。
10年やっても無理

Ruby をやれ。
半年で、Ruby on Rails も出来る
594デフォルトの名無しさん
2023/11/21(火) 11:11:38.44ID:HSO31doi
神社code
595デフォルトの名無しさん
2023/11/21(火) 14:22:46.70ID:tYm3I+7J
ポインターが分からない奴は
プログラムを組む資格がない
596はちみつ餃子 ◆8X2XSCHEME
2023/11/21(火) 17:27:32.66ID:4ADiN9xr
ちゃんとした本があれば独学でそんなに困らないと思うけどな。
入門書の各章をじっくり読んで理解してから次の章に進むみたいな学習法をしているなら
詰まったときにどうしていいかわからなくなりがちなのでやめたほうがいいと思う。
色んな要素が相互に絡むので順番通りに学べるようなものじゃないから。

理解できなくてもたくさん詰め込んでいけばその内に繋がりがわかってくる。
「最初は」熟考しなくてもいい。 入ってない知識が関連するなら考えてもどうせわからん。
597デフォルトの名無しさん
2023/11/21(火) 17:38:45.53ID:oh7zlSJI
>>593
ポインタ使わないこともできるのに何言ってんだ
そもそもポインタはノイマンアーキテクチャの基本なのでポインタがわからないというならコンピュータの利点を十分に利用できないということ
598デフォルトの名無しさん
2023/11/21(火) 18:05:44.93ID:tYm3I+7J
ポインター: 変数が入っているアドレスの数字
なんも難しいことはない
599デフォルトの名無しさん
2023/11/21(火) 18:24:30.60ID:fyFN08Ef
インデックスって言えば分かる?
コンピュータにあるメモリー全体のインデックス番号
600デフォルトの名無しさん
2023/11/21(火) 18:35:32.85ID:Ai4yJ31G
俺も最初全然わからなかったけどC言語ポインタ完全制覇のおかげで覚えた
601デフォルトの名無しさん
2023/11/21(火) 19:20:18.31ID:JkIDzJ0A
Java や C# にもポインタはあるしポインタを理解できなかったら他の言語も使えないよ
ポインタ自体は難しくないんだけど C/C++ ではポインタ演算できちゃうのが鬼門なんだよね
602デフォルトの名無しさん
2023/11/21(火) 20:49:14.51ID:TIZNoRj+
N88-BASICにポインタあったっけ?
603デフォルトの名無しさん
2023/11/21(火) 20:53:06.63ID:TIZNoRj+
ポインタの文法なんて入門書には必ず説明があるので直ぐ分かるとして
俺が初期に読んだ数冊の入門書には
それがプログラミングでどう役に立つのかが示されてなくて
悶々としながら読んでいたなぁ
604デフォルトの名無しさん
2023/11/21(火) 21:38:13.97ID:fyFN08Ef
ポインターなんて処理が糞遅いCPUをいかに速く動かすかって事以外に意味が無いからなぁ
605デフォルトの名無しさん
2023/11/21(火) 23:15:10.49ID:mJ6deMbY
std::string str = "abc";
①str = str + "dd";
②str = "dd" + str;
これらの記述は有効のようです。
①の右辺はstr.operator+("dd");
と解釈でき理解できます。

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

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

②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。
606はちみつ餃子 ◆8X2XSCHEME
2023/11/22(水) 06:21:16.63ID:xG0rhWaa
>>605
非メンバ関数として定義されている。
つまり
str=std::operator+("dd", str);
に相当することをやってる。
メンバ関数として定義すると不都合が起こるから std::complex とかも非破壊的な二項演算子は非メンバ関数として定義するのが通例だよ。
607デフォルトの名無しさん
2023/11/23(木) 18:16:14.60ID:yQq1Seno
>>606
本を見直したらfriendにするといい等ありました。

第1引数+第2引数、という記述があり、2個の引数を持つ+演算子関数が定義されている場合はそれが呼び出される決まりになっているのですね?
608デフォルトの名無しさん
2023/11/23(木) 18:17:35.84ID:yQq1Seno
stringから離れて一般的な質問です。↑
609はちみつ餃子 ◆8X2XSCHEME
2023/11/23(木) 20:11:53.97ID:V52ACnUy
>>607
そう。非メンバ関数として二つの演算子を受けとる operator+ があれば a+b みたいに書いたときに operator+(a,b) に読み替えられると考えてよい。
(全ての演算子を非メンバ関数として定義できるわけではない。)

余談だけど ADL という変な規則があるのは演算子が名前空間修飾できないことに対処する必要があるというのが理由のひとつで、自分が定義するクラスではこれが上手いこと作用するように設計すると便利なこともあるかもね。
610はちみつ餃子 ◆8X2XSCHEME
2023/11/23(木) 20:13:30.07ID:V52ACnUy
>>609
間違い。
「二つの演算子」じゃなくて「二つの引数」
611デフォルトの名無しさん
2023/11/23(木) 20:15:11.03ID:0De2U7us
最小のサンプルコードを書いて自分で試すと分かるし身につくよ
612はちみつ餃子 ◆8X2XSCHEME
2023/11/23(木) 20:49:41.10ID:V52ACnUy
書いてみるというのは賛成。
でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
C++ には未定義とか処理系定義とかがいっぱいあるからテキトーに書いたプログラムの結果が保証された動作とは限らないから。
613デフォルトの名無しさん
2023/11/25(土) 11:27:01.67ID:rcrc48ZO
>>612
>でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
横から悪いがこれには反対させてもらう
もちろん動作からの仕様の決めつけは良くないが、人間は学習する動物なので書いて動作を見てこそ上達するんだよ
丸暗記だけで理解したと勘違いしてるやつが昨今多い(そしてそういう奴に限って何も作ってない)ので、そういうのを後押しはしないで欲しい
614デフォルトの名無しさん
2023/11/25(土) 11:52:38.86ID:rcrc48ZO
というか、自分の認識の間違いに気づくのもまた書いて試した時だからね(まれにコンパイラのバグだったりもするけど)
人間が頭の中で考えたことなんか穴だらけなんだから書いて試せるなら真っ先に試した方がいい
615デフォルトの名無しさん
2023/11/25(土) 12:13:14.81ID:vlVh3gWj
>>613
同意。
処理系依存とか未定義動作なんて中級者以上になってから気にすればいいこと
はじめは手元にある処理系の結果を「正」として学習を進めても問題ないと思う
616デフォルトの名無しさん
2023/11/25(土) 12:45:47.67ID:rKTwm3uz
>>596 これ
>>593 しね
617デフォルトの名無しさん
2023/11/25(土) 12:47:19.78ID:rKTwm3uz
>>598-599
ポインタ判らんって人はその辺は判ってんだよ
本当に判ってないのはアドレッシングモード
618デフォルトの名無しさん
2023/11/25(土) 12:50:17.30ID:rKTwm3uz
>>602
peek poke はあるし変数もあるから
用途という意味でのポインタはある
619デフォルトの名無しさん
2023/11/25(土) 12:54:57.59ID:rKTwm3uz
>>613
そうだな
Rust スレにも変なのが粘着してゴリ推ししてて迷惑
620はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 13:45:51.01ID:BXmPXb0v
>>613
> 書いて動作を見てこそ上達するんだよ

だから書いてみるのは賛成と書いたのだが、何に反対してるんだ?
621デフォルトの名無しさん
2023/11/25(土) 13:56:27.70ID:vlVh3gWj
「学んでから確かめるために書く」

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

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

あなたが言ってるのは「これどうなるんだろう?」ではダメで「こうなるはずだ!」と学んでから動かせってことだよね?
それは初心者には結構むずかしい
622はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 15:39:30.62ID:BXmPXb0v
>>621
> これどうなるんだろう?動かしてみよう!なるほどこうなるのか!という学び方でもいいと思う

私が言いたいのは推測できるものではないというところが主旨で、
自分が色々やってみたことが不確かな推測であることを認識した上で
きちんとした資料にあたって確かめるという順序でもかまわないとは思うよ。
出来るのならば。
やってない人が多いように私には見えているから否定的に言ってるわけだけど。

> 初心者には結構むずかしい

訓練せずに他のことをしてても出来るようにはならないでしょ。
やらなきゃずっと難しいよ。

C++ は複雑怪奇かつ規格改訂もあるのでベテランでも頻繁に仕様を参照するのが普通なわけで、
資料を参照するのを後回しにするような人間が後にそのような人間に変われるとは思わない。
623デフォルトの名無しさん
2023/11/25(土) 16:15:59.30ID:vlVh3gWj
「やってない人が多いように私には見えている」

多くの人が出来てないことを初心者に求めてもねェ
624はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 16:27:29.63ID:BXmPXb0v
>>623
「推測した後には多くの人が資料を見ること」をやってないという話だぞ。
最初に資料で学ぶ人は体系的な知識が身に付くからそっちがオススメという話だぞ。
625デフォルトの名無しさん
2023/11/25(土) 16:42:06.01ID:vlVh3gWj
初心者に対して「言語仕様を推測したりしないように」「学んでから確かめるために書く」って言ってたよね

言語仕様を理解してからコードを書けってことでしょ?
626デフォルトの名無しさん
2023/11/25(土) 16:49:08.14ID:vlVh3gWj
>>624
先にも後にも資料(言語仕様)を確認しない人が多いんでしょ
そんな難しいことを初心者にまで要求してどうすんの
627はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 16:51:46.77ID:BXmPXb0v
>>625
そうだよ。 言語仕様を理解してから書くのが好ましい。

理解する前に色々試すというやり方も許容しなくはないが、
それでも後では資料を見て仕様を理解するという前提があってのもの。
理解する前に色々試すタイプは資料を見なくなりがちという現実があると述べてる。
628はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 16:55:25.38ID:BXmPXb0v
>>626
「資料」と「仕様」を使い分けて書いてるつもり。
直接に言語仕様を読めとは述べてないよ。

プログラムを書くときは色んな資料を参考にするので
入門書程度すらちゃんと読まない人がやってけると思ってんの?
ってことを言ってる。
629デフォルトの名無しさん
2023/11/25(土) 17:00:19.64ID:vlVh3gWj
え? 資料=言語仕様じゃないの?

「言語仕様を推測したりはしないように」って言ってたから言語仕様に関する資料を読んでからコードを書けという意味だと解釈したのだけど

資料=入門書程度なの?
・・・なんか言ってることが変わってきたね?
630デフォルトの名無しさん
2023/11/25(土) 17:03:42.33ID:vlVh3gWj
ちなみに「入門書を何冊か買って読みながら進めるといいよ」みたいな書き方だったらこんなに絡んだりしてないからね?
631はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 17:04:18.21ID:BXmPXb0v
>>629
いや、そりゃそうでしょ。 最初から言語仕様を読めとか言わないよ。
入門書だって仕様書に基づいて書いてるし、基づいてない入門書だったらクソってだけ。
632611
2023/11/25(土) 17:06:46.45ID:5Y+f+Y1g
>>623
これをやってきたのがはちみつ餃子なんだよ
俺ははちみつ餃子の書き込みにいつも感心してるよ
633デフォルトの名無しさん
2023/11/25(土) 17:09:19.28ID:rcrc48ZO
>言ってることが変わってきた
うん、まぁ、はちみつはそういうとこあるから・・・w
ただまぁ、言語仕様に詳しい人の存在は(はちみつに限らず)非常に有難いんだが、
実際にソフト書く上で気にしなきゃいけないのは言語仕様だけじゃない
特定のソフトの個別の問題を解決するためのアルゴリズムについて、資料があるのか?と。(すでに出来上がってて公開されてるアルゴリズムが存在する問題などほとんど無い)
一番大事なのは論理的思考力であって、なんでもはなから資料をアテにしてたら逆にそれが身につかないよ
634デフォルトの名無しさん
2023/11/25(土) 17:12:35.76ID:vlVh3gWj
>>631
だとしたら、言語仕様を推測するな、未定義動作や処理系がどーのこーのとずいぶんと遠回しな言い方をしたねえ
入門書を読みといいよの一言で済むのに

>>632
それは別の話。餃子がエキスパートであることは否定してない
初心者の前に高いハードルを立ててC++を聖域みたいにするのはやめて欲しいのだ
635デフォルトの名無しさん
2023/11/25(土) 17:13:52.19ID:rcrc48ZO
どうも仕様オタク(言い方は悪いが、アマチュアという意味も込めて)な人達は、自分の知ってる世界が全てだと思い込んでるようで前々から問題だと思ってた
世の中、マイナーなAPIとかになると嘘を書いてることもあるし何も資料が無いことすらある

もちろん実際の動作から「今わかること以上」をわかった気になる(仕様を知った気になる)のは問題だが、
逆に言えば「仕様がこうだから間違ってないんだ」などと動作を確かめもせずに決めつけるのも問題だ
そういうのは結局本人の心的態度の問題に過ぎない
636はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 17:15:51.23ID:BXmPXb0v
アルゴリズムは考えればわかることもあるかもしれんが、言語仕様は考えたってわからんし。
(想像はつくことも多いけど。)
637デフォルトの名無しさん
2023/11/25(土) 17:17:15.50ID:mGx3DnG8
> 書いてみるというのは賛成。
初心者はこれでもいい

> でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。
中級者以上になって言語仕様等に踏み込んだ学習をしようとするなら書いたもので仕様を測るのではなく「学んで」知るべし

と言う意味だと俺は>>612を解釈してた
638はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 17:21:04.72ID:BXmPXb0v
>>634
複雑難解な C++ を試させるのがハードルの低い方法だと主張したいわけ?
きちんと整備された学習ルートがあるという話なのにそれでハードルを上げてるとか言われるのは心外だわ。
639デフォルトの名無しさん
2023/11/25(土) 17:24:19.67ID:vlVh3gWj
「きちんと整備された学習ルートがあるという話なのに」

お前そんな話してたか?
640デフォルトの名無しさん
2023/11/25(土) 17:24:48.18ID:mGx3DnG8
あれよな
・初心者スレだからアドバイスはすべて「初心者向けの内容」
・初心者スレだけどアドバイスは「初心者向けの内容」と「その先を見据えた内容」

はちみつ大先生は後者だけど、ツッコミを入れたほうは前者で読み取っているから噛み合わないってだけよな、たぶん
641はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 17:26:03.64ID:BXmPXb0v
>>639
まずは資料を読め (資料があるから) という主張を最初からしてるつもりだが。
642デフォルトの名無しさん
2023/11/25(土) 17:34:11.58ID:xBFezCRv
「C++言語リファレンスを頭に叩き込め!!話はそれからだ」
でいいんじゃね?と俺は思っている
で、理解できない部分は入門書やサンプルコードを読んで理解する

まずは書いて試せという人もいるが俺はこの意見には賛同できない
プログラミング言語というのは日本語や英語などの自然言語と違って
少しでも間違えたら動かないし、C++の場合なら最悪システムが破壊される
理解できなくても動けばいいなどという考えの奴がいるからバグが量産されるのだ

ミスが許されないのはたとえば医者だな
医者は医者になる前に知識を詰め込むのが普通だ
知識もないのに外科手術をしたらどうなるか?
切りながら覚えろというのか?
プログラミングは手術と同様、まずは知識、次に技術が必要となる、と俺は思っている

【完】
643はちみつ餃子 ◆8X2XSCHEME
2023/11/25(土) 17:40:31.27ID:BXmPXb0v
>>640
初心者教育は二種類に大別されると思っていて、たとえば公立学校の授業でするような
興味がない層も含めて最低限の知識は与える教育と
学ぶ意欲があって専門知識と言えるようなものを身に付けようとする者に対する教育。

前者は「興味をひく」というところから考えないといけない。
理屈よりも楽しいと思えるようなやり方が必要になることもあるだろう。

後者は理屈を避けては通れない。
理屈の身に付け方には色んな方法論があるかもしれないけど
まずは書いてあるものを読め
(先人がそれを良いやり方だと思ってまとめてくれたんだから!
手を動かす必要があると思うところでは演習問題があったりもする)
という風に考えてる。

今は初心者であるかどうかは重要ではなく
ここで相談するような層は後者のルートのつもりでいると私は思って書いてる。
644デフォルトの名無しさん
2023/11/25(土) 17:45:56.52ID:Xpg7OWMd
>>642
>理解できなくても動けばいいなどという考えの奴
誰の話?
645デフォルトの名無しさん
2023/11/25(土) 18:21:13.32ID:xBFezCRv
>>644
わからないか…かわいそうに…
教えてあげなぁぁい
646デフォルトの名無しさん
2023/11/25(土) 18:24:14.13ID:0MoP1N3f
おちんちん舐めてごらん
647デフォルトの名無しさん
2023/11/26(日) 10:58:08.83ID:d/KzVdDP
>>628
最近ChatGPTに全部聴いて済ます変なのが住み着いて迷惑だな
648デフォルトの名無しさん
2023/11/26(日) 11:15:51.84ID:d/KzVdDP
>>642
>医者は医者になる前に知識を詰め込むのが普通だ
>知識もないのに外科手術をしたらどうなるか?
>切りながら覚えろというのか?

言いたいことは判るが「最初の医者」はどうしてたんだろうな
君の言ってるやり方は「従順な職人」を育てるやり方としては正しいが
クリエイターを育てることは出来ない
649デフォルトの名無しさん
2023/11/26(日) 12:24:07.96ID:t0WQFMSf
>>642からの>>645だからな
一見それっぽいこと言ってるようで全く中身の無い事を言うアホが長いこと住み着いてる(C++系だけなのか他もなのか)
突っ込まれると頭悪い煽り方しかしてこないからすぐわかる、玄人ぶりたいだけのアホだから相手しない方がいい
650デフォルトの名無しさん
2023/11/26(日) 12:37:18.37ID:DTfcWvWZ
医者の下りはおかしい
医師は残念ながら完全な医学的知識を身に着けて
外科手術に臨む訳じゃないぞ
語弊を恐れなければ「切りながら覚える」側面もある
651はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 12:54:38.94ID:k38CbPq9
ちゃんとした資料で学んでないと用語が無茶苦茶だから
何を言ってるんだかわからないということが起こる。
言語仕様の理解が結果的に正しくてもそうでなくても。
「伝わればいいだろ!」みたいに言う人が結構いるんだけど伝わらないから困るんだ。

メンバ関数をメソッドと言ったりするのは誤解の余地はそんなにないと思ってたら
非メンバ関数もメソッドと言っている例を観測したことがあるし、
子クラスって派生クラスの意味で言ってるんだよな?
と思ってよく確認したら入れ子になったクラス (nested class) だったりするし、
クラス変数は静的データメンバの意味だろう (Ruby とかにはそういう用語があるし) と思ったら
静的でないデータメンバのことを言ってたというオチもある。
結果的に正しく使ってる場面ですら本当にその意味で言ってるのか疑わしくなる。

経験や感覚で書けるようになったとしても
まともな資料を読んでないというのはそういった形でコミュニティ内で有害なわけで
たまには思い違いがあるのはしょうがないが
学んでないし学ぶ気もないのを良しとは言えないよ。
652デフォルトの名無しさん
2023/11/26(日) 13:47:17.98ID:t0WQFMSf
>>651
いい加減にしろよ
お前何でそんな上からなの?
653はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:18:15.64ID:k38CbPq9
>>652
伝えようとしない態度を批判してるところに対して伝わらないことを書くのやめろよ。
何が言いたいんだ?
654デフォルトの名無しさん
2023/11/26(日) 14:34:29.20ID:mssmbX4x
自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ

ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって
C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね
C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。

荒らす気は無いのでこれで終わりにする
655はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:42:52.42ID:k38CbPq9
完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。
書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
656はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:55:17.55ID:k38CbPq9
資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ?
学校だって座学でやったことを演習で実践してるだろう。
657デフォルトの名無しさん
2023/11/26(日) 15:50:55.41ID:DTfcWvWZ
気にするなってほぼ嫉妬なんだから
658デフォルトの名無しさん
2023/11/26(日) 16:03:14.03ID:t0WQFMSf
>ほぼ嫉妬
俺に言ってんの?
いずれにせよ荒らそうとしてる自覚はあるか?
659デフォルトの名無しさん
2023/11/26(日) 16:08:02.37ID:Dy8SO9u0
>>658
どう考えてもお前が荒らしじゃん
人のことをアホ呼ばわりしてるし
660デフォルトの名無しさん
2023/11/26(日) 16:22:42.40ID:t0WQFMSf
>>642=645=659 バレバレだからwww
661デフォルトの名無しさん
2023/11/26(日) 18:08:35.12ID:fCQnoW9K
>>655
言語仕様・未定義動作・処理系とか言ってたから完璧に把握しろに近いニュアンスだと感じた
メソッドではなくメンバ関数、用語を正しくつかわないと伝わらないとか言ってることがどんどん変わってる
662デフォルトの名無しさん
2023/11/26(日) 18:08:55.12ID:4RSi5A29
お取り込み中すみませんが質問です
ダウンキャストという用語が是か非かです

ボクは不適切な用語だと思っていて
理由は
1) 言語の仕様に出てきていない
2) アップかダウンかについてももちろん仕様に無い
3) アップキャスト相当の操作は通常行わない
です

少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
663はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 20:14:28.93ID:k38CbPq9
>>662
仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
原則としては C++ 用語ではないと考えて良いと思う。
クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
方向をアップ/ダウンで言うのもおかしな話だし。

derived-to-base convertion というような用語は仕様書の文面にもあるので
アップキャストに相当するのはこの用語のはずだけど
base-to-derived convertion という用語は出てこないので
ダウンキャストに相当する直接の用語はなさそう。
冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。

ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。
to が脱落したらだいぶん雰囲気が変わってしまうでないの。
これは真似しないほうがいいかもね。

ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも
アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので
なんだかんだで一語で表せるってのは便利なんだと思う。
私は使わないようにしているけど。
664はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 20:20:37.65ID:k38CbPq9
すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。
665デフォルトの名無しさん
2023/11/26(日) 20:28:40.49ID:4RSi5A29
レスサンクス
お手数おかけして痛み入ります

> 3) アップキャスト相当の操作は通常行わない

B *b = (B *)d; // もしもこれが必要な世界だったら
使い分ける?ための用語が欲しくなるのはまだわかるけど
D *d = (D *)b; // こっち方向にしかキャストしないんだから
区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない

…とはいえボクがいくらこう考えても
みんながそうじゃないから蔓延ってるわけで

> 私は使わないようにしているけど。

その一言で何か救われた気分になりました
666デフォルトの名無しさん
2023/11/26(日) 20:32:07.21ID:4RSi5A29
一応補足

> B *b = (B *)d; // もしもこれが必要な世界だったら

B *b = d; // こう書くだけじゃ許されなくて
667デフォルトの名無しさん
2023/11/26(日) 20:37:16.38ID:Dy8SO9u0
ダウンキャストって言葉は普通に使われてると思うが…
日本語版のウィキペディアなら

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
にアップキャストとダウンキャストのことが書かれてる
668デフォルトの名無しさん
2023/11/26(日) 20:47:28.85ID:4RSi5A29
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,

上記トレイトのメソッド名に採用されている
あー虚しい
あーヤダヤダ
669デフォルトの名無しさん
2023/11/26(日) 20:59:53.00ID:mssmbX4x
>>667
使われてるけど規格に定義があるような正式な用語ではないってことだろ
670はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 21:20:56.75ID:k38CbPq9
>>665
むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。
ポインタを経由せずに値を直接キャストすることもありうるし
参照の場合かもしれない。

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);
}
671デフォルトの名無しさん
2023/11/26(日) 21:48:36.05ID:Dy8SO9u0
>>669
一応マイクロソフトのリファレンスは正式だと思うが
まあマイクロソフト独自の規格ってなるのだろうけどな
あんなもんは認めないというのなら仕方あるまい
672デフォルトの名無しさん
2023/11/26(日) 21:52:47.74ID:DTfcWvWZ
>>663
>仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
>原則としては C++ 用語ではないと考えて良いと思う。
>クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
>方向をアップ/ダウンで言うのもおかしな話だし。
upcastとdowncastって一般名詞なのではないかな?
673デフォルトの名無しさん
2023/11/26(日) 21:57:36.24ID:mssmbX4x
>>671
デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
674デフォルトの名無しさん
2023/11/26(日) 22:15:54.01ID:Dy8SO9u0
>>673
デファクトスタンダード
それだ

大正解
675はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 23:34:44.38ID:k38CbPq9
言語仕様の説明をするときには >>670 のようなバリエーションの内のどれのことを言っているかで
事情が変わってくるので結局は具体的な場合を示さなければならず、
「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。
(より詳細な場合分けをするので用語を使う機会がない。)

逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは
充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。

どうせ説明を付け足すなら用語の甲斐がないので
使う意味もそんなにないように思う。

念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので
そうではない状況で文脈を共有できていて
「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
676デフォルトの名無しさん
2023/11/27(月) 04:54:45.36ID:tiJqQBXv
オナニー解答
677デフォルトの名無しさん
2023/11/27(月) 08:10:08.19ID:8c8BDf1i
相変わらずはちみちはめんどくせーな
678デフォルトの名無しさん
2023/11/27(月) 09:35:39.43ID:7/k6/GSg
>>651
違う言語で比較するときはそういう用語の使い方になるケースが多いと感じる
「學んでいない」のとはまた別の問題だと思う
679デフォルトの名無しさん
2023/11/27(月) 09:39:16.20ID:7/k6/GSg
>>656
あいつは學校行ってないかも知れないな
なんでも試行錯誤で
挙句ChatGPTが完璧に教えてくれると勘違いしている
救えない
680デフォルトの名無しさん
2023/11/27(月) 09:41:27.50ID:7/k6/GSg
>>662
「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
681デフォルトの名無しさん
2023/11/27(月) 09:52:51.04ID:7/k6/GSg
>>675-677
アスペ臭を感じる
682デフォルトの名無しさん
2023/11/27(月) 14:40:19.25ID:UqO8a829
アスペルガー症候群だって良いじゃないか?
何で差別的なことを書くのかね?
683デフォルトの名無しさん
2023/11/28(火) 00:01:54.69ID:5UazaCro
クラス内からのみ参照する定数配列のベストな書き方を模索しています。

まず
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ではエラー解消せずでした。
684デフォルトの名無しさん
2023/11/28(火) 00:04:59.65ID:5UazaCro
2のcppは

const int クラス名::TABLE[3]={1,2,3};

も試したはずですがエラー解消しませんでした。
685デフォルトの名無しさん
2023/11/28(火) 00:37:23.98ID:dISnZSIc
2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか
あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
686デフォルトの名無しさん
2023/11/28(火) 01:08:09.85ID:dISnZSIc
あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合
687デフォルトの名無しさん
2023/11/28(火) 06:02:30.27ID:fb4KLmhh
2、staticメンバにする方法。
.h
static const int TABLE[3]={1,2,3};
.cpp
extern const int TABLE[3];

もれはやらんけど
688デフォルトの名無しさん
2023/11/28(火) 06:13:38.37ID:fb4KLmhh
あ、ごめん逆だった
.cpp
static const int TABLE[3]={1,2,3};
.h
extern const int TABLE[3];
689デフォルトの名無しさん
2023/11/28(火) 10:21:56.36ID:tbacT9e+
>>684
これは通るだろ? コンパイラは何よ?
690はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 10:25:57.66ID:mRTkdYl9
>>684
出来なかったというコードをそのまま提示して欲しい。
状況がよくわからないのに想像で対処法を考えてもしょうがない。
コードがちょっと長くなるなら
codetter とか wandbox とか ideone とかを使って。
691デフォルトの名無しさん
2023/11/28(火) 10:27:57.27ID:vcMwjchf
クラス内の定数を外部に生出しとかしないから
enunとかで宣言はするけど
何番目が欲しいとかはサービス関数作るしなぁ
692デフォルトの名無しさん
2023/11/28(火) 10:30:15.59ID:vcMwjchf
つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?
693デフォルトの名無しさん
2023/11/28(火) 10:32:49.40ID:vcMwjchf
ヘッダーファイルはクラスコードの名刺みたいなもんで
外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
694デフォルトの名無しさん
2023/11/28(火) 10:35:09.02ID:vcMwjchf
マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな
695デフォルトの名無しさん
2023/11/28(火) 11:07:40.67ID:t7+ip2Xg
>>692
staticには複数の意味がある

>>683 の発想は h に static 描いてみたら「たまたま」エラーが消えたら ok みたいなやり方なんだろ
696デフォルトの名無しさん
2023/11/28(火) 11:35:51.07ID:vcMwjchf
>>695
staticより「内部でしか使わない」って話の方を拾ってね
697デフォルトの名無しさん
2023/11/28(火) 12:43:41.53ID:dISnZSIc
>>696
質問者は「クラス内からのみ参照する」って言ってただろ
698デフォルトの名無しさん
2023/11/28(火) 18:17:05.00ID:vcMwjchf
>>697
それならヘッダーファイルに書く必要無いやんけw
699デフォルトの名無しさん
2023/11/28(火) 18:50:50.78ID:dISnZSIc
そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね
700デフォルトの名無しさん
2023/11/28(火) 20:09:09.84ID:vcMwjchf
そんな巨大なクラスは設計が間違ってないか?
701デフォルトの名無しさん
2023/11/28(火) 20:12:44.23ID:bqHRuT95
>>680
> 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される

それなw
初心者ほどこの用語を使ってるように見える
初心者が集まるところでこれを流布してるやつがおるんやろな
ポインタへのポインタっていうスケーラブルな定義が理解できてなくて
アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
702はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 20:20:10.37ID:mRTkdYl9
>>700
この >>699 の言は逆のことを言ってると思う。
ひとつの翻訳単位にたくさんのクラス (の実装部分) を書くこともあるから
ファイルスコープにしたらスコープの範囲が広すぎる (制限にならん) やんけと言ってるように読める。
703デフォルトの名無しさん
2023/11/28(火) 20:27:35.33ID:dISnZSIc
>>700
巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど)
例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる
そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
704デフォルトの名無しさん
2023/11/28(火) 20:29:47.21ID:dISnZSIc
>>702
もちろんそれもある
705デフォルトの名無しさん
2023/11/28(火) 20:57:18.00ID:dISnZSIc
まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス
706デフォルトの名無しさん
2023/11/28(火) 21:00:29.03ID:HOP5xTTo
>例えばクラステンプレートになると、ソースに実装を書けないから

C++の設計ミスだな
特にテンプレ
707デフォルトの名無しさん
2023/11/28(火) 21:55:43.79ID:vcMwjchf
テンプレートは単なる#defineだからなぁ
あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
708はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 22:43:12.61ID:mRTkdYl9
一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。
従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。
コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
709デフォルトの名無しさん
2023/11/28(火) 23:00:59.77ID:5UazaCro
どうも>>683です。
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;
}
710デフォルトの名無しさん
2023/11/28(火) 23:06:12.31ID:5UazaCro
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に現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
711デフォルトの名無しさん
2023/11/28(火) 23:19:21.29ID:dISnZSIc
解決おめ、自分の用途に合うと感じるならそれがベストと思うよ
712デフォルトの名無しさん
2023/11/29(水) 06:23:02.71ID:n75oaT1g
h に static 描くと単に相互干渉しないってだけで
インスタンスは造られまくって無駄リソース出まくるんじゃね
713デフォルトの名無しさん
2023/11/29(水) 09:24:39.36ID:5+1qDy8t
奴は人の書き込み見ちゃいないよw
714デフォルトの名無しさん
2023/11/30(木) 22:28:52.60ID:p6G1t8dm
sizeof(クラス名)を活用できる場面はありますか。
メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、
クラス一般について考えると思いつきません。

たとえば
std::string name;
がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
715デフォルトの名無しさん
2023/11/30(木) 22:39:03.15ID:jq+Wc58z
>>714
>std::string name;
>がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
確認してみましょう!
716はちみつ餃子 ◆8X2XSCHEME
2023/11/30(木) 23:39:52.07ID:3QI4e6Tt
>>714
sizeof 演算子の適用結果は定数であることが保証される。
定数式として使うことができる。
std::string なども型の大きさが変動したりはしない。

C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。
(実際には処理系の拡張として VLA を使える場合もある。)

メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。
それほど機会は多くないだろうけど。

本来 (?) の用途とは違うところで使われる場合もあって、
いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
717デフォルトの名無しさん
2023/11/30(木) 23:55:15.59ID:p6G1t8dm
>>716
高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
718デフォルトの名無しさん
2023/12/01(金) 10:06:48.86ID:NZuUNSBe
おまえら、stdとboostどう使い分けてる?
719デフォルトの名無しさん
2023/12/01(金) 13:58:15.55ID:aU4DjGEJ
>>717
stringも実際には確保したメモリのポインタと文字列サイズを持ってるだけ(だけではないけど簡単に言えば)なので
Cの構造体と大して変わらんのよ
720デフォルトの名無しさん
2023/12/02(土) 07:29:47.55ID:qIqFVuKn
まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。

暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。

どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。
暗号化等には既製ライブラリ使います。
721はちみつ餃子 ◆8X2XSCHEME
2023/12/02(土) 09:03:43.92ID:w8ZlbPjQ
>>720
設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。
というよりも継承を使うほうが悪い。
「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。

プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
722はちみつ餃子 ◆8X2XSCHEME
2023/12/02(土) 11:45:21.73ID:w8ZlbPjQ
他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。
極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。
自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
723デフォルトの名無しさん
2023/12/02(土) 12:16:48.61ID:0tC7Yjqi
sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて
書き込むとき勝手に暗号化してくれると有難いな
724デフォルトの名無しさん
2023/12/02(土) 13:25:55.77ID:JgaBxQHi
ここはプログラム技術板だぞ 自分で作れ
725デフォルトの名無しさん
2023/12/03(日) 06:49:36.39ID:xZHPSaOR
このスレはC++の話ではない書き込みが多すぎる
726デフォルトの名無しさん
2023/12/03(日) 11:07:00.27ID:QTewqrs7
C++の守備範囲が広いんよ
727デフォルトの名無しさん
2023/12/03(日) 21:36:41.23ID:kkqQUehZ
>>721
ありがとう。
非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。
string 暗号化(鍵, 平文);
だけあれば十分だと。
728デフォルトの名無しさん
2023/12/04(月) 21:09:04.65ID:wzr7hFvb
msys2で開発環境を作りたくて
Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして
g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが
std::ifstream ifs("hoge.txt");
のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。
fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。
どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
729デフォルトの名無しさん
2023/12/04(月) 22:11:21.42ID:+6ZMbPCa
エラーメッセージは?
730はちみつ餃子 ◆8X2XSCHEME
2023/12/05(火) 00:16:37.88ID:z5PiblaY
msys2 環境は数種類のモードがあるはずだがどれで起動した?
731デフォルトの名無しさん
2023/12/05(火) 04:57:07.09ID:DXGBHl1O
実行ファイルの場所がカレントになってないんだろ
getcwd()してみ
732728
2023/12/12(火) 14:02:16.36ID:haJQSzRG
エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが
今回は>>731さんの言う通りになっていて解決できました
まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します
ありがとうございました!
733デフォルトの名無しさん
2023/12/12(火) 15:14:22.81ID:bMo3JLCK
GUIから起動するとカレントディレクトリがホームになるんだったっけ?
734デフォルトの名無しさん
2023/12/13(水) 15:23:50.85ID:Xh1qTD5r
OSの事情でカレントが簡単に移動してしまうのがめんどいな
735デフォルトの名無しさん
2023/12/13(水) 16:17:33.78ID:b3+IUHNQ
プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね
736はちみつ餃子 ◆8X2XSCHEME
2023/12/13(水) 17:12:54.61ID:vPv7AHCs
設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。
アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。
逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。
Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
737デフォルトの名無しさん
2023/12/13(水) 17:14:51.41ID:Xh1qTD5r
起動時の引数や 自分のフルパスを取得するAPI経由で
実行ファイルのある場所を基点にどうこうすることが多いわ (Windows

unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか
起動時のカレントのまま?
738デフォルトの名無しさん
2023/12/13(水) 17:20:10.83ID:b3+IUHNQ
>>736
それはインストーラー使うアプリでしょ?
XCOPYインストールアプリの話だよ
739デフォルトの名無しさん
2023/12/13(水) 17:23:03.86ID:HyXW4bJ5
カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ?
ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
740はちみつ餃子 ◆8X2XSCHEME
2023/12/13(水) 18:03:20.75ID:vPv7AHCs
>>739
基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。
scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。
Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
741デフォルトの名無しさん
2023/12/13(水) 23:12:49.25ID:zjCiNOvz
グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。
仕様ではmain前に実行ということのほかに何か規定はありますか。

ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
742はちみつ餃子 ◆8X2XSCHEME
2023/12/14(木) 00:23:02.09ID:GWgG2Hfk
>>741
ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。

・ 定数初期化が終わってから動的初期化がされる
・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい)
・ 翻訳単位内の初期化順序は定義が現れた順序
・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない

特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、
強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
743デフォルトの名無しさん
2023/12/14(木) 01:04:36.74ID:X6Ol8Z5z
普通は、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",
744デフォルトの名無しさん
2023/12/31(日) 22:48:46.98ID:tpduSr4A
相談室から誘導されたのでこちらで
http://2chb.net/r/tech/1698705458/104

buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
745デフォルトの名無しさん
2024/01/01(月) 01:29:30.25ID:/rCM9JK/
このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw
746デフォルトの名無しさん
2024/01/02(火) 11:00:49.80ID:TDOOgc4U
ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる
有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
747デフォルトの名無しさん
2024/01/02(火) 20:21:16.21ID:G9bvfkvl
>>746
頭の出来で決まっているからね

義務教育レベルで脱落した人間、日本語能力に問題がある人間は、プログラマーとしても問題がある。
748はちみつ餃子 ◆8X2XSCHEME
2024/01/02(火) 21:40:20.68ID:RkRzwbey
知識は入れないと増えないというすごく当たり前の話。
長く放置してたら勝手に増えるなんてことはないよ。
749デフォルトの名無しさん
2024/01/03(水) 08:18:02.54ID:3n4RUKo6
ガキの頃からマイコンBASICマガジン見てたけど
PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
750デフォルトの名無しさん
2024/01/03(水) 08:26:31.48ID:uKn1SmuA
糞コテが
751デフォルトの名無しさん
2024/01/03(水) 13:07:46.32ID:3mJitcl/
>>749
SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
752デフォルトの名無しさん
2024/01/03(水) 13:17:11.92ID:SgwYv7hO
ポケコン触ってたころが一番楽しかったです
手の中に物理キーボードと実行環境があるんだもん
一生遊べるよ
753デフォルトの名無しさん
2024/01/03(水) 14:56:53.56ID:giTORTIB
>>744
memcpyでなくちゃんとplacement newでコピーorムーブコンストラクタ走らせればいんじゃね?
754デフォルトの名無しさん
2024/01/10(水) 03:00:04.91ID:lNNg6PiH
Class Hogeの中でたくさんのFugaを管理するために
std::vector<std::unique_ptr<Fuga>>というメンバ変数を作りました
可変長引数テンプレートで複数のstd::unique_ptr<Fuga>を受け取るコンストラクタを書こうとしたのですが
std::unique_ptrがコピー禁止のためうまくいきませんでした。
Hoge(Args&&... args)
という形で右辺値参照を受け取ってうまいことムーブしてClass Hogeを初期化する方法ってありますか?
755はちみつ餃子 ◆8X2XSCHEME
2024/01/10(水) 04:36:30.64ID:BOjhYgCx
>>754
できると思うけど、何をやりたくて何が上手くいかなかったのかイマイチわからない。
出来なかったコードをみせて。
756デフォルトの名無しさん
2024/01/10(水) 11:27:22.10ID:lNNg6PiH
>>755
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がコピー禁止でエラーになったのでムーブにしたいけど書き方がわかりませんでした。
757はちみつ餃子 ◆8X2XSCHEME
2024/01/10(水) 12:45:18.04ID:BOjhYgCx
>>756
この場合は 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));
}
758デフォルトの名無しさん
2024/01/12(金) 09:52:36.06ID:Umd8uX9b
c++で日本語の連想配列ってあります??
759デフォルトの名無しさん
2024/01/14(日) 15:30:33.22ID:O4q5V5KL
>>758
std::mapじゃだめなん?
760デフォルトの名無しさん
2024/01/16(火) 21:37:05.24ID:eUaXJLuy
>>757
無事に動作させることができました。ありがとうございます!
761デフォルトの名無しさん
2024/01/20(土) 18:17:15.80ID:9qysS+ur
時間のかかる処理があり、それが現在のスレッドをブロックして欲しくないので
その処理の部分に関してstd::async()の利用を検討していますが、
これって戻り値(future 型)でモニターしないといけない感じですか?
上記の処理はいつ終わるかは気にしないので別スレッドに投げっぱなし?で構わない
のですが... pthread_detach()的な?
762はちみつ餃子 ◆8X2XSCHEME
2024/01/21(日) 12:43:25.73ID:4rk7TZPC
>>761
std::thread のメンバ関数に detach はあるけど、期待するのはこういうこと?

ただ、メインスレッドが終了すれば他のスレッドが稼働中でもプロセス終了処理に入るし、
プロセス終了処理の中で標準ライブラリの後始末している最中に他のスレッドが
標準ライブラリを使うようなことがあると破綻するかもしれない。

強引に終わらせて良いなら std::quick_exit で即死させるという方法も取れるが、
基本的にはプログラムを終わらせるときには全てのスレッドを終了させて (終了を待って) おくのが
普通だと思う。
763デフォルトの名無しさん
2024/01/21(日) 21:48:26.38ID:zlvjOB5M
>>761ですが、お返事ありがとうございます。

はい、とりあえず thread::detach() を使うようにしました。1つの疑問は、
https://ja.cppreference.com/w/cpp/thread/future/~future によると
> ただし、その共有状態が std::async によって作成され、まだ準備完了になっておらず、これがその共有状態への最後の参照である場合は、ブロックする可能性があります。

ええ何それ、というのが発端でした(後出し失礼)。

確かに、メインスレッドの終了時のこともありますし、スレッドの後始末をちゃんと
した方が本当はいいように思われます。処理が長時間たっても終了しない場合
タイムアウトさせたりとかも。
何かシステマティックな方法等あるでしょうか。参考になるものがあれば...
764はちみつ餃子 ◆8X2XSCHEME
2024/01/22(月) 12:54:36.50ID:T1sqP3ZB
>>763
メインスレッドの終了直前でまずは適当にフラグを立てた上で他のスレッドの終了まで待機する。
重い処理をしているスレッドの側で完了ではないにしても区切り良く終われるポイントでフラグを読んで
フラグが立っていれば後始末ルートに入ってスレッドを終了させる。
その結果としてメインスレッドの待機状態が終わってプロセスの終了。
というのが普通の大まかな流れだと思う。

その上で待機時間があまり長すぎるようだと強引にでも終わらせるとかの処理を入れるかも。

std::async は既存の関数を非同期化するちょっとしたユーティリティという立場なんじゃないかな。
それで事足りるときは便利で簡単だけど、細かい制御を勝手にやってくれるわけでもないし、
やろうとするとちょっとイマイチって感じ。
765デフォルトの名無しさん
2024/01/28(日) 11:52:43.80ID:W0uCnQb3
質問なのですがどんな環境(ロケール設定)の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()が上書きしないように見えるのですがそういうもの?
766はちみつ餃子 ◆8X2XSCHEME
2024/01/28(日) 13:12:39.75ID:hRRbWEE/
>>765
言語仕様通りならそれらの関数を呼び出さないようにすれば環境に固有の表現の変換はしない。

std::setlocale の設定が C の標準関数の挙動に影響するのはその通り。
ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。
空の文字列を渡した場合には環境に固有の設定であり、通常はシステムの設定が反映される。
プログラムは起動したときに setlocale(LC_ALL, "C"); 相当の状態なので、普通は書く必要もない。

std::locale::global での設定は C++ の標準ライブラリの挙動に影響するだけでなく std::setlocale での設定にも反映されるので両方を呼び出す必要はない。
これもプログラム起動時のロケール設定は "C" 相当になっているのでそれで良ければ呼び出す必要もない。
ただし、 std::locale::global に与える設定が名前を持たない場合 (つまり std::locale("") のような場合) は std::setlocale 相当の変更もするかどうかは規定されない。

imbue はストリームにロケールを結びつけるのでグローバル設定とは独立して機能する。
767デフォルトの名無しさん
2024/01/28(日) 14:11:55.68ID:eBJAlicu
クラスオブジェクトの代入文に、=による単純コピーと、=演算子関数による独自コピーのどちらを使うか迷います。

たとえばメンバ変数が基本データ型の集まりなら単純コピーでいい。
今出くわしたのはメンバ変数がstd::array<int, 3>の場合で、まあたぶん単純コピーでよさそう?じゃあstd::vector<myclass>なら?などと疑問が深まります。

あとコピーコンストラクタによる初期化も合わせて考える必要がありそう。
768はちみつ餃子 ◆8X2XSCHEME
2024/01/28(日) 14:36:51.31ID:hRRbWEE/
>>767
単純コピーってのは何のこと?
デフォルトで生成される代入演算子の意味で言ってるのかな?
769デフォルトの名無しさん
2024/01/28(日) 15:36:35.20ID:W0uCnQb3
>>766
レス㌧クス、
>ただし、様々な環境での「同じ動作」を期待するなら "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" で行こうと思いまつ
770デフォルトの名無しさん
2024/01/28(日) 16:37:46.15ID:eBJAlicu
>>768
そうです。
771はちみつ餃子 ◆8X2XSCHEME
2024/01/28(日) 16:38:46.52ID:hRRbWEE/
>>769
Windows での話か……。
msvcrt だとどうにもならなくて ucrt でちょっとマシになってるみたいな話題をこないだ Teratail で見たぞ。
772はちみつ餃子 ◆8X2XSCHEME
2024/01/28(日) 16:52:54.16ID:hRRbWEE/
>>770
デフォルトで生成される代入演算子は全てのサブオブジェクト (基底とデータメンバ) を
代入演算子でコピーするのと同じ挙動になることになってる。
基底やデータメンバが適切に代入演算子を定義されているのならデフォルト生成にまかせてよいことが多い。

注意を払う必要がある典型的なものは生ポインタで、
ポインタをコピーしても指してる先のオブジェクトはひとつだから
そのへんの扱いはデフォルト生成だとあかんことになる。

あとは外部のリソースと結びついているオブジェクトだと単純にコピーできないか、コピーさせないこともあるな。
分かりやすい例で言うなら std::thread なんかはスレッドを抽象化したものだけど
オブジェクトをコピーしたらスレッドもぽんぽん増えるなんてことになっても困るし
スレッドひとつに対応しているオブジェクトがいくつもあるようでも困るのでコピーできないようになってる。

それぞれに事情があるので明瞭な判断基準があるわけじゃないけど、
デフォルト生成の結果がほんまに自分の意図通りに動作するか考えてみて
あかんなら自分で書くしかない。
773デフォルトの名無しさん
2024/01/28(日) 17:03:17.17ID:eBJAlicu
>>772
いつもありがとうございます。
たいていはデフォルトでよさそうですね。
std::vectorは可変長配列ってことなので、<int>であってもデフォルトでいいのかなと心配に…あこれはvectorのほうで独自=定義されてるなら問題ないわけですね。
774デフォルトの名無しさん
2024/01/30(火) 20:47:22.29ID:RcbbllHt
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
}
775はちみつ餃子 ◆8X2XSCHEME
2024/02/02(金) 00:09:46.55ID:BQKaaqcl
>>774
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
}
776デフォルトの名無しさん
2024/02/02(金) 11:28:24.45ID:xohFoxUO
>>775
横からだけども
> X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested)
って
X x2(2);
と同義じゃねーの?
777はちみつ餃子 ◆8X2XSCHEME
2024/02/02(金) 12:19:41.13ID:BQKaaqcl
>>776
違うよ。
C++ では引数ひとつのコンストラクタは変換コンストラクタとして「も」使うことになっているから
違う文脈でも結果的に同じコンストラクタが呼び出されることになるけど
構文糖というわけではなくて違う解釈を経ている。
778デフォルトの名無しさん
2024/02/02(金) 12:28:48.56ID:xohFoxUO
細かいなぁ
779はちみつ餃子 ◆8X2XSCHEME
2024/02/02(金) 18:32:30.30ID:ZFQgO+dm
動くなら同義と考えても大した問題じゃないが、
ここでは実際に結果が違う (一方はエラーになる) ことの説明だから……
780デフォルトの名無しさん
2024/02/02(金) 22:30:30.14ID:d8Flt8Cn
これはなぜエラーになるのですか。
std::string s = "abc";
char name[10] = s.c_str();

error: array must be initialized with a brace-enclosed initializer


次と同等とみなせないのはなぜ?
char name[10] = "abc";
781774
2024/02/03(土) 05:00:19.85ID:vGyzbOvf
>>775 774だけどありがとう。暗黙だと変換が途中で途切れるかもなのか。
一番通って欲しいのがbなんだけど難しいっすね…
782デフォルトの名無しさん
2024/02/03(土) 05:21:33.46ID:4Ieoi/Xm
>>780
c_str()が返すのはchar*
char name[10] = "abc"; は特別扱いで char name[10] = {'a', 'b', 'c', 0}; と同じ
cの時からある雀の涙猫の額ばかりの文字列サポート
783はちみつ餃子 ◆8X2XSCHEME
2024/02/03(土) 08:35:44.53ID:Sz70frqK
>>781
少し表現を変えて良ければ >>774 の X x2 = f0; を
X x2 = {f0}; と書くことでも通すことは出来るよ。

更に真面目に対処するならこんな感じかな。
https://wandbox.org/permlink/giXZnCETo64IkEez
784デフォルトの名無しさん
2024/02/03(土) 22:40:06.88ID:mzdZy5dk
>>782
あーそういうことですね。ありがとう。
785774
2024/02/04(日) 02:54:38.53ID:1VXaeA8L
>>783 上は={}で通るのは確認してました。{}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか?
下の方、typenameの所は余りよく分からなかったですが強制的に引数の型で包んで(オブジェクト生成?)、コンストラクタの引数代入時に変換追加するということでいいですか?
typename以下はdecltype(f_)((f_))でも良いんかなと思って変更してみたら通りました
786はちみつ餃子 ◆8X2XSCHEME
2024/02/04(日) 09:54:01.38ID:/H29LerN
>>785
> {}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか?

いいえ。 直接初期化に該当します。
コピー (コピーコンストラクタの起動) は発生しません。
つまり X x1(f0); と書いた場合と同じということです。
ですから暗黙の変換を一段階すれば充分なのでエラーなく通ります。

> コンストラクタの引数代入時に変換追加するということでいいですか?

いいえ。 何もしません。
コンパイルを通すためには不要ですので、 X のコンストラクタは

template <class T>
X(const T& f_) : f(f_) {}

という定義だけでも問題なく動作します。

ただ、こうすると T は「あらゆる型」になりえます。
std::function<void()> に変換不可能な型も受け入れてしまうということです。
変換不可能であればいずれにしても最終的にはエラーなのですが、
X がデタラメな型も受け入れてから F に変換失敗してエラーになるよりは
特定の条件を満たす型以外を X が拒否するほうが一般的には都合がよいので
そうなるようにしたのです。

コンパイルを通すために必要なのではなく通さないための処置です。
787774
2024/02/04(日) 22:33:14.16ID:1VXaeA8L
>>786 上:初期化周りは似たような物が色々あって知識が曖昧でした。
下:あの記述は型制限の為ですか。読んでも意図がよく分からなかったので助かります。
説明ありがとうございました
788デフォルトの名無しさん
2024/02/10(土) 13:14:08.12ID:KJGevrBa
質問なのですが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)と同じパティーンで復旧がマニピュレータ……
789はちみつ餃子 ◆8X2XSCHEME
2024/02/10(土) 14:30:14.27ID:XEL9SE6k
>>788
・ 直接的に入出力を司るのはバッファと呼ばれるオブジェクト
  (たとえば 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 から。
790デフォルトの名無しさん
2024/02/10(土) 15:00:10.91ID:KJGevrBa
>>789
㌧クスなるほど……
変更した書式の戻し忘れが無く、問題らしい問題点はほぼ無しで良さげ……
(しいて言えばstreamの中の作りを理解していなければtempが何の目的でそうするのかわかりにくい(コメント必須)なだけ、

std::printは手元のVC++がまだC++20対応止まりなので当面見送らざるおえない

std::formatは…… 書式文字列が定数式限定という仕様のはいかがなものか……
今回の用途では困りませんし、コンパイル時に書式の妥当性をチェックしてくれるのは良いのですだが、
仮に、C言語における自作printf()様インターフェースの関数(書式文字列と可変長引数を変数で受け取り、内部でvprintf()を呼ぶ)
みたいなものを作りたくなった場合どうするんじゃとそこはかとなく疑問が……
791はちみつ餃子 ◆8X2XSCHEME
2024/02/10(土) 15:16:22.24ID:XEL9SE6k
>>790
実行時バージョンとして std::vformat も用意されている。
792デフォルトの名無しさん
2024/02/10(土) 15:25:38.54ID:KJGevrBa
>>791
なるほどなるほど、自作std::format()様関数は問題無く作成でき、
書式文字列が定数式限定が困るというのは杞憂ですたねサーセン;;;
(実行時にならないと書式文字列が決まらない場合、コンパイル時チェックが原理的に不可能になるのはC言語のprintf()/vprintf()の関係も同じなのでC言語からの後退ではない
793はちみつ餃子 ◆8X2XSCHEME
2024/02/10(土) 16:29:24.58ID:XEL9SE6k
メンバとして copyfmt があって、これで書式を他のストリームにコピーすることも出来る。
書式を待避しておくだけのストリームを作ってそれにコピーしておいて
後で元に戻すという使い方をしてもいいんだけど、
どうせストリームをあらたに作るならそれを一時的なストリームとして使ったほうが自然かと思う。
794デフォルトの名無しさん
2024/02/11(日) 22:38:22.35ID:smEWrSvv
std::setのinsertで

std::set<int> c1 = {1,2,3};
std::set<int> c2;

c2.insert(c1);

と書けると便利に思えますが解説のページを見るとできないようです。
なぜですか。
795デフォルトの名無しさん
2024/02/11(日) 22:45:16.04ID:KNbj1ANO
>>794
c2.insert(c1.begin (), c1.end ());
796はちみつ餃子 ◆8X2XSCHEME
2024/02/12(月) 11:50:11.55ID:4VueJhli
>>794
set に set を insert できる「だけ」ってのはあまり便利ではない。
集合というものをより汎用的に扱える枠組みとして C++20 から range という概念が導入された。
その枠組みを上手いこと成立させる言語機能 concept が長いこと検討されてて、
入る入ると言いながら C++20 までずれ込んでしまったという事情がある。

そんなわけで、 C++23 からなら insert_range が使えて、
これは range の条件を満たすものならなんでも受け入れられることになってる。
797デフォルトの名無しさん
2024/02/12(月) 21:37:56.53ID:WngRm50l
>>794
c2.merge(c1) ※C++17以降
798デフォルトの名無しさん
2024/02/13(火) 22:11:49.56ID:TA8E1xmn
みなさんありがとう。環境適合を優先して>>795を使うことにします。
799デフォルトの名無しさん
2024/02/18(日) 00:05:28.51ID:AtsZxBPF
コンストラクタの初期化子リストの中で、どこまで柔軟に記述できるのかなーと思ってGPT先生に聞いたら、constまたはconstexprを返す関数のみ書けるとのことでした。
コンストラクタ内部のように好きなように書けないとわかり、初期化子リストの価値が低く感じられました。

そんな制限を設けてまで初期化子リストを導入した意図は何でしょう。
800デフォルトの名無しさん
2024/02/18(日) 01:13:17.69ID:UTNyRtZE
ChatGPTなんかあてにするな、平気で間違ったこと言うんだから
constやconstexpr以外を返す関数だって普通に呼べる

試しにChatGPTに「メンバ初期化子リストではconstかconstexprを返す関数しか呼べませんが、これはなぜですか?」ってあえて間違った前提条件で質問してみたら、間違ってることに対する指摘は一切なかったし、さもこっちの質問が正しいかのようなそれっぽい返答が返ってきたし

---
俺:
C++において、コンストラクタのメンバ初期化子リスト内ではconstまたはconstexprを返す関数しか呼ぶことができません。これはなぜでしょうか?

ChatGPT:
C++において、コンストラクタのメンバ初期化子リスト内でconstまたはconstexprを返す関数しか呼ぶことができる理由は、初期化子リストがオブジェクトの初期化に使用され、実行時のコードが生成されないためです。メンバ初期化子リストはコンストラクタの一部であり、オブジェクトが生成される際に実行されます。このリスト内での関数呼び出しはコンパイル時に解決され、オブジェクトの初期化に関する情報は実行時に生成されません。

constまたはconstexprを返さない関数をメンバ初期化子リスト内で呼ぶと、実行時にコードが生成される可能性があります。しかし、これはオブジェクトが生成される前に行われる初期化の一環であり、実行時の処理としては不要なオーバーヘッドを引き起こす可能性があります。

コンストラクタのメンバ初期化子リストは、メンバ変数を適切に初期化するためのものであり、できるだけ効率的に行われるように設計されています。そのため、コンパイル時に解決されるconstまたはconstexprを返す関数の呼び出しに限定されています。
---

だからAIをあてにしちゃダメだよ
801デフォルトの名無しさん
2024/02/19(月) 00:17:49.94ID:bJlSKdBs
>>800
私が聞いたときも似たような内容が含まれていて、そうなんだねと納得してしまいました。

ではコンストラクタに書けることはすべて書けるのですね。

なおこの問いは、入門書籍にはそこまで書かれてなくて、検索でもかんたんに見つからなかったので聞きました。
802はちみつ餃子 ◆8X2XSCHEME
2024/02/19(月) 02:33:45.03ID:j7eyydGe
>>801
たぶん >>799 で言う「初期化子リスト」は「メンバ初期化子リスト」だよね?
これらは全くの別物。
明らかに混同しやすい用語だから仕方がない部分はあるんだが、
誤った用語を元に調べたら誤った解説に当たりやすいかもしれない。

メンバ初期化子リストは直接初期化 (direct-initialization) であると規定されていて
具体的な挙動の説明は初期化の章に丸投げされている。
https://timsong-cpp.github.io/cppwp/n3337/class.base.init#7
つまりメンバ初期化子リストに特有の事情というものはない。

普通に初期化なんで、そこに違いがあるかもしれないという想像をする人がいてそういう人のために
違いが無いと断りを入れる必要があるとは入門書の著者は思わなかったんだろう。
有るものを有ると説明することはあるが無いものを無いと殊更に強調して説明はあまりしない。
803デフォルトの名無しさん
2024/02/19(月) 22:58:00.95ID:bJlSKdBs
>>802
そうですメンバ初期化子リストです。どうもありがとう。
なお書籍には、メンバ変数名(引数)やメンバ変数名(0)の例ばかりでした。
804デフォルトの名無しさん
2024/02/26(月) 09:17:00.78ID:KZUiymUx
すみません、コンストラクタの宣言/定義で A() {}; とした場合と A() = default; と
書いた場合は何が違うのでしょうか。挙動とか意味だとか...
あるいはある種のタイプクラスの場合は違いが生じるので注意とか....??
805はちみつ餃子 ◆8X2XSCHEME
2024/02/26(月) 09:36:14.06ID:pFLZLcAJ
>>804
default を指定した場合はデフォルトのルールでコンストラクタを生成する。
生成可能な条件が満たされなかった場合でもそれ自体はエラーにはならずに
デフォルトコンストラクタは削除済と見做されるというルール。

そのときはデフォルトコンストラクタを必要とする使い方をした時点でエラーになる。
806はちみつ餃子 ◆8X2XSCHEME
2024/02/26(月) 09:39:35.86ID:pFLZLcAJ
つまりこんなことをしてもエラーは出ないが

struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};

struct bar : foo {
bar() = default; // デフォルトコンストラクタのデフォルト生成
};

int main(void) {
}

↓ こういうことをするとエラー

struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};

struct bar : foo {
bar(){}
};

int main(void) {
}
807デフォルトの名無しさん
2024/03/02(土) 19:28:56.45ID:fBQwxymt
>>806
遅レスすみません。要は、コンストラクタの特定のパターンの用法をされたくない
ときに使う感じ? でそれに該当するとコンパイルエラーになるわけですよね?

自分が気になったのは、ランタイム時に何かありうるかということです
あるコードで、コンストラクタがdefault指定されているクラスが、別のクラス内
(親子関係にはない)でunique_ptrとして生成されたときに問題が生じたような
感じで....
ってもっと自分で調べてからレスしろって話ですが、現在そのコードに立ち戻る
ことができず、とりあえず疑問だけを
808はちみつ餃子 ◆8X2XSCHEME
2024/03/02(土) 21:07:53.65ID:JOojncXx
C++ の仕様は場合分けで規則がごちゃごちゃしていることが多くて単純な一般原則として説明できない。
「要は」なんて一言でまとめられないよ。
809デフォルトの名無しさん
2024/03/03(日) 19:37:10.80ID:HNPAS3Wj
>>807
そういう目的ではないと見ていいよ
>>806が言ってるのは、基本的にはデフォルト実装でコンストラクタを作ってくれるが必ずではない、と言ってるだけ
デフォルトの(引数無しの場合、何もしない。が、基底クラスの引数無しのコンストラクタはちゃんと呼んでくれる)コンストラクタでいい場合に使う。

A() {}と書くのと基本同じだよ
810デフォルトの名無しさん
2024/03/12(火) 20:26:30.54ID:lzPsc8Dg
異なる型を含むような配列(的なもの)を作りたいのですが、可能でしょうか?
例えば template <T> struct NamedValue { string name; T value; } を定義して
NamedValue<string>{a, b} や NamedValue<int>{c, d} などの型の異なる複数の値を、
一つの配列的なものに収納したいのです
例えばvectorは全要素が同じ型じゃないと駄目ですよね
811デフォルトの名無しさん
2024/03/12(火) 21:14:27.11ID:irRbCjS4
>>810
std::tuple
812デフォルトの名無しさん
2024/03/12(火) 21:19:48.50ID:irRbCjS4
あるいは要素数がコンパイル時に決まらないなら
std::anyをコンテナに入れるとか?
813デフォルトの名無しさん
2024/03/12(火) 22:11:10.08ID:lzPsc8Dg
はい、要素数はコンパイル時に決まらないのでstd::anyのコンテナですかね
で要素を取り出すときは、どの型なのかをチェックして挙動を...
814はちみつ餃子 ◆8X2XSCHEME
2024/03/12(火) 23:03:39.03ID:WtXn1sYk
もし >>810 の T の種類が限られているのなら std::variant を使ったほうが楽かもしれない。
std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。
815デフォルトの名無しさん
2024/03/23(土) 11:43:27.62ID:YZ3MX9tD
std::remove()ってファイルを消去する関数なんですね
std::move()と名前が似ているのに全然違う
816デフォルトの名無しさん
2024/03/23(土) 12:38:58.15ID:6dCwgWlj
名前空間か関数名にfileくらい入れとけって思うよね
817デフォルトの名無しさん
2024/03/23(土) 12:50:26.95ID:epZulncV
C言語以前にE言語の問題や
さすがにそのくらいの英語の勉強はしておけと思う
818はちみつ餃子 ◆8X2XSCHEME
2024/03/23(土) 12:51:15.85ID:szITgpvT
C の規格から取り込んだものだから由来が違うんだよ。
今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。
819デフォルトの名無しさん
2024/03/23(土) 12:54:13.64ID:aQWBK6SI
>>815
>std::remove()ってファイルを消去する関数なんですね
std::remove()ってSTLのstd::removeじゃなく?
ちゃんとコンテナの要素をre-moveしてると思うが?
820デフォルトの名無しさん
2024/03/23(土) 13:38:01.48ID:qgcdIGgP
>>819
だよねえ??

>>815-818が何を言ってるのか分からなくて怖い
821デフォルトの名無しさん
2024/03/23(土) 13:40:27.68ID:qgcdIGgP
ああ
<cstdio>に
int remove( const char* pathname );
ってのがあるのか
https://en.cppreference.com/w/cpp/io/c/remove
822デフォルトの名無しさん
2024/03/24(日) 05:14:16.83ID:DBUI72Gl
>>818
なるほど。諸般の事情でC++14な環境で、ファイルを扱う関数を探していたら。
Boostに行く手もあるかもしれませんが、とりあえず。
823デフォルトの名無しさん
2024/03/24(日) 09:50:29.58ID:FsPOi81N
cstdio のは std:: 名前空間じゃないよね.
::remove だと思うけど
824はちみつ餃子 ◆8X2XSCHEME
2024/03/24(日) 12:13:25.60ID:iaJ2USO3
>>823
cstdio にある関数は std 名前空間にある。
ただしグローバル名前空間「にも」あって良い。 (無くても良い。)
stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)
825デフォルトの名無しさん
2024/04/14(日) 11:55:59.92ID:Rac57Bvn
ヒエッ……、、、ぎ、玉虫色……
826デフォルトの名無しさん
2024/04/20(土) 14:55:18.13ID:nh5GJjX6
言語そのものではないのですが、コマンドラインのデバッガやIDEでSTLのコンテナの内容を
易しく表示してくれるのってありますか?
例えばvectorなら、単純に中の要素だけを列挙してくれたりとか

ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは
確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等)
見えてる感じで、STLコンテナに関してはあまり親切ではないような
デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか?
自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです
827デフォルトの名無しさん
2024/04/26(金) 10:53:44.71ID:kftlKAnq
今からC++を勉強するならC++20を基準にやっても構いませんか?
828デフォルトの名無しさん
2024/04/26(金) 10:59:40.04ID:/+TxHGye
c++20といわずc++23からやればいいのでは
829デフォルトの名無しさん
2024/04/26(金) 11:15:59.06ID:kftlKAnq
最新の規格で勉強して必要に応じて古い知識をつけていくような学び方でいいの?
830デフォルトの名無しさん
2024/04/26(金) 12:03:42.74ID:q/vvVdAs
つべこべ言わずやれ
最短コースなんてない
831デフォルトの名無しさん
2024/04/26(金) 13:37:23.03ID:+usxQk3U
C++ は基礎の上に段階的に応用が乗っかっているような綺麗な構成ではない。
全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。
どこから入っても同じ。
832デフォルトの名無しさん
2024/04/27(土) 18:08:12.52ID:nxPk0zOn
質問なのですが
std::string には std::to_string(int)他の簡単文字列化関数がありますが
std::basic_string<T> に対する簡単文字列化関数はどう?
833デフォルトの名無しさん
2024/04/27(土) 21:15:22.77ID:Zg+tfmdX
>>826
WindowsのVisual Studioではできる
834デフォルトの名無しさん
2024/04/28(日) 10:47:20.65ID:xKAeYuwJ
最初に学ぶ言語がC++なら、Cより学ぶのが大変じゃん
835832
2024/05/11(土) 19:13:43.45ID:RotYKdRC
やっぱ数値から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 とかある
836デフォルトの名無しさん
2024/05/13(月) 23:37:45.97ID:E3c8DTgZ
>>835
分かっとるやないか
837デフォルトの名無しさん
2024/05/17(金) 02:48:48.77ID:5PkVcelB
OS上で動かすアプリ作りたくなったからC++とC#で悩んだんだけどどちらの長所も捨てがたい気がして両方学んでみるかな?って思ったんだけどC++でのおすすめの参考書とかあります?
一応、学生時代にC言語で五目並べとファイルの出力までは勉強してます。
一応ググって入門参考書とか調べましたがちょっとC言語齧ったのなら実戦的な例題集みたいなのが良いのでしょうか?
あとこの質問スレ違いだったらすいません。
838デフォルトの名無しさん
2024/05/17(金) 09:33:44.70ID:7hVV19/y
Windows上のアプリをC++で作るのは少々ハードル高いが
個人的にオススメなのはWindows2000 プログラミング標準講座(ハーバート・シルト著)ってやつ

C++そのものの本は他の人が挙げてくれると思う
839はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 01:34:46.93ID:lh74nkjR
どういう学び方が良いかは人による。
C++ の設計思想としては理解できた便利機能をその都度に導入する形で学んでいけるようにという配慮はしていると設計者は言っている。 実務でプログラミングをしてる人は「C++ をちゃんと習得するまで待ってくれ。 仕事を止めてくれ」とは言えないからね。 C を理解しているならとりあえず C のように書きながら部分的に C++ 的にしていける。
つまり実戦的な学びかたも一応はアリ。

ただ、実戦的な学習はやりたいことが出来てるならそれ以上深掘りする意欲につながらない。
C の書き方でやれるなら別の形に積極的に書き直したい理由って何?と感じてしまうことがある。
きちんとした理解に至らぬままの中途半端な形になりがち。

やりたいこと (書きたいもの) が明白なほうが道筋は付けやすいんだけど、やりたいことに邁進しすぎてもそれはそれで「学習」としてはイマイチなんだよ。
そのへんは程度問題というか匙加減というか、人による、場合によるとしか言いようがない。

個人的にはしっかりとした理屈っぽい入門書を一冊は読んでから方針を決めればいいと思ってる。
840デフォルトの名無しさん
2024/05/19(日) 14:09:52.90ID:y+g7UiM3
>>838
レス、ありがとうございます
Windows2000 プログラミング標準講座が近所の図書館にもなかったのでそこにある蔵書読んでみてVisual studio使ったプログラミングしたことないからそれをツールとして使った入門書でいいかな?って思ってしまいました。
>>839
レス、ありがとうございま。。
何を作りたいかの方向性でそれに使うものだけ勉強すれば速いというのはわかります。
自分的には作りたいアプリもあるけどまずGUIアプリを作るための基礎からやりたいなと思ってます。
理屈っぽい入門書の理屈っていう部分はプログラムのハードでの処理の考えとかかと思ったのですがそれはたぶん理工系の学部行ってたので通信情報の基礎理論は聞いたことあるので大丈夫だと思います。
C++は基礎わかってれば後は組み込みたい機能のコードを探せばいいってことと解釈してコード集みたいな辞典を使ったり、ネットで調べたりすればいいってことでいいのでしょうか?
841はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 15:08:47.80ID:lh74nkjR
>>840
私がいう「理屈」は言語仕様のことのつもりで言ってた。
低レイヤから入った C ユーザーは C を使えているようでも言語仕様に対する理解が浅くなりがちで、
良くも悪くも機械語 (ハードウェアの挙動) と対応づけて考えてしまうところがある。
言語としての抽象とその実装は分けて考えないといけない。

現代的なコンパイラは最適化がメチャクソに賢いので実際に生成される機械語と一対一には対応づかないし、
言語仕様で未定義としているところを踏んだらわけのわからない動作を引き起こすので
言語仕様について一定以上には身に付けてから実践を始めないと何がなんだかわからないことだらけだと思う。

逆に一定以上に C++ の基礎を身に付けてからならあとはリファレンスを見ながらでも行けるけれど、
今の C++ の「基礎」は昔の C++ と比べるとかなり巨大になってしまっているので当初の C++ の設計思想のように
C から段階的に C++ を身に付けるってのはあまりお勧めできないと私は考えてる。
C++ はとにもかくにも巨大で言語機能はお互いに絡み合っているので部分ごとの理解なんて出来ないんじゃないかということ。

繰り返すけど、人による。
自分なりにどういう方向性で行ったらいいのか判断するためにはどこからでもいいから一旦は始めたらいい。
どうせまったく躓きなく進むなんて出来ないんだから駄目だったときにどこが駄目だったかを検討して
軌道修正するしかしょうがないんじゃないのかな。
842デフォルトの名無しさん
2024/05/19(日) 15:25:20.86ID:TV8v+5zc
>>840
一応Amazonで中古が出てる

最近の本を知らないのでなんとも言えんのだけど、
Visual Studioと名のつく本は、開発環境(VisualStudio)依存の機能使いまくりで他で応用が効かないんだわ、本を選ぶときの参考にしてくれ
(開発環境に依存しまくりでいいなら、ぶっちゃけC#のがはるかに楽)

>>838はWin32APIやメッセージループとかの「ずっと変わらない基本」をちゃんと教えてくれる本として挙げた
843デフォルトの名無しさん
2024/05/19(日) 19:24:07.63ID:y+g7UiM3
>>841
言語仕様ですか
私自身、自分はハードを動かすためにCやアセンブラ触った口だから多分それに該当しそうです。

>>842
ちょっと気になったのですがハーバート シルト(著)の標準講座C++とか独習はどうなのでしょうか?
ハーバート・シルト氏の著書を少々調べてみたのですがどれも人によっては難しいとコメントあるけど素晴らしい学習書という人が多いみたいでしたので
844はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 20:21:36.73ID:lh74nkjR
>>843
C++ の仕様は不変なわけではなくてたまに改定してるというのは考慮に入れる必要がある。
どの仕様かを言うときには改定年度を付けて表す通例があって、現時点では C++98, C++03, C++11, C++14, C++17, C++20, C++23 がある。

入門レベルなら最新を積極的に追うほどの必要はないけど、最低限度は C++11 だと思う。
改定の期間があいたせいでインパクトの大きい変化があった。
それより古い書籍は良書だとしても現状に合わないところは色々とあるかもしれない。

GCC や Clang は特に指定しなければ C++17 モードのようなので現時点の基本は C++17 くらいというのが一般的な認識なんじゃないかな。
845デフォルトの名無しさん
2024/05/19(日) 21:02:45.49ID:TV8v+5zc
あーそういや独習書いた人だっけ
独習は定番レベルで評価高い、ある程度Cの知識は前提になるけど読めると思う
C++標準講座は読んだことないのでわからんすまん
8461
2024/05/29(水) 05:15:45.12ID:fgEqna2o
なに?プログラムって。むつかしそうだなー
ぜんぜん知らないんだけど、ちょっとやってみたいなー

ってな人も、入れてあげてね。
そういうスレなんだから。
847デフォルトの名無しさん
2024/06/11(火) 02:11:04.90ID:T9Og4Yet
質問です。
独習でc++勉強してるのですが掛け算して出力するっていう練習問題見ててふと気づいたのですがこの本一体どの文字コードで保存すること考えて書いてるんだ?っていう疑問が出てきました。
sjisだとちゃんと日本語表示されるけど汎用性ないよな?ってことでUnicodeで書くこと前提で勉強したほうがいいよなって思ったんですが下のコードだと何を直せばいいのでしょうか?


#include <iostream>
using namespace std;

int main()
{
double hours, wage;

cout << "労働時間を入力する: ";
cin >> hours;

cout << "時給を入力する: ";
cin >> wage;

cout << "合計賃金は" << wage * hours << "円\n";

return 0;
}
848はちみつ餃子 ◆8X2XSCHEME
2024/06/11(火) 05:44:39.09ID:oZDOZRBo
>>847
データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。
Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。
849デフォルトの名無しさん
2024/06/11(火) 10:47:36.44ID:GrH0S5VC
実行環境を変える
setlocale()するとか
850デフォルトの名無しさん
2024/06/11(火) 15:21:46.44ID:T9Og4Yet
>>847
つまり、自分のところの文字エンコード使えってことでしょうか?
動作的には目的通りできますし、環境次第で文字表示はどれ使えるか変わってくるしで

>>849
実行環境はこの環境で使えるプログラム組めるまで気長にやるつもりなのでなしです。
setlocale()使ったことないのでよくわからないのですがロケール宣言してその中で日本語使ってみたらってことですか?
851デフォルトの名無しさん
2024/06/11(火) 16:20:37.40ID:ILw6YbJs
長らくVS触ってなかったんであまり役に立たんかもしれんけど
・Visual Studioでutf-8でソース書く方法
http://tech.hikware.com/article/20171020a.html

・Win32APIをutf-8で使う
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page

C++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん
852デフォルトの名無しさん
2024/06/11(火) 16:33:04.86ID:ILw6YbJs
https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170
下の方にsetlocaleでutf-8指定する方法書いてる
で、ソースコードもロケールもutf-8になってりゃ>>847のコードそのままでutf-8で実行してくれるはずよ
853デフォルトの名無しさん
2024/06/11(火) 16:50:13.04ID:ILw6YbJs
https://learn.microsoft.com/ja-jp/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170
すまん、実行時もソースコードもオプションに/utf-8入れるだけだったわ
setlocaleしなくていい

utf-16にしたいんだったらまた別だけど
854はちみつ餃子 ◆8X2XSCHEME
2024/06/11(火) 17:31:31.68ID:kKWOd8Cb
>>850
言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。
色々な文字コードをサポートしていることもあるししてないこともある。
切り替えることが出来ることもあれば出来ないこともある。

それとストリームはリダイレクト (接続先の変更) される可能性がある。
やりたいことによっては
標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。

Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。
OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。

Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。
その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど
Windows で別のターミナルを使うときはその制御方法の規格が確立してないから
主要なターミナルを判定して場当たり的な処理をしているのが現状。
近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから
結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……)

更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して
変換することがあって、その挙動がかなりわけがわからない。

色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。
855デフォルトの名無しさん
2024/06/11(火) 22:55:22.54ID:T9Og4Yet
すいません。
私の環境ただ単にUTFが使用可能になってなかっただけでした。
856デフォルトの名無しさん
2024/06/12(水) 16:16:19.83ID:HDPWhZcO
termcap/terminfoとか
init.d
inittab
getty
857デフォルトの名無しさん
2024/06/13(木) 02:54:21.20ID:PAaiBuyr
人間に匹敵する知能を持った汎用人工知能を開発した研究者に総額100万ドルの賞金を授与するコンテスト「ARC Prize」が開催
858デフォルトの名無しさん
2024/06/15(土) 17:34:41.45ID:kg6WNOQa
>>847

C++は、日本語対応していないよ、注意してね。
だから、"あいうえお"なんかのコードは実行されない。
俺はこれを理解するのに10年以上かかった。
859はちみつ餃子 ◆8X2XSCHEME
2024/06/15(土) 19:41:12.56ID:g9ixUcaw
>>858
No.
現在は Unicode についての規定はあるし、 Unicode のコードポイントに対応つくことが保証された文字列リテラルはある。
860858
2024/06/15(土) 21:31:29.30ID:kg6WNOQa
俺のエディタは、EmEditor Professional (64-bit)だ。
だ。だからC++は、C++17だ。
わからなかった。ごめんな。
861デフォルトの名無しさん
2024/06/16(日) 00:50:11.77ID:v0fD0nKy
C++と文字コードに関してはこの記事が面白かった
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b
俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
862デフォルトの名無しさん
2024/06/16(日) 23:06:40.05ID:+HL215mo
>>857
どうやってチューリングテストするんじゃ……
863デフォルトの名無しさん
2024/06/16(日) 23:21:48.48ID:+HL215mo
coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは
エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから
つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから
Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
864はちみつ餃子 ◆8X2XSCHEME
2024/06/16(日) 23:45:30.66ID:Crm/SwBu
>>863
言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い)
実際に Windows では文字コードや改行コードの変換をする。
改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない?
変換するということは変換元が想定通りじゃないときには破綻する可能性がある。
Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。

バイナリモードではバイト列そのまま。

Linux だとテキストモードとバイナリモードは区別がない。
865デフォルトの名無しさん
2024/06/17(月) 00:54:42.78ID:pXzMaPAe
>>864
だいたいわかりた、
>実際に Windows では文字コードや改行コードの変換をする。
テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、
cout << "アイウエオカキクケコ\nさしすせそ" << endl;
と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、
上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを
「実行時に」解釈する必要がある
つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、
Shift JISというものを知っている必要があり、これが
>Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
につながるんだと思う。
866デフォルトの名無しさん
2024/06/17(月) 00:57:00.44ID:pXzMaPAe
しかし
>実行環境の都合で各種の変換を入れても良い。
とC++の仕様には書いてあると言っても実際には透過的でない文字コード変換とか有り得ないんでないので?
例えば
ofstream ofs("foo.txt"); ofs << "アイウエオカキクケコ\nさしすせそ" << endl; // (1)
std::string s1, s2;
ifstream ifs("foo.txt"); ifs >> s1 >> s2; // (2)
とやったらs1、s2とも中身は(1)の記述をコンパイル時に解釈した通りになる、
という期待動作しかありえないのでは……
具体的には
s1の中身は SI アイウエオカキクケコ SO の12バイト(末尾NUL除く)になって、
s2の中身は さしすせそ という10バイト(末尾NUL除く)になる、
867デフォルトの名無しさん
2024/06/17(月) 01:13:07.47ID:pXzMaPAe
いやトチ狂ったスマンヌ、
Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから
>>865 の理解はやや的を外していた……orz
テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。

しかし、であればやっぱ>>863に戻って、実は実害無いのでは……
Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし……
透過的でない文字コード変換(>>866)が無い限り、cout して cin して結果が変になるケースが思いつかなsげ……
(正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
868デフォルトの名無しさん
2024/06/17(月) 16:31:20.06ID:prlYSpwu
wstringがutf-32だったら良いのに
869デフォルトの名無しさん
2024/06/18(火) 11:56:24.49ID:mldi07Wv
>>861
その人ブチギレてるフリしてるだけの厨二病だから・・・
870デフォルトの名無しさん
2024/07/17(水) 14:22:34.59ID:UFGYctg0
std::functionって関数の「比較」はできないんでしたっけ?

例えばあるクラスが std::function<..> m_callback みたいなインスタンス変数を持ってて
そこにコールバックを登録できるメソッドがあるとします
registerCallback(std::function<..>& callback) { m_callback = callback; } みたいな

で、registerCallback(func)が呼ばれた後、正しいコールバックが保持されていることをテスト
したいのですが、例えばregisterCallback()の引数に渡したstd::function<..>のオブジェクトと
m_callbackはどうしたら比較できるでしょうか。単純に == ではエラーになる模様です
871はちみつ餃子 ◆8X2XSCHEME
2024/07/17(水) 16:12:07.26ID:rcKIBlXh
>>870
メンバ関数テンプレート target を使えば元の関数を取り出せる。
https://wandbox.org/permlink/3sCREueD2sVYMW9t
ただし、取り出すときに元の型を指定する必要がある。

ただの関数ならば簡単なのだけれど、
ラムダ式から直接に入れた場合には適切な型を指定できない。
ラムダ式が生成する値はそれぞれに固有の型を持つので。

一旦 std::function に入れたらあまり取り出さない (取り出す必要がない) 設計が望ましいと思う。
テストのためだけなら大丈夫だと思うけど。
872デフォルトの名無しさん
2024/07/19(金) 12:25:52.15ID:HkXmecYp
functionではなくオーバーロードで生の関数や関数オブジェクト(ラムダ含む)を受け取って、functionと共にアドレス値を保存すればいいのでは
関数オブジェクトの場合はoperator ()のアドレス
873デフォルトの名無しさん
2024/07/21(日) 02:13:54.03ID:5YGWxq2c
独習でc++を勉強していて時々プロセッサとかライブラリ関数これなんだろ?になるのですがそういうの調べる辞典的なものってあるのでしょうか?
あるのでしたらおすすめのもの教えてもらえませんか
874デフォルトの名無しさん
2024/07/21(日) 02:27:27.18ID:neWsPxIF
C++標準に関しては
https://cpprefjp.github.io/
https://ja.cppreference.com/w/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
プラットフォーム固有のものに関してもそれぞれあるけど
関数名でググったら大抵上の方に出てくるとおも
875はちみつ餃子 ◆8X2XSCHEME
2024/07/21(日) 08:39:43.55ID:uupG6eva
ググって出てくるようなのは誤った記述も多い。
あまり信用しすぎずになるべく複数の情報源を持つのが好ましいと思う。
言語仕様は改訂もあるから資料の日付を見てどの版に対応するのかも意識する必要がある。

>>874 が示すような有志がまとめているサイトはちょっとした企業よりも高いモチベーションがあるのか質は高い。
本当にありがたいサイトなので役に立ったと思ったらちょっとくらいは寄付してあげてね。
876デフォルトの名無しさん
2024/07/21(日) 12:22:32.16ID:qC5USrOr
Unix環境ならmanは割と手軽で良い
877デフォルトの名無しさん
2024/07/21(日) 15:22:13.51ID:neWsPxIF
いや、プラットフォーム固有って言ったのは
Microsoft Learn(旧MSDN)とかApple Developerとかのことやぞ
878デフォルトの名無しさん
2024/07/21(日) 16:05:28.79ID:neWsPxIF
安価忘れてた、>>875
複数の情報源持つべきとかは同意するけど
プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)
879デフォルトの名無しさん
2024/07/21(日) 19:10:23.03ID:5YGWxq2c
>>874
>>875
ありがとうございます。
やっぱ、ググって調べるのが一番なんですね。
ただ、C++と言いつつほぼCの内容で紹介してて本でやってる課題とこの関数の使い方知りたいでなんか食い違いあったんですがここわかりやすそうなので助かります。
880デフォルトの名無しさん
2024/07/21(日) 21:04:50.60ID:D0FAs2Ah
cpprefjpはなんかTシャツ作るらしいから記念に買うわ
https://github.com/cpprefjp/site/issues/1296
881デフォルトの名無しさん
2024/07/21(日) 21:06:26.85ID:neWsPxIF
手元に置いておく辞典系の本があっても良いと思うけどちょっとお勧めできるものを知らない・・(C++11より前のものしか買ったことない)
秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ
882デフォルトの名無しさん
2024/07/23(火) 01:20:07.66ID:Rfg4Mjqa
>>880
誰得
883デフォルトの名無しさん
2024/07/25(木) 15:13:06.50ID:kulC2cnH
>>882
1万円くらいで転売しようと考えています
884デフォルトの名無しさん
2024/07/29(月) 05:00:32.70ID:ycfafYuZ
>>874
https://cpprefjp.github.io/
、単発寄付が、簡単にできたらなーと、惜しくなった。
885デフォルトの名無しさん
2024/08/01(木) 04:44:09.33ID:ZgmEa4OS
unordered_map の extract というのはC++17以降でしか使えないのですか
886デフォルトの名無しさん
2024/08/01(木) 09:34:34.68ID:jWmufzw0
>>885
https://cpprefjp.github.io/reference/unordered_map/unordered_map.html
対応バージョンがC++17ってなってるね
887デフォルトの名無しさん
2024/08/02(金) 22:37:31.58ID:8YStqjv0
ここでGoogleTestの質問をしてもよろしいでしょうか?
888デフォルトの名無しさん
2024/08/04(日) 12:54:37.69ID:jHE0rxct
質問なのですが派生とshared_ptr<T>を組み合わせたときに、
class Base {
 int m_x;
protected:    // Baseクラスのコンストラクタはprotected
  Base(int x) : m_x(x) { }
  virtual ~Base() { } // 仮想関数にしてもしなくても同じ下記現象
};
class Derived {
public:      // 派生クラスのコンストラクタはpublic
  Derived() : Base(10) { }
};

std::shared_ptr<Base> pBase(new Derived());
とやったら
error C2248: 'Base::~Base': protected メンバー (クラス 'Base' で宣言されている) にアクセスできません。
と言われるんだけどなんで?その判定要る??
889デフォルトの名無しさん
2024/08/04(日) 12:56:00.59ID:jHE0rxct
自己解決しますた
文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz
890デフォルトの名無しさん
2024/08/04(日) 14:08:27.06ID:dHG4OJIq
本当に解決したの?
それDerivedがBaseを継承していないよ?
891デフォルトの名無しさん
2024/08/04(日) 15:33:06.74ID:jHE0rxct
あっはい
class Base {
 int m_x;
protected:    // Baseクラスのコンストラクタはprotected
  Base(int x) : m_x(x) { }
pulic:       // Baseのデストラクタをpublicに修正 // (1)
  virtual ~Base() { }
};
class Derived : public Base {  // 誤記訂正 // (2)
public:      // 派生クラスのコンストラクタはpublic
  Derived() : Base(10) { }
};
std::shared_ptr<Base> pBase(new Derived());    // (3)

(1)で解決、(2)は誤記訂正
文句言われたのがBaseのコンストラクタだとすると(3)においてDerivedのインスタンスがshared_ptr<Base>に渡される時点で呼び出し済なので
892デフォルトの名無しさん
2024/08/04(日) 15:35:40.71ID:jHE0rxct
(3)でコンパイルエラーになるのは辻褄があわなくね?!と思った次第
文句言われたのがBaseのデストラクタだったからだいたい理解すた
(std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら
 呼べないという解釈でエラーにするのは当然な可能性
893デフォルトの名無しさん
2024/08/05(月) 09:26:19.70ID:SHyTm/CM
std::unordered_map<std::string, std::unique_ptr<int>> map があった時のmapの管理について
教えてください

この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
foo = std::move(map["hoge"]); としないといけない?
で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは
自分で消さないといけない? map.erase("hoo")とかで
894デフォルトの名無しさん
2024/08/05(月) 12:50:07.44ID:Gb5pye15
>>893
>この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
>foo = std::move(map["hoge"]); としないといけない?
「値を取り出す」をどういう意味で使っているかによる
単に中身を読むだけならmoveしなくても良い
895はちみつ餃子 ◆8X2XSCHEME
2024/08/05(月) 12:51:26.12ID:cmuXon6W
>>893
その考え方で正しい。
std::unique_ptr をムーブすると抜け殻のほうのオブジェクトは nullptr を指すようになることは保証されるが、
そのスマートポインタ自体が std::unordered_map から勝手に消えたりはしない。
消えて欲しいならそのための操作は必要。
896はちみつ餃子 ◆8X2XSCHEME
2024/08/05(月) 12:53:54.43ID:cmuXon6W
std::unique_ptr 自体はコピーできないがそれが指しているオブジェクトを読むだけなら出来るしコピーすることも出来る (コピーコンストラクタを削除していないなら) 。
897デフォルトの名無しさん
2024/08/06(火) 11:13:46.48ID:SBxTyrdX
Rust使おうず
898デフォルトの名無しさん
2024/08/06(火) 12:55:07.35ID:7fXoqzm8
いらね
899デフォルトの名無しさん
2024/08/12(月) 00:31:08.71ID:YAf3BhD8
標準講座C++―基礎からSTLを利用したプログラミングまで 新装版 ハーバート シルト著が気になったのですがこれで勉強したことある方いますか?
900はちみつ餃子 ◆8X2XSCHEME
2024/08/12(月) 01:07:19.65ID:CLy07uUA
>>899
読んだことは無いけど 2009 年発売ってのは微妙な部分かもと思う。
2011 年の言語仕様改定がインパクトの強い変更を含んでいて基本的な書き方の習慣に大きな変化があった。
そこらへんの事情が含まれない本だと現状にそぐわない。
901デフォルトの名無しさん
2024/08/12(月) 03:05:00.33ID:LOlm/bL8
weak_ptrが処理の途中で解放されてしまうのを防ぐために lock()を呼んでshared_ptrを
取得してから処理、というのがありますが、
lock()を呼んだ時点で既に解放されていることもあるわけですよね?

確かにlock()の戻り値をチェックして不正な呼び出し等を防げるのはありがたいのですが、
そもそもオブジェクトが既に解放されているのは残念といいますか。

lock()を呼んでからする処理の場所に来るまでに解放されないようにしたい、と思った場合、
どうしたらよいのでしょうか? もしかしてそもそもweak_ptrを使うな、ということになります?
902デフォルトの名無しさん
2024/08/12(月) 03:59:48.65ID:ArETDaeV
あいまいな言葉よりコード見せてみ
903デフォルトの名無しさん
2024/08/12(月) 08:49:28.44ID:+jMHtzbv
既に寿命が切れてる場合はlock() が無効な shared_ptr を返すのでそれで判定する
lock() を呼んだ後は戻り値の shared_ptr が寿命を伸ばすので問題ない

shared_ptrは「有効なshared_ptrが1つ以上ある間はオブジェクトの寿命が消えない」ものなので、lock() が返すshared_ptrを保持してる間は消えないよ
lockを「weak_ptrからshared_ptrへの昇格を試みる」ものと考えても良い

lockしたい箇所の時点で必ずオブジェクトが生きていて欲しいなら、それはweak_ptrでなくshared_ptrを使うべき
904デフォルトの名無しさん
2024/08/12(月) 10:20:21.64ID:Lq53CINI
>>899
2000年くらいにSTLはこれで勉強したよ
基本的なことは網羅されているが
C++の新しい仕様には対応してないので
別途学習すべし
いまもっと良い本があるかは分からない
C++の仕様は建て増しなので
この本に書かれていることは無意味ではない
905デフォルトの名無しさん
2024/08/12(月) 13:09:35.61ID:XQ/hRBSk
キメラ
906デフォルトの名無しさん
2024/08/12(月) 16:00:24.68ID:K9Aw1MHl
超初心者とは何なのか・・・
907デフォルトの名無しさん
2024/08/13(火) 01:12:06.02ID:sOEG0OlC
>>900>>904
返答ありがとうございます。
今同著者の別の本で勉強中ですが基本的なところでこれも買っとこうかな?って質問しました。
基本参考書として買ってみます。
基礎的なところ終わったら自分が作りたいプログラムに必要な現状の本でも買ってみます。
908デフォルトの名無しさん
2024/08/13(火) 01:32:59.16ID:sOEG0OlC
すいません。誰か下のコンパイルオプションわかる方いますか?
解いてた問題の解答にも文字化けするって書いてあったので文字化け対策のオプションなんかないかな?って思って調べたらこのオプションで解決できるって出てたので使ってた人の入力例そのままオプション挿入してみてちゃんと解決できたから気になって調べたんですがググっても出てこなくて入力例が次の行のやつです。
g++ test.cpp -finput-charset=CP932 -fexec-charset=CP932
-finput-charset
-fexec-charset
909デフォルトの名無しさん
2024/08/13(火) 02:09:15.07ID:sAvdrrrS
>>908
https://www.google.com/search?q=%22-finput-charset%22
910デフォルトの名無しさん
2024/08/13(火) 07:27:51.38ID:8FMmWnXe
ああなるほど、意図せずマイナス検索状態になってたから一件もヒットしなかったってことか
あるある
911デフォルトの名無しさん
2024/08/13(火) 08:43:34.22ID:6ajF2Nvb
>>899
シルトは有名

ロベールも有名だったけど、
C++11 に対応していないので古い

STL標準講座、1999年
ハーバート・シルト 著
επιστημη(エピステーメー) 監修

この本も古い。
確か、エピステーメーはC++ の標準化委員だっけ?

C++テンプレートテクニック―簡潔で再利用しやすいコードのためのC++活用術
επιστημη/高橋 晶【著】、2009

独習C++ 新版、2019/11
高橋 航平 (著), επιστημη(エピステーメー) (監修)
912デフォルトの名無しさん
2024/08/13(火) 12:38:43.84ID:sOEG0OlC
>>909>>910
ありがとうございます
てか、検索でそういうことあるんですね
913デフォルトの名無しさん
2024/08/13(火) 12:57:30.56ID:lcpgo4xV
>>903
了解です、どうもありがとうございます
>>902
一般的なことを知りたかっただけなので
914デフォルトの名無しさん
2024/08/14(水) 09:51:50.71ID:UePmitOB
変数名の付け方について教えてくだち
Objectの個数、とかは nobjs とか objcnt (類例: argc)とかは本に載っていてそれぞれ
 nobjs --- number of objects の短縮表記
 objcnt --- object count の短縮表記(名詞obuectが形容詞的活用
となって対応する同じ語順の英語表現がある気がするのですが
<limit.h> の INT_MAX、INT_MIN はmaxやminがなぜ後置?
何の短縮形?
minやmaxの後置と前置の使い分けとは一体……
915はちみつ餃子 ◆8X2XSCHEME
2024/08/14(水) 10:32:46.90ID:z6gmNdON
>>914
C は一貫した名付規約 (naming convention) を定めていないし、主要な処理系が持っていたものを追認する形で仕様に入ることもよくあるので起源ごとに名前の方式は異なる。
慣例はおおよそ踏襲されるのでもし新しい整数型が追加されたらそれの最大・最小値は同じような名前で表されると思うけれど全体を通したルールはない。
916デフォルトの名無しさん
2024/08/14(水) 11:43:42.69ID:gAudIBvM
MIN_LONG, MIN_SHORT, MIN_USHORT だとmin まで同じで探しにくい
INT_MAXだとINT_ まで打てばコード補完できるけど、逆の語順だとMAX_ まで打った際に各型の候補がズラーっと並ぶことになる
当時は高級なエディタは無いし、多分そんな意図で命名してないと思うけど 、便利と言えば便利

意味を考えるならそれは max of int でなく、intという空間におけるmaxという値 (言語によってはint.max と書くような値) と考えると良いと思う
917デフォルトの名無しさん
2024/08/14(水) 13:14:34.06ID:+mepCwPn
C++ならstd::numeric_limits使おうよ
918デフォルトの名無しさん
2024/08/14(水) 13:42:54.01ID:UePmitOB
>>915
>全体を通したルールはない。
えええええええ……
迷える子羊は一体どうしたら……orz

>>917
それはそうかもしれんが
std::numeric_limits<double>::min()ではなくてstd::numeric_limits<double>::lowest()なのがイマイチなカンジ
あと
while ((*p <= CHAR_MAX && isspace(*p)) {
  p++;
}
とかのときは<limits.h>のがお似合いに思える……
919デフォルトの名無しさん
2024/08/14(水) 13:49:52.66ID:NvgdlQi4
些細なことにこだわんな
複数人で開発してる以上そういう揺れはどうしても起こり得る
受け入れて先行け
920デフォルトの名無しさん
2024/08/14(水) 14:35:57.51ID:uvjb8yy0
object count, count number of object
integer maximum, maximum of integer
…同じじゃね?
921はちみつ餃子 ◆8X2XSCHEME
2024/08/14(水) 15:32:03.62ID:z6gmNdON
全体を通した名前の指針としてはマクロは大文字でそれ以外は小文字 (スネークケース) ってくらいかなぁ。
関数形式のマクロは小文字なのもあったりと例外はいくらかあるけども。
922デフォルトの名無しさん
2024/08/14(水) 21:18:49.93ID:uPunKI9P
今ってクラス名とか割とキャメルケースじゃないですか? DocumentWindowみたいな
一方でC++自体は小文字とアンダースコアで
でも意外とちぐはぐな感じはない。むしろ予約語、システム的なものは小文字で
ユーザー定義のものと分離されていていい感じ?
923はちみつ餃子 ◆8X2XSCHEME
2024/08/14(水) 22:08:58.60ID:z6gmNdON
>>922
C++ の大元の設計者である Stroustrup は言語の技術的な詳細 (文法上の役割?) を名前に埋め込むことを嫌がってる。
https://www.stroustrup.com/bs_faq2.html#Hungarian
クラスだから、ユーザ定義だからという区別を名前に入れるべきじゃないという考え方を取ってるわけ。

その一方で言語としての縛りは入れないという方針も著書に書いてある。
思うところはありつつも個々の場面は言語ユーザの判断にゆだねるってことだね。

C++ は C++ だけで完結するわけじゃなくて色んなシステムと接続することもあるからその都合に合わさないといけないこともあるだろうし。
たとえば Windows だと多くの API がキャメルケースなわけで。

私自身にはクラス名をキャメルケースにするのはちぐはぐに見えている。
でも出自が違うライブラリを組み合わせるならそういうこともしょうがないとも思ってる。
924デフォルトの名無しさん
2024/08/14(水) 22:31:40.03ID:gAudIBvM
クラスや変数名に異なる命名を敵用するといった考え方が出てきたのがおそらC++登場の後だから仕方ないという感じ
C++は他の言語ほどには統一されたルールはない

自分は個人的に以下のルールを採用してる
おそらくPythonやRustあたりのルールに近い
・型の名前 (クラス、構造体、enum) は PascalCase
・変数と関数名は lower_snake_case
・定数とマクロは UPPER_SNAKE_CASE
・クラスのメンバー変数は value_ のように末尾にアンダースコアを付ける
・構造体のメンバーはアンダースコアなし (変数と同じ)

上記もあくまで個人的な意見に過ぎないので、プロジェクトの方針があるならそれに合わせるのが良いと思う

あと基本的な命名ルールも言語によって変わるので、その言語内に慣習やルールがあるならそれも見ておくと良いと思う
例えばC#はメソッドを PascalCase にするなど、上記とは異なる慣習がある
925デフォルトの名無しさん
2024/08/14(水) 22:37:11.57ID:gAudIBvM
標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか)

自作型をこれに合わせるかは好みの域を出ない気がする
自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)
926デフォルトの名無しさん
2024/08/14(水) 22:37:12.21ID:gAudIBvM
標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか)

自作型をこれに合わせるかは好みの域を出ない気がする
自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)
927デフォルトの名無しさん
2024/08/18(日) 12:06:41.90ID:BK0va+Po
iostreamとか糞やん
928デフォルトの名無しさん
2024/08/23(金) 00:25:52.73ID:Vi8prHau
はちみつ先生の中の人ってエピステーメー氏じゃないですか。
929デフォルトの名無しさん
2024/08/23(金) 12:18:20.78ID:x07V73qD
そなの? 何で?
930デフォルトの名無しさん
2024/08/23(金) 23:55:05.93ID:Vi8prHau
エピ氏はかつて標準化委員だったそうです。はちみつ先生は、規格書が完全に頭に入ってる感じですから委員経験者と見ても違和感ない。
スレ民に委員がいるという話もあります。

あと前に「~じゃろ」ってレスを一度だけ見たのですが、それがエピ氏風に思えました。
931デフォルトの名無しさん
2024/08/24(土) 00:19:56.05ID:czb9YTjo
なるほどー
証拠としては足りないと思うけども矛盾はしない

はちみつ氏と対立する立場で議論したことがあるけども
エピ氏だとしたら感慨深い
STL標準講座で勉強した世代だし
932デフォルトの名無しさん
2024/08/25(日) 00:23:17.55ID:zZ+WMAII
>>928
私は個人的なことは書かないようにしているし書いている場合でも嘘を混ぜているのだけれどプロのプログラマではないのは本当だと断言する。
肯定も否定もしたくないんだけど変に誰かと混同されるとその人に迷惑がかかるかもしれないからはっきりさせておく。
私はプログラムなりプログラミングの解説なりで金を貰ったことは全くない素人で、名の知られた人物ではない。
アマチュアなりになんらかの分野で有名だったりもしない。

>>930
規格が頭に入ってるわけないでしょ。 毎回調べてる。
プログラムの設計の妥当性などについては議論を戦わせればよいと思うけど今ある規格がどうなってるかは規格を調べるしかない。
それなのに空想で議論するような馬鹿馬鹿しいことがちょくちょく起こってるから話を先に進めたくて規格を持ち出してるだけ。
933はちみつ餃子 ◆8X2XSCHEME
2024/08/25(日) 00:54:19.91ID:zZ+WMAII
名前が抜けてた。 >>932 は私ね。
JaneXeno で書き込めなくてウェブブラウザから書き込んだらミスった。
934デフォルトの名無しさん
2024/08/25(日) 18:28:51.25ID:uK1NQ0Uz
質問です。参考書に乗ってた例試してたんですが下のコードがどういう動作してるのかよくわかりません。実行したらif(argc !=2)のところのコメント表示しかされませんでした。
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
if(argc !=2) {
cout <<"使い方: WRITE <ファイル名>\n";
return 1;
}

ofstream out(argv[1]);

if(!out) {
cout <<"出力ファイルが開けません\n";
return 1;
}

char str[80];
cout << "文字列をディスクに書き込み、$で停止します\n";

do {
cout << ": ";
cin >> str;
out << str << endl;
}while(*str !='$');

out.close();
return 0;
}
935デフォルトの名無しさん
2024/08/25(日) 18:44:55.52ID:tzsbYjlF
>>934
https://www.google.com/search?q=main+argc
936デフォルトの名無しさん
2024/08/25(日) 23:27:35.25ID:uK1NQ0Uz
>>935
返信ありがとうございます。
mainのところがコマンドライン実行用のものだとわかったのですがif(argc !=2)だけが実行されて
char str[80]の一行下のコメントまで行かないで実行終わってるのでそこがどうなってるのかよくわかってません。
937934
2024/08/26(月) 00:51:12.62ID:Lf2Vflpz
参考書に載ってるからまさかと思ったんですが>>934のコードってif文のreturnで強制終了させられてるってことですよね?
ちょっと気になってif文のところコメントアウトして動かしてみたらdo while文のところまで動いてたからif(argc !=2)の説明文表示しておいてがreturn 1で返してmainのところが終了させてるのかというのであってますか?
しかも出力ファイル検出用のif文のところも絶対に入る形になっちゃってるみたいなので説明文はdo while文の入力で出力ファイル指定してね。みたいな文章ついているんですが例として出てるのに欠陥あるコードという認識でよろしいのでしょうか?
938934
2024/08/26(月) 01:02:13.28ID:Lf2Vflpz
自己解決しました。
今回の例って実行時に一緒に書き込みファイル名入力するだけだったのを気付いてなかっただけでした。
939デフォルトの名無しさん
2024/08/26(月) 09:03:23.80ID:Nzy9klFi
せっかく>>935がキーワードで検索してるのに「自己解決」かよ
940デフォルトの名無しさん
2024/08/26(月) 09:15:40.09ID:y+gYSKWx
超初心者スレでそんな回りくどい指摘で理解しろというほうが厳しいのでは
941デフォルトの名無しさん
2024/08/26(月) 09:42:05.98ID:B88aYAlq
>>934
「よくわかりません」というのは質問になっていません。
何がわからないのかが伝わるようにまとめてください。

結果からすると argc や argv がコマンドラインから渡されるものだということがわかっていなかったようですが、質問一般のやり方としては「こうなると理解している」「でも実際にはこうなった」という形にすると伝わりやすいと思います。
質問を整理する過程で答えが分かってしまうのもよくあることです。 (ラバーダック・デバッグ)

それと参考書を元にしている場合は参考書のタイトルを書くのが望ましいです。
もしその本を持っている人がいたら前後の文脈からより適切な回答をできますし、同じ疑問をもった人がウェブ検索でここにたどり着くことが出来るかもしれないからです。

と、超初心者スレらしく質問の仕方の基本を書いておきます。
942デフォルトの名無しさん
2024/08/26(月) 10:49:37.17ID:3+7ACU+U
!=2 よりも < 2 派は少数派?
943デフォルトの名無しさん
2024/08/26(月) 15:31:48.06ID:cZUTj8Xv
!=2のほうが安全よね
引数が2つ以上渡された場合、ユーザーが引数の意味を勘違いしている可能性があるので第1引数をファイル名として扱うのは危険かもしれない
944デフォルトの名無しさん
2024/08/26(月) 18:34:12.28ID:vEMD05Dv
まんこまんこー まんこまんこー まんこまんこー 君にまんこまんこー
945デフォルトの名無しさん
2024/08/26(月) 18:43:51.64ID:FhzwHLyM
萬恋次郎
よろずれんじろう
946デフォルトの名無しさん
2024/08/28(水) 10:09:54.84ID:W2AehnGr
一つや無しでも許容するかしないかの違い
947デフォルトの名無しさん
2024/10/29(火) 09:32:10.21ID:Pp2f7Vup
すみません、std::atomic<bool> m_added = false; というインスタンス変数がある
クラスで bool isAdded() { return m_added; } というメンバ関数を作ると
error: use of deleted function 'std::atomic<bool>::atomic(const std::atomic<bool>&)'
というエラーになってしまいます。なぜこんなことに?

ググると return m_added.load(); とすればよさげで、実際エラーにはならなくなりますが
これで合っていますでしょうか?
948デフォルトの名無しさん
2024/10/29(火) 10:21:38.62ID:G3xxa4mJ
>>947
それは std::atomic<bool> という型であって、bool型ではないから。
load()でboolに変換されているということだね。
949はちみつ餃子 ◆8X2XSCHEME
2024/10/29(火) 11:42:59.70ID:IsdOq2r9
>>947
インスタンス変数って何? 文脈から推測するとデータメンバのことかな?
だとするとこんな感じのことだと思って説明するよ。

class foo {
std::atomic<bool> m_added = false;
public:
bool isAdded() { return m_added; }
};

こういう書き方だと std::atomic<bool> m_added = false; はコピー初期化という扱いになる。
なのでコピーコンストラクタが必要だが std::atomic にはコピーコンストラクタが無いのでコピーコンストラクタがないという旨がエラーメッセージとして表示される。
解決方法としてはメンバ初期化子リストで初期化すればいい。 これなら直接初期化の扱いになる。

class foo {
std::atomic<bool> m_added;
public:
foo(void) : m_added(false) {}
bool isAdded() { return m_added.load(); }
};

C++17 以降だとコピー省略が保証される (かつコピーコンストラクタの存在を要求しない) 場面なので C++17 以降を使うのなら修正は必要ない。

std::atomic<T> には operator T() があるので std::atomic<bool> から bool へは変換できて、そのときの効果は std::atomic<bool>::load を呼び出すのと同じ。
暗黙に変換するのでこの部分は本来なら問題ないはず。
ここを修正してエラーが出なくなったというのは何か誤解してると思う。
950949
2024/10/29(火) 21:08:49.76ID:DeRlzLOn
すみません、色々勘違いやら説明不足やらあるようです。あと用語もいろいろと。
まず std::atomic<bool> m_added = false; という初期化ですが、
自分の環境はC++17(のはず)なので、これは大丈夫だったようです
951949
2024/10/29(火) 21:14:42.30ID:DeRlzLOn
で、本当の問題は、condition_variable::wait_for()の述語バージョンのコードでして
諸般の事情でネットから拾ってきたコードを一部変更して書きますと(たぶんインデントが
壊れますが、ご了承ください)

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <atomic>

std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> ready = false;

void wait_for_event() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait_for(lock, std::chrono::seconds(3), []{ return ready; });
std::cout << "Event occurred or timeout reached" << std::endl;
}

int main(void) {
std::thread worker(wait_for_event);
worker.join();
return 0;
}
952デフォルトの名無しさん
2024/10/29(火) 21:15:37.83ID:oxmgzCly
volatileが廃止されてatomicになったんだっけ?
953949
2024/10/29(火) 21:19:59.00ID:DeRlzLOn
この、述語部分のラムダ式で return ready; とするとコピーが発生するのでatomic的に
まずい(それをコピーコンストラクタをdeleteすることで実現している)、という理解です

で、ではどうしたらいいかという話に
954デフォルトの名無しさん
2024/10/29(火) 21:25:03.73ID:DeRlzLOn
うわ、名前の>>949は間違いです、>>947でした、ごめんなさい
955デフォルトの名無しさん
2024/10/29(火) 21:37:22.02ID:vJbaxs/e
述語の戻り値型にboolを明示的に指定すればおk
956はちみつ餃子 ◆8X2XSCHEME
2024/10/30(水) 07:03:45.19ID:o3z0lAnP
>>951
ラムダ式の返却値の型は省略すると return に与えた式から推論され、推論結果は参照にはならない。
つまり []{ return ready; } は []->std::atomic<bool>{ return ready; } と書いたのと同じということ。
これだと値を返すときにコピーが発生するのでコピーコンストラクタが必要 (だけど実際には無い) ということになってしまう。

解決方法としては load を呼ぶというのは妥当な方法のひとつだけど、
返却値として bool を明示する、つまり []->bool { return ready; } とするのでもよいし、
キャストを書いて [] { return static_cast<bool>(ready); } というようにするのでも良い。
見栄えからすると [] { return bool(ready); } のほうが綺麗かな?
957はちみつ餃子 ◆8X2XSCHEME
2024/10/30(水) 15:17:53.47ID:o3z0lAnP
色々と書いたけど、この場合について言えば変換に頼るよりは load を呼んだほうが意図が読み取りやすくて良いと思う。
958デフォルトの名無しさん
2024/10/30(水) 16:06:31.71ID:kddcnuFp
つーかこのコードだとreadyはatomicにする必要がない
959デフォルトの名無しさん
2024/11/03(日) 07:07:35.61ID:LyKtE2MZ
>>947です。皆さんどうもありがとうございました

>>958 確かにそこは
実際、元のコードでも (>>951はサンプルコードがベース)
他の部分は適宜mutexを使ってあり、atomicを使わなくてもいいような、あるいは逆に
mutexを使わずにatomicでいけるのかも、とか思ったりもしたのですが、
今回は最小限の変更で済ますことにしました
960デフォルトの名無しさん
2024/11/23(土) 23:49:52.60ID:thI1occS
std::anyを使っていて、type()の返す形によって処理を変えたいのですが、
今はこれを typeid(形) と比較するif-else文の繰り返しを書いています

ググったら、hash_code()を使えばswitch文で書けるというのがあったのですが... 書けます?
エラーでコンパイルできないんですが
error: call to non-'constexpr' function 'std::size_t std::type_info::hash_code() const'
961はちみつ餃子 ◆8X2XSCHEME
2024/11/24(日) 12:09:51.87ID:3DfWckE7
>>960
「使えば」というのはどう使うという状況を言ってる?
具体的なコードを出して。
962はちみつ餃子 ◆8X2XSCHEME
2024/11/24(日) 12:55:51.06ID:3DfWckE7
>>960
switch の case ラベルに hash_code を使うという意味なら不可能。
case ラベルは定数 (定数式) であることを要求していて std::type_info::hash_code は constexpr が付いていないので結果は定数にならない。

コンパイル時計算するなんらかのハッシュ関数を用意すれば一応はなんとかならんでもないが……。
余興の類であって普通のテクニックとは言い難い。

そもそも std::any が不格好な仕組みなので std::any を使う以上は不格好になることを受け入れないと仕方がないと思う。
9631
2024/12/14(土) 02:53:40.88ID:Bddn5MUb
なに?プログラムって。むつかしそうだなー
ぜんぜん知らないんだけど、ちょっとやってみたいなー

ってな人も、入れてあげてね。
そういうスレなんだから。
964デフォルトの名無しさん
2024/12/14(土) 14:30:51.75ID:TQJHLK8K
そうしたければお前がやるんだよ
他人に期待すんな
こっちは気が向いたら好きに回答するだけ
あと過度な自治厨は嫌われるからな
965デフォルトの名無しさん
2024/12/16(月) 20:29:27.83ID:lHJTCZF8
人がいないからって、
お題を完全に無視して自分勝手
寄ってこようかとする何も知らない人は、
怖くて寄り付けないよ
966デフォルトの名無しさん
2024/12/26(木) 15:20:00.18ID:Max/6hcg
独習でc++の勉強しているのですがそろそろ終わり見えて来たんで終わる前に次の参考書ほしいのですがどんなのがいいのでしょうか?
現在の作りたいソフトがチューナーボードを利用したチャンネルスキャンや復調前の搬送波の保存をwinやLinuxで使える規格で作ってみたいと思っています。最終的にはそこから番組表とか自動構築できるところまでやってタイムシフトできるようにしてみたいと思ってます。
967デフォルトの名無しさん
2024/12/26(木) 15:41:38.20ID:NWZL3CyL
基本わかったら作り始めたらいい
チューナーボードのsdkのマニュアル読め
最初は出来損ないでいいから完成させろ
968デフォルトの名無しさん
2024/12/26(木) 22:37:43.96ID:Bko97FmB
lower_bound x以上で最小
upper_bound xより上で最小
upper_bound - 1 x以下で最大
は記述がありましたが
lower_bound - 1をググってるのですが出てきません
多分x未満で最大だと思うのですがあってますか?
969デフォルトの名無しさん
2024/12/26(木) 23:19:55.33ID:/ipDVGme
+
970デフォルトの名無しさん
2024/12/26(木) 23:49:39.69ID:ijj1Fuin
>>968
サンプルコード書いて確かめなよ
971デフォルトの名無しさん
2024/12/27(金) 09:37:21.60ID:O2xssw1P
>>967
sdkのマニュアルとかないボードみたいなんでテレビ視聴用のテストソフトコード見ながら自分が欲しいもの書いてみます。

ところでvisual studio使ったことないのでわからないのですがこのソフトの書き方、読み方しっかり学べる本ってないでしょうか?今までテキストエディタで書いてg++でやってたからビルドとテストがあるぐらいしかわかりません。
972はちみつ餃子 ◆8X2XSCHEME
2024/12/27(金) 10:42:45.43ID:sDceJMaF
>>971
マイクロソフトのサイトを見ながら学習するのがよいと思う。
細かな部分はバージョンによっても変わるし、本を買ってもすぐ時代遅れになるから。

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

TOPへ TOPへ  

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


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

 ↓「0からの、超初心者C++相談室 」を見た人も見ています:
結婚相談所ってどうなん?行ったことあるやついる?
【ネ実】料金爆上げ!水道法改正で民営化決定!これからは一軒一戸、井戸の時代!
虐待死児童の実母のDV被害は18.9%、地域社会から孤立…厚労省専門委が初調査 [蚤の市★]
高知県「すまん、早明浦ダム先月から満タンやねん。貯水量確保するために毎秒600トンの放流開始するわ。下流の県は気ぃつけてなw」
【新型コロナ】愛知・岡崎で80代男性が死亡、死後の検査で判明 11日NYから帰国 県内144人目・死亡17人
【社会】ゴルスタ個人情報流出問題 運営会社スプリックスでは数年前から「みせしめ」存在 関係者に聞いた
必殺からくり人
【改】あなたの嫌いな人から連想する単語・特徴
この板の意味がわからん
千葉大から東大院
合気から派生する剣術
2016年からの軌跡
明日から無職なんだが
高専からの編入66th
安倍、国会から逃亡
昼寝から目覚めた
地獄からの絵スレ
明日からやる気出す
暇だから話そうよ
4月からの和田さこ
からあげセンター
女が社会に出て来たから
異世界から来たんだが
50歳からの孤独 5
作曲したから聴いてくれ
愛国から幸福ゆき
今からあぶり出しを行う
やっぱり女は40歳から2
だから何?って書き込み
特定派遣からの転職
蒲郡競艇は駅から近い?
端末変えたから確認
今からこれを食う
東京 これから豪雨
からあげの日記 Part91
18歳処女からのメール
26歳から大学へ進学
少額だから貸すよ
欅坂46から国民を守る党
VIPからき☆すた
暇だからお話しよ
朝から酒飲んでる
(´・ω・`) わからん……
四時だから4回だした。
○年後から来ました
岡田斗司夫から学ぶこと
NGTは新潟から出ていけ
悪役は日銀から財務省へ
酒の味が分からない
50歳からの孤独 25
きみたちから感じる
岡田有希子自殺から34年
60代から見る加藤純一
なんJから来ました
在日から国民を護る党
浮気ってどこから?
日本は狭いんだから
絵を描いてみたから見て
新参にはわからないこと
口の奥からドブの臭い
お米おいしいからさ
なんjから来たンゴ
今から同志社目指す
就職活動するべからず!
なんJからきたンゴ
灘、筑駒から一橋。
21:29:36 up 31 days, 22:33, 1 user, load average: 41.80, 68.67, 78.11

in 0.047163009643555 sec @0.047163009643555@0b7 on 021411