0からの、超初心者C++相談室
106 :デフォルトの名無しさん :2020/05/11(月) 03:00:46 ID:II69MMpE.net すいませんロベール持ってる人にお聞きしたいのですが 305ページの for (int i = 0, size = a.Size(); i < size; ++i) という文があるのですが このsizeというローカル変数は何処に定義されてるんでしょうか?
107 :デフォルトの名無しさん :2020/05/11(月) 05:46:42 ID:k4wInV7m.net >>106 “ロベール本”を持ってないので答えられない立場かも知れんけど…。 この size は「ここ」で定義されているんだと思うよ。 for の初期化式 int i = 0, size = a.Size(); で、 「int の i」と「int の size」という2つの変数を定義している。
108 :デフォルトの名無しさん :2020/05/11(月) 07:45:03.87 ID:II69MMpE.net >>107 forの中で2つ宣言できるんですね!そんな事も知りませんでした。 ありがとうございます。
109 :デフォルトの名無しさん :2020/05/11(月) 09:53:48 ID:MhpqGE2N.net 型が違うときは? for (long i = 0, int size = a.Size(); i < size; ++i)
110 :デフォルトの名無しさん :2020/05/11(月) 19:53:43.37 ID:8B6Lebzi.net C++17なら for (auto [i, size] = tuple(0L, a.Size()); i < size; ++i)
111 :デフォルトの名無しさん :2020/05/21(木) 23:33:00 ID:fIo5j0A9.net class DataStore { public: DataStore(int v) : mValue(v) {} bool operator==(const DataStore& rhs) const; private: int mValue; }; bool DataStore::operator==(const DataStore& rhs) const { return mValue == rhs.mValue; } int main() { DataStore ds1(10), ds2(10); if (ds1 == ds2) {} } というのがあるんですがoperatorに記述されてる仮引数はどっから実引数をコピーしてるのですか? 後演算子のオーバーロードに関して分かりやすく解説してるとこあれば教えていただけると嬉しいです
112 :デフォルトの名無しさん :2020/05/21(木) 23:57:47 ID:ut4Weg2U.net operatorも、ただの関数 if (ds1.operator==(ds2)) {}
113 :デフォルトの名無しさん :2020/05/22(金) 00:55:03.99 ID:H9gcgSgg.net const DataStore& rhsの実引数はds1ってことですか?
114 :デフォルトの名無しさん :2020/05/22(金) 06:44:02 ID:8neFOyTD.net この流れだと、仮パラメータ rhs にバインドされる実引数は ds2 でしょ。 クラスのメンバ関数として宣言された2項演算子の operator OP(rhs) は、 lhs OP rhs と書くと lhs.operator OP(rhs) が呼び出される。 …と書いても分かりにくいね。 具体的には ds1 == ds2 と ds1.operator==(ds2) が同じ意味、 ってのが >>112 の人の言ってること。
115 :デフォルトの名無しさん :2020/05/22(金) 09:23:45 ID:JweU/zGV.net 余談だけど左右の引数が const な比較演算子は非メンバ関数として実装した方が好ましい場合が多い。 (標準ライブラリでもだいたいそうなってる。)
116 :デフォルトの名無しさん :2020/05/22(金) 12:29:55.77 ID:6NFPH2hn.net constかどうかで決めるのはアホ
117 :デフォルトの名無しさん :2020/05/30(土) 06:36:15 ID:1Zwy+dfa.net なぜ文字から'0'を引くと数字を数値に変換できるのですか? char c='8' int a=c-'0' 理屈がよくわからないです。 よろしくお願いします
118 :デフォルトの名無しさん :2020/05/30(土) 07:25:50 ID:/FCD7s4m.net 順番に並んでいるから。
119 :デフォルトの名無しさん :2020/05/30(土) 07:33:59 ID:1Zwy+dfa.net 文字コードが順番に並んでるのは分かったのですが なぜ'0'引くとキャストせずにint型の変数に代入できるようになるかが分かりません よろしくお願いします
120 :デフォルトの名無しさん :2020/05/30(土) 07:57:34.41 ID:/LdiluDZ.net '0'を引かなくてもキャストせずにint型の変数に代入できるよ c/c++では文字は整数型に文字コードを入れて扱うんだよ
121 :デフォルトの名無しさん :2020/05/30(土) 08:07:04.11 ID:1Zwy+dfa.net 苦しんで覚えるC言語という本の255ページに ”数字を使うときには引き算で本来の数値を知ることも出来ます。 数字に持っ文字の番号が割り当てられており例えば'0'は48番に割り当てられてます。 数字から'0'の番号を引き算すれば数値に変換され計算に使用できます。” とあるんですが ”数字から'0'の番号を引き算すれば数値に変換され計算に使用できま”というのが意味わからないです
122 :デフォルトの名無しさん :2020/05/30(土) 08:27:53 ID:CZP1xQZw.net 文字が元々数値(文字コード)であることが理解できてないのでは ASCIIコード表でググってみれ
123 :デフォルトの名無しさん :2020/05/30(土) 10:03:05.95 ID:/LdiluDZ.net 2に3を足す時、 int a = 2; int b = 3; int c = a + b; とやるとc == 5になる int a = '2'; int b = '3'; int c = a + b; とやってもc == '5'にはならない 今やほぼASCIIだからc == 'e'になる int a = '2' - '0'; int b = '3' - '0'; int c = a + b; とやるとc == 5になる '0'から'9'まで連続していることはcの規格が強制してるから これが”数字から'0'の番号を引き算すれば数値に変換され計算に使用できます”の意味
124 :デフォルトの名無しさん :2020/05/30(土) 16:37:51 ID:A5Abb6S3.net char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型 // '0' ... '0'を表す文字コードの値(ASCIIでは48) char型 // c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) char型 int a = c - '0'; // char型の数値8 で int変数a を初期化・代入 一般にint変数にchar型の値を格納することは認められている。 思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」) という部分に引っ掛かってるんじゃなかろうか。
125 :124 :2020/05/30(土) 16:49:13.96 ID:A5Abb6S3.net すまん 124 は間違ってるみたい、忘れてくれ。 char c = '8'; // '8'を表す文字コードの値(ASCIIでは56) char型 // '0' ... '0'を表す文字コードの値(ASCIIでは48) char型 // c - '0' ... '8'を表す文字コードから'0'を表す文字コードを引いた値(==8) int型 int a = c - '0'; // 数値8 で int変数a を初期化・代入 思うに「'8' - '0' が 8 になる」('8'の文字コードでなく「タダの8」) という部分に引っ掛かってるんじゃなかろうか。 '8' - '0' は「char型の8」ではなく「int型の8」だね。(以下検証コード) std::cout << "sizeof('8') == " << sizeof('8') << '\n'; std::cout << "sizeof('8'-'0') == " << sizeof('8'-'0') << '\n';
126 :デフォルトの名無しさん :2020/05/30(土) 18:38:26.55 ID:1Zwy+dfa.net >>125 そういうことでしたか。 詳しく噛み砕いていただきありがとうございます。
127 :124 :2020/05/30(土) 19:18:59.52 ID:A5Abb6S3.net 型の検証はC++11なら直接的にできるね。 #include <typeinfo> ... std::cout << "'8' is " << typeid('8').name() << '\n'; std::cout << "'8'-'0' is " << typeid('8'-'0').name() << '\n'; 実装定義の型の名前を得られる。
128 :デフォルトの名無しさん :2020/06/05(金) 17:55:42 ID:8OoEw/S/.net なかなか、適当なスレを見付けるのが難しいわい C++ 且つ初心者だから、ここでいいのかな subroutine で、例えば、boolean と string のふたつの変数の値を return するには、やっぱり std::map を使うのが一番簡単でしょうかね?
129 :デフォルトの名無しさん :2020/06/05(金) 18:21:06 ID:Uv2w5eYU.net std::pair<>じゃないのか? https://ja.cppreference.com/w/cpp/utility/pair
130 :デフォルトの名無しさん :2020/06/05(金) 19:03:13.94 ID:8OoEw/S/.net うーん、なんとなくそうおもいます、ええ
131 :デフォルトの名無しさん :2020/06/05(金) 19:06:38.66 ID:8OoEw/S/.net あ、では、boolean, string, int の三つをreturn するには普通どうやるのが王道でしょうか?
132 :デフォルトの名無しさん :2020/06/05(金) 19:08:18.91 ID:8OoEw/S/.net 連投すまん。 std::tuple ですか。
133 :デフォルトの名無しさん :2020/06/05(金) 19:12:47.23 ID:Uv2w5eYU.net たぶんそうだとお芋ます、ええ。 あと、コンテナに突っ込みたいときにはstd::variantなんかも良く使います。 今回は関係なさそうですが。
134 :デフォルトの名無しさん :2020/06/21(日) 13:29:09 ID:hTPD8Gtd.net >>131 王道かどうかは知らんが、C++17以降なら auto func() { return std::make_tuple(a, b, c); } auto [f, s, n] = func(); っていう風にできるで
135 :デフォルトの名無しさん :2020/06/21(日) 16:38:41.93 ID:rRP2z2l8.net std::tie の方が好き
136 :デフォルトの名無しさん :2020/06/22(月) 16:40:35.96 ID:sjaABjGh.net C++でint[変数]というようなことが出来ないのはstack overflow防止のためなんでしょうか?
137 :はちみつ餃子 :2020/06/22(月) 16:50:40.23 ID:H8+bL0cM.net >>136 原則として型は大きさが決まっているもんなので、そうでないものがあるとややこしいんだわ。 (配列の大きさは型の一部。)
138 :デフォルトの名無しさん :2020/06/22(月) 20:24:27.49 ID:83jG8pXe.net Cの新しいのだと出来る
139 :はちみつ餃子 :2020/06/22(月) 22:04:26.97 ID:H8+bL0cM.net >>138 新しいの……? C99 で出来るようになったけど C11 以降ではオプショナル扱いなんだわ。 そして今年は 2020 年なんだわ。
140 :デフォルトの名無しさん :2020/06/22(月) 23:23:01.67 ID:rtw5aKlF.net Cは89/90が基本
141 :デフォルトの名無しさん :2020/06/23(火) 01:32:00.34 ID:UY2AjBBL.net 以下のコードは比較関数をSTLのlistに渡す為のものなのですが これを最新のVC++でコンパイルできるようにするにはどう書き直せばいいでしょうか? typedef SubType* LPSUBTYPE; template<> inline bool greater<LPSUBTYPE>::operator() (const LPSUBTYPE& pObj1, const LPSUBTYPE& pObj2) const { … }
142 :デフォルトの名無しさん :2020/06/23(火) 09:26:35 ID:RMSfHJVB.net >>141 エラーメッセージを読んで問題点を解決するように書き直すといいよ。 list に比較関数は渡せないと思うので前提が間違ってそうな気もする。
143 :デフォルトの名無しさん :2020/06/29(月) 08:08:09.53 ID:PYBXxpGI.net VC++についての質問になってしまうのですが、C#のようにソースファイルをリンクとして追加することは出来ないのでしょうか?
144 :デフォルトの名無しさん :2020/06/29(月) 18:23:34.98 ID:gWW+3u18.net C#と違って「既存の項目」で追加したものに関してはコピーされずに参照扱いだよ 作業フォルダ下以外のファイルをそうやって追加した場合は追加のインクルードディレクトリも設定しないとダメだけど
145 :デフォルトの名無しさん :2020/09/08(火) 02:57:29 ID:ZBc9FXfY.net 何で構造体のchar配列は直接値が代入できず strcpyを使う必要があるのでしょうか?
146 :デフォルトの名無しさん :2020/09/08(火) 03:20:04.77 ID:jacy6RM2.net できるよ struct A { int x; char b[4]; } a = {0, 1, 2, 3, 4};
147 :はちみつ餃子 :2020/09/08(火) 05:15:54.57 ID:QZgDAT7o.net >>146 それは代入ではなくて初期化
148 :デフォルトの名無しさん :2020/09/08(火) 05:56:11.78 ID:ZBc9FXfY.net typedef struct { char str[32]; }A; int main(}{ A a; a.str="aaa"; } これができないってことです 言葉足らずですいません
149 :デフォルトの名無しさん :2020/09/08(火) 08:44:00.12 ID:h4K4tlm9.net int main(void) { int arr[5]; arr = 3; } ができないのと同じ理由です
150 :デフォルトの名無しさん :2020/09/08(火) 09:53:15.41 ID:zoI9JNor.net かわいいw
151 :デフォルトの名無しさん :2020/09/08(火) 10:55:42 ID:0vfIbeP0.net ちょっと忘れたから、推測だけど、 a.str="aaa"; "aaa" を右辺で使うと、先頭要素のアドレスに変換されるとか? 例えば、4バイトのサイズで、10〜13 アドレスに存在する場合に、10が代入されるとか char str[32]; 一方、ここにはアドレスじゃなくて、aaa\0 という4バイトの実体を代入しないといけないとか
152 :デフォルトの名無しさん :2020/09/08(火) 11:16:05 ID:h4K4tlm9.net 意図してるだろうことを無理してやるなら str[0] = 'a'; str[1] = 'a'; str[2] = 'a'; str[3] = '\0'; でできる.そしてこれをするためにstrcopyがある
153 :デフォルトの名無しさん :2020/09/08(火) 15:36:44.61 ID:JkCXGknl.net >>148 型が違うし
154 :デフォルトの名無しさん :2020/09/08(火) 15:57:15.69 ID:SNM207t1.net 出来ない訳じゃないんだよな typedef struct { char b[4]; } A; int main(void) { A b = {1, 2, 3, 4}; A a; a = b; // ok a.b = b.b; // bad return 0; } 自分で for で配列要素代入すれば良い訳で 面倒だから memcpy や strcpy 使ってるだけ
155 :デフォルトの名無しさん :2020/09/08(火) 16:02:13.68 ID:JkCXGknl.net >何で構造体のchar配列は直接値が代入できず 構造体のchar配列だけじゃなくて ただのchar配列でもダメだろ 宣言と同時に代入してるときはたまたま出来るだけ int main() { char a[4] = "abc"; // OK char b[4]; b = "abc"; // BAD return 0; }
156 :デフォルトの名無しさん :2020/09/09(水) 20:41:42.30 ID:s+S5qxFe.net >char a[4] = "abc"; // OK これがおkなのは、cの言語仕様におけるほんの雀の涙猫の額ばかりの文字列サポート たまたま、ってw
157 :デフォルトの名無しさん :2020/09/09(水) 23:49:08.55 ID:N/YnHGom.net はじめたころは、こういうことにいちいちひっかかってたな… わかっちゃえば、慣れちゃえばどーってことないんだけど
158 :デフォルトの名無しさん :2020/09/10(木) 00:06:01.62 ID:Qspm/kAl.net 同じようでいて、初期化と代入では見た目の作用がことなることがあるね
159 :デフォルトの名無しさん :2020/09/10(木) 00:07:00.73 ID:Qspm/kAl.net 見た目「と」作用が
160 :デフォルトの名無しさん :2020/09/10(木) 15:36:27 ID:rLZBXCmM.net a も b も代入禁止だ
161 :デフォルトの名無しさん :2020/09/19(土) 09:19:26.77 ID:z/ngkL1p.net >>157 常に初心に返ることで新たにわかることもある
162 :デフォルトの名無しさん :2020/09/21(月) 06:30:22.99 ID:GP+Uv9qA.net C#ですいません usingとnamespace名前空間を使う意味について本で解説されてるんですが文字だけしか書かれてなくて イマイチ言ってる意味がわからないので 簡単なコードを用いてnamespaceを使う意味を教えて欲しいです
163 :デフォルトの名無しさん :2020/09/21(月) 10:35:12.49 ID:M8W5JifW.net 文字だけじゃないコード・・・
164 :デフォルトの名無しさん :2020/09/21(月) 11:38:59.68 ID:xNmUS8x8.net 寿限無名予防以外の目的?
165 :デフォルトの名無しさん :2020/09/21(月) 11:59:08.18 ID:IzAwgxqY.net >>162 C#よくわかってないけど こういうことが知りたいの? https://ideone.com/SP3uBF
166 :デフォルトの名無しさん :2020/09/21(月) 21:53:00.21 ID:GP+Uv9qA.net >>165 すいません、そういうことです。 usingについてはおかげさまで意味が分かりました。ありがとうございます。 namespace名前空間?と言うもののメリットと言葉の意味がいまいち分からないのですが、 どっからどの部分までが名前空間なのでしょうか
167 :デフォルトの名無しさん :2020/09/21(月) 23:03:56.25 ID:IzAwgxqY.net >>166 namespaceがなかったら たとえば自分でなにか作ってるときとか、そこには自作のメソッドの定義があるわけで さらに公開されてるライブラリを使いたくなって、いざそこに組み込んだとき、 自作のメソッドと同名のメソッド名がライブラリ内で定義されてたらコンパイルエラーが発生する (重複定義された場合はコンパイラからすればどちらを呼び出していいかわからない) みたいな事態が発生してしまう さっきの例だと同名のメソッド(Console.WriteLine)を定義してても System名前空間とMyNS名前空間で分けたからコンパイルが通る System.Console.WriteLine(s); // Console.WriteLineはSystemに属するもの MyNS.Console.WriteLine(s); // Console.WriteLineはMyNSに属するもの namespace Hoge { // {}内はHoge名前空間に属する }
168 :デフォルトの名無しさん :2020/09/22(火) 06:36:29.84 ID:ZtayyY2i.net 完全にC++の感覚でしか説明できんけど、 あるライブラリを開発する上で、そのライブラリ全体がnamespaceで囲われていると、 ライブラリ作者は大抵その名前空間内でコードを書くから、いちいち名前空間を指定する必要は無い さらに>>164 の言うように、名前空間がライブラリや機能を表しているから、その中のコードは短い命名に出来る ライブラリ利用者側からすると打鍵数は変わらない(か、下手すると増える)けど、その名前をよく使うソースコードなら、usingで取り込むことも出来るし、あまり使わないなら取り込まず毎回指定してもいい(その場合名前重複の心配もない) こういう取捨選択は、関数・クラス名に全部ライブラリ名や機能名のプレフィックスが付くような命名だと出来ないこと あと_privateみたいな名前空間に関数を書けば、ユーザーが触る必要の無い関数を隔離出来る(使用を禁止までは出来ないけど、補完の候補に出てこないのは便利
169 :デフォルトの名無しさん :2020/09/22(火) 13:09:23.63 ID:iGBGeTHm.net 名前空間を使うと検索性が最悪になる (別の名前空間の同一名称が引っ掛かりまくる) みんなどう対処しているんだろう
170 :デフォルトの名無しさん :2020/09/22(火) 17:08:47.15 ID:QYfnOwKH.net >>169 using namespaceするのが問題じゃない?
171 :デフォルトの名無しさん :2020/09/22(火) 17:49:49.66 ID:ZtayyY2i.net いやusingに限らず、例えば>>168 で言ったライブラリ作る側(名前空間内で作業する側)はいちいちhoge内なのにhoge::とか書かんでしょ 確かに検索で困ることはたまにある・・
172 :デフォルトの名無しさん :2020/09/22(火) 19:24:25.17 ID:Xh0fS725.net namespace で絞り込んで、識別名をハイライトして、あとは気合
173 :デフォルトの名無しさん :2020/10/20(火) 13:37:38.41 ID:Mso39Itu.net C++とVisual C++の違いについてです。 C++はプログラミング言語であり、 VC++は統合開発環境であるという説明があります。 でも私にはVC++がC++++のように見えます。 VC++はC++の文法に新たな流儀を付け加えるか置き換えていて 言語そのものの使用を若干変えているように見えます。 C++のキーワードが別のものに置き換わっていたりするからです。 そのため、C++を勉強したあとにVC++を学ぶと違う言語を学んでいるように感じます。 この理解は正しいでしょうか。
174 :デフォルトの名無しさん :2020/10/20(火) 13:38:19.99 ID:Mso39Itu.net 使用改め仕様
175 :デフォルトの名無しさん :2020/10/20(火) 14:39:40.58 ID:C+6cO9mm.net 多少違うのは #pragma くらいだろ 勝手に仕様なんて変えない 統合環境とか API とかはもちろん関係無い話
176 :デフォルトの名無しさん :2020/10/20(火) 20:36:08.28 ID:3YoHPXFg.net IDEはVisual Studio VC++はMSのC++商品名 C++/CLIとかを混同してね? これはC++を独自拡張したものだよ
177 :デフォルトの名無しさん :2020/10/20(火) 22:21:46.71 ID:qSDH25Or.net __declspec(dllimport)とかアホみたいに書かされたあの時代のmsvc拡張c++のことでしょ
178 :デフォルトの名無しさん :2020/10/21(水) 11:12:14.17 ID:xBgAWF1Y.net 描かずに済むけどな
179 :デフォルトの名無しさん :2020/10/21(水) 13:51:50.76 ID:WStrtR1y.net C++/CLIは拡張ですか? いくつかの流儀を置き換えていますよね? ポインタをハンドルと読んだり?
180 :デフォルトの名無しさん :2020/10/21(水) 14:12:49.21 ID:xLl2qqDk.net MS拡張にしろC++/CLIにしろ既存のコードの挙動を変えるようなことはしてないんでは? 拡張でいいんじゃね
181 :デフォルトの名無しさん :2020/10/21(水) 18:58:32.20 ID:VaRlK94m.net ポインタはポインタとしか言わんよ ハンドルは
182 :デフォルトの名無しさん :2020/11/24(火) 23:02:59.67 ID:uO0ONWsd.net Visual Studio 2019をインストールしました Windowsスタートボタン→Visual Studio 2019を起動しました プロジェクト名を入れて下さい→test001 保存フォルダの場所を決めて下さい→Y:\_source\repos 何かのウインドウが開きました(おそらく開発の統合画面?) さっそく1行目から入力しようとしましたが、キー入力を受け付けてくれません 左の縦に、ツールボックスと表示しています このままでは進まないので、エクスプローラーでreposフォルダの下に samp01.txtを新しく作りました 何かのウインドウに戻り、samp01.txtを開くと文字入力が可能になりました 進め方が間違っているように思えますが、samp01.txtに#define...から 描き始めてよいでしょうか? 統合環境が苦手で、フォルダにテキストファイルを作りテキストエディタで ソースを書いて保存 コマンドラインでコンパイル、エラーがなければリンク...をしてきました 何かの画面には難しそうなソリューションエクスプローラー、その下には プロパティウインドウが表示されています。 このウインドウにも慣れないといけないので進め方を教えてください
183 :デフォルトの名無しさん :2020/11/25(水) 07:42:29.85 ID:+VuDDc3z.net >>182 とりあえずこれに従えばおk https://docs.microsoft.com/ja-jp/cpp/build/vscpp-step-1-create?view=msvc-160
184 :デフォルトの名無しさん :2020/11/25(水) 08:12:43.79 ID:1cagBqIs.net >>182 俺は、テキストエディタでソースを書いて、c規格で拡張子cppで保存して、 Visual Studioで、 コード無しで続行→ ファイル→開く→フォルダ で、コンパイルしてますがね。
185 :デフォルトの名無しさん :2020/11/27(金) 09:48:07.00 ID:sDMv6Edh.net >>182 ソリューションを作るときに大雑把にどんなもの作るって指定すれば 最低限のファイルができて編集可能な状態になるんじゃないの?
186 :デフォルトの名無しさん :2020/11/27(金) 15:09:19.88 ID:8PW9KReU.net ソリューションエクスプローラーのヘッダーファイル、ソースファイルのとこを右クリックで新規選べばまっさらなファイル作れるし メニューのファイル→追加?(うろ覚え)でも作れる
187 :デフォルトの名無しさん :2020/12/06(日) 23:34:56.54 ID:TL07p8cG.net 手順書のページのURLありがとうございます。 Microsoft Visual Studio Community 2019 Version 16.8.2を使用中。 テキストで#include<stdio.h>から入力しましたが煮詰まりました。ソースはネットを検索してコピペなので、 コロンやセミコロンの間違いはないと思われます。 #include<stdio.h> int main( void ) { printf( "ようこそC(++)言語の世界へ\n" ); return 0; } タスクバー?にファイル(F)編集(E)表示(V)Git(G)プロジェクト(P)デバッグ(D)テスト(S)・・・があります。 手順書では[プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。]とあります。 が、ビルドメニューがありません。 プルダウンのデバッグ(D)からデバッグ無しで開始したいですが デバッグ無しで開始が薄い文字になっており、クリックできません。 統合開発環境って皆さんが使用して使いやすいはずですよね。 何から順番にクリックしていくのかさっぱりわかりません。 手順通りにしようとして「ここをクリック」のところはたいていその「ここ」の項目が画面になくて ソースを書いてコンパイルすらできない、ありません。ありません状態。 同じバージョンでもメニューの項目が違っていたら次に何をするかお手上げです。 お助け下さい。
188 :蟻人間 :2020/12/06(日) 23:49:56.18 ID:x83Xfz/W.net >>187 ソリューションを作成した? ソリューションにソースを追加した?
189 :デフォルトの名無しさん :2020/12/07(月) 00:14:40.22 ID:MnyC2DM9.net アドバイスありがとうございます。 ソリューションエクスプローラー フォルダービューを右側に開いています そこにhello_.cppが表示されています。いま、開いているファイルです。 #includeからreturnまでペーストしています。 ソリューションエクスプローラーでhello_.cppを右クリックしますと[追加]があります。 [追加]->新しいファイル 新しい項目の追加(W) 新しいフォルダー この3つを表示します。ソリューションエクスプローラーにhello_.cppが表示されているだけでは不足でしょうか hello_.cppを右クリック新しいファイルを選ぶと名前を入力になりました aaaと入力するとツールボックスに新しくテキスト入力タブが表示 #includeからreturnまで貼り付けました デバッグ無しで開始の文字は薄いままです ビルドメニューはありません 編集や表示、Git、プロジェクトのメニューを色々クリックしています 変わりません… 何か、こんな不自由な統合開発環境を使うのは苦痛しか感じず、しかし 全世界のプログラマの人たちも使っているものですし、なんとか ビルドメニューを出したいです
190 :デフォルトの名無しさん :2020/12/07(月) 00:18:03.60 ID:MnyC2DM9.net あちこちクリックしていますと、画面の上に プロジェクト、ビルド、デバッグの文字が出てきました ビルド->ソリューションでコード分析を実行を選びます デバッグ->デバッグ無しで開始は薄い文字でクリックできません 何か手順が不足しているようです
191 :蟻人間 :2020/12/07(月) 00:18:08.82 ID:LcHpzYm6.net ファイルとフォルダの違い ソリューションの種類が違う だろうな
192 :デフォルトの名無しさん :2020/12/07(月) 00:59:54.04 ID:MnyC2DM9.net 不慣れでごめんなさい デバッグ無しで開始は薄い文字でクリックできず変わらず 本日はそろそろ寝ます 後は明日、使い方と用語を調べます
193 :蟻人間 :2020/12/07(月) 01:04:11.74 ID:LcHpzYm6.net 初心者は素直にチュートリアルの手順に従ってればいいんだよ。
194 :デフォルトの名無しさん :2020/12/09(水) 03:22:01.70 ID:WuZTb4kZ.net 濡れちゃうう!
195 :デフォルトの名無しさん :2020/12/12(土) 02:59:14.21 ID:a7AUwK+L.net なにからすればいいの 目標がない
196 :デフォルトの名無しさん :2020/12/12(土) 13:02:07.54 ID:A7m2fOl0.net 「何かしたい」というものが無いならば、しなくてどうぞ。 「何かしたい」というものが有る人は、自分で行動する。
197 :はちみつ餃子 :2020/12/12(土) 13:39:37.52 ID:UUApGKPR.net 質問サイトにある質問に (根拠になる一次資料 (主に仕様書の具体的な項目) と共に) 回答するのを繰り返せば 特定のプログラミング言語に詳しくなることは出来るよ。 それでプログラミングを出来るようになるかどうかはわからんけど。
198 :デフォルトの名無しさん :2020/12/12(土) 13:47:09.92 ID:k8hTa554.net 「人工知能搭載の人型アンドロイドが作りたい」 という目標を持つ者が 「printfで文字列を表示したい」 という目標を持つのはとてもつらい
199 :デフォルトの名無しさん :2020/12/12(土) 18:31:18.09 ID:KTyXxWQ0.net 今日は国会図書館に行ってきたわ。
200 :デフォルトの名無しさん :2020/12/12(土) 18:34:21.54 ID:KTyXxWQ0.net 国会図書館は国会議事堂内に分室があって資料を取り寄せて閲覧できるんですよ。 でも、ほとんど利用実績が無いらしいんですね。
201 :デフォルトの名無しさん :2020/12/12(土) 19:52:44.57 ID:KTyXxWQ0.net 国会図書館は若い女性と、男性は老人が多かったです。 土曜日だからかもしれません。 資料のコピーは長蛇の列が出来ていました。 あの列で感染するんでしょうね。 女性のメガネ率は8割超えてました。 おそらくドクター持ちでしょうね。
202 :デフォルトの名無しさん :2021/01/05(火) 14:54:55.04 ID:zOsm6XDhK 自由な働き方を求め10代〜20代の登録が拡大。フリーランス登録者約3.4倍に増加。https://prtimes.jp/main/html/rd/p/000000348.000010591.html フリーランス向け報酬即日払いサービス『先払い』申込件数5,000件突破https://prtimes.jp/main/html/rd/p/000000048.000047439.html ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始https://prtimes.jp/main/html/rd/p/000000035.000047639.html リース、フリーランスのためのお部屋探しアプリ「smeta」の正式版をリリース、提携賃貸管理戸数が6万戸を突破https://prtimes.jp/main/html/rd/p/000000032.000042693.html 家族50万円・単身30万円を支給、新潟県が「テレワーク・フリーランス移住」で応援金https://www.bcnretail.com/market/detail/20201225_205952.html ワーケーション会社員増加中、定額制宿泊サービス「HafH」を実体験https://finance.yahoo.co.jp/news/detail/20201231-00257105-diamond-column 「フリーランススタート」の掲載案件数、累計16万件を突破https://codezine.jp/article/detail/13393 フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、 掲載案件数1ヶ月で10,000件増加し、累計掲載案件数16万件突破!さらにリモートワークの掲載案件数5,000件突破!https://prtimes.jp/main/html/rd/p/000000012.000038976.html フリーランス向けの求人は「テレワーク可能」が主流に 2021年は労働者の地方への移住が進む?https://nlab.itmedia.co.jp/nl/articles/2012/25/news118.html
203 :デフォルトの名無しさん :2021/02/08(月) 19:09:45.85 ID:UEWD7mIf.net m1 macbookでc言語始めるのには何が必要ですか? c言語を始めるパッケージとかって売ってるんですか? それともフリーソフトでダウンロード出来るんですか? 学校ではコマンドを打つところから始めたので、導入に関しては全く解りません。
204 :デフォルトの名無しさん :2021/02/08(月) 19:14:35.93 ID:XD2vlsgg.net 0からのって感じ 良いねえ
205 :蟻人間 :2021/02/08(月) 19:31:11.55 ID:ifT1d8uh.net >>203 clang、gccなどのCコンパイラのインストールが必要。
206 :デフォルトの名無しさん :2021/02/08(月) 20:13:50.11 ID:UEWD7mIf.net >>205 レスどうもです gccほかググってみました @エディタで入力 Aコンパイラで2進数へ変換(ここでgcc使用) Bコマンドプロンプトで実行 これで合ってますか? 合ってるとすれば、エディタは何がいいんでしょうか?
207 :蟻人間 :2021/02/08(月) 20:21:45.01 ID:ifT1d8uh.net >>206 Macは異端児だし、自由陣営じゃないから、テキストエディタは自分で選んでね。検索するときは、必ずキーワード「Mac」を付けてね。 コマンドプロンプトはWindowsの場合なんだよな。
208 :デフォルトの名無しさん :2021/02/08(月) 20:44:41.11 ID:0fSH6U0R.net Linux なら、build-essential で、Ruby のRake でコンパイルする。 VSCode も使える mruby の本も出た Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11 宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。 Ubuntu 18.04, C99 対応 人工衛星イザナギ・イザナミで、使っている
209 :デフォルトの名無しさん :2021/02/08(月) 21:24:52.07 ID:mOpGK7eJ.net MacでもVSCode、gcc、terminalでええやんけ
210 :デフォルトの名無しさん :2021/02/08(月) 22:16:35.01 ID:UEWD7mIf.net >>209 ありがとー
211 :デフォルトの名無しさん :2021/02/08(月) 22:35:42.15 ID:UEWD7mIf.net 色々教えてもらってありがとう でもなんかrubyから始める方が良さそうなのでそうします
212 :デフォルトの名無しさん :2021/02/08(月) 22:48:15.05 ID:0fSH6U0R.net Mac で、Cをやる人なんているのか? たいてい、Linux だろ Macの機械語をもらっても、誰も動かせないw
213 :デフォルトの名無しさん :2021/02/08(月) 22:48:56.13 ID:YmxwiogA.net 一応Visual Studio Community for Mac 何てものもあるけどね MacユーザーじゃないのでWindowsと同じように使えるのかどうかは知らんけどw
214 :デフォルトの名無しさん :2021/02/08(月) 22:52:50.26 ID:ObgPii2R.net m1ではxcodeはだめなのかなあ
215 :デフォルトの名無しさん :2021/02/08(月) 23:04:19.24 ID:WYlwG+td.net 大昔のmacbookの話だがxcodeなる10GBくらいの開発環境を入れないとほとんど何も弄れなかった記憶 今のストレージ容量ならmacbookでも行けそう
216 :デフォルトの名無しさん :2021/02/08(月) 23:11:34.64 ID:WYlwG+td.net winは仮想環境も充実してるし色々コンパイラ試せるからいいよね ネイティブサポートもintel mklやVCで結局一番手厚いし
217 :デフォルトの名無しさん :2021/02/08(月) 23:18:46.61 ID:nKLqWVxG.net >>208 F-15はAda、F-35はC++で書かれてる。
218 :デフォルトの名無しさん :2021/02/08(月) 23:37:09.64 ID:0fSH6U0R.net Linux には、strace という神ツールもある
219 :デフォルトの名無しさん :2021/02/09(火) 00:44:38.89 ID:OoGqnNNo.net >>216 それでもApple環境だけはきついのよなぁ 噂通りiPadにxcode載せてくれれば、俺的に余計な出費なしに楽しめたのに (もちろんiPad自体で開発する気はない)
220 :デフォルトの名無しさん :2021/02/09(火) 09:28:59.64 ID:aKFUc8iT.net >>214 普通に使えるはず VSとか勧めるくらいなら(IDE勧めるなら)macにはxcodeのが正しい
221 :デフォルトの名無しさん :2021/02/09(火) 12:16:11.15 ID:To5JxTyF.net macを選ぶこと自体が正しく無い
222 :デフォルトの名無しさん :2021/02/18(木) 19:54:34.90 ID:clnw43k0.net M1 macbook買ってruby でうっほっほーしてますわ
223 :デフォルトの名無しさん :2021/02/18(木) 21:38:45.66 ID:sRdwF113.net 最近コード読まなきゃならん機会増えてきて教養として読めるようにはなりたい 規格に沿ってなくても勉強にいい感じのインタプリタってないかな?
224 :デフォルトの名無しさん :2021/02/18(木) 21:59:26.94 ID:UlBwu06v.net プロになりたい香具師は、YouTube で有名な雑食系エンジニア・KENTA のサロンに入って、 16〜32GB メモリのMac で、Ruby on Rails でポートフォリオを作る もっと、すごい人は、Windows 10, WSL2, Docker, Ubuntu, mruby で、 C99/Ruby 併用で、人工衛星など宇宙開発してるw mrubyの本も出たし
225 :デフォルトの名無しさん :2021/02/19(金) 15:37:54.68 ID:LoU7pdW5.net 猛烈にNG率高いレス
226 :デフォルトの名無しさん :2021/02/20(土) 03:42:06.46 ID:1WE5qKPk.net みんなRubyとかCでなにしてるの
227 :デフォルトの名無しさん :2021/05/17(月) 11:52:26.06 ID:094+MbId.net srand((unsigned)time(0UL)); int r=rand()%100-1; ってコードがあるのですが返ってくる値がランダムじゃなくて規則性があってモヤモヤしてます 参考書によるとsrandの文が起動時に別の値に毎回変えるための文らしいんだけど 返される値が8,18,28,28,38,48.......と10ずつ繰り上がっていってランダムになってません 何を追加すれば規則性が消えるでしょうか?
228 :デフォルトの名無しさん :2021/05/17(月) 12:50:25.63 ID:ZeUb3kXE.net >>227 0 以上 99 以下 の乱数を取得したいなら、 int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 ); 0 以上 98 以下 の乱数を取得したいなら、 int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 99.0 );
229 :デフォルトの名無しさん :2021/05/17(月) 13:21:28.15 ID:giSQx4b2.net http://www.math.sci.hiroshima-u.ac.jp/m-mat/TEACH/ichimura-sho-koen.pdf http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/mt.html https://qiita.com/seekworser/items/54e2b4596e72e8b9f9ea
230 :デフォルトの名無しさん :2021/05/17(月) 19:09:43.71 ID:lfAH/Fki.net >>227 これ使うのはダメ? https://cpprefjp.github.io/reference/random/mt19937.html
231 :デフォルトの名無しさん :2021/05/18(火) 02:31:27.98 ID:+SAIeHDc.net >>227 疑似乱数は一定の規則に従って生成されるんだから規則的なのは当たり前。 それがどのくらいわかり難いのかという程度問題に過ぎないし、 どういった系を選ぶのが適切なのかは用途次第。 そしてよくある失敗だがランダムシードに時刻を使うなら時刻から予測できる可能性がある。 rand がどういうアルゴリズムで乱数生成するのかは言語仕様では規定していないけれど、 (乱数がとりうる範囲や、同じシードからは同じ乱数列が得られるという性質は規定している。) 伝統的に線形合同法で実装されることが多くて、 パラメータの選定や用途によっては露骨に規則的に見えることもある。 C++ では >>230 の言う通りメルセンヌツイスタが標準ライブラリとして提供されているのだから それを使うのは妥当な解決方法である可能性は高い。 とはいえメルセンヌツイスタは簡単な物理シミュレーションなどにはおおよそ十分であるにしても 暗号用途には使い物にならないし速度はやや遅いので乱数が大量に必要な場合には 適切とは言えない。 かといって本物の乱数 (環境ノイズなどから生成される乱数) は再現性がないし、 これもまた遅すぎるので大量の乱数が必要な場合には向かない。 繰り返すけが乱数は用途に適しているかどうかであってあらゆる場面で万能な方法はない。 用途次第、状況次第。
232 :デフォルトの名無しさん :2021/05/18(火) 08:10:11.28 ID:ysWtxNVs.net 229にこれも組み合わせ https://cpprefjp.github.io/reference/random/uniform_int_distribution.html
233 :226 :2021/05/18(火) 22:58:17.77 ID:wt3ZqlEf.net 今C言語を学習してるのですがC++じゃないと完全ランダムは無理なのですね…。 RAND_MAXは関数なのでしょうか?Cだと使えなかったです。 教えてくださってありがとうございました。
234 :230 :2021/05/19(水) 00:18:20.95 ID:ONEwpJm5.net >>233 「完全なランダム」とは何か定義して。
235 :デフォルトの名無しさん :2021/05/19(水) 00:55:55.90 ID:g9DnnU6R.net せっかくなのでC++を勉強してみては?
236 :デフォルトの名無しさん :2021/05/19(水) 01:16:05.73 ID:OYngDuIu.net 何をやりたい目的があるから、何々を勉強するだと、速いですよ。
237 :はちみつ餃子 :2021/05/19(水) 01:17:09.90 ID:ONEwpJm5.net このスレは C++ スレだからな。 C++ は C との互換性のために残している機能はあるが C++ 的にあまり好ましくない場合もあるし、 完全な互換性が維持されているわけでもない。
238 :デフォルトの名無しさん :2021/05/19(水) 01:36:10.61 ID:OYngDuIu.net スレ建てといただす。 0からの、超初心者C言語相談室 https://mevius.5ch.net/test/read.cgi/tech/1621355654/
239 :デフォルトの名無しさん :2021/05/19(水) 01:52:35.92 ID:yT7tFlzp.net >>233 RAND_MAXは、古くから有るマクロ定数で、stdlib.h で例えば次のように定義されている: #define RAND_MAX 32767 説明によれば: 「rand関数が返す最大値。処理系によって異なるが、最低でも 32767以上である。」 rand()は偏りが強いには強いが、それでも 227 のように書けば 226 のように 下一桁がいつも8になるようなほどではない。
240 :デフォルトの名無しさん :2021/05/19(水) 01:54:51.13 ID:yT7tFlzp.net 少なくともrand() は、>>228 のように書けば、メルセデスツイストなどの 乱数を使わなくとも普通に使える。>>227 のように書くとダメなだけ。
241 :デフォルトの名無しさん :2021/05/19(水) 10:58:56.45 ID:G7N6xM6g.net 0から7の整数が均等確率で出る乱数をrとした場合、 x = r % 3; とすると、xは0〜2までの整数が出るが、均等確率ではない。 それはすべてのパターンを書いてみると分かる:(r,x)を書いてみると、 (0,0) (1,1) (2,2) (3,0) (4,1) (5,2) (6,0) (7,1) x= 0 となっているのは、3回。 x= 1 となっているのは、3回。 x= 2 となっているのは、2回。 なので、 P(x=0)=3/8 P(x=1)=3/8 P(x=2)=2/8=1/4 となり、x=2が出る確率だけが小さくなってしまう。 これと同様に、rが0〜32767を均等確率で出す乱数の場合、x=r % 100の値は0〜99までだが xが0〜99になる確率は均等ではない。
242 :デフォルトの名無しさん :2021/05/19(水) 12:10:26.94 ID:G7N6xM6g.net なので、もし、とても偏りの少ない乱数を用いたとしても >>227 では均等に 出現しない。 それを解決するには>>228 のようにすればよい。というか227が標準的なrand()の 使い方。 227 だともしrand()が均等確率で出ているならば、結果も均等に出現する。
243 :デフォルトの名無しさん :2021/05/19(水) 13:29:25.47 ID:G7N6xM6g.net ちなみに、rand()は、出力範囲内の整数を全て出力し終わってから元の値に 戻る様になっているので周期も RAND_MAX + 1 に等しく、出力値は 均等確率で生じる。 >>227 だと10で割った時の余りが必ず8になっておりそれは、出力が 10n + 8 になっているということ。これだと、今言った法則に当てはまって ないので矛盾し、何かがおかしい。
244 :デフォルトの名無しさん :2021/05/19(水) 15:03:30.63 ID:SQApMI36.net C言語でのサーバー構築のやり方わかる方いますか?
245 :デフォルトの名無しさん :2021/05/19(水) 15:05:53.17 ID:G7N6xM6g.net >>244 HTTP サーバーのことかな?
246 : :2021/05/19(水) 19:58:38.12 ID:Y2/6iGxL.net >>244 バークレーソケットをオープンしてリスンして、接続してきたのなら fork() だのスレッドで処理だの、というのを昔したことがありますが、すっかりわすれてしまいました… どんなサーバーが欲しいのですか?簡単なサーバーならご要望に応えてテキトーに書く準備はありますよ
247 :はちみつ餃子 :2021/05/19(水) 23:06:46.13 ID:ONEwpJm5.net >>242 それはよくある勘違い。 >>228 の方式では均等にならない。 櫛状にばらける。 0〜32767 の乱数から 0〜99 の乱数を得るには 32700 以上の値が出たときにそれを捨てて そうでない値のときに 100 の余りをとればいい。 少なくとも私の手元の環境にある std::uniform_int_distribution はそのように実装されている。
248 :デフォルトの名無しさん :2021/05/19(水) 23:56:26.10 ID:l+JWTKLH.net >>242 はアホと思ったけど、 こんな勘違いをするアホがよくいるって? そんなアホな
249 :デフォルトの名無しさん :2021/05/20(木) 00:27:22.67 ID:qlUu+R49.net >>247 uniform_real_distributionの時は?
250 :デフォルトの名無しさん :2021/05/20(木) 02:25:38.74 ID:Dz+v3/+O.net >>227 の結果は予想と外れていると思う。 rand()は均等確率のはずなのに、100で割って下一桁に9ばかり出るはずはない。
251 :デフォルトの名無しさん :2021/05/20(木) 02:28:22.34 ID:UJvm/t/I.net >>247 なるほど。言われてみればそうだわ。 32767はもともと100で割り切れないから、一部を捨ててやらないと 均等にはならないな。
252 :デフォルトの名無しさん :2021/05/20(木) 02:52:09.51 ID:onv6EMq1.net しかし、昔実験してみた限り、rand()の周期は、通常、RAND_MAX + 1 であり、rand()自体は均等確率のはずだ。 それはべつに、>>247 ではちみつが言っていることと矛盾するわけではない。 RAND_MAXが32767のように100で割り切れない値だから、>>228 のようにすると、端数の様な部分でわずかに均等確率からずれてしまう。 ただし、ずれる範囲は、32767/100 = 327.67 なので、確率にして 0.67/327 程度以下の小さなずれではあるが。
253 : :2021/05/20(木) 22:00:26.21 ID:+zMkmbAL.net >>247 剰余を取って特定範囲の乱数を生成することができるのは、元の乱数が MT 並に性質がよいときだけかと、つまり >>247 はちみつ氏のやりかたは、元の乱数が優れたものだからできる方法 MT が発明されるまでは、最悪の方法「線形合同法」でもなんとか我慢できる部分範囲の乱酔生成法しか推奨されなかった C FAQ をみてもそれがわかりますね http://www.kouno.jp/home/c_faq/c13.html#16 13.16: A:ある範囲の整数からなる乱数はどうやったら生成することができるか。 Q:すぐに思い付く、 rand() % N (これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜな ら乱数発生器の多くで下位のビットは悲惨なほどランダムでない。よりよい方法は以下のようなものである。 (int)((double)rand() / ((double)RAND_MAX + 1) * N)
254 :はちみつ餃子 :2021/05/20(木) 23:50:59.51 ID:qkpZwp6c.net >>253 乱数ソースの性質の悪い部分を分布関数で修正するのはレイヤの分離がきちんと出来ていない感じがして嫌だな。 下位ビットを捨てるなら捨てるでそれが明示的であるほうが好ましいと思う。
255 :デフォルトの名無しさん :2021/05/21(金) 00:17:02.51 ID:Q+lecBxK.net QZからはキムチの匂いがする
256 :デフォルトの名無しさん :2021/05/21(金) 10:19:44.69 ID:pMLUvwAV.net いずれにせよ >>227 は、まともな標準ライブラリで試すと 226 のような結果に はならないはず。理由: 226では、rand()%100の下一桁が常に9だが、それだとrand()は常に奇数という ことになるが、実際のrand()は全て奇数ということはないから。 現象的には、偶数と奇数が交互に来るという不具合が知られていたりするが、 全部奇数ということはない。
257 :デフォルトの名無しさん :2021/05/21(金) 10:27:54.72 ID:b4MjZLXj.net 超初心者スレであることを考えると >>227 の srand() がプログラム起動時一度だけとも限らないのでは。
258 :はちみつ餃子 :2021/05/21(金) 13:18:40.70 ID:JT5uzYpW.net Windows の (msvcrt の) rand は線形合同法だが下位バイトを豪快に捨ててる。 そのせいか (下位バイトを捨てない線形合同法よりは) 乱数としての質は多少良いが 初期値の違いに鈍感で、初期値が似ていれば最初の乱数も近いということが起こる。 >>257 の指摘は妥当かもしれない。
259 :デフォルトの名無しさん :2021/05/21(金) 17:16:26.14 ID:qriMwFf7.net >>257 つまり、rand()だけを繰り返しているのではなく、srand()とrand()の組を ひっくるめて繰り返しているようなことなのかな。 なるほど、それなら問題の焦点はsrand()と時刻の関係性になるので >>227 のような結果になったとしてもおかしくはないな。
260 :デフォルトの名無しさん :2021/05/21(金) 17:24:43.18 ID:qriMwFf7.net なるほど。 質問者は、だから>>228 でも快い返事をしてくれなかったのか。 彼は例えば、以下の様に書いていたようだね: (1) for ( int i = 0; i < 20; i++ ) { srand((unsigned)time(0UL)); int r=rand()%100-1; printf( "r=%d, ", r ); } 本来は、こう書くか、 (2) srand((unsigned)time(0UL)); for ( int i = 0; i < 20; i++ ) { int r=rand()%100-1; printf( "r=%d, ", r ); } こう書く: (3) srand((unsigned)time(0UL)); for ( int i = 0; i < 20; i++ ) { int r = (int) ( ((double)rand()) / ((double)RAND_MAX + 1.0)) * 100.0 ); printf( "r=%d, ", r ); } この中で(1)はダメ。(2)も余り良くない。(3)はplain Cでの簡単な書き方では 標準。しかし、わずかに均等確率からはズれる。
261 :デフォルトの名無しさん :2021/05/21(金) 18:35:20.74 ID:ojw3YA/u.net >>256 >>227 を見れば乱数になってないことは一目でわかると思うのだけど >>256 の時点で毎回srandを呼んでるのかとも思ったけど、 それにしても値が綺麗すぎる。
262 :デフォルトの名無しさん :2021/05/21(金) 19:25:04.91 ID:UZ6lwfzX.net Cはよくわからんのだけど(3)のやつわざわざdoubleにキャストする必要あるの?
263 :デフォルトの名無しさん :2021/05/21(金) 20:07:22.28 ID:ojw3YA/u.net RAND_MAX + 1 でオーバーフローするとか
264 :デフォルトの名無しさん :2021/05/21(金) 20:19:47.95 ID:UZ6lwfzX.net 最低でも32767以上だからINT_MAXのときもあるのか… ありがとうございます。
265 :デフォルトの名無しさん :2021/05/21(金) 20:22:18.98 ID:UZ6lwfzX.net と思ったけどRAND_MAX+1.0した時点でdoubleになるんじゃ?
266 :デフォルトの名無しさん :2021/05/21(金) 20:30:15.34 ID:ojw3YA/u.net >>265 なるけど 書かなくても動作が同じであれば書かない主義? カッコとかコメントとか 1.0 も 1. で良いんだよ まあそれ以前に (3) はカッコの対応がおかしいな
267 : :2021/05/21(金) 20:40:21.60 ID:XRGlJQOp.net >>254 確かに今となっては MT が開発されてしまったので、その感覚は理解できます しかし、我々は MT がなかった頃の好き古き時代についても考慮するべきでしょう、過去の方法を評価するのに、その当時の技術的制約を考慮せずに「今の価値観」で裁断するのはフェアではない、と私はつくづく考えているのです
268 : :2021/05/21(金) 20:47:24.81 ID:XRGlJQOp.net >>257-258 なるほど、従って >>227 に対する適切なアドバイスは次のとおりだと私は提案します >>227 MT = メルセンヌ・ツイスタを使いなさい srand() とか rand() は忘れなさい、これらは化石時代の乱数生成法だから、今となっては srand() とか rand() をあえて使う合理的理由は存在しません MT の導入方法や使い方は、次の私のソースを参考にしてください https://ideone.com/M2SRcE https://mevius.5ch.net/test/read.cgi/tech/1434079972/60
269 :デフォルトの名無しさん :2021/05/21(金) 21:29:08.32 ID:ojw3YA/u.net どう見ても乱数生成法の質の問題じゃない 使い方が間違ってる 乱数の質を求めるならハードウェアの乱数生成命令を使うのが一番だが >>227 はそういうレベルじゃない
270 :デフォルトの名無しさん :2021/05/21(金) 21:33:53.10 ID:ojw3YA/u.net Visual Studioで以下をやったら>>227 みたいな値になった 3秒ごとにsrand/rand をコールしてるんでしょう for (int i = 0; i < 100; i++) { srand(i*3); printf("%d\n", rand() % 100); }
271 : :2021/05/21(金) 23:18:48.19 ID:XRGlJQOp.net え? >>227 って srand() を複数回呼んでいるんですか?確かにそれは間違っていますね… srand() は普通、アプリ起動直後に一回だけ呼べば十分ですよ…
272 :デフォルトの名無しさん :2021/05/22(土) 02:03:33.66 ID:8I9NK3Yz.net >>270 洞察すれば、こんな風だろうか? (端末で確認しながら三秒間隔でEnterキーを押している) : for ( int i = 0; i < 20; i++ ) { srand((unsigned)time(0UL)); int r=rand()%100; printf( "r=%d\n", r ); getche(); // 3 秒間隔で人間が Enter キーを押す。 }
273 :デフォルトの名無しさん :2021/05/22(土) 02:04:35.75 ID:MF6mf+kw.net >>270 洞察すれば、こんな風だろうか? (端末で確認しながら三秒間隔でEnterキーを押している) : for ( int i = 0; i < 20; i++ ) { srand((unsigned)time(0UL)); int r=rand()%100; printf( "r=%d\n", r ); getche(); // 3 秒間隔で人間が Enter キーを押す。 }
274 :デフォルトの名無しさん :2021/06/02(水) 11:54:46.08 ID:QfG+Xq1u.net 書籍の意味が分からないので教えてほしいのですが それ以外のって部分から何を言ってるのか全く分かりません ”signed char a;である時は、aには−128〜127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。 最大値より大きい値になった時をオーバーフロー…略”
275 :デフォルトの名無しさん :2021/06/02(水) 12:23:21.09 ID:A2GTbdiP.net 何を教えてほしいのかわからない。
276 :デフォルトの名無しさん :2021/06/02(水) 12:37:39.80 ID:QfG+Xq1u.net >>275 ロベールの107ページの ”signed char a;である時は、aには−128〜127の数値しか入れられません。それ以外の数値を入れようとすると、普通は一番下の1バイト、つまり2進数での下8桁だけになり、上の方の桁は全て切り捨てられてしまいます。” ↑この文が意味不明なので簡単に教えてほしいです ”signed char a;である時は、aには−128〜127の数値しか入れられません” ここまではなんとなく理解できたのですが…
277 :蟻人間 :2021/06/02(水) 12:45:51.56 ID:1WJ2HfQ7.net >>276 そもそもビットとかバイトとかわかるの? わからないなら、基本情報から勉強しないといけない。
278 :デフォルトの名無しさん :2021/06/02(水) 12:56:19.74 ID:QfG+Xq1u.net >>277 この前のページに2進数 1ビット 1バイトなどの単位と各型のバイト数について触れられてるので そこは何となく理解できてるのですが
279 :蟻人間 :2021/06/02(水) 13:18:03.17 ID:1WJ2HfQ7.net >>278 1ビットは、2進数一桁で、ゼロかイチ。 2ビットは、2進数二桁で、00、01、10、11の2**2==4通り。これらは10進数で表すと0、1、2、3となる。 3ビットは、2進数3桁で、000、001、010、011、100、101、110、111の2**3==8通り。これらは10進数では、0、1、2、3、4、5、6、7となる。 …… 8ビットは、2進数8桁で2**8==256通り。10進では0〜255となる。現代では8ビットは1バイトに相当する。1バイトは16進二桁で表せる(2**8==16**2)。 以上は符号なしの場合。 符号付きの場合は最上位ビットがマイナス符号の有無を表し、正の場合は符号なしと同じで、負の場合は2の補数表現になる。
280 :蟻人間 :2021/06/02(水) 13:32:39.22 ID:1WJ2HfQ7.net 2の補数表現というのがくせ者だが、まあ、Wikipediaの説明を見てもらいたい。 https://ja.m.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0 符号付き8ビットの場合はx+y==2**8となるyがxの2の補数となる。補数を使えば足し算で引き算を表せる。 まあ、例えば10進数4桁1234の10の補数表現は8766となる。1234+8766==10000となるが有効4桁からオーバーフロー(桁あふれ)してゼロになる。8767の場合は1234+8767==10001、 オーバーフローしてイチになる。このようにオーバーフローを前提とすれば、大きな数で引き算を表せる。
281 :デフォルトの名無しさん :2021/06/02(水) 14:31:54.50 ID:CzhBAh+2.net お、優しい先生が現れたぞ。嘘ばかりの5ちゃんの中で珍しい。
282 :デフォルトの名無しさん :2021/06/02(水) 14:44:42.56 ID:QfG+Xq1u.net >>280 すいません詳しくありがとうございます 補数って概念全く理解してなかったので、それが原因だと分かりました。 コンピュータは足し算しかできないのですね… そこら辺知識固めてからもう一度読み直してみようと思います。
283 :蟻人間 :2021/06/02(水) 16:48:03.08 ID:1WJ2HfQ7.net 10進4桁の場合、9999に1を足すと10000、オーバーフローしてゼロになる。よって、このオーバーフローするシステムの場合、9999はマイナスイチを表していると考えることができる。 同様に9998は-2であり、9997は-3である。
284 :蟻人間 :2021/06/02(水) 16:54:31.73 ID:1WJ2HfQ7.net 符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。 規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。
285 :はちみつ餃子 :2021/06/02(水) 17:04:16.45 ID:Bcy6nIKX.net 一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、 (C++20 からは二の補数であることが保証されるようになった) 1バイトが8ビットであることも保証してない。 signed char に型変換したときに上位ビットを切り捨てることも保証されない。 (変換後の型が unsigned のときには実質的に保証される。) 言語仕様として保証しないからといって間違っているというわけではなくて、 一般的なコンピュータのアーキテクチャではおおよそそうなってるのが普通というのも事実。 C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢 をとれるように言語仕様の側では意図的に決めてない部分がある。 「C++ の説明」として見たら >>276 で引用されている説明はちょっと微妙かもしれん。 あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。
286 :デフォルトの名無しさん :2021/06/02(水) 23:13:21.37 ID:ZuDsQZsq.net float/doubleは
287 :デフォルトの名無しさん :2021/06/03(木) 02:59:14.77 ID:Ers5yK+g.net char は環境依存なので使わないようにする。 unsigned・signed のどちらなのか、分からないため unsigned char は、0〜256 signed char は、-128〜127 0〜127、7ビットの範囲では、この2つは共通している signed charは、先頭ビットが1なら、負数となる。 2の補数を調べて 1111_1111・0xFF なら、256か、-1
288 :286 :2021/06/03(木) 03:03:09.44 ID:Ers5yK+g.net >>287 修正 256 ではなく、255 です unsigned char は、0〜255 1111_1111・0xFF なら、255か、-1 だから、環境依存のchar 型を使っていると、 エラーに、-1を使っていたが、他の環境では255と表示されたりする
289 :デフォルトの名無しさん :2021/06/03(木) 10:13:20.76 ID:oKNqyVQK.net むしろ int を期待してる引数に char 渡す時が危険
290 :はちみつ餃子 :2021/06/03(木) 13:38:18.86 ID:ivgy5ZU8.net char 同士なら符号の有無が違ってもビットパターンは維持された ままで型を読み替えることが期待できる (言語仕様として保証しているわけではない) けど、大きな型に変換するときは符号拡張が起こることがあるからだね。
291 :デフォルトの名無しさん :2021/06/05(土) 22:29:47.19 ID:UR0LV/yo.net ハーバートシルト『STL標準講座』翔泳社, 1999, p.156-157 のサンプルプログラムで、そのままだとコンパイルが通らないものがあるのですが、 適当にconstをつけていたらコンパイルできるようになりました しかし、理由がわかりません どなたかご教示いただけませんか? https://ideone.com/LGnjXo
292 :デフォルトの名無しさん :2021/06/06(日) 01:24:02.19 ID:Lz5dZs8J.net operator <<のとこでoがconst参照だから、そのoからはconstなメンバ関数しか呼べない。のでそれで合ってる 元のソースが間違ってるか何かだと思う、この仕様は最初からのはずなので
293 : :2021/06/06(日) 01:44:38.27 ID:xlnMgrm3.net >>291 set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。 だから set<>::iterator p; …@、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。 例えば@の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。 もともと const 属性はポインタにつけて、const 属性のついたポインタに -> 演算子を使って出来たメンバ変数の値を変更しないようにコンパイル時に厳密にチェックする縛りです c++ における参照は「機械的にポインタを使った書き方に書き直すこと」が可能(…A※)ですから、const なイテレータ(≒ポインタ)から生成した参照は const な参照にならざるを得ないのです ※Aは私の持論で、今回のお題でも参照をポインタに全部書き換えてやろうと試行錯誤していましたが、さすがに iostream や set で先に参照として宣言されているものを後からポインタにするのは不可能でした 頑張ってみたけれども、かえって意味不明な https://ideone.com/Yc0YvT ぐらいにしかならなかった、持論は修正しなくてはいけないなあ… set は重複要素を許さない二分木構造です。二分木構造 set に要素を挿入するときに、要素の大小関係にしたがって二分木の形をくみ上げていきます。 だからすでに二分木に組み込まれてしまった要素が、後からほいほいと要素の内容を変えられてしまっては二分木構造に矛盾をきたし、役に立たなくなってしまう… だから set にすでに組み込まれている要素をイテレータで走査するときは、そのイテレータ≒ポインタは、メンバの書き換えが不可能なイテレータとするしかないか、と私は考えます 提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。 https://ideone.com/Zr1qIH friend 略 operator<<(略 C const &obj) { ... } にならなくてはならないのは set<C>::iterator は set<C>::const_iterator と同じだからです friend bool operator<(C const &a, C const &b) は set への要素の挿入のときに使う比較関数ですが、比較作業以外に要素のメンバを変えるとか余計なことをさせないために、最初から const 参照で宣言するべきでしょうし、そうなっているみたいですね しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。 ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう 上記のお題をこの方針で書くとこうなります。 https://ideone.com/G42gUs いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください
294 : :2021/06/06(日) 01:58:54.60 ID:xlnMgrm3.net >>291 >>293 https://mevius.5ch.net/test/read.cgi/tech/1594615908/593 593 名前:◆QZaw55cn4c [] 投稿日:2021/03/14(日) 20:13:24.03 ID:uaeFGveg [3/6] >>590 >C++は未だ*や&、&&、で頭の中がグルグル回ってしまう これらの「記号」は習得に順序があります。 まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。 次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう 参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います && は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
295 : :2021/06/06(日) 02:07:24.75 ID:xlnMgrm3.net >>292 operator<<() のストリームじゃないほうの引数は、const 参照ではなくてもいいと思います 今回のは const 参照が要求されたのは、 set のイテレータだから https://ideone.com/j6CV0s
296 : :2021/06/06(日) 02:32:48.87 ID:xlnMgrm3.net >>293 ソースを貼り付けた一行目がミスっていましたね、修正します。 >しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。 >ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。 >そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう >上記のお題をこの方針で書くとこうなります。 https://ideone.com/Ivx0JY
297 :デフォルトの名無しさん :2021/06/06(日) 02:41:34.70 ID:Lz5dZs8J.net ああ、operator <<のconstも最初付いてなかったのか それならsetの仕様変更のせいだね というか昔のままの非constの方が良かったんだけどなぁ 比較演算子自分で書いてるような構造体だと順序変わらない場合もあるんだし・・正直押し付けがましい
298 : :2021/06/06(日) 03:22:16.34 ID:xlnMgrm3.net >>297 自分で一から書く分には const に一貫性を持たせて、結果、const が有用に働くように書いていけるかもしれない、とか思うのですが、 他の人の分を取り込むときは、最悪 const_cast を >>291 の言うように「適当にconst_cast をつけていたらコンパイルできるようになりました」とか私も言っているわけでして、私は >>291 を笑うことができません……
299 :デフォルトの名無しさん :2021/06/06(日) 08:29:50.46 ID:KyPgEn9X.net 一から書いている私ですが、 全てのフォルダ・ファイル・プログラムに一貫して *と何か名前を付けてプログラミングをしています。
300 :デフォルトの名無しさん :2021/06/06(日) 08:34:21.45 ID:8VTCuGWY.net QZ・・・・ C++をちゃんと理解できてないのに無理すんなw
301 : :2021/06/06(日) 09:27:07.17 ID:xlnMgrm3.net >>300 >C++をちゃんと理解できてないのに無理すんなw うん。すっごく認めます! でもちゃんと理解できていないからこそ、アウトプットもきちんと書くようにして定着させたい、というのもあるんですよ 「教えることは教わること」 >>291 に対する回答としての >>293 , >>295 に間違いはないですよね?
302 :デフォルトの名無しさん :2021/06/06(日) 09:44:11.48 ID:WkbXnMOk.net 意味分からん理屈だな ずっと前からC++分からないって言ってるよね? もしかして理解できる頭を持ってないのかな?
303 : :2021/06/06(日) 13:37:50.42 ID:xlnMgrm3.net >>302 自己申告なんて当てにしてはいけないのでは?
304 :デフォルトの名無しさん :2021/06/06(日) 15:27:30.95 ID:fMmzH2Jl.net 文面から必死な感じがヒシヒシと伝わってくるのに 皮肉も理解できないとはさすが厚顔無恥の代表格 誰も認めてくれないから自画自賛するしかないんですね
305 : :2021/06/06(日) 16:22:05.09 ID:xlnMgrm3.net >>304 え?必死?思いがけない反応ですね まあ >>291 の方が提示したソースはハーバードシルトにしては冗長だと思って無駄丁寧っぽく説明したほうがいいかと >>293 をワサワサ書きましたが、それが必死だとは… よく分かっている方 >>292 に対しては簡潔に私の意見 >>295 を送ってもう十分、仕様変更があったという情報 >>297 をいただいて感謝、というところでしょうか
306 :290 :2021/06/06(日) 22:29:30.82 ID:DvMt5hdj.net >>292 >>293 どうもありがとうございます constメンバ関数の理解が不十分だったようです constメンバ関数はメンバ変数を変更しないという理解だけで、 constオブジェクトはconstメンバ関数しか呼べないことへの 理解が足りなかっため私自身混乱していました ご説明いただいた内容を足掛かりに理解を深めたいと思います
307 :1 :2021/06/07(月) 07:01:58.64 ID:pWKPTo4/.net まぁ、いいじゃねぇか、プログラミングなんて何にも知らないってのスレだし。
308 :デフォルトの名無しさん :2021/06/07(月) 07:48:28.30 ID:c29T7zKX.net const char* const str[] は文字列アドレスを格納するポインタの配列って意味であってますか? const char* strは文字列を格納するポインタ? char str[] は文字配列? 一気に出てきてよくわからなくなって来たので間違えてたら教えて欲しいです。
309 :デフォルトの名無しさん :2021/06/07(月) 08:39:52.02 ID:xFpLHEPr.net >>308 だいたいあってる
310 :デフォルトの名無しさん :2021/06/07(月) 11:12:06.49 ID:BLDePS2Q.net ちゃんとメモリ確保してから使えよ
311 :デフォルトの名無しさん :2021/06/07(月) 22:09:28.76 ID:JY7FyEcf.net >>309 ありがとうございます。
312 :デフォルトの名無しさん :2021/06/08(火) 23:28:22.97 ID:kZSYpF+Y.net https://ideone.com/2fyV5M 103 と115で確保された動的配列のアドレスは別物なんでしょうか? コピーコンストラクタの動きがよくわからないです
313 :デフォルトの名無しさん :2021/06/09(水) 02:24:41.44 ID:ZtayyY2i.net 103のarrayはコピーされたものだから別物だよ てか初っ端から手直しが必要なソースを貼るのはやめろ
314 :デフォルトの名無しさん :2021/06/09(水) 02:39:16.49 ID:Ih94CWHU.net スレの主旨的に初心者が初歩的な質問をするのは別に構わんとは思うんだが、 入門書にでも書いてあるようなことはよく読んで勉強したほうがいいと思うぞ。 素人が1レスで答えるよりはちゃんと体系だった解説のほうがわかりやすいよ、常識的に考えて。
315 :デフォルトの名無しさん :2021/06/09(水) 04:24:03.76 ID:BGdtXEJj.net >>313 すいません、ヘッダーとかcpp分けてるのどうアップロードすればいいのか分からなかったです 後65行目にcopy(other.m_array, other.m_array + m_size, m_array);とあるのですが何をしてるのか分かりません 本には”第1引数以上第2引数未満のアドレスにあるデータを第3引数の指すアドレス以降にコピーする関数で…とあるのですが 具体的に何をしてる関数なのでしょうか?第2引数の足し算も何なのかよく分かりません。
316 :デフォルトの名無しさん :2021/06/09(水) 04:43:32.09 ID:ZtayyY2i.net https://ideone.com/EScxwq こうしたらそのままコンパイル通るやろ 自分のヘッダincludeしてるとこにヘッダの内容貼り付けるだけ https://cpprefjp.github.io/reference/algorithm/copy.html memcpyと似たようなもん(コピーの仕方は違うけど other.m_arrayの指すアドレスから+m_size分のアドレスまで(未満)をm_arrayの指すアドレスから同じく+m_size未満までコピーしとるだけ これで分からんならポインタの理解が出来てない 上記のとこだとイテレータとか出てるけどこの場合ポインタなので全部ポインタに読み替えていい
317 :デフォルトの名無しさん :2021/06/09(水) 04:53:28.23 ID:ZtayyY2i.net ちょっと誤解招きそうなので補足 m_sizeは個数なのでアドレス値ではないがintのm_size個分アドレスが加算される このへんは>>314 の言う通り入門書嫁
318 :デフォルトの名無しさん :2021/06/09(水) 14:16:25.82 ID:3Qpbsqp/.net cpp で socket を読み書きする stream 系の class ってありますか? boost にはあったと思いますが 標準のはあるんですか?無いですか?
319 :はちみつ餃子 :2021/06/09(水) 16:06:33.34 ID:Ih94CWHU.net >>318 標準には無い。 が、ソケットに stream のインターフェイスをかぶせることはそれほど難しくはない。
320 :デフォルトの名無しさん :2021/06/09(水) 22:30:15.61 ID:BwbEIJxn.net >>316 1引数から2引数で足したアドレスまでを第三引数にコピーしてるのですね やっと分かりました。ありがとうございます。 頭硬い人はロベール向いてないのかな…
321 :デフォルトの名無しさん :2021/06/09(水) 23:57:13.88 ID:ZtayyY2i.net それは良かった まぁ最初は理解に時間かかるもんだ
322 :デフォルトの名無しさん :2021/06/10(木) 10:45:51.80 ID:ZbfFyHii.net >>319 thx cpp の std にある関数で glibc の様な getpass ってありますか? 標準のは無いですか?
323 :はちみつ餃子 :2021/06/10(木) 14:24:18.43 ID:MOYAWABe.net >>322 無いよ。
324 :デフォルトの名無しさん :2021/06/11(金) 14:28:13.59 ID:tB3/M6ll.net FILE *fp = fopen() で取得した fp を使って stringstream としてアクセスすることは出来ますか?
325 :はちみつ餃子 :2021/06/11(金) 17:27:01.32 ID:DsaVPusD.net >>324 直接的に一発で FILE* に stream をかぶせる手軽な方法はないと思うけど、 std::basic_streambuf を継承して setbuf, overflow, sync などをオーバーライドしたクラスを作ればストリームバッファになる。 (普通は std::basic_filebuf も内部的にはそう実装されているはず。) それをストリームに結び付ければストリームに出来ることは何でもできるよ。 仕様を調べるのがすごくしんどいだろうけど、 実装は (細かいエラーチェックとかを抜きにすれば) 百行も要らないくらいの簡単なものでいけるんじゃないかな。
326 :デフォルトの名無しさん :2021/06/16(水) 00:59:39.17 ID:QFUk0bjY.net >>324 fstreamを使えば? #include <fstream> #include <sstream> … std::ifstream fs("hoge.txt"); std::stringstream ss; ss << fs.rdbuf(); fs.close(); それともfstream使えない特殊な環境?
327 :デフォルトの名無しさん :2021/06/16(水) 16:36:23.72 ID:uJQ6HHCX.net FILE *fp = fopen(...); std::ifstream fs(fp); 出来たらいいな
328 :デフォルトの名無しさん :2021/06/17(木) 21:31:03.90 ID:OB6uOiq6.net 関数へ渡す引数の型を限定したいときどう書くのが一般的ですか? 具体的に言うと符号なしのintだけ受けつけたいんですけど
329 :はちみつ餃子 :2021/06/17(木) 23:54:09.39 ID:Gi/wqrqm.net >>328 暗黙の型変換を許さないということかな? それならテンプレートにした上で型に制約を付ければいい。 ここでは C++11 でも通るように書いてみたけど C++20 以降なら コンセプトが使えるのでもう少し簡単に書ける。 #include <type_traits> template<class T> typename std::enable_if<std::is_same<T, unsigned int>::value>::type foo(T) { } int main(void) { int a = 1; unsigned int b = 2; foo(a); // これはエラーになる foo(b); // これは通る }
330 :デフォルトの名無しさん :2021/06/18(金) 08:42:03.67 ID:kejK9s3z.net なんで戻り値voidに限定してんだよボケ餃子
331 :デフォルトの名無しさん :2021/06/18(金) 11:49:14.92 ID:AVf6Ht59.net 確かにそれで可能だけど、回答が超初心者スレのレベルを逸脱していると思うのですが
332 :はちみつ餃子 :2021/06/18(金) 18:30:00.74 ID:JA4mPV9U.net >>330 単なるサンプルだからだよ。 >>331 超初心者が相談するという主旨のスレではあるけど、 超初心者には理解できないという結果になることもあるだろうし、 可能であれば相談した結果として初心者から脱したらそれに越したことは無いでしょ。 これで相談がクローズってわけでもないから もっと深く知りたいってのならわからないところを続けて質問してもらってもいいわけで。 もっと簡単な方法があるならそれを提示するんだけども、なくなくなくない?
333 :デフォルトの名無しさん :2021/06/18(金) 19:23:19.39 ID:kejK9s3z.net >>332 アホか 普通のenable_ifの使い方と全く違うお前だけのオナニーコード押し付けて何がサンプルだ 何不必要な制限勝手につけてドヤってんだボケ
334 :はちみつ餃子 :2021/06/18(金) 19:32:07.35 ID:JA4mPV9U.net >>333 返却値 (または enabler) で制限するのは普通だろ。 むしろ他にどう使えるんだ?
335 :デフォルトの名無しさん :2021/06/18(金) 19:35:45.29 ID:kejK9s3z.net >>334 マジで言ってんのか? #include <type_traits> template <class T, typename std::enable_if<std::is_same<T, unsigned int>::value>::type* = nullptr> void foo(T) { } int main() { // foo((int)1); foo((unsigned int)1); } enablerってこれのことか知らんが、お前のコードだと戻り値voidにしか出来んだろってこと
336 :デフォルトの名無しさん :2021/06/18(金) 19:42:19.79 ID:kejK9s3z.net >>328 ちなコンセプト版(C++20対応コンパイラが必要) #include <type_traits> template <class T> concept UnsignedInt = std::is_same_v<T, unsigned int>; template <UnsignedInt T> void foo(T value) { } int main() { // foo((int)1); foo((unsigned int)1); } (インデントは全角なので注意) まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか
337 :デフォルトの名無しさん :2021/06/18(金) 19:43:08.40 ID:AVf6Ht59.net >>332 いや、お前の言いたいことは分かるよ ただテンプレートメタプロコードを超初心者にいきなり例示して、「わからないところを続けて質問」して回答を繰り返して、結果的に理解に至るのは何ヵ月後になるんですかと テンプレートに関する高度な質問が飛び交う中、ここは超初心者スレとして機能するんですかと この場合>>328 が求めているのはドリルじゃなくて穴だと思うよ俺は どういう背景があってunsigned int以外を受け付けたくないか、を聞くべきなのでは?
338 :デフォルトの名無しさん :2021/06/18(金) 19:57:29.32 ID:kejK9s3z.net 確かにそうだね というか自分もテンプレート以外思いつかんかった・・ >>334 なんか変な癖あるから標準的な使い方がすっぽ抜けてたのかね ボロカス言って悪かった
339 :デフォルトの名無しさん :2021/06/18(金) 20:01:53.90 ID:zIhiG+wy.net あんまり詳しくない俺にはこういうのしか思いつかん。 __my_func() は直接呼ばないお約束にしておいて、static_assert で。 template のところは、書き換えは雰囲気でできると思うけど・・・ #include <type_traits> #include <iostream> unsigned int __my_func(unsigned int a) { return a * 2; } template <class T> unsigned int my_func (T a) { static_assert(std::is_same<T, unsigned int>::value == true, "is not uint."); return __my_func(a); } int main() { int a = 2; unsigned int b = 2; //std::cout << my_func(1) << std::endl; // assert //std::cout << my_func(a) << std::endl; // assert std::cout << my_func(1U) << std::endl; std::cout << my_func(b) << std::endl; }
340 :はちみつ餃子 :2021/06/18(金) 20:30:53.23 ID:JA4mPV9U.net >>335 > お前のコードだと戻り値voidにしか出来んだろ なんか変なこといってると思ったらそこがすれ違いか。 std::enable_if のテンプレート引数の二個目を省略しなければ何にでも出来るよ。 (std::enable_if の type は void に固定されているわけではない。) クラスやコンストラクタは返却値がないから enabler を使うんであって、 普通の関数のときは返却値のほうで制御するのが普通だと思うぞ。
341 :はちみつ餃子 :2021/06/18(金) 20:33:26.89 ID:JA4mPV9U.net >>337 まあそうなったら他に誘導してもいいし、資料を提示するだけで十分だと思った。 ただ背景をもうちょっと引き出すべきというのも確かに必要なことではあったな。
342 :デフォルトの名無しさん :2021/06/18(金) 20:39:10.69 ID:kejK9s3z.net そうなんか、そういえばいつも自作alias使ってたから気付かんかったわ >普通の関数のときは返却値のほうで制御するのが普通 別に戻り値でも引数でもいいが、クッソ読みづらいと思うけどな あとそれならこういうスレで第2引数省略すんなよ、初心者惑わしたいのか?
343 :1 :2021/06/19(土) 15:34:05.42 ID:kvHrZ2tI.net ここは中級者が、お互いを煽り合うスレでは無い、ということを理解して欲しい。
344 :デフォルトの名無しさん :2021/06/19(土) 16:53:11.57 ID:zDrgWeBe.net 引数同じで戻り値だけ違う関数を造って使い訳たい
345 :デフォルトの名無しさん :2021/06/19(土) 17:01:53.54 ID:xVp2TfT/.net >>343 俺ははちみつが書くより先に同じこと(enable_if)思ってたけど、このスレには不適切だと思って書くのやめてたんだけどな あんな不適切で不親切な回答(テンプレートとSFINAEとか、はちみつも使いこなせてないようなものを使う上に戻り値の変更方法も、自身が言ってるコンセプト版も書かない)に怒っちゃいかんのか
346 :はちみつ餃子 :2021/06/19(土) 17:30:35.18 ID:/f53/cxR.net >>345 そこらへんが少しばかり詳細なら初心者に理解できる内容になるという主張? 少々の書き方の工夫で初心者がわかるように解説できるわけないだろ。 関連知識も含めればちょっとした本一冊分くらいにはなる内容なんだから。 「まずはテンプレートの知識が必要ですね」ということが初心者に対する解で、 そこに至る前にごちゃごちゃしたことを詰め込むのは不親切だと思うわ。
347 :デフォルトの名無しさん :2021/06/19(土) 17:34:51.32 ID:xVp2TfT/.net >>344 戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも template <typename T> T hoge(); template <> int hoge<int>() {} template <> float hoge<float>() {} hoge<int>(); hoge<float>(); もしくは int hoge(int) {} float hoge(float) {} ?hoge(int()); hoge(float());
348 :デフォルトの名無しさん :2021/06/19(土) 18:00:39.76 ID:kvHrZ2tI.net 1 + 1 = 1
349 :デフォルトの名無しさん :2021/08/24(火) 01:28:35.73 ID:WM1jAzNs.net https://pastebin.pl/view/e395f5ca operator関数の動きがよくわからないんですが tmp.x = x + p.x; これの p.xと xとtempはどのオブジェクトのことを指してるんでしょうか?
350 :はちみつ餃子 :2021/08/24(火) 01:50:15.06 ID:MkJE9y3A.net >>349 operator+ は演算子 + の実体として機能する。 故に p1+p2 は p1.operator+(p2) と書いた場合と完全に同じ。 tmp はもちろんこの関数内で宣言した tmp 変数だし、 p は渡された引数 (この場合は p2) のコピーなので p.x には 6 が入ってるね。
351 :デフォルトの名無しさん :2021/08/24(火) 02:43:37.56 ID:WM1jAzNs.net >>350 ありがとうございます。引数がどれに対応してるかわかりました。 p1.operator+(p2) これは何でしょう?
352 :デフォルトの名無しさん :2021/08/24(火) 03:37:20.26 ID:gGQMgsWd.net 掛け算の*と、 色々を示す*が 同じ*なんで困っていますが、どうしたらいいんでしょうか?
353 :デフォルトの名無しさん :2021/08/24(火) 03:55:09.38 ID:jikR3Y9f.net 色々ってワイルドカードのこと? C++においては*は乗算かポインタ関係だけだよ >>351 p1のメンバ関数として普通にoperator +を呼んでるだけ
354 :デフォルトの名無しさん :2021/08/24(火) 04:29:07.93 ID:gGQMgsWd.net ありがとうございます。 c++ のワイルドカード記号ってなんでしょうか?
355 :デフォルトの名無しさん :2021/08/24(火) 04:33:24.90 ID:jikR3Y9f.net 言語そのものには無いよー エディタやIDEで検索するのには使えることもあるが
356 :デフォルトの名無しさん :2021/08/24(火) 04:45:36.01 ID:gGQMgsWd.net 教えてもらって、勉強になりました。 ありがとうございました。
357 :デフォルトの名無しさん :2021/08/24(火) 07:22:03.54 ID:WM1jAzNs.net https://pastebin.pl/view/31e451ad クラスの型変換と型変換用のコンストラクタの意味が全く分からないのですが これをすると何が得なのでしょうか?10行目は普通のコンストラクタに見えますがなぜ変換用? 入門書に載ってるコードなのですがエラーで動作もせず何がなんだか分かりません…
358 :デフォルトの名無しさん :2021/08/24(火) 15:23:13.01 ID:jcrsR8Np.net 2つ目のprivateはpublicの間違いじゃね? あと変換は、単に引数一つだけを受け取るコンストラクタは 自動的に?暗黙のキャストにも使われる、というだけ(それを禁止する方法もあるが
359 :デフォルトの名無しさん :2021/08/25(水) 07:15:15.42 ID:dwOa++JV.net >>358 おかげさまで動きました。ありがとうございます。 でもいまいち型変換の意味が分からないのですが operator 型名()return 変数を定義するとどの変数にも代入出来るようになるってことですか?
360 :デフォルトの名無しさん :2021/08/25(水) 15:58:08.24 ID:3/bOIe3o.net C++ キャスト でぐぐるといいよ (キャストはCにもあるけど)
361 :はちみつ餃子 :2021/08/25(水) 22:29:05.16 ID:/Q8zinJC.net >>359 型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし て書いてもかまわないんだが、変換関数 (conversion function) または変換 コンストラクタ (converting constructor) が定義されていると暗黙の型変換 が適用される文脈では勝手に適用して変換してくれるので便利。 例えば以下のように foo 型のオブジェクトを受けとる文脈で bar 型のオブジェ クトを渡しても通るのは変換が適用されるから。 struct foo {}; struct bar { operator foo() { return foo(); } }; void func(foo) {} int main(void) { foo x = bar(); func(bar()); }
362 :デフォルトの名無しさん :2021/08/26(木) 01:12:00.54 ID:BlNdGFU0.net >>361 ようやくイメージできてきました。ありがとうございます!
363 :デフォルトの名無しさん :2021/08/26(木) 06:25:31.31 ID:C2TXXzWD.net >>361 そんな難しくせずに、 { change A to B } でいいんじゃないの?
364 :デフォルトの名無しさん :2021/08/26(木) 09:12:40.22 ID:QSgOZ0Rh.net なんのこっちゃ
365 :デフォルトの名無しさん :2021/08/27(金) 08:15:52.67 ID:ue9a70Za.net コマンドライン引数の意味が全く分からないのですが Visualstudioを使っているからでしょうか? それとも、コマンドプロンプトの使い方を理解できないでしょうか? https://programming.pc-note.net/c/commandline.html ここも参照にしたのですが何が得で何ができてるのかよく分かりません。 コマンドラインってVSでデバッグ無しで実行をした時に出る黒い画面ではないですよね? 質問ばかりですいませんが本当に何も分からないのでお願いします。
366 :デフォルトの名無しさん :2021/08/27(金) 11:14:47.31 ID:xylLBHc1.net >>365 メモ帳でファイルをドラッグアンドドロップで開く例が紹介されているが これはWindowsのShellであるExplorerがexefileに対して登録されているドラッグアンドドロップハンドラーを処理してドロップしたファイルのフルパスを文字列として起動するプロセス環境のコマンドラインパラメータとして渡している 黒い画面(コマンドプロンプト)にもExplorerとは違うがプロセスの起動とパラメータを渡す機能が実装されている 起動するexefileに続けてスペースを開けたあと記入した文字列がそのままパラメータとして渡される ファイル名以外にも自由に渡せるためプログラムの動作を指定したり変更する目的で使用される あなたが作成するプログラムでシェルから渡されたコマンドラインパラメータを確認する方法はそのページにもある通りだ コマンドラインパラメータを活用してバラ色の人生を満喫してくれ
367 :デフォルトの名無しさん :2021/08/27(金) 14:23:11.73 ID:8dQk5Ix1.net getopt
368 :デフォルトの名無しさん :2021/08/27(金) 23:33:15.78 ID:cMIVTei2.net 例えば、デスクトップにショートカットを作る。 コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する リンク先 C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb" 注意。書き込めないので、間に@を入れました 作業フォルダ C:\Users\Owner\Desktop a.rb 内には、puts ARGV (ARGV は配列で、そこにコマンドライン引数が渡ってくる) と書いておいて、ショートカットに、フォルダx・ファイルb.txt をdrag&drop すると、 コマンドプロンプトが起動して、以下のように表示される C:\Users\Owner\Desktop\x C:\Users\Owner\Desktop\b.txt
369 :デフォルトの名無しさん :2021/10/06(水) 22:36:41.57 ID:OG+j1FAK.net const char* const str[]={"aaa","bbb","ccc"} constの効果を教えてほしいです 後ろのstrの前のconstは付けると const str[0]="dddd"って出来なくなるのは分かったのですが 先頭のconstが分かりません
370 :デフォルトの名無しさん :2021/10/06(水) 22:51:34.11 ID:ItOX1MR6.net str[0][0]='d';
371 :デフォルトの名無しさん :2021/10/06(水) 22:53:20.88 ID:OG+j1FAK.net >>370 なるほど。 ありがとうございます。
372 :デフォルトの名無しさん :2021/10/09(土) 07:12:25.69 ID:JFpyaThm.net ロベールC++入門の代入演算子についてなのですが コピーコンストラクタのときは動的配列をdelete[]しなかったのに なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい 本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます 100行目です https://ideone.com/xL8UOn
373 :デフォルトの名無しさん :2021/10/09(土) 10:44:46.48 ID:tDH5FAwQ.net newしたメモリが不要になったらdeleteする これだけ コピーコンストラクタでのdelete、 いつnewしたデータに対して?
374 :デフォルトの名無しさん :2021/10/09(土) 17:51:02.84 ID:QAOoCtV/.net >>373 すいません、わからないです。 コピーコンストラクタはnewでアドレスを確保しないものなのですか?
375 :はちみつ餃子 :2021/10/09(土) 18:03:01.95 ID:Z56nk6n1.net >>374 ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、 それがわからんのならたぶんそれ以前の章を理解でてきないと思う。
376 :デフォルトの名無しさん :2021/10/09(土) 18:04:17.21 ID:jELfb/xT.net >>372 代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作 コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作 代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域 コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い
377 :デフォルトの名無しさん :2021/10/09(土) 20:35:07.35 ID:QAOoCtV/.net >>376 初期化と代入の知識が曖昧でした 分かった気がします。ありがとうございます。
378 :デフォルトの名無しさん :2021/10/10(日) 20:55:50.73 ID:6QW0WSDe.net AtCoderの初心者向けのC++の説明のページを読んでいます。 vector<int> a(10); aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。 これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?
379 :ハノン :2021/10/10(日) 21:05:41.56 ID:KKHdhYPj.net >>378 >a[i]よりもa.at(i)と書くほうが良い そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥
380 :デフォルトの名無しさん :2021/10/10(日) 21:07:18.12 ID:6QW0WSDe.net >>379 vector<int> a(10); b = a.at(10); などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。
381 :デフォルトの名無しさん :2021/10/10(日) 21:08:35.36 ID:6QW0WSDe.net 初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?
382 :デフォルトの名無しさん :2021/10/10(日) 21:31:47.25 ID:zWyM5YPA.net 範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?
383 :デフォルトの名無しさん :2021/10/10(日) 22:58:42.68 ID:gnqjARRQ.net 気分によるけどatが好きです
384 :デフォルトの名無しさん :2021/10/10(日) 23:07:44.84 ID:gmqGyDAJ.net vector配列を指すポインタを使ってる時に[i]で指定する書き方がよく分からないのでat(i)使ってる
385 :デフォルトの名無しさん :2021/10/10(日) 23:14:51.45 ID:U88jNIFg.net (*ポインタ)[i]
386 :はちみつ餃子 :2021/10/10(日) 23:15:56.24 ID:cCUvKLuJ.net >>378 これのことだね。 https://atcoder.jp/contests/apg4b/tasks/APG4b_n 例外処理やアサートの説明を省略しているせいでどう使い分けるべきものなのかがよくわからん説明になってる。 C++ はかなり複雑で、 AtCoder のサイトにある雑な説明だけでは細かいところまで理解はできないよ。 C++ の言語仕様の詳細を理解するのに手間取って競技を始められないくらいならそういう風に割り切れという意味で AtCoder としては at を推してるんであって、言語仕様やプログラマの習慣としてどちらかを推奨してたりはしない。 それぞれに用途がある。
387 :はちみつ餃子 :2021/10/11(月) 00:50:58.08 ID:kxIK5/L+.net 余談だが C++ の言語仕様としては推奨というのはないが非推奨というのはあって (結果的に同等のよりよい機能を推奨するのと同じことになっている場合はある) 将来の言語仕様の更新で廃止するつもりがあるということを意味する。
388 :デフォルトの名無しさん :2021/10/11(月) 02:00:14.70 ID:xizp5ONl.net ポインタ->operator[](i)
389 :デフォルトの名無しさん :2021/10/13(水) 01:04:04.91 ID:gvBCET4D.net Notepad++でcppファイルを選んで実行をすると Visualstudioが立ち上がるのですが どうすればNotepadで実行出来るのでしょうか?
390 :ハノン :2021/10/13(水) 02:24:33.63 ID:YMzdF2UZ.net >>389 コンパネ→既定のプログラム→ファイルの関連付け か 設定→アプリ→既定のアプリ→ファイルの種類ごとに あたりでなんとかならないでしょうか?
391 :デフォルトの名無しさん :2021/10/13(水) 03:03:01.45 ID:gvBCET4D.net >>390 回答ありがとうございます。 ファイルの関連付けをメモ帳とVisualstudioしか選べなかったです。(後Microsoftストア) Notepad++は初期設定結構大変な感じなんでしょうか? https://imgur.com/a/V3jOiV0
392 :ハノン :2021/10/13(水) 19:41:40.64 ID:YMzdF2UZ.net >>391 たしかに「設定→アプリ→既定のアプリ→ファイルの種類ごとに」 はうまくいかないですね では、 開きたい拡張子を持ったファイルを右クリック→プログラムから開く→別のプログラムを開く→その他のアプリ→このPCで別のアプリを探す ではどうですか? 私は win7 メインで、うまいアドバイスができなくてすみません‥‥
393 :デフォルトの名無しさん :2021/10/19(火) 08:20:19.87 ID:7/3R28mC.net C++でアプリを作る場合って、QTってやつかMFCって奴を勉強すればいいのでしょうか? C++でWIN32APIを学ぶっていうのはないですか?
394 :デフォルトの名無しさん :2021/10/19(火) 10:04:52.66 ID:emsejTNf.net ないです
395 :デフォルトの名無しさん :2021/10/19(火) 10:18:17.44 ID:vPA5f3eX.net あります
396 :デフォルトの名無しさん :2021/10/19(火) 11:51:03.31 ID:90qj1F6l.net メッセージループによるイベントドリブン型アプリケーション 「ウインドウ」と「メッセージ」というウインドウズの基本概念ぐらいは理解してもいい
397 :デフォルトの名無しさん :2021/10/19(火) 19:00:27.41 ID:C9DkQou5.net tcl/tk wxWidgets DXLib Unity
398 :ハノン :2021/10/19(火) 20:20:27.92 ID:KyySFZDA.net >>393 「C++でwin32api」ですか… そういうのは c で win32api を理解した後、各自が独力で工夫して c++ と win32api とを辻褄あわせするものだと思っていましたが、それはそうと、そういう書籍は過去にありました たしか leaf というライブラリと WOOL という lisp 処理系が掲載されていた記憶があります
399 :デフォルトの名無しさん :2021/10/19(火) 22:23:42.02 ID:P+gkhAFH.net MFC は何十年も前だけど、今もあるの? QT は、Linux で聞くけど、Windows で使うの?
400 :デフォルトの名無しさん :2021/10/20(水) 02:20:42.50 ID:+2OzLQ7p.net >>399 Qt5Core.dllで検索する色々出てくるから、win/macとマルチのアプリなんかで割と使われてみたいね。 手元だとfusion360とかresolveとかで使われてるっぽい。商用ライセンスあるからかな?
401 :デフォルトの名無しさん :2021/10/20(水) 11:06:18.19 ID:OEiI06HQ.net 5以前は良かったんだがな
402 :はちみつ餃子 :2021/10/20(水) 13:35:36.40 ID:dLyN/sz8.net >>393 MFC は API の利用をちょっと楽にする薄いラッパーという感じだな。 API のことを忘れて MFC の使い方だけ学べばよいというようなものではない。 >>398 今は C++/WinRT の時代だぞ。
403 :デフォルトの名無しさん :2021/10/20(水) 18:01:15.01 ID:oZqSjSwG.net >>398-402 WIN32やったことないんですが C++でアプリを作るときはWin32APIは避けては通れないのですか ありがとうございます…
404 :デフォルトの名無しさん :2021/10/20(水) 19:03:46.64 ID:CkfuGqw9.net 知っておいた方が良いけど 避ける方法もある
405 :デフォルトの名無しさん :2021/10/20(水) 19:36:43.86 ID:+2OzLQ7p.net >>403 いや自分で書いてるQtって奴や>397なら違う世界観を満喫できると思う。 2Dゲーム系ならSDL2あたりも。他にもメンテされてるライブラリあるけどSDL2で引けば出て来ると思う。
406 :ハノン :2021/10/20(水) 20:15:37.71 ID:I2cv7mAQ.net >>402 ええ? WinRT って .NET の世界のものかとおもっていました
407 :デフォルトの名無しさん :2021/10/20(水) 23:17:39.77 ID:vkb7a42p.net >>406 C++でも出来るよう
408 :はちみつ餃子 :2021/10/21(木) 00:38:03.74 ID:JAunV20A.net >>406 WinRT は Windows のモダンな API セットで、特定の言語に結びついたものではない。
409 :デフォルトの名無しさん :2021/11/05(金) 12:47:56.16 ID:dj6lZ6W1.net 無名クラスのメンバ関数の実装を宣言と別にすることって可能ですか struct { int func_hoge(int n); } myClass; (実装)?
410 :デフォルトの名無しさん :2021/11/07(日) 08:51:29.08 ID:+fO8/EKc.net std::vecotrのインスタンスを作ったとき、指定した要素数以上のメモリを確保しないようにはできますか??
411 :デフォルトの名無しさん :2021/11/07(日) 11:43:59.55 ID:cdTTDz5e.net 実装依存 普通は出来ない
412 :デフォルトの名無しさん :2021/11/09(火) 14:46:05.51 ID:t/ZCl1K7.net 普通でなく指定したバイト数以上のメモリを確保しようとしたら例外が上がる実装例 #include <iostream> #include <vector> #include <memory> using namespace std; #define MAX_SIZE 100 template <class T, class Alloc=allocator<T>> class SizeLimitedAllocator { public: typedef T value_type; T *allocate(size_t n) { if (n > MAX_SIZE) throw bad_alloc(); return allocator_traits<Alloc>::allocate(allocator_, n); } void deallocate(T *p, size_t n) { allocator_traits<Alloc>::deallocate(allocator_, p, n); } private: Alloc allocator_; }; int main() { vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE); try { vec.resize(MAX_SIZE+1); } catch (bad_alloc& e) { cerr << e.what() << endl; } return 0; }
413 :デフォルトの名無しさん :2021/11/25(木) 04:15:10.15 ID:0166A/na.net void *q = (void*)p; void *r = reinterpert_cast<void *>(p); void *s = static_cast<void *>(p); どっちが良い?
414 :はちみつ餃子 :2021/11/25(木) 04:51:08.49 ID:Mn8CZmYm.net >>413 static_cast で可能なものなら static_cast を使うのが行儀が良い。 Cスタイルのキャスト記法は適用範囲が広すぎて意図通りではない (危険な) 変換でもコンパイルが通るかもしれんということで 複数のキャストを用意しているので意図にあてまる限りなるべく狭い効果を持つキャストを用いるべき。
415 :デフォルトの名無しさん :2022/02/10(木) 15:34:30.67 ID:Ido/99Jv.net githubからcshogiというパッケージをインストールしようとしたところ ビルド中に src/mate.cpp:110:26: error: template parameter redefines default argument というエラーが発生しました。 実行コマンドは CPPFLAGS=-std=c++17 pip install git+https://github.com/TadaoYamaoka/cshogi としているのですが、あれこれ調べてもう打つ手がなくなりそうです。なにが悪いでしょうか。 macOS12.2付属のclangでビルドしています。(他の人は使っているので、文法などは問題ないはずだと思っています。)
416 :デフォルトの名無しさん :2022/02/10(木) 15:42:07.23 ID:J5PrGMnU.net そのエラーメッセージで検索すれば?
417 :デフォルトの名無しさん :2022/02/10(木) 15:46:35.62 ID:Ido/99Jv.net >>416 とっくにやってますわ!と言うところでしたが、stackoverflowでぴったりなのがありました。 https://stackoverflow.com/questions/14197436/c11-template-parameter-redefines-default-argument gccならよさそうですね。
418 :デフォルトの名無しさん :2022/03/15(火) 20:43:42.96 ID:+mlS0n0o.net test
419 :デフォルトの名無しさん :2022/03/15(火) 21:05:11.63 ID:q9dCXwxq.net Borland C++Builder 1が無料ダウンロードできるようですが Borland C++ Compiler 5.5 freeとは全く別物でしょうか?
420 :デフォルトの名無しさん :2022/03/17(木) 11:44:12.82 ID:Y2OAtTnf.net 1は大昔のを記念に無料DL可にしたやつじゃないかな 最新のやつもCommunity Editionていう無料版があるから、開発に使うならそっち あとBuilderはVisual Studioのような統合開発環境でコンパイラも含まれる
421 :デフォルトの名無しさん :2022/03/18(金) 12:32:15.10 ID:Fw15ZxLZ.net ロベール読んでるけど、途中からコードとファイルを端折りすぎてどこに書いてるのか理解出来ない
422 :デフォルトの名無しさん :2022/03/19(土) 14:31:38.38 ID:T81w77OE.net >>421 その本(サイト?)はあまり読んでないからわからないけど、こういう知識・技術系は複数の本やサイトを利用したほうがいいかも 基本はそのロベールで、曖昧な部分は他のテキストでみたいに まあ逆でもいいけど
423 :デフォルトの名無しさん :2022/03/21(月) 11:12:55.05 ID:Prmlj1K5.net 分割コンパイルの仕組みちゃんと理解しないまま雰囲気でヘッダインクルードしてるんですけど cppファイルに#pragma once書かないのってどうしてですか??
424 :デフォルトの名無しさん :2022/03/21(月) 11:22:20.21 ID:S8aTENmp.net >>423 書いても意味ないから。
425 :デフォルトの名無しさん :2022/03/21(月) 11:45:05.99 ID:TlR/Mg8q.net >>423 まあ普通一回使ったら足りるからだけど、 cppをincludeしてたら意味があるのかもな
426 :デフォルトの名無しさん :2022/04/07(木) 19:54:53.05 ID:ozPVuLqH.net cppってインクルード出来たんだ ヘッダーだけかと思った
427 :デフォルトの名無しさん :2022/04/11(月) 15:54:11.00 ID:LBY7PFnU.net 単にコピペしてくるだけだけだからなんでもいいぞ ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある
428 :デフォルトの名無しさん :2022/04/11(月) 19:50:08.66 ID:uaVZR/I2.net IDEだと、プロジェクトに.cppを含めるとコンパイル対象になるので.inlとかにしておくのが無難
429 :デフォルトの名無しさん :2022/04/30(土) 07:28:15.03 ID:2aZ7UOTr.net 前は中身がcppっぽいのはcppにしてたけど インクルード前提のファイルはhにするようにした #define ほにゃらら #include ファイル名.h ##undef ほにゃらら インクルードしても単体ソースとしても使えるヤツはcpp ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま
430 :デフォルトの名無しさん :2022/06/11(土) 20:56:47.72 ID:zBk/MBZO.net hpp
431 :デフォルトの名無しさん :2022/06/11(土) 21:01:36.29 ID:N4H8T0pQ.net h と hpp どっちにするかの話じゃなくて (h or hpp) にするか (c or cpp) にするか の話
432 :デフォルトの名無しさん :2022/06/11(土) 21:02:37.04 ID:N4H8T0pQ.net 初心者はトリッキーな使い方はしない方が良いから聞かなかった事にして
433 :デフォルトの名無しさん :2022/06/11(土) 21:20:49.53 ID:kM12Kkyp.net トリッカーズ。
434 :デフォルトの名無しさん :2022/06/12(日) 10:33:13.76 ID:cPTHwR7Q.net 三角形の秘密はね
435 :デフォルトの名無しさん :2022/06/12(日) 11:16:51.08 ID:v0rlTKHd.net おなかがすいたら
436 :デフォルトの名無しさん :2022/06/12(日) 19:40:55.19 ID:r44ApDPu.net ピーナッツ
437 :デフォルトの名無しさん :2022/06/23(木) 10:13:29.99 ID:06mLNX8U.net なんか、すごい達者さんが並んでますけど、 ここって、 「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」 というスレです。
438 :デフォルトの名無しさん :2022/06/23(木) 10:52:47.91 ID:M4XLJX6g.net 最初からでも0からでも構わんが 自分で努力しないやつはだめ
439 :デフォルトの名無しさん :2022/06/23(木) 11:07:51.97 ID:XRNmRbRA.net 俺は努力しなくてもできちゃうからなあ
440 :デフォルトの名無しさん :2022/06/23(木) 14:33:26.79 ID:06mLNX8U.net 掛け算の*と、「何ですか?」の*と一緒なんですが、 区別する方法を教えてください。
441 :デフォルトの名無しさん :2022/06/23(木) 19:37:03.84 ID:WbbET00J.net ポインターの事?
442 :デフォルトの名無しさん :2022/06/23(木) 19:47:14.20 ID:hToQs/iZ.net は?何ですか?
443 :デフォルトの名無しさん :2022/06/24(金) 10:44:51.77 ID:K2we1Lar.net オレオレ
444 :デフォルトの名無しさん :2022/06/24(金) 12:54:50.02 ID:fYiV2rYB.net そうだよオレだよ
445 :デフォルトの名無しさん :2022/07/16(土) 16:13:36.70 ID:2GuJXeRO.net >>440 掛け算の*は二項演算子 「何ですか?」の*は単項演算子 *の前に項があるかどうかで判断する
446 :デフォルトの名無しさん :2022/07/16(土) 17:44:38.20 ID:WOPsEo4E.net 数字の、xxxと、 数字の、AAAの掛け算は、 xxx*AAAで、いつも迷うんです・・・
447 :デフォルトの名無しさん :2022/07/16(土) 18:00:17.69 ID:QRg/sabr.net *a+++ ++*b で迷え
448 :デフォルトの名無しさん :2022/07/16(土) 18:01:53.10 ID:QRg/sabr.net +*a++*++*b これも
449 :デフォルトの名無しさん :2022/08/01(月) 07:12:02.16 ID:yd/7YIgU.net map よりも unordered_map の方が高速ですか? あと追加順が保障されないのが unordered_map ですか? map は何順ですか?
450 :デフォルトの名無しさん :2022/08/01(月) 13:52:12 ID:jhXgj6wH.net おまいは何を言っておるのだ?
451 :はちみつ餃子 :2022/08/01(月) 15:12:11.10 ID:YhL9Bhjt.net >>449 > map よりも unordered_map の方が高速ですか? 操作によるので一概には言えない。 一般的には unordered_map のほうが有利なことが多いとは言えるけれど。 > 追加順が保障されないのが unordered_map ですか? map でも unordered_map でも追加した順序は保持されない。 C++ に限らず辞書的なデータ構造では格納順序を保持しないのが普通で、 保証があるのは Ruby の Hash くらいだと思う。 Go や Rust だと辿る順序を乱数でかき乱す実装になっているくらいだし。 > map は何順ですか? キーの順序。 特に指示しなければデフォルトではキーを std::less で比較した順序。
452 :デフォルトの名無しさん :2022/08/05(金) 04:26:17.70 ID:ECXKpFJi.net そもそもmapの順序ってなんぞや そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど 腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ
453 :デフォルトの名無しさん :2022/08/16(火) 01:02:16.19 ID:pMrCsY/x.net vector<int*> xの特定の要素を削除したい場合 delete x[1]; してから x.erase(x.begin()+1); という手順であってますか? deleteしないとメモリリークしますよね?
454 :はちみつ餃子 :2022/08/16(火) 01:10:03.51 ID:+o+ePBjP.net >>453 それでいいよ。 でもスマートポインタを活用するとかの工夫はしたほうがいいね。
455 :デフォルトの名無しさん :2022/08/18(木) 11:36:39.99 ID:p/limWqp.net そもそも移動が大量に発生するのでそんな設計しない
456 :デフォルトの名無しさん :2022/10/14(金) 20:52:11.42 ID:IQ8pOIWW.net 4ビットだから符号無しなら0~15だろ コレを-8~7の符号付きにしたいということか?
457 :デフォルトの名無しさん :2022/10/15(土) 16:23:31.27 ID:B8kXjL18.net 普通に下駄履かせれば(引き算)
458 :デフォルトの名無しさん :2023/05/24(水) 23:52:31.95 ID:lCJuR93r.net いやー今日はめっちゃ勉強したわ 詳しくなった
459 :デフォルトの名無しさん :2023/06/04(日) 09:18:18.28 ID:5jvZ+YKl.net 誘導されて来ますた、 質問なのですがstd::stringに格納された数値文字列を数値にしたい、 しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす れば良いの? ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……
460 :はちみつ餃子 :2023/06/04(日) 09:22:50.76 ID:MHoxWKtY.net >>459 strtod で何が不満なの。 空白かどうかで区別が必要なら空白かどうか確認するしかしょうがないし、 ダサいもくそもないだろ。
461 :デフォルトの名無しさん :2023/06/04(日) 09:28:48.33 ID:5jvZ+YKl.net >>460 だって&(str[0])とかナマポやし…… 文字列型がchar以外になったら(std::basic_string<TCHAR>とか)になることも見越したら 手でテンプレート書かないといけないから牛刀感があるし、 文字列が厳格に数値文字列なのか検査するとかアプリのコードであるあるなので アプリレベル(高級アセンブラ的でない書き方)の手段が用意されていて然るべきな気がして仕方が無いし、
462 :デフォルトの名無しさん :2023/06/04(日) 09:30:18.23 ID:5jvZ+YKl.net 無いというなら仕方が無いが、漏れはちょう初心者ですら……
463 :はちみつ餃子 :2023/06/04(日) 09:37:21.42 ID:MHoxWKtY.net >>461 std::stod は std::string と std::wstring に対応してるよ。
464 :デフォルトの名無しさん :2023/06/04(日) 09:39:47.38 ID:5jvZ+YKl.net >>463 std::stod()は数値への変換が行われなかったとき例外をスローするが 後ろに余計なものが付いていたらスルーするんじゃ…… なお試したことはありま栓、
465 :はちみつ餃子 :2023/06/04(日) 09:52:59.20 ID:MHoxWKtY.net >>464 ??? それで何か困ることがあるという話なの? 要件が不明瞭でよくわからん。
466 :デフォルトの名無しさん :2023/06/04(日) 09:55:13.77 ID:5jvZ+YKl.net 実は正規表現でも使えば何とかなる…… のか…… std::regex re("^\s*([\d.]+)\s*$"); std::smatch m; if (std::regex_match(str, m, re)) { return m[1].str().strtod(); } else { エラー }
467 :デフォルトの名無しさん :2023/06/04(日) 09:56:15.54 ID:5jvZ+YKl.net >>465 仕様は最初に提示stkr、 123.456E+8 : OK 123.456E+8a : NG
468 :はちみつ餃子 :2023/06/04(日) 10:00:50.19 ID:MHoxWKtY.net >>467 続くものが何であるかは自分で確認してエラーにするという話をしてると思ったんやが。
469 :デフォルトの名無しさん :2023/06/04(日) 10:05:01.33 ID:5jvZ+YKl.net >>468 >続くものが何であるかは自分で確認してエラーにする ・できればライブラリでやってホスイ ・自分で書くとしてもナマポ(&(str[0]))は避けたい(>>461 ・std::string部分が他の文字列型に変わっても大丈夫なサポートがあるならそれに乗っかりたい手でテンプレートを書きたくない(>>461 できるかできないかで言えば、std::stringについてはダチャくあっても実現できてはいるので C++でちょう簡潔に書ける手段が実はあるのではないか、ありませんか、というのが質問の意図
470 :はちみつ餃子 :2023/06/04(日) 10:13:13.65 ID:MHoxWKtY.net >>469 続くものの種類で判断するというピンポイントな要求にマッチするものはさすがに標準にあるわけない。 それを除けば std::stod が十分に要求を満たしているように見える。
471 :デフォルトの名無しさん :2023/06/04(日) 11:40:09.61 ID:bxWaSYac.net 単位でも確認したいの? だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
472 :デフォルトの名無しさん :2023/06/04(日) 11:51:26.73 ID:xmEQJDCs.net 正規表現でチェックするのが1番自然な気がする
473 :デフォルトの名無しさん :2023/06/04(日) 22:03:06.86 ID:5jvZ+YKl.net >>471 > 単位でも確認したいの? > だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね std::stringに格納された数値文字列を数値にしたい、 しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい(>>459 > チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない チェックのためには(例えばstd::stodが)どこまで読んだのかの情報が要る std::stodの裏側では文字列を数値解釈する枯れたコードが動いているわけで、 そいつにどこまで読んだのか、ただ1個の整数データを聞けさえすれば良い。 これはそれほど無茶な話ではないはずで実際strtod()ではできるから どっちかというtライブラリにちょっち不備があるのでは案件であってお母さん案件ではない。
474 :デフォルトの名無しさん :2023/06/04(日) 22:20:35.13 ID:5jvZ+YKl.net >>472 上に書いた通り(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたら解決するのじゃ 正規表現は意味的には合目的的な手段やが、普通の正規表現エンジンの実装なら正規表現オブジェクトを作った際に FSMを(表形式か何かで)生成する処理が中で動くので、そんなに軽い処理ではないからやっぱ牛刀感みある… いったん作ったらマッチングは表駆動でやれるので速いことが気体できるのではないか、という香具師が居るかもしれないが、 実はstd::stod()に最大限仕事させたい(正規表現の側で数値文字列の書式についてわざわざ指定したっくない 場合は>>496 の正規表現は正しくは "^\\s*(.*?)\s*$"にせねばならないからマッチング時にバックトラックが発生して遅い可能性がある これもちょっちイヤソな理由 繰り返しになるが(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたらこんな考慮は不要で完全に円満に解決するのじゃ……
475 :デフォルトの名無しさん :2023/06/04(日) 22:30:29.50 ID:bxWaSYac.net >>473 そんな長文ギャンギャン書きなぐってる暇があればstodの仕様くらい調べろよ ちゃんとお前の欲しがってる物を返してくれるよ
476 :デフォルトの名無しさん :2023/06/05(月) 00:32:44.63 ID:8dockxGx.net 便乗質問していいですか 某所で似たような問題があったのだけど、付加条件として、数値がINT_MAXを超える場合は INT_MAX、INT_MINを下回る場合はINT_MINを返す、がありました stodを使う場合(stoll等でもいいですが)、これってどうやって処理すればいいですかね
477 :デフォルトの名無しさん :2023/06/05(月) 00:38:04.95 ID:8dockxGx.net 念の為「数値が」というのは元の文字列での、です。たとえば "1000000000000"みたいな 可能性としてはLONG_LONG_MAXを超えている場合もありますね
478 :デフォルトの名無しさん :2023/06/05(月) 00:46:19.80 ID:oX+QCkCh.net stoi系は範囲越えたらstd::out_of_rangeを投げるはずだが
479 :デフォルトの名無しさん :2023/06/05(月) 01:19:48.15 ID:8dockxGx.net _MAXで超えたか_MINで超えたかってわかりますかね
480 :デフォルトの名無しさん :2023/06/05(月) 01:31:31.21 ID:oX+QCkCh.net 先頭文字が'-'かどうか見れば?
481 :デフォルトの名無しさん :2023/06/05(月) 01:54:42.53 ID:yTJt/rkc.net >>475 どういうこっちゃkwsk、
482 :デフォルトの名無しさん :2023/06/05(月) 02:04:38.53 ID:LZnxgWkc.net >>481 https://ja.cppreference.com/w/cpp/string/basic_string/stof > pos がヌルポインタでなければ、ポインタ ptr (変換関数の内部的な変数) が str.c_str() 内の最初の変換されなかった文字のアドレスを受け取り、その文字のインデックスが計算されて *pos に格納されます。 これは変換によって処理された文字数になります。 > 引数 > str - 変換する文字列 > pos - 処理された文字数を格納する整数のアドレス
483 :デフォルトの名無しさん :2023/06/05(月) 02:37:23.50 ID:yTJt/rkc.net >>482 ㌧クスわかりたorz
484 :デフォルトの名無しさん :2023/06/05(月) 06:49:34.05 ID:8dockxGx.net >>480 そうですね、でも文字列の先頭とは限らないですよね。やはりこの場合はある程度は 自力で文字列をパースする必要がある感じですかね ちなみに数字以外が含まれるときの挙動は "hoge 123"みたいに数字より前に非数字 がくるのは駄目だけど逆に"123 hoge"みたいのはおkなんですね
485 :デフォルトの名無しさん :2023/06/20(火) 19:02:06.99 ID:mbwsU8Mq.net 話題がないから質問してみる struct Summer {}; Summer summer; Summer *const summerConstPtr{}; const_cast<Summer*>(summerConstPtr) = &summer; // だめ const_cast<Summer*&>(summerConstPtr) = &summer; // いける 質問1) 最後のいけるやつのconst_cast<Summer*&>の「&」はどういう意味なんでしょう? 参照のことかいな? 質問2) なんでconst_cast<Summer*>ではだめなのかな?
486 :デフォルトの名無しさん :2023/06/20(火) 19:05:08.72 ID:mbwsU8Mq.net なんか変換されたw ∑merでなくて&summerです
487 :はちみつ餃子 ◆8X2XSCHEME :2023/06/20(火) 20:45:04.07 ID:IIzrqfbq.net >>485 参照が絡むとややこしくて単純に説明できないんだけど 代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて そのキャストだと prvalue になってしまうから代入できないという結果になる。 たとえば int x = 1; x = 2; は有りだけど 1 = 2; は駄目なのはわかるでしょ。 この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。 値として取り出されてしまうと代入できないんだ。
488 :はちみつ餃子 ◆8X2XSCHEME :2023/06/20(火) 20:54:10.99 ID:IIzrqfbq.net どういうときにどういう値カテゴリに属すことになるのか正確なところはここ見て。 https://timsong-cpp.github.io/cppwp/n3337/basic.lval C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど 右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
489 :デフォルトの名無しさん :2023/06/20(火) 23:48:13.65 ID:mbwsU8Mq.net >>487 返答ありがとう。 なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。 summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって Summer *summerPtr; summerPtr = &summer; とするときの左辺summerPtrと同じようになったわけではないのでしょうか? どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
490 :はちみつ餃子 ◆8X2XSCHEME :2023/06/21(水) 00:33:00.36 ID:3HBFHOpK.net >>489 型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。 どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。 (結果的には辻褄の合うようになってるけど……。) & は参照を表す記号という解釈は正しい。 参照は lvalue なのでキャストの結果も lvalue ってだけ。
491 :デフォルトの名無しさん :2023/06/21(水) 01:03:31.08 ID:tILY3YM/.net >>489 その理解だと↓も通ることになると思うんだけど、これが通らない理由もわからない? int i = 0; static_cast<int>(i) = 1;
492 :デフォルトの名無しさん :2023/06/21(水) 11:05:32.10 ID:cZp0PZIW.net >>490 ,491 「&」はやはり参照でしたか。 左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。 ありがとう。
493 :デフォルトの名無しさん :2023/06/29(木) 00:53:29.69 ID:l197jz/x.net なんで可変長配列の名前がvectorなの?
494 :はちみつ餃子 ◆8X2XSCHEME :2023/06/29(木) 08:14:12.68 ID:l+ZsGqGg.net 伝統。
495 :デフォルトの名無しさん :2023/06/29(木) 13:14:41.30 ID:DfwcYShQ.net https://www.google.co.jp/search?q=%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB+%E6%84%8F%E5%91%B3 向きを持つ量をベクトルという 向きを持つためには複数の量が必要(単一の量はスカラーという) それを抽象化して、要素を一列に並べたものをベクトルという
496 :デフォルトの名無しさん :2023/07/04(火) 17:43:58.34 ID:Ld2RSFGK.net c++に限定される疑問ではないかも知れませんが標準出力がどうやってコンソールに出力しているか?というところで躓いてます gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます OSが用意している機能を実行しているという認識であってますか?
497 :はちみつ餃子 ◆8X2XSCHEME :2023/07/04(火) 17:52:47.39 ID:wwaI/oJF.net >>496 そうだよ。 現代の OS は権限の管理がしっかりしてて、アプリケーションは プロセスの外のリソース (メモリやデバイス) を直接には使えない。 OS に要求して適当なところに橋渡ししてもらう構造。
498 :デフォルトの名無しさん :2023/07/04(火) 18:05:29.71 ID:Ld2RSFGK.net >>497 どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね 自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか? HelloWorldからどちらに進もうか迷ってます
499 :デフォルトの名無しさん :2023/07/04(火) 19:16:32.21 ID:Ld2RSFGK.net 同様のテーマのITmediaの記事を見つけたので腰を据えて取り組んでみようと思います 回答いただきありがとうございましたお騒がせしました
500 :はちみつ餃子 ◆8X2XSCHEME :2023/07/05(水) 00:40:03.93 ID:h//lr2GB.net >>498 標準出力の実態はパイプ。 パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。 と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので ソースコードだけから読み取ろうとするのはしんどいと思う。
501 :デフォルトの名無しさん :2023/07/13(木) 01:46:39.34 ID:a7xsv8mg.net shared_ptrの解放時にweak_ptrを登録していたSTLコンテナから登録抹消したいけど、 shared_ptrのデリータでshared_ptr自身は扱えないっぽい。 出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
502 :はちみつ餃子 ◆8X2XSCHEME :2023/07/13(木) 18:07:22.25 ID:46c6OBqO.net >>501 設計意図次第だけど コンテナにはオブジェクト本体をいれて shared_ptr は コンテナ内の要素を指すイテレータを指す という構造はどうだろう。 #include <iostream> #include <memory> #include <set> int main(void) { std::set<int> container; auto [iter, result] = container.emplace(42); { // コンテナ内の要素を指す shared_ptr をいくつも作る auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;}); auto y = x; auto z = x; // コンテナの中には要素が入ってる for (auto& x : container) std::cout << x << " "; std::cout << std::endl; // shared_ptr はここで消滅 } // デリータが消したのでもう残ってない for (auto& x : container) std::cout << x << std::endl; }
503 :デフォルトの名無しさん :2023/07/13(木) 21:30:08.90 ID:BEK5Ztwm.net >>502 ありがとうございます。実体とイテレータ、参考になります。 おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。 回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、 修正とか色々めんどくさいけど、とかアホなこと考えてました。 処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、 shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
504 :デフォルトの名無しさん :2023/07/16(日) 13:37:45.84 ID:aonKa36p.net 設計意図次第
505 :504 :2023/07/16(日) 21:29:25.31 ID:AcIm+utR.net 何でかshared_ptrって派生出来ないと思い込んでたけど出来た。 shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。 ありがとうありがとう。 template<class T> struct X : public std::shared_ptr<T> { X(T* t) : std::shared_ptr<T>(t){} ~X(){/*X自体の登録抹消*/} };
506 :蟻人間 ◆T6xkBnTXz7B0 :2023/07/16(日) 22:10:43.92 ID:/+p/BpGt.net クラス内部で using std::shared_ptr<T>; を付けるとコンストラクタの実装が完璧になるよ。
507 :蟻人間 ◆T6xkBnTXz7B0 :2023/07/16(日) 22:12:03.59 ID:/+p/BpGt.net >>506 クラス内部で using std::shared_ptr<T>::shared_ptr; を付けるとコンストラクタの実装が完璧になるよ。
508 :504 :2023/07/16(日) 22:37:21.87 ID:AcIm+utR.net >>507 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。 ありがとうございます。自前実装不要なのは助かります。
509 :はちみつ餃子 ◆8X2XSCHEME :2023/07/17(月) 00:18:57.61 ID:YifLUjyU.net >>505 それって本当に意図通り? X のデストラクタが起動するのは X 型のオブジェクトが解体されるときであって 参照カウントがゼロになったときじゃないんだよ。
510 :504 :2023/07/17(月) 01:33:58.67 ID:9b8iHtwy.net >>509 …あー。それは意図通りではないですね。実際の解放はデストラクタで use_count()==1であることを確認する必要があるのかな。ありがとうございます。
511 :はちみつ餃子 ◆8X2XSCHEME :2023/07/18(火) 09:19:59.88 ID://OyAtPF.net パブリック継承した型では基底への型変換を禁じることができない。 つまり X<int> foo = new int(1); std::shared_ptr<int> bar = foo; みたいなことが出来てしまう。 間違った使い方を想定するとキリがないから なんでもかんでもガチガチに型を設計する必要はないんだけど、 この場合はどこかでミスりそうと思うので 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
512 :504 :2023/07/19(水) 03:16:45.39 ID:0uGQJSD8.net >>511 御忠告ありがとうございます。 高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。 > パブリック継承した型では基底への型変換を禁じることができない。 そんな問題があるとは。 派生クラスのキャスト演算子は引っかからず、基底クラスの コピーコンストラクタをいじらないと禁止出来ないっぽかった。 protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。 > 間違った使い方を想定するとキリがないから > なんでもかんでもガチガチに型を設計する必要はないんだけど、 > この場合はどこかでミスりそうと思うので > 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。 候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。 しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、 別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。 # shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照 なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、 他により良い方法を思いついたらそっちに乗り換えることにします。
513 :504 :2023/07/19(水) 18:45:15.41 ID:4lyHW67x.net そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、 public継承でほったらかします。
514 :デフォルトの名無しさん :2023/07/20(木) 15:28:07.42 ID:6BSTmMYa.net templateの世界へようこそ
515 :はちみつ餃子 ◆8X2XSCHEME :2023/07/21(金) 13:23:19.14 ID:NiBubQrd.net std::unique_ptr なら型引数でもデリータを与えることが出来て、 型引数が異なれば異なる型ということになる。 #include <memory> template<class T> struct custom_delete : public default_delete<T> {}; int main(void) { std::unique_ptr<int, custom_delete<int>> foo{new int(42)}; // ↓ 別の型なので移動できない。 エラーになる。 std::unique_ptr<int> bar = std::move(foo); } ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。 解体は動的な型に従うという保証をしているので。 #include <memory> struct foo {}; struct bar : public foo {}; int main(void) { // 解体のときに foo ではなく bar の // デストラクタが呼ばれることが保証される std::shared_ptr<foo> x{new bar}; } std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが 設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す というのが最も自然な形と言える。 std::shared_ptr を継承する形でカスタマイズしようとするのは してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
516 :504 :2023/07/21(金) 20:08:15.21 ID:jaEOXewl.net 一応発端の動かなかったコードを短くしたのでおいときます。 0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい 1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。 2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の デストラクタじゃないと処理できないけど、既製品だから外からいじられない。 3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば? というのが趣旨でした。 #include<vector> #include<memory> int main(){ std::vector<std::weak_ptr<int>> v; std::shared_ptr<int> x(new int(3), [&x, &v](int* i){ for(int j = 0; j < v.size(); j++){ std::shared_ptr<int> t = v[j].lock(); if(t && t == x){v.erase(v.begin() + j); break;} } delete i; }); v.push_back(x); }
517 :デフォルトの名無しさん :2023/07/25(火) 09:24:45.92 ID:k8WJtY+U.net >shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない これが無理っしょ
518 :デフォルトの名無しさん :2023/07/28(金) 10:56:39.59 ID:Zgvcm9f5.net なんで出来ると思ったの
519 :デフォルトの名無しさん :2023/07/29(土) 20:15:59.76 ID:ETnyq2kJ.net shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
520 :デフォルトの名無しさん :2023/07/29(土) 20:25:36.66 ID:xEb8mTKO.net シャー専用ptr
521 :1 :2023/09/03(日) 20:55:45.58 ID:/ExZEMtW.net 「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。 からのスレの目的で建てました。
522 :デフォルトの名無しさん :2023/09/03(日) 20:59:12.95 ID:W287fTtw.net まず、何が作りたいかイメージしてみましょう
523 :デフォルトの名無しさん :2023/09/04(月) 10:11:49.98 ID:/ASAZOX6.net >>521 がC++をやるのは早過ぎる 先にpythonでもやってみろ
524 :デフォルトの名無しさん :2023/10/02(月) 22:07:14.88 ID:l4Vvzubd.net 次のプログラムを実行するとコメントのように出力がされ、mainの最後で例外が発生してしまいます。 なぜ例外が発生するかわかる方教えてください。 mainを通してnewは2回実行され、deleteも2回実行されるので空ポインタをdeleteしていることもないと思うのです。 #include <iostream> using namespace std; class Csmp1 { private: int x; int* p; public: Csmp1(int n); ~Csmp1(); void disp() { cout << "x=" << x << endl;} }; Csmp1::Csmp1(int n) { x = n; p = new int; cout << "constructor " << x << endl; } Csmp1::~Csmp1() { delete p; cout << "destructor " << x << endl; } int main() { Csmp1 d3(300); // "constructor 300"と出力 d3.disp(); // "x=300"と出力 d3 = Csmp1(400); // "constructor 400"と出力し、その後"destructor 400"と出力 d3.disp(); // x=400と出力 return 0; } // デストラクタが呼ばれ、delete の部分で"Unknowin signal"例外発生
525 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:06.36 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
526 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:09.92 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
527 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:23.61 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
528 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:42.13 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
529 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:18:32.15 ID:/sjCb2h4.net 連投すみません。コピーコンストラクタと、代入もです。
530 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 00:13:21.44 ID:OUiDjLFt.net >>524 暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。 ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので 一方のポインタを通じて delete したならもう一方のポインタからオブジェクトに触れようとしてはならない。 (もう存在しないので。) この場合は d3 = Csmp1(400); としたときに生成される一時オブジェクトはこの式が終わった時点で解体されるので d3 内にあるポインタはデストラクタで delete 済み、すなわち無効なポインタとなる。 d3 のデストラクタが起動したときはデータメンバ p が指している先は無効なので 無効なポインタをいじったことになって問題が生じる。 それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。
531 :527 :2023/10/03(火) 00:55:04.57 ID:RKQFDOr6.net >>529-530 お二人さま ありがとうございます。 >d3 = Csmp1(400);としたときに生成される一時オブジェクトはこの式が終わった時点で解体される 右辺により生成されるオブジェクトが単にd3に格納されるのではないのですか。 それと入れ替わりに、d3コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。 (どこからも参照されなくなるので) 自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
532 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:14.63 ID:OUiDjLFt.net >>531 > 右辺により生成されるオブジェクトが単にd3に格納 JavaScript とか Python の動的型言語の経験があるのかな? それとも Java や C# の参照型のモデルで考えてる? C++ では左辺はメモリ上の特定の場所に対応づいていて、 別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは コピーするということ。 その上で不要になった一時オブジェクトは解体される。 一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで 解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
533 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:25.78 ID:OUiDjLFt.net >>531 > 右辺により生成されるオブジェクトが単にd3に格納 JavaScript とか Python の動的型言語の経験があるのかな? それとも Java や C# の参照型のモデルで考えてる? C++ では左辺はメモリ上の特定の場所に対応づいていて、 別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは コピーするということ。 その上で不要になった一時オブジェクトは解体される。 一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで 解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
534 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:17:47.16 ID:OUiDjLFt.net サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。 なんか不安定な状況っぽい
535 :デフォルトの名無しさん :2023/10/05(木) 17:15:14.18 ID:WXXGTjkD.net みんなでリトライするからF5攻撃並みに自爆DOS攻撃
536 :デフォルトの名無しさん :2023/10/05(木) 18:29:28.73 ID:S7K0dlIY.net >>524 int *をunique_ptr <int>にすると コンパイルで弾かれるから 気づきやすいかもね newとdeleteは直で呼ばない方が良い
537 :デフォルトの名無しさん :2023/10/06(金) 10:09:01.67 ID:Zl0hPCVy.net newとdeleteを直で呼んでるかどうかと 今回の問題(コピーが発生してるかどうか)は 関係無いんじゃね?
538 :デフォルトの名無しさん :2023/10/06(金) 10:16:23.02 ID:QFTcWZUD.net いきなりC++から入るとは… 考え直した方がいい
539 :デフォルトの名無しさん :2023/10/06(金) 12:08:09.60 ID:xj8n2YWF.net >>537 「コピーが発生してるかどうか」とは関係ないのはその通り >>524 が恐ろしいのは コンパイル時点では気づかず実行して初めて明らかになるところ どうしたら実行前に避けるかの方策として unique_ptrの常用を提案しました
540 :デフォルトの名無しさん :2023/10/06(金) 13:16:53.99 ID:Zl0hPCVy.net >>524 に有効な解決策は コピーコンストラクタじゃなくて ムーブコンストラクタじゃないのかな
541 :はちみつ餃子 ◆8X2XSCHEME :2023/10/06(金) 16:48:00.89 ID:R7EjAYTn.net 両方やっとけばええじゃろ。
542 :デフォルトの名無しさん :2023/10/06(金) 21:05:50.93 ID:BgvqARb2.net vector dp(N+1,vector(i+1,vector<mint>(i,0))); これはdp[N+1][i+1][i]個のデータを確保していると思っておk?
543 :デフォルトの名無しさん :2023/10/06(金) 21:10:07.75 ID:G9Jlm58L.net OK牧場!
544 :デフォルトの名無しさん :2023/10/06(金) 21:44:11.09 ID:BgvqARb2.net TXH!
545 :527 :2023/10/16(月) 23:49:47.91 ID:6sfjI2pS.net >>532 を始めとして皆さんまたまたありがとうございます。 アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。 コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
546 :デフォルトの名無しさん :2023/10/17(火) 23:09:31.94 ID:cH9YbrYr.net 既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。 マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
547 :はちみつ餃子 ◆8X2XSCHEME :2023/10/18(水) 09:51:20.64 ID:UZlHr99J.net >>546 ソースコードの構造を調べるのを補助するツールはあるが どういう意図でどういう使い方を想定してそう書かれているのかは プログラマが読み解かないとどうしようもない。
548 :デフォルトの名無しさん :2023/10/18(水) 17:06:40.02 ID:d+gN3jrr.net 既製品ならドキュメントあるだろ ドキュメントで謳ってないことはやるべきでない
549 :デフォルトの名無しさん :2023/10/18(水) 21:01:33.56 ID:XEk7oAP2.net visual studio community 2022で、 他のソリューションで作成されたmoduleをimportする方法がわかりません。 #includeみたいにパスを指定する方法とかがあるんでしょうか?
550 :デフォルトの名無しさん :2023/10/18(水) 21:18:35.91 ID:GW9b62tt.net あるよ
551 :デフォルトの名無しさん :2023/10/18(水) 22:46:30.83 ID:XEk7oAP2.net >>550 ぜひ教えてください!
552 :デフォルトの名無しさん :2023/10/19(木) 10:07:14.52 ID:W1XtHktx.net 外部モジュール取り込みは言語仕様じゃ無くてIDEの機能だから
553 :デフォルトの名無しさん :2023/10/20(金) 09:56:30.99 ID:/M3RKJCH.net IDEに頼ってるとアホになるよ
554 :デフォルトの名無しさん :2023/10/21(土) 16:32:35.29 ID:dhBJRkMq.net 0のうちにやめとけ 時間がもったいない
555 :デフォルトの名無しさん :2023/10/26(木) 23:16:10.15 ID:4gABazLN.net typedef uint8_t byte; : byte a = 3; uint8_t b = a; bの初期化は型不一致エラーにならないと思います。 コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
556 :デフォルトの名無しさん :2023/10/26(木) 23:23:19.82 ID:oN20rU1J.net >>555 typedef は型の別名を作る機能であって新しい型を作らない。
557 :デフォルトの名無しさん :2023/11/05(日) 12:44:18.01 ID:iVzKXsmj.net Visual StudioでソリューションAでビルドしたブツ(.exe、.dll、lib)、シンボルファイル(.pdb)、必要なヘッダファイル(.h) をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは "$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、 Visual Studio 2019以降だと今は実はもっと簡単?
558 :デフォルトの名無しさん :2023/11/10(金) 23:40:20.59 ID:mtEH7OmF.net class MyClass { public: MyClass(); : }; int main() { MyClass* c = new MyClass(); ① MyClass d; MyClass* dp = &d; ② : } オブジェクトのポインタは①や②のように取得できると思います。 私からすると①はdeleteしなければならないのでできれば使いたくない。 ①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
559 :デフォルトの名無しさん :2023/11/10(金) 23:49:08.54 ID:VDRR6isO.net >>558 その「相互代入」って何ですか?
560 :はちみつ餃子 :2023/11/10(金) 23:56:43.46 ID:Irnop6+y.net >>558 自動変数の寿命はスコープ単位だから それより長い寿命のオブジェクトが必要なら new する。 寿命の種類のことを Storage duration といい、 new で生成したオブジェクトは Dynamic storage duration に該当する。 継承関係がどうこうというのは何が言いたいのかよくわからないが、 ポインタの性質はオブジェクトの寿命とは関係ない。
561 :デフォルトの名無しさん :2023/11/12(日) 00:13:49.90 ID:M40i1rJ9.net 相互代入は言葉がおかしいですね。 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。 オブジェクトのボインタを使う場面があまりないので用途を聞きました。 >>560 >自動変数の寿命はスコープ単位だから それより長い寿命のオブジェクトが必要なら new する。 自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。
562 :はちみつ餃子 :2023/11/12(日) 02:00:51.06 ID:O0gb6uIB.net >>561 グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。 この static というやつは main が始まる前に構築されて main が終わった後に解体されるので 必要以上に長い寿命になってしまうことが多いし、 実行時の情報を元にして構築するオブジェクトを static にはしようがない。 dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。 ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。 グローバル変数は寿命も長すぎるがスコープも広すぎる。 人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。 触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。 本当に人間は忘れるし間違える。 部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。 まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
563 :デフォルトの名無しさん :2023/11/12(日) 11:04:18.35 ID:l8rhUXJt.net >>558 >@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。 そのためだけにあるという訳ではない >私からすると@はdeleteしなければならないのでできれば使いたくない。 生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば deleteはスマートポインタがやってくれる 構築は uniqu_ptr <MyClass> = new MyClass(); や uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる
564 :デフォルトの名無しさん :2023/11/12(日) 13:14:04.39 ID:xpiKETrj.net > 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。 > オブジェクトのボインタを使う場面があまりないので用途を聞きました。 アップキャストのことだろうかね。 必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
565 :デフォルトの名無しさん :2023/11/13(月) 06:27:48.00 ID:qbVz2ceg.net >>558 は、最初から必要数が決まっているオブジェクトしか作ったことがないのかな。 リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。
566 :デフォルトの名無しさん :2023/11/13(月) 10:31:45.02 ID:IRswNIWu.net >>564 型チェックしなきゃ危険だけどな
567 :デフォルトの名無しさん :2023/11/13(月) 13:26:36.10 ID:qAieNn1D.net uniqu_ptr
568 :デフォルトの名無しさん :2023/11/13(月) 18:54:22.80 ID:CCXWxw1E.net >>567 おおスマン typoだね
569 :デフォルトの名無しさん :2023/11/13(月) 23:59:54.01 ID:RLYu3oMv.net >>562 ほか皆さんありがとう。 自分の関わってきた分野が小規模組み込みだからか、そもそもCでmallocの使用経験がないのです。 処理系がmallocをサポートしないMCUもありました(使いたいなら自分で作ってという思想、標準入出力も)。 なので>>565 さんの指摘は当たりです。 c++に挑戦している今の環境も小規模なので、newの利用はほどほどに検討してみます。
570 :デフォルトの名無しさん :2023/11/14(火) 00:03:40.68 ID:F1cdKor4.net >>564 だいたい参照で済んでしまいます
571 :デフォルトの名無しさん :2023/11/14(火) 12:46:18.30 ID:SRCspH78.net mallocもnewも使ったこと無いってやばいぞ
572 :はちみつ餃子 ◆8X2XSCHEME :2023/11/14(火) 15:58:08.40 ID:oTbgWDDI.net new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。 メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?) 低レイヤでも便利な場面はたぶんある。 分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。 知っておくに越したことはないよ。
573 :デフォルトの名無しさん :2023/11/14(火) 21:59:36.46 ID:WxE96Zj2.net 空配列を用意してそれを順繰り使い回す チープなCPUでは必須の方法
574 :デフォルトの名無しさん :2023/11/14(火) 22:15:51.21 ID:VpxEmvp/.net RAM2KBでmallocが必要かどうか
575 :デフォルトの名無しさん :2023/11/15(水) 09:06:17.34 ID:vh+zgKB1.net よく A a = new A(); a->b(); delete a; みたいに生成してすぐ解放ってのがありますけど、 A a; a.b(); じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
576 :デフォルトの名無しさん :2023/11/15(水) 09:39:21.05 ID:88mXe6hW.net 後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな
577 :デフォルトの名無しさん :2023/11/15(水) 09:40:08.83 ID:7t1hSBTd.net >>575 A *a = new A(); よね、一応 bを呼び出したいだけなら特にメリットはないよ
578 :デフォルトの名無しさん :2023/11/15(水) 10:25:46.06 ID:2QF9cM/v.net スタック? そんな所にゃ領域取らないだろ
579 :デフォルトの名無しさん :2023/11/15(水) 16:06:06.00 ID:rnHf5KLb.net 何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?
580 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 16:35:01.46 ID:k729Xl/N.net >>575 > ありますけど、 ないよ……。 少なくともそう頻繁にはない。 あるとしたら >>576 が指摘するように A が特に巨大な場合というのはひとつの可能性。 ただ、巨大になるのがわかってるならリソースを分割して A の中で 上手いことやりくりする (A 自体の大きさは抑える) べきで、 クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。 第二の可能性として、 new 演算子をオーバーロードして そのオブジェクトがメモリの特定の場所に対応づけられる場合。 メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。 でもそれは低いレイヤだけの話で、 適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
581 :デフォルトの名無しさん :2023/11/15(水) 18:55:56.04 ID:aqUxtLPE.net 超初心者スレで揚げ足とったり、マウントしたり
582 :デフォルトの名無しさん :2023/11/15(水) 19:46:52.63 ID:O3I3kWYX.net >>579 何か作ってるうちに嫌でも詳しくなるよ
583 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 21:31:49.26 ID:k729Xl/N.net PC9801 時代を知ってる人は色々と詳しいと思うがその知識が役立っているというわけでもなくて、 PC9801 時代からの三十年くらいあれば詳しくなって当たり前ってだけだぞ。 たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。
584 :デフォルトの名無しさん :2023/11/16(木) 11:26:46.68 ID:QXdh7keC.net 当時は役に立ったけど今はオワコンの技術と 今でも役に立ってる技術と どっちが割合多い?
585 :デフォルトの名無しさん :2023/11/16(木) 11:55:31.84 ID:nxuWB9A/.net 「技術は陳腐化するが考え方は永遠である」
586 :はちみつ餃子 :2023/11/16(木) 14:01:30.65 ID:brAf4s3Y.net 新しい技術的流行が昔からあったやつの焼き直しってことは珍しいことじゃない。 「なんや、結局は××やないか」というときに××自体が廃れていてもう使わなくても 理解のためには役立っているのでオワコンとも役に立ってるとも言えたりする。
587 :デフォルトの名無しさん :2023/11/16(木) 15:18:16.01 ID:QXdh7keC.net ActiveXってCOMだよね COMってOLEだよね
588 :デフォルトの名無しさん :2023/11/20(月) 15:56:09.22 ID:QJSPRwrd.net こんにちは坂本と申します。 C++を0から勉強したく書き込み致しました。 私ごとですが先月定年退職し、やっと自由な時間がもてる様になりました。 在職中ずっとプログラミングの勉強をしたかったのですが子育てや職場がプラントの電気機械保全業務の3交代だった為に定年後を楽しみに我慢してまいりました。 プログラミングの知識は全くなく制御盤のPLCでニーモニック語でリストプログラミングをするぐらいしか経験はありません。 有料でもかまいませんので何回でも質問ができ、すぐに返答と解説をして頂けるサービスや学習機関がございましたら教えて頂きたく書き込ませてもらいました。 漠然とした質問で申し訳ありませんが今月よりプログラミングの勉強を独学で始めましたが質問できる知り合いもいなく困り果てております。 長文失礼致しました。
589 :デフォルトの名無しさん :2023/11/20(月) 19:07:01.26 ID:UNSN9Hhc.net >>587 DDEは?
590 :デフォルトの名無しさん :2023/11/21(火) 00:24:28.42 ID:cXhp/VaI.net C/C++ はポインターがあるから、ややこしい。 10年やっても無理 Ruby をやれ。 半年で、Ruby on Rails も出来る
591 :デフォルトの名無しさん :2023/11/21(火) 11:11:38.44 ID:HSO31doi.net 神社code
592 :デフォルトの名無しさん :2023/11/21(火) 14:22:46.70 ID:tYm3I+7J.net ポインターが分からない奴は プログラムを組む資格がない
593 :はちみつ餃子 :2023/11/21(火) 17:27:32.66 ID:4ADiN9xr.net ちゃんとした本があれば独学でそんなに困らないと思うけどな。 入門書の各章をじっくり読んで理解してから次の章に進むみたいな学習法をしているなら 詰まったときにどうしていいかわからなくなりがちなのでやめたほうがいいと思う。 色んな要素が相互に絡むので順番通りに学べるようなものじゃないから。 理解できなくてもたくさん詰め込んでいけばその内に繋がりがわかってくる。 「最初は」熟考しなくてもいい。 入ってない知識が関連するなら考えてもどうせわからん。
594 :デフォルトの名無しさん :2023/11/21(火) 17:38:45.53 ID:oh7zlSJI.net >>590 ポインタ使わないこともできるのに何言ってんだ そもそもポインタはノイマンアーキテクチャの基本なのでポインタがわからないというならコンピュータの利点を十分に利用できないということ
595 :デフォルトの名無しさん :2023/11/21(火) 18:05:44.93 ID:tYm3I+7J.net ポインター: 変数が入っているアドレスの数字 なんも難しいことはない
596 :デフォルトの名無しさん :2023/11/21(火) 18:24:30.60 ID:fyFN08Ef.net インデックスって言えば分かる? コンピュータにあるメモリー全体のインデックス番号
597 :デフォルトの名無しさん :2023/11/21(火) 18:35:32.85 ID:Ai4yJ31G.net 俺も最初全然わからなかったけどC言語ポインタ完全制覇のおかげで覚えた
598 :デフォルトの名無しさん :2023/11/21(火) 19:20:18.31 ID:JkIDzJ0A.net Java や C# にもポインタはあるしポインタを理解できなかったら他の言語も使えないよ ポインタ自体は難しくないんだけど C/C++ ではポインタ演算できちゃうのが鬼門なんだよね
599 :デフォルトの名無しさん :2023/11/21(火) 20:49:14.51 ID:TIZNoRj+.net N88-BASICにポインタあったっけ?
600 :デフォルトの名無しさん :2023/11/21(火) 20:53:06.63 ID:TIZNoRj+.net ポインタの文法なんて入門書には必ず説明があるので直ぐ分かるとして 俺が初期に読んだ数冊の入門書には それがプログラミングでどう役に立つのかが示されてなくて 悶々としながら読んでいたなぁ
601 :デフォルトの名無しさん :2023/11/21(火) 21:38:13.97 ID:fyFN08Ef.net ポインターなんて処理が糞遅いCPUをいかに速く動かすかって事以外に意味が無いからなぁ
602 :デフォルトの名無しさん :2023/11/21(火) 23:15:10.49 ID:mJ6deMbY.net std::string str = "abc"; ①str = str + "dd"; ②str = "dd" + str; これらの記述は有効のようです。 ①の右辺はstr.operator+("dd"); と解釈でき理解できます。 ②の右辺は "dd".operator+(str); と書きかえるとこれは無効に見えます。 std::stringのoperator+のプロトタイプを調べたところテンプレートが駆使されており私では読めませんでした。 ②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。
603 :はちみつ餃子 :2023/11/22(水) 06:21:16.63 ID:xG0rhWaa.net >>602 非メンバ関数として定義されている。 つまり str=std::operator+("dd", str); に相当することをやってる。 メンバ関数として定義すると不都合が起こるから std::complex とかも非破壊的な二項演算子は非メンバ関数として定義するのが通例だよ。
604 :デフォルトの名無しさん :2023/11/23(木) 18:16:14.60 ID:yQq1Seno.net >>603 本を見直したらfriendにするといい等ありました。 第1引数+第2引数、という記述があり、2個の引数を持つ+演算子関数が定義されている場合はそれが呼び出される決まりになっているのですね?
605 :デフォルトの名無しさん :2023/11/23(木) 18:17:35.84 ID:yQq1Seno.net stringから離れて一般的な質問です。↑
606 :はちみつ餃子 :2023/11/23(木) 20:11:53.97 ID:V52ACnUy.net >>604 そう。非メンバ関数として二つの演算子を受けとる operator+ があれば a+b みたいに書いたときに operator+(a,b) に読み替えられると考えてよい。 (全ての演算子を非メンバ関数として定義できるわけではない。) 余談だけど ADL という変な規則があるのは演算子が名前空間修飾できないことに対処する必要があるというのが理由のひとつで、自分が定義するクラスではこれが上手いこと作用するように設計すると便利なこともあるかもね。
607 :はちみつ餃子 :2023/11/23(木) 20:13:30.07 ID:V52ACnUy.net >>606 間違い。 「二つの演算子」じゃなくて「二つの引数」
608 :デフォルトの名無しさん :2023/11/23(木) 20:15:11.03 ID:0De2U7us.net 最小のサンプルコードを書いて自分で試すと分かるし身につくよ
609 :はちみつ餃子 :2023/11/23(木) 20:49:41.10 ID:V52ACnUy.net 書いてみるというのは賛成。 でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。 C++ には未定義とか処理系定義とかがいっぱいあるからテキトーに書いたプログラムの結果が保証された動作とは限らないから。
610 :デフォルトの名無しさん :2023/11/25(土) 11:27:01.67 ID:rcrc48ZO.net >>609 >でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。 横から悪いがこれには反対させてもらう もちろん動作からの仕様の決めつけは良くないが、人間は学習する動物なので書いて動作を見てこそ上達するんだよ 丸暗記だけで理解したと勘違いしてるやつが昨今多い(そしてそういう奴に限って何も作ってない)ので、そういうのを後押しはしないで欲しい
611 :デフォルトの名無しさん :2023/11/25(土) 11:52:38.86 ID:rcrc48ZO.net というか、自分の認識の間違いに気づくのもまた書いて試した時だからね(まれにコンパイラのバグだったりもするけど) 人間が頭の中で考えたことなんか穴だらけなんだから書いて試せるなら真っ先に試した方がいい
612 :デフォルトの名無しさん :2023/11/25(土) 12:13:14.81 ID:vlVh3gWj.net >>610 同意。 処理系依存とか未定義動作なんて中級者以上になってから気にすればいいこと はじめは手元にある処理系の結果を「正」として学習を進めても問題ないと思う
613 :デフォルトの名無しさん :2023/11/25(土) 12:45:47.67 ID:rKTwm3uz.net >>593 これ >>590 しね
614 :デフォルトの名無しさん :2023/11/25(土) 12:47:19.78 ID:rKTwm3uz.net >>595-596 ポインタ判らんって人はその辺は判ってんだよ 本当に判ってないのはアドレッシングモード
615 :デフォルトの名無しさん :2023/11/25(土) 12:50:17.30 ID:rKTwm3uz.net >>599 peek poke はあるし変数もあるから 用途という意味でのポインタはある
616 :デフォルトの名無しさん :2023/11/25(土) 12:54:57.59 ID:rKTwm3uz.net >>610 そうだな Rust スレにも変なのが粘着してゴリ推ししてて迷惑
617 :はちみつ餃子 ◆8X2XSCHEME :2023/11/25(土) 13:45:51.01 ID:BXmPXb0v.net >>610 > 書いて動作を見てこそ上達するんだよ だから書いてみるのは賛成と書いたのだが、何に反対してるんだ?
618 :デフォルトの名無しさん :2023/11/25(土) 13:56:27.70 ID:vlVh3gWj.net 「学んでから確かめるために書く」 ↑反対されてるのはここでしょ これどうなるんだろう?動かしてみよう!なるほどこうなるのか!という学び方でもいいと思う あなたが言ってるのは「これどうなるんだろう?」ではダメで「こうなるはずだ!」と学んでから動かせってことだよね? それは初心者には結構むずかしい
619 :はちみつ餃子 :2023/11/25(土) 15:39:30.62 ID:BXmPXb0v.net >>618 > これどうなるんだろう?動かしてみよう!なるほどこうなるのか!という学び方でもいいと思う 私が言いたいのは推測できるものではないというところが主旨で、 自分が色々やってみたことが不確かな推測であることを認識した上で きちんとした資料にあたって確かめるという順序でもかまわないとは思うよ。 出来るのならば。 やってない人が多いように私には見えているから否定的に言ってるわけだけど。 > 初心者には結構むずかしい 訓練せずに他のことをしてても出来るようにはならないでしょ。 やらなきゃずっと難しいよ。 C++ は複雑怪奇かつ規格改訂もあるのでベテランでも頻繁に仕様を参照するのが普通なわけで、 資料を参照するのを後回しにするような人間が後にそのような人間に変われるとは思わない。
620 :デフォルトの名無しさん :2023/11/25(土) 16:15:59.30 ID:vlVh3gWj.net 「やってない人が多いように私には見えている」 多くの人が出来てないことを初心者に求めてもねェ
621 :はちみつ餃子 :2023/11/25(土) 16:27:29.63 ID:BXmPXb0v.net >>620 「推測した後には多くの人が資料を見ること」をやってないという話だぞ。 最初に資料で学ぶ人は体系的な知識が身に付くからそっちがオススメという話だぞ。
622 :デフォルトの名無しさん :2023/11/25(土) 16:42:06.01 ID:vlVh3gWj.net 初心者に対して「言語仕様を推測したりしないように」「学んでから確かめるために書く」って言ってたよね 言語仕様を理解してからコードを書けってことでしょ?
623 :デフォルトの名無しさん :2023/11/25(土) 16:49:08.14 ID:vlVh3gWj.net >>621 先にも後にも資料(言語仕様)を確認しない人が多いんでしょ そんな難しいことを初心者にまで要求してどうすんの
624 :はちみつ餃子 :2023/11/25(土) 16:51:46.77 ID:BXmPXb0v.net >>622 そうだよ。 言語仕様を理解してから書くのが好ましい。 理解する前に色々試すというやり方も許容しなくはないが、 それでも後では資料を見て仕様を理解するという前提があってのもの。 理解する前に色々試すタイプは資料を見なくなりがちという現実があると述べてる。
625 :はちみつ餃子 :2023/11/25(土) 16:55:25.38 ID:BXmPXb0v.net >>623 「資料」と「仕様」を使い分けて書いてるつもり。 直接に言語仕様を読めとは述べてないよ。 プログラムを書くときは色んな資料を参考にするので 入門書程度すらちゃんと読まない人がやってけると思ってんの? ってことを言ってる。
626 :デフォルトの名無しさん :2023/11/25(土) 17:00:19.64 ID:vlVh3gWj.net え? 資料=言語仕様じゃないの? 「言語仕様を推測したりはしないように」って言ってたから言語仕様に関する資料を読んでからコードを書けという意味だと解釈したのだけど 資料=入門書程度なの? ・・・なんか言ってることが変わってきたね?
627 :デフォルトの名無しさん :2023/11/25(土) 17:03:42.33 ID:vlVh3gWj.net ちなみに「入門書を何冊か買って読みながら進めるといいよ」みたいな書き方だったらこんなに絡んだりしてないからね?
628 :はちみつ餃子 :2023/11/25(土) 17:04:18.21 ID:BXmPXb0v.net >>626 いや、そりゃそうでしょ。 最初から言語仕様を読めとか言わないよ。 入門書だって仕様書に基づいて書いてるし、基づいてない入門書だったらクソってだけ。
629 :611 :2023/11/25(土) 17:06:46.45 ID:5Y+f+Y1g.net >>620 これをやってきたのがはちみつ餃子なんだよ 俺ははちみつ餃子の書き込みにいつも感心してるよ
630 :デフォルトの名無しさん :2023/11/25(土) 17:09:19.28 ID:rcrc48ZO.net >言ってることが変わってきた うん、まぁ、はちみつはそういうとこあるから・・・w ただまぁ、言語仕様に詳しい人の存在は(はちみつに限らず)非常に有難いんだが、 実際にソフト書く上で気にしなきゃいけないのは言語仕様だけじゃない 特定のソフトの個別の問題を解決するためのアルゴリズムについて、資料があるのか?と。(すでに出来上がってて公開されてるアルゴリズムが存在する問題などほとんど無い) 一番大事なのは論理的思考力であって、なんでもはなから資料をアテにしてたら逆にそれが身につかないよ
631 :デフォルトの名無しさん :2023/11/25(土) 17:12:35.76 ID:vlVh3gWj.net >>628 だとしたら、言語仕様を推測するな、未定義動作や処理系がどーのこーのとずいぶんと遠回しな言い方をしたねえ 入門書を読みといいよの一言で済むのに >>629 それは別の話。餃子がエキスパートであることは否定してない 初心者の前に高いハードルを立ててC++を聖域みたいにするのはやめて欲しいのだ
632 :デフォルトの名無しさん :2023/11/25(土) 17:13:52.19 ID:rcrc48ZO.net どうも仕様オタク(言い方は悪いが、アマチュアという意味も込めて)な人達は、自分の知ってる世界が全てだと思い込んでるようで前々から問題だと思ってた 世の中、マイナーなAPIとかになると嘘を書いてることもあるし何も資料が無いことすらある もちろん実際の動作から「今わかること以上」をわかった気になる(仕様を知った気になる)のは問題だが、 逆に言えば「仕様がこうだから間違ってないんだ」などと動作を確かめもせずに決めつけるのも問題だ そういうのは結局本人の心的態度の問題に過ぎない
633 :はちみつ餃子 :2023/11/25(土) 17:15:51.23 ID:BXmPXb0v.net アルゴリズムは考えればわかることもあるかもしれんが、言語仕様は考えたってわからんし。 (想像はつくことも多いけど。)
634 :デフォルトの名無しさん :2023/11/25(土) 17:17:15.50 ID:mGx3DnG8.net > 書いてみるというのは賛成。 初心者はこれでもいい > でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。 中級者以上になって言語仕様等に踏み込んだ学習をしようとするなら書いたもので仕様を測るのではなく「学んで」知るべし と言う意味だと俺は>>609 を解釈してた
635 :はちみつ餃子 :2023/11/25(土) 17:21:04.72 ID:BXmPXb0v.net >>631 複雑難解な C++ を試させるのがハードルの低い方法だと主張したいわけ? きちんと整備された学習ルートがあるという話なのにそれでハードルを上げてるとか言われるのは心外だわ。
636 :デフォルトの名無しさん :2023/11/25(土) 17:24:19.67 ID:vlVh3gWj.net 「きちんと整備された学習ルートがあるという話なのに」 お前そんな話してたか?
637 :デフォルトの名無しさん :2023/11/25(土) 17:24:48.18 ID:mGx3DnG8.net あれよな ・初心者スレだからアドバイスはすべて「初心者向けの内容」 ・初心者スレだけどアドバイスは「初心者向けの内容」と「その先を見据えた内容」 はちみつ大先生は後者だけど、ツッコミを入れたほうは前者で読み取っているから噛み合わないってだけよな、たぶん
638 :はちみつ餃子 :2023/11/25(土) 17:26:03.64 ID:BXmPXb0v.net >>636 まずは資料を読め (資料があるから) という主張を最初からしてるつもりだが。
639 :デフォルトの名無しさん :2023/11/25(土) 17:34:11.58 ID:xBFezCRv.net 「C++言語リファレンスを頭に叩き込め!!話はそれからだ」 でいいんじゃね?と俺は思っている で、理解できない部分は入門書やサンプルコードを読んで理解する まずは書いて試せという人もいるが俺はこの意見には賛同できない プログラミング言語というのは日本語や英語などの自然言語と違って 少しでも間違えたら動かないし、C++の場合なら最悪システムが破壊される 理解できなくても動けばいいなどという考えの奴がいるからバグが量産されるのだ ミスが許されないのはたとえば医者だな 医者は医者になる前に知識を詰め込むのが普通だ 知識もないのに外科手術をしたらどうなるか? 切りながら覚えろというのか? プログラミングは手術と同様、まずは知識、次に技術が必要となる、と俺は思っている 【完】
640 :はちみつ餃子 :2023/11/25(土) 17:40:31.27 ID:BXmPXb0v.net >>637 初心者教育は二種類に大別されると思っていて、たとえば公立学校の授業でするような 興味がない層も含めて最低限の知識は与える教育と 学ぶ意欲があって専門知識と言えるようなものを身に付けようとする者に対する教育。 前者は「興味をひく」というところから考えないといけない。 理屈よりも楽しいと思えるようなやり方が必要になることもあるだろう。 後者は理屈を避けては通れない。 理屈の身に付け方には色んな方法論があるかもしれないけど まずは書いてあるものを読め (先人がそれを良いやり方だと思ってまとめてくれたんだから! 手を動かす必要があると思うところでは演習問題があったりもする) という風に考えてる。 今は初心者であるかどうかは重要ではなく ここで相談するような層は後者のルートのつもりでいると私は思って書いてる。
641 :デフォルトの名無しさん :2023/11/25(土) 17:45:56.52 ID:Xpg7OWMd.net >>639 >理解できなくても動けばいいなどという考えの奴 誰の話?
642 :デフォルトの名無しさん :2023/11/25(土) 18:21:13.32 ID:xBFezCRv.net >>641 わからないか…かわいそうに… 教えてあげなぁぁい
643 :デフォルトの名無しさん :2023/11/25(土) 18:24:14.13 ID:0MoP1N3f.net おちんちん舐めてごらん
644 :デフォルトの名無しさん :2023/11/26(日) 10:58:08.83 ID:d/KzVdDP.net >>625 最近ChatGPTに全部聴いて済ます変なのが住み着いて迷惑だな
645 :デフォルトの名無しさん :2023/11/26(日) 11:15:51.84 ID:d/KzVdDP.net >>639 >医者は医者になる前に知識を詰め込むのが普通だ >知識もないのに外科手術をしたらどうなるか? >切りながら覚えろというのか? 言いたいことは判るが「最初の医者」はどうしてたんだろうな 君の言ってるやり方は「従順な職人」を育てるやり方としては正しいが クリエイターを育てることは出来ない
646 :デフォルトの名無しさん :2023/11/26(日) 12:24:07.96 ID:t0WQFMSf.net >>639 からの>>642 だからな 一見それっぽいこと言ってるようで全く中身の無い事を言うアホが長いこと住み着いてる(C++系だけなのか他もなのか) 突っ込まれると頭悪い煽り方しかしてこないからすぐわかる、玄人ぶりたいだけのアホだから相手しない方がいい
647 :デフォルトの名無しさん :2023/11/26(日) 12:37:18.37 ID:DTfcWvWZ.net 医者の下りはおかしい 医師は残念ながら完全な医学的知識を身に着けて 外科手術に臨む訳じゃないぞ 語弊を恐れなければ「切りながら覚える」側面もある
648 :はちみつ餃子 :2023/11/26(日) 12:54:38.94 ID:k38CbPq9.net ちゃんとした資料で学んでないと用語が無茶苦茶だから 何を言ってるんだかわからないということが起こる。 言語仕様の理解が結果的に正しくてもそうでなくても。 「伝わればいいだろ!」みたいに言う人が結構いるんだけど伝わらないから困るんだ。 メンバ関数をメソッドと言ったりするのは誤解の余地はそんなにないと思ってたら 非メンバ関数もメソッドと言っている例を観測したことがあるし、 子クラスって派生クラスの意味で言ってるんだよな? と思ってよく確認したら入れ子になったクラス (nested class) だったりするし、 クラス変数は静的データメンバの意味だろう (Ruby とかにはそういう用語があるし) と思ったら 静的でないデータメンバのことを言ってたというオチもある。 結果的に正しく使ってる場面ですら本当にその意味で言ってるのか疑わしくなる。 経験や感覚で書けるようになったとしても まともな資料を読んでないというのはそういった形でコミュニティ内で有害なわけで たまには思い違いがあるのはしょうがないが 学んでないし学ぶ気もないのを良しとは言えないよ。
649 :デフォルトの名無しさん :2023/11/26(日) 13:47:17.98 ID:t0WQFMSf.net >>648 いい加減にしろよ お前何でそんな上からなの?
650 :はちみつ餃子 :2023/11/26(日) 14:18:15.64 ID:k38CbPq9.net >>649 伝えようとしない態度を批判してるところに対して伝わらないことを書くのやめろよ。 何が言いたいんだ?
651 :デフォルトの名無しさん :2023/11/26(日) 14:34:29.20 ID:mssmbX4x.net 自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。 荒らす気は無いのでこれで終わりにする
652 :はちみつ餃子 :2023/11/26(日) 14:42:52.42 ID:k38CbPq9.net 完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。 書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
653 :はちみつ餃子 :2023/11/26(日) 14:55:17.55 ID:k38CbPq9.net 資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ? 学校だって座学でやったことを演習で実践してるだろう。
654 :デフォルトの名無しさん :2023/11/26(日) 15:50:55.41 ID:DTfcWvWZ.net 気にするなってほぼ嫉妬なんだから
655 :デフォルトの名無しさん :2023/11/26(日) 16:03:14.03 ID:t0WQFMSf.net >ほぼ嫉妬 俺に言ってんの? いずれにせよ荒らそうとしてる自覚はあるか?
656 :デフォルトの名無しさん :2023/11/26(日) 16:08:02.37 ID:Dy8SO9u0.net >>655 どう考えてもお前が荒らしじゃん 人のことをアホ呼ばわりしてるし
657 :デフォルトの名無しさん :2023/11/26(日) 16:22:42.40 ID:t0WQFMSf.net >>639 =645=659 バレバレだからwww
658 :デフォルトの名無しさん :2023/11/26(日) 18:08:35.12 ID:fCQnoW9K.net >>652 言語仕様・未定義動作・処理系とか言ってたから完璧に把握しろに近いニュアンスだと感じた メソッドではなくメンバ関数、用語を正しくつかわないと伝わらないとか言ってることがどんどん変わってる
659 :デフォルトの名無しさん :2023/11/26(日) 18:08:55.12 ID:4RSi5A29.net お取り込み中すみませんが質問です ダウンキャストという用語が是か非かです ボクは不適切な用語だと思っていて 理由は 1) 言語の仕様に出てきていない 2) アップかダウンかについてももちろん仕様に無い 3) アップキャスト相当の操作は通常行わない です 少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
660 :はちみつ餃子 :2023/11/26(日) 20:14:28.93 ID:k38CbPq9.net >>659 仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど…… 原則としては C++ 用語ではないと考えて良いと思う。 クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので 方向をアップ/ダウンで言うのもおかしな話だし。 derived-to-base convertion というような用語は仕様書の文面にもあるので アップキャストに相当するのはこの用語のはずだけど base-to-derived convertion という用語は出てこないので ダウンキャストに相当する直接の用語はなさそう。 冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。 ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。 to が脱落したらだいぶん雰囲気が変わってしまうでないの。 これは真似しないほうがいいかもね。 ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので なんだかんだで一語で表せるってのは便利なんだと思う。 私は使わないようにしているけど。
661 :はちみつ餃子 :2023/11/26(日) 20:20:37.65 ID:k38CbPq9.net すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。
662 :デフォルトの名無しさん :2023/11/26(日) 20:28:40.49 ID:4RSi5A29.net レスサンクス お手数おかけして痛み入ります > 3) アップキャスト相当の操作は通常行わない B *b = (B *)d; // もしもこれが必要な世界だったら 使い分ける?ための用語が欲しくなるのはまだわかるけど D *d = (D *)b; // こっち方向にしかキャストしないんだから 区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない …とはいえボクがいくらこう考えても みんながそうじゃないから蔓延ってるわけで > 私は使わないようにしているけど。 その一言で何か救われた気分になりました
663 :デフォルトの名無しさん :2023/11/26(日) 20:32:07.21 ID:4RSi5A29.net 一応補足 > B *b = (B *)d; // もしもこれが必要な世界だったら B *b = d; // こう書くだけじゃ許されなくて
664 :デフォルトの名無しさん :2023/11/26(日) 20:37:16.38 ID:Dy8SO9u0.net ダウンキャストって言葉は普通に使われてると思うが… 日本語版のウィキペディアなら C++ - Wikipedia https://ja.wikipedia.org/wiki/C%2B%2B に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある 英語版ウィキペディアなら Downcasting - Wikipedia https://en.wikipedia.org/wiki/Downcasting マイクロソフトのリファレンスなら dynamic_cast 演算子 | Microsoft Learn https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator にアップキャストとダウンキャストのことが書かれてる
665 :デフォルトの名無しさん :2023/11/26(日) 20:47:28.85 ID:4RSi5A29.net rustに至っては嘆かわしいことに https://doc.rust-lang.org/std/any/trait.Any.html > pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any, 上記トレイトのメソッド名に採用されている あー虚しい あーヤダヤダ
666 :デフォルトの名無しさん :2023/11/26(日) 20:59:53.00 ID:mssmbX4x.net >>664 使われてるけど規格に定義があるような正式な用語ではないってことだろ
667 :はちみつ餃子 :2023/11/26(日) 21:20:56.75 ID:k38CbPq9.net >>662 むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。 ポインタを経由せずに値を直接キャストすることもありうるし 参照の場合かもしれない。 class foo {}; struct bar : public foo {}; int main() { auto a = bar(); // bar から foo へのアップキャストってどれのこと? auto b = static_cast<foo>(a); auto c = static_cast<foo *>(&a); auto &d = static_cast<foo &>(a); }
668 :デフォルトの名無しさん :2023/11/26(日) 21:48:36.05 ID:Dy8SO9u0.net >>666 一応マイクロソフトのリファレンスは正式だと思うが まあマイクロソフト独自の規格ってなるのだろうけどな あんなもんは認めないというのなら仕方あるまい
669 :デフォルトの名無しさん :2023/11/26(日) 21:52:47.74 ID:DTfcWvWZ.net >>660 >仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど…… >原則としては C++ 用語ではないと考えて良いと思う。 >クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので >方向をアップ/ダウンで言うのもおかしな話だし。 upcastとdowncastって一般名詞なのではないかな?
670 :デフォルトの名無しさん :2023/11/26(日) 21:57:36.24 ID:mssmbX4x.net >>668 デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
671 :デフォルトの名無しさん :2023/11/26(日) 22:15:54.01 ID:Dy8SO9u0.net >>670 デファクトスタンダード それだ 大正解
672 :はちみつ餃子 ◆8X2XSCHEME :2023/11/26(日) 23:34:44.38 ID:k38CbPq9.net 言語仕様の説明をするときには >>667 のようなバリエーションの内のどれのことを言っているかで 事情が変わってくるので結局は具体的な場合を示さなければならず、 「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。 (より詳細な場合分けをするので用語を使う機会がない。) 逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは 充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。 どうせ説明を付け足すなら用語の甲斐がないので 使う意味もそんなにないように思う。 念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので そうではない状況で文脈を共有できていて 「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
673 :デフォルトの名無しさん :2023/11/27(月) 04:54:45.36 ID:tiJqQBXv.net オナニー解答
674 :デフォルトの名無しさん :2023/11/27(月) 08:10:08.19 ID:8c8BDf1i.net 相変わらずはちみちはめんどくせーな
675 :デフォルトの名無しさん :2023/11/27(月) 09:35:39.43 ID:7/k6/GSg.net >>648 違う言語で比較するときはそういう用語の使い方になるケースが多いと感じる 「學んでいない」のとはまた別の問題だと思う
676 :デフォルトの名無しさん :2023/11/27(月) 09:39:16.20 ID:7/k6/GSg.net >>653 あいつは學校行ってないかも知れないな なんでも試行錯誤で 挙句ChatGPTが完璧に教えてくれると勘違いしている 救えない
677 :デフォルトの名無しさん :2023/11/27(月) 09:41:27.50 ID:7/k6/GSg.net >>659 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
678 :デフォルトの名無しさん :2023/11/27(月) 09:52:51.04 ID:7/k6/GSg.net >>672-674 アスペ臭を感じる
679 :デフォルトの名無しさん :2023/11/27(月) 14:40:19.25 ID:UqO8a829.net アスペルガー症候群だって良いじゃないか? 何で差別的なことを書くのかね?
680 :デフォルトの名無しさん :2023/11/28(火) 00:01:54.69 ID:5UazaCro.net クラス内からのみ参照する定数配列のベストな書き方を模索しています。 まず 1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。 2、staticメンバにする方法。 .h static const int TABLE[3]; .cpp const int TABLE[3]={1,2,3}; エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。 3、cppにのみに書きhには書かない。 .cpp const int TABLE[3]={1,2,3}; エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる? 名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。 constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。
681 :デフォルトの名無しさん :2023/11/28(火) 00:04:59.65 ID:5UazaCro.net 2のcppは const int クラス名::TABLE[3]={1,2,3}; も試したはずですがエラー解消しませんでした。
682 :デフォルトの名無しさん :2023/11/28(火) 00:37:23.98 ID:dISnZSIc.net 2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
683 :デフォルトの名無しさん :2023/11/28(火) 01:08:09.85 ID:dISnZSIc.net あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合
684 :デフォルトの名無しさん :2023/11/28(火) 06:02:30.27 ID:fb4KLmhh.net 2、staticメンバにする方法。 .h static const int TABLE[3]={1,2,3}; .cpp extern const int TABLE[3]; もれはやらんけど
685 :デフォルトの名無しさん :2023/11/28(火) 06:13:38.37 ID:fb4KLmhh.net あ、ごめん逆だった .cpp static const int TABLE[3]={1,2,3}; .h extern const int TABLE[3];
686 :デフォルトの名無しさん :2023/11/28(火) 10:21:56.36 ID:tbacT9e+.net >>681 これは通るだろ? コンパイラは何よ?
687 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 10:25:57.66 ID:mRTkdYl9.net >>681 出来なかったというコードをそのまま提示して欲しい。 状況がよくわからないのに想像で対処法を考えてもしょうがない。 コードがちょっと長くなるなら codetter とか wandbox とか ideone とかを使って。
688 :デフォルトの名無しさん :2023/11/28(火) 10:27:57.27 ID:vcMwjchf.net クラス内の定数を外部に生出しとかしないから enunとかで宣言はするけど 何番目が欲しいとかはサービス関数作るしなぁ
689 :デフォルトの名無しさん :2023/11/28(火) 10:30:15.59 ID:vcMwjchf.net つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?
690 :デフォルトの名無しさん :2023/11/28(火) 10:32:49.40 ID:vcMwjchf.net ヘッダーファイルはクラスコードの名刺みたいなもんで 外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
691 :デフォルトの名無しさん :2023/11/28(火) 10:35:09.02 ID:vcMwjchf.net マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな
692 :デフォルトの名無しさん :2023/11/28(火) 11:07:40.67 ID:t7+ip2Xg.net >>689 staticには複数の意味がある >>680 の発想は h に static 描いてみたら「たまたま」エラーが消えたら ok みたいなやり方なんだろ
693 :デフォルトの名無しさん :2023/11/28(火) 11:35:51.07 ID:vcMwjchf.net >>692 staticより「内部でしか使わない」って話の方を拾ってね
694 :デフォルトの名無しさん :2023/11/28(火) 12:43:41.53 ID:dISnZSIc.net >>693 質問者は「クラス内からのみ参照する」って言ってただろ
695 :デフォルトの名無しさん :2023/11/28(火) 18:17:05.00 ID:vcMwjchf.net >>694 それならヘッダーファイルに書く必要無いやんけw
696 :デフォルトの名無しさん :2023/11/28(火) 18:50:50.78 ID:dISnZSIc.net そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね
697 :デフォルトの名無しさん :2023/11/28(火) 20:09:09.84 ID:vcMwjchf.net そんな巨大なクラスは設計が間違ってないか?
698 :デフォルトの名無しさん :2023/11/28(火) 20:12:44.23 ID:bqHRuT95.net >>677 > 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される それなw 初心者ほどこの用語を使ってるように見える 初心者が集まるところでこれを流布してるやつがおるんやろな ポインタへのポインタっていうスケーラブルな定義が理解できてなくて アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
699 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 20:20:10.37 ID:mRTkdYl9.net >>697 この >>696 の言は逆のことを言ってると思う。 ひとつの翻訳単位にたくさんのクラス (の実装部分) を書くこともあるから ファイルスコープにしたらスコープの範囲が広すぎる (制限にならん) やんけと言ってるように読める。
700 :デフォルトの名無しさん :2023/11/28(火) 20:27:35.33 ID:dISnZSIc.net >>697 巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど) 例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
701 :デフォルトの名無しさん :2023/11/28(火) 20:29:47.21 ID:dISnZSIc.net >>699 もちろんそれもある
702 :デフォルトの名無しさん :2023/11/28(火) 20:57:18.00 ID:dISnZSIc.net まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス
703 :デフォルトの名無しさん :2023/11/28(火) 21:00:29.03 ID:HOP5xTTo.net >例えばクラステンプレートになると、ソースに実装を書けないから C++の設計ミスだな 特にテンプレ
704 :デフォルトの名無しさん :2023/11/28(火) 21:55:43.79 ID:vcMwjchf.net テンプレートは単なる#defineだからなぁ あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
705 :はちみつ餃子 :2023/11/28(火) 22:43:12.61 ID:mRTkdYl9.net 一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。 従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。 コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
706 :デフォルトの名無しさん :2023/11/28(火) 23:00:59.77 ID:5UazaCro.net どうも>>680 です。 2のクラス名あり版でビルド通りました。 -sample.h class sample_1 { int a; static const int TBL[3]; public: sample_1(); }; -sample.cpp #include "sample.h" #include <iostream> const int sample_1::TBL[3] = {1,2,3}; sample_1::sample_1() { a = 2; std::cout << TBL[a] << std::endl; } -main.cpp #include <iostream> #include "sample.h" int main() { sample_1 sa; return 0; }
707 :デフォルトの名無しさん :2023/11/28(火) 23:06:12.31 ID:5UazaCro.net sample.hにTBL宣言なしで、 sample.cpp #include "sample.h" #include <iostream> static const int TBL[3] = {1,2,3}; sample_1::sample_1() { a = 2; std::cout << TBL[a] << std::endl; } でもOKでした。こちらのstaticはC式の使い方ですね。 私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
708 :デフォルトの名無しさん :2023/11/28(火) 23:19:21.29 ID:dISnZSIc.net 解決おめ、自分の用途に合うと感じるならそれがベストと思うよ
709 :デフォルトの名無しさん :2023/11/29(水) 06:23:02.71 ID:n75oaT1g.net h に static 描くと単に相互干渉しないってだけで インスタンスは造られまくって無駄リソース出まくるんじゃね
710 :デフォルトの名無しさん :2023/11/29(水) 09:24:39.36 ID:5+1qDy8t.net 奴は人の書き込み見ちゃいないよw
711 :デフォルトの名無しさん :2023/11/30(木) 22:28:52.60 ID:p6G1t8dm.net sizeof(クラス名)を活用できる場面はありますか。 メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、 クラス一般について考えると思いつきません。 たとえば std::string name; がメンバ変数にあるともう、クラスのサイズは不定になりそうです。 あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
712 :デフォルトの名無しさん :2023/11/30(木) 22:39:03.15 ID:jq+Wc58z.net >>711 >std::string name; >がメンバ変数にあるともう、クラスのサイズは不定になりそうです。 確認してみましょう!
713 :はちみつ餃子 ◆8X2XSCHEME :2023/11/30(木) 23:39:52.07 ID:3QI4e6Tt.net >>711 sizeof 演算子の適用結果は定数であることが保証される。 定数式として使うことができる。 std::string なども型の大きさが変動したりはしない。 C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。 (実際には処理系の拡張として VLA を使える場合もある。) メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。 それほど機会は多くないだろうけど。 本来 (?) の用途とは違うところで使われる場合もあって、 いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
714 :デフォルトの名無しさん :2023/11/30(木) 23:55:15.59 ID:p6G1t8dm.net >>713 高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
715 :デフォルトの名無しさん :2023/12/01(金) 10:06:48.86 ID:NZuUNSBe.net おまえら、stdとboostどう使い分けてる?
716 :デフォルトの名無しさん :2023/12/01(金) 13:58:15.55 ID:aU4DjGEJ.net >>714 stringも実際には確保したメモリのポインタと文字列サイズを持ってるだけ(だけではないけど簡単に言えば)なので Cの構造体と大して変わらんのよ
717 :デフォルトの名無しさん :2023/12/02(土) 07:29:47.55 ID:qIqFVuKn.net まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。 暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。 どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。 暗号化等には既製ライブラリ使います。
718 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 09:03:43.92 ID:w8ZlbPjQ.net >>717 設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。 というよりも継承を使うほうが悪い。 「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。 プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
719 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 11:45:21.73 ID:w8ZlbPjQ.net 他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。 極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。 自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
720 :デフォルトの名無しさん :2023/12/02(土) 12:16:48.61 ID:0tC7Yjqi.net sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて 書き込むとき勝手に暗号化してくれると有難いな
721 :デフォルトの名無しさん :2023/12/02(土) 13:25:55.77 ID:JgaBxQHi.net ここはプログラム技術板だぞ 自分で作れ
722 :デフォルトの名無しさん :2023/12/03(日) 06:49:36.39 ID:xZHPSaOR.net このスレはC++の話ではない書き込みが多すぎる
723 :デフォルトの名無しさん :2023/12/03(日) 11:07:00.27 ID:QTewqrs7.net C++の守備範囲が広いんよ
724 :デフォルトの名無しさん :2023/12/03(日) 21:36:41.23 ID:kkqQUehZ.net >>718 ありがとう。 非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。 string 暗号化(鍵, 平文); だけあれば十分だと。
725 :デフォルトの名無しさん :2023/12/04(月) 21:09:04.65 ID:wzr7hFvb.net msys2で開発環境を作りたくて Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが std::ifstream ifs("hoge.txt"); のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。 fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。 どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
726 :デフォルトの名無しさん :2023/12/04(月) 22:11:21.42 ID:+6ZMbPCa.net エラーメッセージは?
727 :はちみつ餃子 ◆8X2XSCHEME :2023/12/05(火) 00:16:37.88 ID:z5PiblaY.net msys2 環境は数種類のモードがあるはずだがどれで起動した?
728 :デフォルトの名無しさん :2023/12/05(火) 04:57:07.09 ID:DXGBHl1O.net 実行ファイルの場所がカレントになってないんだろ getcwd()してみ
729 :728 :2023/12/12(火) 14:02:16.36 ID:haJQSzRG.net エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが 今回は>>728 さんの言う通りになっていて解決できました まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します ありがとうございました!
730 :デフォルトの名無しさん :2023/12/12(火) 15:14:22.81 ID:bMo3JLCK.net GUIから起動するとカレントディレクトリがホームになるんだったっけ?
731 :デフォルトの名無しさん :2023/12/13(水) 15:23:50.85 ID:Xh1qTD5r.net OSの事情でカレントが簡単に移動してしまうのがめんどいな
732 :デフォルトの名無しさん :2023/12/13(水) 16:17:33.78 ID:b3+IUHNQ.net プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね
733 :はちみつ餃子 ◆8X2XSCHEME :2023/12/13(水) 17:12:54.61 ID:vPv7AHCs.net 設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。 アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。 逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。 Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
734 :デフォルトの名無しさん :2023/12/13(水) 17:14:51.41 ID:Xh1qTD5r.net 起動時の引数や 自分のフルパスを取得するAPI経由で 実行ファイルのある場所を基点にどうこうすることが多いわ (Windows unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか 起動時のカレントのまま?
735 :デフォルトの名無しさん :2023/12/13(水) 17:20:10.83 ID:b3+IUHNQ.net >>733 それはインストーラー使うアプリでしょ? XCOPYインストールアプリの話だよ
736 :デフォルトの名無しさん :2023/12/13(水) 17:23:03.86 ID:HyXW4bJ5.net カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ? ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
737 :はちみつ餃子 :2023/12/13(水) 18:03:20.75 ID:vPv7AHCs.net >>736 基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。 scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。 Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
738 :デフォルトの名無しさん :2023/12/13(水) 23:12:49.25 ID:zjCiNOvz.net グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。 仕様ではmain前に実行ということのほかに何か規定はありますか。 ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
739 :はちみつ餃子 ◆8X2XSCHEME :2023/12/14(木) 00:23:02.09 ID:GWgG2Hfk.net >>738 ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。 ・ 定数初期化が終わってから動的初期化がされる ・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい) ・ 翻訳単位内の初期化順序は定義が現れた順序 ・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない 特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、 強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
740 :デフォルトの名無しさん :2023/12/14(木) 01:04:36.74 ID:X6Ol8Z5z.net 普通は、WSL2 でLinux を使う MSYS2/MinGW の利点は、 hypervisor で、2つのOS を起動しないから軽い WSL2 では、Linux側から、Windows 側のアプリも起動できる。 ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける 例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む /mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ 出力 d----- 2015/10/13 13:52 クイズ VSCode の拡張機能・Code Runner は、 右クリックメニューから、選択したコード、またはファイル全体を実行する この設定をチェックしておく Code-runner: File Directory As Cwd Whether to use the directory of the file to be executed as the working directory. そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、 そのファイルをコンパイルして実行する 設定項目、executorMap には、多くの言語の実行コマンドが書いてある。 "code-runner.executorMap": { "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
741 :デフォルトの名無しさん :2023/12/31(日) 22:48:46.98 ID:tpduSr4A.net 相談室から誘導されたのでこちらで http://mevius.5ch.net/test/read.cgi/tech/1698705458/104 buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
742 :デフォルトの名無しさん :2024/01/01(月) 01:29:30.25 ID:/rCM9JK/.net このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw
743 :デフォルトの名無しさん :2024/01/02(火) 11:00:49.80 ID:TDOOgc4U.net ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる 有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
744 :デフォルトの名無しさん :2024/01/02(火) 20:21:16.21 ID:G9bvfkvl.net >>743 頭の出来で決まっているからね 義務教育レベルで脱落した人間、日本語能力に問題がある人間は、プログラマーとしても問題がある。
745 :はちみつ餃子 :2024/01/02(火) 21:40:20.68 ID:RkRzwbey.net 知識は入れないと増えないというすごく当たり前の話。 長く放置してたら勝手に増えるなんてことはないよ。
746 :デフォルトの名無しさん :2024/01/03(水) 08:18:02.54 ID:3n4RUKo6.net ガキの頃からマイコンBASICマガジン見てたけど PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
747 :デフォルトの名無しさん :2024/01/03(水) 08:26:31.48 ID:uKn1SmuA.net 糞コテが
748 :デフォルトの名無しさん :2024/01/03(水) 13:07:46.32 ID:3mJitcl/.net >>746 SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
749 :デフォルトの名無しさん :2024/01/03(水) 13:17:11.92 ID:SgwYv7hO.net ポケコン触ってたころが一番楽しかったです 手の中に物理キーボードと実行環境があるんだもん 一生遊べるよ
750 :デフォルトの名無しさん :2024/01/03(水) 14:56:53.56 ID:giTORTIB.net >>741 memcpyでなくちゃんとplacement newでコピーorムーブコンストラクタ走らせればいんじゃね?
751 :デフォルトの名無しさん :2024/01/10(水) 03:00:04.91 ID:lNNg6PiH.net Class Hogeの中でたくさんのFugaを管理するために std::vector<std::unique_ptr<Fuga>>というメンバ変数を作りました 可変長引数テンプレートで複数のstd::unique_ptr<Fuga>を受け取るコンストラクタを書こうとしたのですが std::unique_ptrがコピー禁止のためうまくいきませんでした。 Hoge(Args&&... args) という形で右辺値参照を受け取ってうまいことムーブしてClass Hogeを初期化する方法ってありますか?
752 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 04:36:30.64 ID:BOjhYgCx.net >>751 できると思うけど、何をやりたくて何が上手くいかなかったのかイマイチわからない。 出来なかったコードをみせて。
753 :デフォルトの名無しさん :2024/01/10(水) 11:27:22.10 ID:lNNg6PiH.net >>752 class Fuga { int placeholder; }; class Hoge { public: std::vector<std::unique_ptr<Fuga> > vec; template<class... Args> Hoge(Args... args) { vec = {args...}; } }; int main() { /*Fugaを何個か作成*/ auto p1 = std::make_unique<Fuga>(); auto p2 = std::make_unique<Fuga>(); auto p3 = std::make_unique<Fuga>(); /* 中略 色々処理 処理が終わったらHogeの中にFugaをまとめて放り込みたい*/ Hoge hoge(p1,p2,p3); } こういうものを書いたらunique_ptrがコピー禁止でエラーになったのでムーブにしたいけど書き方がわかりませんでした。
754 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 12:45:18.04 ID:BOjhYgCx.net >>753 この場合は initializer_list が問題。 initializer_list を経由するとムーブ可能/コピー不可な型を扱えない。 initializer_list を経由しない形にすればよいので要素を emplace_back で 入れる形にするなどの対処法が考えられる。 #include <memory> #include <vector> class Fuga { int placeholder; }; class Hoge { public: std::vector<std::unique_ptr<Fuga> > vec; template <class... Args> Hoge(Args&&... args) { (..., vec.emplace_back(std::forward<Args>(args))); } }; int main() { /*Fugaを何個か作成*/ auto p1 = std::make_unique<Fuga>(); auto p2 = std::make_unique<Fuga>(); auto p3 = std::make_unique<Fuga>(); /* 中略 色々処理 */ // std::move で右辺値にキャスト Hoge hoge(std::move(p1), std::move(p2), std::move(p3)); }
755 :デフォルトの名無しさん :2024/01/12(金) 09:52:36.06 ID:Umd8uX9b.net c++で日本語の連想配列ってあります??
756 :デフォルトの名無しさん :2024/01/14(日) 15:30:33.22 ID:O4q5V5KL.net >>755 std::mapじゃだめなん?
757 :デフォルトの名無しさん :2024/01/16(火) 21:37:05.24 ID:eUaXJLuy.net >>754 無事に動作させることができました。ありがとうございます!
758 :デフォルトの名無しさん :2024/01/20(土) 18:17:15.80 ID:9qysS+ur.net 時間のかかる処理があり、それが現在のスレッドをブロックして欲しくないので その処理の部分に関してstd::async()の利用を検討していますが、 これって戻り値(future 型)でモニターしないといけない感じですか? 上記の処理はいつ終わるかは気にしないので別スレッドに投げっぱなし?で構わない のですが... pthread_detach()的な?
759 :はちみつ餃子 :2024/01/21(日) 12:43:25.73 ID:4rk7TZPC.net >>758 std::thread のメンバ関数に detach はあるけど、期待するのはこういうこと? ただ、メインスレッドが終了すれば他のスレッドが稼働中でもプロセス終了処理に入るし、 プロセス終了処理の中で標準ライブラリの後始末している最中に他のスレッドが 標準ライブラリを使うようなことがあると破綻するかもしれない。 強引に終わらせて良いなら std::quick_exit で即死させるという方法も取れるが、 基本的にはプログラムを終わらせるときには全てのスレッドを終了させて (終了を待って) おくのが 普通だと思う。
760 :デフォルトの名無しさん :2024/01/21(日) 21:48:26.38 ID:zlvjOB5M.net >>758 ですが、お返事ありがとうございます。 はい、とりあえず thread::detach() を使うようにしました。1つの疑問は、 https://ja.cppreference.com/w/cpp/thread/future/~future によると > ただし、その共有状態が std::async によって作成され、まだ準備完了になっておらず、これがその共有状態への最後の参照である場合は、ブロックする可能性があります。 ええ何それ、というのが発端でした(後出し失礼)。 確かに、メインスレッドの終了時のこともありますし、スレッドの後始末をちゃんと した方が本当はいいように思われます。処理が長時間たっても終了しない場合 タイムアウトさせたりとかも。 何かシステマティックな方法等あるでしょうか。参考になるものがあれば...
761 :はちみつ餃子 :2024/01/22(月) 12:54:36.50 ID:T1sqP3ZB.net >>760 メインスレッドの終了直前でまずは適当にフラグを立てた上で他のスレッドの終了まで待機する。 重い処理をしているスレッドの側で完了ではないにしても区切り良く終われるポイントでフラグを読んで フラグが立っていれば後始末ルートに入ってスレッドを終了させる。 その結果としてメインスレッドの待機状態が終わってプロセスの終了。 というのが普通の大まかな流れだと思う。 その上で待機時間があまり長すぎるようだと強引にでも終わらせるとかの処理を入れるかも。 std::async は既存の関数を非同期化するちょっとしたユーティリティという立場なんじゃないかな。 それで事足りるときは便利で簡単だけど、細かい制御を勝手にやってくれるわけでもないし、 やろうとするとちょっとイマイチって感じ。
762 :デフォルトの名無しさん :2024/01/28(日) 11:52:43.80 ID:W0uCnQb3.net 質問なのですがどんな環境(ロケール設定)のPCで動かしても 数値や時刻の入出力を修飾無し(12345 が 12,345 になったりしない)にする完璧な方法って次の3行で良い? setlocale(LC_ALL, ""); // printf()、scanf()に反映 _wsetlocale(LC_ALL, L""); // wprintf()、wscanf()に反映 (※ 環境依存。左記はWindowsの場合 std::locale::global(std::locale("", std::locale::all)); // cout、wcout、cin、wcin、ostringstream、wostringstream、...etc. C++の全部に反映 あとなんか実験する限り cout.imbue(std::locale("")); std::locale::global(std::locale("", std::locale::all)); とするとcoutが修飾有りとなり、cout.imbue()で与えた設定をstd::locale::global()が上書きしないように見えるのですがそういうもの?
763 :はちみつ餃子 :2024/01/28(日) 13:12:39.75 ID:hRRbWEE/.net >>762 言語仕様通りならそれらの関数を呼び出さないようにすれば環境に固有の表現の変換はしない。 std::setlocale の設定が C の標準関数の挙動に影響するのはその通り。 ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。 空の文字列を渡した場合には環境に固有の設定であり、通常はシステムの設定が反映される。 プログラムは起動したときに setlocale(LC_ALL, "C"); 相当の状態なので、普通は書く必要もない。 std::locale::global での設定は C++ の標準ライブラリの挙動に影響するだけでなく std::setlocale での設定にも反映されるので両方を呼び出す必要はない。 これもプログラム起動時のロケール設定は "C" 相当になっているのでそれで良ければ呼び出す必要もない。 ただし、 std::locale::global に与える設定が名前を持たない場合 (つまり std::locale("") のような場合) は std::setlocale 相当の変更もするかどうかは規定されない。 imbue はストリームにロケールを結びつけるのでグローバル設定とは独立して機能する。
764 :デフォルトの名無しさん :2024/01/28(日) 14:11:55.68 ID:eBJAlicu.net クラスオブジェクトの代入文に、=による単純コピーと、=演算子関数による独自コピーのどちらを使うか迷います。 たとえばメンバ変数が基本データ型の集まりなら単純コピーでいい。 今出くわしたのはメンバ変数がstd::array<int, 3>の場合で、まあたぶん単純コピーでよさそう?じゃあstd::vector<myclass>なら?などと疑問が深まります。 あとコピーコンストラクタによる初期化も合わせて考える必要がありそう。
765 :はちみつ餃子 :2024/01/28(日) 14:36:51.31 ID:hRRbWEE/.net >>764 単純コピーってのは何のこと? デフォルトで生成される代入演算子の意味で言ってるのかな?
766 :デフォルトの名無しさん :2024/01/28(日) 15:36:35.20 ID:W0uCnQb3.net >>763 レス㌧クス、 >ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。 なるほど "C" ですたか、これか↓ https://www.ibm.com/docs/ja/zos/2.2.0?topic=utility-locale-naming-conventions >普通は書く必要もない。 実はウィンドーズでUnicodeで出力する場合限定かもですだが、ロケール設定しないままだと 日本語OSでも漢字が表示されなかったり(L"Hello World! 漢字" → 表示: Hello World! ) 英語OSに持っていったら L"Hello World! 漢字" が丸ごと出なかったり……orz まあ漢字はこの際どうでも良いので、ロケール設定 "C" で行こうと思いまつ
767 :デフォルトの名無しさん :2024/01/28(日) 16:37:46.15 ID:eBJAlicu.net >>765 そうです。
768 :はちみつ餃子 :2024/01/28(日) 16:38:46.52 ID:hRRbWEE/.net >>766 Windows での話か……。 msvcrt だとどうにもならなくて ucrt でちょっとマシになってるみたいな話題をこないだ Teratail で見たぞ。
769 :はちみつ餃子 :2024/01/28(日) 16:52:54.16 ID:hRRbWEE/.net >>767 デフォルトで生成される代入演算子は全てのサブオブジェクト (基底とデータメンバ) を 代入演算子でコピーするのと同じ挙動になることになってる。 基底やデータメンバが適切に代入演算子を定義されているのならデフォルト生成にまかせてよいことが多い。 注意を払う必要がある典型的なものは生ポインタで、 ポインタをコピーしても指してる先のオブジェクトはひとつだから そのへんの扱いはデフォルト生成だとあかんことになる。 あとは外部のリソースと結びついているオブジェクトだと単純にコピーできないか、コピーさせないこともあるな。 分かりやすい例で言うなら std::thread なんかはスレッドを抽象化したものだけど オブジェクトをコピーしたらスレッドもぽんぽん増えるなんてことになっても困るし スレッドひとつに対応しているオブジェクトがいくつもあるようでも困るのでコピーできないようになってる。 それぞれに事情があるので明瞭な判断基準があるわけじゃないけど、 デフォルト生成の結果がほんまに自分の意図通りに動作するか考えてみて あかんなら自分で書くしかない。
770 :デフォルトの名無しさん :2024/01/28(日) 17:03:17.17 ID:eBJAlicu.net >>769 いつもありがとうございます。 たいていはデフォルトでよさそうですね。 std::vectorは可変長配列ってことなので、<int>であってもデフォルトでいいのかなと心配に…あこれはvectorのほうで独自=定義されてるなら問題ないわけですね。
771 :デフォルトの名無しさん :2024/01/30(火) 20:47:22.29 ID:RcbbllHt.net bだけ通らないのが納得いかない…。 #include<iostream> #include<functional> using F = std::function<void()>; void f0(){} F f1; class X { F f; public: X(const F& f_) : f(f_){} X& operator=(const F& f_){f = f_; return *this;} }; int main(){ X x1(f0); // a:OK X x2 = f0; // b:NG(conversion from ‘void()’ to non-scalar type ‘X’ requested) X x3 = f1; // c:OK x1 = f0; // d:OK }
772 :はちみつ餃子 :2024/02/02(金) 00:09:46.55 ID:BQKaaqcl.net >>771 std::function ではなくごく単純なクラスでもエラーを再現できる。 暗黙の変換は原則としては多段には起こらず、 X→Y, Y→Z な変換が可能なときでも X→Z な変換はしない。 (プリミティブな型変換とクラスの型変換が連鎖することはある。) 以下の例だと X x1(1); という宣言のときに必要な「暗黙の変換」は int から foo という一段のものだけど X x2 = 2; としたときに必要なのは int から X だから一段の変換ではできない。 struct foo { foo(int x) {} foo(const foo&) = default; foo(void) = default; }; foo f1; class X { foo f; public: X(const X&) = default; X(const foo& f_) : f(f_) {} X& operator=(const foo f_) { f = f_; return *this; } }; int main() { X x1(1); // a:OK X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested) X x3 = f1; // c:OK x1 = 3; // d:OK }
773 :デフォルトの名無しさん :2024/02/02(金) 11:28:24.45 ID:xohFoxUO.net >>772 横からだけども > X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested) って X x2(2); と同義じゃねーの?
774 :はちみつ餃子 :2024/02/02(金) 12:19:41.13 ID:BQKaaqcl.net >>773 違うよ。 C++ では引数ひとつのコンストラクタは変換コンストラクタとして「も」使うことになっているから 違う文脈でも結果的に同じコンストラクタが呼び出されることになるけど 構文糖というわけではなくて違う解釈を経ている。
775 :デフォルトの名無しさん :2024/02/02(金) 12:28:48.56 ID:xohFoxUO.net 細かいなぁ
776 :はちみつ餃子 :2024/02/02(金) 18:32:30.30 ID:ZFQgO+dm.net 動くなら同義と考えても大した問題じゃないが、 ここでは実際に結果が違う (一方はエラーになる) ことの説明だから……
777 :デフォルトの名無しさん :2024/02/02(金) 22:30:30.14 ID:d8Flt8Cn.net これはなぜエラーになるのですか。 std::string s = "abc"; char name[10] = s.c_str(); error: array must be initialized with a brace-enclosed initializer 次と同等とみなせないのはなぜ? char name[10] = "abc";
778 :774 :2024/02/03(土) 05:00:19.85 ID:vGyzbOvf.net >>772 774だけどありがとう。暗黙だと変換が途中で途切れるかもなのか。 一番通って欲しいのがbなんだけど難しいっすね…
779 :デフォルトの名無しさん :2024/02/03(土) 05:21:33.46 ID:4Ieoi/Xm.net >>777 c_str()が返すのはchar* char name[10] = "abc"; は特別扱いで char name[10] = {'a', 'b', 'c', 0}; と同じ cの時からある雀の涙猫の額ばかりの文字列サポート
780 :はちみつ餃子 ◆8X2XSCHEME :2024/02/03(土) 08:35:44.53 ID:Sz70frqK.net >>778 少し表現を変えて良ければ >>771 の X x2 = f0; を X x2 = {f0}; と書くことでも通すことは出来るよ。 更に真面目に対処するならこんな感じかな。 https://wandbox.org/permlink/giXZnCETo64IkEez
781 :デフォルトの名無しさん :2024/02/03(土) 22:40:06.88 ID:mzdZy5dk.net >>779 あーそういうことですね。ありがとう。
782 :774 :2024/02/04(日) 02:54:38.53 ID:1VXaeA8L.net >>780 上は={}で通るのは確認してました。{}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか? 下の方、typenameの所は余りよく分からなかったですが強制的に引数の型で包んで(オブジェクト生成?)、コンストラクタの引数代入時に変換追加するということでいいですか? typename以下はdecltype(f_)((f_))でも良いんかなと思って変更してみたら通りました
783 :はちみつ餃子 :2024/02/04(日) 09:54:01.38 ID:/H29LerN.net >>782 > {}付けるとX型に見なされてコピーコンストラクタで初期化されるで合ってますか? いいえ。 直接初期化に該当します。 コピー (コピーコンストラクタの起動) は発生しません。 つまり X x1(f0); と書いた場合と同じということです。 ですから暗黙の変換を一段階すれば充分なのでエラーなく通ります。 > コンストラクタの引数代入時に変換追加するということでいいですか? いいえ。 何もしません。 コンパイルを通すためには不要ですので、 X のコンストラクタは template <class T> X(const T& f_) : f(f_) {} という定義だけでも問題なく動作します。 ただ、こうすると T は「あらゆる型」になりえます。 std::function<void()> に変換不可能な型も受け入れてしまうということです。 変換不可能であればいずれにしても最終的にはエラーなのですが、 X がデタラメな型も受け入れてから F に変換失敗してエラーになるよりは 特定の条件を満たす型以外を X が拒否するほうが一般的には都合がよいので そうなるようにしたのです。 コンパイルを通すために必要なのではなく通さないための処置です。
784 :774 :2024/02/04(日) 22:33:14.16 ID:1VXaeA8L.net >>783 上:初期化周りは似たような物が色々あって知識が曖昧でした。 下:あの記述は型制限の為ですか。読んでも意図がよく分からなかったので助かります。 説明ありがとうございました
785 :デフォルトの名無しさん :2024/02/10(土) 13:14:08.12 ID:KJGevrBa.net 質問なのですがstd::coutに対する (a) 固定小数点表示 (b) 小数以下精度指定(例えば20桁 (c) setw()される表示幅に対し足りない上位桁0埋め という表示仕様への変更と復旧は、変更が auto sv_flags = cout.flags(); cout << std::fixed; // (1) auto sv_prec = cout.precision(std::streamsize(20)); // (2) auto sv_fill = cout.fill(); cout << std::setfill('0'); // (3) 復旧が cout.flags(sv_flags); // (1)の変更から復旧 cout.precision(sv_prec); // (2)の変更から復旧 cout << setfill(sv_fill); // (3)の変更から復旧 と書くのが普通?シグネチャが不統一な印象があるますがもっとズバっとやる方法は無いもの? ((1)は変更にcoutのメソッドとマニピュレータが両方要り、復旧はcoutのメソッド。 (2)は変更も復旧もcoutのメソッドで済む。(3)は変更が(1)と同じパティーンで復旧がマニピュレータ……
786 :はちみつ餃子 :2024/02/10(土) 14:30:14.27 ID:XEL9SE6k.net >>785 ・ 直接的に入出力を司るのはバッファと呼ばれるオブジェクト (たとえば basic_streambuf など) ・ ストリームには対応するバッファがセットされている (あまりバッファを直接には操作しない) ・ 書式はストリームの状態として保持されている つまり同じバッファ (出力先) に対して異なるストリームをかぶせることが出来る。 一時的にだけ書式を変更するのであれば一時的なストリームを作るという方法がとれる。 コードで例を出すならこんな感じ。 #include <iostream> int main() { std::cout << 0.1 << std::endl; { std::ostream temp(std::cout.rdbuf()); temp.precision(30); temp << 0.2 << std::endl; temp << 0.3 << std::endl; } std::cout << 0.4 << std::endl; } 書式をストリームの状態として持つのがすこぶる不格好だというのは C++er にとっての共通認識になっていてようやく C++23 から std::print が導入されたので モダンな C++ を使えるならそっちを使ったほうが良い。 std::format なら C++20 から。
787 :デフォルトの名無しさん :2024/02/10(土) 15:00:10.91 ID:KJGevrBa.net >>786 ㌧クスなるほど…… 変更した書式の戻し忘れが無く、問題らしい問題点はほぼ無しで良さげ…… (しいて言えばstreamの中の作りを理解していなければtempが何の目的でそうするのかわかりにくい(コメント必須)なだけ、 std::printは手元のVC++がまだC++20対応止まりなので当面見送らざるおえない std::formatは…… 書式文字列が定数式限定という仕様のはいかがなものか…… 今回の用途では困りませんし、コンパイル時に書式の妥当性をチェックしてくれるのは良いのですだが、 仮に、C言語における自作printf()様インターフェースの関数(書式文字列と可変長引数を変数で受け取り、内部でvprintf()を呼ぶ) みたいなものを作りたくなった場合どうするんじゃとそこはかとなく疑問が……
788 :はちみつ餃子 :2024/02/10(土) 15:16:22.24 ID:XEL9SE6k.net >>787 実行時バージョンとして std::vformat も用意されている。
789 :デフォルトの名無しさん :2024/02/10(土) 15:25:38.54 ID:KJGevrBa.net >>788 なるほどなるほど、自作std::format()様関数は問題無く作成でき、 書式文字列が定数式限定が困るというのは杞憂ですたねサーセン;;; (実行時にならないと書式文字列が決まらない場合、コンパイル時チェックが原理的に不可能になるのはC言語のprintf()/vprintf()の関係も同じなのでC言語からの後退ではない
790 :はちみつ餃子 :2024/02/10(土) 16:29:24.58 ID:XEL9SE6k.net メンバとして copyfmt があって、これで書式を他のストリームにコピーすることも出来る。 書式を待避しておくだけのストリームを作ってそれにコピーしておいて 後で元に戻すという使い方をしてもいいんだけど、 どうせストリームをあらたに作るならそれを一時的なストリームとして使ったほうが自然かと思う。
791 :デフォルトの名無しさん :2024/02/11(日) 22:38:22.35 ID:smEWrSvv.net std::setのinsertで std::set<int> c1 = {1,2,3}; std::set<int> c2; c2.insert(c1); と書けると便利に思えますが解説のページを見るとできないようです。 なぜですか。
792 :デフォルトの名無しさん :2024/02/11(日) 22:45:16.04 ID:KNbj1ANO.net >>791 c2.insert(c1.begin (), c1.end ());
793 :はちみつ餃子 ◆8X2XSCHEME :2024/02/12(月) 11:50:11.55 ID:4VueJhli.net >>791 set に set を insert できる「だけ」ってのはあまり便利ではない。 集合というものをより汎用的に扱える枠組みとして C++20 から range という概念が導入された。 その枠組みを上手いこと成立させる言語機能 concept が長いこと検討されてて、 入る入ると言いながら C++20 までずれ込んでしまったという事情がある。 そんなわけで、 C++23 からなら insert_range が使えて、 これは range の条件を満たすものならなんでも受け入れられることになってる。
794 :デフォルトの名無しさん :2024/02/12(月) 21:37:56.53 ID:WngRm50l.net >>791 c2.merge(c1) ※C++17以降
795 :デフォルトの名無しさん :2024/02/13(火) 22:11:49.56 ID:TA8E1xmn.net みなさんありがとう。環境適合を優先して>>792 を使うことにします。
796 :デフォルトの名無しさん :2024/02/18(日) 00:05:28.51 ID:AtsZxBPF.net コンストラクタの初期化子リストの中で、どこまで柔軟に記述できるのかなーと思ってGPT先生に聞いたら、constまたはconstexprを返す関数のみ書けるとのことでした。 コンストラクタ内部のように好きなように書けないとわかり、初期化子リストの価値が低く感じられました。 そんな制限を設けてまで初期化子リストを導入した意図は何でしょう。
797 :デフォルトの名無しさん :2024/02/18(日) 01:13:17.69 ID:UTNyRtZE.net ChatGPTなんかあてにするな、平気で間違ったこと言うんだから constやconstexpr以外を返す関数だって普通に呼べる 試しにChatGPTに「メンバ初期化子リストではconstかconstexprを返す関数しか呼べませんが、これはなぜですか?」ってあえて間違った前提条件で質問してみたら、間違ってることに対する指摘は一切なかったし、さもこっちの質問が正しいかのようなそれっぽい返答が返ってきたし --- 俺: C++において、コンストラクタのメンバ初期化子リスト内ではconstまたはconstexprを返す関数しか呼ぶことができません。これはなぜでしょうか? ChatGPT: C++において、コンストラクタのメンバ初期化子リスト内でconstまたはconstexprを返す関数しか呼ぶことができる理由は、初期化子リストがオブジェクトの初期化に使用され、実行時のコードが生成されないためです。メンバ初期化子リストはコンストラクタの一部であり、オブジェクトが生成される際に実行されます。このリスト内での関数呼び出しはコンパイル時に解決され、オブジェクトの初期化に関する情報は実行時に生成されません。 constまたはconstexprを返さない関数をメンバ初期化子リスト内で呼ぶと、実行時にコードが生成される可能性があります。しかし、これはオブジェクトが生成される前に行われる初期化の一環であり、実行時の処理としては不要なオーバーヘッドを引き起こす可能性があります。 コンストラクタのメンバ初期化子リストは、メンバ変数を適切に初期化するためのものであり、できるだけ効率的に行われるように設計されています。そのため、コンパイル時に解決されるconstまたはconstexprを返す関数の呼び出しに限定されています。 --- だからAIをあてにしちゃダメだよ
798 :デフォルトの名無しさん :2024/02/19(月) 00:17:49.94 ID:bJlSKdBs.net >>797 私が聞いたときも似たような内容が含まれていて、そうなんだねと納得してしまいました。 ではコンストラクタに書けることはすべて書けるのですね。 なおこの問いは、入門書籍にはそこまで書かれてなくて、検索でもかんたんに見つからなかったので聞きました。
799 :はちみつ餃子 :2024/02/19(月) 02:33:45.03 ID:j7eyydGe.net >>798 たぶん >>796 で言う「初期化子リスト」は「メンバ初期化子リスト」だよね? これらは全くの別物。 明らかに混同しやすい用語だから仕方がない部分はあるんだが、 誤った用語を元に調べたら誤った解説に当たりやすいかもしれない。 メンバ初期化子リストは直接初期化 (direct-initialization) であると規定されていて 具体的な挙動の説明は初期化の章に丸投げされている。 https://timsong-cpp.github.io/cppwp/n3337/class.base.init#7 つまりメンバ初期化子リストに特有の事情というものはない。 普通に初期化なんで、そこに違いがあるかもしれないという想像をする人がいてそういう人のために 違いが無いと断りを入れる必要があるとは入門書の著者は思わなかったんだろう。 有るものを有ると説明することはあるが無いものを無いと殊更に強調して説明はあまりしない。
800 :デフォルトの名無しさん :2024/02/19(月) 22:58:00.95 ID:bJlSKdBs.net >>799 そうですメンバ初期化子リストです。どうもありがとう。 なお書籍には、メンバ変数名(引数)やメンバ変数名(0)の例ばかりでした。
801 :デフォルトの名無しさん :2024/02/26(月) 09:17:00.78 ID:KZUiymUx.net すみません、コンストラクタの宣言/定義で A() {}; とした場合と A() = default; と 書いた場合は何が違うのでしょうか。挙動とか意味だとか... あるいはある種のタイプクラスの場合は違いが生じるので注意とか....??
802 :はちみつ餃子 :2024/02/26(月) 09:36:14.06 ID:pFLZLcAJ.net >>801 default を指定した場合はデフォルトのルールでコンストラクタを生成する。 生成可能な条件が満たされなかった場合でもそれ自体はエラーにはならずに デフォルトコンストラクタは削除済と見做されるというルール。 そのときはデフォルトコンストラクタを必要とする使い方をした時点でエラーになる。
803 :はちみつ餃子 :2024/02/26(月) 09:39:35.86 ID:pFLZLcAJ.net つまりこんなことをしてもエラーは出ないが struct foo { foo() = delete; // デフォルトコンストラクタを削除 }; struct bar : foo { bar() = default; // デフォルトコンストラクタのデフォルト生成 }; int main(void) { } ↓ こういうことをするとエラー struct foo { foo() = delete; // デフォルトコンストラクタを削除 }; struct bar : foo { bar(){} }; int main(void) { }
804 :デフォルトの名無しさん :2024/03/02(土) 19:28:56.45 ID:fBQwxymt.net >>803 遅レスすみません。要は、コンストラクタの特定のパターンの用法をされたくない ときに使う感じ? でそれに該当するとコンパイルエラーになるわけですよね? 自分が気になったのは、ランタイム時に何かありうるかということです あるコードで、コンストラクタがdefault指定されているクラスが、別のクラス内 (親子関係にはない)でunique_ptrとして生成されたときに問題が生じたような 感じで.... ってもっと自分で調べてからレスしろって話ですが、現在そのコードに立ち戻る ことができず、とりあえず疑問だけを
805 :はちみつ餃子 ◆8X2XSCHEME :2024/03/02(土) 21:07:53.65 ID:JOojncXx.net C++ の仕様は場合分けで規則がごちゃごちゃしていることが多くて単純な一般原則として説明できない。 「要は」なんて一言でまとめられないよ。
806 :デフォルトの名無しさん :2024/03/03(日) 19:37:10.80 ID:HNPAS3Wj.net >>804 そういう目的ではないと見ていいよ >>803 が言ってるのは、基本的にはデフォルト実装でコンストラクタを作ってくれるが必ずではない、と言ってるだけ デフォルトの(引数無しの場合、何もしない。が、基底クラスの引数無しのコンストラクタはちゃんと呼んでくれる)コンストラクタでいい場合に使う。 A() {}と書くのと基本同じだよ
807 :デフォルトの名無しさん :2024/03/12(火) 20:26:30.54 ID:lzPsc8Dg.net 異なる型を含むような配列(的なもの)を作りたいのですが、可能でしょうか? 例えば template <T> struct NamedValue { string name; T value; } を定義して NamedValue<string>{a, b} や NamedValue<int>{c, d} などの型の異なる複数の値を、 一つの配列的なものに収納したいのです 例えばvectorは全要素が同じ型じゃないと駄目ですよね
808 :デフォルトの名無しさん :2024/03/12(火) 21:14:27.11 ID:irRbCjS4.net >>807 std::tuple
809 :デフォルトの名無しさん :2024/03/12(火) 21:19:48.50 ID:irRbCjS4.net あるいは要素数がコンパイル時に決まらないなら std::anyをコンテナに入れるとか?
810 :デフォルトの名無しさん :2024/03/12(火) 22:11:10.08 ID:lzPsc8Dg.net はい、要素数はコンパイル時に決まらないのでstd::anyのコンテナですかね で要素を取り出すときは、どの型なのかをチェックして挙動を...
811 :はちみつ餃子 :2024/03/12(火) 23:03:39.03 ID:WtXn1sYk.net もし >>807 の T の種類が限られているのなら std::variant を使ったほうが楽かもしれない。 std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。
812 :デフォルトの名無しさん :2024/03/23(土) 11:43:27.62 ID:YZ3MX9tD.net std::remove()ってファイルを消去する関数なんですね std::move()と名前が似ているのに全然違う
813 :デフォルトの名無しさん :2024/03/23(土) 12:38:58.15 ID:6dCwgWlj.net 名前空間か関数名にfileくらい入れとけって思うよね
814 :デフォルトの名無しさん :2024/03/23(土) 12:50:26.95 ID:epZulncV.net C言語以前にE言語の問題や さすがにそのくらいの英語の勉強はしておけと思う
815 :はちみつ餃子 :2024/03/23(土) 12:51:15.85 ID:szITgpvT.net C の規格から取り込んだものだから由来が違うんだよ。 今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。
816 :デフォルトの名無しさん :2024/03/23(土) 12:54:13.64 ID:aQWBK6SI.net >>812 >std::remove()ってファイルを消去する関数なんですね std::remove()ってSTLのstd::removeじゃなく? ちゃんとコンテナの要素をre-moveしてると思うが?
817 :デフォルトの名無しさん :2024/03/23(土) 13:38:01.48 ID:qgcdIGgP.net >>816 だよねえ?? >>812-815 が何を言ってるのか分からなくて怖い
818 :デフォルトの名無しさん :2024/03/23(土) 13:40:27.68 ID:qgcdIGgP.net ああ <cstdio>に int remove( const char* pathname ); ってのがあるのか https://en.cppreference.com/w/cpp/io/c/remove
819 :デフォルトの名無しさん :2024/03/24(日) 05:14:16.83 ID:DBUI72Gl.net >>815 なるほど。諸般の事情でC++14な環境で、ファイルを扱う関数を探していたら。 Boostに行く手もあるかもしれませんが、とりあえず。
820 :デフォルトの名無しさん :2024/03/24(日) 09:50:29.58 ID:FsPOi81N.net cstdio のは std:: 名前空間じゃないよね. ::remove だと思うけど
821 :はちみつ餃子 :2024/03/24(日) 12:13:25.60 ID:iaJ2USO3.net >>820 cstdio にある関数は std 名前空間にある。 ただしグローバル名前空間「にも」あって良い。 (無くても良い。) stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)
822 :デフォルトの名無しさん :2024/04/14(日) 11:55:59.92 ID:Rac57Bvn.net ヒエッ……、、、ぎ、玉虫色……
823 :デフォルトの名無しさん :2024/04/20(土) 14:55:18.13 ID:nh5GJjX6.net 言語そのものではないのですが、コマンドラインのデバッガやIDEでSTLのコンテナの内容を 易しく表示してくれるのってありますか? 例えばvectorなら、単純に中の要素だけを列挙してくれたりとか ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは 確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等) 見えてる感じで、STLコンテナに関してはあまり親切ではないような デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか? 自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです
824 :デフォルトの名無しさん :2024/04/26(金) 10:53:44.71 ID:kftlKAnq.net 今からC++を勉強するならC++20を基準にやっても構いませんか?
825 :デフォルトの名無しさん :2024/04/26(金) 10:59:40.04 ID:/+TxHGye.net c++20といわずc++23からやればいいのでは
826 :デフォルトの名無しさん :2024/04/26(金) 11:15:59.06 ID:kftlKAnq.net 最新の規格で勉強して必要に応じて古い知識をつけていくような学び方でいいの?
827 :デフォルトの名無しさん :2024/04/26(金) 12:03:42.74 ID:q/vvVdAs.net つべこべ言わずやれ 最短コースなんてない
828 :デフォルトの名無しさん :2024/04/26(金) 13:37:23.03 ID:+usxQk3U.net C++ は基礎の上に段階的に応用が乗っかっているような綺麗な構成ではない。 全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。 どこから入っても同じ。
829 :デフォルトの名無しさん :2024/04/27(土) 18:08:12.52 ID:nxPk0zOn.net 質問なのですが std::string には std::to_string(int)他の簡単文字列化関数がありますが std::basic_string<T> に対する簡単文字列化関数はどう?
830 :デフォルトの名無しさん :2024/04/27(土) 21:15:22.77 ID:Zg+tfmdX.net >>823 WindowsのVisual Studioではできる
831 :デフォルトの名無しさん :2024/04/28(日) 10:47:20.65 ID:xKAeYuwJ.net 最初に学ぶ言語がC++なら、Cより学ぶのが大変じゃん
832 :832 :2024/05/11(土) 19:13:43.45 ID:RotYKdRC.net やっぱ数値からstd::basic_string<T>の文字列への変換とかTが決まらないとやり方がわからないから std::basic_string<T>でそれをやりたい人が対応せよ(std::basic_string<T>版to_string()やstd::ostrstreamをT毎に作成せよ)という天の啓示? 証拠にstd::wstringについてはstd::wstring to_wstring(int)とかstd::wostrstream とかある
833 :デフォルトの名無しさん :2024/05/13(月) 23:37:45.97 ID:E3c8DTgZ.net >>832 分かっとるやないか
834 :デフォルトの名無しさん :2024/05/17(金) 02:48:48.77 ID:5PkVcelB.net OS上で動かすアプリ作りたくなったからC++とC#で悩んだんだけどどちらの長所も捨てがたい気がして両方学んでみるかな?って思ったんだけどC++でのおすすめの参考書とかあります? 一応、学生時代にC言語で五目並べとファイルの出力までは勉強してます。 一応ググって入門参考書とか調べましたがちょっとC言語齧ったのなら実戦的な例題集みたいなのが良いのでしょうか? あとこの質問スレ違いだったらすいません。
835 :デフォルトの名無しさん :2024/05/17(金) 09:33:44.70 ID:7hVV19/y.net Windows上のアプリをC++で作るのは少々ハードル高いが 個人的にオススメなのはWindows2000 プログラミング標準講座(ハーバート・シルト著)ってやつ C++そのものの本は他の人が挙げてくれると思う
836 :はちみつ餃子 :2024/05/19(日) 01:34:46.93 ID:lh74nkjR.net どういう学び方が良いかは人による。 C++ の設計思想としては理解できた便利機能をその都度に導入する形で学んでいけるようにという配慮はしていると設計者は言っている。 実務でプログラミングをしてる人は「C++ をちゃんと習得するまで待ってくれ。 仕事を止めてくれ」とは言えないからね。 C を理解しているならとりあえず C のように書きながら部分的に C++ 的にしていける。 つまり実戦的な学びかたも一応はアリ。 ただ、実戦的な学習はやりたいことが出来てるならそれ以上深掘りする意欲につながらない。 C の書き方でやれるなら別の形に積極的に書き直したい理由って何?と感じてしまうことがある。 きちんとした理解に至らぬままの中途半端な形になりがち。 やりたいこと (書きたいもの) が明白なほうが道筋は付けやすいんだけど、やりたいことに邁進しすぎてもそれはそれで「学習」としてはイマイチなんだよ。 そのへんは程度問題というか匙加減というか、人による、場合によるとしか言いようがない。 個人的にはしっかりとした理屈っぽい入門書を一冊は読んでから方針を決めればいいと思ってる。
837 :デフォルトの名無しさん :2024/05/19(日) 14:09:52.90 ID:y+g7UiM3.net >>835 レス、ありがとうございます Windows2000 プログラミング標準講座が近所の図書館にもなかったのでそこにある蔵書読んでみてVisual studio使ったプログラミングしたことないからそれをツールとして使った入門書でいいかな?って思ってしまいました。 >>836 レス、ありがとうございま。。 何を作りたいかの方向性でそれに使うものだけ勉強すれば速いというのはわかります。 自分的には作りたいアプリもあるけどまずGUIアプリを作るための基礎からやりたいなと思ってます。 理屈っぽい入門書の理屈っていう部分はプログラムのハードでの処理の考えとかかと思ったのですがそれはたぶん理工系の学部行ってたので通信情報の基礎理論は聞いたことあるので大丈夫だと思います。 C++は基礎わかってれば後は組み込みたい機能のコードを探せばいいってことと解釈してコード集みたいな辞典を使ったり、ネットで調べたりすればいいってことでいいのでしょうか?
838 :はちみつ餃子 ◆8X2XSCHEME :2024/05/19(日) 15:08:47.80 ID:lh74nkjR.net >>837 私がいう「理屈」は言語仕様のことのつもりで言ってた。 低レイヤから入った C ユーザーは C を使えているようでも言語仕様に対する理解が浅くなりがちで、 良くも悪くも機械語 (ハードウェアの挙動) と対応づけて考えてしまうところがある。 言語としての抽象とその実装は分けて考えないといけない。 現代的なコンパイラは最適化がメチャクソに賢いので実際に生成される機械語と一対一には対応づかないし、 言語仕様で未定義としているところを踏んだらわけのわからない動作を引き起こすので 言語仕様について一定以上には身に付けてから実践を始めないと何がなんだかわからないことだらけだと思う。 逆に一定以上に C++ の基礎を身に付けてからならあとはリファレンスを見ながらでも行けるけれど、 今の C++ の「基礎」は昔の C++ と比べるとかなり巨大になってしまっているので当初の C++ の設計思想のように C から段階的に C++ を身に付けるってのはあまりお勧めできないと私は考えてる。 C++ はとにもかくにも巨大で言語機能はお互いに絡み合っているので部分ごとの理解なんて出来ないんじゃないかということ。 繰り返すけど、人による。 自分なりにどういう方向性で行ったらいいのか判断するためにはどこからでもいいから一旦は始めたらいい。 どうせまったく躓きなく進むなんて出来ないんだから駄目だったときにどこが駄目だったかを検討して 軌道修正するしかしょうがないんじゃないのかな。
839 :デフォルトの名無しさん :2024/05/19(日) 15:25:20.86 ID:TV8v+5zc.net >>837 一応Amazonで中古が出てる 最近の本を知らないのでなんとも言えんのだけど、 Visual Studioと名のつく本は、開発環境(VisualStudio)依存の機能使いまくりで他で応用が効かないんだわ、本を選ぶときの参考にしてくれ (開発環境に依存しまくりでいいなら、ぶっちゃけC#のがはるかに楽) >>835 はWin32APIやメッセージループとかの「ずっと変わらない基本」をちゃんと教えてくれる本として挙げた
840 :デフォルトの名無しさん :2024/05/19(日) 19:24:07.63 ID:y+g7UiM3.net >>838 言語仕様ですか 私自身、自分はハードを動かすためにCやアセンブラ触った口だから多分それに該当しそうです。 >>839 ちょっと気になったのですがハーバート シルト(著)の標準講座C++とか独習はどうなのでしょうか? ハーバート・シルト氏の著書を少々調べてみたのですがどれも人によっては難しいとコメントあるけど素晴らしい学習書という人が多いみたいでしたので
841 :はちみつ餃子 :2024/05/19(日) 20:21:36.73 ID:lh74nkjR.net >>840 C++ の仕様は不変なわけではなくてたまに改定してるというのは考慮に入れる必要がある。 どの仕様かを言うときには改定年度を付けて表す通例があって、現時点では C++98, C++03, C++11, C++14, C++17, C++20, C++23 がある。 入門レベルなら最新を積極的に追うほどの必要はないけど、最低限度は C++11 だと思う。 改定の期間があいたせいでインパクトの大きい変化があった。 それより古い書籍は良書だとしても現状に合わないところは色々とあるかもしれない。 GCC や Clang は特に指定しなければ C++17 モードのようなので現時点の基本は C++17 くらいというのが一般的な認識なんじゃないかな。
842 :デフォルトの名無しさん :2024/05/19(日) 21:02:45.49 ID:TV8v+5zc.net あーそういや独習書いた人だっけ 独習は定番レベルで評価高い、ある程度Cの知識は前提になるけど読めると思う C++標準講座は読んだことないのでわからんすまん
843 :1 :2024/05/29(水) 05:15:45.12 ID:fgEqna2o.net なに?プログラムって。むつかしそうだなー ぜんぜん知らないんだけど、ちょっとやってみたいなー ってな人も、入れてあげてね。 そういうスレなんだから。
844 :デフォルトの名無しさん :2024/06/11(火) 02:11:04.90 ID:T9Og4Yet.net 質問です。 独習で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; }
845 :はちみつ餃子 :2024/06/11(火) 05:44:39.09 ID:oZDOZRBo.net >>844 データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。 Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。
846 :デフォルトの名無しさん :2024/06/11(火) 10:47:36.44 ID:GrH0S5VC.net 実行環境を変える setlocale()するとか
847 :デフォルトの名無しさん :2024/06/11(火) 15:21:46.44 ID:T9Og4Yet.net >>844 つまり、自分のところの文字エンコード使えってことでしょうか? 動作的には目的通りできますし、環境次第で文字表示はどれ使えるか変わってくるしで >>846 実行環境はこの環境で使えるプログラム組めるまで気長にやるつもりなのでなしです。 setlocale()使ったことないのでよくわからないのですがロケール宣言してその中で日本語使ってみたらってことですか?
848 :デフォルトの名無しさん :2024/06/11(火) 16:20:37.40 ID:ILw6YbJs.net 長らく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++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん
849 :デフォルトの名無しさん :2024/06/11(火) 16:33:04.86 ID:ILw6YbJs.net https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170 下の方にsetlocaleでutf-8指定する方法書いてる で、ソースコードもロケールもutf-8になってりゃ>>844 のコードそのままでutf-8で実行してくれるはずよ
850 :デフォルトの名無しさん :2024/06/11(火) 16:50:13.04 ID:ILw6YbJs.net 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にしたいんだったらまた別だけど
851 :はちみつ餃子 :2024/06/11(火) 17:31:31.68 ID:kKWOd8Cb.net >>847 言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。 色々な文字コードをサポートしていることもあるししてないこともある。 切り替えることが出来ることもあれば出来ないこともある。 それとストリームはリダイレクト (接続先の変更) される可能性がある。 やりたいことによっては 標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。 Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。 OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。 Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。 その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど Windows で別のターミナルを使うときはその制御方法の規格が確立してないから 主要なターミナルを判定して場当たり的な処理をしているのが現状。 近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから 結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……) 更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して 変換することがあって、その挙動がかなりわけがわからない。 色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。
852 :デフォルトの名無しさん :2024/06/11(火) 22:55:22.54 ID:T9Og4Yet.net すいません。 私の環境ただ単にUTFが使用可能になってなかっただけでした。
853 :デフォルトの名無しさん :2024/06/12(水) 16:16:19.83 ID:HDPWhZcO.net termcap/terminfoとか init.d inittab getty
854 :デフォルトの名無しさん :2024/06/13(木) 02:54:21.20 ID:PAaiBuyr.net 人間に匹敵する知能を持った汎用人工知能を開発した研究者に総額100万ドルの賞金を授与するコンテスト「ARC Prize」が開催
855 :デフォルトの名無しさん :2024/06/15(土) 17:34:41.45 ID:kg6WNOQa.net >>844 C++は、日本語対応していないよ、注意してね。 だから、"あいうえお"なんかのコードは実行されない。 俺はこれを理解するのに10年以上かかった。
856 :はちみつ餃子 ◆8X2XSCHEME :2024/06/15(土) 19:41:12.56 ID:g9ixUcaw.net >>855 No. 現在は Unicode についての規定はあるし、 Unicode のコードポイントに対応つくことが保証された文字列リテラルはある。
857 :858 :2024/06/15(土) 21:31:29.30 ID:kg6WNOQa.net 俺のエディタは、EmEditor Professional (64-bit)だ。 だ。だからC++は、C++17だ。 わからなかった。ごめんな。
858 :デフォルトの名無しさん :2024/06/16(日) 00:50:11.77 ID:v0fD0nKy.net C++と文字コードに関してはこの記事が面白かった https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b 俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
859 :デフォルトの名無しさん :2024/06/16(日) 23:06:40.05 ID:+HL215mo.net >>854 どうやってチューリングテストするんじゃ……
860 :デフォルトの名無しさん :2024/06/16(日) 23:21:48.48 ID:+HL215mo.net coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
861 :はちみつ餃子 ◆8X2XSCHEME :2024/06/16(日) 23:45:30.66 ID:Crm/SwBu.net >>860 言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い) 実際に Windows では文字コードや改行コードの変換をする。 改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない? 変換するということは変換元が想定通りじゃないときには破綻する可能性がある。 Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 バイナリモードではバイト列そのまま。 Linux だとテキストモードとバイナリモードは区別がない。
862 :デフォルトの名無しさん :2024/06/17(月) 00:54:42.78 ID:pXzMaPAe.net >>861 だいたいわかりた、 >実際に Windows では文字コードや改行コードの変換をする。 テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、 cout << "アイウエオカキクケコ\nさしすせそ" << endl; と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、 上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを 「実行時に」解釈する必要がある つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、 Shift JISというものを知っている必要があり、これが >Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 につながるんだと思う。
863 :デフォルトの名無しさん :2024/06/17(月) 00:57:00.44 ID:pXzMaPAe.net しかし >実行環境の都合で各種の変換を入れても良い。 と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除く)になる、
864 :デフォルトの名無しさん :2024/06/17(月) 01:13:07.47 ID:pXzMaPAe.net いやトチ狂ったスマンヌ、 Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから >>862 の理解はやや的を外していた……orz テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。 しかし、であればやっぱ>>860 に戻って、実は実害無いのでは…… Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし…… 透過的でない文字コード変換(>>863 )が無い限り、cout して cin して結果が変になるケースが思いつかなsげ…… (正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
865 :デフォルトの名無しさん :2024/06/17(月) 16:31:20.06 ID:prlYSpwu.net wstringがutf-32だったら良いのに
866 :デフォルトの名無しさん :2024/06/18(火) 11:56:24.49 ID:mldi07Wv.net >>858 その人ブチギレてるフリしてるだけの厨二病だから・・・
302 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者